Lua

From The Powder Toy
Revision as of 22:09, 24 May 2012 by jacob1 (talk | contribs) (add new tpt.graphics_func, needs a better description for pixel_mode)
Jump to: navigation, search

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 lua#tpt.set_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/pil/ )


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.

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. Scale defaults to 1, fullscreen defaults to off. Returns a number, 1 indicates 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)

Returns the index of the newly created particle.

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 indices of the particles. (Used to help get particle indices, 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.

tpt.getPartIndex()

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

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.drawline

Draws a line on the screen (for one frame, only useful in scripts), 3 overloads. The line starts at point (x1, y1) and ends at point (x2,y2).

tpt.drawpixel(number x1, number y1, number x2, number y2)

tpt.drawpixel(number x1, number y1, number x2, number y2, number red, number green, number blue)

tpt.drawpixel(number x1, number y1, number x2, number y2, 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 equals 1 when the mouse gets pressed, 2 when the mouse gets 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 a key is released. Event equals 1 when a key is pressed, and 2 when it gets released. If your function returns false, key presses in the normal Powder Toy will be ignored.

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

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". Setting it to 1, or an odd number, will display info on the number of particles on the screen. Setting it to 4 or 5 will display usefull information when you draw lines using shift.

tpt.setdebug(number mode)

tpt.element

returns an element's number. For example, it would return 28 for dmnd

tpt.element(string elementname)

tpt.element_func

allows you to replace or add on to an element's update function. Write a function like normal, and then put its name into this command. Use tpt.element("...") or tpt.el.dust.id for el_number, and make replace true if you want to overwrite the previous function, or false instead.

Passes: (number index, number partx, number party, number surround_space, number nt)

Returns: return 1 from your function if the particle is killed.

tpt.element_func(function newfunction, number el_number)

tpt.element_func(function newfunction, number el_number, boolean replace)

tpt.graphics_func

allows you to replace an element's graphics function. Write a function like normal, and then put its name into this command. Use tpt.el.(name of element to change).id for el_number.

Passes: (number index, number colr, number colg, number colb)

Returns: cache, pixel_mode, cola, colr, colg, colb, firea, firer, fireg, and fireb.

set cache to 1 if you don't want the function to ever be called again, preventing lag. Don't do this if you need the way your element looks to change depending on its properties.

colr/g/b are the red, green, and blue colors of your element. firea/r/g/b set the fire colors, but pixel_mode needs to be set to 0x00022000 for them to work.

tpt.graphics_func(function newfunction, number el_number)

tpt.screenshot

Takes a screenshot of the current screen, minus the menu and HUD.

tpt.screenshot()

tpt.screenshot(boolean fullscreen)

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

Simple Example Code

  -- This line is a comment. Anything written after the -- is considered a Comment and will not be read by Lua.
  -- Comment can be multiline, for this you should write it in --[[ and ]]--
  -- 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)