diff --git a/src/gui/game/PropertyTool.cpp b/src/gui/game/PropertyTool.cpp index f5cd9bb1d..73c6c8328 100644 --- a/src/gui/game/PropertyTool.cpp +++ b/src/gui/game/PropertyTool.cpp @@ -99,25 +99,21 @@ void PropertyWindow::SetProperty() Client::Ref().SetPref("Prop.Type", property->GetOption().second); Client::Ref().SetPref("Prop.Value", textField->GetText()); - if(tool->propValue) - free(tool->propValue); - tool->propValue=malloc(sizeof(int)); - int tempInt; - unsigned int tempUInt; - float tempFloat; std::string value = textField->GetText(); try { switch(properties[property->GetOption().second].Type) { case StructProperty::Integer: case StructProperty::ParticleType: + { + int v; if(value.length() > 2 && value.substr(0, 2) == "0x") { //0xC0FFEE std::stringstream buffer; buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); buffer << std::hex << value.substr(2); - buffer >> tempInt; + buffer >> v; } else if(value.length() > 1 && value[0] == '#') { @@ -125,7 +121,7 @@ void PropertyWindow::SetProperty() std::stringstream buffer; buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); buffer << std::hex << value.substr(1); - buffer >> tempInt; + buffer >> v; } else { @@ -137,15 +133,15 @@ void PropertyWindow::SetProperty() #ifdef DEBUG std::cout << "Got type from particle name" << std::endl; #endif - tempInt = type; + v = type; } else { std::stringstream buffer(value); buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); - buffer >> tempInt; + buffer >> v; } - if (property->GetOption().first == "type" && (tempInt < 0 || tempInt >= PT_NUM || !sim->elements[tempInt].Enabled)) + if (property->GetOption().first == "type" && (v < 0 || v >= PT_NUM || !sim->elements[v].Enabled)) { new ErrorMessage("Could not set property", "Invalid Particle Type"); return; @@ -155,22 +151,25 @@ void PropertyWindow::SetProperty() { std::stringstream buffer(value); buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); - buffer >> tempInt; + buffer >> v; } } #ifdef DEBUG - std::cout << "Got int value " << tempInt << std::endl; + std::cout << "Got int value " << v << std::endl; #endif - *(int *)tool->propValue = tempInt; + tool->propValue.Integer = v; break; + } case StructProperty::UInteger: + { + unsigned int v; if(value.length() > 2 && value.substr(0, 2) == "0x") { //0xC0FFEE std::stringstream buffer; buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); buffer << std::hex << value.substr(2); - buffer >> tempUInt; + buffer >> v; } else if(value.length() > 1 && value[0] == '#') { @@ -178,28 +177,28 @@ void PropertyWindow::SetProperty() std::stringstream buffer; buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); buffer << std::hex << value.substr(1); - buffer >> tempUInt; + buffer >> v; } else { std::stringstream buffer(value); buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); - buffer >> tempUInt; + buffer >> v; } #ifdef DEBUG - std::cout << "Got uint value " << tempUInt << std::endl; + std::cout << "Got uint value " << v << std::endl; #endif - *(unsigned int *)tool->propValue = tempUInt; + tool->propValue.UInteger = v; break; + } case StructProperty::Float: { std::stringstream buffer(value); buffer.exceptions(std::stringstream::failbit | std::stringstream::badbit); - buffer >> tempFloat; + buffer >> tool->propValue.Float; #ifdef DEBUG - std::cout << "Got float value " << tempFloat << std::endl; + std::cout << "Got float value " << tool->propValue.Float << std::endl; #endif - *(float *)tool->propValue = tempFloat; } break; default: @@ -243,8 +242,6 @@ void PropertyTool::OpenWindow(Simulation *sim) void PropertyTool::SetProperty(Simulation *sim, ui::Point position) { - if(!propValue) - return; if(position.X<0 || position.X>XRES || position.Y<0 || position.Y>YRES) return; int i = sim->pmap[position.Y][position.X]; @@ -255,14 +252,14 @@ void PropertyTool::SetProperty(Simulation *sim, ui::Point position) switch (propType) { case StructProperty::Float: - *((float*)(((char*)&sim->parts[i>>8])+propOffset)) = *((float*)propValue); + *((float*)(((char*)&sim->parts[i>>8])+propOffset)) = propValue.Float; break; case StructProperty::ParticleType: case StructProperty::Integer: - *((int*)(((char*)&sim->parts[i>>8])+propOffset)) = *((int*)propValue); + *((int*)(((char*)&sim->parts[i>>8])+propOffset)) = propValue.Integer; break; case StructProperty::UInteger: - *((unsigned int*)(((char*)&sim->parts[i>>8])+propOffset)) = *((unsigned int*)propValue); + *((unsigned int*)(((char*)&sim->parts[i>>8])+propOffset)) = propValue.UInteger; break; default: break; diff --git a/src/gui/game/Tool.h b/src/gui/game/Tool.h index 03e273585..ee603b348 100644 --- a/src/gui/game/Tool.h +++ b/src/gui/game/Tool.h @@ -82,12 +82,11 @@ class PropertyTool: public Tool { public: PropertyTool(): - Tool(0, "PROP", "Property Edit. Click to alter the properties of elements in the field.", 0xfe, 0xa9, 0x00, "DEFAULT_UI_PROPERTY", NULL), - propValue(NULL) + Tool(0, "PROP", "Property Edit. Click to alter the properties of elements in the field.", 0xfe, 0xa9, 0x00, "DEFAULT_UI_PROPERTY", NULL) { } StructProperty::PropertyType propType; - void *propValue; + PropertyValue propValue; size_t propOffset; void OpenWindow(Simulation *sim); diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index fc64f199c..d8b3ec2cd 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -367,7 +367,7 @@ bool Simulation::FloodFillPmapCheck(int x, int y, int type) return (pmap[y][x]&0xFF) == type; } -int Simulation::flood_prop_2(int x, int y, size_t propoffset, void * propvalue, StructProperty::PropertyType proptype, int parttype, char * bitmap) +int Simulation::flood_prop_2(int x, int y, size_t propoffset, PropertyValue propvalue, StructProperty::PropertyType proptype, int parttype, char * bitmap) { int x1, x2, i, dy = 1; x1 = x2 = x; @@ -396,16 +396,16 @@ int Simulation::flood_prop_2(int x, int y, size_t propoffset, void * propvalue, continue; switch (proptype) { case StructProperty::Float: - *((float*)(((char*)&parts[i>>8])+propoffset)) = *((float*)propvalue); + *((float*)(((char*)&parts[i>>8])+propoffset)) = propvalue.Float; break; case StructProperty::ParticleType: case StructProperty::Integer: - *((int*)(((char*)&parts[i>>8])+propoffset)) = *((int*)propvalue); + *((int*)(((char*)&parts[i>>8])+propoffset)) = propvalue.Integer; break; case StructProperty::UInteger: - *((unsigned int*)(((char*)&parts[i>>8])+propoffset)) = *((unsigned int*)propvalue); + *((unsigned int*)(((char*)&parts[i>>8])+propoffset)) = propvalue.UInteger; break; default: @@ -426,7 +426,7 @@ int Simulation::flood_prop_2(int x, int y, size_t propoffset, void * propvalue, return 1; } -int Simulation::flood_prop(int x, int y, size_t propoffset, void * propvalue, StructProperty::PropertyType proptype) +int Simulation::flood_prop(int x, int y, size_t propoffset, PropertyValue propvalue, StructProperty::PropertyType proptype) { int r = 0; char * bitmap = (char *)malloc(XRES*YRES); //Bitmap for checking diff --git a/src/simulation/Simulation.h b/src/simulation/Simulation.h index 0de75e1d6..5933619a5 100644 --- a/src/simulation/Simulation.h +++ b/src/simulation/Simulation.h @@ -72,10 +72,6 @@ public: int portal_rx[8]; int portal_ry[8]; int wireless[CHANNELS][2]; - //PROP tool property to draw (TODO) - //void *prop_value; - //StructProperty::PropertyType proptype; - //size_t prop_offset; //Gol sim int CGOL; int GSPEED; @@ -138,8 +134,8 @@ public: void create_gain_photon(int pp); void kill_part(int i); bool FloodFillPmapCheck(int x, int y, int type); - int flood_prop(int x, int y, size_t propoffset, void * propvalue, StructProperty::PropertyType proptype); - int flood_prop_2(int x, int y, size_t propoffset, void * propvalue, StructProperty::PropertyType proptype, int parttype, char * bitmap); + int flood_prop(int x, int y, size_t propoffset, PropertyValue propvalue, StructProperty::PropertyType proptype); + int flood_prop_2(int x, int y, size_t propoffset, PropertyValue propvalue, StructProperty::PropertyType proptype, int parttype, char * bitmap); int flood_water(int x, int y, int i, int originaly, int check); int FloodINST(int x, int y, int fullc, int cm); void detach(int i); diff --git a/src/simulation/StructProperty.h b/src/simulation/StructProperty.h index dda72c4eb..06444e25f 100644 --- a/src/simulation/StructProperty.h +++ b/src/simulation/StructProperty.h @@ -28,4 +28,10 @@ struct StructProperty } }; +union PropertyValue { + int Integer; + unsigned int UInteger; + float Float; +}; + #endif diff --git a/src/simulation/elements/BANG.cpp b/src/simulation/elements/BANG.cpp index fa1ebaed4..5ff292d2b 100644 --- a/src/simulation/elements/BANG.cpp +++ b/src/simulation/elements/BANG.cpp @@ -73,8 +73,7 @@ int Element_BANG::update(UPDATE_FUNC_ARGS) { if ((pmap[y][x]>>8 == i)) { - int tempvalue = 2; - sim->flood_prop(x, y, offsetof(Particle, tmp), &tempvalue, StructProperty::Integer); + sim->flood_prop(x, y, offsetof(Particle, tmp), (PropertyValue){.Integer = 2}, StructProperty::Integer); } parts[i].tmp = 2; }