From 8bd88b867830867858e59215a618cb77426668aa Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 21 Dec 2022 22:36:15 +0100 Subject: [PATCH] - migrate all script related info to the data stored in the actor classes. This also needs cactor to really change the class descriptor now so that the correct script code is found. --- source/games/duke/src/gameexec.cpp | 27 +++++++++++++++++---------- source/games/duke/src/spawn.cpp | 19 ++++++++++--------- source/games/duke/src/vmexports.cpp | 2 +- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/source/games/duke/src/gameexec.cpp b/source/games/duke/src/gameexec.cpp index 4c718f3bd..fecb450a7 100644 --- a/source/games/duke/src/gameexec.cpp +++ b/source/games/duke/src/gameexec.cpp @@ -1949,11 +1949,6 @@ int ParseState::parse(void) g_ac->spr.cstat = ESpriteFlags::FromInt(*insptr); insptr++; break; - case concmd_newpic: - insptr++; - g_ac->spr.picnum = (short)*insptr; - insptr++; - break; case concmd_ifmove: insptr++; parseifelse((g_ac->curMove - moves.Data()) == *insptr); @@ -2120,12 +2115,19 @@ int ParseState::parse(void) insptr++; break; + case concmd_newpic: case concmd_cactor: + { insptr++; - g_ac->spr.picnum = *insptr; + auto info = spawnMap.CheckKey(*insptr); + if (info != nullptr) + { + g_ac->ChangeType(info->cls); + g_ac->spr.picnum = *insptr; + } insptr++; break; - + } case concmd_ifbulletnear: parseifelse( dodge(g_ac) == 1); break; @@ -3189,8 +3191,9 @@ void LoadActor(DDukeActor *actor, int p, int x) s.g_x = x; // ?? s.g_ac = actor; - if (actor->spr.picnum < 0 || actor->spr.picnum >= MAXTILES) return; - auto addr = gs.actorinfo[actor->spr.picnum].loadeventscriptptr; + auto coninf = actor->conInfo(); + if (coninf == nullptr) return; + auto addr = coninf->loadeventscriptptr; if (addr == 0) return; s.killit_flag = 0; @@ -3244,13 +3247,17 @@ void LoadActor(DDukeActor *actor, int p, int x) bool execute(DDukeActor *actor,int p,double xx) { - if (gs.actorinfo[actor->spr.picnum].scriptaddress == 0) return false; + auto coninf = actor->conInfo(); + if (coninf == nullptr) + return false; ParseState s; s.g_p = p; // Player ID s.g_x = int(xx / maptoworld); // ?? s.g_ac = actor; s.insptr = &ScriptCode[4 + (gs.actorinfo[actor->spr.picnum].scriptaddress)]; + auto insptr = coninf? &ScriptCode[4 + coninf->scriptaddress] : nullptr; + if (insptr != s.insptr) Printf("%s: %p vs. %p\n", insptr, s.insptr); s.killit_flag = 0; int done; diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp index f3d0af58a..f54a47379 100644 --- a/source/games/duke/src/spawn.cpp +++ b/source/games/duke/src/spawn.cpp @@ -121,11 +121,11 @@ DDukeActor* CreateActor(sectortype* whatsectp, const DVector3& pos, PClassActor* } - s_pn = act->spr.picnum; memset(act->temp_data, 0, sizeof(act->temp_data)); - if (gs.actorinfo[s_pn].scriptaddress) + auto coninf = act->conInfo(); + if (coninf) { - auto sa = &ScriptCode[gs.actorinfo[s_pn].scriptaddress]; + auto sa = &ScriptCode[coninf->scriptaddress]; act->curAction = &actions[sa[1]]; act->curMove = &moves[sa[2]]; act->spr.hitag = sa[3]; @@ -226,16 +226,17 @@ bool initspriteforspawn(DDukeActor* act) } } - int s = act->spr.picnum; - if (act->spr.cstat & CSTAT_SPRITE_BLOCK) act->spr.cstat |= CSTAT_SPRITE_BLOCK_HITSCAN; act->spr.extra = act->IntVar(NAME_strength); - if (gs.actorinfo[s].scriptaddress) + + auto coninf = act->conInfo(); + if (coninf) { - act->curAction = &actions[ScriptCode[gs.actorinfo[s].scriptaddress+1]]; - act->curMove = &moves[ScriptCode[gs.actorinfo[s].scriptaddress+2]]; - int s3 = ScriptCode[gs.actorinfo[s].scriptaddress+3]; + auto sa = &ScriptCode[coninf->scriptaddress]; + act->curAction = &actions[sa[1]]; + act->curMove = &moves[sa[2]]; + int s3 = ScriptCode[sa[3]]; if (s3 && act->spr.hitag == 0) act->spr.hitag = s3; } diff --git a/source/games/duke/src/vmexports.cpp b/source/games/duke/src/vmexports.cpp index 505094fb4..e1c098322 100644 --- a/source/games/duke/src/vmexports.cpp +++ b/source/games/duke/src/vmexports.cpp @@ -575,7 +575,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, badguy, badguy) int duke_scripted(DDukeActor* act) { - return gs.actorinfo[act->spr.picnum].scriptaddress > 0; + return act->conInfo() != nullptr; } DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, scripted, duke_scripted)