evennia/docs/2.x/Contribs/Contrib-Dice.html

280 lines
18 KiB
HTML
Raw Normal View History

2023-10-19 20:22:27 +00:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>Dice roller &#8212; Evennia 2.x 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" />
<link rel="next" title="Health Bar" href="Contrib-Health-Bar.html" />
<link rel="prev" title="Character Creator" href="Contrib-Character-Creator.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="right" >
<a href="Contrib-Health-Bar.html" title="Health Bar"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="Contrib-Character-Creator.html" title="Character Creator"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="Contribs-Overview.html" accesskey="U">Contribs</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">Dice roller</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<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><a href="../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Dice roller</a><ul>
<li><a class="reference internal" href="#installation">Installation:</a></li>
<li><a class="reference internal" href="#usage">Usage:</a></li>
<li><a class="reference internal" href="#rolling-dice-from-code">Rolling dice from code</a><ul>
<li><a class="reference internal" href="#dice-pools-and-other-variations">Dice pools and other variations</a></li>
<li><a class="reference internal" href="#get-all-roll-details">Get all roll details</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="Contrib-Character-Creator.html"
title="previous chapter">Character Creator</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="Contrib-Health-Bar.html"
title="next chapter">Health Bar</a></p>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../_sources/Contribs/Contrib-Dice.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
<h3>Doc Versions</h3>
<ul>
<li><a href="Contrib-Dice.html">2.x (main branch)</a></li>
<ul>
<li><a href="../1.3.0/index.html">1.3.0 (v1.3.0 branch)</a></li>
<li><a href="../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<section class="tex2jax_ignore mathjax_ignore" id="dice-roller">
<h1>Dice roller<a class="headerlink" href="#dice-roller" title="Permalink to this headline"></a></h1>
<p>Contribution by Griatch, 2012, 2023</p>
<p>A dice roller for any number and side of dice. Adds in-game dice rolling
(like <code class="docutils literal notranslate"><span class="pre">roll</span> <span class="pre">2d10</span> <span class="pre">+</span> <span class="pre">1</span></code>) as well as conditionals (roll under/over/equal to a target)
and functions for rolling dice in code. Command also supports hidden or secret
rolls for use by a human game master.</p>
<section id="installation">
<h2>Installation:<a class="headerlink" href="#installation" title="Permalink to this headline"></a></h2>
<p>Add the <code class="docutils literal notranslate"><span class="pre">CmdDice</span></code> command from this module to your characters cmdset
(and then restart the server):</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in mygame/commands/default_cmdsets.py</span>
<span class="c1"># ...</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.rpg</span> <span class="kn">import</span> <span class="n">dice</span> <span class="o">&lt;---</span>
<span class="k">class</span> <span class="nc">CharacterCmdSet</span><span class="p">(</span><span class="n">default_cmds</span><span class="o">.</span><span class="n">CharacterCmdSet</span><span class="p">):</span>
<span class="c1"># ...</span>
<span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># ...</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">dice</span><span class="o">.</span><span class="n">CmdDice</span><span class="p">())</span> <span class="c1"># &lt;---</span>
</pre></div>
</div>
</section>
<section id="usage">
<h2>Usage:<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>&gt; roll 1d100 + 2
&gt; roll 1d20
&gt; roll 1d20 - 4
</pre></div>
</div>
<p>The result of the roll will be echoed to the room.</p>
<p>One can also specify a standard Python operator in order to specify
eventual target numbers and get results in a fair and guaranteed
unbiased way. For example:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>&gt; roll 2d6 + 2 &lt; 8
</pre></div>
</div>
<p>Rolling this will inform all parties if roll was indeed below 8 or not.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>&gt; roll/hidden 1d100
</pre></div>
</div>
<p>Informs the room that the roll is being made without telling what the result
was.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>&gt; roll/secret 1d20
</pre></div>
</div>
<p>This a hidden roll that does not inform the room it happened.</p>
</section>
<section id="rolling-dice-from-code">
<h2>Rolling dice from code<a class="headerlink" href="#rolling-dice-from-code" title="Permalink to this headline"></a></h2>
<p>You can specify the first argument as a string on standard RPG d-syntax (NdM,
where N is the number of dice to roll, and M is the number sides per dice):</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.contrib.rpg.dice</span> <span class="kn">import</span> <span class="n">roll</span>
<span class="n">roll</span><span class="p">(</span><span class="s2">&quot;3d10 + 2&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>You can also give a conditional (youll then get a <code class="docutils literal notranslate"><span class="pre">True</span></code>/<code class="docutils literal notranslate"><span class="pre">False</span></code> back):</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">roll</span><span class="p">(</span><span class="s2">&quot;2d6 - 1 &gt;= 10&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>If you specify the first argument as an integer, its interpret as the number of
dice to roll and you can then build the roll more explicitly. This can be
useful if you are using the roller together with some other system and want to
construct the roll from components.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">roll</span><span class="p">(</span><span class="n">dice</span><span class="p">,</span> <span class="n">dicetype</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">modifier</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">conditional</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">return_tuple</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">max_dicenum</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_dicetype</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
</pre></div>
</div>
<p>Heres how to roll <code class="docutils literal notranslate"><span class="pre">3d10</span> <span class="pre">+</span> <span class="pre">2</span></code> with explicit syntax:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">roll</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">modifier</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</pre></div>
</div>
<p>Heres how to roll <code class="docutils literal notranslate"><span class="pre">2d6</span> <span class="pre">-</span> <span class="pre">1</span> <span class="pre">&gt;=</span> <span class="pre">10</span></code> (youll get back <code class="docutils literal notranslate"><span class="pre">True</span></code>/<code class="docutils literal notranslate"><span class="pre">False</span></code> back):</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">roll</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="n">modifier</span><span class="o">=</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="n">conditional</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;&gt;=&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span>
</pre></div>
</div>
<section id="dice-pools-and-other-variations">
<h3>Dice pools and other variations<a class="headerlink" href="#dice-pools-and-other-variations" title="Permalink to this headline"></a></h3>
<p>You can only roll one set of dice at a time. If your RPG requires you to roll multiple
sets of dice and combine them in more advanced ways, you can do so with multiple
<code class="docutils literal notranslate"><span class="pre">roll()</span></code> calls. Depending on what you need, you may just want to express this as
helper functions specific for your game.</p>
<p>Heres how to roll a D&amp;D advantage roll (roll d20 twice, pick highest):</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="kn">from</span> <span class="nn">evennia.contrib.rpg.dice</span> <span class="kn">import</span> <span class="n">roll</span>
<span class="k">def</span> <span class="nf">roll_d20_with_advantage</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get biggest result of two d20 rolls&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">max</span><span class="p">(</span><span class="n">roll</span><span class="p">(</span><span class="s2">&quot;d20&quot;</span><span class="p">),</span> <span class="n">roll</span><span class="p">(</span><span class="s2">&quot;d20&quot;</span><span class="p">))</span>
</pre></div>
</div>
<p>Heres an example of a Free-League style dice pool, where you roll a pile of d6
and want to know how many 1s and sixes you get:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.contrib.rpg.dice</span> <span class="kn">import</span> <span class="n">roll</span>
<span class="k">def</span> <span class="nf">roll_dice_pool</span><span class="p">(</span><span class="n">poolsize</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return (number_of_ones, number_of_sixes)&quot;&quot;&quot;</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[</span><span class="n">roll</span><span class="p">(</span><span class="s2">&quot;1d6&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">poolsize</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">results</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">results</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="get-all-roll-details">
<h3>Get all roll details<a class="headerlink" href="#get-all-roll-details" title="Permalink to this headline"></a></h3>
<p>If you need the individual rolls (e.g. for a dice pool), set the <code class="docutils literal notranslate"><span class="pre">return_tuple</span></code> kwarg:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">roll</span><span class="p">(</span><span class="s2">&quot;3d10 &gt; 10&quot;</span><span class="p">,</span> <span class="n">return_tuple</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> <span class="c1"># (result, outcome, diff, rolls)</span>
</pre></div>
</div>
<p>The return is a tuple <code class="docutils literal notranslate"><span class="pre">(result,</span> <span class="pre">outcome,</span> <span class="pre">diff,</span> <span class="pre">rolls)</span></code>, where <code class="docutils literal notranslate"><span class="pre">result</span></code> is the
result of the roll, <code class="docutils literal notranslate"><span class="pre">outcome</span></code> is <code class="docutils literal notranslate"><span class="pre">True/False</span></code> if a conditional was
given (<code class="docutils literal notranslate"><span class="pre">None</span></code> otherwise), <code class="docutils literal notranslate"><span class="pre">diff</span></code> is the absolute difference between the
conditional and the result (<code class="docutils literal notranslate"><span class="pre">None</span></code> otherwise) and <code class="docutils literal notranslate"><span class="pre">rolls</span></code> is a tuple containing
the individual roll results.</p>
<hr class="docutils" />
<p><small>This document page is generated from <code class="docutils literal notranslate"><span class="pre">evennia/contrib/rpg/dice/README.md</span></code>. Changes to this
file will be overwritten, so edit that file rather than this one.</small></p>
</section>
</section>
</section>
</div>
</div>
</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="right" >
<a href="Contrib-Health-Bar.html" title="Health Bar"
>next</a> |</li>
<li class="right" >
<a href="Contrib-Character-Creator.html" title="Character Creator"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="Contribs-Overview.html" >Contribs</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">Dice roller</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2023, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>