Commit Graph

6266 Commits

Author SHA1 Message Date
Tamás Bálint Misius
365162e131 Snapshot 388 snapshot-388 2025-06-25 12:25:00 +02:00
Saveliy Skresanov
d30aa74ac6 Fix infinite air heat near the boundary 2025-06-25 11:57:32 +02:00
Saveliy Skresanov
b77a1cba2c Add vorticity confinement
This also adds a vorticity view and appropriate Lua bindings.
2025-06-25 11:56:59 +02:00
Tamás Bálint Misius
8f7bf47d78 Clean up RequestManager configuration code slightly 2025-06-25 11:33:52 +02:00
Tamás Bálint Misius
61dfba1e80 Apply proxy settings to Lua API sockets 2025-06-25 10:28:59 +02:00
Tamás Bálint Misius
6e54da7a17 Update tpt-libs 2025-06-22 20:35:52 +02:00
Tamás Bálint Misius
7c3f922406 Disable pretty powders while loading saves
This should and indeed mostly does not have any observable effect because any particle created with create_part for being loaded from a save is overwritten with data from the save anyway. However, if pretty powders is on, create_part uses Simulation::rng to make powders pretty, and that just gets in the way of debugging when relying on determinism.
2025-06-12 19:15:14 +02:00
Tamás Bálint Misius
8c321a03bb Fix returning true from event handlers not doing anything
Returning true is meant to consume the event, thereby preventing remaining event handlers and the rest of the game from handling it, but the check that implements this was accidentally removed in 87b81ceb45, oops.
2025-06-08 18:41:40 +02:00
Sergei Trofimovich
2df4e31e5f src/lua/LuaSocketDefault.cpp: add missing <climits> include (#1007)
Without the change the build fails on upcoming `gcc-16` as:

    ../src/lua/LuaSocketDefault.cpp: In function 'void LuaSocket::Timeout(double)':
    ../src/lua/LuaSocketDefault.cpp:21:31: error: 'INT_MAX' was not declared in this scope
       21 |                 if (timeout > INT_MAX) timeout = INT_MAX;
          |                               ^~~~~~~
    ../src/lua/LuaSocketDefault.cpp:6:1: note: 'INT_MAX' is defined in header '<climits>'; this is probably fixable by adding '#include <climits>'
        5 | #include <sys/time.h>
      +++ |+#include <climits>
        6 | #include <time.h>
2025-06-07 20:28:19 +00:00
Tamás Bálint Misius
611be5b94e Add TempScale enum 2025-06-07 20:36:49 +02:00
Tamás Bálint Misius
e7cc43e689 Use X macros here and there
Specifically for lists of element and tool numbers, and clipboard implementations. These higher-level macros allow lower-level macros meant to be applied to each item in a list to be defined at the application site of the higher-level macro, slightly increasing readability. See https://en.wikipedia.org/wiki/X_macro
2025-06-05 00:16:18 +02:00
Tamás Bálint Misius
ebb3638413 Fix various warnings that had piled up 2025-06-04 21:31:39 +02:00
Tamás Bálint Misius
bb4251adef Bump some ghactions jobs to windows-2022 2025-06-04 15:53:23 +02:00
Tamás Bálint Misius
d14d35982a Fix parsing HTTP headers after redirects 2025-06-04 14:39:16 +02:00
Tamás Bálint Misius
9c35c537e5 Cache running status of Lua HTTP requests
This ensures that the API is used correctly (i.e. without relying on blocking loops) by guaranteeing that blocking behaviour freezes the game.

Blocking until requests finish has always been bad practice and could/would freeze the game until the request manager finished handling the request, which could take as much as 30 seconds in some cases, or however much of your time the network felt like wasting, or it could even be guaranteed to permanently freeze the game on e.g. emscripten, where the request manager runs on the same thread as the rest of the game. It's just "luck" that in the vast majority of cases this was imperceptible because of good connectivity and because nobody uses the emscripten port.
2025-06-04 14:34:52 +02:00
Tamás Bálint Misius
bf7f40108e Specify working directory for the serve-locally target
Meson doc says that run_targets are run in an unspecified directory.
2025-05-12 19:49:14 +02:00
Tamás Bálint Misius
0096d27d25 Add run-target serve-locally to emscripten builds
Invoke with:

	ninja serve-locally

Also fix emscripten builds on some systems where emscripten suddenly needs USE_PTHREADS (?????). Also fix JS-unsafe app_exe values breaking builds.
2025-05-10 16:15:17 +02:00
jacob1
ad9a63128b Fix STKM never darkening in FIND mode ... unless you were trying to find it
(broken since ef04068a85)
2025-05-07 23:53:03 -04:00
Tamás Bálint Misius
6784d8a10f Share object files between powder/render/font
I'm not sure why we weren't using static_libraries to begin with; most likely because the object files (as opposed to the sources) were not possible to share due to different sets of macros being defined in cpp_args, see 3a591b8539 to 4f0c365e05.
2025-05-07 19:23:17 +02:00
Tamás Bálint Misius
3511d047ac Fix CI
I forgot to adjust the pattern build.sh looked for in 49991b5915 so this commit started out as a simple fix that did that, but then I realized that the project call in meson.build had grown too complicated to be tractable with grep so I moved version number enforcement to prepare.py.
snapshot-387
2025-05-07 12:48:22 +02:00
Tamás Bálint Misius
4ffa7f0ce8 Snapshot 387 2025-05-07 11:50:35 +02:00
Tamás Bálint Misius
940c9eb209 Move some Lua context asserts to LSI's header 2025-05-06 21:38:47 +02:00
Tamás Bálint Misius
3adf6ef91c Disallow particle lifetime management in some contexts
Namely, in Create and ChangeType callbacks, which are themselves called by such lifetime management functions. Lifetime management includes explicit actions via partCreate and partKill, but also implicit ones such as changing the type property or changing x or y properties to values that move the particle beyond the edges and causes it to be killed.
2025-05-06 21:36:07 +02:00
Tamás Bálint Misius
f65c4ee4e1 Make tools (and thus elements) read-only in some contexts
Namely, in Select and Click tool callbacks, which are otherwise interface contexts and allow changing tools. This may cause use-after-free but it's much more likely to cause stack overflows. Importantly, the setter usage of ui.activeTool is considered to change tool state because it invokes Select callbacks.
2025-05-06 21:32:41 +02:00
Tamás Bálint Misius
b464c3aa3f Make the simulation read-only in some contexts
Namely, BEFORESIMDRAW/AFTERSIMDRAW event handlers, and CreateAllowed and Graphics functions.
2025-05-06 21:32:39 +02:00
Tamás Bálint Misius
6d720bc79c Restrict graphics functions to graphics contexts
gfx.textSize/getColors/getHexColor are exempt because they don't change any state that we care about and seem easy to deal with in general.
2025-05-06 17:57:01 +02:00
Tamás Bálint Misius
e44e77f6d6 Prevent CtypeDraw from being called in simulation contexts
CtypeDraw is already not an interface event, so to prevent parts of the call stack from being upgraded back to interface event status is not why this change is necessary. Rather, it is necessary because some Lua functions that are allowed to be called from non-interface events may indirectly invoke CtypeDraw, which is most likely unintended. Ctype-drawing is intended to be an interface feature, not something that e.g. an Update function creating a circle of particles should invoke.

Also make the flags parameter mandatory across all relevant functions because it's too easy to add a millionth int parameter and forget to update all call sites.
2025-05-06 15:57:42 +02:00
Tamás Bálint Misius
e6f297680b Formalize event handlers as stackable
It seems event handlers may be invoked from event handlers, which 87b81ceb45 did not anticipate, oops.
2025-05-05 10:32:59 +02:00
Tamás Bálint Misius
96cd4b6996 Fix intermittent failure to call event handlers
The wrong value got duplicated in 87b81ceb45, oops. Makes you wonder how the script in the commit message worked at all.
2025-05-05 10:32:32 +02:00
Tamás Bálint Misius
87b81ceb45 Simplify event handler management
Semantics are mostly the same:

 - event.register pushes a handler at the end of the handler chain, such that it has the lowest priority
 - event.unregister removes at most one handler, which is the first one that matches
 - a handler failing causes it to be removed from the chain

But removing handlers from the chain doesn't mess up handler order for the frame anymore: until this commit, removing a handler from the chain would shift all handlers in the chain while it was being traversed, which meant that some handlers were always skipped whenever any were removed.

Validate this with the following script:

	local t = {}
	for i = 1, 10 do
		table.insert(t, i)
	end
	for i = #t - 1, 1, -1 do
		local j = math.random(1, i)
		t[i], t[j] = t[j], t[i]
	end
	print(table.concat(t, " "))
	event.register(event.MOUSEDOWN, function()
		print("=====")
	end)
	for i = 1, #t do
		local c = t[i]
		local function f()
			print(i)
			c = c - 1
			if c == 0 then
				event.unregister(event.MOUSEDOWN, f)
			end
		end
		event.register(event.MOUSEDOWN, f)
	end

The expected behaviour is that numbered event handlers are removed once they've been run as many times as the correspondingly numbered entry in t dictates. This, among other things, means that exactly one event handler is removed every MOUSEDOWN. This was absolutely not the case until now; removals were all over the place.
2025-05-03 16:56:27 +02:00
Tamás Bálint Misius
70298b63d0 Print messages to stdout even if the console is open
The idea behind not calling GameModel::Log in tpt.log is that that would not only print the message to stdout but also add it to GameView's list of log entries, which the console doesn't want. Sadly, this meant that messages also didn't make it to stdout when the console was open.
2025-05-03 12:13:17 +02:00
Tamás Bálint Misius
e301c7fe01 Add 'console' command line argument
This opens a console window on Windows but does nothing anywhere else. Overrides 'redirect'.

Useful on Windows because the only way to access standard streams there is by tail -f'ing stdout/err.txt.
2025-05-03 12:13:17 +02:00
Saveliy Skresanov
afe35312e1 Reduce gravity effects on ambient heat. 2025-04-19 11:13:44 +07:00
Tamás Bálint Misius
f2cd4dd15c Enable dynamic heat display with Shift+6 2025-04-16 18:59:14 +02:00
Tamás Bálint Misius
0bf4bf41f8 Take COLOUR_HEAT into account in heat display limit calculation 2025-04-16 18:29:55 +02:00
Tamás Bálint Misius
29e4e68041 Make heat display scale variable
No UI for it yet though.
2025-04-16 10:32:51 +02:00
Tamás Bálint Misius
b1290d2803 Unsplit RendererBasic
Some functionality was split into RendererBasic.cpp from Renderer.cpp in f0ffa2eeb1, where the FONTEDITOR macro was removed, whose purpose was to exclude all simulation-aware code from the font editor. I'm not entirely sure why this split was necessary; the font editor had been using Graphics and not Renderer even back then. I probably just took the simple route and split everything not under #ifndef FONTEDITOR into its own file. The only thing it relied on in RendererBasic.cpp was Gradient, which this commit splits off.
2025-04-16 08:54:02 +02:00
jacob1
5150811313 Fix infinite loop on some platforms when particle velocity is NaN 2025-03-27 00:32:22 -04:00
Tamás Bálint Misius
49991b5915 Clarify version number meaning in meson.build
Also make it easier to customize it without merge conflicts.
2025-03-20 00:29:58 +01:00
Tamás Bálint Misius
9992a26e7d Fix elem.loadDefault handling element tools wrong
Firstly, it would not remove custom element tools when appropriate, reproduce with

	elem.allocate("CUSTOM", "FAKE")
	elem.element(elem.CUSTOM_PT_FAKE, elem.element(elem.DEFAULT_PT_SLCN))
	elem.loadDefault()
	elem.allocate("CUSTOM", "FAKE")
	elem.element(elem.CUSTOM_PT_FAKE, elem.element(elem.DEFAULT_PT_SLCN))

There will be two FAKE element tools, one of them in the Tools section, called NULL, and looking very default. Broken since ff4500620e, where I assumed that builtinElements's size reflected the amount of enabled built-in elements. This has not been the case at all since dd875987b9, where GetElements was made to return a PT_NUM-sized array instead of a vector with only built-in elements, and so its size increased to PT_NUM, including all possible element numbers. But, strictly speaking, even before that it had not been a correct assumption, because some entries (e.g. 146) of builtinElements could have been disabled, but were possible to allocate from Lua.

Secondly, it would not update built-in element tools when appropriate, reproduce with

	elem.property(elem.DEFAULT_PT_SLCN, "Name", "FAKE")
	elem.loadDefault()

SLCN's tool will still be called FAKE. Also broken since ff4500620e, where I neglected to deal with element tools whose elements got updated under them. At the time this would have been done by calling AllocElementTool on them again, but today the appropriate way is UpdateElementTool.
2025-03-19 19:58:23 +01:00
Tamás Bálint Misius
91e4b0d173 Unmark some Lua tool callbacks as interface events
A future change will ensure that tools kept active by e.g. holding a mouse button have their appropriate callbacks run exactly once every simulation frame, which will make their "potency" constant from the simulation's point of view in terms of timescale. A past change already allows simulation frames to happen without a corresponding tick event in an interface context, which is when tool callbacks would be run. This necessitates unmarking some tool callbacks as interface events, as they will be called from a simulation context at times. A list of API changes follows.

 name                           | change
--------------------------------|----------------------------------------
 [tool].Drag callback           | unmade an interface event
 [tool].Draw callback           | unmade an interface event
 [tool].DrawFill callback       | unmade an interface event
 [tool].DrawLine callback       | unmade an interface event
 [tool].DrawRect callback       | unmade an interface event
 [tool].Perform callback        | unmade an interface event
2025-03-19 18:28:47 +01:00
Tamás Bálint Misius
d4363b7f0a Allow common use cases of sim.createParts/Line/Box in simulation contexts 2025-03-16 21:31:02 +01:00
Tamás Bálint Misius
00bfd304ac Reword workaround_elusive_bzip2 description
According to the wording on the wiki, which I like more.
2025-03-15 12:40:29 +01:00
Tamás Bálint Misius
97d443531e Move version strings to meson.build
This makes it possible for meson to detect changes to these version numbers, unlike when they were just the default values for options that build sites would retain and fall out of sync.
2025-03-15 12:09:03 +01:00
jm211
56ede6caad Fog/Rime can absorb gas to become acidic, condense to acid (#999) 2025-03-15 00:12:25 -04:00
jacob1
917b299ecd Use transfer_part_to_pipe in special sim code that puts energy particles inside PIPE
This fixes heat and deco not being handled in line with recent changes.

PIPE's update loop could also be changed to handle energy particles there. This would be better, and I might do it (compatibility risks are probably low)
2025-03-15 00:03:07 -04:00
jacob1
c64d2ecb8c Snapshot 386 snapshot-386 2025-03-12 23:39:15 -04:00
jacob1
9931906f8d Change TPT -> The Powder Toy in credits ui 2025-03-12 23:37:01 -04:00
Tamás Bálint Misius
3e791bb235 Restrict some of the Lua API to interface events
This makes it easier to separate the simulation and related structures from the main thread later. A list of API changes follows.

 name                           | change
--------------------------------|----------------------------------------
 [autorun.lua]                  | made an interface event
 [console input]                | made an interface event
 [sign].displayText             | restricted to interface events
 [sign].height                  | restricted to interface events
 [sign].justification           | restricted to interface events
 [sign].screenX                 | restricted to interface events
 [sign].screenY                 | restricted to interface events
 [sign].text                    | restricted to interface events
 [sign].width                   | restricted to interface events
 [sign].x                       | restricted to interface events
 [sign].y                       | restricted to interface events
 [tool].Click callback          | made an interface event
 [tool].Drag callback           | made an interface event
 [tool].Draw callback           | made an interface event
 [tool].DrawFill callback       | made an interface event
 [tool].DrawLine callback       | made an interface event
 [tool].DrawRect callback       | made an interface event
 [tool].Perform callback        | made an interface event
 [tool].Select callback         | made an interface event
 Button:action callback         | made an interface event
 Button:action                  | restricted to interface events
 Button:enabled                 | restricted to interface events
 Button:position                | restricted to interface events
 Button:size                    | restricted to interface events
 Button:text                    | restricted to interface events
 Button:visible                 | restricted to interface events
 Checkbox:action callback       | made an interface event
 Checkbox:action                | restricted to interface events
 Checkbox:checked               | restricted to interface events
 Checkbox:position              | restricted to interface events
 Checkbox:size                  | restricted to interface events
 Checkbox:text                  | restricted to interface events
 Checkbox:visible               | restricted to interface events
 HTTPRequest:cancel             | restricted to interface events
 HTTPRequest:finish             | restricted to interface events
 HTTPRequest:progress           | restricted to interface events
 HTTPRequest:status             | restricted to interface events
 Label:position                 | restricted to interface events
 Label:size                     | restricted to interface events
 Label:text                     | restricted to interface events
 Label:visible                  | restricted to interface events
 ProgressBar:position           | restricted to interface events
 ProgressBar:progress           | restricted to interface events
 ProgressBar:size               | restricted to interface events
 ProgressBar:status             | restricted to interface events
 ProgressBar:visible            | restricted to interface events
 Slider:onValueChanged callback | made an interface event
 Slider:onValueChanged          | restricted to interface events
 Slider:position                | restricted to interface events
 Slider:size                    | restricted to interface events
 Slider:steps                   | restricted to interface events
 Slider:value                   | restricted to interface events
 Slider:visible                 | restricted to interface events
 TCPSocket:close                | restricted to interface events
 TCPSocket:connect              | restricted to interface events
 TCPSocket:getpeername          | restricted to interface events
 TCPSocket:getsockname          | restricted to interface events
 TCPSocket:lasterror            | restricted to interface events
 TCPSocket:receive              | restricted to interface events
 TCPSocket:send                 | restricted to interface events
 TCPSocket:setoption            | restricted to interface events
 TCPSocket:settimeout           | restricted to interface events
 TCPSocket:shutdown             | restricted to interface events
 TCPSocket:status               | restricted to interface events
 Textbox:onTextChanged callback | made an interface event
 Textbox:onTextChanged          | restricted to interface events
 Textbox:position               | restricted to interface events
 Textbox:readonly               | restricted to interface events
 Textbox:size                   | restricted to interface events
 Textbox:text                   | restricted to interface events
 Textbox:visible                | restricted to interface events
 Window:addComponent            | restricted to interface events
 Window:onBlur callback         | made an interface event
 Window:onBlur                  | restricted to interface events
 Window:onDraw callback         | made an interface event
 Window:onDraw                  | restricted to interface events
 Window:onExit callback         | made an interface event
 Window:onExit                  | restricted to interface events
 Window:onFocus callback        | made an interface event
 Window:onFocus                 | restricted to interface events
 Window:onInitialized callback  | made an interface event
 Window:onInitialized           | restricted to interface events
 Window:onKeyPress callback     | made an interface event
 Window:onKeyPress              | restricted to interface events
 Window:onKeyRelease callback   | made an interface event
 Window:onKeyRelease            | restricted to interface events
 Window:onMouseDown callback    | made an interface event
 Window:onMouseDown             | restricted to interface events
 Window:onMouseMove callback    | made an interface event
 Window:onMouseMove             | restricted to interface events
 Window:onMouseUp callback      | made an interface event
 Window:onMouseUp               | restricted to interface events
 Window:onMouseWheel callback   | made an interface event
 Window:onMouseWheel            | restricted to interface events
 Window:onTick callback         | made an interface event
 Window:onTick                  | restricted to interface events
 Window:onTryExit callback      | made an interface event
 Window:onTryExit               | restricted to interface events
 Window:onTryOkay callback      | made an interface event
 Window:onTryOkay               | restricted to interface events
 Window:position                | restricted to interface events
 Window:removeComponent         | restricted to interface events
 Window:size                    | restricted to interface events
 elem.allocate                  | restricted to interface events
 elem.element                   | setter restricted to interface events
 elem.free                      | restricted to interface events
 elem.loadDefault               | restricted to interface events
 elem.property                  | setter restricted to interface events
 evt.AFTERSIMDRAW callback         | made an interface event
 evt.BEFORESIMDRAW callback         | made an interface event
 evt.BLUR callback              | made an interface event
 evt.CLOSE callback             | made an interface event
 evt.KEYPRESS callback          | made an interface event
 evt.KEYRELEASE callback        | made an interface event
 evt.MOUSEDOWN callback         | made an interface event
 evt.MOUSEMOVE callback         | made an interface event
 evt.MOUSEUP callback           | made an interface event
 evt.MOUSEWHEEL callback        | made an interface event
 evt.TEXTEDITING callback       | made an interface event
 evt.TEXTINPUT callback         | made an interface event
 evt.TICK callback              | made an interface event
 evt.getModifiers               | restricted to interface events
 evt.register                   | restricted to interface events
 evt.unregister                 | restricted to interface events
 fs.copy                        | restricted to interface events
 fs.exists                      | restricted to interface events
 fs.isDirectory                 | restricted to interface events
 fs.isFile                      | restricted to interface events
 fs.isLink                      | restricted to interface events
 fs.list                        | restricted to interface events
 fs.makeDirectory               | restricted to interface events
 fs.move                        | restricted to interface events
 fs.removeDirectory             | restricted to interface events
 fs.removeFile                  | restricted to interface events
 http.getAuthToken              | restricted to interface events
 http.get                       | restricted to interface events
 http.post                      | restricted to interface events
 plat.clipboardCopy             | restricted to interface events
 plat.clipboardPaste            | restricted to interface events
 plat.openLink                  | restricted to interface events
 plat.restart                   | restricted to interface events
 ren.colorMode                  | restricted to interface events
 ren.debugHud                   | restricted to interface events
 ren.decorations                | restricted to interface events
 ren.depth3d                    | restricted to interface events
 ren.displayMode                | restricted to interface events
 ren.fireSize                   | restricted to interface events
 ren.grid                       | restricted to interface events
 ren.hud                        | restricted to interface events
 ren.renderMode                 | restricted to interface events
 ren.separateThread             | restricted to interface events
 ren.showBrush                  | restricted to interface events
 ren.useDisplayPreset           | restricted to interface events
 ren.zoomEnabled                | restricted to interface events
 ren.zoomScope                  | restricted to interface events
 ren.zoomWindow                 | restricted to interface events
 sim.addCustomGol               | restricted to interface events
 sim.adjustCoords               | restricted to interface events
 sim.ambientAirTemp             | setter restricted to interface events
 sim.ambientHeatSim             | setter restricted to interface events
 sim.brush                      | restricted to interface events
 sim.canMove                    | setter restricted to interface events
 sim.clearRect                  | restricted to interface events
 sim.clearSim                   | restricted to interface events
 sim.createBox                  | restricted to interface events
 sim.createLine                 | restricted to interface events
 sim.createParts                | restricted to interface events
 sim.createWallBox              | restricted to interface events
 sim.createWallLine             | restricted to interface events
 sim.createWalls                | restricted to interface events
 sim.customGravity              | setter restricted to interface events
 sim.decoBox                    | restricted to interface events
 sim.decoBrush                  | restricted to interface events
 sim.decoColor                  | restricted to interface events
 sim.decoLine                   | restricted to interface events
 sim.decoSpace                  | restricted to interface events
 sim.deleteStamp                | restricted to interface events
 sim.edgeMode                   | setter restricted to interface events
 sim.ensureDeterminism          | restricted to interface events
 sim.floodDeco                  | restricted to interface events
 sim.floodParts                 | restricted to interface events
 sim.floodWalls                 | restricted to interface events
 sim.frameRender                | restricted to interface events
 sim.getSaveID                  | restricted to interface events
 sim.golSpeedRatio              | restricted to interface events
 sim.gravityGrid                | restricted to interface events
 sim.gravityMode                | setter restricted to interface events
 sim.hash                       | restricted to interface events
 sim.heatSim                    | setter restricted to interface events
 sim.historyForward             | restricted to interface events
 sim.historyRestore             | restricted to interface events
 sim.lastUpdatedID              | restricted to interface events
 sim.listStamps                 | restricted to interface events
 sim.loadSave                   | restricted to interface events
 sim.loadStamp                  | restricted to interface events
 sim.newtonianGravity           | setter restricted to interface events
 sim.paused                     | restricted to interface events
 sim.randomSeed                 | restricted to interface events
 sim.reloadSave                 | restricted to interface events
 sim.removeCustomGol            | restricted to interface events
 sim.replaceModeFlags           | restricted to interface events
 sim.resetPressure              | restricted to interface events
 sim.resetSpark                 | restricted to interface events
 sim.resetTemp                  | restricted to interface events
 sim.resetVelocity              | restricted to interface events
 sim.saveStamp                  | restricted to interface events
 sim.signs.delete               | restricted to interface events
 sim.signs.new                  | restricted to interface events
 sim.takeSnapshot               | restricted to interface events
 sim.temperatureScale           | restricted to interface events
 sim.toolBox                    | restricted to interface events
 sim.toolBrush                  | restricted to interface events
 sim.toolLine                   | restricted to interface events
 sim.updateUpTo                 | restricted to interface events
 sim.waterEqualization          | setter restricted to interface events
 socket.getTime                 | restricted to interface events
 socket.sleep                   | restricted to interface events
 socket.tcp                     | restricted to interface events
 tools.allocate                 | restricted to interface events
 tools.exists                   | restricted to interface events
 tools.free                     | restricted to interface events
 tools.isCustom                 | restricted to interface events
 tools.property                 | restricted to interface events
 tpt.debug                      | restricted to interface events
 tpt.drawCap                    | restricted to interface events
 tpt.fpsCap                     | restricted to interface events
 tpt.getUserName                | restricted to interface events
 tpt.installScriptManager       | restricted to interface events
 tpt.record                     | restricted to interface events
 tpt.screenshot                 | restricted to interface events
 ui.activeMenu                  | restricted to interface events
 ui.activeTool                  | restricted to interface events
 ui.addComponent                | restricted to interface events
 ui.beginConfirm callback       | made an interface event
 ui.beginConfirm                | restricted to interface events
 ui.beginInput callback         | made an interface event
 ui.beginInput                  | restricted to interface events
 ui.beginMessageBox callback    | made an interface event
 ui.beginMessageBox             | restricted to interface events
 ui.beginThrowError callback    | made an interface event
 ui.beginThrowError             | restricted to interface events
 ui.brushID                     | restricted to interface events
 ui.brushRadius                 | restricted to interface events
 ui.button                      | restricted to interface events
 ui.checkbox                    | restricted to interface events
 ui.closeWindow                 | restricted to interface events
 ui.console                     | restricted to interface events
 ui.dropTextInput               | restricted to interface events
 ui.grabTextInput               | restricted to interface events
 ui.label                       | restricted to interface events
 ui.menuEnabled                 | restricted to interface events
 ui.mousePosition               | restricted to interface events
 ui.numMenus                    | restricted to interface events
 ui.perfectCircleBrush          | restricted to interface events
 ui.progressBar                 | restricted to interface events
 ui.removeComponent             | restricted to interface events
 ui.showWindow                  | restricted to interface events
 ui.slider                      | restricted to interface events
 ui.textbox                     | restricted to interface events
 ui.textInputRect               | restricted to interface events
 ui.window                      | restricted to interface events
 ui.windowSize                  | restricted to interface events
2025-03-12 20:42:18 +01:00
jacob1
dd8f7eb9f2 Fix crash when VIBR releases heat during explosion 2025-03-04 10:42:22 -05:00