- pass spawner as an actor pointer to 'lotsofstuff'.

Allows doing this without using sprite indices.
This commit is contained in:
Christoph Oelckers 2020-10-24 09:35:43 +02:00
parent a5b3681630
commit 34e39dd221
12 changed files with 40 additions and 35 deletions

View file

@ -258,15 +258,15 @@ void insertspriteq(int i)
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void lotsofstuff(spritetype* s, short n, int spawntype) void lotsofstuff(DDukeActor* actor, int n, int spawntype)
{ {
short i, j; auto s = &actor->s;
for (i = n; i > 0; i--) for (int i = n; i > 0; i--)
{ {
short r1 = krand(), r2 = krand(); // using the RANDCORRECT version from RR. int r1 = krand(), r2 = krand(); // using the RANDCORRECT version from RR.
// TRANSITIONAL RedNukem sets the spawner as owner. // TRANSITIONAL RedNukem sets the spawner as owner.
j = EGS(s->sectnum, s->x, s->y, s->z - (r2 % (47 << 8)), spawntype, -32, 8, 8, r1 & 2047, 0, 0, (short)0, 5); auto j = EGS(s->sectnum, s->x, s->y, s->z - (r2 % (47 << 8)), spawntype, -32, 8, 8, r1 & 2047, 0, 0, actor, 5);
sprite[j].cstat = krand() & 12; j->s.cstat = krand() & 12;
} }
} }

View file

@ -630,19 +630,19 @@ int movesprite_ex_d(DDukeActor* actor, int xchange, int ychange, int zchange, un
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void lotsofmoney_d(spritetype *s, short n) void lotsofmoney_d(DDukeActor *actor, short n)
{ {
lotsofstuff(s, n, MONEY); lotsofstuff(actor, n, MONEY);
} }
void lotsofmail_d(spritetype *s, short n) void lotsofmail_d(DDukeActor *actor, short n)
{ {
lotsofstuff(s, n, MAIL); lotsofstuff(actor, n, MAIL);
} }
void lotsofpaper_d(spritetype *s, short n) void lotsofpaper_d(DDukeActor *actor, short n)
{ {
lotsofstuff(s, n, PAPER); lotsofstuff(actor, n, PAPER);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View file

@ -453,9 +453,9 @@ int movesprite_ex_r(DDukeActor* actor, int xchange, int ychange, int zchange, un
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void lotsoffeathers_r(spritetype *s, short n) void lotsoffeathers_r(DDukeActor *actor, short n)
{ {
lotsofstuff(s, n, MONEY); lotsofstuff(actor, n, MONEY);
} }
@ -2468,7 +2468,7 @@ void rr_specialstats()
s->lotag--; s->lotag--;
if (s->lotag < 0) if (s->lotag < 0)
{ {
lotsoffeathers_r(&sprite[i], (krand() & 3) + 4); lotsoffeathers_r(&hittype[i], (krand() & 3) + 4);
s->lotag = 84; s->lotag = 84;
} }
break; break;

View file

@ -66,10 +66,10 @@ void addweapon_d(struct player_struct* p, int weapon);
void addweapon_r(struct player_struct* p, int weapon); void addweapon_r(struct player_struct* p, int weapon);
void hitradius_d(short i, int r, int hp1, int hp2, int hp3, int hp4); void hitradius_d(short i, int r, int hp1, int hp2, int hp3, int hp4);
void hitradius_r(short i, int r, int hp1, int hp2, int hp3, int hp4); void hitradius_r(short i, int r, int hp1, int hp2, int hp3, int hp4);
void lotsofmoney_d(spritetype* s, short n); void lotsofmoney_d(DDukeActor* s, short n);
void lotsofmail_d(spritetype* s, short n); void lotsofmail_d(DDukeActor* s, short n);
void lotsofpaper_d(spritetype* s, short n); void lotsofpaper_d(DDukeActor* s, short n);
void lotsoffeathers_r(spritetype* s, short n); void lotsoffeathers_r(DDukeActor* s, short n);
void guts_d(spritetype* s, short gtype, short n, short p); void guts_d(spritetype* s, short gtype, short n, short p);
void guts_r(spritetype* s, short gtype, short n, short p); void guts_r(spritetype* s, short gtype, short n, short p);
void gutsdir_d(spritetype* s, short gtype, short n, short p); void gutsdir_d(spritetype* s, short gtype, short n, short p);

View file

@ -89,9 +89,9 @@ struct Dispatcher
void (*addweapon)(struct player_struct *p, int weapon); void (*addweapon)(struct player_struct *p, int weapon);
void (*hitradius)(short i, int r, int hp1, int hp2, int hp3, int hp4); void (*hitradius)(short i, int r, int hp1, int hp2, int hp3, int hp4);
int (*movesprite)(int spritenum, int xchange, int ychange, int zchange, unsigned int cliptype); int (*movesprite)(int spritenum, int xchange, int ychange, int zchange, unsigned int cliptype);
void (*lotsofmoney)(spritetype *s, short n); void (*lotsofmoney)(DDukeActor *s, short n);
void (*lotsofmail)(spritetype *s, short n); void (*lotsofmail)(DDukeActor *s, short n);
void (*lotsofpaper)(spritetype *s, short n); void (*lotsofpaper)(DDukeActor *s, short n);
void (*guts)(spritetype* s, short gtype, short n, short p); void (*guts)(spritetype* s, short gtype, short n, short p);
void (*gutsdir)(spritetype* s, short gtype, short n, short p); void (*gutsdir)(spritetype* s, short gtype, short n, short p);
int (*ifhitsectors)(int sectnum); int (*ifhitsectors)(int sectnum);

View file

@ -44,7 +44,7 @@ void bounce(int i);
void movetongue(int i, int tongue, int jaw); void movetongue(int i, int tongue, int jaw);
void rpgexplode(int i, int j, const vec3_t& pos, int EXPLOSION2, int newextra, int playsound); void rpgexplode(int i, int j, const vec3_t& pos, int EXPLOSION2, int newextra, int playsound);
void moveooz(int i, int seenine, int seeninedead, int ooz, int explosion); void moveooz(int i, int seenine, int seeninedead, int ooz, int explosion);
void lotsofstuff(spritetype* s, short n, int spawntype); void lotsofstuff(DDukeActor* s, int n, int spawntype);
bool respawnmarker(int i, int yellow, int green); bool respawnmarker(int i, int yellow, int green);
bool rat(int i, bool makesound); bool rat(int i, bool makesound);
bool queball(int i, int pocket, int queball, int stripeball); bool queball(int i, int pocket, int queball, int stripeball);

View file

@ -73,6 +73,7 @@ struct ParseState
int* g_t; int* g_t;
uint8_t killit_flag; uint8_t killit_flag;
spritetype* g_sp; spritetype* g_sp;
DDukeActor *g_ac;
int* insptr; int* insptr;
int parse(void); int parse(void);
@ -1888,12 +1889,12 @@ int ParseState::parse(void)
break; break;
case concmd_money: case concmd_money:
insptr++; insptr++;
fi.lotsofmoney(g_sp,*insptr); fi.lotsofmoney(g_ac,*insptr);
insptr++; insptr++;
break; break;
case concmd_mail: case concmd_mail:
insptr++; insptr++;
fi.lotsofmail(g_sp,*insptr); fi.lotsofmail(g_ac,*insptr);
insptr++; insptr++;
break; break;
case concmd_sleeptime: case concmd_sleeptime:
@ -1903,7 +1904,7 @@ int ParseState::parse(void)
break; break;
case concmd_paper: case concmd_paper:
insptr++; insptr++;
fi.lotsofpaper(g_sp,*insptr); fi.lotsofpaper(g_ac,*insptr);
insptr++; insptr++;
break; break;
case concmd_addkills: case concmd_addkills:
@ -3674,6 +3675,7 @@ void LoadActor(int i, int p, int x)
s.g_x = x; // ?? s.g_x = x; // ??
g_sp = s.g_sp = &sprite[i]; // Pointer to sprite structure g_sp = s.g_sp = &sprite[i]; // Pointer to sprite structure
s.g_t = &hittype[i].temp_data[0]; // Sprite's 'extra' data s.g_t = &hittype[i].temp_data[0]; // Sprite's 'extra' data
s.g_ac = &hittype[i];
auto addr = tileinfo[s.g_sp->picnum].loadeventscriptptr; auto addr = tileinfo[s.g_sp->picnum].loadeventscriptptr;
if (addr == 0) return; if (addr == 0) return;
@ -3767,6 +3769,7 @@ void execute(int i,int p,int x)
s.g_x = x; // ?? s.g_x = x; // ??
g_sp = s.g_sp = &sprite[i]; // Pointer to sprite structure g_sp = s.g_sp = &sprite[i]; // Pointer to sprite structure
s.g_t = &hittype[i].temp_data[0]; // Sprite's 'extra' data s.g_t = &hittype[i].temp_data[0]; // Sprite's 'extra' data
s.g_ac = &hittype[i];
if (actorinfo[g_sp->picnum].scriptaddress == 0) return; if (actorinfo[g_sp->picnum].scriptaddress == 0) return;
s.insptr = &ScriptCode[4 + (actorinfo[g_sp->picnum].scriptaddress)]; s.insptr = &ScriptCode[4 + (actorinfo[g_sp->picnum].scriptaddress)];
@ -3864,6 +3867,7 @@ void OnEvent(int iEventID, int p, int i, int x)
s.g_p = p; /// current player ID s.g_p = p; /// current player ID
s.g_x = x; // ? s.g_x = x; // ?
s.g_sp = &sprite[i]; s.g_sp = &sprite[i];
s.g_ac = &hittype[i];
s.g_t = &hittype[i].temp_data[0]; s.g_t = &hittype[i].temp_data[0];
s.insptr = &ScriptCode[apScriptGameEvent[iEventID]]; s.insptr = &ScriptCode[apScriptGameEvent[iEventID]];

View file

@ -696,7 +696,7 @@ static void shootrpg(int i, int p, int sx, int sy, int sz, int sa, int atwith)
{ {
sprite[j].lotag = var90; sprite[j].lotag = var90;
sprite[j].hitag = 0; sprite[j].hitag = 0;
fi.lotsofmoney(&sprite[j], (krand() & 3) + 1); fi.lotsofmoney(&hittype[j], (krand() & 3) + 1);
} }
} }

View file

@ -36,6 +36,7 @@ source as it is released.
#include "ns.h" #include "ns.h"
#include "global.h" #include "global.h"
#include "sounds.h" #include "sounds.h"
#include "dukeactor.h"
using std::min; using std::min;
using std::max; using std::max;

View file

@ -816,7 +816,7 @@ void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
case ATM: case ATM:
wal->picnum = ATMBROKE; wal->picnum = ATMBROKE;
fi.lotsofmoney(&sprite[spr], 1 + (krand() & 7)); fi.lotsofmoney(&hittype[spr], 1 + (krand() & 7));
S_PlayActorSound(GLASS_HEAVYBREAK, spr); S_PlayActorSound(GLASS_HEAVYBREAK, spr);
break; break;
@ -1183,7 +1183,7 @@ void checkhitsprite_d(int i, int sn)
case STATUEFLASH: case STATUEFLASH:
case STATUE: case STATUE:
if (s->picnum == BOTTLE10) if (s->picnum == BOTTLE10)
fi.lotsofmoney(&sprite[i], 4 + (krand() & 3)); fi.lotsofmoney(&hittype[i], 4 + (krand() & 3));
else if (s->picnum == STATUE || s->picnum == STATUEFLASH) else if (s->picnum == STATUE || s->picnum == STATUEFLASH)
{ {
lotsofcolourglass(i, -1, 40); lotsofcolourglass(i, -1, 40);
@ -1526,7 +1526,7 @@ void checksectors_d(int snum)
if (chatmodeon || sprite[p->i].extra <= 0) return; if (chatmodeon || sprite[p->i].extra <= 0) return;
if (ud.cashman && PlayerInput(snum, SB_OPEN)) if (ud.cashman && PlayerInput(snum, SB_OPEN))
fi.lotsofmoney(&sprite[p->i], 2); fi.lotsofmoney(&hittype[p->i], 2);
if (p->newowner >= 0) if (p->newowner >= 0)
{ {

View file

@ -1245,7 +1245,7 @@ void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
case ATM: case ATM:
wal->picnum = ATMBROKE; wal->picnum = ATMBROKE;
fi.lotsofmoney(&sprite[spr], 1 + (krand() & 7)); fi.lotsofmoney(&hittype[spr], 1 + (krand() & 7));
S_PlayActorSound(GLASS_HEAVYBREAK, spr); S_PlayActorSound(GLASS_HEAVYBREAK, spr);
break; break;
@ -2220,7 +2220,7 @@ void checkhitsprite_r(int i, int sn)
case STATUEFLASH: case STATUEFLASH:
case STATUE: case STATUE:
if (s->picnum == BOTTLE10) if (s->picnum == BOTTLE10)
fi.lotsofmoney(&sprite[i], 4 + (krand() & 3)); fi.lotsofmoney(&hittype[i], 4 + (krand() & 3));
else if (s->picnum == STATUE || s->picnum == STATUEFLASH) else if (s->picnum == STATUE || s->picnum == STATUEFLASH)
{ {
lotsofcolourglass(i, -1, 40); lotsofcolourglass(i, -1, 40);
@ -2468,7 +2468,7 @@ void checksectors_r(int snum)
if (chatmodeon || sprite[p->i].extra <= 0) return; if (chatmodeon || sprite[p->i].extra <= 0) return;
if (ud.cashman && PlayerInput(snum, SB_OPEN)) if (ud.cashman && PlayerInput(snum, SB_OPEN))
fi.lotsofmoney(&sprite[p->i], 2); fi.lotsofmoney(&hittype[p->i], 2);
if (!(PlayerInput(snum, SB_OPEN))) if (!(PlayerInput(snum, SB_OPEN)))

View file

@ -49,8 +49,8 @@ BEGIN_DUKE_NS
short EGS(short whatsect, int s_x, int s_y, int s_z, short s_pn, signed char s_s, signed char s_xr, signed char s_yr, short s_a, short s_ve, int s_zv, short s_ow, signed char s_ss) short EGS(short whatsect, int s_x, int s_y, int s_z, short s_pn, signed char s_s, signed char s_xr, signed char s_yr, short s_a, short s_ve, int s_zv, short s_ow, signed char s_ss)
{ {
if (isRRRA() && s_ow < 0) //if (isRR() && s_ow < 0 && !force) // should never happen, the only owner-less spawn outside of map start is for the Holoduke, which is Duke only
return 0; //return 0;
int const i = insertsprite(whatsect, s_ss); int const i = insertsprite(whatsect, s_ss);