Updated HTML docs

This commit is contained in:
Griatch 2021-10-05 22:35:41 +02:00
parent 40b2ba0cee
commit cad698493d
87 changed files with 1496 additions and 635 deletions

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 793c3d274c9ce93d4476182e436f11ea
config: 2c53f699594cc8f2a12d24ad05eeebdc
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -166,7 +166,7 @@
<span class="c1"># the user might be trying to identify the command</span>
<span class="c1"># with a #num-command style syntax. We expect the regex to</span>
<span class="c1"># contain the groups &quot;number&quot; and &quot;name&quot;.</span>
<span class="n">mindex</span><span class="p">,</span> <span class="n">new_raw_string</span> <span class="o">=</span> <span class="p">(</span><span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">),</span> <span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">))</span>
<span class="n">mindex</span><span class="p">,</span> <span class="n">new_raw_string</span> <span class="o">=</span> <span class="p">(</span><span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">),</span> <span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;args&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">mindex</span><span class="p">),</span> <span class="n">new_raw_string</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span></div>

View file

@ -67,6 +67,7 @@
<span class="n">COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="n">_TASK_HANDLER</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BROADCAST_SERVER_RESTART_MESSAGES</span>
<span class="c1"># delayed imports</span>
<span class="n">_RESOURCE</span> <span class="o">=</span> <span class="kc">None</span>
@ -110,7 +111,8 @@
<span class="n">reason</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">reason</span> <span class="o">=</span> <span class="s2">&quot;(Reason: </span><span class="si">%s</span><span class="s2">) &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="s2">&quot; Server restart initiated </span><span class="si">%s</span><span class="s2">...&quot;</span> <span class="o">%</span> <span class="n">reason</span><span class="p">)</span>
<span class="k">if</span> <span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span><span class="p">:</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="s2">&quot; Server restart initiated </span><span class="si">%s</span><span class="s2">...&quot;</span> <span class="o">%</span> <span class="n">reason</span><span class="p">)</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">portal_restart_server</span><span class="p">()</span></div></div>

View file

@ -316,8 +316,8 @@
<span class="c1"># {&quot;vv&quot;: [&quot;ea&quot;, &quot;oh&quot;, ...], ...}</span>
<span class="n">grammar2phonemes</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">phoneme</span> <span class="ow">in</span> <span class="n">phonemes</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\W&quot;</span><span class="p">,</span> <span class="n">phoneme</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span><span class="s2">&quot;The phoneme &#39;</span><span class="si">%s</span><span class="s2">&#39; contains an invalid character&quot;</span> <span class="o">%</span> <span class="n">phoneme</span><span class="p">)</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\W&quot;</span><span class="p">,</span> <span class="n">phoneme</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">U</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span><span class="s2">&quot;The phoneme &#39;</span><span class="si">%s</span><span class="s2">&#39; contains an invalid character.&quot;</span> <span class="o">%</span> <span class="n">phoneme</span><span class="p">)</span>
<span class="n">gram</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;v&quot;</span> <span class="k">if</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">vowels</span> <span class="k">else</span> <span class="s2">&quot;c&quot;</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">phoneme</span><span class="p">])</span>
<span class="n">grammar2phonemes</span><span class="p">[</span><span class="n">gram</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">phoneme</span><span class="p">)</span>
@ -513,7 +513,7 @@
<span class="sd"> Args:</span>
<span class="sd"> text (str): Text to obfuscate.</span>
<span class="sd"> level (real, optional): A value from 0.0-1.0 determining</span>
<span class="sd"> the level of obfuscation where 0 means no jobfuscation</span>
<span class="sd"> the level of obfuscation where 0 means no obfuscation</span>
<span class="sd"> (string returned unchanged) and 1.0 means the entire</span>
<span class="sd"> string is obfuscated.</span>
<span class="sd"> language (str, optional): The identifier of a language</span>

View file

@ -68,7 +68,7 @@
<span class="sd"> /alias to reference objects in the room. You can use any</span>
<span class="sd"> number of sdesc sub-parts to differentiate a local sdesc, or</span>
<span class="sd"> use /1-sdesc etc to differentiate them. The emote also</span>
<span class="sd"> identifies nested says.</span>
<span class="sd"> identifies nested says and separates case.</span>
<span class="sd"> - sdesc obscuration of real character names for use in emotes</span>
<span class="sd"> and in any referencing such as object.search(). This relies</span>
<span class="sd"> on an SdescHandler `sdesc` being set on the Character and</span>
@ -101,13 +101,18 @@
<span class="sd">by the player of the tall man, so that people looking at him can tell</span>
<span class="sd">at a glance what is going on.</span>
<span class="sd">&gt; emote /me looks at /tall and says &quot;Hello!&quot;</span>
<span class="sd">&gt; emote /me looks at /Tall and says &quot;Hello!&quot;</span>
<span class="sd">I see:</span>
<span class="sd"> Griatch looks at Tall man and says &quot;Hello&quot;.</span>
<span class="sd">Tall man (assuming his name is Tom) sees:</span>
<span class="sd"> The godlike figure looks at Tom and says &quot;Hello&quot;.</span>
<span class="sd">Note that by default, the case of the tag matters, so `/tall` will</span>
<span class="sd">lead to &#39;tall man&#39; while `/Tall` will become &#39;Tall man&#39; and /TALL</span>
<span class="sd">becomes /TALL MAN. If you don&#39;t want this behavior, you can pass</span>
<span class="sd">case_sensitive=False to the `send_emote` function.</span>
<span class="sd">Verbose Installation Instructions:</span>
<span class="sd"> 1. In typeclasses/character.py:</span>
@ -130,9 +135,9 @@
<span class="sd"> Inherit `ContribRPObject`:</span>
<span class="sd"> Change `class Object(DefaultObject):` to</span>
<span class="sd"> `class Object(ContribRPObject):`</span>
<span class="sd"> 4. Reload the server (@reload or from console: &quot;evennia reload&quot;)</span>
<span class="sd"> 4. Reload the server (`reload` or from console: &quot;evennia reload&quot;)</span>
<span class="sd"> 5. Force typeclass updates as required. Example for your character:</span>
<span class="sd"> @type/reset/force me = typeclasses.characters.Character</span>
<span class="sd"> `type/reset/force me = typeclasses.characters.Character`</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
@ -187,8 +192,9 @@
<span class="n">_RE_LEFT_BRACKETS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{+&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="n">_RE_RIGHT_BRACKETS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\}+&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="c1"># Reference markers are used internally when distributing the emote to</span>
<span class="c1"># all that can see it. They are never seen by players and are on the form {#dbref}.</span>
<span class="n">_RE_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{+\#([0-9]+)\}+&quot;</span><span class="p">)</span>
<span class="c1"># all that can see it. They are never seen by players and are on the form {#dbref&lt;char&gt;}</span>
<span class="c1"># with the &lt;char&gt; indicating case of the original reference query (like ^ for uppercase)</span>
<span class="n">_RE_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{+\#([0-9]+[\^\~tv]{0,1})\}+&quot;</span><span class="p">)</span>
<span class="c1"># This regex is used to quickly reference one self in an emote.</span>
<span class="n">_RE_SELF_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;/me|@&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
@ -374,7 +380,7 @@
<span class="k">return</span> <span class="n">emote</span><span class="p">,</span> <span class="n">mapping</span></div>
<div class="viewcode-block" id="parse_sdescs_and_recogs"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.parse_sdescs_and_recogs">[docs]</a><span class="k">def</span> <span class="nf">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="parse_sdescs_and_recogs"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.parse_sdescs_and_recogs">[docs]</a><span class="k">def</span> <span class="nf">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">case_sensitive</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Read a raw emote and parse it into an intermediary</span>
<span class="sd"> format for distributing to all observers.</span>
@ -387,6 +393,11 @@
<span class="sd"> string (str): The string (like an emote) we want to analyze for keywords.</span>
<span class="sd"> search_mode (bool, optional): If `True`, the &quot;emote&quot; is a query string</span>
<span class="sd"> we want to analyze. If so, the return value is changed.</span>
<span class="sd"> case_sensitive (bool, optional); If set, the case of /refs matter, so that</span>
<span class="sd"> /tall will come out as &#39;tall man&#39; while /Tall will become &#39;Tall man&#39;.</span>
<span class="sd"> This allows for more grammatically correct emotes at the cost of being</span>
<span class="sd"> a little more to learn for players. If disabled, the original sdesc case</span>
<span class="sd"> is always kept and are inserted as-is.</span>
<span class="sd"> Returns:</span>
<span class="sd"> (emote, mapping) (tuple): If `search_mode` is `False`</span>
@ -493,10 +504,32 @@
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_EMOTE_NOMATCH_ERROR</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()))</span>
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># a unique match - parse into intermediary representation</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;~&#39;</span> <span class="c1"># retain original case of sdesc</span>
<span class="k">if</span> <span class="n">case_sensitive</span><span class="p">:</span>
<span class="c1"># case sensitive mode</span>
<span class="c1"># internal flags for the case used for the original /query</span>
<span class="c1"># - t for titled input (like /Name)</span>
<span class="c1"># - ^ for all upercase input (likle /NAME)</span>
<span class="c1"># - v for lower-case input (like /name)</span>
<span class="c1"># - ~ for mixed case input (like /nAmE)</span>
<span class="n">matchtext</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_RE_SELF_REF</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">matchtext</span><span class="p">):</span>
<span class="c1"># self-refs are kept as-is, others are parsed by case</span>
<span class="n">matchtext</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="n">_PREFIX</span><span class="p">)</span>
<span class="k">if</span> <span class="n">matchtext</span><span class="o">.</span><span class="n">istitle</span><span class="p">():</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;t&#39;</span>
<span class="k">elif</span> <span class="n">matchtext</span><span class="o">.</span><span class="n">isupper</span><span class="p">():</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;^&#39;</span>
<span class="k">elif</span> <span class="n">matchtext</span><span class="o">.</span><span class="n">islower</span><span class="p">():</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;v&#39;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">case</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span><span class="p">[:</span><span class="n">istart0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;{</span><span class="si">%s</span><span class="s2">}&quot;</span> <span class="o">%</span> <span class="n">key</span> <span class="o">+</span> <span class="n">string</span><span class="p">[</span><span class="n">istart</span> <span class="o">+</span> <span class="n">maxscore</span><span class="p">:]</span>
<span class="n">mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># multimatch error</span>
<span class="n">refname</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
<span class="n">reflist</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2"> (</span><span class="si">%s%s</span><span class="s2">)&quot;</span>
@ -548,30 +581,42 @@
<span class="sd"> - None: No auto-add at anonymous emote</span>
<span class="sd"> - &#39;last&#39;: Add sender to the end of emote as [sender]</span>
<span class="sd"> - &#39;first&#39;: Prepend sender to start of emote.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> case_sensitive (bool): Defaults to True, but can be unset</span>
<span class="sd"> here. When enabled, /tall will lead to a lowercase</span>
<span class="sd"> &#39;tall man&#39; while /Tall will lead to &#39;Tall man&#39; and</span>
<span class="sd"> /TALL will lead to &#39;TALL MAN&#39;. If disabled, the sdesc&#39;s</span>
<span class="sd"> case will always be used, regardless of the /ref case used.</span>
<span class="sd"> any: Other kwargs will be passed on into the receiver&#39;s process_sdesc and</span>
<span class="sd"> process_recog methods, and can thus be used to customize those.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">case_sensitive</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;case_sensitive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">emote</span><span class="p">,</span> <span class="n">obj_mapping</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receivers</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="n">emote</span><span class="p">,</span> <span class="n">obj_mapping</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receivers</span><span class="p">,</span> <span class="n">emote</span><span class="p">,</span>
<span class="n">case_sensitive</span><span class="o">=</span><span class="n">case_sensitive</span><span class="p">)</span>
<span class="n">emote</span><span class="p">,</span> <span class="n">language_mapping</span> <span class="o">=</span> <span class="n">parse_language</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="n">EmoteError</span><span class="p">,</span> <span class="n">LanguageError</span><span class="p">)</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># handle all error messages, don&#39;t hide actual coding errors</span>
<span class="n">sender</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">skey</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># we escape the object mappings since we&#39;ll do the language ones first</span>
<span class="c1"># (the text could have nested object mappings).</span>
<span class="n">emote</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;{{#\1}}&quot;</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="c1"># if anonymous_add is passed as a kwarg, collect and remove it from kwargs</span>
<span class="k">if</span> <span class="s1">&#39;anonymous_add&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">anonymous_add</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;anonymous_add&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="p">:</span>
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">obj_mapping</span> <span class="k">if</span> <span class="n">tag</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">skey</span><span class="p">)):</span>
<span class="c1"># no self-reference in the emote - add to the end</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span>
<span class="n">obj_mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span>
<span class="n">obj_mapping</span><span class="p">[</span><span class="n">skey</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span>
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="o">==</span> <span class="s2">&quot;first&quot;</span><span class="p">:</span>
<span class="n">possessive</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">emote</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot; &quot;</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">key</span><span class="p">,</span> <span class="n">possessive</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">skey</span><span class="p">,</span> <span class="n">possessive</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> [</span><span class="si">%s</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">emote</span><span class="p">,</span> <span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> [</span><span class="si">%s</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">emote</span><span class="p">,</span> <span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">skey</span><span class="p">)</span>
<span class="c1"># broadcast emote to everyone</span>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">:</span>
@ -585,7 +630,7 @@
<span class="c1"># color says</span>
<span class="n">receiver_lang_mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_language</span><span class="p">(</span><span class="n">saytext</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="n">langname</span><span class="p">)</span>
<span class="c1"># map the language {##num} markers. This will convert the escaped sdesc markers on</span>
<span class="c1"># the form {{#num}} to {#num} markers ready to sdescmat in the next step.</span>
<span class="c1"># the form {{#num}} to {#num} markers ready to sdesc-map in the next step.</span>
<span class="n">sendemote</span> <span class="o">=</span> <span class="n">emote</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_lang_mapping</span><span class="p">)</span>
<span class="c1"># handle sdesc mappings. we make a temporary copy that we can modify</span>
@ -602,22 +647,27 @@
<span class="k">try</span><span class="p">:</span>
<span class="n">recog_get</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span>
<span class="n">receiver_sdesc_mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span><span class="n">ref</span><span class="p">,</span> <span class="n">process_recog</span><span class="p">(</span><span class="n">recog_get</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="n">obj</span><span class="p">))</span> <span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">(</span><span class="n">ref</span><span class="p">,</span> <span class="n">process_recog</span><span class="p">(</span><span class="n">recog_get</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">ref</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">receiver_sdesc_mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span>
<span class="n">ref</span><span class="p">,</span>
<span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">(),</span> <span class="n">obj</span><span class="p">)</span>
<span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">(),</span> <span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">ref</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;sdesc&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="p">),</span>
<span class="k">else</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">ref</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">)</span>
<span class="c1"># make sure receiver always sees their real name</span>
<span class="n">rkey</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">receiver</span><span class="o">.</span><span class="n">id</span>
<span class="k">if</span> <span class="n">rkey</span> <span class="ow">in</span> <span class="n">receiver_sdesc_mapping</span><span class="p">:</span>
<span class="n">receiver_sdesc_mapping</span><span class="p">[</span><span class="n">rkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">receiver</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">receiver</span><span class="p">)</span>
<span class="n">rkey_start</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">receiver</span><span class="o">.</span><span class="n">id</span>
<span class="n">rkey_keep_case</span> <span class="o">=</span> <span class="n">rkey_start</span> <span class="o">+</span> <span class="s1">&#39;~&#39;</span> <span class="c1"># signifies keeping the case</span>
<span class="k">for</span> <span class="n">rkey</span> <span class="ow">in</span> <span class="p">(</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">receiver_sdesc_mapping</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">rkey_start</span><span class="p">)):</span>
<span class="c1"># we could have #%i^, #%it etc depending on input case - we want the</span>
<span class="c1"># self-reference to retain case.</span>
<span class="n">receiver_sdesc_mapping</span><span class="p">[</span><span class="n">rkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_sdesc</span><span class="p">(</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">rkey_keep_case</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># do the template replacement of the sdesc/recog {#num} markers</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">sendemote</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_sdesc_mapping</span><span class="p">),</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">sender</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
@ -628,7 +678,7 @@
<span class="c1"># ------------------------------------------------------------</span>
<div class="viewcode-block" id="SdescHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler">[docs]</a><span class="k">class</span> <span class="nc">SdescHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="SdescHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler">[docs]</a><span class="k">class</span> <span class="nc">SdescHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This Handler wraps all operations with sdescs. We</span>
<span class="sd"> need to use this since we do a lot preparations on</span>
@ -731,7 +781,7 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc_regex</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span></div></div>
<div class="viewcode-block" id="RecogHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler">[docs]</a><span class="k">class</span> <span class="nc">RecogHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="RecogHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler">[docs]</a><span class="k">class</span> <span class="nc">RecogHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This handler manages the recognition mapping</span>
<span class="sd"> of an Object.</span>
@ -1631,11 +1681,33 @@
<span class="sd"> you are viewing yourself (and sdesc is your key).</span>
<span class="sd"> This is not used by default.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> ref (str): The reference marker found in string to replace.</span>
<span class="sd"> This is on the form #{num}{case}, like &#39;#12^&#39;, where</span>
<span class="sd"> the number is a processing location in the string and the</span>
<span class="sd"> case symbol indicates the case of the original tag input</span>
<span class="sd"> - `t` - input was Titled, like /Tall</span>
<span class="sd"> - `^` - input was all uppercase, like /TALL</span>
<span class="sd"> - `v` - input was all lowercase, like /tall</span>
<span class="sd"> - `~` - input case should be kept, or was mixed-case</span>
<span class="sd"> Returns:</span>
<span class="sd"> sdesc (str): The processed sdesc ready</span>
<span class="sd"> for display.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sdesc</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="n">ref</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;ref&#39;</span><span class="p">,</span> <span class="s1">&#39;~&#39;</span><span class="p">)</span> <span class="c1"># ~ to keep sdesc unchanged</span>
<span class="k">if</span> <span class="s1">&#39;t&#39;</span> <span class="ow">in</span> <span class="n">ref</span><span class="p">:</span>
<span class="c1"># we only want to capitalize the first letter if there are many words</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">+</span> <span class="n">sdesc</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sdesc</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">elif</span> <span class="s1">&#39;^&#39;</span> <span class="ow">in</span> <span class="n">ref</span><span class="p">:</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">elif</span> <span class="s1">&#39;v&#39;</span> <span class="ow">in</span> <span class="n">ref</span><span class="p">:</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">return</span> <span class="s2">&quot;|b</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">sdesc</span></div>
<div class="viewcode-block" id="ContribRPCharacter.process_recog"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_recog">[docs]</a> <span class="k">def</span> <span class="nf">process_recog</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
@ -1647,12 +1719,14 @@
<span class="sd"> translated from the original sdesc at this point.</span>
<span class="sd"> obj (Object): The object the recog:ed string belongs to.</span>
<span class="sd"> This is not used by default.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> ref (str): See process_sdesc.</span>
<span class="sd"> Returns:</span>
<span class="sd"> recog (str): The modified recog string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_sdesc</span><span class="p">(</span><span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span></div>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_sdesc</span><span class="p">(</span><span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="ContribRPCharacter.process_language"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_language">[docs]</a> <span class="k">def</span> <span class="nf">process_language</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">speaker</span><span class="p">,</span> <span class="n">language</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -85,7 +85,22 @@
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
<span class="n">fieldname</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">fieldname</span> <span class="ow">in</span> <span class="n">prototype</span><span class="p">:</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="n">fieldname</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># check if it&#39;s an attribute</span>
<span class="k">for</span> <span class="n">attrtuple</span> <span class="ow">in</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;attrs&#39;</span><span class="p">,</span> <span class="p">[]):</span>
<span class="k">if</span> <span class="n">attrtuple</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">fieldname</span><span class="p">:</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">attrtuple</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">fieldname</span><span class="si">}</span><span class="s2"> not found in prototype</span><span class="se">\n</span><span class="si">{</span><span class="n">prototype</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;(neither as prototype-field or as an Attribute&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">prot_value</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error in prototype</span><span class="se">\n</span><span class="si">{</span><span class="n">prototype</span><span class="si">}</span><span class="se">\n</span><span class="s2">$protkey can only reference static &quot;</span>
<span class="sa">f</span><span class="s2">&quot;values/attributes (found </span><span class="si">{</span><span class="n">prot_value</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_eval</span><span class="p">(</span><span class="n">prot_value</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">except</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">ParsingError</span><span class="p">:</span>

View file

@ -557,6 +557,10 @@
<span class="sd"> be found as a match.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># prototype keys are always in lowecase</span>
<span class="k">if</span> <span class="n">key</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="c1"># search module prototypes</span>
<span class="n">mod_matches</span> <span class="o">=</span> <span class="p">{}</span>

View file

@ -978,41 +978,45 @@
<span class="s2">&quot;key&quot;</span><span class="p">,</span>
<span class="s2">&quot;Spawned-</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()),</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]),</span>
<span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span>
<span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;home&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span><span class="p">:</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="c1"># settings.DEFAULT_HOME not existing is common for unittests</span>
<span class="k">pass</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;destination&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_OBJECT_TYPECLASS</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="c1"># extract calls to handlers</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;permissions&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">permission_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">permission_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">lock_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">lock_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;aliases&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">)</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="n">category</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">data</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">),</span>
<span class="n">category</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">data</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prototype_key</span><span class="p">:</span>
@ -1020,11 +1024,12 @@
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">PROTOTYPE_TAG_CATEGORY</span><span class="p">))</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;exec&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">execs</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">execs</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="c1"># extract ndb assignments</span>
<span class="n">nattributes</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">))</span>
<span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">))</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">prot</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;ndb_&quot;</span><span class="p">)</span>
<span class="p">)</span>
@ -1033,8 +1038,9 @@
<span class="n">val</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;attrs&quot;</span><span class="p">,</span> <span class="p">[]))</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">attrname</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="o">*</span><span class="n">rest</span><span class="p">)</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">attrname</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span>
<span class="n">rest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">rest</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span> <span class="n">rest</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">attrname</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">),</span>
<span class="n">rest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">rest</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span> <span class="n">rest</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">simple_attributes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span>
@ -1045,7 +1051,8 @@
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">simple_attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">value_to_obj_or_any</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">value_to_obj_or_any</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="n">attributes</span> <span class="o">+</span> <span class="n">simple_attributes</span>

View file

@ -72,6 +72,7 @@
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="n">_FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span>
<span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BROADCAST_SERVER_RESTART_MESSAGES</span>
<span class="c1"># delayed imports</span>
<span class="n">_AccountDB</span> <span class="o">=</span> <span class="kc">None</span>
@ -438,7 +439,8 @@
<span class="c1"># tell the server hook we synced</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">at_post_portal_sync</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="c1"># announce the reconnection</span>
<span class="bp">self</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot; ... Server restarted.&quot;</span><span class="p">))</span></div>
<span class="k">if</span> <span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot; ... Server restarted.&quot;</span><span class="p">))</span> </div>
<div class="viewcode-block" id="ServerSessionHandler.portal_disconnect"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_disconnect">[docs]</a> <span class="k">def</span> <span class="nf">portal_disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -1157,7 +1157,7 @@
<span class="sd"> Notes:</span>
<span class="sd"> Beyond those table-specific keywords, the non-overlapping keywords</span>
<span class="sd"> of `EcCell.__init__` are also available. These will be passed down</span>
<span class="sd"> of `EvCell.__init__` are also available. These will be passed down</span>
<span class="sd"> to every cell in the table.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -1519,31 +1519,13 @@
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">,</span> <span class="n">chmin</span> <span class="o">+</span> <span class="n">locked_height</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># now we add all the extra height up to the desired table-height.</span>
<span class="c1"># We do this so that the tallest cells gets expanded first (and</span>
<span class="c1"># thus avoid getting cropped)</span>
<span class="n">even</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span>
<span class="n">correction</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">correction</span> <span class="o">&lt;</span> <span class="n">excess</span><span class="p">:</span>
<span class="c1"># expand the cells with the most rows first</span>
<span class="k">if</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">correction</span> <span class="o">&lt;</span> <span class="n">nrowmax</span> <span class="ow">and</span> <span class="n">nrowmax</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># avoid adding to header first round (looks bad on very small tables)</span>
<span class="n">ci</span> <span class="o">=</span> <span class="n">cheights</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">cheights</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ci</span> <span class="o">=</span> <span class="n">cheights</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">cheights</span><span class="p">))</span>
<span class="k">if</span> <span class="n">ci</span> <span class="ow">in</span> <span class="n">locked_cols</span><span class="p">:</span>
<span class="c1"># locked row, make sure it&#39;s not picked again</span>
<span class="n">cheights</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">9999</span>
<span class="n">cheights_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">=</span> <span class="n">locked_cols</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cheights_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># change balance</span>
<span class="k">if</span> <span class="n">ci</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span><span class="p">:</span>
<span class="c1"># it doesn&#39;t look very good if header expands too fast</span>
<span class="n">cheights</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">even</span> <span class="k">else</span> <span class="mi">3</span>
<span class="n">cheights</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">even</span> <span class="k">else</span> <span class="mi">1</span>
<span class="n">correction</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># Add all the excess at the end of the table</span>
<span class="c1"># Note: Older solutions tried to balance individual</span>
<span class="c1"># rows&#39; vsize. This could lead to empty rows that</span>
<span class="c1"># looked like a bug. This solution instead</span>
<span class="c1"># adds empty rows at the end which is less sophisticated</span>
<span class="c1"># but much more visually consistent.</span>
<span class="n">cheights_min</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">excess</span>
<span class="n">cheights</span> <span class="o">=</span> <span class="n">cheights_min</span>
<span class="c1"># we must tell cells to crop instead of expanding</span>
@ -1602,7 +1584,7 @@
<span class="sd"> to the end.</span>
<span class="sd"> Args:</span>
<span class="sd"> args (`EvColum` or multiple strings): Either a single EvColumn instance or</span>
<span class="sd"> args (`EvColumn` or multiple strings): Either a single EvColumn instance or</span>
<span class="sd"> a number of data string arguments to be used to create a new column.</span>
<span class="sd"> header (str, optional): The header text for the column</span>
<span class="sd"> xpos (int, optional): Index position in table *before* which</span>

View file

@ -449,7 +449,16 @@
<span class="sd"> lines (list): lines from our _file attribute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="o">.</span><span class="n">readlines</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)]</span></div></div>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="o">.</span><span class="n">readlines</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">lines</span></div></div>
<span class="n">_LOG_FILE_HANDLES</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># holds open log handles</span>

View file

@ -2089,7 +2089,7 @@
<span class="n">_missing</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<div class="viewcode-block" id="lazy_property"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.contrib.tutorial_examples.red_button.lazy_property">[docs]</a><span class="k">class</span> <span class="nc">lazy_property</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="lazy_property"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.contrib.tutorial_examples.red_button.lazy_property">[docs]</a><span class="k">class</span> <span class="nc">lazy_property</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Delays loading of property until first access. Credit goes to the</span>
<span class="sd"> Implementation in the werkzeug suite:</span>

View file

@ -529,7 +529,7 @@ You can specify the /force switch to bypass this confirmation.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdDestroy.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['delete', 'del']</em><a class="headerlink" href="#evennia.commands.default.building.CmdDestroy.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['del', 'delete']</em><a class="headerlink" href="#evennia.commands.default.building.CmdDestroy.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -570,7 +570,7 @@ You can specify the /force switch to bypass this confirmation.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdDestroy.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'delete del', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdDestroy.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'del delete', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdDestroy.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1275,7 +1275,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['swap', 'type', 'parent', 'typeclasses', 'update']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['type', 'parent', 'typeclasses', 'swap', 'update']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1306,7 +1306,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'swap type parent typeclasses update', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'type parent typeclasses swap update', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1459,7 +1459,7 @@ If object is not specified, the current location is examined.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['ex', 'exam']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['exam', 'ex']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1556,7 +1556,7 @@ non-persistent data stored on object</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ex exam', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'exam ex', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1590,7 +1590,7 @@ one is given.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdFind.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['locate', 'search']</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['search', 'locate']</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1621,7 +1621,7 @@ one is given.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdFind.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'locate search', 'category': 'building', 'key': 'find', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'search locate', 'category': 'building', 'key': 'find', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1817,7 +1817,7 @@ given, &lt;nr&gt; defaults to 10.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdObjects.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['listobjs', 'stats', 'listobjects', 'db']</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['db', 'stats', 'listobjects', 'listobjs']</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1843,7 +1843,7 @@ given, &lt;nr&gt; defaults to 10.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdObjects.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'listobjs stats listobjects db', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [&lt;nr&gt;]\n\n Gives statictics on objects in database as well as\n a list of &lt;nr&gt; latest objects in database. If not\n given, &lt;nr&gt; defaults to 10.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'db stats listobjects listobjs', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [&lt;nr&gt;]\n\n Gives statictics on objects in database as well as\n a list of &lt;nr&gt; latest objects in database. If not\n given, &lt;nr&gt; defaults to 10.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

File diff suppressed because one or more lines are too long

View file

@ -641,7 +641,7 @@ automatically begin with your name.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdPose.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['emote', ':']</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = [':', 'emote']</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -677,7 +677,7 @@ space.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdPose.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'tags': '', 'text': &quot;\n strike a pose\n\n Usage:\n pose &lt;pose text&gt;\n pose's &lt;pose text&gt;\n\n Example:\n pose is standing by the wall, smiling.\n -&gt; others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'tags': '', 'text': &quot;\n strike a pose\n\n Usage:\n pose &lt;pose text&gt;\n pose's &lt;pose text&gt;\n\n Example:\n pose is standing by the wall, smiling.\n -&gt; others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -483,7 +483,7 @@ the released memory will instead be re-used by the program.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.system.CmdServerLoad.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['serverprocess', 'serverload']</em><a class="headerlink" href="#evennia.commands.default.system.CmdServerLoad.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['serverload', 'serverprocess']</em><a class="headerlink" href="#evennia.commands.default.system.CmdServerLoad.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -514,7 +514,7 @@ the released memory will instead be re-used by the program.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.system.CmdServerLoad.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'serverprocess serverload', 'category': 'system', 'key': 'server', 'tags': '', 'text': &quot;\n show server load and memory statistics\n\n Usage:\n server[/mem]\n\n Switches:\n mem - return only a string of the current memory usage\n flushmem - flush the idmapper cache\n\n This command shows server load statistics and dynamic memory\n usage. It also allows to flush the cache of accessed database\n objects.\n\n Some Important statistics in the table:\n\n |wServer load|n is an average of processor usage. It's usually\n between 0 (no usage) and 1 (100% usage), but may also be\n temporarily higher if your computer has multiple CPU cores.\n\n The |wResident/Virtual memory|n displays the total memory used by\n the server process.\n\n Evennia |wcaches|n all retrieved database entities when they are\n loaded by use of the idmapper functionality. This allows Evennia\n to maintain the same instances of an entity and allowing\n non-persistent storage schemes. The total amount of cached objects\n are displayed plus a breakdown of database object types.\n\n The |wflushmem|n switch allows to flush the object cache. Please\n note that due to how Python's memory management works, releasing\n caches may not show you a lower Residual/Virtual memory footprint,\n the released memory will instead be re-used by the program.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.system.CmdServerLoad.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'serverload serverprocess', 'category': 'system', 'key': 'server', 'tags': '', 'text': &quot;\n show server load and memory statistics\n\n Usage:\n server[/mem]\n\n Switches:\n mem - return only a string of the current memory usage\n flushmem - flush the idmapper cache\n\n This command shows server load statistics and dynamic memory\n usage. It also allows to flush the cache of accessed database\n objects.\n\n Some Important statistics in the table:\n\n |wServer load|n is an average of processor usage. It's usually\n between 0 (no usage) and 1 (100% usage), but may also be\n temporarily higher if your computer has multiple CPU cores.\n\n The |wResident/Virtual memory|n displays the total memory used by\n the server process.\n\n Evennia |wcaches|n all retrieved database entities when they are\n loaded by use of the idmapper functionality. This allows Evennia\n to maintain the same instances of an entity and allowing\n non-persistent storage schemes. The total amount of cached objects\n are displayed plus a breakdown of database object types.\n\n The |wflushmem|n switch allows to flush the object cache. Please\n note that due to how Python's memory management works, releasing\n caches may not show you a lower Residual/Virtual memory footprint,\n the released memory will instead be re-used by the program.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.system.CmdServerLoad.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -59,7 +59,7 @@ connect “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'conn', 'co']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'co', 'conn']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -94,7 +94,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect &quot;account name&quot; &quot;pass word&quot;\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect &quot;account name&quot; &quot;pass word&quot;\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -118,7 +118,7 @@ create “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedCreate.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['cr', 'cre']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['cre', 'cr']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -149,7 +149,7 @@ create “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedCreate.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create &lt;accountname&gt; &lt;password&gt;\n create &quot;account name&quot; &quot;pass word&quot;\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create &lt;accountname&gt; &lt;password&gt;\n create &quot;account name&quot; &quot;pass word&quot;\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -272,7 +272,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -298,7 +298,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -74,7 +74,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedConnect.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'conn', 'co']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'co', 'conn']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -104,7 +104,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedConnect.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect &lt;email&gt; &lt;password&gt;\n\n Use the create command to first create an account before logging in.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect &lt;email&gt; &lt;password&gt;\n\n Use the create command to first create an account before logging in.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -126,7 +126,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedCreate.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['cr', 'cre']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['cre', 'cr']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -162,7 +162,7 @@ name enclosed in quotes:</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedCreate.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create &quot;accountname&quot; &lt;email&gt; &lt;password&gt;\n\n This creates a new account account.\n\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create &quot;accountname&quot; &lt;email&gt; &lt;password&gt;\n\n This creates a new account account.\n\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -270,7 +270,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -296,7 +296,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -52,7 +52,7 @@
<dl class="py attribute">
<dt id="evennia.contrib.ingame_python.commands.CmdCallback.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;callbacks', '&#64;callback', '&#64;calls']</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;callback', '&#64;calls', '&#64;callbacks']</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -133,7 +133,7 @@ on user permission.</p>
<dl class="py attribute">
<dt id="evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;callbacks &#64;callback &#64;calls', 'category': 'building', 'key': '&#64;call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;callback &#64;calls &#64;callbacks', 'category': 'building', 'key': '&#64;call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -316,7 +316,7 @@ same input sentence.</p>
<dd class="field-odd"><ul class="simple">
<li><p><strong>text</strong> (<em>str</em>) Text to obfuscate.</p></li>
<li><p><strong>level</strong> (<em>real</em><em>, </em><em>optional</em>) A value from 0.0-1.0 determining
the level of obfuscation where 0 means no jobfuscation
the level of obfuscation where 0 means no obfuscation
(string returned unchanged) and 1.0 means the entire
string is obfuscated.</p></li>
<li><p><strong>language</strong> (<em>str</em><em>, </em><em>optional</em>) The identifier of a language

View file

@ -67,7 +67,7 @@ represent you in the emote. You can use /sdesc, /nick, /key or
/alias to reference objects in the room. You can use any
number of sdesc sub-parts to differentiate a local sdesc, or
use /1-sdesc etc to differentiate them. The emote also
identifies nested says.</p>
identifies nested says and separates case.</p>
</dd>
</dl>
</li>
@ -112,13 +112,17 @@ The tavern is full of nice people</p>
an example of a static <em>pose</em>: The “standing by the bar” has been set
by the player of the tall man, so that people looking at him can tell
at a glance what is going on.</p>
<p>&gt; emote /me looks at /tall and says “Hello!”</p>
<p>&gt; emote /me looks at /Tall and says “Hello!”</p>
<dl class="simple">
<dt>I see:</dt><dd><p>Griatch looks at Tall man and says “Hello”.</p>
</dd>
<dt>Tall man (assuming his name is Tom) sees:</dt><dd><p>The godlike figure looks at Tom and says “Hello”.</p>
</dd>
</dl>
<p>Note that by default, the case of the tag matters, so <strong>/tall</strong> will
lead to tall man while <strong>/Tall</strong> will become Tall man and /TALL
becomes /TALL MAN. If you dont want this behavior, you can pass
case_sensitive=False to the <strong>send_emote</strong> function.</p>
<p>Verbose Installation Instructions:</p>
<blockquote>
<div><ol class="arabic">
@ -153,9 +157,9 @@ Import the <strong>ContribRPCharacter</strong> class:</p>
</dd>
</dl>
</li>
<li><p>Reload the server (&#64;reload or from console: “evennia reload”)</p></li>
<li><p>Reload the server (<strong>reload</strong> or from console: “evennia reload”)</p></li>
<li><dl class="simple">
<dt>Force typeclass updates as required. Example for your character:</dt><dd><p>&#64;type/reset/force me = typeclasses.characters.Character</p>
<dt>Force typeclass updates as required. Example for your character:</dt><dd><p><strong>type/reset/force me = typeclasses.characters.Character</strong></p>
</dd>
</dl>
</li>
@ -284,7 +288,7 @@ information is actually conveyed.</p>
<dl class="py function">
<dt id="evennia.contrib.rpsystem.parse_sdescs_and_recogs">
<code class="sig-prename descclassname">evennia.contrib.rpsystem.</code><code class="sig-name descname">parse_sdescs_and_recogs</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sender</span></em>, <em class="sig-param"><span class="n">candidates</span></em>, <em class="sig-param"><span class="n">string</span></em>, <em class="sig-param"><span class="n">search_mode</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/rpsystem.html#parse_sdescs_and_recogs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.rpsystem.parse_sdescs_and_recogs" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.contrib.rpsystem.</code><code class="sig-name descname">parse_sdescs_and_recogs</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sender</span></em>, <em class="sig-param"><span class="n">candidates</span></em>, <em class="sig-param"><span class="n">string</span></em>, <em class="sig-param"><span class="n">search_mode</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">case_sensitive</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/rpsystem.html#parse_sdescs_and_recogs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.rpsystem.parse_sdescs_and_recogs" title="Permalink to this definition"></a></dt>
<dd><p>Read a raw emote and parse it into an intermediary
format for distributing to all observers.</p>
<dl class="field-list simple">
@ -302,6 +306,13 @@ search_mode (bool, optional): If <strong>True</strong>, the “emote” is a que
<blockquote>
<div><p>we want to analyze. If so, the return value is changed.</p>
</div></blockquote>
<dl class="simple">
<dt>case_sensitive (bool, optional); If set, the case of /refs matter, so that</dt><dd><p>/tall will come out as tall man while /Tall will become Tall man.
This allows for more grammatically correct emotes at the cost of being
a little more to learn for players. If disabled, the original sdesc case
is always kept and are inserted as-is.</p>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p><p><em>(emote, mapping) (tuple)</em> </p>
@ -351,6 +362,18 @@ self-referencing in the emote, this will auto-add
</ul>
</dd>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><dl class="simple">
<dt>case_sensitive (bool): Defaults to True, but can be unset</dt><dd><p>here. When enabled, /tall will lead to a lowercase
tall man while /Tall will lead to Tall man and
/TALL will lead to TALL MAN. If disabled, the sdescs
case will always be used, regardless of the /ref case used.</p>
</dd>
<dt>any: Other kwargs will be passed on into the receivers process_sdesc and</dt><dd><p>process_recog methods, and can thus be used to customize those.</p>
</dd>
</dl>
</dd>
</dl>
</dd></dl>
<dl class="py class">
@ -1164,8 +1187,23 @@ you are viewing yourself (and sdesc is your key).
This is not used by default.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>sdesc (str)</em> </p>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><dl class="simple">
<dt>ref (str): The reference marker found in string to replace.</dt><dd><p>This is on the form #{num}{case}, like #12^, where
the number is a processing location in the string and the
case symbol indicates the case of the original tag input
- <strong>t</strong> - input was Titled, like /Tall
- <strong>^</strong> - input was all uppercase, like /TALL
- <strong>v</strong> - input was all lowercase, like /tall
- <strong>~</strong> - input case should be kept, or was mixed-case</p>
</dd>
</dl>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p><p><em>sdesc (str)</em> </p>
<dl class="simple">
<dt>The processed sdesc ready</dt><dd><p>for display.</p>
</dd>
@ -1188,8 +1226,14 @@ translated from the original sdesc at this point.</p></li>
This is not used by default.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>recog (str)</em> The modified recog string.</p>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><p>ref (str): See process_sdesc.</p>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p><em>recog (str)</em> The modified recog string.</p>
</dd>
</dl>
</dd></dl>

View file

@ -79,7 +79,7 @@ such as when closing the lid and un-blinding a character.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['press button', 'press', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['push', 'press', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -108,7 +108,7 @@ check if the lid is open or closed.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -178,7 +178,7 @@ check if the lid is open or closed.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['smash lid', 'smash', 'break lid']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['smash lid', 'break lid', 'smash']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -205,7 +205,7 @@ break.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'smash lid smash break lid', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -305,7 +305,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['press button', 'press', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['push', 'press', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -334,7 +334,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -432,7 +432,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdBlindLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['listen', 'get', 'ex', 'feel', 'l', 'examine']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ex', 'listen', 'get', 'feel', 'examine']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -458,7 +458,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdBlindLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'listen get ex feel l examine', 'category': 'general', 'key': 'look', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ex listen get feel examine', 'category': 'general', 'key': 'look', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -492,7 +492,7 @@ shift green root up/down</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['shiftroot', 'pull', 'move', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['move', 'push', 'pull', 'shiftroot']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -528,7 +528,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shiftroot pull move push', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'move push pull shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -545,7 +545,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdPressButton.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push button', 'button', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['button', 'press button', 'push button']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -571,7 +571,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'button press button push button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -715,7 +715,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdAttack.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['thrust', 'chop', 'stab', 'parry', 'slash', 'fight', 'kill', 'defend', 'hit', 'pierce', 'bash']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['pierce', 'chop', 'fight', 'defend', 'hit', 'bash', 'parry', 'kill', 'stab', 'slash', 'thrust']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -741,7 +741,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'thrust chop stab parry slash fight kill defend hit pierce bash', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'pierce chop fight defend hit bash parry kill stab slash thrust', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -713,7 +713,7 @@ if they fall off the bridge.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -739,7 +739,7 @@ if they fall off the bridge.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -865,7 +865,7 @@ to find something.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['feel around', 'fiddle', 'search', 'feel', 'l']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'feel around', 'fiddle', 'feel', 'search']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -893,7 +893,7 @@ random chance of eventually finding a light source.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'feel around fiddle search feel l', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l feel around fiddle feel search', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -56,17 +56,17 @@ to the Portal, through which the Server is also controlled. This pprogram</p>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgStatus.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgStatus.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgStatus.response">
<code class="sig-name descname">response</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -98,17 +98,17 @@ to the Portal, through which the Server is also controlled. This pprogram</p>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgLauncher2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgLauncher2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgLauncher2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -100,17 +100,17 @@ we break up too-long data snippets into multiple batches here.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgLauncher2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgLauncher2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgLauncher2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -142,17 +142,17 @@ we break up too-long data snippets into multiple batches here.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgPortal2Server.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgPortal2Server.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgPortal2Server.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -184,17 +184,17 @@ we break up too-long data snippets into multiple batches here.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgServer2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgServer2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgServer2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -228,17 +228,17 @@ server, such as when a new session connects or resyncs</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminPortal2Server.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminPortal2Server.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminPortal2Server.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -272,17 +272,17 @@ portal.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminServer2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminServer2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminServer2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -314,17 +314,17 @@ portal.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgStatus.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgStatus.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgStatus.response">
<code class="sig-name descname">response</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -358,17 +358,17 @@ the other. This does not use the batch-send functionality.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.FunctionCall.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'module', &lt;twisted.protocols.amp.String object&gt;), (b'function', &lt;twisted.protocols.amp.String object&gt;), (b'args', &lt;twisted.protocols.amp.String object&gt;), (b'kwargs', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'module', &lt;twisted.protocols.amp.String object&gt;), (b'function', &lt;twisted.protocols.amp.String object&gt;), (b'args', &lt;twisted.protocols.amp.String object&gt;), (b'kwargs', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.FunctionCall.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.FunctionCall.response">
<code class="sig-name descname">response</code><em class="property"> = [(b'result', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'result', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -93,7 +93,7 @@ as sends text to it when prompted</p>
<dl class="py attribute">
<dt id="evennia.server.portal.irc.IRCBot.factory">
<code class="sig-name descname">factory</code><em class="property"> = None</em><a class="headerlink" href="#evennia.server.portal.irc.IRCBot.factory" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">factory</code><em class="property">: Optional<span class="p">[</span>twisted.internet.protocol.Factory<span class="p">]</span></em><em class="property"> = None</em><a class="headerlink" href="#evennia.server.portal.irc.IRCBot.factory" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -274,7 +274,7 @@ indentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [':q!', ':h', ':DD', ':r', ':fd', '::', ':y', ':q', ':f', ':w', ':p', ':!', ':=', ':wq', ':i', ':echo', ':::', ':S', ':&gt;', ':&lt;', ':u', ':I', ':j', ':fi', ':', ':uu', ':dw', ':A', ':s', ':dd', ':x', ':UU']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = [':::', ':h', ':', ':fi', ':uu', ':dd', ':=', ':x', '::', ':u', ':S', ':y', ':q', ':A', ':!', ':j', ':echo', ':DD', ':I', ':i', ':q!', ':f', ':&gt;', ':UU', ':w', ':p', ':s', ':dw', ':&lt;', ':wq', ':r', ':fd']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -302,7 +302,7 @@ efficient presentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ':q! :h :DD :r :fd :: :y :q :f :w :p :! := :wq :i :echo ::: :S :&gt; :&lt; :u :I :j :fi : :uu :dw :A :s :dd :x :UU', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '::: :h : :fi :uu :dd := :x :: :u :S :y :q :A :! :j :echo :DD :I :i :q! :f :&gt; :UU :w :p :s :dw :&lt; :wq :r :fd', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -940,7 +940,7 @@ single question.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmenu.CmdYesNoQuestion.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['n', 'y', '__nomatch_command', 'yes', 'no', 'abort', 'a']</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['yes', 'no', 'n', 'a', 'y', '__nomatch_command', 'abort']</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -966,7 +966,7 @@ single question.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'n y __nomatch_command yes no abort a', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'yes no n a y __nomatch_command abort', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -75,7 +75,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['n', 'quit', 'q', 'top', 'e', 'abort', 't', 'next', 'end', 'back', 'a', 'b']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['back', 'a', 'top', 'e', 't', 'next', 'q', 'end', 'n', 'quit', 'b', 'abort']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -101,7 +101,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'n quit q top e abort t next end back a b', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'back a top e t next q end n quit b abort', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -493,7 +493,7 @@ This keyword has no meaning if <strong>width</strong> is set.</p></li>
</dl>
<p class="rubric">Notes</p>
<p>Beyond those table-specific keywords, the non-overlapping keywords
of <strong>EcCell.__init__</strong> are also available. These will be passed down
of <strong>EvCell.__init__</strong> are also available. These will be passed down
to every cell in the table.</p>
</dd></dl>
@ -526,7 +526,7 @@ to the end.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>args</strong> (<strong>EvColum</strong> or multiple strings) Either a single EvColumn instance or
<li><p><strong>args</strong> (<strong>EvColumn</strong> or multiple strings) Either a single EvColumn instance or
a number of data string arguments to be used to create a new column.</p></li>
<li><p><strong>header</strong> (<em>str</em><em>, </em><em>optional</em>) The header text for the column</p></li>
<li><p><strong>xpos</strong> (<em>int</em><em>, </em><em>optional</em>) Index position in table <em>before</em> which

View file

@ -124,7 +124,7 @@ server.log.2020_01_29__2</p>
<p>Reformat logging</p>
<dl class="py attribute">
<dt id="evennia.utils.logger.PortalLogObserver.timeFormat">
<code class="sig-name descname">timeFormat</code><em class="property"> = None</em><a class="headerlink" href="#evennia.utils.logger.PortalLogObserver.timeFormat" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">timeFormat</code><em class="property">: Optional<span class="p">[</span>str<span class="p">]</span></em><em class="property"> = None</em><a class="headerlink" href="#evennia.utils.logger.PortalLogObserver.timeFormat" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 5d50737d7356afd1ba7a8a36b3bb6164
config: 7047d50d420dec2f4a40118914e9faef
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -165,6 +165,14 @@ strings and maintained outside of the game via Evennia launch commands.</p>
<p><em>Griatch 2015</em></p>
<p>Dynamic obfuscation of emotes when speaking unfamiliar languages. Also obfuscates whispers.</p>
</section>
<section id="traits">
<h3>Traits<a class="headerlink" href="#traits" title="Permalink to this headline"></a></h3>
<p><em>Whitenoise 2014, Griatch2021</em></p>
<p>Powerful on-object properties (very extended Attributes) for representing
health, mana, skill-levels etc, with automatic min/max value, base, modifiers
and named tiers for different values. Also include timed rate increase/decrease
to have values change over a period of time.</p>
</section>
<section id="turnbattle">
<h3>Turnbattle<a class="headerlink" href="#turnbattle" title="Permalink to this headline"></a></h3>
<p><em>FlutterSprite 2017</em></p>
@ -373,6 +381,7 @@ want to solve the puzzles and mystery yourself).</p></li>
<li><a class="reference internal" href="#puzzles">Puzzles</a></li>
<li><a class="reference internal" href="#rp-system">RP System</a></li>
<li><a class="reference internal" href="#rp-language">RP Language</a></li>
<li><a class="reference internal" href="#traits">Traits</a></li>
<li><a class="reference internal" href="#turnbattle">Turnbattle</a></li>
</ul>
</li>

View file

@ -75,6 +75,16 @@ option.</p>
<section id="installation">
<h2>Installation<a class="headerlink" href="#installation" title="Permalink to this headline"></a></h2>
<ol>
<li><p>XYZGrid requires the <code class="docutils literal notranslate"><span class="pre">scipy</span></code> library. Easiest is to just install the
optional/contrib requirements in <code class="docutils literal notranslate"><span class="pre">evennia/requirements_extra.txt</span></code> by
doing</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">(</span><span class="n">cd</span> <span class="n">to</span> <span class="n">evennia</span><span class="o">/</span> <span class="n">folder</span><span class="p">)</span>
<span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements_extra</span><span class="o">.</span><span class="n">txt</span>
<span class="p">(</span><span class="n">then</span> <span class="n">go</span> <span class="n">back</span> <span class="n">to</span> <span class="n">your</span> <span class="n">mygame</span><span class="o">/</span> <span class="n">folder</span><span class="p">)</span>
</pre></div>
</div>
<p>This will install all optional requirements of Evennia.</p>
</li>
<li><p>Import and add the <code class="docutils literal notranslate"><span class="pre">evennia.contrib.commands.XYZGridCmdSet</span></code> to the
<code class="docutils literal notranslate"><span class="pre">CharacterCmdset</span></code> cmdset in <code class="docutils literal notranslate"><span class="pre">mygame/commands.default_cmds.py</span></code>. Reload
the server. This makes the <code class="docutils literal notranslate"><span class="pre">map</span></code>, <code class="docutils literal notranslate"><span class="pre">goto/path</span></code> and the modified <code class="docutils literal notranslate"><span class="pre">teleport</span></code> and

View file

@ -483,6 +483,9 @@ Once installed, run <code class="docutils literal notranslate"><span class="pre"
<li><p>Under some not-updated Linux distributions you may run into errors with a
too-old <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> or missing <code class="docutils literal notranslate"><span class="pre">functools</span></code>. If so, update your environment
with <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">--upgrade</span> <span class="pre">pip</span> <span class="pre">wheel</span> <span class="pre">setuptools</span></code>. Then try <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">-e</span> <span class="pre">evennia</span></code> again.</p></li>
<li><p>If you get an <code class="docutils literal notranslate"><span class="pre">setup.py</span> <span class="pre">not</span> <span class="pre">found</span></code> error message while trying to <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code>, make sure you are
in the right directory. You should be at the same level of the <code class="docutils literal notranslate"><span class="pre">evenv</span></code> directory, and the
<code class="docutils literal notranslate"><span class="pre">evennia</span></code> git repository. Note that there is an <code class="docutils literal notranslate"><span class="pre">evennia</span></code> directory inside of the repository too.</p></li>
<li><p>One user reported a rare issue on Ubuntu 16 is an install error on installing Twisted; <code class="docutils literal notranslate"><span class="pre">Command</span> <span class="pre">&quot;python</span> <span class="pre">setup.py</span> <span class="pre">egg_info&quot;</span> <span class="pre">failed</span> <span class="pre">with</span> <span class="pre">error</span> <span class="pre">code</span> <span class="pre">1</span> <span class="pre">in</span> <span class="pre">/tmp/pip-build-vnIFTg/twisted/</span></code> with errors
like <code class="docutils literal notranslate"><span class="pre">distutils.errors.DistutilsError:</span> <span class="pre">Could</span> <span class="pre">not</span> <span class="pre">find</span> <span class="pre">suitable</span> <span class="pre">distribution</span> <span class="pre">for</span> <span class="pre">Requirement.parse('incremental&gt;=16.10.1')</span></code>. This appears possible to solve by simply updating Ubuntu
with <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">apt-get</span> <span class="pre">update</span> <span class="pre">&amp;&amp;</span> <span class="pre">sudo</span> <span class="pre">apt-get</span> <span class="pre">dist-upgrade</span></code>.</p></li>
@ -528,6 +531,9 @@ path to the <code class="docutils literal notranslate"><span class="pre">twistd<
text editor like Notepad. Its just one line containing the path to the <code class="docutils literal notranslate"><span class="pre">twistd.exe</span></code> executable as
determined by Evennia. If you installed Twisted in a non-standard location this might be wrong and
you should update the line to the real location.</p></li>
<li><p>Some users have reported issues with Windows WSL and anti-virus software during Evennia
development. Timeout errors and the inability to run <code class="docutils literal notranslate"><span class="pre">evennia</span> <span class="pre">connections</span></code> may be due to your anti-
virus software interfering. Try disabling or changing your anti-virus software settings.</p></li>
</ul>
</section>
</section>

View file

@ -167,7 +167,7 @@
<span class="c1"># the user might be trying to identify the command</span>
<span class="c1"># with a #num-command style syntax. We expect the regex to</span>
<span class="c1"># contain the groups &quot;number&quot; and &quot;name&quot;.</span>
<span class="n">mindex</span><span class="p">,</span> <span class="n">new_raw_string</span> <span class="o">=</span> <span class="p">(</span><span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">),</span> <span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">))</span>
<span class="n">mindex</span><span class="p">,</span> <span class="n">new_raw_string</span> <span class="o">=</span> <span class="p">(</span><span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">),</span> <span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">num_ref_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s2">&quot;args&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">mindex</span><span class="p">),</span> <span class="n">new_raw_string</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span></div>

View file

@ -68,6 +68,7 @@
<span class="n">COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="n">_TASK_HANDLER</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BROADCAST_SERVER_RESTART_MESSAGES</span>
<span class="c1"># delayed imports</span>
<span class="n">_RESOURCE</span> <span class="o">=</span> <span class="kc">None</span>
@ -111,7 +112,8 @@
<span class="n">reason</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">reason</span> <span class="o">=</span> <span class="s2">&quot;(Reason: </span><span class="si">%s</span><span class="s2">) &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="s2">&quot; Server restart initiated </span><span class="si">%s</span><span class="s2">...&quot;</span> <span class="o">%</span> <span class="n">reason</span><span class="p">)</span>
<span class="k">if</span> <span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span><span class="p">:</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="s2">&quot; Server restart initiated </span><span class="si">%s</span><span class="s2">...&quot;</span> <span class="o">%</span> <span class="n">reason</span><span class="p">)</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">portal_restart_server</span><span class="p">()</span></div></div>

View file

@ -317,8 +317,8 @@
<span class="c1"># {&quot;vv&quot;: [&quot;ea&quot;, &quot;oh&quot;, ...], ...}</span>
<span class="n">grammar2phonemes</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">phoneme</span> <span class="ow">in</span> <span class="n">phonemes</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\W&quot;</span><span class="p">,</span> <span class="n">phoneme</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span><span class="s2">&quot;The phoneme &#39;</span><span class="si">%s</span><span class="s2">&#39; contains an invalid character&quot;</span> <span class="o">%</span> <span class="n">phoneme</span><span class="p">)</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\W&quot;</span><span class="p">,</span> <span class="n">phoneme</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">U</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span><span class="s2">&quot;The phoneme &#39;</span><span class="si">%s</span><span class="s2">&#39; contains an invalid character.&quot;</span> <span class="o">%</span> <span class="n">phoneme</span><span class="p">)</span>
<span class="n">gram</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;v&quot;</span> <span class="k">if</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">vowels</span> <span class="k">else</span> <span class="s2">&quot;c&quot;</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">phoneme</span><span class="p">])</span>
<span class="n">grammar2phonemes</span><span class="p">[</span><span class="n">gram</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">phoneme</span><span class="p">)</span>
@ -514,7 +514,7 @@
<span class="sd"> Args:</span>
<span class="sd"> text (str): Text to obfuscate.</span>
<span class="sd"> level (real, optional): A value from 0.0-1.0 determining</span>
<span class="sd"> the level of obfuscation where 0 means no jobfuscation</span>
<span class="sd"> the level of obfuscation where 0 means no obfuscation</span>
<span class="sd"> (string returned unchanged) and 1.0 means the entire</span>
<span class="sd"> string is obfuscated.</span>
<span class="sd"> language (str, optional): The identifier of a language</span>

View file

@ -69,7 +69,7 @@
<span class="sd"> /alias to reference objects in the room. You can use any</span>
<span class="sd"> number of sdesc sub-parts to differentiate a local sdesc, or</span>
<span class="sd"> use /1-sdesc etc to differentiate them. The emote also</span>
<span class="sd"> identifies nested says.</span>
<span class="sd"> identifies nested says and separates case.</span>
<span class="sd"> - sdesc obscuration of real character names for use in emotes</span>
<span class="sd"> and in any referencing such as object.search(). This relies</span>
<span class="sd"> on an SdescHandler `sdesc` being set on the Character and</span>
@ -102,13 +102,18 @@
<span class="sd">by the player of the tall man, so that people looking at him can tell</span>
<span class="sd">at a glance what is going on.</span>
<span class="sd">&gt; emote /me looks at /tall and says &quot;Hello!&quot;</span>
<span class="sd">&gt; emote /me looks at /Tall and says &quot;Hello!&quot;</span>
<span class="sd">I see:</span>
<span class="sd"> Griatch looks at Tall man and says &quot;Hello&quot;.</span>
<span class="sd">Tall man (assuming his name is Tom) sees:</span>
<span class="sd"> The godlike figure looks at Tom and says &quot;Hello&quot;.</span>
<span class="sd">Note that by default, the case of the tag matters, so `/tall` will</span>
<span class="sd">lead to &#39;tall man&#39; while `/Tall` will become &#39;Tall man&#39; and /TALL</span>
<span class="sd">becomes /TALL MAN. If you don&#39;t want this behavior, you can pass</span>
<span class="sd">case_sensitive=False to the `send_emote` function.</span>
<span class="sd">Verbose Installation Instructions:</span>
<span class="sd"> 1. In typeclasses/character.py:</span>
@ -131,9 +136,9 @@
<span class="sd"> Inherit `ContribRPObject`:</span>
<span class="sd"> Change `class Object(DefaultObject):` to</span>
<span class="sd"> `class Object(ContribRPObject):`</span>
<span class="sd"> 4. Reload the server (@reload or from console: &quot;evennia reload&quot;)</span>
<span class="sd"> 4. Reload the server (`reload` or from console: &quot;evennia reload&quot;)</span>
<span class="sd"> 5. Force typeclass updates as required. Example for your character:</span>
<span class="sd"> @type/reset/force me = typeclasses.characters.Character</span>
<span class="sd"> `type/reset/force me = typeclasses.characters.Character`</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
@ -188,8 +193,9 @@
<span class="n">_RE_LEFT_BRACKETS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{+&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="n">_RE_RIGHT_BRACKETS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\}+&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="c1"># Reference markers are used internally when distributing the emote to</span>
<span class="c1"># all that can see it. They are never seen by players and are on the form {#dbref}.</span>
<span class="n">_RE_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{+\#([0-9]+)\}+&quot;</span><span class="p">)</span>
<span class="c1"># all that can see it. They are never seen by players and are on the form {#dbref&lt;char&gt;}</span>
<span class="c1"># with the &lt;char&gt; indicating case of the original reference query (like ^ for uppercase)</span>
<span class="n">_RE_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{+\#([0-9]+[\^\~tv]{0,1})\}+&quot;</span><span class="p">)</span>
<span class="c1"># This regex is used to quickly reference one self in an emote.</span>
<span class="n">_RE_SELF_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;/me|@&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
@ -375,7 +381,7 @@
<span class="k">return</span> <span class="n">emote</span><span class="p">,</span> <span class="n">mapping</span></div>
<div class="viewcode-block" id="parse_sdescs_and_recogs"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.parse_sdescs_and_recogs">[docs]</a><span class="k">def</span> <span class="nf">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="parse_sdescs_and_recogs"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.parse_sdescs_and_recogs">[docs]</a><span class="k">def</span> <span class="nf">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">case_sensitive</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Read a raw emote and parse it into an intermediary</span>
<span class="sd"> format for distributing to all observers.</span>
@ -388,6 +394,11 @@
<span class="sd"> string (str): The string (like an emote) we want to analyze for keywords.</span>
<span class="sd"> search_mode (bool, optional): If `True`, the &quot;emote&quot; is a query string</span>
<span class="sd"> we want to analyze. If so, the return value is changed.</span>
<span class="sd"> case_sensitive (bool, optional); If set, the case of /refs matter, so that</span>
<span class="sd"> /tall will come out as &#39;tall man&#39; while /Tall will become &#39;Tall man&#39;.</span>
<span class="sd"> This allows for more grammatically correct emotes at the cost of being</span>
<span class="sd"> a little more to learn for players. If disabled, the original sdesc case</span>
<span class="sd"> is always kept and are inserted as-is.</span>
<span class="sd"> Returns:</span>
<span class="sd"> (emote, mapping) (tuple): If `search_mode` is `False`</span>
@ -494,10 +505,32 @@
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_EMOTE_NOMATCH_ERROR</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()))</span>
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># a unique match - parse into intermediary representation</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;~&#39;</span> <span class="c1"># retain original case of sdesc</span>
<span class="k">if</span> <span class="n">case_sensitive</span><span class="p">:</span>
<span class="c1"># case sensitive mode</span>
<span class="c1"># internal flags for the case used for the original /query</span>
<span class="c1"># - t for titled input (like /Name)</span>
<span class="c1"># - ^ for all upercase input (likle /NAME)</span>
<span class="c1"># - v for lower-case input (like /name)</span>
<span class="c1"># - ~ for mixed case input (like /nAmE)</span>
<span class="n">matchtext</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_RE_SELF_REF</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">matchtext</span><span class="p">):</span>
<span class="c1"># self-refs are kept as-is, others are parsed by case</span>
<span class="n">matchtext</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="n">_PREFIX</span><span class="p">)</span>
<span class="k">if</span> <span class="n">matchtext</span><span class="o">.</span><span class="n">istitle</span><span class="p">():</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;t&#39;</span>
<span class="k">elif</span> <span class="n">matchtext</span><span class="o">.</span><span class="n">isupper</span><span class="p">():</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;^&#39;</span>
<span class="k">elif</span> <span class="n">matchtext</span><span class="o">.</span><span class="n">islower</span><span class="p">():</span>
<span class="n">case</span> <span class="o">=</span> <span class="s1">&#39;v&#39;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">case</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span><span class="p">[:</span><span class="n">istart0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;{</span><span class="si">%s</span><span class="s2">}&quot;</span> <span class="o">%</span> <span class="n">key</span> <span class="o">+</span> <span class="n">string</span><span class="p">[</span><span class="n">istart</span> <span class="o">+</span> <span class="n">maxscore</span><span class="p">:]</span>
<span class="n">mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># multimatch error</span>
<span class="n">refname</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
<span class="n">reflist</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2"> (</span><span class="si">%s%s</span><span class="s2">)&quot;</span>
@ -549,30 +582,42 @@
<span class="sd"> - None: No auto-add at anonymous emote</span>
<span class="sd"> - &#39;last&#39;: Add sender to the end of emote as [sender]</span>
<span class="sd"> - &#39;first&#39;: Prepend sender to start of emote.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> case_sensitive (bool): Defaults to True, but can be unset</span>
<span class="sd"> here. When enabled, /tall will lead to a lowercase</span>
<span class="sd"> &#39;tall man&#39; while /Tall will lead to &#39;Tall man&#39; and</span>
<span class="sd"> /TALL will lead to &#39;TALL MAN&#39;. If disabled, the sdesc&#39;s</span>
<span class="sd"> case will always be used, regardless of the /ref case used.</span>
<span class="sd"> any: Other kwargs will be passed on into the receiver&#39;s process_sdesc and</span>
<span class="sd"> process_recog methods, and can thus be used to customize those.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">case_sensitive</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;case_sensitive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">emote</span><span class="p">,</span> <span class="n">obj_mapping</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receivers</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="n">emote</span><span class="p">,</span> <span class="n">obj_mapping</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receivers</span><span class="p">,</span> <span class="n">emote</span><span class="p">,</span>
<span class="n">case_sensitive</span><span class="o">=</span><span class="n">case_sensitive</span><span class="p">)</span>
<span class="n">emote</span><span class="p">,</span> <span class="n">language_mapping</span> <span class="o">=</span> <span class="n">parse_language</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="n">EmoteError</span><span class="p">,</span> <span class="n">LanguageError</span><span class="p">)</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># handle all error messages, don&#39;t hide actual coding errors</span>
<span class="n">sender</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">skey</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># we escape the object mappings since we&#39;ll do the language ones first</span>
<span class="c1"># (the text could have nested object mappings).</span>
<span class="n">emote</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;{{#\1}}&quot;</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="c1"># if anonymous_add is passed as a kwarg, collect and remove it from kwargs</span>
<span class="k">if</span> <span class="s1">&#39;anonymous_add&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">anonymous_add</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;anonymous_add&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="p">:</span>
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">obj_mapping</span> <span class="k">if</span> <span class="n">tag</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">skey</span><span class="p">)):</span>
<span class="c1"># no self-reference in the emote - add to the end</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span>
<span class="n">obj_mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span>
<span class="n">obj_mapping</span><span class="p">[</span><span class="n">skey</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span>
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="o">==</span> <span class="s2">&quot;first&quot;</span><span class="p">:</span>
<span class="n">possessive</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">emote</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot; &quot;</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">key</span><span class="p">,</span> <span class="n">possessive</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">skey</span><span class="p">,</span> <span class="n">possessive</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> [</span><span class="si">%s</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">emote</span><span class="p">,</span> <span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
<span class="n">emote</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> [</span><span class="si">%s</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">emote</span><span class="p">,</span> <span class="s2">&quot;{{</span><span class="si">%s</span><span class="s2">}}&quot;</span> <span class="o">%</span> <span class="n">skey</span><span class="p">)</span>
<span class="c1"># broadcast emote to everyone</span>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">:</span>
@ -586,7 +631,7 @@
<span class="c1"># color says</span>
<span class="n">receiver_lang_mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_language</span><span class="p">(</span><span class="n">saytext</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="n">langname</span><span class="p">)</span>
<span class="c1"># map the language {##num} markers. This will convert the escaped sdesc markers on</span>
<span class="c1"># the form {{#num}} to {#num} markers ready to sdescmat in the next step.</span>
<span class="c1"># the form {{#num}} to {#num} markers ready to sdesc-map in the next step.</span>
<span class="n">sendemote</span> <span class="o">=</span> <span class="n">emote</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_lang_mapping</span><span class="p">)</span>
<span class="c1"># handle sdesc mappings. we make a temporary copy that we can modify</span>
@ -603,22 +648,27 @@
<span class="k">try</span><span class="p">:</span>
<span class="n">recog_get</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span>
<span class="n">receiver_sdesc_mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span><span class="n">ref</span><span class="p">,</span> <span class="n">process_recog</span><span class="p">(</span><span class="n">recog_get</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="n">obj</span><span class="p">))</span> <span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">(</span><span class="n">ref</span><span class="p">,</span> <span class="n">process_recog</span><span class="p">(</span><span class="n">recog_get</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">ref</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">receiver_sdesc_mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span>
<span class="n">ref</span><span class="p">,</span>
<span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">(),</span> <span class="n">obj</span><span class="p">)</span>
<span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">(),</span> <span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">ref</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;sdesc&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="p">),</span>
<span class="k">else</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">ref</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">)</span>
<span class="c1"># make sure receiver always sees their real name</span>
<span class="n">rkey</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">receiver</span><span class="o">.</span><span class="n">id</span>
<span class="k">if</span> <span class="n">rkey</span> <span class="ow">in</span> <span class="n">receiver_sdesc_mapping</span><span class="p">:</span>
<span class="n">receiver_sdesc_mapping</span><span class="p">[</span><span class="n">rkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">receiver</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">receiver</span><span class="p">)</span>
<span class="n">rkey_start</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">receiver</span><span class="o">.</span><span class="n">id</span>
<span class="n">rkey_keep_case</span> <span class="o">=</span> <span class="n">rkey_start</span> <span class="o">+</span> <span class="s1">&#39;~&#39;</span> <span class="c1"># signifies keeping the case</span>
<span class="k">for</span> <span class="n">rkey</span> <span class="ow">in</span> <span class="p">(</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">receiver_sdesc_mapping</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">rkey_start</span><span class="p">)):</span>
<span class="c1"># we could have #%i^, #%it etc depending on input case - we want the</span>
<span class="c1"># self-reference to retain case.</span>
<span class="n">receiver_sdesc_mapping</span><span class="p">[</span><span class="n">rkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_sdesc</span><span class="p">(</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">rkey_keep_case</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># do the template replacement of the sdesc/recog {#num} markers</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">sendemote</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_sdesc_mapping</span><span class="p">),</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">sender</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
@ -629,7 +679,7 @@
<span class="c1"># ------------------------------------------------------------</span>
<div class="viewcode-block" id="SdescHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler">[docs]</a><span class="k">class</span> <span class="nc">SdescHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="SdescHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler">[docs]</a><span class="k">class</span> <span class="nc">SdescHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This Handler wraps all operations with sdescs. We</span>
<span class="sd"> need to use this since we do a lot preparations on</span>
@ -732,7 +782,7 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc_regex</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span></div></div>
<div class="viewcode-block" id="RecogHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler">[docs]</a><span class="k">class</span> <span class="nc">RecogHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="RecogHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler">[docs]</a><span class="k">class</span> <span class="nc">RecogHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This handler manages the recognition mapping</span>
<span class="sd"> of an Object.</span>
@ -1632,11 +1682,33 @@
<span class="sd"> you are viewing yourself (and sdesc is your key).</span>
<span class="sd"> This is not used by default.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> ref (str): The reference marker found in string to replace.</span>
<span class="sd"> This is on the form #{num}{case}, like &#39;#12^&#39;, where</span>
<span class="sd"> the number is a processing location in the string and the</span>
<span class="sd"> case symbol indicates the case of the original tag input</span>
<span class="sd"> - `t` - input was Titled, like /Tall</span>
<span class="sd"> - `^` - input was all uppercase, like /TALL</span>
<span class="sd"> - `v` - input was all lowercase, like /tall</span>
<span class="sd"> - `~` - input case should be kept, or was mixed-case</span>
<span class="sd"> Returns:</span>
<span class="sd"> sdesc (str): The processed sdesc ready</span>
<span class="sd"> for display.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sdesc</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="n">ref</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;ref&#39;</span><span class="p">,</span> <span class="s1">&#39;~&#39;</span><span class="p">)</span> <span class="c1"># ~ to keep sdesc unchanged</span>
<span class="k">if</span> <span class="s1">&#39;t&#39;</span> <span class="ow">in</span> <span class="n">ref</span><span class="p">:</span>
<span class="c1"># we only want to capitalize the first letter if there are many words</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">+</span> <span class="n">sdesc</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sdesc</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">elif</span> <span class="s1">&#39;^&#39;</span> <span class="ow">in</span> <span class="n">ref</span><span class="p">:</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">elif</span> <span class="s1">&#39;v&#39;</span> <span class="ow">in</span> <span class="n">ref</span><span class="p">:</span>
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">return</span> <span class="s2">&quot;|b</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">sdesc</span></div>
<div class="viewcode-block" id="ContribRPCharacter.process_recog"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_recog">[docs]</a> <span class="k">def</span> <span class="nf">process_recog</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
@ -1648,12 +1720,14 @@
<span class="sd"> translated from the original sdesc at this point.</span>
<span class="sd"> obj (Object): The object the recog:ed string belongs to.</span>
<span class="sd"> This is not used by default.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> ref (str): See process_sdesc.</span>
<span class="sd"> Returns:</span>
<span class="sd"> recog (str): The modified recog string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_sdesc</span><span class="p">(</span><span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span></div>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_sdesc</span><span class="p">(</span><span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="ContribRPCharacter.process_language"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_language">[docs]</a> <span class="k">def</span> <span class="nf">process_language</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">speaker</span><span class="p">,</span> <span class="n">language</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -52,8 +52,7 @@
<span class="kn">from</span> <span class="nn">anything</span> <span class="kn">import</span> <span class="n">Something</span>
<span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">MagicMock</span><span class="p">,</span> <span class="n">patch</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">override_settings</span>
<span class="kn">from</span> <span class="nn">evennia.utils.test_resources</span> <span class="kn">import</span> <span class="n">EvenniaTest</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib</span> <span class="kn">import</span> <span class="n">traits</span>
@ -945,6 +944,51 @@
<span class="bp">self</span><span class="o">.</span><span class="n">assertGreaterEqual</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">st</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertGreaterEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">st</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertGreaterEqual</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">st</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="DummyCharacter"><a class="viewcode-back" href="../../../api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.DummyCharacter">[docs]</a><span class="k">class</span> <span class="nc">DummyCharacter</span><span class="p">(</span><span class="n">_MockObj</span><span class="p">):</span>
<span class="n">strength</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">hunting</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;Hunting skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">health</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;Health value&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestTraitFields"><a class="viewcode-back" href="../../../api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitFields">[docs]</a><span class="k">class</span> <span class="nc">TestTraitFields</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the TraitField class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestTraitFields.test_traitfields"><a class="viewcode-back" href="../../../api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitFields.test_traitfields">[docs]</a> <span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.traits._TRAIT_CLASS_PATHS&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">_TEST_TRAIT_CLASS_PATHS</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_traitfields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">DummyCharacter</span><span class="p">()</span>
<span class="n">obj2</span> <span class="o">=</span> <span class="n">DummyCharacter</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">health</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">base</span> <span class="o">+=</span> <span class="mi">5</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">17</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">berserk</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">berserk</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">health</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="p">)</span>
<span class="c1"># the traithandler still works</span>
<span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">health</span><span class="o">.</span><span class="n">current</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">99</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">health</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="c1"># making sure Descriptors are separate</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="n">obj2</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">17</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">obj2</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">base</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">base</span> <span class="o">+=</span> <span class="mi">3</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="n">obj2</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>

View file

@ -56,71 +56,128 @@
<span class="sd">## Adding Traits to a typeclass</span>
<span class="sd">To access and manipulate traits on an entity, its Typeclass needs to have a</span>
<span class="sd">`TraitHandler` assigned it. Usually, the handler is made available as `.traits`</span>
<span class="sd">(in the same way as `.tags` or `.attributes`). It&#39;s recommended to do this</span>
<span class="sd">using Evennia&#39;s `lazy_property` (which basically just means it&#39;s not</span>
<span class="sd">initialized until it&#39;s actually accessed).</span>
<span class="sd">There are two ways to set up Traits on a typeclass. The first sets up the `TraitHandler`</span>
<span class="sd">as a property `.traits` on your class and you then access traits as e.g. `.traits.strength`.</span>
<span class="sd">The other alternative uses a `TraitProperty`, which makes the trait available directly</span>
<span class="sd">as e.g. `.strength`. This solution also uses the `TraitHandler`, but you don&#39;t need to</span>
<span class="sd">define it explicitly. You can combine both styles if you like.</span>
<span class="sd">Here&#39;s an example for adding the TraitHandler to the base Object class:</span>
<span class="sd">### Traits with TraitHandler</span>
<span class="sd">Here&#39;s an example for adding the TraitHandler to the Character class:</span>
<span class="sd">```python</span>
<span class="sd"># mygame/typeclasses/objects.py</span>
<span class="sd">from evennia import DefaultObject</span>
<span class="sd">from evennia import DefaultCharacter</span>
<span class="sd">from evennia.utils import lazy_property</span>
<span class="sd">from evennia.contrib.traits import TraitHandler</span>
<span class="sd"># ...</span>
<span class="sd">class Object(DefaultObject):</span>
<span class="sd">class Character(DefaultCharacter):</span>
<span class="sd"> ...</span>
<span class="sd"> @lazy_property</span>
<span class="sd"> def traits(self):</span>
<span class="sd"> # this adds the handler as .traits</span>
<span class="sd"> return TraitHandler(self)</span>
<span class="sd">```</span>
<span class="sd">## Using traits</span>
<span class="sd"> def at_object_creation(self):</span>
<span class="sd"> # (or wherever you want)</span>
<span class="sd"> self.traits.add(&quot;str&quot;, &quot;Strength&quot;, trait_type=&quot;static&quot;, base=10, mod=2)</span>
<span class="sd"> self.traits.add(&quot;hp&quot;, &quot;Health&quot;, trait_type=&quot;gauge&quot;, min=0, max=100)</span>
<span class="sd"> self.traits.add(&quot;hunting&quot;, &quot;Hunting Skill&quot;, trait_type=&quot;counter&quot;,</span>
<span class="sd"> base=10, mod=1, min=0, max=100)</span>
<span class="sd">A trait is added to the traithandler, after which one can access it</span>
<span class="sd">as a property on the handler (similarly to how you can do .db.attrname for Attributes</span>
<span class="sd">in Evennia).</span>
<span class="sd">```python</span>
<span class="sd"># this is an example using the &quot;static&quot; trait, described below</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;hunting&quot;, &quot;Hunting Skill&quot;, trait_type=&quot;static&quot;, base=4)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">4</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value += 5</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">9</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;hp&quot;, &quot;Health&quot;, trait_type=&quot;gauge&quot;, min=0, max=100)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.value</span>
<span class="sd">100</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp -= 200</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.value</span>
<span class="sd">0</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.reset()</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.value</span>
<span class="sd">100</span>
<span class="sd"># you can also access property with getitem</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp[&quot;value&quot;]</span>
<span class="sd">100</span>
<span class="sd"># you can store arbitrary data persistently as well</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.effect = &quot;poisoned!&quot;</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.effect</span>
<span class="sd">&quot;poisoned!&quot;</span>
<span class="sd">```</span>
<span class="sd">When adding the trait, you supply the name of the property (`hunting`) along</span>
<span class="sd">with a more human-friendly name (&quot;Hunting Skill&quot;). The latter will show if you</span>
<span class="sd">print the trait etc. The `trait_type` is important, this specifies which type</span>
<span class="sd">of trait this is.</span>
<span class="sd">of trait this is (see below).</span>
<span class="sd">### TraitProperties</span>
<span class="sd">Using `TraitProperties` makes the trait available directly on the class, much like Django model</span>
<span class="sd">fields. The drawback is that you must make sure that the name of your Traits don&#39;t collide with any</span>
<span class="sd">other properties/methods on your class.</span>
<span class="sd">```python</span>
<span class="sd"># mygame/typeclasses/objects.py</span>
<span class="sd">from evennia import DefaultObject</span>
<span class="sd">from evennia.utils import lazy_property</span>
<span class="sd">from evennia.contrib.traits import TraitProperty</span>
<span class="sd"># ...</span>
<span class="sd">class Object(DefaultObject):</span>
<span class="sd"> ...</span>
<span class="sd"> strength = TraitProperty(&quot;Strength&quot;, trait_type=&quot;static&quot;, base=10, mod=2)</span>
<span class="sd"> health = TraitProperty(&quot;Health&quot;, trait_type=&quot;gauge&quot;, min=0, base=100, mod=2)</span>
<span class="sd"> hunting = TraitProperty(&quot;Hunting Skill&quot;, trait_type=&quot;counter&quot;, base=10, mod=1, min=0, max=100)</span>
<span class="sd">```</span>
<span class="sd">&gt; Note that the property-name will become the name of the trait and you don&#39;t supply `trait_key`</span>
<span class="sd">&gt; separately.</span>
<span class="sd">&gt; The `.traits` TraitHandler will still be created (it&#39;s used under the</span>
<span class="sd">&gt; hood. But it will only be created when the TraitProperty has been accessed at least once,</span>
<span class="sd">&gt; so be careful if mixing the two styles. If you want to make sure `.traits` is always available,</span>
<span class="sd">&gt; add the `TraitHandler` manually like shown earlier - the `TraitProperty` will by default use</span>
<span class="sd">&gt; the same handler (`.traits`).</span>
<span class="sd">## Using traits</span>
<span class="sd">A trait is added to the traithandler (if you use `TraitProperty` the handler is just created under</span>
<span class="sd">the hood) after which one can access it as a property on the handler (similarly to how you can do</span>
<span class="sd">.db.attrname for Attributes in Evennia).</span>
<span class="sd">All traits have a _read-only_ field `.value`. This is only used to read out results, you never</span>
<span class="sd">manipulate it directly (if you try, it will just remain unchanged). The `.value` is calculated based</span>
<span class="sd">on combining fields, like `.base` and `.mod` - which fields are available and how they relate to</span>
<span class="sd">each other depends on the trait type.</span>
<span class="sd">```python</span>
<span class="sd">&gt; obj.traits.strength.value</span>
<span class="sd">12 # base + mod</span>
<span class="sd">&gt; obj.traits.strength.base += 5</span>
<span class="sd">obj.traits.strength.value</span>
<span class="sd">17</span>
<span class="sd">&gt; obj.traits.hp.value</span>
<span class="sd">102 # base + mod</span>
<span class="sd">&gt; obj.traits.hp.base -= 200</span>
<span class="sd">&gt; obj.traits.hp.value</span>
<span class="sd">0 # min of 0</span>
<span class="sd">&gt; obj.traits.hp.reset()</span>
<span class="sd">&gt; obj.traits.hp.value</span>
<span class="sd">100</span>
<span class="sd"># you can also access properties like a dict</span>
<span class="sd">&gt; obj.traits.hp[&quot;value&quot;]</span>
<span class="sd">100</span>
<span class="sd"># you can store arbitrary data persistently for easy reference</span>
<span class="sd">&gt; obj.traits.hp.effect = &quot;poisoned!&quot;</span>
<span class="sd">&gt; obj.traits.hp.effect</span>
<span class="sd">&quot;poisoned!&quot;</span>
<span class="sd"># with TraitProperties:</span>
<span class="sd">&gt; obj.hunting.value</span>
<span class="sd">12</span>
<span class="sd">&gt; obj.strength.value += 5</span>
<span class="sd">&gt; obj.strength.value</span>
<span class="sd">17</span>
<span class="sd">```</span>
<span class="sd">## Trait types</span>
@ -131,12 +188,14 @@
<span class="sd">compatible type.</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; trait1 + trait2</span>
<span class="sd">&gt; trait1 + trait2</span>
<span class="sd">54</span>
<span class="sd">&gt;&gt;&gt; trait1.value</span>
<span class="sd">&gt; trait1.value</span>
<span class="sd">3</span>
<span class="sd">&gt;&gt;&gt; trait1 + 2</span>
<span class="sd">&gt;&gt;&gt; trait1.value</span>
<span class="sd">&gt; trait1 + 2</span>
<span class="sd">&gt; trait1.value</span>
<span class="sd">5</span>
<span class="sd">```</span>
@ -159,15 +218,17 @@
<span class="sd">that varies slowly or not at all, and which may be modified in-place.</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;str&quot;, &quot;Strength&quot;, trait_type=&quot;static&quot;, base=10, mod=2)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.value</span>
<span class="sd">&gt; obj.traits.add(&quot;str&quot;, &quot;Strength&quot;, trait_type=&quot;static&quot;, base=10, mod=2)</span>
<span class="sd">&gt; obj.traits.mytrait.value</span>
<span class="sd">12 # base + mod</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.base += 2</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.mod += 1</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.value</span>
<span class="sd">&gt; obj.traits.mytrait.base += 2</span>
<span class="sd">&gt; obj.traits.mytrait.mod += 1</span>
<span class="sd">&gt; obj.traits.mytrait.value</span>
<span class="sd">15</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.mod = 0</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.value</span>
<span class="sd">&gt; obj.traits.mytrait.mod = 0</span>
<span class="sd">&gt; obj.traits.mytrait.value</span>
<span class="sd">12</span>
<span class="sd">```</span>
@ -177,9 +238,9 @@
<span class="sd"> min/unset base base+mod max/unset</span>
<span class="sd"> |--------------|--------|---------X--------X------------|</span>
<span class="sd"> current value</span>
<span class="sd"> = current</span>
<span class="sd"> + mod</span>
<span class="sd"> current value</span>
<span class="sd"> = current</span>
<span class="sd"> + mod</span>
<span class="sd">A counter describes a value that can move from a base. The `.current` property</span>
<span class="sd">is the thing usually modified. It starts at the `.base`. One can also add a</span>
@ -188,18 +249,24 @@
<span class="sd">remove it. A suggested use for a Counter Trait would be to track skill values.</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;hunting&quot;, &quot;Hunting Skill&quot;, trait_type=&quot;counter&quot;,</span>
<span class="sd">&gt; obj.traits.add(&quot;hunting&quot;, &quot;Hunting Skill&quot;, trait_type=&quot;counter&quot;,</span>
<span class="sd"> base=10, mod=1, min=0, max=100)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">11 # current starts at base + mod</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.current += 10</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.current += 10</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">21</span>
<span class="sd"># reset back to base+mod by deleting current</span>
<span class="sd">&gt;&gt;&gt; del obj.traits.hunting.current</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; del obj.traits.hunting.current</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">11</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.max = None # removing upper bound</span>
<span class="sd">&gt; obj.traits.hunting.max = None # removing upper bound</span>
<span class="sd"># for TraitProperties, pass the args/kwargs of traits.add() to the</span>
<span class="sd"># TraitProperty constructor instead.</span>
<span class="sd">```</span>
@ -216,21 +283,22 @@
<span class="sd">The keys must be supplied from smallest to largest. Any values below the lowest and above the</span>
<span class="sd">highest description will be considered to be included in the closest description slot.</span>
<span class="sd">By calling `.desc()` on the Counter, will you get the text matching the current `value`</span>
<span class="sd">value.</span>
<span class="sd">By calling `.desc()` on the Counter, you will get the text matching the current `value`.</span>
<span class="sd">```python</span>
<span class="sd"># (could also have passed descs= to traits.add())</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.descs = {</span>
<span class="sd">&gt; obj.traits.hunting.descs = {</span>
<span class="sd"> 0: &quot;unskilled&quot;, 10: &quot;neophyte&quot;, 50: &quot;trained&quot;, 70: &quot;expert&quot;, 90: &quot;master&quot;}</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">11</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.desc()</span>
<span class="sd">&gt; obj.traits.hunting.desc()</span>
<span class="sd">&quot;neophyte&quot;</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.current += 60</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.current += 60</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">71</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.desc()</span>
<span class="sd">&gt; obj.traits.hunting.desc()</span>
<span class="sd">&quot;expert&quot;</span>
<span class="sd">```</span>
@ -250,30 +318,37 @@
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">71</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.ratetarget = 71</span>
<span class="sd">&gt; obj.traits.hunting.ratetarget = 71</span>
<span class="sd"># debuff hunting for some reason</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.current -= 30</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.current -= 30</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">41</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.rate = 1 # 1/s increase</span>
<span class="sd">&gt; obj.traits.hunting.rate = 1 # 1/s increase</span>
<span class="sd"># Waiting 5s</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">46</span>
<span class="sd"># Waiting 8s</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">54</span>
<span class="sd"># Waiting 100s</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.value</span>
<span class="sd">&gt; obj.traits.hunting.value</span>
<span class="sd">71 # we have stopped at the ratetarget</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.rate = 0 # disable auto-change</span>
<span class="sd">&gt; obj.traits.hunting.rate = 0 # disable auto-change</span>
<span class="sd">```</span>
<span class="sd">Note that if `.rate` is a non-integer, the resulting `.value` (at least until it</span>
<span class="sd">reaches a boundary or rate-target) will also come out a float (so you can get a</span>
<span class="sd">very exact value at the current time). If you expect an integer, you must run</span>
<span class="sd">`int()` (or something like `round()`) on the result yourself.</span>
<span class="sd">Note that when retrieving the `current`, the result will always be of the same</span>
<span class="sd">type as the `.base` even `rate` is a non-integer value. So if `base` is an `int`</span>
<span class="sd">(default)`, the `current` value will also be rounded the closest full integer.</span>
<span class="sd">If you want to see the exact `current` value, set `base` to a float - you</span>
<span class="sd">will then need to use `round()` yourself on the result if you want integers.</span>
<span class="sd">#### .percent()</span>
@ -281,9 +356,10 @@
<span class="sd">return the value as a percentage.</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.percent()</span>
<span class="sd">&gt; obj.traits.hunting.percent()</span>
<span class="sd">&quot;71.0%&quot;</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hunting.percent(formatting=None)</span>
<span class="sd">&gt; obj.traits.hunting.percent(formatting=None)</span>
<span class="sd">71.0</span>
<span class="sd">```</span>
@ -301,20 +377,22 @@
<span class="sd">The `.current` value will start from a full gauge. The .max property is</span>
<span class="sd">read-only and is set by `.base` + `.mod`. So contrary to a `Counter`, the</span>
<span class="sd">`.mod` modifier only applies to the max value of the gauge and not the current</span>
<span class="sd">value. The minimum bound defaults to 0 if not set explicitly. </span>
<span class="sd">value. The minimum bound defaults to 0 if not set explicitly.</span>
<span class="sd">This trait is useful for showing commonly depletable resources like health,</span>
<span class="sd">stamina and the like.</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;hp&quot;, &quot;Health&quot;, trait_type=&quot;gauge&quot;, base=100)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.value # (or .current)</span>
<span class="sd">&gt; obj.traits.add(&quot;hp&quot;, &quot;Health&quot;, trait_type=&quot;gauge&quot;, base=100)</span>
<span class="sd">&gt; obj.traits.hp.value # (or .current)</span>
<span class="sd">100</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.mod = 10</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.value</span>
<span class="sd">&gt; obj.traits.hp.mod = 10</span>
<span class="sd">&gt; obj.traits.hp.value</span>
<span class="sd">110</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.current -= 30</span>
<span class="sd">&gt;&gt;&gt; obj.traits.hp.value</span>
<span class="sd">&gt; obj.traits.hp.current -= 30</span>
<span class="sd">&gt; obj.traits.hp.value</span>
<span class="sd">80</span>
<span class="sd">```</span>
@ -322,7 +400,7 @@
<span class="sd">The Gauge trait is subclass of the Counter, so you have access to the same</span>
<span class="sd">methods and properties where they make sense. So gauges can also have a</span>
<span class="sd">`.descs` dict to describe the intervals in text, and can use `.percent()` to</span>
<span class="sd">get how filled it is as a percentage etc. </span>
<span class="sd">get how filled it is as a percentage etc.</span>
<span class="sd">The `.rate` is particularly relevant for gauges - useful for everything</span>
<span class="sd">from poison slowly draining your health, to resting gradually increasing it.</span>
@ -333,18 +411,21 @@
<span class="sd">This is the &#39;base&#39; Trait, meant to inherit from if you want to invent</span>
<span class="sd">trait-types from scratch (most of the time you&#39;ll probably inherit from some of</span>
<span class="sd">the more advanced trait-type classes though). A `Trait`s `.value` can be</span>
<span class="sd">anything (that can be stored in an Attribute) and if it&#39;s a integer/float you</span>
<span class="sd">can do arithmetic with it, but otherwise it acts just like a glorified</span>
<span class="sd">Attribute.</span>
<span class="sd">the more advanced trait-type classes though).</span>
<span class="sd">Unlike other Trait-types, the single `.value` property of the base `Trait` can</span>
<span class="sd">be editied. The value can hold any data that can be stored in an Attribute. If</span>
<span class="sd">it&#39;s an integer/float you can do arithmetic with it, but otherwise this acts just</span>
<span class="sd">like a glorified Attribute.</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;mytrait&quot;, &quot;My Trait&quot;, trait_type=&quot;trait&quot;, value=30)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.value</span>
<span class="sd">&gt; obj.traits.add(&quot;mytrait&quot;, &quot;My Trait&quot;, trait_type=&quot;trait&quot;, value=30)</span>
<span class="sd">&gt; obj.traits.mytrait.value</span>
<span class="sd">30</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.value = &quot;stringvalue&quot;</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mytrait.value</span>
<span class="sd">&gt; obj.traits.mytrait.value = &quot;stringvalue&quot;</span>
<span class="sd">&gt; obj.traits.mytrait.value</span>
<span class="sd">&quot;stringvalue&quot;</span>
<span class="sd">```</span>
@ -371,7 +452,7 @@
<span class="sd"> def sedate(self):</span>
<span class="sd"> self.mod = 0</span>
<span class="sd"> </span>
<span class="sd">```</span>
@ -389,10 +470,15 @@
<span class="sd">Reload the server and you should now be able to use your trait:</span>
<span class="sd">```python</span>
<span class="sd">&gt;&gt;&gt; obj.traits.add(&quot;mood&quot;, &quot;A dark mood&quot;, rage=30, trait_type=&#39;rage&#39;)</span>
<span class="sd">&gt;&gt;&gt; obj.traits.mood.rage</span>
<span class="sd">&gt; obj.traits.add(&quot;mood&quot;, &quot;A dark mood&quot;, rage=30, trait_type=&#39;rage&#39;)</span>
<span class="sd">&gt; obj.traits.mood.rage</span>
<span class="sd">30</span>
<span class="sd"># as TraitProperty</span>
<span class="sd">class Character(DefaultCharacter):</span>
<span class="sd"> rage = TraitProperty(&quot;A dark mood&quot;, rage=30, trait_type=&#39;rage&#39;)</span>
<span class="sd">```</span>
<span class="sd">----</span>
@ -477,12 +563,22 @@
<span class="sd"> This represents a required key that must be</span>
<span class="sd"> supplied when a Trait is initialized. It&#39;s used</span>
<span class="sd"> by Trait classes when defining their required keys.</span>
<span class="sd"> &quot;&quot;&quot;</span></div>
<span class="sd"> &quot;&quot;&quot;</span></div>
<div class="viewcode-block" id="TraitHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.traits.html#evennia.contrib.traits.TraitHandler">[docs]</a><span class="k">class</span> <span class="nc">TraitHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Factory class that instantiates Trait objects.</span>
<span class="sd"> Factory class that instantiates Trait objects. Must be assigned as a property</span>
<span class="sd"> on the class, usually with `lazy_property`.</span>
<span class="sd"> Example:</span>
<span class="sd"> ::</span>
<span class="sd"> class Object(DefaultObject):</span>
<span class="sd"> ...</span>
<span class="sd"> @lazy_property</span>
<span class="sd"> def traits(self):</span>
<span class="sd"> # this adds the handler as .traits</span>
<span class="sd"> return TraitHandler(self)</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -492,12 +588,14 @@
<span class="sd"> Args:</span>
<span class="sd"> obj (Object): Parent Object typeclass for this TraitHandler</span>
<span class="sd"> db_attribute_key (str): Name of the DB attribute for trait data storage</span>
<span class="sd"> db_attribute_key (str): Name of the DB attribute for trait data storage.</span>
<span class="sd"> db_attribute_category (str): Name of DB attribute&#39;s category to trait data storage.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># load the available classes, if necessary</span>
<span class="n">_delayed_import_trait_classes</span><span class="p">()</span>
<span class="c1"># initialize any</span>
<span class="c1"># Note that .trait_data retains the connection to the database, meaning every</span>
<span class="c1"># update we do to .trait_data automatically syncs with database.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">trait_data</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">db_attribute_key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">db_attribute_category</span><span class="p">)</span>
@ -602,7 +700,7 @@
<span class="sd"> name (str, optional): Name of the Trait, like &quot;Health&quot;. If</span>
<span class="sd"> not given, will use `trait_key` starting with a capital letter.</span>
<span class="sd"> trait_type (str, optional): One of &#39;static&#39;, &#39;counter&#39; or &#39;gauge&#39;.</span>
<span class="sd"> force_add (bool): If set, create a new Trait even if a Trait with</span>
<span class="sd"> force (bool): If set, create a new Trait even if a Trait with</span>
<span class="sd"> the same `trait_key` already exists.</span>
<span class="sd"> trait_properties (dict): These will all be use to initialize</span>
<span class="sd"> the new trait. See the `properties` class variable on each</span>
@ -657,6 +755,100 @@
<span class="bp">self</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">trait_key</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="TraitProperty"><a class="viewcode-back" href="../../../api/evennia.contrib.traits.html#evennia.contrib.traits.TraitProperty">[docs]</a><span class="k">class</span> <span class="nc">TraitProperty</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Optional extra: Allows for applying traits as individual properties directly on the parent class</span>
<span class="sd"> instead for properties on the `.traits` handler. So with this you could access data e.g. as</span>
<span class="sd"> `character.hp.value` instead of `character.traits.hp.value`. This still uses the traitshandler</span>
<span class="sd"> under the hood.</span>
<span class="sd"> Example:</span>
<span class="sd"> ::</span>
<span class="sd"> from evennia.utils import lazy_property</span>
<span class="sd"> from evennia.contrib.traits import TraitProperty</span>
<span class="sd"> class Character(DefaultCharacter):</span>
<span class="sd"> strength = TraitProperty(&quot;str&quot;, &quot;Strength&quot;, trait_type=&quot;static&quot;, base=10, mod=2)</span>
<span class="sd"> hunting = TraitProperty(self, &quot;hunting&quot;, &quot;Hunting Skill&quot;, trait_type=&quot;counter&quot;,</span>
<span class="sd"> base=10, mod=1, max=100)</span>
<span class="sd"> health = TraitProperty(&quot;health&quot;, &quot;Health&quot;, trait_type=&quot;gauge&quot;, min=0, base=100)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TraitProperty.__init__"><a class="viewcode-back" href="../../../api/evennia.contrib.traits.html#evennia.contrib.traits.TraitProperty.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="n">DEFAULT_TRAIT_TYPE</span><span class="p">,</span> <span class="n">force</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">trait_properties</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initialize a TraitField. Mimics TraitHandler.add input except no `trait_key`.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str, optional): Name of the Trait, like &quot;Health&quot;. If</span>
<span class="sd"> not given, will use `trait_key` starting with a capital letter.</span>
<span class="sd"> trait_type (str, optional): One of &#39;static&#39;, &#39;counter&#39; or &#39;gauge&#39;.</span>
<span class="sd"> force (bool): If set, create a new Trait even if a Trait with</span>
<span class="sd"> the same `trait_key` already exists.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> traithandler_name (str): If given, this is used as the name of the TraitHandler created</span>
<span class="sd"> behind the scenes. If not set, this will be a property `traits` on the class.</span>
<span class="sd"> any: All other trait_properties are the same as for adding a new trait of the given type</span>
<span class="sd"> using the normal TraitHandler.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_traithandler_name</span> <span class="o">=</span> <span class="n">trait_properties</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;traithandler_name&quot;</span><span class="p">,</span> <span class="s2">&quot;traits&quot;</span><span class="p">)</span>
<span class="n">trait_properties</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;trait_type&quot;</span><span class="p">:</span> <span class="n">trait_type</span><span class="p">,</span> <span class="s2">&quot;force&quot;</span><span class="p">:</span> <span class="n">force</span><span class="p">})</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_trait_properties</span> <span class="o">=</span> <span class="n">trait_properties</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cache</span> <span class="o">=</span> <span class="p">{}</span></div>
<span class="k">def</span> <span class="nf">__set_name__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called the very first time the Descriptor is assigned to the</span>
<span class="sd"> class; we store it so we can create new instances with this later.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_trait_key</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">owner</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Descriptor definition. This is called when the trait-name is aqcuired on the</span>
<span class="sd"> instance and reroutes to fetching the actual Trait from the connected</span>
<span class="sd"> TraitHandler (the connection is set up on-demand).</span>
<span class="sd"> Returns:</span>
<span class="sd"> Trait: The trait this property represents.</span>
<span class="sd"> Notes:</span>
<span class="sd"> We have one descriptor on the class, but we don&#39;t want each instance to share the</span>
<span class="sd"> state (self) of that descriptor. So we must make sure to cache the trait per-instance</span>
<span class="sd"> or we would end up with cross-use between instances.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">instance</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cache</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">traithandler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_traithandler_name</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="c1"># traithandler not found; create a new on-demand</span>
<span class="n">traithandler</span> <span class="o">=</span> <span class="n">TraitHandler</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_traithandler_name</span><span class="p">,</span> <span class="n">traithandler</span><span class="p">)</span>
<span class="c1"># this will either get the trait from attribute or make a new one</span>
<span class="n">trait</span> <span class="o">=</span> <span class="n">traithandler</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_trait_key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">trait</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># initialize the trait</span>
<span class="n">traithandler</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_trait_key</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_trait_properties</span>
<span class="p">)</span>
<span class="n">trait</span> <span class="o">=</span> <span class="n">traithandler</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_trait_key</span><span class="p">)</span> <span class="c1"># caches it in the traithandler</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cache</span><span class="p">[</span><span class="n">instance</span><span class="p">]</span> <span class="o">=</span> <span class="n">trait</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cache</span><span class="p">[</span><span class="n">instance</span><span class="p">]</span>
<span class="k">def</span> <span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> We don&#39;t set data directly, it&#39;s all rerouted to the trait.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="c1"># Parent Trait class</span>
@ -991,7 +1183,7 @@
<div class="viewcode-block" id="StaticTrait"><a class="viewcode-back" href="../../../api/evennia.contrib.traits.html#evennia.contrib.traits.StaticTrait">[docs]</a><span class="k">class</span> <span class="nc">StaticTrait</span><span class="p">(</span><span class="n">Trait</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Static Trait. This is a single value with a modifier,</span>
<span class="sd"> with no concept of a &#39;current&#39; value.</span>
<span class="sd"> with no concept of a &#39;current&#39; value or min/max etc.</span>
<span class="sd"> value = base + mod</span>
@ -1006,6 +1198,16 @@
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{name:12}</span><span class="s2"> </span><span class="si">{status}</span><span class="s2"> (</span><span class="si">{mod:+3}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">mod</span><span class="p">)</span>
<span class="c1"># Helpers</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">base</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;base&quot;</span><span class="p">]</span>
<span class="nd">@base</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">base</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;base&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_keys</span><span class="p">[</span><span class="s2">&quot;base&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;base&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">mod</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -1126,7 +1328,6 @@
<span class="k">def</span> <span class="nf">_check_and_start_timer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Start timer if we are not at a boundary.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rate</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;last_update&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">ratetarget</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;ratetarget&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_within_boundaries</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_passed_ratetarget</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># we are not at a boundary [anymore].</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;last_update&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
@ -1155,6 +1356,8 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;current&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">current</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">base</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">round</span><span class="p">(</span><span class="n">current</span><span class="p">)</span>
<span class="k">return</span> <span class="n">current</span>
<span class="c1"># properties</span>
@ -1359,6 +1562,9 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="s2">&quot;current&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">current</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">base</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">round</span><span class="p">(</span><span class="n">current</span><span class="p">)</span>
<span class="k">return</span> <span class="n">current</span>
<span class="k">def</span> <span class="nf">_enforce_boundaries</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
@ -1416,13 +1622,13 @@
<span class="nd">@max</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">max</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">TraitException</span><span class="p">(</span>
<span class="s2">&quot;The .max property is not settable &quot;</span> <span class="s2">&quot;on GaugeTraits. Set .base instead.&quot;</span>
<span class="s2">&quot;The .max property is not settable on GaugeTraits. Set .mod and .base instead.&quot;</span>
<span class="p">)</span>
<span class="nd">@max</span><span class="o">.</span><span class="n">deleter</span>
<span class="k">def</span> <span class="nf">max</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">TraitException</span><span class="p">(</span>
<span class="s2">&quot;The .max property cannot be reset &quot;</span> <span class="s2">&quot;on GaugeTraits. Reset .mod and .base instead.&quot;</span>
<span class="s2">&quot;The .max property cannot be reset on GaugeTraits. Reset .mod and .base instead.&quot;</span>
<span class="p">)</span>
<span class="nd">@property</span>

View file

@ -1111,12 +1111,13 @@
<span class="n">Xmax</span><span class="p">,</span> <span class="n">Ymax</span> <span class="o">=</span> <span class="n">gridsize</span>
<span class="n">grid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_grid</span><span class="p">(</span><span class="n">Xmax</span><span class="p">,</span> <span class="n">Ymax</span><span class="p">)</span>
<span class="n">mapobj</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">XYMap</span><span class="p">({</span><span class="s1">&#39;map&#39;</span><span class="p">:</span> <span class="n">grid</span><span class="p">},</span> <span class="n">Z</span><span class="o">=</span><span class="s2">&quot;testmap&quot;</span><span class="p">)</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t0 = time()</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="c1"># cProfile.runctx(&#39;mapobj.parse()&#39;, globals(), locals())</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertLess</span><span class="p">(</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t0</span><span class="p">,</span> <span class="n">max_time</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;Map creation of (</span><span class="si">{</span><span class="n">Xmax</span><span class="si">}</span><span class="s2">x</span><span class="si">{</span><span class="n">Ymax</span><span class="si">}</span><span class="s2">) grid slower &quot;</span>
<span class="sa">f</span><span class="s2">&quot;than expected </span><span class="si">{</span><span class="n">max_time</span><span class="si">}</span><span class="s2">s.&quot;</span><span class="p">)</span>
<span class="c1"># t1 = time()</span>
<span class="c1"># if (t1 - t0 &gt; max_time):</span>
<span class="c1"># print(f&quot;Map creation of ({Xmax}x{Ymax}) grid slower &quot;</span>
<span class="c1"># f&quot;than expected {max_time}s.&quot;)</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">((</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="mi">10</span><span class="o">**-</span><span class="mi">3</span><span class="p">),</span>
@ -1132,9 +1133,9 @@
<span class="n">mapobj</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">XYMap</span><span class="p">({</span><span class="s1">&#39;map&#39;</span><span class="p">:</span> <span class="n">grid</span><span class="p">},</span> <span class="n">Z</span><span class="o">=</span><span class="s2">&quot;testmap&quot;</span><span class="p">)</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t0 = time()</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">calculate_path_matrix</span><span class="p">()</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t1 = time()</span>
<span class="c1"># print(f&quot;pathfinder matrix for grid {Xmax}x{Ymax}: {t1 - t0}s&quot;)</span>
<span class="c1"># get the maximum distance and 9 other random points in the grid</span>
@ -1143,12 +1144,13 @@
<span class="n">start_end_points</span><span class="o">.</span><span class="n">append</span><span class="p">(((</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Xmax</span><span class="p">),</span> <span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Ymax</span><span class="p">)),</span>
<span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Xmax</span><span class="p">),</span> <span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Ymax</span><span class="p">))))</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t0 = time()</span>
<span class="k">for</span> <span class="n">startcoord</span><span class="p">,</span> <span class="n">endcoord</span> <span class="ow">in</span> <span class="n">start_end_points</span><span class="p">:</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">get_shortest_path</span><span class="p">(</span><span class="n">startcoord</span><span class="p">,</span> <span class="n">endcoord</span><span class="p">)</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertLess</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t0</span><span class="p">)</span> <span class="o">/</span> <span class="mi">10</span><span class="p">,</span> <span class="n">max_time</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;Pathfinding for (</span><span class="si">{</span><span class="n">Xmax</span><span class="si">}</span><span class="s2">x</span><span class="si">{</span><span class="n">Ymax</span><span class="si">}</span><span class="s2">) grid slower &quot;</span>
<span class="sa">f</span><span class="s2">&quot;than expected </span><span class="si">{</span><span class="n">max_time</span><span class="si">}</span><span class="s2">s.&quot;</span><span class="p">)</span>
<span class="c1"># t1 = time()</span>
<span class="c1"># if (t1 - t0) / 10 &gt; max_time:</span>
<span class="c1"># print(f&quot;Pathfinding for ({Xmax}x{Ymax}) grid slower &quot;</span>
<span class="c1"># f&quot;than expected {max_time}s.&quot;)</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">((</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="mi">4</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">),</span>
@ -1165,9 +1167,9 @@
<span class="n">mapobj</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">XYMap</span><span class="p">({</span><span class="s1">&#39;map&#39;</span><span class="p">:</span> <span class="n">grid</span><span class="p">},</span> <span class="n">Z</span><span class="o">=</span><span class="s2">&quot;testmap&quot;</span><span class="p">)</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t0 = time()</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">calculate_path_matrix</span><span class="p">()</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t1 = time()</span>
<span class="c1"># print(f&quot;pathfinder matrix for grid {Xmax}x{Ymax}: {t1 - t0}s&quot;)</span>
<span class="c1"># get random center points in grid and a range of targets to visualize the</span>
@ -1177,14 +1179,14 @@
<span class="n">start_end_points</span><span class="o">.</span><span class="n">append</span><span class="p">(((</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Xmax</span><span class="p">),</span> <span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Ymax</span><span class="p">)),</span>
<span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Xmax</span><span class="p">),</span> <span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Ymax</span><span class="p">))))</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="c1"># t0 = time()</span>
<span class="k">for</span> <span class="n">coord</span><span class="p">,</span> <span class="n">target</span> <span class="ow">in</span> <span class="n">start_end_points</span><span class="p">:</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">get_visual_range</span><span class="p">(</span><span class="n">coord</span><span class="p">,</span> <span class="n">dist</span><span class="o">=</span><span class="n">dist</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;nodes&#39;</span><span class="p">,</span>
<span class="n">character</span><span class="o">=</span><span class="s1">&#39;@&#39;</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="n">target</span><span class="p">)</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertLess</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t0</span><span class="p">)</span> <span class="o">/</span> <span class="mi">10</span><span class="p">,</span> <span class="n">max_time</span><span class="p">,</span>
<span class="sa">f</span><span class="s2">&quot;Visual Range calculation for (</span><span class="si">{</span><span class="n">Xmax</span><span class="si">}</span><span class="s2">x</span><span class="si">{</span><span class="n">Ymax</span><span class="si">}</span><span class="s2">) grid &quot;</span>
<span class="sa">f</span><span class="s2">&quot;slower than expected </span><span class="si">{</span><span class="n">max_time</span><span class="si">}</span><span class="s2">s.&quot;</span><span class="p">)</span></div>
<span class="n">character</span><span class="o">=</span><span class="s1">&#39;@&#39;</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="n">target</span><span class="p">)</span></div>
<span class="c1"># t1 = time()</span>
<span class="c1"># if (t1 - t0) / 10 &gt; max_time:</span>
<span class="c1"># print(f&quot;Visual Range calculation for ({Xmax}x{Ymax}) grid &quot;</span>
<span class="c1"># f&quot;slower than expected {max_time}s.&quot;)</span>
<div class="viewcode-block" id="TestXYZGrid"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.tests.html#evennia.contrib.xyzgrid.tests.TestXYZGrid">[docs]</a><span class="k">class</span> <span class="nc">TestXYZGrid</span><span class="p">(</span><span class="n">EvenniaTest</span><span class="p">):</span>

View file

@ -60,8 +60,10 @@
<span class="kn">import</span> <span class="nn">uuid</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
<span class="kn">from</span> <span class="nn">django.core</span> <span class="kn">import</span> <span class="n">exceptions</span> <span class="k">as</span> <span class="n">django_exceptions</span>
<span class="kn">from</span> <span class="nn">evennia.prototypes</span> <span class="kn">import</span> <span class="n">spawner</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">make_iter</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="n">MAPSCAN</span><span class="p">,</span> <span class="n">REVERSE_DIRECTIONS</span><span class="p">,</span> <span class="n">MapParserError</span><span class="p">,</span> <span class="n">BIGVAL</span>
<span class="n">NodeTypeclass</span> <span class="o">=</span> <span class="kc">None</span>
@ -351,7 +353,7 @@
<span class="k">try</span><span class="p">:</span>
<span class="n">nodeobj</span> <span class="o">=</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">)</span>
<span class="k">except</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="k">except</span> <span class="n">django_exceptions</span><span class="o">.</span><span class="n">ObjectDoesNotExist</span><span class="p">:</span>
<span class="c1"># create a new entity with proper coordinates etc</span>
<span class="n">tclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prototype</span><span class="p">[</span><span class="s1">&#39;typeclass&#39;</span><span class="p">]</span>
<span class="n">tclass</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s1">&#39; (</span><span class="si">{</span><span class="n">tclass</span><span class="si">}</span><span class="s1">)&#39;</span>
@ -475,7 +477,7 @@
<span class="k">try</span><span class="p">:</span>
<span class="n">nodeobj</span> <span class="o">=</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">)</span>
<span class="k">except</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="k">except</span> <span class="n">django_exceptions</span><span class="o">.</span><span class="n">ObjectDoesNotExist</span><span class="p">:</span>
<span class="c1"># no object exists</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>

View file

@ -86,7 +86,22 @@
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
<span class="n">fieldname</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">fieldname</span> <span class="ow">in</span> <span class="n">prototype</span><span class="p">:</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="n">fieldname</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># check if it&#39;s an attribute</span>
<span class="k">for</span> <span class="n">attrtuple</span> <span class="ow">in</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;attrs&#39;</span><span class="p">,</span> <span class="p">[]):</span>
<span class="k">if</span> <span class="n">attrtuple</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">fieldname</span><span class="p">:</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">attrtuple</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">fieldname</span><span class="si">}</span><span class="s2"> not found in prototype</span><span class="se">\n</span><span class="si">{</span><span class="n">prototype</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;(neither as prototype-field or as an Attribute&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">prot_value</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error in prototype</span><span class="se">\n</span><span class="si">{</span><span class="n">prototype</span><span class="si">}</span><span class="se">\n</span><span class="s2">$protkey can only reference static &quot;</span>
<span class="sa">f</span><span class="s2">&quot;values/attributes (found </span><span class="si">{</span><span class="n">prot_value</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_eval</span><span class="p">(</span><span class="n">prot_value</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">except</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">ParsingError</span><span class="p">:</span>

View file

@ -558,6 +558,10 @@
<span class="sd"> be found as a match.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># prototype keys are always in lowecase</span>
<span class="k">if</span> <span class="n">key</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="c1"># search module prototypes</span>
<span class="n">mod_matches</span> <span class="o">=</span> <span class="p">{}</span>

View file

@ -979,41 +979,45 @@
<span class="s2">&quot;key&quot;</span><span class="p">,</span>
<span class="s2">&quot;Spawned-</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()),</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]),</span>
<span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span>
<span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;home&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span><span class="p">:</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="c1"># settings.DEFAULT_HOME not existing is common for unittests</span>
<span class="k">pass</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;destination&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_OBJECT_TYPECLASS</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="c1"># extract calls to handlers</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;permissions&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">permission_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">permission_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">lock_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">lock_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;aliases&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">)</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="n">category</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">data</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">),</span>
<span class="n">category</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">data</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prototype_key</span><span class="p">:</span>
@ -1021,11 +1025,12 @@
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">PROTOTYPE_TAG_CATEGORY</span><span class="p">))</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;exec&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">execs</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">execs</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="c1"># extract ndb assignments</span>
<span class="n">nattributes</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">))</span>
<span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">))</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">prot</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;ndb_&quot;</span><span class="p">)</span>
<span class="p">)</span>
@ -1034,8 +1039,9 @@
<span class="n">val</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;attrs&quot;</span><span class="p">,</span> <span class="p">[]))</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">attrname</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="o">*</span><span class="n">rest</span><span class="p">)</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">attrname</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span>
<span class="n">rest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">rest</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span> <span class="n">rest</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">attrname</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">),</span>
<span class="n">rest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">rest</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span> <span class="n">rest</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">simple_attributes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span>
@ -1046,7 +1052,8 @@
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">simple_attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">value_to_obj_or_any</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">value_to_obj_or_any</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="n">attributes</span> <span class="o">+</span> <span class="n">simple_attributes</span>

View file

@ -73,6 +73,7 @@
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="n">_FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span>
<span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BROADCAST_SERVER_RESTART_MESSAGES</span>
<span class="c1"># delayed imports</span>
<span class="n">_AccountDB</span> <span class="o">=</span> <span class="kc">None</span>
@ -439,7 +440,8 @@
<span class="c1"># tell the server hook we synced</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">at_post_portal_sync</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="c1"># announce the reconnection</span>
<span class="bp">self</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot; ... Server restarted.&quot;</span><span class="p">))</span></div>
<span class="k">if</span> <span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot; ... Server restarted.&quot;</span><span class="p">))</span> </div>
<div class="viewcode-block" id="ServerSessionHandler.portal_disconnect"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_disconnect">[docs]</a> <span class="k">def</span> <span class="nf">portal_disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -1158,7 +1158,7 @@
<span class="sd"> Notes:</span>
<span class="sd"> Beyond those table-specific keywords, the non-overlapping keywords</span>
<span class="sd"> of `EcCell.__init__` are also available. These will be passed down</span>
<span class="sd"> of `EvCell.__init__` are also available. These will be passed down</span>
<span class="sd"> to every cell in the table.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -1520,31 +1520,13 @@
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">,</span> <span class="n">chmin</span> <span class="o">+</span> <span class="n">locked_height</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># now we add all the extra height up to the desired table-height.</span>
<span class="c1"># We do this so that the tallest cells gets expanded first (and</span>
<span class="c1"># thus avoid getting cropped)</span>
<span class="n">even</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span>
<span class="n">correction</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">correction</span> <span class="o">&lt;</span> <span class="n">excess</span><span class="p">:</span>
<span class="c1"># expand the cells with the most rows first</span>
<span class="k">if</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">correction</span> <span class="o">&lt;</span> <span class="n">nrowmax</span> <span class="ow">and</span> <span class="n">nrowmax</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># avoid adding to header first round (looks bad on very small tables)</span>
<span class="n">ci</span> <span class="o">=</span> <span class="n">cheights</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">cheights</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ci</span> <span class="o">=</span> <span class="n">cheights</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">cheights</span><span class="p">))</span>
<span class="k">if</span> <span class="n">ci</span> <span class="ow">in</span> <span class="n">locked_cols</span><span class="p">:</span>
<span class="c1"># locked row, make sure it&#39;s not picked again</span>
<span class="n">cheights</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">9999</span>
<span class="n">cheights_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">=</span> <span class="n">locked_cols</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cheights_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># change balance</span>
<span class="k">if</span> <span class="n">ci</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span><span class="p">:</span>
<span class="c1"># it doesn&#39;t look very good if header expands too fast</span>
<span class="n">cheights</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">even</span> <span class="k">else</span> <span class="mi">3</span>
<span class="n">cheights</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">even</span> <span class="k">else</span> <span class="mi">1</span>
<span class="n">correction</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># Add all the excess at the end of the table</span>
<span class="c1"># Note: Older solutions tried to balance individual</span>
<span class="c1"># rows&#39; vsize. This could lead to empty rows that</span>
<span class="c1"># looked like a bug. This solution instead</span>
<span class="c1"># adds empty rows at the end which is less sophisticated</span>
<span class="c1"># but much more visually consistent.</span>
<span class="n">cheights_min</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">excess</span>
<span class="n">cheights</span> <span class="o">=</span> <span class="n">cheights_min</span>
<span class="c1"># we must tell cells to crop instead of expanding</span>
@ -1603,7 +1585,7 @@
<span class="sd"> to the end.</span>
<span class="sd"> Args:</span>
<span class="sd"> args (`EvColum` or multiple strings): Either a single EvColumn instance or</span>
<span class="sd"> args (`EvColumn` or multiple strings): Either a single EvColumn instance or</span>
<span class="sd"> a number of data string arguments to be used to create a new column.</span>
<span class="sd"> header (str, optional): The header text for the column</span>
<span class="sd"> xpos (int, optional): Index position in table *before* which</span>

View file

@ -450,7 +450,16 @@
<span class="sd"> lines (list): lines from our _file attribute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="o">.</span><span class="n">readlines</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)]</span></div></div>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="o">.</span><span class="n">readlines</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">lines</span></div></div>
<span class="n">_LOG_FILE_HANDLES</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># holds open log handles</span>

View file

@ -2090,7 +2090,7 @@
<span class="n">_missing</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<div class="viewcode-block" id="lazy_property"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.contrib.tutorial_examples.red_button.lazy_property">[docs]</a><span class="k">class</span> <span class="nc">lazy_property</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="lazy_property"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.contrib.tutorial_examples.red_button.lazy_property">[docs]</a><span class="k">class</span> <span class="nc">lazy_property</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Delays loading of property until first access. Credit goes to the</span>
<span class="sd"> Implementation in the werkzeug suite:</span>

View file

@ -175,8 +175,12 @@
<span class="k">for</span> <span class="n">log</span> <span class="ow">in</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">tail_log_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_num_lines</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">log</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">time</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot; [-] &quot;</span><span class="p">)</span>
<span class="n">time_key</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">time</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot; [-] &quot;</span><span class="p">)</span>
<span class="n">time_key</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="c1"># malformed log line. Skip.</span>
<span class="k">continue</span>
<span class="n">bucket</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">time_key</span><span class="p">,</span> <span class="s2">&quot;timestamp&quot;</span><span class="p">:</span> <span class="n">time</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="n">msg</span><span class="p">})</span>

View file

@ -134,6 +134,17 @@ Full director-style emoting system replacing names with sdescs/recogs. Supports
Dynamic obfuscation of emotes when speaking unfamiliar languages. Also obfuscates whispers.
### Traits
*Whitenoise 2014, Griatch2021*
Powerful on-object properties (very extended Attributes) for representing
health, mana, skill-levels etc, with automatic min/max value, base, modifiers
and named tiers for different values. Also include timed rate increase/decrease
to have values change over a period of time.
### Turnbattle
*FlutterSprite 2017*

View file

@ -40,11 +40,20 @@ Exits: northeast and east
## Installation
1. Import and add the `evennia.contrib.commands.XYZGridCmdSet` to the
1. XYZGrid requires the `scipy` library. Easiest is to just install the
optional/contrib requirements in `evennia/requirements_extra.txt` by
doing
(cd to evennia/ folder)
pip install -r requirements_extra.txt
(then go back to your mygame/ folder)
This will install all optional requirements of Evennia.
2. Import and add the `evennia.contrib.commands.XYZGridCmdSet` to the
`CharacterCmdset` cmdset in `mygame/commands.default_cmds.py`. Reload
the server. This makes the `map`, `goto/path` and the modified `teleport` and
`open` commands available in-game.
2. Edit `mygame/server/conf/settings.py` and add
3. Edit `mygame/server/conf/settings.py` and add
EXTRA_LAUNCHER_COMMANDS['xyzgrid'] = 'evennia.contrib.launchcmd.xyzcommand'
@ -55,8 +64,8 @@ Exits: northeast and east
This will add the new ability to enter `evennia xyzgrid <option>` on the
command line. It will also make the `xyz_room` and `xyz_exit` prototypes
available for use as prototype-parents when spawning the grid.
3. Run `evennia xyzgrid help` for available options.
4. (Optional): By default, the xyzgrid will only spawn module-based
4. Run `evennia xyzgrid help` for available options.
5. (Optional): By default, the xyzgrid will only spawn module-based
[prototypes](../Components/Prototypes). This is an optimization and usually makes sense
since the grid is entirely defined outside the game anyway. If you want to
also make use of in-game (db-) created prototypes, add

View file

@ -501,6 +501,9 @@ you can run `evennia -l`, or (in the future) start the server with `evennia star
- Under some not-updated Linux distributions you may run into errors with a
too-old `setuptools` or missing `functools`. If so, update your environment
with `pip install --upgrade pip wheel setuptools`. Then try `pip install -e evennia` again.
- If you get an `setup.py not found` error message while trying to `pip install`, make sure you are
in the right directory. You should be at the same level of the `evenv` directory, and the
`evennia` git repository. Note that there is an `evennia` directory inside of the repository too.
- One user reported a rare issue on Ubuntu 16 is an install error on installing Twisted; `Command
"python setup.py egg_info" failed with error code 1 in /tmp/pip-build-vnIFTg/twisted/` with errors
like `distutils.errors.DistutilsError: Could not find suitable distribution for
@ -549,3 +552,6 @@ path to the `twistd` executable. This file is auto-generated, so try to delete i
text editor like Notepad. It's just one line containing the path to the `twistd.exe` executable as
determined by Evennia. If you installed Twisted in a non-standard location this might be wrong and
you should update the line to the real location.
- Some users have reported issues with Windows WSL and anti-virus software during Evennia
development. Timeout errors and the inability to run `evennia connections` may be due to your anti-
virus software interfering. Try disabling or changing your anti-virus software settings.

View file

@ -110,7 +110,11 @@
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.talking_npc.html">evennia.contrib.talking_npc</a></li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.test_traits.html">evennia.contrib.test_traits</a></li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html">evennia.contrib.traits</a><ul>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a></li>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a><ul>
<li class="toctree-l5"><a class="reference internal" href="evennia.contrib.traits.html#traits-with-traithandler">Traits with TraitHandler</a></li>
<li class="toctree-l5"><a class="reference internal" href="evennia.contrib.traits.html#traitproperties">TraitProperties</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#using-traits">Using traits</a></li>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#trait-types">Trait types</a></li>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#static-trait">Static trait</a><ul>

View file

@ -71,7 +71,7 @@ method. Otherwise all text will be returned to all connected sessions.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.account.CmdOOCLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -102,7 +102,7 @@ method. Otherwise all text will be returned to all connected sessions.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.account.CmdOOCLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -1276,7 +1276,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['type', 'update', 'swap', 'parent', 'typeclasses']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['swap', 'typeclasses', 'parent', 'update', 'type']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1307,7 +1307,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'type update swap parent typeclasses', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'swap typeclasses parent update type', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1460,7 +1460,7 @@ If object is not specified, the current location is examined.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['ex', 'exam']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['exam', 'ex']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1557,7 +1557,7 @@ non-persistent data stored on object</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ex exam', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'exam ex', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1818,7 +1818,7 @@ given, &lt;nr&gt; defaults to 10.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdObjects.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['listobjects', 'listobjs', 'stats', 'db']</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['listobjects', 'stats', 'listobjs', 'db']</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1844,7 +1844,7 @@ given, &lt;nr&gt; defaults to 10.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdObjects.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'listobjects listobjs stats db', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [&lt;nr&gt;]\n\n Gives statictics on objects in database as well as\n a list of &lt;nr&gt; latest objects in database. If not\n given, &lt;nr&gt; defaults to 10.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'listobjects stats listobjs db', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [&lt;nr&gt;]\n\n Gives statictics on objects in database as well as\n a list of &lt;nr&gt; latest objects in database. If not\n given, &lt;nr&gt; defaults to 10.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdObjects.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -113,7 +113,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -144,7 +144,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look &lt;obj&gt;\n look *&lt;account&gt;\n\n Observes your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look &lt;obj&gt;\n look *&lt;account&gt;\n\n Observes your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -558,7 +558,7 @@ See <a href="#id11"><span class="problematic" id="id12">|</span></a>luhttps://ww
<dl class="py attribute">
<dt id="evennia.commands.default.system.CmdTasks.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['task', 'delays']</em><a class="headerlink" href="#evennia.commands.default.system.CmdTasks.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['delays', 'task']</em><a class="headerlink" href="#evennia.commands.default.system.CmdTasks.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -604,7 +604,7 @@ to all the variables defined therein.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.system.CmdTasks.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'task delays', 'category': 'system', 'key': 'tasks', 'tags': '', 'text': &quot;\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.system.CmdTasks.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'delays task', 'category': 'system', 'key': 'tasks', 'tags': '', 'text': &quot;\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.system.CmdTasks.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -119,7 +119,7 @@ create “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedCreate.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['cre', 'cr']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['cr', 'cre']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -150,7 +150,7 @@ create “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedCreate.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create &lt;accountname&gt; &lt;password&gt;\n create &quot;account name&quot; &quot;pass word&quot;\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create &lt;accountname&gt; &lt;password&gt;\n create &quot;account name&quot; &quot;pass word&quot;\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -224,7 +224,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['look', 'l']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'look']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -250,7 +250,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -78,7 +78,7 @@ at them with this command.</p>
<dl class="py attribute">
<dt id="evennia.contrib.chargen.CmdOOCLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -110,7 +110,7 @@ that is checked by the &#64;ic command directly.</p>
<dl class="py attribute">
<dt id="evennia.contrib.chargen.CmdOOCLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look &lt;character&gt;\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n &quot;self&quot;.\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look &lt;character&gt;\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n &quot;self&quot;.\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -127,7 +127,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedCreate.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['cre', 'cr']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['cr', 'cre']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -163,7 +163,7 @@ name enclosed in quotes:</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedCreate.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create &quot;accountname&quot; &lt;email&gt; &lt;password&gt;\n\n This creates a new account account.\n\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create &quot;accountname&quot; &lt;email&gt; &lt;password&gt;\n\n This creates a new account account.\n\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedCreate.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -227,7 +227,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['look', 'l']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'look']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -253,7 +253,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -148,7 +148,7 @@ the operation will be general or on the room.</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdGiveUp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['abort', 'q', 'chicken out', 'quit']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGiveUp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['chicken out', 'q', 'quit', 'abort']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGiveUp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -172,7 +172,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdGiveUp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'abort q chicken out quit', 'category': 'evscaperoom', 'key': 'give up', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGiveUp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'chicken out q quit abort', 'category': 'evscaperoom', 'key': 'give up', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGiveUp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -193,7 +193,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -227,7 +227,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -308,7 +308,7 @@ shout</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdSpeak.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['shout', ';', 'whisper']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdSpeak.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['shout', 'whisper', ';']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdSpeak.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -337,7 +337,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdSpeak.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shout ; whisper', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say &lt;text&gt;\n whisper\n shout\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdSpeak.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say &lt;text&gt;\n whisper\n shout\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdSpeak.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -427,7 +427,7 @@ looks and what actions is available.</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdFocus.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['examine', 'e', 'unfocus', 'ex']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdFocus.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ex', 'examine', 'e', 'unfocus']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdFocus.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -456,7 +456,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdFocus.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'examine e unfocus ex', 'category': 'evscaperoom', 'key': 'focus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus &lt;obj&gt;\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdFocus.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ex examine e unfocus', 'category': 'evscaperoom', 'key': 'focus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus &lt;obj&gt;\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdFocus.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -518,7 +518,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdGet.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inventory', 'inv', 'give', 'i']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGet.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['give', 'inv', 'inventory', 'i']</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGet.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -542,7 +542,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.evscaperoom.commands.CmdGet.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inventory inv give i', 'category': 'evscaperoom', 'key': 'get', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGet.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'give inv inventory i', 'category': 'evscaperoom', 'key': 'get', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}</em><a class="headerlink" href="#evennia.contrib.evscaperoom.commands.CmdGet.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -277,7 +277,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.contrib.extended_room.CmdExtendedRoomLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -297,7 +297,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.contrib.extended_room.CmdExtendedRoomLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -70,7 +70,11 @@ useful but are deemed too game-specific to go into the core library.</p>
<li class="toctree-l1"><a class="reference internal" href="evennia.contrib.talking_npc.html">evennia.contrib.talking_npc</a></li>
<li class="toctree-l1"><a class="reference internal" href="evennia.contrib.test_traits.html">evennia.contrib.test_traits</a></li>
<li class="toctree-l1"><a class="reference internal" href="evennia.contrib.traits.html">evennia.contrib.traits</a><ul>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.traits.html#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a></li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.traits.html#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a><ul>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#traits-with-traithandler">Traits with TraitHandler</a></li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#traitproperties">TraitProperties</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.traits.html#using-traits">Using traits</a></li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.traits.html#trait-types">Trait types</a></li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.traits.html#static-trait">Static trait</a><ul>

View file

@ -53,7 +53,7 @@
<dl class="py attribute">
<dt id="evennia.contrib.ingame_python.commands.CmdCallback.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;calls', '&#64;callbacks', '&#64;callback']</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;callback', '&#64;calls', '&#64;callbacks']</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -134,7 +134,7 @@ on user permission.</p>
<dl class="py attribute">
<dt id="evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;calls &#64;callbacks &#64;callback', 'category': 'building', 'key': '&#64;call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;callback &#64;calls &#64;callbacks', 'category': 'building', 'key': '&#64;call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -317,7 +317,7 @@ same input sentence.</p>
<dd class="field-odd"><ul class="simple">
<li><p><strong>text</strong> (<em>str</em>) Text to obfuscate.</p></li>
<li><p><strong>level</strong> (<em>real</em><em>, </em><em>optional</em>) A value from 0.0-1.0 determining
the level of obfuscation where 0 means no jobfuscation
the level of obfuscation where 0 means no obfuscation
(string returned unchanged) and 1.0 means the entire
string is obfuscated.</p></li>
<li><p><strong>language</strong> (<em>str</em><em>, </em><em>optional</em>) The identifier of a language

View file

@ -68,7 +68,7 @@ represent you in the emote. You can use /sdesc, /nick, /key or
/alias to reference objects in the room. You can use any
number of sdesc sub-parts to differentiate a local sdesc, or
use /1-sdesc etc to differentiate them. The emote also
identifies nested says.</p>
identifies nested says and separates case.</p>
</dd>
</dl>
</li>
@ -113,13 +113,17 @@ The tavern is full of nice people</p>
an example of a static <em>pose</em>: The “standing by the bar” has been set
by the player of the tall man, so that people looking at him can tell
at a glance what is going on.</p>
<p>&gt; emote /me looks at /tall and says “Hello!”</p>
<p>&gt; emote /me looks at /Tall and says “Hello!”</p>
<dl class="simple">
<dt>I see:</dt><dd><p>Griatch looks at Tall man and says “Hello”.</p>
</dd>
<dt>Tall man (assuming his name is Tom) sees:</dt><dd><p>The godlike figure looks at Tom and says “Hello”.</p>
</dd>
</dl>
<p>Note that by default, the case of the tag matters, so <strong>/tall</strong> will
lead to tall man while <strong>/Tall</strong> will become Tall man and /TALL
becomes /TALL MAN. If you dont want this behavior, you can pass
case_sensitive=False to the <strong>send_emote</strong> function.</p>
<p>Verbose Installation Instructions:</p>
<blockquote>
<div><ol class="arabic">
@ -154,9 +158,9 @@ Import the <strong>ContribRPCharacter</strong> class:</p>
</dd>
</dl>
</li>
<li><p>Reload the server (&#64;reload or from console: “evennia reload”)</p></li>
<li><p>Reload the server (<strong>reload</strong> or from console: “evennia reload”)</p></li>
<li><dl class="simple">
<dt>Force typeclass updates as required. Example for your character:</dt><dd><p>&#64;type/reset/force me = typeclasses.characters.Character</p>
<dt>Force typeclass updates as required. Example for your character:</dt><dd><p><strong>type/reset/force me = typeclasses.characters.Character</strong></p>
</dd>
</dl>
</li>
@ -285,7 +289,7 @@ information is actually conveyed.</p>
<dl class="py function">
<dt id="evennia.contrib.rpsystem.parse_sdescs_and_recogs">
<code class="sig-prename descclassname">evennia.contrib.rpsystem.</code><code class="sig-name descname">parse_sdescs_and_recogs</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sender</span></em>, <em class="sig-param"><span class="n">candidates</span></em>, <em class="sig-param"><span class="n">string</span></em>, <em class="sig-param"><span class="n">search_mode</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/rpsystem.html#parse_sdescs_and_recogs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.rpsystem.parse_sdescs_and_recogs" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.contrib.rpsystem.</code><code class="sig-name descname">parse_sdescs_and_recogs</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sender</span></em>, <em class="sig-param"><span class="n">candidates</span></em>, <em class="sig-param"><span class="n">string</span></em>, <em class="sig-param"><span class="n">search_mode</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">case_sensitive</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/rpsystem.html#parse_sdescs_and_recogs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.rpsystem.parse_sdescs_and_recogs" title="Permalink to this definition"></a></dt>
<dd><p>Read a raw emote and parse it into an intermediary
format for distributing to all observers.</p>
<dl class="field-list simple">
@ -303,6 +307,13 @@ search_mode (bool, optional): If <strong>True</strong>, the “emote” is a que
<blockquote>
<div><p>we want to analyze. If so, the return value is changed.</p>
</div></blockquote>
<dl class="simple">
<dt>case_sensitive (bool, optional); If set, the case of /refs matter, so that</dt><dd><p>/tall will come out as tall man while /Tall will become Tall man.
This allows for more grammatically correct emotes at the cost of being
a little more to learn for players. If disabled, the original sdesc case
is always kept and are inserted as-is.</p>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p><p><em>(emote, mapping) (tuple)</em> </p>
@ -352,6 +363,18 @@ self-referencing in the emote, this will auto-add
</ul>
</dd>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><dl class="simple">
<dt>case_sensitive (bool): Defaults to True, but can be unset</dt><dd><p>here. When enabled, /tall will lead to a lowercase
tall man while /Tall will lead to Tall man and
/TALL will lead to TALL MAN. If disabled, the sdescs
case will always be used, regardless of the /ref case used.</p>
</dd>
<dt>any: Other kwargs will be passed on into the receivers process_sdesc and</dt><dd><p>process_recog methods, and can thus be used to customize those.</p>
</dd>
</dl>
</dd>
</dl>
</dd></dl>
<dl class="py class">
@ -802,7 +825,7 @@ Using the command without arguments will list all current recogs.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpsystem.CmdRecog.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['forget', 'recognize']</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdRecog.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['recognize', 'forget']</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdRecog.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -829,7 +852,7 @@ Using the command without arguments will list all current recogs.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpsystem.CmdRecog.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdRecog.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdRecog.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1165,8 +1188,23 @@ you are viewing yourself (and sdesc is your key).
This is not used by default.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>sdesc (str)</em> </p>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><dl class="simple">
<dt>ref (str): The reference marker found in string to replace.</dt><dd><p>This is on the form #{num}{case}, like #12^, where
the number is a processing location in the string and the
case symbol indicates the case of the original tag input
- <strong>t</strong> - input was Titled, like /Tall
- <strong>^</strong> - input was all uppercase, like /TALL
- <strong>v</strong> - input was all lowercase, like /tall
- <strong>~</strong> - input case should be kept, or was mixed-case</p>
</dd>
</dl>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p><p><em>sdesc (str)</em> </p>
<dl class="simple">
<dt>The processed sdesc ready</dt><dd><p>for display.</p>
</dd>
@ -1189,8 +1227,14 @@ translated from the original sdesc at this point.</p></li>
This is not used by default.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>recog (str)</em> The modified recog string.</p>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><p>ref (str): See process_sdesc.</p>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p><em>recog (str)</em> The modified recog string.</p>
</dd>
</dl>
</dd></dl>

View file

@ -438,6 +438,102 @@
</dd></dl>
<dl class="py class">
<dt id="evennia.contrib.test_traits.DummyCharacter">
<em class="property">class </em><code class="sig-prename descclassname">evennia.contrib.test_traits.</code><code class="sig-name descname">DummyCharacter</code><a class="reference internal" href="../_modules/evennia/contrib/test_traits.html#DummyCharacter"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.test_traits.DummyCharacter" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.contrib.test_traits._MockObj</span></code></p>
<dl class="py attribute">
<dt id="evennia.contrib.test_traits.DummyCharacter.strength">
<code class="sig-name descname">strength</code><a class="headerlink" href="#evennia.contrib.test_traits.DummyCharacter.strength" title="Permalink to this definition"></a></dt>
<dd><p>Allows for applying traits as individual properties directly on the parent class
instead for properties on the <strong>.traits</strong> handler. So with this you could access data e.g. as
<strong>character.hp.value</strong> instead of <strong>character.traits.hp.value</strong>. This still uses the traitshandler
under the hood.</p>
<p>Example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.traits</span> <span class="kn">import</span> <span class="n">TraitProperty</span>
<span class="k">class</span> <span class="nc">Character</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">):</span>
<span class="n">strength</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">hunting</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">health</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;health&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional extra</p>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt id="evennia.contrib.test_traits.DummyCharacter.hunting">
<code class="sig-name descname">hunting</code><a class="headerlink" href="#evennia.contrib.test_traits.DummyCharacter.hunting" title="Permalink to this definition"></a></dt>
<dd><p>Allows for applying traits as individual properties directly on the parent class
instead for properties on the <strong>.traits</strong> handler. So with this you could access data e.g. as
<strong>character.hp.value</strong> instead of <strong>character.traits.hp.value</strong>. This still uses the traitshandler
under the hood.</p>
<p>Example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.traits</span> <span class="kn">import</span> <span class="n">TraitProperty</span>
<span class="k">class</span> <span class="nc">Character</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">):</span>
<span class="n">strength</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">hunting</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">health</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;health&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional extra</p>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt id="evennia.contrib.test_traits.DummyCharacter.health">
<code class="sig-name descname">health</code><a class="headerlink" href="#evennia.contrib.test_traits.DummyCharacter.health" title="Permalink to this definition"></a></dt>
<dd><p>Allows for applying traits as individual properties directly on the parent class
instead for properties on the <strong>.traits</strong> handler. So with this you could access data e.g. as
<strong>character.hp.value</strong> instead of <strong>character.traits.hp.value</strong>. This still uses the traitshandler
under the hood.</p>
<p>Example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.traits</span> <span class="kn">import</span> <span class="n">TraitProperty</span>
<span class="k">class</span> <span class="nc">Character</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">):</span>
<span class="n">strength</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">hunting</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">health</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;health&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional extra</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt id="evennia.contrib.test_traits.TestTraitFields">
<em class="property">class </em><code class="sig-prename descclassname">evennia.contrib.test_traits.</code><code class="sig-name descname">TestTraitFields</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">methodName</span><span class="o">=</span><span class="default_value">'runTest'</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/test_traits.html#TestTraitFields"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.test_traits.TestTraitFields" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">django.test.testcases.TestCase</span></code></p>
<p>Test the TraitField class.</p>
<dl class="py method">
<dt id="evennia.contrib.test_traits.TestTraitFields.test_traitfields">
<code class="sig-name descname">test_traitfields</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/test_traits.html#TestTraitFields.test_traitfields"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.test_traits.TestTraitFields.test_traitfields" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
</section>

View file

@ -50,64 +50,118 @@ be used to represent everything from attributes (str, agi etc) to skills
a server reload/reboot).</p>
<section id="adding-traits-to-a-typeclass">
<h2>Adding Traits to a typeclass<a class="headerlink" href="#adding-traits-to-a-typeclass" title="Permalink to this headline"></a></h2>
<p>To access and manipulate traits on an entity, its Typeclass needs to have a
<strong>TraitHandler</strong> assigned it. Usually, the handler is made available as <strong>.traits</strong>
(in the same way as <strong>.tags</strong> or <strong>.attributes</strong>). Its recommended to do this
using Evennias <strong>lazy_property</strong> (which basically just means its not
initialized until its actually accessed).</p>
<p>Heres an example for adding the TraitHandler to the base Object class:</p>
<p>There are two ways to set up Traits on a typeclass. The first sets up the <strong>TraitHandler</strong>
as a property <strong>.traits</strong> on your class and you then access traits as e.g. <strong>.traits.strength</strong>.
The other alternative uses a <strong>TraitProperty</strong>, which makes the trait available directly
as e.g. <strong>.strength</strong>. This solution also uses the <strong>TraitHandler</strong>, but you dont need to
define it explicitly. You can combine both styles if you like.</p>
<section id="traits-with-traithandler">
<h3>Traits with TraitHandler<a class="headerlink" href="#traits-with-traithandler" title="Permalink to this headline"></a></h3>
<p>Heres an example for adding the TraitHandler to the Character class:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># mygame/typeclasses/objects.py</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultObject</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultCharacter</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.traits</span> <span class="kn">import</span> <span class="n">TraitHandler</span>
<span class="c1"># ...</span>
<span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">Character</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">):</span>
<span class="o">...</span>
<span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">traits</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># this adds the handler as .traits</span>
<span class="k">return</span> <span class="n">TraitHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="using-traits">
<h2>Using traits<a class="headerlink" href="#using-traits" title="Permalink to this headline"></a></h2>
<p>A trait is added to the traithandler, after which one can access it
as a property on the handler (similarly to how you can do .db.attrname for Attributes
in Evennia).</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># this is an example using the &quot;static&quot; trait, described below</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">4</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span> <span class="o">+=</span> <span class="mi">5</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">9</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hp&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">100</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span> <span class="o">-=</span> <span class="mi">200</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">0</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">100</span>
<span class="c1"># you can also access property with getitem</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="p">[</span><span class="s2">&quot;value&quot;</span><span class="p">]</span>
<span class="mi">100</span>
<span class="c1"># you can store arbitrary data persistently as well</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">effect</span> <span class="o">=</span> <span class="s2">&quot;poisoned!&quot;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">effect</span>
<span class="s2">&quot;poisoned!&quot;</span>
<span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># (or wherever you want)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hp&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
<p>When adding the trait, you supply the name of the property (<strong>hunting</strong>) along
with a more human-friendly name (“Hunting Skill”). The latter will show if you
print the trait etc. The <strong>trait_type</strong> is important, this specifies which type
of trait this is.</p>
of trait this is (see below).</p>
</section>
<section id="traitproperties">
<h3>TraitProperties<a class="headerlink" href="#traitproperties" title="Permalink to this headline"></a></h3>
<p>Using <strong>TraitProperties</strong> makes the trait available directly on the class, much like Django model
fields. The drawback is that you must make sure that the name of your Traits dont collide with any
other properties/methods on your class.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># mygame/typeclasses/objects.py</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultObject</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.traits</span> <span class="kn">import</span> <span class="n">TraitProperty</span>
<span class="c1"># ...</span>
<span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="o">...</span>
<span class="n">strength</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">health</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">hunting</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
<p>&gt; Note that the property-name will become the name of the trait and you dont supply <strong>trait_key</strong>
&gt; separately.</p>
<p>&gt; The <strong>.traits</strong> TraitHandler will still be created (its used under the
&gt; hood. But it will only be created when the TraitProperty has been accessed at least once,
&gt; so be careful if mixing the two styles. If you want to make sure <strong>.traits</strong> is always available,
&gt; add the <strong>TraitHandler</strong> manually like shown earlier - the <strong>TraitProperty</strong> will by default use
&gt; the same handler (<strong>.traits</strong>).</p>
</section>
</section>
<section id="using-traits">
<h2>Using traits<a class="headerlink" href="#using-traits" title="Permalink to this headline"></a></h2>
<p>A trait is added to the traithandler (if you use <strong>TraitProperty</strong> the handler is just created under
the hood) after which one can access it as a property on the handler (similarly to how you can do
.db.attrname for Attributes in Evennia).</p>
<p>All traits have a _read-<a href="#id7"><span class="problematic" id="id8">only_</span></a> field <strong>.value</strong>. This is only used to read out results, you never
manipulate it directly (if you try, it will just remain unchanged). The <strong>.value</strong> is calculated based
on combining fields, like <strong>.base</strong> and <strong>.mod</strong> - which fields are available and how they relate to
each other depends on the trait type.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span>
<span class="mi">12</span> <span class="c1"># base + mod</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">base</span> <span class="o">+=</span> <span class="mi">5</span>
<span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span>
<span class="mi">17</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">102</span> <span class="c1"># base + mod</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">base</span> <span class="o">-=</span> <span class="mi">200</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">0</span> <span class="c1"># min of 0</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">100</span>
<span class="c1"># you can also access properties like a dict</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="p">[</span><span class="s2">&quot;value&quot;</span><span class="p">]</span>
<span class="mi">100</span>
<span class="c1"># you can store arbitrary data persistently for easy reference</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">effect</span> <span class="o">=</span> <span class="s2">&quot;poisoned!&quot;</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">effect</span>
<span class="s2">&quot;poisoned!&quot;</span>
<span class="c1"># with TraitProperties:</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">12</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span> <span class="o">+=</span> <span class="mi">5</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">strength</span><span class="o">.</span><span class="n">value</span>
<span class="mi">17</span>
</pre></div>
</div>
</section>
<section id="trait-types">
<h2>Trait types<a class="headerlink" href="#trait-types" title="Permalink to this headline"></a></h2>
@ -115,13 +169,15 @@ of trait this is.</p>
current value of the trait. Exactly what this means depends on the type of trait.</p>
<p>Traits can also be combined to do arithmetic with their .value, if both have a
compatible type.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">trait1</span> <span class="o">+</span> <span class="n">trait2</span>
<span class="go">54</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">trait1</span><span class="o">.</span><span class="n">value</span>
<span class="go">3</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">trait1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">trait1</span><span class="o">.</span><span class="n">value</span>
<span class="go">5</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">trait1</span> <span class="o">+</span> <span class="n">trait2</span>
<span class="mi">54</span>
<span class="o">&gt;</span> <span class="n">trait1</span><span class="o">.</span><span class="n">value</span>
<span class="mi">3</span>
<span class="o">&gt;</span> <span class="n">trait1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="o">&gt;</span> <span class="n">trait1</span><span class="o">.</span><span class="n">value</span>
<span class="mi">5</span>
</pre></div>
</div>
<p>Two numerical traits can also be compared (bigger-than etc), which is useful in
@ -137,25 +193,27 @@ all sorts of rule-resolution.</p>
<p>The static trait has a <strong>base</strong> value and an optional <strong>mod</strong>-ifier. A typical use
of a static trait would be a Strength stat or Skill value. That is, something
that varies slowly or not at all, and which may be modified in-place.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="go">12 # base + mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">base</span> <span class="o">+=</span> <span class="mi">2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">mod</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="go">15</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">mod</span> <span class="o">=</span> <span class="mi">0</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="go">12</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="mi">12</span> <span class="c1"># base + mod</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">base</span> <span class="o">+=</span> <span class="mi">2</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">mod</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="mi">15</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">mod</span> <span class="o">=</span> <span class="mi">0</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="mi">12</span>
</pre></div>
</div>
<section id="counter">
<h3>Counter<a class="headerlink" href="#counter" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">min</span><span class="o">/</span><span class="n">unset</span> <span class="n">base</span> <span class="n">base</span><span class="o">+</span><span class="n">mod</span> <span class="nb">max</span><span class="o">/</span><span class="n">unset</span>
<span class="o">|--------------|--------|---------</span><span class="n">X</span><span class="o">--------</span><span class="n">X</span><span class="o">------------|</span>
<span class="n">current</span> <span class="n">value</span>
<span class="o">=</span> <span class="n">current</span>
<span class="o">+</span> <span class="n">mod</span>
<span class="n">current</span> <span class="n">value</span>
<span class="o">=</span> <span class="n">current</span>
<span class="o">+</span> <span class="n">mod</span>
</pre></div>
</div>
<p>A counter describes a value that can move from a base. The <strong>.current</strong> property
@ -163,18 +221,23 @@ is the thing usually modified. It starts at the <strong>.base</strong>. One can
modifier, which will both be added to the base and to current (forming
<strong>.value</strong>). The min/max of the range are optional, a boundary set to None will
remove it. A suggested use for a Counter Trait would be to track skill values.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="go"> base=10, mod=1, min=0, max=100)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">11 # current starts at base + mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">21</span>
<span class="go"># reset back to base+mod by deleting current</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">del</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">11</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># removing upper bound</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">11</span> <span class="c1"># current starts at base + mod</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">21</span>
<span class="c1"># reset back to base+mod by deleting current</span>
<span class="o">&gt;</span> <span class="k">del</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">11</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># removing upper bound</span>
<span class="c1"># for TraitProperties, pass the args/kwargs of traits.add() to the</span>
<span class="c1"># TraitProperty constructor instead.</span>
</pre></div>
</div>
<p>Counters have some extra properties:</p>
@ -188,19 +251,20 @@ interval. Here is an example for skill values between 0 and 10:</p>
</div>
<p>The keys must be supplied from smallest to largest. Any values below the lowest and above the
highest description will be considered to be included in the closest description slot.
By calling <strong>.desc()</strong> on the Counter, will you get the text matching the current <strong>value</strong>
value.</p>
By calling <strong>.desc()</strong> on the Counter, you will get the text matching the current <strong>value</strong>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># (could also have passed descs= to traits.add())</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">descs</span> <span class="o">=</span> <span class="p">{</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">descs</span> <span class="o">=</span> <span class="p">{</span>
<span class="mi">0</span><span class="p">:</span> <span class="s2">&quot;unskilled&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">:</span> <span class="s2">&quot;neophyte&quot;</span><span class="p">,</span> <span class="mi">50</span><span class="p">:</span> <span class="s2">&quot;trained&quot;</span><span class="p">,</span> <span class="mi">70</span><span class="p">:</span> <span class="s2">&quot;expert&quot;</span><span class="p">,</span> <span class="mi">90</span><span class="p">:</span> <span class="s2">&quot;master&quot;</span><span class="p">}</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">11</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">desc</span><span class="p">()</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">desc</span><span class="p">()</span>
<span class="s2">&quot;neophyte&quot;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span> <span class="o">+=</span> <span class="mi">60</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span> <span class="o">+=</span> <span class="mi">60</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">71</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">desc</span><span class="p">()</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">desc</span><span class="p">()</span>
<span class="s2">&quot;expert&quot;</span>
</pre></div>
</div>
@ -216,39 +280,46 @@ if those are set.</p>
<p>It is also possible to set a <strong>.ratetarget</strong>, for the auto-change to stop at
(rather than at the min/max boundaries). This allows the value to return to
a previous value.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">71</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">ratetarget</span> <span class="o">=</span> <span class="mi">71</span>
<span class="go"># debuff hunting for some reason</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span> <span class="o">-=</span> <span class="mi">30</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">41</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># 1/s increase</span>
<span class="go"># Waiting 5s</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">46</span>
<span class="go"># Waiting 8s</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">54</span>
<span class="go"># Waiting 100s</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="go">71 # we have stopped at the ratetarget</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># disable auto-change</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">71</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">ratetarget</span> <span class="o">=</span> <span class="mi">71</span>
<span class="c1"># debuff hunting for some reason</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">current</span> <span class="o">-=</span> <span class="mi">30</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">41</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># 1/s increase</span>
<span class="c1"># Waiting 5s</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">46</span>
<span class="c1"># Waiting 8s</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">54</span>
<span class="c1"># Waiting 100s</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">value</span>
<span class="mi">71</span> <span class="c1"># we have stopped at the ratetarget</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># disable auto-change</span>
</pre></div>
</div>
<p>Note that if <strong>.rate</strong> is a non-integer, the resulting <strong>.value</strong> (at least until it
reaches a boundary or rate-target) will also come out a float (so you can get a
very exact value at the current time). If you expect an integer, you must run
<strong>int()</strong> (or something like <strong>round()</strong>) on the result yourself.</p>
<p>Note that when retrieving the <strong>current</strong>, the result will always be of the same
type as the <strong>.base</strong> even <strong>rate</strong> is a non-integer value. So if <strong>base</strong> is an <strong>int</strong>
(default)**, the <strong>current</strong> value will also be rounded the closest full integer.
If you want to see the exact <strong>current</strong> value, set <strong>base</strong> to a float - you
will then need to use <strong>round()</strong> yourself on the result if you want integers.</p>
</section>
<section id="percent">
<h4>.percent()<a class="headerlink" href="#percent" title="Permalink to this headline"></a></h4>
<p>If both min and max are defined, the <strong>.percent()</strong> method of the trait will
return the value as a percentage.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">percent</span><span class="p">()</span>
<span class="go">&quot;71.0%&quot;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">percent</span><span class="p">(</span><span class="n">formatting</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="go">71.0</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">percent</span><span class="p">()</span>
<span class="s2">&quot;71.0%&quot;</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hunting</span><span class="o">.</span><span class="n">percent</span><span class="p">(</span><span class="n">formatting</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="mf">71.0</span>
</pre></div>
</div>
</section>
@ -268,15 +339,17 @@ read-only and is set by <strong>.base</strong> + <strong>.mod</strong>. So contr
value. The minimum bound defaults to 0 if not set explicitly.</p>
<p>This trait is useful for showing commonly depletable resources like health,
stamina and the like.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hp&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span> <span class="c1"># (or .current)</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">mod</span> <span class="o">=</span> <span class="mi">10</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="go">110</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">current</span> <span class="o">-=</span> <span class="mi">30</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="go">80</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;hp&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span> <span class="c1"># (or .current)</span>
<span class="mi">100</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">mod</span> <span class="o">=</span> <span class="mi">10</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">110</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">current</span> <span class="o">-=</span> <span class="mi">30</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">80</span>
</pre></div>
</div>
<p>The Gauge trait is subclass of the Counter, so you have access to the same
@ -291,16 +364,18 @@ from poison slowly draining your health, to resting gradually increasing it.</p>
<p>A single value of any type.</p>
<p>This is the base Trait, meant to inherit from if you want to invent
trait-types from scratch (most of the time youll probably inherit from some of
the more advanced trait-type classes though). A <strong>Trait**s **.value</strong> can be
anything (that can be stored in an Attribute) and if its a integer/float you
can do arithmetic with it, but otherwise it acts just like a glorified
Attribute.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;mytrait&quot;</span><span class="p">,</span> <span class="s2">&quot;My Trait&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;trait&quot;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="go">30</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="s2">&quot;stringvalue&quot;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="go">&quot;stringvalue&quot;</span>
the more advanced trait-type classes though).</p>
<p>Unlike other Trait-types, the single <strong>.value</strong> property of the base <strong>Trait</strong> can
be editied. The value can hold any data that can be stored in an Attribute. If
its an integer/float you can do arithmetic with it, but otherwise this acts just
like a glorified Attribute.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;mytrait&quot;</span><span class="p">,</span> <span class="s2">&quot;My Trait&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;trait&quot;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="mi">30</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="s2">&quot;stringvalue&quot;</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mytrait</span><span class="o">.</span><span class="n">value</span>
<span class="s2">&quot;stringvalue&quot;</span>
</pre></div>
</div>
</section>
@ -337,9 +412,14 @@ default (0). Above we also added some helper methods.</p>
</pre></div>
</div>
<p>Reload the server and you should now be able to use your trait:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;mood&quot;</span><span class="p">,</span> <span class="s2">&quot;A dark mood&quot;</span><span class="p">,</span> <span class="n">rage</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s1">&#39;rage&#39;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mood</span><span class="o">.</span><span class="n">rage</span>
<span class="go">30</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;mood&quot;</span><span class="p">,</span> <span class="s2">&quot;A dark mood&quot;</span><span class="p">,</span> <span class="n">rage</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s1">&#39;rage&#39;</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">obj</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">mood</span><span class="o">.</span><span class="n">rage</span>
<span class="mi">30</span>
<span class="c1"># as TraitProperty</span>
<span class="k">class</span> <span class="nc">Character</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">):</span>
<span class="n">rage</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;A dark mood&quot;</span><span class="p">,</span> <span class="n">rage</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s1">&#39;rage&#39;</span><span class="p">)</span>
</pre></div>
</div>
<hr class="docutils" />
@ -374,7 +454,17 @@ by Trait classes when defining their required keys.</p>
<dt id="evennia.contrib.traits.TraitHandler">
<em class="property">class </em><code class="sig-prename descclassname">evennia.contrib.traits.</code><code class="sig-name descname">TraitHandler</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">obj</span></em>, <em class="sig-param"><span class="n">db_attribute_key</span><span class="o">=</span><span class="default_value">'traits'</span></em>, <em class="sig-param"><span class="n">db_attribute_category</span><span class="o">=</span><span class="default_value">'traits'</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/traits.html#TraitHandler"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.traits.TraitHandler" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Factory class that instantiates Trait objects.</p>
<p>Factory class that instantiates Trait objects. Must be assigned as a property
on the class, usually with <strong>lazy_property</strong>.</p>
<p>Example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="o">...</span>
<span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">traits</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># this adds the handler as .traits</span>
<span class="k">return</span> <span class="n">TraitHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</div>
<dl class="py method">
<dt id="evennia.contrib.traits.TraitHandler.__init__">
<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">obj</span></em>, <em class="sig-param"><span class="n">db_attribute_key</span><span class="o">=</span><span class="default_value">'traits'</span></em>, <em class="sig-param"><span class="n">db_attribute_category</span><span class="o">=</span><span class="default_value">'traits'</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/traits.html#TraitHandler.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.traits.TraitHandler.__init__" title="Permalink to this definition"></a></dt>
@ -383,7 +473,8 @@ by Trait classes when defining their required keys.</p>
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>obj</strong> (<em>Object</em>) Parent Object typeclass for this TraitHandler</p></li>
<li><p><strong>db_attribute_key</strong> (<em>str</em>) Name of the DB attribute for trait data storage</p></li>
<li><p><strong>db_attribute_key</strong> (<em>str</em>) Name of the DB attribute for trait data storage.</p></li>
<li><p><strong>db_attribute_category</strong> (<em>str</em>) Name of DB attributes category to trait data storage.</p></li>
</ul>
</dd>
</dl>
@ -426,7 +517,7 @@ available on this handler (example hp).</p></li>
<li><p><strong>name</strong> (<em>str</em><em>, </em><em>optional</em>) Name of the Trait, like “Health”. If
not given, will use <strong>trait_key</strong> starting with a capital letter.</p></li>
<li><p><strong>trait_type</strong> (<em>str</em><em>, </em><em>optional</em>) One of static, counter or gauge.</p></li>
<li><p><strong>force_add</strong> (<em>bool</em>) If set, create a new Trait even if a Trait with
<li><p><strong>force</strong> (<em>bool</em>) If set, create a new Trait even if a Trait with
the same <strong>trait_key</strong> already exists.</p></li>
<li><p><strong>trait_properties</strong> (<em>dict</em>) These will all be use to initialize
the new trait. See the <strong>properties</strong> class variable on each
@ -460,6 +551,54 @@ already exists (and <strong>force</strong> is unset).</p>
</dd></dl>
<dl class="py class">
<dt id="evennia.contrib.traits.TraitProperty">
<em class="property">class </em><code class="sig-prename descclassname">evennia.contrib.traits.</code><code class="sig-name descname">TraitProperty</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">name</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">trait_type</span><span class="o">=</span><span class="default_value">'static'</span></em>, <em class="sig-param"><span class="n">force</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">trait_properties</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/traits.html#TraitProperty"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.traits.TraitProperty" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Optional extra: Allows for applying traits as individual properties directly on the parent class
instead for properties on the <strong>.traits</strong> handler. So with this you could access data e.g. as
<strong>character.hp.value</strong> instead of <strong>character.traits.hp.value</strong>. This still uses the traitshandler
under the hood.</p>
<p>Example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">lazy_property</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.traits</span> <span class="kn">import</span> <span class="n">TraitProperty</span>
<span class="k">class</span> <span class="nc">Character</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">):</span>
<span class="n">strength</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;str&quot;</span><span class="p">,</span> <span class="s2">&quot;Strength&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">hunting</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;hunting&quot;</span><span class="p">,</span> <span class="s2">&quot;Hunting Skill&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;counter&quot;</span><span class="p">,</span>
<span class="n">base</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">health</span> <span class="o">=</span> <span class="n">TraitProperty</span><span class="p">(</span><span class="s2">&quot;health&quot;</span><span class="p">,</span> <span class="s2">&quot;Health&quot;</span><span class="p">,</span> <span class="n">trait_type</span><span class="o">=</span><span class="s2">&quot;gauge&quot;</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
<dl class="py method">
<dt id="evennia.contrib.traits.TraitProperty.__init__">
<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">name</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">trait_type</span><span class="o">=</span><span class="default_value">'static'</span></em>, <em class="sig-param"><span class="n">force</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">trait_properties</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/traits.html#TraitProperty.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.traits.TraitProperty.__init__" title="Permalink to this definition"></a></dt>
<dd><p>Initialize a TraitField. Mimics TraitHandler.add input except no <strong>trait_key</strong>.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>name</strong> (<em>str</em><em>, </em><em>optional</em>) Name of the Trait, like “Health”. If
not given, will use <strong>trait_key</strong> starting with a capital letter.</p></li>
<li><p><strong>trait_type</strong> (<em>str</em><em>, </em><em>optional</em>) One of static, counter or gauge.</p></li>
<li><p><strong>force</strong> (<em>bool</em>) If set, create a new Trait even if a Trait with
the same <strong>trait_key</strong> already exists.</p></li>
</ul>
</dd>
</dl>
<dl class="simple">
<dt>Kwargs:</dt><dd><dl class="simple">
<dt>traithandler_name (str): If given, this is used as the name of the TraitHandler created</dt><dd><p>behind the scenes. If not set, this will be a property <strong>traits</strong> on the class.</p>
</dd>
<dt>any: All other trait_properties are the same as for adding a new trait of the given type</dt><dd><p>using the normal TraitHandler.</p>
</dd>
</dl>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt id="evennia.contrib.traits.Trait">
<em class="property">class </em><code class="sig-prename descclassname">evennia.contrib.traits.</code><code class="sig-name descname">Trait</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">trait_data</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/traits.html#Trait"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.traits.Trait" title="Permalink to this definition"></a></dt>
@ -557,7 +696,7 @@ initialization of this trait.</p>
<em class="property">class </em><code class="sig-prename descclassname">evennia.contrib.traits.</code><code class="sig-name descname">StaticTrait</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">trait_data</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/traits.html#StaticTrait"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.traits.StaticTrait" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#evennia.contrib.traits.Trait" title="evennia.contrib.traits.Trait"><code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.contrib.traits.Trait</span></code></a></p>
<p>Static Trait. This is a single value with a modifier,
with no concept of a current value.</p>
with no concept of a current value or min/max etc.</p>
<p>value = base + mod</p>
<dl class="py attribute">
<dt id="evennia.contrib.traits.StaticTrait.trait_type">
@ -569,6 +708,11 @@ with no concept of a current value.</p>
<code class="sig-name descname">default_keys</code><em class="property"> = {'base': 0, 'mod': 0}</em><a class="headerlink" href="#evennia.contrib.traits.StaticTrait.default_keys" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.contrib.traits.StaticTrait.base">
<em class="property">property </em><code class="sig-name descname">base</code><a class="headerlink" href="#evennia.contrib.traits.StaticTrait.base" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.contrib.traits.StaticTrait.mod">
<em class="property">property </em><code class="sig-name descname">mod</code><a class="headerlink" href="#evennia.contrib.traits.StaticTrait.mod" title="Permalink to this definition"></a></dt>
@ -868,7 +1012,11 @@ returned.</p>
<p><h3><a href="../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">evennia.contrib.traits</a><ul>
<li><a class="reference internal" href="#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a></li>
<li><a class="reference internal" href="#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a><ul>
<li><a class="reference internal" href="#traits-with-traithandler">Traits with TraitHandler</a></li>
<li><a class="reference internal" href="#traitproperties">TraitProperties</a></li>
</ul>
</li>
<li><a class="reference internal" href="#using-traits">Using traits</a></li>
<li><a class="reference internal" href="#trait-types">Trait types</a></li>
<li><a class="reference internal" href="#static-trait">Static trait</a><ul>

View file

@ -80,7 +80,7 @@ such as when closing the lid and un-blinding a character.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['press', 'press button', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['press', 'push', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -109,7 +109,7 @@ check if the lid is open or closed.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press press button push', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidClosed.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -179,7 +179,7 @@ check if the lid is open or closed.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['break lid', 'smash', 'smash lid']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['smash lid', 'break lid', 'smash']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -206,7 +206,7 @@ break.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'break lid smash smash lid', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdSmashGlass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -306,7 +306,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['press', 'press button', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['press', 'push', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -335,7 +335,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press press button push', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdPushLidOpen.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -433,7 +433,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdBlindLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['examine', 'feel', 'l', 'ex', 'listen', 'get']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['listen', 'feel', 'l', 'get', 'examine', 'ex']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -459,7 +459,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.red_button.CmdBlindLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'examine feel l ex listen get', 'category': 'general', 'key': 'look', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'listen feel l get examine ex', 'category': 'general', 'key': 'look', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -493,7 +493,7 @@ shift green root up/down</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['move', 'push', 'shiftroot', 'pull']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['move', 'shiftroot', 'push', 'pull']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -529,7 +529,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'move push shiftroot pull', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'move shiftroot push pull', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -546,7 +546,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdPressButton.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push button', 'press button', 'button']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['button', 'push button', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -572,7 +572,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -716,7 +716,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdAttack.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['pierce', 'kill', 'slash', 'chop', 'stab', 'bash', 'hit', 'parry', 'fight', 'defend', 'thrust']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['pierce', 'slash', 'hit', 'parry', 'fight', 'defend', 'stab', 'kill', 'thrust', 'chop', 'bash']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -742,7 +742,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'pierce kill slash chop stab bash hit parry fight defend thrust', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'pierce slash hit parry fight defend stab kill thrust chop bash', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -185,7 +185,7 @@ code except for adding in the details.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdTutorialLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -200,7 +200,7 @@ code except for adding in the details.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdTutorialLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at &quot;details&quot; in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at &quot;details&quot; in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -866,7 +866,7 @@ to find something.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['feel', 'l', 'feel around', 'fiddle', 'search']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['feel', 'l', 'fiddle', 'feel around', 'search']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -894,7 +894,7 @@ random chance of eventually finding a light source.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'feel l feel around fiddle search', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'feel l fiddle feel around search', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -206,7 +206,11 @@ with q, remove the break line and restart server when finished.</p></li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.talking_npc.html">evennia.contrib.talking_npc</a></li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.test_traits.html">evennia.contrib.test_traits</a></li>
<li class="toctree-l2"><a class="reference internal" href="evennia.contrib.traits.html">evennia.contrib.traits</a><ul>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a></li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#adding-traits-to-a-typeclass">Adding Traits to a typeclass</a><ul>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#traits-with-traithandler">Traits with TraitHandler</a></li>
<li class="toctree-l4"><a class="reference internal" href="evennia.contrib.traits.html#traitproperties">TraitProperties</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#using-traits">Using traits</a></li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#trait-types">Trait types</a></li>
<li class="toctree-l3"><a class="reference internal" href="evennia.contrib.traits.html#static-trait">Static trait</a><ul>

View file

@ -57,17 +57,17 @@ to the Portal, through which the Server is also controlled. This pprogram</p>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgStatus.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgStatus.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgStatus.response">
<code class="sig-name descname">response</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgStatus.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -99,17 +99,17 @@ to the Portal, through which the Server is also controlled. This pprogram</p>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgLauncher2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgLauncher2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.evennia_launcher.MsgLauncher2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.evennia_launcher.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -101,17 +101,17 @@ we break up too-long data snippets into multiple batches here.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgLauncher2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'operation', &lt;twisted.protocols.amp.String object&gt;), (b'arguments', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgLauncher2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgLauncher2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgLauncher2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -143,17 +143,17 @@ we break up too-long data snippets into multiple batches here.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgPortal2Server.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgPortal2Server.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgPortal2Server.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgPortal2Server.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -185,17 +185,17 @@ we break up too-long data snippets into multiple batches here.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgServer2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgServer2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgServer2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.MsgServer2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -229,17 +229,17 @@ server, such as when a new session connects or resyncs</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminPortal2Server.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminPortal2Server.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminPortal2Server.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminPortal2Server.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -273,17 +273,17 @@ portal.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminServer2Portal.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'packed_data', &lt;evennia.server.portal.amp.Compressed object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminServer2Portal.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.AdminServer2Portal.response">
<code class="sig-name descname">response</code><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = []</em><a class="headerlink" href="#evennia.server.portal.amp.AdminServer2Portal.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -315,17 +315,17 @@ portal.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgStatus.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgStatus.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.MsgStatus.response">
<code class="sig-name descname">response</code><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'status', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.MsgStatus.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -359,17 +359,17 @@ the other. This does not use the batch-send functionality.</p>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.FunctionCall.arguments">
<code class="sig-name descname">arguments</code><em class="property"> = [(b'module', &lt;twisted.protocols.amp.String object&gt;), (b'function', &lt;twisted.protocols.amp.String object&gt;), (b'args', &lt;twisted.protocols.amp.String object&gt;), (b'kwargs', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.arguments" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">arguments</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'module', &lt;twisted.protocols.amp.String object&gt;), (b'function', &lt;twisted.protocols.amp.String object&gt;), (b'args', &lt;twisted.protocols.amp.String object&gt;), (b'kwargs', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.arguments" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.FunctionCall.errors">
<code class="sig-name descname">errors</code><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.errors" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">errors</code><em class="property">: Dict<span class="p">[</span>Type<span class="p">[</span>Exception<span class="p">]</span><span class="p">, </span>bytes<span class="p">]</span></em><em class="property"> = {&lt;class 'Exception'&gt;: b'EXCEPTION'}</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.errors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.server.portal.amp.FunctionCall.response">
<code class="sig-name descname">response</code><em class="property"> = [(b'result', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.response" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">response</code><em class="property">: List<span class="p">[</span>Tuple<span class="p">[</span>bytes<span class="p">, </span>twisted.protocols.amp.Argument<span class="p">]</span><span class="p">]</span></em><em class="property"> = [(b'result', &lt;twisted.protocols.amp.String object&gt;)]</em><a class="headerlink" href="#evennia.server.portal.amp.FunctionCall.response" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -94,7 +94,7 @@ as sends text to it when prompted</p>
<dl class="py attribute">
<dt id="evennia.server.portal.irc.IRCBot.factory">
<code class="sig-name descname">factory</code><em class="property"> = None</em><a class="headerlink" href="#evennia.server.portal.irc.IRCBot.factory" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">factory</code><em class="property">: Optional<span class="p">[</span>twisted.internet.protocol.Factory<span class="p">]</span></em><em class="property"> = None</em><a class="headerlink" href="#evennia.server.portal.irc.IRCBot.factory" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -275,7 +275,7 @@ indentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [':!', ':h', ':q', ':dd', ':dw', ':f', ':w', ':wq', ':&gt;', ':q!', ':y', ':p', ':s', ':fd', ':', ':::', ':x', ':uu', ':UU', ':i', ':echo', ':r', ':j', ':A', ':&lt;', ':=', ':u', ':S', '::', ':fi', ':DD', ':I']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = [':i', ':S', ':fi', ':y', ':dd', ':dw', ':A', ':q!', ':p', ':I', ':', ':j', ':wq', ':!', ':x', ':&lt;', ':::', ':q', ':h', ':u', ':UU', ':r', ':DD', ':f', '::', ':echo', ':w', ':&gt;', ':fd', ':uu', ':=', ':s']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -303,7 +303,7 @@ efficient presentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ':! :h :q :dd :dw :f :w :wq :&gt; :q! :y :p :s :fd : ::: :x :uu :UU :i :echo :r :j :A :&lt; := :u :S :: :fi :DD :I', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ':i :S :fi :y :dd :dw :A :q! :p :I : :j :wq :! :x :&lt; ::: :q :h :u :UU :r :DD :f :: :echo :w :&gt; :fd :uu := :s', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -941,7 +941,7 @@ single question.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmenu.CmdYesNoQuestion.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['no', 'abort', '__nomatch_command', 'n', 'yes', 'y', 'a']</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['n', 'y', 'a', '__nomatch_command', 'no', 'yes', 'abort']</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -967,7 +967,7 @@ single question.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'no abort __nomatch_command n yes y a', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'n y a __nomatch_command no yes abort', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -76,7 +76,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['abort', 'next', 'n', 'e', 'top', 'end', 'back', 'quit', 't', 'a', 'q', 'b']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['n', 'a', 'quit', 'b', 'e', 'next', 't', 'top', 'q', 'back', 'abort', 'end']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -102,7 +102,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'abort next n e top end back quit t a q b', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'n a quit b e next t top q back abort end', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -494,7 +494,7 @@ This keyword has no meaning if <strong>width</strong> is set.</p></li>
</dl>
<p class="rubric">Notes</p>
<p>Beyond those table-specific keywords, the non-overlapping keywords
of <strong>EcCell.__init__</strong> are also available. These will be passed down
of <strong>EvCell.__init__</strong> are also available. These will be passed down
to every cell in the table.</p>
</dd></dl>
@ -527,7 +527,7 @@ to the end.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>args</strong> (<strong>EvColum</strong> or multiple strings) Either a single EvColumn instance or
<li><p><strong>args</strong> (<strong>EvColumn</strong> or multiple strings) Either a single EvColumn instance or
a number of data string arguments to be used to create a new column.</p></li>
<li><p><strong>header</strong> (<em>str</em><em>, </em><em>optional</em>) The header text for the column</p></li>
<li><p><strong>xpos</strong> (<em>int</em><em>, </em><em>optional</em>) Index position in table <em>before</em> which

View file

@ -125,7 +125,7 @@ server.log.2020_01_29__2</p>
<p>Reformat logging</p>
<dl class="py attribute">
<dt id="evennia.utils.logger.PortalLogObserver.timeFormat">
<code class="sig-name descname">timeFormat</code><em class="property"> = None</em><a class="headerlink" href="#evennia.utils.logger.PortalLogObserver.timeFormat" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">timeFormat</code><em class="property">: Optional<span class="p">[</span>str<span class="p">]</span></em><em class="property"> = None</em><a class="headerlink" href="#evennia.utils.logger.PortalLogObserver.timeFormat" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -119,6 +119,8 @@
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.TraitException.__init__">(evennia.contrib.traits.TraitException method)</a>
</li>
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.TraitHandler.__init__">(evennia.contrib.traits.TraitHandler method)</a>
</li>
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.TraitProperty.__init__">(evennia.contrib.traits.TraitProperty method)</a>
</li>
<li><a href="api/evennia.contrib.unixcommand.html#evennia.contrib.unixcommand.UnixCommand.__init__">(evennia.contrib.unixcommand.UnixCommand method)</a>
</li>
@ -2337,6 +2339,8 @@
<ul>
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.GaugeTrait.base">(evennia.contrib.traits.GaugeTrait property)</a>
</li>
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.StaticTrait.base">(evennia.contrib.traits.StaticTrait property)</a>
</li>
</ul></li>
<li><a href="api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.AccountChangeForm.base_fields">base_fields (evennia.web.admin.accounts.AccountChangeForm attribute)</a>
@ -4798,6 +4802,8 @@
<li><a href="api/evennia.contrib.evscaperoom.objects.html#evennia.contrib.evscaperoom.objects.Drinkable.DoesNotExist">Drinkable.DoesNotExist</a>
</li>
<li><a href="api/evennia.contrib.evscaperoom.objects.html#evennia.contrib.evscaperoom.objects.Drinkable.MultipleObjectsReturned">Drinkable.MultipleObjectsReturned</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.DummyCharacter">DummyCharacter (class in evennia.contrib.test_traits)</a>
</li>
<li><a href="api/evennia.server.profiling.dummyrunner.html#evennia.server.profiling.dummyrunner.DummyClient">DummyClient (class in evennia.server.profiling.dummyrunner)</a>
</li>
@ -8581,6 +8587,8 @@
<li><a href="api/evennia.comms.models.html#evennia.comms.models.Msg.header">header() (evennia.comms.models.Msg property)</a>
</li>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.header_color">header_color (evennia.commands.default.building.CmdExamine attribute)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.DummyCharacter.health">health (evennia.contrib.test_traits.DummyCharacter attribute)</a>
</li>
<li><a href="api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.hello">hello() (in module evennia.server.inputfuncs)</a>
</li>
@ -9193,6 +9201,8 @@
<li><a href="api/evennia.utils.utils.html#evennia.utils.utils.host_os_is">host_os_is() (in module evennia.utils.utils)</a>
</li>
<li><a href="api/evennia.server.webserver.html#evennia.server.webserver.HTTPChannelWithXForwardedFor">HTTPChannelWithXForwardedFor (class in evennia.server.webserver)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.DummyCharacter.hunting">hunting (evennia.contrib.test_traits.DummyCharacter attribute)</a>
</li>
</ul></td>
</tr></table>
@ -16052,6 +16062,8 @@
<li><a href="api/evennia.scripts.scripts.html#evennia.scripts.scripts.Store.DoesNotExist">Store.DoesNotExist</a>
</li>
<li><a href="api/evennia.scripts.scripts.html#evennia.scripts.scripts.Store.MultipleObjectsReturned">Store.MultipleObjectsReturned</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.DummyCharacter.strength">strength (evennia.contrib.test_traits.DummyCharacter attribute)</a>
</li>
<li><a href="api/evennia.utils.utils.html#evennia.utils.utils.string_from_module">string_from_module() (in module evennia.utils.utils)</a>
</li>
@ -17606,6 +17618,8 @@
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TraitHandlerTest.test_trait_db_connection">test_trait_db_connection() (evennia.contrib.test_traits.TraitHandlerTest method)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTrait.test_trait_getset">test_trait_getset() (evennia.contrib.test_traits.TestTrait method)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitFields.test_traitfields">test_traitfields() (evennia.contrib.test_traits.TestTraitFields method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_tunnel">test_tunnel() (evennia.commands.default.tests.TestBuilding method)</a>
</li>
@ -17988,6 +18002,8 @@
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitCounter">TestTraitCounter (class in evennia.contrib.test_traits)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitCounterTimed">TestTraitCounterTimed (class in evennia.contrib.test_traits)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitFields">TestTraitFields (class in evennia.contrib.test_traits)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TestTraitGauge">TestTraitGauge (class in evennia.contrib.test_traits)</a>
</li>
@ -18138,6 +18154,8 @@
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.TraitHandler">TraitHandler (class in evennia.contrib.traits)</a>
</li>
<li><a href="api/evennia.contrib.test_traits.html#evennia.contrib.test_traits.TraitHandlerTest">TraitHandlerTest (class in evennia.contrib.test_traits)</a>
</li>
<li><a href="api/evennia.contrib.traits.html#evennia.contrib.traits.TraitProperty">TraitProperty (class in evennia.contrib.traits)</a>
</li>
<li><a href="api/evennia.contrib.xyzgrid.xymap_legend.html#evennia.contrib.xyzgrid.xymap_legend.TransitionMapNode">TransitionMapNode (class in evennia.contrib.xyzgrid.xymap_legend)</a>
</li>

Binary file not shown.

File diff suppressed because one or more lines are too long