<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.skycorp.global/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SkyCorp</id>
	<title>SkyCorp Global - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.skycorp.global/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SkyCorp"/>
	<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php/Special:Contributions/SkyCorp"/>
	<updated>2026-04-05T05:56:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Bundles&amp;diff=1259</id>
		<title>Modding:Bundles</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Bundles&amp;diff=1259"/>
		<updated>2026-02-27T19:54:15Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Change format for None mods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bundles are mods that contain multiple mod types within them.  (Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
== Methods of bundling ==&lt;br /&gt;
There are two ways to create bundles:&lt;br /&gt;
&lt;br /&gt;
1)  Manually through JSON (forced)&lt;br /&gt;
&lt;br /&gt;
2)  Automatically through the mod dependencies system&lt;br /&gt;
&lt;br /&gt;
Generally speaking, manual bundles should only be made if the submods have &#039;&#039;no&#039;&#039; potential use independently.  For instance, before bundling a monster and a map manually, consider that another modder might want to use the monster in a custom map, or spawn it in a procedural map.  In that case, having each of the monster and the map individually listed in the mod database allows more flexibility for the mods to be used in future ways.&lt;br /&gt;
&lt;br /&gt;
== Mod dependencies bundling (Automatic) ==&lt;br /&gt;
This is the easiest and most flexible way of bundling -- each mod can list its own dependencies in the mod portal.  Then when the user installs the mod, all dependencies will be installed recursively.&lt;br /&gt;
&lt;br /&gt;
=== Tip:  Empty bundles ===&lt;br /&gt;
If a mod &#039;&#039;only&#039;&#039; has dependencies but no content itself, it is possible to set the mod json as &amp;lt;code&amp;gt;{ &amp;quot;type&amp;quot;: &amp;quot;NONE&amp;quot; }&amp;lt;/code&amp;gt;  You can then set the dependencies as desired.&lt;br /&gt;
&lt;br /&gt;
This may be useful if you are building a related set of mods but they function independently and wouldn&#039;t normally need to depend on each other, but you still want a cohesive way for people to download the entire set together with one download.&lt;br /&gt;
&lt;br /&gt;
== Manual bundling ==&lt;br /&gt;
Set the type of the mod to &amp;lt;code&amp;gt;BUNDLE&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;BUNDLE&amp;quot;,&lt;br /&gt;
	&amp;quot;includedMods&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{ ... }&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{ ... }&lt;br /&gt;
		}, ...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;includedMods&amp;lt;/code&amp;gt; will be an array of sub mods, each one specifies:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;spawn&amp;lt;/code&amp;gt; - whether the item or monster should be spawned in the environment&lt;br /&gt;
* &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt; - the submod&#039;s json&lt;br /&gt;
&lt;br /&gt;
=== Full example ===&lt;br /&gt;
This example bundles the [https://skycorp.global/skyscript/mods/v/20/sample-vending-machine vending machine] and the [https://skycorp.global/skyscript/mods/v/19/sample-soda soda] it dispenses as one combined mod.  It only spawns the vending machine, but since the soda is loaded, the vending machine can spawn soda through its lua code.&lt;br /&gt;
&lt;br /&gt;
(In reality, you would not want to bundle these together as by using the automatic dependency system, other mods could make use of the soda entity for their own purposes.)&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;BUNDLE&amp;quot;,&lt;br /&gt;
	&amp;quot;includedMods&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot;: &amp;quot;ENTITY&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;Vending Machine&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;description&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;The vending machine advertises $1 for one diet soda.&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;doUse&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;programBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isUseable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;lua&amp;quot;:  &amp;quot;function doUse()\r\n\t-- NOTE: If creating a full store, it would probably be better to use the\r\n\t-- existing store code, however as of Feb 2018 this is not yet exposed to\r\n\t-- LUA modding.  However, this is fine for a &#039;shop&#039; that only sells one\r\n\t-- item.\r\n\r\n\tplayer = Player.getInstance();\r\n\r\n\tif player.removeCash(1) then\r\n\t\t-- Player has enough currency to cover the transaction, and it was\r\n\t\t-- deducted successfully.\r\n\r\n\t\t-- This matches the id field in entity json.  Generally best to use the\r\n\t\t-- same name as your mod wiki page to prevent conflicts between multiple\r\n\t\t-- mods.\r\n\t\tsoda = Entity.generate(\&amp;quot;Sample Soda\&amp;quot;);\r\n\r\n\t\tif soda == nil then\r\n\t\t\tMainScreen.addGameText(\&amp;quot;Please also load the Sample Soda mod.\&amp;quot;);\r\n\t\telse\r\n\t\t\tMainScreen.addGameText(&#039;You insert $1 into the vending machine.  &#039; ..\r\n\t\t\t\t&#039;It spits out a can of diet soda.&#039;);\r\n\r\n\t\t\t-- Set location to be the same location as vending machine.\r\n\t\t\t-- Since the player must be next to the vending machine to use it,\r\n\t\t\t-- this function works fine.  Another (longer) method would be to get\r\n\t\t\t-- the vending machine&#039;s location and set the soda&#039;s location to it.\t\t\t\r\n\t\t\tsoda.moveEntityToSameRoomAsPlayer();\r\n\t\tend\r\n\telse\r\n\t\t-- Player didn&#039;t have enough currency to cover the total cost of transaction.\r\n\t\t-- No currency was deducted.\r\n\t\t\r\n\t\tMainScreen.addGameText(&#039;You need at least $1 to buy a soda.&#039;);\t\r\n\tend\r\n\r\n\treturn true; -- Automatic continue scene\r\nend&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: false,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot;: &amp;quot;ENTITY&amp;quot;,&lt;br /&gt;
				&amp;quot;id&amp;quot;: &amp;quot;Sample Soda&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;Soda&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;description&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;A can of diet soda.&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;doUse&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;programBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isUseable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isPickupable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;lua&amp;quot;:  &amp;quot;function doUse()\r\n\t-- NOTE: The engine actually has support for food objects that will adjust\r\n\t-- the player&#039;s weight appropriately, however, this is not yet exposed to\r\n\t-- LUA modding as of Feb 2018.  For the purposes of this example, the soda\r\n\t-- will just replenish HP with no other consequences.\r\n\r\n\tplayer = Player.getInstance();\r\n\r\n\tMainScreen.addGameText(&#039;You gulp down the soda.  &#039;);\t\r\n\r\n\tplayer.heal(3); -- Heal 3HP\r\n\r\n\tthis.deleteEntity(); -- Remove entity from world or inventory\r\n\r\n\treturn true; -- Automatic continue scene\r\nend&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Player&amp;diff=1258</id>
		<title>Modding:Player</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Player&amp;diff=1258"/>
		<updated>2026-02-27T08:57:54Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: added optional parameter to dropItem&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Player getInstance() ===&lt;br /&gt;
Get the instance of the Player class.&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getDickSizeString() ===&lt;br /&gt;
Get string representation of player&#039;s dick size&lt;br /&gt;
&lt;br /&gt;
=== void tfDickLarger() ===&lt;br /&gt;
Increase the size of player&#039;s dick.  This outputs text to screen.&lt;br /&gt;
&lt;br /&gt;
=== number getHeight() ===&lt;br /&gt;
Player&#039;s height, in inches&lt;br /&gt;
&lt;br /&gt;
=== number getDickSize() ===&lt;br /&gt;
Player&#039;s dick size, in inches.  0 = no dick&lt;br /&gt;
&lt;br /&gt;
=== void deleteItem([[Entity]] entityToDelete) ===&lt;br /&gt;
Deletes a held item.&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets player&#039;s name.&lt;br /&gt;
&lt;br /&gt;
=== void setNameOverride(string nameOverride) ===&lt;br /&gt;
Force players name to something else.  Call with &amp;quot;&amp;quot; to set back to normal.&lt;br /&gt;
&lt;br /&gt;
(Name overrides ignore player gender)&lt;br /&gt;
&lt;br /&gt;
Added in r56.10&lt;br /&gt;
&lt;br /&gt;
=== boolean isInInventory([[Entity]] entityToCheck) ===&lt;br /&gt;
Is entityToCheck in player&#039;s inventory currently?&lt;br /&gt;
&lt;br /&gt;
=== number getVaginaSize() ===&lt;br /&gt;
In inches.  0 = no vagina&lt;br /&gt;
&lt;br /&gt;
=== string getVaginaSizeString() ===&lt;br /&gt;
A string representation of the player&#039;s vagina, ie: &amp;quot;large slit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If no vagina (size 0), returns &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sizes 7+ are monstrous vaginas -- can check this via getMonsterVagina()&lt;br /&gt;
&lt;br /&gt;
=== number getWeight() ===&lt;br /&gt;
Returns weight where 0 thin-100 obese.  &lt;br /&gt;
&lt;br /&gt;
Will get the larger of either players &#039;overweight&#039; value (fat) or their pregnancy weight value&lt;br /&gt;
&lt;br /&gt;
=== string getWeightString() ===&lt;br /&gt;
ie, &amp;quot;lean&amp;quot;, &amp;quot;heavy&amp;quot;, &amp;quot;obese&amp;quot;, etc&lt;br /&gt;
&lt;br /&gt;
This ONLY refers to fat.&lt;br /&gt;
&lt;br /&gt;
=== int getBreastRows() ===&lt;br /&gt;
Number of rows.  1 is normal for male and female&lt;br /&gt;
&lt;br /&gt;
=== int getBreastSize() ===&lt;br /&gt;
0 = none, 1 = AA, 2 = A, 3= B, 4=C, 5=D, ...&lt;br /&gt;
&lt;br /&gt;
=== string getBreastSizeString ===&lt;br /&gt;
String representation of player&#039;s breast size, ie &amp;quot;large D-cup hooters&amp;quot;&lt;br /&gt;
&lt;br /&gt;
No breasts will return &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== void tfBreastsLarger(boolean silent) ===&lt;br /&gt;
Increases size of breasts.&lt;br /&gt;
&lt;br /&gt;
silent: If true, does not output TF text to screen.&lt;br /&gt;
&lt;br /&gt;
=== void tfBreastsSmaller() ===&lt;br /&gt;
Decreases size of breasts.  Outputs TF text to screen.&lt;br /&gt;
&lt;br /&gt;
=== void tfDickLarger() ===&lt;br /&gt;
Increases size of dick (max size via this function is 13).  Outputs TF text to screen.  Player&#039;s lust increases by 20.&lt;br /&gt;
&lt;br /&gt;
=== void tfDickSmaller() ===&lt;br /&gt;
Decreases size of dick (down to no dick).  Outputs TF text to screen.&lt;br /&gt;
&lt;br /&gt;
=== void setDickSize (int dickSize) ===&lt;br /&gt;
Sets dick size (in inches), with no text output to screen&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Returns players current location&lt;br /&gt;
&lt;br /&gt;
=== void setLocation([[Location]] location) ===&lt;br /&gt;
Sets players new location.  Note that no transition is displayed to player, nor does this (currently) fire any room transition events to inform entities that the player just entered this location.&lt;br /&gt;
&lt;br /&gt;
(Added in r26)&lt;br /&gt;
&lt;br /&gt;
=== boolean pickupItem([[Entity]] entityToPickUp, bool silent=false, bool allowEvenIfWristsBound=false) ===&lt;br /&gt;
This is the main function to call to try adding an item to the player&#039;s inventory. &lt;br /&gt;
&lt;br /&gt;
Attempts adding a particular item to the player&#039;s inventory.  Will fail if inventory is full or there is already a clothing item in the particular slot.  Normally, a message will be shown to the player describing the success or failure&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;silent&#039;&#039;&#039; - prevents any output from being displayed&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowEvenIfWristsBound&#039;&#039;&#039; - allow pickup even if normally player wouldn&#039;t be able to pick it up due to bound wrists&lt;br /&gt;
&lt;br /&gt;
Enabling both silent + allowEvenIfWristsBound is a good combination for situations like NPC putting a collar on the player, where you would want the normal pickup&#039;s logic to block the pickup if a collar is already present.  Then you can check the result and output to the screen some custom text about the NPC putting the item on the player.&lt;br /&gt;
&lt;br /&gt;
Returns if item was picked up&lt;br /&gt;
&lt;br /&gt;
=== void forcePickupItemSilent([[Entity]] entityToPickUp) ===&lt;br /&gt;
Forces an item into inventory -- ignores inventory size limit, pickup restrictions, etc.&lt;br /&gt;
&lt;br /&gt;
=== void pickupItemOrDropToGround([[Entity]] entityToPickup) ===&lt;br /&gt;
Attempts to add item to player inventory.  If it can&#039;t be added, then the item drops to ground at player&#039;s feet&lt;br /&gt;
&lt;br /&gt;
=== int getCurrentInventorySize() ===&lt;br /&gt;
How many items player is carrying -- does NOT include clothing/worn items.&lt;br /&gt;
&lt;br /&gt;
=== void dropAllInventoryToMapRoom(string mapName, int mapRoomID, [bool removeTattoosAndPiercings]) ===&lt;br /&gt;
Drops ALL items in the player&#039;s inventory into the target map room ID.&lt;br /&gt;
&lt;br /&gt;
In r38+, an optional third parameter is available to set whether tattoos and piercings should also be removed.&lt;br /&gt;
&lt;br /&gt;
=== boolean isInInventoryString(string entityName) ===&lt;br /&gt;
Is the target object in player inventory currently?&lt;br /&gt;
&lt;br /&gt;
=== [[Entity]] getInventoryItemByString(string entityName) ===&lt;br /&gt;
Return the named item (or null, if item name is not in inventory)&lt;br /&gt;
&lt;br /&gt;
=== void deleteInventoryString(string entityName) ===&lt;br /&gt;
Delete by item&#039;s title in inventory&lt;br /&gt;
&lt;br /&gt;
=== boolean dropItem([[Entity]] entityToDrop, bool silentTest=false) ===&lt;br /&gt;
This is the main function to call to try dropping an item out of the player&#039;s inventory. &lt;br /&gt;
&lt;br /&gt;
Will fail if item is nonexistent, or item&#039;s check function fails (ie: cursed).&lt;br /&gt;
&lt;br /&gt;
A message will be shown to the player describing the success or failure&lt;br /&gt;
&lt;br /&gt;
silentTest allows the method to be silently tested without actually dropping the item or outputting the text &lt;br /&gt;
&lt;br /&gt;
(this method also checks wrist bound state, etc)&lt;br /&gt;
&lt;br /&gt;
=== boolean dropItemForceSilent([[Entity]] entityToDrop) ===&lt;br /&gt;
Will silently drop the target item to ground -- regardless of cursed status.&lt;br /&gt;
&lt;br /&gt;
=== void causeDamage(int damageAmount) ===&lt;br /&gt;
Cause damage to player of damageAmount&lt;br /&gt;
&lt;br /&gt;
=== int getPlayerAttackDamagePhysical() ===&lt;br /&gt;
How much damage the player causes to monsters.  You probably don&#039;t need to access this -- usually let existing monster mod system handle combat.&lt;br /&gt;
&lt;br /&gt;
=== int getPlayerAttackDamageLust() ===&lt;br /&gt;
How much damage the player causes to monsters.  You probably don&#039;t need to access this -- usually let existing monster mod system handle combat.&lt;br /&gt;
&lt;br /&gt;
=== int getAcceptance() ===&lt;br /&gt;
Returns player&#039;s current acceptance level&lt;br /&gt;
&lt;br /&gt;
=== void setAcceptance(int newAcceptanceLevel) ===&lt;br /&gt;
Sets player&#039;s acceptance level to something new.&lt;br /&gt;
&lt;br /&gt;
=== void incAcceptance(int amount) ===&lt;br /&gt;
Increases player&#039;s acceptance by amount&lt;br /&gt;
&lt;br /&gt;
=== void decAcceptance(int amount) ===&lt;br /&gt;
Decreases player&#039;s acceptance by amount&lt;br /&gt;
&lt;br /&gt;
=== boolean isCovered(string clothingSlot) ===&lt;br /&gt;
Checks to see if the target clothing slot is covered with an article of clothing that will conceal TFs&lt;br /&gt;
&lt;br /&gt;
Some clothing does NOT conceal TFs (like Lizland bindings)&lt;br /&gt;
&lt;br /&gt;
=== int getExposure() ===&lt;br /&gt;
How exposed is player?&lt;br /&gt;
* &amp;lt; 30 totally safe&lt;br /&gt;
* 30 ~ 100 suspicious, will catch looks but is still (currently) safe in public overworld areas&lt;br /&gt;
* &amp;gt; 100 guaranteed exposure&lt;br /&gt;
&lt;br /&gt;
=== boolean getTotallyHuman() ===&lt;br /&gt;
Is player 100% human?&lt;br /&gt;
&lt;br /&gt;
=== void setTotallyHuman() ===&lt;br /&gt;
Become human - no text output to screen&lt;br /&gt;
&lt;br /&gt;
=== void setToStartingCharacteristics() ===&lt;br /&gt;
Silently reset player to their starting characteristics, including human and body type&lt;br /&gt;
&lt;br /&gt;
=== void setMaleSilent() ===&lt;br /&gt;
Player silently becomes male&lt;br /&gt;
&lt;br /&gt;
=== boolean tfMakeVagina() ===&lt;br /&gt;
Attempts TF.  Returns true if player is given a vagina, otherwise player already has one&lt;br /&gt;
&lt;br /&gt;
=== boolean tfVaginaSmaller() ===&lt;br /&gt;
Attempts TF.  Returns true if player&#039;s vagina size decreases, otherwise already has no vagina.&lt;br /&gt;
&lt;br /&gt;
=== boolean tfVaginaLarger(bool silent=false) ===&lt;br /&gt;
Attempts TF.  Returns true if player&#039;s vagina size increases, otherwise already has max size vagina.&lt;br /&gt;
&lt;br /&gt;
Silent parameter will make the transformation not display any output on screen.&lt;br /&gt;
&lt;br /&gt;
=== void setVaginaSize(int vaginaSize) ===&lt;br /&gt;
Silently set vagina to target size&lt;br /&gt;
&lt;br /&gt;
=== boolean getMonsterVagina() ===&lt;br /&gt;
Does player have a monstrously sized vagina?  (With a monster vagina, players can&#039;t climax without receiving monster-sized dick)&lt;br /&gt;
&lt;br /&gt;
=== void resetLust() ===&lt;br /&gt;
Reset lust, display message&lt;br /&gt;
&lt;br /&gt;
=== void resetLustSilent() ===&lt;br /&gt;
Reset lust, don&#039;t display message&lt;br /&gt;
&lt;br /&gt;
=== void resetLustButNotMilk() ===&lt;br /&gt;
Reset lust, display message&lt;br /&gt;
&lt;br /&gt;
=== int getLust() ===&lt;br /&gt;
Returns player lust level&lt;br /&gt;
&lt;br /&gt;
=== void incLust(int amount, bool silent=false) ===&lt;br /&gt;
Increases player lust by amount&lt;br /&gt;
&lt;br /&gt;
Silent parameter (optional) will make the transformation not display any output on screen.&lt;br /&gt;
&lt;br /&gt;
=== void decLust(int amount) ===&lt;br /&gt;
Decreases player lust by amount&lt;br /&gt;
&lt;br /&gt;
=== string getSomethingToPlayWith() ===&lt;br /&gt;
Gets an action that player or another character could perform against player, depending on what bits they have.&lt;br /&gt;
&lt;br /&gt;
examples:&lt;br /&gt;
* &amp;quot;brushing up against your average B-cup boobs&amp;quot;&lt;br /&gt;
* &amp;quot;rubbing your large member&amp;quot;&lt;br /&gt;
Fairly limited set of generated actions, so use sparingly.&lt;br /&gt;
&lt;br /&gt;
=== boolean hasArms() ===&lt;br /&gt;
Does the player have arms?&lt;br /&gt;
&lt;br /&gt;
=== boolean hasLegs() ===&lt;br /&gt;
Does the player have legs?&lt;br /&gt;
&lt;br /&gt;
=== boolean hasUselessHands() ===&lt;br /&gt;
The player has hands, but they&#039;re useless (ie, cow hoof hands)&lt;br /&gt;
&lt;br /&gt;
=== void incBellyFat(int amount, bool hyper=false) ===&lt;br /&gt;
Increases player&#039;s overweightedness, outputs appropriate description text.  Outputs one line of text, no newlines.  May not output anything if change was not dramatic enough.&lt;br /&gt;
&lt;br /&gt;
Intended for use with weight TF, pregnancy TF should use pregnancy functions!&lt;br /&gt;
&lt;br /&gt;
Optional hyper mode will allow overweight to increase beyond normal limits, which can cause player to get stuck.&lt;br /&gt;
&lt;br /&gt;
=== void decBellyFat(int amount) ===&lt;br /&gt;
Decreases player&#039;s overweightedness, outputs appropriate description text.  Outputs one line of text, no newlines.  May not output anything if change was not dramatic enough.&lt;br /&gt;
&lt;br /&gt;
Intended for use with weight TF, pregnancy TF should use pregnancy functions!&lt;br /&gt;
&lt;br /&gt;
=== int getBellyFat() ===&lt;br /&gt;
Gets how many pounds of weight on player&#039;s belly is caused by fat / how heavy the belly is due to fat.  This is independent of any preg (usually you should use getBellyTotalWeight!)  0 = perfectly thin, 100 or more = huge. &lt;br /&gt;
&lt;br /&gt;
Note that while only belly fat is tracked, it&#039;s considered representative of the overall overweightedness of a character.  So increasing belly fat will cause arms to get flabby, etc. &lt;br /&gt;
&lt;br /&gt;
=== incBellyPreg ===&lt;br /&gt;
&#039;&#039;(introduced in r35)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Increases size of player&#039;s belly, outputs appropriate description text (due to pregnancy).  Outputs one line of text, no newlines.&lt;br /&gt;
&lt;br /&gt;
Does not actually cause player to become pregnant if they are not already.&lt;br /&gt;
&lt;br /&gt;
=== setBellyPreg ===&lt;br /&gt;
&#039;&#039;(introduced in r35)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets belly size.  One line text description of the TF, no newlines.&lt;br /&gt;
&lt;br /&gt;
Does not actually cause player to become pregnant if they are not already.&lt;br /&gt;
&lt;br /&gt;
=== int getBellyTotalWeight() ===&lt;br /&gt;
Gets how heavy the belly is over a normal weight.  0 thin-100 overweight (or more!) &lt;br /&gt;
&lt;br /&gt;
This is typically the function it is recommended to use when checking player&#039;s weight (ex: mobility flavor text, etc) &lt;br /&gt;
&lt;br /&gt;
Usually, this will get the larger of players fat (bellyFat) value or their pregnancy weight value.  However, players MAY have enabled to combine these two numbers for added difficulty.  To check only fat, use getBellyFatOnly() &lt;br /&gt;
&lt;br /&gt;
=== string getBellyDescription() ===&lt;br /&gt;
A few word description of the player&#039;s belly (includes both preg &amp;amp; weight factors)&lt;br /&gt;
&lt;br /&gt;
ex: &amp;quot;20 lb noticeably bulging belly&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== int getBellyPreg() ===&lt;br /&gt;
0&amp;lt;-&amp;gt;100 size of belly due to pregnancy.  0 = perfectly thin.  100=huge.  Also an indication of stage of preg.&lt;br /&gt;
&lt;br /&gt;
(usually when checking player belly size, you should use getCombinedBellySize!)&lt;br /&gt;
&lt;br /&gt;
=== int getHP() ===&lt;br /&gt;
Returns health points.  0 = dead&lt;br /&gt;
&lt;br /&gt;
=== int getHPMax() ===&lt;br /&gt;
Returns the highest player HP can reach.  Increases on level up.&lt;br /&gt;
&lt;br /&gt;
=== void heal(int amount) ===&lt;br /&gt;
Heal player by amount.  Won&#039;t go over HP Max&lt;br /&gt;
&lt;br /&gt;
=== int getLevel() ===&lt;br /&gt;
Returns player&#039;s current level&lt;br /&gt;
&lt;br /&gt;
=== int getCash() ===&lt;br /&gt;
Returns player&#039;s available cash&lt;br /&gt;
&lt;br /&gt;
=== void addCash(int amount) ===&lt;br /&gt;
Outputs a note that cash was added, and adds cash&lt;br /&gt;
&lt;br /&gt;
=== boolean removeCash(int amount) ===&lt;br /&gt;
Deducts amount cash if the player has it and returns true, else returns false.  &lt;br /&gt;
&lt;br /&gt;
This can be useful for shops, transactions, etc (only deducts if whole amount is there)&lt;br /&gt;
&lt;br /&gt;
=== string getHeightString() ===&lt;br /&gt;
example: 6&#039; 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== boolean tfHeightTaller(int amount) ===&lt;br /&gt;
Increase height by number of inches&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF took place&lt;br /&gt;
&lt;br /&gt;
=== boolean tfHeightShorter(int amount) ===&lt;br /&gt;
Decrease height by number of inches&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF took place&lt;br /&gt;
&lt;br /&gt;
=== boolean tfHeightTowards(int targetHeightInches) ===&lt;br /&gt;
Shortcut function to move player&#039;s height towards a desired height&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF took place&lt;br /&gt;
&lt;br /&gt;
=== void incMilkProduction(number amount) ===&lt;br /&gt;
Increases milk production, as long as player is not at max&lt;br /&gt;
&lt;br /&gt;
Will do nothing if player has neither breasts nor udder&lt;br /&gt;
&lt;br /&gt;
Will output text to player describing increase (no newline)&lt;br /&gt;
&lt;br /&gt;
=== void decMilkProduction(number amount) ===&lt;br /&gt;
Decreases milk production&lt;br /&gt;
&lt;br /&gt;
Will do nothing if player has neither breasts nor udder&lt;br /&gt;
&lt;br /&gt;
Will output text to player describing decrease (no newline)&lt;br /&gt;
&lt;br /&gt;
=== number getMilkProduction() ===&lt;br /&gt;
Amount of milk to produce every tick(0~20).  More than 10 is considered overdrive.&lt;br /&gt;
&lt;br /&gt;
=== string getUdderDescription() ===&lt;br /&gt;
Descriptive text of udder (indicates size)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;quot;large basketball-sized udder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== number getUdderMilk() ===&lt;br /&gt;
0 = no udder, 1 = no milk &amp;lt;-&amp;gt; 100 = totally full of milk&lt;br /&gt;
&lt;br /&gt;
=== boolean hasUdder() ===&lt;br /&gt;
Does player have an udder?&lt;br /&gt;
&lt;br /&gt;
=== void createUdder() ===&lt;br /&gt;
If player does not already have an udder, create one for them along with a small basic amount of milk production.  Output relevant text.&lt;br /&gt;
&lt;br /&gt;
=== void removeUdder() ===&lt;br /&gt;
Removes udder from player along with a note.&lt;br /&gt;
&lt;br /&gt;
=== void resetMilkSilent() ===&lt;br /&gt;
If lactating, reset ALL milk so player doesn&#039;t immediately have to give milk.  It will re-fill over time if player has milk production.  This is called after losing a fight, etc).&lt;br /&gt;
&lt;br /&gt;
=== void resetBreastMilkSilent() ===&lt;br /&gt;
If lactating, reset milk so player doesn&#039;t immediately have to give milk (breast).  It will re-fill over time if player has milk production.&lt;br /&gt;
&lt;br /&gt;
=== void resetUdderMilkSilent() ===&lt;br /&gt;
If lactating, reset milk so player doesn&#039;t immediately have to give milk (udder).  It will re-fill over time if player has milk production.&lt;br /&gt;
&lt;br /&gt;
=== number getBreastMilk() ===&lt;br /&gt;
0 or 1 = no milk &amp;lt;-&amp;gt; 100 = totally full of milk&lt;br /&gt;
&lt;br /&gt;
=== boolean isAbleToExercise() ===&lt;br /&gt;
Player can exercise once per day (too much is tiring)&lt;br /&gt;
&lt;br /&gt;
=== boolean attemptExercise(int decreaseOverweightBy) ===&lt;br /&gt;
If player has not yet exercised today, they can attempt an exercise activity.&lt;br /&gt;
&lt;br /&gt;
=== void resetExercise() ===&lt;br /&gt;
Call after rest to allow for exercising&lt;br /&gt;
&lt;br /&gt;
=== boolean isAbleToWatchTV() ===&lt;br /&gt;
TVs and similar activities can be useful to help player reduce acceptance.  Player can watch TV once per day.&lt;br /&gt;
&lt;br /&gt;
=== void setIsAbleToWatchTV(boolean isAbletoWatchTV) ===&lt;br /&gt;
TVs and similar activities can be useful to help player reduce acceptance.  Player can watch TV once per day.&lt;br /&gt;
&lt;br /&gt;
=== void setBreastRows(int breastRows) ===&lt;br /&gt;
Immediately change # of breast rows without outputing additional text.  1 is normal for both male &amp;amp; female&lt;br /&gt;
&lt;br /&gt;
=== boolean tfIncBreastRows() ===&lt;br /&gt;
Add a row of breasts and output appropriate descriptive text (does not include linebreak)&lt;br /&gt;
&lt;br /&gt;
=== boolean tfDecBreastRows() ===&lt;br /&gt;
Remove a row of breasts and output appropriate descriptive text (does not include linebreak)&lt;br /&gt;
&lt;br /&gt;
=== boolean getInHeat() ===&lt;br /&gt;
Returns true if player is a species type which can go into heat and they are currently in heat.&lt;br /&gt;
&lt;br /&gt;
=== boolean getIsAllFours() ===&lt;br /&gt;
Is player moving around on all fours/eights (horizontal walking instead of upright/standing walk)?&lt;br /&gt;
&lt;br /&gt;
Generally this is due to the leg joints of the player changing&lt;br /&gt;
&lt;br /&gt;
=== void triggerInseminationChance() ===&lt;br /&gt;
Should be called whenever the player receives sperm vaginally.  Depending on player&#039;s fertility / species, they may get knocked up from this call.&lt;br /&gt;
&lt;br /&gt;
=== boolean getWristsBound() ===&lt;br /&gt;
Are the players wrists bound?  This will limit options such as pick-up, drop, and masturbate.&lt;br /&gt;
&lt;br /&gt;
=== boolean hasAlternateVoice() ===&lt;br /&gt;
With a non-human voice, players will have difficulty communicating with humans.&lt;br /&gt;
&lt;br /&gt;
This indicates a voice that is so distorted, that it is impossible to understand (not just vocal modifiers)&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocal() ===&lt;br /&gt;
If the player has a non-human voice, what kind of noise do they make when trying to communicate?&lt;br /&gt;
&lt;br /&gt;
=== void setHeightSilent(int height) ===&lt;br /&gt;
Sets new player height, in inches.  No text output to screen, and does not perform normal bounds checking.&lt;br /&gt;
&lt;br /&gt;
=== boolean hasClothing(string slot) ===&lt;br /&gt;
&#039;&#039;(Introduced in r25)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Is player wearing anything in that clothing slot?&lt;br /&gt;
&lt;br /&gt;
=== [[Clothing]] getClothing(string slot) ===&lt;br /&gt;
&#039;&#039;(Introduced in r25)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Get what player wearing anything in that [[clothing slot]].  May be null&lt;br /&gt;
&lt;br /&gt;
=== void resetPregnancySilent() ===&lt;br /&gt;
(Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
If pregnant, scale back pregnancy a little so we don&#039;t immediately have to lay eggs (Call after losing a fight, etc)&lt;br /&gt;
&lt;br /&gt;
=== void advanceRedirectedTransformation() ===&lt;br /&gt;
(Introduced in r56)&lt;br /&gt;
&lt;br /&gt;
Advances the player&#039;s destined transformation (if any).  Typically called on monster defeating the player, if the player is not otherwise being transformed from a sequence.&lt;br /&gt;
&lt;br /&gt;
(This is useful since normally in permanent pure mode and a locked TF, the monsters would not TF you at all.  By calling this after non-TF defeat sex, it can advance the player&#039;s TF a little bit so there is still some progression of the TF.)&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:Entity|Entity]] getOwner() ===&lt;br /&gt;
(introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
Gets the entity the player is owned by -- may return null/nil if no owner.&lt;br /&gt;
&lt;br /&gt;
=== void setOwner([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
(introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
Silently sets the entity the player is owned by.  Usually you would want to use the Claim Ownership Scene instead of calling this directly so as to give the player a chance to accept/reject, as well as see the dom&#039;s stats, dialog, etc.&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
[[Dick Size Increaser]]&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1257</id>
		<title>Modding:Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1257"/>
		<updated>2026-02-27T08:53:16Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Added setEntityName / setPersonalName&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Entity generate(string entityName) ===&lt;br /&gt;
Generate a new entity of the given type based on the [[Types of Entities|entity type string]].  Null if unknown entity.&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets name of entity&lt;br /&gt;
&lt;br /&gt;
=== string getLookDesc() ===&lt;br /&gt;
Gets look description(the text displayed when looking at item)&lt;br /&gt;
&lt;br /&gt;
=== boolean isExaminable() ===&lt;br /&gt;
Allow player to examine object?  If so, the item is shown in the room item list.  Otherwise, the object is invisible&lt;br /&gt;
&lt;br /&gt;
=== boolean isAttackable() ===&lt;br /&gt;
Is player allowed to (attempt) to do an attack on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isUseable() ===&lt;br /&gt;
Is player shown a use button on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isPickupable() ===&lt;br /&gt;
Should object display a pick-up option if not yet in inventory?  May or may not *actually* be pickupable.  To do / attempt to do a pickup, use the [[Player]] class.&lt;br /&gt;
&lt;br /&gt;
=== boolean isDropable()    ===&lt;br /&gt;
Should object display a drop item button if is in inventory?   May or may not *actually* be dropable.  Use [[Player]] class to make the actual attempt.&lt;br /&gt;
&lt;br /&gt;
=== void deleteEntity() ===&lt;br /&gt;
Removes entity from either the inventory or room that it exists in.&lt;br /&gt;
&lt;br /&gt;
=== boolean isPlayerHere() ===&lt;br /&gt;
If entity is in world, is the player in this same room?&lt;br /&gt;
&lt;br /&gt;
=== int isPlayerAdjacent() ===&lt;br /&gt;
If entity is in the world, is the player in a room adjacent to the one entity is in?  If so, which room ID?&lt;br /&gt;
&lt;br /&gt;
If not, room ID is 0.  If player is in the same room, then room ID 0 is also returned.&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Gets location of this entity.  Returns null if entity is in inventory, or otherwise not in world.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntity(string newMapName:String, int newRoomID) ===&lt;br /&gt;
Moves entity from whereever it is (including inventory) into a particular location.  If picking up the item, should use the functions on the Player class instead.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityAdjacent([[Modding:CardinalDirection|CardinalDirection]] cardinalDirection, bool quiet = false) ===&lt;br /&gt;
Moves the entity to the adjacent room.Moves entity to new location.&lt;br /&gt;
&lt;br /&gt;
If quiet is false, then it will announce the move to player if they are in entering or leaving room.&lt;br /&gt;
&lt;br /&gt;
Exposed in r56.1&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityToSameRoomAsPlayer() ===&lt;br /&gt;
Move entity from wherever it is (including inventory) into the same room as the player is in.&lt;br /&gt;
&lt;br /&gt;
=== void makeCursed() ===&lt;br /&gt;
Marks this entity as cursed.  In order for this to have any effect, you should write a custom function for playerAttemptDropCheck.&lt;br /&gt;
&lt;br /&gt;
Generally this would be called on start-up.  Curse status can be modified by NPCs that can perform purification.&lt;br /&gt;
&lt;br /&gt;
See [[Weight Pendant]] for an example of cursed items.&lt;br /&gt;
&lt;br /&gt;
=== boolean getCursed() ===&lt;br /&gt;
Is this entity cursed?&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:BodyDescription|BodyDescription]] getBodyDescription() ===&lt;br /&gt;
Gets body description for this npc -- may be nil if no body description has been set.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== void setEntityName(string name) ===&lt;br /&gt;
Sets name of entity, assuming it hasn&#039;t otherwise been overridden.  (This is equivalent to changing the &#039;initialName&#039; parameter)&lt;br /&gt;
&lt;br /&gt;
=== void setPersonalName(string name) ===&lt;br /&gt;
Sets personal name of entity (typically only used for NPCs, it is the name that the entity refers to itself as, without any honorifics, and the UI might refer to after the player becomes familiar with it enough)&lt;br /&gt;
&lt;br /&gt;
=== setBodyDescription([[Modding:BodyDescription|BodyDescription]] bodyDescription) ===&lt;br /&gt;
Sets/overwrites body description for this npc.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== Default versions of functions ===&lt;br /&gt;
These are useful for calling if you want to do some logic first, and then fall back to the usual monster logic.&lt;br /&gt;
&lt;br /&gt;
==== string defaultGetName([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ====&lt;br /&gt;
As of r56.1, this is mostly useful to advanced monster mods, but is available to all entities.  (Entities currently have no way to set the initial name value, so calling the default get name will just return &amp;quot;uninitialized entity&amp;quot;.  It is useful for advanced monster mods since they can set the name via &#039;initialValues&#039; and thus access when UI name is supposed to be sleeping, etc.)&lt;br /&gt;
&lt;br /&gt;
==== void defaultAddEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ====&lt;br /&gt;
Adds commonly needed option to the passed dynamicOptions object for the entity look scene (pick-up, back button, attack, etc.)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Bundles&amp;diff=1256</id>
		<title>Modding:Bundles</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Bundles&amp;diff=1256"/>
		<updated>2026-02-25T06:08:59Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Tip on how to do empty bundles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bundles are mods that contain multiple mod types within them.  (Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
== Methods of bundling ==&lt;br /&gt;
There are two ways to create bundles:&lt;br /&gt;
&lt;br /&gt;
1)  Manually through JSON (forced)&lt;br /&gt;
&lt;br /&gt;
2)  Automatically through the mod dependencies system&lt;br /&gt;
&lt;br /&gt;
Generally speaking, manual bundles should only be made if the submods have &#039;&#039;no&#039;&#039; potential use independently.  For instance, before bundling a monster and a map manually, consider that another modder might want to use the monster in a custom map, or spawn it in a procedural map.  In that case, having each of the monster and the map individually listed in the mod database allows more flexibility for the mods to be used in future ways.&lt;br /&gt;
&lt;br /&gt;
== Mod dependencies bundling (Automatic) ==&lt;br /&gt;
This is the easiest and most flexible way of bundling -- each mod can list its own dependencies in the mod portal.  Then when the user installs the mod, all dependencies will be installed recursively.&lt;br /&gt;
&lt;br /&gt;
=== Tip:  Empty bundles ===&lt;br /&gt;
If a mod &#039;&#039;only&#039;&#039; has dependencies but no content itself, it is possible to set the mod json as &amp;lt;code&amp;gt;{ }&amp;lt;/code&amp;gt;  You can then set the dependencies as desired.&lt;br /&gt;
&lt;br /&gt;
This may be useful if you are building a related set of mods but they function independently and wouldn&#039;t normally need to depend on each other, but you still want a cohesive way for people to download the entire set together with one download.&lt;br /&gt;
&lt;br /&gt;
== Manual bundling ==&lt;br /&gt;
Set the type of the mod to &amp;lt;code&amp;gt;BUNDLE&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;BUNDLE&amp;quot;,&lt;br /&gt;
	&amp;quot;includedMods&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{ ... }&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{ ... }&lt;br /&gt;
		}, ...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;includedMods&amp;lt;/code&amp;gt; will be an array of sub mods, each one specifies:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;spawn&amp;lt;/code&amp;gt; - whether the item or monster should be spawned in the environment&lt;br /&gt;
* &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt; - the submod&#039;s json&lt;br /&gt;
&lt;br /&gt;
=== Full example ===&lt;br /&gt;
This example bundles the [https://skycorp.global/skyscript/mods/v/20/sample-vending-machine vending machine] and the [https://skycorp.global/skyscript/mods/v/19/sample-soda soda] it dispenses as one combined mod.  It only spawns the vending machine, but since the soda is loaded, the vending machine can spawn soda through its lua code.&lt;br /&gt;
&lt;br /&gt;
(In reality, you would not want to bundle these together as by using the automatic dependency system, other mods could make use of the soda entity for their own purposes.)&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;BUNDLE&amp;quot;,&lt;br /&gt;
	&amp;quot;includedMods&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot;: &amp;quot;ENTITY&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;Vending Machine&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;description&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;The vending machine advertises $1 for one diet soda.&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;doUse&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;programBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isUseable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;lua&amp;quot;:  &amp;quot;function doUse()\r\n\t-- NOTE: If creating a full store, it would probably be better to use the\r\n\t-- existing store code, however as of Feb 2018 this is not yet exposed to\r\n\t-- LUA modding.  However, this is fine for a &#039;shop&#039; that only sells one\r\n\t-- item.\r\n\r\n\tplayer = Player.getInstance();\r\n\r\n\tif player.removeCash(1) then\r\n\t\t-- Player has enough currency to cover the transaction, and it was\r\n\t\t-- deducted successfully.\r\n\r\n\t\t-- This matches the id field in entity json.  Generally best to use the\r\n\t\t-- same name as your mod wiki page to prevent conflicts between multiple\r\n\t\t-- mods.\r\n\t\tsoda = Entity.generate(\&amp;quot;Sample Soda\&amp;quot;);\r\n\r\n\t\tif soda == nil then\r\n\t\t\tMainScreen.addGameText(\&amp;quot;Please also load the Sample Soda mod.\&amp;quot;);\r\n\t\telse\r\n\t\t\tMainScreen.addGameText(&#039;You insert $1 into the vending machine.  &#039; ..\r\n\t\t\t\t&#039;It spits out a can of diet soda.&#039;);\r\n\r\n\t\t\t-- Set location to be the same location as vending machine.\r\n\t\t\t-- Since the player must be next to the vending machine to use it,\r\n\t\t\t-- this function works fine.  Another (longer) method would be to get\r\n\t\t\t-- the vending machine&#039;s location and set the soda&#039;s location to it.\t\t\t\r\n\t\t\tsoda.moveEntityToSameRoomAsPlayer();\r\n\t\tend\r\n\telse\r\n\t\t-- Player didn&#039;t have enough currency to cover the total cost of transaction.\r\n\t\t-- No currency was deducted.\r\n\t\t\r\n\t\tMainScreen.addGameText(&#039;You need at least $1 to buy a soda.&#039;);\t\r\n\tend\r\n\r\n\treturn true; -- Automatic continue scene\r\nend&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: false,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot;: &amp;quot;ENTITY&amp;quot;,&lt;br /&gt;
				&amp;quot;id&amp;quot;: &amp;quot;Sample Soda&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;Soda&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;description&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;A can of diet soda.&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;doUse&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;programBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isUseable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isPickupable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;lua&amp;quot;:  &amp;quot;function doUse()\r\n\t-- NOTE: The engine actually has support for food objects that will adjust\r\n\t-- the player&#039;s weight appropriately, however, this is not yet exposed to\r\n\t-- LUA modding as of Feb 2018.  For the purposes of this example, the soda\r\n\t-- will just replenish HP with no other consequences.\r\n\r\n\tplayer = Player.getInstance();\r\n\r\n\tMainScreen.addGameText(&#039;You gulp down the soda.  &#039;);\t\r\n\r\n\tplayer.heal(3); -- Heal 3HP\r\n\r\n\tthis.deleteEntity(); -- Remove entity from world or inventory\r\n\r\n\treturn true; -- Automatic continue scene\r\nend&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Player&amp;diff=1255</id>
		<title>Modding:Player</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Player&amp;diff=1255"/>
		<updated>2026-02-25T03:12:24Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Two additional/optional parameters added to pickupItem(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Player getInstance() ===&lt;br /&gt;
Get the instance of the Player class.&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getDickSizeString() ===&lt;br /&gt;
Get string representation of player&#039;s dick size&lt;br /&gt;
&lt;br /&gt;
=== void tfDickLarger() ===&lt;br /&gt;
Increase the size of player&#039;s dick.  This outputs text to screen.&lt;br /&gt;
&lt;br /&gt;
=== number getHeight() ===&lt;br /&gt;
Player&#039;s height, in inches&lt;br /&gt;
&lt;br /&gt;
=== number getDickSize() ===&lt;br /&gt;
Player&#039;s dick size, in inches.  0 = no dick&lt;br /&gt;
&lt;br /&gt;
=== void deleteItem([[Entity]] entityToDelete) ===&lt;br /&gt;
Deletes a held item.&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets player&#039;s name.&lt;br /&gt;
&lt;br /&gt;
=== void setNameOverride(string nameOverride) ===&lt;br /&gt;
Force players name to something else.  Call with &amp;quot;&amp;quot; to set back to normal.&lt;br /&gt;
&lt;br /&gt;
(Name overrides ignore player gender)&lt;br /&gt;
&lt;br /&gt;
Added in r56.10&lt;br /&gt;
&lt;br /&gt;
=== boolean isInInventory([[Entity]] entityToCheck) ===&lt;br /&gt;
Is entityToCheck in player&#039;s inventory currently?&lt;br /&gt;
&lt;br /&gt;
=== number getVaginaSize() ===&lt;br /&gt;
In inches.  0 = no vagina&lt;br /&gt;
&lt;br /&gt;
=== string getVaginaSizeString() ===&lt;br /&gt;
A string representation of the player&#039;s vagina, ie: &amp;quot;large slit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If no vagina (size 0), returns &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sizes 7+ are monstrous vaginas -- can check this via getMonsterVagina()&lt;br /&gt;
&lt;br /&gt;
=== number getWeight() ===&lt;br /&gt;
Returns weight where 0 thin-100 obese.  &lt;br /&gt;
&lt;br /&gt;
Will get the larger of either players &#039;overweight&#039; value (fat) or their pregnancy weight value&lt;br /&gt;
&lt;br /&gt;
=== string getWeightString() ===&lt;br /&gt;
ie, &amp;quot;lean&amp;quot;, &amp;quot;heavy&amp;quot;, &amp;quot;obese&amp;quot;, etc&lt;br /&gt;
&lt;br /&gt;
This ONLY refers to fat.&lt;br /&gt;
&lt;br /&gt;
=== int getBreastRows() ===&lt;br /&gt;
Number of rows.  1 is normal for male and female&lt;br /&gt;
&lt;br /&gt;
=== int getBreastSize() ===&lt;br /&gt;
0 = none, 1 = AA, 2 = A, 3= B, 4=C, 5=D, ...&lt;br /&gt;
&lt;br /&gt;
=== string getBreastSizeString ===&lt;br /&gt;
String representation of player&#039;s breast size, ie &amp;quot;large D-cup hooters&amp;quot;&lt;br /&gt;
&lt;br /&gt;
No breasts will return &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== void tfBreastsLarger(boolean silent) ===&lt;br /&gt;
Increases size of breasts.&lt;br /&gt;
&lt;br /&gt;
silent: If true, does not output TF text to screen.&lt;br /&gt;
&lt;br /&gt;
=== void tfBreastsSmaller() ===&lt;br /&gt;
Decreases size of breasts.  Outputs TF text to screen.&lt;br /&gt;
&lt;br /&gt;
=== void tfDickLarger() ===&lt;br /&gt;
Increases size of dick (max size via this function is 13).  Outputs TF text to screen.  Player&#039;s lust increases by 20.&lt;br /&gt;
&lt;br /&gt;
=== void tfDickSmaller() ===&lt;br /&gt;
Decreases size of dick (down to no dick).  Outputs TF text to screen.&lt;br /&gt;
&lt;br /&gt;
=== void setDickSize (int dickSize) ===&lt;br /&gt;
Sets dick size (in inches), with no text output to screen&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Returns players current location&lt;br /&gt;
&lt;br /&gt;
=== void setLocation([[Location]] location) ===&lt;br /&gt;
Sets players new location.  Note that no transition is displayed to player, nor does this (currently) fire any room transition events to inform entities that the player just entered this location.&lt;br /&gt;
&lt;br /&gt;
(Added in r26)&lt;br /&gt;
&lt;br /&gt;
=== boolean pickupItem([[Entity]] entityToPickUp, bool silent=false, bool allowEvenIfWristsBound=false) ===&lt;br /&gt;
This is the main function to call to try adding an item to the player&#039;s inventory. &lt;br /&gt;
&lt;br /&gt;
Attempts adding a particular item to the player&#039;s inventory.  Will fail if inventory is full or there is already a clothing item in the particular slot.  Normally, a message will be shown to the player describing the success or failure&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;silent&#039;&#039;&#039; - prevents any output from being displayed&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowEvenIfWristsBound&#039;&#039;&#039; - allow pickup even if normally player wouldn&#039;t be able to pick it up due to bound wrists&lt;br /&gt;
&lt;br /&gt;
Enabling both silent + allowEvenIfWristsBound is a good combination for situations like NPC putting a collar on the player, where you would want the normal pickup&#039;s logic to block the pickup if a collar is already present.  Then you can check the result and output to the screen some custom text about the NPC putting the item on the player.&lt;br /&gt;
&lt;br /&gt;
Returns if item was picked up&lt;br /&gt;
&lt;br /&gt;
=== void forcePickupItemSilent([[Entity]] entityToPickUp) ===&lt;br /&gt;
Forces an item into inventory -- ignores inventory size limit, pickup restrictions, etc.&lt;br /&gt;
&lt;br /&gt;
=== void pickupItemOrDropToGround([[Entity]] entityToPickup) ===&lt;br /&gt;
Attempts to add item to player inventory.  If it can&#039;t be added, then the item drops to ground at player&#039;s feet&lt;br /&gt;
&lt;br /&gt;
=== int getCurrentInventorySize() ===&lt;br /&gt;
How many items player is carrying -- does NOT include clothing/worn items.&lt;br /&gt;
&lt;br /&gt;
=== void dropAllInventoryToMapRoom(string mapName, int mapRoomID, [bool removeTattoosAndPiercings]) ===&lt;br /&gt;
Drops ALL items in the player&#039;s inventory into the target map room ID.&lt;br /&gt;
&lt;br /&gt;
In r38+, an optional third parameter is available to set whether tattoos and piercings should also be removed.&lt;br /&gt;
&lt;br /&gt;
=== boolean isInInventoryString(string entityName) ===&lt;br /&gt;
Is the target object in player inventory currently?&lt;br /&gt;
&lt;br /&gt;
=== [[Entity]] getInventoryItemByString(string entityName) ===&lt;br /&gt;
Return the named item (or null, if item name is not in inventory)&lt;br /&gt;
&lt;br /&gt;
=== void deleteInventoryString(string entityName) ===&lt;br /&gt;
Delete by item&#039;s title in inventory&lt;br /&gt;
&lt;br /&gt;
=== boolean dropItem([[Entity]] entityToDrop) ===&lt;br /&gt;
This is the main function to call to try dropping an item out of the player&#039;s inventory. &lt;br /&gt;
&lt;br /&gt;
Will fail if item is nonexistent, or item&#039;s check function fails (ie: cursed).&lt;br /&gt;
&lt;br /&gt;
A message will be shown to the player describing the success or failure&lt;br /&gt;
&lt;br /&gt;
=== boolean dropItemForceSilent([[Entity]] entityToDrop) ===&lt;br /&gt;
Will silently drop the target item to ground -- regardless of cursed status.&lt;br /&gt;
&lt;br /&gt;
=== void causeDamage(int damageAmount) ===&lt;br /&gt;
Cause damage to player of damageAmount&lt;br /&gt;
&lt;br /&gt;
=== int getPlayerAttackDamagePhysical() ===&lt;br /&gt;
How much damage the player causes to monsters.  You probably don&#039;t need to access this -- usually let existing monster mod system handle combat.&lt;br /&gt;
&lt;br /&gt;
=== int getPlayerAttackDamageLust() ===&lt;br /&gt;
How much damage the player causes to monsters.  You probably don&#039;t need to access this -- usually let existing monster mod system handle combat.&lt;br /&gt;
&lt;br /&gt;
=== int getAcceptance() ===&lt;br /&gt;
Returns player&#039;s current acceptance level&lt;br /&gt;
&lt;br /&gt;
=== void setAcceptance(int newAcceptanceLevel) ===&lt;br /&gt;
Sets player&#039;s acceptance level to something new.&lt;br /&gt;
&lt;br /&gt;
=== void incAcceptance(int amount) ===&lt;br /&gt;
Increases player&#039;s acceptance by amount&lt;br /&gt;
&lt;br /&gt;
=== void decAcceptance(int amount) ===&lt;br /&gt;
Decreases player&#039;s acceptance by amount&lt;br /&gt;
&lt;br /&gt;
=== boolean isCovered(string clothingSlot) ===&lt;br /&gt;
Checks to see if the target clothing slot is covered with an article of clothing that will conceal TFs&lt;br /&gt;
&lt;br /&gt;
Some clothing does NOT conceal TFs (like Lizland bindings)&lt;br /&gt;
&lt;br /&gt;
=== int getExposure() ===&lt;br /&gt;
How exposed is player?&lt;br /&gt;
* &amp;lt; 30 totally safe&lt;br /&gt;
* 30 ~ 100 suspicious, will catch looks but is still (currently) safe in public overworld areas&lt;br /&gt;
* &amp;gt; 100 guaranteed exposure&lt;br /&gt;
&lt;br /&gt;
=== boolean getTotallyHuman() ===&lt;br /&gt;
Is player 100% human?&lt;br /&gt;
&lt;br /&gt;
=== void setTotallyHuman() ===&lt;br /&gt;
Become human - no text output to screen&lt;br /&gt;
&lt;br /&gt;
=== void setToStartingCharacteristics() ===&lt;br /&gt;
Silently reset player to their starting characteristics, including human and body type&lt;br /&gt;
&lt;br /&gt;
=== void setMaleSilent() ===&lt;br /&gt;
Player silently becomes male&lt;br /&gt;
&lt;br /&gt;
=== boolean tfMakeVagina() ===&lt;br /&gt;
Attempts TF.  Returns true if player is given a vagina, otherwise player already has one&lt;br /&gt;
&lt;br /&gt;
=== boolean tfVaginaSmaller() ===&lt;br /&gt;
Attempts TF.  Returns true if player&#039;s vagina size decreases, otherwise already has no vagina.&lt;br /&gt;
&lt;br /&gt;
=== boolean tfVaginaLarger(bool silent=false) ===&lt;br /&gt;
Attempts TF.  Returns true if player&#039;s vagina size increases, otherwise already has max size vagina.&lt;br /&gt;
&lt;br /&gt;
Silent parameter will make the transformation not display any output on screen.&lt;br /&gt;
&lt;br /&gt;
=== void setVaginaSize(int vaginaSize) ===&lt;br /&gt;
Silently set vagina to target size&lt;br /&gt;
&lt;br /&gt;
=== boolean getMonsterVagina() ===&lt;br /&gt;
Does player have a monstrously sized vagina?  (With a monster vagina, players can&#039;t climax without receiving monster-sized dick)&lt;br /&gt;
&lt;br /&gt;
=== void resetLust() ===&lt;br /&gt;
Reset lust, display message&lt;br /&gt;
&lt;br /&gt;
=== void resetLustSilent() ===&lt;br /&gt;
Reset lust, don&#039;t display message&lt;br /&gt;
&lt;br /&gt;
=== void resetLustButNotMilk() ===&lt;br /&gt;
Reset lust, display message&lt;br /&gt;
&lt;br /&gt;
=== int getLust() ===&lt;br /&gt;
Returns player lust level&lt;br /&gt;
&lt;br /&gt;
=== void incLust(int amount, bool silent=false) ===&lt;br /&gt;
Increases player lust by amount&lt;br /&gt;
&lt;br /&gt;
Silent parameter (optional) will make the transformation not display any output on screen.&lt;br /&gt;
&lt;br /&gt;
=== void decLust(int amount) ===&lt;br /&gt;
Decreases player lust by amount&lt;br /&gt;
&lt;br /&gt;
=== string getSomethingToPlayWith() ===&lt;br /&gt;
Gets an action that player or another character could perform against player, depending on what bits they have.&lt;br /&gt;
&lt;br /&gt;
examples:&lt;br /&gt;
* &amp;quot;brushing up against your average B-cup boobs&amp;quot;&lt;br /&gt;
* &amp;quot;rubbing your large member&amp;quot;&lt;br /&gt;
Fairly limited set of generated actions, so use sparingly.&lt;br /&gt;
&lt;br /&gt;
=== boolean hasArms() ===&lt;br /&gt;
Does the player have arms?&lt;br /&gt;
&lt;br /&gt;
=== boolean hasLegs() ===&lt;br /&gt;
Does the player have legs?&lt;br /&gt;
&lt;br /&gt;
=== boolean hasUselessHands() ===&lt;br /&gt;
The player has hands, but they&#039;re useless (ie, cow hoof hands)&lt;br /&gt;
&lt;br /&gt;
=== void incBellyFat(int amount, bool hyper=false) ===&lt;br /&gt;
Increases player&#039;s overweightedness, outputs appropriate description text.  Outputs one line of text, no newlines.  May not output anything if change was not dramatic enough.&lt;br /&gt;
&lt;br /&gt;
Intended for use with weight TF, pregnancy TF should use pregnancy functions!&lt;br /&gt;
&lt;br /&gt;
Optional hyper mode will allow overweight to increase beyond normal limits, which can cause player to get stuck.&lt;br /&gt;
&lt;br /&gt;
=== void decBellyFat(int amount) ===&lt;br /&gt;
Decreases player&#039;s overweightedness, outputs appropriate description text.  Outputs one line of text, no newlines.  May not output anything if change was not dramatic enough.&lt;br /&gt;
&lt;br /&gt;
Intended for use with weight TF, pregnancy TF should use pregnancy functions!&lt;br /&gt;
&lt;br /&gt;
=== int getBellyFat() ===&lt;br /&gt;
Gets how many pounds of weight on player&#039;s belly is caused by fat / how heavy the belly is due to fat.  This is independent of any preg (usually you should use getBellyTotalWeight!)  0 = perfectly thin, 100 or more = huge. &lt;br /&gt;
&lt;br /&gt;
Note that while only belly fat is tracked, it&#039;s considered representative of the overall overweightedness of a character.  So increasing belly fat will cause arms to get flabby, etc. &lt;br /&gt;
&lt;br /&gt;
=== incBellyPreg ===&lt;br /&gt;
&#039;&#039;(introduced in r35)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Increases size of player&#039;s belly, outputs appropriate description text (due to pregnancy).  Outputs one line of text, no newlines.&lt;br /&gt;
&lt;br /&gt;
Does not actually cause player to become pregnant if they are not already.&lt;br /&gt;
&lt;br /&gt;
=== setBellyPreg ===&lt;br /&gt;
&#039;&#039;(introduced in r35)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets belly size.  One line text description of the TF, no newlines.&lt;br /&gt;
&lt;br /&gt;
Does not actually cause player to become pregnant if they are not already.&lt;br /&gt;
&lt;br /&gt;
=== int getBellyTotalWeight() ===&lt;br /&gt;
Gets how heavy the belly is over a normal weight.  0 thin-100 overweight (or more!) &lt;br /&gt;
&lt;br /&gt;
This is typically the function it is recommended to use when checking player&#039;s weight (ex: mobility flavor text, etc) &lt;br /&gt;
&lt;br /&gt;
Usually, this will get the larger of players fat (bellyFat) value or their pregnancy weight value.  However, players MAY have enabled to combine these two numbers for added difficulty.  To check only fat, use getBellyFatOnly() &lt;br /&gt;
&lt;br /&gt;
=== string getBellyDescription() ===&lt;br /&gt;
A few word description of the player&#039;s belly (includes both preg &amp;amp; weight factors)&lt;br /&gt;
&lt;br /&gt;
ex: &amp;quot;20 lb noticeably bulging belly&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== int getBellyPreg() ===&lt;br /&gt;
0&amp;lt;-&amp;gt;100 size of belly due to pregnancy.  0 = perfectly thin.  100=huge.  Also an indication of stage of preg.&lt;br /&gt;
&lt;br /&gt;
(usually when checking player belly size, you should use getCombinedBellySize!)&lt;br /&gt;
&lt;br /&gt;
=== int getHP() ===&lt;br /&gt;
Returns health points.  0 = dead&lt;br /&gt;
&lt;br /&gt;
=== int getHPMax() ===&lt;br /&gt;
Returns the highest player HP can reach.  Increases on level up.&lt;br /&gt;
&lt;br /&gt;
=== void heal(int amount) ===&lt;br /&gt;
Heal player by amount.  Won&#039;t go over HP Max&lt;br /&gt;
&lt;br /&gt;
=== int getLevel() ===&lt;br /&gt;
Returns player&#039;s current level&lt;br /&gt;
&lt;br /&gt;
=== int getCash() ===&lt;br /&gt;
Returns player&#039;s available cash&lt;br /&gt;
&lt;br /&gt;
=== void addCash(int amount) ===&lt;br /&gt;
Outputs a note that cash was added, and adds cash&lt;br /&gt;
&lt;br /&gt;
=== boolean removeCash(int amount) ===&lt;br /&gt;
Deducts amount cash if the player has it and returns true, else returns false.  &lt;br /&gt;
&lt;br /&gt;
This can be useful for shops, transactions, etc (only deducts if whole amount is there)&lt;br /&gt;
&lt;br /&gt;
=== string getHeightString() ===&lt;br /&gt;
example: 6&#039; 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== boolean tfHeightTaller(int amount) ===&lt;br /&gt;
Increase height by number of inches&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF took place&lt;br /&gt;
&lt;br /&gt;
=== boolean tfHeightShorter(int amount) ===&lt;br /&gt;
Decrease height by number of inches&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF took place&lt;br /&gt;
&lt;br /&gt;
=== boolean tfHeightTowards(int targetHeightInches) ===&lt;br /&gt;
Shortcut function to move player&#039;s height towards a desired height&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF took place&lt;br /&gt;
&lt;br /&gt;
=== void incMilkProduction(number amount) ===&lt;br /&gt;
Increases milk production, as long as player is not at max&lt;br /&gt;
&lt;br /&gt;
Will do nothing if player has neither breasts nor udder&lt;br /&gt;
&lt;br /&gt;
Will output text to player describing increase (no newline)&lt;br /&gt;
&lt;br /&gt;
=== void decMilkProduction(number amount) ===&lt;br /&gt;
Decreases milk production&lt;br /&gt;
&lt;br /&gt;
Will do nothing if player has neither breasts nor udder&lt;br /&gt;
&lt;br /&gt;
Will output text to player describing decrease (no newline)&lt;br /&gt;
&lt;br /&gt;
=== number getMilkProduction() ===&lt;br /&gt;
Amount of milk to produce every tick(0~20).  More than 10 is considered overdrive.&lt;br /&gt;
&lt;br /&gt;
=== string getUdderDescription() ===&lt;br /&gt;
Descriptive text of udder (indicates size)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;quot;large basketball-sized udder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== number getUdderMilk() ===&lt;br /&gt;
0 = no udder, 1 = no milk &amp;lt;-&amp;gt; 100 = totally full of milk&lt;br /&gt;
&lt;br /&gt;
=== boolean hasUdder() ===&lt;br /&gt;
Does player have an udder?&lt;br /&gt;
&lt;br /&gt;
=== void createUdder() ===&lt;br /&gt;
If player does not already have an udder, create one for them along with a small basic amount of milk production.  Output relevant text.&lt;br /&gt;
&lt;br /&gt;
=== void removeUdder() ===&lt;br /&gt;
Removes udder from player along with a note.&lt;br /&gt;
&lt;br /&gt;
=== void resetMilkSilent() ===&lt;br /&gt;
If lactating, reset ALL milk so player doesn&#039;t immediately have to give milk.  It will re-fill over time if player has milk production.  This is called after losing a fight, etc).&lt;br /&gt;
&lt;br /&gt;
=== void resetBreastMilkSilent() ===&lt;br /&gt;
If lactating, reset milk so player doesn&#039;t immediately have to give milk (breast).  It will re-fill over time if player has milk production.&lt;br /&gt;
&lt;br /&gt;
=== void resetUdderMilkSilent() ===&lt;br /&gt;
If lactating, reset milk so player doesn&#039;t immediately have to give milk (udder).  It will re-fill over time if player has milk production.&lt;br /&gt;
&lt;br /&gt;
=== number getBreastMilk() ===&lt;br /&gt;
0 or 1 = no milk &amp;lt;-&amp;gt; 100 = totally full of milk&lt;br /&gt;
&lt;br /&gt;
=== boolean isAbleToExercise() ===&lt;br /&gt;
Player can exercise once per day (too much is tiring)&lt;br /&gt;
&lt;br /&gt;
=== boolean attemptExercise(int decreaseOverweightBy) ===&lt;br /&gt;
If player has not yet exercised today, they can attempt an exercise activity.&lt;br /&gt;
&lt;br /&gt;
=== void resetExercise() ===&lt;br /&gt;
Call after rest to allow for exercising&lt;br /&gt;
&lt;br /&gt;
=== boolean isAbleToWatchTV() ===&lt;br /&gt;
TVs and similar activities can be useful to help player reduce acceptance.  Player can watch TV once per day.&lt;br /&gt;
&lt;br /&gt;
=== void setIsAbleToWatchTV(boolean isAbletoWatchTV) ===&lt;br /&gt;
TVs and similar activities can be useful to help player reduce acceptance.  Player can watch TV once per day.&lt;br /&gt;
&lt;br /&gt;
=== void setBreastRows(int breastRows) ===&lt;br /&gt;
Immediately change # of breast rows without outputing additional text.  1 is normal for both male &amp;amp; female&lt;br /&gt;
&lt;br /&gt;
=== boolean tfIncBreastRows() ===&lt;br /&gt;
Add a row of breasts and output appropriate descriptive text (does not include linebreak)&lt;br /&gt;
&lt;br /&gt;
=== boolean tfDecBreastRows() ===&lt;br /&gt;
Remove a row of breasts and output appropriate descriptive text (does not include linebreak)&lt;br /&gt;
&lt;br /&gt;
=== boolean getInHeat() ===&lt;br /&gt;
Returns true if player is a species type which can go into heat and they are currently in heat.&lt;br /&gt;
&lt;br /&gt;
=== boolean getIsAllFours() ===&lt;br /&gt;
Is player moving around on all fours/eights (horizontal walking instead of upright/standing walk)?&lt;br /&gt;
&lt;br /&gt;
Generally this is due to the leg joints of the player changing&lt;br /&gt;
&lt;br /&gt;
=== void triggerInseminationChance() ===&lt;br /&gt;
Should be called whenever the player receives sperm vaginally.  Depending on player&#039;s fertility / species, they may get knocked up from this call.&lt;br /&gt;
&lt;br /&gt;
=== boolean getWristsBound() ===&lt;br /&gt;
Are the players wrists bound?  This will limit options such as pick-up, drop, and masturbate.&lt;br /&gt;
&lt;br /&gt;
=== boolean hasAlternateVoice() ===&lt;br /&gt;
With a non-human voice, players will have difficulty communicating with humans.&lt;br /&gt;
&lt;br /&gt;
This indicates a voice that is so distorted, that it is impossible to understand (not just vocal modifiers)&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocal() ===&lt;br /&gt;
If the player has a non-human voice, what kind of noise do they make when trying to communicate?&lt;br /&gt;
&lt;br /&gt;
=== void setHeightSilent(int height) ===&lt;br /&gt;
Sets new player height, in inches.  No text output to screen, and does not perform normal bounds checking.&lt;br /&gt;
&lt;br /&gt;
=== boolean hasClothing(string slot) ===&lt;br /&gt;
&#039;&#039;(Introduced in r25)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Is player wearing anything in that clothing slot?&lt;br /&gt;
&lt;br /&gt;
=== [[Clothing]] getClothing(string slot) ===&lt;br /&gt;
&#039;&#039;(Introduced in r25)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Get what player wearing anything in that [[clothing slot]].  May be null&lt;br /&gt;
&lt;br /&gt;
=== void resetPregnancySilent() ===&lt;br /&gt;
(Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
If pregnant, scale back pregnancy a little so we don&#039;t immediately have to lay eggs (Call after losing a fight, etc)&lt;br /&gt;
&lt;br /&gt;
=== void advanceRedirectedTransformation() ===&lt;br /&gt;
(Introduced in r56)&lt;br /&gt;
&lt;br /&gt;
Advances the player&#039;s destined transformation (if any).  Typically called on monster defeating the player, if the player is not otherwise being transformed from a sequence.&lt;br /&gt;
&lt;br /&gt;
(This is useful since normally in permanent pure mode and a locked TF, the monsters would not TF you at all.  By calling this after non-TF defeat sex, it can advance the player&#039;s TF a little bit so there is still some progression of the TF.)&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:Entity|Entity]] getOwner() ===&lt;br /&gt;
(introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
Gets the entity the player is owned by -- may return null/nil if no owner.&lt;br /&gt;
&lt;br /&gt;
=== void setOwner([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
(introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
Silently sets the entity the player is owned by.  Usually you would want to use the Claim Ownership Scene instead of calling this directly so as to give the player a chance to accept/reject, as well as see the dom&#039;s stats, dialog, etc.&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
[[Dick Size Increaser]]&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Defining_Names&amp;diff=1254</id>
		<title>Modding:Defining Names</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Defining_Names&amp;diff=1254"/>
		<updated>2026-02-25T01:52:55Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Document how to use initial values name for entity mods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page will detail some general information about how names are defined for mods.&lt;br /&gt;
&lt;br /&gt;
Most situations will fit into one of the following patterns:&lt;br /&gt;
&lt;br /&gt;
== Simple Monster Mod - Static Name ==&lt;br /&gt;
A simple monster mod (no code) who always has the same name can do something like this:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   ...,&lt;br /&gt;
   &amp;quot;name&amp;quot;: &amp;quot;Harpy&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;See [https://skycorp.global/skyscript/mods/v/6/male-spider Spider] or [https://sclab.skycorp.global/ SCLab] for examples.&lt;br /&gt;
&lt;br /&gt;
== Entities - Static Name ==&lt;br /&gt;
Physical objects (ex: a painting) probably just need a single name, in which case they will not define a dynamic function and just use use the &#039;literalString&#039; functionality.  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   ...,&lt;br /&gt;
   &amp;quot;name&amp;quot;:&lt;br /&gt;
   {&lt;br /&gt;
      &amp;quot;literalString&amp;quot;: &amp;quot;Fox Painting&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Example:  [https://skycorp.global/skyscript/mods/v/27/sample-radio Radio]&lt;br /&gt;
&lt;br /&gt;
== Entities - Static Name ==&lt;br /&gt;
A second option for setting names is to use the initial name field:  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Fox Painting&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The initial name will set the object&#039;s initial name, but let other functions modify it.  This is ideal if the entity will later on end up owning the player or might otherwise have a name change during gameplay.  Basically, consider this a softer version of setting a name that tries to respect existing game logic, whereas the name function override described above is a harder version which will override other game functionality.&lt;br /&gt;
&lt;br /&gt;
== Advanced Monsters - Static Name ==&lt;br /&gt;
Most monsters don&#039;t change names.  In this case, it is fine to use the &#039;initialValues&#039; to set their base name.  This has the advantage that when the UI name changes, the existing logic will handle this because name is not being overridden.  For instance, when the monster sleeps, or becomes your owner.  Example:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Wyvern&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Example:  [https://skycorp.global/skyscript/mods/v/45/wyvern-shemale Wyvern Shemale]&lt;br /&gt;
&lt;br /&gt;
== Advanced Monsters - Personal Name ==&lt;br /&gt;
You may want to have a monster appear to be generic at first, but use a [[Entity Mod JSON Format#personalName()|personal name]] once they become the player&#039;s owner or in gametext.  In this case, you can use the personal name feature:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Fox&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;personalName&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalString&amp;quot;: &amp;quot;Tina&amp;quot;&lt;br /&gt;
  },  &lt;br /&gt;
  &amp;quot;pronoun&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalString&amp;quot;: &amp;quot;she&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Monsters - Random Name ==&lt;br /&gt;
You may want to have many monsters of a specific type (ex: Fox), but each of those monsters have their own individual random name (ex: Veronica, Amy, etc).  In this case, you can use the random name feature:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Fox&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;usesRandomizedName&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
  },  &lt;br /&gt;
  &amp;quot;pronoun&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalString&amp;quot;: &amp;quot;she&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Entity Mod JSON Format#pronoun()|Pronoun]] is also set so that the correct name gender will be pulled from the random list.&lt;br /&gt;
&lt;br /&gt;
Example:  SetOwnerWithScene&lt;br /&gt;
&lt;br /&gt;
== Custom (Entity or Adv. Monster) ==&lt;br /&gt;
You can also completely override how name is shown and displayed by implementing &amp;lt;code&amp;gt;name([[Modding:NameType|nameType]])&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function name(nameType)	&lt;br /&gt;
	if nameType == NameType.UI then&lt;br /&gt;
		return &amp;quot;Blep-Button&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if nameType == NameType.GameText then&lt;br /&gt;
		return &amp;quot;Blep-Personal&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;Blep-General&amp;quot;; &lt;br /&gt;
	-- For testing purposes only.  In a real situation, the&lt;br /&gt;
	-- UI and Unspecified types should usually be the same thing.&lt;br /&gt;
	-- Ex: UI&amp;amp;Unspecified is &amp;quot;Fox&amp;quot; and GameText is &amp;quot;Veronica&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;More practically, for advanced monsters, you could also set the name normally, and when needed, override it in certain circumstances, ex:&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function name(nameType)	&lt;br /&gt;
	if blepping == true then&lt;br /&gt;
		return &amp;quot;Blepper&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return this.defaultGetName(nameType);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Most mods won&#039;t need to override the name function like this though to accomplish normal game behavior.&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1253</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1253"/>
		<updated>2026-02-25T01:47:43Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Added new fixed field option for entity mods: name/initialValues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
=== initialValues ===&lt;br /&gt;
Collection of values that may be changed or overwritten later:&lt;br /&gt;
&lt;br /&gt;
* name (added r56.1; See also: [[Modding:Defining Names|Defining Names]])&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== addEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ===&lt;br /&gt;
Provides a mechanism to add additional buttons (or completely change the buttons) on the entity look scene -- which is the scene shown when you examine an item or npc.&lt;br /&gt;
&lt;br /&gt;
Usually you would want to call &amp;lt;code&amp;gt;this.defaultAddEntityLookOptions(dynamicOptions, returnScene);&amp;lt;/code&amp;gt; to also include the normal buttons (pick up, back, etc).&lt;br /&gt;
* The return scene is the scene that is intended for the user to return to on pressing &#039;back&#039; (usually map scene).&lt;br /&gt;
* dynamicOptions can be modified via its function call to add new options.&lt;br /&gt;
&lt;br /&gt;
Sample:  [https://skycorp.global/skyscript/mods/v/92/sample-entity-with-extra-look-buttons Entity with extra look options]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:MapScene&amp;diff=1252</id>
		<title>Modding:MapScene</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:MapScene&amp;diff=1252"/>
		<updated>2026-02-23T20:16:10Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: MapScene now available to modders&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Map Scene is the view of the game that is seen when moving from room to room.  Currently, it also houses a number of movement and action related logic functions that are not map specific (for those see the [[Modding:Map|Map]] class).&lt;br /&gt;
&lt;br /&gt;
==Static Methods==&lt;br /&gt;
&lt;br /&gt;
===static MapScene getInstance()===&lt;br /&gt;
Get the instance of the MapScene class.&lt;br /&gt;
==Public Methods==&lt;br /&gt;
&lt;br /&gt;
===void setCurrentRoomID(string mapName, int newRoom)===&lt;br /&gt;
Sets room player is currently in.  No text / transition is shown to player, this is essentially an &#039;instant&#039; warp with no further logic checks performed.&lt;br /&gt;
&lt;br /&gt;
=== void teleportToRespawn() ===&lt;br /&gt;
Teleport player to a good respawn position (generally after they have died).  The exact location is dependent on the player&#039;s form and other restrictions (map-specific respawn logic will be respected, if available).&lt;br /&gt;
&lt;br /&gt;
=== bool teleportToMapSpecificRespawnIfAny() ===&lt;br /&gt;
Not typically called -- usually you would call teleportToRespawn() instead as there are also fallbacks to teleport the player to other locations.  However, if you want to &#039;&#039;only&#039;&#039; use map specific logic, and otherwise not move the player, this function is good.&lt;br /&gt;
&lt;br /&gt;
=== bool isInPublicOverworldRoom() ===&lt;br /&gt;
Checks if room player is currently in is in view of public (ex: public parts of Mulberry township, near guard outposts, etc)&lt;br /&gt;
&lt;br /&gt;
=== void tickGame() ===&lt;br /&gt;
Essentially this performs one &#039;turn&#039; of the game world -- all subsystem calculations will be called and player/monster states updated, etc.  This will give monster a chance to attack the player, etc.&lt;br /&gt;
&lt;br /&gt;
=== bool getInCombatCurrently() ===&lt;br /&gt;
Is player in combat currently (is there another mob in this room in ATTACK mode?&lt;br /&gt;
&lt;br /&gt;
=== void readyForNextTurn() ===&lt;br /&gt;
This function &#039;resets&#039; the map scene, such that the next time the map scene is shown, it will count as a new turn.  If the player spent a long time in a submenu (ex: made an action that would take a notable amount of time, then it makes sense the world should update in the intervening time.  This will give monster a chance to attack the player, etc. when the map scene is shown again.&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:Entity|Entity]] getPlayerAttacker() ===&lt;br /&gt;
Find a monster that is currently attacking the player (must be in same room).  Nil if none.&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Species&amp;diff=1251</id>
		<title>Modding:Species</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Species&amp;diff=1251"/>
		<updated>2026-02-19T21:06:27Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Oops, wrong return type in the documentation for getSpecies()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Species getSpecies(string speciesName) ===&lt;br /&gt;
Gets species object from species name  (ID string).  Returns null if species with that name can not be found. &lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getID() ===&lt;br /&gt;
Gets species name (ID) of this TF&lt;br /&gt;
&lt;br /&gt;
=== void causeTF() ===&lt;br /&gt;
Causes one step of this transformation to be applied to the player.  Text will be output to screen.&lt;br /&gt;
&lt;br /&gt;
=== int countPlayerPartsOfThisType() ===&lt;br /&gt;
Returns the number of body parts transformed into this species type&lt;br /&gt;
&lt;br /&gt;
=== int getSeverityTFed([[BodyPart]] bodyPart) ===&lt;br /&gt;
Gets how severly the player is transformed to THIS type of species for this body part.  &lt;br /&gt;
&lt;br /&gt;
IE, a fox tf would return 0 if the player is a level 0 human, or a level 1 cat, because they&#039;re not at all fox tf&#039;ed.&lt;br /&gt;
&lt;br /&gt;
=== bool getIsFullyTransformed() ===&lt;br /&gt;
If player is as transformed into this species as they possibly can be.  If not, causeTF() should cause the player to be TF&#039;ed further.&lt;br /&gt;
&lt;br /&gt;
=== string getBodyPartDescription([[BodyPart]] bodyPart, int severity) ===&lt;br /&gt;
Get a text description for what a body part at a given severity of transformation looks like.  &lt;br /&gt;
&lt;br /&gt;
Note that it is usually just easier to use text parsing variables if you&#039;re describing the player at their current state.&lt;br /&gt;
&lt;br /&gt;
=== bool hasAlternateVoice() ===&lt;br /&gt;
With a non-human voice, players will have difficulty communicating with humans. (False for normal english speech)&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocal() ===&lt;br /&gt;
If the player has a non-human voice, what kind of noise do they make when trying to communicate?&lt;br /&gt;
&lt;br /&gt;
=== bool tfBreast() ===&lt;br /&gt;
Increases player&#039;s breast size up to the &#039;&#039;minimumTargetBreastSize&#039;&#039; property.  Returns true if any TF was performed.&lt;br /&gt;
&lt;br /&gt;
=== bool tfNoPenisOneVagina() ===&lt;br /&gt;
Will TF player towards having one vagina and no penis (shrink dick then grow vagina).  Will also cause breast growth if &#039;&#039;minimumTargetBreastSize&#039;&#039; is set (it calls tfBreast()).&lt;br /&gt;
&lt;br /&gt;
If there is a reason player must have a penis, then don&#039;t affect penis but still grow vagina.  For instance, a male player wearing a cursed cock ring will result in a futa character.&lt;br /&gt;
&lt;br /&gt;
Returns true if any TF was performed.&lt;br /&gt;
&lt;br /&gt;
=== bool shouldAttemptTransformation() ===&lt;br /&gt;
Checks if any changes likely to be available.  Checking this prior to calling causeTF() or a forced TF sequence helps avoid going into a TF scene with no TF.  Does NOT guarantee causeTF() will actually do a TF!&lt;br /&gt;
&lt;br /&gt;
(added in r54)&lt;br /&gt;
&lt;br /&gt;
=== bool CheckSpeciesTransformationAllowed(bool silent=false) ===&lt;br /&gt;
Convenience function for checking if species-level transformation is permitted.  Outputs to screen if blocked and silent is not set.&lt;br /&gt;
&lt;br /&gt;
(added in r54)&lt;br /&gt;
&lt;br /&gt;
=== bool checkBodyPartTransformationAllowed([[BodyPart]] bodyPart, bool silent=true) ===&lt;br /&gt;
Convenience function for checking if particular body part transformation is permitted.  Outputs to screen if blocked and silent is not set.&lt;br /&gt;
&lt;br /&gt;
Unlike the species version of this check, silent is default for this.  That is because usually we don&#039;t want to output text for each body part as that would be confusing/spammy to player why the same body parts keep getting attempted.&lt;br /&gt;
&lt;br /&gt;
(added in r54)&lt;br /&gt;
&lt;br /&gt;
=== void onTransformed() ===&lt;br /&gt;
Intended to be called after every successful transformation, allowing other systems opportunity to react to a species transformation.  Custom species should call this so if the game is in permanent TF mode and no permanent species has been set yet, the player can be locked to this species.&lt;br /&gt;
&lt;br /&gt;
(added in r54)&lt;br /&gt;
&lt;br /&gt;
== Public Variables ==&lt;br /&gt;
&lt;br /&gt;
=== [get only] bool feminize ===&lt;br /&gt;
If set, this variable will cause a player to also change gender.  Feminization will cause player to grow breasts to a size appropriate for the species (see private variable minimumTargetBreastSize), and genital change (unless wearing a shemale item like cock ring).&lt;br /&gt;
&lt;br /&gt;
This setting gets turned on when:  &lt;br /&gt;
&lt;br /&gt;
* Player has enabled the Always Feminize game mode option during character creation.  &lt;br /&gt;
* A TF can also be created as a Feminize variant when it is initialized, though this is rare.&lt;br /&gt;
&lt;br /&gt;
It&#039;s expected that a custom causeTF() will either:&lt;br /&gt;
&lt;br /&gt;
* Check this feminize setting and feminize if set (for species like vanilla dragon that don&#039;t automatically imply gender TF)&lt;br /&gt;
* Or ignore the feminization setting entirely and force gender TF regardless (for species that always feminize, ex: dragon queen, titslug, etc.)&lt;br /&gt;
&lt;br /&gt;
(added in r54)&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== bool checkFullyFeminizedIfShould(int targetBreastSize, int targetVaginaSize=1, bool thisTfAlwaysFeminizes=false) ===&lt;br /&gt;
Helper function called by TFs to determine if this TF can potentially transform player gender more.  Species don&#039;t always cause feminization, but they can if either the relevant game option is chosen during character creation, or its a transformation that implies gender tf (ex: mermaid).&lt;br /&gt;
&lt;br /&gt;
targetVaginaSize:  Most TG&#039;s just use the TfNoPenisOneVagina() function, which currently only TF&#039;s the player vagina one step.  Unless a particular sized vagina is part of the TF, just call this without overloads.&lt;br /&gt;
&lt;br /&gt;
thisTfAlwaysFeminizes:  Set true if breast growth should &#039;&#039;always&#039;&#039; happen, and also if penis-&amp;gt;vagina tf should happen (at least, if it doesn&#039;t conflict with player&#039;s persist dick setting (ex: cock ring)).&lt;br /&gt;
&lt;br /&gt;
(added in r54)&lt;br /&gt;
&lt;br /&gt;
== Private Variables ==&lt;br /&gt;
&lt;br /&gt;
=== int minimumTargetBreastSize ===&lt;br /&gt;
How big player breasts should be due to this transformation.  Repeated calls to tfBreast() or tfNoPenisOneVagina() will increase player&#039;s breast size to these.  See [[Player#int getBreastSize.28.29|Player.GetBreastSize()]] for size reference.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Getting_Started_Modding&amp;diff=1250</id>
		<title>Modding:Getting Started Modding</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Getting_Started_Modding&amp;diff=1250"/>
		<updated>2026-02-05T21:22:30Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Link mod bundles page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Want to make a mod for The Underworld?  Great!&lt;br /&gt;
&lt;br /&gt;
== Tips on Learning ==&lt;br /&gt;
The best way to learn is to start gradually, making more complex mods as you go:&lt;br /&gt;
* It is best to start with making a Monster mod, as it is the simplest type of thing to make (an editor is provided).  &lt;br /&gt;
* Afterwards, clothes and entities (items) introduce custom LUA scripting.&lt;br /&gt;
* Transformations (Species) are the most complex mod to create, but even people new to LUA scripting have managed it.  However, it is much easier to start by learning to create a simple entity (item) first, then jump into transformations!&lt;br /&gt;
* Maps can be very simple or very complex depending on what kind of map you want to make.&lt;br /&gt;
Ask questions in the forums modding section!&lt;br /&gt;
&lt;br /&gt;
== How To&#039;s ==&lt;br /&gt;
How to make...&lt;br /&gt;
* Monsters&lt;br /&gt;
** [[Creating a Monster Mod|Basic]] (includes simple editor, no code required!)&lt;br /&gt;
** [[Creating a MonsterAdvanced Mod|Advanced]] (LUA code supported)&lt;br /&gt;
* [[Creating an Entity Mod|Entities]] &lt;br /&gt;
* [[Creating a Clothing Mod|Clothes]]&lt;br /&gt;
* [[Creating a Transformation Mod|Transformations]]&lt;br /&gt;
* [[Creating a Map Mod|Maps]]&lt;br /&gt;
* [[Modding:Bundles|Bundles]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Bundles&amp;diff=1249</id>
		<title>Modding:Bundles</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Bundles&amp;diff=1249"/>
		<updated>2026-02-05T21:21:46Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Mod bundles!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bundles are mods that contain multiple mod types within them.  (Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
== Methods of bundling ==&lt;br /&gt;
There are two ways to create bundles:&lt;br /&gt;
&lt;br /&gt;
1)  Manually through JSON (forced)&lt;br /&gt;
&lt;br /&gt;
2)  Automatically through the mod dependencies system&lt;br /&gt;
&lt;br /&gt;
Generally speaking, manual bundles should only be made if the submods have &#039;&#039;no&#039;&#039; potential use independently.  For instance, before bundling a monster and a map manually, consider that another modder might want to use the monster in a custom map, or spawn it in a procedural map.  In that case, having each of the monster and the map individually listed in the mod database allows more flexibility for the mods to be used in future ways.&lt;br /&gt;
&lt;br /&gt;
== Mod dependencies bundling (Automatic) ==&lt;br /&gt;
This is the easiest and most flexible way of bundling -- each mod can list its own dependencies in the mod portal.  Then when the user installs the mod, all dependencies will be installed recursively.&lt;br /&gt;
&lt;br /&gt;
== Manual bundling ==&lt;br /&gt;
Set the type of the mod to &amp;lt;code&amp;gt;BUNDLE&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;BUNDLE&amp;quot;,&lt;br /&gt;
	&amp;quot;includedMods&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{ ... }&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{ ... }&lt;br /&gt;
		}, ...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;includedMods&amp;lt;/code&amp;gt; will be an array of sub mods, each one specifies:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;spawn&amp;lt;/code&amp;gt; - whether the item or monster should be spawned in the environment&lt;br /&gt;
* &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt; - the submod&#039;s json&lt;br /&gt;
&lt;br /&gt;
=== Full example ===&lt;br /&gt;
This example bundles the [https://skycorp.global/skyscript/mods/v/20/sample-vending-machine vending machine] and the [https://skycorp.global/skyscript/mods/v/19/sample-soda soda] it dispenses as one combined mod.  It only spawns the vending machine, but since the soda is loaded, the vending machine can spawn soda through its lua code.&lt;br /&gt;
&lt;br /&gt;
(In reality, you would not want to bundle these together as by using the automatic dependency system, other mods could make use of the soda entity for their own purposes.)&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;BUNDLE&amp;quot;,&lt;br /&gt;
	&amp;quot;includedMods&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: true,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot;: &amp;quot;ENTITY&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;Vending Machine&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;description&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;The vending machine advertises $1 for one diet soda.&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;doUse&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;programBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isUseable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;lua&amp;quot;:  &amp;quot;function doUse()\r\n\t-- NOTE: If creating a full store, it would probably be better to use the\r\n\t-- existing store code, however as of Feb 2018 this is not yet exposed to\r\n\t-- LUA modding.  However, this is fine for a &#039;shop&#039; that only sells one\r\n\t-- item.\r\n\r\n\tplayer = Player.getInstance();\r\n\r\n\tif player.removeCash(1) then\r\n\t\t-- Player has enough currency to cover the transaction, and it was\r\n\t\t-- deducted successfully.\r\n\r\n\t\t-- This matches the id field in entity json.  Generally best to use the\r\n\t\t-- same name as your mod wiki page to prevent conflicts between multiple\r\n\t\t-- mods.\r\n\t\tsoda = Entity.generate(\&amp;quot;Sample Soda\&amp;quot;);\r\n\r\n\t\tif soda == nil then\r\n\t\t\tMainScreen.addGameText(\&amp;quot;Please also load the Sample Soda mod.\&amp;quot;);\r\n\t\telse\r\n\t\t\tMainScreen.addGameText(&#039;You insert $1 into the vending machine.  &#039; ..\r\n\t\t\t\t&#039;It spits out a can of diet soda.&#039;);\r\n\r\n\t\t\t-- Set location to be the same location as vending machine.\r\n\t\t\t-- Since the player must be next to the vending machine to use it,\r\n\t\t\t-- this function works fine.  Another (longer) method would be to get\r\n\t\t\t-- the vending machine&#039;s location and set the soda&#039;s location to it.\t\t\t\r\n\t\t\tsoda.moveEntityToSameRoomAsPlayer();\r\n\t\tend\r\n\telse\r\n\t\t-- Player didn&#039;t have enough currency to cover the total cost of transaction.\r\n\t\t-- No currency was deducted.\r\n\t\t\r\n\t\tMainScreen.addGameText(&#039;You need at least $1 to buy a soda.&#039;);\t\r\n\tend\r\n\r\n\treturn true; -- Automatic continue scene\r\nend&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;spawn&amp;quot;: false,&lt;br /&gt;
			&amp;quot;mod&amp;quot;:&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot;: &amp;quot;ENTITY&amp;quot;,&lt;br /&gt;
				&amp;quot;id&amp;quot;: &amp;quot;Sample Soda&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;Soda&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;description&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalString&amp;quot;: &amp;quot;A can of diet soda.&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;doUse&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;programBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isUseable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;isPickupable&amp;quot;:&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;lua&amp;quot;:  &amp;quot;function doUse()\r\n\t-- NOTE: The engine actually has support for food objects that will adjust\r\n\t-- the player&#039;s weight appropriately, however, this is not yet exposed to\r\n\t-- LUA modding as of Feb 2018.  For the purposes of this example, the soda\r\n\t-- will just replenish HP with no other consequences.\r\n\r\n\tplayer = Player.getInstance();\r\n\r\n\tMainScreen.addGameText(&#039;You gulp down the soda.  &#039;);\t\r\n\r\n\tplayer.heal(3); -- Heal 3HP\r\n\r\n\tthis.deleteEntity(); -- Remove entity from world or inventory\r\n\r\n\treturn true; -- Automatic continue scene\r\nend&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1248</id>
		<title>Modding:BodyDescription</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1248"/>
		<updated>2026-02-04T02:06:07Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Add sample code link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This class lets you describe an NPC&#039;s appearance.  [[Modding:Text Variables|Text variables]] can then use this appearance data in scenes.&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static public BodyDescription generateNew() ===&lt;br /&gt;
Creates a new body description.  &lt;br /&gt;
&lt;br /&gt;
Note that it must be assigned to the NPC after you finish configuring it!&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== void setBreastSize(int breastSize) ===&lt;br /&gt;
Size of breasts -- uses same scale used by player class&lt;br /&gt;
&lt;br /&gt;
=== int getBreastSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setBreastRows(int breastRows) ===&lt;br /&gt;
Number of rows of breasts&lt;br /&gt;
&lt;br /&gt;
=== int getBreastRows() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDickSize(int dickSize) ===&lt;br /&gt;
Size of dick -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getDickSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setVaginaSize(int vaginaSize) ===&lt;br /&gt;
Size of vagina -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getVaginaSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDexterous(bool dexterous) ===&lt;br /&gt;
Does the character have dexterous hands?  False if no hands, hands are bound, or non-dexterous paws&lt;br /&gt;
&lt;br /&gt;
=== bool isDexterous() ===&lt;br /&gt;
&lt;br /&gt;
=== bool getHasAlternateVoice() ===&lt;br /&gt;
If the NPC is incapable of normal human speech (also see Vocal string below).&lt;br /&gt;
&lt;br /&gt;
=== void setHasAlternateVoice(bool hasAlternateVoice) ===&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocalString() ===&lt;br /&gt;
If NPC is incapable of normal human speech (alternate vocal bool above), then what noise do they produce instead?&lt;br /&gt;
&lt;br /&gt;
=== void setAlternateVocalString(string alternateVocalString) ===&lt;br /&gt;
&lt;br /&gt;
=== bool getBipedal() ===&lt;br /&gt;
If the NPC walks on two legs&lt;br /&gt;
&lt;br /&gt;
=== void setBipedal(bool bipedal) ===&lt;br /&gt;
&lt;br /&gt;
=== void setUniqueBodyPartDescription(string bodyPartName, string description) ===&lt;br /&gt;
Can set a description for a body part for specific flavor.&lt;br /&gt;
&lt;br /&gt;
=== string getBodyPartDescription(string bodyPartName) ===&lt;br /&gt;
Tries to get the body part description, if one is defined.  If unavailable, just returns &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Sample code ==&lt;br /&gt;
See [https://skycorp.global/skyscript/mods/v/96/sample-claim-ownership Claim Ownership] sample for an example of body description in use.&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Placed in global scope so it runs on load.&lt;br /&gt;
bodyDescription = BodyDescription.generateNew();&lt;br /&gt;
bodyDescription.setBreastSize(4); -- D Cup&lt;br /&gt;
bodyDescription.setBreastRows(2);&lt;br /&gt;
bodyDescription.setDickSize(10); -- Inches&lt;br /&gt;
bodyDescription.setVaginaSize(2);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;HANDS&amp;quot;, &amp;quot;oversized paws&amp;quot;);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;TEETH&amp;quot;, &amp;quot;fangs&amp;quot;);&lt;br /&gt;
-- etc...&lt;br /&gt;
this.setBodyDescription(bodyDescription);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1247</id>
		<title>Modding:MainScreen</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1247"/>
		<updated>2026-02-04T02:04:57Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Add claim ownership sample mod link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static void addGameText(string gameText) ===&lt;br /&gt;
Output string to screen.  Does not automatically add newlines.&lt;br /&gt;
&lt;br /&gt;
Unlike io.write, will only accept one string parameter, making it useful to get around the [[LUA Implementation Limitations &amp;amp; Notes|LUFA garbage array bug]].&lt;br /&gt;
&lt;br /&gt;
=== static void continueSceneToMapScene() ===&lt;br /&gt;
Removes screen buttons (but not shown text).  Will display one &#039;continue&#039; button, which when pressed, will redirect flow back to the map (/ player navigation).  This is a shortcut into the game&#039;s scene flow control that handles most cases, but for instance, if you wanted to continue then go to somewhere else, you should bug Skye to expose the full scene control system.&lt;br /&gt;
&lt;br /&gt;
Added in r35&lt;br /&gt;
&lt;br /&gt;
=== static void changeToForcedTransformationScene(string prefix, [[Modding:Species|Species]] species, bool allowEscape = true, function switchSceneAfterTransformationSequence = null, function teleportPlayerOnFinish = true, bool resetLustHP = true, function customOutputFunction = null, bool withContinueScene = true) ===&lt;br /&gt;
Using this, you can play the forced transformation sequence scene.  This is primarily useful if you are doing a forced transformation sequence that should be triggered from customized monster logic (ex: not normal defeat logic) or triggered from an arbitrary object.&lt;br /&gt;
&lt;br /&gt;
[https://skycorp.global/skyscript/mods/v/90/sample-fox-painting Sample code]&lt;br /&gt;
&lt;br /&gt;
Note there are several other methods you may want to consider instead of this:&lt;br /&gt;
&lt;br /&gt;
* If you just want to cause a single body part to be transformed at a time, see [[Modding:Species#void causeTF()|causeTF()]]&lt;br /&gt;
* If you do want a multi-step tf sequence, and are already triggering this on player defeat to a monster, you probably want to use the normal player defeat logic.  This will also check to see if the player is TF&#039;able before trying to TF the player, as well as updating the monster&#039;s state to sleep, and inseminating the player if configured.  You can trigger this logic on defeat by either&lt;br /&gt;
** Not defining the doMonsterVictory function in the json, or&lt;br /&gt;
** Defining the doMonsterVictory function, but inside your custom function, calling doMonsterVictoryDefault() to do normal logic&lt;br /&gt;
&lt;br /&gt;
If you do want to call this function, then you&#039;ll need to define the following text variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_PLAYER_DEFEAT&lt;br /&gt;
|Initial text shown to player on defeat&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTIME&lt;br /&gt;
|Text shown every step player is being tf&#039;ed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTOTAL&lt;br /&gt;
|Text shown at conclusion of tf&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_SUCCESS&lt;br /&gt;
|Player tried to escape, and did&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_FAILURE&lt;br /&gt;
|Player tried to escape, but failed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFACCEPT&lt;br /&gt;
|Player did not try to escape / accepted the tf&lt;br /&gt;
|}&lt;br /&gt;
Function parameters:&lt;br /&gt;
&lt;br /&gt;
==== string prefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Species|Species]] species ====&lt;br /&gt;
Which TF is being done&lt;br /&gt;
&lt;br /&gt;
==== bool allowEscape = true ====&lt;br /&gt;
If escape is possible.  Button will still be shown, but it will be impossible to escape regardless of lust level.&lt;br /&gt;
&lt;br /&gt;
==== function switchSceneAfterTransformationSequenceScript = null ====&lt;br /&gt;
This can be used to transition to a different scene after the sequence, instead of back to the normal mapscene.&lt;br /&gt;
&lt;br /&gt;
If not null, called to determine logic for switching scene.  (If not set, just goes back to mapscene).  The bool indicates if the full tf played out (false if the player escaped mid-tf)&lt;br /&gt;
&lt;br /&gt;
(Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== function teleportPlayerOnFinish = true ====&lt;br /&gt;
Whether to teleport player to a respawn position after the sequence finishes&lt;br /&gt;
&lt;br /&gt;
==== bool resetLustHP = true ====&lt;br /&gt;
On full tf: whether to reset lust + hp.&lt;br /&gt;
&lt;br /&gt;
On early escape: whether to reset lust.&lt;br /&gt;
&lt;br /&gt;
==== function customOutputFunctionScript = null ====&lt;br /&gt;
If set, this function is called with the text key suffix each tf instead of outputting monsterPrefix+suffix text.  (Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene = true ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToClaimOwnershipScene([[Modding:Entity|Entity]] potentialOwner, string textPrefix, bool withContinueScene, bool sleepAfterward, function customAfterSceneScript = null) ===&lt;br /&gt;
Transitions to the claim ownership scene -- a scene that displays some intro text, information about the entity (presumably a dom/monster, but can be any entity), and then offers the player the ability to accept or reject them as their new owner.  This scene already performs logic for handling if player is already owned by another dom and includes preset text variables.&lt;br /&gt;
&lt;br /&gt;
You don&#039;t need to re-define text variables for this function (most monsters currently don&#039;t), but if you wish to, you should redefine these:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_START&lt;br /&gt;
|Initial text, shown regardless of whether player has been claimed by some other dom or not.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED&lt;br /&gt;
|After the initial text, the NPC will check if player is owned by someone else.  There are multiple ways for this detection to happen, and this particular field overrides all of them.&lt;br /&gt;
If player is already owned by another dom, this text can be optionally defined if the NPC has some unusual way of identifying ownership over the player.  Generally though it&#039;s safe to leave this undefined, and one of the standard identification methods below will be used instead.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_SMELL&lt;br /&gt;
|If your dom can be smelled by any other dom&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_SLAVE&lt;br /&gt;
|Slave collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_PET&lt;br /&gt;
|Pet collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_GENERIC&lt;br /&gt;
|Generic fallback if none of the above apply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_DETECT_END&lt;br /&gt;
|The above detection text is then followed by this&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_OK&lt;br /&gt;
|Scene for player accepting ownership&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_RESIST&lt;br /&gt;
|Scene for player rejecting ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Entity|Entity]] potentialOwner ====&lt;br /&gt;
The entity (probably a monster) who is trying to claim ownership over player&lt;br /&gt;
&lt;br /&gt;
==== string textPrefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
==== bool sleepAfterward ====&lt;br /&gt;
If true, monster will go to sleep after this scene.  (This is ignored if customAfterSceneScript parameter is defined)&lt;br /&gt;
&lt;br /&gt;
==== function customAfterSceneScript = null ====&lt;br /&gt;
Instead of doing default scene handling and going back to map, this function can be called instead.  This lets you do some other scene or action instead.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
Sample code:  [https://skycorp.global/skyscript/mods/v/96/sample-claim-ownership Claim Ownership Sample Mod]&lt;br /&gt;
&lt;br /&gt;
=== static void changeToSimpleDynamicOptionsScene([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions) ===&lt;br /&gt;
Changes to simple dynamic options scene.&lt;br /&gt;
&lt;br /&gt;
Unlike many other types of scenes, Simple Dynamic Options is similar to a &#039;continue&#039; scene.  That is, it will not clear text from the UI by itself.  Furthermore (and unlike a continue scene), it also does not clear existing buttons by itself.  It will, however, immediately add any buttons registered with the dynamic options object.&lt;br /&gt;
&lt;br /&gt;
Sample: [https://skycorp.global/skyscript/mods/v/91/sample-dynamic-options-example DynamicOptionsExample]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void resetUI(bool buttonsOnly=false) ===&lt;br /&gt;
Clears all text &amp;amp; buttons from user interface (make sure to add buttons back using some mechanism, or user will be stuck!)&lt;br /&gt;
&lt;br /&gt;
If buttonsOnly is set, then only buttons will be cleared / text will not be cleared.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToMapScene() ===&lt;br /&gt;
Changes immediately to map scene, without continue.  (This will cause any text currently on screen to be skipped)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToEntityLookScene([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
Changes immediately to looking at entity scene (where &#039;pick up&#039;, &#039;use&#039;, &#039;attack&#039;, etc are shown).&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding_Status&amp;diff=1246</id>
		<title>Modding Status</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding_Status&amp;diff=1246"/>
		<updated>2026-01-31T01:37:30Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Present tense&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The modding system has been ported over to the new engine.  Here&#039;s a guide of what mod features have been implemented as of r45.&lt;br /&gt;
&lt;br /&gt;
== Overall Features Status ==&lt;br /&gt;
Currently implemented:&lt;br /&gt;
&lt;br /&gt;
* Simple monster mods (like [https://skycorp.global/skyscript/sclab.php SCLab] creates)&lt;br /&gt;
* Wyvern TF&lt;br /&gt;
*Advanced Monster Mods (including Wyvern doms)&lt;br /&gt;
*Entities&lt;br /&gt;
*Clothing&lt;br /&gt;
*Maps&lt;br /&gt;
*Custom species / transformation mods&lt;br /&gt;
*Mod &amp;lt;-&amp;gt; Mod communication&lt;br /&gt;
&lt;br /&gt;
Currently not implemented:&lt;br /&gt;
&lt;br /&gt;
* A few uncommonly used LUA features:&lt;br /&gt;
**Metatables&lt;br /&gt;
&lt;br /&gt;
== Specific Mod Status ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Monster Mods&lt;br /&gt;
&lt;br /&gt;
!Monster&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Wolf Girl&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Sholf&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|CrotchHugger&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Bolstered Dragon Disciple&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Wyvern Male&lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Wyvern Shemale (new variant) &lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Sample: Monster Advanced Example&lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Male Spider&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Kitsune&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Potent Dragon Servant&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Pig King&lt;br /&gt;
|✅&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Clothing Mods&lt;br /&gt;
!Clothing&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Weight Pendant&lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Slacks&lt;br /&gt;
|✅ r44&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Map Mods&lt;br /&gt;
!Map&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Spider Dungeon&lt;br /&gt;
|✅ r44&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Species/Transformation Mods&lt;br /&gt;
!Map&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Wolf TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Giraffe TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Pig TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Crotchhugger TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(I haven&#039;t had time to test every mod yet -- feel free to expand this status list :))&lt;br /&gt;
&lt;br /&gt;
All mods are planned to be working again in future.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding_Status&amp;diff=1245</id>
		<title>Modding Status</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding_Status&amp;diff=1245"/>
		<updated>2026-01-31T01:37:01Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Mod &amp;lt;-&amp;gt; Mod communication re-implemented&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The modding system is being ported over to the new engine.  Here&#039;s a guide of what mod features have been implemented as of r45.&lt;br /&gt;
&lt;br /&gt;
== Overall Features Status ==&lt;br /&gt;
Currently implemented:&lt;br /&gt;
&lt;br /&gt;
* Simple monster mods (like [https://skycorp.global/skyscript/sclab.php SCLab] creates)&lt;br /&gt;
* Wyvern TF&lt;br /&gt;
*Advanced Monster Mods (including Wyvern doms)&lt;br /&gt;
*Entities&lt;br /&gt;
*Clothing&lt;br /&gt;
*Maps&lt;br /&gt;
*Custom species / transformation mods&lt;br /&gt;
*Mod &amp;lt;-&amp;gt; Mod communication&lt;br /&gt;
&lt;br /&gt;
Currently not implemented:&lt;br /&gt;
&lt;br /&gt;
* A few uncommonly used LUA features:&lt;br /&gt;
**Metatables&lt;br /&gt;
&lt;br /&gt;
== Specific Mod Status ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Monster Mods&lt;br /&gt;
&lt;br /&gt;
!Monster&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Wolf Girl&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Sholf&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|CrotchHugger&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Bolstered Dragon Disciple&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Wyvern Male&lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Wyvern Shemale (new variant) &lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Sample: Monster Advanced Example&lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Male Spider&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Kitsune&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Potent Dragon Servant&lt;br /&gt;
|✅&lt;br /&gt;
|-&lt;br /&gt;
|Pig King&lt;br /&gt;
|✅&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Clothing Mods&lt;br /&gt;
!Clothing&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Weight Pendant&lt;br /&gt;
|✅ r44&lt;br /&gt;
|-&lt;br /&gt;
|Slacks&lt;br /&gt;
|✅ r44&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Map Mods&lt;br /&gt;
!Map&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Spider Dungeon&lt;br /&gt;
|✅ r44&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Species/Transformation Mods&lt;br /&gt;
!Map&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
|Wolf TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Giraffe TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Pig TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|-&lt;br /&gt;
|Crotchhugger TF&lt;br /&gt;
|✅ r45&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(I haven&#039;t had time to test every mod yet -- feel free to expand this status list :))&lt;br /&gt;
&lt;br /&gt;
All mods are planned to be working again in future.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Map&amp;diff=1244</id>
		<title>Modding:Map</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Map&amp;diff=1244"/>
		<updated>2026-01-29T02:56:02Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Bunch of new map functions!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Map getMap(string mapName) ===&lt;br /&gt;
Gets map object from map name (string).  Returns null if map with that name can not be found. &lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== boolean addItem([[Entity]] entity, int roomID) ===&lt;br /&gt;
Attempt adding entity to roomID.&lt;br /&gt;
&lt;br /&gt;
More performant to use entity&#039;s &lt;br /&gt;
&lt;br /&gt;
Called during drop item, could also be used to drop new items/loot/etc&lt;br /&gt;
&lt;br /&gt;
=== boolean deleteItem([[Entity]] entity) ===&lt;br /&gt;
Attempt removing an item from anywhere in the map &lt;br /&gt;
&lt;br /&gt;
Called from pickup.  Could also be used to destroy an item in a room.&lt;br /&gt;
&lt;br /&gt;
=== string getRoomName(int roomID) ===&lt;br /&gt;
Gets name of room.  If no such room, returns &amp;quot;INVALID ROOM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== [[Entity]] getNamedEntityInRoom(string entityName, int roomID) ===&lt;br /&gt;
If the map has the named entity in the given roomID, return it.  Else null.&lt;br /&gt;
&lt;br /&gt;
=== [[Entity]] getEntityInRoomByType(class entityClass, int roomID) ===&lt;br /&gt;
TODO - not yet hooked up, need to figure out how to best pass class information between AS3/LUA.&lt;br /&gt;
&lt;br /&gt;
=== void setTagBoolean(int roomID, string tag, boolean enabled) ===&lt;br /&gt;
Sets a tag for a room which can be useful for classifying rooms or applying special properties.&lt;br /&gt;
&lt;br /&gt;
This version will set the tag to be either True or False (this system could be expanded in future to allow for string or other object storage inside tags)&lt;br /&gt;
&lt;br /&gt;
Tags are used in a number of game locations to keep track of types of places.  For instance, in the strip club, it is used to tag rooms where the patrons can see the player.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* roomID: room to change&lt;br /&gt;
* tag: tag name to change&lt;br /&gt;
* enabled: what to set tag state to (true/false)  (false is same as unset)&lt;br /&gt;
&lt;br /&gt;
=== boolean getTagBoolean(int roomID, string tag) ===&lt;br /&gt;
Gets a boolean tag for a certain room.  False if room or tag does not exist, or is set to false.  True if it exists and is set to true.&lt;br /&gt;
&lt;br /&gt;
=== int getRoomIDOfEntity([[Entity]] entity) ===&lt;br /&gt;
Which room is a particular entity in?  If not found, then 0&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Name of the map&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] createLocation(int roomID) ===&lt;br /&gt;
Returns the Location for a particular roomID on this map.  Does not check the room ID actually exists.&lt;br /&gt;
&lt;br /&gt;
(Introduced in r26)&lt;br /&gt;
&lt;br /&gt;
=== void setupRoomIfNeeded(int roomID) ===&lt;br /&gt;
For better performance, the contents of a room is not typically loaded into memory until the player has visited it.  This means the entities there are not accessible by code.  This function can be called to load the contents of the room into memory without the player having to visit it.  &lt;br /&gt;
&lt;br /&gt;
Calling this function will have no effect on non-existent rooms or already loaded rooms.&lt;br /&gt;
&lt;br /&gt;
(Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
=== bool isRoomSetup(int roomID) ===&lt;br /&gt;
Checks to see if the target room ID is loaded. &lt;br /&gt;
&lt;br /&gt;
(Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:Entity|Entity]][] getAllEntitiesInRoom(int roomID) ===&lt;br /&gt;
Returns a list of all the entities in a given room.  Returns empty list if nothing inside the room.  Returns null if room is not yet loaded (see setupRoomIfNeeded)&lt;br /&gt;
&lt;br /&gt;
Example code:  [https://skycorp.global/skyscript/mods/v/93/sample-list-entities-in-room List all entities in room]&lt;br /&gt;
&lt;br /&gt;
(Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:Entity|Entity]][] findEntitiesByNameSlow(string name, bool caseSensitive = true, [[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Attempts to find all entities with a particular name.  It&#039;s usually safer to find an entity based on type (though as of r56.1 this hasn&#039;t been exposed yet) as names are subject to change.&lt;br /&gt;
&lt;br /&gt;
Returns all the entities with that name on the map.&lt;br /&gt;
&lt;br /&gt;
(Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:Entity|Entity]] findEntityByNameSlow(string name, bool caseSensitive = true, [[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Attempts to find an entity based on name.  It&#039;s usually safer to find an entity based on type (though as of r56.1 this hasn&#039;t been exposed yet) as names are subject to change.&lt;br /&gt;
&lt;br /&gt;
Returns the first entity with that name on the map.&lt;br /&gt;
&lt;br /&gt;
(Introduced in r56.1)&lt;br /&gt;
&lt;br /&gt;
=== table&amp;lt;character, [[Modding:Location|Location]]&amp;gt; getExits(int roomID) ===&lt;br /&gt;
Gets a table containing the exits for a particular room.  If no such room, returns null.  Otherwise, the character will be a cardinal direction abbreviation such as &#039;n&#039;, &#039;w&#039;, &#039;e&#039;, &#039;s&#039;.  The location will be the linked location -- it may be on another map.&lt;br /&gt;
&lt;br /&gt;
Example code:  [https://skycorp.global/skyscript/mods/v/94/sample-list-room-exits List room exits]&lt;br /&gt;
&lt;br /&gt;
(Introduced in r56.1)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:CardinalDirection&amp;diff=1243</id>
		<title>Modding:CardinalDirection</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:CardinalDirection&amp;diff=1243"/>
		<updated>2026-01-29T02:40:08Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Add parseFromCharacter()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:LUA Class Reference]]&lt;br /&gt;
This represents a specific map direction&lt;br /&gt;
&lt;br /&gt;
== Static values ==&lt;br /&gt;
Each of these is a CardinalDirection:&lt;br /&gt;
&lt;br /&gt;
* NORTH&lt;br /&gt;
* EAST&lt;br /&gt;
* SOUTH&lt;br /&gt;
* WEST&lt;br /&gt;
* WAIT (for pathfinding, route might still be calculating)&lt;br /&gt;
* UNKNOWN (for pathfinding, cannot route to destination)&lt;br /&gt;
&lt;br /&gt;
== Static methods ==&lt;br /&gt;
&lt;br /&gt;
=== static CardinalDirection parseDirection(string text) ===&lt;br /&gt;
Translate a string such as &amp;quot;NORTH&amp;quot; to CardinalDirection.North&lt;br /&gt;
&lt;br /&gt;
Case sensitive.&lt;br /&gt;
&lt;br /&gt;
=== static CardinalDirection parseFromCharacter(character text) ===&lt;br /&gt;
Translate a character such as &amp;quot;N&amp;quot; to CardinalDirection.North&lt;br /&gt;
&lt;br /&gt;
(Note, lua does not actually have a character type, so this is just a normal one character long string.)&lt;br /&gt;
&lt;br /&gt;
Case insensitive.&lt;br /&gt;
&lt;br /&gt;
== Public methods ==&lt;br /&gt;
&lt;br /&gt;
=== string toString() ===&lt;br /&gt;
Translates a cardinal direction object to an upper case string&lt;br /&gt;
&lt;br /&gt;
=== CardinalDirection clockwise() ===&lt;br /&gt;
Gets the direction clockwise from this direction&lt;br /&gt;
&lt;br /&gt;
=== CardinalDirection counterClockwise() ===&lt;br /&gt;
Gets the direction counter-clockwise from this direction&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1242</id>
		<title>Modding:Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1242"/>
		<updated>2026-01-29T00:54:30Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: add return type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Entity generate(string entityName) ===&lt;br /&gt;
Generate a new entity of the given type based on the [[Types of Entities|entity type string]].  Null if unknown entity.&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets name of entity&lt;br /&gt;
&lt;br /&gt;
=== string getLookDesc() ===&lt;br /&gt;
Gets look description(the text displayed when looking at item)&lt;br /&gt;
&lt;br /&gt;
=== boolean isExaminable() ===&lt;br /&gt;
Allow player to examine object?  If so, the item is shown in the room item list.  Otherwise, the object is invisible&lt;br /&gt;
&lt;br /&gt;
=== boolean isAttackable() ===&lt;br /&gt;
Is player allowed to (attempt) to do an attack on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isUseable() ===&lt;br /&gt;
Is player shown a use button on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isPickupable() ===&lt;br /&gt;
Should object display a pick-up option if not yet in inventory?  May or may not *actually* be pickupable.  To do / attempt to do a pickup, use the [[Player]] class.&lt;br /&gt;
&lt;br /&gt;
=== boolean isDropable()    ===&lt;br /&gt;
Should object display a drop item button if is in inventory?   May or may not *actually* be dropable.  Use [[Player]] class to make the actual attempt.&lt;br /&gt;
&lt;br /&gt;
=== void deleteEntity() ===&lt;br /&gt;
Removes entity from either the inventory or room that it exists in.&lt;br /&gt;
&lt;br /&gt;
=== boolean isPlayerHere() ===&lt;br /&gt;
If entity is in world, is the player in this same room?&lt;br /&gt;
&lt;br /&gt;
=== int isPlayerAdjacent() ===&lt;br /&gt;
If entity is in the world, is the player in a room adjacent to the one entity is in?  If so, which room ID?&lt;br /&gt;
&lt;br /&gt;
If not, room ID is 0.  If player is in the same room, then room ID 0 is also returned.&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Gets location of this entity.  Returns null if entity is in inventory, or otherwise not in world.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntity(string newMapName:String, int newRoomID) ===&lt;br /&gt;
Moves entity from whereever it is (including inventory) into a particular location.  If picking up the item, should use the functions on the Player class instead.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityAdjacent([[Modding:CardinalDirection|CardinalDirection]] cardinalDirection, bool quiet = false) ===&lt;br /&gt;
Moves the entity to the adjacent room.Moves entity to new location.&lt;br /&gt;
&lt;br /&gt;
If quiet is false, then it will announce the move to player if they are in entering or leaving room.&lt;br /&gt;
&lt;br /&gt;
Exposed in r56.1&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityToSameRoomAsPlayer() ===&lt;br /&gt;
Move entity from wherever it is (including inventory) into the same room as the player is in.&lt;br /&gt;
&lt;br /&gt;
=== void makeCursed() ===&lt;br /&gt;
Marks this entity as cursed.  In order for this to have any effect, you should write a custom function for playerAttemptDropCheck.&lt;br /&gt;
&lt;br /&gt;
Generally this would be called on start-up.  Curse status can be modified by NPCs that can perform purification.&lt;br /&gt;
&lt;br /&gt;
See [[Weight Pendant]] for an example of cursed items.&lt;br /&gt;
&lt;br /&gt;
=== boolean getCursed() ===&lt;br /&gt;
Is this entity cursed?&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:BodyDescription|BodyDescription]] getBodyDescription() ===&lt;br /&gt;
Gets body description for this npc -- may be nil if no body description has been set.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== setBodyDescription([[Modding:BodyDescription|BodyDescription]] bodyDescription) ===&lt;br /&gt;
Sets/overwrites body description for this npc.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== Default versions of functions ===&lt;br /&gt;
These are useful for calling if you want to do some logic first, and then fall back to the usual monster logic.&lt;br /&gt;
&lt;br /&gt;
==== string defaultGetName([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ====&lt;br /&gt;
As of r56.1, this is mostly useful to advanced monster mods, but is available to all entities.  (Entities currently have no way to set the initial name value, so calling the default get name will just return &amp;quot;uninitialized entity&amp;quot;.  It is useful for advanced monster mods since they can set the name via &#039;initialValues&#039; and thus access when UI name is supposed to be sleeping, etc.)&lt;br /&gt;
&lt;br /&gt;
==== void defaultAddEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ====&lt;br /&gt;
Adds commonly needed option to the passed dynamicOptions object for the entity look scene (pick-up, back button, attack, etc.)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1241</id>
		<title>Modding:Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1241"/>
		<updated>2026-01-28T02:50:31Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Expose Entity.moveEntityAdjacent(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Entity generate(string entityName) ===&lt;br /&gt;
Generate a new entity of the given type based on the [[Types of Entities|entity type string]].  Null if unknown entity.&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets name of entity&lt;br /&gt;
&lt;br /&gt;
=== string getLookDesc() ===&lt;br /&gt;
Gets look description(the text displayed when looking at item)&lt;br /&gt;
&lt;br /&gt;
=== boolean isExaminable() ===&lt;br /&gt;
Allow player to examine object?  If so, the item is shown in the room item list.  Otherwise, the object is invisible&lt;br /&gt;
&lt;br /&gt;
=== boolean isAttackable() ===&lt;br /&gt;
Is player allowed to (attempt) to do an attack on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isUseable() ===&lt;br /&gt;
Is player shown a use button on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isPickupable() ===&lt;br /&gt;
Should object display a pick-up option if not yet in inventory?  May or may not *actually* be pickupable.  To do / attempt to do a pickup, use the [[Player]] class.&lt;br /&gt;
&lt;br /&gt;
=== boolean isDropable()    ===&lt;br /&gt;
Should object display a drop item button if is in inventory?   May or may not *actually* be dropable.  Use [[Player]] class to make the actual attempt.&lt;br /&gt;
&lt;br /&gt;
=== void deleteEntity() ===&lt;br /&gt;
Removes entity from either the inventory or room that it exists in.&lt;br /&gt;
&lt;br /&gt;
=== boolean isPlayerHere() ===&lt;br /&gt;
If entity is in world, is the player in this same room?&lt;br /&gt;
&lt;br /&gt;
=== int isPlayerAdjacent() ===&lt;br /&gt;
If entity is in the world, is the player in a room adjacent to the one entity is in?  If so, which room ID?&lt;br /&gt;
&lt;br /&gt;
If not, room ID is 0.  If player is in the same room, then room ID 0 is also returned.&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Gets location of this entity.  Returns null if entity is in inventory, or otherwise not in world.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntity(string newMapName:String, int newRoomID) ===&lt;br /&gt;
Moves entity from whereever it is (including inventory) into a particular location.  If picking up the item, should use the functions on the Player class instead.&lt;br /&gt;
&lt;br /&gt;
=== moveEntityAdjacent([[Modding:CardinalDirection|CardinalDirection]] cardinalDirection, bool quiet = false) ===&lt;br /&gt;
Moves the entity to the adjacent room.Moves entity to new location.&lt;br /&gt;
&lt;br /&gt;
If quiet is false, then it will announce the move to player if they are in entering or leaving room.&lt;br /&gt;
&lt;br /&gt;
Exposed in r56.1&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityToSameRoomAsPlayer() ===&lt;br /&gt;
Move entity from wherever it is (including inventory) into the same room as the player is in.&lt;br /&gt;
&lt;br /&gt;
=== void makeCursed() ===&lt;br /&gt;
Marks this entity as cursed.  In order for this to have any effect, you should write a custom function for playerAttemptDropCheck.&lt;br /&gt;
&lt;br /&gt;
Generally this would be called on start-up.  Curse status can be modified by NPCs that can perform purification.&lt;br /&gt;
&lt;br /&gt;
See [[Weight Pendant]] for an example of cursed items.&lt;br /&gt;
&lt;br /&gt;
=== boolean getCursed() ===&lt;br /&gt;
Is this entity cursed?&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:BodyDescription|BodyDescription]] getBodyDescription() ===&lt;br /&gt;
Gets body description for this npc -- may be nil if no body description has been set.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== setBodyDescription([[Modding:BodyDescription|BodyDescription]] bodyDescription) ===&lt;br /&gt;
Sets/overwrites body description for this npc.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== Default versions of functions ===&lt;br /&gt;
These are useful for calling if you want to do some logic first, and then fall back to the usual monster logic.&lt;br /&gt;
&lt;br /&gt;
==== string defaultGetName([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ====&lt;br /&gt;
As of r56.1, this is mostly useful to advanced monster mods, but is available to all entities.  (Entities currently have no way to set the initial name value, so calling the default get name will just return &amp;quot;uninitialized entity&amp;quot;.  It is useful for advanced monster mods since they can set the name via &#039;initialValues&#039; and thus access when UI name is supposed to be sleeping, etc.)&lt;br /&gt;
&lt;br /&gt;
==== void defaultAddEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ====&lt;br /&gt;
Adds commonly needed option to the passed dynamicOptions object for the entity look scene (pick-up, back button, attack, etc.)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:CardinalDirection&amp;diff=1240</id>
		<title>Modding:CardinalDirection</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:CardinalDirection&amp;diff=1240"/>
		<updated>2026-01-28T02:47:36Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: CardinalDirection exposed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:LUA Class Reference]]&lt;br /&gt;
This represents a specific map direction&lt;br /&gt;
&lt;br /&gt;
== Static values ==&lt;br /&gt;
Each of these is a CardinalDirection:&lt;br /&gt;
&lt;br /&gt;
* NORTH&lt;br /&gt;
* EAST&lt;br /&gt;
* SOUTH&lt;br /&gt;
* WEST&lt;br /&gt;
* WAIT (for pathfinding, route might still be calculating)&lt;br /&gt;
* UNKNOWN (for pathfinding, cannot route to destination)&lt;br /&gt;
&lt;br /&gt;
== Static methods ==&lt;br /&gt;
&lt;br /&gt;
=== static CardinalDirection parseDirection(string text) ===&lt;br /&gt;
Translate a string such as &amp;quot;NORTH&amp;quot; to CardinalDirection.North&lt;br /&gt;
&lt;br /&gt;
Case sensitive.&lt;br /&gt;
&lt;br /&gt;
== Public methods ==&lt;br /&gt;
&lt;br /&gt;
=== string toString() ===&lt;br /&gt;
Translates a cardinal direction object to an upper case string&lt;br /&gt;
&lt;br /&gt;
=== CardinalDirection clockwise() ===&lt;br /&gt;
Gets the direction clockwise from this direction&lt;br /&gt;
&lt;br /&gt;
=== CardinalDirection counterClockwise() ===&lt;br /&gt;
Gets the direction counter-clockwise from this direction&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:NPCPathfindingLogic&amp;diff=1239</id>
		<title>Modding:NPCPathfindingLogic</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:NPCPathfindingLogic&amp;diff=1239"/>
		<updated>2026-01-28T02:42:45Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Pathfinding exposed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;br /&gt;
This class can perform pathfinding logic and store the result.  This variant is specifically designed for NPCs and other entities and can be used for them to path to other objects, locations, or the player.&lt;br /&gt;
&lt;br /&gt;
Example code:  Pathfinding Sample&lt;br /&gt;
&lt;br /&gt;
== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== NPCPathfindingLogic generate([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
Creates new pathfinding.&lt;br /&gt;
&lt;br /&gt;
entity - the entity which is using this to pathfind somewhere.  (This will be used to determine the start of the path, and will be automatically updated as the entity moves around the map(s))&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== void setDestination([[Modding:Location|Location]] destination) ===&lt;br /&gt;
Sets the place to navigate to.  It is recommended to call this again anytime before getting the next direction (before moving).  It will not incur a performance penalty to call it if the destination hasn&#039;t changed.&lt;br /&gt;
&lt;br /&gt;
Okay to be nil if no destination.&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:CardinalDirection|CardinalDirection]] getNextDirection() ===&lt;br /&gt;
Calculate the route and determine the next direction this NPC would need to take to get there.  An existing path is preferred as long as it is still valid.&lt;br /&gt;
&lt;br /&gt;
It is capable of routing between multiple maps, if there is a path to do so.&lt;br /&gt;
&lt;br /&gt;
=== int getRemainingDistance() ===&lt;br /&gt;
How many rooms distant is the destination from the NPC?  Note, this does not update remaining distance, it only gets it as of the last move.&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Scene&amp;diff=1238</id>
		<title>Modding:Scene</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Scene&amp;diff=1238"/>
		<updated>2026-01-22T03:00:20Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Add to LUA Class Reference category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A scene object is the representation of being able to receive button inputs and display text based on those inputs.  &lt;br /&gt;
&lt;br /&gt;
= Exposed methods =&lt;br /&gt;
Mods do not (currently) directly modify scene objects, so no methods are (currently) exposed.&lt;br /&gt;
&lt;br /&gt;
= Scene management =&lt;br /&gt;
You may trigger these scenes via [[Modding:MainScreen|MainScreen]]:&lt;br /&gt;
&lt;br /&gt;
* MapScene for moving around the world&lt;br /&gt;
* EntityLookScene for inspecting an object/enemy&lt;br /&gt;
* SimpleDynamicOptions lets you introduce your own scene logic&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Scene&amp;diff=1237</id>
		<title>Modding:Scene</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Scene&amp;diff=1237"/>
		<updated>2026-01-22T02:59:50Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Some info on Scene&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A scene object is the representation of being able to receive button inputs and display text based on those inputs.  &lt;br /&gt;
&lt;br /&gt;
= Exposed methods =&lt;br /&gt;
Mods do not (currently) directly modify scene objects, so no methods are (currently) exposed.&lt;br /&gt;
&lt;br /&gt;
= Scene management =&lt;br /&gt;
You may trigger these scenes via [[Modding:MainScreen|MainScreen]]:&lt;br /&gt;
&lt;br /&gt;
* MapScene for moving around the world&lt;br /&gt;
* EntityLookScene for inspecting an object/enemy&lt;br /&gt;
* SimpleDynamicOptions lets you introduce your own scene logic&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1236</id>
		<title>Modding:Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1236"/>
		<updated>2026-01-22T02:53:07Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Added defaultAddEntityLookOptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Entity generate(string entityName) ===&lt;br /&gt;
Generate a new entity of the given type based on the [[Types of Entities|entity type string]].  Null if unknown entity.&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets name of entity&lt;br /&gt;
&lt;br /&gt;
=== string getLookDesc() ===&lt;br /&gt;
Gets look description(the text displayed when looking at item)&lt;br /&gt;
&lt;br /&gt;
=== boolean isExaminable() ===&lt;br /&gt;
Allow player to examine object?  If so, the item is shown in the room item list.  Otherwise, the object is invisible&lt;br /&gt;
&lt;br /&gt;
=== boolean isAttackable() ===&lt;br /&gt;
Is player allowed to (attempt) to do an attack on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isUseable() ===&lt;br /&gt;
Is player shown a use button on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isPickupable() ===&lt;br /&gt;
Should object display a pick-up option if not yet in inventory?  May or may not *actually* be pickupable.  To do / attempt to do a pickup, use the [[Player]] class.&lt;br /&gt;
&lt;br /&gt;
=== boolean isDropable()    ===&lt;br /&gt;
Should object display a drop item button if is in inventory?   May or may not *actually* be dropable.  Use [[Player]] class to make the actual attempt.&lt;br /&gt;
&lt;br /&gt;
=== void deleteEntity() ===&lt;br /&gt;
Removes entity from either the inventory or room that it exists in.&lt;br /&gt;
&lt;br /&gt;
=== boolean isPlayerHere() ===&lt;br /&gt;
If entity is in world, is the player in this same room?&lt;br /&gt;
&lt;br /&gt;
=== int isPlayerAdjacent() ===&lt;br /&gt;
If entity is in the world, is the player in a room adjacent to the one entity is in?  If so, which room ID?&lt;br /&gt;
&lt;br /&gt;
If not, room ID is 0.  If player is in the same room, then room ID 0 is also returned.&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Gets location of this entity.  Returns null if entity is in inventory, or otherwise not in world.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntity(string newMapName:String, int newRoomID) ===&lt;br /&gt;
Moves entity from whereever it is (including inventory) into a particular location.  If picking up the item, should use the functions on the Player class instead.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityToSameRoomAsPlayer() ===&lt;br /&gt;
Move entity from wherever it is (including inventory) into the same room as the player is in.&lt;br /&gt;
&lt;br /&gt;
=== void makeCursed() ===&lt;br /&gt;
Marks this entity as cursed.  In order for this to have any effect, you should write a custom function for playerAttemptDropCheck.&lt;br /&gt;
&lt;br /&gt;
Generally this would be called on start-up.  Curse status can be modified by NPCs that can perform purification.&lt;br /&gt;
&lt;br /&gt;
See [[Weight Pendant]] for an example of cursed items.&lt;br /&gt;
&lt;br /&gt;
=== boolean getCursed() ===&lt;br /&gt;
Is this entity cursed?&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:BodyDescription|BodyDescription]] getBodyDescription() ===&lt;br /&gt;
Gets body description for this npc -- may be nil if no body description has been set.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== setBodyDescription([[Modding:BodyDescription|BodyDescription]] bodyDescription) ===&lt;br /&gt;
Sets/overwrites body description for this npc.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== Default versions of functions ===&lt;br /&gt;
These are useful for calling if you want to do some logic first, and then fall back to the usual monster logic.&lt;br /&gt;
&lt;br /&gt;
==== string defaultGetName([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ====&lt;br /&gt;
As of r56.1, this is mostly useful to advanced monster mods, but is available to all entities.  (Entities currently have no way to set the initial name value, so calling the default get name will just return &amp;quot;uninitialized entity&amp;quot;.  It is useful for advanced monster mods since they can set the name via &#039;initialValues&#039; and thus access when UI name is supposed to be sleeping, etc.)&lt;br /&gt;
&lt;br /&gt;
==== void defaultAddEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ====&lt;br /&gt;
Adds commonly needed option to the passed dynamicOptions object for the entity look scene (pick-up, back button, attack, etc.)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1235</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1235"/>
		<updated>2026-01-22T02:47:10Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== addEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ===&lt;br /&gt;
Provides a mechanism to add additional buttons (or completely change the buttons) on the entity look scene -- which is the scene shown when you examine an item or npc.&lt;br /&gt;
&lt;br /&gt;
Usually you would want to call &amp;lt;code&amp;gt;this.defaultAddEntityLookOptions(dynamicOptions, returnScene);&amp;lt;/code&amp;gt; to also include the normal buttons (pick up, back, etc).&lt;br /&gt;
* The return scene is the scene that is intended for the user to return to on pressing &#039;back&#039; (usually map scene).&lt;br /&gt;
* dynamicOptions can be modified via its function call to add new options.&lt;br /&gt;
&lt;br /&gt;
Sample:  [https://skycorp.global/skyscript/mods/v/92/sample-entity-with-extra-look-buttons Entity with extra look options]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1234</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1234"/>
		<updated>2026-01-22T02:45:46Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Fix formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== addEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ===&lt;br /&gt;
Provides a mechanism to add additional buttons (or completely change the buttons) on the entity look scene -- which is the scene shown when you examine an item or npc.&lt;br /&gt;
&lt;br /&gt;
Usually you would want to call &amp;lt;pre&amp;gt;this.defaultAddEntityLookOptions(dynamicOptions, returnScene);&amp;lt;/pre&amp;gt; to also include the normal buttons (pick up, back, etc). &lt;br /&gt;
&lt;br /&gt;
* The return scene is the scene that is intended for the user to return to on pressing &#039;back&#039; (usually map scene).&lt;br /&gt;
* dynamicOptions can be modified via its function call to add new options.&lt;br /&gt;
&lt;br /&gt;
Sample:  [https://skycorp.global/skyscript/mods/v/92/sample-entity-with-extra-look-buttons Entity with extra look options]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1233</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1233"/>
		<updated>2026-01-22T02:44:17Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: /* addEntityLookOptions(DynamicOptions dynamicOptions, Scene returnScene) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== addEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ===&lt;br /&gt;
Provides a mechanism to add additional buttons (or completely change the buttons) on the entity look scene -- which is the scene shown when you examine an item or npc.&lt;br /&gt;
&lt;br /&gt;
Usually you would want to call `this.defaultAddEntityLookOptions(dynamicOptions, returnScene);` to also include the normal buttons (pick up, back, etc). &lt;br /&gt;
&lt;br /&gt;
- The return scene is the scene that is intended for the user to return to on pressing &#039;back&#039; (usually map scene).&lt;br /&gt;
- dynamicOptions can be modified via its function call to add new options.&lt;br /&gt;
&lt;br /&gt;
Sample:  [https://skycorp.global/skyscript/mods/v/92/sample-entity-with-extra-look-buttons Entity with extra look options]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1232</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1232"/>
		<updated>2026-01-22T02:43:01Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Fix formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== addEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ===&lt;br /&gt;
Provides a mechanism to add additional buttons (or completely change the buttons) on the entity look scene -- which is the scene shown when you examine an item or npc.&lt;br /&gt;
&lt;br /&gt;
The return scene is the scene that is intended for the user to return to on pressing &#039;back&#039; (usually map scene).&lt;br /&gt;
dynamicOptions can be modified via its function call to add new options.&lt;br /&gt;
&lt;br /&gt;
Sample:  [https://skycorp.global/skyscript/mods/v/92/sample-entity-with-extra-look-buttons Entity with extra look options]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1231</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1231"/>
		<updated>2026-01-22T02:42:03Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: New Dynamic field: addEntityLookOptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== addEntityLookOptions([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions, [[Modding:Scene|Scene]] returnScene) ===&lt;br /&gt;
Provides a mechanism to add additional buttons (or completely change the buttons) on the entity look scene -- which is the scene shown when you examine an item or npc.&lt;br /&gt;
The return scene is the scene that is intended for the user to return to on pressing &#039;back&#039; (usually map scene).&lt;br /&gt;
dynamicOptions can be modified via its function call to add new options.&lt;br /&gt;
Sample:  [https://skycorp.global/skyscript/mods/v/92/sample-entity-with-extra-look-buttons Entity with extra look options]&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1230</id>
		<title>Modding:MainScreen</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1230"/>
		<updated>2026-01-16T00:46:40Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Link some sample code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static void addGameText(string gameText) ===&lt;br /&gt;
Output string to screen.  Does not automatically add newlines.&lt;br /&gt;
&lt;br /&gt;
Unlike io.write, will only accept one string parameter, making it useful to get around the [[LUA Implementation Limitations &amp;amp; Notes|LUFA garbage array bug]].&lt;br /&gt;
&lt;br /&gt;
=== static void continueSceneToMapScene() ===&lt;br /&gt;
Removes screen buttons (but not shown text).  Will display one &#039;continue&#039; button, which when pressed, will redirect flow back to the map (/ player navigation).  This is a shortcut into the game&#039;s scene flow control that handles most cases, but for instance, if you wanted to continue then go to somewhere else, you should bug Skye to expose the full scene control system.&lt;br /&gt;
&lt;br /&gt;
Added in r35&lt;br /&gt;
&lt;br /&gt;
=== static void changeToForcedTransformationScene(string prefix, [[Modding:Species|Species]] species, bool allowEscape = true, function switchSceneAfterTransformationSequence = null, function teleportPlayerOnFinish = true, bool resetLustHP = true, function customOutputFunction = null, bool withContinueScene = true) ===&lt;br /&gt;
Using this, you can play the forced transformation sequence scene.  This is primarily useful if you are doing a forced transformation sequence that should be triggered from customized monster logic (ex: not normal defeat logic) or triggered from an arbitrary object.&lt;br /&gt;
&lt;br /&gt;
[https://skycorp.global/skyscript/mods/v/90/sample-fox-painting Sample code]&lt;br /&gt;
&lt;br /&gt;
Note there are several other methods you may want to consider instead of this:&lt;br /&gt;
&lt;br /&gt;
* If you just want to cause a single body part to be transformed at a time, see [[Modding:Species#void causeTF()|causeTF()]]&lt;br /&gt;
* If you do want a multi-step tf sequence, and are already triggering this on player defeat to a monster, you probably want to use the normal player defeat logic.  This will also check to see if the player is TF&#039;able before trying to TF the player, as well as updating the monster&#039;s state to sleep, and inseminating the player if configured.  You can trigger this logic on defeat by either&lt;br /&gt;
** Not defining the doMonsterVictory function in the json, or&lt;br /&gt;
** Defining the doMonsterVictory function, but inside your custom function, calling doMonsterVictoryDefault() to do normal logic&lt;br /&gt;
&lt;br /&gt;
If you do want to call this function, then you&#039;ll need to define the following text variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_PLAYER_DEFEAT&lt;br /&gt;
|Initial text shown to player on defeat&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTIME&lt;br /&gt;
|Text shown every step player is being tf&#039;ed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTOTAL&lt;br /&gt;
|Text shown at conclusion of tf&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_SUCCESS&lt;br /&gt;
|Player tried to escape, and did&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_FAILURE&lt;br /&gt;
|Player tried to escape, but failed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFACCEPT&lt;br /&gt;
|Player did not try to escape / accepted the tf&lt;br /&gt;
|}&lt;br /&gt;
Function parameters:&lt;br /&gt;
&lt;br /&gt;
==== string prefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Species|Species]] species ====&lt;br /&gt;
Which TF is being done&lt;br /&gt;
&lt;br /&gt;
==== bool allowEscape = true ====&lt;br /&gt;
If escape is possible.  Button will still be shown, but it will be impossible to escape regardless of lust level.&lt;br /&gt;
&lt;br /&gt;
==== function switchSceneAfterTransformationSequenceScript = null ====&lt;br /&gt;
This can be used to transition to a different scene after the sequence, instead of back to the normal mapscene.&lt;br /&gt;
&lt;br /&gt;
If not null, called to determine logic for switching scene.  (If not set, just goes back to mapscene).  The bool indicates if the full tf played out (false if the player escaped mid-tf)&lt;br /&gt;
&lt;br /&gt;
(Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== function teleportPlayerOnFinish = true ====&lt;br /&gt;
Whether to teleport player to a respawn position after the sequence finishes&lt;br /&gt;
&lt;br /&gt;
==== bool resetLustHP = true ====&lt;br /&gt;
On full tf: whether to reset lust + hp.&lt;br /&gt;
&lt;br /&gt;
On early escape: whether to reset lust.&lt;br /&gt;
&lt;br /&gt;
==== function customOutputFunctionScript = null ====&lt;br /&gt;
If set, this function is called with the text key suffix each tf instead of outputting monsterPrefix+suffix text.  (Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene = true ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToClaimOwnershipScene([[Modding:Entity|Entity]] potentialOwner, string textPrefix, bool withContinueScene, bool sleepAfterward, function customAfterSceneScript = null) ===&lt;br /&gt;
Transitions to the claim ownership scene -- a scene that displays some intro text, information about the entity (presumably a dom/monster, but can be any entity), and then offers the player the ability to accept or reject them as their new owner.  This scene already performs logic for handling if player is already owned by another dom and includes preset text variables.&lt;br /&gt;
&lt;br /&gt;
You don&#039;t need to re-define text variables for this function (most monsters currently don&#039;t), but if you wish to, you should redefine these:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_START&lt;br /&gt;
|Initial text, shown regardless of whether player has been claimed by some other dom or not.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED&lt;br /&gt;
|After the initial text, the NPC will check if player is owned by someone else.  There are multiple ways for this detection to happen, and this particular field overrides all of them.&lt;br /&gt;
If player is already owned by another dom, this text can be optionally defined if the NPC has some unusual way of identifying ownership over the player.  Generally though it&#039;s safe to leave this undefined, and one of the standard identification methods below will be used instead.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_SMELL&lt;br /&gt;
|If your dom can be smelled by any other dom&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_SLAVE&lt;br /&gt;
|Slave collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_PET&lt;br /&gt;
|Pet collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_GENERIC&lt;br /&gt;
|Generic fallback if none of the above apply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_DETECT_END&lt;br /&gt;
|The above detection text is then followed by this&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_OK&lt;br /&gt;
|Scene for player accepting ownership&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_RESIST&lt;br /&gt;
|Scene for player rejecting ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Entity|Entity]] potentialOwner ====&lt;br /&gt;
The entity (probably a monster) who is trying to claim ownership over player&lt;br /&gt;
&lt;br /&gt;
==== string textPrefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
==== bool sleepAfterward ====&lt;br /&gt;
If true, monster will go to sleep after this scene.  (This is ignored if customAfterSceneScript parameter is defined)&lt;br /&gt;
&lt;br /&gt;
==== function customAfterSceneScript = null ====&lt;br /&gt;
Instead of doing default scene handling and going back to map, this function can be called instead.  This lets you do some other scene or action instead.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToSimpleDynamicOptionsScene([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions) ===&lt;br /&gt;
Changes to simple dynamic options scene.&lt;br /&gt;
&lt;br /&gt;
Unlike many other types of scenes, Simple Dynamic Options is similar to a &#039;continue&#039; scene.  That is, it will not clear text from the UI by itself.  Furthermore (and unlike a continue scene), it also does not clear existing buttons by itself.  It will, however, immediately add any buttons registered with the dynamic options object.&lt;br /&gt;
&lt;br /&gt;
Sample: [https://skycorp.global/skyscript/mods/v/91/sample-dynamic-options-example DynamicOptionsExample]&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void resetUI(bool buttonsOnly=false) ===&lt;br /&gt;
Clears all text &amp;amp; buttons from user interface (make sure to add buttons back using some mechanism, or user will be stuck!)&lt;br /&gt;
&lt;br /&gt;
If buttonsOnly is set, then only buttons will be cleared / text will not be cleared.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToMapScene() ===&lt;br /&gt;
Changes immediately to map scene, without continue.  (This will cause any text currently on screen to be skipped)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToEntityLookScene([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
Changes immediately to looking at entity scene (where &#039;pick up&#039;, &#039;use&#039;, &#039;attack&#039;, etc are shown).&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:DynamicOptions&amp;diff=1229</id>
		<title>Modding:DynamicOptions</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:DynamicOptions&amp;diff=1229"/>
		<updated>2026-01-16T00:46:02Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Documentation for DynamicOptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Introduced in r56.1, this class provides a means to build customized scene flows in your mods.&lt;br /&gt;
&lt;br /&gt;
This object holds a set of buttons that can be pushed to the UI.&lt;br /&gt;
&lt;br /&gt;
Sample code:  [https://skycorp.global/skyscript/mods/v/91/sample-dynamic-options-example DynamicOptionsExample]&lt;br /&gt;
&lt;br /&gt;
== Public static methods ==&lt;br /&gt;
&lt;br /&gt;
=== DynamicOptions generateNew() ===&lt;br /&gt;
Creates a new DynamicOptions&lt;br /&gt;
&lt;br /&gt;
== Public methods ==&lt;br /&gt;
&lt;br /&gt;
=== void clearOptions() ===&lt;br /&gt;
Removes all options/buttons from this object&lt;br /&gt;
&lt;br /&gt;
(This does not immediately affect UI, see [[Modding:MainScreen|MainScreen]].resetUI() for that)&lt;br /&gt;
&lt;br /&gt;
=== void addOption(string name, Closure onButtonScript, int preferredButtonLocation=-1) ===&lt;br /&gt;
Adds a new button to the collection.&lt;br /&gt;
&lt;br /&gt;
name - The name for the button.  Highly recommended to keep short or it will be unreadable.&lt;br /&gt;
&lt;br /&gt;
onButtonScript - pass the function to be called if user presses the button.  Usually just a function name, but you could create a lambda-style function, also.&lt;br /&gt;
&lt;br /&gt;
preferredButtonLocation - An integer from 0-9, inclusive, will decide the button location.  -1 will let the button go anywhere.  If you plan to have a lot of buttons, just leave most of them as -1 and a dropdown will be created.&lt;br /&gt;
&lt;br /&gt;
=== void showOptions() ===&lt;br /&gt;
Render options to MainScreen.  This function assumes all buttons are already reset / non-enabled.&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1228</id>
		<title>Modding:MainScreen</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1228"/>
		<updated>2026-01-16T00:35:39Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static void addGameText(string gameText) ===&lt;br /&gt;
Output string to screen.  Does not automatically add newlines.&lt;br /&gt;
&lt;br /&gt;
Unlike io.write, will only accept one string parameter, making it useful to get around the [[LUA Implementation Limitations &amp;amp; Notes|LUFA garbage array bug]].&lt;br /&gt;
&lt;br /&gt;
=== static void continueSceneToMapScene() ===&lt;br /&gt;
Removes screen buttons (but not shown text).  Will display one &#039;continue&#039; button, which when pressed, will redirect flow back to the map (/ player navigation).  This is a shortcut into the game&#039;s scene flow control that handles most cases, but for instance, if you wanted to continue then go to somewhere else, you should bug Skye to expose the full scene control system.&lt;br /&gt;
&lt;br /&gt;
Added in r35&lt;br /&gt;
&lt;br /&gt;
=== static void changeToForcedTransformationScene(string prefix, [[Modding:Species|Species]] species, bool allowEscape = true, function switchSceneAfterTransformationSequence = null, function teleportPlayerOnFinish = true, bool resetLustHP = true, function customOutputFunction = null, bool withContinueScene = true) ===&lt;br /&gt;
Using this, you can play the forced transformation sequence scene.  This is primarily useful if you are doing a forced transformation sequence that should be triggered from customized monster logic (ex: not normal defeat logic) or triggered from an arbitrary object.&lt;br /&gt;
&lt;br /&gt;
[https://skycorp.global/skyscript/mods/v/90/sample-fox-painting Sample code]&lt;br /&gt;
&lt;br /&gt;
Note there are several other methods you may want to consider instead of this:&lt;br /&gt;
&lt;br /&gt;
* If you just want to cause a single body part to be transformed at a time, see [[Modding:Species#void causeTF()|causeTF()]]&lt;br /&gt;
* If you do want a multi-step tf sequence, and are already triggering this on player defeat to a monster, you probably want to use the normal player defeat logic.  This will also check to see if the player is TF&#039;able before trying to TF the player, as well as updating the monster&#039;s state to sleep, and inseminating the player if configured.  You can trigger this logic on defeat by either&lt;br /&gt;
** Not defining the doMonsterVictory function in the json, or&lt;br /&gt;
** Defining the doMonsterVictory function, but inside your custom function, calling doMonsterVictoryDefault() to do normal logic&lt;br /&gt;
&lt;br /&gt;
If you do want to call this function, then you&#039;ll need to define the following text variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_PLAYER_DEFEAT&lt;br /&gt;
|Initial text shown to player on defeat&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTIME&lt;br /&gt;
|Text shown every step player is being tf&#039;ed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTOTAL&lt;br /&gt;
|Text shown at conclusion of tf&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_SUCCESS&lt;br /&gt;
|Player tried to escape, and did&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_FAILURE&lt;br /&gt;
|Player tried to escape, but failed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFACCEPT&lt;br /&gt;
|Player did not try to escape / accepted the tf&lt;br /&gt;
|}&lt;br /&gt;
Function parameters:&lt;br /&gt;
&lt;br /&gt;
==== string prefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Species|Species]] species ====&lt;br /&gt;
Which TF is being done&lt;br /&gt;
&lt;br /&gt;
==== bool allowEscape = true ====&lt;br /&gt;
If escape is possible.  Button will still be shown, but it will be impossible to escape regardless of lust level.&lt;br /&gt;
&lt;br /&gt;
==== function switchSceneAfterTransformationSequenceScript = null ====&lt;br /&gt;
This can be used to transition to a different scene after the sequence, instead of back to the normal mapscene.&lt;br /&gt;
&lt;br /&gt;
If not null, called to determine logic for switching scene.  (If not set, just goes back to mapscene).  The bool indicates if the full tf played out (false if the player escaped mid-tf)&lt;br /&gt;
&lt;br /&gt;
(Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== function teleportPlayerOnFinish = true ====&lt;br /&gt;
Whether to teleport player to a respawn position after the sequence finishes&lt;br /&gt;
&lt;br /&gt;
==== bool resetLustHP = true ====&lt;br /&gt;
On full tf: whether to reset lust + hp.&lt;br /&gt;
&lt;br /&gt;
On early escape: whether to reset lust.&lt;br /&gt;
&lt;br /&gt;
==== function customOutputFunctionScript = null ====&lt;br /&gt;
If set, this function is called with the text key suffix each tf instead of outputting monsterPrefix+suffix text.  (Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene = true ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToClaimOwnershipScene([[Modding:Entity|Entity]] potentialOwner, string textPrefix, bool withContinueScene, bool sleepAfterward, function customAfterSceneScript = null) ===&lt;br /&gt;
Transitions to the claim ownership scene -- a scene that displays some intro text, information about the entity (presumably a dom/monster, but can be any entity), and then offers the player the ability to accept or reject them as their new owner.  This scene already performs logic for handling if player is already owned by another dom and includes preset text variables.&lt;br /&gt;
&lt;br /&gt;
You don&#039;t need to re-define text variables for this function (most monsters currently don&#039;t), but if you wish to, you should redefine these:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_START&lt;br /&gt;
|Initial text, shown regardless of whether player has been claimed by some other dom or not.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED&lt;br /&gt;
|After the initial text, the NPC will check if player is owned by someone else.  There are multiple ways for this detection to happen, and this particular field overrides all of them.&lt;br /&gt;
If player is already owned by another dom, this text can be optionally defined if the NPC has some unusual way of identifying ownership over the player.  Generally though it&#039;s safe to leave this undefined, and one of the standard identification methods below will be used instead.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_SMELL&lt;br /&gt;
|If your dom can be smelled by any other dom&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_SLAVE&lt;br /&gt;
|Slave collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_PET&lt;br /&gt;
|Pet collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_GENERIC&lt;br /&gt;
|Generic fallback if none of the above apply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_DETECT_END&lt;br /&gt;
|The above detection text is then followed by this&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_OK&lt;br /&gt;
|Scene for player accepting ownership&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_RESIST&lt;br /&gt;
|Scene for player rejecting ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Entity|Entity]] potentialOwner ====&lt;br /&gt;
The entity (probably a monster) who is trying to claim ownership over player&lt;br /&gt;
&lt;br /&gt;
==== string textPrefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
==== bool sleepAfterward ====&lt;br /&gt;
If true, monster will go to sleep after this scene.  (This is ignored if customAfterSceneScript parameter is defined)&lt;br /&gt;
&lt;br /&gt;
==== function customAfterSceneScript = null ====&lt;br /&gt;
Instead of doing default scene handling and going back to map, this function can be called instead.  This lets you do some other scene or action instead.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToSimpleDynamicOptionsScene([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions) ===&lt;br /&gt;
Changes to simple dynamic options scene.&lt;br /&gt;
&lt;br /&gt;
Unlike many other types of scenes, Simple Dynamic Options is similar to a &#039;continue&#039; scene.  That is, it will not clear text from the UI by itself.  Furthermore (and unlike a continue scene), it also does not clear existing buttons by itself.  It will, however, immediately add any buttons registered with the dynamic options object.&lt;br /&gt;
&lt;br /&gt;
Example: DynamicOptionsExample&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void resetUI(bool buttonsOnly=false) ===&lt;br /&gt;
Clears all text &amp;amp; buttons from user interface (make sure to add buttons back using some mechanism, or user will be stuck!)&lt;br /&gt;
&lt;br /&gt;
If buttonsOnly is set, then only buttons will be cleared / text will not be cleared.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToMapScene() ===&lt;br /&gt;
Changes immediately to map scene, without continue.  (This will cause any text currently on screen to be skipped)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToEntityLookScene([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
Changes immediately to looking at entity scene (where &#039;pick up&#039;, &#039;use&#039;, &#039;attack&#039;, etc are shown).&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1227</id>
		<title>Modding:MainScreen</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1227"/>
		<updated>2026-01-16T00:34:58Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: documentation for changeToSimpleDynamicOptionsScene(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static void addGameText(string gameText) ===&lt;br /&gt;
Output string to screen.  Does not automatically add newlines.&lt;br /&gt;
&lt;br /&gt;
Unlike io.write, will only accept one string parameter, making it useful to get around the [[LUA Implementation Limitations &amp;amp; Notes|LUFA garbage array bug]].&lt;br /&gt;
&lt;br /&gt;
=== static void continueSceneToMapScene() ===&lt;br /&gt;
Removes screen buttons (but not shown text).  Will display one &#039;continue&#039; button, which when pressed, will redirect flow back to the map (/ player navigation).  This is a shortcut into the game&#039;s scene flow control that handles most cases, but for instance, if you wanted to continue then go to somewhere else, you should bug Skye to expose the full scene control system.&lt;br /&gt;
&lt;br /&gt;
Added in r35&lt;br /&gt;
&lt;br /&gt;
=== static void changeToForcedTransformationScene(string prefix, [[Modding:Species|Species]] species, bool allowEscape = true, function switchSceneAfterTransformationSequence = null, function teleportPlayerOnFinish = true, bool resetLustHP = true, function customOutputFunction = null, bool withContinueScene = true) ===&lt;br /&gt;
Using this, you can play the forced transformation sequence scene.  This is primarily useful if you are doing a forced transformation sequence that should be triggered from customized monster logic (ex: not normal defeat logic) or triggered from an arbitrary object.&lt;br /&gt;
&lt;br /&gt;
[https://skycorp.global/skyscript/mods/v/90/sample-fox-painting Sample code]&lt;br /&gt;
&lt;br /&gt;
Note there are several other methods you may want to consider instead of this:&lt;br /&gt;
&lt;br /&gt;
* If you just want to cause a single body part to be transformed at a time, see [[Modding:Species#void causeTF()|causeTF()]]&lt;br /&gt;
* If you do want a multi-step tf sequence, and are already triggering this on player defeat to a monster, you probably want to use the normal player defeat logic.  This will also check to see if the player is TF&#039;able before trying to TF the player, as well as updating the monster&#039;s state to sleep, and inseminating the player if configured.  You can trigger this logic on defeat by either&lt;br /&gt;
** Not defining the doMonsterVictory function in the json, or&lt;br /&gt;
** Defining the doMonsterVictory function, but inside your custom function, calling doMonsterVictoryDefault() to do normal logic&lt;br /&gt;
&lt;br /&gt;
If you do want to call this function, then you&#039;ll need to define the following text variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_PLAYER_DEFEAT&lt;br /&gt;
|Initial text shown to player on defeat&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTIME&lt;br /&gt;
|Text shown every step player is being tf&#039;ed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTOTAL&lt;br /&gt;
|Text shown at conclusion of tf&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_SUCCESS&lt;br /&gt;
|Player tried to escape, and did&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_FAILURE&lt;br /&gt;
|Player tried to escape, but failed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFACCEPT&lt;br /&gt;
|Player did not try to escape / accepted the tf&lt;br /&gt;
|}&lt;br /&gt;
Function parameters:&lt;br /&gt;
&lt;br /&gt;
==== string prefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Species|Species]] species ====&lt;br /&gt;
Which TF is being done&lt;br /&gt;
&lt;br /&gt;
==== bool allowEscape = true ====&lt;br /&gt;
If escape is possible.  Button will still be shown, but it will be impossible to escape regardless of lust level.&lt;br /&gt;
&lt;br /&gt;
==== function switchSceneAfterTransformationSequenceScript = null ====&lt;br /&gt;
This can be used to transition to a different scene after the sequence, instead of back to the normal mapscene.&lt;br /&gt;
&lt;br /&gt;
If not null, called to determine logic for switching scene.  (If not set, just goes back to mapscene).  The bool indicates if the full tf played out (false if the player escaped mid-tf)&lt;br /&gt;
&lt;br /&gt;
(Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== function teleportPlayerOnFinish = true ====&lt;br /&gt;
Whether to teleport player to a respawn position after the sequence finishes&lt;br /&gt;
&lt;br /&gt;
==== bool resetLustHP = true ====&lt;br /&gt;
On full tf: whether to reset lust + hp.&lt;br /&gt;
&lt;br /&gt;
On early escape: whether to reset lust.&lt;br /&gt;
&lt;br /&gt;
==== function customOutputFunctionScript = null ====&lt;br /&gt;
If set, this function is called with the text key suffix each tf instead of outputting monsterPrefix+suffix text.  (Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene = true ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToClaimOwnershipScene([[Modding:Entity|Entity]] potentialOwner, string textPrefix, bool withContinueScene, bool sleepAfterward, function customAfterSceneScript = null) ===&lt;br /&gt;
Transitions to the claim ownership scene -- a scene that displays some intro text, information about the entity (presumably a dom/monster, but can be any entity), and then offers the player the ability to accept or reject them as their new owner.  This scene already performs logic for handling if player is already owned by another dom and includes preset text variables.&lt;br /&gt;
&lt;br /&gt;
You don&#039;t need to re-define text variables for this function (most monsters currently don&#039;t), but if you wish to, you should redefine these:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_START&lt;br /&gt;
|Initial text, shown regardless of whether player has been claimed by some other dom or not.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED&lt;br /&gt;
|After the initial text, the NPC will check if player is owned by someone else.  There are multiple ways for this detection to happen, and this particular field overrides all of them.&lt;br /&gt;
If player is already owned by another dom, this text can be optionally defined if the NPC has some unusual way of identifying ownership over the player.  Generally though it&#039;s safe to leave this undefined, and one of the standard identification methods below will be used instead.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_SMELL&lt;br /&gt;
|If your dom can be smelled by any other dom&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_SLAVE&lt;br /&gt;
|Slave collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_PET&lt;br /&gt;
|Pet collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_GENERIC&lt;br /&gt;
|Generic fallback if none of the above apply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_DETECT_END&lt;br /&gt;
|The above detection text is then followed by this&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_OK&lt;br /&gt;
|Scene for player accepting ownership&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_RESIST&lt;br /&gt;
|Scene for player rejecting ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Entity|Entity]] potentialOwner ====&lt;br /&gt;
The entity (probably a monster) who is trying to claim ownership over player&lt;br /&gt;
&lt;br /&gt;
==== string textPrefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
==== bool sleepAfterward ====&lt;br /&gt;
If true, monster will go to sleep after this scene.  (This is ignored if customAfterSceneScript parameter is defined)&lt;br /&gt;
&lt;br /&gt;
==== function customAfterSceneScript = null ====&lt;br /&gt;
Instead of doing default scene handling and going back to map, this function can be called instead.  This lets you do some other scene or action instead.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToSimpleDynamicOptionsScene([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions) ===&lt;br /&gt;
Changes to simple dynamic options scene.&lt;br /&gt;
&lt;br /&gt;
Unlike many other types of scenes, Simple Dynamic Options is similar to a &#039;continue&#039; scene.  That is, it will not clear text from the UI by itself.  Furthermore, it also does not clear existing buttons by itself.  It will, however, immediately add any buttons registered with the dynamic options object.&lt;br /&gt;
&lt;br /&gt;
Example: DynamicOptionsExample&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void resetUI(bool buttonsOnly=false) ===&lt;br /&gt;
Clears all text &amp;amp; buttons from user interface (make sure to add buttons back using some mechanism, or user will be stuck!)&lt;br /&gt;
&lt;br /&gt;
If buttonsOnly is set, then only buttons will be cleared / text will not be cleared.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToMapScene() ===&lt;br /&gt;
Changes immediately to map scene, without continue.  (This will cause any text currently on screen to be skipped)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToEntityLookScene([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
Changes immediately to looking at entity scene (where &#039;pick up&#039;, &#039;use&#039;, &#039;attack&#039;, etc are shown).&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1226</id>
		<title>Modding:MainScreen</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:MainScreen&amp;diff=1226"/>
		<updated>2026-01-16T00:31:57Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: New modding functions added to MainScreen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static void addGameText(string gameText) ===&lt;br /&gt;
Output string to screen.  Does not automatically add newlines.&lt;br /&gt;
&lt;br /&gt;
Unlike io.write, will only accept one string parameter, making it useful to get around the [[LUA Implementation Limitations &amp;amp; Notes|LUFA garbage array bug]].&lt;br /&gt;
&lt;br /&gt;
=== static void continueSceneToMapScene() ===&lt;br /&gt;
Removes screen buttons (but not shown text).  Will display one &#039;continue&#039; button, which when pressed, will redirect flow back to the map (/ player navigation).  This is a shortcut into the game&#039;s scene flow control that handles most cases, but for instance, if you wanted to continue then go to somewhere else, you should bug Skye to expose the full scene control system.&lt;br /&gt;
&lt;br /&gt;
Added in r35&lt;br /&gt;
&lt;br /&gt;
=== static void changeToForcedTransformationScene(string prefix, [[Modding:Species|Species]] species, bool allowEscape = true, function switchSceneAfterTransformationSequence = null, function teleportPlayerOnFinish = true, bool resetLustHP = true, function customOutputFunction = null, bool withContinueScene = true) ===&lt;br /&gt;
Using this, you can play the forced transformation sequence scene.  This is primarily useful if you are doing a forced transformation sequence that should be triggered from customized monster logic (ex: not normal defeat logic) or triggered from an arbitrary object.&lt;br /&gt;
&lt;br /&gt;
[https://skycorp.global/skyscript/mods/v/90/sample-fox-painting Sample code]&lt;br /&gt;
&lt;br /&gt;
Note there are several other methods you may want to consider instead of this:&lt;br /&gt;
&lt;br /&gt;
* If you just want to cause a single body part to be transformed at a time, see [[Modding:Species#void causeTF()|causeTF()]]&lt;br /&gt;
* If you do want a multi-step tf sequence, and are already triggering this on player defeat to a monster, you probably want to use the normal player defeat logic.  This will also check to see if the player is TF&#039;able before trying to TF the player, as well as updating the monster&#039;s state to sleep, and inseminating the player if configured.  You can trigger this logic on defeat by either&lt;br /&gt;
** Not defining the doMonsterVictory function in the json, or&lt;br /&gt;
** Defining the doMonsterVictory function, but inside your custom function, calling doMonsterVictoryDefault() to do normal logic&lt;br /&gt;
&lt;br /&gt;
If you do want to call this function, then you&#039;ll need to define the following text variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_PLAYER_DEFEAT&lt;br /&gt;
|Initial text shown to player on defeat&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTIME&lt;br /&gt;
|Text shown every step player is being tf&#039;ed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFTOTAL&lt;br /&gt;
|Text shown at conclusion of tf&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_SUCCESS&lt;br /&gt;
|Player tried to escape, and did&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFESCAPE_FAILURE&lt;br /&gt;
|Player tried to escape, but failed&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_DEFEAT_TFACCEPT&lt;br /&gt;
|Player did not try to escape / accepted the tf&lt;br /&gt;
|}&lt;br /&gt;
Function parameters:&lt;br /&gt;
&lt;br /&gt;
==== string prefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Species|Species]] species ====&lt;br /&gt;
Which TF is being done&lt;br /&gt;
&lt;br /&gt;
==== bool allowEscape = true ====&lt;br /&gt;
If escape is possible.  Button will still be shown, but it will be impossible to escape regardless of lust level.&lt;br /&gt;
&lt;br /&gt;
==== function switchSceneAfterTransformationSequenceScript = null ====&lt;br /&gt;
This can be used to transition to a different scene after the sequence, instead of back to the normal mapscene.&lt;br /&gt;
&lt;br /&gt;
If not null, called to determine logic for switching scene.  (If not set, just goes back to mapscene).  The bool indicates if the full tf played out (false if the player escaped mid-tf)&lt;br /&gt;
&lt;br /&gt;
(Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== function teleportPlayerOnFinish = true ====&lt;br /&gt;
Whether to teleport player to a respawn position after the sequence finishes&lt;br /&gt;
&lt;br /&gt;
==== bool resetLustHP = true ====&lt;br /&gt;
On full tf: whether to reset lust + hp.&lt;br /&gt;
&lt;br /&gt;
On early escape: whether to reset lust.&lt;br /&gt;
&lt;br /&gt;
==== function customOutputFunctionScript = null ====&lt;br /&gt;
If set, this function is called with the text key suffix each tf instead of outputting monsterPrefix+suffix text.  (Most users will just leave this as &#039;null&#039;)&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene = true ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToClaimOwnershipScene([[Modding:Entity|Entity]] potentialOwner, string textPrefix, bool withContinueScene, bool sleepAfterward, function customAfterSceneScript = null) ===&lt;br /&gt;
Transitions to the claim ownership scene -- a scene that displays some intro text, information about the entity (presumably a dom/monster, but can be any entity), and then offers the player the ability to accept or reject them as their new owner.  This scene already performs logic for handling if player is already owned by another dom and includes preset text variables.&lt;br /&gt;
&lt;br /&gt;
You don&#039;t need to re-define text variables for this function (most monsters currently don&#039;t), but if you wish to, you should redefine these:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Text Variable&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_START&lt;br /&gt;
|Initial text, shown regardless of whether player has been claimed by some other dom or not.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED&lt;br /&gt;
|After the initial text, the NPC will check if player is owned by someone else.  There are multiple ways for this detection to happen, and this particular field overrides all of them.&lt;br /&gt;
If player is already owned by another dom, this text can be optionally defined if the NPC has some unusual way of identifying ownership over the player.  Generally though it&#039;s safe to leave this undefined, and one of the standard identification methods below will be used instead.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_SMELL&lt;br /&gt;
|If your dom can be smelled by any other dom&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_SLAVE&lt;br /&gt;
|Slave collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_COLLAR_PET&lt;br /&gt;
|Pet collar if player is wearing one&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_OWNED_DETECT_GENERIC&lt;br /&gt;
|Generic fallback if none of the above apply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_ALREADY_DETECT_END&lt;br /&gt;
|The above detection text is then followed by this&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_OK&lt;br /&gt;
|Scene for player accepting ownership&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;PREFIX&amp;gt;_CLAIM_FAIL_RESIST&lt;br /&gt;
|Scene for player rejecting ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== [[Modding:Entity|Entity]] potentialOwner ====&lt;br /&gt;
The entity (probably a monster) who is trying to claim ownership over player&lt;br /&gt;
&lt;br /&gt;
==== string textPrefix ====&lt;br /&gt;
Defines the &amp;lt;PREFIX&amp;gt; part of the text keys, per the above table.&lt;br /&gt;
&lt;br /&gt;
==== bool withContinueScene ====&lt;br /&gt;
If true, prepends a continue scene prior to switching the scene to the TF sequence scene.  (Set true if you already have text on screen player should have a chance to read first)&lt;br /&gt;
&lt;br /&gt;
==== bool sleepAfterward ====&lt;br /&gt;
If true, monster will go to sleep after this scene.  (This is ignored if customAfterSceneScript parameter is defined)&lt;br /&gt;
&lt;br /&gt;
==== function customAfterSceneScript = null ====&lt;br /&gt;
Instead of doing default scene handling and going back to map, this function can be called instead.  This lets you do some other scene or action instead.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToSimpleDynamicOptionsScene([[Modding:DynamicOptions|DynamicOptions]] dynamicOptions) ===&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void resetUI(bool buttonsOnly=false) ===&lt;br /&gt;
Clears all text &amp;amp; buttons from user interface (make sure to add buttons back using some mechanism, or user will be stuck!)&lt;br /&gt;
&lt;br /&gt;
If buttonsOnly is set, then only buttons will be cleared / text will not be cleared.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToMapScene() ===&lt;br /&gt;
Changes immediately to map scene, without continue.  (This will cause any text currently on screen to be skipped)&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== static void changeToEntityLookScene([[Modding:Entity|Entity]] entity) ===&lt;br /&gt;
Changes immediately to looking at entity scene (where &#039;pick up&#039;, &#039;use&#039;, &#039;attack&#039;, etc are shown).&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:GameText&amp;diff=1225</id>
		<title>Modding:GameText</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:GameText&amp;diff=1225"/>
		<updated>2026-01-15T22:40:04Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: More parameters for parseText(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:TextEditorScreenshot.png|thumb|&lt;br /&gt;
An example of text key/value pairs from the text editor.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Game Text is a key-value dictionary that stores much of the game&#039;s text.  Keys are all uppercase, containing no spaces, but do contain underscores.  &lt;br /&gt;
&lt;br /&gt;
There can be multiple dictionaries loaded, but it is expected that text keys are unique across all dictionaries, so multiple dictionaries are essentially one big dictionary.  Currently there is one for private builds, one for public+privates builds, and an &amp;quot;override&amp;quot; dictionary which code can use to override dictionary values at run-time.  In this way, AS3 or LUA code can change just about any string in the game.  However, it is not recommended to change shared text in this way as multiple mods accessing the same text may conflict with each other, leading to unexpected results&lt;br /&gt;
&lt;br /&gt;
Generally, Game Text values should not include a trailing paragraph (\n\n) as that is added via the withParagraph parameter.&lt;br /&gt;
&lt;br /&gt;
In future, I would like to provide a mod type for UGC game text dictionaries.  For now you can add your own via setTextOverride during startup.  It is recommended that you set a keys like MOD_NAME_ACTION_NAME to prevent colliding with existing game text or other mods.&lt;br /&gt;
== Public Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static string parseText(string unparsedText, string parameter=&amp;quot;UnknownParameter&amp;quot;, [[Modding:Entity|Entity]] npc=null) ===&lt;br /&gt;
Parses text and returns the result.  See &#039;&#039;[[Text Variables]]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;parameter&#039; allows you to pass a custom parameter that can be embedded into the text variables&lt;br /&gt;
&lt;br /&gt;
&#039;npc&#039; is needed for some npc-specific text variables to work (like &amp;lt;nowiki&amp;gt;[[NPC NAME]]&amp;lt;/nowiki&amp;gt;, etc)&lt;br /&gt;
&lt;br /&gt;
=== static boolean hasText(string textKey) ===&lt;br /&gt;
Does specified text key exist in any loaded dictionary? &lt;br /&gt;
&lt;br /&gt;
=== static void printText(string textKey, [boolean withParagraph=true]) ===&lt;br /&gt;
Gets the text for textKey, parses the text using ParseText, then prints it to screen.  If withParagraph is true or unset, then a paragraph is added&lt;br /&gt;
&lt;br /&gt;
=== static string getText(string textKey, [boolean withParagraph=true]) ===&lt;br /&gt;
Gets parsed text from either game text or game text private&lt;br /&gt;
&lt;br /&gt;
=== static string getTextRaw(string textKey) ===&lt;br /&gt;
Gets UNPARSED raw text from text stores.&lt;br /&gt;
&lt;br /&gt;
=== static void setTextOverride(string textKey, string value) ===&lt;br /&gt;
Allows a text key to be overridden with value.  See notes in page header about proper usage!&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1224</id>
		<title>Modding:BodyDescription</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1224"/>
		<updated>2026-01-09T22:57:00Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Small typo fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This class lets you describe an NPC&#039;s appearance.  [[Modding:Text Variables|Text variables]] can then use this appearance data in scenes.&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static public BodyDescription generateNew() ===&lt;br /&gt;
Creates a new body description.  &lt;br /&gt;
&lt;br /&gt;
Note that it must be assigned to the NPC after you finish configuring it!&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== void setBreastSize(int breastSize) ===&lt;br /&gt;
Size of breasts -- uses same scale used by player class&lt;br /&gt;
&lt;br /&gt;
=== int getBreastSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setBreastRows(int breastRows) ===&lt;br /&gt;
Number of rows of breasts&lt;br /&gt;
&lt;br /&gt;
=== int getBreastRows() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDickSize(int dickSize) ===&lt;br /&gt;
Size of dick -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getDickSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setVaginaSize(int vaginaSize) ===&lt;br /&gt;
Size of vagina -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getVaginaSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDexterous(bool dexterous) ===&lt;br /&gt;
Does the character have dexterous hands?  False if no hands, hands are bound, or non-dexterous paws&lt;br /&gt;
&lt;br /&gt;
=== bool isDexterous() ===&lt;br /&gt;
&lt;br /&gt;
=== bool getHasAlternateVoice() ===&lt;br /&gt;
If the NPC is incapable of normal human speech (also see Vocal string below).&lt;br /&gt;
&lt;br /&gt;
=== void setHasAlternateVoice(bool hasAlternateVoice) ===&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocalString() ===&lt;br /&gt;
If NPC is incapable of normal human speech (alternate vocal bool above), then what noise do they produce instead?&lt;br /&gt;
&lt;br /&gt;
=== void setAlternateVocalString(string alternateVocalString) ===&lt;br /&gt;
&lt;br /&gt;
=== bool getBipedal() ===&lt;br /&gt;
If the NPC walks on two legs&lt;br /&gt;
&lt;br /&gt;
=== void setBipedal(bool bipedal) ===&lt;br /&gt;
&lt;br /&gt;
=== void setUniqueBodyPartDescription(string bodyPartName, string description) ===&lt;br /&gt;
Can set a description for a body part for specific flavor.&lt;br /&gt;
&lt;br /&gt;
=== string getBodyPartDescription(string bodyPartName) ===&lt;br /&gt;
Tries to get the body part description, if one is defined.  If unavailable, just returns &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Sample code ==&lt;br /&gt;
See SetOwnerWithScene sample for an example of body description in use.&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Placed in global scope so it runs on load.&lt;br /&gt;
bodyDescription = BodyDescription.generateNew();&lt;br /&gt;
bodyDescription.setBreastSize(4); -- D Cup&lt;br /&gt;
bodyDescription.setBreastRows(2);&lt;br /&gt;
bodyDescription.setDickSize(10); -- Inches&lt;br /&gt;
bodyDescription.setVaginaSize(2);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;HANDS&amp;quot;, &amp;quot;oversized paws&amp;quot;);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;TEETH&amp;quot;, &amp;quot;fangs&amp;quot;);&lt;br /&gt;
-- etc...&lt;br /&gt;
this.setBodyDescription(bodyDescription);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1223</id>
		<title>Modding:Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1223"/>
		<updated>2026-01-09T22:56:18Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Add get/set body description functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Entity generate(string entityName) ===&lt;br /&gt;
Generate a new entity of the given type based on the [[Types of Entities|entity type string]].  Null if unknown entity.&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets name of entity&lt;br /&gt;
&lt;br /&gt;
=== string getLookDesc() ===&lt;br /&gt;
Gets look description(the text displayed when looking at item)&lt;br /&gt;
&lt;br /&gt;
=== boolean isExaminable() ===&lt;br /&gt;
Allow player to examine object?  If so, the item is shown in the room item list.  Otherwise, the object is invisible&lt;br /&gt;
&lt;br /&gt;
=== boolean isAttackable() ===&lt;br /&gt;
Is player allowed to (attempt) to do an attack on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isUseable() ===&lt;br /&gt;
Is player shown a use button on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isPickupable() ===&lt;br /&gt;
Should object display a pick-up option if not yet in inventory?  May or may not *actually* be pickupable.  To do / attempt to do a pickup, use the [[Player]] class.&lt;br /&gt;
&lt;br /&gt;
=== boolean isDropable()    ===&lt;br /&gt;
Should object display a drop item button if is in inventory?   May or may not *actually* be dropable.  Use [[Player]] class to make the actual attempt.&lt;br /&gt;
&lt;br /&gt;
=== void deleteEntity() ===&lt;br /&gt;
Removes entity from either the inventory or room that it exists in.&lt;br /&gt;
&lt;br /&gt;
=== boolean isPlayerHere() ===&lt;br /&gt;
If entity is in world, is the player in this same room?&lt;br /&gt;
&lt;br /&gt;
=== int isPlayerAdjacent() ===&lt;br /&gt;
If entity is in the world, is the player in a room adjacent to the one entity is in?  If so, which room ID?&lt;br /&gt;
&lt;br /&gt;
If not, room ID is 0.  If player is in the same room, then room ID 0 is also returned.&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Gets location of this entity.  Returns null if entity is in inventory, or otherwise not in world.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntity(string newMapName:String, int newRoomID) ===&lt;br /&gt;
Moves entity from whereever it is (including inventory) into a particular location.  If picking up the item, should use the functions on the Player class instead.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityToSameRoomAsPlayer() ===&lt;br /&gt;
Move entity from wherever it is (including inventory) into the same room as the player is in.&lt;br /&gt;
&lt;br /&gt;
=== void makeCursed() ===&lt;br /&gt;
Marks this entity as cursed.  In order for this to have any effect, you should write a custom function for playerAttemptDropCheck.&lt;br /&gt;
&lt;br /&gt;
Generally this would be called on start-up.  Curse status can be modified by NPCs that can perform purification.&lt;br /&gt;
&lt;br /&gt;
See [[Weight Pendant]] for an example of cursed items.&lt;br /&gt;
&lt;br /&gt;
=== boolean getCursed() ===&lt;br /&gt;
Is this entity cursed?&lt;br /&gt;
&lt;br /&gt;
=== [[Modding:BodyDescription|BodyDescription]] getBodyDescription() ===&lt;br /&gt;
Gets body description for this npc -- may be nil if no body description has been set.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== setBodyDescription([[Modding:BodyDescription|BodyDescription]] bodyDescription) ===&lt;br /&gt;
Sets/overwrites body description for this npc.&lt;br /&gt;
&lt;br /&gt;
Added in r56.1&lt;br /&gt;
&lt;br /&gt;
=== Default versions of functions ===&lt;br /&gt;
These are useful for calling if you want to do some logic first, and then fall back to the usual monster logic.&lt;br /&gt;
&lt;br /&gt;
==== string defaultGetName([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ====&lt;br /&gt;
As of r56.1, this is mostly useful to advanced monster mods, but is available to all entities.  (Entities currently have no way to set the initial name value, so calling the default get name will just return &amp;quot;uninitialized entity&amp;quot;.  It is useful for advanced monster mods since they can set the name via &#039;initialValues&#039; and thus access when UI name is supposed to be sleeping, etc.)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1222</id>
		<title>Modding:BodyDescription</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1222"/>
		<updated>2026-01-09T22:52:26Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Also tag for lua class reference page category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This class lets you describe an NPC&#039;s appearance.  [[Modding:Text Variables|Text variables]] can then use this appearance data in scenes.&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static public BodyDescription generateNew() ===&lt;br /&gt;
Creates a new body description.  &lt;br /&gt;
&lt;br /&gt;
Note that it must be assigned to the NPC after you finish configuring it!&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== void setBreastSize(int breastSize) ===&lt;br /&gt;
Size of breasts -- uses same scale used by player class&lt;br /&gt;
&lt;br /&gt;
=== int getBreastSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setBreastRows(int breastRows) ===&lt;br /&gt;
Number of rows of breasts&lt;br /&gt;
&lt;br /&gt;
=== int getBreastRows() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDickSize(int dickSize) ===&lt;br /&gt;
Size of dick -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getDickSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setVaginaSize(int vaginaSize) ===&lt;br /&gt;
Size of vagina -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getVaginaSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDexterous(bool dexterous) ===&lt;br /&gt;
Does the character have dexterous hands?  False if no hands, hands are bound, or non-dexterous paws&lt;br /&gt;
&lt;br /&gt;
=== bool isDexterous() ===&lt;br /&gt;
&lt;br /&gt;
=== bool getHasAlternateVoice() ===&lt;br /&gt;
If the NPC is incapable of normal human speech (also see Vocal string below).&lt;br /&gt;
&lt;br /&gt;
=== void setHasAlternateVoice(bool hasAlternateVoice) ===&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocalString() ===&lt;br /&gt;
If NPC is incapable of normal human speech (alternate vocal bool above), then what noise do they produce instead?&lt;br /&gt;
&lt;br /&gt;
=== void setAlternateVocalString(string alternateVocalString) ===&lt;br /&gt;
&lt;br /&gt;
=== bool getBipedal() ===&lt;br /&gt;
If the NPC walks on two legs&lt;br /&gt;
&lt;br /&gt;
=== void setBipedal(bool bipedal) ===&lt;br /&gt;
&lt;br /&gt;
=== void setUniqueBodyPartDescription(string bodyPartName, string description) ===&lt;br /&gt;
Can set a description for a body part for specific flavor.&lt;br /&gt;
&lt;br /&gt;
=== string getBodyPartDescription(string bodyPartName) ===&lt;br /&gt;
Tries to get the body part description, if one is defined.  If unavailable, just returns &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Sample code ==&lt;br /&gt;
See SetOwnerWithScene sample for an example of body description in use.&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Placed in global scope so it runs on load.&lt;br /&gt;
bodyDescription = BodyDescription.generateNew();&lt;br /&gt;
bodyDescription.setBreastSize(4); -- D Cup&lt;br /&gt;
bodyDescription.setBreastRows(2);&lt;br /&gt;
bodyDescription.setDickSize(10); -- Inches&lt;br /&gt;
bodyDescription.setVaginaSize(2);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;HANDS&amp;quot;, &amp;quot;oversized paws&amp;quot;);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;TEETH&amp;quot;, &amp;quot;fangs&amp;quot;);&lt;br /&gt;
-- etc...&lt;br /&gt;
this.setBodyPartDescription(bodyDescription);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1221</id>
		<title>Modding:BodyDescription</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:BodyDescription&amp;diff=1221"/>
		<updated>2026-01-09T22:51:41Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Body description lua class&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This class lets you describe an NPC&#039;s appearance.  [[Modding:Text Variables|Text variables]] can then use this appearance data in scenes.&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static public BodyDescription generateNew() ===&lt;br /&gt;
Creates a new body description.  &lt;br /&gt;
&lt;br /&gt;
Note that it must be assigned to the NPC after you finish configuring it!&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== void setBreastSize(int breastSize) ===&lt;br /&gt;
Size of breasts -- uses same scale used by player class&lt;br /&gt;
&lt;br /&gt;
=== int getBreastSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setBreastRows(int breastRows) ===&lt;br /&gt;
Number of rows of breasts&lt;br /&gt;
&lt;br /&gt;
=== int getBreastRows() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDickSize(int dickSize) ===&lt;br /&gt;
Size of dick -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getDickSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setVaginaSize(int vaginaSize) ===&lt;br /&gt;
Size of vagina -- uses same scale as player class&lt;br /&gt;
&lt;br /&gt;
=== int getVaginaSize() ===&lt;br /&gt;
&lt;br /&gt;
=== void setDexterous(bool dexterous) ===&lt;br /&gt;
Does the character have dexterous hands?  False if no hands, hands are bound, or non-dexterous paws&lt;br /&gt;
&lt;br /&gt;
=== bool isDexterous() ===&lt;br /&gt;
&lt;br /&gt;
=== bool getHasAlternateVoice() ===&lt;br /&gt;
If the NPC is incapable of normal human speech (also see Vocal string below).&lt;br /&gt;
&lt;br /&gt;
=== void setHasAlternateVoice(bool hasAlternateVoice) ===&lt;br /&gt;
&lt;br /&gt;
=== string getAlternateVocalString() ===&lt;br /&gt;
If NPC is incapable of normal human speech (alternate vocal bool above), then what noise do they produce instead?&lt;br /&gt;
&lt;br /&gt;
=== void setAlternateVocalString(string alternateVocalString) ===&lt;br /&gt;
&lt;br /&gt;
=== bool getBipedal() ===&lt;br /&gt;
If the NPC walks on two legs&lt;br /&gt;
&lt;br /&gt;
=== void setBipedal(bool bipedal) ===&lt;br /&gt;
&lt;br /&gt;
=== void setUniqueBodyPartDescription(string bodyPartName, string description) ===&lt;br /&gt;
Can set a description for a body part for specific flavor.&lt;br /&gt;
&lt;br /&gt;
=== string getBodyPartDescription(string bodyPartName) ===&lt;br /&gt;
Tries to get the body part description, if one is defined.  If unavailable, just returns &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Sample code ==&lt;br /&gt;
See SetOwnerWithScene sample for an example of body description in use.&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Placed in global scope so it runs on load.&lt;br /&gt;
bodyDescription = BodyDescription.generateNew();&lt;br /&gt;
bodyDescription.setBreastSize(4); -- D Cup&lt;br /&gt;
bodyDescription.setBreastRows(2);&lt;br /&gt;
bodyDescription.setDickSize(10); -- Inches&lt;br /&gt;
bodyDescription.setVaginaSize(2);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;HANDS&amp;quot;, &amp;quot;oversized paws&amp;quot;);&lt;br /&gt;
bodyDescription.setUniqueBodyPartDescription(&amp;quot;TEETH&amp;quot;, &amp;quot;fangs&amp;quot;);&lt;br /&gt;
-- etc...&lt;br /&gt;
this.setBodyPartDescription(bodyDescription);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:BodyPart&amp;diff=1220</id>
		<title>Modding:BodyPart</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:BodyPart&amp;diff=1220"/>
		<updated>2026-01-09T21:32:32Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: add link to body part name list page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Represents a particular transformation the player can undergo.&lt;br /&gt;
&lt;br /&gt;
== Public Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static BodyPart getBodyPart(string bodyPartName) ===&lt;br /&gt;
Gets body part object from body part name (string).  Returns null if no body part with that name can be found.&lt;br /&gt;
&lt;br /&gt;
See [[Modding:Body part name list|name list]] for valid body part names&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== int getTransformationSeverity() ===&lt;br /&gt;
How transformed is this body part?  &lt;br /&gt;
* 0=human&lt;br /&gt;
* 1=hideable non-human&lt;br /&gt;
* 2=unhideable non-human&lt;br /&gt;
&lt;br /&gt;
=== void setTransformationSeverity(int severity) === &lt;br /&gt;
Set how transformed this body part is.  &lt;br /&gt;
* 0=human&lt;br /&gt;
* 1=hideable non-human&lt;br /&gt;
* 2=unhideable non-human&lt;br /&gt;
&lt;br /&gt;
=== [[Species]] getSpeciesType() === &lt;br /&gt;
Gets the species the body part is set as.&lt;br /&gt;
&lt;br /&gt;
=== void setSpeciesType([[Species]] species) === &lt;br /&gt;
Sets what species the body part is.&lt;br /&gt;
&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Body_part&amp;diff=1219</id>
		<title>Modding:Body part</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Body_part&amp;diff=1219"/>
		<updated>2026-01-09T21:31:47Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: SkyCorp moved page Modding:Body part to Modding:Body part name list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Modding:Body part name list]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Body_part_name_list&amp;diff=1218</id>
		<title>Modding:Body part name list</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Body_part_name_list&amp;diff=1218"/>
		<updated>2026-01-09T21:31:47Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: SkyCorp moved page Modding:Body part to Modding:Body part name list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists body parts tracked by the game engine.&lt;br /&gt;
&lt;br /&gt;
Each part can transformed by changing into a different [[TF Type]].  Each transformation can be either a first level transformation (can hide under clothes), or a second level transformation (cannot hide under clothes)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Body part name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|FEET&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|LEGS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|TORSO&lt;br /&gt;
|Chest / upper body&lt;br /&gt;
|-&lt;br /&gt;
|ARMS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|HANDS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|UBACK_ATTACH&lt;br /&gt;
|Anything attached to the upper back.  Human = nothing.  Otherwise, probably is wings.&lt;br /&gt;
|-&lt;br /&gt;
|LBACK_ATTACH&lt;br /&gt;
|Anything attached to the lower back.  Usually human/nothing, or tails.  Spider&#039;s opisthosoma exists here also.&lt;br /&gt;
|-&lt;br /&gt;
|EYES&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|TEETH&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|HEAD_HAIR&lt;br /&gt;
|Not used yet&lt;br /&gt;
|-&lt;br /&gt;
|NOSE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EARS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|MOUTH&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|UDDER&lt;br /&gt;
|Generally is human (does not exist), unless cow.&lt;br /&gt;
|-&lt;br /&gt;
|PENIS&lt;br /&gt;
|Generally is human (normal penis), even if female/zero sized penis.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Engine]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=TF_Type&amp;diff=1217</id>
		<title>TF Type</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=TF_Type&amp;diff=1217"/>
		<updated>2026-01-09T21:29:30Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: SkyCorp moved page TF Type to Modding:TF Type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Modding:TF Type]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:TF_Type&amp;diff=1216</id>
		<title>Modding:TF Type</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:TF_Type&amp;diff=1216"/>
		<updated>2026-01-09T21:29:30Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: SkyCorp moved page TF Type to Modding:TF Type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each type represents a particular type of creature the player can be transformed into for a given [[body part]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TF Type&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|HUMAN&lt;br /&gt;
|Default&lt;br /&gt;
|-&lt;br /&gt;
|FOX&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|COW&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|DRAGONQUEEN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SLUGGIRL&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|PANDA&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|DRAGON&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ELEPHANT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|CAT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|TIGER&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|HORSE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|TURKEY&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SPIDER&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Engine]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Body_part&amp;diff=1215</id>
		<title>Body part</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Body_part&amp;diff=1215"/>
		<updated>2026-01-09T21:29:02Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: SkyCorp moved page Body part to Modding:Body part&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Modding:Body part]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Body_part_name_list&amp;diff=1214</id>
		<title>Modding:Body part name list</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Body_part_name_list&amp;diff=1214"/>
		<updated>2026-01-09T21:29:02Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: SkyCorp moved page Body part to Modding:Body part&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists body parts tracked by the game engine.&lt;br /&gt;
&lt;br /&gt;
Each part can transformed by changing into a different [[TF Type]].  Each transformation can be either a first level transformation (can hide under clothes), or a second level transformation (cannot hide under clothes)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Body part name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|FEET&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|LEGS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|TORSO&lt;br /&gt;
|Chest / upper body&lt;br /&gt;
|-&lt;br /&gt;
|ARMS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|HANDS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|UBACK_ATTACH&lt;br /&gt;
|Anything attached to the upper back.  Human = nothing.  Otherwise, probably is wings.&lt;br /&gt;
|-&lt;br /&gt;
|LBACK_ATTACH&lt;br /&gt;
|Anything attached to the lower back.  Usually human/nothing, or tails.  Spider&#039;s opisthosoma exists here also.&lt;br /&gt;
|-&lt;br /&gt;
|EYES&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|TEETH&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|HEAD_HAIR&lt;br /&gt;
|Not used yet&lt;br /&gt;
|-&lt;br /&gt;
|NOSE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EARS&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|MOUTH&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|UDDER&lt;br /&gt;
|Generally is human (does not exist), unless cow.&lt;br /&gt;
|-&lt;br /&gt;
|PENIS&lt;br /&gt;
|Generally is human (normal penis), even if female/zero sized penis.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Engine]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1213</id>
		<title>Modding:Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Entity&amp;diff=1213"/>
		<updated>2026-01-09T02:09:22Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: added defaultGetName function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== static Entity generate(string entityName) ===&lt;br /&gt;
Generate a new entity of the given type based on the [[Types of Entities|entity type string]].  Null if unknown entity.&lt;br /&gt;
&lt;br /&gt;
== Public Methods ==&lt;br /&gt;
&lt;br /&gt;
=== string getName() ===&lt;br /&gt;
Gets name of entity&lt;br /&gt;
&lt;br /&gt;
=== string getLookDesc() ===&lt;br /&gt;
Gets look description(the text displayed when looking at item)&lt;br /&gt;
&lt;br /&gt;
=== boolean isExaminable() ===&lt;br /&gt;
Allow player to examine object?  If so, the item is shown in the room item list.  Otherwise, the object is invisible&lt;br /&gt;
&lt;br /&gt;
=== boolean isAttackable() ===&lt;br /&gt;
Is player allowed to (attempt) to do an attack on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isUseable() ===&lt;br /&gt;
Is player shown a use button on this object -- shown when looking at object&lt;br /&gt;
&lt;br /&gt;
=== boolean isPickupable() ===&lt;br /&gt;
Should object display a pick-up option if not yet in inventory?  May or may not *actually* be pickupable.  To do / attempt to do a pickup, use the [[Player]] class.&lt;br /&gt;
&lt;br /&gt;
=== boolean isDropable()    ===&lt;br /&gt;
Should object display a drop item button if is in inventory?   May or may not *actually* be dropable.  Use [[Player]] class to make the actual attempt.&lt;br /&gt;
&lt;br /&gt;
=== void deleteEntity() ===&lt;br /&gt;
Removes entity from either the inventory or room that it exists in.&lt;br /&gt;
&lt;br /&gt;
=== boolean isPlayerHere() ===&lt;br /&gt;
If entity is in world, is the player in this same room?&lt;br /&gt;
&lt;br /&gt;
=== int isPlayerAdjacent() ===&lt;br /&gt;
If entity is in the world, is the player in a room adjacent to the one entity is in?  If so, which room ID?&lt;br /&gt;
&lt;br /&gt;
If not, room ID is 0.  If player is in the same room, then room ID 0 is also returned.&lt;br /&gt;
&lt;br /&gt;
=== [[Location]] getLocation() ===&lt;br /&gt;
Gets location of this entity.  Returns null if entity is in inventory, or otherwise not in world.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntity(string newMapName:String, int newRoomID) ===&lt;br /&gt;
Moves entity from whereever it is (including inventory) into a particular location.  If picking up the item, should use the functions on the Player class instead.&lt;br /&gt;
&lt;br /&gt;
=== void moveEntityToSameRoomAsPlayer() ===&lt;br /&gt;
Move entity from wherever it is (including inventory) into the same room as the player is in.&lt;br /&gt;
&lt;br /&gt;
=== void makeCursed() ===&lt;br /&gt;
Marks this entity as cursed.  In order for this to have any effect, you should write a custom function for playerAttemptDropCheck.&lt;br /&gt;
&lt;br /&gt;
Generally this would be called on start-up.  Curse status can be modified by NPCs that can perform purification.&lt;br /&gt;
&lt;br /&gt;
See [[Weight Pendant]] for an example of cursed items.&lt;br /&gt;
&lt;br /&gt;
=== boolean getCursed() ===&lt;br /&gt;
Is this entity cursed?&lt;br /&gt;
&lt;br /&gt;
== Private Methods ==&lt;br /&gt;
&lt;br /&gt;
=== Default versions of functions ===&lt;br /&gt;
These are useful for calling if you want to do some logic first, and then fall back to the usual monster logic.&lt;br /&gt;
&lt;br /&gt;
==== string defaultGetName([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ====&lt;br /&gt;
As of r56.1, this is mostly useful to advanced monster mods, but is available to all entities.  (Entities currently have no way to set the initial name value, so calling the default get name will just return &amp;quot;uninitialized entity&amp;quot;.  It is useful for advanced monster mods since they can set the name via &#039;initialValues&#039; and thus access when UI name is supposed to be sleeping, etc.)&lt;br /&gt;
[[Category:LUA Class Reference]]&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1212</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1212"/>
		<updated>2026-01-09T01:47:38Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Add NameType parameter to name(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name([[Modding:NameType|NameType]] nameType = NameType.Unspecified) ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
A nametype may be parsed to differentiate which type of name is being requested (ex: a button name or dialogue name)&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1211</id>
		<title>Entity Mod JSON Format</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Entity_Mod_JSON_Format&amp;diff=1211"/>
		<updated>2026-01-09T01:43:05Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: Cross reference Defining Names page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entity JSON supports a variety of parameters to create custom objects.  &lt;br /&gt;
&lt;br /&gt;
== Fixed fields ==&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;type&#039;&#039;&#039;&amp;quot; of &amp;quot;ENTITY&amp;quot; should be used when creating an entity mod.&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;id&#039;&#039;&#039;&amp;quot; parameter can be used to refer to this type of entity (for instance in Entity.generate() to programmatically create additional entities).  Be careful not to use the same id as another mod -- if you use the same mod name as your mod wiki page, you can be assured of no conflicts.  (Introduced in r25)&lt;br /&gt;
&lt;br /&gt;
An optional &amp;quot;&#039;&#039;&#039;customPublicFunctions&#039;&#039;&#039;&amp;quot; parameter is an array of custom lua functions that should be publicly available to other lua scripts.  The [[Sample: Radio|radio sample]] shows an example of this.  You can pass and return values, however, it&#039;s recommened to stick with primitive values when possible.  Initial testing shows complex values like Tables and Entities are also okay to pass, but this is not well tested yet.  (Introduced in r35)&lt;br /&gt;
&lt;br /&gt;
== Dynamic fields ==&lt;br /&gt;
JSON definitions can specify each as programmable (LUA) or literal values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Return Type&lt;br /&gt;
!Parameter&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== name ===&lt;br /&gt;
Title of the item.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
=== description ===&lt;br /&gt;
Description of the item when looked at.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerOnEnterRoom ===&lt;br /&gt;
Can be used to present some special text when player enters a room when this object is inside it or prevent the player from entering.  But if it&#039;s not necessary to prevent player from entering, you may want to use the notify version of this function below.  &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene)&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters: &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position)&lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptLeaveRoom ===&lt;br /&gt;
Can be used to prevent player from leaving room when in same room as entity. &lt;br /&gt;
&lt;br /&gt;
Normally true.  If false, will prevent mapscene from doing further room processing (be sure to use a continue scene) &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- currentRoom:String (however, currentRoom is placeholder.  It can be queried for manually if needed based on entity current position) &lt;br /&gt;
&lt;br /&gt;
- destinationRoom:String &lt;br /&gt;
&lt;br /&gt;
- destinationRoomID:int  &lt;br /&gt;
&lt;br /&gt;
(In r51, the internal way playerAttemptLeaveRoom() works changed to use Locations, however, the modding system has not yet been updated.  If you need to use currentRoom or get map information, ask Skye to update this mod API for this function to use Locations also.)  &lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isExaminable ===&lt;br /&gt;
Allow player to examine object?  (This is the page description is displayed on.  Otherwise will be invisible to player).&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isUseable ===&lt;br /&gt;
Display the &#039;use&#039; button on the examine item page?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== doUse ===&lt;br /&gt;
Action to do on using entity.&lt;br /&gt;
&lt;br /&gt;
Usually should return true -- this will cause a continue scene after the text.&lt;br /&gt;
&lt;br /&gt;
For a manual continue or a different scene change, return false.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isPickupable ===&lt;br /&gt;
Should a pick-up item be displayed on item page if item is in the world?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptPickupCheck ===&lt;br /&gt;
Player has opted to pick up the item (may output descriptive message to screen)&lt;br /&gt;
&lt;br /&gt;
Returns if successful in pickup attempt.&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== isDropable ===&lt;br /&gt;
Should a drop item be displayed on item page if item is in inventory?&lt;br /&gt;
|-&lt;br /&gt;
|boolean&lt;br /&gt;
|&lt;br /&gt;
=== playerAttemptDropCheck ===&lt;br /&gt;
Player has opted to drop the item.  Return if successful in drop attempt.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
=== inInventoryTick ===&lt;br /&gt;
Called each turn the item exists in the player&#039;s inventory.&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===inWorldTick===&lt;br /&gt;
Called each turn the item exists on the map somewhere (may not be called if player is on a different map).&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoom===&lt;br /&gt;
Notify object that player has just entered the same room as us.&lt;br /&gt;
&lt;br /&gt;
Okay to output to screen - this is called after showScene() of the room.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerEnterRoomPreScene===&lt;br /&gt;
Notify object that player has just entered the same room as us&lt;br /&gt;
&lt;br /&gt;
This variant happens BEFORE showScene() is called, so is best for when entities are moving in/out based on player actions.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t output to screen using this call - it will be eaten by showScene() &lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoom    String name of room that was arrived from (before this room)&lt;br /&gt;
&lt;br /&gt;
- arrivingFromRoomID    ID of room arriving from (before this room)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|void&lt;br /&gt;
|&lt;br /&gt;
===notifyPlayerLeftRoom===&lt;br /&gt;
Notify entity of the room the player is leaving that the player left successfully.  Entities should not write to the screen since showScene() will immediately overwrite it.&lt;br /&gt;
&lt;br /&gt;
The player&#039;s position has already been updated with the correct location by this point.&lt;br /&gt;
&lt;br /&gt;
As of r35, Lua function will receive these variables as parameters:  &lt;br /&gt;
&lt;br /&gt;
- originalRoomName    &lt;br /&gt;
&lt;br /&gt;
- originalRoomID    &lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===personalName()===&lt;br /&gt;
A name of them as a person (eg: &#039;Micky&#039;) as opposed to the general name above.  This name would be used as the character refers to themselves.  Ie, &#039;I am Micky&#039; as opposed to &#039;I am Cowgirl Micky&#039;.  If you set this, normally the name field would be something more generic, like their species.&lt;br /&gt;
&lt;br /&gt;
Normally when you first encounter an enemy, it just shows their generic type (ex: &amp;quot;AlphaSlug&amp;quot;) as their button (UI Name), which is what the main name field is.  Their dialogue might use their name (the &amp;quot;GameText&amp;quot; name, which pulls from this personalName field), and if they become your owner, their UI name likely becomes something like &amp;quot;&amp;lt;Honorific&amp;gt; &amp;lt;Personal Name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note, if you set this (or usesRandomizedName() below), it is recommended to not set the overall name function.  To set species/initial UI name, you can set the &#039;name&#039; field in &#039;initialValues&#039; instead of the &#039;name&#039; function override.&lt;br /&gt;
&lt;br /&gt;
See also: [[Modding:Defining Names|Defining Names]]&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
===usesRandomizedName()===&lt;br /&gt;
If true, a randomized name will be assigned to this entity.  The name will be a common one related to the assigned pronouns of the entity.  (Mostly makes sense for NPCs)&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===desiredPlayerSubmissiveType()===&lt;br /&gt;
Can define this if the npc is a dom to tell game text what sorts of sub types to use for its variables.  Basically, what sort of dom/sub relationship will the npc form with the player, if the player accepts them as their owner?&lt;br /&gt;
&lt;br /&gt;
Currently, the following sub types are supported:&lt;br /&gt;
*Sub (Default)&lt;br /&gt;
*Breeder&lt;br /&gt;
*Pet&lt;br /&gt;
*Slave&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|&lt;br /&gt;
===pronoun()===&lt;br /&gt;
If an NPC, can set this to the character&#039;s pronouns so gametext variables can refer to them properly.&lt;br /&gt;
&lt;br /&gt;
Currently, the following pronoun types are supported:&lt;br /&gt;
*Unspecified (default)&lt;br /&gt;
*He&lt;br /&gt;
*She&lt;br /&gt;
*Shi&lt;br /&gt;
*It&lt;br /&gt;
*They&lt;br /&gt;
&lt;br /&gt;
Any other string other than the above is currently not supported.&lt;br /&gt;
&lt;br /&gt;
Introduced in r56.1&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
	<entry>
		<id>http://wiki.skycorp.global/index.php?title=Modding:Defining_Names&amp;diff=1210</id>
		<title>Modding:Defining Names</title>
		<link rel="alternate" type="text/html" href="http://wiki.skycorp.global/index.php?title=Modding:Defining_Names&amp;diff=1210"/>
		<updated>2026-01-09T01:41:40Z</updated>

		<summary type="html">&lt;p&gt;SkyCorp: LUA example for Custom (Entity or Adv. Monster)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page will detail some general information about how names are defined for mods.&lt;br /&gt;
&lt;br /&gt;
Most situations will fit into one of the following patterns:&lt;br /&gt;
&lt;br /&gt;
== Simple Monster Mod - Static Name ==&lt;br /&gt;
A simple monster mod (no code) who always has the same name can do something like this:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   ...,&lt;br /&gt;
   &amp;quot;name&amp;quot;: &amp;quot;Harpy&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;See [https://skycorp.global/skyscript/mods/v/6/male-spider Spider] or [https://sclab.skycorp.global/ SCLab] for examples.&lt;br /&gt;
&lt;br /&gt;
== Entities - Static Name ==&lt;br /&gt;
Physical objects (ex: a painting) probably just need a single name, in which case they will not define a dynamic function and just use use the &#039;literalString&#039; functionality.  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   ...,&lt;br /&gt;
   &amp;quot;name&amp;quot;:&lt;br /&gt;
   {&lt;br /&gt;
      &amp;quot;literalString&amp;quot;: &amp;quot;Fox Painting&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Example:  [https://skycorp.global/skyscript/mods/v/27/sample-radio Radio]&lt;br /&gt;
&lt;br /&gt;
== Advanced Monsters - Static Name ==&lt;br /&gt;
Most monsters don&#039;t change names.  In this case, it is fine to use the &#039;initialValues&#039; to set their base name.  This has the advantage that when the UI name changes, the existing logic will handle this because name is not being overridden.  For instance, when the monster sleeps, or becomes your owner.  Example:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Wyvern&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Example:  [https://skycorp.global/skyscript/mods/v/45/wyvern-shemale Wyvern Shemale]&lt;br /&gt;
&lt;br /&gt;
== Advanced Monsters - Personal Name ==&lt;br /&gt;
You may want to have a monster appear to be generic at first, but use a [[Entity Mod JSON Format#personalName()|personal name]] once they become the player&#039;s owner or in gametext.  In this case, you can use the personal name feature:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Fox&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;personalName&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalString&amp;quot;: &amp;quot;Tina&amp;quot;&lt;br /&gt;
  },  &lt;br /&gt;
  &amp;quot;pronoun&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalString&amp;quot;: &amp;quot;she&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Monsters - Random Name ==&lt;br /&gt;
You may want to have many monsters of a specific type (ex: Fox), but each of those monsters have their own individual random name (ex: Veronica, Amy, etc).  In this case, you can use the random name feature:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ...,&lt;br /&gt;
  &amp;quot;initialValues&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;Fox&amp;quot;,&lt;br /&gt;
	...&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;usesRandomizedName&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalBoolean&amp;quot;: true&lt;br /&gt;
  },  &lt;br /&gt;
  &amp;quot;pronoun&amp;quot;: {&lt;br /&gt;
    &amp;quot;literalString&amp;quot;: &amp;quot;she&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Entity Mod JSON Format#pronoun()|Pronoun]] is also set so that the correct name gender will be pulled from the random list.&lt;br /&gt;
&lt;br /&gt;
Example:  SetOwnerWithScene&lt;br /&gt;
&lt;br /&gt;
== Custom (Entity or Adv. Monster) ==&lt;br /&gt;
You can also completely override how name is shown and displayed by implementing &amp;lt;code&amp;gt;name([[Modding:NameType|nameType]])&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function name(nameType)	&lt;br /&gt;
	if nameType == NameType.UI then&lt;br /&gt;
		return &amp;quot;Blep-Button&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if nameType == NameType.GameText then&lt;br /&gt;
		return &amp;quot;Blep-Personal&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;Blep-General&amp;quot;; &lt;br /&gt;
	-- For testing purposes only.  In a real situation, the&lt;br /&gt;
	-- UI and Unspecified types should usually be the same thing.&lt;br /&gt;
	-- Ex: UI&amp;amp;Unspecified is &amp;quot;Fox&amp;quot; and GameText is &amp;quot;Veronica&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;More practically, for advanced monsters, you could also set the name normally, and when needed, override it in certain circumstances, ex:&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function name(nameType)	&lt;br /&gt;
	if blepping == true then&lt;br /&gt;
		return &amp;quot;Blepper&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return this.defaultGetName(nameType);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Most mods won&#039;t need to override the name function like this though to accomplish normal game behavior.&lt;/div&gt;</summary>
		<author><name>SkyCorp</name></author>
	</entry>
</feed>