Difference between revisions of "Lua"

From The Powder Toy
Jump to: navigation, search
m (I've edited this out once, I'll do it again - Whoever put "Mods" with an apostrophe is an idiot.)
(Improved readability and added/changed some stuff)
Line 1: Line 1:
You may open the Lua Console by hitting the ''[`]'' key. (Also known as the tilde ''[~]'' key) [http://img97.imageshack.us/img97/6811/tildekey1.jpg| click here to view key]
+
You may open the Lua Console by hitting the ''[`]'' key. (Also known as the tilde ''[~]'' key, or the ''[¬]'' key) [http://img97.imageshack.us/img97/6811/tildekey1.jpg| click here to view key]
 
 
Or ''[¬]''.
 
  
 
----
 
----
Line 11: Line 9:
 
The equivalent command in TPT's Lua is ''tpt.set_property("type", "metl", "dust")'' (see https://powdertoy.co.uk/Wiki.html?id=lua#tptset_property )
 
The equivalent command in TPT's Lua is ''tpt.set_property("type", "metl", "dust")'' (see https://powdertoy.co.uk/Wiki.html?id=lua#tptset_property )
  
But, try to learn the Lua interface. It may be a lot more useful to you than you think. ''(This wiki does not teach you the Lua language. This is simply an API. But, you may research Lua on your own http:''www.lua.org/manual/5.1/ )//
+
But, try to learn the Lua interface. It may be a lot more useful to you than you think. ''(This wiki does not teach you the Lua language. This is simply an API. But, you may research Lua on your own http://www.lua.org/manual/5.1/ )
  
 
----
 
----
Line 19: Line 17:
 
With the ability to script with Lua, users are now able to create simple modifications to the game without editing source code easily.
 
With the ability to script with Lua, users are now able to create simple modifications to the game without editing source code easily.
  
= Quick Introduction to Scripts =
+
= Quick Introduction to Scripts =
 
==  How to run a script  ==
 
==  How to run a script  ==
 
To run a script, place the .lua file in the root folder of powder toy (where the powder toy executable is located). Open the console (see below) and type in '''dofile("filename.lua")''' where "filename.lua" is the the script you wish to run.
 
To run a script, place the .lua file in the root folder of powder toy (where the powder toy executable is located). Open the console (see below) and type in '''dofile("filename.lua")''' where "filename.lua" is the the script you wish to run.
Line 33: Line 31:
 
'''Example:''' ''local str = "This is a string variable."''
 
'''Example:''' ''local str = "This is a string variable."''
  
----
+
 
  
 
* ''''number''''
 
* ''''number''''
Line 41: Line 39:
 
'''Example:''' ''local num = 1234''
 
'''Example:''' ''local num = 1234''
  
----
+
 
  
 
* ''''boolean''''
 
* ''''boolean''''
Line 48: Line 46:
  
 
'''Example:''' ''local bool = true''
 
'''Example:''' ''local bool = true''
----
+
 
  
 
* ''''function''''
 
* ''''function''''
Line 58: Line 56:
 
'''NOTE:''' Functions that use a ''''function'''' as an argument do not include the () at the end. Only the name must be given.
 
'''NOTE:''' Functions that use a ''''function'''' as an argument do not include the () at the end. Only the name must be given.
  
----
+
 
  
 
* ''''table''''
 
* ''''table''''
Line 77: Line 75:
  
  
tbl[1] --returns 1
+
  tbl[1] --returns 1
tbl[2] --returns 2
+
  tbl[2] --returns 2
tbl[3] --returns 3
+
  tbl[3] --returns 3
tbl[4] --returns "string"
+
  tbl[4] --returns "string"
  
  
Line 86: Line 84:
 
'''Example:'''
 
'''Example:'''
  
local tbl = {}
+
  local tbl = {}
tbl.x = 7
+
  tbl.x = 7
tbl.y = 5
+
  tbl.y = 5
tbl.str = "this is a string"
+
  tbl.str = "this is a string"
tbl.sqr = function(v) return v * v end
+
  tbl.sqr = function(v) return v * v end
  
 
Creates a table with the variables x, y, str, and the function sqr.
 
Creates a table with the variables x, y, str, and the function sqr.
Line 96: Line 94:
 
You can call these variables in this manner:
 
You can call these variables in this manner:
  
tbl.x --returns 7
+
  tbl.x --returns 7
tbl.y --returns 5
+
  tbl.y --returns 5
tbl.str --returns "this is a string"
+
  tbl.str --returns "this is a string"
tbl.sqr(2) --returns 4 (remember this is a function that takes 'v' and squares it. )
+
  tbl.sqr(2) --returns 4 (remember this is a function that takes 'v' and squares it. )
 +
 
  
----
 
  
 
* ''''object''''
 
* ''''object''''
Line 116: Line 114:
 
The different available properties are:
 
The different available properties are:
  
''"type"
+
  "type"
 +
  "life"
 +
  "ctype"
 +
  "temp"
 +
  "tmp"
 +
  "vx"
 +
  "vy"
 +
  "x"
 +
  "y"
 +
  "dcolour"
 +
  "id"
  
"life"
+
Any other given strings will result with an invalid property error.
 
 
"ctype"
 
 
 
"temp"
 
 
 
"tmp"
 
  
"vx"
 
  
"vy"
 
 
"x"
 
 
"y"''
 
 
Any other given strings will result with an invalid property error.
 
 
----
 
  
 
''''object'' '''value'''''
 
''''object'' '''value'''''
Line 142: Line 134:
 
What you are setting the current property to. Since this is an '''object''' variable, it's type will depend on the function.
 
What you are setting the current property to. Since this is an '''object''' variable, it's type will depend on the function.
  
----
+
 
  
 
''''string'' '''type'''''
 
''''string'' '''type'''''
Line 148: Line 140:
 
A ''''string'''' which is the code-name of an element "dust" "watr" "spng".
 
A ''''string'''' which is the code-name of an element "dust" "watr" "spng".
  
----
+
 
 
''''number'' '''index'''''
 
''''number'' '''index'''''
  
 
A specific particle number by it's index.
 
A specific particle number by it's index.
  
----
+
 
  
 
''''number'' '''state'''''
 
''''number'' '''state'''''
Line 159: Line 151:
 
0 or 1, 0 for off, 1 for on.
 
0 or 1, 0 for off, 1 for on.
  
----
+
 
  
 
''''number'' '''Width''''' and ''''number'' '''Height'''''
 
''''number'' '''Width''''' and ''''number'' '''Height'''''
Line 165: Line 157:
 
Represent a rectangle.
 
Represent a rectangle.
  
----
+
 
  
 
''''number'' '''x''''' and ''''number'' '''y'''''
 
''''number'' '''x''''' and ''''number'' '''y'''''
Line 171: Line 163:
 
Represents a 2-Dimensional coordinate.
 
Represents a 2-Dimensional coordinate.
  
----
+
 
  
 
''''string'' '''text'''''
 
''''string'' '''text'''''
Line 177: Line 169:
 
Represents text
 
Represents text
  
----
+
 
  
 
''''number'' '''toggle'''''
 
''''number'' '''toggle'''''
Line 183: Line 175:
 
Represents either 1 for on or 0 for off
 
Represents either 1 for on or 0 for off
  
----
+
 
  
 
''''number'' '''menu'''''
 
''''number'' '''menu'''''
Line 189: Line 181:
 
Represents a menu, eg 1 = Walls, 2 = Electronics
 
Represents a menu, eg 1 = Walls, 2 = Electronics
  
----
+
 
  
 
''''number'' '''display'''''
 
''''number'' '''display'''''
Line 195: Line 187:
 
Represents a display mode, eg 4 = Fire, 6 = Heat
 
Represents a display mode, eg 4 = Fire, 6 = Heat
  
----
+
 
  
 
=  Lua API  =
 
=  Lua API  =
 
'''The Powder Toy exposes the following methods to the Lua API:'''
 
'''The Powder Toy exposes the following methods to the Lua API:'''
 
==  Game  ==
 
==  Game  ==
 +
 
===  tpt.set_pause  ===
 
===  tpt.set_pause  ===
Set the paused state of the game
+
*Set the paused state of the game
 
=====  tpt.set_pause(number state)  =====
 
=====  tpt.set_pause(number state)  =====
 +
 
===  tpt.set_console  ===
 
===  tpt.set_console  ===
Set the visibility state of the console
+
*Set the visibility state of the console
 
=====  tpt.set_console(number state)  =====
 
=====  tpt.set_console(number state)  =====
 +
 
===  tpt.set_shortcuts  ===
 
===  tpt.set_shortcuts  ===
Set whether keyboard shortcuts are enabled
+
*Set whether keyboard shortcuts are enabled
 
=====  tpt.set_shortcuts(number state)  =====
 
=====  tpt.set_shortcuts(number state)  =====
 +
 
===  tpt.set_gravity  ===
 
===  tpt.set_gravity  ===
Sets values on the gravity map, 3 overloads
+
*Sets values on the gravity map, 3 overloads
 
=====  tpt.set_gravity(number x, number y)  =====
 
=====  tpt.set_gravity(number x, number y)  =====
 
=====  tpt.set_gravity(number x, number y, number width, number height)  =====
 
=====  tpt.set_gravity(number x, number y, number width, number height)  =====
 
=====  tpt.set_gravity(number x, number y, number width, number height, number value)  =====
 
=====  tpt.set_gravity(number x, number y, number width, number height, number value)  =====
 +
 
===  tpt.reset_gravity_field  ===
 
===  tpt.reset_gravity_field  ===
Resets regions on the gravity velocity map, 2 overloads
+
*Resets regions on the gravity velocity map, 2 overloads
 
=====  tpt.reset_gravity_field(number x, number y)  =====
 
=====  tpt.reset_gravity_field(number x, number y)  =====
 
=====  tpt.reset_gravity_field(number x, number y, number width, number height)  =====
 
=====  tpt.reset_gravity_field(number x, number y, number width, number height)  =====
 +
 
===  tpt.set_pressure  ===
 
===  tpt.set_pressure  ===
Sets values on the pressure map, 3 overloads
+
*Sets values on the pressure map, 3 overloads
 
=====  tpt.set_pressure(number x, number y)  =====
 
=====  tpt.set_pressure(number x, number y)  =====
 
=====  tpt.set_pressure(number x, number y, number width, number height)  =====
 
=====  tpt.set_pressure(number x, number y, number width, number height)  =====
 
=====  tpt.set_pressure(number x, number y, number width, number height, number value)  =====
 
=====  tpt.set_pressure(number x, number y, number width, number height, number value)  =====
 +
 
===  tpt.reset_velocity  ===
 
===  tpt.reset_velocity  ===
Resets regions on the velocity map, 2 overloads
+
*Resets regions on the velocity map, 2 overloads
 
=====  tpt.reset_velocity(number x, number y)  =====
 
=====  tpt.reset_velocity(number x, number y)  =====
 
=====  tpt.reset_velocity(number x, number y, number width, number height)  =====
 
=====  tpt.reset_velocity(number x, number y, number width, number height)  =====
 +
 
===  tpt.hud  ===
 
===  tpt.hud  ===
Toggles HUD State
+
*Toggles HUD State
 
=====  tpt.hud(number toggle)  =====
 
=====  tpt.hud(number toggle)  =====
 +
 
===  tpt.newtonian_gravity  ===
 
===  tpt.newtonian_gravity  ===
Toggles Newtonian Gravity State
+
*Toggles Newtonian Gravity State
 
=====  tpt.newtonian_gravity(number toggle)  =====
 
=====  tpt.newtonian_gravity(number toggle)  =====
 +
 
===  tpt.ambient_heat  ===
 
===  tpt.ambient_heat  ===
Toggles Ambient Heat State
+
*Toggles Ambient Heat State
 
=====  tpt.ambient_heat(number toggle)  =====
 
=====  tpt.ambient_heat(number toggle)  =====
 +
 
===  tpt.decorations_enable  ===
 
===  tpt.decorations_enable  ===
Toggles visibility of decorations
+
*Toggles visibility of decorations
 
=====  tpt.decorations_enable(number toggle)  =====
 
=====  tpt.decorations_enable(number toggle)  =====
 +
 
===  tpt.heat  ===
 
===  tpt.heat  ===
Toggles Heat Simulation State
+
*Toggles Heat Simulation State
 
=====  tpt.heat(number toggle)  =====
 
=====  tpt.heat(number toggle)  =====
 +
 
===  tpt.active_menu  ===
 
===  tpt.active_menu  ===
Changes activated menu
+
*Changes activated menu
 
=====  tpt.active_menu(number menu)  =====
 
=====  tpt.active_menu(number menu)  =====
 +
 
===  tpt.display_mode  ===
 
===  tpt.display_mode  ===
Changes activated display mode
+
*Changes activated display mode
 
=====  tpt.display_mode(number display)  =====
 
=====  tpt.display_mode(number display)  =====
 +
 
===  tpt.setfpscap  ===
 
===  tpt.setfpscap  ===
Changes the maximum FPS.
+
*Changes the maximum FPS.
 
=====  tpt.setfpscap(number fpscap)  =====
 
=====  tpt.setfpscap(number fpscap)  =====
 +
 
===  tpt.setfire  ===
 
===  tpt.setfire  ===
Changes the strength of the games glowing effects. tpt.setfire(1) is default.
+
*Changes the strength of the games glowing effects. tpt.setfire(1) is default.
 
=====  tpt.setfire(number strength)  =====
 
=====  tpt.setfire(number strength)  =====
 +
 
===  tpt.setwindowsize  ===
 
===  tpt.setwindowsize  ===
Changes the window settings. Scale is either 1 or 2. Returns a number, probably to indicate success.
+
*Changes the window settings. Scale is either 1 or 2. Returns a number, probably to indicate success.
 
=====  tpt.setwindowsize(number scale, toggle fullscreen)  =====
 
=====  tpt.setwindowsize(number scale, toggle fullscreen)  =====
 
==  Particles  ==
 
==  Particles  ==
 +
 
===  tpt.reset_spark  ===
 
===  tpt.reset_spark  ===
Removes electrified wires from the simulation, resetting to the original material
+
*Removes electrified wires from the simulation, resetting to the original material
 
=====  tpt.reset_spark()  =====
 
=====  tpt.reset_spark()  =====
 +
 
===  tpt.set_property  ===
 
===  tpt.set_property  ===
Set various properties of particles for given criteria, 8 overloads
+
*Set various properties of particles for given criteria, 8 overloads
 
=====  tpt.set_property(string property, object value)  =====
 
=====  tpt.set_property(string property, object value)  =====
 
=====  tpt.set_property(string property, object value, string type)  =====
 
=====  tpt.set_property(string property, object value, string type)  =====
Line 271: Line 282:
 
=====  tpt.set_property(string property, object value, number x, number y, number width, number height)  =====
 
=====  tpt.set_property(string property, object value, number x, number y, number width, number height)  =====
 
=====  tpt.set_property(string property, object value, number x, number y, number width, number height, string type)  =====
 
=====  tpt.set_property(string property, object value, number x, number y, number width, number height, string type)  =====
 +
 
===  object tpt.get_property  ===
 
===  object tpt.get_property  ===
Get various properties of a particle. Returns an ''object''
+
*Get various properties of a particle. Returns an ''object''
 
=====  tpt.get_property(string property, number index)  =====
 
=====  tpt.get_property(string property, number index)  =====
 
=====  tpt.get_property(string property, number x, number y)  =====
 
=====  tpt.get_property(string property, number x, number y)  =====
 +
 
===  tpt.create  ===
 
===  tpt.create  ===
Create a particle at location.
+
*Create a particle at location.
 
=====  tpt.create(number x, number y, string type)  =====
 
=====  tpt.create(number x, number y, string type)  =====
 +
 
===  tpt.delete  ===
 
===  tpt.delete  ===
Delete a specific particle, or location.
+
*Delete a specific particle, or location.
 
=====  tpt.delete(number index)  =====
 
=====  tpt.delete(number index)  =====
 
=====  tpt.delete(number x, number y)  =====
 
=====  tpt.delete(number x, number y)  =====
 +
 
===  tpt.start_getPartIndex  ===
 
===  tpt.start_getPartIndex  ===
Start the iterator for receiving all indecies of the particles. (Used to help get particle indecies, see tpt.next_getPartIndex)
+
*Start the iterator for receiving all indecies of the particles. (Used to help get particle indecies, see tpt.next_getPartIndex)
 
=====  tpt.start_getPartIndex()  =====
 
=====  tpt.start_getPartIndex()  =====
 
===  boolean tpt.next_getPartIndex  ===
 
===  boolean tpt.next_getPartIndex  ===
Jump to the next available particle index. Returns false if the iterator has reached the end of all particle indecies. Returns true if a new index was available. (Used to help get particle indecies, see tpt.getPartIndex)
+
*Jump to the next available particle index. Returns false if the iterator has reached the end of all particle indecies. Returns true if a new index was available. (Used to help get particle indecies, see tpt.getPartIndex)
 +
 
 
=====  tpt.next_getPartIndex()  =====
 
=====  tpt.next_getPartIndex()  =====
 
===  number tpt.getPartIndex  ===
 
===  number tpt.getPartIndex  ===
Get the current index iterator.
+
*Get the current index iterator.
 +
 
 +
index code example:
 +
    tpt.start_getPartIndex()
 +
    while tpt.next_getPartIndex() do
 +
        local index = tpt.getPartIndex()
 +
        if tpt.get_property("ctype",index) == 21 then
 +
          tpt.set_property("ctype","sing",index)
 +
        end
 +
    end
 +
 
 
=====  tpt.getPartIndex()  =====
 
=====  tpt.getPartIndex()  =====
 
===  number tpt.get_numOfParts  ===
 
===  number tpt.get_numOfParts  ===
Returns the number of particles currently on the screen.
+
*Returns the number of particles currently on the screen.
 +
 
 
=====  tpt.get_numOfParts()  =====
 
=====  tpt.get_numOfParts()  =====
 
==  Drawing  ==
 
==  Drawing  ==
 +
 
===  number tpt.textwidth  ===
 
===  number tpt.textwidth  ===
Measures (in pixels) the width of a given ''string''. Returns a ''number''
+
*Measures (in pixels) the width of a given ''string''. Returns a ''number''
 
=====  tpt.textwidth(string text)  =====
 
=====  tpt.textwidth(string text)  =====
 +
 
===  tpt.drawtext  ===
 
===  tpt.drawtext  ===
Draw text to the screen (for one frame, only useful in scripts), 3 overloads
+
*Draw text to the screen (for one frame, only useful in scripts), 3 overloads
 
=====  tpt.drawtext(number x, number y, string text)  =====
 
=====  tpt.drawtext(number x, number y, string text)  =====
 
=====  tpt.drawtext(number x, number y, string text, number red, number green, number blue)  =====
 
=====  tpt.drawtext(number x, number y, string text, number red, number green, number blue)  =====
 
=====  tpt.drawtext(number x, number y, string text, number red, number green, number blue, number alpha)  =====
 
=====  tpt.drawtext(number x, number y, string text, number red, number green, number blue, number alpha)  =====
 +
 
===  tpt.drawpixel  ===
 
===  tpt.drawpixel  ===
Draws a pixel on the screen (for one frame, only useful in scripts), 3 overloads
+
*Draws a pixel on the screen (for one frame, only useful in scripts), 3 overloads
 
=====  tpt.drawpixel(number x, number y)  =====
 
=====  tpt.drawpixel(number x, number y)  =====
 
=====  tpt.drawpixel(number x, number y, number red, number green, number blue)  =====
 
=====  tpt.drawpixel(number x, number y, number red, number green, number blue)  =====
 
=====  tpt.drawpixel(number x, number y, number red, number green, number blue, number alpha)  =====
 
=====  tpt.drawpixel(number x, number y, number red, number green, number blue, number alpha)  =====
 +
 
===  tpt.drawrect  ===
 
===  tpt.drawrect  ===
Draws a rectangle on the screen (for one frame, only useful in scripts), 3 overloads
+
*Draws a rectangle on the screen (for one frame, only useful in scripts), 3 overloads
 
=====  tpt.drawrect(number x, number y, number width, number height)  =====
 
=====  tpt.drawrect(number x, number y, number width, number height)  =====
 
=====  tpt.drawrect(number x, number y, number width, number height, number red, number green, number blue)  =====
 
=====  tpt.drawrect(number x, number y, number width, number height, number red, number green, number blue)  =====
=====  tpt.drawrect(number x, number y, number width, number height, number red, number green, number blue, number alpha) =====
+
=====  tpt.drawrect(number x, number y, number width, number height, number red, number green, number blue, number alpha) =====
 +
 
 
===  tpt.fillrect  ===
 
===  tpt.fillrect  ===
Draws a filled in rectangle on the screen (for one frame, only useful in scripts), 3 overloads
+
*Draws a filled in rectangle on the screen (for one frame, only useful in scripts), 3 overloads
 
=====  tpt.fillrect(number x, number y, number width, number height)  =====
 
=====  tpt.fillrect(number x, number y, number width, number height)  =====
 
=====  tpt.fillrect(number x, number y, number width, number height, number red, number green, number blue)  =====
 
=====  tpt.fillrect(number x, number y, number width, number height, number red, number green, number blue)  =====
 
=====  tpt.fillrect(number x, number y, number width, number height, number red, number green, number blue, number alpha)  =====
 
=====  tpt.fillrect(number x, number y, number width, number height, number red, number green, number blue, number alpha)  =====
 
==  Input/Output  ==
 
==  Input/Output  ==
 +
 
===  tpt.log  ===
 
===  tpt.log  ===
Log a message to the console
+
*Log a message to the console
 
=====  tpt.log(string text)  =====
 
=====  tpt.log(string text)  =====
 +
 
===  tpt.message_box  ===
 
===  tpt.message_box  ===
Display an OK-Only message box with a title and message.
+
*Display an OK-Only message box with a title and message.
 
=====  tpt.message_box(string title, string message)  =====
 
=====  tpt.message_box(string title, string message)  =====
 +
 
===  string tpt.input  ===
 
===  string tpt.input  ===
Ask the user to input some text. Returns a string of what ever the user says. The argument "text" is pre-entered text (optional).
+
*Ask the user to input some text. Returns a string of what ever the user says. The argument "text" is pre-entered text (optional).
 
=====  tpt.input(string title, string message)  =====
 
=====  tpt.input(string title, string message)  =====
 
=====  tpt.input(string title, string message, string text)  =====
 
=====  tpt.input(string title, string message, string text)  =====
 
==  Events  ==
 
==  Events  ==
 +
 
===  tpt.register_step  ===
 
===  tpt.register_step  ===
Register a function to be run on every frame
+
*Register a function to be run on every frame
 
=====  tpt.register_step(function func)  =====
 
=====  tpt.register_step(function func)  =====
 +
 
===  tpt.unregister_step  ===
 
===  tpt.unregister_step  ===
Unregister a previously registered function
+
*Unregister a previously registered function
 
=====  tpt.unregister_step(function func)  =====
 
=====  tpt.unregister_step(function func)  =====
 +
 
===  tpt.register_mouseclick  ===
 
===  tpt.register_mouseclick  ===
Register a function to be run every time the mouse clicks\\ \\
+
*Register a function to be run every time the mouse clicks. Your function will also be called when the mouse is released or held
 +
*Event is 1 is the mouse is pressed, 2 if the mouse is released, and 3 if it is held
 +
*If your function returns false, mouse events in the normal Powder Toy will be ignored
 
Passes: (''number mousex, number mousey, number button, number event'')
 
Passes: (''number mousex, number mousey, number button, number event'')
 
=====  tpt.register_mouseclick(function func)  =====
 
=====  tpt.register_mouseclick(function func)  =====
 +
 
===  tpt.unregister_mouseclick  ===
 
===  tpt.unregister_mouseclick  ===
Unregister a previously registered function
+
*Unregister a previously registered function
 
=====  tpt.unregister_mouseclick(function func)  =====
 
=====  tpt.unregister_mouseclick(function func)  =====
 +
 
===  tpt.register_keypress  ===
 
===  tpt.register_keypress  ===
Register a function to be run every time a key is pressed\\ \\
+
*Register a function to be run every time a key is pressed. Your function will also be called when the mouse is released
 +
*Event is 1 is a key is pressed, and 2 if it is released
 +
*If your function returns false, key presses in the normal Powder Toy will be ignored
 
Passes: (''string key, number key, number modifier'')
 
Passes: (''string key, number key, number modifier'')
 
=====  tpt.register_keypress(function func)  =====
 
=====  tpt.register_keypress(function func)  =====
 +
 
===  tpt.unregister_keypress  ===
 
===  tpt.unregister_keypress  ===
Unregister a previously registered function
+
*Unregister a previously registered function
 
=====  tpt.unregister_keypress(function func)  =====
 
=====  tpt.unregister_keypress(function func)  =====
 +
 
==  Misc  ==
 
==  Misc  ==
 +
 
===  string tpt.get_name  ===
 
===  string tpt.get_name  ===
Get the current username, returns a ''string''
+
*Get the current username, returns a ''string''
 
=====  tpt.get_name()  =====
 
=====  tpt.get_name()  =====
 +
 
===  tpt.throw_error  ===
 
===  tpt.throw_error  ===
Displays an error message
+
*Displays an error message
 
=====  tpt.throw_error(string text)  =====
 
=====  tpt.throw_error(string text)  =====
 +
 
===  tpt.setdebug  ===
 
===  tpt.setdebug  ===
Sets the "debug mode". Only odd numbers seem to do anything for now.
+
*Sets the "debug mode". Only odd numbers seem to do anything for now.
 
=====  tpt.setdebug(number mode)  =====
 
=====  tpt.setdebug(number mode)  =====
 
=  Mods with Lua Functions  =
 
=  Mods with Lua Functions  =
Line 380: Line 429:
  
 
====  New Functions  ====
 
====  New Functions  ====
=====  tpt.throw_error("")  =====
+
=====  tpt.throw_error(string error)  =====
=====  tpt.getscript("")  =====
+
=====  tpt.getscript(string script)  =====
For the following, 1 in the ()'s is on 0 is off
+
=====  tpt.hud(number state)  =====
=====  tpt.hud()  =====
+
=====  tpt.newtonian_gravity(number state)  =====
=====  tpt.newtonian_gravity()  =====
+
=====  tpt.ambient_heat(number state)  =====
=====  tpt.ambient_heat()  =====
+
=====  tpt.decorations_enable(number state)  =====
=====  tpt.decorations_enable()  =====
+
=====  tpt.heat(number state)  =====
=====  tpt.heat()  =====
+
=====  tpt.active_menu(number menu)  =====
For the following the number of the value you want goes into the ()'s
+
=====  tpt.display_mode(number display)  =====
=====  tpt.active_menu()  =====
+
=====  tpt.set_glow(number fireintensity)  =====
=====  tpt.display_mode()  =====
 
=====  tpt.set_glow()  =====
 
 
=  Simple Example Code  =
 
=  Simple Example Code  =
-- This line is a comment. Anything written after the -- is considered a Comment and will not be read by Lua.
+
  -- This line is a comment. Anything written after the -- is considered a Comment and will not be read by Lua.
+
 
-- Set the console's state to 0. This will hide the console.
+
  -- Set the console's state to 0. This will hide the console.
tpt.set_console(0)
+
  tpt.set_console(0)
+
 
-- Here we define our main function for the script
+
  -- Here we define our main function for the script
function ClassicPowder()
+
  function ClassicPowder()
local ox = 125 -- This will be our offset for the different elements we will create.
+
    local ox = 125 -- This will be our offset for the different elements we will create.
local y = 4 -- where on the y (vertical) axis where we will create our elements.
+
    local y = 4 -- where on the y (vertical) axis where we will create our elements.
+
 
local x = ox -- where on the x (horizontal) axis where we will create our elements. we will start the x value with what ever ox is above.
+
    local x = ox -- where on the x (horizontal) axis where we will create our elements. we will start the x value with what ever ox is above.
for i=0, 10 do -- this is a for loop. everything between the do and end will loop until i hits 10. i increases by 1 every loop.
+
    for i=0, 10 do -- this is a for loop. everything between the do and end will loop until i hits 10. i increases by 1 every loop.
tpt.create(x + i, y, "DUST") --create a dust particle
+
        tpt.create(x + i, y, "DUST") --create a dust particle
end
+
    end
+
 
x = x + ox -- increase the x axis value by the offset x (ox) value above.
+
    x = x + ox -- increase the x axis value by the offset x (ox) value above
for i=0, 10 do
+
    for i=0, 10 do
tpt.create(x + i, y, "WATR") --create a water particle
+
        tpt.create(x + i, y, "WATR") --create a water particle
end
+
    end
+
 
x = x + ox
+
    x = x + ox
for i=0, 10 do
+
    for i=0, 10 do
tpt.create(x + i, y, "SALT")
+
        tpt.create(x + i, y, "SALT")
end
+
    end
+
 
x = x + ox
+
    x = x + ox
for i=0, 10 do
+
    for i=0, 10 do
tpt.create(x + i, y, "OIL")
+
        tpt.create(x + i, y, "OIL")
end
+
    end
+
 
return false
+
    return false
end
+
  end
+
 
-- Register the step function ClassicPowder. This will make the ClassicPowder function run every tick of Powder Toy.
+
  -- Register the step function ClassicPowder. This will make the ClassicPowder function run every tick of Powder Toy.
tpt.register_step(ClassicPowder)
+
  tpt.register_step(ClassicPowder)

Revision as of 02:40, 6 October 2011

You may open the Lua Console by hitting the [`] key. (Also known as the tilde [~] key, or the [¬] key) click here to view key


BEFORE YOU FRET, YOU CAN STILL USE OLD COMMANDS. JUST PLACE AN '!' (without quotes) BEFORE THE COMMAND IN THE CONSOLE

!set type dust metl

The equivalent command in TPT's Lua is tpt.set_property("type", "metl", "dust") (see https://powdertoy.co.uk/Wiki.html?id=lua#tptset_property )

But, try to learn the Lua interface. It may be a lot more useful to you than you think. (This wiki does not teach you the Lua language. This is simply an API. But, you may research Lua on your own http://www.lua.org/manual/5.1/ )


The new Lua Console now provides the ability to create scripts using Lua, a very simple scripting language.

With the ability to script with Lua, users are now able to create simple modifications to the game without editing source code easily.

Contents

Quick Introduction to Scripts

How to run a script

To run a script, place the .lua file in the root folder of powder toy (where the powder toy executable is located). Open the console (see below) and type in dofile("filename.lua") where "filename.lua" is the the script you wish to run.

Variable Types

The different variable types are:


  • 'string'

Represents a word, character, or phrase. 'string' variables must begin and end with double-quotes. (")

Example: local str = "This is a string variable."


  • 'number'

Represents a number. Numbers may be floating-point or fixed-point types (meaning they may have decimals [floating-point] or may be numbers with no fraction [fixed-point].)

Example: local num = 1234


  • 'boolean'

Represents a switch that is either on (true) or off (false).

Example: local bool = true


  • 'function'

Represents a method or function in lua.

Example: function func(arguments)

NOTE: Functions that use a 'function' as an argument do not include the () at the end. Only the name must be given.


  • 'table'

Tables are a group of variables. Tables can also act as an array. Tables can carry any type of variables, and can even mix different types of variables.

Example: local tbl = {}

This creates a blank table.


Example: local tbl = {1, 2, 3, "string"}

Creates a table with the elements 1, 2, 3 and "string".

You can call these variables in this manner:


 tbl[1] --returns 1
 tbl[2] --returns 2
 tbl[3] --returns 3
 tbl[4] --returns "string"


Example:

 local tbl = {}
 tbl.x = 7
 tbl.y = 5
 tbl.str = "this is a string"
 tbl.sqr = function(v) return v * v end

Creates a table with the variables x, y, str, and the function sqr.

You can call these variables in this manner:

 tbl.x --returns 7
 tbl.y --returns 5
 tbl.str --returns "this is a string"
 tbl.sqr(2) --returns 4 (remember this is a function that takes 'v' and squares it. )


  • 'object'

Acts as a wildcard. It can be represented as any of the above, but this does not mean it can be any type, it depends on the function.

General Arguments

The arguments given here are general, here are some examples:


'string property

This is to specify what property of a particle to change. REMINDER: This is a 'string' variable, meaning it is a word that must begin and end with double-quotes. (") The different available properties are:

 "type"
 "life"
 "ctype"
 "temp"
 "tmp"
 "vx"
 "vy"
 "x"
 "y"
 "dcolour"
 "id"

Any other given strings will result with an invalid property error.


'object value

What you are setting the current property to. Since this is an object variable, it's type will depend on the function.


'string type

A 'string' which is the code-name of an element "dust" "watr" "spng".


'number index

A specific particle number by it's index.


'number state

0 or 1, 0 for off, 1 for on.


'number Width and 'number Height

Represent a rectangle.


'number x and 'number y

Represents a 2-Dimensional coordinate.


'string text

Represents text


'number toggle

Represents either 1 for on or 0 for off


'number menu

Represents a menu, eg 1 = Walls, 2 = Electronics


'number display

Represents a display mode, eg 4 = Fire, 6 = Heat


Lua API

The Powder Toy exposes the following methods to the Lua API:

Game

tpt.set_pause

  • Set the paused state of the game
tpt.set_pause(number state)

tpt.set_console

  • Set the visibility state of the console
tpt.set_console(number state)

tpt.set_shortcuts

  • Set whether keyboard shortcuts are enabled
tpt.set_shortcuts(number state)

tpt.set_gravity

  • Sets values on the gravity map, 3 overloads
tpt.set_gravity(number x, number y)
tpt.set_gravity(number x, number y, number width, number height)
tpt.set_gravity(number x, number y, number width, number height, number value)

tpt.reset_gravity_field

  • Resets regions on the gravity velocity map, 2 overloads
tpt.reset_gravity_field(number x, number y)
tpt.reset_gravity_field(number x, number y, number width, number height)

tpt.set_pressure

  • Sets values on the pressure map, 3 overloads
tpt.set_pressure(number x, number y)
tpt.set_pressure(number x, number y, number width, number height)
tpt.set_pressure(number x, number y, number width, number height, number value)

tpt.reset_velocity

  • Resets regions on the velocity map, 2 overloads
tpt.reset_velocity(number x, number y)
tpt.reset_velocity(number x, number y, number width, number height)

tpt.hud

  • Toggles HUD State
tpt.hud(number toggle)

tpt.newtonian_gravity

  • Toggles Newtonian Gravity State
tpt.newtonian_gravity(number toggle)

tpt.ambient_heat

  • Toggles Ambient Heat State
tpt.ambient_heat(number toggle)

tpt.decorations_enable

  • Toggles visibility of decorations
tpt.decorations_enable(number toggle)

tpt.heat

  • Toggles Heat Simulation State
tpt.heat(number toggle)

tpt.active_menu

  • Changes activated menu
tpt.active_menu(number menu)

tpt.display_mode

  • Changes activated display mode
tpt.display_mode(number display)

tpt.setfpscap

  • Changes the maximum FPS.
tpt.setfpscap(number fpscap)

tpt.setfire

  • Changes the strength of the games glowing effects. tpt.setfire(1) is default.
tpt.setfire(number strength)

tpt.setwindowsize

  • Changes the window settings. Scale is either 1 or 2. Returns a number, probably to indicate success.
tpt.setwindowsize(number scale, toggle fullscreen)

Particles

tpt.reset_spark

  • Removes electrified wires from the simulation, resetting to the original material
tpt.reset_spark()

tpt.set_property

  • Set various properties of particles for given criteria, 8 overloads
tpt.set_property(string property, object value)
tpt.set_property(string property, object value, string type)
tpt.set_property(string property, object value, number index)
tpt.set_property(string property, object value, number index, string type)
tpt.set_property(string property, object value, number x, number y)
tpt.set_property(string property, object value, number x, number y, string type)
tpt.set_property(string property, object value, number x, number y, number width, number height)
tpt.set_property(string property, object value, number x, number y, number width, number height, string type)

object tpt.get_property

  • Get various properties of a particle. Returns an object
tpt.get_property(string property, number index)
tpt.get_property(string property, number x, number y)

tpt.create

  • Create a particle at location.
tpt.create(number x, number y, string type)

tpt.delete

  • Delete a specific particle, or location.
tpt.delete(number index)
tpt.delete(number x, number y)

tpt.start_getPartIndex

  • Start the iterator for receiving all indecies of the particles. (Used to help get particle indecies, see tpt.next_getPartIndex)
tpt.start_getPartIndex()

boolean tpt.next_getPartIndex

  • Jump to the next available particle index. Returns false if the iterator has reached the end of all particle indecies. Returns true if a new index was available. (Used to help get particle indecies, see tpt.getPartIndex)
tpt.next_getPartIndex()

number tpt.getPartIndex

  • Get the current index iterator.

index code example:

    tpt.start_getPartIndex()
    while tpt.next_getPartIndex() do
       local index = tpt.getPartIndex()
       if tpt.get_property("ctype",index) == 21 then
          tpt.set_property("ctype","sing",index)
       end
    end
tpt.getPartIndex()

number tpt.get_numOfParts

  • Returns the number of particles currently on the screen.
tpt.get_numOfParts()

Drawing

number tpt.textwidth

  • Measures (in pixels) the width of a given string. Returns a number
tpt.textwidth(string text)

tpt.drawtext

  • Draw text to the screen (for one frame, only useful in scripts), 3 overloads
tpt.drawtext(number x, number y, string text)
tpt.drawtext(number x, number y, string text, number red, number green, number blue)
tpt.drawtext(number x, number y, string text, number red, number green, number blue, number alpha)

tpt.drawpixel

  • Draws a pixel on the screen (for one frame, only useful in scripts), 3 overloads
tpt.drawpixel(number x, number y)
tpt.drawpixel(number x, number y, number red, number green, number blue)
tpt.drawpixel(number x, number y, number red, number green, number blue, number alpha)

tpt.drawrect

  • Draws a rectangle on the screen (for one frame, only useful in scripts), 3 overloads
tpt.drawrect(number x, number y, number width, number height)
tpt.drawrect(number x, number y, number width, number height, number red, number green, number blue)
tpt.drawrect(number x, number y, number width, number height, number red, number green, number blue, number alpha)

tpt.fillrect

  • Draws a filled in rectangle on the screen (for one frame, only useful in scripts), 3 overloads
tpt.fillrect(number x, number y, number width, number height)
tpt.fillrect(number x, number y, number width, number height, number red, number green, number blue)
tpt.fillrect(number x, number y, number width, number height, number red, number green, number blue, number alpha)

Input/Output

tpt.log

  • Log a message to the console
tpt.log(string text)

tpt.message_box

  • Display an OK-Only message box with a title and message.
tpt.message_box(string title, string message)

string tpt.input

  • Ask the user to input some text. Returns a string of what ever the user says. The argument "text" is pre-entered text (optional).
tpt.input(string title, string message)
tpt.input(string title, string message, string text)

Events

tpt.register_step

  • Register a function to be run on every frame
tpt.register_step(function func)

tpt.unregister_step

  • Unregister a previously registered function
tpt.unregister_step(function func)

tpt.register_mouseclick

  • Register a function to be run every time the mouse clicks. Your function will also be called when the mouse is released or held
  • Event is 1 is the mouse is pressed, 2 if the mouse is released, and 3 if it is held
  • If your function returns false, mouse events in the normal Powder Toy will be ignored

Passes: (number mousex, number mousey, number button, number event)

tpt.register_mouseclick(function func)

tpt.unregister_mouseclick

  • Unregister a previously registered function
tpt.unregister_mouseclick(function func)

tpt.register_keypress

  • Register a function to be run every time a key is pressed. Your function will also be called when the mouse is released
  • Event is 1 is a key is pressed, and 2 if it is released
  • If your function returns false, key presses in the normal Powder Toy will be ignored

Passes: (string key, number key, number modifier)

tpt.register_keypress(function func)

tpt.unregister_keypress

  • Unregister a previously registered function
tpt.unregister_keypress(function func)

Misc

string tpt.get_name

  • Get the current username, returns a string
tpt.get_name()

tpt.throw_error

  • Displays an error message
tpt.throw_error(string text)

tpt.setdebug

  • Sets the "debug mode". Only odd numbers seem to do anything for now.
tpt.setdebug(number mode)

Mods with Lua Functions

Me4502's Mod

NOTICE: THESE FUNCTIONS ARE AVAILABLE IN VERSION 3.0b11 OR LATER

String Property Additions

"collision"
"airdrag"
"flammable"
"weight"
"falldown"
"gravity"
"explosive"
"meltable"
"hardness"
"name"
"airloss"
"loss"
"hotair"
"actas"

New Functions

tpt.throw_error(string error)
tpt.getscript(string script)
tpt.hud(number state)
tpt.newtonian_gravity(number state)
tpt.ambient_heat(number state)
tpt.decorations_enable(number state)
tpt.heat(number state)
tpt.active_menu(number menu)
tpt.display_mode(number display)
tpt.set_glow(number fireintensity)

Simple Example Code

 -- This line is a comment. Anything written after the -- is considered a Comment and will not be read by Lua.
 
 -- Set the console's state to 0. This will hide the console.
 tpt.set_console(0)
 
 -- Here we define our main function for the script
 function ClassicPowder()
    local ox = 125 -- This will be our offset for the different elements we will create.
    local y = 4 -- where on the y (vertical) axis where we will create our elements.
 
    local x = ox -- where on the x (horizontal) axis where we will create our elements. we will start the x value with what ever ox is above.
    for i=0, 10 do -- this is a for loop. everything between the do and end will loop until i hits 10. i increases by 1 every loop.
       tpt.create(x + i, y, "DUST") --create a dust particle
    end
 
    x = x + ox -- increase the x axis value by the offset x (ox) value above
    for i=0, 10 do
       tpt.create(x + i, y, "WATR") --create a water particle
    end
 
    x = x + ox
    for i=0, 10 do
       tpt.create(x + i, y, "SALT")
    end
 
    x = x + ox
    for i=0, 10 do
       tpt.create(x + i, y, "OIL")
    end
 
    return false
 end
 
 -- Register the step function ClassicPowder. This will make the ClassicPowder function run every tick of Powder Toy.
 tpt.register_step(ClassicPowder)