exported actGetRespawnTime as a first simple test case.

This commit is contained in:
Christoph Oelckers 2023-10-04 21:54:32 +02:00
parent 79ae66d5ec
commit 11caee7477
7 changed files with 187 additions and 116 deletions

View file

@ -5414,60 +5414,6 @@ DBloodActor* actFireMissile(DBloodActor* actor, double xyoff, double zoff, DVect
//
//---------------------------------------------------------------------------
int actGetRespawnTime(DBloodActor* actor)
{
if (!actor->hasX()) return -1;
if (actor->IsDudeActor() && !actor->IsPlayerActor())
{
if (actor->xspr.respawn == 2 || (actor->xspr.respawn != 1 && gGameOptions.nMonsterSettings == 2))
return gGameOptions.nMonsterRespawnTime;
return -1;
}
if (actor->IsWeaponActor())
{
if (actor->xspr.respawn == 3 || gGameOptions.nWeaponSettings == 1) return 0;
else if (actor->xspr.respawn != 1 && gGameOptions.nWeaponSettings != 0)
return gGameOptions.nWeaponRespawnTime;
return -1;
}
if (actor->IsAmmoActor())
{
if (actor->xspr.respawn == 2 || (actor->xspr.respawn != 1 && gGameOptions.nWeaponSettings != 0))
return gGameOptions.nWeaponRespawnTime;
return -1;
}
if (actor->IsItemActor())
{
if (actor->xspr.respawn == 3 && gGameOptions.nGameType == 1) return 0;
else if (actor->xspr.respawn == 2 || (actor->xspr.respawn != 1 && gGameOptions.nItemSettings != 0))
{
switch (actor->GetType())
{
case kItemShadowCloak:
case kItemTwoGuns:
case kItemReflectShots:
return gGameOptions.nSpecialRespawnTime;
case kItemDeathMask:
return gGameOptions.nSpecialRespawnTime << 1;
default:
return gGameOptions.nItemRespawnTime;
}
}
return -1;
}
return -1;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
bool actCheckRespawn(DBloodActor* actor)
{
if (actor->hasX())

View file

@ -317,5 +317,24 @@ DBloodActor* actDropObject(DBloodActor* actor, int nType)
return nullptr;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
int actGetRespawnTime(DBloodActor* actor)
{
IFVIRTUALPTR(actor, DBloodActor, getRespawnTime)
{
int time;
VMReturn ret(&time);
VMValue param[] = { actor };
VMCall(func, param, 1, &ret, 1);
return time;
}
return -1;
}
END_BLD_NS

View file

@ -1,53 +1,72 @@
class BloodDudeCultistTommy : BloodActor {}
class BloodDudeCultistShotgun : BloodActor {}
class BloodDudeZombieAxeNormal : BloodActor {}
class BloodDudeZombieButcher : BloodActor {}
class BloodDudeZombieAxeBuried : BloodActor {}
class BloodDudeGargoyleFlesh : BloodActor {}
class BloodDudeGargoyleStone : BloodActor {}
class BloodDudeGargoyleStatueFlesh : BloodActor {}
class BloodDudeGargoyleStatueStone : BloodActor {}
class BloodDudePhantasm : BloodActor {}
class BloodDudeHellHound : BloodActor {}
class BloodDudeHand : BloodActor {}
class BloodDudeSpiderBrown : BloodActor {}
class BloodDudeSpiderRed : BloodActor {}
class BloodDudeSpiderBlack : BloodActor {}
class BloodDudeSpiderMother : BloodActor {}
class BloodDudeGillBeast : BloodActor {}
class BloodDudeBoneEel : BloodActor {}
class BloodDudeBat : BloodActor {}
class BloodDudeRat : BloodActor {}
class BloodDudePodGreen : BloodActor {}
class BloodDudeTentacleGreen : BloodActor {}
class BloodDudePodFire : BloodActor {}
class BloodDudeTentacleFire : BloodActor {}
class BloodDudePodMother : BloodActor {}
class BloodDudeTentacleMother : BloodActor {}
class BloodDudeCerberusTwoHead : BloodActor {}
class BloodDudeCerberusOneHead : BloodActor {}
class BloodDudeTchernobog : BloodActor {}
class BloodDudeCultistTommyProne : BloodActor {}
class BloodDudePlayer1 : BloodActor {}
class BloodDudePlayer2 : BloodActor {}
class BloodDudePlayer3 : BloodActor {}
class BloodDudePlayer4 : BloodActor {}
class BloodDudePlayer5 : BloodActor {}
class BloodDudePlayer6 : BloodActor {}
class BloodDudePlayer7 : BloodActor {}
class BloodDudePlayer8 : BloodActor {}
class BloodDudeBurningInnocent : BloodActor {}
class BloodDudeBurningCultist : BloodActor {}
class BloodDudeBurningZombieAxe : BloodActor {}
class BloodDudeBurningZombieButcher : BloodActor {}
class BloodDudeCultistReserved : BloodActor {} // unused
class BloodDudeZombieAxeLaying : BloodActor {}
class BloodDudeInnocent : BloodActor {}
class BloodDudeCultistShotgunProne : BloodActor {}
class BloodDudeCultistTesla : BloodActor {}
class BloodDudeCultistTNT : BloodActor {}
class BloodDudeCultistBeast : BloodActor {}
class BloodDudeTinyCaleb : BloodActor {}
class BloodDudeBeast : BloodActor {}
class BloodDudeBurningTinyCaleb : BloodActor {}
class BloodDudeBurningBeast : BloodActor {}
class BloodDudeBase : Bloodactor
{
override int getRespawnTime()
{
if (!self.hasX) return -1;
if (self.xspr.respawn == 2 || (self.xspr.respawn != 1 && gGameOptions.nMonsterSettings == Blood.MONSTERSETTINGS_2))
return gGameOptions.nMonsterRespawnTime;
return -1;
}
}
class BloodPlayerBase : BloodDudeBase
{
override int getRespawnTime()
{
return -1; // no respawn for players.
}
}
class BloodDudeCultistTommy : BloodDudeBase {}
class BloodDudeCultistShotgun : BloodDudeBase {}
class BloodDudeZombieAxeNormal : BloodDudeBase {}
class BloodDudeZombieButcher : BloodDudeBase {}
class BloodDudeZombieAxeBuried : BloodDudeBase {}
class BloodDudeGargoyleFlesh : BloodDudeBase {}
class BloodDudeGargoyleStone : BloodDudeBase {}
class BloodDudeGargoyleStatueFlesh : BloodDudeBase {}
class BloodDudeGargoyleStatueStone : BloodDudeBase {}
class BloodDudePhantasm : BloodDudeBase {}
class BloodDudeHellHound : BloodDudeBase {}
class BloodDudeHand : BloodDudeBase {}
class BloodDudeSpiderBrown : BloodDudeBase {}
class BloodDudeSpiderRed : BloodDudeBase {}
class BloodDudeSpiderBlack : BloodDudeBase {}
class BloodDudeSpiderMother : BloodDudeBase {}
class BloodDudeGillBeast : BloodDudeBase {}
class BloodDudeBoneEel : BloodDudeBase {}
class BloodDudeBat : BloodDudeBase {}
class BloodDudeRat : BloodDudeBase {}
class BloodDudePodGreen : BloodDudeBase {}
class BloodDudeTentacleGreen : BloodDudeBase {}
class BloodDudePodFire : BloodDudeBase {}
class BloodDudeTentacleFire : BloodDudeBase {}
class BloodDudePodMother : BloodDudeBase {}
class BloodDudeTentacleMother : BloodDudeBase {}
class BloodDudeCerberusTwoHead : BloodDudeBase {}
class BloodDudeCerberusOneHead : BloodDudeBase {}
class BloodDudeTchernobog : BloodDudeBase {}
class BloodDudeCultistTommyProne : BloodDudeBase {}
class BloodDudePlayer1 : BloodPlayerBase {}
class BloodDudePlayer2 : BloodPlayerBase {}
class BloodDudePlayer3 : BloodPlayerBase {}
class BloodDudePlayer4 : BloodPlayerBase {}
class BloodDudePlayer5 : BloodPlayerBase {}
class BloodDudePlayer6 : BloodPlayerBase {}
class BloodDudePlayer7 : BloodPlayerBase {}
class BloodDudePlayer8 : BloodPlayerBase {}
class BloodDudeBurningInnocent : BloodDudeBase {}
class BloodDudeBurningCultist : BloodDudeBase {}
class BloodDudeBurningZombieAxe : BloodDudeBase {}
class BloodDudeBurningZombieButcher : BloodDudeBase {}
class BloodDudeCultistReserved : BloodDudeBase {} // unused
class BloodDudeZombieAxeLaying : BloodDudeBase {}
class BloodDudeInnocent : BloodDudeBase {}
class BloodDudeCultistShotgunProne : BloodDudeBase {}
class BloodDudeCultistTesla : BloodDudeBase {}
class BloodDudeCultistTNT : BloodDudeBase {}
class BloodDudeCultistBeast : BloodDudeBase {}
class BloodDudeTinyCaleb : BloodDudeBase {}
class BloodDudeBeast : BloodDudeBase {}
class BloodDudeBurningTinyCaleb : BloodDudeBase {}
class BloodDudeBurningBeast : BloodDudeBase {}

View file

@ -1,9 +1,35 @@
class BloodItemBase : BloodActor
{
meta int packslot;
meta int respawntype;
Property prefix: none;
property packslot: packslot;
property respawntype: respawntype;
default
{
respawntype 0;
}
override int getRespawnTime()
{
if (!self.hasX) return -1;
if (self.xspr.respawn == 3 && gGameOptions.nGameType == Blood.kSinglePlayer) return 0;
else if (self.xspr.respawn == 2 || (self.xspr.respawn != 1 && gGameOptions.nItemSettings != Blood.ITEMSETTINGS_0))
{
switch (self.respawntype)
{
case 1:
return gGameOptions.nSpecialRespawnTime;
case 2:
return gGameOptions.nSpecialRespawnTime << 1;
default:
return gGameOptions.nItemRespawnTime;
}
}
return -1;
}
}
class BloodKeyBase : BloodItemBase
@ -159,6 +185,7 @@ class BloodItemShadowCloak : BloodItemBase
pic "ShadowCloakIcon";
shade -8;
scale 0.625, 0.625;
respawntype 1;
}
}
@ -169,6 +196,7 @@ class BloodItemDeathMask : BloodItemBase
pic "DeathMaskIcon";
shade -8;
scale 0.625, 0.625;
respawntype 2;
}
}
@ -190,6 +218,7 @@ class BloodItemTwoGuns : BloodItemBase
pic "GunsAkimboIcon";
shade -8;
scale 0.625, 0.625;
respawntype 1;
}
}
@ -232,6 +261,7 @@ class BloodItemReflectShots : BloodItemBase
pic "ReflectiveIcon";
shade -8;
scale 0.625, 0.625;
respawntype 1;
}
}

View file

@ -9,6 +9,15 @@ class BloodWeaponBase : BloodActor
property count: count;
property type: type;
property ammotype: ammotype;
override int getRespawnTime()
{
if (!self.hasX) return -1;
if (self.xspr.respawn == 2 || (self.xspr.respawn != 1 && gGameOptions.nWeaponSettings != Blood.WEAPONSETTINGS_0))
return gGameOptions.nWeaponRespawnTime;
return -1;
}
}
class BloodWeaponSawedoff : BloodWeaponBase
@ -138,6 +147,16 @@ class BloodAmmoBase : BloodActor
property count: count;
property type: type;
property weapontype: weapontype;
override int getRespawnTime()
{
if (!self.hasX) return -1;
if (self.xspr.respawn == 3 || gGameOptions.nWeaponSettings == Blood.WEAPONSETTINGS_1) return 0;
else if (self.xspr.respawn != 1 && gGameOptions.nWeaponSettings != Blood.WEAPONSETTINGS_0)
return gGameOptions.nWeaponRespawnTime;
return -1;
}
}
class BloodAmmoSprayCan : BloodAmmoBase

View file

@ -96,13 +96,6 @@ class BloodActor : CoreActor native
property shade: defshade;
property pal: defpal;
enum GAME_TYPE
{
kSingleplayer = 1,
kDeathmatch = 2,
kTeamplay = 3
}
enum STAT_ID {
kStatDecoration = 0,
kStatFX = 1,
@ -181,6 +174,12 @@ class BloodActor : CoreActor native
native void evPostActorCallback(int delta, int callback);
native double, double getActorExtents();
virtual int getRespawnTime()
{
return -1; // no respawn by default.
}
//---------------------------------------------------------------------------
//
//
@ -225,11 +224,11 @@ class BloodActor : CoreActor native
spawned.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
spawned.shade = spawned.defshade;
if (itemtype is 'BloodKeyBase' && gGameOptions.nGameType == kSingleplayer)
if (itemtype is 'BloodKeyBase' && gGameOptions.nGameType == Blood.kSingleplayer)
{
spawned.xspr.respawn = 3;
}
if (itemtype is 'BloodFlagBase' && gGameOptions.nGameType == kTeamplay)
if (itemtype is 'BloodFlagBase' && gGameOptions.nGameType == Blood.kTeamplay)
{
spawned.evPostActorCallback(1800, kCallbackReturnFlag);
}

View file

@ -1,6 +1,45 @@
// contains all global Blood definitions
struct Blood native
{
enum DIFFICULTY
{
DIFFICULTY_0 = 0,
DIFFICULTY_1,
DIFFICULTY_2,
DIFFICULTY_3,
DIFFICULTY_4,
};
enum MONSTERSETTINGS
{
MONSTERSETTINGS_0 = 0,
MONSTERSETTINGS_1,
MONSTERSETTINGS_2,
};
enum WEAPONSETTINGS
{
WEAPONSETTINGS_0 = 0,
WEAPONSETTINGS_1,
WEAPONSETTINGS_2,
WEAPONSETTINGS_3,
};
enum ITEMSETTINGS
{
ITEMSETTINGS_0 = 0,
ITEMSETTINGS_1,
ITEMSETTINGS_2,
};
enum GAME_TYPE
{
kSingleplayer = 1,
kDeathmatch = 2,
kTeamplay = 3
}
// POWERUPS /////////////////////////////////////////////////////
enum EPowerupType {
kPwUpFeatherFall = 12,