diff options
Diffstat (limited to 'src/Simulation.h')
| -rw-r--r-- | src/Simulation.h | 241 |
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_ */ |
