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 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.
''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]''' the only tool you strictly need. Download a ''Stable'' release ("Bleeding Edge" is newer but less stable).
* '''[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''' Paint.NET, Aseprite, even MS Paint.
* '''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 you are modifying the game itself.'''
'''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''' the selection icon shown on the end-of-level choice screen. 24×24 pixels.
* '''Frame 0''': the selection icon shown on the end-of-level choice screen. 24×24 pixels.
* '''Frame 1''' the inventory icon shown in the corner once taken. 12×12 pixels.
* '''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 most importantly the '''origin must be 12×12''' so the icons align in the menu and inventory.
# 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 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.
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 — the game resets it; leave at 0
| <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> vanilla entries with 0 here (Dumbbell, Super Charge, Sudden Fortune) are cut content that can never appear. Leave at 1
| <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 '''only read for the shop consumables''' (indexes 100–105); dead data for regular upgrades. Leave at 200
| <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 here the '''origin must be 6×6'''.
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 the last vanilla entry is <code>styleName4</code>.
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> 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).
# <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> 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]]).
# <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> declares the animations again; possibly never called, but add your style for good practice.
# <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'') increment <code>styleMax</code> by 1 so the menu shows your style.
# <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 an entry in <code>gml_GlobalScript_unlockGoalNum</code> (shifting the later indexes) and a <code>case</code> in <code>gml_GlobalScript_unlockNotice</code> or
* 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 e.g. <code>"NOPPY"</code>
| <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 261 for MACHINEGUN/SHOTGUN/TRIPLE/PUNCHER/BURST/NOPPY, 260 for LASER
| <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 lower is faster; negatives appear to disable it
| <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 lower is faster
| <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 set 1 and every bullet explodes; balance accordingly
| <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 only NOPPY aims (limit 25)
| <code>bStatAimAngleAccl</code> / <code>Dccl</code> / <code>Limit</code> || Aim rotation speed/deceleration/max angle; only NOPPY aims (limit 25)
|}
|}


[[Category:Modding]]
[[Category:Modding]]