<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pmdo.pmdcollab.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=IDK</id>
	<title>PMDOWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pmdo.pmdcollab.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=IDK"/>
	<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/Special:Contributions/IDK"/>
	<updated>2026-07-31T00:20:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Class:BattleContext&amp;diff=8193</id>
		<title>Class:BattleContext</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Class:BattleContext&amp;diff=8193"/>
		<updated>2026-07-30T06:22:15Z</updated>

		<summary type="html">&lt;p&gt;IDK: Autogenerated update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows all properties of BattleContext that can be manipulated from Lua&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikeStartTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the tile of the user before it started a strike (used for tipper effects)&lt;br /&gt;
wrapped; it can&#039;t go out of bounds anyway&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikeEndTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the tile of the user JUST AFTER it started a strike (used for updating position)&lt;br /&gt;
wrapped; it can&#039;t go out of bounds anyway&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StartDir ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the direcion of the user before it started a strike (used for multistrike confusion)&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.ExplosionTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the origin tile for the explosion&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.TargetTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the location of the tile being targeted&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikeLandTiles ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
all tiles in which a strike&#039;s hitbox ended (used for item landing)&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.ActionType ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ActionType: Skill, Item, Throw or Trap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.UsageSlot ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For skills, the skill slot&lt;br /&gt;
For items, the item slot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikesMade ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strikes that have currently been made in the BattleContext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Strikes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The total strikes that should be made in the BattleContext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.HitboxAction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determines the range and type of hitbox.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Explosion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determiens the size of splash effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Data ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The effect of the skill, item, trap, etc. on the target.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Item ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The item that is used, and most likely dropped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.SkillUsedUp ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill whose last charge was used up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.TurnCancel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determines if this action should trigger end-of-turn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Hit ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Denotes whether the action hit its target.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.RangeMod ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A number of be added to the Range argument for the hitbox, when it comes out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.GlobalContextStates ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Context states that remain on the main battlecontext even after iterating over different targets.&lt;br /&gt;
Ordinarily, context states are left behind when switching to a new target (in multi-target contexts)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UserTargetGameContext.Target ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The character that the action is targeted at&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GameContext.ContextStates ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Contains contextual info to be passed along the GameContext, used by GameEvents&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GameContext.User ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The character that is performing the action&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GameContext.CancelState ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Whether the action should be canceled or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Data Class Documentation]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Class:BattleContext&amp;diff=8192</id>
		<title>Class:BattleContext</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Class:BattleContext&amp;diff=8192"/>
		<updated>2026-07-30T06:17:30Z</updated>

		<summary type="html">&lt;p&gt;IDK: Autogenerated update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BattleContext.StrikeStartTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the tile of the user before it started a strike (used for tipper effects)&lt;br /&gt;
wrapped; it can&#039;t go out of bounds anyway&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikeEndTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the tile of the user JUST AFTER it started a strike (used for updating position)&lt;br /&gt;
wrapped; it can&#039;t go out of bounds anyway&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StartDir ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the direcion of the user before it started a strike (used for multistrike confusion)&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.ExplosionTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the origin tile for the explosion&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.TargetTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the location of the tile being targeted&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikeLandTiles ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
all tiles in which a strike&#039;s hitbox ended (used for item landing)&lt;br /&gt;
unwrapped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.ActionType ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ActionType: Skill, Item, Throw or Trap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.UsageSlot ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For skills, the skill slot&lt;br /&gt;
For items, the item slot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.StrikesMade ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strikes that have currently been made in the BattleContext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Strikes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The total strikes that should be made in the BattleContext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.HitboxAction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determines the range and type of hitbox.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Explosion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determiens the size of splash effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Data ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The effect of the skill, item, trap, etc. on the target.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Item ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The item that is used, and most likely dropped&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.SkillUsedUp ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill whose last charge was used up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.TurnCancel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determines if this action should trigger end-of-turn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.Hit ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Denotes whether the action hit its target.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.RangeMod ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A number of be added to the Range argument for the hitbox, when it comes out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BattleContext.GlobalContextStates ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Context states that remain on the main battlecontext even after iterating over different targets.&lt;br /&gt;
Ordinarily, context states are left behind when switching to a new target (in multi-target contexts)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UserTargetGameContext.Target ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The character that the action is targeted at&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GameContext.ContextStates ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Contains contextual info to be passed along the GameContext, used by GameEvents&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GameContext.User ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The character that is performing the action&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GameContext.CancelState ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Whether the action should be canceled or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Data Class Documentation]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Maintaining_Documentation&amp;diff=8191</id>
		<title>Tutorial:Maintaining Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Maintaining_Documentation&amp;diff=8191"/>
		<updated>2026-07-30T02:37:16Z</updated>

		<summary type="html">&lt;p&gt;IDK: fix outgoing link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The documentation for all classes in PMDC, RogueEssence, and RogueElements can be found in [https://github.com/audinowho/DumpAsset/tree/master/Editor/Docs Editor/Docs].  They are updated manually by building the projects in debug mode and copying the XMLs from their output directory to the target location.  They are used in the editor as the source of its tooltips.&lt;br /&gt;
&lt;br /&gt;
Documents are generated using the &amp;lt;code&amp;gt;&amp;lt;DocumentationFile&amp;gt;&amp;lt;/code&amp;gt; MSBuild Tag in debug mode&lt;br /&gt;
https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props&lt;br /&gt;
&lt;br /&gt;
It extracts the following tags from the C# documentation:&lt;br /&gt;
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags&lt;br /&gt;
&lt;br /&gt;
== Wiki Maintenance ==&lt;br /&gt;
&lt;br /&gt;
Run the [https://github.com/audinowho/PMDODump/blob/master/Scripts/doc_sync.py Doc Sync] script to generate wiki-ready pages of common functions used for lua scripting.  They are output to https://github.com/audinowho/PMDODump/tree/master/DataAsset/Docs DataAsset/Docs]&lt;br /&gt;
&lt;br /&gt;
[[Category: Maintenance]]&lt;br /&gt;
[[Category: Tutorial]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Controller_Support&amp;diff=8187</id>
		<title>Controller Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Controller_Support&amp;diff=8187"/>
		<updated>2026-07-28T04:23:10Z</updated>

		<summary type="html">&lt;p&gt;IDK: API update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO supports gamepads for the major Nintendo, Playstation, and Xbox controllers.  They all come with default button mappings that are best fit for their controllers, but can still be modified in the settings.&lt;br /&gt;
&lt;br /&gt;
== Supporting New Controllers ==&lt;br /&gt;
&lt;br /&gt;
Unrecognized controllers will default to Xbox-style control schemes.  If the labeling is incorrect, it is possible to add support for your controller by following these steps:&lt;br /&gt;
&lt;br /&gt;
Run PMDO with your controller plugged in.  In the logs (found in the &amp;lt;code&amp;gt;LOG&amp;lt;/code&amp;gt; subfolder), search for a debug line that mentions your controller.  For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[2023/03/04 22:14:21.947] Controller 0: (8BitDo Ultimate Controller), GUID: c82d0631, Mapping: 03000000c82d00000631000000007200,*,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b10,start:b7,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Windows&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy the GUID, and navigate to the &amp;lt;code&amp;gt;Controls/Label&amp;lt;/code&amp;gt; subfolder in your PMDO installation.  Create a new XML file with your guid as the name.  Inside it, map each controller input to a button texture (look at the existing XMLs for reference).  All possible controller inputs are specified [https://github.com/FNA-XNA/FNA/blob/master/src/Input/Buttons.cs#L20 here].  All button textures are [[Text Guide#Special Characters|special characters]].&lt;br /&gt;
&lt;br /&gt;
Now with the inputs properly mapped to textures, it is time to map them to in-game inputs. Navigate to the &amp;lt;code&amp;gt;Controls/Default&amp;lt;/code&amp;gt; subfolder in your PMDO installation and reate a new XML file with your guid as the name.  Specify the default controls for this controller in the XML, as well as its name (look at the existing XMLs for reference).&lt;br /&gt;
&lt;br /&gt;
Support for the controller should now be functional the next time the game is started up.  These XML files can be sent to a developer to request out-of-the-box support for the controller.&lt;br /&gt;
[[Category:PMDO Technical]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Food&amp;diff=8186</id>
		<title>Food</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Food&amp;diff=8186"/>
		<updated>2026-07-28T02:46:12Z</updated>

		<summary type="html">&lt;p&gt;IDK: Undo revision 8185 by IDK (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Food items&#039;&#039;&#039;, typically known as &#039;&#039;&#039;food&#039;&#039;&#039;, are a category of [[item]] in PMDO whose primary purpose is to fill the [[belly]] in dungeons.&lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
Food is used to manage the [[belly]], since running out of belly gradually leads to fainting. Due to the presence of [[leader switching]], food management is generally less of a factor in PMDO. It tends to come up primarily when exploring dungeons with large floors or a lot of floors. &lt;br /&gt;
&lt;br /&gt;
Different food items tend to fill the belly by different amounts, or restore the belly of the entire party.&lt;br /&gt;
&lt;br /&gt;
== Obtaining ==&lt;br /&gt;
Food can be found sold in the [[base town]] Kecleon shop. It is also often found within [[dungeons]].&lt;br /&gt;
&lt;br /&gt;
== List of Food ==&lt;br /&gt;
{{TableOfFood}}&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
{{Item Categories}}{{PMDO Food}}&lt;br /&gt;
[[Category:Item]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Food&amp;diff=8185</id>
		<title>Food</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Food&amp;diff=8185"/>
		<updated>2026-07-28T02:45:38Z</updated>

		<summary type="html">&lt;p&gt;IDK: API update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Food items, typically known as food, are a category of [[item]] in PMDO whose primary purpose is to fill the [[belly]] in dungeons.&lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
Food is used to manage the [[belly]], since running out of belly gradually leads to fainting. Due to the presence of [[leader switching]], food management is generally less of a factor in PMDO. It tends to come up primarily when exploring dungeons with large floors or a lot of floors. &lt;br /&gt;
&lt;br /&gt;
Different food items tend to fill the belly by different amounts, or restore the belly of the entire party.&lt;br /&gt;
&lt;br /&gt;
== Obtaining ==&lt;br /&gt;
Food can be found sold in the [[base town]] Kecleon shop. It is also often found within [[dungeons]].&lt;br /&gt;
&lt;br /&gt;
== List of Food ==&lt;br /&gt;
{{TableOfFood}}&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
{{Item Categories}}{{PMDO Food}}&lt;br /&gt;
[[Category:Item]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Main_Page&amp;diff=8184</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Main_Page&amp;diff=8184"/>
		<updated>2026-07-28T02:00:24Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:&amp;lt;span style=&amp;quot;position: absolute; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);&amp;quot;&amp;gt;{{FULLPAGENAME}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
= Pokémon Mystery Dungeon: Origins =&lt;br /&gt;
&lt;br /&gt;
[[Pokémon Mystery Dungeon: Origins]] is a fanmade Pokémon Mystery Dungeon game programmed in C# and playable on Windows, Mac, and Linux.&lt;br /&gt;
&lt;br /&gt;
To play, click here to download the installer for your operating system: [https://github.com/audinowho/PMDODump/releases PMDO Github: Releases]&amp;lt;br&amp;gt;&lt;br /&gt;
If you&#039;re on Steam Deck, please see the [[Linux Flatpak | Linux Flatpak instructions]].&lt;br /&gt;
&lt;br /&gt;
PMDO is open source ([https://opensource.org/licenses/MIT MIT license]) and has full mod support and features a set of tools for enabling fans to create make their own PMD fangames. Visit the [[Modding Hub]] to get started, or join our [https://discord.gg/gavVZj8B9A Discord] community for help from other modders.&lt;br /&gt;
&lt;br /&gt;
PMDO serves as the fangame counterpart to ROMhacking with [https://skytemple.org SkyTemple], and is specifically a part of its [https://pmdcollab.org PMDCollab] project.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Main_Page&amp;diff=5196</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Main_Page&amp;diff=5196"/>
		<updated>2025-11-19T03:00:42Z</updated>

		<summary type="html">&lt;p&gt;IDK: update discord invite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:&amp;lt;span style=&amp;quot;position: absolute; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);&amp;quot;&amp;gt;{{FULLPAGENAME}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
= Pokémon Mystery Dungeon: Origins =&lt;br /&gt;
&lt;br /&gt;
[[Pokémon Mystery Dungeon: Origins]] is a fanmade Pokémon Mystery Dungeon game programmed in C# and playable on Windows, Mac, and Linux.&lt;br /&gt;
&lt;br /&gt;
To download and play, click here and download the installer for your operating system: [https://github.com/audinowho/PMDODump/releases PMDO Github: Releases]&amp;lt;br&amp;gt;&lt;br /&gt;
If you&#039;re on Steam Deck, please see the [[Linux Flatpak | Linux Flatpak instructions]].&lt;br /&gt;
&lt;br /&gt;
PMDO is open source ([https://opensource.org/licenses/MIT MIT license]) and has full mod support and features a set of tools for enabling fans to create make their own PMD fangames. Visit the [[Modding Hub]] to get started, or join our [https://discord.gg/gavVZj8B9A Discord] community for help from other modders.&lt;br /&gt;
&lt;br /&gt;
PMDO serves as the fangame counterpart to ROMhacking with [https://skytemple.org SkyTemple], and is specifically a part of its [https://pmdcollab.org PMDCollab] project.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Navigating_PMDO%27s_Repository&amp;diff=5174</id>
		<title>Tutorial:Navigating PMDO&#039;s Repository</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Navigating_PMDO%27s_Repository&amp;diff=5174"/>
		<updated>2025-11-17T00:59:27Z</updated>

		<summary type="html">&lt;p&gt;IDK: clarification of dumpasset subfolders&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The repository for PMDO, [https://github.com/audinowho/PMDODump PMDODump], consists of several different modules and sub-repositories that contain different pieces of the game and its engine. Knowing where different parts of the game can be found is important for the purposes of [[mod|modding]].&lt;br /&gt;
&lt;br /&gt;
This tutorial contains some information on what pieces of the engine can be found where, and what parts of the overall repository to navigate in order to find how the code works.&lt;br /&gt;
&lt;br /&gt;
== PMDODump ==&lt;br /&gt;
PMDODump is the master repository for PMDO. It is used to build the game and include all of the information relevant to it.&lt;br /&gt;
&lt;br /&gt;
It has the following subfolders.&lt;br /&gt;
&lt;br /&gt;
=== DataAsset ===&lt;br /&gt;
Contains output of some of PMDO&#039;s data.&lt;br /&gt;
&lt;br /&gt;
=== DataGenerator ===&lt;br /&gt;
Files that are used to generate the data that PMDO has.&lt;br /&gt;
&lt;br /&gt;
=== PMDOSetup === &lt;br /&gt;
Files related to initializing the &amp;lt;code&amp;gt;PMDOSetup&amp;lt;/code&amp;gt; program, which is used to manage the game.&lt;br /&gt;
&lt;br /&gt;
=== Scripts ===&lt;br /&gt;
Various python scripts for automating some development processes.&lt;br /&gt;
&lt;br /&gt;
== RawAsset ==&lt;br /&gt;
{{SectStub}}&lt;br /&gt;
Visual assets for PMDO, such as sprites.  These are converted to the Content subfolder in DumpAsset.&lt;br /&gt;
&lt;br /&gt;
== DumpAsset ==&lt;br /&gt;
{{SectStub}}&lt;br /&gt;
Contains all data generated for PMDO, such as Pokemon, base game mods, ground map scripts, and the editor.&lt;br /&gt;
&lt;br /&gt;
The files in the Data subfolder is created by running PMDODump&#039;s DataGenerator project, plus changes made manually.&lt;br /&gt;
&lt;br /&gt;
The Content subfolder is created by running PMDC with the &amp;lt;code&amp;gt;-convert&amp;lt;/code&amp;gt; flag, which packages all files in the RawAsset repository into Content.&lt;br /&gt;
&lt;br /&gt;
== PMDC ==&lt;br /&gt;
{{SectStub}}&lt;br /&gt;
Contains the overall engine that is used to run PMDO, without any game data (such as individual dungeons or Pokemon).&lt;br /&gt;
&lt;br /&gt;
=== RogueEssence ===&lt;br /&gt;
{{Main|RougeEssence}}&lt;br /&gt;
The underlying engine that forms PMDO, for creating roguelikes.&lt;br /&gt;
[[Category:Tutorial]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=MapGenTest&amp;diff=4295</id>
		<title>MapGenTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=MapGenTest&amp;diff=4295"/>
		<updated>2025-10-03T06:11:55Z</updated>

		<summary type="html">&lt;p&gt;IDK: mods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MapGenTest is a standalone program that can be used to test floor generators made in PMDO&#039;s editor.  It has stress test capabilities that can help you find that elusive 1/8192 floor generation that results in an error.&lt;br /&gt;
&lt;br /&gt;
It can be found in the PMDC repo, under MapGenTest https://github.com/PMDCollab/PMDC/tree/master/MapGenTest&lt;br /&gt;
&lt;br /&gt;
In order for it to work properly, it must be run with the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; command line argument, followed by the path to the folder containing PMDO&#039;s &amp;lt;code&amp;gt;Content&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Data folders&amp;lt;/code&amp;gt;.  This typically means the folder named &amp;quot;PMDO&amp;quot; for a regular installation.  This path MUST be a &#039;&#039;&#039;relative path&#039;&#039;&#039;, and you must be sure to include the trailing slash to signify it as a folder.  The &amp;lt;code&amp;gt;launchsettings.json&amp;lt;/code&amp;gt; for MapGenTest in the repo has it point to the DumpAsset folder of the parent PMDODump project.&lt;br /&gt;
&lt;br /&gt;
In order to test mods, you will need to move the MODS/ folder to the same location as the MapGenTest exe.  Additionally, you must supply the &amp;lt;code&amp;gt;-mod&amp;lt;/code&amp;gt; command line argument, followed by the name of the mod folder to load.&lt;br /&gt;
&lt;br /&gt;
As a debug tool, expect things to break if these instructions are not followed perfectly.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=MapGenTest&amp;diff=4294</id>
		<title>MapGenTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=MapGenTest&amp;diff=4294"/>
		<updated>2025-10-03T05:32:04Z</updated>

		<summary type="html">&lt;p&gt;IDK: initial commit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MapGenTest is a standalone program that can be used to test floor generators made in PMDO&#039;s editor.  It has stress test capabilities that can help you find those elusive 1/8192 erroring floors.&lt;br /&gt;
&lt;br /&gt;
It can be found in the PMDC repo, under MapGenTest https://github.com/PMDCollab/PMDC/tree/master/MapGenTest&lt;br /&gt;
&lt;br /&gt;
In order for it to work properly, it must be run with the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; command line argument, followed by the path to the folder containing PMDO&#039;s &amp;lt;code&amp;gt;Content&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Data folders&amp;lt;/code&amp;gt;.  This typically means the folder named &amp;quot;PMDO&amp;quot; for a regular installation.  This path MUST be a &#039;&#039;&#039;relative path&#039;&#039;&#039;, and you must be sure to include the trailing slash to signify it as a folder.  The &amp;lt;code&amp;gt;launchsettings.json&amp;lt;/code&amp;gt; for MapGenTest in the repo has it point to the DumpAsset folder of the parent PMDODump project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a debug tool, expect things to break if these instructions are not followed perfectly.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Status_Conditions&amp;diff=3996</id>
		<title>Status Conditions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Status_Conditions&amp;diff=3996"/>
		<updated>2025-08-25T02:46:32Z</updated>

		<summary type="html">&lt;p&gt;IDK: non-damaging move effects on sleep&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Status conditions&#039;&#039;&#039;, or &#039;&#039;&#039;statuses&#039;&#039;&#039;, are abnormal effects that may affect a Pokémon in battle. Status conditions can have either positive or negative effects.&lt;br /&gt;
&lt;br /&gt;
== Major status conditions ==&lt;br /&gt;
A Pokémon can only have one major status condition at a time. Pokémon inflicted with major status conditions will take additional damage from moves like [[Hex]].&lt;br /&gt;
&lt;br /&gt;
=== Poisoned ===&lt;br /&gt;
[[File:Status_Poisoned.gif|thumb|A poisoned [[Pikachu]] taking damage every turn.]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;poisoned&#039;&#039;&#039; Pokémon will take damage every turn for 6 turns. The Pokémon will take less damage if it waits in place on that turn, taking damage equivalent to &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; of its max HP while waiting, and &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;8&amp;lt;/sub&amp;gt; of its max HP while moving or attacking. {{TypeIcon|type=Poison}}Poison- and {{TypeIcon|type=Steel}}Steel-type Pokémon cannot be poisoned or badly poisoned.&lt;br /&gt;
&lt;br /&gt;
Healing items and effects will only recover half as much HP, and the Pokémon will not recover HP naturally. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- These forcibly separate the stuff below from a prior floating image, if there isn&#039;t enough text in between. --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==== Badly Poisoned ====&lt;br /&gt;
[[File:Status_BadlyPoisoned.gif|thumb|A badly poisoned [[Deerling]] taking increasingly more damage after attacking.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Badly poisoned&#039;&#039;&#039; Pokémon will increase the amount of damage taken by the poison every time they use a move. As before, the damage will start at &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; for standing still and &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;8&amp;lt;/sub&amp;gt; for moving, but increases by an additional &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; anytime the Pokémon uses a move.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Paralyzed ===&lt;br /&gt;
[[File:Status_Paralyzed.gif|thumb|A paralyzed [[Spheal]] being unable to move every other turn.]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;paralyzed&#039;&#039;&#039; Pokémon will be unable to act every other turn. Paralysis lasts for 6 turns. {{TypeIcon|type=Electric}}Electric-type Pokémon cannot be paralyzed.&lt;br /&gt;
&lt;br /&gt;
Paralysis will last for 10 turns when inflicted by the [[Petrify Orb]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Burned ===&lt;br /&gt;
[[File:Status_Burned.gif|thumb|A burned [[Whismur]] taking damage after attacking.]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;burned&#039;&#039;&#039; Pokémon will have its Attack stat reduced by &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;, and will take &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;/&amp;lt;sub&amp;gt;8&amp;lt;/sub&amp;gt; of its max HP as damage every time it attacks. This status condition lasts for the entire floor, or until being removed. {{TypeIcon|type=Fire}}Fire-type Pokémon cannot be burned.&lt;br /&gt;
&lt;br /&gt;
Burns can be cured by stepping onto [[Terrain|water tiles]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Asleep ===&lt;br /&gt;
[[File:Status_Asleep.gif|thumb|A sleeping [[Metang]].]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;sleeping&#039;&#039;&#039; Pokémon will be unable to act until it takes damage from an attack, or after 5 turns.  Non-damaging attacks will take 1 turn off the countdown.&lt;br /&gt;
&lt;br /&gt;
Sleep will last for 15 turns when inflicted by the [[Slumber Orb]].&lt;br /&gt;
&lt;br /&gt;
Sleep will last for 20 turns when inflicted by the [[Sleep Seed]].&lt;br /&gt;
&lt;br /&gt;
Sleep will last an unlimited number of turns when the [[Stayaway Orb]] is used, and certain Pokémon can sometimes spawn in a dungeon sleeping for an unlimited number of turns.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Frozen ===&lt;br /&gt;
[[File:Status_Frozen.gif|thumb|A frozen [[Tepig]] freeing itself by using [[Flame Charge]].]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;frozen&#039;&#039;&#039; Pokémon will be unable to act or take damage until 10 turns have passed. The Pokémon may be thawed early by having a {{TypeIcon|type=Fire}}Fire-type move used on it, or by using a Fire-type move of its own. {{TypeIcon|type=Ice}}Ice-type Pokémon cannot be frozen.&lt;br /&gt;
&lt;br /&gt;
Freezing will last for 30 turns when inflicted by the [[Ice Seed]].&lt;br /&gt;
&lt;br /&gt;
Freezing will last for 20 turns when inflicted by the [[Freeze Orb]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
== Minor status conditions ==&lt;br /&gt;
{{sectstub}}&lt;br /&gt;
&lt;br /&gt;
A Pokémon can be inflicted with any number of minor status conditions.&lt;br /&gt;
&lt;br /&gt;
=== Confused ===&lt;br /&gt;
[[File:Status_Confused.gif|thumb|A confused [[Spinda]] and [[Psyduck]] having trouble aiming while battling.]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;confused&#039;&#039;&#039; Pokémon may randomly turn to the left or right before acting for 10 turns. There is an equal chance for each the intended direction, one turn to the left, and one turn to the right, effectively cutting the accuracy of single-target moves to 33.3%.&lt;br /&gt;
&lt;br /&gt;
Additionally, the moves and items of confused Pokémon will affect both allies and enemies equally, regardless of whether they normally affect either only allies or only enemies.&lt;br /&gt;
&lt;br /&gt;
Confusion will last for 15 turns when inflicted by the [[Totter Orb]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Immobilized ===&lt;br /&gt;
[[File:Status_Immobilized.gif|thumb|An immobilized [[Raboot]] returning to its original position after using [[Quick Attack]].]]&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;&#039;immobilized&#039;&#039;&#039; Pokémon is unable to move for 5 turns, though it may still attack and use items freely. While immobilized, moves that would normally bring the user forward, such as [[Quick Attack]], will instead return the Pokémon to its original location.&lt;br /&gt;
&lt;br /&gt;
Immobilization will last for 20 turns when inflicted by the [[Foe-Hold Orb]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Cringe ===&lt;br /&gt;
[[File:Status_Cringe.gif|thumb|[[Nickit]] cringing due to [[Tyrogue]]&#039;s [[Fake Out]].]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;cringing&#039;&#039;&#039; (or &amp;quot;flinching&amp;quot;) Pokémon is unable to use moves or items for one turn, but can still move. This status effect cannot be inflicted if the target cringed on the previous turn.&lt;br /&gt;
&lt;br /&gt;
Cringe will last for 3 turns if inflicted by the [[Fear Wand]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== In Love ===&lt;br /&gt;
[[File:Status_InLove.gif|thumb|[[Poochyena]] in love with [[Skitty]] due to [[Cute Charm]].]]&lt;br /&gt;
&lt;br /&gt;
A Pokémon who is &#039;&#039;&#039;in love&#039;&#039;&#039; (or &amp;quot;infatuated&amp;quot;) cannot use moves or items on the Pokémon who inflicted the status for 10 turns. If it does, the attack will [[forced miss|automatically miss]]. This status can normally only be inflicted on Pokémon of the opposite gender, unless the [[Gender Unlock]] mod is enabled.&lt;br /&gt;
&lt;br /&gt;
[[Category: Game Mechanics]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Taking_Turns&amp;diff=3922</id>
		<title>Taking Turns</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Taking_Turns&amp;diff=3922"/>
		<updated>2025-08-21T01:36:05Z</updated>

		<summary type="html">&lt;p&gt;IDK: speed rework revert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO is a turn-based roguelike dungeon crawler.  Every time you move, the enemies move.&lt;br /&gt;
When all player and enemy turns completes, this is called a Round.&lt;br /&gt;
&lt;br /&gt;
== The Turn Cycle ==&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, a single Round consists of one full Cycle of player+enemy movements, ordered as such:&lt;br /&gt;
&lt;br /&gt;
* The player&#039;s team moves&lt;br /&gt;
** Members: Leader first, then everyone moves in list order&lt;br /&gt;
** Guests: Everyone moves in list order &lt;br /&gt;
* Neutral NPC teams move&lt;br /&gt;
** Members: Leader first, then everyone moves in list order&lt;br /&gt;
** Guests: Everyone moves in list order &lt;br /&gt;
* Enemy teams move&lt;br /&gt;
** Members: Leader first, then everyone moves in list order&lt;br /&gt;
** Guests: Everyone moves in list order &lt;br /&gt;
&lt;br /&gt;
It&#039;s possible for a player to rearrange their team order and change leaders before making a move, allowing them to choose the order in which their units move.  Enemies also invisibly reorder their team order to mitigate chokepoint situations.&lt;br /&gt;
&lt;br /&gt;
An example of a chokepoint situation is where an enemy team has a lower ranking member in front of a higher ranking member in a hallway.  The higher ranking member goes first, but cannot, while the lower rank can, but moves after the higher rank member.  This leads to a turn where one enemy moves forward, but the other one doesn&#039;t.  Very unintuitive, so the enemies quietly reorder their turns to make this behavior more natural.  This also happens with player allies.&lt;br /&gt;
&lt;br /&gt;
== Speed Changes and Turn Tiers ==&lt;br /&gt;
&lt;br /&gt;
Under normal speed conditions, everyone gets to move exactly once.  However, speed can be increased in this game.  Specifically, Movement Speed.  Rounds are actually broken up into 6 Turn Tiers, each of them having a turn Cycle detailed in the previous section.  A character can only move in that tier if they have a Movement Speed that the tier permits.&lt;br /&gt;
&lt;br /&gt;
The 6 turn tiers are as follows:&lt;br /&gt;
&lt;br /&gt;
* Tier 0: All movement Speeds&lt;br /&gt;
* Tier 1/4: Quadruple Speed&lt;br /&gt;
* Tier 1/3: Triple Speed&lt;br /&gt;
* Tier 1/2: Double Speed, Quadruple Speed&lt;br /&gt;
* Tier 2/3: Triple Speed&lt;br /&gt;
* Tier 3/4: Quadruple Speed&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, everyone would move at the turn cycle on tier 0 and the other tiers would not be used.  But when someone speeds up, they can use the other tiers.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
So if a player team consists of the following:&lt;br /&gt;
* Leader: Double Speed&lt;br /&gt;
* Partner 1: Normal Speed&lt;br /&gt;
* Partner 2: Normal Speed&lt;br /&gt;
&lt;br /&gt;
And an enemy team consists of the following:&lt;br /&gt;
* Leader: Quadruple Speed&lt;br /&gt;
* Partner 1: Normal Speed&lt;br /&gt;
&lt;br /&gt;
The turn order would look like this:&lt;br /&gt;
&lt;br /&gt;
* Tier 0:&lt;br /&gt;
** Player Team:&lt;br /&gt;
*** Player Moves&lt;br /&gt;
*** Partner 1 Moves&lt;br /&gt;
*** Partner 2 Moves&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
*** Partner 1 Moves&lt;br /&gt;
* Tier 1/4:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
* Tier 1/3:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
* Tier 1/2:&lt;br /&gt;
** Player Team:&lt;br /&gt;
*** Player Moves&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
* Tier 2/3:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
* Tier 3/4:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
* The Round ends&lt;br /&gt;
&lt;br /&gt;
When a character&#039;s movement speed is decreased, they will still always perform movements at turn tier 0.  However, every time they do, they incur a cooldown of X turns reliant on how much they&#039;ve slowed down.  A Half Speed character will have to wait 1 turn after moving.  A 1/3 Speed character will have to wait 2.  A 1/4 Speed character will have to wait 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attacking ==&lt;br /&gt;
&lt;br /&gt;
All movement speed changes only come into effect if the player moves.  They do not apply to attacking or using items.  If a player at slowed movement speed attacks, they do not skip subsequent turns.  If a player at boosted speed attacks, they can no longer participate in higher Turn Tiers for that round.  This can be exploited slightly:&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say a player is moving at double speed against an enemy at normal speed.&lt;br /&gt;
On the player&#039;s turn at Tier 0, if they move, the enemy moves. Then on tier 1/2, the player can perform an attack.  The round then ends, and the player can act again.&lt;br /&gt;
&lt;br /&gt;
However, if the player chooses to attack, they will not be able to move until they have passed the turn border.  It would simply play out as if both entities were moving/attacking at normal speed.&lt;br /&gt;
&lt;br /&gt;
The turn border happens before the leader of the player team&#039;s Tier 0 turn. Various attempts have been made to improve on this, but they&#039;ve had unacceptable consequences. [[User:IDK/Speed_Rework|More information]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Mechanics]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=3921</id>
		<title>User:IDK/Speed Rework</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=3921"/>
		<updated>2025-08-21T01:34:37Z</updated>

		<summary type="html">&lt;p&gt;IDK: revert the speed system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The current speed system that everyone moves on is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I tried changing it to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this would in theory solve the speed-up delay&lt;br /&gt;
&lt;br /&gt;
because previously it was:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Use speed-up move, player is marked as used-move&lt;br /&gt;
0: Enemy moves&lt;br /&gt;
1/2: Player is at double speed and would be able to move again, but is marked as used-move so they can&#039;t&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
0: Player walks&lt;br /&gt;
0: Enemy walks&lt;br /&gt;
1/2: Player can walk again&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it would be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Use speed-up move, player is marked as used-move&lt;br /&gt;
1: Enemy moves&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
1/2: Player walks&lt;br /&gt;
1: Player can walk again&lt;br /&gt;
1: Enemy gets to move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HOWEVER&lt;br /&gt;
&lt;br /&gt;
this design would reveal a favoritism to enemy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Player attacks&lt;br /&gt;
1: Enemy used Silver wind!  Enemy is at double speed! (Marked as move-used)&lt;br /&gt;
-- Next turn.  All used-move flags cleared. --&lt;br /&gt;
1/2: Enemy used Silver Wind! Enemy is at triple speed! (Marked as move-used)&lt;br /&gt;
2/3: Enemy would normally be able to move AGAIN, but is marked as used-move so they can&#039;t (thank god)&lt;br /&gt;
1: Player can respond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
technically, this issue also occurs in the current system, just with a one-turn delay.  But our current system slightly favors enemies too.  But what if...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- All used-move flags for ENEMIES cleared --&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- All used-move flags for PLAYERS cleared --&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or rather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds (Player)&lt;br /&gt;
-- All used-move flags cleared --&lt;br /&gt;
    0: All movement Speeds (Enemies)&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t look very clean, but it would result in fairness:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind.  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Double speed).  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Triple speed). Used-move set.&lt;br /&gt;
1/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
2/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if both the player and the enemy get to move on a sub-turn like 1/2, the player gets to move first and then the enemy moves right after&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: (Already at 2x speed) Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario is slightly in favor of the player, but only within the player&#039;s frame of reference, so it should be fine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: (already at 2x speed) Move.&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Agility. Used-Move set&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Can&#039;t Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional scenarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player is already at double speed, moves.&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player used agility! &amp;lt;move use set&amp;gt;&lt;br /&gt;
2/3:Player qualifies for this tier but skips.  already used move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player skips.  already used move&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/3:Player moves&lt;br /&gt;
2/3:Player moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this only works because there are two sides: player and enemy.&lt;br /&gt;
&lt;br /&gt;
which is exactly the same as the number of directions in the flow of time itself: forwards and backwards.&lt;br /&gt;
&lt;br /&gt;
This causes regression in another problem: Normally, Summon Trap turns on the Move Use flag to prevent the summoned enemies from immediately attacking (only for enemies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Enemies (including the new summons) move or attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of the new move use flag mechanics, enemies are able to attack immediately in both scenarios, respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must still have a variable that prevents movement or attacking that gets cleared at the end of a round/beginning of a round, like the original Move Use flag.  We will call it the End Turn Lock.  As long as Move Use OR End Turn Lock are on, the character cannot act.  For example, with summons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  End Turn Lock are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chest/Orb Monster Houses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Allies skip due to End Turn Lock&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the player activates a chest house while at double speed, they may lose their first reacting turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player cannot act due to Move Use flag set&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Removing End Turn Lock must also remove Move Use flag, but ONLY if they have End Turn Lock to begin with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared, Move Use flag cleared --&lt;br /&gt;
0:Player reacts to new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for summon trap:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player steps on a summon tile.  End Turn Locks are set for the newly spawned enemies.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies can act, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock and Move Use flag cleared for enemies --&lt;br /&gt;
0:Player reacts to new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HOWEVER, the new speed system introduces the issue that it becomes impossible to kite enemies when moving faster than them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy attacks&lt;br /&gt;
1/2:Player moves one tile away&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player attacks&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy attacks&lt;br /&gt;
1/2:Player moves one tile away&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No matter what order you perform attacks or movements, enemies will always be able to respond to your attack.  This is unwanted behavior, and a far worse consequence than the issue of gained speed appearing on the next turn.  Thus, the change needs to be rolled back.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Room&amp;diff=3528</id>
		<title>Room</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Room&amp;diff=3528"/>
		<updated>2025-08-13T23:44:32Z</updated>

		<summary type="html">&lt;p&gt;IDK: DEPRECATED ROOMS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &#039;&#039;&#039;room&#039;&#039;&#039; is the core primary structure generated in [[maps]]. They are generated using [[FloorSteps]], and belong in the RoomGen class of RogueElements.&lt;br /&gt;
&lt;br /&gt;
Many different structures are considered rooms in PMDO, such as halls.&lt;br /&gt;
&lt;br /&gt;
== Room Overview ==&lt;br /&gt;
Below is a table summary of rooms that can be generated.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Image !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Angled_Hall.png|frameless]]|| Angled Hall || A room connecting its exists with a narrow hallway. It can handle all combinations of exists from all combination of directions.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Block.png|frameless]] || Block || A rectangular room generated with the specific terrain blocking it.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Bump.png|frameless]] || Bump || A rectangular room with tiles at the perimeter randomly blocked.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Cave.png|frameless]] || Cave || A cave-like room generated using cellular automata.&amp;lt;br&amp;gt;If it tries to generate a blob but a valid size is not proposed, it will generate as a rectangle.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Cross.png|frameless]] || Cross || A room composing of one vertical and one horizontal rectange.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Default.png|frameless]] || Default || A 1x1 tile room.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Diamond.png|frameless]] || Diamond || A diamond shaped room.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Oasis.png|frameless]] || Oasis || A cave-like room filled completely by the specified terrain, with its border being floor terrain.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Plus.png|frameless]] || Plus || A rectangular room with tiles from the edges blocked off.&amp;lt;br&amp;gt;&#039;&#039;&#039;May cause errors on generation if the corner field is too big.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Round.png|frameless]] || Round || A circular or capsule-like room.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Square.png|frameless]] || Square || A rectangular or square room.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Triangle.png|frameless]] || Triangle || A right triangle room.&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Water_Ring.png|frameless]] || Water Ring || A room with a terrain type encircling treasure.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Custom Rooms ===&lt;br /&gt;
These rooms are loaded from pre-existing map assets. They are primarily custom, with appearances that vary greatly depending on how they are built.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Coated || A room coated in additional tiles, which can be of any other generation. &#039;&#039;&#039;Currently incomplete.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Load Boss || Used to load a boss room.&lt;br /&gt;
|-&lt;br /&gt;
| Load Evo || Used to load an evolution room.&lt;br /&gt;
|-&lt;br /&gt;
| Load Map Bordered|| Used to load a map as a room with the specified terrain as borders.&lt;br /&gt;
|-&lt;br /&gt;
| Load Map ||  Used to load a map as a room.&lt;br /&gt;
|-&lt;br /&gt;
| Post Proc Specific || Generates a room with a specified mask.&lt;br /&gt;
|-&lt;br /&gt;
| Specific Boss || Generates a boss room with the specified tiles.&lt;br /&gt;
|-&lt;br /&gt;
| Specific || Generates a room with the specified tiles.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardcoded Rooms ===&lt;br /&gt;
These rooms are hardcoded to always appear a certain way, and have no customization options.&lt;br /&gt;
&#039;&#039;&#039;THEY ARE SCHEDULED FOR DEPRECATION AND USE IS DISCOURAGED.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Image !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Evo_Small.png|frameless]] || Evo Small || A hardcoded 5x6 tile evolution room.  To be replaced by Load Map: room_evo_altar_small&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Evo.png|frameless]] || Evo || A hardcoded 7x6 tile evolution room.  To be replaced by Load Map: room_evo_altar_normal&lt;br /&gt;
|-&lt;br /&gt;
| [[File:RoomGen_Guarded_Cave.png|frameless]] || Guarded Cave || A cave that generates with a mob guarding its entrance.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Dungeon Generation]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mass_Importing_Assets&amp;diff=3322</id>
		<title>Mass Importing Assets</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mass_Importing_Assets&amp;diff=3322"/>
		<updated>2025-08-12T21:18:28Z</updated>

		<summary type="html">&lt;p&gt;IDK: added table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO can be run with the &amp;lt;code&amp;gt;-convert&amp;lt;/code&amp;gt; flag to convert raw assets (such as pokemon sprites, portraits, or font) into game-usable form.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMDO.exe -raw RawAsset/ -convert all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This command will convert all assets found in the RawAsset subfolder relative to the current directory.&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-raw&amp;lt;/code&amp;gt; is used to specify the location of the raw asset folder.  It must have a file structure like that of [https://github.com/PMDCollab/RawAsset/tree/master RawAsset], where each asset type is saved in its own subfolder.&lt;br /&gt;
* The &amp;lt;code&amp;gt;-convert&amp;lt;/code&amp;gt; flag can be used with a list of arguments specifying which type of asset to convert, or to convert all assets with &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a list of possible arguments, what they convert, and what subfolder they read from:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arg !! Folder !! Description&lt;br /&gt;
|-&lt;br /&gt;
| font || Font || The [[Modding_Font|font]] used for textboxes, dungeon titles, and damage numbers.&lt;br /&gt;
|-&lt;br /&gt;
| chara || Sprite || [[Modding_Portraits_and_Sprites|Pokemon sprites]]&lt;br /&gt;
|-&lt;br /&gt;
| portrait || Portrait || [[Modding_Portraits_and_Sprites|Pokemon portraits]]&lt;br /&gt;
|-&lt;br /&gt;
| tile || Tile || [[Modding_Tilesets|Static map tilesets]]&lt;br /&gt;
|-&lt;br /&gt;
| item || Item || Item sprites.  Uses the same naming convention as [[Modding_Objects_and_VFX|VFX]]&lt;br /&gt;
|-&lt;br /&gt;
| particle || Particle || [[Modding_Objects_and_VFX|Particle VFX for attacks]]&lt;br /&gt;
|-&lt;br /&gt;
| beam || Beam || [[Modding_Beam_VFX|Beam and column-type VFX for attacks]]&lt;br /&gt;
|-&lt;br /&gt;
| icon || Icon || Status condition icons and emotes.  Uses the same naming convention as [[Modding_Objects_and_VFX|VFX]]&lt;br /&gt;
|-&lt;br /&gt;
| object || Object || [[Modding_Objects_and_VFX|Map objects and traps]]&lt;br /&gt;
|-&lt;br /&gt;
| bg || BG || Backgrounds for maps and attack animations.  Uses the same naming convention as [[Modding_Objects_and_VFX|VFX]]&lt;br /&gt;
|-&lt;br /&gt;
| autotile || Dtef|| Imports all dtef files into their own tileset sheets, and automatically creates dungeon autotiles for them.&lt;br /&gt;
|-&lt;br /&gt;
| all || -- || Loops through all above folders and converts them.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding Assets]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Mass_Sprite_Import&amp;diff=3321</id>
		<title>Tutorial:Mass Sprite Import</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Mass_Sprite_Import&amp;diff=3321"/>
		<updated>2025-08-12T20:56:45Z</updated>

		<summary type="html">&lt;p&gt;IDK: link conversion flags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO&#039;s sprites and portraits are found in the &amp;lt;code&amp;gt;sprite/&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;portrait/&amp;lt;/code&amp;gt; subdirectories of the https://github.com/PMDCollab/RawAsset repository.&lt;br /&gt;
&lt;br /&gt;
PMDO gets its sprites and portraits from two repositories:&lt;br /&gt;
&lt;br /&gt;
# https://github.com/PMDCollab/SpriteCollab , which is the repo of the PMD Sprite Repository. This contains all canon sprites and portraits from PMD2 plus custom ones by fans.&lt;br /&gt;
# https://github.com/audinowho/CustomSpriteCollab , which is a custom repo of sprites and portraits meant to serve as an override to the sprites in the above repository.  It consists of exceptional cases or textures that weren&#039;t accepted in the repo but still preferred for PMDO.&lt;br /&gt;
&lt;br /&gt;
Every so often, the RawAsset repo is updated with textures from these two repos in a mass import action.&lt;br /&gt;
&lt;br /&gt;
This page outlines the workflow used to import all of these textures into PMDO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Filesystem Setup ==&lt;br /&gt;
&lt;br /&gt;
These are all of the relevant folders and files needed to do a mass update of sprites and portraits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDODump&lt;br /&gt;
./PMDODump/RawAsset&lt;br /&gt;
./PMDODump/RawAsset/added_nodes.txt&lt;br /&gt;
./PMDODump/RawAsset/transfer.json&lt;br /&gt;
./PMDODump/RawAsset/custom_transfer.json&lt;br /&gt;
./PMDODump/RawAsset/portrait_diff.csv&lt;br /&gt;
./PMDODump/RawAsset/sprite_diff.csv&lt;br /&gt;
./PMDODump/Scripts&lt;br /&gt;
./PMDODump/Scripts/sprite_sync.py&lt;br /&gt;
./SpriteBot/SpriteCollab&lt;br /&gt;
./SpriteBot/SpriteCollab/portrait&lt;br /&gt;
./SpriteBot/SpriteCollab/sprite&lt;br /&gt;
./SpriteBot/Custom&lt;br /&gt;
./SpriteBot/Custom/portrait&lt;br /&gt;
./SpriteBot/Custom/sprite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set up your directory structure such that it looks like this.&lt;br /&gt;
&lt;br /&gt;
This will involve cloning 4 repositories from github.&lt;br /&gt;
&lt;br /&gt;
First, you will need to find a suitable folder to begin in, and clone https://github.com/audinowho/PMDODump into it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone https://github.com/audinowho/PMDODump.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, update its submodule https://github.com/PMDCollab/RawAsset within PMDODump:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git submodule update --init --remote -- RawAsset&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will result in the following file structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDODump&lt;br /&gt;
./PMDODump/RawAsset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, you must create a &amp;lt;code&amp;gt;SpriteBot/&amp;lt;/code&amp;gt; folder on the same level as the PMDODump folder.&lt;br /&gt;
&lt;br /&gt;
Then, clone both https://github.com/PMDCollab/SpriteCollab and https://github.com/audinowho/CustomSpriteCollab to this location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/PMDCollab/SpriteCollab.git&lt;br /&gt;
git clone https://github.com/audinowho/CustomSpriteCollab.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will result in the following file structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDODump&lt;br /&gt;
./PMDODump/RawAsset&lt;br /&gt;
./SpriteBot/SpriteCollab&lt;br /&gt;
./SpriteBot/Custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You&#039;ve now set up all the needed repositories.&lt;br /&gt;
&lt;br /&gt;
== Importing to RawAsset ==&lt;br /&gt;
&lt;br /&gt;
Locate the file &amp;lt;code&amp;gt;./PMDODump/Scripts/sprite_sync.py&amp;lt;/code&amp;gt; and run the file using python.  You may need to install the requirements from &amp;lt;code&amp;gt;./PMDODump/Scripts/requirements.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will arrive at this message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Updating Transfer Map&lt;br /&gt;
Transfer json updated.  Review the added_nodes.txt and make your changes before proceeding.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;./PMDODump/RawAsset/added_nodes.txt&amp;lt;/code&amp;gt;.  This is a generated file showing what new nodes have been added to the pokemon list compared to the current repository.  This will include all manner of new species/forms due to a new game coming out, or new alternate portraits created by fans.&lt;br /&gt;
&lt;br /&gt;
[[File:Maintenance_Added_Nodes.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
The script automatically sets Alternates and AltColors to be ignored, as seen with the asterisk preceding their names.  However, some forms that we don&#039;t want in PMDO might still slip through the cracks.  PMDO sticks to only canon Pokemon that are not barred from inter-generational transfer.  The &amp;quot;baseline pokedex&amp;quot; so to speak.  We see here that Pikachu has a number of hat forms that must be manually excluded from transfer.&lt;br /&gt;
&lt;br /&gt;
To do this, open up &amp;lt;code&amp;gt;./PMDODump/RawAsset/transfer.json&amp;lt;/code&amp;gt; which contains the node structure for transferring portraits and sprites.&lt;br /&gt;
&lt;br /&gt;
[[File:Maintenance_Transfer_Json.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;code&amp;gt;portrait_dest&amp;lt;/code&amp;gt; is set to -1, it means to import the portrait from the source to the same slot as in the destination. If it&#039;s set to 0 or above, it gets imported to that specific numbered slot.  If it&#039;s set to -2, it is not imported at all.  The same policy goes for sprites.&lt;br /&gt;
&lt;br /&gt;
[[File:Maintenance_Transfer_Json_Ignored.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
In this case, we have set all of the pikachu forms&#039; &amp;lt;code&amp;gt;portrait_dest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sprite_dest&amp;lt;/code&amp;gt; to -2, preventing them from being imported.&lt;br /&gt;
&lt;br /&gt;
This node system also applies to &amp;lt;code&amp;gt;./PMDODump/RawAsset/custom_transfer.json&amp;lt;/code&amp;gt;.  However, given that repo is specific to PMDO there is no need to review it for unexpected changes.&lt;br /&gt;
&lt;br /&gt;
The process of reviewing the nodes needs to be done every time an import happens to ensure a consistent PMDO sprite repo.&lt;br /&gt;
&lt;br /&gt;
Once this is completed, save the transfer file and press enter to continue the python script.  It will begin the hours-long process of copying the desired files over and examining the contents for changes.&lt;br /&gt;
&lt;br /&gt;
== Converting from RawAsset ==&lt;br /&gt;
&lt;br /&gt;
Once the import is complete, you can confirm there are changed files in your repository by viewing RawAsset in git.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also see that &amp;lt;code&amp;gt;./PMDODump/RawAsset/portrait_diff.csv&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;./PMDODump/RawAsset/sprite_diff.csv&amp;lt;/code&amp;gt; have been changed.  These lists offer a comprehensive breakdown of which files changed and where.&lt;br /&gt;
&lt;br /&gt;
Now, you must run PMDO with the [[Mass_Importing_Assets|conversion flags]] turned on to convert the sprites to PMDO&#039;s format.  In windows, it would be like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PMDO.exe -raw ../../RawAsset/ -convert chara portrait&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace the &amp;lt;code&amp;gt;../../RawAsset/&amp;lt;/code&amp;gt; argument with the path of RawAsset relative to your own installation.  This will import character and portrait textures to the &amp;lt;code&amp;gt;Content/Chara&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Content/Portrait&amp;lt;/code&amp;gt; folders in your PMDO installation.&lt;br /&gt;
&lt;br /&gt;
Alternatively, if you are running PMDO from source, you can do this conversion just by adding &amp;lt;code&amp;gt;-convert chara portrait&amp;lt;/code&amp;gt; to your debug arguments.&lt;br /&gt;
&lt;br /&gt;
Wait for the conversion to finish.  It takes hours.&lt;br /&gt;
&lt;br /&gt;
Run the game in debug mode and change sprites to confirm everything imported okay.  Use the &amp;lt;code&amp;gt;./PMDODump/RawAsset/portrait_diff.csv&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;./PMDODump/RawAsset/sprite_diff.csv&amp;lt;/code&amp;gt; as a guide to see which sprites/portraits deserve more attention in inspection.&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
&lt;br /&gt;
Sprite and portrait updates are an occasional occurrence because of how long the conversion steps take.  If you want to contribute an update to PMDO&#039;s sprite repo yourself, you will need to provide the converted files in &amp;lt;code&amp;gt;Content/Chara&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Content/Portrait&amp;lt;/code&amp;gt;, as well as the changes in &amp;lt;code&amp;gt;./PMDODump/RawAsset&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This can be done either by sending a zip, or making a [[Contributing_Code| pull request]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mass_Importing_Assets&amp;diff=3320</id>
		<title>Mass Importing Assets</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mass_Importing_Assets&amp;diff=3320"/>
		<updated>2025-08-12T20:55:21Z</updated>

		<summary type="html">&lt;p&gt;IDK: created page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO can be run with the &amp;lt;code&amp;gt;-convert&amp;lt;/code&amp;gt; flag to convert raw assets (such as pokemon sprites, portraits, or font) into game-usable form.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMDO.exe -raw RawAsset/ -convert all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This command will convert all assets found in the RawAsset subfolder relative to the current directory.&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-raw&amp;lt;/code&amp;gt; is used to specify the location of the raw asset folder.  It must have a file structure like that of [https://github.com/PMDCollab/RawAsset/tree/master RawAsset], where each asset type is saved in its own subfolder.&lt;br /&gt;
* The &amp;lt;code&amp;gt;-convert&amp;lt;/code&amp;gt; flag can be used with a list of arguments specifying which type of asset to convert, or to convert all assets with &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a list of possible arguments, what they convert, and what subfolder they read from:&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Modding_Font&amp;diff=3319</id>
		<title>Tutorial:Modding Font</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Modding_Font&amp;diff=3319"/>
		<updated>2025-08-12T19:44:49Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently, there&#039;s no UI panel for modding the font in PMDO.  However, it can still be imported to the base game as a part of [[Mass Importing Assets|Mass Import]].&lt;br /&gt;
&lt;br /&gt;
== Data ==&lt;br /&gt;
&lt;br /&gt;
Letters of the font, or glyphs, are stored as individual files, named after the hexadecimal code point of the glyph in [https://home.unicode.org/ Unicode].  They are full textures, with the PMD font containing the drop down shadow.&lt;br /&gt;
&lt;br /&gt;
The font in the &amp;lt;code&amp;gt;banner&amp;lt;/code&amp;gt; subfolder contains the font for title drops at the beginning of maps.  It supports the western latin alphabet, Japanese, Chinese, and Korean.  It does not have Cyrillic letters.&lt;br /&gt;
&lt;br /&gt;
The font in the &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; subfolder contains the main textboxfont.  It supports the western latin alphabet, Japanese, Chinese, and Korean.  It does not have Cyrillic letters.  The Unicode block for the [https://en.wikipedia.org/wiki/Private_Use_Areas Private Use Area] is used for [[Text Guide#Special Characters|special characters]].&lt;br /&gt;
&lt;br /&gt;
The PMD Font is rendered in-game from the top-left corner.  Every letter rendered to the screen advances the caret by exactly the letter&#039;s width in pixels.  Further spacing is specified in the FontData.xml:&lt;br /&gt;
&lt;br /&gt;
* SpaceWidth: The number of pixels to advance the caret with a whitespace character.&lt;br /&gt;
* CharHeight: The max height of the font, used for newlines.&lt;br /&gt;
* CharSpace: The number of pixels to advance the caret after rendering a non-whitespace character.&lt;br /&gt;
* LineSpace: The amount of space between lines in pixels, used for newlines.&lt;br /&gt;
&lt;br /&gt;
Additionally, FontData.xml specifies a list of Colorless glyphs that will not change color in-game even if commanded to.  This is mostly special characters that contain an icon image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
The existing textures used to import the PMD font is found in the [https://github.com/PMDCollab/RawAsset/tree/master/font RawAsset] repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding Assets]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Modding_Font&amp;diff=3318</id>
		<title>Tutorial:Modding Font</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Modding_Font&amp;diff=3318"/>
		<updated>2025-08-12T19:43:37Z</updated>

		<summary type="html">&lt;p&gt;IDK: clarify modding font possibility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently, there&#039;s no UI panel for modding the font in PMDO.  However, it can still be imported to the base game as a part of [[Mass Importing Assets|Mass Import]].&lt;br /&gt;
&lt;br /&gt;
== Data ==&lt;br /&gt;
&lt;br /&gt;
Letters of the font, or glyphs, are stored as individual files, named after the hexadecimal code point of the glyph in [https://home.unicode.org/ Unicode].  They are full textures, with the PMD font containing the drop down shadow.&lt;br /&gt;
&lt;br /&gt;
The font in the banner subfolder contains the dungeon font.  It supports the western latin alphabet, Japanese, Chinese, and Korean.  It does not have Cyrillic letters.&lt;br /&gt;
&lt;br /&gt;
The font in the text subfolder contains the main PMD font.  It supports the western latin alphabet, Japanese, Chinese, and Korean.  It does not have Cyrillic letters.  The Unicode block for the [https://en.wikipedia.org/wiki/Private_Use_Areas Private Use Area] is used for [[Text Guide#Special Characters|special characters]].&lt;br /&gt;
&lt;br /&gt;
The PMD Font is rendered in-game from the top-left corner.  Every letter rendered to the screen advances the caret by exactly the letter&#039;s width in pixels.  Further spacing is specified in the FontData.xml:&lt;br /&gt;
&lt;br /&gt;
* SpaceWidth: The number of pixels to advance the caret with a whitespace character.&lt;br /&gt;
* CharHeight: The max height of the font, used for newlines.&lt;br /&gt;
* CharSpace: The number of pixels to advance the caret after rendering a non-whitespace character.&lt;br /&gt;
* LineSpace: The amount of space between lines in pixels, used for newlines.&lt;br /&gt;
&lt;br /&gt;
Additionally, FontData.xml specifies a list of Colorless glyphs that will not change color in-game even if commanded to.  This is mostly special characters that contain an icon image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
The existing textures used to import the PMD font is found in the [https://github.com/PMDCollab/RawAsset/tree/master/font RawAsset] repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding Assets]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Mass_Sprite_Import&amp;diff=2760</id>
		<title>Tutorial:Mass Sprite Import</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Mass_Sprite_Import&amp;diff=2760"/>
		<updated>2025-07-20T19:01:17Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO&#039;s sprites and portraits are found in the &amp;lt;code&amp;gt;sprite/&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;portrait/&amp;lt;/code&amp;gt; subdirectories of the https://github.com/PMDCollab/RawAsset repository.&lt;br /&gt;
&lt;br /&gt;
PMDO gets its sprites and portraits from two repositories:&lt;br /&gt;
&lt;br /&gt;
# https://github.com/PMDCollab/SpriteCollab , which is the repo of the PMD Sprite Repository. This contains all canon sprites and portraits from PMD2 plus custom ones by fans.&lt;br /&gt;
# https://github.com/audinowho/CustomSpriteCollab , which is a custom repo of sprites and portraits meant to serve as an override to the sprites in the above repository.  It consists of exceptional cases or textures that weren&#039;t accepted in the repo but still preferred for PMDO.&lt;br /&gt;
&lt;br /&gt;
Every so often, the RawAsset repo is updated with textures from these two repos in a mass import action.&lt;br /&gt;
&lt;br /&gt;
This page outlines the workflow used to import all of these textures into PMDO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Filesystem Setup ==&lt;br /&gt;
&lt;br /&gt;
These are all of the relevant folders and files needed to do a mass update of sprites and portraits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDODump&lt;br /&gt;
./PMDODump/RawAsset&lt;br /&gt;
./PMDODump/RawAsset/added_nodes.txt&lt;br /&gt;
./PMDODump/RawAsset/transfer.json&lt;br /&gt;
./PMDODump/RawAsset/custom_transfer.json&lt;br /&gt;
./PMDODump/RawAsset/portrait_diff.csv&lt;br /&gt;
./PMDODump/RawAsset/sprite_diff.csv&lt;br /&gt;
./PMDODump/Scripts&lt;br /&gt;
./PMDODump/Scripts/sprite_sync.py&lt;br /&gt;
./SpriteBot/SpriteCollab&lt;br /&gt;
./SpriteBot/SpriteCollab/portrait&lt;br /&gt;
./SpriteBot/SpriteCollab/sprite&lt;br /&gt;
./SpriteBot/Custom&lt;br /&gt;
./SpriteBot/Custom/portrait&lt;br /&gt;
./SpriteBot/Custom/sprite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set up your directory structure such that it looks like this.&lt;br /&gt;
&lt;br /&gt;
This will involve cloning 4 repositories from github.&lt;br /&gt;
&lt;br /&gt;
First, you will need to find a suitable folder to begin in, and clone https://github.com/audinowho/PMDODump into it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone https://github.com/audinowho/PMDODump.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, update its submodule https://github.com/PMDCollab/RawAsset within PMDODump:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git submodule update --init --remote -- RawAsset&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will result in the following file structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDODump&lt;br /&gt;
./PMDODump/RawAsset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, you must create a &amp;lt;code&amp;gt;SpriteBot/&amp;lt;/code&amp;gt; folder on the same level as the PMDODump folder.&lt;br /&gt;
&lt;br /&gt;
Then, clone both https://github.com/PMDCollab/SpriteCollab and https://github.com/audinowho/CustomSpriteCollab to this location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/PMDCollab/SpriteCollab.git&lt;br /&gt;
git clone https://github.com/audinowho/CustomSpriteCollab.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will result in the following file structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDODump&lt;br /&gt;
./PMDODump/RawAsset&lt;br /&gt;
./SpriteBot/SpriteCollab&lt;br /&gt;
./SpriteBot/Custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You&#039;ve now set up all the needed repositories.&lt;br /&gt;
&lt;br /&gt;
== Importing to RawAsset ==&lt;br /&gt;
&lt;br /&gt;
Locate the file &amp;lt;code&amp;gt;./PMDODump/Scripts/sprite_sync.py&amp;lt;/code&amp;gt; and run the file using python.  You may need to install the requirements from &amp;lt;code&amp;gt;./PMDODump/Scripts/requirements.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will arrive at this message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Updating Transfer Map&lt;br /&gt;
Transfer json updated.  Review the added_nodes.txt and make your changes before proceeding.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;./PMDODump/RawAsset/added_nodes.txt&amp;lt;/code&amp;gt;.  This is a generated file showing what new nodes have been added to the pokemon list compared to the current repository.  This will include all manner of new species/forms due to a new game coming out, or new alternate portraits created by fans.&lt;br /&gt;
&lt;br /&gt;
[[File:Maintenance_Added_Nodes.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
The script automatically sets Alternates and AltColors to be ignored, as seen with the asterisk preceding their names.  However, some forms that we don&#039;t want in PMDO might still slip through the cracks.  PMDO sticks to only canon Pokemon that are not barred from inter-generational transfer.  The &amp;quot;baseline pokedex&amp;quot; so to speak.  We see here that Pikachu has a number of hat forms that must be manually excluded from transfer.&lt;br /&gt;
&lt;br /&gt;
To do this, open up &amp;lt;code&amp;gt;./PMDODump/RawAsset/transfer.json&amp;lt;/code&amp;gt; which contains the node structure for transferring portraits and sprites.&lt;br /&gt;
&lt;br /&gt;
[[File:Maintenance_Transfer_Json.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;code&amp;gt;portrait_dest&amp;lt;/code&amp;gt; is set to -1, it means to import the portrait from the source to the same slot as in the destination. If it&#039;s set to 0 or above, it gets imported to that specific numbered slot.  If it&#039;s set to -2, it is not imported at all.  The same policy goes for sprites.&lt;br /&gt;
&lt;br /&gt;
[[File:Maintenance_Transfer_Json_Ignored.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
In this case, we have set all of the pikachu forms&#039; &amp;lt;code&amp;gt;portrait_dest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sprite_dest&amp;lt;/code&amp;gt; to -2, preventing them from being imported.&lt;br /&gt;
&lt;br /&gt;
This node system also applies to &amp;lt;code&amp;gt;./PMDODump/RawAsset/custom_transfer.json&amp;lt;/code&amp;gt;.  However, given that repo is specific to PMDO there is no need to review it for unexpected changes.&lt;br /&gt;
&lt;br /&gt;
The process of reviewing the nodes needs to be done every time an import happens to ensure a consistent PMDO sprite repo.&lt;br /&gt;
&lt;br /&gt;
Once this is completed, save the transfer file and press enter to continue the python script.  It will begin the hours-long process of copying the desired files over and examining the contents for changes.&lt;br /&gt;
&lt;br /&gt;
== Converting from RawAsset ==&lt;br /&gt;
&lt;br /&gt;
Once the import is complete, you can confirm there are changed files in your repository by viewing RawAsset in git.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also see that &amp;lt;code&amp;gt;./PMDODump/RawAsset/portrait_diff.csv&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;./PMDODump/RawAsset/sprite_diff.csv&amp;lt;/code&amp;gt; have been changed.  These lists offer a comprehensive breakdown of which files changed and where.&lt;br /&gt;
&lt;br /&gt;
Now, you must run PMDO with the conversion flags turned on to convert the sprites to PMDO&#039;s format.  In windows, it would be like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PMDO.exe -raw ../../RawAsset/ -convert chara portrait&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace the &amp;lt;code&amp;gt;../../RawAsset/&amp;lt;/code&amp;gt; argument with the path of RawAsset relative to your own installation.  This will import character and portrait textures to the &amp;lt;code&amp;gt;Content/Chara&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Content/Portrait&amp;lt;/code&amp;gt; folders in your PMDO installation.&lt;br /&gt;
&lt;br /&gt;
Alternatively, if you are running PMDO from source, you can do this conversion just by adding &amp;lt;code&amp;gt;-convert chara portrait&amp;lt;/code&amp;gt; to your debug arguments.&lt;br /&gt;
&lt;br /&gt;
Wait for the conversion to finish.  It takes hours.&lt;br /&gt;
&lt;br /&gt;
Run the game in debug mode and change sprites to confirm everything imported okay.  Use the &amp;lt;code&amp;gt;./PMDODump/RawAsset/portrait_diff.csv&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;./PMDODump/RawAsset/sprite_diff.csv&amp;lt;/code&amp;gt; as a guide to see which sprites/portraits deserve more attention in inspection.&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
&lt;br /&gt;
Sprite and portrait updates are an occasional occurrence because of how long the conversion steps take.  If you want to contribute an update to PMDO&#039;s sprite repo yourself, you will need to provide the converted files in &amp;lt;code&amp;gt;Content/Chara&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Content/Portrait&amp;lt;/code&amp;gt;, as well as the changes in &amp;lt;code&amp;gt;./PMDODump/RawAsset&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This can be done either by sending a zip, or making a [[Contributing_Code| pull request]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2758</id>
		<title>User:IDK/Speed Rework</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2758"/>
		<updated>2025-07-20T00:09:14Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The current speed system that everyone moves on is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I tried changing it to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this would in theory solve the speed-up delay&lt;br /&gt;
&lt;br /&gt;
because previously it was:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Use speed-up move, player is marked as used-move&lt;br /&gt;
0: Enemy moves&lt;br /&gt;
1/2: Player is at double speed and would be able to move again, but is marked as used-move so they can&#039;t&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
0: Player walks&lt;br /&gt;
0: Enemy walks&lt;br /&gt;
1/2: Player can walk again&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it would be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Use speed-up move, player is marked as used-move&lt;br /&gt;
1: Enemy moves&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
1/2: Player walks&lt;br /&gt;
1: Player can walk again&lt;br /&gt;
1: Enemy gets to move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HOWEVER&lt;br /&gt;
&lt;br /&gt;
this design would reveal a favoritism to enemy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Player attacks&lt;br /&gt;
1: Enemy used Silver wind!  Enemy is at double speed! (Marked as move-used)&lt;br /&gt;
-- Next turn.  All used-move flags cleared. --&lt;br /&gt;
1/2: Enemy used Silver Wind! Enemy is at triple speed! (Marked as move-used)&lt;br /&gt;
2/3: Enemy would normally be able to move AGAIN, but is marked as used-move so they can&#039;t (thank god)&lt;br /&gt;
1: Player can respond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
technically, this issue also occurs in the current system, just with a one-turn delay.  But our current system slightly favors enemies too.  But what if...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- All used-move flags for ENEMIES cleared --&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- All used-move flags for PLAYERS cleared --&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or rather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds (Player)&lt;br /&gt;
-- All used-move flags cleared --&lt;br /&gt;
    0: All movement Speeds (Enemies)&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t look very clean, but it would result in fairness:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind.  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Double speed).  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Triple speed). Used-move set.&lt;br /&gt;
1/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
2/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if both the player and the enemy get to move on a sub-turn like 1/2, the player gets to move first and then the enemy moves right after&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: (Already at 2x speed) Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario is slightly in favor of the player, but only within the player&#039;s frame of reference, so it should be fine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: (already at 2x speed) Move.&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Agility. Used-Move set&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Can&#039;t Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional scenarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player is already at double speed, moves.&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player used agility! &amp;lt;move use set&amp;gt;&lt;br /&gt;
2/3:Player qualifies for this tier but skips.  already used move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player skips.  already used move&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/3:Player moves&lt;br /&gt;
2/3:Player moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this only works because there are two sides: player and enemy.&lt;br /&gt;
&lt;br /&gt;
which is exactly the same as the number of directions in the flow of time itself: forwards and backwards.&lt;br /&gt;
&lt;br /&gt;
This causes regression in another problem: Normally, Summon Trap turns on the Move Use flag to prevent the summoned enemies from immediately attacking (only for enemies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Enemies (including the new summons) move or attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of the new move use flag mechanics, enemies are able to attack immediately in both scenarios, respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must still have a variable that prevents movement or attacking that gets cleared at the end of a round/beginning of a round, like the original Move Use flag.  We will call it the End Turn Lock.  As long as Move Use OR End Turn Lock are on, the character cannot act.  For example, with summons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  End Turn Lock are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chest/Orb Monster Houses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Allies skip due to End Turn Lock&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the player activates a chest house while at double speed, they may lose their first reacting turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player cannot act due to Move Use flag set&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Removing End Turn Lock must also remove Move Use flag, but ONLY if they have End Turn Lock to begin with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared, Move Use flag cleared --&lt;br /&gt;
0:Player reacts to new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for summon trap:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player steps on a summon tile.  End Turn Locks are set for the newly spawned enemies.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies can act, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock and Move Use flag cleared for enemies --&lt;br /&gt;
0:Player reacts to new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2757</id>
		<title>User:IDK/Speed Rework</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2757"/>
		<updated>2025-07-20T00:07:18Z</updated>

		<summary type="html">&lt;p&gt;IDK: player Move use reaction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The current speed system that everyone moves on is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I tried changing it to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this would in theory solve the speed-up delay&lt;br /&gt;
&lt;br /&gt;
because previously it was:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Use speed-up move, player is marked as used-move&lt;br /&gt;
0: Enemy moves&lt;br /&gt;
1/2: Player is at double speed and would be able to move again, but is marked as used-move so they can&#039;t&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
0: Player walks&lt;br /&gt;
0: Enemy walks&lt;br /&gt;
1/2: Player can walk again&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it would be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Use speed-up move, player is marked as used-move&lt;br /&gt;
1: Enemy moves&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
1/2: Player walks&lt;br /&gt;
1: Player can walk again&lt;br /&gt;
1: Enemy gets to move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HOWEVER&lt;br /&gt;
&lt;br /&gt;
this design would reveal a favoritism to enemy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Player attacks&lt;br /&gt;
1: Enemy used Silver wind!  Enemy is at double speed! (Marked as move-used)&lt;br /&gt;
-- Next turn.  All used-move flags cleared. --&lt;br /&gt;
1/2: Enemy used Silver Wind! Enemy is at triple speed! (Marked as move-used)&lt;br /&gt;
2/3: Enemy would normally be able to move AGAIN, but is marked as used-move so they can&#039;t (thank god)&lt;br /&gt;
1: Player can respond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
technically, this issue also occurs in the current system, just with a one-turn delay.  But our current system slightly favors enemies too.  But what if...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- All used-move flags for ENEMIES cleared --&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- All used-move flags for PLAYERS cleared --&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or rather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds (Player)&lt;br /&gt;
-- All used-move flags cleared --&lt;br /&gt;
    0: All movement Speeds (Enemies)&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t look very clean, but it would result in fairness:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind.  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Double speed).  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Triple speed). Used-move set.&lt;br /&gt;
1/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
2/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if both the player and the enemy get to move on a sub-turn like 1/2, the player gets to move first and then the enemy moves right after&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: (Already at 2x speed) Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario is slightly in favor of the player, but only within the player&#039;s frame of reference, so it should be fine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: (already at 2x speed) Move.&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Agility. Used-Move set&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Can&#039;t Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional scenarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player is already at double speed, moves.&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player used agility! &amp;lt;move use set&amp;gt;&lt;br /&gt;
2/3:Player qualifies for this tier but skips.  already used move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player skips.  already used move&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/3:Player moves&lt;br /&gt;
2/3:Player moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this only works because there are two sides: player and enemy.&lt;br /&gt;
&lt;br /&gt;
which is exactly the same as the number of directions in the flow of time itself: forwards and backwards.&lt;br /&gt;
&lt;br /&gt;
This causes regression in another problem: Normally, Summon Trap turns on the Move Use flag to prevent the summoned enemies from immediately attacking (only for enemies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Enemies (including the new summons) move or attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of the new move use flag mechanics, enemies are able to attack immediately in both scenarios, respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must still have a variable that prevents movement or attacking that gets cleared at the end of a round/beginning of a round, like the original Move Use flag.  We will call it the End Turn Lock.  As long as Move Use OR End Turn Lock are on, the character cannot act.  For example, with summons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  End Turn Lock are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chest/Orb Monster Houses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Allies skip due to End Turn Lock&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the player activates a chest house while at double speed, they may lose their first reacting turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player cannot act due to Move Use flag set&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Removing End Turn Lock must also remove Move Use flag:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1/2:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.  Player&#039;s Move Use is set.&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared, Move Use flag cleared --&lt;br /&gt;
0:Player reacts to new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies move/attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2754</id>
		<title>User:IDK/Speed Rework</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2754"/>
		<updated>2025-07-19T03:46:04Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The current speed system that everyone moves on is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I tried changing it to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this would in theory solve the speed-up delay&lt;br /&gt;
&lt;br /&gt;
because previously it was:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Use speed-up move, player is marked as used-move&lt;br /&gt;
0: Enemy moves&lt;br /&gt;
1/2: Player is at double speed and would be able to move again, but is marked as used-move so they can&#039;t&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
0: Player walks&lt;br /&gt;
0: Enemy walks&lt;br /&gt;
1/2: Player can walk again&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it would be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Use speed-up move, player is marked as used-move&lt;br /&gt;
1: Enemy moves&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
1/2: Player walks&lt;br /&gt;
1: Player can walk again&lt;br /&gt;
1: Enemy gets to move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HOWEVER&lt;br /&gt;
&lt;br /&gt;
this design would reveal a favoritism to enemy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Player attacks&lt;br /&gt;
1: Enemy used Silver wind!  Enemy is at double speed! (Marked as move-used)&lt;br /&gt;
-- Next turn.  All used-move flags cleared. --&lt;br /&gt;
1/2: Enemy used Silver Wind! Enemy is at triple speed! (Marked as move-used)&lt;br /&gt;
2/3: Enemy would normally be able to move AGAIN, but is marked as used-move so they can&#039;t (thank god)&lt;br /&gt;
1: Player can respond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
technically, this issue also occurs in the current system, just with a one-turn delay.  But our current system slightly favors enemies too.  But what if...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- All used-move flags for ENEMIES cleared --&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- All used-move flags for PLAYERS cleared --&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or rather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds (Player)&lt;br /&gt;
-- All used-move flags cleared --&lt;br /&gt;
    0: All movement Speeds (Enemies)&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t look very clean, but it would result in fairness:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind.  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Double speed).  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Triple speed). Used-move set.&lt;br /&gt;
1/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
2/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if both the player and the enemy get to move on a sub-turn like 1/2, the player gets to move first and then the enemy moves right after&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: (Already at 2x speed) Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario is slightly in favor of the player, but only within the player&#039;s frame of reference, so it should be fine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: (already at 2x speed) Move.&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Agility. Used-Move set&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Can&#039;t Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional scenarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player is already at double speed, moves.&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player used agility! &amp;lt;move use set&amp;gt;&lt;br /&gt;
2/3:Player qualifies for this tier but skips.  already used move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player skips.  already used move&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/3:Player moves&lt;br /&gt;
2/3:Player moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this only works because there are two sides: player and enemy.&lt;br /&gt;
&lt;br /&gt;
which is exactly the same as the number of directions in the flow of time itself: forwards and backwards.&lt;br /&gt;
&lt;br /&gt;
This causes regression in another problem: Normally, Summon Trap turns on the Move Use flag to prevent the summoned enemies from immediately attacking (only for enemies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Enemies (including the new summons) move or attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of the new move use flag mechanics, enemies are able to attack immediately in both scenarios, respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must still have a variable that prevents movement or attacking that gets cleared at the end of a round/beginning of a round, like the original Move Use flag.  We will call it the End Turn Lock.  As long as Move Use OR End Turn Lock are on, the character cannot act.  For example, with summons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  End Turn Lock are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chest/Orb Monster Houses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Allies skip due to End Turn Lock&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2753</id>
		<title>User:IDK/Speed Rework</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2753"/>
		<updated>2025-07-19T01:05:22Z</updated>

		<summary type="html">&lt;p&gt;IDK: End Turn Lock&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The current speed system that everyone moves on is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I tried changing it to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this would in theory solve the speed-up delay&lt;br /&gt;
&lt;br /&gt;
because previously it was:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Use speed-up move, player is marked as used-move&lt;br /&gt;
0: Enemy moves&lt;br /&gt;
1/2: Player is at double speed and would be able to move again, but is marked as used-move so they can&#039;t&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
0: Player walks&lt;br /&gt;
0: Enemy walks&lt;br /&gt;
1/2: Player can walk again&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it would be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Use speed-up move, player is marked as used-move&lt;br /&gt;
1: Enemy moves&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
1/2: Player walks&lt;br /&gt;
1: Player can walk again&lt;br /&gt;
1: Enemy gets to move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HOWEVER&lt;br /&gt;
&lt;br /&gt;
this design would reveal a favoritism to enemy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Player attacks&lt;br /&gt;
1: Enemy used Silver wind!  Enemy is at double speed! (Marked as move-used)&lt;br /&gt;
-- Next turn.  All used-move flags cleared. --&lt;br /&gt;
1/2: Enemy used Silver Wind! Enemy is at triple speed! (Marked as move-used)&lt;br /&gt;
2/3: Enemy would normally be able to move AGAIN, but is marked as used-move so they can&#039;t (thank god)&lt;br /&gt;
1: Player can respond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
technically, this issue also occurs in the current system, just with a one-turn delay.  But our current system slightly favors enemies too.  But what if...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- All used-move flags for ENEMIES cleared --&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- All used-move flags for PLAYERS cleared --&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or rather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds (Player)&lt;br /&gt;
-- All used-move flags cleared --&lt;br /&gt;
    0: All movement Speeds (Enemies)&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t look very clean, but it would result in fairness:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind.  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Double speed).  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Triple speed). Used-move set.&lt;br /&gt;
1/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
2/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if both the player and the enemy get to move on a sub-turn like 1/2, the player gets to move first and then the enemy moves right after&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: (Already at 2x speed) Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario is slightly in favor of the player, but only within the player&#039;s frame of reference, so it should be fine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: (already at 2x speed) Move.&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Agility. Used-Move set&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Can&#039;t Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional scenarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player is already at double speed, moves.&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player used agility! &amp;lt;move use set&amp;gt;&lt;br /&gt;
2/3:Player qualifies for this tier but skips.  already used move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player skips.  already used move&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/3:Player moves&lt;br /&gt;
2/3:Player moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this only works because there are two sides: player and enemy.&lt;br /&gt;
&lt;br /&gt;
which is exactly the same as the number of directions in the flow of time itself: forwards and backwards.&lt;br /&gt;
&lt;br /&gt;
This causes regression in another problem: Normally, Summon Trap turns on the Move Use flag to prevent the summoned enemies from immediately attacking (only for enemies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Enemies (including the new summons) move or attack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
0:Enemies skip due to Move Use flag&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of the new move use flag mechanics, enemies are able to attack immediately in both scenarios, respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  Move Use flags are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And Orb/Chest-activated Monster Houses turn on the Move Use flag to prevent everyone from immediately attacking or reacting, until it&#039;s the leader&#039;s next turn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  Move Use flags are set for everyone on the floor.&lt;br /&gt;
0:Allies skip due to Move Use flag&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move or attack!&lt;br /&gt;
1/4: Player/allies can move, Enemies can move&lt;br /&gt;
1/3: Player/allies can move, Enemies can move&lt;br /&gt;
1/2: Player/allies can move, Enemies can move&lt;br /&gt;
2/3: Player/allies can move, Enemies can move&lt;br /&gt;
3/4: Player/allies can move, Enemies can move&lt;br /&gt;
--- End Turn, Move Use clears --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must still have a variable that prevents movement or attacking that gets cleared at the end of a round/beginning of a round, like the original Move Use flag.  We will call it the End Turn Lock.  As long as Move Use OR End Turn Lock are on, the character cannot act.  For example, with summons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player steps on a summon Trap.  End Turn Lock are set for the newly summoned enemies.&lt;br /&gt;
0:Allies take their turn&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Player/allies can move, Enemies skip&lt;br /&gt;
1/3: Player/allies can move, Enemies skip&lt;br /&gt;
1/2: Player/allies can move, Enemies skip&lt;br /&gt;
2/3: Player/allies can move, Enemies skip&lt;br /&gt;
3/4: Player/allies can move, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the new summons&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chest/Orb Monster Houses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player opens a chest, triggers a monster house.  End Turn Locks are set for everyone on the floor.&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Allies skip due to End Turn Lock&lt;br /&gt;
0:Enemies skip due to End Turn Lock&lt;br /&gt;
1/4: Allies skip, Enemies skip&lt;br /&gt;
1/3: Allies skip, Enemies skip&lt;br /&gt;
1/2: Allies skip, Enemies skip&lt;br /&gt;
2/3: Allies skip, Enemies skip&lt;br /&gt;
3/4: Allies skip, Enemies skip&lt;br /&gt;
-- End Turn, End Turn Lock cleared --&lt;br /&gt;
0:Player reacts to the Monster House&lt;br /&gt;
-- Move Use Clear --&lt;br /&gt;
0:Allies react to new summons&lt;br /&gt;
0:Enemies can move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/RNG&amp;diff=2679</id>
		<title>User:IDK/RNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/RNG&amp;diff=2679"/>
		<updated>2025-04-30T00:16:20Z</updated>

		<summary type="html">&lt;p&gt;IDK: rng article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some folks on the discord have pointed out how various changes in PMDO have made RNG more enjoyable or easier to deal compared to other roguelikes or main series Pokemon.&lt;br /&gt;
&lt;br /&gt;
* Critical Hits have a base chance of 0.&lt;br /&gt;
* Additional effects never have less than a 25% chance of triggering&lt;br /&gt;
* Sleep ticks down with every hit, and expires immediately if from a damaging hit&lt;br /&gt;
* Paralysis causes inaction every other turn, for 3 turns&lt;br /&gt;
* Confusion randomizes your direction to front and sides&lt;br /&gt;
* Poisoning ends after 5 turns, always taking 5/8 HP (5/16 if the player stands completely still)&lt;br /&gt;
* Statuses in general always end on your turn, guaranteeing your turn to act.&lt;br /&gt;
* Traps are visible, but not always revealed.&lt;br /&gt;
* You can never miss twice.&lt;br /&gt;
&lt;br /&gt;
These design choices arose from my experimentation and playtesting of PMDO over the years and the formation of my own philosophy with how to handle luck factors. The factors I keep in mind for my personal RNG design roughly comes down to three things:&lt;br /&gt;
&lt;br /&gt;
== Boundedness of Outcome ==&lt;br /&gt;
&lt;br /&gt;
What&#039;s the worst thing that could happen?  Is it possible for a truly demonic RNG to carry a player into disaster from the start to finish?  I came to look at these random outcomes as bounded or unbounded.&lt;br /&gt;
&lt;br /&gt;
* An RPG where every single attack could miss, from the weak starting attack to the emergency nuke, could result in you missing all 5 turns against an enemy that 5HKOs you.  The number of misses you could get is **unbounded**.&lt;br /&gt;
* A roguelike that consists of only straight consecutive rooms, each with either an enemy or a healing item, could give the player nothing but enemies until they collapsed from attrition.  The number of enemies they could face before obtaining necessary resources is **unbounded**.&lt;br /&gt;
* Tetris, implemented with naive RNG of piece spawning, could theoretically give the player [https://en.wikipedia.org/wiki/Tetris#Infinite_game_question all snake pieces], which will cause a player to top out as they have no way to put them all together in rows.  The number of bad pieces the game could hand them is **unbounded**.&lt;br /&gt;
* A more conceptual example: an infinite deck of playing cards has infinity of every card.  The number of unwanted cards a player could consecutively get is **unbounded**.&lt;br /&gt;
&lt;br /&gt;
In earlier days of PMDO development, I approached RNG from the lens of [https://www.youtube.com/watch?v=dwI5b-wRLic input vs output randomness].  I experimented with [https://www.gamedeveloper.com/design/randomness-and-game-design purist views] and removed factors like missing or additional effects entirely.  But with testing these things on and off I found that this model broke down in increasingly noticeable ways.  The above examples feature both inputs and outputs, but their chance of dealing catastrophe to the player were equal. Output randomness is just input randomness delayed to the next turn, and it seemed better to view the role of luck in a continuum than fixating on single instances.  And what seemed to matter here is the capability for the RNG to be *continuously* adversarial from start to finish.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* A finite deck will guarantee odds of cards that werent yet drawn, with more reliability the smaller the deck.  This RNG is **bounded to the number of cards in the deck**.  Modern cardlikes tend to have significantly smaller decks than traditional card games, and often benefit from this smaller possibility space.&lt;br /&gt;
* The standard Tetris RNG enforced by the Tetris Guidelines generates one of every piece in grouped bags.  It is **bounded to [https://tetris.wiki/Random_Generator once per 7 drops]**.  This provision was made specifically to allow the player a manageable even-ness of probability to play with.&lt;br /&gt;
* A roguelike that consists of only straight consecutive rooms, with healing items placed at every 4 or 5th room, is guaranteed to allow the player to keep going assuming the monsters in between are a survivable gauntlet up to that point.  It&#039;s **bounded to a mnimum of 1 item per 5 rooms**.  This is used in practice: Brogue and numerous other roguelikes use this to properly pace out their food spawns to ensure the player doesn&#039;t starve.  PMDO follows this in its apple and leppa spawn.&lt;br /&gt;
* An RPG where the player can never miss twice is **bounded to 1/2 their average attack effectiveness**.  If the player missed their first swing, they are now in a situations where it&#039;s better to use the strongest attack on the next turn to make up the DPS.  If they landed their first swing, maybe it&#039;s better to conserve resources.&lt;br /&gt;
&lt;br /&gt;
PMDO can never miss twice.  If I wind up in a situation where I have to gamble life and death on an un-guaranteed attack, there&#039;s usually something in my last 4 turns that tells me I messed up somewhere.  Additionally, chained applications of crowd-controlling status effects such as flinch simply cannot work: since players recover from the status on their turn, they always have a window of time to respond.  From my journey in iterating this game, I&#039;ve found bounded/unbounded categorization to serve me better than input/output in quantifying satisfying risk management and adaptation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Severity of Consequence vs Warning ==&lt;br /&gt;
&lt;br /&gt;
How random an outcome can be is only part of the equation to making a player upset or satisfied.  The other part is what&#039;s at stake.&lt;br /&gt;
&lt;br /&gt;
* Getting hit with an instant death that sends you back to the beginning of an 8 hour endeavor is severe.  Getting hit with instant death that costs you 5 seconds to next respawn less so.&lt;br /&gt;
* Losing a long 6v6 ladder game of Pokemon Showdown is severe, at least compared to losing the RPS-like 1v1 ladder. &lt;br /&gt;
* A status condition where you cant do anything but take damage is severe, but status condition where you cant do anything until you take damage is less severe.  And this is even less severe when your ability to act is spread across multiple units on the field instead of one (Singles, Doubles, PMD&#039;s 4-team simultaneity).&lt;br /&gt;
&lt;br /&gt;
Games can be enjoyable tests of skill with immense amounts of luck intertwined so long as it&#039;s [https://www.gamedeveloper.com/design/video-games-luck-and-orange-juice-100-relevant easy to recover and try again].  This can apply to recovering between sessions, or recovering between events occurring in the same game session.&lt;br /&gt;
&lt;br /&gt;
The more severe a consequence or outcome I introduce, the more I make the game warn the player about it, the more opportunities I give to the player to avoid it.  This also bleeds into the practice of telegraphing threats ahead of time in completely RNG-less settings.&lt;br /&gt;
&lt;br /&gt;
* In PMDO, status effects are much easier to deal with, and so their chance of occurrence is much higher.  There will always be a chance of burn with Ember.  Always a chance of poisoning with poison sting.  These are things the player must always keep in mind, but this demand is made more reasonable by the larger amount of backup plans available to deal with them.  The awkward situations that enemy procs *could* land the player in create the varied challenges to serve as the input randomness of any given turn thereafter. Factor in their own team&#039;s likelyhood of scoring these effects on opponents, and you have a setup that breeds surprise and encourages adaptation.  This is also a strong point of battles of main series Pokemon&#039;s ingame campaigns- the inconsistency of additional effects drives much of the situational variety seen in battling.&lt;br /&gt;
* This also affects trap philosophy: Traps that are guaranteed to hit up to 1 tile away for a recoverable status effect or damage are unidentified, while autotargeting traps with severe or long-term consequences (item destruction, PP-zero) are all revealed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Demand for Presence of Mind ==&lt;br /&gt;
&lt;br /&gt;
I often try to keep the rng outcome tree relatively tame within a round of the game.  In my playthroughs, thinking several turns ahead has proved satisfying when each of those turns results in two or three possible outcomes.  Thinking several turns ahead when each of those turns can lead to seven leads to multiplicative game trees that demand a presence of mind beyond my grasp.  [https://keithburgun.net/uncapped-look-ahead-and-the-information-horizon/ This is also something that can happen with purely RNG-less games].&lt;br /&gt;
&lt;br /&gt;
It *is* possible to take a step back and analyze every possible outcome [https://www.youtube.com/watch?v=tTaj5wCFvQM on every possible set].  Moments like these are intense in their own right even when spending 10 minutes on attack selection. However, I chose not to design for this pace of gameplay.&lt;br /&gt;
&lt;br /&gt;
* This is why the base crit rate is 0, and also why your heart rate spikes when super luck absol enters your screen to temporarily reintroduce that demand for playing around the crit range.&lt;br /&gt;
* It&#039;s also why moves with additional effects often have high accuracy, as their ability to miss can add an extra layer of complication to the effects that already need consideration.  Moves that have multiple possible effects- such as Fire Fang- also make their effects mutually exclusive: Flinch *or* Burn *or* nothing.  Not Flinch, Burn, Flinch+Burn, or nothing.&lt;br /&gt;
* Enemies&#039; movesets to begin with are also limited often to 2, to moderate the preparation demand on what attack they might choose (and also helps give them their own identity).&lt;br /&gt;
* Pertaining to trap detection, this demand for presence of mind was something I experienced in other roguelikes.  In Zero Isle South and some of the more stressful Shiren dungeons, the optimal approach for such trap laden torture chambers was really to move forward, swipe to reveal trap, move forward, swipe to reveal trap, etc.  The alternative was to simply move forward and accept a lingering paranoia. When I played these dungeons, I swiped paths through all rooms, all the way through.  For Destiny Tower, which prevented swipe reveals, I even threw rocks to test the tile 2 spaces ahead (if it&#039;s a trap, the rock will bounce off). This was simply not something I wanted my own players to experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope this helps for aspiring modders to understand the idea behind the mechanics they&#039;re working with, and also to inform decision of their own changes.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Taking_Turns&amp;diff=2678</id>
		<title>Taking Turns</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Taking_Turns&amp;diff=2678"/>
		<updated>2025-04-23T04:23:37Z</updated>

		<summary type="html">&lt;p&gt;IDK: link to rambles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO is a turn-based roguelike dungeon crawler.  Every time you move, the enemies move.&lt;br /&gt;
When all player and enemy turns completes, this is called a Round.&lt;br /&gt;
&lt;br /&gt;
== The Turn Cycle ==&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, a single Round consists of one full Cycle of player+enemy movements, ordered as such:&lt;br /&gt;
&lt;br /&gt;
* The player&#039;s team moves&lt;br /&gt;
** Members: Leader first, then everyone moves in list order&lt;br /&gt;
** Guests: Everyone moves in list order &lt;br /&gt;
* Neutral NPC teams move&lt;br /&gt;
** Members: Leader first, then everyone moves in list order&lt;br /&gt;
** Guests: Everyone moves in list order &lt;br /&gt;
* Enemy teams move&lt;br /&gt;
** Members: Leader first, then everyone moves in list order&lt;br /&gt;
** Guests: Everyone moves in list order &lt;br /&gt;
&lt;br /&gt;
It&#039;s possible for a player to rearrange their team order and change leaders before making a move, allowing them to choose the order in which their units move.  Enemies also invisibly reorder their team order to mitigate chokepoint situations.&lt;br /&gt;
&lt;br /&gt;
An example of a chokepoint situation is where an enemy team has a lower ranking member in front of a higher ranking member in a hallway.  The higher ranking member goes first, but cannot, while the lower rank can, but moves after the higher rank member.  This leads to a turn where one enemy moves forward, but the other one doesn&#039;t.  Very unintuitive, so the enemies quietly reorder their turns to make this behavior more natural.  This also happens with player allies.&lt;br /&gt;
&lt;br /&gt;
== Speed Changes and Turn Tiers ==&lt;br /&gt;
&lt;br /&gt;
Under normal speed conditions, everyone gets to move exactly once.  However, speed can be increased in this game.  Specifically, Movement Speed.  Rounds are actually broken up into 6 Turn Tiers, each of them having a turn Cycle detailed in the previous section.  A character can only move in that tier if they have a Movement Speed that the tier permits.&lt;br /&gt;
&lt;br /&gt;
The 6 turn tiers are as follows:&lt;br /&gt;
&lt;br /&gt;
* Tier 0: All movement Speeds&lt;br /&gt;
* Tier 1/4: Quadruple Speed&lt;br /&gt;
* Tier 1/3: Triple Speed&lt;br /&gt;
* Tier 1/2: Double Speed, Quadruple Speed&lt;br /&gt;
* Tier 2/3: Triple Speed&lt;br /&gt;
* Tier 3/4: Quadruple Speed&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, everyone would move at the turn cycle on tier 0 and the other tiers would not be used.  But when someone speeds up, they can use the other tiers.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
So if a player team consists of the following:&lt;br /&gt;
* Leader: Double Speed&lt;br /&gt;
* Partner 1: Normal Speed&lt;br /&gt;
* Partner 2: Normal Speed&lt;br /&gt;
&lt;br /&gt;
And an enemy team consists of the following:&lt;br /&gt;
* Leader: Quadruple Speed&lt;br /&gt;
* Partner 1: Normal Speed&lt;br /&gt;
&lt;br /&gt;
The turn order would look like this:&lt;br /&gt;
&lt;br /&gt;
* Tier 0:&lt;br /&gt;
** Player Team:&lt;br /&gt;
*** Player Moves&lt;br /&gt;
*** Partner 1 Moves&lt;br /&gt;
*** Partner 2 Moves&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
*** Partner 1 Moves&lt;br /&gt;
* Tier 1/4:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
* Tier 1/3:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
* Tier 1/2:&lt;br /&gt;
** Player Team:&lt;br /&gt;
*** Player Moves&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
* Tier 2/3:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
* Tier 3/4:&lt;br /&gt;
** Player Team:&lt;br /&gt;
** Enemy Team:&lt;br /&gt;
*** Leader Moves&lt;br /&gt;
* The Round ends&lt;br /&gt;
&lt;br /&gt;
When a character&#039;s movement speed is decreased, they will still always perform movements at turn tier 0.  However, every time they do, they incur a cooldown of X turns reliant on how much they&#039;ve slowed down.  A Half Speed character will have to wait 1 turn after moving.  A 1/3 Speed character will have to wait 2.  A 1/4 Speed character will have to wait 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attacking ==&lt;br /&gt;
&lt;br /&gt;
All movement speed changes only come into effect if the player moves.  They do not apply to attacking or using items.  If a player at slowed movement speed attacks, they do not skip subsequent turns.  If a player at boosted speed attacks, they can no longer participate in higher Turn Tiers for that round.  This can be exploited slightly:&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say a player is moving at double speed against an enemy at normal speed.&lt;br /&gt;
On the player&#039;s turn at Tier 0, if they move, the enemy moves. Then on tier 1/2, the player can perform an attack.  The round then ends, and the player can act again.&lt;br /&gt;
&lt;br /&gt;
However, if the player chooses to attack, they will not be able to move until they have passed the turn border.  It would simply play out as if both entities were moving/attacking at normal speed.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;turn border&amp;quot; sits on Tier 0, right between the player and the enemy factions.  The unintuitive place to put the turn border is chosen due to its surprisingly intuitive results for speed boosts and drops.  [[User:IDK/Speed_Rework|More information]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Mechanics]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2677</id>
		<title>User:IDK/Speed Rework</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK/Speed_Rework&amp;diff=2677"/>
		<updated>2025-04-23T04:21:54Z</updated>

		<summary type="html">&lt;p&gt;IDK: speed rambles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The current speed system that everyone moves on is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I tried changing it to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- End Turn.  Clear all used-move flags --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this would in theory solve the speed-up delay&lt;br /&gt;
&lt;br /&gt;
because previously it was:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Use speed-up move, player is marked as used-move&lt;br /&gt;
0: Enemy moves&lt;br /&gt;
1/2: Player is at double speed and would be able to move again, but is marked as used-move so they can&#039;t&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
0: Player walks&lt;br /&gt;
0: Enemy walks&lt;br /&gt;
1/2: Player can walk again&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it would be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Use speed-up move, player is marked as used-move&lt;br /&gt;
1: Enemy moves&lt;br /&gt;
-- Next Turn.  Clear all used-move flags. --&lt;br /&gt;
1/2: Player walks&lt;br /&gt;
1: Player can walk again&lt;br /&gt;
1: Enemy gets to move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HOWEVER&lt;br /&gt;
&lt;br /&gt;
this design would reveal a favoritism to enemy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1: Player attacks&lt;br /&gt;
1: Enemy used Silver wind!  Enemy is at double speed! (Marked as move-used)&lt;br /&gt;
-- Next turn.  All used-move flags cleared. --&lt;br /&gt;
1/2: Enemy used Silver Wind! Enemy is at triple speed! (Marked as move-used)&lt;br /&gt;
2/3: Enemy would normally be able to move AGAIN, but is marked as used-move so they can&#039;t (thank god)&lt;br /&gt;
1: Player can respond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
technically, this issue also occurs in the current system, just with a one-turn delay.  But our current system slightly favors enemies too.  But what if...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- All used-move flags for ENEMIES cleared --&lt;br /&gt;
    0: All movement Speeds&lt;br /&gt;
-- All used-move flags for PLAYERS cleared --&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or rather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    0: All movement Speeds (Player)&lt;br /&gt;
-- All used-move flags cleared --&lt;br /&gt;
    0: All movement Speeds (Enemies)&lt;br /&gt;
    1/4: Quad Speed&lt;br /&gt;
    1/3: Triple Speed&lt;br /&gt;
    1/2: Double, Quad Speed&lt;br /&gt;
    2/3: Triple Speed&lt;br /&gt;
    3/4: Quad Speed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t look very clean, but it would result in fairness:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind.  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Double speed).  Used-Move set.&lt;br /&gt;
1/2: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
-- Used Move flags cleared --&lt;br /&gt;
0: Enemy: Silver Wind (Triple speed). Used-move set.&lt;br /&gt;
1/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
2/3: Enemy: Used-move, not allowed to move.&lt;br /&gt;
-- Next Turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if both the player and the enemy get to move on a sub-turn like 1/2, the player gets to move first and then the enemy moves right after&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: Agility.  Used-Move set&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: (Already at 2x speed) Move.&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario is slightly in favor of the player, but only within the player&#039;s frame of reference, so it should be fine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: Player: (already at 2x speed) Move.&lt;br /&gt;
-- Used-move flags cleared --&lt;br /&gt;
0: Enemy: Agility. Used-Move set&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Can&#039;t Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
0: Player: Move&lt;br /&gt;
0: Enemy Move&lt;br /&gt;
1/2: Player: Move&lt;br /&gt;
1/2: Enemy: Move&lt;br /&gt;
-- Next turn --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional scenarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player used Agility! &amp;lt;Move used&amp;gt;&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
0:Ally moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player moves&lt;br /&gt;
1/2:Ally moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:Player is already at double speed, moves.&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/2:Player used agility! &amp;lt;move use set&amp;gt;&lt;br /&gt;
2/3:Player qualifies for this tier but skips.  already used move&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player skips.  already used move&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
1/3:Player moves&lt;br /&gt;
2/3:Player moves&lt;br /&gt;
--- End Turn --&lt;br /&gt;
0:Player moves&lt;br /&gt;
-- Move use clears --&lt;br /&gt;
0:Enemy moves&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this only works because there are two sides: player and enemy.&lt;br /&gt;
&lt;br /&gt;
which is exactly the same as the number of directions in the flow of time itself: forwards and backwards.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK&amp;diff=2676</id>
		<title>User:IDK</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:IDK&amp;diff=2676"/>
		<updated>2025-04-23T04:11:22Z</updated>

		<summary type="html">&lt;p&gt;IDK: create&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Links go here.&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Dev_Mode&amp;diff=2648</id>
		<title>Dev Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Dev_Mode&amp;diff=2648"/>
		<updated>2025-03-06T04:38:28Z</updated>

		<summary type="html">&lt;p&gt;IDK: CTRL+Cancel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO has a secret developer mode that can be used to cheat, examine, and mod the game.&lt;br /&gt;
Start PMDO in this mode using the following command:&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMDO.exe -dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDO -dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also run the &amp;lt;code&amp;gt;dev.bat&amp;lt;/code&amp;gt; file to start without the command line.&lt;br /&gt;
&lt;br /&gt;
== Hotkeys ==&lt;br /&gt;
&lt;br /&gt;
* F1 shows diagnostic information.  This will show FPS, version number, current position, animation, and hitboxes.  This is also usable outside of dev mode but will only show FPS and version number.&lt;br /&gt;
* Shift+Up/Down warps to the next and previous floors of the dungeon, respectively.&lt;br /&gt;
* Shift+Left/Right warps to the next and previous segments of the dungeon.  A dungeon may be split up into segments such as Magma Cavern and Deep Magma Cavern.&lt;br /&gt;
* Shift+Right Click will warp the player to the location clicked.&lt;br /&gt;
* F2 pauses the game.&lt;br /&gt;
* F3 advances the frame when the game is paused.&lt;br /&gt;
* F4 is a test button used by programmers to quickly test a feature.  Don’t worry about this.&lt;br /&gt;
* F5 slows down the game.&lt;br /&gt;
* F6 speeds up the game.&lt;br /&gt;
* F8 mutes the music, and unmutes it when muted.&lt;br /&gt;
* F9 turns on FreeCam mode, where the camera can be moved.  In dungeons, it turns on SeeAll mode.&lt;br /&gt;
* F11 takes a screenshot of the ENTIRE map, useful for showcasing maps.  All characters, objects, and currently active VFX are included. The screenshot is saved to the SCREENSHOT/ subfolder.&lt;br /&gt;
* F12 warps the player to the debug ground map using their current save file.  If no save file exists, a debug file is created (but not saved)&lt;br /&gt;
* F1+F12 warps the player to the debug room.  Unlike F12, it send the player to the debug dungeon map.&lt;br /&gt;
* CTRL+F12 soft resets to the title screen.&lt;br /&gt;
* CTRL+Cancel clears textboxes and menus to skip text. Cancel is the Z key by default.&lt;br /&gt;
&lt;br /&gt;
== Dev Panel ==&lt;br /&gt;
&lt;br /&gt;
This contains the main controls to modify the game.  They are separated into tabs.&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
Often used to cheat and test in dungeons.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Game.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Hide Objects: Hides items and traps.  In ground maps, objects are hidden.&lt;br /&gt;
* Hide Sprites: Hides Pokemon.  Often used for screenshots.&lt;br /&gt;
* Create Clone: Creates a (Hostile) clone of your current character in your current location.&lt;br /&gt;
* Clear All Foes: Removes all enemies from the map. &lt;br /&gt;
* Skill List: Allows you to learn a move, or give it to foes.&lt;br /&gt;
* Ability list: Allows you to gain an ability, or give it to foes.&lt;br /&gt;
* Status List: Allows you to take on a status effect.&lt;br /&gt;
* Item List: Allows you to spawn items in dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Player ===&lt;br /&gt;
Often used to cheat in dungeons, or test animations.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Player.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Lv.: Sets the current player’s level.  Updates in real time.&lt;br /&gt;
* Reroll: Updates the current player’s moveset to the latest naturally learned moves at the current level.&lt;br /&gt;
* Species/Form/Skin/Gender: Change the player’s current species/form/shininess/gender.&lt;br /&gt;
* Animation: Change the player’s current animation.&lt;br /&gt;
&lt;br /&gt;
=== Travel ===&lt;br /&gt;
Used to instantly warp to needed locations.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Travel.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Areas are organized into Zones.&lt;br /&gt;
* Each zone has a list of Structures, plus a list of Ground Maps.&lt;br /&gt;
* Ground Maps are the hub maps with free movement.&lt;br /&gt;
* Each Structure contains a list of floors.&lt;br /&gt;
* You can choose to enter either a a Ground map using Enter Ground, or a dungeon floor using Enter Map.&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
Used to edit maps, items, Pokemon, etc.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Data.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Sprites ===&lt;br /&gt;
Used to the graphics of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Sprites.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Char Sprites: Pokemon sprites in dungeons/overworld.&lt;br /&gt;
* Portraits: Character portraits in dialogue.&lt;br /&gt;
* Particles: Most attack graphics.&lt;br /&gt;
* Beams: Used in attacks that shoot continuous beams, plus columns of light used for sending home.&lt;br /&gt;
* Backgrounds: Used in the title screen, and maps with parallax backgrounds.&lt;br /&gt;
* Emotes: Emote animations.  Includes status effect icons.&lt;br /&gt;
* Tiles: All tilesets.  Does not include autotiles (which are in the Data tab).&lt;br /&gt;
* Items: Item Sprites&lt;br /&gt;
* Objects: Tree stumps, signs, traps, etc.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
A lua command prompt to enter custom commands.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Script.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Reload Scripts: Reloads all lua scripts with your edits without needing to restart the game.&lt;br /&gt;
* Text Test: Allows you to test a dialogue box with sample text.  For translators.&lt;br /&gt;
&lt;br /&gt;
Command box controls:&lt;br /&gt;
* Type in a lua script command to run it directly on the game.&lt;br /&gt;
* Use TASK:BranchCoroutine(&amp;lt;your function here&amp;gt;) to call coroutines.&lt;br /&gt;
* SHIFT+Up/Down to scroll past commands.&lt;br /&gt;
* SHIFT+Enter to enter a multiline command.&lt;br /&gt;
&lt;br /&gt;
=== Mods ===&lt;br /&gt;
Controls which mod the game currently has loaded.  Can create, delete, and switch between mods.  Only one may be loaded at a time.  If you want to work on a mod, make sure the game is set to that mod before doing work.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Mod.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
Starter data, special game events, and VFX that are used in hardcoded portions of the game. &lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Constants.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== The Debug Room ===&lt;br /&gt;
This room contains a crowd of Pokemon at the top left corner for east move/ability/item testing.&lt;br /&gt;
&lt;br /&gt;
[[File:DebugRoom.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding]]&lt;br /&gt;
[[Category:Quick Reference]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Services&amp;diff=2642</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Services&amp;diff=2642"/>
		<updated>2025-01-22T01:49:46Z</updated>

		<summary type="html">&lt;p&gt;IDK: add category tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are special files whose purpose is to listen to specific actions the game can perform and then run some code whenever they occur.&amp;lt;br&amp;gt;&lt;br /&gt;
The base game already has a few built-in services that can be used for reference, but this page will go over how to make a new service from scratch and how to register new callbacks.&lt;br /&gt;
&lt;br /&gt;
=== How to make a service ===&lt;br /&gt;
First, navigate to your mod&#039;s &amp;lt;code&amp;gt;Data&amp;gt;Script&amp;gt;[namespace]&amp;lt;/code&amp;gt; folder. Once there, add a &amp;lt;code&amp;gt;services&amp;lt;/code&amp;gt; folder if there isn&#039;t one already and, inside of it, create yet another folder. This final folder can have any name you want as long as it has no special characters in it, but it&#039;s best to stick to something that is as close as possible to the name you want to give to your service. For Example, the base game&#039;s DebugTools service is inside the debug_tools folder.&lt;br /&gt;
Finally, create a text file inside of this folder and call it init.lua. Make sure that .lua is part of the file&#039;s extension and not still a portion of its name.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;re done, open this file with your text editor of choice. You will want to copy and paste this whole block inside of it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &#039;origin.services.baseservice&#039;&lt;br /&gt;
&lt;br /&gt;
local MyService = Class(&#039;MyService&#039;, BaseService)&lt;br /&gt;
&lt;br /&gt;
function MyService:initialize()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function BaseService:Subscribe(med)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
SCRIPT:AddService(&amp;quot;MyService&amp;quot;, MyService:new())&lt;br /&gt;
return MyService &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the smallest possible service you can make. It simply creates the class, registers it, and then returns it. You can change &amp;quot;MyService&amp;quot; into whatever name you want, of course.&amp;lt;br&amp;gt;&lt;br /&gt;
Right now, though, this service of ours literally does nothing. Let&#039;s change that.&amp;lt;br&amp;gt;&lt;br /&gt;
You can use the initialize function to define starting parameters or other global data related to your service. Keep in mind, however, that these values are not kept in between game sessions. Always remember to store your save data inside your SV structure if you want to be able to retrieve it after closing the game.&amp;lt;br&amp;gt;&lt;br /&gt;
What we need to use to make a service work, however, is the Subscribe function. This is the function responsible for registering callbacks so that the game knows to call them whenever a specific event takes place. You can find a list of all Engine Events present in the game and their parameters [[Service Events|here]].&lt;br /&gt;
&lt;br /&gt;
==== Creating a Callback ====&lt;br /&gt;
The first thing we need is the function we want to call. This can have any name you like, but it&#039;s best if its name references the event it is subscribed to in some way.&amp;lt;br&amp;gt;&lt;br /&gt;
We will use this simple print function as an example. Make sure to put it below your service&#039;s declaration but before its Subscribe function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function MyService:OnInit()&lt;br /&gt;
  assert(self, &#039;MyService:OnInit() : self is null!&#039;)&lt;br /&gt;
	PrintInfo(&amp;quot;\n&amp;lt;!&amp;gt; MyService: Init..&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
All this function does is print whether or not our service has been registered correctly when the service engine is loaded. To make it run, all we need to do is to add this line inside the service&#039;s Subscribe function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  med:Subscribe(&amp;quot;MyService&amp;quot;, EngineServiceEvents.Init, function() self:OnInit() end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you run the game now, you will notice that nothing happens still. This is because this file has never been loaded by the game. To make it load, create a &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt; file in your mod&#039;s &amp;lt;code&amp;gt;Data&amp;gt;Script&amp;gt;[namespace]&amp;lt;/code&amp;gt; folder and write &amp;lt;code&amp;gt;require &amp;quot;[namespace].services.[service_folder]&amp;quot;&amp;lt;/code&amp;gt; in it. Now the game will know it needs to load your service and you will see its OnInit function being called as expected.&lt;br /&gt;
&lt;br /&gt;
==== Callbacks with parameters ====&lt;br /&gt;
Many events contain parameters that get sent alongside their service messages so that services can reference and interact with them. These parameters are packaged into an argument array with starting index 0. An example of this is LossPenalty, whose argument 0 is the current GameProgress instance, which is to say, the save data itself. We need to pass this parameter along if we want to make use of it.&amp;lt;br&amp;gt;&lt;br /&gt;
If you&#039;re wondering what that discaded parameter is, it&#039;s your service&#039;s class. At no point you&#039;ll ever need this, since you&#039;re already working with it anyway.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function MyService:OnLossPenalty(save)&lt;br /&gt;
[...]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MyService:Subscribe(med)&lt;br /&gt;
  med:Subscribe(&amp;quot;MyService&amp;quot;, EngineServiceEvents.LossPenalty, function(_, args) self:OnLossPenalty(args[0]) end )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And that&#039;s all there is to it! Every service callback can be reduced to these simple steps!&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Quick Reference]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Linux_Flatpak&amp;diff=2614</id>
		<title>Linux Flatpak</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Linux_Flatpak&amp;diff=2614"/>
		<updated>2024-11-16T22:13:04Z</updated>

		<summary type="html">&lt;p&gt;IDK: link to github repo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO can be installed via [https://en.wikipedia.org/wiki/Flatpak Flatpak]. This allows you to install PMDO on any Linux distribution (ideally) without needing to use the terminal. It also gives you a convenient way to update.&lt;br /&gt;
&lt;br /&gt;
== Setting up Flatpak ==&lt;br /&gt;
Flatpak must be installed on your distribution. This is the default on most, but not all distributions (notably not on Ubuntu). On the Steam Deck / SteamOS Flatpak is already setup. For other distributions, check the [https://flathub.org/setup Flathub setup] instructions. By following these you will also install the Flathub repository which allows you to install even more Linux apps.&lt;br /&gt;
&lt;br /&gt;
== Adding the SkyTemple / PMDCollab Repo ==&lt;br /&gt;
Currently PMDO is not distributed via Flathub but via the SkyTemple Flatpak repository. To set it up download and open the following file:&lt;br /&gt;
&lt;br /&gt;
[https://skytemple.org/build_deps/skytemple-stable.flatpakrepo Download Flatpak Repo]&lt;br /&gt;
&lt;br /&gt;
This should open a software app and ask you to add the repository.&lt;br /&gt;
&lt;br /&gt;
== Installing PMDO ==&lt;br /&gt;
Once the repository is installed, you can find PMDO by searching &amp;quot;PMDO&amp;quot; in your software app. Alternatively you can install it using this file (this still requires the repository to be set up):&lt;br /&gt;
&lt;br /&gt;
[https://skytemple.org/build_deps/org.pmdcollab.pmdo.flatpakref Download Flatpak Appref]&lt;br /&gt;
&lt;br /&gt;
== Using the software center ==&lt;br /&gt;
Now that you have setup Flatpak and PMDO you will be able to use the software center of your distribution to manage, update or uninstall PMDO. It might also auto-update it, or you can configure it to do so. The software center application is named differently based on your repo. It is the one that opened when you opened the file in the previous step. It may be named &amp;quot;Software&amp;quot;, &amp;quot;Discover&amp;quot; or something similar.&lt;br /&gt;
&lt;br /&gt;
== Accessing Files ==&lt;br /&gt;
Game files, such as saves and mods, are stored at &amp;quot;/home/&amp;lt;your name&amp;gt;/.var/app/org.pmdcollab.pmdo/config/org.pmdcollab/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installing mods ===&lt;br /&gt;
You can place mod files at &amp;quot;/home/&amp;lt;your name&amp;gt;/.var/app/org.pmdcollab.pmdo/config/org.pmdcollab/PMDC/MODS/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Downgrading ==&lt;br /&gt;
Downgrading is usually a bit more involved. Software centers usually offer no direct way to downgrade, but it is still possible using the terminal.&lt;br /&gt;
&lt;br /&gt;
You can use the following command to list all versions of PMDO:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flatpak remote-info skytemple-stable org.pmdcollab.pmdo --log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then, note the commit hash matching the version you need. The versions may not be named, use the date instead to find the release you need. Then to install an older version, run:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flatpak update --commit=COMMIT org.pmdcollab.pmdo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Replace &amp;quot;COMMIT&amp;quot; with the commit you noted down previously.&lt;br /&gt;
&lt;br /&gt;
== Full manual installation ==&lt;br /&gt;
If all else fails, you can download the [https://nightly.link/PMDCollab/PMDO-Flatpak/workflows/publish/main/org.pmdcollab.pmdo-x86_64.zip pure Flatpak files] directly. This does not require any prior setup of repositories, but also doesn&#039;t support automatic updates, etc.&lt;br /&gt;
&lt;br /&gt;
The repo source can be found in [https://github.com/PMDCollab/PMDO-Flatpak]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Lua_Script_Migration&amp;diff=2594</id>
		<title>Lua Script Migration</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Lua_Script_Migration&amp;diff=2594"/>
		<updated>2024-11-13T02:39:56Z</updated>

		<summary type="html">&lt;p&gt;IDK: services clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Between 0.8.1 and 0.8.2, the lua scripting system has changed.  This page explains all of the changes to the lua scripting system.  There are many breaking changes, but when you reserialize mods between these versions, the lua scripts will go through an automatic conversion.&lt;br /&gt;
&lt;br /&gt;
While PMDO tries to automatically convert as many things as it can, there are still a few points that must be handled by the mod developer. Consult the automatic conversion section at the bottom of this page for a general summary.&lt;br /&gt;
&lt;br /&gt;
== Diff Modding ==&lt;br /&gt;
&lt;br /&gt;
=== Main Case ===&lt;br /&gt;
&lt;br /&gt;
In the new system, lua scripts are diff modded.  This means that instead of having to replace the entire file in the base game, you can chose to just add or redefine functions that you want.&lt;br /&gt;
&lt;br /&gt;
For example, the script [https://github.com/audinowho/DumpAsset/blob/master/Data/Script/origin/event_misc.lua event_misc.lua] contains the following methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function STATUS_SCRIPT.Test(owner, ownerChar, context, args)&lt;br /&gt;
function MAP_STATUS_SCRIPT.Test(owner, ownerChar, character, status, msg, args)&lt;br /&gt;
function MAP_STATUS_SCRIPT.ShopGreeting(owner, ownerChar, character, status, msg, args)&lt;br /&gt;
function MAP_STATUS_SCRIPT.SetShopkeeperHostile(owner, ownerChar, character, status, msg, args)&lt;br /&gt;
function ITEM_SCRIPT.Test(owner, ownerChar, context, args)&lt;br /&gt;
function ITEM_SCRIPT.CastawayCaveShift(owner, ownerChar, context, args)&lt;br /&gt;
function ITEM_SCRIPT.SleepingCalderaShift(owner, ownerChar, context, args)&lt;br /&gt;
function REFRESH_SCRIPT.Test(owner, ownerChar, character, args)&lt;br /&gt;
function SKILL_CHANGE_SCRIPT.Test(owner, character, skillIndices, args)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the old system, if you wanted to mod just the &amp;lt;code&amp;gt;MAP_STATUS_SCRIPT.ShopGreeting&amp;lt;/code&amp;gt; event, you would need to copy the entire event_misc.lua from the base game, modify &amp;lt;code&amp;gt;MAP_STATUS_SCRIPT.ShopGreeting&amp;lt;/code&amp;gt;, and save it to your mod.&lt;br /&gt;
&lt;br /&gt;
In the new system, all you need to do is create an event.lua with your custom &amp;lt;code&amp;gt;MAP_STATUS_SCRIPT.ShopGreeting&amp;lt;/code&amp;gt; in it, and nothing else.&lt;br /&gt;
&lt;br /&gt;
This makes it easy to maintain scripts, as the base game scripts can change.  In the old system, if &amp;lt;code&amp;gt;MAP_STATUS_SCRIPT.SetShopkeeperHostile&amp;lt;/code&amp;gt; in the base game changed after you copied over event_misc.lua, you would have had to copy the changed version of that method to your own mod to stay updated.  Now in the new system, if you don&#039;t redefine the method in your mod, you won&#039;t have to worry about it.&lt;br /&gt;
&lt;br /&gt;
This works on all scripts found in the &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder, and all subfolders except &amp;lt;code&amp;gt;Data/Script/services&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Services ===&lt;br /&gt;
&lt;br /&gt;
Services behave slightly differently.  Originally, creating a new service with the same name as an existing base game service would add its events on top of the base game&#039;s events.  However, it now replaces the original service and removes the base game&#039;s event triggers in favor of your new ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Breaking Changes ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Folders ===&lt;br /&gt;
&lt;br /&gt;
With the diff modding changes, a caveat is that all lua scripts are namespaced.  This way, you can reference methods from the base game specifically.  However, it means that all scripts need to be moved to a subfolder in the name of your mod&#039;s namespace.&lt;br /&gt;
&lt;br /&gt;
For example, your mod has the namespace &amp;lt;code&amp;gt;my_mod&amp;lt;/code&amp;gt;, and your scripts are currently in the &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder of your mod (You can find/specify your mod&#039;s namespace in the &amp;lt;code&amp;gt;Mod.xml&amp;lt;/code&amp;gt;).  In this situation, you should move all your code to a new folder, &amp;lt;code&amp;gt;Data/Script/my_mod&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
★ This is done as a part of auto-conversion.&lt;br /&gt;
&lt;br /&gt;
=== Namespace References ===&lt;br /&gt;
&lt;br /&gt;
Additionally, your &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls must be updated to specify whether you&#039;re importing code from the &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; namespace or your own namespace.  And meanwhile, if you made custom scripts on your own mod, you need to instead change the require to reflect your namespace, because the code is in your namespace of mod.  For example, the header of a ground map script you created may look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &#039;common&#039;&lt;br /&gt;
require &#039;GeneralFunctions&#039;&lt;br /&gt;
require &#039;PartnerEssentials&#039;&lt;br /&gt;
require &#039;ground.my_town.my_town_ch_1&#039;&lt;br /&gt;
require &#039;ground.my_town.my_town_ch_2&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let&#039;s assume in this example, your mod has namespace &amp;lt;code&amp;gt;my_mod&amp;lt;/code&amp;gt;.  You created this ground script in &amp;lt;code&amp;gt;Data/Script/ground/my_town/init.lua&amp;lt;/code&amp;gt;.  &lt;br /&gt;
You referred to &amp;lt;code&amp;gt;common&amp;lt;/code&amp;gt; from the base code, but are referring to your own script for the rest of the includes.&lt;br /&gt;
You will need to change it to this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &#039;origin.common&#039;&lt;br /&gt;
require &#039;my_mod.GeneralFunctions&#039;&lt;br /&gt;
require &#039;my_mod.PartnerEssentials&#039;&lt;br /&gt;
require &#039;my_mod.ground.my_town.my_town_ch_1&#039;&lt;br /&gt;
require &#039;my_mod.ground.my_town.my_town_ch_2&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this isn&#039;t done, the mod will complain about being unable to load modules that aren&#039;t there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
References to these packages also need to be updated in places where they&#039;re used without require.  Most notably, AI initialization. Ex: &amp;lt;code&amp;gt;AI:SetCharacterAI(partner, &amp;quot;ai.ground_partner&amp;quot;, CH(&#039;PLAYER&#039;), partner.Position)&amp;lt;/code&amp;gt; should be changed to &amp;lt;code&amp;gt;AI:SetCharacterAI(partner, &amp;quot;origin.ai.ground_partner&amp;quot;, CH(&#039;PLAYER&#039;), partner.Position)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AI:SetCharacterAI(partner, &amp;quot;my_mod.ai.ground_partner&amp;quot;, CH(&#039;PLAYER&#039;), partner.Position)&amp;lt;/code&amp;gt;, if your mod is overriding the original ai.&lt;br /&gt;
&lt;br /&gt;
If this isn&#039;t done, you will get AI errors on maps where ground character AI is supposed to work.&lt;br /&gt;
&lt;br /&gt;
★ This section is done as a part of auto-conversion.&lt;br /&gt;
&lt;br /&gt;
=== Starting Scripts ===&lt;br /&gt;
&lt;br /&gt;
In the base game, PMDO calls the following scripts directly from the game on startup, which in turn make a &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; call to additional scripts:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;common_talk.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;common_shop.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;common_vars.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;common_tutor.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;event_single.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;event_battle.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;event_misc.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;include.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; both make &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls to load their child scripts.  If you have modded versions of the the child scripts, you will need to add the parent script with a single &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; call to the child.  For example, if you modded &amp;lt;code&amp;gt;event_mapgen&amp;lt;/code&amp;gt;, you will need to make sure you have an &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; that has &amp;lt;code&amp;gt;require &#039;my_mod.event_mapgen&amp;lt;/code&amp;gt; in it.&lt;br /&gt;
&lt;br /&gt;
★ This section is done as a part of auto-conversion.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Tables ===&lt;br /&gt;
&lt;br /&gt;
The tables for common scripts and event scripts, such as &amp;lt;code&amp;gt;SINGLE_CHAR_SCRIPT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BATTLE_SCRIPT&amp;lt;/code&amp;gt;, and so on, are now declared by the game&#039;s code, so you don&#039;t need to declare them as empty tables anymore.  You shouldn&#039;t, because the modding system stacks the base game&#039;s methods with your mod&#039;s on top, and redefining the variable would result in your mod removing the base game&#039;s functions.&lt;br /&gt;
&lt;br /&gt;
You will need to remove these lines from the event scripts:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;COMMON = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_single.lua&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;SINGLE_CHAR_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_battle.lua&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;BATTLE_SCRIPT= {}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_misc.lua&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;STATUS_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;MAP_STATUS_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;ITEM_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;REFRESH_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;SKILL_CHANGE_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;GROUND_ITEM_EVENT_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;ZONE_GEN_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;FLOOR_GEN_SCRIPT = {}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
★ This section is done as a part of auto-conversion.&lt;br /&gt;
&lt;br /&gt;
=== Services ===&lt;br /&gt;
&lt;br /&gt;
Due to the change in services, several things must be accounted for:&lt;br /&gt;
&lt;br /&gt;
* If you have services with the same name as those of the base game (&amp;lt;code&amp;gt;debug_tools&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;menu_tools&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upgrade_tools&amp;lt;/code&amp;gt;), your service now overwrites the original instead of adding onto it.  If you want to add new functionality without overwriting the old, make a new service with a new name.&lt;br /&gt;
* The base game&#039;s &amp;lt;code&amp;gt;debug_tools&amp;lt;/code&amp;gt; service used to have an event for &amp;lt;code&amp;gt;OnMenuButtonPressed&amp;lt;/code&amp;gt;.  That event has been moved out of the service and into its own service, &amp;lt;code&amp;gt;menu_tools&amp;lt;/code&amp;gt;.  If you are overriding OnMenuPressed in any services and do not replace menu_tools, you will have the main menu opened twice when menu button is pressed!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Non-Breaking Changes ==&lt;br /&gt;
&lt;br /&gt;
These changes are not mandatory to get your mod working, but are good to have.&lt;br /&gt;
&lt;br /&gt;
=== Deprecated MapStrings ===&lt;br /&gt;
&lt;br /&gt;
The use of the &amp;lt;code&amp;gt;MapStrings&amp;lt;/code&amp;gt; variable to obtain the text strings for ground maps is no longer needed.  You no longer need to declare them, you no longer need to initialize them, and you no longer need to reference them.  Instead, strings for a ground map are automatically loaded and stored in the game for you to call on.  You should remove these statements from your ground map scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local MapStrings = {}&lt;br /&gt;
&lt;br /&gt;
MapStrings = COMMON.AutoLoadLocalizedStrings()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you should change all references to &amp;lt;code&amp;gt;MapStrings&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;STRINGS.MapStrings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
★ This section is done as a part of auto-conversion.&lt;br /&gt;
&lt;br /&gt;
=== Redundant Functions ===&lt;br /&gt;
&lt;br /&gt;
As mentioned in the Diff Modding section, if you don&#039;t redefine the method in your mod, you won&#039;t have to worry about it.  If you have any files where you copied over the base game&#039;s scripts and edited just a single method, you can delete the other methods from that modded lua file.  This will make your code more resilient to base game lua changes.&lt;br /&gt;
&lt;br /&gt;
=== Un-Needed Files ===&lt;br /&gt;
&lt;br /&gt;
The following files are no longer needed in your mod and will have no effect:&lt;br /&gt;
&lt;br /&gt;
* The file &amp;lt;code&amp;gt;Data/Script/debugger.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* The folder &amp;lt;code&amp;gt;Data/Script/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
* The folder &amp;lt;code&amp;gt;Data/Script/lib&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can safely delete them.  Their require statements in &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; are also no longer needed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class    = require &#039;lib.middleclass&#039;&lt;br /&gt;
Mediator = require &#039;lib.mediator&#039; &lt;br /&gt;
Serpent = require &#039;lib.serpent&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
★ This section is done as a part of auto-conversion.&lt;br /&gt;
&lt;br /&gt;
== Migration Checklist ==&lt;br /&gt;
&lt;br /&gt;
You can reserialize your mod by running the command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMDO.exe -quest My_Mod_Folder -reserialize all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When you reserialize mods between these versions, the lua scripts will go through an automatic conversion.  Some breaking changes detailed in the above section are automatically fixed. Some will not.&lt;br /&gt;
&lt;br /&gt;
Items marked with ★ are automatically converted on reserialization from versions &amp;lt;=0.8.1 to &amp;gt;=0.8.2&lt;br /&gt;
&lt;br /&gt;
* ★ Lua scripts are moved to a subfolder based on the mod&#039;s namespace.&lt;br /&gt;
* ★ References to &amp;lt;code&amp;gt;require &amp;quot;common&amp;quot;&amp;lt;/code&amp;gt; become &amp;lt;code&amp;gt;require &amp;quot;origin.common&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* ★ References to your own scripts &amp;lt;code&amp;gt;require &amp;quot;yourscript&amp;quot;&amp;lt;/code&amp;gt; changed to include your namespace &amp;lt;code&amp;gt;require &amp;quot;yournamespace.yourscript&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* ★ common and event scripts need their empty table declarations removed.&lt;br /&gt;
* ★ Scripts modded from children of &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; must have a modded version of their parent with an include to the child.&lt;br /&gt;
* Services that have the same name as the base game&#039;s service need to be renamed, IF you don&#039;t want to overwrite the base logic.&lt;br /&gt;
&lt;br /&gt;
These are optional changes that you don&#039;t have to make, but is good to clean up files or code no longer needed:&lt;br /&gt;
&lt;br /&gt;
* ★ MapStrings is deprecated.&lt;br /&gt;
** ★ Remove variable declaration and initialization statements.&lt;br /&gt;
** ★ Replace references to &amp;lt;code&amp;gt;MapStrings&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;STRINGS.MapStrings&amp;lt;/code&amp;gt;&lt;br /&gt;
* ★ Deleted &amp;lt;code&amp;gt;Data/Script/bin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Data/Script/lib&amp;lt;/code&amp;gt; subfolders&lt;br /&gt;
* ★ Deleted &amp;lt;code&amp;gt;Data/Script/services/baseservice.lua&amp;lt;/code&amp;gt; file&lt;br /&gt;
* Functions identical to the base game are removed in the mod, for the files of common.lua and event.lua&lt;br /&gt;
* Functions identical to the base game are removed in the mod, for the files in ground and zone&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Lua_Function_Reference&amp;diff=2593</id>
		<title>Lua Function Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Lua_Function_Reference&amp;diff=2593"/>
		<updated>2024-11-13T02:35:06Z</updated>

		<summary type="html">&lt;p&gt;IDK: import from most recent docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows all script functions that can be called from Lua&lt;br /&gt;
&lt;br /&gt;
== AI:SetCharacterAI(RogueEssence.Ground.GroundChar,System.String,System.Object[]) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assign the given scripted AI class to the specified GroundChar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;classpath&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== AI:DisableCharacterAI(RogueEssence.Ground.GroundChar) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disable a given groundchar&#039;s AI processing until its enabled again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== AI:EnableCharacterAI(RogueEssence.Ground.GroundChar) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable a given groundchar&#039;s AI processing if its currently disabled&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== AI:SetAIState(RogueEssence.Ground.GroundChar,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable a given groundchar&#039;s AI processing if its currently disabled&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:CharTurnToChar(RogueEssence.Dungeon.Character,RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a character turn to face another&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;curch&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;turnto&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:LastDungeonResult ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the result of the last dungeon adventure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:DungeonCurrentFloor ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns the floor number of the current dungeon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:DungeonAssetName ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns the internal name for the current dungeon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:DungeonDisplayName ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns the localized name of the current dungeon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:CharSetEmote(RogueEssence.Dungeon.Character,System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set a character&#039;s emote in a dungeon map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to emote&lt;br /&gt;
* &amp;lt;code&amp;gt;emoteid&amp;lt;/code&amp;gt;: ID of the emote&lt;br /&gt;
* &amp;lt;code&amp;gt;cycles&amp;lt;/code&amp;gt;: The number of times to play the emote.&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:CharStartAnim ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set a character&#039;s animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: Name of the animation&lt;br /&gt;
* &amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt;: Whether to loop the animation&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DUNGEON:CharStartAnim(player, anim, false)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:CharEndAnim ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops a character&#039;s current animation, reverting them to default idle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to stop animating&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DUNGEON:CharEndAnim(player)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:CharWaitAnim ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set a character&#039;s animation, and waits until it completed before continue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: Name of the animation&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DUNGEON:CharStartAnim(player, anim)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:PlayVFX(RogueEssence.Content.FiniteEmitter,System.Int32,System.Int32,RogueElements.Dir8) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a VFX in the dungeon map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;emitter&amp;lt;/code&amp;gt;: The VFX emitter&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X position in pixels&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y Position in pixels&lt;br /&gt;
* &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;: Direction to orient the VFX, defaults to Down&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:PlayVFX(RogueEssence.Content.FiniteEmitter,System.Int32,System.Int32,RogueElements.Dir8,System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a VFX that has a start position and an end position.  It uses a finite emitter that generates BaseAnims.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;emitter&amp;lt;/code&amp;gt;: The VFX emitter&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: Start X position in pixels&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Start Y Position in pixels&lt;br /&gt;
* &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;: Direction to orient the VFX, defaults to Down.&lt;br /&gt;
* &amp;lt;code&amp;gt;xTo&amp;lt;/code&amp;gt;: End X position in pixels&lt;br /&gt;
* &amp;lt;code&amp;gt;yTo&amp;lt;/code&amp;gt;: End Y position in pixels&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:PlayVFXAnim(RogueEssence.Content.BaseAnim,RogueEssence.Content.DrawLayer) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a VFX using just a BaseAnim&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: The animation to play&lt;br /&gt;
* &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;: The layer to put it on&lt;br /&gt;
&lt;br /&gt;
== DUNGEON:MoveScreen(RogueEssence.Content.ScreenMover) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a screen-moving effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;mover&amp;lt;/code&amp;gt;: The screen mover.&lt;br /&gt;
&lt;br /&gt;
== GAME:GroundSave ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Saves the game while in ground mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:GroundSave()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:GetModDiff(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;uuidStr&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GAME:GetCurrentGround ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the current ground map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:GetCurrentFloor ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the current dungeon map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:GetCurrentDungeon ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the current zone, also known as dungeon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:EnterGroundMap(System.Int32,System.Int32,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Leave current map, and enter specified ground map within the current zone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: The index of the ground map in the zone&lt;br /&gt;
* &amp;lt;code&amp;gt;idxentrypoint&amp;lt;/code&amp;gt;: The index of the entry point in the ground map&lt;br /&gt;
* &amp;lt;code&amp;gt;preserveMusic&amp;lt;/code&amp;gt;: If set to true, does not change the music when moving to the new ground map.&lt;br /&gt;
&lt;br /&gt;
== GAME:EnterGroundMap(System.String,System.String,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Leave current map, and enter specified ground map within the current zone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: The name of the ground map.  It must exist within in the zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;entrypoint&amp;lt;/code&amp;gt;: The name of the entry point in the ground map&lt;br /&gt;
* &amp;lt;code&amp;gt;preserveMusic&amp;lt;/code&amp;gt;: If set to true, does not change the music when moving to the new ground map.&lt;br /&gt;
&lt;br /&gt;
== GAME:EnterGroundMap(System.String,System.String,System.String,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Leave current map, and enter specified ground map within a new zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt;: The name of the destination zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: The name of the ground map.  It must exist within in the zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;entrypoint&amp;lt;/code&amp;gt;: The name of the entry point in the ground map&lt;br /&gt;
* &amp;lt;code&amp;gt;preserveMusic&amp;lt;/code&amp;gt;: If set to true, does not change the music when moving to the new ground map.&lt;br /&gt;
&lt;br /&gt;
== GAME:EnterDungeon ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enters a zone and begins a new adventure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dungeonid&amp;lt;/code&amp;gt;: The id of the dungeon to travel to.&lt;br /&gt;
* &amp;lt;code&amp;gt;structureid&amp;lt;/code&amp;gt;: The segment within the dungeon to start in.  -1 represents ground maps.&lt;br /&gt;
* &amp;lt;code&amp;gt;mapid&amp;lt;/code&amp;gt;: The id of the ground map or dungeon map within the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;entry&amp;lt;/code&amp;gt;: The entry point on the resulting map&lt;br /&gt;
* &amp;lt;code&amp;gt;stakes&amp;lt;/code&amp;gt;: Decides what happens when the adventure fails/succeeds.&lt;br /&gt;
* &amp;lt;code&amp;gt;recorded&amp;lt;/code&amp;gt;: Record the adventure in a replay&lt;br /&gt;
* &amp;lt;code&amp;gt;silentRestrict&amp;lt;/code&amp;gt;: Make the dungeon restrictions silently&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:EnterDungeon(1, 0, 0, 0, RogueEssence.Data.GameProgress.DungeonStakes.Risk, true, false)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:ContinueDungeon ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enters a zone and continues the current adventure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dungeonid&amp;lt;/code&amp;gt;: The id of the dungeon to travel to.&lt;br /&gt;
* &amp;lt;code&amp;gt;structureid&amp;lt;/code&amp;gt;: The segment within the dungeon to start in.  -1 represents ground maps.&lt;br /&gt;
* &amp;lt;code&amp;gt;mapid&amp;lt;/code&amp;gt;: The id of the ground map or dungeon map within the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;entry&amp;lt;/code&amp;gt;: The entry point on the resulting map&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:ContinueDungeon(1, 1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:EndDungeonRun ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ends the current adventure, sending the player to a specified destination.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;: The result of the adventure.&lt;br /&gt;
* &amp;lt;code&amp;gt;destzoneid&amp;lt;/code&amp;gt;: The id of the dungeon to travel to.&lt;br /&gt;
* &amp;lt;code&amp;gt;structureid&amp;lt;/code&amp;gt;: The segment within the dungeon to start in.  -1 represents ground maps.&lt;br /&gt;
* &amp;lt;code&amp;gt;mapid&amp;lt;/code&amp;gt;: The id of the ground map or dungeon map within the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;entryid&amp;lt;/code&amp;gt;: The entry point on the resulting map&lt;br /&gt;
* &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt;: Display an epitaph marking the end of the adventure.&lt;br /&gt;
* &amp;lt;code&amp;gt;fanfare&amp;lt;/code&amp;gt;: Play a fanfare.&lt;br /&gt;
* &amp;lt;code&amp;gt;completedZone&amp;lt;/code&amp;gt;: Zone to mark as completed. Defaults to current zone.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:EndDungeonRun(GameProgress.ResultType.Cleared, 0, -1, 1, 0, true, true)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:EnterRescue ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enters a zone and begins a rescue adventure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sosPath&amp;lt;/code&amp;gt;: The path of the sos mail.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:EnterRescue(&amp;quot;RESCUE/INBOX/SOS/example.sosmail&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:AddAOKRemark(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: WIP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;remarkIndex&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GAME:RestartToTitle ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Leave current map and load up the title screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:RestartRogue(RogueEssence.Data.RogueConfig) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Restarts a Roguelocke run based on the configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;: The configuration of the roguelocke run&lt;br /&gt;
&lt;br /&gt;
== GAME:EnterZone(System.String,System.Int32,System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enters a zone and begins a new adventure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dungeonid&amp;lt;/code&amp;gt;: The id of the dungeon to travel to.&lt;br /&gt;
* &amp;lt;code&amp;gt;structureid&amp;lt;/code&amp;gt;: The segment within the dungeon to start in.  -1 represents ground maps.&lt;br /&gt;
* &amp;lt;code&amp;gt;mapid&amp;lt;/code&amp;gt;: The id of the ground map or dungeon map within the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;entry&amp;lt;/code&amp;gt;: The entry point on the resulting map&lt;br /&gt;
&lt;br /&gt;
== GAME:FadeOut ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fade out the screen. Waits to complete before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt;: Fade to white if set to true.  Fades to black otherwise.&lt;br /&gt;
* &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The amount of time to fade in frames.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:FadeOut(false, 60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:FadeIn ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fade into the screen. Waits to complete before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The amount of time to fade in frames.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:FadeIn(false, 60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:MoveCamera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Centers the camera on a position.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X coordinate of the camera center&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y coordinate of the camera center&lt;br /&gt;
* &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The amount of time it takes ot move to the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;toPlayer&amp;lt;/code&amp;gt;: Destination is in absolute coordinates if false, and relative to the player character if set to true.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:MoveCamera(200, 240, 60, false)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:MoveCameraToChara ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Centers the camera on a character.&lt;br /&gt;
&lt;br /&gt;
As we are simply moving the camera to a character, this will simply set ViewCenter and not ViewOffset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X coordinate of the camera center, as an offset for the chara&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y coordinate of the camera center, as an offset for the chara&lt;br /&gt;
* &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The amount of time it takes ot move to the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to center on.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:MoveCameraToChara(200, 240, 60, false)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:GetCameraCenter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the current center of the camera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
A Loc object representing the center of the camera.&lt;br /&gt;
&lt;br /&gt;
== GAME:IsCameraOnChar ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Determines whether the camera is centered relative to the player.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
Returns true if the camera is relative to the player, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:HasSOSMail ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:HasAOKMail ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:GetTeamLeaderIndex ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns the index of the currently player controlled entity in the party.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
Index of the currently player controlled entity in the party.&lt;br /&gt;
&lt;br /&gt;
== GAME:SetTeamLeaderIndex(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the leader to the chosen index within the party.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt;: The index of the team member within the team.&lt;br /&gt;
&lt;br /&gt;
== GAME:SetCanSwitch(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prevents or allows the switching of leaders for the save file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;canSwitch&amp;lt;/code&amp;gt;: Set to true to allow switching, set to false to prevent it.&lt;br /&gt;
&lt;br /&gt;
== GAME:SetCanRecruit(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prevents or allows the joining of recruits for the save file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;canRecruit&amp;lt;/code&amp;gt;: Set to true to allow recruit joins, set to false to prevent it.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerPartyCount ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns the player party count.  Does not include guests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The count of players&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerPartyTable ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Return the party as a LuaTable.  Does not include guests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
A Lua Table of Characters&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerPartyMember(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the character at the specified index within the player&#039;s team.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: The specified index&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The team member retrieved.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerGuestCount ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the number of guests currently in the player&#039;s party.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The number of guests&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerGuestTable ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Return the guests as a LuaTable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
A Lua Table of Characters&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerGuestMember(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the character at the specified index within the player&#039;s guests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: The specified index&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The team member retrieved.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerAssemblyCount ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the number of characters currently in the player&#039;s assembly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The number of characters&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerAssemblyTable ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Return the assembly as a LuaTable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
A Lua Table of Characters&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerAssemblyMember(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the character at the specified index within the player&#039;s assembly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: The specified index&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The assembly member retrieved.&lt;br /&gt;
&lt;br /&gt;
== GAME:AddPlayerTeam(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adds a character to the player&#039;s team.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to add.&lt;br /&gt;
&lt;br /&gt;
== GAME:RemovePlayerTeam(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removes the character from the team, placing its item back in the inventory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the player to remove.&lt;br /&gt;
&lt;br /&gt;
== GAME:AddPlayerGuest(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adds a character to the player&#039;s guests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to add.&lt;br /&gt;
&lt;br /&gt;
== GAME:RemovePlayerGuest(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removes the character from the team&#039;s guests, placing its item back in the inventory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the player to remove.&lt;br /&gt;
&lt;br /&gt;
== GAME:AddPlayerAssembly(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adds a character to the player&#039;s assembly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to add.&lt;br /&gt;
&lt;br /&gt;
== GAME:RemovePlayerAssembly(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removes the character from the assembly, placing its item back in the inventory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the player to remove.&lt;br /&gt;
&lt;br /&gt;
== GAME:SetCharacterNickname(RogueEssence.Dungeon.Character,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets a character&#039;s nickname&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to rename&lt;br /&gt;
* &amp;lt;code&amp;gt;nickname&amp;lt;/code&amp;gt;: The new name&lt;br /&gt;
&lt;br /&gt;
== GAME:GetCharacterNickname(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the character nickname&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to get the nickname from&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The character&#039;s nickname&lt;br /&gt;
&lt;br /&gt;
== GAME:SetTeamName(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the name of the player&#039;s team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;teamname&amp;lt;/code&amp;gt;: The new team name&lt;br /&gt;
&lt;br /&gt;
== GAME:GetTeamName ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the name of the player&#039;s team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The team&#039;s name&lt;br /&gt;
&lt;br /&gt;
== GAME:CanRelearn(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if the character can relearn any skills.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to check&lt;br /&gt;
&lt;br /&gt;
== GAME:CanForget(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if the character can forget any skills.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to check&lt;br /&gt;
&lt;br /&gt;
== GAME:CanLearn(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if the character can learn any skills.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to check&lt;br /&gt;
&lt;br /&gt;
== GAME:CheckLevelSkills ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks the levels gained by a character and prompts to learn all skills along the levels.&lt;br /&gt;
Waits until all skills have been accepted or declined before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to prompt for learning.&lt;br /&gt;
* &amp;lt;code&amp;gt;oldLevel&amp;lt;/code&amp;gt;: The level that the character leveled up from.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:CheckLevelSkills(player, 5)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:TryLearnSkill ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attempts to give a new skill to the specified character, prompting to replace an old one if they are full.&lt;br /&gt;
Waits until all the skill has been accepted or declined before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to learn the skill&lt;br /&gt;
* &amp;lt;code&amp;gt;skill&amp;lt;/code&amp;gt;: The skill to learn&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:TryLearnSkill(player, &amp;quot;thunder&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:LearnSkill(RogueEssence.Dungeon.Character,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives a new skill to a specified character.&lt;br /&gt;
Fails if the character&#039;s skills are full.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to learn the skill&lt;br /&gt;
* &amp;lt;code&amp;gt;skill&amp;lt;/code&amp;gt;: The skill to learn&lt;br /&gt;
&lt;br /&gt;
== GAME:ForgetSkill(RogueEssence.Dungeon.Character,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removed a skill from the specified character.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to forget the skill&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the skill to forget&lt;br /&gt;
&lt;br /&gt;
== GAME:LockSkill(RogueEssence.Dungeon.Character,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a skill impossible to forget or replace for the specified character.&lt;br /&gt;
Note that this only affects normal gameplay. Scripts can still freely get rid of the skill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to lock the skill&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the skill to lock&lt;br /&gt;
&lt;br /&gt;
== GAME:UnlockSkill(RogueEssence.Dungeon.Character,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unlocks a previously locked skill for the specified character, making it possible to be forgotten or replaced during normal gameplay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to unlock the skill&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the skill to unlock&lt;br /&gt;
&lt;br /&gt;
== GAME:SetCharacterSkill(RogueEssence.Dungeon.Character,System.String,System.Int32,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives a new skill to a specified character, replacing a specifically chosen slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to learn the skill&lt;br /&gt;
* &amp;lt;code&amp;gt;skillId&amp;lt;/code&amp;gt;: The skill to learn&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot to replace&lt;br /&gt;
&lt;br /&gt;
== GAME:GetCharacterSkill(RogueEssence.Dungeon.Character,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the skill from a specified character and specified slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to get the skill from.&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot to get the skill from.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The ID of the skill in the slot&lt;br /&gt;
&lt;br /&gt;
== GAME:CanPromote(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if the character can be promoted to a new class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to check&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
True if the character can be promoted, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetAvailablePromotions(RogueEssence.Dungeon.Character,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets a list of possible classes that the character can prmote to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to check&lt;br /&gt;
* &amp;lt;code&amp;gt;bypassItem&amp;lt;/code&amp;gt;: An exception item that can bypass checks for promotion&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
A lua table of PromoteBranch objects&lt;br /&gt;
&lt;br /&gt;
== GAME:PromoteCharacter(RogueEssence.Dungeon.Character,RogueEssence.Data.PromoteBranch,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Promotes a character ot a new class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The character to promote&lt;br /&gt;
* &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;: The PromoteBranch to promote with&lt;br /&gt;
* &amp;lt;code&amp;gt;bypassItem&amp;lt;/code&amp;gt;: An exception item that can bypass checks for promotion&lt;br /&gt;
&lt;br /&gt;
== GAME:FindPlayerItem(System.String,System.Boolean,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finds an item in the player&#039;s team and returns its slot within the inventory or among its team&#039;s equips.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: The item ID to search for.&lt;br /&gt;
* &amp;lt;code&amp;gt;held&amp;lt;/code&amp;gt;: Check equipped items.&lt;br /&gt;
* &amp;lt;code&amp;gt;inv&amp;lt;/code&amp;gt;: Check inventory items.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The InvSlot of the item. Invalid if the item could not be found.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerEquippedCount ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Get the number of items equipped by players.  Does not include guests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The number of items.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerBagCount ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Get the number of items in the bag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The number of items.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerBagLimit ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the maximum amount of item the player&#039;s team can carry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The number of items.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerEquippedItem(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the equipped item for the character in the specified slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The team slot of the character to check&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The character&#039;s equipped item&lt;br /&gt;
&lt;br /&gt;
== GAME:GetGuestEquippedItem(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the equipped item for the character in the specified guest slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The guest slot of the character to check&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The character&#039;s equipped item&lt;br /&gt;
&lt;br /&gt;
== GAME:GivePlayerItem(RogueEssence.Dungeon.InvItem) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives an item and adds it to the player team&#039;s bag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt;: The item to give&lt;br /&gt;
&lt;br /&gt;
== GAME:GivePlayerItem(System.String,System.Int32,System.Boolean,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives an item and adds it to the player team&#039;s bag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: The ID of the item&lt;br /&gt;
* &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;: The amount to give. Default 1&lt;br /&gt;
* &amp;lt;code&amp;gt;cursed&amp;lt;/code&amp;gt;: Whether the item is cursed. Default false.&lt;br /&gt;
* &amp;lt;code&amp;gt;hiddenval&amp;lt;/code&amp;gt;: The hidden value of the item. Default empty string.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerBagItem(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the item found at the specified slot of the player&#039;s bag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot to check&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The item found in the slot&lt;br /&gt;
&lt;br /&gt;
== GAME:TakePlayerBagItem(System.Int32,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove an item from player inventory&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot from which to remove the item&lt;br /&gt;
* &amp;lt;code&amp;gt;takeAll&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GAME:TakePlayerEquippedItem(System.Int32,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove the equipped item from a chosen member of the team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the character on the team from which to remove the item&lt;br /&gt;
* &amp;lt;code&amp;gt;takeAll&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GAME:TakeGuestEquippedItem(System.Int32,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove the equipped item from a chosen guest of the team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;: The slot of the character on the team&#039;s guest list from which to remove the item&lt;br /&gt;
* &amp;lt;code&amp;gt;takeAll&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerStorageCount ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Get the amount of items in the player&#039;s storage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerStorageItemCount(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Get the amount of a specific item in the player&#039;s storage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: ID of the item ot check&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The amount of copies currently in storage&lt;br /&gt;
&lt;br /&gt;
== GAME:GivePlayerStorageItem(RogueEssence.Dungeon.InvItem) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives an item and adds it to the player team&#039;s storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt;: The item to give&lt;br /&gt;
&lt;br /&gt;
== GAME:GivePlayerStorageItem(System.String,System.Int32,System.Boolean,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives an item and adds it to the player team&#039;s storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: The ID of the item&lt;br /&gt;
* &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;: The amount to give. Default 1&lt;br /&gt;
* &amp;lt;code&amp;gt;cursed&amp;lt;/code&amp;gt;: Whether the item is cursed. Default false.&lt;br /&gt;
* &amp;lt;code&amp;gt;hiddenval&amp;lt;/code&amp;gt;: The hidden value of the item. Default empty string.&lt;br /&gt;
&lt;br /&gt;
== GAME:TakePlayerStorageItem(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Takes an item from the storage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: The ID of the item to take&lt;br /&gt;
&lt;br /&gt;
== GAME:DepositAll ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Takes all items in the player team&#039;s bag and equipped items, and deposits them in storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerMoney ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the amount of money the player currently has on hand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The amount of money.&lt;br /&gt;
&lt;br /&gt;
== GAME:AddToPlayerMoney(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adds money to the player&#039;s wallet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;toadd&amp;lt;/code&amp;gt;: The amount of money to add.&lt;br /&gt;
&lt;br /&gt;
== GAME:RemoveFromPlayerMoney(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removes money from the player&#039;s wallet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;toremove&amp;lt;/code&amp;gt;: The amount of money to remove.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetPlayerMoneyBank ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the amount of money in the player&#039;s bank&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The amount of money.&lt;br /&gt;
&lt;br /&gt;
== GAME:AddToPlayerMoneyBank(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adds money to the player&#039;s bank.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;toadd&amp;lt;/code&amp;gt;: The amount of money to add.&lt;br /&gt;
&lt;br /&gt;
== GAME:RemoveFromPlayerMoneyBank(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removes money from the player&#039;s bank.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;toremove&amp;lt;/code&amp;gt;: The amount of money to remove.&lt;br /&gt;
&lt;br /&gt;
== GAME:IsKeyDown(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if a player is making a certain physical keyboard input.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;keyid&amp;lt;/code&amp;gt;: The ID of the input&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
True if the button is currently pressed.  False otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:IsInputDown(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if a player is making a certain game input.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;inputid&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
True if the input is currently pressed.  False otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:CutsceneMode(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the game in cutscene mode. This prevents characters from taking idle action and hides certain UI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bon&amp;lt;/code&amp;gt;: If set to true, turns cutscene mode on. If set to false, turns it off.&lt;br /&gt;
&lt;br /&gt;
== GAME:GetDailySeed ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the random seed for the current adventure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The current adventure&#039;s seed.&lt;br /&gt;
&lt;br /&gt;
== GAME:UnlockDungeon(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unlocks a specified dungeon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dungeonid&amp;lt;/code&amp;gt;: ID of the dungeon to unlock.&lt;br /&gt;
&lt;br /&gt;
== GAME:DungeonUnlocked(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if a dungeon is unlocked.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dungeonid&amp;lt;/code&amp;gt;: ID of the dungeon to check&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
True if unlocked, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:InRogueMode ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks if the current game is in rogue mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
True if in rogue mode, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:HasServerSet ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: WIP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GAME:GetRescueAllowed ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Checks to see if rescue is allowed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
True if rescues are allowed, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:SetRescueAllowed(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the value in the player&#039;s save file to determine if they can be rescued or not.&lt;br /&gt;
If rescue is possible on the Save File level, it can still be prevented by the map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;allowed&amp;lt;/code&amp;gt;: Set to true to allow the player to be rescued.  False otherwise.&lt;br /&gt;
&lt;br /&gt;
== GAME:QueueLeaderEvent(System.Object) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prepares an event to execute on the next frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GAME:WaitFrames ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Waits for a specified number of frames before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;frames&amp;lt;/code&amp;gt;: The number of frames ot wait.  Each frame is 1/60th of a second.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GAME:WaitFrames(60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME:VectorToDirection(RogueElements.Loc) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Turns a vector (preferably a unit vector) into a cardinal or diagonal direction.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;: The vector.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The direction as one of 8 values.&lt;br /&gt;
&lt;br /&gt;
== GAME:VectorToDirection(System.Double,System.Double) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenience function to get a vector&#039;s components from lua numbers(doubles)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;: The X value of the vector&lt;br /&gt;
* &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;: The Y value of the vector&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The direction the vector points to as one of 8 values.&lt;br /&gt;
&lt;br /&gt;
== GAME:RandomDirection ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generates a random direction.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
An 8-directional direction.&lt;br /&gt;
&lt;br /&gt;
== GAME:SetupLuaFunctions(RogueEssence.Script.LuaEngine) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Setups any extra functionalities for this object written on the lua side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GROUND:Hide(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hides an entity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;entityname&amp;lt;/code&amp;gt;: The name of the entity to hide.&lt;br /&gt;
&lt;br /&gt;
== GROUND:Unhide(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unhides an entity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;entityname&amp;lt;/code&amp;gt;: The name of the entity to unhide.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CreateObject(System.String,System.String,System.Int32,System.Int32,System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: WIP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objtype&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;instancename&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GROUND:CreateCharacter(System.String,System.String,System.Int32,System.Int32,System.String,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: WIP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chartype&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;instancename&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;actionfun&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;thinkfun&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GROUND:RemoveObject(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deletes an object from the ground map, identified by its instance name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;instancename&amp;lt;/code&amp;gt;: The instance name of the object.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
Returns true if succeeded, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GROUND:RemoveCharacter(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deletes a character from the ground map, identified by its instance name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;instancename&amp;lt;/code&amp;gt;: The instance name of the object.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
Returns true if succeeded, false otherwise.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CreateCharacterFromCharData(System.String,RogueEssence.Dungeon.Character,System.Int32,System.Int32,RogueElements.Dir8) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Creates a ground character, given a dungeon character.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;instancename&amp;lt;/code&amp;gt;: The instance name to give the character&lt;br /&gt;
* &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;: Character data to create from&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X coordinate of the character&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y coordinate of the character&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: Direction the character will face, defaults to Dir8.Down&lt;br /&gt;
&lt;br /&gt;
== GROUND:RefreshPlayer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reloads the controllable player&#039;s character data to be the current team&#039;s leader.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GROUND:SetPlayer(RogueEssence.Dungeon.CharData) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the controllable player to use new character data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;charData&amp;lt;/code&amp;gt;: The new character data&lt;br /&gt;
&lt;br /&gt;
== GROUND:SpawnerDoSpawn(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make the specified spawner run its spawn method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;spawnername&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The ground character spawned.&lt;br /&gt;
&lt;br /&gt;
== GROUND:SpawnerSetSpawn(System.String,RogueEssence.Dungeon.CharData) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the character to the specified spawner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;spawnername&amp;lt;/code&amp;gt;: The spawner to set the character to, by name&lt;br /&gt;
* &amp;lt;code&amp;gt;spawnChar&amp;lt;/code&amp;gt;: The character to spawn.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharTurnToChar(RogueEssence.Ground.GroundChar,RogueEssence.Ground.GroundChar) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a character turn to face another character instantly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;turnchar&amp;lt;/code&amp;gt;: The character that is turning.&lt;br /&gt;
* &amp;lt;code&amp;gt;turnto&amp;lt;/code&amp;gt;: The character to turn to.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharTurnToCharAnimated ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a character do an animated turn to face another character over the specified time.&lt;br /&gt;
Clockwise or counter-clockwise are chosen based on the closest direction.&lt;br /&gt;
Waits until the operation is completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;curch&amp;lt;/code&amp;gt;: Character that is turning&lt;br /&gt;
* &amp;lt;code&amp;gt;turnto&amp;lt;/code&amp;gt;: Character to turn to&lt;br /&gt;
* &amp;lt;code&amp;gt;framedur&amp;lt;/code&amp;gt;: Time spent on each direction, in frames&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CharTurnToCharAnimated(charFrom, charTo, 3)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:EntTurn(RogueEssence.Ground.GroundEntity,RogueElements.Dir8) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a ground entity turn to face a direction.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: The ground entity.  Can be a character or object.&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: The direction to face.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharAnimateTurn ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a character do an animated turn to face a chosen direction over the specified time.&lt;br /&gt;
Must specify clockwise or counter-clockwise.&lt;br /&gt;
Waits until the operation is completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;: The character to turn&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: The direction to turn to&lt;br /&gt;
* &amp;lt;code&amp;gt;framedur&amp;lt;/code&amp;gt;: The time spent in each intermediate direction, in frames&lt;br /&gt;
* &amp;lt;code&amp;gt;ccw&amp;lt;/code&amp;gt;: false if clockwise, true if counter-clockwise&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CharTurnToCharAnimated(charFrom, Dir8.Left, 3, true)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharAnimateTurnTo ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes a character do an animated turn to face a chosen direction over the specified time.&lt;br /&gt;
Waits until the operation is completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;: The character to turn&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: The direction to turn to&lt;br /&gt;
* &amp;lt;code&amp;gt;framedur&amp;lt;/code&amp;gt;: The time spent in each intermediate direction, in frames&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CharTurnToCharAnimated(charFrom, Dir8.Left, 3)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:TeleportTo(RogueEssence.Ground.GroundEntity,System.Int32,System.Int32,RogueElements.Dir8,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Repositions the ground entity in a specified location.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: The ground entity to reposition&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X coordinate of the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y coordinate of the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: The direction to point the entity.  Defaults to Dir8.None, which leaves it untouched.&lt;br /&gt;
* &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GROUND:MoveInDirection ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make ground character move in a direction.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to move&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: Direction to move in&lt;br /&gt;
* &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: Duration of movement, in frames&lt;br /&gt;
* &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt;: True if using a running animation, false otherwise&lt;br /&gt;
* &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;: Speed in pixels per frame&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:MoveInDirection(player, Dir8.Down, 24, false, 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:MoveToPosition ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make ground character move to a position.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to move&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X coordinate of destination&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y  coordinate of destination&lt;br /&gt;
* &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt;: True if using a running animation, false otherwise&lt;br /&gt;
* &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;: Speed in pixels per frame&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:MoveInDirection(player, 200, 240, false, 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:MoveToMarker ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make ground character move to a ground marker.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to move&lt;br /&gt;
* &amp;lt;code&amp;gt;mark&amp;lt;/code&amp;gt;: GroundMarker object ot move to&lt;br /&gt;
* &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt;: True if using a running animation, false otherwise&lt;br /&gt;
* &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;: Speed in pixels per frame&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:MoveInDirection(player, marker, false, 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:MoveObjectToPosition ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make ground object move to a position.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Ground Entity to move&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X coordinate of destination&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y  coordinate of destination&lt;br /&gt;
* &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;: Speed in pixels per frame&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:MoveInDirection(player, 200, 240, 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:AnimateInDirection ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make a ground character move in a direction with custom animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to move&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: Name of the animation&lt;br /&gt;
* &amp;lt;code&amp;gt;animDir&amp;lt;/code&amp;gt;: Direction of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;: Direction to move in&lt;br /&gt;
* &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: Duration of movement, in frames&lt;br /&gt;
* &amp;lt;code&amp;gt;animSpeed&amp;lt;/code&amp;gt;: Speed of animation, where 1.0 represents normal speed&lt;br /&gt;
* &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;: Speed movement, in pixels per frame&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:AnimateInDirection(player, &amp;quot;Hurt&amp;quot;, Dir8.Down, 24, 0.5, 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:AnimateToPosition ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make a ground entity move to a position with custom animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Entity to move&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: Name of the animation&lt;br /&gt;
* &amp;lt;code&amp;gt;animDir&amp;lt;/code&amp;gt;: Direction of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X coordinate of the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y coordinate of the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;animSpeed&amp;lt;/code&amp;gt;: Speed of animation, where 1.0 represents normal speed&lt;br /&gt;
* &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;: Speed movement, in pixels per frame&lt;br /&gt;
* &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Height of the destination&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:AnimateToPosition(player, &amp;quot;Hurt&amp;quot;, Dir8.Down, 200, 240, 0.5, 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharSetEmote(RogueEssence.Ground.GroundChar,System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make a character emote on the ground map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to emote&lt;br /&gt;
* &amp;lt;code&amp;gt;emoteid&amp;lt;/code&amp;gt;: ID of the emote&lt;br /&gt;
* &amp;lt;code&amp;gt;cycles&amp;lt;/code&amp;gt;: The number of times to play the emote.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharSetDrawEffect(RogueEssence.Ground.GroundChar,RogueEssence.Dungeon.DrawEffect) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the ground character&#039;s draw effect to become invisible, shaking, still, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Target ground character.&lt;br /&gt;
* &amp;lt;code&amp;gt;effect&amp;lt;/code&amp;gt;: The draw effect.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharEndDrawEffect(RogueEssence.Ground.GroundChar,RogueEssence.Dungeon.DrawEffect) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the ground character&#039;s draw effect to become invisible, shaking, still, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Target ground character.&lt;br /&gt;
* &amp;lt;code&amp;gt;effect&amp;lt;/code&amp;gt;: The draw effect.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharGetAnimFallback(RogueEssence.Ground.GroundChar,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the fallback animation for the character.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: The anim to get the fallback anim of.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The fallback animation, as a string.  Blank if there is none.  Will return anim if anim already exists.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharGetAnim(RogueEssence.Ground.GroundChar) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets a character&#039;s current animation as a string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharGetAnimPoint(RogueEssence.Ground.GroundChar,RogueEssence.Content.ActionPointType) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the chosen action point of the character at this specific frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;actionPoint&amp;lt;/code&amp;gt;: The ype of action point to retrieve the coordinates for.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The location of the action point in absolute coordinates on the map.&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharSetAnim(RogueEssence.Ground.GroundChar,System.String,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set a character&#039;s animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: Name of the animation&lt;br /&gt;
* &amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt;: Whether to loop the animation&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharEndAnim(RogueEssence.Ground.GroundChar) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops a character&#039;s current animation, reverting them to default idle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to stop animating&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharWaitAnim ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes the character perform an animation and waits until it&#039;s over.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Character to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: Animation to play&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:CharWaitAnim(player, &amp;quot;Hurt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharSetAction(RogueEssence.Ground.GroundChar,RogueEssence.Ground.GroundAction) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set a character&#039;s action.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to perfom the action&lt;br /&gt;
* &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: The action to perform&lt;br /&gt;
&lt;br /&gt;
== GROUND:CharWaitAction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes the character perform an action and waits until it&#039;s over.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Character to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: Action to perform&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:CharWaitAction(player, action)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:ObjectSetAnim(RogueEssence.Ground.GroundObject,System.Int32,System.Int32,System.Int32,RogueElements.Dir8,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets a ground object&#039;s animation.  After it finishes, it will return to the default animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: The object to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;frameTime&amp;lt;/code&amp;gt;: The duration of each frame of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;startFrame&amp;lt;/code&amp;gt;: The start frame of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;endFrame&amp;lt;/code&amp;gt;: The end frame of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;: The direction of the animation&lt;br /&gt;
* &amp;lt;code&amp;gt;cycles&amp;lt;/code&amp;gt;: The number of times to repeat the animation&lt;br /&gt;
&lt;br /&gt;
== GROUND:ObjectSetDefaultAnim(RogueEssence.Ground.GroundObject,System.String,System.Int32,System.Int32,System.Int32,RogueElements.Dir8) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets a ground object&#039;s default animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: The object to animate&lt;br /&gt;
* &amp;lt;code&amp;gt;animName&amp;lt;/code&amp;gt;: The name of the animation&lt;br /&gt;
* &amp;lt;code&amp;gt;frameTime&amp;lt;/code&amp;gt;: The duration of each frame of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;startFrame&amp;lt;/code&amp;gt;: The start frame of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;endFrame&amp;lt;/code&amp;gt;: The end frame of animation&lt;br /&gt;
* &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;: The direction of the animation&lt;br /&gt;
&lt;br /&gt;
== GROUND:ObjectWaitAnimFrame ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Waits for the object to reach a specific frame before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: The object ot wait on&lt;br /&gt;
* &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt;: The frame of animation to wait on.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GROUND:WaitObjectAnim(fountain, 3)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GROUND:PlayVFX(RogueEssence.Content.FiniteEmitter,System.Int32,System.Int32,RogueElements.Dir8) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a VFX using a finite emitter that generates BaseAnims.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;emitter&amp;lt;/code&amp;gt;: The VFX emitter&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X position&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y Position&lt;br /&gt;
* &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;: Direction to orient the VFX, defaults to Down&lt;br /&gt;
&lt;br /&gt;
== GROUND:PlayVFX(RogueEssence.Content.FiniteEmitter,System.Int32,System.Int32,RogueElements.Dir8,System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a VFX that has a start position and an end position.  It uses a finite emitter that generates BaseAnims.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;emitter&amp;lt;/code&amp;gt;: The VFX emitter&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: Start X position&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Start Y Position&lt;br /&gt;
* &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;: Direction to orient the VFX, defaults to Down.&lt;br /&gt;
* &amp;lt;code&amp;gt;xTo&amp;lt;/code&amp;gt;: End X position&lt;br /&gt;
* &amp;lt;code&amp;gt;yTo&amp;lt;/code&amp;gt;: End Y position&lt;br /&gt;
&lt;br /&gt;
== GROUND:PlayVFXAnim(RogueEssence.Content.BaseAnim,RogueEssence.Content.DrawLayer) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a VFX using just a BaseAnim&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;anim&amp;lt;/code&amp;gt;: The animation to play&lt;br /&gt;
* &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;: The layer to put it on&lt;br /&gt;
&lt;br /&gt;
== GROUND:MoveScreen(RogueEssence.Content.ScreenMover) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a screen-moving effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;mover&amp;lt;/code&amp;gt;: The screen mover.&lt;br /&gt;
&lt;br /&gt;
== GROUND:HandoutEXP ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gives a character a set amount of EXP.&lt;br /&gt;
Also handles leveling up and learning new moves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The characters to level up.&lt;br /&gt;
* &amp;lt;code&amp;gt;experience&amp;lt;/code&amp;gt;: The amount of EXP to gain.&lt;br /&gt;
&lt;br /&gt;
== GROUND:LevelUpChar ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Levels up a character a certain amount of times all at once.&lt;br /&gt;
Also handles learning new moves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt;: The characters to level up.&lt;br /&gt;
* &amp;lt;code&amp;gt;numLevelUps&amp;lt;/code&amp;gt;: The number of level ups.&lt;br /&gt;
&lt;br /&gt;
== GROUND:AddMapStatus(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adds a mapstatus to the ground map.  Map statuses only have an aesthetic effect in ground maps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;statusIdx&amp;lt;/code&amp;gt;: The ID of the Map Status&lt;br /&gt;
&lt;br /&gt;
== GROUND:RemoveMapStatus(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Removes a map status from the ground map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;statusIdx&amp;lt;/code&amp;gt;: The ID of the Map Status to remove.&lt;br /&gt;
&lt;br /&gt;
== SOUND:PlaySE(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a sound effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:PlayBattleSE(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a sound effect specifically from the Battle/ subdirectory&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE/Battle folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:WaitSE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a sound effect, and waits for it to complete before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SOUND:WaitSE(&amp;quot;Battle/Hit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SOUND:LoopSE(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a continuous sound effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:LoopBattleSE(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a continuous sound effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE/Battle folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:StopSE(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops a continuous sound effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:StopBattleSE(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops a continuous sound effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE/Battle folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:FadeInSE(System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a continuous sound effect, fading in over a specified amount of time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE folder&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeTime&amp;lt;/code&amp;gt;: Time in frames for the sound to fade in&lt;br /&gt;
&lt;br /&gt;
== SOUND:FadeInBattleSE(System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a continuous sound effect, fading in over a specified amount of time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE/Battle folder&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeTime&amp;lt;/code&amp;gt;: Time in frames for the sound to fade in&lt;br /&gt;
&lt;br /&gt;
== SOUND:FadeOutSE(System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops a continuous sound effect, fading out over a specified amount of time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE folder&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeTime&amp;lt;/code&amp;gt;: Time in frames for the sound to fade out&lt;br /&gt;
&lt;br /&gt;
== SOUND:FadeOutBattleSE(System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops a continuous sound effect, fading out over a specified amount of time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE/Battle folder&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeTime&amp;lt;/code&amp;gt;: Time in frames for the sound to fade out&lt;br /&gt;
&lt;br /&gt;
== SOUND:PlayFanfare(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a sound effect that temporarily mutes the music for its duration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Sound file name, relative to the Content/SE folder&lt;br /&gt;
&lt;br /&gt;
== SOUND:WaitFanfare ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a sound effect that temporarily mutes the music for its duration.&lt;br /&gt;
This function waits for the sound to complete before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SOUND:WaitFanfare(&amp;quot;Battle/LevelUp&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SOUND:PlayBGM(System.String,System.Boolean,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plays a song, replacing the current one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: The file name of the song, relative to the Content/Music folder.&lt;br /&gt;
* &amp;lt;code&amp;gt;fade&amp;lt;/code&amp;gt;: Whether to fade the old song out, or start a new one.&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeTime&amp;lt;/code&amp;gt;: The amount of time, in frames, to fade out the old song.&lt;br /&gt;
&lt;br /&gt;
== SOUND:StopBGM ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops playing the current song.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SOUND:FadeOutBGM(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fades out the current song.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeTime&amp;lt;/code&amp;gt;: The amount of time, in frames, to fade out the song.&lt;br /&gt;
&lt;br /&gt;
== SOUND:SetBGMVolume(System.Single) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the current volume of the song.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt;: A float value between 0 and 1&lt;br /&gt;
&lt;br /&gt;
== SOUND:GetCurrentSong ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the currently playing song.  If the current song is fading out, gets the next song to be played.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The filename of the song, relative to the Content/Music folder&lt;br /&gt;
&lt;br /&gt;
== STRINGS:LocaleCode ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the current language setting of the game.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The current language, represented by a locale code.&lt;br /&gt;
&lt;br /&gt;
== STRINGS:Format(System.String,System.Object[]) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formats a string.  Will unescape escaped characters and process grammar tags.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fmt&amp;lt;/code&amp;gt;: String to format.&lt;br /&gt;
* &amp;lt;code&amp;gt;para&amp;lt;/code&amp;gt;: Arguments&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The formatted string.&lt;br /&gt;
&lt;br /&gt;
== STRINGS:FormatKey(System.String,System.Object[]) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formats a string given a string key.  Will unescape escaped characters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fmt&amp;lt;/code&amp;gt;: The string key to format&lt;br /&gt;
* &amp;lt;code&amp;gt;para&amp;lt;/code&amp;gt;: string arguments&lt;br /&gt;
&lt;br /&gt;
== STRINGS:LocalKeyString(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the string representing a button or key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: The input type of the input.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The string representing the button o key the input maps to.&lt;br /&gt;
&lt;br /&gt;
== STRINGS:CreateList(NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Builds a single string of comma separated elements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;listStrings&amp;lt;/code&amp;gt;: LuaTable of strings containing the elements to build the list from.&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The combined string containing all elements.&lt;br /&gt;
&lt;br /&gt;
== TASK:StartEntityTask(RogueEssence.Ground.GroundEntity,NLua.LuaFunction) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Helper function to make an entity run the specified task.&lt;br /&gt;
Will not replace a running task!&lt;br /&gt;
Tasks are run interlocked with the script processing and game processing, and characters cannot run multiple tasks at the same time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Entity which will run the task.&lt;br /&gt;
* &amp;lt;code&amp;gt;fn&amp;lt;/code&amp;gt;: Task coroutine.&lt;br /&gt;
&lt;br /&gt;
== TASK:StopEntityTask(RogueEssence.Ground.GroundEntity) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Helper function to force stop an entity&#039;s current task.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Entity running the task to stop.&lt;br /&gt;
&lt;br /&gt;
== TASK:WaitStartEntityTask ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes an entity run a specified task, and waits for it to complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Entity which will run the task.&lt;br /&gt;
* &amp;lt;code&amp;gt;fn&amp;lt;/code&amp;gt;: Task coroutine.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TASK:WaitEntityTask ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Waits for the specified entity to finish its task.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ent&amp;lt;/code&amp;gt;: Entity which task we&#039;ll wait on.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TASK:WaitEntityTask(player)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TASK:WaitTask ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Runs a task and waits for it to complete.&lt;br /&gt;
Most methods that do not expose themselves to script need to be wrapped with this.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: The task to wait on.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TASK:WaitTask(_DUNGEON:DropMoney(100, RogueElements.Loc(10, 10), RogueElements.Loc(10, 10)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TASK:StartScriptLocalCoroutine(NLua.LuaFunction,System.Object[]) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A wrapper around the StartCoroutine method of the GameManager, so lua coroutines can be executed locally to the script context.&lt;br /&gt;
AKA, it will block the script execution while its executed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fn&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== TASK:BranchCoroutine(System.Object) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Starts a new coroutine to run parallel to the current execution.&lt;br /&gt;
Useful for performing multiple actions at once.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: The task to run in parallel&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
local coro1 = TASK:BranchCoroutine(GAME:_FadeIn(60))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TASK:JoinCoroutines ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Waits for all specified coroutines to finish before continuing execution.&lt;br /&gt;
Often used for coroutines created using TASK:BranchCoroutine()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;coroTable&amp;lt;/code&amp;gt;: A table of coroutines to wait on.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TASK:JoinCoroutines({coro1})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:WaitInput ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Waits for the player to press a button before continuing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:WaitShowDialogue ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays a dialogue box with text, waiting until the player completes it.&lt;br /&gt;
Takes a string as an argument.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitShowDialogue(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:WaitShowTimedDialogue ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays a dialogue box with text, waiting until the specified time has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;waitTime&amp;lt;/code&amp;gt;: The time for the textbox to remain on screen. Pass -1 to wait for layer input.&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitShowTimedDialogue(&amp;quot;Hello World!&amp;quot;, 120)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:TextDialogue(System.String,System.Int32,NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the current dialogue text to be shown.  Requires WaitDialog to actually display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;waitTime&amp;lt;/code&amp;gt;: The time for the textbox to remain on screen. Pass -1 to wait for layer input.&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
== UI:WaitShowVoiceOver ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays a voice over, waiting until the player completes it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;expireTime&amp;lt;/code&amp;gt;: The time for the textbox to remain on screen. Pass -1 to wait for layer input.&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;: Width of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Height of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitShowVoiceOver(&amp;quot;Hello World!&amp;quot;, 120)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:TextVoiceOver(System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the current voice-over text to be shown.  Requires WaitDialog to actually display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;expireTime&amp;lt;/code&amp;gt;: The time for the textbox to remain on screen. Pass -1 to wait for layer input.&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;: Width of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Height of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
== UI:TextPopUp(System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes text pop up in the bottom-left corner by default. Displays concurrently with any other process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;expireTime&amp;lt;/code&amp;gt;: The time for the textbox to remain on screen.&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;: Width of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Height of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;centerH&amp;lt;/code&amp;gt;: Horizontal centering&lt;br /&gt;
* &amp;lt;code&amp;gt;centerV&amp;lt;/code&amp;gt;: Vertical centering&lt;br /&gt;
&lt;br /&gt;
== UI:WaitShowTitle ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fades in a title text, waiting until the fade-in is complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;: The time for the text to fade in.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitShowTitle(&amp;quot;Hello World!&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:TextShowTitle(System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shows text in the format of a title drop.  Requires WaitDialog to actually display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;: The text to display.&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;: The time for the text to fade in.&lt;br /&gt;
&lt;br /&gt;
== UI:WaitHideTitle ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fades out the currently displayed title, waiting until the fade-out is complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;: The time for the text to fade in.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitHideTitle(60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:TextFadeTitle(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fades out the text set in a title drop.  Requires WaitDialog to actually fade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;: The time for the text to fade in.&lt;br /&gt;
&lt;br /&gt;
== UI:WaitShowBG ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fades in a chosen background image, with a chosen framerate, at a certain fade time, waiting until the fade-in is complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bg&amp;lt;/code&amp;gt;: The background to show, from the list of BG textures.&lt;br /&gt;
* &amp;lt;code&amp;gt;frameTime&amp;lt;/code&amp;gt;: Framerate of the image animation.&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeInTime&amp;lt;/code&amp;gt;: Time taken to fade in the image.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitShowBG(&amp;quot;TestBG&amp;quot;, 3, 60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:ShowBG(System.String,System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets an image to display.  Requires WaitDialog to actually display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bg&amp;lt;/code&amp;gt;: The background to show, from the list of BG textures.&lt;br /&gt;
* &amp;lt;code&amp;gt;frameTime&amp;lt;/code&amp;gt;: Framerate of the image animation.&lt;br /&gt;
* &amp;lt;code&amp;gt;fadeInTime&amp;lt;/code&amp;gt;: Time taken to fade in the image.&lt;br /&gt;
&lt;br /&gt;
== UI:WaitHideBG ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fades out the current background image, waiting until the fade-out is complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;: Time taken to fade out the image.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitHideBG(60)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:FadeBG(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prepares a fade-out of the current image.  Requires WaitDialog to actually display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;: Time taken to fade out the image.&lt;br /&gt;
&lt;br /&gt;
== UI:ResetSpeaker(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Clears the current speaker, so none is displayed the next time TextDialogue is called.&lt;br /&gt;
This also resets any custom dialogue box positions, portrait positions, and choice positions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;keysound&amp;lt;/code&amp;gt;: If turned on, the text from the dialogue boxes make sounds.  Default is on.&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeaker(System.String,System.Boolean,System.String,System.Int32,System.String,RogueEssence.Data.Gender) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the speaker to be displayed during the following calls to the TextDialogue functions.  It resets speaker emotion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Speaker name.&lt;br /&gt;
* &amp;lt;code&amp;gt;keysound&amp;lt;/code&amp;gt;: Plays sounds when text appears.&lt;br /&gt;
* &amp;lt;code&amp;gt;specie&amp;lt;/code&amp;gt;: Species of the speaker&lt;br /&gt;
* &amp;lt;code&amp;gt;form&amp;lt;/code&amp;gt;: Form of the speaker&lt;br /&gt;
* &amp;lt;code&amp;gt;skin&amp;lt;/code&amp;gt;: Skin of the speaker&lt;br /&gt;
* &amp;lt;code&amp;gt;gender&amp;lt;/code&amp;gt;: Gender of the speaker&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeaker(RogueEssence.Ground.GroundChar,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the speaker to be displayed during the following calls to the TextDialogue functions.  It resets speaker emotion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to set as speaker. This is a character in a ground map.&lt;br /&gt;
* &amp;lt;code&amp;gt;keysound&amp;lt;/code&amp;gt;: Plays sounds when text appears.&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeaker(RogueEssence.Dungeon.Character,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the speaker to be displayed during the following calls to the TextDialogue functions.  It resets speaker emotion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: Character to set as speaker. This is a character in a dungeon map.&lt;br /&gt;
* &amp;lt;code&amp;gt;keysound&amp;lt;/code&amp;gt;: Plays sounds when text appears.&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeakerReverse(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reverses the speaker orientation to face left instead of right.  This depends on the boolean passed in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;reverse&amp;lt;/code&amp;gt;: Faces right if false, left if true.&lt;br /&gt;
&lt;br /&gt;
== UI:SetChoiceLoc(System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the position of the choices for a question dialog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X position&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y position&lt;br /&gt;
&lt;br /&gt;
== UI:ResetChoiceLoc ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the position of the choices for a question dialog back to default.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:SetBounds(System.Int32,System.Int32,System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the position and size of the dialogue box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y position of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;: Width of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Height of the box&lt;br /&gt;
&lt;br /&gt;
== UI:SetSe(System.String,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the speaker sound effect and speak frames played in the TextDialogue functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;newSe&amp;lt;/code&amp;gt;: The sound effect of the box&lt;br /&gt;
* &amp;lt;code&amp;gt;speakTime&amp;lt;/code&amp;gt;: The amount of frames to wait between each sound effect&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:SetSe(&amp;quot;Battle/_UNK_DUN_Water_Drop&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:SetSe(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the speaker sound effect played in the TextDialogue functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;newSe&amp;lt;/code&amp;gt;: The sound effect of the box&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:SetSe(&amp;quot;Menu/Unknown-3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeakTime(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the speak frames played in the TextDialogue functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;speakTime&amp;lt;/code&amp;gt;: The amount of frames to wait between each sound effect&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:SetSpeakTime(10)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:ResetSe ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resets to the default speaker sound effect and speaker frames.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ResetBounds ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resets the position and size of the dialogue box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeakerLoc(System.Int32,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the position of the speaker in a dialogue box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: The X position&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: The Y position&lt;br /&gt;
&lt;br /&gt;
== UI:ResetSpeakerLoc ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resets the position of the speaker in a dialogue box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:SetSpeakerEmotion(System.String,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the emotion of the speaker in the dialogue box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;emo&amp;lt;/code&amp;gt;: Emotion to display&lt;br /&gt;
* &amp;lt;code&amp;gt;reverse&amp;lt;/code&amp;gt;: Faces right if false, left if true.&lt;br /&gt;
&lt;br /&gt;
== UI:SetCenter(System.Boolean,System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sets the centering of the text in the textbox.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;centerH&amp;lt;/code&amp;gt;: Horizontal centering&lt;br /&gt;
* &amp;lt;code&amp;gt;centerV&amp;lt;/code&amp;gt;: Vertical centering&lt;br /&gt;
&lt;br /&gt;
== UI:SetAutoFinish(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes the text automatically finish when it shows up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;autoFinish&amp;lt;/code&amp;gt;: Auto-finishes text if true.&lt;br /&gt;
&lt;br /&gt;
== UI:WaitDialog ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the currently set dialogue box and waits for the player to complete it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitDialog()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:_DummyWait ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instantly break. Used as default/invalid value when returning a yieldable value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ChoiceMenuYesNo(System.String,System.Boolean,NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ask a question answered by yes or no via character dialogue to the player.&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer value indicating the result of the menu, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
The Yes/No menu returns 1 for yes, and 0 for no.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt;: Question to be asked to the user.&lt;br /&gt;
* &amp;lt;code&amp;gt;bdefaultstono&amp;lt;/code&amp;gt;: Whether the cursor starts on no by default&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
== UI:NameMenu(System.String,System.String,System.Int32,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the name input box.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the string value indicating the result of the menu, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;: The text to show above the input line.&lt;br /&gt;
* &amp;lt;code&amp;gt;desc&amp;lt;/code&amp;gt;: The text to show below the input line.&lt;br /&gt;
* &amp;lt;code&amp;gt;maxLength&amp;lt;/code&amp;gt;: The length of the text in pixels.&lt;br /&gt;
* &amp;lt;code&amp;gt;defaultName&amp;lt;/code&amp;gt;: Name to start the textbox with.&lt;br /&gt;
&lt;br /&gt;
== UI:AssemblyMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays a menu for replacing party members with the assembly.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the boolean value indicating whether the team composition was changed or not, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ShopMenu(NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Shop menu.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the table indicating the indices of items chosen, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;goods&amp;lt;/code&amp;gt;: A table of items to be sold.  The format is { Item=InvItem, Price=int } for each item.&lt;br /&gt;
&lt;br /&gt;
== UI:SellMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Sell menu.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the table indicating the indices of items to sell, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:StorageMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Storage menu for which to exchange items in the inventory with.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the menu is exited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:WithdrawMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Storage menu for which to withdraw from.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the menu is exited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:BankMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Bank menu.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the menu is exited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:SpoilsMenu(NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Spoils menu.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the menu is exited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;appraisalMap&amp;lt;/code&amp;gt;: A table of mappings from containers to items, in the format of { Box=InvItem , Item=InvItem }&lt;br /&gt;
&lt;br /&gt;
== UI:AppraiseMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Appraisal menu.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the table indicating the indices of items chosen, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:TutorTeamMenu(NLua.LuaFunction) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Tutor Team menu.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer representing the chosen team member, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:RelearnMenu(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Relearn menu for a character.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer representing the chosen skill, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to relearn skills&lt;br /&gt;
&lt;br /&gt;
== UI:LearnMenu(RogueEssence.Dungeon.Character,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Learn menu for a character to replace an existing skill with a new one.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer representing the chosen skill, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to relearn skills&lt;br /&gt;
* &amp;lt;code&amp;gt;skillNum&amp;lt;/code&amp;gt;: The new skill&lt;br /&gt;
&lt;br /&gt;
== UI:ForgetMenu(RogueEssence.Dungeon.Character) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Forget menu for a character to forget a skill.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer representing the chosen skill, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chara&amp;lt;/code&amp;gt;: The character to relearn skills&lt;br /&gt;
&lt;br /&gt;
== UI:ShowPromoteMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Promote menu to choose a team member to promote.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer representing the chosen team slot, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:CanSwapMenu(NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:SwapMenu(NLua.LuaTable,NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:TributeMenu(System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ShowMusicMenu(NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the Music menu to browse music for the game.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the string representing the chosen song, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;spoilerUnlocks&amp;lt;/code&amp;gt;: A lua table of strings representing progression flags that have been completed.&lt;br /&gt;
            Any ogg file that uses this tag as a spoiler tag will display in the menu only if the flag has been passed.&lt;br /&gt;
&lt;br /&gt;
== UI:DungeonChoice(System.String,RogueEssence.Dungeon.ZoneLoc) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ask to enter a destintion via character dialogue to the player.&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer value indicating the result of the menu, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
The Yes/No menu returns 1 for yes, and 0 for no.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: Name of the destination&lt;br /&gt;
* &amp;lt;code&amp;gt;dest&amp;lt;/code&amp;gt;: The ZoneLoc location of the destination.&lt;br /&gt;
&lt;br /&gt;
== UI:DestinationMenu(NLua.LuaTable,System.Object) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Marks the start of a choice menu for choosing destinations, showing a preview of restrictions and requirements for dungeons.&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the ZoneLoc indicating the chosen destination, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;destinations&amp;lt;/code&amp;gt;: A lua table representing the list of destinations with each element in the format of { Name=string, Dest=ZoneLoc }&lt;br /&gt;
&lt;br /&gt;
== UI:ServersMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ContactsMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:SOSMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:AOKMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:PeersMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ShowConnectMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:CurrentActivityMenu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:ChooseMonsterMenu(System.String,NLua.LuaTable,System.Boolean,System.Boolean,System.Int32) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Marks the start of a choice menu for choosing monsters, showing a preview of their appearances via portrait.&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the string indicating the chosen species, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;: The title of the menu&lt;br /&gt;
* &amp;lt;code&amp;gt;choices&amp;lt;/code&amp;gt;: A lua table of choices with each element being a MonsterID.&lt;br /&gt;
* &amp;lt;code&amp;gt;canMenu&amp;lt;/code&amp;gt;: If set to true, the Menu Button exits the menu if pressed.&lt;br /&gt;
* &amp;lt;code&amp;gt;canCancel&amp;lt;/code&amp;gt;: If set to true, the Cancel Button exits the menu if pressed.&lt;br /&gt;
* &amp;lt;code&amp;gt;slotsPerPage&amp;lt;/code&amp;gt;: Slots to display per page&lt;br /&gt;
&lt;br /&gt;
== UI:SetCustomMenu(RogueEssence.Menu.InteractableMenu) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays a custom menu of the caller&#039;s choice.&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the menu is exited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI:BeginChoiceMenu(System.String,NLua.LuaTable,System.Object,System.Object,NLua.LuaTable) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Marks the start of a multi-choice menu.&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer value indicating the result of the menu, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt;: The question to ask the user.&lt;br /&gt;
* &amp;lt;code&amp;gt;choicesPairs&amp;lt;/code&amp;gt;: A table of choices.  Each choice can be either a string, or { string, bool } representing the text and enabled status.&lt;br /&gt;
* &amp;lt;code&amp;gt;defaultChoice&amp;lt;/code&amp;gt;: The cursor starts on this choice.&lt;br /&gt;
* &amp;lt;code&amp;gt;cancelChoice&amp;lt;/code&amp;gt;: This choice is chosen if the player presses the cancel button.&lt;br /&gt;
* &amp;lt;code&amp;gt;callbacks&amp;lt;/code&amp;gt;: The Lua table of callbacks for the textbox to call.&lt;br /&gt;
&lt;br /&gt;
== UI:BeginMultiPageMenu(System.Int32,System.Int32,System.Int32,System.String,NLua.LuaTable,System.Int32,System.Object,System.Object) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Marks the start of a multi-paged choice menu.&lt;br /&gt;
UI:WaitForChoice() must be called afterwards for the menu to be actually displayed,&lt;br /&gt;
and for execution to suspend until the choice is returned.&lt;br /&gt;
Then to recover the integer value indicating the result of the menu, UI:ChoiceResult() must be called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;: X position of the menu&lt;br /&gt;
* &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;: Y position of the menu&lt;br /&gt;
* &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;: Width of the menu&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;: Height of the menu&lt;br /&gt;
* &amp;lt;code&amp;gt;choicesPairs&amp;lt;/code&amp;gt;: A table of choices.  Each choice can be either a string, or { string, bool } representing the text and enabled status.&lt;br /&gt;
* &amp;lt;code&amp;gt;linesPerPage&amp;lt;/code&amp;gt;: Number of choices per page&lt;br /&gt;
* &amp;lt;code&amp;gt;defaultChoice&amp;lt;/code&amp;gt;: The cursor starts on this choice.&lt;br /&gt;
* &amp;lt;code&amp;gt;cancelChoice&amp;lt;/code&amp;gt;: This choice is chosen if the player presses the cancel button.&lt;br /&gt;
&lt;br /&gt;
== UI:ChoiceResult ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Get the result of the last choice menu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Returns ===&lt;br /&gt;
&lt;br /&gt;
The result of the choice&lt;br /&gt;
&lt;br /&gt;
== UI:GetChoiceAction(System.Object) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#039;s complicated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== UI:WaitForChoice ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Displays the currently set choice menu and waits for the player&#039;s selection to complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UI:WaitForChoice()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI:__WaitForChoice ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wait for choice and then CLEAN UP m_curchoice&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Quick Reference]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Class:DataManager&amp;diff=2592</id>
		<title>Class:DataManager</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Class:DataManager&amp;diff=2592"/>
		<updated>2024-11-13T02:34:20Z</updated>

		<summary type="html">&lt;p&gt;IDK: copy paste from most recent doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
This page shows all properties of DataManager that can be manipulated from Lua.&lt;br /&gt;
&lt;br /&gt;
It is referenced in lua with the shorthand &amp;lt;code&amp;gt;_DATA&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== _DATA.Start ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The parameters governing the start of the game.&lt;br /&gt;
Such as starting character, map, level, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultMonster ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The monster ID consiered default for purposes of initialization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultSkill ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization and comparing to &amp;quot;nothing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultIntrinsic ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization and comparing to &amp;quot;nothing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultMapStatus ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization and comparing to &amp;quot;nothing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultElement ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization and comparing to &amp;quot;nothing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultTile ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization and comparing to &amp;quot;nothing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultZone ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultRank ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultAI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.DefaultSkin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The skill ID considered default for purposes of initialization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.GenFloor ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The terrain ID considered to be universally &amp;quot;floor&amp;quot; in random dungeon generation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.GenWall ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The terrain ID considered to be universally &amp;quot;wall&amp;quot; in random dungeon generation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.GenUnbreakable ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The terrain ID considered to be universally &amp;quot;unbreakable&amp;quot; in random dungeon generation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA.Save ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The current save file, loaded into memory&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetIndex(RogueEssence.Data.DataManager.DataType) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Index paths are modified like mods.  However, if multiple mods have conflicting indices, a combined index must be generated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:LoadModData``1(RogueEssence.ModHeader,System.String,System.String,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Loads the data of the specified mod, and does not fall back to base if there is no mod.&lt;br /&gt;
Used for reserializing/resaving where either the base or the mod&#039;s files ONLY need to be resaved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;subpath&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;ext&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetDataModStatus(System.String,System.String,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns information of how a file has been modded, if at all.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;subpath&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;ext&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:SaveData(System.Object,System.String,System.String,System.String,RogueEssence.Data.DataManager.SavePolicy) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Provides the ability to save it as a file or a mod based on whether it was loaded as a diff or not... aka whether it was a diff as a file or not.&lt;br /&gt;
Can also save explicitly as a file or diff.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;entry&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;subpath&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;ext&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;savePolicy&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:SaveObject(System.Object,System.String,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;entry&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;: The location to save the file if not as a patch.&lt;br /&gt;
* &amp;lt;code&amp;gt;basePath&amp;lt;/code&amp;gt;: The base file to diff the json against.  Do not save as a patch if left blank.&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetZone(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets a zone based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetMap(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets a map based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetGround(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets a ground map based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetSkill(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a skill based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetItem(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for an item based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetAutoTile(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for an autotile based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetMonster(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a monster based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetStatus(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a status effect based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetIntrinsic(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for an intrinsic (passive ability) based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetMapStatus(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a map-wide status effect based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetTile(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a tile, such as stairs or traps, based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetTerrain(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a terrain type based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetEmote(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for an emote based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetElement(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for an elemental type based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetGrowth(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a growth group based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetSkillGroup(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a skill-sharing group based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetAITactic(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for an ai tactic based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetRank(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a team rank based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:GetSkin(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gets the data for a skin based on its ID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:BeginPlay(System.String,System.String,System.Boolean,System.Boolean,System.DateTime) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Starts recording the quicksave for a new adventure.&lt;br /&gt;
From here on, the replayWriter will remain open as a way to continue writing game states and player inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;filePath&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;zoneId&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;rogue&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;seeded&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;sessionStart&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:ResumePlay(RogueEssence.Data.ReplayData,System.DateTime) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Called when resuming an adventure from a quicksave.&lt;br /&gt;
The quicksave file is loaded and the stream position is set to the end, so that it can continue writing the replay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;replay&amp;lt;/code&amp;gt;: The quicksave replay to resume from.&lt;br /&gt;
* &amp;lt;code&amp;gt;sessionResumeTime&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:LogState ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Writes the game state to the current replay.  The player must be in dungeon mode.&lt;br /&gt;
This is used when the player begins a new dungeon in their adventure. (One adventure can contain a trek through multiple dungeons)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:LogGroundSave ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Writes the game state to the current replay.  The player must be in ground mode.&lt;br /&gt;
This is used when a player saves in the middle of an adventure in a ground mode rest area.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:LogQuicksave ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Writes the entire game state for faster loading of quicksaves.&lt;br /&gt;
Currently not used due to quicksaves still loading from the start of the dungeon and replaying every step up to the current point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:LogPlay(RogueEssence.Dungeon.GameAction) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Logs a player action to the current quicksave replay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;play&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:LogUIPlay(System.Int32[]) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Logs a player UI action to the current quicksave replay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:LogUIStringPlay(System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Logs a string to the current quicksave replay.  Used for name inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:QueueLogUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Starts queueing UI commands to the current replay quicksave.&lt;br /&gt;
UI commands need to be queued sometimes, because they may happen mid-action for an action that may fail later.&lt;br /&gt;
If a player action fails, it is not logged.  Thus, if queues didn&#039;t exist, UI actions would be logged for actions that didn&#039;t actually happen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:DequeueLogUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stops queueing UI commands to the current replay quicksave and writes the current queue to the replay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:EndPlay(RogueEssence.Data.GameProgress,System.String) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Called when an adventure is ended.  Closes the replay writing stream and saves the quicksave into a replay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;epitaph&amp;lt;/code&amp;gt;: None&lt;br /&gt;
* &amp;lt;code&amp;gt;outFile&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:SaveSessionTime(System.TimeSpan) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Saves the current session time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sessionTime&amp;lt;/code&amp;gt;: None&lt;br /&gt;
&lt;br /&gt;
== _DATA:SuspendPlay ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Called when an adventure is suspended.  Closes the replay writing stream to allow for clean exit.&lt;br /&gt;
Note how nothing else is done aside form closing the stream.&lt;br /&gt;
Quicksaves already save every action from the player as it happens, so even if they closed the game there is no lost data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:LoadMainGameState(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Returns game progress loaded from the save folder and current zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== _DATA:DeleteReplayData(System.Boolean) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deletes replays from the replay folder corresponding to the current mod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;includeFav&amp;lt;/code&amp;gt;: Favorites will be deleted too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Data Class Documentation]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2591</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2591"/>
		<updated>2024-11-11T20:19:37Z</updated>

		<summary type="html">&lt;p&gt;IDK: remove gitignore considerations: implemented in repo&amp;#039;s own gitignore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for windows.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Open PMDOData.sln using Visual Studio 2022.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
Currently, only x64 architecture is supported for Linux.&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for Linux.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for Linux.  We recommend using the .deb installer.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.&lt;br /&gt;
## If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Apple machines made a transition from x64 to ARM64 with [https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon Apple Silicon] in 2020-2024, with any Macs running on M1 Chips or later using ARM64. PMDO runs and deploys on x64 only; this normally means that PMDO entirely would not be able to run on M1+ Macs, but [https://en.wikipedia.org/wiki/Rosetta_(software) Rosetta 2] translates applications meant for x64 to run on ARM64.  This works normally when attempting to play published versions of PMDO, but makes things tricky for debugging.&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code ==&lt;br /&gt;
&lt;br /&gt;
If your machine predates the ARM64 transition (IE, predates M1 Macs), it uses x64 architecture, and there should be no issues debugging.  The setup for Visual Studio Code should work exactly as it did for Linux.  Use the instructions there if so.  Otherwise, you have two options:&lt;br /&gt;
# Use x64 Installation of VS Code on your Arm64 Mac&lt;br /&gt;
# Use Arm64 Installation of VS code and Attach Debugger on a separately built PMDO&lt;br /&gt;
&lt;br /&gt;
=== x64 Install on Arm64 Mac ===&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 (Not Arm64!) version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Check if your dotnet installation is pointing to the x64 version.  Do this with &amp;lt;code&amp;gt;type dotnet&amp;lt;/code&amp;gt; and see if it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64/dotnet&amp;lt;/code&amp;gt;.  If not, you will need to specify the path of dotnet to point to the x64 installation of dotnet: check &amp;lt;code&amp;gt;/etc/paths.d/dotnet&amp;lt;/code&amp;gt; and make sure it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for MacOS.  Specifically choose the zip for Intel Chip.&lt;br /&gt;
## If you have an existing VSCode installation under Arm64, it must be uninstalled.  You should be able to do this by sending the VSCode app to the trash.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
## If you had a previous installation of VSCode under Arm64, it&#039;s likely that the extension was also installed as an arm64 version.  You will need to uninstall it and reinstall to get the x64 version.  Do this for both the C# Dev Kit as well as the C# extension it depends on.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.&lt;br /&gt;
## If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
## If the console complains about missing FNA libs such as SDL2, copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes/osx-x64/native&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0&amp;lt;/code&amp;gt;, the build output location.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Arm64 Install with Attach Debugger ===&lt;br /&gt;
&lt;br /&gt;
There is currently no known way to change the build settings in VSCode.  If you install the Arm64 version of VS Code, you cannot build the x64 version.  Instead, you will need to build PMDO in the command line, run PMDO, and then attach the debugger from VS Code.&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the Arm64 version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Check if your dotnet installation is pointing to the arm64 version.  Do this with &amp;lt;code&amp;gt;type dotnet&amp;lt;/code&amp;gt; and see if it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/dotnet&amp;lt;/code&amp;gt;.  If not, you will need to specify the path of dotnet to point to the arm64 installation of dotnet: check &amp;lt;code&amp;gt;/etc/paths.d/dotnet&amp;lt;/code&amp;gt; and make sure it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for MacOS.  Specifically choose the zip for Apple Silicon.&lt;br /&gt;
## If you have an existing VSCode installation under x64, it must be uninstalled.  You should be able to do this by sending the VSCode app to the trash.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
## If you had a previous installation of VSCode under x64, it&#039;s likely that the extension was also installed as an x64 version.  You will need to uninstall it and reinstall to get the arm64 version.  Do this for both the C# Dev Kit as well as the C# extension it depends on.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# In the command line, cd to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;.  This should output an x64 debug build of PMDO to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in &amp;lt;code&amp;gt;PMDC/PMDC/runtimes/osx-x64/native&amp;lt;/code&amp;gt; to the output directory &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.  This will prevent the program from complaining about missing SDL2 dependencies.&lt;br /&gt;
# cd to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;./PMDC -dev -asset ../../../../../DumpAsset/&amp;lt;/code&amp;gt;.  The program should run successfully.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the Command Palette Ctrl+Shift+P and running the &amp;lt;code&amp;gt;Debug: Attach to a .NET 5+ or .NET Core process&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.  Find the process of your currently running PMDO instance and choose it in the dropdown.  Once selected, the UI will enter debug and you can set breakpoints as normal.&lt;br /&gt;
# Each time you want to debug a change, you must rebuild the project using &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;, run the resulting program, and then attach the debugger.&lt;br /&gt;
&lt;br /&gt;
Further research: It may be possible to start and attach in a single step using launch configurations:&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/60440765/how-can-i-attach-to-a-specific-process-in-visual-studio-code&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Code Issues ===&lt;br /&gt;
&lt;br /&gt;
Various issues arise when attempting to use the ARM64 version of dotnet with the ARM64 version VS Code.&lt;br /&gt;
&lt;br /&gt;
Whenever the user clicks &amp;quot;debug&amp;quot;, the IDE will build PMDO using the Any CPU setting.  If the x64 dotnet is installed, this defaults to an x64 build.  But if the Arm64 dotnet is installed, the Arm64 version is built. (Note: check if this is just the responsibility of dotnet installation itself, as opposed to both it and the IDE)&lt;br /&gt;
&lt;br /&gt;
THE ARM64 VERSION OF PMDO DOES NOT WORK.  IT IS MISSING ARM64 DEPENDENCIES FOR LUA, SKIASHARP.&lt;br /&gt;
&lt;br /&gt;
We must avoid building the Arm64 version and only build for x64.&lt;br /&gt;
&lt;br /&gt;
It&#039;s unknown if there is a way to configure the build step such that it uses the x64 dotnet to build PMDO under x64.  Can this be specified in &amp;lt;code&amp;gt;launchSettings.json&amp;lt;/code&amp;gt;?  In &amp;lt;code&amp;gt;tasks.json&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/debugging&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/debugger-settings&lt;br /&gt;
* https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-build&lt;br /&gt;
* https://code.visualstudio.com/Docs/editor/tasks&lt;br /&gt;
* https://code.visualstudio.com/docs/editor/variables-reference&lt;br /&gt;
* https://github.com/dotnet/docs/issues/34726&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/build-tools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
=== Jetbrains Rider on x64 ===&lt;br /&gt;
&lt;br /&gt;
This option works for Macs running on x64.  However, [[Troubleshooting_Debug_on_OSX_ARM64|issues]] have been seen when running on Arm64.&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Jetbrains Rider on arm64 ===&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the Arm64 version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In the command line, cd to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;.  This should output an x64 debug build of PMDO to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in &amp;lt;code&amp;gt;PMDC/PMDC/runtimes/osx-x64/native&amp;lt;/code&amp;gt; to the output directory &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.  This will prevent the program from complaining about missing SDL2 dependencies.&lt;br /&gt;
# cd to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;./PMDC -dev -asset ../../../../../DumpAsset/&amp;lt;/code&amp;gt;.  The program should run successfully.&lt;br /&gt;
# With Rider installed, [https://www.jetbrains.com/help/rider/attach-to-process.html attach a debugger to the currently running PMDO process].&lt;br /&gt;
# Each time you want to debug a change, you must rebuild the project using &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;, run the resulting program, and then attach the debugger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Debug_on_OSX_ARM64&amp;diff=2590</id>
		<title>Tutorial:Troubleshooting Debug on OSX ARM64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Debug_on_OSX_ARM64&amp;diff=2590"/>
		<updated>2024-11-11T19:38:49Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starting with apple M1, all mac OSes run on ARM64.  Existing x64 programs can still work on it thanks to rosetta, and indeed published versions of PMDO for oxs-x64 work just fine.&lt;br /&gt;
&lt;br /&gt;
However, building and debugging PMDO becomes confusing, as the build toolchain and the IDE may try to use the arm64 version instead of x64.  It may build the arm64 version, or debug an x64 build as if it were arm64.  Additionally, arm64 libraries are missing and thus cannot be run (at least not without building every dependency for arm64).&lt;br /&gt;
&lt;br /&gt;
This page goes over the troubleshooting process for getting PMDO to debug on OSX-ARM64 using Rider.  It is currently unresolved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sanity Checks ==&lt;br /&gt;
&lt;br /&gt;
These steps were taken to ensure the setup was correct.&lt;br /&gt;
&lt;br /&gt;
=== Other Projects ===&lt;br /&gt;
&lt;br /&gt;
Attempting to debug on other projects using Rider worked.&lt;br /&gt;
&lt;br /&gt;
=== Clearing Rider Cache ===&lt;br /&gt;
&lt;br /&gt;
File -&amp;gt; Invalidate Cache -&amp;gt; Choose all&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue.&lt;br /&gt;
&lt;br /&gt;
=== Clearing Nuget Cache ===&lt;br /&gt;
&lt;br /&gt;
Delete &amp;lt;code&amp;gt;~/.nuget&amp;lt;/code&amp;gt; to remove all nuget packages so that they&#039;ll be redownloaded cleanly on next build.&lt;br /&gt;
&lt;br /&gt;
It deletes gigabytes of data.  Build works and regenerated them cleanly.&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue.&lt;br /&gt;
&lt;br /&gt;
=== Clean Clone from Repository ===&lt;br /&gt;
&lt;br /&gt;
We are trying the basic Example program that contains the bare minimum in dependencies.&lt;br /&gt;
&lt;br /&gt;
Do a fresh clone+submodules of RogueEssence in this branch: https://github.com/RogueCollab/RogueEssence/tree/Example&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue, but this provides a good base to start isolating the problem in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Factors to Consider ===&lt;br /&gt;
&lt;br /&gt;
We have two runtimes of dotnet: &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64/dotnet&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/usr/local/share/dotnet/dotnet&amp;lt;/code&amp;gt;. Which runtime do we use in Rider?&lt;br /&gt;
&lt;br /&gt;
What are the possible configurations when building/debugging?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Attempts and Their Results ===&lt;br /&gt;
&lt;br /&gt;
A series of experiments were performed in running the command line &amp;lt;code&amp;gt;dotnet build&amp;lt;/code&amp;gt; and running the outputted executable.  Before each experiment, the bin/ and obj/ subfolders were completely deleted.&lt;br /&gt;
&lt;br /&gt;
These are the results you get when you perform the following actions with a wiped bin/obj:&lt;br /&gt;
* dotnet build:  Fails.  It builds out to bin/Debug/net8.0.  Complains about libskia.dylib and requires it to be arm64.  Ran using ./PMDC&lt;br /&gt;
* dotnet build -c Debug -r osx-x64: Successful.  It builds out to bin/Debug/net8.0/osx-x64 but does not copy fnalibs.  Once they are copied manually, running ./PMDC -dev -asset ../../../../../DumpAsset/ succeeds.&lt;br /&gt;
* Debugging in Rider with PMDC configured to Any CPU: Exact same result as dotnet build.&lt;br /&gt;
* Debugging in Rider with PMDC configured to x64: Fails.  It builds out to bin/Debug/net8.0.  Complains with System.IO.FileLoadException: Could not load file or assembly &#039;PMDC&#039;.  This error also shows up if ran using ./PMDC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Backup Plans ===&lt;br /&gt;
&lt;br /&gt;
* Plan A was to clear all the caches and ensure no remnant dependencies...&lt;br /&gt;
* Plan B was to look into configuration to see if anything could be set right there.&lt;br /&gt;
* Plan C will be an attempt to attach a debugger to the x64 build that does work, and come up with some patch solution on that.&lt;br /&gt;
* Plan D is to do it all the hard way and build PMDO with arm64 skiasharp off an example avalonia project plus [[Upgrading_FNA_Dependencies|Xcode building fnalibs]] plus additional building for [[Upgrading_Lua_Debug|lualibs and core.so]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Debug_on_OSX_ARM64&amp;diff=2589</id>
		<title>Tutorial:Troubleshooting Debug on OSX ARM64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Debug_on_OSX_ARM64&amp;diff=2589"/>
		<updated>2024-11-11T19:38:02Z</updated>

		<summary type="html">&lt;p&gt;IDK: reformatting and links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starting with apple M1, all mac OSes run on ARM64.  Existing x64 programs can still work on it thanks to rosetta, and indeed published versions of PMDO for oxs-x64 work just fine.&lt;br /&gt;
&lt;br /&gt;
However, building and debugging PMDO becomes confusing, as the build toolchain and the IDE may try to use the arm64 version instead of x64.  It may build the arm64 version, or debug an x64 build as if it were arm64.  Additionally, arm64 libraries are missing and thus cannot be run (at least not without building every dependency for arm64).&lt;br /&gt;
&lt;br /&gt;
This page goes over the troubleshooting process for getting PMDO to debug on OSX-ARM64 using Rider.  It is currently unresolved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sanity Checks ==&lt;br /&gt;
&lt;br /&gt;
These steps were taken to ensure the setup was correct.&lt;br /&gt;
&lt;br /&gt;
=== Other Projects ===&lt;br /&gt;
&lt;br /&gt;
Attempting to debug on other projects using Rider worked.&lt;br /&gt;
&lt;br /&gt;
=== Clearing Rider Cache ===&lt;br /&gt;
&lt;br /&gt;
File -&amp;gt; Invalidate Cache -&amp;gt; Choose all&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue.&lt;br /&gt;
&lt;br /&gt;
=== Clearing Nuget Cache ===&lt;br /&gt;
&lt;br /&gt;
Delete &amp;lt;code&amp;gt;~/.nuget&amp;lt;/code&amp;gt; to remove all nuget packages so that they&#039;ll be redownloaded cleanly on next build.&lt;br /&gt;
&lt;br /&gt;
It deletes gigabytes of data.  Build works and regenerated them cleanly.&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue.&lt;br /&gt;
&lt;br /&gt;
=== Clean Clone from Repository ===&lt;br /&gt;
&lt;br /&gt;
We are trying the basic Example program that contains the bare minimum in dependencies.&lt;br /&gt;
&lt;br /&gt;
Do a fresh clone+submodules of RogueEssence in this branch: https://github.com/RogueCollab/RogueEssence/tree/Example&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue, but this provides a good base to start isolating the problem in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Factors to Consider ===&lt;br /&gt;
&lt;br /&gt;
We have two runtimes of dotnet: &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64/dotnet&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/usr/local/share/dotnet/dotnet&amp;lt;/code&amp;gt;. Which runtime do we use in Rider?&lt;br /&gt;
&lt;br /&gt;
What are the possible configurations when building/debugging?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Attempts and Their Results ===&lt;br /&gt;
&lt;br /&gt;
A series of experiments were performed in running the command line &amp;lt;code&amp;gt;dotnet build&amp;lt;/code&amp;gt; and running the outputted executable.  Before each experiment, the bin/ and obj/ subfolders were completely deleted.&lt;br /&gt;
&lt;br /&gt;
These are the results you get when you perform the following actions with a wiped bin/obj:&lt;br /&gt;
* dotnet build:  Fails.  It builds out to bin/Debug/net8.0.  Complains about libskia.dylib and requires it to be arm64.  Ran using ./PMDC&lt;br /&gt;
* dotnet build -c Debug -r osx-x64: Successful.  It builds out to bin/Debug/net8.0/osx-x64 but does not copy fnalibs.  Once they are copied manually, running ./PMDC -dev -asset ../../../../../DumpAsset/ succeeds.&lt;br /&gt;
* Debugging in Rider with PMDC configured to Any CPU: Exact same result as dotnet build.&lt;br /&gt;
* Debugging in Rider with PMDC configured to x64: Fails.  It builds out to bin/Debug/net8.0.  Complains with System.IO.FileLoadException: Could not load file or assembly &#039;PMDC&#039;.  This error also shows up if ran using ./PMDC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Backup Plans ===&lt;br /&gt;
&lt;br /&gt;
* Plan A was to clear all the caches and ensure no remnant dependencies...&lt;br /&gt;
* Plan B was to look into configuration to see if anything could be set right there.&lt;br /&gt;
* Plan C will be an attempt to attach a debugger to the x64 build that does work, and come up with some patch solution on that.&lt;br /&gt;
* Plan D is to do it all the hard way and build PMDO with arm64 skiasharp off an example avalonia project plus [[https://wiki.pmdo.pmdcollab.org/Upgrading_FNA_Dependencies|Xcode building fnalibs]] plus additional building for [[https://wiki.pmdo.pmdcollab.org/Upgrading_Lua_Debug|lualibs and core.so]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2588</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2588"/>
		<updated>2024-11-11T19:35:18Z</updated>

		<summary type="html">&lt;p&gt;IDK: attach debugger instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for windows.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Open PMDOData.sln using Visual Studio 2022.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
Currently, only x64 architecture is supported for Linux.&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for Linux.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for Linux.  We recommend using the .deb installer.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.&lt;br /&gt;
## If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Apple machines made a transition from x64 to ARM64 with [https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon Apple Silicon] in 2020-2024, with any Macs running on M1 Chips or later using ARM64. PMDO runs and deploys on x64 only; this normally means that PMDO entirely would not be able to run on M1+ Macs, but [https://en.wikipedia.org/wiki/Rosetta_(software) Rosetta 2] translates applications meant for x64 to run on ARM64.  This works normally when attempting to play published versions of PMDO, but makes things tricky for debugging.&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code ==&lt;br /&gt;
&lt;br /&gt;
If your machine predates the ARM64 transition (IE, predates M1 Macs), it uses x64 architecture, and there should be no issues debugging.  The setup for Visual Studio Code should work exactly as it did for Linux.  Use the instructions there if so.  Otherwise, you have two options:&lt;br /&gt;
# Use x64 Installation of VS Code on your Arm64 Mac&lt;br /&gt;
# Use Arm64 Installation of VS code and Attach Debugger on a separately built PMDO&lt;br /&gt;
&lt;br /&gt;
=== x64 Install on Arm64 Mac ===&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 (Not Arm64!) version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Check if your dotnet installation is pointing to the x64 version.  Do this with &amp;lt;code&amp;gt;type dotnet&amp;lt;/code&amp;gt; and see if it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64/dotnet&amp;lt;/code&amp;gt;.  If not, you will need to specify the path of dotnet to point to the x64 installation of dotnet: check &amp;lt;code&amp;gt;/etc/paths.d/dotnet&amp;lt;/code&amp;gt; and make sure it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for MacOS.  Specifically choose the zip for Intel Chip.&lt;br /&gt;
## If you have an existing VSCode installation under Arm64, it must be uninstalled.  You should be able to do this by sending the VSCode app to the trash.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
## If you had a previous installation of VSCode under Arm64, it&#039;s likely that the extension was also installed as an arm64 version.  You will need to uninstall it and reinstall to get the x64 version.  Do this for both the C# Dev Kit as well as the C# extension it depends on.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.&lt;br /&gt;
## If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
## If the console complains about missing FNA libs such as SDL2, copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes/osx-x64/native&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0&amp;lt;/code&amp;gt;, the build output location.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Arm64 Install with Attach Debugger ===&lt;br /&gt;
&lt;br /&gt;
There is currently no known way to change the build settings in VSCode.  If you install the Arm64 version of VS Code, you cannot build the x64 version.  Instead, you will need to build PMDO in the command line, run PMDO, and then attach the debugger from VS Code.&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the Arm64 version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Check if your dotnet installation is pointing to the arm64 version.  Do this with &amp;lt;code&amp;gt;type dotnet&amp;lt;/code&amp;gt; and see if it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/dotnet&amp;lt;/code&amp;gt;.  If not, you will need to specify the path of dotnet to point to the arm64 installation of dotnet: check &amp;lt;code&amp;gt;/etc/paths.d/dotnet&amp;lt;/code&amp;gt; and make sure it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for MacOS.  Specifically choose the zip for Apple Silicon.&lt;br /&gt;
## If you have an existing VSCode installation under x64, it must be uninstalled.  You should be able to do this by sending the VSCode app to the trash.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
## If you had a previous installation of VSCode under x64, it&#039;s likely that the extension was also installed as an x64 version.  You will need to uninstall it and reinstall to get the arm64 version.  Do this for both the C# Dev Kit as well as the C# extension it depends on.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# In the command line, cd to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;.  This should output an x64 debug build of PMDO to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in &amp;lt;code&amp;gt;PMDC/PMDC/runtimes/osx-x64/native&amp;lt;/code&amp;gt; to the output directory &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.  This will prevent the program from complaining about missing SDL2 dependencies.&lt;br /&gt;
# cd to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;./PMDC -dev -asset ../../../../../DumpAsset/&amp;lt;/code&amp;gt;.  The program should run successfully.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the Command Palette Ctrl+Shift+P and running the &amp;lt;code&amp;gt;Debug: Attach to a .NET 5+ or .NET Core process&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.  Find the process of your currently running PMDO instance and choose it in the dropdown.  Once selected, the UI will enter debug and you can set breakpoints as normal.&lt;br /&gt;
# Each time you want to debug a change, you must rebuild the project using &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;, run the resulting program, and then attach the debugger.&lt;br /&gt;
&lt;br /&gt;
Further research: It may be possible to start and attach in a single step using launch configurations:&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/60440765/how-can-i-attach-to-a-specific-process-in-visual-studio-code&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Code Issues ===&lt;br /&gt;
&lt;br /&gt;
Various issues arise when attempting to use the ARM64 version of dotnet with the ARM64 version VS Code.&lt;br /&gt;
&lt;br /&gt;
Whenever the user clicks &amp;quot;debug&amp;quot;, the IDE will build PMDO using the Any CPU setting.  If the x64 dotnet is installed, this defaults to an x64 build.  But if the Arm64 dotnet is installed, the Arm64 version is built. (Note: check if this is just the responsibility of dotnet installation itself, as opposed to both it and the IDE)&lt;br /&gt;
&lt;br /&gt;
THE ARM64 VERSION OF PMDO DOES NOT WORK.  IT IS MISSING ARM64 DEPENDENCIES FOR LUA, SKIASHARP.&lt;br /&gt;
&lt;br /&gt;
We must avoid building the Arm64 version and only build for x64.&lt;br /&gt;
&lt;br /&gt;
It&#039;s unknown if there is a way to configure the build step such that it uses the x64 dotnet to build PMDO under x64.  Can this be specified in &amp;lt;code&amp;gt;launchSettings.json&amp;lt;/code&amp;gt;?  In &amp;lt;code&amp;gt;tasks.json&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/debugging&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/debugger-settings&lt;br /&gt;
* https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-build&lt;br /&gt;
* https://code.visualstudio.com/Docs/editor/tasks&lt;br /&gt;
* https://code.visualstudio.com/docs/editor/variables-reference&lt;br /&gt;
* https://github.com/dotnet/docs/issues/34726&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/build-tools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
=== Jetbrains Rider on x64 ===&lt;br /&gt;
&lt;br /&gt;
This option works for Macs running on x64.  However, [[Troubleshooting_Debug_on_OSX_ARM64|issues]] have been seen when running on Arm64.&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Jetbrains Rider on arm64 ===&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the Arm64 version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In the command line, cd to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;.  This should output an x64 debug build of PMDO to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in &amp;lt;code&amp;gt;PMDC/PMDC/runtimes/osx-x64/native&amp;lt;/code&amp;gt; to the output directory &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt;.  This will prevent the program from complaining about missing SDL2 dependencies.&lt;br /&gt;
# cd to &amp;lt;code&amp;gt;PMDC/PMDC/bin/Debug/net8.0/osx-x64&amp;lt;/code&amp;gt; and run &amp;lt;code&amp;gt;./PMDC -dev -asset ../../../../../DumpAsset/&amp;lt;/code&amp;gt;.  The program should run successfully.&lt;br /&gt;
# With Rider installed, [https://www.jetbrains.com/help/rider/attach-to-process.html attach a debugger to the currently running PMDO process].&lt;br /&gt;
# Each time you want to debug a change, you must rebuild the project using &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;, run the resulting program, and then attach the debugger.&lt;br /&gt;
&lt;br /&gt;
== Gitignore considerations ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In your &amp;lt;code&amp;gt;~/.gitignore_global&amp;lt;/code&amp;gt; file, add the following files for git to ignore:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debug logs (npm, yarn)&lt;br /&gt;
*.log&lt;br /&gt;
&lt;br /&gt;
# Editor artifacts&lt;br /&gt;
.*.sw[a-z]&lt;br /&gt;
*~&lt;br /&gt;
.#*&lt;br /&gt;
.vscode&lt;br /&gt;
.idea&lt;br /&gt;
&lt;br /&gt;
# OS files&lt;br /&gt;
Thumbs.db&lt;br /&gt;
.DS_Store&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You may want to include more. Modified from [https://www.mashupgarage.com/playbook/git/gitignore.html here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=File:Troubleshooting_IntelAtom_DX11.jpg&amp;diff=2587</id>
		<title>File:Troubleshooting IntelAtom DX11.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=File:Troubleshooting_IntelAtom_DX11.jpg&amp;diff=2587"/>
		<updated>2024-11-11T18:50:54Z</updated>

		<summary type="html">&lt;p&gt;IDK: Category:Troubleshooting Images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[[Category:Troubleshooting Images]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=File:Troubleshooting_IntelAtom_Features.jpg&amp;diff=2586</id>
		<title>File:Troubleshooting IntelAtom Features.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=File:Troubleshooting_IntelAtom_Features.jpg&amp;diff=2586"/>
		<updated>2024-11-11T18:50:42Z</updated>

		<summary type="html">&lt;p&gt;IDK: Category:Troubleshooting Images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[[Category:Troubleshooting Images]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=File:Troubleshooting_IntelAtom_UpdateDrivers.png&amp;diff=2585</id>
		<title>File:Troubleshooting IntelAtom UpdateDrivers.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=File:Troubleshooting_IntelAtom_UpdateDrivers.png&amp;diff=2585"/>
		<updated>2024-11-11T18:50:30Z</updated>

		<summary type="html">&lt;p&gt;IDK: Category:Troubleshooting Images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[[Category:Troubleshooting Images]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Startup_on_Intel_Atom&amp;diff=2584</id>
		<title>Tutorial:Troubleshooting Startup on Intel Atom</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Startup_on_Intel_Atom&amp;diff=2584"/>
		<updated>2024-11-11T18:49:47Z</updated>

		<summary type="html">&lt;p&gt;IDK: troubleshooting images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Troubleshooting for running PMDO on the following specs:&lt;br /&gt;
&lt;br /&gt;
Operating System: Windows 7 Ultimate, Service Pack 1&lt;br /&gt;
Processor: Intel Atom D510 @ 1.66GHz&lt;br /&gt;
Memory (RAM): 1.00 GB&lt;br /&gt;
System Type: 32-bit operating system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program fails like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[2024/09/16 08:33:22.1] Creating device with feature level 11_1 failed. Lowering feature level.&lt;br /&gt;
&lt;br /&gt;
[2024/09/16 08:33:22.106] D3D11 is unsupported! Error Code: 887A0004&lt;br /&gt;
&lt;br /&gt;
[2024/09/16 08:33:22.916] FNA3D Driver: OpenGL&lt;br /&gt;
&lt;br /&gt;
[2024/09/16 08:33:22.917] OpenGL Renderer: Intel Pineview Platform&lt;br /&gt;
&lt;br /&gt;
[2024/09/16 08:33:22.917] OpenGL Driver: 1.4.0 - Build 8.14.10.1929&lt;br /&gt;
&lt;br /&gt;
[2024/09/16 08:33:22.918] OpenGL Vendor: Intel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
+ Program stopped working&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This issue has been unresolved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Install DirectX ==&lt;br /&gt;
&lt;br /&gt;
Tried installing directX: https://support.microsoft.com/en-us/topic/how-to-install-the-latest-version-of-directx-d1f5ffa5-dae2-246c-91b1-ee1e973ed8c2&lt;br /&gt;
&lt;br /&gt;
in order to resolve this error:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;D3D11 is unsupported! Error Code: 887A0004&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
It says it already has this installed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OS update ==&lt;br /&gt;
&lt;br /&gt;
was this OS updated as well?&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
Windows Standalone Installer&lt;br /&gt;
The Windows Update (KB2670838) is already installed on this computer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DxDiag ==&lt;br /&gt;
&lt;br /&gt;
can you run dxdiag?  you should be able to search for it on the start menu&lt;br /&gt;
we&#039;re going to try and find out more about your current directx installation.&lt;br /&gt;
PMDO needs Direct3D 11&lt;br /&gt;
I think that&#039;s part of DirectX 11&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
[[File:Troubleshooting_IntelAtom_DX11.jpg|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the Display tab, under DirectX Features, verify Direct3D Acceleration are selected. &lt;br /&gt;
can you check this?&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
All selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DxDiag Render ==&lt;br /&gt;
&lt;br /&gt;
what about the Render tab?  what&#039;s on there?&lt;br /&gt;
specifically the &amp;quot;Device&amp;quot; and &amp;quot;Drivers&amp;quot; sections&lt;br /&gt;
oh it might still be on Display tab&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
[[File:Troubleshooting_IntelAtom_Features.jpg|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Support ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DDI needs to be 11 or higher&lt;br /&gt;
you need to download the right display driver...&lt;br /&gt;
download/update&lt;br /&gt;
hmmmm&lt;br /&gt;
I think it&#039;s possible to do this from the device manager.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update to Right display driver ==&lt;br /&gt;
&lt;br /&gt;
Type in Device Manager from the start search, and then do this:&lt;br /&gt;
&lt;br /&gt;
[[File:Troubleshooting_IntelAtom_UpdateDrivers.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
The best driver software for the device is installed&lt;br /&gt;
Windows has determined that the driver software for the device is up to date.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Support ===&lt;br /&gt;
&lt;br /&gt;
even if this window says your drivers are up to date&lt;br /&gt;
there is still a specific dll you&#039;re missing&lt;br /&gt;
the easy way is through automatic updaters&lt;br /&gt;
but manual will still be possible...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Manual Update to right display Driver ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
can you check if you have this already installed? https://www.intel.com/content/www/us/en/download/19536/intel-graphics-media-accelerator-3150-for-windows-7-32-bit.html&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
After installation, this computer went black screen hmm（To solve this, I reinstalled the original driver and the black screen no longer appeared）.&lt;br /&gt;
So installing this driver doesn&#039;t seem to work.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Articles ==&lt;br /&gt;
&lt;br /&gt;
https://www.reddit.com/r/24hoursupport/comments/115faah/direct3d_ddi_stuck_on_111_but_system_is_running/&lt;br /&gt;
https://www.reddit.com/r/24hoursupport/comments/2ni5ri/ddi_stuck_at_9ex_even_though_my_card_is_dx11_ready/&lt;br /&gt;
&lt;br /&gt;
[[Category: Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Dev_Mode&amp;diff=2583</id>
		<title>Dev Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Dev_Mode&amp;diff=2583"/>
		<updated>2024-11-11T06:41:30Z</updated>

		<summary type="html">&lt;p&gt;IDK: Soft reset&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PMDO has a secret developer mode that can be used to cheat, examine, and mod the game.&lt;br /&gt;
Start PMDO in this mode using the following command:&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMDO.exe -dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./PMDO -dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also run the &amp;lt;code&amp;gt;dev.bat&amp;lt;/code&amp;gt; file to start without the command line.&lt;br /&gt;
&lt;br /&gt;
== Hotkeys ==&lt;br /&gt;
&lt;br /&gt;
* F1 shows diagnostic information.  This will show FPS, version number, current position, animation, and hitboxes.  This is also usable outside of dev mode but will only show FPS and version number.&lt;br /&gt;
* Shift+Up/Down warps to the next and previous floors of the dungeon, respectively.&lt;br /&gt;
* Shift+Left/Right warps to the next and previous segments of the dungeon.  A dungeon may be split up into segments such as Magma Cavern and Deep Magma Cavern.&lt;br /&gt;
* Shift+Right Click will warp the player to the location clicked.&lt;br /&gt;
* F2 pauses the game.&lt;br /&gt;
* F3 advances the frame when the game is paused.&lt;br /&gt;
* F4 is a test button used by programmers to quickly test a feature.  Don’t worry about this.&lt;br /&gt;
* F5 slows down the game.&lt;br /&gt;
* F6 speeds up the game.&lt;br /&gt;
* F8 mutes the music, and unmutes it when muted.&lt;br /&gt;
* F9 turns on FreeCam mode, where the camera can be moved.  In dungeons, it turns on SeeAll mode.&lt;br /&gt;
* F11 takes a screenshot of the ENTIRE map, useful for showcasing maps.  All characters, objects, and currently active VFX are included. The screenshot is saved to the SCREENSHOT/ subfolder.&lt;br /&gt;
* F12 warps the player to the debug ground map using their current save file.  If no save file exists, a debug file is created (but not saved)&lt;br /&gt;
* F1+F12 warps the player to the debug room.  Unlike F12, it send the player to the debug dungeon map.&lt;br /&gt;
* CTRL+F12 soft resets to the title screen.&lt;br /&gt;
&lt;br /&gt;
== Dev Panel ==&lt;br /&gt;
&lt;br /&gt;
This contains the main controls to modify the game.  They are separated into tabs.&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
Often used to cheat and test in dungeons.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Game.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Hide Objects: Hides items and traps.  In ground maps, objects are hidden.&lt;br /&gt;
* Hide Sprites: Hides Pokemon.  Often used for screenshots.&lt;br /&gt;
* Create Clone: Creates a (Hostile) clone of your current character in your current location.&lt;br /&gt;
* Clear All Foes: Removes all enemies from the map. &lt;br /&gt;
* Skill List: Allows you to learn a move, or give it to foes.&lt;br /&gt;
* Ability list: Allows you to gain an ability, or give it to foes.&lt;br /&gt;
* Status List: Allows you to take on a status effect.&lt;br /&gt;
* Item List: Allows you to spawn items in dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Player ===&lt;br /&gt;
Often used to cheat in dungeons, or test animations.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Player.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Lv.: Sets the current player’s level.  Updates in real time.&lt;br /&gt;
* Reroll: Updates the current player’s moveset to the latest naturally learned moves at the current level.&lt;br /&gt;
* Species/Form/Skin/Gender: Change the player’s current species/form/shininess/gender.&lt;br /&gt;
* Animation: Change the player’s current animation.&lt;br /&gt;
&lt;br /&gt;
=== Travel ===&lt;br /&gt;
Used to instantly warp to needed locations.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Travel.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Areas are organized into Zones.&lt;br /&gt;
* Each zone has a list of Structures, plus a list of Ground Maps.&lt;br /&gt;
* Ground Maps are the hub maps with free movement.&lt;br /&gt;
* Each Structure contains a list of floors.&lt;br /&gt;
* You can choose to enter either a a Ground map using Enter Ground, or a dungeon floor using Enter Map.&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
Used to edit maps, items, Pokemon, etc.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Data.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Sprites ===&lt;br /&gt;
Used to the graphics of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Sprites.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Char Sprites: Pokemon sprites in dungeons/overworld.&lt;br /&gt;
* Portraits: Character portraits in dialogue.&lt;br /&gt;
* Particles: Most attack graphics.&lt;br /&gt;
* Beams: Used in attacks that shoot continuous beams, plus columns of light used for sending home.&lt;br /&gt;
* Backgrounds: Used in the title screen, and maps with parallax backgrounds.&lt;br /&gt;
* Emotes: Emote animations.  Includes status effect icons.&lt;br /&gt;
* Tiles: All tilesets.  Does not include autotiles (which are in the Data tab).&lt;br /&gt;
* Items: Item Sprites&lt;br /&gt;
* Objects: Tree stumps, signs, traps, etc.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
A lua command prompt to enter custom commands.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Script.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
* Reload Scripts: Reloads all lua scripts with your edits without needing to restart the game.&lt;br /&gt;
* Text Test: Allows you to test a dialogue box with sample text.  For translators.&lt;br /&gt;
&lt;br /&gt;
Command box controls:&lt;br /&gt;
* Type in a lua script command to run it directly on the game.&lt;br /&gt;
* Use TASK:BranchCoroutine(&amp;lt;your function here&amp;gt;) to call coroutines.&lt;br /&gt;
* SHIFT+Up/Down to scroll past commands.&lt;br /&gt;
* SHIFT+Enter to enter a multiline command.&lt;br /&gt;
&lt;br /&gt;
=== Mods ===&lt;br /&gt;
Controls which mod the game currently has loaded.  Can create, delete, and switch between mods.  Only one may be loaded at a time.  If you want to work on a mod, make sure the game is set to that mod before doing work.&lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Mod.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
Starter data, special game events, and VFX that are used in hardcoded portions of the game. &lt;br /&gt;
&lt;br /&gt;
[[File:DevPanel_Constants.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
=== The Debug Room ===&lt;br /&gt;
This room contains a crowd of Pokemon at the top left corner for east move/ability/item testing.&lt;br /&gt;
&lt;br /&gt;
[[File:DebugRoom.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding]]&lt;br /&gt;
[[Category:Quick Reference]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2582</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2582"/>
		<updated>2024-11-09T23:18:23Z</updated>

		<summary type="html">&lt;p&gt;IDK: Issues and further research&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for windows.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Open PMDOData.sln using Visual Studio 2022.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
Currently, only x64 architecture is supported for Linux.&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for Linux.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for Linux.  We recommend using the .deb installer.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.  If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Apple machines made a transition from x64 to ARM64 with [https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon Apple Silicon] in 2020-2024, with any Macs running on M1 Chips or later using ARM64. PMDO runs and deploys on x64 only; this normally means that PMDO entirely would not be able to run on M1+ Macs, but [https://en.wikipedia.org/wiki/Rosetta_(software) Rosetta 2] translates applications meant for x64 to run on ARM64.  This works normally when attempting to play published versions of PMDO, but makes things tricky for debugging.&lt;br /&gt;
&lt;br /&gt;
If your machine predates the ARM64 transition (IE, predates M1 Macs), it uses x64 architecture, and there should be no issues debugging.  The setup for Visual Studio Code should work exactly as it did for Linux.  Use the instructions there if so.  Otherwise, use the modified instructions below:&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code (Arm64) ==&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 (Not Arm64!) version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## If you&#039;ve previously installed dotnet, it&#039;s likely the version for Arm64.  You must [https://learn.microsoft.com/en-us/dotnet/core/install/remove-runtime-sdk-versions uninstall] it beforehand.&lt;br /&gt;
## If &amp;lt;code&amp;gt;dotnet&amp;lt;/code&amp;gt; command does not work after x64 installation, you may need to specify the path of dotnet directly: check &amp;lt;code&amp;gt;/etc/paths.d/dotnet&amp;lt;/code&amp;gt; and make sure it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for MacOS.  Specifically choose the zip for Intel Chip.&lt;br /&gt;
## If you have an existing VSCode installation under Arm64, it must be uninstalled.  You should be able to do this by sending the VSCode app to the trash.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
## If you had a previous installation of VSCode under Arm64, it&#039;s likely that the extension was also installed as an arm64 version.  You will need to uninstall it and reinstall to get the x64 version.  Do this for both the C# Dev Kit as well as the C# extension it depends on.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.  If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code Issues ==&lt;br /&gt;
&lt;br /&gt;
Various issues arise when attempting to use the ARM64 version of dotnet with the ARM64 version VS Code.&lt;br /&gt;
&lt;br /&gt;
Whenever the user clicks &amp;quot;debug&amp;quot;, the IDE will build PMDO using the Any CPU setting.  If the x64 dotnet is installed, this defaults to an x64 build.  But if the Arm64 dotnet is installed, the Arm64 version is built. (Note: check if this is just the responsibility of dotnet installation itself, as opposed to both it and the IDE)&lt;br /&gt;
&lt;br /&gt;
THE ARM64 VERSION OF PMDO DOES NOT WORK.  IT IS MISSING ARM64 DEPENDENCIES FOR LUA, SKIASHARP.&lt;br /&gt;
&lt;br /&gt;
We must avoid building the Arm64 version and only build for x64.&lt;br /&gt;
&lt;br /&gt;
It&#039;s unknown if there is a way to configure the build step such that it uses the x64 dotnet to build PMDO under x64.  Can this be specified in &amp;lt;code&amp;gt;launchSettings.json&amp;lt;/code&amp;gt;?  In &amp;lt;code&amp;gt;tasks.json&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/debugging&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/debugger-settings&lt;br /&gt;
* https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-build&lt;br /&gt;
* https://code.visualstudio.com/Docs/editor/tasks&lt;br /&gt;
* https://code.visualstudio.com/docs/editor/variables-reference&lt;br /&gt;
* https://github.com/dotnet/docs/issues/34726&lt;br /&gt;
* https://code.visualstudio.com/docs/csharp/build-tools&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
&lt;br /&gt;
Made by: Trio-#4442&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gitignore considerations ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In your &amp;lt;code&amp;gt;~/.gitignore_global&amp;lt;/code&amp;gt; file, add the following files for git to ignore:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debug logs (npm, yarn)&lt;br /&gt;
*.log&lt;br /&gt;
&lt;br /&gt;
# Editor artifacts&lt;br /&gt;
.*.sw[a-z]&lt;br /&gt;
*~&lt;br /&gt;
.#*&lt;br /&gt;
.vscode&lt;br /&gt;
.idea&lt;br /&gt;
&lt;br /&gt;
# OS files&lt;br /&gt;
Thumbs.db&lt;br /&gt;
.DS_Store&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You may want to include more. Modified from [https://www.mashupgarage.com/playbook/git/gitignore.html here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2581</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2581"/>
		<updated>2024-11-09T21:06:07Z</updated>

		<summary type="html">&lt;p&gt;IDK: refactor steps to debug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for windows.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Open PMDOData.sln using Visual Studio 2022.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
Currently, only x64 architecture is supported for Linux.&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 version for Linux.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for Linux.  We recommend using the .deb installer.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.  If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Apple machines made a transition from x64 to ARM64 with [https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon Apple Silicon] in 2020-2024, with any Macs running on M1 Chips or later using ARM64. PMDO runs and deploys on x64 only; this normally means that PMDO entirely would not be able to run on M1+ Macs, but [https://en.wikipedia.org/wiki/Rosetta_(software) Rosetta 2] translates applications meant for x64 to run on ARM64.  This works normally when attempting to play published versions of PMDO, but makes things tricky for debugging.&lt;br /&gt;
&lt;br /&gt;
If your machine predates the ARM64 transition (IE, predates M1 Macs), it uses x64 architecture, and there should be no issues debugging.  The setup for Visual Studio Code should work exactly as it did for Linux.  Use the instructions there if so.  Otherwise, use the modified instructions below:&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code (Arm64) ==&lt;br /&gt;
&lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download the [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0 SDK]. You want to download the x64 (Not Arm64!) version for MacOS.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## If you&#039;ve previously installed dotnet, it&#039;s likely the version for Arm64.  You must [https://learn.microsoft.com/en-us/dotnet/core/install/remove-runtime-sdk-versions uninstall] it beforehand.&lt;br /&gt;
## If &amp;lt;code&amp;gt;dotnet&amp;lt;/code&amp;gt; command does not work after x64 installation, you may need to specify the path of dotnet directly: check &amp;lt;code&amp;gt;/etc/paths.d/dotnet&amp;lt;/code&amp;gt; and make sure it points to &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install [https://code.visualstudio.com/download Visual Studio Code] for MacOS.  Specifically choose the zip for Intel Chip.&lt;br /&gt;
## If you have an existing VSCode installation under Arm64, it must be uninstalled.  You should be able to do this by sending the VSCode app to the trash.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit].  This can be found in the Extensions tab.&lt;br /&gt;
## If you had a previous installation of VSCode under Arm64, it&#039;s likely that the extension was also installed as an arm64 version.  You will need to uninstall it and reinstall to get the x64 version.  Do this for both the C# Dev Kit as well as the C# extension it depends on.&lt;br /&gt;
# Open the PMDOData folder with VSCode.  You can do this by starting with a blank VSCode window, open a folder, select the PMDODump folder.&lt;br /&gt;
# With the C# Dev Kit installed, you now have the option to open the PMDOData.sln: check the Solution Explorer tab, then right click PMDOData.sln and choose &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# With the C# Dev Kit installed, you also have the option to open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt;.  In the command palette, type/choose &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose &amp;quot;C#&amp;quot; from the dropdown.  If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.  If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
&lt;br /&gt;
Made by: Trio-#4442&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gitignore considerations ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In your &amp;lt;code&amp;gt;~/.gitignore_global&amp;lt;/code&amp;gt; file, add the following files for git to ignore:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debug logs (npm, yarn)&lt;br /&gt;
*.log&lt;br /&gt;
&lt;br /&gt;
# Editor artifacts&lt;br /&gt;
.*.sw[a-z]&lt;br /&gt;
*~&lt;br /&gt;
.#*&lt;br /&gt;
.vscode&lt;br /&gt;
.idea&lt;br /&gt;
&lt;br /&gt;
# OS files&lt;br /&gt;
Thumbs.db&lt;br /&gt;
.DS_Store&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You may want to include more. Modified from [https://www.mashupgarage.com/playbook/git/gitignore.html here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2580</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2580"/>
		<updated>2024-11-09T05:10:14Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open PMDOData.sln using [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open PMDOData.sln using [https://code.visualstudio.com/download Visual Studio Code].  You can do this by opening the PMDODump folder, then right clicking PMDOData.sln and choosing &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit] if you haven&#039;t already.  This can be found in the Extensions tab.&lt;br /&gt;
# After the C# Dev Kit is installed, you can open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt; and typing/choosing &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose C#.&lt;br /&gt;
### If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.  If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Note: This has only been tested with Jetbrains Rider and Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
Made by: Trio-#4442&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version.  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
# In your &amp;lt;code&amp;gt;~/.gitignore_global&amp;lt;/code&amp;gt; file, add the following files for git to ignore:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debug logs (npm, yarn)&lt;br /&gt;
*.log&lt;br /&gt;
&lt;br /&gt;
# Editor artifacts&lt;br /&gt;
.*.sw[a-z]&lt;br /&gt;
*~&lt;br /&gt;
.#*&lt;br /&gt;
.vscode&lt;br /&gt;
.idea&lt;br /&gt;
&lt;br /&gt;
# OS files&lt;br /&gt;
Thumbs.db&lt;br /&gt;
.DS_Store&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You may want to include more. Modified from [https://www.mashupgarage.com/playbook/git/gitignore.html here].&lt;br /&gt;
                                                                       &lt;br /&gt;
The following steps below depend on your IDE of choice. See each section below.&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code ==&lt;br /&gt;
# Install the C# extension. There is a possibility that you have to downgrade to an older version like &amp;lt;code&amp;gt;v1.24.4&amp;lt;/code&amp;gt; or modify the settings in Omnisharp settings discussed here? But I personally wasn’t able to figure out how to make it work.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;.vscode/launch.json&amp;lt;/code&amp;gt; in the root folder of  &amp;lt;code&amp;gt;PMDODump&amp;lt;/code&amp;gt;  In launch.json, copy everything from here to the file.&amp;lt;/br&amp;gt;[[File:Debug_Mac_VSCode_Launch.png|frameless]]&lt;br /&gt;
# In the &amp;lt;code&amp;gt;Run and Debug&amp;lt;/code&amp;gt; tab in VSCode, you can click on the green arrow to begin debugging.&amp;lt;/br&amp;gt;[[File:Debug_Mac_VSCode_Debug.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2579</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2579"/>
		<updated>2024-11-09T04:22:38Z</updated>

		<summary type="html">&lt;p&gt;IDK: Linux Debugging&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open PMDOData.sln using [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open PMDOData.sln using [https://code.visualstudio.com/download Visual Studio Code].  You can do this by opening the PMDODump folder, then right clicking PMDOData.sln and choosing &amp;quot;Open Solution&amp;quot;.&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit] if you haven&#039;t already.  This can be found in the Extensions tab.&lt;br /&gt;
# After the C# Dev Kit is installed, you can open the Command Palette &amp;lt;code&amp;gt;Ctrl+Shift+P&amp;lt;/code&amp;gt; and typing/choosing &amp;lt;code&amp;gt;Debug: Select and Start Debugging&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Choose C#.&lt;br /&gt;
### If you&#039;ve properly opened the PMDOData.sln solution, you should have several Launch Configurations available.  Choose &amp;quot;C#: PMDC&amp;quot;.&lt;br /&gt;
# Debug will start.  If the console complains about not being able to find the correct file from path, you may need to change the relative paths specified for the &amp;lt;code&amp;gt;-asset&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;PMDC/PMDC/Properties/launchSettings.json&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Once this debug configuration is chosen, you can start debugging quickly by going to the Debug tab and selecting the green button next to &amp;quot;Run and Debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Note: This has only been tested with Jetbrains Rider and Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
Made by: Trio-#4442&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
# In your &amp;lt;code&amp;gt;~/.gitignore_global&amp;lt;/code&amp;gt; file, add the following files for git to ignore:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debug logs (npm, yarn)&lt;br /&gt;
*.log&lt;br /&gt;
&lt;br /&gt;
# Editor artifacts&lt;br /&gt;
.*.sw[a-z]&lt;br /&gt;
*~&lt;br /&gt;
.#*&lt;br /&gt;
.vscode&lt;br /&gt;
.idea&lt;br /&gt;
&lt;br /&gt;
# OS files&lt;br /&gt;
Thumbs.db&lt;br /&gt;
.DS_Store&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You may want to include more. Modified from [https://www.mashupgarage.com/playbook/git/gitignore.html here].&lt;br /&gt;
                                                                       &lt;br /&gt;
The following steps below depend on your IDE of choice. See each section below.&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code ==&lt;br /&gt;
# Install the C# extension. There is a possibility that you have to downgrade to an older version like &amp;lt;code&amp;gt;v1.24.4&amp;lt;/code&amp;gt; or modify the settings in Omnisharp settings discussed here? But I personally wasn’t able to figure out how to make it work.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;.vscode/launch.json&amp;lt;/code&amp;gt; in the root folder of  &amp;lt;code&amp;gt;PMDODump&amp;lt;/code&amp;gt;  In launch.json, copy everything from here to the file.&amp;lt;/br&amp;gt;[[File:Debug_Mac_VSCode_Launch.png|frameless]]&lt;br /&gt;
# In the &amp;lt;code&amp;gt;Run and Debug&amp;lt;/code&amp;gt; tab in VSCode, you can click on the green arrow to begin debugging.&amp;lt;/br&amp;gt;[[File:Debug_Mac_VSCode_Debug.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2578</id>
		<title>Debugging PMDO</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Debugging_PMDO&amp;diff=2578"/>
		<updated>2024-11-09T02:53:39Z</updated>

		<summary type="html">&lt;p&gt;IDK: Linux VSCode WIP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Contributing Code]], [[Building PMDO]]&lt;br /&gt;
&lt;br /&gt;
= Windows Setup =&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open PMDOData.sln using [https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&amp;amp;channel=Release&amp;amp;version=VS2022&amp;amp;source=VSLandingPage&amp;amp;cid=2030&amp;amp;passive=false Visual Studio 2022] or later.&lt;br /&gt;
# Set your configuration to Debug, Any CPU.  Build the entire solution&lt;br /&gt;
# Set PMDC as the startup project and hit Debug.&lt;br /&gt;
&lt;br /&gt;
= Linux Setup =&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open PMDOData.sln using [https://code.visualstudio.com/download Visual Studio Code].&lt;br /&gt;
# Install the [https://code.visualstudio.com/docs/csharp/debugging C# Dev Kit] if you haven&#039;t already.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Mac Setup =&lt;br /&gt;
&lt;br /&gt;
Note: This has only been tested with Jetbrains Rider and Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
Made by: Trio-#4442&lt;br /&gt;
&lt;br /&gt;
# Download [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 .NET 8.0]. You want to download the x64 version  Confirm that it is installed using the command &amp;lt;code&amp;gt;dotnet --list-runtimes&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Recursively clone the PMDO repository using &amp;lt;code&amp;gt;git clone --recurse-submodules -j8 https://github.com/audinowho/PMDODump.git&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all of the &amp;lt;code&amp;gt;.dylib&amp;lt;/code&amp;gt; files in  &amp;lt;code&amp;gt;PMDC/PMDC/runtimes&amp;lt;/code&amp;gt; folders to &amp;lt;code&amp;gt;PMDC/PMDC&amp;lt;/code&amp;gt;. Here’s what your file structure should look like: [[File:Debug_Mac_FolderStructure.png|frameless]]&lt;br /&gt;
# In your &amp;lt;code&amp;gt;~/.gitignore_global&amp;lt;/code&amp;gt; file, add the following files for git to ignore:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debug logs (npm, yarn)&lt;br /&gt;
*.log&lt;br /&gt;
&lt;br /&gt;
# Editor artifacts&lt;br /&gt;
.*.sw[a-z]&lt;br /&gt;
*~&lt;br /&gt;
.#*&lt;br /&gt;
.vscode&lt;br /&gt;
.idea&lt;br /&gt;
&lt;br /&gt;
# OS files&lt;br /&gt;
Thumbs.db&lt;br /&gt;
.DS_Store&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You may want to include more. Modified from [https://www.mashupgarage.com/playbook/git/gitignore.html here].&lt;br /&gt;
                                                                       &lt;br /&gt;
The following steps below depend on your IDE of choice. See each section below.&lt;br /&gt;
&lt;br /&gt;
== Jetbrains Rider ==&lt;br /&gt;
Jetbrains Rider requires a paid subscription.&lt;br /&gt;
&lt;br /&gt;
# Debug should run out of the box. Set the configuration to PMDC and click &amp;quot;Debug&amp;quot;, and you should be all ready to go!&amp;lt;/br&amp;gt;[[File:Debug_Mac_Rider.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code ==&lt;br /&gt;
# Install the C# extension. There is a possibility that you have to downgrade to an older version like &amp;lt;code&amp;gt;v1.24.4&amp;lt;/code&amp;gt; or modify the settings in Omnisharp settings discussed here? But I personally wasn’t able to figure out how to make it work.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;.vscode/launch.json&amp;lt;/code&amp;gt; in the root folder of  &amp;lt;code&amp;gt;PMDODump&amp;lt;/code&amp;gt;  In launch.json, copy everything from here to the file.&amp;lt;/br&amp;gt;[[File:Debug_Mac_VSCode_Launch.png|frameless]]&lt;br /&gt;
# In the &amp;lt;code&amp;gt;Run and Debug&amp;lt;/code&amp;gt; tab in VSCode, you can click on the green arrow to begin debugging.&amp;lt;/br&amp;gt;[[File:Debug_Mac_VSCode_Debug.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Engine]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Debug_on_OSX_ARM64&amp;diff=2577</id>
		<title>Tutorial:Troubleshooting Debug on OSX ARM64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Troubleshooting_Debug_on_OSX_ARM64&amp;diff=2577"/>
		<updated>2024-11-09T02:13:47Z</updated>

		<summary type="html">&lt;p&gt;IDK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starting with apple M1, all mac OSes run on ARM64.  Existing x64 programs can still work on it thanks to rosetta, and indeed published versions of PMDO for oxs-x64 work just fine.&lt;br /&gt;
&lt;br /&gt;
However, building and debugging PMDO becomes confusing, as the build toolchain and the IDE may try to use the arm64 version instead of x64.  It may build the arm64 version, or debug an x64 build as if it were arm64.  Additionally, arm64 libraries are missing and thus cannot be run (at least not without building every dependency for arm64).&lt;br /&gt;
&lt;br /&gt;
This page goes over the troubleshooting process for getting PMDO to debug on OSX-ARM64.  It is currently unresolved.&lt;br /&gt;
&lt;br /&gt;
== Command Line ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dotnet build&amp;lt;/code&amp;gt;:  Fails.  It builds out to bin/Debug/net8.0.  Complains about libskia.dylib and requires it to be arm64.  Ran using ./PMDC&lt;br /&gt;
* &amp;lt;code&amp;gt;dotnet build -c Debug -r osx-x64&amp;lt;/code&amp;gt;: Successful.  It builds out to bin/Debug/net8.0/osx-x64 but does not copy fnalibs.  Once they are copied manually, running ./PMDC -dev -asset ../../../../../DumpAsset/ succeeds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VS Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rider ==&lt;br /&gt;
&lt;br /&gt;
=== Sanity Checks ===&lt;br /&gt;
&lt;br /&gt;
These steps were taken to ensure the setup was correct.&lt;br /&gt;
&lt;br /&gt;
==== Other Projects ====&lt;br /&gt;
&lt;br /&gt;
Attempting to debug on other projects using Rider worked.&lt;br /&gt;
&lt;br /&gt;
==== Clearing Rider Cache ====&lt;br /&gt;
&lt;br /&gt;
File -&amp;gt; Invalidate Cache -&amp;gt; Choose all&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue.&lt;br /&gt;
&lt;br /&gt;
==== Clearing Nuget Cache ====&lt;br /&gt;
&lt;br /&gt;
Delete &amp;lt;code&amp;gt;~/.nuget&amp;lt;/code&amp;gt; to remove all nuget packages so that they&#039;ll be redownloaded cleanly on next build.&lt;br /&gt;
&lt;br /&gt;
It deletes gigabytes of data.  Build works and regenerated them cleanly.&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue.&lt;br /&gt;
&lt;br /&gt;
==== Clean Clone from Repository ====&lt;br /&gt;
&lt;br /&gt;
We are trying the basic Example program that contains the bare minimum in dependencies.&lt;br /&gt;
&lt;br /&gt;
Do a fresh clone+submodules of RogueEssence in this branch: https://github.com/RogueCollab/RogueEssence/tree/Example&lt;br /&gt;
&lt;br /&gt;
This did not resolve the issue, but this provides a good base to start isolating the problem in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Factors to Consider ===&lt;br /&gt;
&lt;br /&gt;
DotNet installations: Do we have more than one NetCore installation?&lt;br /&gt;
&lt;br /&gt;
A:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We have two runtimes of dotnet: &amp;lt;code&amp;gt;/usr/local/share/dotnet/x64/dotnet&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/usr/local/share/dotnet/dotnet&amp;lt;/code&amp;gt;. Which runtime do we use in Rider?&lt;br /&gt;
&lt;br /&gt;
A:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What are the possible configurations when building/debugging?&lt;br /&gt;
&lt;br /&gt;
A:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Attempts and Their Results ===&lt;br /&gt;
&lt;br /&gt;
A series of experiments were performed in running the command line &amp;lt;code&amp;gt;dotnet build&amp;lt;/code&amp;gt; and running the outputted executable.  Before each experiment, the bin/ and obj/ subfolders were completely deleted.&lt;br /&gt;
&lt;br /&gt;
These are the results you get when you perform the following actions with a wiped bin/obj:&lt;br /&gt;
* dotnet build:  Fails.  It builds out to bin/Debug/net8.0.  Complains about libskia.dylib and requires it to be arm64.  Ran using ./PMDC&lt;br /&gt;
* dotnet build -c Debug -r osx-x64: Successful.  It builds out to bin/Debug/net8.0/osx-x64 but does not copy fnalibs.  Once they are copied manually, running ./PMDC -dev -asset ../../../../../DumpAsset/ succeeds.&lt;br /&gt;
* Debugging in Rider with PMDC configured to Any CPU: Exact same result as dotnet build.&lt;br /&gt;
* Debugging in Rider with PMDC configured to x64: Fails.  It builds out to bin/Debug/net8.0.  Complains with System.IO.FileLoadException: Could not load file or assembly &#039;PMDC&#039;.  This error also shows up if ran using ./PMDC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Backup Plans ===&lt;br /&gt;
&lt;br /&gt;
* Plan A was to clear all the caches and ensure no remnant dependencies...&lt;br /&gt;
* Plan B was to look into configuration to see if anything could be set right there.&lt;br /&gt;
* Plan C will be an attempt to attach a debugger to the x64 build that does work, and come up with some patch solution on that.&lt;br /&gt;
* Plan D is to do it all the hard way and build PMDO with arm64 skiasharp off an example avalonia project plus Xcode building fnalibs plus additional building for lualibs and core.so&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>IDK</name></author>
	</entry>
</feed>