summaryrefslogtreecommitdiff
path: root/src/Simulation.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Simulation.h')
-rw-r--r--src/Simulation.h241
1 files changed, 241 insertions, 0 deletions
diff --git a/src/Simulation.h b/src/Simulation.h
new file mode 100644
index 0000000..b3c51af
--- /dev/null
+++ b/src/Simulation.h
@@ -0,0 +1,241 @@
+/*
+ * Simulation.h
+ *
+ * Created on: Jan 2, 2012
+ * Author: Simon
+ */
+
+#ifndef SIMULATION_H_
+#define SIMULATION_H_
+#include <cstring>
+#include "Config.h"
+#include "Renderer.h"
+#include "Graphics.h"
+#include "Elements.h"
+#include "misc.h"
+
+#define CHANNELS ((int)(MAX_TEMP-73)/100+2)
+
+class Simulation;
+class Renderer;
+class Gravity;
+class Air;
+
+struct Particle
+{
+ int type;
+ int life, ctype;
+ float x, y, vx, vy;
+ float temp;
+ float pavg[2];
+ int flags;
+ int tmp;
+ int tmp2;
+ unsigned int dcolour;
+};
+typedef struct Particle Particle;
+
+struct sign
+{
+ int x,y,ju;
+ char text[256];
+};
+typedef struct sign sign;
+
+struct part_type
+{
+ char *name;
+ pixel pcolors;
+ float advection;
+ float airdrag;
+ float airloss;
+ float loss;
+ float collision;
+ float gravity;
+ float diffusion;
+ float hotair;
+ int falldown;
+ int flammable;
+ int explosive;
+ int meltable;
+ int hardness;
+ int menu;
+ int enabled;
+ int weight;
+ int menusection;
+ float heat;
+ unsigned char hconduct;
+ char *descs;
+ char state;
+ unsigned int properties;
+ int (*update_func) (UPDATE_FUNC_ARGS);
+ int (*graphics_func) (GRAPHICS_FUNC_ARGS);
+};
+typedef struct part_type part_type;
+
+struct part_transition
+{
+ float plv; // transition occurs if pv is lower than this
+ int plt;
+ float phv; // transition occurs if pv is higher than this
+ int pht;
+ float tlv; // transition occurs if t is lower than this
+ int tlt;
+ float thv; // transition occurs if t is higher than this
+ int tht;
+};
+typedef struct part_transition part_transition;
+
+struct playerst
+{
+ char comm; //command cell
+ char pcomm; //previous command
+ int elem; //element power
+ float legs[16]; //legs' positions
+ float accs[8]; //accelerations
+ char spwn; //if stick man was spawned
+ unsigned int frames; //frames since last particle spawn - used when spawning LIGH
+};
+typedef struct playerst playerst;
+
+struct wall_type
+{
+ pixel colour;
+ pixel eglow; // if emap set, add this to fire glow
+ int drawstyle;
+ const char *descs;
+};
+typedef struct wall_type wall_type;
+
+struct gol_menu
+{
+ const char *name;
+ pixel colour;
+ int goltype;
+ const char *description;
+};
+typedef struct gol_menu gol_menu;
+
+//#ifdef _cplusplus
+class Simulation
+{
+private:
+public:
+
+ Gravity * grav;
+ Air * air;
+ part_type ptypes[PT_NUM];
+ part_transition ptransitions[PT_NUM];
+ wall_type wtypes[UI_WALLCOUNT];
+ gol_menu gmenu[NGOL];
+ int goltype[NGOL];
+ int grule[NGOL+1][10];
+ playerst player;
+ playerst player2;
+ playerst fighters[256]; //255 is the maximum number of fighters
+ unsigned char fighcount; //Contains the number of fighters
+ int lighting_recreate;
+ int gravwl_timeout;
+ Particle portalp[CHANNELS][8][80];
+ Particle emptyparticle;
+ int portal_rx[8];
+ int portal_ry[8];
+ int wireless[CHANNELS][2];
+ char can_move[PT_NUM][PT_NUM];
+ int parts_lastActiveIndex;// = NPART-1;
+ int pfree;
+ int NUM_PARTS;
+ int elementCount[PT_NUM];
+ int ISWIRE;
+ sign * signs;
+ //Gol sim
+ int CGOL;
+ int ISGOL;
+ int GSPEED;
+ unsigned char gol[XRES][YRES];
+ unsigned char gol2[XRES][YRES][NGOL+1];
+ //Air sim
+ float (*vx)[XRES/CELL];
+ float (*vy)[XRES/CELL];
+ float (*pv)[XRES/CELL];
+ float (*hv)[XRES/CELL];
+ //Gravity sim
+ float *gravx;//gravx[(YRES/CELL) * (XRES/CELL)];
+ float *gravy;//gravy[(YRES/CELL) * (XRES/CELL)];
+ float *gravp;//gravp[(YRES/CELL) * (XRES/CELL)];
+ float *gravmap;//gravmap[(YRES/CELL) * (XRES/CELL)];
+ //Walls
+ unsigned char bmap[YRES/CELL][XRES/CELL];
+ unsigned char emap[YRES/CELL][XRES/CELL];
+ float fvx[YRES/CELL][XRES/CELL];
+ float fvy[YRES/CELL][XRES/CELL];
+ //Particles
+ Particle parts[NPART];
+ int pmap[YRES][XRES];
+ int photons[YRES][XRES];
+ //
+ int gravityMode;
+ int airMode;
+ int ngrav_enable;
+ int legacy_enable;
+ int aheat_enable;
+ int VINE_MODE;
+ int water_equal_test;
+ int sys_pause;
+ int framerender;
+ int pretty_powder;
+ //
+ int sandcolour_r;
+ int sandcolour_g;
+ int sandcolour_b; //TODO: Make a single variable
+ //Stuff
+ int is_blocking(int t, int x, int y);
+ int is_boundary(int pt, int x, int y);
+ int find_next_boundary(int pt, int *x, int *y, int dm, int *em);
+ int pn_junction_sprk(int x, int y, int pt);
+ void photoelectric_effect(int nx, int ny);
+ unsigned direction_to_map(float dx, float dy, int t);
+ int do_move(int i, int x, int y, float nxf, float nyf);
+ int try_move(int i, int x, int y, int nx, int ny);
+ int eval_move(int pt, int nx, int ny, unsigned *rr);
+ void init_can_move();
+ void create_cherenkov_photon(int pp);
+ void create_gain_photon(int pp);
+ void kill_part(int i);
+ int flood_prop(int x, int y, size_t propoffset, void * propvalue, int proptype);
+ int flood_prop_2(int x, int y, size_t propoffset, void * propvalue, int proptype, int parttype, char * bitmap);
+ int flood_water(int x, int y, int i, int originaly, int check);
+ void detach(int i);
+ void part_change_type(int i, int x, int y, int t);
+ int create_part_add_props(int p, int x, int y, int tv, int rx, int ry);
+ //int InCurrentBrush(int i, int j, int rx, int ry);
+ //int get_brush_flags();
+ int create_part(int p, int x, int y, int t);
+ void delete_part(int x, int y, int flags);
+ int is_wire(int x, int y);
+ int is_wire_off(int x, int y);
+ void set_emap(int x, int y);
+ int parts_avg(int ci, int ni, int t);
+ void create_arc(int sx, int sy, int dx, int dy, int midpoints, int variance, int type, int flags);
+ int nearest_part(int ci, int t, int max_d);
+ void update_particles_i(int start, int inc);
+ void update_particles();
+ void rotate_area(int area_x, int area_y, int area_w, int area_h, int invert);
+ void clear_area(int area_x, int area_y, int area_w, int area_h);
+ void create_box(int x1, int y1, int x2, int y2, int c, int flags);
+ int flood_parts(int x, int y, int c, int cm, int bm, int flags);
+ int create_parts(int x, int y, int rx, int ry, int c, int flags);
+ void create_line(int x1, int y1, int x2, int y2, int rx, int ry, int c, int flags);
+ void *transform_save(void *odata, int *size, matrix2d transform, vector2d translate);
+ void orbitalparts_get(int block1, int block2, int resblock1[], int resblock2[]);
+ void orbitalparts_set(int *block1, int *block2, int resblock1[], int resblock2[]);
+ int get_wavelength_bin(int *wm);
+ int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny);
+ int get_normal_interp(int pt, float x0, float y0, float dx, float dy, float *nx, float *ny);
+ void clear_sim();
+ void UpdateParticles();
+ Simulation();
+};
+//#endif
+
+#endif /* SIMULATION_H_ */