mirror of
https://github.com/evennia/evennia.git
synced 2026-03-29 20:17:16 +02:00
Fix legacy 2.0 docs
This commit is contained in:
parent
c71092825f
commit
7716ce9612
3968 changed files with 11058 additions and 560326 deletions
|
|
@ -21,8 +21,6 @@
|
|||
<link rel="prev" title="10. Twitch Combat" href="Beginner-Tutorial-Combat-Twitch.html" />
|
||||
</head><body>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="related" role="navigation" aria-label="related navigation">
|
||||
<h3>Navigation</h3>
|
||||
|
|
@ -40,12 +38,16 @@
|
|||
<a href="Beginner-Tutorial-Combat-Twitch.html" title="10. Twitch Combat"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 2.x</a> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../Howtos-Overview.html" >Tutorials and How-To’s</a> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../Howtos-Overview.html" >Tutorials and Howto’s</a> »</li>
|
||||
<li class="nav-item nav-item-2"><a href="../Beginner-Tutorial-Overview.html" >Beginner Tutorial</a> »</li>
|
||||
<li class="nav-item nav-item-3"><a href="Beginner-Tutorial-Part3-Overview.html" accesskey="U">Part 3: How We Get There (Example Game)</a> »</li>
|
||||
<li class="nav-item nav-item-3"><a href="Beginner-Tutorial-Part3-Overview.html" accesskey="U">Part 3: How we get there (example game)</a> »</li>
|
||||
<li class="nav-item nav-item-this"><a href=""><span class="section-number">11. </span>Turnbased Combat</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="document">
|
||||
|
||||
|
|
@ -126,18 +128,6 @@
|
|||
<a href="https://evennia.blogspot.com/">Blog</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Doc Versions</h3>
|
||||
<ul>
|
||||
|
||||
<li><a href="Beginner-Tutorial-Combat-Turnbased.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">
|
||||
|
|
@ -149,66 +139,66 @@
|
|||
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>><span class="w"> </span>attack<span class="w"> </span>Troll
|
||||
______________________________________________________________________________
|
||||
|
||||
<span class="w"> </span>You<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span><span class="w"> </span>vs<span class="w"> </span>Troll<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span>
|
||||
<span class="w"> </span>You<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span><span class="w"> </span>vs<span class="w"> </span>Troll<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span><span class="w"> </span>
|
||||
<span class="w"> </span>Your<span class="w"> </span>queued<span class="w"> </span>action:<span class="w"> </span><span class="o">[</span>attack<span class="o">]</span><span class="w"> </span><span class="o">(</span>22s<span class="w"> </span><span class="k">until</span><span class="w"> </span>next<span class="w"> </span>round,
|
||||
<span class="w"> </span>or<span class="w"> </span><span class="k">until</span><span class="w"> </span>all<span class="w"> </span>combatants<span class="w"> </span>have<span class="w"> </span>chosen<span class="w"> </span>their<span class="w"> </span>next<span class="w"> </span>action<span class="o">)</span>.
|
||||
______________________________________________________________________________
|
||||
|
||||
<span class="w"> </span><span class="m">1</span>:<span class="w"> </span>attack<span class="w"> </span>an<span class="w"> </span>enemy
|
||||
<span class="w"> </span><span class="m">2</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>gain<span class="w"> </span>a<span class="w"> </span>later<span class="w"> </span>advantage<span class="w"> </span>against<span class="w"> </span>a<span class="w"> </span>target
|
||||
<span class="w"> </span><span class="m">3</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>give<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>disadvantage<span class="w"> </span>against<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally
|
||||
<span class="w"> </span><span class="m">4</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally
|
||||
<span class="w"> </span><span class="m">5</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>an<span class="w"> </span>enemy
|
||||
<span class="w"> </span><span class="m">6</span>:<span class="w"> </span>Wield/swap<span class="w"> </span>with<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>from<span class="w"> </span>inventory
|
||||
<span class="w"> </span><span class="m">7</span>:<span class="w"> </span>flee!
|
||||
<span class="w"> </span><span class="m">8</span>:<span class="w"> </span>hold,<span class="w"> </span>doing<span class="w"> </span>nothing
|
||||
<span class="w"> </span><span class="m">1</span>:<span class="w"> </span>attack<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">2</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>gain<span class="w"> </span>a<span class="w"> </span>later<span class="w"> </span>advantage<span class="w"> </span>against<span class="w"> </span>a<span class="w"> </span>target<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">3</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>give<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>disadvantage<span class="w"> </span>against<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">4</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">5</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">6</span>:<span class="w"> </span>Wield/swap<span class="w"> </span>with<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>from<span class="w"> </span>inventory<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">7</span>:<span class="w"> </span>flee!<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">8</span>:<span class="w"> </span>hold,<span class="w"> </span>doing<span class="w"> </span>nothing<span class="w"> </span>
|
||||
|
||||
><span class="w"> </span><span class="m">4</span>
|
||||
><span class="w"> </span><span class="m">4</span><span class="w"> </span>
|
||||
_______________________________________________________________________________
|
||||
|
||||
Select<span class="w"> </span>the<span class="w"> </span>item
|
||||
_______________________________________________________________________________
|
||||
|
||||
<span class="w"> </span><span class="m">1</span>:<span class="w"> </span>Potion<span class="w"> </span>of<span class="w"> </span>Strength
|
||||
<span class="w"> </span><span class="m">2</span>.<span class="w"> </span>Potion<span class="w"> </span>of<span class="w"> </span>Dexterity
|
||||
<span class="w"> </span><span class="m">2</span>.<span class="w"> </span>Potion<span class="w"> </span>of<span class="w"> </span>Dexterity<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">3</span>.<span class="w"> </span>Green<span class="w"> </span>Apple
|
||||
<span class="w"> </span><span class="m">4</span>.<span class="w"> </span>Throwing<span class="w"> </span>Daggers
|
||||
<span class="w"> </span>back
|
||||
<span class="w"> </span>abort
|
||||
<span class="w"> </span><span class="m">4</span>.<span class="w"> </span>Throwing<span class="w"> </span>Daggers<span class="w"> </span>
|
||||
<span class="w"> </span>back<span class="w"> </span>
|
||||
<span class="w"> </span>abort<span class="w"> </span>
|
||||
|
||||
><span class="w"> </span><span class="m">1</span>
|
||||
><span class="w"> </span><span class="m">1</span><span class="w"> </span>
|
||||
_______________________________________________________________________________
|
||||
|
||||
Choose<span class="w"> </span>an<span class="w"> </span>ally<span class="w"> </span>to<span class="w"> </span>target.
|
||||
_______________________________________________________________________________
|
||||
|
||||
<span class="w"> </span><span class="m">1</span>:<span class="w"> </span>Yourself
|
||||
<span class="w"> </span>back
|
||||
<span class="w"> </span>abort
|
||||
<span class="w"> </span>back<span class="w"> </span>
|
||||
<span class="w"> </span>abort<span class="w"> </span>
|
||||
|
||||
><span class="w"> </span><span class="m">1</span>
|
||||
_______________________________________________________________________________
|
||||
|
||||
<span class="w"> </span>You<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span><span class="w"> </span>vs<span class="w"> </span>Troll<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span>
|
||||
<span class="w"> </span>You<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span><span class="w"> </span>vs<span class="w"> </span>Troll<span class="w"> </span><span class="o">(</span>Perfect<span class="o">)</span><span class="w"> </span>
|
||||
<span class="w"> </span>Your<span class="w"> </span>queued<span class="w"> </span>action:<span class="w"> </span><span class="o">[</span>use<span class="o">]</span><span class="w"> </span><span class="o">(</span>6s<span class="w"> </span><span class="k">until</span><span class="w"> </span>next<span class="w"> </span>round,
|
||||
<span class="w"> </span>or<span class="w"> </span><span class="k">until</span><span class="w"> </span>all<span class="w"> </span>combatants<span class="w"> </span>have<span class="w"> </span>chosen<span class="w"> </span>their<span class="w"> </span>next<span class="w"> </span>action<span class="o">)</span>.
|
||||
_______________________________________________________________________________
|
||||
|
||||
<span class="w"> </span><span class="m">1</span>:<span class="w"> </span>attack<span class="w"> </span>an<span class="w"> </span>enemy
|
||||
<span class="w"> </span><span class="m">2</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>gain<span class="w"> </span>a<span class="w"> </span>later<span class="w"> </span>advantage<span class="w"> </span>against<span class="w"> </span>a<span class="w"> </span>target
|
||||
<span class="w"> </span><span class="m">3</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>give<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>disadvantage<span class="w"> </span>against<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally
|
||||
<span class="w"> </span><span class="m">4</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally
|
||||
<span class="w"> </span><span class="m">5</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>an<span class="w"> </span>enemy
|
||||
<span class="w"> </span><span class="m">6</span>:<span class="w"> </span>Wield/swap<span class="w"> </span>with<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>from<span class="w"> </span>inventory
|
||||
<span class="w"> </span><span class="m">7</span>:<span class="w"> </span>flee!
|
||||
<span class="w"> </span><span class="m">8</span>:<span class="w"> </span>hold,<span class="w"> </span>doing<span class="w"> </span>nothing
|
||||
<span class="w"> </span><span class="m">1</span>:<span class="w"> </span>attack<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">2</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>gain<span class="w"> </span>a<span class="w"> </span>later<span class="w"> </span>advantage<span class="w"> </span>against<span class="w"> </span>a<span class="w"> </span>target<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">3</span>:<span class="w"> </span>Stunt<span class="w"> </span>-<span class="w"> </span>give<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>disadvantage<span class="w"> </span>against<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">4</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>yourself<span class="w"> </span>or<span class="w"> </span>an<span class="w"> </span>ally<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">5</span>:<span class="w"> </span>Use<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>on<span class="w"> </span>an<span class="w"> </span>enemy<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">6</span>:<span class="w"> </span>Wield/swap<span class="w"> </span>with<span class="w"> </span>an<span class="w"> </span>item<span class="w"> </span>from<span class="w"> </span>inventory<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">7</span>:<span class="w"> </span>flee!<span class="w"> </span>
|
||||
<span class="w"> </span><span class="m">8</span>:<span class="w"> </span>hold,<span class="w"> </span>doing<span class="w"> </span>nothing<span class="w"> </span>
|
||||
|
||||
Troll<span class="w"> </span>attacks<span class="w"> </span>You<span class="w"> </span>with<span class="w"> </span>Claws:<span class="w"> </span>Roll<span class="w"> </span>vs<span class="w"> </span>armor<span class="w"> </span><span class="o">(</span><span class="m">12</span><span class="o">)</span>:
|
||||
<span class="w"> </span>rolled<span class="w"> </span><span class="m">4</span><span class="w"> </span>on<span class="w"> </span>d20<span class="w"> </span>+<span class="w"> </span>strength<span class="o">(</span>+3<span class="o">)</span><span class="w"> </span>vs<span class="w"> </span><span class="m">12</span><span class="w"> </span>-><span class="w"> </span>Fail
|
||||
<span class="w"> </span>Troll<span class="w"> </span>missed<span class="w"> </span>you.
|
||||
|
||||
You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </span>of<span class="w"> </span>Strength.
|
||||
<span class="w"> </span>Renewed<span class="w"> </span>strength<span class="w"> </span>coarses<span class="w"> </span>through<span class="w"> </span>your<span class="w"> </span>body!
|
||||
<span class="w"> </span>rolled<span class="w"> </span><span class="m">4</span><span class="w"> </span>on<span class="w"> </span>d20<span class="w"> </span>+<span class="w"> </span>strength<span class="o">(</span>+3<span class="o">)</span><span class="w"> </span>vs<span class="w"> </span><span class="m">12</span><span class="w"> </span>-><span class="w"> </span>Fail<span class="w"> </span>
|
||||
<span class="w"> </span>Troll<span class="w"> </span>missed<span class="w"> </span>you.<span class="w"> </span>
|
||||
<span class="w"> </span>
|
||||
You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </span>of<span class="w"> </span>Strength.<span class="w"> </span>
|
||||
<span class="w"> </span>Renewed<span class="w"> </span>strength<span class="w"> </span>coarses<span class="w"> </span>through<span class="w"> </span>your<span class="w"> </span>body!<span class="w"> </span>
|
||||
<span class="w"> </span>Potion<span class="w"> </span>of<span class="w"> </span>Strength<span class="w"> </span>was<span class="w"> </span>used<span class="w"> </span>up.
|
||||
</pre></div>
|
||||
</div>
|
||||
|
|
@ -236,7 +226,7 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
<blockquote>
|
||||
<div><p>Create a new module <code class="docutils literal notranslate"><span class="pre">evadventure/combat_turnbased.py</span></code>.</p>
|
||||
</div></blockquote>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">.combat_base</span> <span class="kn">import</span> <span class="p">(</span>
|
||||
<span class="n">CombatActionAttack</span><span class="p">,</span>
|
||||
|
|
@ -263,13 +253,13 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
<span class="c1"># fallback action if not selecting anything</span>
|
||||
<span class="n">fallback_action_dict</span> <span class="o">=</span> <span class="n">AttributeProperty</span><span class="p">({</span><span class="s2">"key"</span><span class="p">:</span> <span class="s2">"hold"</span><span class="p">},</span> <span class="n">autocreate</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># track which turn we are on</span>
|
||||
<span class="c1"># track which turn we are on </span>
|
||||
<span class="n">turn</span> <span class="o">=</span> <span class="n">AttributeProperty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
<span class="c1"># who is involved in combat, and their queued action</span>
|
||||
<span class="c1"># as {combatant: actiondict, ...}</span>
|
||||
<span class="n">combatants</span> <span class="o">=</span> <span class="n">AttributeProperty</span><span class="p">(</span><span class="nb">dict</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># who has advantage against whom. This is a structure</span>
|
||||
<span class="c1"># who has advantage against whom. This is a structure </span>
|
||||
<span class="c1"># like {"combatant": {enemy1: True, enemy2: True}}</span>
|
||||
<span class="n">advantage_matrix</span> <span class="o">=</span> <span class="n">AttributeProperty</span><span class="p">(</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">dict</span><span class="p">))</span>
|
||||
<span class="c1"># same for disadvantages</span>
|
||||
|
|
@ -291,17 +281,17 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
<section id="getting-the-sides-of-combat">
|
||||
<h3><span class="section-number">11.2.1. </span>Getting the sides of combat<a class="headerlink" href="#getting-the-sides-of-combat" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The two sides are different depending on if we are in an <a class="reference internal" href="Beginner-Tutorial-Rooms.html"><span class="doc std std-doc">PvP room</span></a> or not: In a PvP room everyone else is your enemy. Otherwise only NPCs in combat is your enemy (you are assumed to be teaming up with your fellow players).</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">get_sides</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">):</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Get a listing of the two 'sides' of this combat,</span>
|
||||
<span class="sd"> Get a listing of the two 'sides' of this combat, </span>
|
||||
<span class="sd"> m the perspective of the provided combatant.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">allow_pvp</span><span class="p">:</span>
|
||||
|
|
@ -314,11 +304,11 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
<span class="n">npcs</span> <span class="o">=</span> <span class="p">[</span><span class="n">comb</span> <span class="k">for</span> <span class="n">comb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">combatants</span> <span class="k">if</span> <span class="n">comb</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">pcs</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">combatant</span> <span class="ow">in</span> <span class="n">pcs</span><span class="p">:</span>
|
||||
<span class="c1"># combatant is a PC, so NPCs are all enemies</span>
|
||||
<span class="n">allies</span> <span class="o">=</span> <span class="n">pcs</span>
|
||||
<span class="n">allies</span> <span class="o">=</span> <span class="p">[</span><span class="n">comb</span> <span class="k">for</span> <span class="n">comb</span> <span class="ow">in</span> <span class="n">pcs</span> <span class="k">if</span> <span class="n">comb</span> <span class="o">!=</span> <span class="n">combatant</span><span class="p">]</span>
|
||||
<span class="n">enemies</span> <span class="o">=</span> <span class="n">npcs</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="c1"># combatant is an NPC, so PCs are all enemies</span>
|
||||
<span class="n">allies</span> <span class="o">=</span> <span class="n">npcs</span>
|
||||
<span class="n">allies</span> <span class="o">=</span> <span class="p">[</span><span class="n">comb</span> <span class="k">for</span> <span class="n">comb</span> <span class="ow">in</span> <span class="n">npcs</span> <span class="k">if</span> <span class="n">comb</span> <span class="o">!=</span> <span class="n">combatant</span><span class="p">]</span>
|
||||
<span class="n">enemies</span> <span class="o">=</span> <span class="n">pcs</span>
|
||||
<span class="k">return</span> <span class="n">allies</span><span class="p">,</span> <span class="n">enemies</span>
|
||||
</pre></div>
|
||||
|
|
@ -328,13 +318,13 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
</section>
|
||||
<section id="tracking-advantage-disadvantage">
|
||||
<h3><span class="section-number">11.2.2. </span>Tracking Advantage/Disadvantage<a class="headerlink" href="#tracking-advantage-disadvantage" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">give_advantage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">advantage_matrix</span><span class="p">[</span><span class="n">combatant</span><span class="p">][</span><span class="n">target</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
|
|
@ -344,7 +334,7 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
|
||||
<span class="k">def</span> <span class="nf">has_advantage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">(</span>
|
||||
<span class="n">target</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fleeing_combatants</span>
|
||||
<span class="n">target</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fleeing_combatants</span>
|
||||
<span class="ow">or</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">advantage_matrix</span><span class="p">[</span><span class="n">combatant</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="kc">False</span><span class="p">))</span>
|
||||
<span class="p">)</span>
|
||||
<span class="k">def</span> <span class="nf">has_disadvantage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
|
||||
|
|
@ -363,13 +353,13 @@ You<span class="w"> </span>use<span class="w"> </span>Potion<span class="w"> </s
|
|||
<h3><span class="section-number">11.2.3. </span>Adding and removing combatants<a class="headerlink" href="#adding-and-removing-combatants" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Since the combat handler is shared we must be able to add- and remove combatants easily.
|
||||
This is new compared to the base handler.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">add_combatant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">):</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
|
|
@ -386,7 +376,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">combatant</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||
<span class="c1"># clean up menu if it exists</span>
|
||||
<span class="c1"># TODO!</span>
|
||||
<span class="c1"># TODO! </span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>We simply add the the combatant with the fallback action-dict to start with. We return a <code class="docutils literal notranslate"><span class="pre">bool</span></code> from <code class="docutils literal notranslate"><span class="pre">add_combatant</span></code> so that the calling function will know if they were actually added anew or not (we may want to do some extra setup if they are new).</p>
|
||||
|
|
@ -395,24 +385,24 @@ This is new compared to the base handler.</p>
|
|||
<section id="flee-action">
|
||||
<h3><span class="section-number">11.2.4. </span>Flee Action<a class="headerlink" href="#flee-action" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Since you can’t just move away from the room to flee turnbased combat, we need to add a new <code class="docutils literal notranslate"><span class="pre">CombatAction</span></code> subclass like the ones we created in the <a class="reference internal" href="Beginner-Tutorial-Combat-Base.html#actions"><span class="std std-doc">base combat lesson</span></a>.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">.combat_base</span> <span class="kn">import</span> <span class="n">CombatAction</span>
|
||||
<span class="kn">from</span> <span class="nn">.combat_base</span> <span class="kn">import</span> <span class="n">CombatAction</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">CombatActionFlee</span><span class="p">(</span><span class="n">CombatAction</span><span class="p">):</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Start (or continue) fleeing/disengaging from combat.</span>
|
||||
|
||||
<span class="sd"> action_dict = {</span>
|
||||
<span class="sd"> </span>
|
||||
<span class="sd"> action_dict = { </span>
|
||||
<span class="sd"> "key": "flee",</span>
|
||||
<span class="sd"> }</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="n">combathandler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">combathandler</span>
|
||||
|
||||
|
||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">combatant</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">combathandler</span><span class="o">.</span><span class="n">fleeing_combatants</span><span class="p">:</span>
|
||||
<span class="c1"># we record the turn on which we started fleeing</span>
|
||||
<span class="n">combathandler</span><span class="o">.</span><span class="n">fleeing_combatants</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">combatant</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">combathandler</span><span class="o">.</span><span class="n">turn</span>
|
||||
|
|
@ -438,10 +428,10 @@ This is new compared to the base handler.</p>
|
|||
<span class="s2">"stunt"</span><span class="p">:</span> <span class="n">CombatActionStunt</span><span class="p">,</span>
|
||||
<span class="s2">"use"</span><span class="p">:</span> <span class="n">CombatActionUseItem</span><span class="p">,</span>
|
||||
<span class="s2">"wield"</span><span class="p">:</span> <span class="n">CombatActionWield</span><span class="p">,</span>
|
||||
<span class="s2">"flee"</span><span class="p">:</span> <span class="n">CombatActionFlee</span> <span class="c1"># < ---- added!</span>
|
||||
<span class="s2">"flee"</span><span class="p">:</span> <span class="n">CombatActionFlee</span> <span class="c1"># < ---- added! </span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>We create the action to make use of the <code class="docutils literal notranslate"><span class="pre">fleeing_combatants</span></code> dict we set up in the combat handler. This dict stores the fleeing combatant along with the <code class="docutils literal notranslate"><span class="pre">turn</span></code> its fleeing started. If performing the <code class="docutils literal notranslate"><span class="pre">flee</span></code> action multiple times, we will just display how many turns are remaining.</p>
|
||||
|
|
@ -449,13 +439,13 @@ This is new compared to the base handler.</p>
|
|||
</section>
|
||||
<section id="queue-action">
|
||||
<h3><span class="section-number">11.2.5. </span>Queue action<a class="headerlink" href="#queue-action" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">queue_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">,</span> <span class="n">action_dict</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="p">[</span><span class="n">combatant</span><span class="p">]</span> <span class="o">=</span> <span class="n">action_dict</span>
|
||||
|
|
@ -525,15 +515,15 @@ This is new compared to the base handler.</p>
|
|||
<span class="normal">49</span>
|
||||
<span class="normal">50</span>
|
||||
<span class="normal">51</span>
|
||||
<span class="normal">52</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<span class="normal">52</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">random</span>
|
||||
<span class="kn">import</span> <span class="nn">random</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">execute_next_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">):</span>
|
||||
<span class="c1"># this gets the next dict and rotates the queue</span>
|
||||
|
|
@ -545,11 +535,11 @@ This is new compared to the base handler.</p>
|
|||
</span>
|
||||
<span class="n">action</span><span class="o">.</span><span class="n">execute</span><span class="p">()</span>
|
||||
<span class="n">action</span><span class="o">.</span><span class="n">post_execute</span><span class="p">()</span>
|
||||
|
||||
|
||||
<span class="hll"> <span class="k">if</span> <span class="n">action_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"repeat"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||||
</span> <span class="c1"># queue the action again *without updating the</span>
|
||||
</span> <span class="c1"># queue the action again *without updating the </span>
|
||||
<span class="c1"># *.ndb.did_action list* (otherwise</span>
|
||||
<span class="c1"># we'd always auto-end the turn if everyone used</span>
|
||||
<span class="c1"># we'd always auto-end the turn if everyone used </span>
|
||||
<span class="c1"># repeating actions and there'd be</span>
|
||||
<span class="c1"># no time to change it before the next round)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="p">[</span><span class="n">combatant</span><span class="p">]</span> <span class="o">=</span> <span class="n">action_dict</span>
|
||||
|
|
@ -560,8 +550,8 @@ This is new compared to the base handler.</p>
|
|||
|
||||
<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="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> This method is called every time Script repeats</span>
|
||||
<span class="sd"> (every `interval` seconds). Performs a full turn of</span>
|
||||
<span class="sd"> This method is called every time Script repeats </span>
|
||||
<span class="sd"> (every `interval` seconds). Performs a full turn of </span>
|
||||
<span class="sd"> combat, performing everyone's actions in random order.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">turn</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
|
|
@ -665,22 +655,22 @@ This is new compared to the base handler.</p>
|
|||
<span class="normal">68</span>
|
||||
<span class="normal">69</span>
|
||||
<span class="normal">70</span>
|
||||
<span class="normal">71</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<span class="normal">71</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">random</span>
|
||||
<span class="kn">import</span> <span class="nn">random</span>
|
||||
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">list_to_string</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">stop_combat</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Stop the combat immediately.</span>
|
||||
|
||||
<span class="sd"> """</span>
|
||||
<span class="sd"> </span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">for</span> <span class="n">combatant</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">remove_combatant</span><span class="p">(</span><span class="n">combatant</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
|
||||
|
|
@ -692,7 +682,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="c1"># check if anyone is defeated</span>
|
||||
<span class="k">for</span> <span class="n">combatant</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
|
||||
<span class="k">if</span> <span class="n">combatant</span><span class="o">.</span><span class="n">hp</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
|
||||
<span class="hll"> <span class="c1"># PCs roll on the death table here, NPCs die.</span>
|
||||
<span class="hll"> <span class="c1"># PCs roll on the death table here, NPCs die. </span>
|
||||
</span> <span class="c1"># Even if PCs survive, they</span>
|
||||
<span class="c1"># are still out of the fight.</span>
|
||||
<span class="n">combatant</span><span class="o">.</span><span class="n">at_defeat</span><span class="p">()</span>
|
||||
|
|
@ -701,7 +691,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"|r$You() $conj(fall) to the ground, defeated.|n"</span><span class="p">,</span> <span class="n">combatant</span><span class="o">=</span><span class="n">combatant</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="p">[</span><span class="n">combatant</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fallback_action_dict</span>
|
||||
|
||||
|
||||
<span class="c1"># check if anyone managed to flee</span>
|
||||
<span class="n">flee_timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">flee_timeout</span>
|
||||
<span class="k">for</span> <span class="n">combatant</span><span class="p">,</span> <span class="n">started_fleeing</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fleeing_combatants</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
|
|
@ -709,7 +699,7 @@ This is new compared to the base handler.</p>
|
|||
</span> <span class="c1"># if they are still alive/fleeing and have been fleeing long enough, escape</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"|y$You() successfully $conj(flee) from combat.|n"</span><span class="p">,</span> <span class="n">combatant</span><span class="o">=</span><span class="n">combatant</span><span class="p">)</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">remove_combatant</span><span class="p">(</span><span class="n">combatant</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="c1"># check if one side won the battle</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="p">:</span>
|
||||
<span class="c1"># noone left in combat - maybe they killed each other or all fled</span>
|
||||
|
|
@ -752,20 +742,20 @@ This is new compared to the base handler.</p>
|
|||
<p>Since we are using the timer-component of the <a class="reference internal" href="../../../Components/Scripts.html"><span class="doc std std-doc">Script</span></a> to tick our combat, we also need a helper method to ‘start’ that.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">list_to_string</span>
|
||||
|
||||
<span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">start_combat</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="w"> </span><span class="sd">""" </span>
|
||||
<span class="sd"> This actually starts the combat. It's safe to run this multiple times</span>
|
||||
<span class="sd"> since it will only start combat if it isn't already running.</span>
|
||||
|
||||
<span class="sd"> """</span>
|
||||
<span class="sd"> </span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_active</span><span class="p">:</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||||
|
||||
|
|
@ -778,11 +768,11 @@ This is new compared to the base handler.</p>
|
|||
<h2><span class="section-number">11.3. </span>Using EvMenu for the combat menu<a class="headerlink" href="#using-evmenu-for-the-combat-menu" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The <em>EvMenu</em> used to create in-game menues in Evennia. We used a simple EvMenu already in the <a class="reference internal" href="Beginner-Tutorial-Chargen.html"><span class="doc std std-doc">Character Generation Lesson</span></a>. This time we’ll need to be a bit more advanced. While <a class="reference internal" href="../../../Components/EvMenu.html"><span class="doc std std-doc">The EvMenu documentation</span></a> describe its functionality in more detail, we will give a quick overview of how it works here.</p>
|
||||
<p>An EvMenu is made up of <em>nodes</em>, which are regular functions on this form (somewhat simplified here, there are more options):</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">node_somenodename</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">node_somenodename</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
|
||||
<span class="n">text</span> <span class="o">=</span> <span class="s2">"some text to show in the node"</span>
|
||||
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"key"</span><span class="p">:</span> <span class="s2">"Option 1"</span><span class="p">,</span> <span class="c1"># skip this to get a number</span>
|
||||
<span class="s2">"desc"</span><span class="p">:</span> <span class="s2">"Describing what happens when choosing this option."</span>
|
||||
<span class="s2">"goto"</span><span class="p">:</span> <span class="s2">"name of the node to go to"</span> <span class="c1"># OR (callable, {kwargs}}) returning said name</span>
|
||||
|
|
@ -798,7 +788,7 @@ This is new compared to the base handler.</p>
|
|||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># example of a EvMenu node index</span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"start"</span><span class="p">:</span> <span class="n">node_combat_main</span><span class="p">,</span>
|
||||
<span class="s2">"node1"</span><span class="p">:</span> <span class="n">node_func1</span><span class="p">,</span>
|
||||
<span class="s2">"node1"</span><span class="p">:</span> <span class="n">node_func1</span><span class="p">,</span>
|
||||
<span class="s2">"node2"</span><span class="p">:</span> <span class="n">node_func2</span><span class="p">,</span>
|
||||
<span class="s2">"some name"</span><span class="p">:</span> <span class="n">node_somenodename</span><span class="p">,</span>
|
||||
<span class="s2">"end"</span><span class="p">:</span> <span class="n">node_abort_menu</span><span class="p">,</span>
|
||||
|
|
@ -808,9 +798,9 @@ This is new compared to the base handler.</p>
|
|||
<p>Each <code class="docutils literal notranslate"><span class="pre">option</span></code> dict has a key <code class="docutils literal notranslate"><span class="pre">"goto"</span></code> that determines which node the player should jump to if they choose that option. Inside the menu, each node needs to be referenced with these names (like <code class="docutils literal notranslate"><span class="pre">"start"</span></code>, <code class="docutils literal notranslate"><span class="pre">"node1"</span></code> etc).</p>
|
||||
<p>The <code class="docutils literal notranslate"><span class="pre">"goto"</span></code> value of each option can either specify the name directly (like <code class="docutils literal notranslate"><span class="pre">"node1"</span></code>) <em>or</em> it can be given as a tuple <code class="docutils literal notranslate"><span class="pre">(callable,</span> <span class="pre">{keywords})</span></code>. This <code class="docutils literal notranslate"><span class="pre">callable</span></code> is <em>called</em> and is expected to in turn return the next node-name to use (like <code class="docutils literal notranslate"><span class="pre">"node1"</span></code>).</p>
|
||||
<p>The <code class="docutils literal notranslate"><span class="pre">callable</span></code> (often called a “goto callable”) looks very similar to a node function:</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_goto_when_choosing_option1</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="c1"># do whatever is needed to determine the next node</span>
|
||||
<span class="k">return</span> <span class="n">nodename</span> <span class="c1"># also nodename, dict works</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_goto_when_choosing_option1</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="c1"># do whatever is needed to determine the next node </span>
|
||||
<span class="k">return</span> <span class="n">nodename</span> <span class="c1"># also nodename, dict works </span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<aside class="sidebar">
|
||||
|
|
@ -821,11 +811,11 @@ This is new compared to the base handler.</p>
|
|||
<p>The goto-callable must return the name of the next node. Optionally, you can return both <code class="docutils literal notranslate"><span class="pre">nodename,</span> <span class="pre">{kwargs}</span></code>. If you do the next node will get those kwargs as ingoing <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code>. This way you can pass information from one node to the next. A special feature is that if <code class="docutils literal notranslate"><span class="pre">nodename</span></code> is returned as <code class="docutils literal notranslate"><span class="pre">None</span></code>, then the <em>current</em> node will be <em>rerun</em> again.</p>
|
||||
<p>Here’s a (somewhat contrived) example of how the goto-callable and node-function hang together:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># goto-callable</span>
|
||||
<span class="k">def</span> <span class="nf">_my_goto_callable</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">_my_goto_callable</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="n">info_number</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"info_number"</span><span class="p">]</span>
|
||||
<span class="k">if</span> <span class="n">info_number</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">info_number</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s2">"node1"</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="s2">"node2"</span><span class="p">,</span> <span class="p">{</span><span class="s2">"info_number"</span><span class="p">:</span> <span class="n">info_number</span><span class="p">}</span> <span class="c1"># will be **kwargs when "node2" runs next</span>
|
||||
|
||||
|
||||
|
|
@ -838,7 +828,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="s2">"goto"</span><span class="p">:</span> <span class="p">(</span><span class="n">_my_goto_callable</span><span class="p">,</span> <span class="p">{</span><span class="s2">"info_number"</span><span class="p">,</span> <span class="mi">1</span><span class="p">})</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"desc"</span><span class="p">:</span> <span class="s2">"Option two"</span><span class="p">,</span>
|
||||
<span class="s2">"desc"</span><span class="p">:</span> <span class="s2">"Option two"</span><span class="p">,</span>
|
||||
<span class="s2">"goto"</span><span class="p">:</span> <span class="p">(</span><span class="n">_my_goto_callable</span><span class="p">,</span> <span class="p">{</span><span class="s2">"info_number"</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">})</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">]</span>
|
||||
|
|
@ -916,7 +906,7 @@ This is new compared to the base handler.</p>
|
|||
<section id="the-node-index">
|
||||
<h3><span class="section-number">11.4.1. </span>The node index<a class="headerlink" href="#the-node-index" title="Permalink to this headline">¶</a></h3>
|
||||
<p>These are the nodes we need for our menu:</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># not coded anywhere yet, just noting for reference</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># not coded anywhere yet, just noting for reference </span>
|
||||
<span class="n">node_index</span> <span class="o">=</span> <span class="p">{</span>
|
||||
<span class="c1"># node names # callables # (future callables)</span>
|
||||
<span class="s2">"node_choose_enemy_target"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># node_choose_enemy_target,</span>
|
||||
|
|
@ -934,11 +924,11 @@ This is new compared to the base handler.</p>
|
|||
</section>
|
||||
<section id="getting-or-setting-the-combathandler">
|
||||
<h3><span class="section-number">11.4.2. </span>Getting or setting the combathandler<a class="headerlink" href="#getting-or-setting-the-combathandler" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">EvMenu</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_get_combathandler</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">turn_timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">flee_time</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">combathandler_key</span><span class="o">=</span><span class="s2">"combathandler"</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">EvAdventureTurnbasedCombatHandler</span><span class="o">.</span><span class="n">get_or_create_combathandler</span><span class="p">(</span>
|
||||
|
|
@ -954,9 +944,9 @@ This is new compared to the base handler.</p>
|
|||
<section id="queue-an-action">
|
||||
<h3><span class="section-number">11.4.3. </span>Queue an action<a class="headerlink" href="#queue-an-action" title="Permalink to this headline">¶</a></h3>
|
||||
<p>This is our first “goto function”. This will be called to actually queue our finished action-dict with the combat handler. After doing that, it should return us to the base <code class="docutils literal notranslate"><span class="pre">node_combat</span></code>.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_queue_action</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="n">action_dict</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"action_dict"</span><span class="p">]</span>
|
||||
|
|
@ -970,11 +960,11 @@ This is new compared to the base handler.</p>
|
|||
<section id="rerun-a-node">
|
||||
<h3><span class="section-number">11.4.4. </span>Rerun a node<a class="headerlink" href="#rerun-a-node" title="Permalink to this headline">¶</a></h3>
|
||||
<p>A special feature of goto callables is the ability to rerun the same node by returning <code class="docutils literal notranslate"><span class="pre">None</span></code>.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_rerun_current_node</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">_rerun_current_node</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="n">kwargs</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
|
|
@ -985,14 +975,14 @@ This is new compared to the base handler.</p>
|
|||
<p>Our particualr menu is very symmetric - you select an option and then you will just select a series of option before you come back. So we will make another goto-function to help us easily do this. To understand, let’s first show how we plan to use this:</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in the base combat-node function (just shown as an example)</span>
|
||||
|
||||
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span>
|
||||
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span>
|
||||
<span class="c1"># ...</span>
|
||||
<span class="s2">"desc"</span><span class="p">:</span> <span class="s2">"use an item on an enemy"</span><span class="p">,</span>
|
||||
<span class="s2">"desc"</span><span class="p">:</span> <span class="s2">"use an item on an enemy"</span><span class="p">,</span>
|
||||
<span class="s2">"goto"</span><span class="p">:</span> <span class="p">(</span>
|
||||
<span class="n">_step_wizard</span><span class="p">,</span>
|
||||
<span class="n">_step_wizard</span><span class="p">,</span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"steps"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"node_choose_use_item"</span><span class="p">,</span> <span class="s2">"node_choose_enemy_target"</span><span class="p">],</span>
|
||||
<span class="s2">"action_dict"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"key"</span><span class="p">:</span> <span class="s2">"use"</span><span class="p">,</span> <span class="s2">"item"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"target"</span><span class="p">:</span> <span class="kc">None</span><span class="p">},</span>
|
||||
<span class="s2">"action_dict"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"key"</span><span class="p">:</span> <span class="s2">"use"</span><span class="p">,</span> <span class="s2">"item"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"target"</span><span class="p">:</span> <span class="kc">None</span><span class="p">},</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">)</span>
|
||||
<span class="p">]</span>
|
||||
|
|
@ -1003,46 +993,46 @@ This is new compared to the base handler.</p>
|
|||
<p>Furthermore, we want the ability to go “back” to the previous node like this:</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in some other node (shown only as an example)</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">some_node</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">some_node</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span>
|
||||
<span class="c1"># ...</span>
|
||||
<span class="p">{</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span>
|
||||
<span class="c1"># ... </span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"key"</span><span class="p">:</span> <span class="s2">"back"</span><span class="p">,</span>
|
||||
<span class="s2">"goto"</span><span class="p">:</span> <span class="p">(</span> <span class="n">_step_wizard</span><span class="p">,</span> <span class="p">{</span><span class="o">**</span><span class="n">kwargs</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s2">"step"</span><span class="p">:</span> <span class="s2">"back"</span><span class="p">}})</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">]</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Note the use of <code class="docutils literal notranslate"><span class="pre">**</span></code> here. <code class="docutils literal notranslate"><span class="pre">{**dict1,</span> <span class="pre">**dict2}</span></code> is a powerful one-liner syntax to combine two dicts into one. This preserves (and passes on) the incoming <code class="docutils literal notranslate"><span class="pre">kwargs</span></code> and just adds a new key “step” to it. The end effect is similar to if we had done <code class="docutils literal notranslate"><span class="pre">kwargs["step"]</span> <span class="pre">=</span> <span class="pre">"back"</span></code> on a separate line (except we end up with a <em>new</em> <code class="docutils literal notranslate"><span class="pre">dict</span></code> when using the <code class="docutils literal notranslate"><span class="pre">**</span></code>-approach).</p>
|
||||
<p>So let’s implement a <code class="docutils literal notranslate"><span class="pre">_step_wizard</span></code> goto-function to handle this!</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">_step_wizard</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">_step_wizard</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># get the steps and count them</span>
|
||||
<span class="c1"># get the steps and count them </span>
|
||||
<span class="n">steps</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">"steps"</span><span class="p">,</span> <span class="p">[])</span>
|
||||
<span class="n">nsteps</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">steps</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># track which step we are on</span>
|
||||
<span class="n">istep</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">"istep"</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||||
<span class="c1"># track which step we are on </span>
|
||||
<span class="n">istep</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">"istep"</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># check if we are going back (forward is default)</span>
|
||||
<span class="n">step_direction</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">"step"</span><span class="p">,</span> <span class="s2">"forward"</span><span class="p">)</span>
|
||||
<span class="n">step_direction</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">"step"</span><span class="p">,</span> <span class="s2">"forward"</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">step_direction</span> <span class="o">==</span> <span class="s2">"back"</span><span class="p">:</span>
|
||||
<span class="c1"># step back in wizard</span>
|
||||
<span class="c1"># step back in wizard </span>
|
||||
<span class="k">if</span> <span class="n">istep</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
|
||||
<span class="c1"># back to the start</span>
|
||||
<span class="c1"># back to the start </span>
|
||||
<span class="k">return</span> <span class="s2">"node_combat"</span>
|
||||
<span class="n">istep</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"istep"</span><span class="p">]</span> <span class="o">=</span> <span class="n">istep</span> <span class="o">-</span> <span class="mi">1</span>
|
||||
<span class="k">return</span> <span class="n">steps</span><span class="p">[</span><span class="n">istep</span><span class="p">],</span> <span class="n">kwargs</span>
|
||||
<span class="k">return</span> <span class="n">steps</span><span class="p">[</span><span class="n">istep</span><span class="p">],</span> <span class="n">kwargs</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="c1"># step to the next step in wizard</span>
|
||||
<span class="k">if</span> <span class="n">istep</span> <span class="o">>=</span> <span class="n">nsteps</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
||||
|
|
@ -1058,18 +1048,18 @@ This is new compared to the base handler.</p>
|
|||
<p>This depends on passing around <code class="docutils literal notranslate"><span class="pre">steps</span></code>, <code class="docutils literal notranslate"><span class="pre">step</span></code> and <code class="docutils literal notranslate"><span class="pre">istep</span></code> with the <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code>. If <code class="docutils literal notranslate"><span class="pre">step</span></code> is “back” then we will go back in the sequence of <code class="docutils literal notranslate"><span class="pre">steps</span></code> otherwise forward. We increase/decrease the <code class="docutils literal notranslate"><span class="pre">istep</span></code> key value to track just where we are.</p>
|
||||
<p>If we reach the end we call our <code class="docutils literal notranslate"><span class="pre">_queue_action</span></code> helper function directly. If we back up to the beginning we return to the base node.</p>
|
||||
<p>We will make one final helper function, to quickly add the <code class="docutils literal notranslate"><span class="pre">back</span></code> (and <code class="docutils literal notranslate"><span class="pre">abort</span></code>) options to the nodes that need it:</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
<span class="n">_get_default_wizard_options</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">[</span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"key"</span><span class="p">:</span> <span class="s2">"back"</span><span class="p">,</span>
|
||||
<span class="s2">"key"</span><span class="p">:</span> <span class="s2">"back"</span><span class="p">,</span>
|
||||
<span class="s2">"goto"</span><span class="p">:</span> <span class="p">(</span><span class="n">_step_wizard</span><span class="p">,</span> <span class="p">{</span><span class="o">**</span><span class="n">kwargs</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s2">"step"</span><span class="p">:</span> <span class="s2">"back"</span><span class="p">}})</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">{</span>
|
||||
<span class="s2">"key"</span><span class="p">:</span> <span class="s2">"abort"</span><span class="p">,</span>
|
||||
<span class="s2">"key"</span><span class="p">:</span> <span class="s2">"abort"</span><span class="p">,</span>
|
||||
<span class="s2">"goto"</span><span class="p">:</span> <span class="s2">"node_combat"</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">{</span>
|
||||
|
|
@ -1122,7 +1112,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="normal">33</span>
|
||||
<span class="normal">34</span>
|
||||
<span class="normal">35</span>
|
||||
<span class="normal">36</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<span class="normal">36</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
|
|
@ -1148,15 +1138,15 @@ This is new compared to the base handler.</p>
|
|||
</span> <span class="k">return</span> <span class="n">text</span><span class="p">,</span> <span class="n">options</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">node_choose_enemy_recipient</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">node_choose_enemy_recipient</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="c1"># almost the same, except storing "recipient"</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">node_choose_allied_target</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">node_choose_allied_target</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="c1"># almost the same, except using allies + yourself</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">node_choose_allied_recipient</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">node_choose_allied_recipient</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="c1"># almost the same, except using allies + yourself and storing "recipient"</span>
|
||||
</pre></div></td></tr></table></div>
|
||||
</div>
|
||||
|
|
@ -1176,12 +1166,12 @@ This is new compared to the base handler.</p>
|
|||
</li>
|
||||
<li><p><strong>Line 23</strong>: We extend the <code class="docutils literal notranslate"><span class="pre">options</span></code> list with the default wizard options (<code class="docutils literal notranslate"><span class="pre">back</span></code>, <code class="docutils literal notranslate"><span class="pre">abort</span></code>). Since we made a helper function for this, this is only one line.</p></li>
|
||||
</ul>
|
||||
<p>Creating the three other needed nodes <code class="docutils literal notranslate"><span class="pre">node_choose_enemy_recipient</span></code>, <code class="docutils literal notranslate"><span class="pre">node_choose_allied_target</span></code> and <code class="docutils literal notranslate"><span class="pre">node_choose_allied_recipient</span></code> are following the same pattern; they just use either the <code class="docutils literal notranslate"><span class="pre">allies</span></code> or <code class="docutils literal notranslate"><span class="pre">enemies</span></code> return from <code class="docutils literal notranslate"><span class="pre">combathandler.get_sides().</span> <span class="pre">It</span> <span class="pre">then</span> <span class="pre">sets</span> <span class="pre">either</span> <span class="pre">the</span> </code>target<code class="docutils literal notranslate"><span class="pre">or</span></code>recipient<code class="docutils literal notranslate"><span class="pre">field</span> <span class="pre">in</span> <span class="pre">the</span></code>action_dict`. We leave these up to the reader to implement.</p>
|
||||
<p>Creating the three other needed nodes <code class="docutils literal notranslate"><span class="pre">node_choose_enemy_recipient</span></code>, <code class="docutils literal notranslate"><span class="pre">node_choose_allied_target</span></code> and <code class="docutils literal notranslate"><span class="pre">node_choose_allied_recipient</span></code> are following the same pattern; they just use either the <code class="docutils literal notranslate"><span class="pre">allies</span></code> or <code class="docutils literal notranslate"><span class="pre">enemies</span></code> return from <code class="docutils literal notranslate"><span class="pre">combathandler.get_sides()</span></code> (for the <code class="docutils literal notranslate"><span class="pre">allies</span></code>, don’t forget to add <code class="docutils literal notranslate"><span class="pre">caller</span></code> so you can target yourself!). It then sets either the <code class="docutils literal notranslate"><span class="pre">target</span></code> or <code class="docutils literal notranslate"><span class="pre">recipient</span></code> field in the <code class="docutils literal notranslate"><span class="pre">action_dict</span></code>. We leave these up to the reader to implement.</p>
|
||||
</section>
|
||||
<section id="choose-an-ability">
|
||||
<h3><span class="section-number">11.4.7. </span>Choose an Ability<a class="headerlink" href="#choose-an-ability" title="Permalink to this headline">¶</a></h3>
|
||||
<p>For Stunts, we need to be able to select which <em>Knave</em> Ability (STR, DEX etc) you want to boost/foil.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">.enums</span> <span class="kn">import</span> <span class="n">Ability</span>
|
||||
|
||||
|
|
@ -1199,7 +1189,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="p">{</span>
|
||||
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
<span class="o">**</span><span class="p">{</span>
|
||||
<span class="s2">"action_dict"</span><span class="p">:</span> <span class="p">{</span><span class="o">**</span><span class="n">action_dict</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s2">"stunt_type"</span><span class="p">:</span> <span class="n">abi</span><span class="p">,</span> <span class="s2">"defense_type"</span><span class="p">:</span> <span class="n">abi</span><span class="p">}},</span>
|
||||
<span class="s2">"action_dict"</span><span class="p">:</span> <span class="p">{</span><span class="o">**</span><span class="n">action_dict</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s2">"stunt_type"</span><span class="p">:</span> <span class="n">abi</span><span class="p">,</span> <span class="s2">"defense_type"</span><span class="p">:</span> <span class="n">abi</span><span class="p">}},</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">},</span>
|
||||
<span class="p">),</span>
|
||||
|
|
@ -1223,7 +1213,7 @@ This is new compared to the base handler.</p>
|
|||
</section>
|
||||
<section id="choose-an-item-to-use-or-wield">
|
||||
<h3><span class="section-number">11.4.8. </span>Choose an item to use or wield<a class="headerlink" href="#choose-an-item-to-use-or-wield" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
|
|
@ -1248,7 +1238,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="k">return</span> <span class="n">text</span><span class="p">,</span> <span class="n">options</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">node_choose_wield_item</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="k">def</span> <span class="nf">node_choose_wield_item</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||||
<span class="c1"># same except using caller.equipment.get_wieldable_objects_from_backpack()</span>
|
||||
|
||||
</pre></div>
|
||||
|
|
@ -1259,7 +1249,7 @@ This is new compared to the base handler.</p>
|
|||
<section id="the-main-menu-node">
|
||||
<h3><span class="section-number">11.4.9. </span>The main menu node<a class="headerlink" href="#the-main-menu-node" title="Permalink to this headline">¶</a></h3>
|
||||
<p>This ties it all together.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
|
|
@ -1362,9 +1352,9 @@ This is new compared to the base handler.</p>
|
|||
<section id="attack-command">
|
||||
<h2><span class="section-number">11.5. </span>Attack Command<a class="headerlink" href="#attack-command" title="Permalink to this headline">¶</a></h2>
|
||||
<p>We will only need one single Command to run the Turnbased combat system. This is the <code class="docutils literal notranslate"><span class="pre">attack</span></code> command. Once you use it once, you will be in the menu.</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">Command</span><span class="p">,</span> <span class="n">CmdSet</span><span class="p">,</span> <span class="n">EvMenu</span>
|
||||
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">Command</span><span class="p">,</span> <span class="n">CmdSet</span><span class="p">,</span> <span class="n">EvMenu</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
|
||||
|
|
@ -1457,13 +1447,13 @@ This is new compared to the base handler.</p>
|
|||
<h2><span class="section-number">11.6. </span>Making sure the menu stops<a class="headerlink" href="#making-sure-the-menu-stops" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The combat can end for a bunch of reasons. When that happens, we must make sure to clean up the menu so we go back normal operation. We will add this to the <code class="docutils literal notranslate"><span class="pre">remove_combatant</span></code> method on the combat handler (we left a TODO there before):</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span>
|
||||
<span class="c1"># in evadventure/combat_turnbased.py</span>
|
||||
<span class="c1"># in evadventure/combat_turnbased.py </span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">EvadventureTurnbasedCombatHandler</span><span class="p">(</span><span class="n">EvAdventureCombatBaseHandler</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># ...</span>
|
||||
<span class="c1"># ... </span>
|
||||
<span class="k">def</span> <span class="nf">remove_combatant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">combatant</span><span class="p">):</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Remove a combatant from the battle.</span>
|
||||
|
|
@ -1471,7 +1461,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="bp">self</span><span class="o">.</span><span class="n">combatants</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">combatant</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||
<span class="c1"># clean up menu if it exists</span>
|
||||
<span class="k">if</span> <span class="n">combatant</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_evmenu</span><span class="p">:</span> <span class="c1"># <--- new</span>
|
||||
<span class="n">combatant</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_evmenu</span><span class="o">.</span><span class="n">close_menu</span><span class="p">()</span> <span class="c1"># ''</span>
|
||||
<span class="n">combatant</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_evmenu</span><span class="o">.</span><span class="n">close_menu</span><span class="p">()</span> <span class="c1"># '' </span>
|
||||
|
||||
</pre></div>
|
||||
</div>
|
||||
|
|
@ -1513,7 +1503,7 @@ This is new compared to the base handler.</p>
|
|||
<span class="c1">#</span>
|
||||
<span class="c1"># First add mygame/server/conf/settings.py:</span>
|
||||
<span class="c1">#</span>
|
||||
<span class="c1"># BASE_BATCHPROCESS_PATHS += ["evadventure.batchscripts"]</span>
|
||||
<span class="c1"># BASE_BATCH_PROCESS_PATHS += ["evadventure.batchscripts"]</span>
|
||||
<span class="c1">#</span>
|
||||
<span class="c1"># Run from in-game as `batchcode turnbased_combat_demo`</span>
|
||||
<span class="c1">#</span>
|
||||
|
|
@ -1572,7 +1562,7 @@ This is new compared to the base handler.</p>
|
|||
<p>If editing this in an IDE, you may get errors on the <code class="docutils literal notranslate"><span class="pre">player</span> <span class="pre">=</span> <span class="pre">caller</span></code> line. This is because <code class="docutils literal notranslate"><span class="pre">caller</span></code> is not defined anywhere in this file. Instead <code class="docutils literal notranslate"><span class="pre">caller</span></code> (the one running the script) is injected by the <code class="docutils literal notranslate"><span class="pre">batchcode</span></code> runner.</p>
|
||||
<p>But apart from the <code class="docutils literal notranslate"><span class="pre">#</span> <span class="pre">HEADER</span></code> and <code class="docutils literal notranslate"><span class="pre">#</span> <span class="pre">CODE</span></code> specials, this just a series of normal Evennia api calls.</p>
|
||||
<p>Log into the game with a developer/superuser account and run</p>
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>> batchcmd evadventure.batchscripts.turnbased_combat_demo
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>> batchcmd evadventure.batchscripts.turnbased_combat_demo
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This should place you in the arena with the dummy (if not, check for errors in the output! Use <code class="docutils literal notranslate"><span class="pre">objects</span></code> and <code class="docutils literal notranslate"><span class="pre">delete</span></code> commands to list and delete objects if you need to start over.)</p>
|
||||
|
|
@ -1607,15 +1597,12 @@ This is new compared to the base handler.</p>
|
|||
<a href="Beginner-Tutorial-Combat-Twitch.html" title="10. Twitch Combat"
|
||||
>previous</a> |</li>
|
||||
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 2.x</a> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../Howtos-Overview.html" >Tutorials and How-To’s</a> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../Howtos-Overview.html" >Tutorials and Howto’s</a> »</li>
|
||||
<li class="nav-item nav-item-2"><a href="../Beginner-Tutorial-Overview.html" >Beginner Tutorial</a> »</li>
|
||||
<li class="nav-item nav-item-3"><a href="Beginner-Tutorial-Part3-Overview.html" >Part 3: How We Get There (Example Game)</a> »</li>
|
||||
<li class="nav-item nav-item-3"><a href="Beginner-Tutorial-Part3-Overview.html" >Part 3: How we get there (example game)</a> »</li>
|
||||
<li class="nav-item nav-item-this"><a href=""><span class="section-number">11. </span>Turnbased Combat</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="footer" role="contentinfo">
|
||||
© Copyright 2023, The Evennia developer community.
|
||||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue