mirror of
https://github.com/evennia/evennia.git
synced 2026-04-02 05:57:16 +02:00
909 lines
No EOL
115 KiB
HTML
909 lines
No EOL
115 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>evennia.contrib.puzzles — Evennia 1.0-dev documentation</title>
|
|
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
|
|
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
|
|
<script src="../../../_static/jquery.js"></script>
|
|
<script src="../../../_static/underscore.js"></script>
|
|
<script src="../../../_static/doctools.js"></script>
|
|
<script src="../../../_static/language_data.js"></script>
|
|
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
|
|
<link rel="index" title="Index" href="../../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../../search.html" />
|
|
</head><body>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">evennia.contrib.puzzles</a></li>
|
|
</ul>
|
|
<div class="develop">develop branch</div>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for evennia.contrib.puzzles</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">Puzzles System - Provides a typeclass and commands for</span>
|
|
<span class="sd">objects that can be combined (i.e. 'use'd) to produce</span>
|
|
<span class="sd">new objects.</span>
|
|
|
|
<span class="sd">Evennia contribution - Henddher 2018</span>
|
|
|
|
<span class="sd">A Puzzle is a recipe of what objects (aka parts) must</span>
|
|
<span class="sd">be combined by a player so a new set of objects</span>
|
|
<span class="sd">(aka results) are automatically created.</span>
|
|
|
|
<span class="sd">Consider this simple Puzzle:</span>
|
|
|
|
<span class="sd"> orange, mango, yogurt, blender = fruit smoothie</span>
|
|
|
|
<span class="sd">As a Builder:</span>
|
|
|
|
<span class="sd"> @create/drop orange</span>
|
|
<span class="sd"> @create/drop mango</span>
|
|
<span class="sd"> @create/drop yogurt</span>
|
|
<span class="sd"> @create/drop blender</span>
|
|
<span class="sd"> @create/drop fruit smoothie</span>
|
|
|
|
<span class="sd"> @puzzle smoothie, orange, mango, yogurt, blender = fruit smoothie</span>
|
|
<span class="sd"> ...</span>
|
|
<span class="sd"> Puzzle smoothie(#1234) created successfuly.</span>
|
|
|
|
<span class="sd"> @destroy/force orange, mango, yogurt, blender, fruit smoothie</span>
|
|
|
|
<span class="sd"> @armpuzzle #1234</span>
|
|
<span class="sd"> Part orange is spawned at ...</span>
|
|
<span class="sd"> Part mango is spawned at ...</span>
|
|
<span class="sd"> ....</span>
|
|
<span class="sd"> Puzzle smoothie(#1234) has been armed successfully</span>
|
|
|
|
<span class="sd">As Player:</span>
|
|
|
|
<span class="sd"> use orange, mango, yogurt, blender</span>
|
|
<span class="sd"> ...</span>
|
|
<span class="sd"> Genius, you blended all fruits to create a fruit smoothie!</span>
|
|
|
|
<span class="sd">Details:</span>
|
|
|
|
<span class="sd">Puzzles are created from existing objects. The given</span>
|
|
<span class="sd">objects are introspected to create prototypes for the</span>
|
|
<span class="sd">puzzle parts and results. These prototypes become the</span>
|
|
<span class="sd">puzzle recipe. (See PuzzleRecipe and @puzzle</span>
|
|
<span class="sd">command). Once the recipe is created, all parts and result</span>
|
|
<span class="sd">can be disposed (i.e. destroyed).</span>
|
|
|
|
<span class="sd">At a later time, a Builder or a Script can arm the puzzle</span>
|
|
<span class="sd">and spawn all puzzle parts in their respective</span>
|
|
<span class="sd">locations (See @armpuzzle).</span>
|
|
|
|
<span class="sd">A regular player can collect the puzzle parts and combine</span>
|
|
<span class="sd">them (See use command). If player has specified</span>
|
|
<span class="sd">all pieces, the puzzle is considered solved and all</span>
|
|
<span class="sd">its puzzle parts are destroyed while the puzzle results</span>
|
|
<span class="sd">are spawened on their corresponding location.</span>
|
|
|
|
<span class="sd">Installation:</span>
|
|
|
|
<span class="sd">Add the PuzzleSystemCmdSet to all players.</span>
|
|
<span class="sd">Alternatively:</span>
|
|
|
|
<span class="sd"> @py self.cmdset.add('evennia.contrib.puzzles.PuzzleSystemCmdSet')</span>
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">itertools</span>
|
|
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">choice</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">create_script</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">CmdSet</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultScript</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultCharacter</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultRoom</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultExit</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.commands.default.muxcommand</span> <span class="kn">import</span> <span class="n">MuxCommand</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">inherits_from</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">search</span><span class="p">,</span> <span class="n">utils</span><span class="p">,</span> <span class="n">logger</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.prototypes.spawner</span> <span class="kn">import</span> <span class="n">spawn</span>
|
|
|
|
<span class="c1"># Tag used by puzzles</span>
|
|
<span class="n">_PUZZLES_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">"puzzles"</span>
|
|
<span class="n">_PUZZLES_TAG_RECIPE</span> <span class="o">=</span> <span class="s2">"puzzle_recipe"</span>
|
|
<span class="c1"># puzzle part and puzzle result</span>
|
|
<span class="n">_PUZZLES_TAG_MEMBER</span> <span class="o">=</span> <span class="s2">"puzzle_member"</span>
|
|
|
|
<span class="n">_PUZZLE_DEFAULT_FAIL_USE_MESSAGE</span> <span class="o">=</span> <span class="s2">"You try to utilize </span><span class="si">%s</span><span class="s2"> but nothing happens ... something amiss?"</span>
|
|
<span class="n">_PUZZLE_DEFAULT_SUCCESS_USE_MESSAGE</span> <span class="o">=</span> <span class="s2">"You are a Genius!!!"</span>
|
|
<span class="n">_PUZZLE_DEFAULT_SUCCESS_USE_LOCATION_MESSAGE</span> <span class="o">=</span> <span class="s2">"|c</span><span class="si">{caller}</span><span class="s2">|n performs some kind of tribal dance and |y</span><span class="si">{result_names}</span><span class="s2">|n seems to appear from thin air"</span>
|
|
|
|
<span class="c1"># ----------- UTILITY FUNCTIONS ------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="proto_def"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.proto_def">[docs]</a><span class="k">def</span> <span class="nf">proto_def</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">with_tags</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Basic properties needed to spawn</span>
|
|
<span class="sd"> and compare recipe with candidate part</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">protodef</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="c1"># TODO: Don't we need to honor ALL properties? attributes, contents, etc.</span>
|
|
<span class="s2">"prototype_key"</span><span class="p">:</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">dbref</span><span class="p">),</span>
|
|
<span class="s2">"key"</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
|
|
<span class="s2">"typeclass"</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">typeclass_path</span><span class="p">,</span>
|
|
<span class="s2">"desc"</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">,</span>
|
|
<span class="s2">"location"</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="p">,</span>
|
|
<span class="s2">"home"</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">home</span><span class="p">,</span>
|
|
<span class="s2">"locks"</span><span class="p">:</span> <span class="s2">";"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">all</span><span class="p">()),</span>
|
|
<span class="s2">"permissions"</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">all</span><span class="p">()[:],</span>
|
|
<span class="p">}</span>
|
|
<span class="k">if</span> <span class="n">with_tags</span><span class="p">:</span>
|
|
<span class="n">tags</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_key_and_category</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">tags</span> <span class="o">=</span> <span class="p">[(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">]</span>
|
|
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">_PUZZLES_TAG_MEMBER</span><span class="p">,</span> <span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
|
|
<span class="n">protodef</span><span class="p">[</span><span class="s2">"tags"</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span>
|
|
<span class="k">return</span> <span class="n">protodef</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="maskout_protodef"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.maskout_protodef">[docs]</a><span class="k">def</span> <span class="nf">maskout_protodef</span><span class="p">(</span><span class="n">protodef</span><span class="p">,</span> <span class="n">mask</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Returns a new protodef after removing protodef values based on mask</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">protodef</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">protodef</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">mask</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">protodef</span><span class="p">:</span>
|
|
<span class="n">protodef</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">protodef</span></div>
|
|
|
|
|
|
<span class="c1"># Colorize the default success message</span>
|
|
<span class="k">def</span> <span class="nf">_colorize_message</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
|
|
<span class="n">_i</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">_colors</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"|r"</span><span class="p">,</span> <span class="s2">"|g"</span><span class="p">,</span> <span class="s2">"|y"</span><span class="p">]</span>
|
|
<span class="n">_msg</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">msg</span><span class="p">:</span>
|
|
<span class="n">_msg</span> <span class="o">+=</span> <span class="n">_colors</span><span class="p">[</span><span class="n">_i</span><span class="p">]</span> <span class="o">+</span> <span class="n">l</span>
|
|
<span class="n">_i</span> <span class="o">=</span> <span class="p">(</span><span class="n">_i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">_colors</span><span class="p">)</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"|n"</span>
|
|
<span class="k">return</span> <span class="n">msg</span>
|
|
|
|
|
|
<span class="n">_PUZZLE_DEFAULT_SUCCESS_USE_MESSAGE</span> <span class="o">=</span> <span class="n">_colorize_message</span><span class="p">(</span><span class="n">_PUZZLE_DEFAULT_SUCCESS_USE_MESSAGE</span><span class="p">)</span>
|
|
|
|
<span class="c1"># ------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="PuzzleRecipe"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.PuzzleRecipe">[docs]</a><span class="k">class</span> <span class="nc">PuzzleRecipe</span><span class="p">(</span><span class="n">DefaultScript</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Definition of a Puzzle Recipe</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="PuzzleRecipe.save_recipe"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.PuzzleRecipe.save_recipe">[docs]</a> <span class="k">def</span> <span class="nf">save_recipe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">puzzle_name</span><span class="p">,</span> <span class="n">parts</span><span class="p">,</span> <span class="n">results</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">puzzle_name</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">_PUZZLES_TAG_RECIPE</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_message</span> <span class="o">=</span> <span class="n">_PUZZLE_DEFAULT_SUCCESS_USE_MESSAGE</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_location_message</span> <span class="o">=</span> <span class="n">_PUZZLE_DEFAULT_SUCCESS_USE_LOCATION_MESSAGE</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdCreatePuzzleRecipe"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdCreatePuzzleRecipe">[docs]</a><span class="k">class</span> <span class="nc">CmdCreatePuzzleRecipe</span><span class="p">(</span><span class="n">MuxCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Creates a puzzle recipe. A puzzle consists of puzzle-parts that</span>
|
|
<span class="sd"> the player can 'use' together to create a specified result.</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> @puzzle name,<part1[,part2,...>] = <result1[,result2,...]></span>
|
|
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> create/drop balloon</span>
|
|
<span class="sd"> create/drop glass of water</span>
|
|
<span class="sd"> create/drop water balloon</span>
|
|
<span class="sd"> @puzzle waterballon,balloon,glass of water = water balloon</span>
|
|
<span class="sd"> @del ballon, glass of water, water balloon</span>
|
|
<span class="sd"> @armpuzzle #1</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> Each part and result are objects that must (temporarily) exist and be placed in their</span>
|
|
<span class="sd"> corresponding location in order to create the puzzle. After the creation of the puzzle,</span>
|
|
<span class="sd"> these objects are not needed anymore and can be deleted. Components of the puzzle</span>
|
|
<span class="sd"> will be re-created by use of the `@armpuzzle` command later.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"@puzzle"</span>
|
|
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">"@puzzlerecipe"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:perm(puzzle) or perm(Builder)"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Puzzles"</span>
|
|
|
|
<span class="n">confirm</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">default_confirm</span> <span class="o">=</span> <span class="s2">"no"</span>
|
|
|
|
<div class="viewcode-block" id="CmdCreatePuzzleRecipe.func"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdCreatePuzzleRecipe.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">)</span> <span class="o"><</span> <span class="mi">2</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="s2">"Usage: @puzzle name,<part1[,...]> = <result1[,...]>"</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzle_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">puzzle_name</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Invalid puzzle name </span><span class="si">%r</span><span class="s2">."</span> <span class="o">%</span> <span class="n">puzzle_name</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="c1"># if there is another puzzle with same name</span>
|
|
<span class="c1"># warn user that parts and results will be</span>
|
|
<span class="c1"># interchangable</span>
|
|
<span class="n">_puzzles</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_script_attribute</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">"puzzle_name"</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">puzzle_name</span><span class="p">)</span>
|
|
<span class="n">_puzzles</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">PuzzleRecipe</span><span class="p">),</span> <span class="n">_puzzles</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">_puzzles</span><span class="p">:</span>
|
|
<span class="n">confirm</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s2">"There are </span><span class="si">%d</span><span class="s2"> puzzles with the same name.</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">_puzzles</span><span class="p">)</span>
|
|
<span class="o">+</span> <span class="s2">"Its parts and results will be interchangeable.</span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="o">+</span> <span class="s2">"Continue yes/[no]? "</span>
|
|
<span class="p">)</span>
|
|
<span class="n">answer</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="k">while</span> <span class="n">answer</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"y"</span><span class="p">,</span> <span class="s2">"yes"</span><span class="p">,</span> <span class="s2">"n"</span><span class="p">,</span> <span class="s2">"no"</span><span class="p">):</span>
|
|
<span class="n">answer</span> <span class="o">=</span> <span class="k">yield</span> <span class="p">(</span><span class="n">confirm</span><span class="p">)</span>
|
|
<span class="n">answer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_confirm</span> <span class="k">if</span> <span class="n">answer</span> <span class="o">==</span> <span class="s2">""</span> <span class="k">else</span> <span class="n">answer</span>
|
|
<span class="k">if</span> <span class="n">answer</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"n"</span><span class="p">,</span> <span class="s2">"no"</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Cancelled: no puzzle created."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">def</span> <span class="nf">is_valid_obj_location</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="n">valid</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="c1"># Rooms are the only valid locations.</span>
|
|
<span class="c1"># TODO: other valid locations could be added here.</span>
|
|
<span class="c1"># Certain locations can be handled accordingly: e.g,</span>
|
|
<span class="c1"># a part is located in a character's inventory,</span>
|
|
<span class="c1"># perhaps will translate into the player character</span>
|
|
<span class="c1"># having the part in his/her inventory while being</span>
|
|
<span class="c1"># located in the same room where the builder was</span>
|
|
<span class="c1"># located.</span>
|
|
<span class="c1"># Parts and results may have different valid locations</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">DefaultRoom</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Invalid location for </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
|
|
<span class="n">valid</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="n">valid</span>
|
|
|
|
<span class="k">def</span> <span class="nf">is_valid_part_location</span><span class="p">(</span><span class="n">part</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">is_valid_obj_location</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">is_valid_result_location</span><span class="p">(</span><span class="n">part</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">is_valid_obj_location</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">is_valid_inheritance</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="n">valid</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="ow">not</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">DefaultCharacter</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="ow">not</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">DefaultRoom</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="ow">not</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">DefaultExit</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">valid</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Invalid typeclass for </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">valid</span>
|
|
|
|
<span class="k">def</span> <span class="nf">is_valid_part</span><span class="p">(</span><span class="n">part</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">is_valid_inheritance</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_valid_part_location</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">is_valid_result</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">is_valid_inheritance</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_valid_result_location</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
|
|
|
|
<span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">objname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_valid_part</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span>
|
|
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
|
|
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">objname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhslist</span><span class="p">:</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_valid_result</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span>
|
|
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Part </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">part</span><span class="o">.</span><span class="n">dbref</span><span class="p">))</span>
|
|
|
|
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Result </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">dbref</span><span class="p">))</span>
|
|
|
|
<span class="n">proto_parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">proto_def</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">]</span>
|
|
<span class="n">proto_results</span> <span class="o">=</span> <span class="p">[</span><span class="n">proto_def</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">results</span><span class="p">]</span>
|
|
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">create_script</span><span class="p">(</span><span class="n">PuzzleRecipe</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="n">persistent</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">save_recipe</span><span class="p">(</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="n">proto_parts</span><span class="p">,</span> <span class="n">proto_results</span><span class="p">)</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"control:id(</span><span class="si">%s</span><span class="s2">) or perm(Builder)"</span> <span class="o">%</span> <span class="n">caller</span><span class="o">.</span><span class="n">dbref</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
|
|
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"Puzzle |y'</span><span class="si">%s</span><span class="s2">' |w</span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)|n has been created |gsuccessfully|n."</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"You may now dispose of all parts and results. </span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="s2">"Use @puzzleedit #</span><span class="si">{dbref}</span><span class="s2"> to customize this puzzle further. </span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="s2">"Use @armpuzzle #</span><span class="si">{dbref}</span><span class="s2"> to arm a new puzzle instance."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dbref</span><span class="o">=</span><span class="n">puzzle</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
|
|
<span class="p">)</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdEditPuzzle"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdEditPuzzle">[docs]</a><span class="k">class</span> <span class="nc">CmdEditPuzzle</span><span class="p">(</span><span class="n">MuxCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Edits puzzle properties</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> @puzzleedit[/delete] <#dbref></span>
|
|
<span class="sd"> @puzzleedit <#dbref>/use_success_message = <Custom message></span>
|
|
<span class="sd"> @puzzleedit <#dbref>/use_success_location_message = <Custom message from {caller} producing {result_names}></span>
|
|
<span class="sd"> @puzzleedit <#dbref>/mask = attr1[,attr2,...]></span>
|
|
<span class="sd"> @puzzleedit[/addpart] <#dbref> = <obj[,obj2,...]></span>
|
|
<span class="sd"> @puzzleedit[/delpart] <#dbref> = <obj[,obj2,...]></span>
|
|
<span class="sd"> @puzzleedit[/addresult] <#dbref> = <obj[,obj2,...]></span>
|
|
<span class="sd"> @puzzleedit[/delresult] <#dbref> = <obj[,obj2,...]></span>
|
|
|
|
<span class="sd"> Switches:</span>
|
|
<span class="sd"> addpart - adds parts to the puzzle</span>
|
|
<span class="sd"> delpart - removes parts from the puzzle</span>
|
|
<span class="sd"> addresult - adds results to the puzzle</span>
|
|
<span class="sd"> delresult - removes results from the puzzle</span>
|
|
<span class="sd"> delete - deletes the recipe. Existing parts and results aren't modified</span>
|
|
|
|
<span class="sd"> mask - attributes to exclude during matching (e.g. location, desc, etc.)</span>
|
|
<span class="sd"> use_success_location_message containing {result_names} and {caller} will</span>
|
|
<span class="sd"> automatically be replaced with correct values. Both are optional.</span>
|
|
|
|
<span class="sd"> When removing parts/results, it's possible to remove all.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"@puzzleedit"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:perm(puzzleedit) or perm(Builder)"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Puzzles"</span>
|
|
|
|
<div class="viewcode-block" id="CmdEditPuzzle.func"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdEditPuzzle.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_USAGE</span> <span class="o">=</span> <span class="s2">"Usage: @puzzleedit[/switches] <dbref>[/attribute = <value>]"</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_USAGE</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="s2">"/"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
|
|
<span class="n">recipe_dbref</span><span class="p">,</span> <span class="n">attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"/"</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">recipe_dbref</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">utils</span><span class="o">.</span><span class="n">dbref</span><span class="p">(</span><span class="n">recipe_dbref</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"A puzzle recipe's #dbref must be specified.</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_USAGE</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_script</span><span class="p">(</span><span class="n">recipe_dbref</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">puzzle</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">puzzle</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">PuzzleRecipe</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">) is not a puzzle"</span> <span class="o">%</span> <span class="p">(</span><span class="n">puzzle</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">recipe_dbref</span><span class="p">))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">puzzle</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">puzzle_name_id</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="s2">"delete"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">"control"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">"delete"</span><span class="p">)):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You don't have permission to delete </span><span class="si">%s</span><span class="s2">."</span> <span class="o">%</span> <span class="n">puzzle_name_id</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> was deleted"</span> <span class="o">%</span> <span class="n">puzzle_name_id</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">elif</span> <span class="s2">"addpart"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
|
|
<span class="n">objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_objs</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">objs</span><span class="p">:</span>
|
|
<span class="n">added</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_parts</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> were added to parts"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">added</span><span class="p">)))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">elif</span> <span class="s2">"delpart"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
|
|
<span class="n">objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_objs</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">objs</span><span class="p">:</span>
|
|
<span class="n">removed</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_remove_parts</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> were removed from parts"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">removed</span><span class="p">)))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">elif</span> <span class="s2">"addresult"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
|
|
<span class="n">objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_objs</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">objs</span><span class="p">:</span>
|
|
<span class="n">added</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_results</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> were added to results"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">added</span><span class="p">)))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">elif</span> <span class="s2">"delresult"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
|
|
<span class="n">objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_objs</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">objs</span><span class="p">:</span>
|
|
<span class="n">removed</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_remove_results</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> were removed from results"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">removed</span><span class="p">)))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># edit attributes</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">"control"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">"edit"</span><span class="p">)):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You don't have permission to edit </span><span class="si">%s</span><span class="s2">."</span> <span class="o">%</span> <span class="n">puzzle_name_id</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="s2">"use_success_message"</span><span class="p">:</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"</span><span class="si">%s</span><span class="s2"> use_success_message = </span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">puzzle_name_id</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_message</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">elif</span> <span class="n">attr</span> <span class="o">==</span> <span class="s2">"use_success_location_message"</span><span class="p">:</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_location_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"</span><span class="si">%s</span><span class="s2"> use_success_location_message = </span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">puzzle_name_id</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_location_message</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">elif</span> <span class="n">attr</span> <span class="o">==</span> <span class="s2">"mask"</span><span class="p">:</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhslist</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> mask = </span><span class="si">%r</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">puzzle_name_id</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">mask</span><span class="p">))</span>
|
|
<span class="k">return</span></div>
|
|
|
|
<span class="k">def</span> <span class="nf">_get_objs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhslist</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_USAGE</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="n">objs</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhslist</span><span class="p">:</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">o</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">obj</span><span class="p">:</span>
|
|
<span class="n">objs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">objs</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_add_objs_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">,</span> <span class="n">to</span><span class="p">):</span>
|
|
<span class="sd">"""Adds propto objs to the given set (parts or results)"""</span>
|
|
<span class="n">added</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">toobjs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">to</span><span class="p">[:])</span>
|
|
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span>
|
|
<span class="n">protoobj</span> <span class="o">=</span> <span class="n">proto_def</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="n">toobjs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">protoobj</span><span class="p">)</span>
|
|
<span class="n">added</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">added</span><span class="p">,</span> <span class="n">toobjs</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_remove_objs_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">,</span> <span class="n">frm</span><span class="p">):</span>
|
|
<span class="sd">"""Removes propto objs from the given set (parts or results)"""</span>
|
|
<span class="n">removed</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">fromobjs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">frm</span><span class="p">[:])</span>
|
|
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span>
|
|
<span class="n">protoobj</span> <span class="o">=</span> <span class="n">proto_def</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">protoobj</span> <span class="ow">in</span> <span class="n">fromobjs</span><span class="p">:</span>
|
|
<span class="n">fromobjs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">protoobj</span><span class="p">)</span>
|
|
<span class="n">removed</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">removed</span><span class="p">,</span> <span class="n">fromobjs</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_add_parts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">):</span>
|
|
<span class="n">added</span><span class="p">,</span> <span class="n">toobjs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_objs_to</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span><span class="p">)</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">toobjs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">added</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_remove_parts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">):</span>
|
|
<span class="n">removed</span><span class="p">,</span> <span class="n">fromobjs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_remove_objs_from</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span><span class="p">)</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">fromobjs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">removed</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_add_results</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">):</span>
|
|
<span class="n">added</span><span class="p">,</span> <span class="n">toobjs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_objs_to</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span><span class="p">)</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">toobjs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">added</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_remove_results</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">):</span>
|
|
<span class="n">removed</span><span class="p">,</span> <span class="n">fromobjs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_remove_objs_from</span><span class="p">(</span><span class="n">objs</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span><span class="p">)</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">fromobjs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">removed</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdArmPuzzle"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdArmPuzzle">[docs]</a><span class="k">class</span> <span class="nc">CmdArmPuzzle</span><span class="p">(</span><span class="n">MuxCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Arms a puzzle by spawning all its parts.</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> @armpuzzle <puzzle #dbref></span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> Create puzzles with `@puzzle`; get list of</span>
|
|
<span class="sd"> defined puzzles using `@lspuzzlerecipes`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"@armpuzzle"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:perm(armpuzzle) or perm(Builder)"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Puzzles"</span>
|
|
|
|
<div class="viewcode-block" id="CmdArmPuzzle.func"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdArmPuzzle.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">utils</span><span class="o">.</span><span class="n">dbref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"A puzzle recipe's #dbref must be specified"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_script</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">puzzle</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">puzzle</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">PuzzleRecipe</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Invalid puzzle </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">puzzle</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"Puzzle Recipe </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">) '</span><span class="si">%s</span><span class="s2">' found.</span><span class="se">\n</span><span class="s2">Spawning </span><span class="si">%d</span><span class="s2"> parts ..."</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span><span class="p">))</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">proto_part</span> <span class="ow">in</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span><span class="p">:</span>
|
|
<span class="n">part</span> <span class="o">=</span> <span class="n">spawn</span><span class="p">(</span><span class="n">proto_part</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"Part </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">) spawned and placed at </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">part</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span> <span class="n">part</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">part</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="n">part</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">)</span>
|
|
<span class="n">part</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span> <span class="o">=</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span>
|
|
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Puzzle armed |gsuccessfully|n."</span><span class="p">)</span></div></div>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_lookups_parts_puzzlenames_protodefs</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span>
|
|
<span class="c1"># Create lookup dicts by part's dbref and by puzzle_name(tags)</span>
|
|
<span class="n">parts_dict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
|
<span class="n">puzzlename_tags_dict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
|
<span class="n">puzzle_ingredients</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
|
|
<span class="n">parts_dict</span><span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">dbref</span><span class="p">]</span> <span class="o">=</span> <span class="n">part</span>
|
|
<span class="n">protodef</span> <span class="o">=</span> <span class="n">proto_def</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">with_tags</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
<span class="c1"># remove 'prototype_key' as it will prevent equality</span>
|
|
<span class="k">del</span> <span class="n">protodef</span><span class="p">[</span><span class="s2">"prototype_key"</span><span class="p">]</span>
|
|
<span class="n">puzzle_ingredients</span><span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">dbref</span><span class="p">]</span> <span class="o">=</span> <span class="n">protodef</span>
|
|
<span class="n">tags_categories</span> <span class="o">=</span> <span class="n">part</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_key_and_category</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">tags_categories</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">category</span> <span class="o">!=</span> <span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">puzzlename_tags_dict</span><span class="p">:</span>
|
|
<span class="n">puzzlename_tags_dict</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">puzzlename_tags_dict</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">parts_dict</span><span class="p">,</span> <span class="n">puzzlename_tags_dict</span><span class="p">,</span> <span class="n">puzzle_ingredients</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_puzzles_by_names</span><span class="p">(</span><span class="n">names</span><span class="p">):</span>
|
|
<span class="c1"># Find all puzzles by puzzle name (i.e. tag name)</span>
|
|
<span class="n">puzzles</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">puzzle_name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
|
|
<span class="n">_puzzles</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_script_attribute</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">"puzzle_name"</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">puzzle_name</span><span class="p">)</span>
|
|
<span class="n">_puzzles</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">PuzzleRecipe</span><span class="p">),</span> <span class="n">_puzzles</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_puzzles</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">puzzles</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">_puzzles</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">puzzles</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_matching_puzzles</span><span class="p">(</span><span class="n">puzzles</span><span class="p">,</span> <span class="n">puzzlename_tags_dict</span><span class="p">,</span> <span class="n">puzzle_ingredients</span><span class="p">):</span>
|
|
<span class="c1"># Check if parts can be combined to solve a puzzle</span>
|
|
<span class="n">matched_puzzles</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">puzzle</span> <span class="ow">in</span> <span class="n">puzzles</span><span class="p">:</span>
|
|
<span class="n">puzzle_protoparts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span><span class="p">[:])</span>
|
|
<span class="n">puzzle_mask</span> <span class="o">=</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">mask</span><span class="p">[:]</span>
|
|
<span class="c1"># remove tags and prototype_key as they prevent equality</span>
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">puzzle_protopart</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">puzzle_protoparts</span><span class="p">[:]):</span>
|
|
<span class="k">del</span> <span class="n">puzzle_protopart</span><span class="p">[</span><span class="s2">"tags"</span><span class="p">]</span>
|
|
<span class="k">del</span> <span class="n">puzzle_protopart</span><span class="p">[</span><span class="s2">"prototype_key"</span><span class="p">]</span>
|
|
<span class="n">puzzle_protopart</span> <span class="o">=</span> <span class="n">maskout_protodef</span><span class="p">(</span><span class="n">puzzle_protopart</span><span class="p">,</span> <span class="n">puzzle_mask</span><span class="p">)</span>
|
|
<span class="n">puzzle_protoparts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">puzzle_protopart</span>
|
|
|
|
<span class="n">matched_dbrefparts</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">parts_dbrefs</span> <span class="o">=</span> <span class="n">puzzlename_tags_dict</span><span class="p">[</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">]</span>
|
|
<span class="k">for</span> <span class="n">part_dbref</span> <span class="ow">in</span> <span class="n">parts_dbrefs</span><span class="p">:</span>
|
|
<span class="n">protopart</span> <span class="o">=</span> <span class="n">puzzle_ingredients</span><span class="p">[</span><span class="n">part_dbref</span><span class="p">]</span>
|
|
<span class="n">protopart</span> <span class="o">=</span> <span class="n">maskout_protodef</span><span class="p">(</span><span class="n">protopart</span><span class="p">,</span> <span class="n">puzzle_mask</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">protopart</span> <span class="ow">in</span> <span class="n">puzzle_protoparts</span><span class="p">:</span>
|
|
<span class="n">puzzle_protoparts</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">protopart</span><span class="p">)</span>
|
|
<span class="n">matched_dbrefparts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part_dbref</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">puzzle_protoparts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">matched_puzzles</span><span class="p">[</span><span class="n">puzzle</span><span class="o">.</span><span class="n">dbref</span><span class="p">]</span> <span class="o">=</span> <span class="n">matched_dbrefparts</span>
|
|
<span class="k">return</span> <span class="n">matched_puzzles</span>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdUsePuzzleParts"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdUsePuzzleParts">[docs]</a><span class="k">class</span> <span class="nc">CmdUsePuzzleParts</span><span class="p">(</span><span class="n">MuxCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Use an object, or a group of objects at once.</span>
|
|
|
|
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> You look around you and see a pole, a long string, and a needle.</span>
|
|
|
|
<span class="sd"> use pole, long string, needle</span>
|
|
|
|
<span class="sd"> Genius! You built a fishing pole.</span>
|
|
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> use <obj1> [,obj2,...]</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># Technical explanation</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Searches for all puzzles whose parts match the given set of objects. If there are matching</span>
|
|
<span class="sd"> puzzles, the result objects are spawned in their corresponding location if all parts have been</span>
|
|
<span class="sd"> passed in.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"use"</span>
|
|
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">"combine"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:pperm(use) or pperm(Player)"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Puzzles"</span>
|
|
|
|
<div class="viewcode-block" id="CmdUsePuzzleParts.func"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdUsePuzzleParts.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Use what?"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">many</span> <span class="o">=</span> <span class="s2">"these"</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">"this"</span>
|
|
|
|
<span class="c1"># either all are parts, or abort finding matching puzzles</span>
|
|
<span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">partnames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">[:]</span>
|
|
<span class="k">for</span> <span class="n">partname</span> <span class="ow">in</span> <span class="n">partnames</span><span class="p">:</span>
|
|
<span class="n">part</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span>
|
|
<span class="n">partname</span><span class="p">,</span>
|
|
<span class="n">multimatch_string</span><span class="o">=</span><span class="s2">"Which </span><span class="si">%s</span><span class="s2">. There are many.</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">partname</span><span class="p">),</span>
|
|
<span class="n">nofound_string</span><span class="o">=</span><span class="s2">"There is no </span><span class="si">%s</span><span class="s2"> around."</span> <span class="o">%</span> <span class="p">(</span><span class="n">partname</span><span class="p">),</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">part</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">part</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">_PUZZLES_TAG_MEMBER</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">):</span>
|
|
|
|
<span class="c1"># not a puzzle part ... abort</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You have no idea how </span><span class="si">%s</span><span class="s2"> can be used"</span> <span class="o">%</span> <span class="p">(</span><span class="n">many</span><span class="p">))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="c1"># a valid part</span>
|
|
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Create lookup dicts by part's dbref and by puzzle_name(tags)</span>
|
|
<span class="n">parts_dict</span><span class="p">,</span> <span class="n">puzzlename_tags_dict</span><span class="p">,</span> <span class="n">puzzle_ingredients</span> <span class="o">=</span> <span class="n">_lookups_parts_puzzlenames_protodefs</span><span class="p">(</span>
|
|
<span class="n">parts</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># Find all puzzles by puzzle name (i.e. tag name)</span>
|
|
<span class="n">puzzles</span> <span class="o">=</span> <span class="n">_puzzles_by_names</span><span class="p">(</span><span class="n">puzzlename_tags_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
|
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="s2">"PUZZLES </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">([(</span><span class="n">p</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">puzzles</span><span class="p">]))</span>
|
|
|
|
<span class="c1"># Create lookup dict of puzzles by dbref</span>
|
|
<span class="n">puzzles_dict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">puzzle</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span> <span class="n">puzzle</span><span class="p">)</span> <span class="k">for</span> <span class="n">puzzle</span> <span class="ow">in</span> <span class="n">puzzles</span><span class="p">)</span>
|
|
<span class="c1"># Check if parts can be combined to solve a puzzle</span>
|
|
<span class="n">matched_puzzles</span> <span class="o">=</span> <span class="n">_matching_puzzles</span><span class="p">(</span><span class="n">puzzles</span><span class="p">,</span> <span class="n">puzzlename_tags_dict</span><span class="p">,</span> <span class="n">puzzle_ingredients</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">matched_puzzles</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># TODO: we could use part.fail_message instead, if there was one</span>
|
|
<span class="c1"># random part falls and lands on your feet</span>
|
|
<span class="c1"># random part hits you square on the face</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_PUZZLE_DEFAULT_FAIL_USE_MESSAGE</span> <span class="o">%</span> <span class="p">(</span><span class="n">many</span><span class="p">))</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">puzzletuples</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">matched_puzzles</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">t</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="s2">"MATCHED PUZZLES </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">puzzletuples</span><span class="p">))</span>
|
|
|
|
<span class="c1"># sort all matched puzzles and pick largest one(s)</span>
|
|
<span class="n">puzzledbref</span><span class="p">,</span> <span class="n">matched_dbrefparts</span> <span class="o">=</span> <span class="n">puzzletuples</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">nparts</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matched_dbrefparts</span><span class="p">)</span>
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">puzzles_dict</span><span class="p">[</span><span class="n">puzzledbref</span><span class="p">]</span>
|
|
<span class="n">largest_puzzles</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">itertools</span><span class="o">.</span><span class="n">takewhile</span><span class="p">(</span><span class="k">lambda</span> <span class="n">t</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="n">nparts</span><span class="p">,</span> <span class="n">puzzletuples</span><span class="p">))</span>
|
|
|
|
<span class="c1"># if there are more than one, choose one at random.</span>
|
|
<span class="c1"># we could show the names of all those that can be resolved</span>
|
|
<span class="c1"># but that would give away that there are other puzzles that</span>
|
|
<span class="c1"># can be resolved with the same parts.</span>
|
|
<span class="c1"># just hint how many.</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">largest_puzzles</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"Your gears start turning and </span><span class="si">%d</span><span class="s2"> different ideas come to your mind ...</span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">largest_puzzles</span><span class="p">))</span>
|
|
<span class="p">)</span>
|
|
<span class="n">puzzletuple</span> <span class="o">=</span> <span class="n">choice</span><span class="p">(</span><span class="n">largest_puzzles</span><span class="p">)</span>
|
|
<span class="n">puzzle</span> <span class="o">=</span> <span class="n">puzzles_dict</span><span class="p">[</span><span class="n">puzzletuple</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You try </span><span class="si">%s</span><span class="s2"> ..."</span> <span class="o">%</span> <span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">))</span>
|
|
|
|
<span class="c1"># got one, spawn its results</span>
|
|
<span class="n">result_names</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">proto_result</span> <span class="ow">in</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">spawn</span><span class="p">(</span><span class="n">proto_result</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">)</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span> <span class="o">=</span> <span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span>
|
|
<span class="n">result_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Destroy all parts used</span>
|
|
<span class="k">for</span> <span class="n">dbref</span> <span class="ow">in</span> <span class="n">matched_dbrefparts</span><span class="p">:</span>
|
|
<span class="n">parts_dict</span><span class="p">[</span><span class="n">dbref</span><span class="p">]</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
|
|
|
|
<span class="n">result_names</span> <span class="o">=</span> <span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result_names</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_message</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">msg_contents</span><span class="p">(</span>
|
|
<span class="n">puzzle</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_location_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">result_names</span><span class="o">=</span><span class="n">result_names</span><span class="p">),</span>
|
|
<span class="n">exclude</span><span class="o">=</span><span class="p">(</span><span class="n">caller</span><span class="p">,),</span>
|
|
<span class="p">)</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdListPuzzleRecipes"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdListPuzzleRecipes">[docs]</a><span class="k">class</span> <span class="nc">CmdListPuzzleRecipes</span><span class="p">(</span><span class="n">MuxCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Searches for all puzzle recipes</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> @lspuzzlerecipes</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"@lspuzzlerecipes"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:perm(lspuzzlerecipes) or perm(Builder)"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Puzzles"</span>
|
|
|
|
<div class="viewcode-block" id="CmdListPuzzleRecipes.func"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdListPuzzleRecipes.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="n">recipes</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_script_tag</span><span class="p">(</span><span class="n">_PUZZLES_TAG_RECIPE</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">)</span>
|
|
|
|
<span class="n">div</span> <span class="o">=</span> <span class="s2">"-"</span> <span class="o">*</span> <span class="mi">60</span>
|
|
<span class="n">text</span> <span class="o">=</span> <span class="p">[</span><span class="n">div</span><span class="p">]</span>
|
|
<span class="n">msgf_recipe</span> <span class="o">=</span> <span class="s2">"Puzzle |y'</span><span class="si">%s</span><span class="s2">' </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)|n"</span>
|
|
<span class="n">msgf_item</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%2s</span><span class="s2">|c</span><span class="si">%15s</span><span class="s2">|n: |w</span><span class="si">%s</span><span class="s2">|n"</span>
|
|
<span class="k">for</span> <span class="n">recipe</span> <span class="ow">in</span> <span class="n">recipes</span><span class="p">:</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">msgf_recipe</span> <span class="o">%</span> <span class="p">(</span><span class="n">recipe</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">,</span> <span class="n">recipe</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">recipe</span><span class="o">.</span><span class="n">dbref</span><span class="p">))</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"Success Caller message:</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="n">recipe</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_message</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="s2">"Success Location message:</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="n">recipe</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">use_success_location_message</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
<span class="p">)</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"Mask:</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">recipe</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">mask</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"Parts"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">protopart</span> <span class="ow">in</span> <span class="n">recipe</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">parts</span><span class="p">[:]:</span>
|
|
<span class="n">mark</span> <span class="o">=</span> <span class="s2">"-"</span>
|
|
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">protopart</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">msgf_item</span> <span class="o">%</span> <span class="p">(</span><span class="n">mark</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>
|
|
<span class="n">mark</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"Results"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">protoresult</span> <span class="ow">in</span> <span class="n">recipe</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">results</span><span class="p">[:]:</span>
|
|
<span class="n">mark</span> <span class="o">=</span> <span class="s2">"-"</span>
|
|
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">protoresult</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">msgf_item</span> <span class="o">%</span> <span class="p">(</span><span class="n">mark</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>
|
|
<span class="n">mark</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">div</span><span class="p">)</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"Found |r</span><span class="si">%d</span><span class="s2">|n puzzle(s)."</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">recipes</span><span class="p">)))</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">div</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">text</span><span class="p">))</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdListArmedPuzzles"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdListArmedPuzzles">[docs]</a><span class="k">class</span> <span class="nc">CmdListArmedPuzzles</span><span class="p">(</span><span class="n">MuxCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Searches for all armed puzzles</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> @lsarmedpuzzles</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"@lsarmedpuzzles"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:perm(lsarmedpuzzles) or perm(Builder)"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Puzzles"</span>
|
|
|
|
<div class="viewcode-block" id="CmdListArmedPuzzles.func"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.CmdListArmedPuzzles.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="n">armed_puzzles</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_tag</span><span class="p">(</span><span class="n">_PUZZLES_TAG_MEMBER</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">_PUZZLES_TAG_CATEGORY</span><span class="p">)</span>
|
|
|
|
<span class="n">armed_puzzles</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">g</span><span class="p">))</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="n">armed_puzzles</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">ap</span><span class="p">:</span> <span class="n">ap</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">puzzle_name</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">div</span> <span class="o">=</span> <span class="s2">"-"</span> <span class="o">*</span> <span class="mi">60</span>
|
|
<span class="n">msgf_pznm</span> <span class="o">=</span> <span class="s2">"Puzzle name: |y</span><span class="si">%s</span><span class="s2">|n"</span>
|
|
<span class="n">msgf_item</span> <span class="o">=</span> <span class="s2">"|m</span><span class="si">%25s</span><span class="s2">|w(</span><span class="si">%s</span><span class="s2">)|n at |c</span><span class="si">%25s</span><span class="s2">|w(</span><span class="si">%s</span><span class="s2">)|n"</span>
|
|
<span class="n">text</span> <span class="o">=</span> <span class="p">[</span><span class="n">div</span><span class="p">]</span>
|
|
<span class="k">for</span> <span class="n">pzname</span><span class="p">,</span> <span class="n">items</span> <span class="ow">in</span> <span class="n">armed_puzzles</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">msgf_pznm</span> <span class="o">%</span> <span class="p">(</span><span class="n">pzname</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="n">msgf_item</span> <span class="o">%</span> <span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">div</span><span class="p">)</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"Found |r</span><span class="si">%d</span><span class="s2">|n armed puzzle(s)."</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">armed_puzzles</span><span class="p">)))</span>
|
|
<span class="n">text</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">div</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">text</span><span class="p">))</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="PuzzleSystemCmdSet"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.PuzzleSystemCmdSet">[docs]</a><span class="k">class</span> <span class="nc">PuzzleSystemCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> CmdSet to create, arm and resolve Puzzles</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="PuzzleSystemCmdSet.at_cmdset_creation"><a class="viewcode-back" href="../../../api/evennia.contrib.puzzles.html#evennia.contrib.puzzles.PuzzleSystemCmdSet.at_cmdset_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">(</span><span class="n">PuzzleSystemCmdSet</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">at_cmdset_creation</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdCreatePuzzleRecipe</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdEditPuzzle</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdArmPuzzle</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdListPuzzleRecipes</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdListArmedPuzzles</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdUsePuzzleParts</span><span class="p">())</span></div></div>
|
|
</pre></div>
|
|
|
|
<div class="clearer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<p class="logo"><a href="../../../index.html">
|
|
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
|
|
</a></p>
|
|
<div id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" />
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script>$('#searchbox').show(0);</script>
|
|
<h3>Versions</h3>
|
|
<ul>
|
|
<li><a href="puzzles.html">1.0-dev (develop 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="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">evennia.contrib.puzzles</a></li>
|
|
</ul>
|
|
<div class="develop">develop branch</div>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2020, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
|
</div>
|
|
</body>
|
|
</html> |