Discover more object 3 flags

This commit is contained in:
Ryan Dwyer 2023-01-17 21:33:16 +10:00
parent 93acca065d
commit edebe0b1f0
14 changed files with 98 additions and 96 deletions

View File

@ -4614,7 +4614,7 @@ void bgunCreateThrownProjectile(s32 handnum, struct gset *gset)
weapon->base.projectile->flags |= PROJECTILEFLAG_00000002;
weapon->base.projectile->unk08c = 0.1f;
weapon->base.projectile->pickuptimer240 = TICKS(240);
weapon->base.hidden |= OBJHFLAG_00000020;
weapon->base.hidden |= OBJHFLAG_THROWNKNIFE;
}
}
}

View File

@ -232,7 +232,7 @@ void botSpawn(struct chrdata *chr, u8 respawning)
obj = prop->obj;
if (obj) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
prop = prop->next;
@ -478,7 +478,7 @@ bool botTestPropForPickup(struct prop *prop, struct chrdata *chr)
if (1);
#if VERSION >= VERSION_NTSC_1_0
if ((obj->hidden & OBJHFLAG_REAPABLE) || (obj->flags & OBJFLAG_THROWNLAPTOP)) {
if ((obj->hidden & OBJHFLAG_DELETING) || (obj->flags & OBJFLAG_THROWNLAPTOP)) {
return false;
}
#else
@ -1241,7 +1241,7 @@ void botDisarm(struct chrdata *chr, struct prop *attackerprop)
if (chr->weapons_held[HAND_LEFT]) {
obj = chr->weapons_held[HAND_LEFT]->obj;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
chr->weapons_held[HAND_LEFT] = NULL;
}

View File

@ -1060,7 +1060,7 @@ bool botinvSwitchToWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum)
aibot->reaperspeed[i] = 0;
if (chr->weapons_held[i]) {
chr->weapons_held[i]->obj->hidden |= OBJHFLAG_REAPABLE;
chr->weapons_held[i]->obj->hidden |= OBJHFLAG_DELETING;
chr->weapons_held[i] = NULL;
}
}

View File

@ -1944,13 +1944,13 @@ void chr0f022214(struct chrdata *chr, struct prop *prop, bool fulltick)
struct prop *child;
struct prop *next;
if (obj->hidden & OBJHFLAG_REAPABLE) {
if (obj->hidden & OBJHFLAG_DELETING) {
objFree(obj, true, obj->hidden2 & OBJH2FLAG_CANREGEN);
return;
}
if (model->attachedtomodel && model->attachedtonode
&& (obj->hidden & OBJHFLAG_00000800) == 0
&& (obj->hidden & OBJHFLAG_GONE) == 0
&& (obj->flags2 & OBJFLAG2_INVISIBLE) == 0) {
Mtxf *sp104 = modelFindNodeMtx(model->attachedtomodel, model->attachedtonode, 0);
struct modelrenderdata thing = {NULL, 1, 3};

View File

@ -7653,7 +7653,7 @@ bool chrConsiderGrenadeThrow(struct chrdata *chr, u32 attackflags, u32 entityid)
if (prop) {
weapon = prop->weapon;
weapon->base.hidden |= OBJHFLAG_00000800;
weapon->base.hidden |= OBJHFLAG_GONE;
chrThrowGrenade(chr, rightprop == NULL ? 0 : 1, true);
chr->act_throwgrenade.flags = attackflags;
chr->act_throwgrenade.entityid = entityid;
@ -11304,19 +11304,21 @@ void chrTickThrowGrenade(struct chrdata *chr)
model = chr->model;
frame = modelGetCurAnimFrame(model);
hand = model->anim->flip ? 1 : 0;
hand = model->anim->flip ? HAND_LEFT : HAND_RIGHT;
weaponprop = chrGetHeldProp(chr, hand);
if ((frame >= 20 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_STANDING) ||
(frame >= 1 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_NOPIN) ||
(frame >= 1 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_CROUCHING)) {
// Decide at which frame the grenade should become visible in the chr's hand
if ((frame >= 20 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_STANDING)
|| (frame >= 1 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_NOPIN)
|| (frame >= 1 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_CROUCHING)) {
obj = weaponprop->obj;
obj->hidden &= ~OBJHFLAG_00000800;
obj->hidden &= ~OBJHFLAG_GONE;
}
if ((frame >= 119 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_STANDING) ||
(frame >= 57 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_NOPIN) ||
(frame >= 58 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_CROUCHING)) {
// Decide at which frame the grenade leaves the chr's hand
if ((frame >= 119 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_STANDING)
|| (frame >= 57 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_NOPIN)
|| (frame >= 58 && weaponprop && modelGetAnimNum(model) == ANIM_THROWGRENADE_CROUCHING)) {
weapon = weaponprop->weapon;
objSetDropped(weaponprop, DROPTYPE_THROWGRENADE);
chr->hidden |= CHRHFLAG_DROPPINGITEM;
@ -11328,9 +11330,9 @@ void chrTickThrowGrenade(struct chrdata *chr)
if (frame2 >= modelGetAnimEndFrame(model)) {
chrStop(chr);
} else {
if ((frame >= 87 && frame <= 110 && modelGetAnimNum(model) == ANIM_THROWGRENADE_STANDING) ||
(frame >= 5 && frame <= 45 && modelGetAnimNum(model) == ANIM_THROWGRENADE_NOPIN) ||
((frame >= 20 && frame <= 45 && modelGetAnimNum(model) == ANIM_THROWGRENADE_CROUCHING))) {
if ((frame >= 87 && frame <= 110 && modelGetAnimNum(model) == ANIM_THROWGRENADE_STANDING)
|| (frame >= 5 && frame <= 45 && modelGetAnimNum(model) == ANIM_THROWGRENADE_NOPIN)
|| ((frame >= 20 && frame <= 45 && modelGetAnimNum(model) == ANIM_THROWGRENADE_CROUCHING))) {
f32 value = chrGetRangedSpeed(chr, 1, 3.2);
chrTurn(chr, 1, 110, value, 0);
}

View File

@ -1021,7 +1021,7 @@ struct prop *scenarioCreateObj(s32 modelnum, s16 padnum, f32 arg2, u32 flags, u3
obj->flags2 = flags2;
obj->flags3 = flags3;
obj->extrascale = arg2 * 256;
obj->hidden2 &= ~OBJHFLAG_REAPABLE;
obj->hidden2 &= ~OBJHFLAG_DELETING;
setupCreateObject(obj, 123);
propActivate(obj->prop);
@ -1137,7 +1137,7 @@ s32 scenarioPickUpBriefcase(struct chrdata *chr, struct prop *prop)
setCurrentPlayerNum(prevplayernum);
if (chr->aibot) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
return TICKOP_NONE;
}
@ -1308,7 +1308,7 @@ s32 scenarioPickUpBriefcase(struct chrdata *chr, struct prop *prop)
if (chr->aibot) {
botinvGiveSingleWeapon(chr, WEAPON_BRIEFCASE2);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
return TICKOP_NONE;
} else {
invGiveWeaponsByProp(prop);
@ -1437,9 +1437,9 @@ s32 scenarioPickUpUplink(struct chrdata *chr, struct prop *prop)
chr->aibot->hasuplink = true;
#if VERSION >= VERSION_NTSC_1_0
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
#else
prop->obj->hidden |= OBJHFLAG_REAPABLE;
prop->obj->hidden |= OBJHFLAG_DELETING;
#endif
return TICKOP_NONE;

View File

@ -240,7 +240,7 @@ void htbCreateUplink(void)
if (count > 0) {
count = random() % count;
var800869ec = candidates[count];
var800869ec->hidden |= OBJHFLAG_REAPABLE;
var800869ec->hidden |= OBJHFLAG_DELETING;
var800869ec->hidden2 |= OBJH2FLAG_CANREGEN;
padnum = var800869ec->pad;
} else if (g_ScenarioData.htm.numpads > 0) {

View File

@ -158,7 +158,7 @@ void htbRemoveAmmoCrateAtPad(s16 padnum)
if (obj->pad == padnum
&& (obj->type == OBJTYPE_AMMOCRATE || obj->type == OBJTYPE_MULTIAMMOCRATE)
&& obj->modelnum == MODEL_MULTI_AMMO_CRATE) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
obj->hidden2 &= ~OBJH2FLAG_CANREGEN;
return;
}
@ -243,7 +243,7 @@ void htbCreateToken(void)
count = random() % count;
var800869ec = candidates[count];
g_ScenarioData.htb.tokenpad = var800869ec->pad;
var800869ec->hidden |= OBJHFLAG_REAPABLE;
var800869ec->hidden |= OBJHFLAG_DELETING;
var800869ec->hidden2 |= OBJH2FLAG_CANREGEN;
} else if (g_ScenarioData.htb.nextindex > 0) {
g_ScenarioData.htb.tokenpad = g_ScenarioData.htb.padnums[random() % g_ScenarioData.htb.nextindex];

View File

@ -500,7 +500,7 @@ void playerStartNewLife(void)
struct defaultobj *obj = prop->obj;
if (obj) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
prop = prop->next;
@ -5427,11 +5427,11 @@ s32 playerTickThirdPerson(struct prop *prop)
chr->sumground = chr->manground * (PAL ? 8.417509f : 9.999998f);
if (g_Vars.mplayerisrunning) {
if (chr->weapons_held[0] && (chr->weapons_held[0]->obj->hidden & OBJHFLAG_REAPABLE)) {
if (chr->weapons_held[0] && (chr->weapons_held[0]->obj->hidden & OBJHFLAG_DELETING)) {
objFree(chr->weapons_held[0]->obj, true, false);
}
if (chr->weapons_held[1] && (chr->weapons_held[1]->obj->hidden & OBJHFLAG_REAPABLE)) {
if (chr->weapons_held[1] && (chr->weapons_held[1]->obj->hidden & OBJHFLAG_DELETING)) {
objFree(chr->weapons_held[1]->obj, true, false);
}
}

View File

@ -1368,13 +1368,14 @@ void propExecuteTickOperation(struct prop *prop, s32 op)
if (op == TICKOP_FREE) {
if ((prop->type == PROPTYPE_WEAPON || prop->type == PROPTYPE_OBJ)
&& prop->obj && (prop->obj->hidden2 & OBJH2FLAG_CANREGEN)) {
// Start the wait timer for regen
struct defaultobj *obj = prop->obj;
prop->timetoregen = TICKS(1200);
obj->damage = 0;
obj->hidden |= OBJHFLAG_00000800;
obj->hidden &= ~OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_GONE;
obj->hidden &= ~OBJHFLAG_DELETING;
obj->hidden2 &= ~OBJH2FLAG_DESTROYED;
propDeregisterRooms(prop);
@ -1384,6 +1385,7 @@ void propExecuteTickOperation(struct prop *prop, s32 op)
propUnpause(prop);
}
} else {
// Prop doesn't regen, so free it
propDeregisterRooms(prop);
propDelist(prop);
propDisable(prop);

View File

@ -269,7 +269,7 @@ void objUpdateLinkedScenery(struct defaultobj *obj, struct prop *prop)
objCreateDebris(obj, prop);
link->trigger->flags2 |= OBJFLAG2_INVISIBLE;
link->trigger->hidden |= OBJHFLAG_REAPABLE;
link->trigger->hidden |= OBJHFLAG_DELETING;
if (link->unexp) {
link->unexp->flags2 |= OBJFLAG2_INVISIBLE;
@ -1104,7 +1104,7 @@ struct projectile *projectileAllocate(void)
objFreeEmbedmentOrProjectile(g_Projectiles[bestindex].obj->prop);
}
g_Projectiles[bestindex].obj->hidden |= OBJHFLAG_REAPABLE;
g_Projectiles[bestindex].obj->hidden |= OBJHFLAG_DELETING;
}
projectileReset(&g_Projectiles[bestindex]);
@ -3282,7 +3282,7 @@ s32 func0f06cd00(struct defaultobj *obj, struct coord *pos, struct coord *arg2,
s0 = false;
sparksCreate(prop->rooms[0], prop, &hitthing.unk00, &spa4, &hitthing.unk0c, SPARKTYPE_DEEPWATER);
propsnd0f0939f8(0, prop, SFX_HIT_WATER, -1, -1, 1024, 0, 0, 0, -1.0f, 0, -1, -1.0f, -1.0f, -1.0f);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
} else {
@ -3876,7 +3876,7 @@ void knifePlayWooshSound(struct defaultobj *obj)
if (obj->hidden & OBJHFLAG_PROJECTILE) {
if ((obj->projectile->flags & PROJECTILEFLAG_AIRBORNE)
&& obj->projectile->bouncecount <= 0
&& (obj->hidden & OBJHFLAG_00000020)) {
&& (obj->hidden & OBJHFLAG_THROWNKNIFE)) {
u16 soundnums[] = { SFX_8074, SFX_8074, SFX_8074 };
s32 index = random() % ARRAYCOUNT(soundnums);
@ -3889,7 +3889,7 @@ void knifePlayWooshSound(struct defaultobj *obj)
}
}
} else {
obj->hidden &= ~OBJHFLAG_00000020;
obj->hidden &= ~OBJHFLAG_THROWNKNIFE;
func0f0926bc(obj->prop, 1, 0xffff);
}
}
@ -4156,7 +4156,7 @@ void objLand(struct prop *prop, struct coord *arg1, struct coord *arg2, bool *em
*embedded = true;
}
} else {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
} else if (obj->type == OBJTYPE_WEAPON) {
struct weaponobj *weapon = (struct weaponobj *)obj;
@ -4226,7 +4226,7 @@ void ammocrateTick(struct prop *prop)
if (obj->flags & OBJFLAG_AMMOCRATE_EXPLODENOW) {
propExplode(prop, EXPLOSIONTYPE_12);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
@ -4328,7 +4328,7 @@ void weaponTick(struct prop *prop)
propExplode(prop, (obj->flags2 & OBJFLAG2_WEAPON_HUGEEXP) ? EXPLOSIONTYPE_HUGE17 : EXPLOSIONTYPE_ROCKET);
}
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
#if VERSION >= VERSION_NTSC_1_0
{
@ -4370,7 +4370,7 @@ void weaponTick(struct prop *prop)
nbombCreateStorm_hack(&prop->pos, ownerprop, prop);
propUnsetDangerous(prop);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
#if VERSION >= VERSION_NTSC_1_0
{
@ -4397,7 +4397,7 @@ void weaponTick(struct prop *prop)
if (weapon->timer240 == 0) {
propExplode(prop, (obj->flags2 & OBJFLAG2_WEAPON_HUGEEXP) ? EXPLOSIONTYPE_HUGE17 : EXPLOSIONTYPE_ROCKET);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
#if VERSION >= VERSION_NTSC_1_0
{
@ -4424,7 +4424,7 @@ void weaponTick(struct prop *prop)
if (weapon->timer240 < 0) {
if (propExplode(prop, (obj->flags2 & OBJFLAG2_WEAPON_HUGEEXP) ? EXPLOSIONTYPE_HUGE17 : EXPLOSIONTYPE_ROCKET)) {
weapon->timer240 = -1;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
} else {
@ -4482,7 +4482,7 @@ void weaponTick(struct prop *prop)
if (propExplode(prop, exptype)) {
weapon->timer240 = -1;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
} else if (weapon->weaponnum == WEAPON_PROXIMITYMINE
@ -4528,7 +4528,7 @@ void weaponTick(struct prop *prop)
nbombCreateStorm_hack(&prop->pos, ownerprop, prop);
propUnsetDangerous(prop);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
#if VERSION >= VERSION_NTSC_1_0
{
@ -4562,7 +4562,7 @@ void weaponTick(struct prop *prop)
if (propExplode(prop, exptype)) {
weapon->timer240 = -1;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
}
@ -4682,7 +4682,7 @@ void weaponTick(struct prop *prop)
if (weapon->fadeouttimer60 <= 0) {
weapon->fadeouttimer60 = 0;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
@ -4727,7 +4727,7 @@ void func0f0706f8(struct prop *prop, bool arg1)
struct defaultobj *obj = prop->obj;
struct prop *child;
if (obj->hidden & OBJHFLAG_REAPABLE) {
if (obj->hidden & OBJHFLAG_DELETING) {
objFree(obj, true, obj->hidden2 & OBJH2FLAG_CANREGEN);
} else {
prop->flags &= ~PROPFLAG_ONTHISSCREENTHISTICK;
@ -4751,7 +4751,7 @@ void func0f07079c(struct prop *prop, bool fulltick)
struct prop *child;
struct prop *next;
if (obj->hidden & OBJHFLAG_REAPABLE) {
if (obj->hidden & OBJHFLAG_DELETING) {
objFree(obj, true, obj->hidden2 & OBJH2FLAG_CANREGEN);
return;
}
@ -6678,7 +6678,7 @@ s32 projectileTick(struct defaultobj *obj, bool *embedded)
|| prop->pos.y < -20000.0f || prop->pos.y > 32000.0f
|| prop->pos.x < -32000.0f || prop->pos.x > 32000.0f
|| prop->pos.z < -32000.0f || prop->pos.z > 32000.0f) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
projectile->flighttime240 += g_Vars.lvupdate240;
@ -7215,7 +7215,7 @@ s32 projectileTick(struct defaultobj *obj, bool *embedded)
cdresult = CDRESULT_COLLISION;
if (geoflags & GEOFLAG_DIE) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
} else {
roomnum = cdFindFloorRoomYColourNormalPropAtPos(&prop->pos, prop->rooms, &sp390, &obj->floorcol, &sp380, NULL);
@ -7304,7 +7304,7 @@ s32 projectileTick(struct defaultobj *obj, bool *embedded)
projectile->bounceframe = g_Vars.lvframe60;
if ((obj->hidden & OBJHFLAG_00010000) == 0) {
obj->hidden |= OBJHFLAG_00000100;
obj->hidden |= OBJHFLAG_DAMAGEFORBOUNCE;
}
if (sp350) {
@ -7530,7 +7530,7 @@ s32 projectileTick(struct defaultobj *obj, bool *embedded)
#if VERSION >= VERSION_NTSC_1_0
if (geoflags & GEOFLAG_DIE) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
#endif
} else {
@ -10026,7 +10026,7 @@ void chopperTickFall(struct prop *chopperprop)
// reaped once it reaches the lower barrier
if (chopperprop->pos.y < -30000) {
func0f0926bc(chopperprop, 1, 0xffff);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
} else {
chopperIncrementMovement(chopperprop, goalroty, chopper->rotx < 0 ? M_PI : -M_PI, &speed, false);
}
@ -10422,7 +10422,7 @@ void hovercarTick(struct prop *prop)
func0f0926bc(prop, 1, 0xffff);
explosionCreate(NULL, &prop->pos, prop->rooms, EXPLOSIONTYPE_7, g_Vars.currentplayernum, true, &sp1e4, sp1d6, &sp1d8);
hovercar->base.hidden |= OBJHFLAG_REAPABLE;
hovercar->base.hidden |= OBJHFLAG_DELETING;
return;
}
@ -10881,7 +10881,7 @@ u32 objTick(struct prop *prop)
if (obj->flags & OBJFLAG_INSIDEANOTHEROBJ) {
propDeregisterRooms(prop);
propDelist(prop);
obj->hidden &= ~OBJHFLAG_00000800;
obj->hidden &= ~OBJHFLAG_GONE;
cmdindex = setupGetCmdIndexByProp(prop);
// Find the parent obj (pad is repurposed here)
@ -10896,7 +10896,7 @@ u32 objTick(struct prop *prop)
} else {
propEnable(prop);
setup0f0923d4(obj);
obj->hidden &= ~OBJHFLAG_00000800;
obj->hidden &= ~OBJHFLAG_GONE;
}
} else {
// Object was previously damaged. Maybe glass?
@ -10975,7 +10975,7 @@ s32 objTickPlayer(struct prop *prop)
return TICKOP_RETICK;
}
if (obj->hidden & OBJHFLAG_REAPABLE) {
if (obj->hidden & OBJHFLAG_DELETING) {
pass = false;
if (obj->type == OBJTYPE_TINTEDGLASS) {
@ -11267,7 +11267,7 @@ s32 objTickPlayer(struct prop *prop)
pass2 = posIsInDrawDistance(&prop->pos);
} else if (obj->flags2 & OBJFLAG2_CANFILLVIEWPORT) {
pass2 = posIsInDrawDistance(&prop->pos);
} else if ((obj->hidden & OBJHFLAG_00000800) == 0 && (obj->flags2 & OBJFLAG2_INVISIBLE) == 0) {
} else if ((obj->hidden & OBJHFLAG_GONE) == 0 && (obj->flags2 & OBJFLAG2_INVISIBLE) == 0) {
pass2 = func0f08e8ac(prop, &prop->pos, modelGetEffectiveScale(model), sp564);
} else {
pass2 = false;
@ -11324,8 +11324,8 @@ s32 objTickPlayer(struct prop *prop)
}
}
if (obj->hidden & OBJHFLAG_00000100) {
obj->hidden &= ~OBJHFLAG_00000100;
if (obj->hidden & OBJHFLAG_DAMAGEFORBOUNCE) {
obj->hidden &= ~OBJHFLAG_DAMAGEFORBOUNCE;
objDamage(obj, RANDOMFRAC() * 4.0f + 2.0f, &prop->pos, WEAPON_NONE, (obj->hidden & 0xf0000000) >> 28);
}
@ -14723,7 +14723,7 @@ void objCheckDestroyed(struct defaultobj *obj, struct coord *pos, s32 playernum)
explosionCreateComplex(prop, pos, rooms, exptype, playernum);
if (obj->flags2 & OBJFLAG2_REMOVEWHENDESTROYED) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
} else if (obj->type == OBJTYPE_CHOPPER) {
struct chopperobj *chopper = (struct chopperobj *)obj;
@ -15115,7 +15115,7 @@ void glassDestroy(struct defaultobj *obj)
#endif
obj->damage = 0;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
obj->hidden2 |= OBJH2FLAG_DESTROYED;
}
@ -15320,7 +15320,7 @@ void objDamage(struct defaultobj *obj, f32 damage, struct coord *pos, s32 weapon
if (obj->flags2 & OBJFLAG2_AICANNOTUSE) {
propExplode(obj->prop, EXPLOSIONTYPE_12);
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
// If damaging an explosive item, make it explode immediately by
@ -15537,7 +15537,7 @@ void func0f0859a0(struct prop *prop, struct shotdata *shotdata)
struct coord spd8;
f32 spd4;
struct modelnode *node2;
s32 lVar3;
s32 hitpart;
bool isnotglass;
struct modelnode *node3;
struct hitthing hitthing2;
@ -15564,33 +15564,33 @@ void func0f0859a0(struct prop *prop, struct shotdata *shotdata)
}
if (var8005efc0 > 0.0f) {
lVar3 = modelTestForHit(model, &shotdata->unk00, &shotdata->unk0c, &node1);
hitpart = modelTestForHit(model, &shotdata->unk00, &shotdata->unk0c, &node1);
while (lVar3 > 0) {
while (hitpart > 0) {
if (func0f084594(model, node1, &shotdata->unk00, &shotdata->unk0c, &hitthing1, &spe4, &node2)) {
break;
}
lVar3 = modelTestForHit(model, &shotdata->unk00, &shotdata->unk0c, &node1);
hitpart = modelTestForHit(model, &shotdata->unk00, &shotdata->unk0c, &node1);
}
} else {
do {
lVar3 = modelTestForHit(model, &shotdata->unk00, &shotdata->unk0c, &node1);
hitpart = modelTestForHit(model, &shotdata->unk00, &shotdata->unk0c, &node1);
if (lVar3 > 0 && func0f0849dc(model, node1, &shotdata->unk00, &shotdata->unk0c, &hitthing1, &spe4, &node2)) {
if (hitpart > 0 && func0f0849dc(model, node1, &shotdata->unk00, &shotdata->unk0c, &hitthing1, &spe4, &node2)) {
break;
}
} while (lVar3 > 0);
} while (hitpart > 0);
}
if (obj->flags3 & OBJFLAG3_HOVERBEDSHIELD) {
node3 = modelGetPart(model->definition, MODELPART_0067);
if (node3 && func0f084594(model, node3, &shotdata->unk00, &shotdata->unk0c, &hitthing2, &sp90, &node4)) {
if (lVar3 <= 0 ||
if (hitpart <= 0 ||
model->matrices[sp90].m[0][2] * hitthing2.unk00.f[0] + model->matrices[sp90].m[1][2] * hitthing2.unk00.f[1] + model->matrices[sp90].m[2][2] * hitthing2.unk00.f[2] >
model->matrices[spe4].m[0][2] * hitthing1.unk00.f[0] + model->matrices[spe4].m[1][2] * hitthing1.unk00.f[1] + model->matrices[spe4].m[2][2] * hitthing1.unk00.f[2]) {
lVar3 = 1;
hitpart = HITPART_LFOOT;
hitthing1 = hitthing2;
node1 = node3;
spe4 = sp90;
@ -15600,7 +15600,7 @@ void func0f0859a0(struct prop *prop, struct shotdata *shotdata)
}
}
if (lVar3 > 0) {
if (hitpart > 0) {
mtx4TransformVec(&model->matrices[spe4], &hitthing1.unk00, &spd8);
spd4 = -spd8.f[2];
@ -15620,7 +15620,7 @@ void func0f0859a0(struct prop *prop, struct shotdata *shotdata)
mtx4RotateVec(&model->matrices[spe4], &hitthing1.unk0c, &sp70);
mtx4RotateVecInPlace(camGetProjectionMtxF(), &sp70);
func0f061fa8(shotdata, prop, spd4, lVar3,
func0f061fa8(shotdata, prop, spd4, hitpart,
node1, &hitthing1, spe4, node2,
model, isnotglass && shotdata->gset.weaponnum != WEAPON_FARSIGHT,
(obj->flags2 & OBJFLAG2_BULLETPROOF)
@ -16139,7 +16139,7 @@ bool propobjInteract(struct prop *prop)
}
if (playernum >= 0 && laptop == &g_ThrownLaptops[playernum]) {
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
invGiveSingleWeapon(WEAPON_LAPTOPGUN);
currentPlayerQueuePickupWeaponHudmsg(WEAPON_LAPTOPGUN, false);
weaponPlayPickupSound(WEAPON_LAPTOPGUN);
@ -17399,7 +17399,7 @@ s32 objTestForPickup(struct prop *prop)
{
struct defaultobj *obj = prop->obj;
if (obj->hidden & OBJHFLAG_REAPABLE) {
if (obj->hidden & OBJHFLAG_DELETING) {
return TICKOP_NONE;
}
@ -17449,7 +17449,7 @@ s32 objTestForPickup(struct prop *prop)
|| weapon->weaponnum == WEAPON_GRENADEROUND
|| weapon->weaponnum == WEAPON_NBOMB
|| weapon->weaponnum == WEAPON_SKROCKET) {
if (weapon->timer240 >= 0 || (obj->hidden & OBJHFLAG_REAPABLE)) {
if (weapon->timer240 >= 0 || (obj->hidden & OBJHFLAG_DELETING)) {
return TICKOP_NONE;
}
}
@ -17462,7 +17462,7 @@ s32 objTestForPickup(struct prop *prop)
|| weapon->weaponnum == WEAPON_TARGETAMPLIFIER
|| weapon->weaponnum == WEAPON_COMMSRIDER
|| weapon->weaponnum == WEAPON_ECMMINE) {
if (weapon->timer240 >= 0 || (obj->hidden & OBJHFLAG_REAPABLE)) {
if (weapon->timer240 >= 0 || (obj->hidden & OBJHFLAG_DELETING)) {
return TICKOP_NONE;
}
}
@ -18284,7 +18284,7 @@ bool chrEquipWeapon(struct weaponobj *weapon, struct chrdata *chr)
if ((weapon->base.flags & OBJFLAG_WEAPON_AICANNOTUSE) == 0) {
if (chr->weapons_held[handnum]) {
if (chr->aibot) {
chr->weapons_held[handnum]->weapon->base.hidden |= OBJHFLAG_REAPABLE;
chr->weapons_held[handnum]->weapon->base.hidden |= OBJHFLAG_DELETING;
chr->weapons_held[handnum] = NULL;
} else {
return false;
@ -18652,7 +18652,7 @@ void weaponDeleteFromChr(struct chrdata *chr, s32 hand)
{
if (chr && chr->weapons_held[hand]) {
struct defaultobj *obj = chr->weapons_held[hand]->obj;
obj->hidden |= OBJHFLAG_REAPABLE;
obj->hidden |= OBJHFLAG_DELETING;
}
}
@ -19622,7 +19622,7 @@ void doorPlayClosedSound(s32 soundtype, struct prop *prop)
void doorStartOpen(struct doorobj *door)
{
door->base.flags &= ~OBJFLAG_DOOR_KEEPOPEN;
door->base.hidden |= OBJHFLAG_00000200;
door->base.hidden |= OBJHFLAG_DOOREVEROPENED;
doorPlayOpeningSound(door->soundtype, door->base.prop);
doorActivatePortal(door);

View File

@ -783,7 +783,7 @@ void setupCreateMine(struct mineobj *mine, s32 cmdindex)
setupCreateObject(&mine->base, cmdindex);
if (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) {
mine->base.hidden = (mine->base.hidden & 0x0fffffff) | OBJHFLAG_20000000;
mine->base.hidden = (mine->base.hidden & 0x0fffffff) | (2 << 28);
}
mine->base.prop->forcetick = true;
@ -2224,10 +2224,9 @@ void setupCreateProps(s32 stagenum)
// This gets optimised out but makes v0 unavailable
// for storing OBJHFLAG_CONDITIONALSCENERY, which is required
// for a match. Any function call would work; I just
// copied the one above.
// for a match. Any function call would work.
if (alwayszero) {
setupCreateConditionalScenery(link);
random();
}
if (expoffset) {
@ -2235,7 +2234,7 @@ void setupCreateProps(s32 stagenum)
exp->flags2 |= OBJFLAG2_INVISIBLE;
}
if (trigger->hidden & OBJHFLAG_02000000) {
if (trigger->hidden & OBJHFLAG_BLOCKEDPATH) {
objSetBlockedPathUnblocked(trigger, false);
}
}
@ -2252,7 +2251,7 @@ void setupCreateProps(s32 stagenum)
setupCreateBlockedPath(blockedpath);
blocker->hidden |= OBJHFLAG_02000000;
blocker->hidden |= OBJHFLAG_BLOCKEDPATH;
if (blocker->hidden & OBJHFLAG_CONDITIONALSCENERY) {
objSetBlockedPathUnblocked(blocker, false);

View File

@ -3096,16 +3096,16 @@
// obj->hidden
#define OBJHFLAG_LIFTDOOR 0x00000001
#define OBJHFLAG_00000002 0x00000002
#define OBJHFLAG_REAPABLE 0x00000004
#define OBJHFLAG_DELETING 0x00000004
#define OBJHFLAG_ISRETICK 0x00000008
#define OBJHFLAG_TAGGED 0x00000010
#define OBJHFLAG_00000020 0x00000020 // thrown knife
#define OBJHFLAG_THROWNKNIFE 0x00000020 // thrown knife
#define OBJHFLAG_EMBEDDED 0x00000040 // obj is embedded in a chr or other obj (eg. knife)
#define OBJHFLAG_PROJECTILE 0x00000080 // obj is airborne, sliding or falling
#define OBJHFLAG_00000100 0x00000100
#define OBJHFLAG_00000200 0x00000200
#define OBJHFLAG_DAMAGEFORBOUNCE 0x00000100
#define OBJHFLAG_DOOREVEROPENED 0x00000200
#define OBJHFLAG_HASTEXTOVERRIDE 0x00000400
#define OBJHFLAG_00000800 0x00000800
#define OBJHFLAG_GONE 0x00000800 // Waiting to regen in MP, or grenade in chr's hand during throw anim before it becomes visible
#define OBJHFLAG_00001000 0x00001000
#define OBJHFLAG_PADLOCKEDDOOR 0x00002000
#define OBJHFLAG_ACTIVATED_BY_BOND 0x00004000
@ -3119,10 +3119,9 @@
#define OBJHFLAG_PERIMDISABLED 0x00400000
#define OBJHFLAG_DOORPERIMDISABLED 0x00800000
#define OBJHFLAG_CONDITIONALSCENERY 0x01000000 // Set on triggers, exp and unexp
#define OBJHFLAG_02000000 0x02000000
#define OBJHFLAG_BLOCKEDPATH 0x02000000
#define OBJHFLAG_MOUNTED 0x04000000 // for hoverbike
#define OBJHFLAG_GRABBED 0x08000000
#define OBJHFLAG_20000000 0x20000000 // upper nibble might be a single 4-bit value
// obj->hidden2
#define OBJH2FLAG_HASOPA 0x01 // obj has opaque polygons (ie. most objects)

View File

@ -7,7 +7,7 @@
void objSetBlockedPathUnblocked(struct defaultobj *blocker, bool unblocked)
{
if (blocker->hidden & OBJHFLAG_02000000) {
if (blocker->hidden & OBJHFLAG_BLOCKEDPATH) {
struct blockedpathobj *bp = g_BlockedPaths;
while (bp) {