summaryrefslogtreecommitdiff
path: root/src/cat/LuaScriptInterface.cpp
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-08-30 13:28:53 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-08-30 13:28:53 (GMT)
commit7c2e84b7bb6f868546c68f566d345739b1d7174d (patch)
tree5f202b68404d55a73e3470ae467c907453ef7acd /src/cat/LuaScriptInterface.cpp
parenta9fba97c3632a69b359c5fccbdc5ba71ceb814b5 (diff)
downloadpowder-7c2e84b7bb6f868546c68f566d345739b1d7174d.zip
powder-7c2e84b7bb6f868546c68f566d345739b1d7174d.tar.gz
More methods for setting element properties
Diffstat (limited to 'src/cat/LuaScriptInterface.cpp')
-rw-r--r--src/cat/LuaScriptInterface.cpp157
1 files changed, 132 insertions, 25 deletions
diff --git a/src/cat/LuaScriptInterface.cpp b/src/cat/LuaScriptInterface.cpp
index 8a01fc0..08c2e82 100644
--- a/src/cat/LuaScriptInterface.cpp
+++ b/src/cat/LuaScriptInterface.cpp
@@ -411,6 +411,7 @@ void LuaScriptInterface::initElementsAPI()
{"allocate", elements_allocate},
{"element", elements_element},
{"free", elements_free},
+ {"loadDefault", elements_loadDefault},
{NULL, NULL}
};
luaL_register(l, "elements", elementsAPIMethods);
@@ -418,32 +419,47 @@ void LuaScriptInterface::initElementsAPI()
//Static values
//Element types/properties/states
- lua_pushinteger(l, TYPE_PART); lua_setfield(l, elementsAPI, "TYPE_PART");
- lua_pushinteger(l, TYPE_LIQUID); lua_setfield(l, elementsAPI, "TYPE_LIQUID");
- lua_pushinteger(l, TYPE_SOLID); lua_setfield(l, elementsAPI, "TYPE_SOLID");
- lua_pushinteger(l, TYPE_GAS); lua_setfield(l, elementsAPI, "TYPE_GAS");
- lua_pushinteger(l, TYPE_ENERGY); lua_setfield(l, elementsAPI, "TYPE_ENERGY");
- lua_pushinteger(l, PROP_CONDUCTS); lua_setfield(l, elementsAPI, "PROP_CONDUCTS");
- lua_pushinteger(l, PROP_BLACK); lua_setfield(l, elementsAPI, "PROP_BLACK");
+ lua_pushinteger(l, TYPE_PART); lua_setfield(l, elementsAPI, "TYPE_PART");
+ lua_pushinteger(l, TYPE_LIQUID); lua_setfield(l, elementsAPI, "TYPE_LIQUID");
+ lua_pushinteger(l, TYPE_SOLID); lua_setfield(l, elementsAPI, "TYPE_SOLID");
+ lua_pushinteger(l, TYPE_GAS); lua_setfield(l, elementsAPI, "TYPE_GAS");
+ lua_pushinteger(l, TYPE_ENERGY); lua_setfield(l, elementsAPI, "TYPE_ENERGY");
+ lua_pushinteger(l, PROP_CONDUCTS); lua_setfield(l, elementsAPI, "PROP_CONDUCTS");
+ lua_pushinteger(l, PROP_BLACK); lua_setfield(l, elementsAPI, "PROP_BLACK");
lua_pushinteger(l, PROP_NEUTPENETRATE); lua_setfield(l, elementsAPI, "PROP_NEUTPENETRATE");
- lua_pushinteger(l, PROP_NEUTABSORB); lua_setfield(l, elementsAPI, "PROP_NEUTABSORB");
- lua_pushinteger(l, PROP_NEUTPASS); lua_setfield(l, elementsAPI, "PROP_NEUTPASS");
- lua_pushinteger(l, PROP_DEADLY); lua_setfield(l, elementsAPI, "PROP_DEADLY");
- lua_pushinteger(l, PROP_HOT_GLOW); lua_setfield(l, elementsAPI, "PROP_HOT_GLOW");
- lua_pushinteger(l, PROP_LIFE); lua_setfield(l, elementsAPI, "PROP_LIFE");
- lua_pushinteger(l, PROP_RADIOACTIVE); lua_setfield(l, elementsAPI, "PROP_RADIOACTIVE");
- lua_pushinteger(l, PROP_LIFE_DEC); lua_setfield(l, elementsAPI, "PROP_LIFE_DEC");
- lua_pushinteger(l, PROP_LIFE_KILL); lua_setfield(l, elementsAPI, "PROP_LIFE_KILL");
+ lua_pushinteger(l, PROP_NEUTABSORB); lua_setfield(l, elementsAPI, "PROP_NEUTABSORB");
+ lua_pushinteger(l, PROP_NEUTPASS); lua_setfield(l, elementsAPI, "PROP_NEUTPASS");
+ lua_pushinteger(l, PROP_DEADLY); lua_setfield(l, elementsAPI, "PROP_DEADLY");
+ lua_pushinteger(l, PROP_HOT_GLOW); lua_setfield(l, elementsAPI, "PROP_HOT_GLOW");
+ lua_pushinteger(l, PROP_LIFE); lua_setfield(l, elementsAPI, "PROP_LIFE");
+ lua_pushinteger(l, PROP_RADIOACTIVE); lua_setfield(l, elementsAPI, "PROP_RADIOACTIVE");
+ lua_pushinteger(l, PROP_LIFE_DEC); lua_setfield(l, elementsAPI, "PROP_LIFE_DEC");
+ lua_pushinteger(l, PROP_LIFE_KILL); lua_setfield(l, elementsAPI, "PROP_LIFE_KILL");
lua_pushinteger(l, PROP_LIFE_KILL_DEC); lua_setfield(l, elementsAPI, "PROP_LIFE_KILL_DEC");
- lua_pushinteger(l, PROP_SPARKSETTLE); lua_setfield(l, elementsAPI, "PROP_SPARKSETTLE");
- lua_pushinteger(l, PROP_NOAMBHEAT); lua_setfield(l, elementsAPI, "PROP_NOAMBHEAT");
- lua_pushinteger(l, FLAG_STAGNANT); lua_setfield(l, elementsAPI, "FLAG_STAGNANT");
- lua_pushinteger(l, FLAG_SKIPMOVE); lua_setfield(l, elementsAPI, "FLAG_SKIPMOVE");
- lua_pushinteger(l, FLAG_MOVABLE); lua_setfield(l, elementsAPI, "FLAG_MOVABLE");
- lua_pushinteger(l, ST_NONE); lua_setfield(l, elementsAPI, "ST_NONE");
- lua_pushinteger(l, ST_SOLID); lua_setfield(l, elementsAPI, "ST_SOLID");
- lua_pushinteger(l, ST_LIQUID); lua_setfield(l, elementsAPI, "ST_LIQUID");
- lua_pushinteger(l, ST_GAS); lua_setfield(l, elementsAPI, "ST_GAS");
+ lua_pushinteger(l, PROP_SPARKSETTLE); lua_setfield(l, elementsAPI, "PROP_SPARKSETTLE");
+ lua_pushinteger(l, PROP_NOAMBHEAT); lua_setfield(l, elementsAPI, "PROP_NOAMBHEAT");
+ lua_pushinteger(l, FLAG_STAGNANT); lua_setfield(l, elementsAPI, "FLAG_STAGNANT");
+ lua_pushinteger(l, FLAG_SKIPMOVE); lua_setfield(l, elementsAPI, "FLAG_SKIPMOVE");
+ lua_pushinteger(l, FLAG_MOVABLE); lua_setfield(l, elementsAPI, "FLAG_MOVABLE");
+ lua_pushinteger(l, ST_NONE); lua_setfield(l, elementsAPI, "ST_NONE");
+ lua_pushinteger(l, ST_SOLID); lua_setfield(l, elementsAPI, "ST_SOLID");
+ lua_pushinteger(l, ST_LIQUID); lua_setfield(l, elementsAPI, "ST_LIQUID");
+ lua_pushinteger(l, ST_GAS); lua_setfield(l, elementsAPI, "ST_GAS");
+
+ lua_pushinteger(l, SC_WALL); lua_setfield(l, elementsAPI, "SC_WALL");
+ lua_pushinteger(l, SC_ELEC); lua_setfield(l, elementsAPI, "SC_ELEC");
+ lua_pushinteger(l, SC_POWERED); lua_setfield(l, elementsAPI, "SC_POWERED");
+ lua_pushinteger(l, SC_FORCE); lua_setfield(l, elementsAPI, "SC_FORCE");
+ lua_pushinteger(l, SC_EXPLOSIVE); lua_setfield(l, elementsAPI, "SC_EXPLOSIVE");
+ lua_pushinteger(l, SC_GAS); lua_setfield(l, elementsAPI, "SC_GAS");
+ lua_pushinteger(l, SC_LIQUID); lua_setfield(l, elementsAPI, "SC_LIQUID");
+ lua_pushinteger(l, SC_POWDERS); lua_setfield(l, elementsAPI, "SC_POWDERS");
+ lua_pushinteger(l, SC_SOLIDS); lua_setfield(l, elementsAPI, "SC_SOLIDS");
+ lua_pushinteger(l, SC_NUCLEAR); lua_setfield(l, elementsAPI, "SC_NUCLEAR");
+ lua_pushinteger(l, SC_SPECIAL); lua_setfield(l, elementsAPI, "SC_SPECIAL");
+ lua_pushinteger(l, SC_LIFE); lua_setfield(l, elementsAPI, "SC_LIFE");
+ lua_pushinteger(l, SC_TOOL); lua_setfield(l, elementsAPI, "SC_TOOL");
+ lua_pushinteger(l, SC_DECO); lua_setfield(l, elementsAPI, "SC_DECO");
//Element identifiers
for(int i = 0; i < PT_NUM; i++)
@@ -456,6 +472,51 @@ void LuaScriptInterface::initElementsAPI()
}
}
+int LuaScriptInterface::elements_loadDefault(lua_State * l)
+{
+ int args = lua_gettop(l);
+ if(args)
+ {
+ luaL_checktype(l, 1, LUA_TNUMBER);
+ int id = lua_tointeger(l, 1);
+ if(id < 0 || id >= PT_NUM)
+ return luaL_error(l, "Invalid element");
+
+ lua_getglobal(l, "elements");
+ lua_pushnil(l);
+ lua_setfield(l, -2, luacon_sim->elements[id].Identifier);
+
+ std::vector<Element> elementList = GetElements();
+ if(id < elementList.size())
+ luacon_sim->elements[id] = elementList[id];
+ else
+ luacon_sim->elements[id] = Element();
+
+ lua_pushinteger(l, id);
+ lua_setfield(l, -2, luacon_sim->elements[id].Identifier);
+ lua_pop(l, 1);
+ }
+ else
+ {
+ std::vector<Element> elementList = GetElements();
+ for(int i = 0; i < PT_NUM; i++)
+ {
+ if(i < elementList.size())
+ luacon_sim->elements[i] = elementList[i];
+ else
+ luacon_sim->elements[i] = Element();
+ }
+ lua_pushnil(l);
+ lua_setglobal(l, "elements");
+ luacon_ci->initElementsAPI();
+ }
+
+ luacon_model->BuildMenus();
+ luacon_sim->init_can_move();
+ std::fill(luacon_ren->graphicscache, luacon_ren->graphicscache+PT_NUM, gcache_item());
+
+}
+
int LuaScriptInterface::elements_allocate(lua_State * l)
{
std::string group, id, identifier;
@@ -514,7 +575,53 @@ int LuaScriptInterface::elements_element(lua_State * l)
if(args > 1)
{
- //Write values from fields in the table
+ luaL_checktype(l, 2, LUA_TTABLE);
+ std::vector<StructProperty> properties = Element::GetProperties();
+ //Write values from native data to a table
+ for(std::vector<StructProperty>::iterator iter = properties.begin(), end = properties.end(); iter != end; ++iter)
+ {
+ lua_getfield(l, -1, (*iter).Name.c_str());
+ if(lua_type(l, -1) != LUA_TNIL)
+ {
+ intptr_t offset = (*iter).Offset;
+ switch((*iter).Type)
+ {
+ case StructProperty::ParticleType:
+ case StructProperty::Integer:
+ *((int*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tointeger(l, -1);
+ break;
+ case StructProperty::UInteger:
+ *((unsigned int*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tointeger(l, -1);
+ break;
+ case StructProperty::Float:
+ *((float*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tonumber(l, -1);
+ break;
+ case StructProperty::Char:
+ *((char*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tointeger(l, -1);
+ break;
+ case StructProperty::UChar:
+ *((unsigned char*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tointeger(l, -1);
+ break;
+ case StructProperty::String:
+ *((char**)(((unsigned char*)&luacon_sim->elements[id])+offset)) = strdup(lua_tostring(l, -1));
+ break;
+ case StructProperty::Colour:
+#if PIXELSIZE == 4
+ *((unsigned int*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tointeger(l, -1);
+#else
+ *((unsigned short*)(((unsigned char*)&luacon_sim->elements[id])+offset)) = lua_tointeger(l, -1);
+#endif
+ break;
+ }
+ lua_pop(l, 1);
+ }
+ }
+
+ luacon_model->BuildMenus();
+ luacon_sim->init_can_move();
+ std::fill(luacon_ren->graphicscache, luacon_ren->graphicscache+PT_NUM, gcache_item());
+
+ lua_pop(l, 1);
return 0;
}
else