static int ticcmd_set(lua_State *L) { ticcmd_t *cmd = *((ticcmd_t **)luaL_checkudata(L, 1, META_TICCMD)); const char *field = luaL_checkstring(L, 2); if (!cmd) return LUA_ErrInvalid(L, "ticcmd_t"); if (hud_running) return luaL_error(L, "Do not alter player_t in HUD rendering code!"); if (fastcmp(field,"forwardmove")) cmd->forwardmove = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"sidemove")) cmd->sidemove = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"angleturn")) cmd->angleturn = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"aiming")) cmd->aiming = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"buttons")) cmd->buttons = (UINT16)luaL_checkinteger(L, 3); else return NOFIELD; return 0; }
// stack: dummy, S_sfx[] table index, table of values to set. static int lib_setSfxInfo(lua_State *L) { sfxinfo_t *info; lua_remove(L, 1); info = &S_sfx[luaL_checkinteger(L, 1)]; // get the mobjinfo to assign to. luaL_checktype(L, 2, LUA_TTABLE); // check that we've been passed a table. lua_remove(L, 1); // pop mobjtype num, don't need it any more. lua_settop(L, 1); // cut the stack here. the only thing left now is the table of data we're assigning to the mobjinfo. if (hud_running) return luaL_error(L, "Do not alter sfxinfo in HUD rendering code!"); lua_pushnil(L); while (lua_next(L, 1)) { lua_Integer i = 0; const char *str = NULL; if (lua_isnumber(L, 2)) i = lua_tointeger(L, 2); else str = luaL_checkstring(L, 2); if (i == 1 || (str && fastcmp(str,"singularity"))) info->singularity = luaL_checkboolean(L, 3); else if (i == 2 || (str && fastcmp(str,"priority"))) info->priority = (INT32)luaL_checkinteger(L, 3); else if (i == 3 || (str && fastcmp(str,"pitch")) || (str && fastcmp(str,"flags"))) info->pitch = (INT32)luaL_checkinteger(L, 3); else if (i == 4 || (str && fastcmp(str,"volume"))) info->volume = (INT32)luaL_checkinteger(L, 3); lua_pop(L, 1); } return 0; }
static int mapthing_set(lua_State *L) { mapthing_t *mt = *((mapthing_t **)luaL_checkudata(L, 1, META_MAPTHING)); const char *field = luaL_checkstring(L, 2); if (!mt) return luaL_error(L, "accessed mapthing_t doesn't exist anymore."); if (hud_running) return luaL_error(L, "Do not alter mapthing_t in HUD rendering code!"); if(fastcmp(field,"x")) mt->x = (INT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"y")) mt->y = (INT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"angle")) mt->angle = (INT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"type")) mt->type = (UINT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"options")) mt->options = (UINT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"z")) mt->z = (INT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"extrainfo")) mt->extrainfo = (UINT8)luaL_checkinteger(L, 3); else if(fastcmp(field,"mobj")) mt->mobj = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); else return luaL_error(L, LUA_QL("mapthing_t") " has no field named " LUA_QS, field); return 0; }
static void ArchiveExtVars(void *pointer, const char *ptype) { int TABLESINDEX; UINT16 i; if (!gL) { if (fastcmp(ptype,"player")) // players must always be included, even if no vars WRITEUINT16(save_p, 0); return; } TABLESINDEX = lua_gettop(gL); lua_getfield(gL, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(gL, -1)); lua_pushlightuserdata(gL, pointer); lua_rawget(gL, -2); lua_remove(gL, -2); // pop LREG_EXTVARS if (!lua_istable(gL, -1)) { // no extra values table lua_pop(gL, 1); if (fastcmp(ptype,"player")) // players must always be included, even if no vars WRITEUINT16(save_p, 0); return; } lua_pushnil(gL); for (i = 0; lua_next(gL, -2); i++) lua_pop(gL, 1); if (i == 0 && !fastcmp(ptype,"player")) // skip anything that has an empty table and isn't a player. return; if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header WRITEUINT32(save_p, ((mobj_t *)pointer)->mobjnum); WRITEUINT16(save_p, i); lua_pushnil(gL); while (lua_next(gL, -2)) { I_Assert(lua_type(gL, -2) == LUA_TSTRING); WRITESTRING(save_p, lua_tostring(gL, -2)); if (ArchiveValue(TABLESINDEX, -1) == 2) CONS_Alert(CONS_ERROR, "Type of value for %s entry '%s' (%s) could not be archived!\n", ptype, lua_tostring(gL, -2), luaL_typename(gL, -1)); lua_pop(gL, 1); } lua_pop(gL, 1); }
// push sprite name static int lib_getSprname(lua_State *L) { UINT32 i; lua_remove(L, 1); // don't care about sprnames[] dummy userdata. if (lua_isnumber(L, 1)) { i = lua_tonumber(L, 1); if (i > NUMSPRITES) return 0; lua_pushlstring(L, sprnames[i], 4); return 1; } else if (lua_isstring(L, 1)) { const char *name = lua_tostring(L, 1); for (i = 0; i < NUMSPRITES; i++) if (fastcmp(name, sprnames[i])) { lua_pushinteger(L, i); return 1; } } return 0; }
static int lib_getPlayer(lua_State *L) { const char *field; // i -> players[i] if (lua_type(L, 2) == LUA_TNUMBER) { lua_Integer i = luaL_checkinteger(L, 2); if (i < 0 || i >= MAXPLAYERS) return luaL_error(L, "players[] index %d out of range (0 - %d)", i, MAXPLAYERS-1); if (!playeringame[i]) return 0; if (!players[i].mo) return 0; LUA_PushUserdata(L, &players[i], META_PLAYER); return 1; } field = luaL_checkstring(L, 2); if (fastcmp(field,"iterate")) { lua_pushcfunction(L, lib_iteratePlayers); return 1; } return 0; }
static int mapthing_get(lua_State *L) { mapthing_t *mt = *((mapthing_t **)luaL_checkudata(L, 1, META_MAPTHING)); const char *field = luaL_checkstring(L, 2); lua_Integer number; if (!mt) { if (fastcmp(field,"valid")) { lua_pushboolean(L, false); return 1; } if (devparm) return luaL_error(L, "accessed mapthing_t doesn't exist anymore."); return 0; } if (fastcmp(field,"valid")) { lua_pushboolean(L, true); return 1; } else if(fastcmp(field,"x")) number = mt->x; else if(fastcmp(field,"y")) number = mt->y; else if(fastcmp(field,"angle")) number = mt->angle; else if(fastcmp(field,"type")) number = mt->type; else if(fastcmp(field,"options")) number = mt->options; else if(fastcmp(field,"z")) number = mt->z; else if(fastcmp(field,"extrainfo")) number = mt->extrainfo; else if(fastcmp(field,"mobj")) { LUA_PushUserdata(L, mt->mobj, META_MOBJ); return 1; } else if (devparm) return luaL_error(L, LUA_QL("mapthing_t") " has no field named " LUA_QS, field); else return 0; lua_pushinteger(L, number); return 1; }
// For mobj_t, player_t, etc. to take custom variables. int Lua_optoption(lua_State *L, int narg, const char *def, const char *const lst[]) { const char *name = (def) ? luaL_optstring(L, narg, def) : luaL_checkstring(L, narg); int i; for (i=0; lst[i]; i++) if (fastcmp(lst[i], name)) return i; return -1; }
static int ticcmd_get(lua_State *L) { ticcmd_t *cmd = *((ticcmd_t **)luaL_checkudata(L, 1, META_TICCMD)); const char *field = luaL_checkstring(L, 2); if (!cmd) return LUA_ErrInvalid(L, "player_t"); if (fastcmp(field,"forwardmove")) lua_pushinteger(L, cmd->forwardmove); else if (fastcmp(field,"sidemove")) lua_pushinteger(L, cmd->sidemove); else if (fastcmp(field,"angleturn")) lua_pushinteger(L, cmd->angleturn); else if (fastcmp(field,"aiming")) lua_pushinteger(L, cmd->aiming); else if (fastcmp(field,"buttons")) lua_pushinteger(L, cmd->buttons); else return NOFIELD; return 1; }
// state_t *, field, number -> states[] static int state_set(lua_State *L) { state_t *st = *((state_t **)luaL_checkudata(L, 1, META_STATE)); const char *field = luaL_checkstring(L, 2); lua_Integer value; if (hud_running) return luaL_error(L, "Do not alter states in HUD rendering code!"); if (fastcmp(field,"sprite")) { value = luaL_checknumber(L, 3); if (value < SPR_NULL || value >= NUMSPRITES) return luaL_error(L, "sprite number %d is invalid.", value); st->sprite = (spritenum_t)value; } else if (fastcmp(field,"frame")) st->frame = (UINT32)luaL_checknumber(L, 3); else if (fastcmp(field,"tics")) st->tics = (INT32)luaL_checknumber(L, 3); else if (fastcmp(field,"action")) { switch(lua_type(L, 3)) { case LUA_TNIL: // Null? Set the action to nothing, then. st->action.acp1 = NULL; break; case LUA_TSTRING: // It's a string, expect the name of a built-in action LUA_SetActionByName(st, lua_tostring(L, 3)); break; case LUA_TFUNCTION: // It's a function (a Lua function or a C function? either way!) lua_getfield(L, LUA_REGISTRYINDEX, LREG_STATEACTION); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, st); // We'll store this function by the state's pointer in the registry. lua_pushvalue(L, 3); // Bring it to the top of the stack lua_rawset(L, -3); // Set it in the registry lua_pop(L, 1); // pop LREG_STATEACTION st->action.acp1 = (actionf_p1)A_Lua; // Set the action for the userdata. break; default: // ?! return luaL_typerror(L, 3, "function"); } } else if (fastcmp(field,"var1")) st->var1 = (INT32)luaL_checknumber(L, 3); else if (fastcmp(field,"var2")) st->var2 = (INT32)luaL_checknumber(L, 3); else if (fastcmp(field,"nextstate")) { value = luaL_checkinteger(L, 3); if (value < S_NULL || value >= NUMSTATES) return luaL_error(L, "nextstate number %d is invalid.", value); st->nextstate = (statenum_t)value; } else return luaL_error(L, LUA_QL("state_t") " has no field named " LUA_QS, field); return 0; }
// state_t *, field -> number static int state_get(lua_State *L) { state_t *st = *((state_t **)luaL_checkudata(L, 1, META_STATE)); const char *field = luaL_checkstring(L, 2); lua_Integer number; if (fastcmp(field,"sprite")) number = st->sprite; else if (fastcmp(field,"frame")) number = st->frame; else if (fastcmp(field,"tics")) number = st->tics; else if (fastcmp(field,"action")) { const char *name; if (!st->action.acp1) // Action is NULL. return 0; // return nil. if (st->action.acp1 == (actionf_p1)A_Lua) { // This is a Lua function? lua_getfield(L, LUA_REGISTRYINDEX, LREG_STATEACTION); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, st); // Push the state pointer and lua_rawget(L, -2); // use it to get the actual Lua function. lua_remove(L, -2); // pop LREG_STATEACTION return 1; // Return the Lua function. } name = LUA_GetActionName(&st->action); // find a hardcoded function name if (!name) // If it's not a hardcoded function and it's not a Lua function... return 0; // Just what is this?? // get the function from the global // because the metatable will trigger. lua_getglobal(L, name); // actually gets from LREG_ACTIONS if applicable, and pushes a new C closure if not. lua_pushstring(L, name); // push the name we found. return 2; // return both the function and its name, in case somebody wanted to do a comparison by name or something? } else if (fastcmp(field,"var1")) number = st->var1; else if (fastcmp(field,"var2")) number = st->var2; else if (fastcmp(field,"nextstate")) number = st->nextstate; else if (devparm) return luaL_error(L, LUA_QL("state_t") " has no field named " LUA_QS, field); else return 0; lua_pushinteger(L, number); return 1; }
static int mobj_set(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); enum mobj_e field = Lua_optoption(L, 2, mobj_opt[0], mobj_opt); lua_settop(L, 3); if (!mo) return LUA_ErrInvalid(L, "mobj_t"); if (hud_running) return luaL_error(L, "Do not alter mobj_t in HUD rendering code!"); switch(field) { case mobj_valid: return NOSET; case mobj_x: return NOSETPOS; case mobj_y: return NOSETPOS; case mobj_z: { // z doesn't cross sector bounds so it's okay. mobj_t *ptmthing = tmthing; mo->z = (fixed_t)luaL_checkinteger(L, 3); P_CheckPosition(mo, mo->x, mo->y); mo->floorz = tmfloorz; mo->ceilingz = tmceilingz; P_SetTarget(&tmthing, ptmthing); break; } case mobj_snext: return NOSETPOS; case mobj_sprev: return UNIMPLEMENTED; case mobj_angle: mo->angle = (angle_t)luaL_checkinteger(L, 3); if (mo->player == &players[displayplayer]) localangle = mo->angle; else if (mo->player == &players[secondarydisplayplayer]) localangle2 = mo->angle; break; case mobj_sprite: mo->sprite = luaL_checkinteger(L, 3); break; case mobj_frame: mo->frame = (UINT32)luaL_checkinteger(L, 3); break; case mobj_touching_sectorlist: return UNIMPLEMENTED; case mobj_subsector: return NOSETPOS; case mobj_floorz: return NOSETPOS; case mobj_ceilingz: return NOSETPOS; case mobj_radius: { mobj_t *ptmthing = tmthing; mo->radius = (fixed_t)luaL_checkinteger(L, 3); if (mo->radius < 0) mo->radius = 0; P_CheckPosition(mo, mo->x, mo->y); mo->floorz = tmfloorz; mo->ceilingz = tmceilingz; P_SetTarget(&tmthing, ptmthing); break; } case mobj_height: { mobj_t *ptmthing = tmthing; mo->height = (fixed_t)luaL_checkinteger(L, 3); if (mo->height < 0) mo->height = 0; P_CheckPosition(mo, mo->x, mo->y); mo->floorz = tmfloorz; mo->ceilingz = tmceilingz; P_SetTarget(&tmthing, ptmthing); break; } case mobj_momx: mo->momx = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_momy: mo->momy = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_momz: mo->momz = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_pmomz: mo->pmomz = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_tics: mo->tics = luaL_checkinteger(L, 3); break; case mobj_state: // set state by enum if (mo->player) P_SetPlayerMobjState(mo, luaL_checkinteger(L, 3)); else P_SetMobjState(mo, luaL_checkinteger(L, 3)); break; case mobj_flags: // special handling for MF_NOBLOCKMAP and MF_NOSECTOR { UINT32 flags = luaL_checkinteger(L, 3); if ((flags & (MF_NOBLOCKMAP|MF_NOSECTOR)) != (mo->flags & (MF_NOBLOCKMAP|MF_NOSECTOR))) { P_UnsetThingPosition(mo); mo->flags = flags; if (flags & MF_NOSECTOR && sector_list) { P_DelSeclist(sector_list); sector_list = NULL; } mo->snext = NULL, mo->sprev = NULL; mo->bnext = NULL, mo->bprev = NULL; P_SetThingPosition(mo); } else mo->flags = flags; break; } case mobj_flags2: mo->flags2 = (UINT32)luaL_checkinteger(L, 3); break; case mobj_eflags: mo->eflags = (UINT32)luaL_checkinteger(L, 3); break; case mobj_skin: // set skin by name { INT32 i; char skin[SKINNAMESIZE+1]; // all skin names are limited to this length strlcpy(skin, luaL_checkstring(L, 3), sizeof skin); strlwr(skin); // all skin names are lowercase for (i = 0; i < numskins; i++) if (fastcmp(skins[i].name, skin)) { mo->skin = &skins[i]; return 0; } return luaL_error(L, "mobj.skin '%s' not found!", skin); } case mobj_color: mo->color = ((UINT8)luaL_checkinteger(L, 3)) % MAXSKINCOLORS; break; case mobj_bnext: return NOSETPOS; case mobj_bprev: return UNIMPLEMENTED; case mobj_hnext: mo->hnext = luaL_checkudata(L, 3, META_MOBJ); break; case mobj_hprev: mo->hprev = luaL_checkudata(L, 3, META_MOBJ); break; case mobj_type: // yeah sure, we'll let you change the mobj's type. { mobjtype_t newtype = luaL_checkinteger(L, 3); if (newtype > MT_LASTFREESLOT) return luaL_error(L, "mobj.type %u is out of bounds.", newtype); mo->type = newtype; mo->info = &mobjinfo[newtype]; P_SetScale(mo, mo->scale); break; } case mobj_info: return NOSET; case mobj_health: mo->health = luaL_checkinteger(L, 3); break; case mobj_movedir: mo->movedir = (angle_t)luaL_checkinteger(L, 3); break; case mobj_movecount: mo->movecount = luaL_checkinteger(L, 3); break; case mobj_target: if (lua_isnil(L, 3)) P_SetTarget(&mo->target, NULL); else { mobj_t *target = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); P_SetTarget(&mo->target, target); } break; case mobj_reactiontime: mo->reactiontime = luaL_checkinteger(L, 3); break; case mobj_threshold: mo->threshold = luaL_checkinteger(L, 3); break; case mobj_player: return NOSET; case mobj_lastlook: mo->lastlook = luaL_checkinteger(L, 3); break; case mobj_spawnpoint: if (lua_isnil(L, 3)) mo->spawnpoint = NULL; else { mapthing_t *spawnpoint = *((mapthing_t **)luaL_checkudata(L, 3, META_MAPTHING)); mo->spawnpoint = spawnpoint; } break; case mobj_tracer: if (lua_isnil(L, 3)) P_SetTarget(&mo->tracer, NULL); else { mobj_t *tracer = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); P_SetTarget(&mo->tracer, tracer); } break; case mobj_friction: mo->friction = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_movefactor: mo->movefactor = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_fuse: mo->fuse = luaL_checkinteger(L, 3); break; case mobj_watertop: mo->watertop = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_waterbottom: mo->waterbottom = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_mobjnum: return UNIMPLEMENTED; case mobj_scale: { fixed_t scale = (fixed_t)luaL_checkinteger(L, 3); if (scale < FRACUNIT/100) scale = FRACUNIT/100; mo->destscale = scale; P_SetScale(mo, scale); break; } case mobj_destscale: { fixed_t scale = (fixed_t)luaL_checkinteger(L, 3); if (scale < FRACUNIT/100) scale = FRACUNIT/100; mo->destscale = scale; break; } case mobj_scalespeed: mo->scalespeed = (fixed_t)luaL_checkinteger(L, 3); break; case mobj_extravalue1: mo->extravalue1 = luaL_checkinteger(L, 3); break; case mobj_extravalue2: mo->extravalue2 = luaL_checkinteger(L, 3); break; case mobj_cusval: mo->cusval = luaL_checkinteger(L, 3); break; case mobj_cvmem: mo->cvmem = luaL_checkinteger(L, 3); break; default: lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, mo); lua_rawget(L, -2); if (lua_isnil(L, -1)) { // This index doesn't have a table for extra values yet, let's make one. lua_pop(L, 1); CONS_Debug(DBG_LUA, M_GetText("'%s' has no field named '%s'; adding it as Lua data.\n"), "mobj_t", lua_tostring(L, 2)); lua_newtable(L); lua_pushlightuserdata(L, mo); lua_pushvalue(L, -2); // ext value table lua_rawset(L, -4); // LREG_EXTVARS table } lua_pushvalue(L, 2); // key lua_pushvalue(L, 3); // value to store lua_settable(L, -3); lua_pop(L, 2); break; } return 0; }
/* * Executes matching of the precompiled pattern on the input string. * Returns REG_OK or REG_NOMATCH depending on if we find a match or not. */ int tre_match_fast(const fastmatch_t *fg, const void *data, size_t len, tre_str_type_t type, int nmatch, regmatch_t pmatch[], int eflags) { unsigned int shift, u = 0, v = 0; ssize_t j = 0; int ret = REG_NOMATCH; int mismatch; const char *str_byte = data; const void *startptr = NULL; const tre_char_t *str_wide = data; /* Calculate length if unspecified. */ if (len == (size_t)-1) switch (type) { case STR_WIDE: len = tre_strlen(str_wide); break; default: len = strlen(str_byte); break; } /* Shortcut for empty pattern */ if (fg->matchall) { if (!fg->nosub && nmatch >= 1) { pmatch[0].rm_so = 0; pmatch[0].rm_eo = len; } if (fg->bol && fg->eol) return (len == 0) ? REG_OK : REG_NOMATCH; else return REG_OK; } /* No point in going farther if we do not have enough data. */ switch (type) { case STR_WIDE: if (len < fg->wlen) return ret; shift = fg->wlen; break; default: if (len < fg->len) return ret; shift = fg->len; } /* * REG_NOTBOL means not anchoring ^ to the beginning of the line, so we * can shift one because there can't be a match at the beginning. */ if (fg->bol && (eflags & REG_NOTBOL)) j = 1; /* * Like above, we cannot have a match at the very end when anchoring to * the end and REG_NOTEOL is specified. */ if (fg->eol && (eflags & REG_NOTEOL)) len--; if (fg->reversed) j = len - (type == STR_WIDE ? fg->wlen : fg->len); /* Only try once at the beginning or ending of the line. */ if ((fg->bol || fg->eol) && !fg->newline && !(eflags & REG_NOTBOL) && !(eflags & REG_NOTEOL)) { /* Simple text comparison. */ if (!((fg->bol && fg->eol) && (type == STR_WIDE ? (len != fg->wlen) : (len != fg->len)))) { /* Determine where in data to start search at. */ j = fg->eol ? len - (type == STR_WIDE ? fg->wlen : fg->len) : 0; SKIP_CHARS(j); mismatch = fastcmp(fg, startptr, type); if (mismatch == REG_OK) { if (fg->word && !IS_ON_WORD_BOUNDARY) return ret; if (!fg->nosub && nmatch >= 1) { pmatch[0].rm_so = j; pmatch[0].rm_eo = j + (type == STR_WIDE ? fg->wlen : fg->len); } return REG_OK; } } } else { /* Quick Search / Turbo Boyer-Moore algorithm. */ do { SKIP_CHARS(j); mismatch = fastcmp(fg, startptr, type); if (mismatch == REG_OK) { if (fg->word) CHECK_WORD_BOUNDARY; if (fg->bol) CHECK_BOL_ANCHOR; if (fg->eol) CHECK_EOL_ANCHOR; if (!fg->nosub && nmatch >= 1) { pmatch[0].rm_so = j; pmatch[0].rm_eo = j + ((type == STR_WIDE) ? fg->wlen : fg->len); } return REG_OK; } else if (mismatch > 0) return mismatch; mismatch = -mismatch - 1; SHIFT; } while (!IS_OUT_OF_BOUNDS); } return ret; }
static int mapheaderinfo_get(lua_State *L) { mapheader_t *header = *((mapheader_t **)luaL_checkudata(L, 1, META_MAPHEADER)); const char *field = luaL_checkstring(L, 2); //INT16 i; if (fastcmp(field,"lvlttl")) { //for (i = 0; i < 21; i++) // if (!header->lvlttl[i]) // break; lua_pushlstring(L, header->lvlttl, 21); } else if (fastcmp(field,"subttl")) lua_pushlstring(L, header->subttl, 32); else if (fastcmp(field,"actnum")) lua_pushinteger(L, header->actnum); else if (fastcmp(field,"typeoflevel")) lua_pushinteger(L, header->typeoflevel); else if (fastcmp(field,"nextlevel")) lua_pushinteger(L, header->nextlevel); else if (fastcmp(field,"musicslot")) lua_pushinteger(L, header->musicslot); else if (fastcmp(field,"musicslottrack")) lua_pushinteger(L, header->musicslottrack); else if (fastcmp(field,"forcecharacter")) lua_pushlstring(L, header->forcecharacter, 16); else if (fastcmp(field,"weather")) lua_pushinteger(L, header->weather); else if (fastcmp(field,"skynum")) lua_pushinteger(L, header->skynum); else if (fastcmp(field,"skybox_scalex")) lua_pushinteger(L, header->skybox_scalex); else if (fastcmp(field,"skybox_scaley")) lua_pushinteger(L, header->skybox_scaley); else if (fastcmp(field,"skybox_scalez")) lua_pushinteger(L, header->skybox_scalez); else if (fastcmp(field,"interscreen")) lua_pushlstring(L, header->interscreen, 8); else if (fastcmp(field,"runsoc")) lua_pushlstring(L, header->runsoc, 32); else if (fastcmp(field,"scriptname")) lua_pushlstring(L, header->scriptname, 32); else if (fastcmp(field,"precutscenenum")) lua_pushinteger(L, header->precutscenenum); else if (fastcmp(field,"cutscenenum")) lua_pushinteger(L, header->cutscenenum); else if (fastcmp(field,"countdown")) lua_pushinteger(L, header->countdown); else if (fastcmp(field,"palette")) lua_pushinteger(L, header->palette); else if (fastcmp(field,"numlaps")) lua_pushinteger(L, header->numlaps); else if (fastcmp(field,"unlockrequired")) lua_pushinteger(L, header->unlockrequired); else if (fastcmp(field,"levelselect")) lua_pushinteger(L, header->levelselect); else if (fastcmp(field,"bonustype")) lua_pushinteger(L, header->bonustype); else if (fastcmp(field,"levelflags")) lua_pushinteger(L, header->levelflags); else if (fastcmp(field,"menuflags")) lua_pushinteger(L, header->menuflags); // TODO add support for reading numGradedMares and grades else { // Read custom vars now // (note: don't include the "LUA." in your lua scripts!) UINT8 i = 0; for (;i < header->numCustomOptions && !fastcmp(field, header->customopts[i].option); ++i); if(i < header->numCustomOptions) lua_pushlstring(L, header->customopts[i].value, 255); else lua_pushnil(L); } return 1; }
static int player_get(lua_State *L) { player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); const char *field = luaL_checkstring(L, 2); if (!plr) { if (fastcmp(field,"valid")) { lua_pushboolean(L, false); return 1; } return LUA_ErrInvalid(L, "player_t"); } if (fastcmp(field,"valid")) lua_pushboolean(L, true); else if (fastcmp(field,"name")) lua_pushstring(L, player_names[plr-players]); else if (fastcmp(field,"mo")) { if (plr->spectator) lua_pushnil(L); else LUA_PushUserdata(L, plr->mo, META_MOBJ); } else if (fastcmp(field,"cmd")) LUA_PushUserdata(L, &plr->cmd, META_TICCMD); else if (fastcmp(field,"playerstate")) lua_pushinteger(L, plr->playerstate); else if (fastcmp(field,"viewz")) lua_pushfixed(L, plr->viewz); else if (fastcmp(field,"viewheight")) lua_pushfixed(L, plr->viewheight); else if (fastcmp(field,"deltaviewheight")) lua_pushfixed(L, plr->deltaviewheight); else if (fastcmp(field,"bob")) lua_pushfixed(L, plr->bob); else if (fastcmp(field,"aiming")) lua_pushangle(L, plr->aiming); else if (fastcmp(field,"health")) lua_pushinteger(L, plr->health); else if (fastcmp(field,"pity")) lua_pushinteger(L, plr->pity); else if (fastcmp(field,"currentweapon")) lua_pushinteger(L, plr->currentweapon); else if (fastcmp(field,"ringweapons")) lua_pushinteger(L, plr->ringweapons); else if (fastcmp(field,"powers")) LUA_PushUserdata(L, plr->powers, META_POWERS); else if (fastcmp(field,"pflags")) lua_pushinteger(L, plr->pflags); else if (fastcmp(field,"panim")) lua_pushinteger(L, plr->panim); else if (fastcmp(field,"flashcount")) lua_pushinteger(L, plr->flashcount); else if (fastcmp(field,"flashpal")) lua_pushinteger(L, plr->flashpal); else if (fastcmp(field,"skincolor")) lua_pushinteger(L, plr->skincolor); else if (fastcmp(field,"score")) lua_pushinteger(L, plr->score); else if (fastcmp(field,"dashspeed")) lua_pushfixed(L, plr->dashspeed); else if (fastcmp(field,"dashtime")) lua_pushinteger(L, plr->dashtime); else if (fastcmp(field,"normalspeed")) lua_pushfixed(L, plr->normalspeed); else if (fastcmp(field,"runspeed")) lua_pushfixed(L, plr->runspeed); else if (fastcmp(field,"thrustfactor")) lua_pushinteger(L, plr->thrustfactor); else if (fastcmp(field,"accelstart")) lua_pushinteger(L, plr->accelstart); else if (fastcmp(field,"acceleration")) lua_pushinteger(L, plr->acceleration); else if (fastcmp(field,"charability")) lua_pushinteger(L, plr->charability); else if (fastcmp(field,"charability2")) lua_pushinteger(L, plr->charability2); else if (fastcmp(field,"charflags")) lua_pushinteger(L, plr->charflags); else if (fastcmp(field,"thokitem")) lua_pushinteger(L, plr->thokitem); else if (fastcmp(field,"spinitem")) lua_pushinteger(L, plr->spinitem); else if (fastcmp(field,"revitem")) lua_pushinteger(L, plr->revitem); else if (fastcmp(field,"actionspd")) lua_pushfixed(L, plr->actionspd); else if (fastcmp(field,"mindash")) lua_pushfixed(L, plr->mindash); else if (fastcmp(field,"maxdash")) lua_pushfixed(L, plr->maxdash); else if (fastcmp(field,"jumpfactor")) lua_pushfixed(L, plr->jumpfactor); else if (fastcmp(field,"lives")) lua_pushinteger(L, plr->lives); else if (fastcmp(field,"continues")) lua_pushinteger(L, plr->continues); else if (fastcmp(field,"xtralife")) lua_pushinteger(L, plr->xtralife); else if (fastcmp(field,"gotcontinue")) lua_pushinteger(L, plr->gotcontinue); else if (fastcmp(field,"speed")) lua_pushfixed(L, plr->speed); else if (fastcmp(field,"jumping")) lua_pushboolean(L, plr->jumping); else if (fastcmp(field,"secondjump")) lua_pushinteger(L, plr->secondjump); else if (fastcmp(field,"fly1")) lua_pushinteger(L, plr->fly1); else if (fastcmp(field,"scoreadd")) lua_pushinteger(L, plr->scoreadd); else if (fastcmp(field,"glidetime")) lua_pushinteger(L, plr->glidetime); else if (fastcmp(field,"climbing")) lua_pushinteger(L, plr->climbing); else if (fastcmp(field,"deadtimer")) lua_pushinteger(L, plr->deadtimer); else if (fastcmp(field,"exiting")) lua_pushinteger(L, plr->exiting); else if (fastcmp(field,"homing")) lua_pushinteger(L, plr->homing); else if (fastcmp(field,"skidtime")) lua_pushinteger(L, plr->skidtime); else if (fastcmp(field,"cmomx")) lua_pushfixed(L, plr->cmomx); else if (fastcmp(field,"cmomy")) lua_pushfixed(L, plr->cmomy); else if (fastcmp(field,"rmomx")) lua_pushfixed(L, plr->rmomx); else if (fastcmp(field,"rmomy")) lua_pushfixed(L, plr->rmomy); else if (fastcmp(field,"numboxes")) lua_pushinteger(L, plr->numboxes); else if (fastcmp(field,"totalring")) lua_pushinteger(L, plr->totalring); else if (fastcmp(field,"realtime")) lua_pushinteger(L, plr->realtime); else if (fastcmp(field,"laps")) lua_pushinteger(L, plr->laps); else if (fastcmp(field,"ctfteam")) lua_pushinteger(L, plr->ctfteam); else if (fastcmp(field,"gotflag")) lua_pushinteger(L, plr->gotflag); else if (fastcmp(field,"weapondelay")) lua_pushinteger(L, plr->weapondelay); else if (fastcmp(field,"tossdelay")) lua_pushinteger(L, plr->tossdelay); else if (fastcmp(field,"starpostx")) lua_pushinteger(L, plr->starpostx); else if (fastcmp(field,"starposty")) lua_pushinteger(L, plr->starposty); else if (fastcmp(field,"starpostz")) lua_pushinteger(L, plr->starpostz); else if (fastcmp(field,"starpostnum")) lua_pushinteger(L, plr->starpostnum); else if (fastcmp(field,"starposttime")) lua_pushinteger(L, plr->starposttime); else if (fastcmp(field,"starpostangle")) lua_pushangle(L, plr->starpostangle); else if (fastcmp(field,"angle_pos")) lua_pushangle(L, plr->angle_pos); else if (fastcmp(field,"old_angle_pos")) lua_pushangle(L, plr->old_angle_pos); else if (fastcmp(field,"axis1")) LUA_PushUserdata(L, plr->axis1, META_MOBJ); else if (fastcmp(field,"axis2")) LUA_PushUserdata(L, plr->axis2, META_MOBJ); else if (fastcmp(field,"bumpertime")) lua_pushinteger(L, plr->bumpertime); else if (fastcmp(field,"flyangle")) lua_pushinteger(L, plr->flyangle); else if (fastcmp(field,"drilltimer")) lua_pushinteger(L, plr->drilltimer); else if (fastcmp(field,"linkcount")) lua_pushinteger(L, plr->linkcount); else if (fastcmp(field,"linktimer")) lua_pushinteger(L, plr->linktimer); else if (fastcmp(field,"anotherflyangle")) lua_pushinteger(L, plr->anotherflyangle); else if (fastcmp(field,"nightstime")) lua_pushinteger(L, plr->nightstime); else if (fastcmp(field,"drillmeter")) lua_pushinteger(L, plr->drillmeter); else if (fastcmp(field,"drilldelay")) lua_pushinteger(L, plr->drilldelay); else if (fastcmp(field,"bonustime")) lua_pushboolean(L, plr->bonustime); else if (fastcmp(field,"capsule")) LUA_PushUserdata(L, plr->capsule, META_MOBJ); else if (fastcmp(field,"mare")) lua_pushinteger(L, plr->mare); else if (fastcmp(field,"marebegunat")) lua_pushinteger(L, plr->marebegunat); else if (fastcmp(field,"startedtime")) lua_pushinteger(L, plr->startedtime); else if (fastcmp(field,"finishedtime")) lua_pushinteger(L, plr->finishedtime); else if (fastcmp(field,"finishedrings")) lua_pushinteger(L, plr->finishedrings); else if (fastcmp(field,"marescore")) lua_pushinteger(L, plr->marescore); else if (fastcmp(field,"lastmarescore")) lua_pushinteger(L, plr->lastmarescore); else if (fastcmp(field,"lastmare")) lua_pushinteger(L, plr->lastmare); else if (fastcmp(field,"maxlink")) lua_pushinteger(L, plr->maxlink); else if (fastcmp(field,"texttimer")) lua_pushinteger(L, plr->texttimer); else if (fastcmp(field,"textvar")) lua_pushinteger(L, plr->textvar); else if (fastcmp(field,"lastsidehit")) lua_pushinteger(L, plr->lastsidehit); else if (fastcmp(field,"lastlinehit")) lua_pushinteger(L, plr->lastlinehit); else if (fastcmp(field,"losstime")) lua_pushinteger(L, plr->losstime); else if (fastcmp(field,"timeshit")) lua_pushinteger(L, plr->timeshit); else if (fastcmp(field,"onconveyor")) lua_pushinteger(L, plr->onconveyor); else if (fastcmp(field,"awayviewmobj")) LUA_PushUserdata(L, plr->awayviewmobj, META_MOBJ); else if (fastcmp(field,"awayviewtics")) lua_pushinteger(L, plr->awayviewtics); else if (fastcmp(field,"awayviewaiming")) lua_pushangle(L, plr->awayviewaiming); else if (fastcmp(field,"spectator")) lua_pushboolean(L, plr->spectator); else if (fastcmp(field,"bot")) lua_pushinteger(L, plr->bot); else if (fastcmp(field,"jointime")) lua_pushinteger(L, plr->jointime); #ifdef HWRENDER else if (fastcmp(field,"fovadd")) lua_pushfixed(L, plr->fovadd); #endif else { lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, plr); lua_rawget(L, -2); if (!lua_istable(L, -1)) { // no extra values table CONS_Debug(DBG_LUA, M_GetText("'%s' has no extvars table or field named '%s'; returning nil.\n"), "player_t", field); return 0; } lua_getfield(L, -1, field); if (lua_isnil(L, -1)) // no value for this field CONS_Debug(DBG_LUA, M_GetText("'%s' has no field named '%s'; returning nil.\n"), "player_t", field); } return 1; }
// Lua table full of data -> mobjinfo[] static int lib_setMobjInfo(lua_State *L) { mobjinfo_t *info; lua_remove(L, 1); // don't care about mobjinfo[] userdata. info = &mobjinfo[luaL_checkinteger(L, 1)]; // get the mobjinfo to assign to. luaL_checktype(L, 2, LUA_TTABLE); // check that we've been passed a table. lua_remove(L, 1); // pop mobjtype num, don't need it any more. lua_settop(L, 1); // cut the stack here. the only thing left now is the table of data we're assigning to the mobjinfo. if (hud_running) return luaL_error(L, "Do not alter mobjinfo in HUD rendering code!"); // clear the mobjinfo to start with, in case of missing table elements memset(info,0,sizeof(mobjinfo_t)); info->doomednum = -1; // default to no editor value info->spawnhealth = 1; // avoid 'dead' noclip behaviors lua_pushnil(L); while (lua_next(L, 1)) { lua_Integer i = 0; const char *str = NULL; lua_Integer value; if (lua_isnumber(L, 2)) i = lua_tointeger(L, 2); else str = luaL_checkstring(L, 2); if (i == 1 || (str && fastcmp(str,"doomednum"))) info->doomednum = (INT32)luaL_checkinteger(L, 3); else if (i == 2 || (str && fastcmp(str,"spawnstate"))) { value = luaL_checkinteger(L, 3); if (value < S_NULL || value >= NUMSTATES) return luaL_error(L, "spawnstate number %d is invalid.", value); info->spawnstate = (statenum_t)value; } else if (i == 3 || (str && fastcmp(str,"spawnhealth"))) info->spawnhealth = (INT32)luaL_checkinteger(L, 3); else if (i == 4 || (str && fastcmp(str,"seestate"))) { value = luaL_checkinteger(L, 3); if (value < S_NULL || value >= NUMSTATES) return luaL_error(L, "seestate number %d is invalid.", value); info->seestate = (statenum_t)value; } else if (i == 5 || (str && fastcmp(str,"seesound"))) { value = luaL_checkinteger(L, 3); if (value < sfx_None || value >= NUMSFX) return luaL_error(L, "seesound number %d is invalid.", value); info->seesound = (sfxenum_t)value; } else if (i == 6 || (str && fastcmp(str,"reactiontime"))) info->reactiontime = (INT32)luaL_checkinteger(L, 3); else if (i == 7 || (str && fastcmp(str,"attacksound"))) info->attacksound = luaL_checkinteger(L, 3); else if (i == 8 || (str && fastcmp(str,"painstate"))) info->painstate = luaL_checkinteger(L, 3); else if (i == 9 || (str && fastcmp(str,"painchance"))) info->painchance = (INT32)luaL_checkinteger(L, 3); else if (i == 10 || (str && fastcmp(str,"painsound"))) info->painsound = luaL_checkinteger(L, 3); else if (i == 11 || (str && fastcmp(str,"meleestate"))) info->meleestate = luaL_checkinteger(L, 3); else if (i == 12 || (str && fastcmp(str,"missilestate"))) info->missilestate = luaL_checkinteger(L, 3); else if (i == 13 || (str && fastcmp(str,"deathstate"))) info->deathstate = luaL_checkinteger(L, 3); else if (i == 14 || (str && fastcmp(str,"xdeathstate"))) info->xdeathstate = luaL_checkinteger(L, 3); else if (i == 15 || (str && fastcmp(str,"deathsound"))) info->deathsound = luaL_checkinteger(L, 3); else if (i == 16 || (str && fastcmp(str,"speed"))) info->speed = (fixed_t)luaL_checkinteger(L, 3); else if (i == 17 || (str && fastcmp(str,"radius"))) info->radius = (fixed_t)luaL_checkinteger(L, 3); else if (i == 18 || (str && fastcmp(str,"height"))) info->height = (fixed_t)luaL_checkinteger(L, 3); else if (i == 19 || (str && fastcmp(str,"dispoffset"))) info->dispoffset = (INT32)luaL_checkinteger(L, 3); else if (i == 20 || (str && fastcmp(str,"mass"))) info->mass = (INT32)luaL_checkinteger(L, 3); else if (i == 21 || (str && fastcmp(str,"damage"))) info->damage = (INT32)luaL_checkinteger(L, 3); else if (i == 22 || (str && fastcmp(str,"activesound"))) info->activesound = luaL_checkinteger(L, 3); else if (i == 23 || (str && fastcmp(str,"flags"))) info->flags = (INT32)luaL_checkinteger(L, 3); else if (i == 24 || (str && fastcmp(str,"raisestate"))) { info->raisestate = luaL_checkinteger(L, 3); } lua_pop(L, 1); } return 0; }
// mobjinfo_t *, field -> number static int mobjinfo_get(lua_State *L) { mobjinfo_t *info = *((mobjinfo_t **)luaL_checkudata(L, 1, META_MOBJINFO)); const char *field = luaL_checkstring(L, 2); I_Assert(info != NULL); I_Assert(info >= mobjinfo); if (fastcmp(field,"doomednum")) lua_pushinteger(L, info->doomednum); else if (fastcmp(field,"spawnstate")) lua_pushinteger(L, info->spawnstate); else if (fastcmp(field,"spawnhealth")) lua_pushinteger(L, info->spawnhealth); else if (fastcmp(field,"seestate")) lua_pushinteger(L, info->seestate); else if (fastcmp(field,"seesound")) lua_pushinteger(L, info->seesound); else if (fastcmp(field,"reactiontime")) lua_pushinteger(L, info->reactiontime); else if (fastcmp(field,"attacksound")) lua_pushinteger(L, info->attacksound); else if (fastcmp(field,"painstate")) lua_pushinteger(L, info->painstate); else if (fastcmp(field,"painchance")) lua_pushinteger(L, info->painchance); else if (fastcmp(field,"painsound")) lua_pushinteger(L, info->painsound); else if (fastcmp(field,"meleestate")) lua_pushinteger(L, info->meleestate); else if (fastcmp(field,"missilestate")) lua_pushinteger(L, info->missilestate); else if (fastcmp(field,"deathstate")) lua_pushinteger(L, info->deathstate); else if (fastcmp(field,"xdeathstate")) lua_pushinteger(L, info->xdeathstate); else if (fastcmp(field,"deathsound")) lua_pushinteger(L, info->deathsound); else if (fastcmp(field,"speed")) lua_pushinteger(L, info->speed); else if (fastcmp(field,"radius")) lua_pushinteger(L, info->radius); else if (fastcmp(field,"height")) lua_pushinteger(L, info->height); else if (fastcmp(field,"dispoffset")) lua_pushinteger(L, info->dispoffset); else if (fastcmp(field,"mass")) lua_pushinteger(L, info->mass); else if (fastcmp(field,"damage")) lua_pushinteger(L, info->damage); else if (fastcmp(field,"activesound")) lua_pushinteger(L, info->activesound); else if (fastcmp(field,"flags")) lua_pushinteger(L, info->flags); else if (fastcmp(field,"raisestate")) lua_pushinteger(L, info->raisestate); else { lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, info); lua_rawget(L, -2); if (!lua_istable(L, -1)) { // no extra values table CONS_Debug(DBG_LUA, M_GetText("'%s' has no field named '%s'; returning nil.\n"), "mobjinfo_t", field); return 0; } lua_getfield(L, -1, field); if (lua_isnil(L, -1)) // no value for this field CONS_Debug(DBG_LUA, M_GetText("'%s' has no field named '%s'; returning nil.\n"), "mobjinfo_t", field); } return 1; }
static int player_set(lua_State *L) { player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); const char *field = luaL_checkstring(L, 2); if (!plr) return LUA_ErrInvalid(L, "player_t"); if (hud_running) return luaL_error(L, "Do not alter player_t in HUD rendering code!"); if (fastcmp(field,"mo")) { mobj_t *newmo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); plr->mo->player = NULL; // remove player pointer from old mobj (newmo->player = plr)->mo = newmo; // set player pointer for new mobj, and set new mobj as the player's mobj } else if (fastcmp(field,"cmd")) return NOSET; else if (fastcmp(field,"playerstate")) plr->playerstate = luaL_checkinteger(L, 3); else if (fastcmp(field,"viewz")) plr->viewz = luaL_checkfixed(L, 3); else if (fastcmp(field,"viewheight")) plr->viewheight = luaL_checkfixed(L, 3); else if (fastcmp(field,"deltaviewheight")) plr->deltaviewheight = luaL_checkfixed(L, 3); else if (fastcmp(field,"bob")) plr->bob = luaL_checkfixed(L, 3); else if (fastcmp(field,"aiming")) { plr->aiming = luaL_checkangle(L, 3); if (plr == &players[consoleplayer]) localaiming = plr->aiming; else if (plr == &players[secondarydisplayplayer]) localaiming2 = plr->aiming; } else if (fastcmp(field,"health")) plr->health = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"pity")) plr->pity = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"currentweapon")) plr->currentweapon = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"ringweapons")) plr->ringweapons = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"powers")) return NOSET; else if (fastcmp(field,"pflags")) plr->pflags = luaL_checkinteger(L, 3); else if (fastcmp(field,"panim")) plr->panim = luaL_checkinteger(L, 3); else if (fastcmp(field,"flashcount")) plr->flashcount = (UINT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"flashpal")) plr->flashpal = (UINT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"skincolor")) { UINT8 newcolor = (UINT8)luaL_checkinteger(L,3); if (newcolor >= MAXSKINCOLORS) return luaL_error(L, "player.skincolor %d out of range (0 - %d).", newcolor, MAXSKINCOLORS-1); plr->skincolor = newcolor; } else if (fastcmp(field,"score")) plr->score = (UINT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"dashspeed")) plr->dashspeed = luaL_checkfixed(L, 3); else if (fastcmp(field,"dashtime")) plr->dashtime = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"normalspeed")) plr->normalspeed = luaL_checkfixed(L, 3); else if (fastcmp(field,"runspeed")) plr->runspeed = luaL_checkfixed(L, 3); else if (fastcmp(field,"thrustfactor")) plr->thrustfactor = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"accelstart")) plr->accelstart = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"acceleration")) plr->acceleration = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"charability")) plr->charability = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"charability2")) plr->charability2 = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"charflags")) plr->charflags = (UINT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"thokitem")) plr->thokitem = luaL_checkinteger(L, 3); else if (fastcmp(field,"spinitem")) plr->spinitem = luaL_checkinteger(L, 3); else if (fastcmp(field,"revitem")) plr->revitem = luaL_checkinteger(L, 3); else if (fastcmp(field,"actionspd")) plr->actionspd = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"mindash")) plr->mindash = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"maxdash")) plr->maxdash = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"jumpfactor")) plr->jumpfactor = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"lives")) plr->lives = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"continues")) plr->continues = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"xtralife")) plr->xtralife = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"gotcontinue")) plr->gotcontinue = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"speed")) plr->speed = luaL_checkfixed(L, 3); else if (fastcmp(field,"jumping")) plr->jumping = luaL_checkboolean(L, 3); else if (fastcmp(field,"secondjump")) plr->secondjump = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"fly1")) plr->fly1 = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"scoreadd")) plr->scoreadd = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"glidetime")) plr->glidetime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"climbing")) plr->climbing = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"deadtimer")) plr->deadtimer = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"exiting")) plr->exiting = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"homing")) plr->homing = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"skidtime")) plr->skidtime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"cmomx")) plr->cmomx = luaL_checkfixed(L, 3); else if (fastcmp(field,"cmomy")) plr->cmomy = luaL_checkfixed(L, 3); else if (fastcmp(field,"rmomx")) plr->rmomx = luaL_checkfixed(L, 3); else if (fastcmp(field,"rmomy")) plr->rmomy = luaL_checkfixed(L, 3); else if (fastcmp(field,"numboxes")) plr->numboxes = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"totalring")) plr->totalring = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"realtime")) plr->realtime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"laps")) plr->laps = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"ctfteam")) plr->ctfteam = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"gotflag")) plr->gotflag = (UINT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"weapondelay")) plr->weapondelay = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"tossdelay")) plr->tossdelay = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"starpostx")) plr->starpostx = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"starposty")) plr->starposty = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"starpostz")) plr->starpostz = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"starpostnum")) plr->starpostnum = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"starposttime")) plr->starposttime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"starpostangle")) plr->starpostangle = luaL_checkangle(L, 3); else if (fastcmp(field,"angle_pos")) plr->angle_pos = luaL_checkangle(L, 3); else if (fastcmp(field,"old_angle_pos")) plr->old_angle_pos = luaL_checkangle(L, 3); else if (fastcmp(field,"axis1")) P_SetTarget(&plr->axis1, *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ))); else if (fastcmp(field,"axis2")) P_SetTarget(&plr->axis2, *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ))); else if (fastcmp(field,"bumpertime")) plr->bumpertime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"flyangle")) plr->flyangle = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"drilltimer")) plr->drilltimer = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"linkcount")) plr->linkcount = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"linktimer")) plr->linktimer = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"anotherflyangle")) plr->anotherflyangle = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"nightstime")) plr->nightstime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"drillmeter")) plr->drillmeter = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"drilldelay")) plr->drilldelay = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"bonustime")) plr->bonustime = luaL_checkboolean(L, 3); else if (fastcmp(field,"capsule")) { mobj_t *mo = NULL; if (!lua_isnil(L, 3)) mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); P_SetTarget(&plr->capsule, mo); } else if (fastcmp(field,"mare")) plr->mare = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"marebegunat")) plr->marebegunat = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"startedtime")) plr->startedtime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"finishedtime")) plr->finishedtime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"finishedrings")) plr->finishedrings = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"marescore")) plr->marescore = (UINT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"lastmarescore")) plr->lastmarescore = (UINT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"lastmare")) plr->lastmare = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"maxlink")) plr->maxlink = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"texttimer")) plr->texttimer = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"textvar")) plr->textvar = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"lastsidehit")) plr->lastsidehit = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"lastlinehit")) plr->lastlinehit = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"losstime")) plr->losstime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"timeshit")) plr->timeshit = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"onconveyor")) plr->onconveyor = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"awayviewmobj")) { mobj_t *mo = NULL; if (!lua_isnil(L, 3)) mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); P_SetTarget(&plr->awayviewmobj, mo); } else if (fastcmp(field,"awayviewtics")) { plr->awayviewtics = (INT32)luaL_checkinteger(L, 3); if (plr->awayviewtics && !plr->awayviewmobj) // awayviewtics must ALWAYS have an awayviewmobj set!! P_SetTarget(&plr->awayviewmobj, plr->mo); // but since the script might set awayviewmobj immediately AFTER setting awayviewtics, use player mobj as filler for now. } else if (fastcmp(field,"awayviewaiming")) plr->awayviewaiming = luaL_checkangle(L, 3); else if (fastcmp(field,"spectator")) plr->spectator = lua_toboolean(L, 3); else if (fastcmp(field,"bot")) return NOSET; else if (fastcmp(field,"jointime")) plr->jointime = (tic_t)luaL_checkinteger(L, 3); #ifdef HWRENDER else if (fastcmp(field,"fovadd")) plr->fovadd = luaL_checkfixed(L, 3); #endif else { lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, plr); lua_rawget(L, -2); if (lua_isnil(L, -1)) { // This index doesn't have a table for extra values yet, let's make one. lua_pop(L, 1); CONS_Debug(DBG_LUA, M_GetText("'%s' has no field named '%s'; adding it as Lua data.\n"), "player_t", field); lua_newtable(L); lua_pushlightuserdata(L, plr); lua_pushvalue(L, -2); // ext value table lua_rawset(L, -4); // LREG_EXTVARS table } lua_pushvalue(L, 3); // value to store lua_setfield(L, -2, field); lua_pop(L, 2); } return 0; }
// mobjinfo_t *, field, number -> mobjinfo[] static int mobjinfo_set(lua_State *L) { mobjinfo_t *info = *((mobjinfo_t **)luaL_checkudata(L, 1, META_MOBJINFO)); const char *field = luaL_checkstring(L, 2); if (hud_running) return luaL_error(L, "Do not alter mobjinfo in HUD rendering code!"); I_Assert(info != NULL); I_Assert(info >= mobjinfo); if (fastcmp(field,"doomednum")) info->doomednum = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"spawnstate")) info->spawnstate = luaL_checkinteger(L, 3); else if (fastcmp(field,"spawnhealth")) info->spawnhealth = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"seestate")) info->seestate = luaL_checkinteger(L, 3); else if (fastcmp(field,"seesound")) info->seesound = luaL_checkinteger(L, 3); else if (fastcmp(field,"reactiontime")) info->reactiontime = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"attacksound")) info->attacksound = luaL_checkinteger(L, 3); else if (fastcmp(field,"painstate")) info->painstate = luaL_checkinteger(L, 3); else if (fastcmp(field,"painchance")) info->painchance = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"painsound")) info->painsound = luaL_checkinteger(L, 3); else if (fastcmp(field,"meleestate")) info->meleestate = luaL_checkinteger(L, 3); else if (fastcmp(field,"missilestate")) info->missilestate = luaL_checkinteger(L, 3); else if (fastcmp(field,"deathstate")) info->deathstate = luaL_checkinteger(L, 3); else if (fastcmp(field,"xdeathstate")) info->xdeathstate = luaL_checkinteger(L, 3); else if (fastcmp(field,"deathsound")) info->deathsound = luaL_checkinteger(L, 3); else if (fastcmp(field,"speed")) info->speed = (fixed_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"radius")) info->radius = (fixed_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"height")) info->height = (fixed_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"dispoffset")) info->dispoffset = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"mass")) info->mass = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"damage")) info->damage = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"activesound")) info->activesound = luaL_checkinteger(L, 3); else if (fastcmp(field,"flags")) info->flags = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"raisestate")) info->raisestate = luaL_checkinteger(L, 3); else { lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, info); lua_rawget(L, -2); if (lua_isnil(L, -1)) { // This index doesn't have a table for extra values yet, let's make one. lua_pop(L, 1); CONS_Debug(DBG_LUA, M_GetText("'%s' has no field named '%s'; adding it as Lua data.\n"), "mobjinfo_t", field); lua_newtable(L); lua_pushlightuserdata(L, info); lua_pushvalue(L, -2); // ext value table lua_rawset(L, -4); // LREG_EXTVARS table } lua_pushvalue(L, 3); // value to store lua_setfield(L, -2, field); lua_pop(L, 2); } //else //return luaL_error(L, LUA_QL("mobjinfo_t") " has no field named " LUA_QS, field); return 0; }
static void InsertNode(int r) /* Inserting node to the tree */ /***************************/ { int i, p, cmp; unsigned char *key; unsigned c; cmp = 1; key = &text_buf[r]; p = N + 1 + key[0]; rson[r] = lson[r] = NIL; match_length = 0; for ( ; ; ) { if (cmp >= 0) { if (rson[p] != NIL) p = rson[p]; else { rson[p] = r; dad[r] = p; return; } } else { if (lson[p] != NIL) p = lson[p]; else { lson[p] = r; dad[r] = p; return; } } cmp = 0; #if defined( __WATCOMC__ ) && defined( __386__ ) i = fastcmp( key + 1, &text_buf[p + 1], &cmp ) + 1; #else for (i = 1; i < F; i++) { if( key[i] != text_buf[p + i] ) { cmp = key[i] - text_buf[p + i]; break; } } #endif if (i > THRESHOLD) { if (i > match_length) { match_position = ((r - p) & (N - 1)) - 1; if ((match_length = i) >= F) { break; } } if (i == match_length) { if ((c = ((r - p) & (N - 1)) - 1) < match_position) { match_position = c; } } } } dad[r] = dad[p]; lson[r] = lson[p]; rson[r] = rson[p]; dad[lson[p]] = r; dad[rson[p]] = r; if (rson[dad[p]] == p) rson[dad[p]] = r; else lson[dad[p]] = r; dad[p] = NIL; /* remove p */ }
// Lua table full of data -> states[] (set the values all at once! :D :D) static int lib_setState(lua_State *L) { state_t *state; lua_remove(L, 1); // don't care about states[] userdata. state = &states[luaL_checkinteger(L, 1)]; // get the state to assign to. luaL_checktype(L, 2, LUA_TTABLE); // check that we've been passed a table. lua_remove(L, 1); // pop state num, don't need it any more. lua_settop(L, 1); // cut the stack here. the only thing left now is the table of data we're assigning to the state. if (hud_running) return luaL_error(L, "Do not alter states in HUD rendering code!"); // clear the state to start with, in case of missing table elements memset(state,0,sizeof(state_t)); state->tics = -1; lua_pushnil(L); while (lua_next(L, 1)) { lua_Integer i = 0; const char *str = NULL; lua_Integer value; if (lua_isnumber(L, 2)) i = lua_tointeger(L, 2); else str = luaL_checkstring(L, 2); if (i == 1 || (str && fastcmp(str, "sprite"))) { value = luaL_checkinteger(L, 3); if (value < SPR_NULL || value >= NUMSPRITES) return luaL_error(L, "sprite number %d is invalid.", value); state->sprite = (spritenum_t)value; } else if (i == 2 || (str && fastcmp(str, "frame"))) { state->frame = (UINT32)luaL_checkinteger(L, 3); } else if (i == 3 || (str && fastcmp(str, "tics"))) { state->tics = (INT32)luaL_checkinteger(L, 3); } else if (i == 4 || (str && fastcmp(str, "action"))) { switch(lua_type(L, 3)) { case LUA_TNIL: // Null? Set the action to nothing, then. state->action.acp1 = NULL; break; case LUA_TSTRING: // It's a string, expect the name of a built-in action LUA_SetActionByName(state, lua_tostring(L, 3)); break; case LUA_TFUNCTION: // It's a function (a Lua function or a C function? either way!) lua_getfield(L, LUA_REGISTRYINDEX, LREG_STATEACTION); I_Assert(lua_istable(L, -1)); lua_pushlightuserdata(L, state); // We'll store this function by the state's pointer in the registry. lua_pushvalue(L, 3); // Bring it to the top of the stack lua_rawset(L, -3); // Set it in the registry lua_pop(L, 1); // pop LREG_STATEACTION state->action.acp1 = (actionf_p1)A_Lua; // Set the action for the userdata. break; default: // ?! return luaL_typerror(L, 3, "function"); } } else if (i == 5 || (str && fastcmp(str, "var1"))) { state->var1 = (INT32)luaL_checkinteger(L, 3); } else if (i == 6 || (str && fastcmp(str, "var2"))) { state->var2 = (INT32)luaL_checkinteger(L, 3); } else if (i == 7 || (str && fastcmp(str, "nextstate"))) { value = luaL_checkinteger(L, 3); if (value < S_NULL || value >= NUMSTATES) return luaL_error(L, "nextstate number %d is invalid.", value); state->nextstate = (statenum_t)value; } lua_pop(L, 1); } return 0; }