diff --git a/src/acs/call-funcs.cpp b/src/acs/call-funcs.cpp index 367569279..474d294e1 100644 --- a/src/acs/call-funcs.cpp +++ b/src/acs/call-funcs.cpp @@ -83,23 +83,14 @@ static bool ACS_GetMobjTypeFromString(const char *word, mobjtype_t *type) word += 3; } - for (int i = 0; i < NUMMOBJFREESLOTS; i++) + for (int i = 0; i < NUMMOBJTYPES; i++) { - if (!FREE_MOBJS[i]) + if (!mobjinfo[i].nameofs) { break; } - if (fastcmp(word, FREE_MOBJS[i])) - { - *type = static_cast(static_cast(MT_FIRSTFREESLOT) + i); - return true; - } - } - - for (int i = 0; i < MT_FIRSTFREESLOT; i++) - { - if (fastcmp(word, MOBJTYPE_LIST[i] + 3)) + if (fastcmp(word, strbuf_get(mobjnames, mobjinfo[i].nameofs))) { *type = static_cast(i); return true; @@ -234,23 +225,14 @@ static bool ACS_GetStateFromString(const char *word, statenum_t *type) word += 2; } - for (int i = 0; i < NUMMOBJFREESLOTS; i++) + for (int i = 0; i < NUMSTATES; i++) { - if (!FREE_STATES[i]) + if (!states[i].nameofs) { break; } - if (fastcmp(word, FREE_STATES[i])) - { - *type = static_cast(static_cast(S_FIRSTFREESLOT) + i); - return true; - } - } - - for (int i = 0; i < S_FIRSTFREESLOT; i++) - { - if (fastcmp(word, STATE_LIST[i] + 2)) + if (fastcmp(word, strbuf_get(statenames, states[i].nameofs))) { *type = static_cast(i); return true; @@ -2336,16 +2318,9 @@ bool CallFunc_GetObjectClass(ACSVM::Thread *thread, const ACSVM::Word *argV, ACS mobj_t *mobj = P_FindMobjFromTID(argV[0], NULL, info->mo); if (mobj != NULL && P_MobjWasRemoved(mobj) == false) { - if (mobj->type >= MT_FIRSTFREESLOT) - { - std::string prefix = "MT_"; - std::string full = prefix + FREE_MOBJS[mobj->type - MT_FIRSTFREESLOT]; - mobjClass = static_cast( ~env->getString( full.c_str() )->idx ); - } - else - { - mobjClass = static_cast( ~env->getString( MOBJTYPE_LIST[ mobj->type ] )->idx ); - } + std::string prefix = "MT_"; + std::string full = prefix + (strbuf_get(mobjnames, mobjinfo[mobj->type].nameofs)); + mobjClass = static_cast( ~env->getString( full.c_str() )->idx ); } thread->dataStk.push(mobjClass); @@ -4397,16 +4372,9 @@ bool CallFunc_GetThingProperty(ACSVM::Thread *thread, const ACSVM::Word *argV, A #define PROP_TYPE(x, y) \ case x: \ { \ - if (mobj->y >= MT_FIRSTFREESLOT) \ - { \ - std::string prefix = "MT_"; \ - std::string full = prefix + FREE_MOBJS[mobj->y - MT_FIRSTFREESLOT]; \ - value = static_cast( ~env->getString( full.c_str() )->idx ); \ - } \ - else \ - { \ - value = static_cast( ~env->getString( MOBJTYPE_LIST[ mobj->y ] )->idx ); \ - } \ + std::string prefix = "MT_"; \ + std::string full = prefix + (strbuf_get(mobjnames, mobjinfo[mobj->y].nameofs)); \ + value = static_cast( ~env->getString( full.c_str() )->idx ); \ break; \ } @@ -4430,16 +4398,9 @@ bool CallFunc_GetThingProperty(ACSVM::Thread *thread, const ACSVM::Word *argV, A case x: \ { \ statenum_t stateID = static_cast(mobj->y - states); \ - if (stateID >= S_FIRSTFREESLOT) \ - { \ - std::string prefix = "S_"; \ - std::string full = prefix + FREE_STATES[stateID - S_FIRSTFREESLOT]; \ - value = static_cast( ~env->getString( full.c_str() )->idx ); \ - } \ - else \ - { \ - value = static_cast( ~env->getString( STATE_LIST[ stateID ] )->idx ); \ - } \ + std::string prefix = "S_"; \ + std::string full = prefix + strbuf_get(statenames, states[stateID].nameofs); \ + value = static_cast( ~env->getString( full.c_str() )->idx ); \ break; \ } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f0f6eea77..c3e705bcc 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4872,10 +4872,10 @@ static void Command_ListDoomednums_f(void) CONS_Printf(" doomednum \x82""%d""\x80 is \x85""double-defined\x80 by ", j+1); if (i < MT_FIRSTFREESLOT) { - CONS_Printf("\x87""hardcode %s <-- MAJOR ERROR\n", MOBJTYPE_LIST[i]); + CONS_Printf("\x87""hardcode MT_%s <-- MAJOR ERROR\n", strbuf_get(mobjnames, mobjinfo[i].nameofs)); continue; } - CONS_Printf("\x81""freeslot MT_""%s\n", FREE_MOBJS[i-MT_FIRSTFREESLOT]); + CONS_Printf("\x81""freeslot MT_""%s\n", strbuf_get(mobjnames, mobjinfo[i].nameofs)); continue; } table[j] = i; @@ -4908,10 +4908,10 @@ static void Command_ListDoomednums_f(void) CONS_Printf(" doomednum \x82""%d""\x80 is used by ", i+1); if (table[i] < MT_FIRSTFREESLOT) { - CONS_Printf("\x87""hardcode %s\n", MOBJTYPE_LIST[table[i]]); + CONS_Printf("\x87""hardcode MT_%s\n", strbuf_get(mobjnames, mobjinfo[i].nameofs)); continue; } - CONS_Printf("\x81""freeslot MT_""%s\n", FREE_MOBJS[table[i]-MT_FIRSTFREESLOT]); + CONS_Printf("\x81""freeslot MT_""%s\n", strbuf_get(mobjnames, mobjinfo[i].nameofs)); } } diff --git a/src/deh_lua.c b/src/deh_lua.c index 0e1915d05..a1983727b 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -81,33 +81,31 @@ static inline int lib_freeslot(lua_State *L) else if (fastcmp(type, "S")) { statenum_t i; - for (i = 0; i < NUMSTATEFREESLOTS; i++) - if (!FREE_STATES[i]) { + for (i = S_FIRSTFREESLOT; i < NUMSTATES; i++) + if (!states[i].nameofs) { CONS_Printf("State S_%s allocated.\n",word); - FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); - strcpy(FREE_STATES[i],word); + states[i].nameofs = strbuf_append(&statenames, word); freeslotusage[0][0]++; - lua_pushinteger(L, S_FIRSTFREESLOT + i); + lua_pushinteger(L, i); r++; break; } - if (i == NUMSTATEFREESLOTS) + if (i == NUMSTATES) CONS_Alert(CONS_WARNING, "Ran out of free State slots!\n"); } else if (fastcmp(type, "MT")) { mobjtype_t i; - for (i = 0; i < NUMMOBJFREESLOTS; i++) - if (!FREE_MOBJS[i]) { + for (i = MT_FIRSTFREESLOT; i < NUMMOBJTYPES; i++) + if (!mobjinfo[i].nameofs) { CONS_Printf("MobjType MT_%s allocated.\n",word); - FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); - strcpy(FREE_MOBJS[i],word); + mobjinfo[i].nameofs = strbuf_append(&mobjnames, word); freeslotusage[1][0]++; - lua_pushinteger(L, MT_FIRSTFREESLOT + i); + lua_pushinteger(L, i); r++; break; } - if (i == NUMMOBJFREESLOTS) + if (i == NUMMOBJTYPES) CONS_Alert(CONS_WARNING, "Ran out of free MobjType slots!\n"); } else if (fastcmp(type, "SKINCOLOR")) @@ -426,19 +424,14 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) lua_pushinteger(L, S_FIRSTFREESLOT); return 1; } - for (i = 0; i < NUMSTATEFREESLOTS; i++) { - if (!FREE_STATES[i]) + for (i = 0; i < NUMSTATES; i++) { + if (!states[i].nameofs) break; - if (fastcmp(p, FREE_STATES[i])) { - CacheAndPushConstant(L, word, S_FIRSTFREESLOT+i); - return 1; - } - } - for (i = 0; i < S_FIRSTFREESLOT; i++) - if (fastcmp(p, STATE_LIST[i]+2)) { + if (fastcmp(p, strbuf_get(statenames, states[i].nameofs))) { CacheAndPushConstant(L, word, i); return 1; } + } if (lua_compatmode) for (i = 0; STATE_ALIASES[i].n; i++) if (fastcmp(p, STATE_ALIASES[i].n)) { @@ -454,20 +447,14 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) lua_pushinteger(L, MT_FIRSTFREESLOT); return 1; } - for (i = 0; i < NUMMOBJFREESLOTS; i++) { - if (!FREE_MOBJS[i]) + for (i = 0; i < NUMMOBJTYPES; i++) { + if (!mobjinfo[i].nameofs) break; - if (fastcmp(p, FREE_MOBJS[i])) { - CacheAndPushConstant(L, word, MT_FIRSTFREESLOT+i); - return 1; - } - } - for (i = 0; i < MT_FIRSTFREESLOT; i++) - if (fastcmp(p, MOBJTYPE_LIST[i]+3)) { + if (fastcmp(p, strbuf_get(mobjnames, mobjinfo[i].nameofs))) { CacheAndPushConstant(L, word, i); return 1; } - + } if (lua_compatmode) for (i = 0; MOBJ_ALIASES[i].n; i++) if (fastcmp(p, MOBJ_ALIASES[i].n)) { diff --git a/src/deh_soc.c b/src/deh_soc.c index 6ca47041c..909760398 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -444,22 +444,20 @@ void readfreeslots(MYFILE *f) } else if (fastcmp(type, "S")) { - for (i = 0; i < NUMSTATEFREESLOTS; i++) - if (!FREE_STATES[i]) { + for (i = S_FIRSTFREESLOT; i < NUMSTATES; i++) + if (!states[i].nameofs) { CONS_Printf("State S_%s allocated.\n",word); - FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); - strcpy(FREE_STATES[i],word); + states[i].nameofs = strbuf_append(&statenames, word); freeslotusage[0][0]++; break; } } else if (fastcmp(type, "MT")) { - for (i = 0; i < NUMMOBJFREESLOTS; i++) - if (!FREE_MOBJS[i]) { + for (i = MT_FIRSTFREESLOT; i < NUMMOBJFREESLOTS; i++) + if (!mobjinfo[i].nameofs) { CONS_Printf("MobjType MT_%s allocated.\n",word); - FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); - strcpy(FREE_MOBJS[i],word); + mobjinfo[i].nameofs = strbuf_append(&mobjnames, word); freeslotusage[1][0]++; break; } @@ -4266,15 +4264,12 @@ mobjtype_t get_mobjtype(const char *word) return atoi(word); if (fastncmp("MT_",word,3)) word += 3; // take off the MT_ - for (i = 0; i < NUMMOBJFREESLOTS; i++) { - if (!FREE_MOBJS[i]) + for (i = 0; i < NUMMOBJTYPES; i++) { + if (!mobjinfo[i].nameofs) break; - if (fastcmp(word, FREE_MOBJS[i])) - return MT_FIRSTFREESLOT+i; - } - for (i = 0; i < MT_FIRSTFREESLOT; i++) - if (fastcmp(word, MOBJTYPE_LIST[i]+3)) + if (fastcmp(word, strbuf_get(mobjnames, mobjinfo[i].nameofs))) return i; + } deh_warning("Couldn't find mobjtype named 'MT_%s'",word); return -1; } @@ -4286,15 +4281,12 @@ statenum_t get_state(const char *word) return atoi(word); if (fastncmp("S_",word,2)) word += 2; // take off the S_ - for (i = 0; i < NUMSTATEFREESLOTS; i++) { - if (!FREE_STATES[i]) + for (i = 0; i < NUMSTATES; i++) { + if (!states[i].nameofs) break; - if (fastcmp(word, FREE_STATES[i])) - return S_FIRSTFREESLOT+i; - } - for (i = 0; i < S_FIRSTFREESLOT; i++) - if (fastcmp(word, STATE_LIST[i]+2)) + if (fastcmp(word, strbuf_get(statenames, states[i].nameofs))) return i; + } deh_warning("Couldn't find state named 'S_%s'",word); return -1; } diff --git a/src/deh_tables.c b/src/deh_tables.c index f11c807fa..57229a2ee 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -32,8 +32,8 @@ #include "deh_tables.h" -char *FREE_STATES[NUMSTATEFREESLOTS]; -char *FREE_MOBJS[NUMMOBJFREESLOTS]; +strbuf_t *statenames; +strbuf_t *mobjnames; char *FREE_SKINCOLORS[NUMCOLORFREESLOTS]; char *FREE_MENUS[NUMMENUFREESLOTS]; UINT8 used_spr[(NUMSPRITEFREESLOTS / 8) + 1]; // Bitwise flag for sprite freeslot in use! I would use ceil() here if I could, but it only saves 1 byte of memory anyway. @@ -83,12 +83,6 @@ actionpointer_t actionpointers[] = // TODO: Make the lists public so we can start using actual mobj // and state names in warning and error messages! :D -const char *const STATE_LIST[] = { // array length left dynamic for sanity testing later. -#define _(name, ...) "S_"#name, -#include "info/states.h" -#undef _ -}; - struct int_const_s const STATE_ALIASES[] = { {"KART_STND1", S_KART_STILL}, {"KART_STND2" , S_KART_STILL}, @@ -123,12 +117,6 @@ struct int_const_s const STATE_ALIASES[] = { { NULL, 0 } }; -const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity testing later. -#define _(name, ...) "MT_"#name, -#include "info/mobjs.h" -#undef _ -}; - struct int_const_s const MOBJ_ALIASES[] = { {"BIRD", MT_FLICKY_01}, {"BUNNY" , MT_FLICKY_02}, @@ -1529,16 +1517,8 @@ struct int_const_s const INT_CONST[] = { void DEH_TableCheck(void) { #if defined(_DEBUG) || defined(PARANOIA) - const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*); - const size_t dehmobjs = sizeof(MOBJTYPE_LIST)/sizeof(const char*); const size_t dehcolors = sizeof(COLOR_ENUMS)/sizeof(const char*); - if (dehstates != S_FIRSTFREESLOT) - I_Error("You forgot to update the Dehacked states list, you dolt!\n(%d states defined, versus %s in the Dehacked list)\n", S_FIRSTFREESLOT, sizeu1(dehstates)); - - if (dehmobjs != MT_FIRSTFREESLOT) - I_Error("You forgot to update the Dehacked mobjtype list, you dolt!\n(%d mobj types defined, versus %s in the Dehacked list)\n", MT_FIRSTFREESLOT, sizeu1(dehmobjs)); - if (dehcolors != SKINCOLOR_FIRSTFREESLOT) I_Error("You forgot to update the Dehacked colors list, you dolt!\n(%d colors defined, versus %s in the Dehacked list)\n", SKINCOLOR_FIRSTFREESLOT, sizeu1(dehcolors)); #endif diff --git a/src/deh_tables.h b/src/deh_tables.h index 4451f6b51..5071e7a2b 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -18,6 +18,7 @@ #include "info.h" // Mobj, state, sprite, etc constants #include "m_menu.h" // NUMMENUFREESLOTS #include "lua_script.h" +#include "strbuf.h" #ifdef __cplusplus extern "C" { @@ -25,15 +26,15 @@ extern "C" { // Free slot names // The crazy word-reading stuff uses these. -extern char *FREE_STATES[NUMSTATEFREESLOTS]; -extern char *FREE_MOBJS[NUMMOBJFREESLOTS]; +extern strbuf_t *statenames; +extern strbuf_t *mobjnames; extern char *FREE_SKINCOLORS[NUMCOLORFREESLOTS]; extern char *FREE_MENUS[NUMMENUFREESLOTS]; extern UINT8 used_spr[(NUMSPRITEFREESLOTS / 8) + 1]; // Bitwise flag for sprite freeslot in use! I would use ceil() here if I could, but it only saves 1 byte of memory anyway. #define initfreeslots() {\ - memset(FREE_STATES,0,sizeof(char *) * NUMSTATEFREESLOTS);\ - memset(FREE_MOBJS,0,sizeof(char *) * NUMMOBJFREESLOTS);\ + statenames = strbuf_alloc();\ + mobjnames = strbuf_alloc();\ memset(FREE_SKINCOLORS,0,sizeof(char *) * NUMCOLORFREESLOTS);\ memset(used_spr,0,sizeof(UINT8) * ((NUMSPRITEFREESLOTS / 8) + 1));\ } @@ -71,9 +72,7 @@ struct int_const_s { extern struct flickytypes_s FLICKYTYPES[]; extern actionpointer_t actionpointers[]; // Array mapping action names to action functions. -extern const char *const STATE_LIST[]; extern struct int_const_s const STATE_ALIASES[]; -extern const char *const MOBJTYPE_LIST[]; extern struct int_const_s const MOBJ_ALIASES[]; extern const char *const MOBJFLAG_LIST[]; extern const char *const MOBJFLAG2_LIST[]; // \tMF2_(\S+).*// (.+) --> \t"\1", // \2 diff --git a/src/dehacked.c b/src/dehacked.c index 9f081ffc3..daa45d795 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -176,6 +176,18 @@ static void ignorelines(MYFILE *f) Z_Free(s); } +static const char *hardcodemobjs = +#define _(name, ...) #name "\0" +#include "info/mobjs.h" +#undef _ +; + +static const char *hardcodestates = +#define _(name, ...) #name "\0" +#include "info/states.h" +#undef _ +; + static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) { char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); @@ -185,7 +197,18 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) INT32 i; if (!deh_loaded) + { initfreeslots(); + const char *name; + + name = hardcodemobjs; + for (i = 0; i < MT_FIRSTFREESLOT; i++, name += strlen(name)+1) + mobjinfo[i].nameofs = strbuf_append(&mobjnames, name); + + name = hardcodestates; + for (i = 0; i < S_FIRSTFREESLOT; i++, name += strlen(name)+1) + states[i].nameofs = strbuf_append(&statenames, name); + } deh_num_warning = 0; diff --git a/src/info.h b/src/info.h index 1b3078827..dd7dce5bd 100644 --- a/src/info.h +++ b/src/info.h @@ -79,6 +79,8 @@ typedef enum state struct state_t { + UINT32 nameofs; + spritenum_t sprite; UINT32 frame; // we use the upper 16 bits for translucency and other shade effects INT32 tics; @@ -107,6 +109,8 @@ typedef enum mobj_type struct mobjinfo_t { + UINT32 nameofs; + INT32 doomednum; statenum_t spawnstate; INT32 spawnhealth; diff --git a/src/lua_infolib.c b/src/lua_infolib.c index a330bb900..eb52c0787 100644 --- a/src/lua_infolib.c +++ b/src/lua_infolib.c @@ -752,8 +752,13 @@ static int lib_setState(lua_State *L) return luaL_error(L, "Do not alter states in CMD building code!"); // clear the state to start with, in case of missing table elements - memset(state,0,sizeof(state_t)); + state->sprite = SPR_NULL; + state->frame = 0; state->tics = -1; + state->action.acp1 = NULL; + state->var1 = 0; + state->var2 = 0; + state->nextstate = S_NULL; lua_pushnil(L); while (lua_next(L, 1)) { @@ -975,16 +980,9 @@ static int state_get(lua_State *L) else if (fastcmp(field,"string")) { statenum_t id = st-states; - if (id < S_FIRSTFREESLOT) + if (id < NUMSTATES) { - lua_pushstring(L, STATE_LIST[id]+2); - return 1; - } - - id -= S_FIRSTFREESLOT; - if (id < NUMSTATEFREESLOTS && FREE_STATES[id]) - { - lua_pushstring(L, FREE_STATES[id]); + lua_pushstring(L, strbuf_get(statenames, states[id].nameofs)); return 1; } @@ -1114,9 +1112,30 @@ static int lib_setMobjInfo(lua_State *L) return luaL_error(L, "Do not alter mobjinfo in CMD building 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->spawnstate = S_NULL; info->spawnhealth = 1; // avoid 'dead' noclip behaviors + info->seestate = S_NULL; + info->seesound = sfx_None; + info->reactiontime = 0; + info->attacksound = sfx_None; + info->painstate = S_NULL; + info->painchance = 0; + info->painsound = sfx_None; + info->meleestate = S_NULL; + info->missilestate = S_NULL; + info->deathstate = S_NULL; + info->xdeathstate = S_NULL; + info->deathsound = sfx_None; + info->speed = 0; + info->radius = 0; + info->height = 0; + info->dispoffset = 0; + info->mass = 0; + info->damage = 0; + info->activesound = sfx_None; + info->flags = 0U; + info->raisestate = S_NULL; lua_pushnil(L); while (lua_next(L, 1)) { @@ -1257,16 +1276,9 @@ static int mobjinfo_get(lua_State *L) lua_pushinteger(L, info->raisestate); else if (fastcmp(field,"string")) { mobjtype_t id = info-mobjinfo; - if (id < MT_FIRSTFREESLOT) + if (id < NUMMOBJTYPES) { - lua_pushstring(L, MOBJTYPE_LIST[id]+3); - return 1; - } - - id -= MT_FIRSTFREESLOT; - if (id < NUMMOBJFREESLOTS && FREE_MOBJS[id]) - { - lua_pushstring(L, FREE_MOBJS[id]); + lua_pushstring(L, strbuf_get(mobjnames, mobjinfo[id].nameofs)); return 1; } diff --git a/src/p_tick.c b/src/p_tick.c index a845e5da7..5f92e8a79 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -263,13 +263,13 @@ static const char *MobjTypeName(const mobj_t *mobj) if (p1 == (actionf_p1)P_MobjThinker) { - return MOBJTYPE_LIST[mobj->type]; + return strbuf_get(mobjnames, mobjinfo[mobj->type].nameofs); } else if (p1 == (actionf_p1)P_RemoveThinkerDelayed) { if (mobj->thinker.debug_mobjtype != MT_NULL) { - return MOBJTYPE_LIST[mobj->thinker.debug_mobjtype]; + return strbuf_get(mobjnames, mobjinfo[mobj->thinker.debug_mobjtype].nameofs); } } @@ -331,7 +331,7 @@ void P_RemoveThinkerDelayed(thinker_t *thinker) else if ((thinker->debug_time + delay) <= leveltime) { CONS_Printf( - "PARANOIA/P_RemoveThinkerDelayed: %p %s references=%d\n", + "PARANOIA/P_RemoveThinkerDelayed: %p MT_%s references=%d\n", (void*)thinker, MobjTypeName((mobj_t*)thinker), thinker->references @@ -423,7 +423,7 @@ mobj_t *P_SetTarget2(mobj_t **mop, mobj_t *targ if ((*mop)->thinker.references < 0) { CONS_Printf( - "PARANOIA/P_SetTarget: %p %s %s references=%d, references go negative! (%s:%d)\n", + "PARANOIA/P_SetTarget: %p MT_%s %s references=%d, references go negative! (%s:%d)\n", (void*)*mop, MobjTypeName(*mop), MobjThinkerName(*mop),