Start on Chaos Emeralds

Functional! However, you don't drop them yet.
This commit is contained in:
Sally Coolatta 2020-11-01 23:44:54 -05:00
parent 76e0102b3f
commit 91ed67bece
14 changed files with 260 additions and 285 deletions

View file

@ -6269,13 +6269,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_EMBLEM26",
// Chaos Emeralds
"S_CEMG1",
"S_CEMG2",
"S_CEMG3",
"S_CEMG4",
"S_CEMG5",
"S_CEMG6",
"S_CEMG7",
"S_EMERALD_CHAOS1",
"S_EMERALD_CHAOS2",
"S_EMERALD_CHAOS3",
"S_EMERALD_CHAOS4",
"S_EMERALD_CHAOS5",
"S_EMERALD_CHAOS6",
"S_EMERALD_CHAOS7",
// Emerald hunt shards
"S_SHRD1",
@ -9499,16 +9499,9 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_REDFLAG", // Red CTF Flag
"MT_BLUEFLAG", // Blue CTF Flag
"MT_EMBLEM",
"MT_EMERALD1",
"MT_EMERALD2",
"MT_EMERALD3",
"MT_EMERALD4",
"MT_EMERALD5",
"MT_EMERALD6",
"MT_EMERALD7",
"MT_EMERALD",
"MT_EMERHUNT", // Emerald Hunt
"MT_EMERALDSPAWN", // Emerald spawner w/ delay
"MT_FLINGEMERALD", // Lost emerald
// Springs and others
"MT_FAN",
@ -11204,13 +11197,23 @@ struct {
{"LF2_VISITNEEDED",LF2_VISITNEEDED},
// Emeralds
{"EMERALD1",EMERALD1},
{"EMERALD2",EMERALD2},
{"EMERALD3",EMERALD3},
{"EMERALD4",EMERALD4},
{"EMERALD5",EMERALD5},
{"EMERALD6",EMERALD6},
{"EMERALD7",EMERALD7},
{"EMERALD_CHAOS1",EMERALD_CHAOS1},
{"EMERALD_CHAOS2",EMERALD_CHAOS2},
{"EMERALD_CHAOS3",EMERALD_CHAOS3},
{"EMERALD_CHAOS4",EMERALD_CHAOS4},
{"EMERALD_CHAOS5",EMERALD_CHAOS5},
{"EMERALD_CHAOS6",EMERALD_CHAOS6},
{"EMERALD_CHAOS7",EMERALD_CHAOS7},
{"EMERALD_ALLCHAOS",EMERALD_ALLCHAOS},
{"EMERALD_SUPER1",EMERALD_SUPER1},
{"EMERALD_SUPER2",EMERALD_SUPER2},
{"EMERALD_SUPER3",EMERALD_SUPER3},
{"EMERALD_SUPER4",EMERALD_SUPER4},
{"EMERALD_SUPER5",EMERALD_SUPER5},
{"EMERALD_SUPER6",EMERALD_SUPER6},
{"EMERALD_SUPER7",EMERALD_SUPER7},
{"EMERALD_ALLSUPER",EMERALD_ALLSUPER},
{"EMERALD_ALL",EMERALD_ALL},
// SKINCOLOR_ doesn't include these..!
{"MAXSKINCOLORS",MAXSKINCOLORS},

View file

@ -522,15 +522,34 @@ extern UINT32 matchesplayed;
extern UINT8 stagefailed;
// Emeralds stored as bits to throw savegame hackers off.
typedef enum
{
EMERALD_CHAOS1 = 1,
EMERALD_CHAOS2 = 1<<1,
EMERALD_CHAOS3 = 1<<2,
EMERALD_CHAOS4 = 1<<3,
EMERALD_CHAOS5 = 1<<4,
EMERALD_CHAOS6 = 1<<5,
EMERALD_CHAOS7 = 1<<6,
EMERALD_ALLCHAOS = EMERALD_CHAOS1|EMERALD_CHAOS2|EMERALD_CHAOS3|EMERALD_CHAOS4|EMERALD_CHAOS5|EMERALD_CHAOS6|EMERALD_CHAOS7,
EMERALD_SUPER1 = 1<<7,
EMERALD_SUPER2 = 1<<8,
EMERALD_SUPER3 = 1<<9,
EMERALD_SUPER4 = 1<<10,
EMERALD_SUPER5 = 1<<11,
EMERALD_SUPER6 = 1<<12,
EMERALD_SUPER7 = 1<<13,
EMERALD_ALLSUPER = EMERALD_SUPER1|EMERALD_SUPER2|EMERALD_SUPER3|EMERALD_SUPER4|EMERALD_SUPER5|EMERALD_SUPER6|EMERALD_SUPER7,
EMERALD_ALL = EMERALD_ALLCHAOS|EMERALD_ALLSUPER
} emeraldflags_t;
extern UINT16 emeralds;
#define EMERALD1 1
#define EMERALD2 2
#define EMERALD3 4
#define EMERALD4 8
#define EMERALD5 16
#define EMERALD6 32
#define EMERALD7 64
#define ALL7EMERALDS(v) ((v & (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7)) == (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7))
#define ALLCHAOSEMERALDS(v) ((v & EMERALD_ALLCHAOS) == EMERALD_ALLCHAOS)
#define ALLSUPEREMERALDS(v) ((v & EMERALD_ALLSUPER) == EMERALD_ALLSUPER)
#define ALLEMERALDS(v) ((v & EMERALD_ALL) == EMERALD_ALL)
#define NUM_LUABANKS 16 // please only make this number go up between versions, never down. you'll break saves otherwise. also, must fit in UINT8
extern INT32 luabanks[NUM_LUABANKS];

View file

@ -889,7 +889,7 @@ void F_StartGameEvaluation(void)
// Just in case they're open ... somehow
M_ClearMenus(true);
goodending = (ALL7EMERALDS(emeralds));
goodending = (ALLCHAOSEMERALDS(emeralds));
gameaction = ga_nothing;
paused = false;
@ -1154,7 +1154,7 @@ static void F_CacheEnding(void)
endescp[4] = W_CachePatchName("ENDESCP4", PU_PATCH);
// so we only need to check once
if ((goodending = ALL7EMERALDS(emeralds)))
if ((goodending = ALLCHAOSEMERALDS(emeralds)))
{
endfwrk[0] = W_CachePatchName("ENDFWRK3", PU_PATCH);
endfwrk[1] = W_CachePatchName("ENDFWRK4", PU_PATCH);

View file

@ -139,7 +139,13 @@ char sprnames[NUMSPRITES + 1][5] =
"NCHP", // NiGHTS chip
"NSTR", // NiGHTS star
"EMBM", // Emblem
"CEMG", // Chaos Emeralds
"EMC1", // Chaos Emeralds
"EMC2",
"EMC3",
"EMC4",
"EMC5",
"EMC6",
"EMC7",
"SHRD", // Emerald Hunt
// Interactive Objects
@ -1896,13 +1902,13 @@ state_t states[NUMSTATES] =
{SPR_EMBM, 25, -1, {NULL}, 0, 0, S_NULL}, // S_EMBLEM26
// Chaos Emeralds
{SPR_CEMG, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG1
{SPR_CEMG, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG2
{SPR_CEMG, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG3
{SPR_CEMG, FF_FULLBRIGHT|3, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG4
{SPR_CEMG, FF_FULLBRIGHT|4, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG5
{SPR_CEMG, FF_FULLBRIGHT|5, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG6
{SPR_CEMG, FF_FULLBRIGHT|6, -1, {NULL}, 0, 0, S_NULL}, // S_CEMG7
{SPR_EMC1, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS1
{SPR_EMC2, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS2
{SPR_EMC3, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS3
{SPR_EMC4, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS4
{SPR_EMC5, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS5
{SPR_EMC6, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS6
{SPR_EMC7, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_EMERALD_CHAOS7
// Emerald hunt shards
{SPR_SHRD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SHRD1
@ -3746,14 +3752,14 @@ state_t states[NUMSTATES] =
{SPR_CAPS, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGCAPSULE
// Orbiting Chaos Emeralds/Ideya for NiGHTS
{SPR_CEMG, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM1}, // S_ORBITEM1
{SPR_CEMG, FF_FULLBRIGHT|1, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM2}, // S_ORBITEM2
{SPR_CEMG, FF_FULLBRIGHT|2, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM3}, // S_ORBITEM3
{SPR_CEMG, FF_FULLBRIGHT|3, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM4}, // S_ORBITEM4
{SPR_CEMG, FF_FULLBRIGHT|4, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM5}, // S_ORBITEM5
{SPR_CEMG, FF_FULLBRIGHT|5, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM6}, // S_ORBITEM6
{SPR_CEMG, FF_FULLBRIGHT|6, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM7}, // S_ORBITEM7
{SPR_CEMG, FF_FULLBRIGHT|7, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM8}, // S_ORBITEM8
{SPR_EMC1, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM1}, // S_ORBITEM1
{SPR_EMC2, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM2}, // S_ORBITEM2
{SPR_EMC3, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM3}, // S_ORBITEM3
{SPR_EMC4, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM4}, // S_ORBITEM4
{SPR_EMC5, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM5}, // S_ORBITEM5
{SPR_EMC6, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM6}, // S_ORBITEM6
{SPR_EMC7, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM7}, // S_ORBITEM7
{SPR_EMC1, FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBITEM8}, // S_ORBITEM8
{SPR_IDYA, FF_TRANS20|FF_FULLBRIGHT, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBIDYA1}, // S_ORBIDYA1
{SPR_IDYA, FF_TRANS20|FF_FULLBRIGHT|1, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBIDYA2}, // S_ORBIDYA2
{SPR_IDYA, FF_TRANS20|FF_FULLBRIGHT|2, 1, {A_OrbitNights}, ANG2*2, 0, S_ORBIDYA3}, // S_ORBIDYA3
@ -8197,9 +8203,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_EMERALD1
313, // doomednum
S_CEMG1, // spawnstate
{ // MT_EMERALD
-1, // doomednum
S_EMERALD_CHAOS1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
@ -8210,173 +8216,17 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD1, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
sfx_s3k2b, // deathsound
0, // speed
72*FRACUNIT, // radius
72*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_EMERALD2
314, // doomednum
S_CEMG2, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD2, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_EMERALD3
315, // doomednum
S_CEMG3, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD3, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_EMERALD4
316, // doomednum
S_CEMG4, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD4, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_EMERALD5
317, // doomednum
S_CEMG5, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD5, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_EMERALD6
318, // doomednum
S_CEMG6, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD6, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_EMERALD7
319, // doomednum
S_CEMG7, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
EMERALD7, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL, // flags
MF_SPECIAL, // flags
S_NULL // raisestate
},
@ -8434,33 +8284,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_FLINGEMERALD
-1, // doomednum
S_CEMG1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_cgot, // deathsound
60*FRACUNIT, // speed
16*FRACUNIT, // radius
48*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_SLIDEME|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_FAN
540, // doomednum
S_FAN, // spawnstate
@ -19105,7 +18928,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
{ // MT_GOTEMERALD
-1, // doomednum
S_CEMG1, // spawnstate
S_EMERALD_CHAOS1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound

View file

@ -410,7 +410,13 @@ typedef enum sprite
SPR_NCHP, // NiGHTS chip
SPR_NSTR, // NiGHTS star
SPR_EMBM, // Emblem
SPR_CEMG, // Chaos Emeralds
SPR_EMC1, // Chaos Emeralds
SPR_EMC2,
SPR_EMC3,
SPR_EMC4,
SPR_EMC5,
SPR_EMC6,
SPR_EMC7,
SPR_SHRD, // Emerald Hunt
// Interactive Objects
@ -2111,13 +2117,13 @@ typedef enum state
S_EMBLEM26,
// Chaos Emeralds
S_CEMG1,
S_CEMG2,
S_CEMG3,
S_CEMG4,
S_CEMG5,
S_CEMG6,
S_CEMG7,
S_EMERALD_CHAOS1,
S_EMERALD_CHAOS2,
S_EMERALD_CHAOS3,
S_EMERALD_CHAOS4,
S_EMERALD_CHAOS5,
S_EMERALD_CHAOS6,
S_EMERALD_CHAOS7,
// Emerald hunt shards
S_SHRD1,
@ -5381,16 +5387,9 @@ typedef enum mobj_type
MT_REDFLAG, // Red CTF Flag
MT_BLUEFLAG, // Blue CTF Flag
MT_EMBLEM,
MT_EMERALD1,
MT_EMERALD2,
MT_EMERALD3,
MT_EMERALD4,
MT_EMERALD5,
MT_EMERALD6,
MT_EMERALD7,
MT_EMERALD,
MT_EMERHUNT, // Emerald Hunt
MT_EMERALDSPAWN, // Emerald spawner w/ delay
MT_FLINGEMERALD, // Lost emerald
// Springs and others
MT_FAN,

View file

@ -277,24 +277,85 @@ void K_CheckBumpers(void)
P_DoPlayerExit(&players[i]);
}
mobj_t *K_SpawnChaosEmerald(mobj_t *parent, angle_t angle, SINT8 flip, UINT32 emeraldType)
{
boolean validEmerald = true;
mobj_t *emerald = P_SpawnMobjFromMobj(parent, 0, 0, 0, MT_EMERALD);
emerald->angle = angle;
P_Thrust(emerald,
FixedAngle(P_RandomFixed() * 180) + angle,
16*mapobjectscale);
emerald->momz = flip * 3 * mapobjectscale;
if (emerald->eflags & MFE_UNDERWATER)
emerald->momz = (117 * emerald->momz) / 200;
emerald->threshold = 10;
switch (emeraldType)
{
case EMERALD_CHAOS1:
P_SetMobjState(emerald, S_EMERALD_CHAOS1);
break;
case EMERALD_CHAOS2:
P_SetMobjState(emerald, S_EMERALD_CHAOS2);
break;
case EMERALD_CHAOS3:
P_SetMobjState(emerald, S_EMERALD_CHAOS3);
break;
case EMERALD_CHAOS4:
P_SetMobjState(emerald, S_EMERALD_CHAOS4);
break;
case EMERALD_CHAOS5:
P_SetMobjState(emerald, S_EMERALD_CHAOS5);
break;
case EMERALD_CHAOS6:
P_SetMobjState(emerald, S_EMERALD_CHAOS6);
break;
case EMERALD_CHAOS7:
P_SetMobjState(emerald, S_EMERALD_CHAOS7);
break;
default:
CONS_Printf("Invalid emerald type %d\n", emeraldType);
validEmerald = false;
break;
}
if (validEmerald == true)
{
emerald->extravalue1 = emeraldType;
}
return emerald;
}
void K_RunPaperItemSpawners(void)
{
const boolean overtime = (battleovertime.enabled >= 10*TICRATE);
tic_t interval = 8*TICRATE;
UINT32 emeraldsSpawned = 0;
if (leveltime < starttime)
{
// Round hasn't started yet!
return;
}
if ((battleovertime.enabled > 0) && (battleovertime.radius < 256*mapobjectscale))
{
// Barrier has closed in too much
return;
}
if (overtime == true)
{
// Double frequency of items
interval /= 2;
// Even if this isn't true, we pretend it is, because it's too late to do anything about it :p
emeraldsSpawned = EMERALD_ALLCHAOS;
}
if (((leveltime - starttime) % interval) != 0)
@ -315,18 +376,19 @@ void K_RunPaperItemSpawners(void)
else
{
UINT8 pcount = 0;
UINT8 i;
INT16 i;
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i] || players[i].spectator
|| players[i].exiting > 0
|| players[i].eliminated)
if (!playeringame[i] || players[i].spectator)
{
continue;
}
if ((gametyperules & GTR_BUMPERS) && players[i].bumpers <= 0)
emeraldsSpawned |= players[i].powers[pw_emeralds];
if ((players[i].exiting > 0 || players[i].eliminated)
|| ((gametyperules & GTR_BUMPERS) && players[i].bumpers <= 0))
{
continue;
}
@ -337,10 +399,13 @@ void K_RunPaperItemSpawners(void)
if (pcount > 0)
{
#define MAXITEM 64
UINT16 item = 0;
UINT8 item = 0;
mobj_t *spotList[MAXITEM];
boolean spotUsed[MAXITEM];
UINT32 firstUnspawnedEmerald = 0;
INT16 starti = 0;
thinker_t *th;
mobj_t *mo;
@ -348,9 +413,6 @@ void K_RunPaperItemSpawners(void)
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
{
if (item >= MAXITEM)
break;
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
continue;
@ -358,9 +420,16 @@ void K_RunPaperItemSpawners(void)
if (mo->type == MT_PAPERITEMSPOT)
{
if (item >= MAXITEM)
continue;
spotList[item] = mo;
item++;
}
else if (mo->type == MT_EMERALD)
{
emeraldsSpawned |= mo->extravalue1;
}
}
if (item <= 0)
@ -368,7 +437,19 @@ void K_RunPaperItemSpawners(void)
return;
}
for (i = 0; i < min(item, pcount); i++)
for (i = 0; i < 7; i++)
{
UINT32 emeraldFlag = (1 << i);
if (!(emeraldsSpawned & emeraldFlag))
{
firstUnspawnedEmerald = emeraldFlag;
starti = -1;
break;
}
}
for (i = starti; i < min(item, pcount); i++)
{
UINT8 r = P_RandomRange(0, item-1);
UINT8 recursion = 0;
@ -387,11 +468,23 @@ void K_RunPaperItemSpawners(void)
flip = P_MobjFlip(spotList[r]);
drop = K_CreatePaperItem(
spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip),
FixedAngle(P_RandomRange(0, 359) * FRACUNIT), flip,
0, 0
);
// When -1, we're spawning a Chaos Emerald.
if (i == -1)
{
drop = K_SpawnChaosEmerald(
spotList[r],
FixedAngle(P_RandomRange(0, 359) * FRACUNIT), flip,
firstUnspawnedEmerald
);
}
else
{
drop = K_CreatePaperItem(
spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip),
FixedAngle(P_RandomRange(0, 359) * FRACUNIT), flip,
0, 0
);
}
K_FlipFromObject(drop, spotList[r]);
spotUsed[r] = true;

View file

@ -20,6 +20,7 @@ boolean K_IsPlayerWanted(player_t *player);
void K_CalculateBattleWanted(void);
void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount);
void K_CheckBumpers(void);
mobj_t *K_SpawnChaosEmerald(mobj_t *parent, angle_t angle, SINT8 flip, UINT32 emeraldType);
void K_RunPaperItemSpawners(void);
void K_RunBattleOvertime(void);
void K_SetupMovingCapsule(mapthing_t *mt, mobj_t *mobj);

View file

@ -14,7 +14,7 @@
//#include "fastcmp.h"
#include "tables.h"
#include "p_local.h"
#include "doomstat.h" // for ALL7EMERALDS
#include "doomstat.h" // for ALLCHAOSEMERALDS
#include "lua_script.h"
#include "lua_libs.h"
@ -162,7 +162,7 @@ static int lib_getsecspecial(lua_State *L)
static int lib_all7emeralds(lua_State *L)
{
lua_pushboolean(L, ALL7EMERALDS(luaL_checkinteger(L, 1)));
lua_pushboolean(L, ALLCHAOSEMERALDS(luaL_checkinteger(L, 1)));
return 1;
}

View file

@ -771,12 +771,13 @@ void Command_Savecheckpoint_f(void)
}
// Like M_GetAllEmeralds() but for console devmode junkies.
/*void Command_Getallemeralds_f(void)
/*
void Command_Getallemeralds_f(void)
{
REQUIRE_SINGLEPLAYER;
REQUIRE_PANDORA;
emeralds = ((EMERALD7)*2)-1;
emeralds = EMERALD_ALL;
CONS_Printf(M_GetText("You now have all 7 emeralds.\n"));
}
@ -788,7 +789,8 @@ void Command_Resetemeralds_f(void)
emeralds = 0;
CONS_Printf(M_GetText("Emeralds reset to zero.\n"));
}*/
}
*/
void Command_Devmode_f(void)
{

View file

@ -6374,7 +6374,7 @@ static void M_GetAllEmeralds(INT32 choice)
{
(void)choice;
emeralds = ((EMERALD7)*2)-1;
emeralds = EMERALD_ALL;
M_StartMessage(M_GetText("You now have all 7 emeralds.\nUse them wisely.\nWith great power comes great ring drain.\n"),NULL,MM_NOTHING);
G_SetGameModified(multiplayer, true);

View file

@ -231,7 +231,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_SetObjectMomZ(player->mo, 12<<FRACBITS, false);
P_InstaThrust(player->mo, player->mo->angle, 20<<FRACBITS);
return;
case MT_RANDOMITEM: // SRB2kart
case MT_RANDOMITEM:
if (!P_CanPickupItem(player, 1))
return;
@ -413,10 +413,41 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_DamageMobj(player->mo, special, special->target, 1, DMG_NORMAL);
}
return;
/*case MT_EERIEFOG:
case MT_EMERALD:
if (!P_CanPickupItem(player, 0))
return;
if (special->threshold > 0)
return;
player->powers[pw_emeralds] |= special->extravalue1;
if (ALLCHAOSEMERALDS(player->powers[pw_emeralds]))
{
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i] || players[i].spectator)
{
continue;
}
if (&players[i] == player)
{
continue;
}
players[i].bumpers = 0;
}
K_CheckBumpers();
}
break;
/*
case MT_EERIEFOG:
special->frame &= ~FF_TRANS80;
special->frame |= FF_TRANS90;
return;*/
return;
*/
case MT_SMK_MOLE:
if (special->target && !P_MobjWasRemoved(special->target))
return;

View file

@ -1130,7 +1130,6 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
case MT_FLINGCOIN:
case MT_FLINGBLUESPHERE:
case MT_FLINGNIGHTSCHIP:
case MT_FLINGEMERALD:
case MT_BOUNCERING:
case MT_RAILRING:
case MT_INFINITYRING:
@ -2082,6 +2081,7 @@ boolean P_ZMovement(mobj_t *mo)
case MT_BALLHOG:
case MT_SSMINE:
case MT_BUBBLESHIELDTRAP:
case MT_EMERALD:
// Remove stuff from death pits.
if (P_CheckDeathPitCollide(mo))
{
@ -6384,6 +6384,10 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
S_StartSound(mobj, sfx_s3k4e);
mobj->health--;
break;
case MT_EMERALD:
if (mobj->threshold > 0)
mobj->threshold--;
break;
case MT_DRIFTEXPLODE:
if (!mobj->target || !mobj->target->health)
{
@ -8566,7 +8570,7 @@ void P_MobjThinker(mobj_t *mobj)
|| mobj->type == MT_FLINGCOIN
|| mobj->type == MT_FLINGBLUESPHERE
|| mobj->type == MT_FLINGNIGHTSCHIP
|| mobj->type == MT_FLINGEMERALD
|| mobj->type == MT_EMERALD
|| mobj->type == MT_BIGTUMBLEWEED
|| mobj->type == MT_LITTLETUMBLEWEED
|| mobj->type == MT_CANNONBALLDECOR
@ -8873,6 +8877,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
case MT_SINK:
case MT_ROCKETSNEAKER:
case MT_SPB:
case MT_EMERALD:
thing->shadowscale = 3*FRACUNIT/2;
break;
case MT_BANANA_SHIELD:

View file

@ -530,7 +530,6 @@ boolean P_ZMovement(mobj_t *mo);
void P_RingZMovement(mobj_t *mo);
boolean P_SceneryZMovement(mobj_t *mo);
void P_PlayerZMovement(mobj_t *mo);
void P_EmeraldManager(void);
extern INT32 modulothing;

View file

@ -1612,7 +1612,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
{
if (GETSECSPECIAL(caller->special, 2) == 6)
{
if (!(ALL7EMERALDS(emeralds)))
if (!(ALLCHAOSEMERALDS(emeralds)))
return false;
}