Modding: Difference between revisions
Match image display sizes to the source document |
Style: no em dashes; Shop keeps only shop-scoped pity info |
||
| Line 1: | Line 1: | ||
''Downwell'' is a GameMaker game, and nearly everything about it | ''Downwell'' is a GameMaker game, and nearly everything about it (sprites, code, sounds) lives in a single <code>data.win</code> file that can be edited with '''UndertaleModTool'''. This page is adapted from [https://docs.google.com/document/d/1bjOP715lMkC5dbPnMfEyhSGs4RvKaqw-OcRUvz6Co_8/ VirtuaVirtue's Downwell Modding Documentation], with additions from this wiki's own decompilation notes. | ||
== Tools required == | == Tools required == | ||
* '''[https://github.com/UnderminersTeam/UndertaleModTool UndertaleModTool]''' | * '''[https://github.com/UnderminersTeam/UndertaleModTool UndertaleModTool]''': the only tool you strictly need. Download a ''Stable'' release ("Bleeding Edge" is newer but less stable). | ||
<div class="dw-shot" style="width:422px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img00.png</div> | <div class="dw-shot" style="width:422px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img00.png</div> | ||
<div class="dw-shot" style="width:624px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img01.png</div> | <div class="dw-shot" style="width:624px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img01.png</div> | ||
* '''Any pixel-precise image editor''' | * '''Any pixel-precise image editor''': Paint.NET, Aseprite, even MS Paint. | ||
<div class="dw-shot" style="width:216px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img02.png</div> | <div class="dw-shot" style="width:216px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img02.png</div> | ||
| Line 12: | Line 12: | ||
C:\Program Files (x86)\Steam\steamapps\common\Downwell\data.win | C:\Program Files (x86)\Steam\steamapps\common\Downwell\data.win | ||
'''Make a backup of <code>data.win</code> before editing | '''Make a backup of <code>data.win</code> before editing: you are modifying the game itself.''' | ||
== Tutorial: new upgrades == | == Tutorial: new upgrades == | ||
| Line 21: | Line 21: | ||
Each upgrade is one sprite with two frames: | Each upgrade is one sprite with two frames: | ||
* '''Frame 0''' | * '''Frame 0''': the selection icon shown on the end-of-level choice screen. 24×24 pixels. | ||
* '''Frame 1''' | * '''Frame 1''': the inventory icon shown in the corner once taken. 12×12 pixels. | ||
<div class="dw-shot" style="width:142px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img03.png</div> | <div class="dw-shot" style="width:142px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img03.png</div> | ||
<div class="dw-shot" style="width:59px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img04.png</div> | <div class="dw-shot" style="width:59px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img04.png</div> | ||
| Line 46: | Line 46: | ||
<div class="dw-shot" style="width:255px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img08.png</div> | <div class="dw-shot" style="width:255px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img08.png</div> | ||
<div class="dw-shot" style="width:290px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img09.png</div> | <div class="dw-shot" style="width:290px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img09.png</div> | ||
# Find your sprite in the ''Sprites'' section and check its properties | # Find your sprite in the ''Sprites'' section and check its properties; most importantly, the '''origin must be 12×12''' so the icons align in the menu and inventory. | ||
<div class="dw-shot" style="width:491px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img10.png</div> | <div class="dw-shot" style="width:491px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img10.png</div> | ||
<div class="dw-shot" style="width:624px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img11.png</div> | <div class="dw-shot" style="width:624px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img11.png</div> | ||
| Line 54: | Line 54: | ||
=== language.ini === | === language.ini === | ||
All of the game's text lives in <code>language.ini</code> next to <code>data.win</code>. Add your upgrade's name to the <code>ugName</code> section | All of the game's text lives in <code>language.ini</code> next to <code>data.win</code>. Add your upgrade's name to the <code>ugName</code> section; the last vanilla entry is <code>ugName22</code>. Entries for the other languages are optional, but without them those languages show a blank name and description. | ||
<div class="dw-shot" style="width:567px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img14.png</div> | <div class="dw-shot" style="width:567px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img14.png</div> | ||
<div class="dw-shot" style="width:194px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img15.png</div> | <div class="dw-shot" style="width:194px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img15.png</div> | ||
| Line 71: | Line 71: | ||
| <code>ug[i][0]</code> || Name (shown on the choice screen) | | <code>ug[i][0]</code> || Name (shown on the choice screen) | ||
|- | |- | ||
| <code>ug[i][1]</code> || Copies currently owned | | <code>ug[i][1]</code> || Copies currently owned. The game resets it; leave at 0 | ||
|- | |- | ||
| <code>ug[i][2]</code> || Sprite '''index'''. The first sprite a mod imports lands at index 741; add 1 per additional sprite | | <code>ug[i][2]</code> || Sprite '''index'''. The first sprite a mod imports lands at index 741; add 1 per additional sprite | ||
| Line 77: | Line 77: | ||
| <code>ug[i][3]</code> || Description; <code>#</code> is a line break | | <code>ug[i][3]</code> || Description; <code>#</code> is a line break | ||
|- | |- | ||
| <code>ug[i][4]</code> || Maximum copies obtainable. The pickers only offer an upgrade while <code>ug[i][1] < ug[i][4]</code> | | <code>ug[i][4]</code> || Maximum copies obtainable. The pickers only offer an upgrade while <code>ug[i][1] < ug[i][4]</code>; vanilla entries with 0 here (Dumbbell, Super Charge, Sudden Fortune) are cut content that can never appear. Leave at 1 | ||
|- | |- | ||
| <code>ug[i][5]</code> || Price in gems | | <code>ug[i][5]</code> || Price in gems. '''Only read for the shop consumables''' (indexes 100–105); dead data for regular upgrades. Leave at 200 | ||
|- | |- | ||
| <code>ug[i][6]</code> || Japanese name | | <code>ug[i][6]</code> || Japanese name | ||
| Line 110: | Line 110: | ||
<div class="dw-shot" style="width:164px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img27.png</div> | <div class="dw-shot" style="width:164px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img27.png</div> | ||
Import exactly as in the upgrade tutorial, then check the sprite properties | Import exactly as in the upgrade tutorial, then check the sprite properties; here the '''origin must be 6×6'''. | ||
<div class="dw-shot" style="width:416px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img28.png</div> | <div class="dw-shot" style="width:416px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img28.png</div> | ||
=== language.ini === | === language.ini === | ||
Add the style's name to the <code>styleName</code> section | Add the style's name to the <code>styleName</code> section; the last vanilla entry is <code>styleName4</code>. | ||
<div class="dw-shot" style="width:567px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img29.png</div> | <div class="dw-shot" style="width:567px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img29.png</div> | ||
<div class="dw-shot" style="width:194px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img30.png</div> | <div class="dw-shot" style="width:194px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img30.png</div> | ||
| Line 124: | Line 124: | ||
Four scripts, all found by searching ''style'': | Four scripts, all found by searching ''style'': | ||
# <code>gml_GlobalScript_styleInit</code> | # <code>gml_GlobalScript_styleInit</code>: declares each style's name and animation sprite indexes (index variable <code>s</code>, incremented per style like the upgrade table). Point the animation fields at your imported sprite indexes (double-click a sprite; its index is shown at the bottom right). | ||
<div class="dw-shot" style="width:236px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img32.png</div> | <div class="dw-shot" style="width:236px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img32.png</div> | ||
<div class="dw-shot" style="width:214px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img33.png</div> | <div class="dw-shot" style="width:214px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img33.png</div> | ||
| Line 132: | Line 132: | ||
<div class="dw-shot" style="width:501px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img37.png</div> | <div class="dw-shot" style="width:501px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img37.png</div> | ||
<div class="dw-shot" style="width:478px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img38.png</div> | <div class="dw-shot" style="width:478px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img38.png</div> | ||
# <code>gml_GlobalScript_styleUpdate</code> | # <code>gml_GlobalScript_styleUpdate</code>: runs when a style is selected and sets the player's stats. Copy an existing <code>case</code> to the end and adjust. Vanilla <code>gunType</code> values are 0–6 (see the [[#Reference: weapon stats|weapon table]]). | ||
<div class="dw-shot" style="width:236px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img39.png</div> | <div class="dw-shot" style="width:236px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img39.png</div> | ||
<div class="dw-shot" style="width:256px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img40.png</div> | <div class="dw-shot" style="width:256px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img40.png</div> | ||
<div class="dw-shot" style="width:428px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img41.png</div> | <div class="dw-shot" style="width:428px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img41.png</div> | ||
<div class="dw-shot" style="width:493px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img42.png</div> | <div class="dw-shot" style="width:493px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img42.png</div> | ||
# <code>gml_GlobalScript_styleSet</code> | # <code>gml_GlobalScript_styleSet</code>: declares the animations again; possibly never called, but add your style for good practice. | ||
<div class="dw-shot" style="width:236px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img43.png</div> | <div class="dw-shot" style="width:236px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img43.png</div> | ||
<div class="dw-shot" style="width:205px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img44.png</div> | <div class="dw-shot" style="width:205px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img44.png</div> | ||
<div class="dw-shot" style="width:341px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img45.png</div> | <div class="dw-shot" style="width:341px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img45.png</div> | ||
<div class="dw-shot" style="width:261px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img46.png</div> | <div class="dw-shot" style="width:261px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img46.png</div> | ||
# <code>gml_Object_PlayMenu_Create_0</code> (search ''playmenu'') | # <code>gml_Object_PlayMenu_Create_0</code> (search ''playmenu''): increment <code>styleMax</code> by 1 so the menu shows your style. | ||
<div class="dw-shot" style="width:209px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img47.png</div> | <div class="dw-shot" style="width:209px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img47.png</div> | ||
<div class="dw-shot" style="width:301px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img48.png</div> | <div class="dw-shot" style="width:301px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img48.png</div> | ||
| Line 151: | Line 151: | ||
A new style starts locked with no unlock condition. Either: | A new style starts locked with no unlock condition. Either: | ||
* add it to the unlock tables | * add it to the unlock tables: an entry in <code>gml_GlobalScript_unlockGoalNum</code> (shifting the later indexes) and a <code>case</code> in <code>gml_GlobalScript_unlockNotice</code>; or | ||
<div class="dw-shot" style="width:346px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img51.png</div> | <div class="dw-shot" style="width:346px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img51.png</div> | ||
<div class="dw-shot" style="width:358px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img52.png</div> | <div class="dw-shot" style="width:358px">https://pix-equivalent-burst-tested.trycloudflare.com/extensions/DownwellTheme/resources/modding/img52.png</div> | ||
| Line 169: | Line 169: | ||
! Stat !! Meaning | ! Stat !! Meaning | ||
|- | |- | ||
| <code>bStatName</code> || Pickup name, quoted, usually capitalised | | <code>bStatName</code> || Pickup name, quoted, usually capitalised, e.g. <code>"NOPPY"</code> | ||
|- | |- | ||
| <code>bStatGunSprite</code> || Letter shown on the collectible: position in the alphabet minus one (11 = "L") | | <code>bStatGunSprite</code> || Letter shown on the collectible: position in the alphabet minus one (11 = "L") | ||
|- | |- | ||
| <code>bStatObject</code> || Bullet object index | | <code>bStatObject</code> || Bullet object index: 261 for MACHINEGUN/SHOTGUN/TRIPLE/PUNCHER/BURST/NOPPY, 260 for LASER | ||
|- | |- | ||
| <code>bStatBulletSprite</code> || Bullet sprite index (LASER: 466 normal, 465 gem high) | | <code>bStatBulletSprite</code> || Bullet sprite index (LASER: 466 normal, 465 gem high) | ||
| Line 183: | Line 183: | ||
| <code>bStatConRate</code> || Charge consumed per shot | | <code>bStatConRate</code> || Charge consumed per shot | ||
|- | |- | ||
| <code>bStatRof</code> || Rate of fire | | <code>bStatRof</code> || Rate of fire; lower is faster; negatives appear to disable it | ||
|- | |- | ||
| <code>bStatRecoil</code> || Vertical speed lost when firing | | <code>bStatRecoil</code> || Vertical speed lost when firing | ||
| Line 193: | Line 193: | ||
| <code>bStatBurst</code> || Burst-fire flag; only SHOTGUN and BURST set 1 | | <code>bStatBurst</code> || Burst-fire flag; only SHOTGUN and BURST set 1 | ||
|- | |- | ||
| <code>bStatBurstRate</code> || Delay between burst bullets | | <code>bStatBurstRate</code> || Delay between burst bullets; lower is faster | ||
|- | |- | ||
| <code>bStatBurstAmount</code> || Bullets per trigger pull | | <code>bStatBurstAmount</code> || Bullets per trigger pull | ||
| Line 207: | Line 207: | ||
| <code>bStatWave</code> || Unused | | <code>bStatWave</code> || Unused | ||
|- | |- | ||
| <code>bStatExplode</code> || Unused by vanilla | | <code>bStatExplode</code> || Unused by vanilla; set 1 and every bullet explodes; balance accordingly | ||
|- | |- | ||
| <code>bStatRangeRandom</code> / <code>bStatRangeTimer</code> || Bullet lifetime and its randomisation (how SHOTGUN pellets vanish unevenly) | | <code>bStatRangeRandom</code> / <code>bStatRangeTimer</code> || Bullet lifetime and its randomisation (how SHOTGUN pellets vanish unevenly) | ||
| Line 215: | Line 215: | ||
| <code>bStatSpTy1</code>–<code>3</code> || Undetermined; copy from the closest vanilla weapon | | <code>bStatSpTy1</code>–<code>3</code> || Undetermined; copy from the closest vanilla weapon | ||
|- | |- | ||
| <code>bStatAimAngleAccl</code> / <code>Dccl</code> / <code>Limit</code> || Aim rotation speed/deceleration/max angle | | <code>bStatAimAngleAccl</code> / <code>Dccl</code> / <code>Limit</code> || Aim rotation speed/deceleration/max angle; only NOPPY aims (limit 25) | ||
|} | |} | ||
[[Category:Modding]] | [[Category:Modding]] | ||