Newer saves include an element palette which maps save-space element numbers to element identifier strings, see 29189693b381. This is useful because the numbers of custom elements can change, while their identifiers are expected to not change. Not all elements make it into the palette, only the ones that are in use in the save. 98.0 is staged to extend this feature in two ways. First, it'll warn the user of missing custom elements when loading a save that uses such elements, see 36800a76cd97. Second, it'll do a better job of deciding what to put in the element palette, see a13c29875f64. In order for detection of missing elements to work, a save's palette has to account for every element number used in the save, including built-in elements. To dispel a misunderstanding regarding that last part: yes, including built-in elements is not crucial if the set of built-in elements only ever grows, but this is not guaranteed. 98.0 creates such palettes, but older code didn't, for various reasons. One reason is that the palette at some point wasn't meant to include built-in elements, see e0d982367b71, although this was rectified later in 67b87b1dab9f. Another reason is that not all cases of element numbers encoded in particle properties were considered, see for example f45d0d1683ed and 1f1062408c98. Palettes in existing saves being thus incomplete didn't use to be a problem because older code would just assume that whatever element number wasn't listed in the palette referred to a built-in element and would just map such save-space element numbers to the same simulation-space element number, hence identity mapping. However, this approach doesn't cover custom elements whose numbers can change, nor does it cover extra built-in elements added by a mod. Worse, a different mod with different extra built-in elements may map save-space element numbers not listed in the palette to its own extra elements. As a solution to these problems and making use of the fact that palettes are now complete and comprehensive, 98.0 no longer does this default identity mapping, see 73be29aa6113. Removing this identity mapping in itself would have broken older saves that use the old identifiers of some elements; that commit works around that by remapping these early in the loading process. By the way, these changes in identifiers are perfect examples of the set of built-in elements changing in ways other than growing. This still doesn't address the problem in the case of pre-98.0 saves though. Such saves have seemingly valid element numbers (although it's impossible to tell whether these refer to built-in elements from vanilla or extra built-in elements from a mod) but no corresponding entry in their palettes. The user is warned about such elements also, see 9f8449357f73. Lacking a better solution, this commit assumes that these elements are indeed vanilla elements and re-enables the default identity mapping for such saves. In summary, this commit fixes the loading process for saves that were made in 97.0 or some older version and use built-in vanilla elements in ways that didn't trigger their inclusion in the element palette. For example, until a13c29875f64, CONV's tmp was not considered by the palette code, so any CONV with tmp set to an element that wasn't a built-in vanilla element, and which also wasn't used anywhere else in the save, would have been potentially corrupted by the loading process. An example a save that demonstrates this behaviour is id:2633868, which has CRAY particles on the right with ctype set to LIGH, but until this commit, these ctypes would have been set to 0 and the user would have been warned about element number 87 (LIGH) missing from the palette.
The Powder Toy - January 2023
Get the latest version from the Powder Toy website.
To use online features such as saving, you need to register an account. You can also visit the official TPT forum.
Have you ever wanted to blow something up? Or maybe you always dreamt of operating an atomic power plant? Do you have a will to develop your own CPU? The Powder Toy lets you to do all of these, and even more!
The Powder Toy is a free physics sandbox game, which simulates air pressure and velocity, heat, gravity and a countless number of interactions between different substances! The game provides you with various building materials, liquids, gases and electronic components which can be used to construct complex machines, guns, bombs, realistic terrains and almost anything else. You can then mine them and watch cool explosions, add intricate wirings, play with little stickmen or operate your machine. You can browse and play thousands of different saves made by the community or upload your own – we welcome your creations!
There is a Lua API – you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development.
Build instructions
See the Powder Toy Development Help section on the main page of the wiki.
Thanks
- Stanislaw K Skowronek - Designed the original
- Simon Robertshaw
- Skresanov Savely
- cracker64
- Catelite
- Victoria Hoyle
- Nathan Cousins
- jacksonmj
- Felix Wallin
- Lieuwe Mosch
- Anthony Boot
- Me4502
- MaksProg
- jacob1
- mniip
- LBPHacker
Libraries and other assets used
Instructions
Click on the elements with the mouse and draw in the field, like in MS Paint. The rest of the game is learning what happens next.
Controls
Key | Action |
---|---|
TAB | Switch between circle/square/triangle brush |
Space | Pause |
Q / Esc | Quit |
Z | Zoom |
S | Save stamp (use with Ctrl when STK2 is out) |
L | Load last saved stamp |
K | Stamp library |
0-9 | Set view mode |
P / F2 | Save screenshot as .png |
E | Bring up element search |
F | Pause and step to next frame |
G | Increase grid size |
Shift + G | Decrease grid size |
H | Show/Hide HUD |
Ctrl + H / F1 | Show intro text |
D / F3 | Debug mode (use with Ctrl when STK2 is out) |
I | Invert Pressure and Velocity map |
W | Cycle gravity modes (use with Ctrl when STK2 is out) |
Y | Cycle air modes |
Ctrl + E | Cycle edge modes |
B | Enter decoration editor menu |
Ctrl + B | Toggle decorations on/off |
N | Toggle Newtonian Gravity on/off |
U | Toggle ambient heat on/off |
Ctrl + I | Install powder toy, for loading saves/stamps by double clicking |
Backtick | Toggle console |
= | Reset pressure and velocity map |
Ctrl + = | Reset Electricity |
[ | Decrease brush size |
] | Increase brush size |
Alt + [ | Decrease brush size by 1 |
Alt + ] | Increase brush size by 1 |
Ctrl + C/V/X | Copy/Paste/Cut |
Ctrl + Z | Undo |
Ctrl + Y | Redo |
Ctrl + Cursor drag | Rectangle |
Shift + Cursor drag | Line |
Middle click | Sample element |
Alt + Left click | Sample element |
Mouse scroll | Change brush size |
Ctrl + Mouse scroll | Change vertical brush size |
Shift + Mouse scroll | Change horizontal brush size |
Shift + R | Horizontal mirror for selected area when pasting stamps |
Ctrl + Shift + R | Vertical mirror for selected area when pasting stamps |
R | Rotate selected area counterclockwise when pasting stamps |
Command Line
Command | Description | Example |
---|---|---|
scale:SIZE |
Change window scale factor | scale:2 |
kiosk |
Fullscreen mode | |
proxy:SERVER[:PORT] |
Proxy server to use | proxy:wwwcache.lancs.ac.uk:8080 |
open FILE |
Opens the file as a stamp or game save | |
ddir DIRECTORY |
Directory used for saving stamps and preferences | |
ptsave:SAVEID |
Open online save, used by ptsave: URLs | ptsave:2198 |
disable-network |
Disables internet connections | |
disable-bluescreen |
Disable bluescreen handler | |
redirect |
Redirects output to stdout.txt / stderr.txt | |
cafile:CAFILE |
Set certificate bundle path | cafile:/etc/ssl/certs/ca-certificates.crt |
capath:CAPATH |
Set certificate directory path | capath:/etc/ssl/certs |