/** * @brief Creates a time from a number representing it. * * The best usage for this currently is mission variables. * * @usage t = time.fromnumber( t:tonumber() ) -- Should get the time t again * * @luatparam number num Number to get time from. * @luatreturn Time Time representing number. * @luafunc fromnumber( num ) */ static int time_fromnumber( lua_State *L ) { ntime_t t; t = (ntime_t) luaL_checknumber(L,1); lua_pushtime( L, t ); return 1; }
/** * @brief Subtracts two time metatables. * * Overrides the subtraction operator. * * @usage new_time = time.get() - time.create( 0, 3, 0 ) -- Subtracts 3 STP to the current date * * @luatparam Time t1 Time metatable to subtract from. * @luatparam Time t2 Time metatable subtracted. * @luafunc sub( t1, t2) */ static int time_sub( lua_State *L ) { ntime_t t1, t2; /* Parameters. */ t1 = luaL_validtime( L, 1 ); t2 = luaL_validtime( L, 2 ); /* Sub them. */ lua_pushtime( L, t1 - t2 ); return 1; }
/** * @brief Adds two time metatables. * * Overrides the addition operator. * * @usage new_time = time.get() + time.create( 0, 5, 0 ) -- Adds 5 STP to the current date * * @luatparam Time t1 Time metatable to add to. * @luatparam Time t2 Time metatable added. * @luafunc add( t1, t2) */ static int time_add( lua_State *L ) { ntime_t t1, t2; /* Parameters. */ t1 = luaL_validtime( L, 1 ); t2 = luaL_validtime( L, 2 ); /* Add them. */ lua_pushtime( L, t1 + t2 ); return 1; }
/* * Method version of time_sub that modifies the first time. */ static int time_sub__( lua_State *L ) { ntime_t *t1, t2; /* Parameters. */ t1 = luaL_checktime( L, 1 ); t2 = luaL_validtime( L, 2 ); /* Sub them. */ *t1 -= t2; lua_pushtime( L, *t1 ); return 1; }
/** * @brief Creates a time. This can be absolute or relative. * * @usage t = time.create( 591, 3271, 12801 ) -- Gets a time near when the incident happened. * * @luatparam number scu SCU for the new time. * @luatparam number stp STP for the new time. * @luatparam number stu STU for the new time. * @luatreturn Time A newly created time metatable. * @luafunc create( scu, stp, stu ) */ static int time_create( lua_State *L ) { int scu, stp, stu; /* Parameters. */ scu = luaL_checkint(L,1); stp = luaL_checkint(L,2); stu = luaL_checkint(L,3); /* Create the time. */ lua_pushtime( L, ntime_create( scu, stp, stu ) ); return 1; }
/** * @brief Gets the current time in internal representation time. * * @usage t = time.get() * * @luatreturn Time Time in internal representation time. * @luafunc get() */ static int time_get( lua_State *L ) { lua_pushtime( L, ntime_get() ); return 1; }
/** * @brief Unpersists Lua data. * * @param L State to unperisist data into. * @param parent Node containing all the Lua persisted data. * @return 0 on success. */ static int nxml_unpersistDataNode( lua_State *L, xmlNodePtr parent ) { LuaPlanet p; LuaSystem s; LuaFaction f; LuaShip sh; LuaTime lt; Planet *pnt; StarSystem *ss; xmlNodePtr node; char *name, *type, *buf, *num; int keynum; node = parent->xmlChildrenNode; do { if (xml_isNode(node,"data")) { /* Get general info. */ xmlr_attr(node,"name",name); xmlr_attr(node,"type",type); /* Check to see if key is a number. */ xmlr_attr(node,"keynum",num); if (num != NULL) { keynum = 1; lua_pushnumber(L, atof(name)); free(num); } else lua_pushstring(L, name); /* handle data types */ /* Recursive tables. */ if (strcmp(type,"table")==0) { xmlr_attr(node,"name",buf); /* Create new table. */ lua_newtable(L); /* Save data. */ nxml_unpersistDataNode(L,node); /* Set table. */ free(buf); } else if (strcmp(type,"number")==0) lua_pushnumber(L,xml_getFloat(node)); else if (strcmp(type,"bool")==0) lua_pushboolean(L,xml_getInt(node)); else if (strcmp(type,"string")==0) lua_pushstring(L,xml_get(node)); else if (strcmp(type,"planet")==0) { pnt = planet_get(xml_get(node)); if (pnt != NULL) { p.id = planet_index(pnt); lua_pushplanet(L,p); } else WARN("Failed to load unexistent planet '%s'", xml_get(node)); } else if (strcmp(type,"system")==0) { ss = system_get(xml_get(node)); if (ss != NULL) { s.id = system_index( ss ); lua_pushsystem(L,s); } else WARN("Failed to load unexistent system '%s'", xml_get(node)); } else if (strcmp(type,"faction")==0) { f.f = faction_get(xml_get(node)); lua_pushfaction(L,f); } else if (strcmp(type,"ship")==0) { sh.ship = ship_get(xml_get(node)); lua_pushship(L,sh); } else if (strcmp(type,"time")==0) { lt.t = xml_getLong(node); lua_pushtime(L,lt); } else { WARN("Unknown lua data type!"); lua_pop(L,1); return -1; } /* Set field. */ lua_settable(L, -3); /* cleanup */ free(type); free(name); } } while (xml_nextNode(node)); return 0; }