mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-04 04:36:21 +00:00
Add a few RNG classes
- PR_ITEM_ROULETTE: Used for item results - PR_ITEM_RINGS: Flung ring direction - PR_ITEM_SHRINK: Shrink gun offsets - PR_PLAYERSTARTS: Battle mode player starts - PR_TERRAIN: TERRAIN particles - PR_DECORATION: Generic decoration - PR_VOICES: Player voice sounds
This commit is contained in:
parent
a60d4a13a1
commit
1563660a39
7 changed files with 122 additions and 182 deletions
|
|
@ -2546,7 +2546,7 @@ mapthing_t *G_FindTeamStart(INT32 playernum)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if ((!players[playernum].ctfteam && numredctfstarts && (!numbluectfstarts || P_RandomChance(PR_UNDEFINED, FRACUNIT/2))) || players[playernum].ctfteam == 1) //red
|
||||
if ((!players[playernum].ctfteam && numredctfstarts && (!numbluectfstarts || P_RandomChance(PR_PLAYERSTARTS, FRACUNIT/2))) || players[playernum].ctfteam == 1) //red
|
||||
{
|
||||
if (!numredctfstarts)
|
||||
{
|
||||
|
|
@ -2557,7 +2557,7 @@ mapthing_t *G_FindTeamStart(INT32 playernum)
|
|||
|
||||
for (j = 0; j < 32; j++)
|
||||
{
|
||||
i = P_RandomKey(PR_UNDEFINED, numredctfstarts);
|
||||
i = P_RandomKey(PR_PLAYERSTARTS, numredctfstarts);
|
||||
if (G_CheckSpot(playernum, redctfstarts[i]))
|
||||
return redctfstarts[i];
|
||||
}
|
||||
|
|
@ -2577,7 +2577,7 @@ mapthing_t *G_FindTeamStart(INT32 playernum)
|
|||
|
||||
for (j = 0; j < 32; j++)
|
||||
{
|
||||
i = P_RandomKey(PR_UNDEFINED, numbluectfstarts);
|
||||
i = P_RandomKey(PR_PLAYERSTARTS, numbluectfstarts);
|
||||
if (G_CheckSpot(playernum, bluectfstarts[i]))
|
||||
return bluectfstarts[i];
|
||||
}
|
||||
|
|
@ -2598,7 +2598,7 @@ mapthing_t *G_FindBattleStart(INT32 playernum)
|
|||
{
|
||||
for (j = 0; j < 64; j++)
|
||||
{
|
||||
i = P_RandomKey(PR_UNDEFINED, numdmstarts);
|
||||
i = P_RandomKey(PR_PLAYERSTARTS, numdmstarts);
|
||||
if (G_CheckSpot(playernum, deathmatchstarts[i]))
|
||||
return deathmatchstarts[i];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ mobj_t *K_SpawnChaosEmerald(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT
|
|||
mobj_t *overlay;
|
||||
|
||||
P_Thrust(emerald,
|
||||
FixedAngle(P_RandomFixed(PR_UNDEFINED) * 180) + angle,
|
||||
FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle,
|
||||
24 * mapobjectscale);
|
||||
|
||||
emerald->momz = flip * 24 * mapobjectscale;
|
||||
|
|
@ -268,8 +268,8 @@ mobj_t *K_SpawnSphereBox(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 f
|
|||
|
||||
P_InitAngle(drop, angle);
|
||||
P_Thrust(drop,
|
||||
FixedAngle(P_RandomFixed(PR_UNDEFINED) * 180) + angle,
|
||||
P_RandomRange(PR_UNDEFINED, 4, 12) * mapobjectscale);
|
||||
FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle,
|
||||
P_RandomRange(PR_ITEM_ROULETTE, 4, 12) * mapobjectscale);
|
||||
|
||||
drop->momz = flip * 12 * mapobjectscale;
|
||||
if (drop->eflags & MFE_UNDERWATER)
|
||||
|
|
@ -412,7 +412,7 @@ void K_RunPaperItemSpawners(void)
|
|||
{
|
||||
K_SpawnChaosEmerald(
|
||||
battleovertime.x, battleovertime.y, battleovertime.z + (128 * mapobjectscale * flip),
|
||||
FixedAngle(P_RandomRange(PR_UNDEFINED, 0, 359) * FRACUNIT), flip,
|
||||
FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip,
|
||||
firstUnspawnedEmerald
|
||||
);
|
||||
}
|
||||
|
|
@ -420,7 +420,7 @@ void K_RunPaperItemSpawners(void)
|
|||
{
|
||||
K_CreatePaperItem(
|
||||
battleovertime.x, battleovertime.y, battleovertime.z + (128 * mapobjectscale * flip),
|
||||
FixedAngle(P_RandomRange(PR_UNDEFINED, 0, 359) * FRACUNIT), flip,
|
||||
FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip,
|
||||
0, 0
|
||||
);
|
||||
|
||||
|
|
@ -428,7 +428,7 @@ void K_RunPaperItemSpawners(void)
|
|||
{
|
||||
K_SpawnSphereBox(
|
||||
battleovertime.x, battleovertime.y, battleovertime.z + (128 * mapobjectscale * flip),
|
||||
FixedAngle(P_RandomRange(PR_UNDEFINED, 0, 359) * FRACUNIT), flip,
|
||||
FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip,
|
||||
10
|
||||
);
|
||||
}
|
||||
|
|
@ -509,7 +509,7 @@ void K_RunPaperItemSpawners(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
key = P_RandomKey(PR_UNDEFINED, spotCount);
|
||||
key = P_RandomKey(PR_ITEM_ROULETTE, spotCount);
|
||||
}
|
||||
|
||||
r = spotMap[key];
|
||||
|
|
@ -523,7 +523,7 @@ void K_RunPaperItemSpawners(void)
|
|||
{
|
||||
drop = K_SpawnChaosEmerald(
|
||||
spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip),
|
||||
FixedAngle(P_RandomRange(PR_UNDEFINED, 0, 359) * FRACUNIT), flip,
|
||||
FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip,
|
||||
firstUnspawnedEmerald
|
||||
);
|
||||
}
|
||||
|
|
@ -533,7 +533,7 @@ void K_RunPaperItemSpawners(void)
|
|||
{
|
||||
drop = K_SpawnSphereBox(
|
||||
spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip),
|
||||
FixedAngle(P_RandomRange(PR_UNDEFINED, 0, 359) * FRACUNIT), flip,
|
||||
FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip,
|
||||
10
|
||||
);
|
||||
K_FlipFromObject(drop, spotList[r]);
|
||||
|
|
@ -541,7 +541,7 @@ void K_RunPaperItemSpawners(void)
|
|||
|
||||
drop = K_CreatePaperItem(
|
||||
spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip),
|
||||
FixedAngle(P_RandomRange(PR_UNDEFINED, 0, 359) * FRACUNIT), flip,
|
||||
FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip,
|
||||
0, 0
|
||||
);
|
||||
}
|
||||
|
|
|
|||
214
src/k_kart.c
214
src/k_kart.c
|
|
@ -1086,7 +1086,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||
if (!(gametyperules & GTR_SPHERES) && mashed && player->rings < 0 && cv_superring.value)
|
||||
{
|
||||
INT32 debtamount = min(20, abs(player->rings));
|
||||
if (P_RandomChance(PR_UNDEFINED, (debtamount*FRACUNIT)/20))
|
||||
if (P_RandomChance(PR_ITEM_ROULETTE, (debtamount*FRACUNIT)/20))
|
||||
{
|
||||
K_KartGetItemResult(player, KITEM_SUPERRING);
|
||||
player->karthud[khud_itemblink] = TICRATE;
|
||||
|
|
@ -1136,7 +1136,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||
// Award the player whatever power is rolled
|
||||
if (totalspawnchance > 0)
|
||||
{
|
||||
totalspawnchance = P_RandomKey(PR_UNDEFINED, totalspawnchance);
|
||||
totalspawnchance = P_RandomKey(PR_ITEM_ROULETTE, totalspawnchance);
|
||||
for (i = 0; i < NUMKARTRESULTS && spawnchance[i] <= totalspawnchance; i++);
|
||||
|
||||
K_KartGetItemResult(player, i);
|
||||
|
|
@ -1720,9 +1720,9 @@ static void K_DrawDraftCombiring(player_t *player, player_t *victim, fixed_t cur
|
|||
{
|
||||
if (offset == 0)
|
||||
{
|
||||
mobj_t *band = P_SpawnMobj(curx + (P_RandomRange(PR_UNDEFINED, -12, 12)*mapobjectscale),
|
||||
cury + (P_RandomRange(PR_UNDEFINED, -12, 12)*mapobjectscale),
|
||||
curz + (P_RandomRange(PR_UNDEFINED, 24, 48)*mapobjectscale),
|
||||
mobj_t *band = P_SpawnMobj(curx + (P_RandomRange(PR_DECORATION, -12, 12)*mapobjectscale),
|
||||
cury + (P_RandomRange(PR_DECORATION, -12, 12)*mapobjectscale),
|
||||
curz + (P_RandomRange(PR_DECORATION, 24, 48)*mapobjectscale),
|
||||
MT_SIGNSPARKLE);
|
||||
|
||||
if (maxdist == 0)
|
||||
|
|
@ -2191,7 +2191,7 @@ void K_SpawnDriftBoostClip(player_t *player)
|
|||
clip->momz += momz;
|
||||
|
||||
P_InstaThrust(clip, player->mo->angle +
|
||||
P_RandomFlip(P_RandomRange(PR_UNDEFINED, FRACUNIT/2, FRACUNIT)),
|
||||
P_RandomFlip(P_RandomRange(PR_DECORATION, FRACUNIT/2, FRACUNIT)),
|
||||
FixedMul(scale, player->speed));
|
||||
}
|
||||
|
||||
|
|
@ -2211,9 +2211,9 @@ void K_SpawnDriftBoostClipSpark(mobj_t *clip)
|
|||
|
||||
void K_SpawnNormalSpeedLines(player_t *player)
|
||||
{
|
||||
mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(PR_UNDEFINED,-36,36) * player->mo->scale),
|
||||
player->mo->y + (P_RandomRange(PR_UNDEFINED,-36,36) * player->mo->scale),
|
||||
player->mo->z + (player->mo->height/2) + (P_RandomRange(PR_UNDEFINED,-20,20) * player->mo->scale),
|
||||
mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(PR_DECORATION,-36,36) * player->mo->scale),
|
||||
player->mo->y + (P_RandomRange(PR_DECORATION,-36,36) * player->mo->scale),
|
||||
player->mo->z + (player->mo->height/2) + (P_RandomRange(PR_DECORATION,-20,20) * player->mo->scale),
|
||||
MT_FASTLINE);
|
||||
|
||||
P_SetTarget(&fast->target, player->mo);
|
||||
|
|
@ -2261,9 +2261,9 @@ void K_SpawnNormalSpeedLines(player_t *player)
|
|||
void K_SpawnInvincibilitySpeedLines(mobj_t *mo)
|
||||
{
|
||||
mobj_t *fast = P_SpawnMobjFromMobj(mo,
|
||||
P_RandomRange(PR_UNDEFINED, -48, 48) * FRACUNIT,
|
||||
P_RandomRange(PR_UNDEFINED, -48, 48) * FRACUNIT,
|
||||
P_RandomRange(PR_UNDEFINED, 0, 64) * FRACUNIT,
|
||||
P_RandomRange(PR_DECORATION, -48, 48) * FRACUNIT,
|
||||
P_RandomRange(PR_DECORATION, -48, 48) * FRACUNIT,
|
||||
P_RandomRange(PR_DECORATION, 0, 64) * FRACUNIT,
|
||||
MT_FASTLINE);
|
||||
P_SetMobjState(fast, S_KARTINVLINES1);
|
||||
|
||||
|
|
@ -2321,9 +2321,9 @@ static void K_SpawnGrowShrinkParticles(mobj_t *mo, INT32 timer)
|
|||
|
||||
particle = P_SpawnMobjFromMobj(
|
||||
mo,
|
||||
P_RandomRange(PR_UNDEFINED, -32, 32) * FRACUNIT,
|
||||
P_RandomRange(PR_UNDEFINED, -32, 32) * FRACUNIT,
|
||||
(P_RandomRange(PR_UNDEFINED, 0, 24) + (shrink ? 48 : 0)) * FRACUNIT,
|
||||
P_RandomRange(PR_DECORATION, -32, 32) * FRACUNIT,
|
||||
P_RandomRange(PR_DECORATION, -32, 32) * FRACUNIT,
|
||||
(P_RandomRange(PR_DECORATION, 0, 24) + (shrink ? 48 : 0)) * FRACUNIT,
|
||||
MT_GROW_PARTICLE
|
||||
);
|
||||
|
||||
|
|
@ -2849,7 +2849,7 @@ static void K_RegularVoiceTimers(player_t *player)
|
|||
|
||||
void K_PlayAttackTaunt(mobj_t *source)
|
||||
{
|
||||
sfxenum_t pick = P_RandomKey(PR_UNDEFINED, 2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
boolean tasteful = (!source->player || !source->player->karthud[khud_tauntvoices]);
|
||||
|
||||
if (cv_kartvoices.value && (tasteful || cv_kartvoices.value == 2))
|
||||
|
|
@ -2863,7 +2863,7 @@ void K_PlayAttackTaunt(mobj_t *source)
|
|||
|
||||
void K_PlayBoostTaunt(mobj_t *source)
|
||||
{
|
||||
sfxenum_t pick = P_RandomKey(PR_UNDEFINED, 2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
boolean tasteful = (!source->player || !source->player->karthud[khud_tauntvoices]);
|
||||
|
||||
if (cv_kartvoices.value && (tasteful || cv_kartvoices.value == 2))
|
||||
|
|
@ -2897,7 +2897,7 @@ void K_PlayOvertakeSound(mobj_t *source)
|
|||
|
||||
void K_PlayPainSound(mobj_t *source, mobj_t *other)
|
||||
{
|
||||
sfxenum_t pick = P_RandomKey(PR_UNDEFINED, 2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
|
||||
sfxenum_t sfx_id = ((skin_t *)source->skin)->soundsid[S_sfx[sfx_khurt1 + pick].skinsound];
|
||||
boolean alwaysHear = false;
|
||||
|
|
@ -4148,18 +4148,18 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color)
|
|||
dust->scalespeed = source->scale/12;
|
||||
P_InstaThrust(dust, dust->angle, FixedMul(20*FRACUNIT, source->scale));
|
||||
|
||||
truc = P_SpawnMobj(source->x + P_RandomRange(PR_UNDEFINED, -radius, radius)*FRACUNIT,
|
||||
source->y + P_RandomRange(PR_UNDEFINED, -radius, radius)*FRACUNIT,
|
||||
source->z + P_RandomRange(PR_UNDEFINED, 0, height)*FRACUNIT, MT_BOOMEXPLODE);
|
||||
truc = P_SpawnMobj(source->x + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT,
|
||||
source->y + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT,
|
||||
source->z + P_RandomRange(PR_EXPLOSION, 0, height)*FRACUNIT, MT_BOOMEXPLODE);
|
||||
K_MatchGenericExtraFlags(truc, source);
|
||||
P_SetScale(truc, source->scale);
|
||||
truc->destscale = source->scale*6;
|
||||
truc->scalespeed = source->scale/12;
|
||||
speed = FixedMul(10*FRACUNIT, source->scale)>>FRACBITS;
|
||||
truc->momx = P_RandomRange(PR_UNDEFINED, -speed, speed)*FRACUNIT;
|
||||
truc->momy = P_RandomRange(PR_UNDEFINED, -speed, speed)*FRACUNIT;
|
||||
truc->momx = P_RandomRange(PR_EXPLOSION, -speed, speed)*FRACUNIT;
|
||||
truc->momy = P_RandomRange(PR_EXPLOSION, -speed, speed)*FRACUNIT;
|
||||
speed = FixedMul(20*FRACUNIT, source->scale)>>FRACBITS;
|
||||
truc->momz = P_RandomRange(PR_UNDEFINED, -speed, speed)*FRACUNIT*P_MobjFlip(truc);
|
||||
truc->momz = P_RandomRange(PR_EXPLOSION, -speed, speed)*FRACUNIT*P_MobjFlip(truc);
|
||||
if (truc->eflags & MFE_UNDERWATER)
|
||||
truc->momz = (117 * truc->momz) / 200;
|
||||
truc->color = color;
|
||||
|
|
@ -4167,30 +4167,30 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color)
|
|||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
dust = P_SpawnMobj(source->x + P_RandomRange(PR_UNDEFINED, -radius, radius)*FRACUNIT,
|
||||
source->y + P_RandomRange(PR_UNDEFINED, -radius, radius)*FRACUNIT,
|
||||
source->z + P_RandomRange(PR_UNDEFINED, 0, height)*FRACUNIT, MT_SMOKE);
|
||||
dust = P_SpawnMobj(source->x + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT,
|
||||
source->y + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT,
|
||||
source->z + P_RandomRange(PR_EXPLOSION, 0, height)*FRACUNIT, MT_SMOKE);
|
||||
P_SetMobjState(dust, S_OPAQUESMOKE1);
|
||||
P_SetScale(dust, source->scale);
|
||||
dust->destscale = source->scale*10;
|
||||
dust->scalespeed = source->scale/12;
|
||||
dust->tics = 30;
|
||||
dust->momz = P_RandomRange(PR_UNDEFINED, FixedMul(3*FRACUNIT, source->scale)>>FRACBITS, FixedMul(7*FRACUNIT, source->scale)>>FRACBITS)*FRACUNIT;
|
||||
dust->momz = P_RandomRange(PR_EXPLOSION, FixedMul(3*FRACUNIT, source->scale)>>FRACBITS, FixedMul(7*FRACUNIT, source->scale)>>FRACBITS)*FRACUNIT;
|
||||
|
||||
truc = P_SpawnMobj(source->x + P_RandomRange(PR_UNDEFINED, -radius, radius)*FRACUNIT,
|
||||
source->y + P_RandomRange(PR_UNDEFINED, -radius, radius)*FRACUNIT,
|
||||
source->z + P_RandomRange(PR_UNDEFINED, 0, height)*FRACUNIT, MT_BOOMPARTICLE);
|
||||
truc = P_SpawnMobj(source->x + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT,
|
||||
source->y + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT,
|
||||
source->z + P_RandomRange(PR_EXPLOSION, 0, height)*FRACUNIT, MT_BOOMPARTICLE);
|
||||
K_MatchGenericExtraFlags(truc, source);
|
||||
P_SetScale(truc, source->scale);
|
||||
truc->destscale = source->scale*5;
|
||||
truc->scalespeed = source->scale/12;
|
||||
speed = FixedMul(20*FRACUNIT, source->scale)>>FRACBITS;
|
||||
truc->momx = P_RandomRange(PR_UNDEFINED, -speed, speed)*FRACUNIT;
|
||||
truc->momy = P_RandomRange(PR_UNDEFINED, -speed, speed)*FRACUNIT;
|
||||
truc->momx = P_RandomRange(PR_EXPLOSION, -speed, speed)*FRACUNIT;
|
||||
truc->momy = P_RandomRange(PR_EXPLOSION, -speed, speed)*FRACUNIT;
|
||||
speed = FixedMul(15*FRACUNIT, source->scale)>>FRACBITS;
|
||||
speed2 = FixedMul(45*FRACUNIT, source->scale)>>FRACBITS;
|
||||
truc->momz = P_RandomRange(PR_UNDEFINED, speed, speed2)*FRACUNIT*P_MobjFlip(truc);
|
||||
if (P_RandomChance(PR_UNDEFINED, FRACUNIT/2))
|
||||
truc->momz = P_RandomRange(PR_EXPLOSION, speed, speed2)*FRACUNIT*P_MobjFlip(truc);
|
||||
if (P_RandomChance(PR_EXPLOSION, FRACUNIT/2))
|
||||
truc->momz = -truc->momz;
|
||||
if (truc->eflags & MFE_UNDERWATER)
|
||||
truc->momz = (117 * truc->momz) / 200;
|
||||
|
|
@ -4798,9 +4798,9 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
|||
|
||||
//CONS_Printf("%d\n", index);
|
||||
|
||||
newx = mo->x + (P_RandomRange(PR_UNDEFINED, -rad, rad)*FRACUNIT);
|
||||
newy = mo->y + (P_RandomRange(PR_UNDEFINED, -rad, rad)*FRACUNIT);
|
||||
newz = mo->z + (P_RandomRange(PR_UNDEFINED, 0, mo->height>>FRACBITS)*FRACUNIT);
|
||||
newx = mo->x + (P_RandomRange(PR_DECORATION, -rad, rad)*FRACUNIT);
|
||||
newy = mo->y + (P_RandomRange(PR_DECORATION, -rad, rad)*FRACUNIT);
|
||||
newz = mo->z + (P_RandomRange(PR_DECORATION, 0, mo->height>>FRACBITS)*FRACUNIT);
|
||||
|
||||
sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL);
|
||||
|
||||
|
|
@ -4810,8 +4810,8 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
|||
//CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT);
|
||||
|
||||
sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose.
|
||||
sparkle->extravalue2 = P_RandomRange(PR_UNDEFINED, 0, 1) ? 1 : -1; // Rotation direction?
|
||||
sparkle->cvmem = P_RandomRange(PR_UNDEFINED, -25, 25)*mo->scale; // Vertical "angle"
|
||||
sparkle->extravalue2 = P_RandomRange(PR_DECORATION, 0, 1) ? 1 : -1; // Rotation direction?
|
||||
sparkle->cvmem = P_RandomRange(PR_DECORATION, -25, 25)*mo->scale; // Vertical "angle"
|
||||
|
||||
K_FlipFromObject(sparkle, mo);
|
||||
P_SetTarget(&sparkle->target, mo);
|
||||
|
|
@ -4849,8 +4849,8 @@ void K_SpawnWipeoutTrail(mobj_t *mo)
|
|||
else
|
||||
aoff += ANGLE_45;
|
||||
|
||||
dust = P_SpawnMobj(mo->x + FixedMul(24*mo->scale, FINECOSINE(aoff>>ANGLETOFINESHIFT)) + (P_RandomRange(PR_UNDEFINED,-8,8) << FRACBITS),
|
||||
mo->y + FixedMul(24*mo->scale, FINESINE(aoff>>ANGLETOFINESHIFT)) + (P_RandomRange(PR_UNDEFINED,-8,8) << FRACBITS),
|
||||
dust = P_SpawnMobj(mo->x + FixedMul(24*mo->scale, FINECOSINE(aoff>>ANGLETOFINESHIFT)) + (P_RandomRange(PR_DECORATION,-8,8) << FRACBITS),
|
||||
mo->y + FixedMul(24*mo->scale, FINESINE(aoff>>ANGLETOFINESHIFT)) + (P_RandomRange(PR_DECORATION,-8,8) << FRACBITS),
|
||||
mo->z, MT_WIPEOUTTRAIL);
|
||||
|
||||
P_SetTarget(&dust->target, mo);
|
||||
|
|
@ -4988,13 +4988,13 @@ void K_DriftDustHandling(mobj_t *spawner)
|
|||
|
||||
if (anglediff > ANG10*4) // Trying to turn further than 40 degrees
|
||||
{
|
||||
fixed_t spawnx = P_RandomRange(PR_UNDEFINED, -spawnrange, spawnrange) << FRACBITS;
|
||||
fixed_t spawny = P_RandomRange(PR_UNDEFINED, -spawnrange, spawnrange) << FRACBITS;
|
||||
fixed_t spawnx = P_RandomRange(PR_DECORATION, -spawnrange, spawnrange) << FRACBITS;
|
||||
fixed_t spawny = P_RandomRange(PR_DECORATION, -spawnrange, spawnrange) << FRACBITS;
|
||||
INT32 speedrange = 2;
|
||||
mobj_t *dust = P_SpawnMobj(spawner->x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST);
|
||||
dust->momx = FixedMul(spawner->momx + (P_RandomRange(PR_UNDEFINED, -speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4);
|
||||
dust->momy = FixedMul(spawner->momy + (P_RandomRange(PR_UNDEFINED, -speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4);
|
||||
dust->momz = P_MobjFlip(spawner) * (P_RandomRange(PR_UNDEFINED, 1, 4) * (spawner->scale));
|
||||
dust->momx = FixedMul(spawner->momx + (P_RandomRange(PR_DECORATION, -speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4);
|
||||
dust->momy = FixedMul(spawner->momy + (P_RandomRange(PR_DECORATION, -speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4);
|
||||
dust->momz = P_MobjFlip(spawner) * (P_RandomRange(PR_DECORATION, 1, 4) * (spawner->scale));
|
||||
P_SetScale(dust, spawner->scale/2);
|
||||
dust->destscale = spawner->scale * 3;
|
||||
dust->scalespeed = spawner->scale/12;
|
||||
|
|
@ -5456,8 +5456,8 @@ static void K_DoLightningShield(player_t *player)
|
|||
for (i=0; i<7; i++)
|
||||
{
|
||||
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK);
|
||||
P_InitAngle(mo, P_RandomRange(PR_UNDEFINED, 0, 359)*ANG1);
|
||||
mo->fuse = P_RandomRange(PR_UNDEFINED, 20, 50);
|
||||
P_InitAngle(mo, P_RandomRange(PR_DECORATION, 0, 359)*ANG1);
|
||||
mo->fuse = P_RandomRange(PR_DECORATION, 20, 50);
|
||||
P_SetTarget(&mo->target, player->mo);
|
||||
P_SetMobjState(mo, S_KLIT1);
|
||||
}
|
||||
|
|
@ -5496,91 +5496,11 @@ static void K_FlameDashLeftoverSmoke(mobj_t *src)
|
|||
smoke->momy = 3*src->momy/4;
|
||||
smoke->momz = 3*P_GetMobjZMovement(src)/4;
|
||||
|
||||
P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(PR_UNDEFINED, 135, 225)<<FRACBITS), P_RandomRange(PR_UNDEFINED, 0, 8) * src->scale);
|
||||
smoke->momz += P_RandomRange(PR_UNDEFINED, 0, 4) * src->scale;
|
||||
P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(PR_DECORATION, 135, 225)<<FRACBITS), P_RandomRange(PR_DECORATION, 0, 8) * src->scale);
|
||||
smoke->momz += P_RandomRange(PR_DECORATION, 0, 4) * src->scale;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void K_DoHyudoroSteal(player_t *player)
|
||||
{
|
||||
INT32 i, numplayers = 0;
|
||||
INT32 playerswappable[MAXPLAYERS];
|
||||
INT32 stealplayer = -1; // The player that's getting stolen from
|
||||
INT32 prandom = 0;
|
||||
boolean sink = P_RandomChance(PR_UNDEFINED, FRACUNIT/64);
|
||||
INT32 hyu = hyudorotime;
|
||||
|
||||
if (gametype == GT_RACE)
|
||||
hyu *= 2; // double in race
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
||||
&& player != &players[i] && !players[i].exiting && !players[i].spectator // Player in-game
|
||||
|
||||
// Can steal from this player
|
||||
&& (gametype == GT_RACE //&& players[i].position < player->position)
|
||||
|| ((gametyperules & GTR_BUMPERS) && players[i].bumpers > 0))
|
||||
|
||||
// Has an item
|
||||
&& (players[i].itemtype
|
||||
&& players[i].itemamount
|
||||
&& !(players[i].pflags & PF_ITEMOUT)))
|
||||
{
|
||||
playerswappable[numplayers] = i;
|
||||
numplayers++;
|
||||
}
|
||||
}
|
||||
|
||||
prandom = P_RandomFixed(PR_UNDEFINED);
|
||||
S_StartSound(player->mo, sfx_s3k92);
|
||||
|
||||
if (sink && numplayers > 0 && cv_kitchensink.value) // BEHOLD THE KITCHEN SINK
|
||||
{
|
||||
player->hyudorotimer = hyu;
|
||||
player->stealingtimer = stealtime;
|
||||
|
||||
player->itemtype = KITEM_KITCHENSINK;
|
||||
player->itemamount = 1;
|
||||
K_UnsetItemOut(player);
|
||||
return;
|
||||
}
|
||||
else if ((gametype == GT_RACE && player->position == 1) || numplayers == 0) // No-one can be stolen from? Oh well...
|
||||
{
|
||||
player->hyudorotimer = hyu;
|
||||
player->stealingtimer = stealtime;
|
||||
return;
|
||||
}
|
||||
else if (numplayers == 1) // With just 2 players, we just need to set the other player to be the one to steal from
|
||||
{
|
||||
stealplayer = playerswappable[numplayers-1];
|
||||
}
|
||||
else if (numplayers > 1) // We need to choose between the available candidates for the 2nd player
|
||||
{
|
||||
stealplayer = playerswappable[prandom%(numplayers-1)];
|
||||
}
|
||||
|
||||
if (stealplayer > -1) // Now here's where we do the stealing, has to be done here because we still know the player we're stealing from
|
||||
{
|
||||
player->hyudorotimer = hyu;
|
||||
player->stealingtimer = stealtime;
|
||||
players[stealplayer].stealingtimer = -stealtime;
|
||||
|
||||
player->itemtype = players[stealplayer].itemtype;
|
||||
player->itemamount = players[stealplayer].itemamount;
|
||||
K_UnsetItemOut(player);
|
||||
|
||||
players[stealplayer].itemtype = KITEM_NONE;
|
||||
players[stealplayer].itemamount = 0;
|
||||
K_UnsetItemOut(&players[stealplayer]);
|
||||
|
||||
if (P_IsDisplayPlayer(&players[stealplayer]) && !r_splitscreen)
|
||||
S_StartSound(NULL, sfx_s3k92);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void K_DoSneaker(player_t *player, INT32 type)
|
||||
{
|
||||
const fixed_t intendedboost = FRACUNIT/2;
|
||||
|
|
@ -6079,7 +5999,7 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8
|
|||
|
||||
P_InitAngle(drop, angle);
|
||||
P_Thrust(drop,
|
||||
FixedAngle(P_RandomFixed(PR_UNDEFINED) * 180) + angle,
|
||||
FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle,
|
||||
16*mapobjectscale);
|
||||
|
||||
drop->momz = flip * 3 * mapobjectscale;
|
||||
|
|
@ -6113,7 +6033,7 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8
|
|||
UINT8 newType;
|
||||
UINT8 newAmount;
|
||||
|
||||
totalspawnchance = P_RandomKey(PR_UNDEFINED, totalspawnchance);
|
||||
totalspawnchance = P_RandomKey(PR_ITEM_ROULETTE, totalspawnchance);
|
||||
for (i = 0; i < NUMKARTRESULTS && spawnchance[i] <= totalspawnchance; i++);
|
||||
|
||||
// TODO: this is bad!
|
||||
|
|
@ -7213,7 +7133,7 @@ static inline BlockItReturn_t PIT_AttractingRings(mobj_t *thing)
|
|||
thing->info = &mobjinfo[thing->type];
|
||||
thing->flags = thing->info->flags;
|
||||
|
||||
P_InstaThrust(thing, P_RandomRange(PR_UNDEFINED,0,7) * ANGLE_45, 2 * thing->scale);
|
||||
P_InstaThrust(thing, P_RandomRange(PR_ITEM_RINGS, 0, 7) * ANGLE_45, 2 * thing->scale);
|
||||
P_SetObjectMomZ(thing, 8<<FRACBITS, false);
|
||||
thing->fuse = 120*TICRATE;
|
||||
|
||||
|
|
@ -7410,9 +7330,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
if (player->springstars && (leveltime & 1))
|
||||
{
|
||||
fixed_t randx = P_RandomRange(PR_UNDEFINED, -40, 40) * player->mo->scale;
|
||||
fixed_t randy = P_RandomRange(PR_UNDEFINED, -40, 40) * player->mo->scale;
|
||||
fixed_t randz = P_RandomRange(PR_UNDEFINED, 0, player->mo->height >> FRACBITS) << FRACBITS;
|
||||
fixed_t randx = P_RandomRange(PR_DECORATION, -40, 40) * player->mo->scale;
|
||||
fixed_t randy = P_RandomRange(PR_DECORATION, -40, 40) * player->mo->scale;
|
||||
fixed_t randz = P_RandomRange(PR_DECORATION, 0, player->mo->height >> FRACBITS) << FRACBITS;
|
||||
mobj_t *star = P_SpawnMobj(
|
||||
player->mo->x + randx,
|
||||
player->mo->y + randy,
|
||||
|
|
@ -9142,8 +9062,8 @@ void K_KartEbrakeVisuals(player_t *p)
|
|||
if (!p->spindash)
|
||||
{
|
||||
// Spawn downwards fastline
|
||||
sx = p->mo->x + P_RandomRange(PR_UNDEFINED, -48, 48)*p->mo->scale;
|
||||
sy = p->mo->y + P_RandomRange(PR_UNDEFINED, -48, 48)*p->mo->scale;
|
||||
sx = p->mo->x + P_RandomRange(PR_DECORATION, -48, 48)*p->mo->scale;
|
||||
sy = p->mo->y + P_RandomRange(PR_DECORATION, -48, 48)*p->mo->scale;
|
||||
|
||||
spdl = P_SpawnMobj(sx, sy, p->mo->z, MT_DOWNLINE);
|
||||
spdl->colorized = true;
|
||||
|
|
@ -9225,8 +9145,8 @@ static void K_KartSpindashDust(mobj_t *parent)
|
|||
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
fixed_t hmomentum = P_RandomRange(PR_UNDEFINED, 6, 12) * parent->scale;
|
||||
fixed_t vmomentum = P_RandomRange(PR_UNDEFINED, 2, 6) * parent->scale;
|
||||
fixed_t hmomentum = P_RandomRange(PR_DECORATION, 6, 12) * parent->scale;
|
||||
fixed_t vmomentum = P_RandomRange(PR_DECORATION, 2, 6) * parent->scale;
|
||||
|
||||
angle_t ang = parent->player->drawangle + ANGLE_180;
|
||||
SINT8 flip = 1;
|
||||
|
|
@ -9254,9 +9174,9 @@ static void K_KartSpindashDust(mobj_t *parent)
|
|||
static void K_KartSpindashWind(mobj_t *parent)
|
||||
{
|
||||
mobj_t *wind = P_SpawnMobjFromMobj(parent,
|
||||
P_RandomRange(PR_UNDEFINED,-36,36) * FRACUNIT,
|
||||
P_RandomRange(PR_UNDEFINED,-36,36) * FRACUNIT,
|
||||
FixedDiv(parent->height / 2, parent->scale) + (P_RandomRange(PR_UNDEFINED,-20,20) * FRACUNIT),
|
||||
P_RandomRange(PR_DECORATION,-36,36) * FRACUNIT,
|
||||
P_RandomRange(PR_DECORATION,-36,36) * FRACUNIT,
|
||||
FixedDiv(parent->height / 2, parent->scale) + (P_RandomRange(PR_DECORATION,-20,20) * FRACUNIT),
|
||||
MT_SPINDASHWIND
|
||||
);
|
||||
|
||||
|
|
@ -10386,9 +10306,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
{
|
||||
for (n=0; n < maxlines; n++)
|
||||
{
|
||||
sx = player->mo->x + P_RandomRange(PR_UNDEFINED, -24, 24)*player->mo->scale;
|
||||
sy = player->mo->y + P_RandomRange(PR_UNDEFINED, -24, 24)*player->mo->scale;
|
||||
sz = player->mo->z + P_RandomRange(PR_UNDEFINED, 0, 48)*player->mo->scale;
|
||||
sx = player->mo->x + P_RandomRange(PR_DECORATION, -24, 24)*player->mo->scale;
|
||||
sy = player->mo->y + P_RandomRange(PR_DECORATION, -24, 24)*player->mo->scale;
|
||||
sz = player->mo->z + P_RandomRange(PR_DECORATION, 0, 48)*player->mo->scale;
|
||||
|
||||
spdl = P_SpawnMobj(sx, sy, sz, MT_FASTLINE);
|
||||
P_SetTarget(&spdl->target, player->mo);
|
||||
|
|
|
|||
|
|
@ -539,7 +539,7 @@ static void K_SpawnSplashParticles(mobj_t *mo, t_splash_t *s, fixed_t impact)
|
|||
if (numParticles == 1)
|
||||
{
|
||||
// Random angle.
|
||||
pushAngle = P_RandomRange(PR_UNDEFINED, 0, ANGLE_MAX);
|
||||
pushAngle = P_RandomRange(PR_TERRAIN, 0, ANGLE_MAX);
|
||||
}
|
||||
|
||||
dust = P_SpawnMobjFromMobj(
|
||||
|
|
@ -668,20 +668,20 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs, tic_t timer)
|
|||
if (((timer / fs->frequency) / 2) & 1)
|
||||
{
|
||||
tireAngle -= ANGLE_45;
|
||||
tireAngle -= P_RandomRange(PR_UNDEFINED, 0, fs->cone / ANG1) * ANG1;
|
||||
pushAngle -= P_RandomRange(PR_UNDEFINED, 0, fs->cone / ANG1) * ANG1;
|
||||
tireAngle -= P_RandomRange(PR_TERRAIN, 0, fs->cone / ANG1) * ANG1;
|
||||
pushAngle -= P_RandomRange(PR_TERRAIN, 0, fs->cone / ANG1) * ANG1;
|
||||
}
|
||||
else
|
||||
{
|
||||
tireAngle += ANGLE_45;
|
||||
tireAngle += P_RandomRange(PR_UNDEFINED, 0, fs->cone / ANG1) * ANG1;
|
||||
pushAngle += P_RandomRange(PR_UNDEFINED, 0, fs->cone / ANG1) * ANG1;
|
||||
tireAngle += P_RandomRange(PR_TERRAIN, 0, fs->cone / ANG1) * ANG1;
|
||||
pushAngle += P_RandomRange(PR_TERRAIN, 0, fs->cone / ANG1) * ANG1;
|
||||
}
|
||||
|
||||
if (fs->spread > 0)
|
||||
{
|
||||
xOff = P_RandomRange(PR_UNDEFINED, -fs->spread / FRACUNIT, fs->spread / FRACUNIT) * FRACUNIT;
|
||||
yOff = P_RandomRange(PR_UNDEFINED, -fs->spread / FRACUNIT, fs->spread / FRACUNIT) * FRACUNIT;
|
||||
xOff = P_RandomRange(PR_TERRAIN, -fs->spread / FRACUNIT, fs->spread / FRACUNIT) * FRACUNIT;
|
||||
yOff = P_RandomRange(PR_TERRAIN, -fs->spread / FRACUNIT, fs->spread / FRACUNIT) * FRACUNIT;
|
||||
}
|
||||
|
||||
dust = P_SpawnMobjFromMobj(
|
||||
|
|
|
|||
|
|
@ -22,7 +22,30 @@
|
|||
|
||||
typedef enum
|
||||
{
|
||||
PR_UNDEFINED, // Before release, cases of this RNG class should be removed, only kept as the default for Lua.
|
||||
// Before release, cases of this RNG class should
|
||||
// be removed, only kept as the default for Lua.
|
||||
PR_UNDEFINED,
|
||||
|
||||
// The rule for RNG classes:
|
||||
// Don't mix up gameplay & decorative RNG.
|
||||
|
||||
// Decorative RNG is a lot less important
|
||||
// and can be lumped together. If it's used enough,
|
||||
// it might be nice to give it's own, though.
|
||||
|
||||
// However each instance of RNG being used for
|
||||
// gameplay should be split up as much as possible.
|
||||
|
||||
PR_ITEM_ROULETTE, // Item results
|
||||
PR_ITEM_RINGS, // Flung ring direction
|
||||
PR_ITEM_SHRINK, // Shrink gun offsets
|
||||
PR_PLAYERSTARTS, // Player starts
|
||||
PR_TERRAIN, // TERRAIN particles
|
||||
|
||||
PR_DECORATION, // Generic decoration
|
||||
PR_VOICES, // Player voice sounds
|
||||
PR_EXPLOSION, // Explosion VFX
|
||||
|
||||
PRNUMCLASS
|
||||
} pr_class_t;
|
||||
|
||||
|
|
@ -53,10 +76,10 @@ INT32 P_RandomRange(pr_class_t pr_class, INT32 a, INT32 b);
|
|||
#endif
|
||||
|
||||
// Macros for other functions
|
||||
#define M_SignedRandom() ((INT32)M_RandomByte() - 128) // [-128, 127] signed byte, originally a
|
||||
#define P_SignedRandom(pr) ((INT32)P_RandomByte(pr) - 128) // function of its own, moved to a macro
|
||||
#define M_SignedRandom() ((INT32)M_RandomByte() - 128) // [-128, 127] signed byte, originally a
|
||||
#define P_SignedRandom(pr) ((INT32)P_RandomByte(pr) - 128) // function of its own, moved to a macro
|
||||
|
||||
#define M_RandomChance(p) (M_RandomFixed() < p) // given fixed point probability, p, between 0 (0%)
|
||||
#define M_RandomChance(p) (M_RandomFixed() < p) // given fixed point probability, p, between 0 (0%)
|
||||
#define P_RandomChance(pr, p) (P_RandomFixed(pr) < p) // and FRACUNIT (100%), returns true p% of the time
|
||||
|
||||
// Debugging
|
||||
|
|
|
|||
|
|
@ -330,13 +330,10 @@ static void ShrinkLaserThinker(mobj_t *pohbee, mobj_t *gun, mobj_t *laser)
|
|||
|
||||
laser->spriteyscale = FixedDiv(FixedDiv(gunZ - gun->floorz, mapobjectscale), laser->info->height);
|
||||
|
||||
particle = P_SpawnMobjFromMobj(
|
||||
laser,
|
||||
P_RandomRange(PR_UNDEFINED, -16, 16) * FRACUNIT,
|
||||
P_RandomRange(PR_UNDEFINED, -16, 16) * FRACUNIT,
|
||||
0,
|
||||
MT_SHRINK_PARTICLE
|
||||
);
|
||||
particle = P_SpawnMobjFromMobj(laser, 0, 0, 0, MT_SHRINK_PARTICLE);
|
||||
|
||||
particle->sprxoff = P_RandomRange(PR_DECORATION, -16, 16) * laser->scale;
|
||||
particle->spryoff = P_RandomRange(PR_DECORATION, -16, 16) * laser->scale;
|
||||
|
||||
P_SetTarget(&gun_pohbee(particle), pohbee);
|
||||
|
||||
|
|
@ -694,7 +691,7 @@ static void CreatePohbee(player_t *owner, waypoint_t *start, waypoint_t *end, UI
|
|||
P_SetTarget(&pohbee_guns(prevGun), gun);
|
||||
|
||||
gun_numsegs(gun) = numSegs;
|
||||
gun_offset(gun) = P_RandomKey(PR_UNDEFINED, GUN_SWINGTIME);
|
||||
gun_offset(gun) = P_RandomKey(PR_ITEM_SHRINK, GUN_SWINGTIME);
|
||||
|
||||
overlay = P_SpawnMobjFromMobj(gun, 0, 0, 0, MT_OVERLAY);
|
||||
|
||||
|
|
|
|||
|
|
@ -4106,7 +4106,7 @@ void A_AttractChase(mobj_t *actor)
|
|||
#if 0 // old
|
||||
mobj_t *newring;
|
||||
newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime);
|
||||
P_InstaThrust(newring, P_RandomRange(PR_UNDEFINED,0,7) * ANGLE_45, 2<<FRACBITS);
|
||||
P_InstaThrust(newring, P_RandomRange(PR_ITEM_RINGS, 0, 7) * ANGLE_45, 2<<FRACBITS);
|
||||
newring->momz = 8<<FRACBITS;
|
||||
newring->fuse = 120*TICRATE;
|
||||
P_RemoveMobj(actor);
|
||||
|
|
@ -4116,7 +4116,7 @@ void A_AttractChase(mobj_t *actor)
|
|||
actor->info = &mobjinfo[actor->type];
|
||||
actor->flags = actor->info->flags;
|
||||
|
||||
P_InstaThrust(actor, P_RandomRange(PR_UNDEFINED,0,7) * ANGLE_45, 2 * actor->scale);
|
||||
P_InstaThrust(actor, P_RandomRange(PR_ITEM_RINGS, 0, 7) * ANGLE_45, 2 * actor->scale);
|
||||
P_SetObjectMomZ(actor, 8<<FRACBITS, false);
|
||||
actor->fuse = 120*TICRATE;
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue