// // #include "tables.h" #include "scripting/api/objs/shipclass.h" #include "scripting/api/objs/weaponclass.h" #include "ship/ship.h" #include "weapon/weapon.h" extern int ships_inited; extern int Weapons_inited; namespace scripting { namespace api { //**********LIBRARY: Tables ADE_LIB(l_Tables, "Tables", "tb", "Tables library"); //*****SUBLIBRARY: Tables/ShipClasses ADE_LIB_DERIV(l_Tables_ShipClasses, "ShipClasses", NULL, NULL, l_Tables); ADE_INDEXER(l_Tables_ShipClasses, "number/string IndexOrName", "Array of ship classes", "shipclass", "Ship handle, or invalid ship handle if index is invalid") { if(!ships_inited) return ade_set_error(L, "o", l_Shipclass.Set(-1)); const char* name; if(!ade_get_args(L, "*s", &name)) return ade_set_error(L, "o", l_Shipclass.Set(-1)); int idx = ship_info_lookup(name); if(idx < 0) { try { idx = std::stoi(name); idx--; // Lua->FS2 } catch (const std::exception&) { // Not a number return ade_set_error(L, "o", l_Shipclass.Set(-1)); } if (idx < 0 || idx >= ship_info_size()) { return ade_set_error(L, "o", l_Shipclass.Set(-1)); } } return ade_set_args(L, "o", l_Shipclass.Set(idx)); } ADE_FUNC(__len, l_Tables_ShipClasses, NULL, "Number of ship classes", "number", "Number of ship classes, or 0 if ship classes haven't been loaded yet") { if(!ships_inited) return ade_set_args(L, "i", 0); //No ships loaded...should be 0 return ade_set_args(L, "i", Ship_info.size()); } //*****SUBLIBRARY: Tables/WeaponClasses ADE_LIB_DERIV(l_Tables_WeaponClasses, "WeaponClasses", NULL, NULL, l_Tables); ADE_INDEXER(l_Tables_WeaponClasses, "number/string IndexOrWeaponName", "Array of weapon classes", "weapon", "Weapon class handle, or invalid weaponclass handle if index is invalid") { if(!Weapons_inited) return ade_set_error(L, "o", l_Weaponclass.Set(-1)); const char* name; if(!ade_get_args(L, "*s", &name)) return 0; int idx = weapon_info_lookup(name); if(idx < 0) { idx = atoi(name); // atoi is good enough here, 0 is invalid anyway if (idx > 0) { idx--; // Lua --> C/C++ } else { return ade_set_args(L, "o", l_Weaponclass.Set(-1)); } } return ade_set_args(L, "o", l_Weaponclass.Set(idx)); } ADE_FUNC(__len, l_Tables_WeaponClasses, NULL, "Number of weapon classes", "number", "Number of weapon classes, or 0 if weapon classes haven't been loaded yet") { if(!Weapons_inited) return ade_set_args(L, "i", 0); return ade_set_args(L, "i", weapon_info_size()); } } }