evennia/docs/1.0-dev/_modules/evennia/contrib/custom_gametime.html
2020-10-15 01:31:30 +02:00

402 lines
No EOL
35 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.custom_gametime &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.custom_gametime</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.custom_gametime</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Custom gametime</span>
<span class="sd">Contrib - Griatch 2017, vlgeoff 2017</span>
<span class="sd">This implements the evennia.utils.gametime module but supporting</span>
<span class="sd">a custom calendar for your game world. It allows for scheduling</span>
<span class="sd">events to happen at given in-game times, taking this custom</span>
<span class="sd">calendar into account.</span>
<span class="sd">Usage:</span>
<span class="sd">Use as the normal gametime module, that is by importing and using the</span>
<span class="sd">helper functions in this module in your own code. The calendar can be</span>
<span class="sd">customized by adding the `TIME_UNITS` dictionary to your settings</span>
<span class="sd">file. This maps unit names to their length, expressed in the smallest</span>
<span class="sd">unit. Here&#39;s the default as an example:</span>
<span class="sd"> TIME_UNITS = {</span>
<span class="sd"> &quot;sec&quot;: 1,</span>
<span class="sd"> &quot;min&quot;: 60,</span>
<span class="sd"> &quot;hr&quot;: 60 * 60,</span>
<span class="sd"> &quot;hour&quot;: 60 * 60,</span>
<span class="sd"> &quot;day&quot;: 60 * 60 * 24,</span>
<span class="sd"> &quot;week&quot;: 60 * 60 * 24 * 7,</span>
<span class="sd"> &quot;month&quot;: 60 * 60 * 24 * 7 * 4,</span>
<span class="sd"> &quot;yr&quot;: 60 * 60 * 24 * 7 * 4 * 12,</span>
<span class="sd"> &quot;year&quot;: 60 * 60 * 24 * 7 * 4 * 12, }</span>
<span class="sd">When using a custom calendar, these time unit names are used as kwargs to</span>
<span class="sd">the converter functions in this module.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="c1"># change these to fit your game world</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">DefaultScript</span>
<span class="kn">from</span> <span class="nn">evennia.utils.create</span> <span class="k">import</span> <span class="n">create_script</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">gametime</span>
<span class="c1"># The game time speedup / slowdown relative real time</span>
<span class="n">TIMEFACTOR</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">TIME_FACTOR</span>
<span class="c1"># These are the unit names understood by the scheduler.</span>
<span class="c1"># Each unit must be consistent and expressed in seconds.</span>
<span class="n">UNITS</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span>
<span class="n">settings</span><span class="p">,</span>
<span class="s2">&quot;TIME_UNITS&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="c1"># default custom calendar</span>
<span class="s2">&quot;sec&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s2">&quot;min&quot;</span><span class="p">:</span> <span class="mi">60</span><span class="p">,</span>
<span class="s2">&quot;hr&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">,</span>
<span class="s2">&quot;hour&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">,</span>
<span class="s2">&quot;day&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span><span class="p">,</span>
<span class="s2">&quot;week&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span><span class="p">,</span>
<span class="s2">&quot;month&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span> <span class="o">*</span> <span class="mi">4</span><span class="p">,</span>
<span class="s2">&quot;yr&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">*</span> <span class="mi">12</span><span class="p">,</span>
<span class="s2">&quot;year&quot;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">*</span> <span class="mi">12</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">)</span>
<div class="viewcode-block" id="time_to_tuple"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.time_to_tuple">[docs]</a><span class="k">def</span> <span class="nf">time_to_tuple</span><span class="p">(</span><span class="n">seconds</span><span class="p">,</span> <span class="o">*</span><span class="n">divisors</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function. Creates a tuple of even dividends given a range</span>
<span class="sd"> of divisors.</span>
<span class="sd"> Args:</span>
<span class="sd"> seconds (int): Number of seconds to format</span>
<span class="sd"> *divisors (int): a sequence of numbers of integer dividends. The</span>
<span class="sd"> number of seconds will be integer-divided by the first number in</span>
<span class="sd"> this sequence, the remainder will be divided with the second and</span>
<span class="sd"> so on.</span>
<span class="sd"> Returns:</span>
<span class="sd"> time (tuple): This tuple has length len(*args)+1, with the</span>
<span class="sd"> last element being the last remaining seconds not evenly</span>
<span class="sd"> divided by the supplied dividends.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">seconds</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
<span class="k">for</span> <span class="n">divisor</span> <span class="ow">in</span> <span class="n">divisors</span><span class="p">:</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">seconds</span> <span class="o">//</span> <span class="n">divisor</span><span class="p">)</span>
<span class="n">seconds</span> <span class="o">%=</span> <span class="n">divisor</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">results</span><span class="p">)</span></div>
<div class="viewcode-block" id="gametime_to_realtime"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.gametime_to_realtime">[docs]</a><span class="k">def</span> <span class="nf">gametime_to_realtime</span><span class="p">(</span><span class="nb">format</span><span class="o">=</span><span class="kc">False</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>
<span class="sd"> This method helps to figure out the real-world time it will take until an</span>
<span class="sd"> in-game time has passed. E.g. if an event should take place a month later</span>
<span class="sd"> in-game, you will be able to find the number of real-world seconds this</span>
<span class="sd"> corresponds to (hint: Interval events deal with real life seconds).</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> format (bool): Formatting the output.</span>
<span class="sd"> days, month etc (int): These are the names of time units that must</span>
<span class="sd"> match the `settings.TIME_UNITS` dict keys.</span>
<span class="sd"> Returns:</span>
<span class="sd"> time (float or tuple): The realtime difference or the same</span>
<span class="sd"> time split up into time units.</span>
<span class="sd"> Example:</span>
<span class="sd"> gametime_to_realtime(days=2) -&gt; number of seconds in real life from</span>
<span class="sd"> now after which 2 in-game days will have passed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Dynamically creates the list of units based on kwarg names and UNITs list</span>
<span class="n">rtime</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># Allow plural names (like mins instead of min)</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">UNITS</span> <span class="ow">and</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;s&quot;</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">UNITS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;the unit </span><span class="si">{}</span><span class="s2"> isn&#39;t defined as a valid &quot;</span> <span class="s2">&quot;game time unit&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="n">rtime</span> <span class="o">+=</span> <span class="n">value</span> <span class="o">*</span> <span class="n">UNITS</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="n">rtime</span> <span class="o">/=</span> <span class="n">TIMEFACTOR</span>
<span class="k">if</span> <span class="nb">format</span><span class="p">:</span>
<span class="k">return</span> <span class="n">time_to_tuple</span><span class="p">(</span><span class="n">rtime</span><span class="p">,</span> <span class="mi">31536000</span><span class="p">,</span> <span class="mi">2628000</span><span class="p">,</span> <span class="mi">604800</span><span class="p">,</span> <span class="mi">86400</span><span class="p">,</span> <span class="mi">3600</span><span class="p">,</span> <span class="mi">60</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rtime</span></div>
<div class="viewcode-block" id="realtime_to_gametime"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.realtime_to_gametime">[docs]</a><span class="k">def</span> <span class="nf">realtime_to_gametime</span><span class="p">(</span><span class="n">secs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">mins</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">hrs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">days</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">weeks</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">months</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">yrs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This method calculates how much in-game time a real-world time</span>
<span class="sd"> interval would correspond to. This is usually a lot less</span>
<span class="sd"> interesting than the other way around.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> times (int): The various components of the time.</span>
<span class="sd"> format (bool): Formatting the output.</span>
<span class="sd"> Returns:</span>
<span class="sd"> time (float or tuple): The gametime difference or the same</span>
<span class="sd"> time split up into time units.</span>
<span class="sd"> Example:</span>
<span class="sd"> realtime_to_gametime(days=2) -&gt; number of game-world seconds</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">gtime</span> <span class="o">=</span> <span class="n">TIMEFACTOR</span> <span class="o">*</span> <span class="p">(</span>
<span class="n">secs</span>
<span class="o">+</span> <span class="n">mins</span> <span class="o">*</span> <span class="mi">60</span>
<span class="o">+</span> <span class="n">hrs</span> <span class="o">*</span> <span class="mi">3600</span>
<span class="o">+</span> <span class="n">days</span> <span class="o">*</span> <span class="mi">86400</span>
<span class="o">+</span> <span class="n">weeks</span> <span class="o">*</span> <span class="mi">604800</span>
<span class="o">+</span> <span class="n">months</span> <span class="o">*</span> <span class="mi">2628000</span>
<span class="o">+</span> <span class="n">yrs</span> <span class="o">*</span> <span class="mi">31536000</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">format</span><span class="p">:</span>
<span class="n">units</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">UNITS</span><span class="o">.</span><span class="n">values</span><span class="p">()),</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># Remove seconds from the tuple</span>
<span class="k">del</span> <span class="n">units</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">return</span> <span class="n">time_to_tuple</span><span class="p">(</span><span class="n">gtime</span><span class="p">,</span> <span class="o">*</span><span class="n">units</span><span class="p">)</span>
<span class="k">return</span> <span class="n">gtime</span></div>
<div class="viewcode-block" id="custom_gametime"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.custom_gametime">[docs]</a><span class="k">def</span> <span class="nf">custom_gametime</span><span class="p">(</span><span class="n">absolute</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the custom game time as a tuple of units, as defined in settings.</span>
<span class="sd"> Args:</span>
<span class="sd"> absolute (bool, optional): return the relative or absolute time.</span>
<span class="sd"> Returns:</span>
<span class="sd"> The tuple describing the game time. The length of the tuple</span>
<span class="sd"> is related to the number of unique units defined in the</span>
<span class="sd"> settings. By default, the tuple would be (year, month,</span>
<span class="sd"> week, day, hour, minute, second).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">gametime</span><span class="o">.</span><span class="n">gametime</span><span class="p">(</span><span class="n">absolute</span><span class="o">=</span><span class="n">absolute</span><span class="p">)</span>
<span class="n">units</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">UNITS</span><span class="o">.</span><span class="n">values</span><span class="p">()),</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">del</span> <span class="n">units</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">return</span> <span class="n">time_to_tuple</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="o">*</span><span class="n">units</span><span class="p">)</span></div>
<div class="viewcode-block" id="real_seconds_until"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.real_seconds_until">[docs]</a><span class="k">def</span> <span class="nf">real_seconds_until</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>
<span class="sd"> Return the real seconds until game time.</span>
<span class="sd"> If the game time is 5:00, TIME_FACTOR is set to 2 and you ask</span>
<span class="sd"> the number of seconds until it&#39;s 5:10, then this function should</span>
<span class="sd"> return 300 (5 minutes).</span>
<span class="sd"> Args:</span>
<span class="sd"> times (str: int): the time units.</span>
<span class="sd"> Example:</span>
<span class="sd"> real_seconds_until(hour=5, min=10, sec=0)</span>
<span class="sd"> Returns:</span>
<span class="sd"> The number of real seconds before the given game time is up.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">gametime</span><span class="o">.</span><span class="n">gametime</span><span class="p">(</span><span class="n">absolute</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">units</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">UNITS</span><span class="o">.</span><span class="n">values</span><span class="p">()),</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># Remove seconds from the tuple</span>
<span class="k">del</span> <span class="n">units</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">divisors</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">time_to_tuple</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="o">*</span><span class="n">units</span><span class="p">))</span>
<span class="c1"># For each keyword, add in the unit&#39;s</span>
<span class="n">units</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">higher_unit</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">unit</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># Get the unit&#39;s index</span>
<span class="k">if</span> <span class="n">unit</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">UNITS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;unknown unit&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">unit</span><span class="p">))</span>
<span class="n">seconds</span> <span class="o">=</span> <span class="n">UNITS</span><span class="p">[</span><span class="n">unit</span><span class="p">]</span>
<span class="n">index</span> <span class="o">=</span> <span class="n">units</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
<span class="n">divisors</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">if</span> <span class="n">higher_unit</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">higher_unit</span> <span class="o">&gt;</span> <span class="n">index</span><span class="p">:</span>
<span class="n">higher_unit</span> <span class="o">=</span> <span class="n">index</span>
<span class="c1"># Check the projected time</span>
<span class="c1"># Note that it can be already passed (the given time may be in the past)</span>
<span class="n">projected</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">divisors</span><span class="p">):</span>
<span class="n">seconds</span> <span class="o">=</span> <span class="n">units</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">projected</span> <span class="o">+=</span> <span class="n">value</span> <span class="o">*</span> <span class="n">seconds</span>
<span class="k">if</span> <span class="n">projected</span> <span class="o">&lt;=</span> <span class="n">current</span><span class="p">:</span>
<span class="c1"># The time is in the past, increase the higher unit</span>
<span class="k">if</span> <span class="n">higher_unit</span><span class="p">:</span>
<span class="n">divisors</span><span class="p">[</span><span class="n">higher_unit</span> <span class="o">-</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">divisors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># Get the projected time again</span>
<span class="n">projected</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">divisors</span><span class="p">):</span>
<span class="n">seconds</span> <span class="o">=</span> <span class="n">units</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">projected</span> <span class="o">+=</span> <span class="n">value</span> <span class="o">*</span> <span class="n">seconds</span>
<span class="k">return</span> <span class="p">(</span><span class="n">projected</span> <span class="o">-</span> <span class="n">current</span><span class="p">)</span> <span class="o">/</span> <span class="n">TIMEFACTOR</span></div>
<div class="viewcode-block" id="schedule"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.schedule">[docs]</a><span class="k">def</span> <span class="nf">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="kc">False</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>
<span class="sd"> Call the callback when the game time is up.</span>
<span class="sd"> Args:</span>
<span class="sd"> callback (function): The callback function that will be called. This</span>
<span class="sd"> must be a top-level function since the script will be persistent.</span>
<span class="sd"> repeat (bool, optional): Should the callback be called regularly?</span>
<span class="sd"> day, month, etc (str: int): The time units to call the callback; should</span>
<span class="sd"> match the keys of TIME_UNITS.</span>
<span class="sd"> Returns:</span>
<span class="sd"> script (Script): The created script.</span>
<span class="sd"> Examples:</span>
<span class="sd"> schedule(func, min=5, sec=0) # Will call next hour at :05.</span>
<span class="sd"> schedule(func, hour=2, min=30, sec=0) # Will call the next day at 02:30.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This function will setup a script that will be called when the</span>
<span class="sd"> time corresponds to the game time. If the game is stopped for</span>
<span class="sd"> more than a few seconds, the callback may be called with a</span>
<span class="sd"> slight delay. If `repeat` is set to True, the callback will be</span>
<span class="sd"> called again next time the game time matches the given time.</span>
<span class="sd"> The time is given in units as keyword arguments.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">seconds</span> <span class="o">=</span> <span class="n">real_seconds_until</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">script</span> <span class="o">=</span> <span class="n">create_script</span><span class="p">(</span>
<span class="s2">&quot;evennia.contrib.custom_gametime.GametimeScript&quot;</span><span class="p">,</span>
<span class="n">key</span><span class="o">=</span><span class="s2">&quot;GametimeScript&quot;</span><span class="p">,</span>
<span class="n">desc</span><span class="o">=</span><span class="s2">&quot;A timegame-sensitive script&quot;</span><span class="p">,</span>
<span class="n">interval</span><span class="o">=</span><span class="n">seconds</span><span class="p">,</span>
<span class="n">start_delay</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">repeats</span><span class="o">=-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">repeat</span> <span class="k">else</span> <span class="mi">1</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">script</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">callback</span> <span class="o">=</span> <span class="n">callback</span>
<span class="n">script</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">gametime</span> <span class="o">=</span> <span class="n">kwargs</span>
<span class="k">return</span> <span class="n">script</span></div>
<span class="c1"># Scripts dealing in gametime (use `schedule` to create it)</span>
<div class="viewcode-block" id="GametimeScript"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.GametimeScript">[docs]</a><span class="k">class</span> <span class="nc">GametimeScript</span><span class="p">(</span><span class="n">DefaultScript</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Gametime-sensitive script.&quot;&quot;&quot;</span>
<div class="viewcode-block" id="GametimeScript.at_script_creation"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.GametimeScript.at_script_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_script_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The script is created.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;unknown scr&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interval</span> <span class="o">=</span> <span class="mi">100</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_delay</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">persistent</span> <span class="o">=</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="GametimeScript.at_repeat"><a class="viewcode-back" href="../../../api/evennia.contrib.custom_gametime.html#evennia.contrib.custom_gametime.GametimeScript.at_repeat">[docs]</a> <span class="k">def</span> <span class="nf">at_repeat</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Call the callback and reset interval.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">calledby</span>
<span class="n">callback</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">callback</span>
<span class="k">if</span> <span class="n">callback</span><span class="p">:</span>
<span class="n">callback</span><span class="p">()</span>
<span class="n">seconds</span> <span class="o">=</span> <span class="n">real_seconds_until</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">gametime</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">restart</span><span class="p">(</span><span class="n">interval</span><span class="o">=</span><span class="n">seconds</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="custom_gametime.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.5/index.html">0.9.5 (master branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.custom_gametime</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>