Difference between revisions of "Functions"

From The Powder Toy
Jump to: navigation, search
m
(update / reorganize some functions)
Line 1: Line 1:
 
When you are modding TPT++ and come to writing the update routine, there are a few functions you will need to use. A reference of those is shown below.  
 
When you are modding TPT++ and come to writing the update routine, there are a few functions you will need to use. A reference of those is shown below.  
 +
 +
; sim->create_part(int p, int x, int y, int t);
 +
: What it does: Creates a particle at a given coordinate.
 +
: '''int p''' - How the particle is created. -1 means from the code (will only create a particle if the space is empty). This is the normal way to create a particle, -2 is from the brush (don't use this), -3 means it will ignore any particles in the space and draw it anyway, and any positive number will overrite the particle at that index with this newly created particle.
 +
: '''int x''' - Particle's x coordinate
 +
: '''int y''' - Particle's y coordinate
 +
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.
 +
 +
; sim->kill_part(int i) - Deletes particle with index i
 +
: What it does: Deletes a particle without the given x and y, using its index instead.
 +
: '''int i''' - The particle's index. Passed into the function as 'i'.
 +
 +
; sim->delete_part(int x, int y, int flags);
 +
: What it does: Deletes a particle at location (x, y)
 +
: '''int x''' - Particle's x coordinate
 +
: '''int y''' - Particle's y coordinate
 +
: '''int flags''' - Un-useful value, leave it as 0
 +
 +
; sim->part_change_type(int i, int x, int y, int t);
 +
: What it does: Changes type of particle i. Do not manually set parts[].type, use this function instead.
 +
: '''int i''' - The particle's index.
 +
: '''int x''' - Particle's x coordinate. Pass in parts[i].x here.
 +
: '''int y''' - Particle's y coordinate. Pass in parts[i].y here.
 +
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.
  
 
; sim->clear_area(int x, int y, int w, int h);
 
; sim->clear_area(int x, int y, int w, int h);
Line 7: Line 31:
 
: '''int w''' - The width of the rectangle
 
: '''int w''' - The width of the rectangle
 
: '''int h''' - The height of the rectangle
 
: '''int h''' - The height of the rectangle
 
; sim->create_part(int p, int x, int y, int t);
 
: What it does: Creates a particle at a given coordinate.
 
: '''int p''' - How the particle is created. -1 means from the code (will only create a particle if the space is empty). This is the normal way to create a particle, -2 is from the brush (don't use this), -3 means it will ignore any particles in the space and draw it anyway, and any positive number will overrite the particle at that index with this newly created particle.
 
: '''int x''' - Particle's x coordinate
 
: '''int y''' - Particle's y coordinate
 
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.
 
  
 
; sim->CreateBox(int x1, int y1, int x2, int y2, int t, int flags)
 
; sim->CreateBox(int x1, int y1, int x2, int y2, int t, int flags)
Line 24: Line 41:
 
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.  
 
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.  
 
: '''int flags''' - Un-useful value, leave it as 0
 
: '''int flags''' - Un-useful value, leave it as 0
 
  
 
; sim->CreateLine(int x1, int y1, int x2, int y2, int rx, int ry, int c, int flags)  
 
; sim->CreateLine(int x1, int y1, int x2, int y2, int rx, int ry, int c, int flags)  
Line 38: Line 54:
 
: For a single pixel wide line, use 1 for both of the values.  
 
: For a single pixel wide line, use 1 for both of the values.  
 
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.  
 
: '''int t''' - Particle's type. Use a pre-defined value, such as PT_INST.  
: '''int flags''' - Un-useful value, leave it as 0
 
:
 
; sim->delete_part(int x, int y, int flags);
 
: What it does: Deletes a particle (removes all the values associated it!)
 
: '''int x''' - Particle's x coordinate
 
: '''int y''' - Particle's y coordinate
 
 
: '''int flags''' - Un-useful value, leave it as 0
 
: '''int flags''' - Un-useful value, leave it as 0
  
Line 55: Line 65:
 
: '''int flags''' - Un-useful value, leave it as 0
 
: '''int flags''' - Un-useful value, leave it as 0
  
; sim->flood_prop(int x, int y, size_t propoffset, void * propvalue, <nowiki>StructProperty::PropertyType</nowiki> proptype);
+
; sim->flood_prop(int x, int y, size_t propoffset, PropertyValue propvalue, <nowiki>StructProperty::PropertyType</nowiki> proptype);
 
: What it does: Sets a property via flood-fill. (Like PROP)  
 
: What it does: Sets a property via flood-fill. (Like PROP)  
 
: '''int x''' - Particle's x coordinate  
 
: '''int x''' - Particle's x coordinate  
 
: '''int y''' - Particle's y coordinate  
 
: '''int y''' - Particle's y coordinate  
: '''size_t propoffset''' - This is a value returned by the function '''''offsetof(Particle, <property>)'''''.  
+
: '''size_t propoffset''' - This is a value returned by the function <tt>offsetof(Particle, <property>)</tt>.  
: Replace <property> with what you want, for example '''tmp''' or '''ctype'''.  
+
: Replace <property> with what you want, for example <tt>tmp</tt> or <tt>ctype</tt>.  
: '''void * propvalue''' - A reference to your property's value. One needs to define the value beforehand.  
+
: '''PropertyValue  propvalue''' - A c++ union, which holds the property you want to set. You may declare <tt>PropertyValue value;</tt>, then do <tt>value.Integer = 2;</tt> in order to use this. The other two properties you can set are .Float (if setting temperature or veloticy) and .UInteger (if setting decoration color)
: For example, when you've defined '''int temperature = 200;''', then you should use '''&temperature'''.  
 
 
: '''StructProperty::PropertyType proptype''' - What kind of type the value you provided is.  
 
: '''StructProperty::PropertyType proptype''' - What kind of type the value you provided is.  
: For example, if you had a temperature number (as an integer), then you could use 'StructProperty::Integer'.  
+
: For example, if you had a temperature number (as an integer), then you could use <tt>StructProperty::Integer</tt>.  
: The types are: 'StructProperty::Integer', 'StructProperty::Float' and 'StructProperty::Uinteger'
+
: The types are: <tt>StructProperty::Integer</tt>, <tt>StructProperty::Float</tt> and <tt>StructProperty::Uinteger</tt>
 
 
; sim->kill_part(int i) - Deletes particle 'with index ''''i.(Does not use x,y location like delete_part)
 
: What it does: Deletes a particle without the given x and y, using its index instead.
 
: '''int i''' - The particle's index. Passed into the function as 'i'.
 
  
 
; sim->nearest_part(int i,int t, int max_d);
 
; sim->nearest_part(int i,int t, int max_d);
Line 86: Line 91:
 
: Returns: 0 if there isn't an element of type t in between the two, 1 if there is.
 
: Returns: 0 if there isn't an element of type t in between the two, 1 if there is.
  
; sim->part_change_type(int i, int x, int y, int t); - Changes type of particle i. t is new type, x is the x location of the particle, y is the y location of the particle.
+
[[Category:Development]]

Revision as of 18:40, 10 April 2014

When you are modding TPT++ and come to writing the update routine, there are a few functions you will need to use. A reference of those is shown below.

sim->create_part(int p, int x, int y, int t);
What it does: Creates a particle at a given coordinate.
int p - How the particle is created. -1 means from the code (will only create a particle if the space is empty). This is the normal way to create a particle, -2 is from the brush (don't use this), -3 means it will ignore any particles in the space and draw it anyway, and any positive number will overrite the particle at that index with this newly created particle.
int x - Particle's x coordinate
int y - Particle's y coordinate
int t - Particle's type. Use a pre-defined value, such as PT_INST.
sim->kill_part(int i) - Deletes particle with index i
What it does: Deletes a particle without the given x and y, using its index instead.
int i - The particle's index. Passed into the function as 'i'.
sim->delete_part(int x, int y, int flags);
What it does: Deletes a particle at location (x, y)
int x - Particle's x coordinate
int y - Particle's y coordinate
int flags - Un-useful value, leave it as 0
sim->part_change_type(int i, int x, int y, int t);
What it does: Changes type of particle i. Do not manually set parts[].type, use this function instead.
int i - The particle's index.
int x - Particle's x coordinate. Pass in parts[i].x here.
int y - Particle's y coordinate. Pass in parts[i].y here.
int t - Particle's type. Use a pre-defined value, such as PT_INST.
sim->clear_area(int x, int y, int w, int h);
What it does: Clears a rectangle with specified height and width.
int x - Top left corner's x coordinate (from left towards the right)
int y - Top left corner's y coordinate (from top downwards!)
int w - The width of the rectangle
int h - The height of the rectangle
sim->CreateBox(int x1, int y1, int x2, int y2, int t, int flags)
What it does: Utility function, creates a rectangle of a given particle.
For some reason, this uses a different way to specify a rectangle than the deleting equivalent.
int x1 - Top left corner's x coordinate
int y1 - Top right corner's y coordinate
int x2 - Bottom left corner's x coordinate (note: not the box's width!)
int y2 - Bottom left corner's y coordinate (see note above)
int t - Particle's type. Use a pre-defined value, such as PT_INST.
int flags - Un-useful value, leave it as 0
sim->CreateLine(int x1, int y1, int x2, int y2, int rx, int ry, int c, int flags)
What it does: Draws a line of a specified element from two points. (The equivalent of Shift+drag)
int x1 - Line start's x coordinate.
int y1 - Line start's y coordinate.
int x2 - Line end's x coordinate.
int y2 - Line end's y coordinate.
int rx - The line's X radius
int ry - The line's Y radius
Note: The function creates a Brush which is actually an oval with the specified X and Y radiuses.
That's why those are needed.
For a single pixel wide line, use 1 for both of the values.
int t - Particle's type. Use a pre-defined value, such as PT_INST.
int flags - Un-useful value, leave it as 0
sim->FloodParts(int x, int y, int t, int cm, int bm, int flags);
What it does: Starts a flood-fill from a point. (like ctrl+shift+clicking in TPT)
int x - Particle's x coordinate
int y - Particle's y coordinate
int t - Particle's type. Use a pre-defined value, such as PT_INST.
int cm - used by recursion in the code, leave it as -1
int bm - used by recursion in the code, leave it as -1
int flags - Un-useful value, leave it as 0
sim->flood_prop(int x, int y, size_t propoffset, PropertyValue propvalue, StructProperty::PropertyType proptype);
What it does: Sets a property via flood-fill. (Like PROP)
int x - Particle's x coordinate
int y - Particle's y coordinate
size_t propoffset - This is a value returned by the function offsetof(Particle, <property>).
Replace <property> with what you want, for example tmp or ctype.
PropertyValue propvalue - A c++ union, which holds the property you want to set. You may declare PropertyValue value;, then do value.Integer = 2; in order to use this. The other two properties you can set are .Float (if setting temperature or veloticy) and .UInteger (if setting decoration color)
StructProperty::PropertyType proptype - What kind of type the value you provided is.
For example, if you had a temperature number (as an integer), then you could use StructProperty::Integer.
The types are: StructProperty::Integer, StructProperty::Float and StructProperty::Uinteger
sim->nearest_part(int i,int t, int max_d);
What it does: Finds the nearest particle of a certain type.
int i - The particle's index. Passed into the function as 'i'.
int t - Particle's type. Use a pre-defined value, such as PT_INST.
int max_d - The maximum distance to look from. Set as -1 if you want it to be unlimited.
Returns: -1 if not found; particle index if found.
sim->parts_avg(int i, int ni, int t);
What it does: Checks if an element of type t is inbetween the two particles specified as indexes.
int i - The (first) particle's index. Passed into the function as 'i'.
int ni - The other particle's index.
int t - Particle's type. Use a pre-defined value, such as PT_INST.
It will actually only check the location directly in the middle
Returns: 0 if there isn't an element of type t in between the two, 1 if there is.