This commit is contained in:
TehRealSalt 2018-11-02 14:59:48 -04:00
commit 6bb33b9d16
17 changed files with 4619 additions and 314 deletions

View File

@ -3251,11 +3251,11 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
D_SendPlayerConfig();
addedtogame = true;
}
if (netgame)
{
{
if (server && netgame && cv_showjoinaddress.value)
{
{
const char *address;
if (I_GetNodeAddress && (address = I_GetNodeAddress(node)) != NULL)
HU_AddChatText(va("\x82*Player %d has joined the game (node %d) (%s)", newplayernum+1, node, address), false); // merge join notification + IP to avoid clogging console/chat.
@ -3263,7 +3263,7 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
else
HU_AddChatText(va("\x82*Player %d has joined the game (node %d)", newplayernum+1, node), false);
}
if (server && multiplayer && motd[0] != '\0')
COM_BufAddText(va("sayto %d %s\n", newplayernum, motd));

View File

@ -1845,6 +1845,7 @@ static actionpointer_t actionpointers[] =
{{A_RoamingShadowThinker}, "A_ROAMINGSHADOWTHINKER"}, //SRB2kart
{{A_ReaperThinker}, "A_REAPERTHINKER"}, //SRB2kart
{{A_MementosTPParticles}, "A_MEMENTOSTPPARTICLES"}, //SRB2kart
{{A_FlameParticle}, "A_FLAMEPARTICLE"}, // SRB2kart
{{A_OrbitNights}, "A_ORBITNIGHTS"},
{{A_GhostMe}, "A_GHOSTME"},
{{A_SetObjectState}, "A_SETOBJECTSTATE"},
@ -5274,6 +5275,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_XMASPOLE",
"S_CANDYCANE",
"S_SNOWMAN",
"S_SNOWMANHAT",
"S_LAMPPOST1",
"S_LAMPPOST2",
"S_HANGSTAR",
// Botanic Serenity's loads of scenery states
"S_BSZTALLFLOWER_RED",
@ -6330,31 +6335,31 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_ROCKETSNEAKER_RVIBRATE",
//{ Eggman Monitor
"S_FAKEITEM1",
"S_FAKEITEM2",
"S_FAKEITEM3",
"S_FAKEITEM4",
"S_FAKEITEM5",
"S_FAKEITEM6",
"S_FAKEITEM7",
"S_FAKEITEM8",
"S_FAKEITEM9",
"S_FAKEITEM10",
"S_FAKEITEM11",
"S_FAKEITEM12",
"S_FAKEITEM13",
"S_FAKEITEM14",
"S_FAKEITEM15",
"S_FAKEITEM16",
"S_FAKEITEM17",
"S_FAKEITEM18",
"S_FAKEITEM19",
"S_FAKEITEM20",
"S_FAKEITEM21",
"S_FAKEITEM22",
"S_FAKEITEM23",
"S_FAKEITEM24",
"S_DEADFAKEITEM",
"S_EGGMANITEM1",
"S_EGGMANITEM2",
"S_EGGMANITEM3",
"S_EGGMANITEM4",
"S_EGGMANITEM5",
"S_EGGMANITEM6",
"S_EGGMANITEM7",
"S_EGGMANITEM8",
"S_EGGMANITEM9",
"S_EGGMANITEM10",
"S_EGGMANITEM11",
"S_EGGMANITEM12",
"S_EGGMANITEM13",
"S_EGGMANITEM14",
"S_EGGMANITEM15",
"S_EGGMANITEM16",
"S_EGGMANITEM17",
"S_EGGMANITEM18",
"S_EGGMANITEM19",
"S_EGGMANITEM20",
"S_EGGMANITEM21",
"S_EGGMANITEM22",
"S_EGGMANITEM23",
"S_EGGMANITEM24",
"S_EGGMANITEM_DEAD",
//}
// Banana
@ -6864,6 +6869,62 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_FZSLOWSMOKE4",
"S_FZSLOWSMOKE5",
// Various plants
"S_SONICBUSH",
"S_SHRUB",
"S_TALLBUSH",
"S_AZURECITYTREE",
// Marble Zone
"S_FLAMEPARTICLE",
"S_MARBLETORCH",
"S_MARBLELIGHT",
"S_MARBLEBURNER",
// CD Special Stage
"S_CDUFO",
"S_CDUFO_DIE",
// Rusty Rig
"S_RUSTYLAMP_ORANGE",
"S_RUSTYCHAIN",
// D2 Balloon Panic
"S_BALLOON",
"S_BALLOONPOP1",
"S_BALLOONPOP2",
"S_BALLOONPOP3",
// Smokin' & Vapin' (Don't try this at home, kids!)
"S_PETSMOKE0",
"S_PETSMOKE1",
"S_PETSMOKE2",
"S_PETSMOKE3",
"S_PETSMOKE4",
"S_PETSMOKE5",
"S_VVVAPING0",
"S_VVVAPING1",
"S_VVVAPING2",
"S_VVVAPING3",
"S_VVVAPING4",
"S_VVVAPING5",
"S_VVVAPE",
// Hill Top Zone
"S_HTZTREE",
"S_HTZBUSH",
// Ports of gardens
"S_SGVINE1",
"S_SGVINE2",
"S_SGVINE3",
"S_PGTREE",
"S_PGFLOWER1",
"S_PGFLOWER2",
"S_PGFLOWER3",
"S_PGBUSH",
"S_DHPILLAR",
// Midnight Channel stuff:
"S_SPOTLIGHT", // Spotlight decoration
"S_RANDOMSHADOW", // Random Shadow. They're static and don't do nothing.
@ -6896,6 +6957,141 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_CDTREEASP",
"S_CDTREEBSP",
// Daytona Speedway
"S_PINETREE",
"S_PINETREE_SIDE",
// Egg Zeppelin
"S_EZZPROPELLER",
"S_EZZPROPELLER_BLADE",
// Desert Palace
"S_DP_PALMTREE",
// Aurora Atoll
"S_AAZTREE_SEG",
"S_AAZTREE_COCONUT",
"S_AAZTREE_LEAF",
// Barren Badlands
"S_BBZDUST1", // Dust
"S_BBZDUST2",
"S_BBZDUST3",
"S_BBZDUST4",
"S_FROGGER", // Frog badniks
"S_FROGGER_ATTACK",
"S_FROGGER_JUMP",
"S_FROGTONGUE",
"S_FROGTONGUE_JOINT",
"S_ROBRA", // Black cobra badniks
"S_ROBRA_HEAD",
"S_ROBRA_JOINT",
"S_ROBRASHELL_INSIDE",
"S_ROBRASHELL_OUTSIDE",
"S_BLUEROBRA", // Blue cobra badniks
"S_BLUEROBRA_HEAD",
"S_BLUEROBRA_JOINT",
// Eerie Grove
"S_EERIEFOG1",
"S_EERIEFOG2",
"S_EERIEFOG3",
"S_EERIEFOG4",
"S_EERIEFOG5",
// SMK ports
"S_SMK_PIPE1", // Generic pipes
"S_SMK_PIPE2",
"S_SMK_MOLE", // Donut Plains Monty Moles
"S_SMK_THWOMP", // Bowser Castle Thwomps
"S_SMK_SNOWBALL", // Vanilla Lake snowballs
"S_SMK_ICEBLOCK", // Vanilla Lake breakable ice blocks
"S_SMK_ICEBLOCK2",
"S_SMK_ICEBLOCK_DEBRIS",
"S_SMK_ICEBLOCK_DEBRIS2",
// Ezo's maps
"S_BLUEFIRE1",
"S_BLUEFIRE2",
"S_BLUEFIRE3",
"S_BLUEFIRE4",
"S_GREENFIRE1",
"S_GREENFIRE2",
"S_GREENFIRE3",
"S_GREENFIRE4",
"S_REGALCHEST",
"S_CHIMERASTATUE",
"S_DRAGONSTATUE",
"S_LIZARDMANSTATUE",
"S_PEGASUSSTATUE",
"S_ZELDAFIRE1",
"S_ZELDAFIRE2",
"S_ZELDAFIRE3",
"S_ZELDAFIRE4",
"S_GANBARETHING",
"S_GANBAREDUCK",
"S_GANBARETREE",
"S_MONOIDLE",
"S_MONOCHASE1",
"S_MONOCHASE2",
"S_MONOCHASE3",
"S_MONOCHASE4",
"S_MONOPAIN",
"S_REDZELDAFIRE1",
"S_REDZELDAFIRE2",
"S_REDZELDAFIRE3",
"S_REDZELDAFIRE4",
"S_BOWLINGPIN",
"S_BOWLINGHIT1",
"S_BOWLINGHIT2",
"S_BOWLINGHIT3",
"S_BOWLINGHIT4",
"S_ARIDTOAD",
"S_TOADHIT1",
"S_TOADHIT2",
"S_TOADHIT3",
"S_TOADHIT4",
"S_EBARRELIDLE",
"S_EBARREL1",
"S_EBARREL2",
"S_EBARREL3",
"S_EBARREL4",
"S_EBARREL5",
"S_EBARREL6",
"S_EBARREL7",
"S_EBARREL8",
"S_EBARREL9",
"S_EBARREL10",
"S_EBARREL11",
"S_EBARREL12",
"S_EBARREL13",
"S_EBARREL14",
"S_EBARREL15",
"S_EBARREL16",
"S_EBARREL17",
"S_EBARREL18",
"S_MERRYHORSE",
"S_BLUEFRUIT",
"S_ORANGEFRUIT",
"S_REDFRUIT",
"S_PINKFRUIT",
"S_ADVENTURESPIKEA1",
"S_ADVENTURESPIKEA2",
"S_ADVENTURESPIKEB1",
"S_ADVENTURESPIKEB2",
"S_ADVENTURESPIKEC1",
"S_ADVENTURESPIKEC2",
"S_BOOSTPROMPT1",
"S_BOOSTPROMPT2",
"S_BOOSTOFF1",
"S_BOOSTOFF2",
"S_BOOSTON1",
"S_BOOSTON2",
"S_LIZARDMAN",
"S_LIONMAN",
"S_MOUSEMAN1",
"S_MOUSEMAN2",
#ifdef SEENAMES
"S_NAMECHECK",
#endif
@ -7182,6 +7378,10 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_XMASPOLE",
"MT_CANDYCANE",
"MT_SNOWMAN",
"MT_SNOWMANHAT",
"MT_LAMPPOST1",
"MT_LAMPPOST2",
"MT_HANGSTAR",
// Botanic Serenity
"MT_BSZTALLFLOWER_RED",
@ -7431,8 +7631,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_ROCKETSNEAKER", // Rocket sneakers
"MT_FAKESHIELD",
"MT_FAKEITEM",
"MT_EGGMANITEM", // Eggman items
"MT_EGGMANITEM_SHIELD",
"MT_BANANA", // Banana Stuff
"MT_BANANA_SHIELD",
@ -7553,6 +7753,48 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_FZEROBOOM",
// Various plants
"MT_SONICBUSH",
"MT_SHRUB",
"MT_TALLBUSH",
"MT_AZURECITYTREE",
// Marble Zone
"MT_FLAMEPARTICLE",
"MT_MARBLETORCH",
"MT_MARBLELIGHT",
"MT_MARBLEBURNER",
// CD Special Stage
"MT_CDUFO",
// Rusty Rig
"MT_RUSTYLAMP_ORANGE",
"MT_RUSTYCHAIN",
// D2 Balloon Panic
"MT_BALLOON",
// Smokin' & Vapin' (Don't try this at home, kids!)
"MT_PETSMOKER",
"MT_PETSMOKE",
"MT_VVVAPE",
// Hill Top Zone
"MT_HTZTREE",
"MT_HTZBUSH",
// Ports of gardens
"MT_SGVINE1",
"MT_SGVINE2",
"MT_SGVINE3",
"MT_PGTREE",
"MT_PGFLOWER1",
"MT_PGFLOWER2",
"MT_PGFLOWER3",
"MT_PGBUSH",
"MT_DHPILLAR",
// Midnight Channel stuff:
"MT_SPOTLIGHT", // Spotlight Object
"MT_RANDOMSHADOW", // Random static Shadows.
@ -7573,6 +7815,83 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_CDTREEA",
"MT_CDTREEB",
// Daytona Speedway
"MT_PINETREE",
"MT_PINETREE_SIDE",
// Egg Zeppelin
"MT_EZZPROPELLER",
"MT_EZZPROPELLER_BLADE",
// Desert Palace
"MT_DP_PALMTREE",
// Aurora Atoll
"MT_AAZTREE_HELPER",
"MT_AAZTREE_SEG",
"MT_AAZTREE_COCONUT",
"MT_AAZTREE_LEAF",
// Barren Badlands
"MT_BBZDUST",
"MT_FROGGER",
"MT_FROGTONGUE",
"MT_FROGTONGUE_JOINT",
"MT_ROBRA",
"MT_ROBRA_HEAD",
"MT_ROBRA_JOINT",
"MT_BLUEROBRA",
"MT_BLUEROBRA_HEAD",
"MT_BLUEROBRA_JOINT",
// Eerie Grove
"MT_EERIEFOG",
"MT_EERIEFOGGEN",
// SMK ports
"MT_SMK_PIPE",
"MT_SMK_MOLESPAWNER",
"MT_SMK_MOLE",
"MT_SMK_THWOMP",
"MT_SMK_SNOWBALL",
"MT_SMK_ICEBLOCK",
"MT_SMK_ICEBLOCK_SIDE",
"MT_SMK_ICEBLOCK_DEBRIS",
// Ezo's maps
"MT_BLUEFIRE",
"MT_GREENFIRE",
"MT_REGALCHEST",
"MT_CHIMERASTATUE",
"MT_DRAGONSTATUE",
"MT_LIZARDMANSTATUE",
"MT_PEGASUSSTATUE",
"MT_ZELDAFIRE",
"MT_GANBARETHING",
"MT_GANBAREDUCK",
"MT_GANBARETREE",
"MT_MONOKUMA",
"MT_REDZELDAFIRE",
"MT_BOWLINGPIN",
"MT_MERRYAMBIENCE",
"MT_TWINKLECARTAMBIENCE",
"MT_EXPLODINGBARREL",
"MT_MERRYHORSE",
"MT_ARIDTOAD",
"MT_BLUEFRUIT",
"MT_ORANGEFRUIT",
"MT_REDFRUIT",
"MT_PINKFRUIT",
"MT_ADVENTURESPIKEA",
"MT_ADVENTURESPIKEB",
"MT_ADVENTURESPIKEC",
"MT_BOOSTPROMPT",
"MT_BOOSTOFF",
"MT_BOOSTON",
"MT_LIZARDMAN",
"MT_LIONMAN",
"MT_MOUSEMAN",
#ifdef SEENAMES
"MT_NAMECHECK",
#endif

View File

@ -460,6 +460,7 @@ extern tic_t wantedcalcdelay;
extern tic_t indirectitemcooldown;
extern tic_t mapreset;
extern UINT8 nospectategrief;
extern boolean thwompsactive;
extern boolean legitimateexit;
extern boolean comebackshowninfo;

View File

@ -266,6 +266,7 @@ tic_t wantedcalcdelay; // Time before it recalculates WANTED
tic_t indirectitemcooldown; // Cooldown before any more Shrink, SPB, or any other item that works indirectly is awarded
tic_t mapreset; // Map reset delay when enough players have joined an empty game
UINT8 nospectategrief; // How many players need to be in-game to eliminate last; for preventing spectate griefing
boolean thwompsactive; // Thwomps activate on lap 2
// Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players)
boolean legitimateexit; // Did this client actually finish the match?

2885
src/info.c

File diff suppressed because it is too large Load Diff

View File

@ -177,6 +177,7 @@ void A_RoamingShadowThinker(); // SRB2kart: Roaming Shadow moving + attacking pl
void A_MayonakaArrow(); //SRB2kart: midnight channel arrow sign
void A_ReaperThinker(); //SRB2kart: mementos reaper
void A_MementosTPParticles(); //SRB2kart: mementos teleporter particles. Man that's a lot of actions for my shite.
void A_FlameParticle(); // SRB2kart
void A_OrbitNights();
void A_GhostMe();
void A_SetObjectState();
@ -670,6 +671,35 @@ typedef enum sprite
SPR_FZBM,
SPR_FPRT,
// Various plants
SPR_SBUS,
SPR_SHRB,
SPR_TWEE,
SPR_MARB, // Marble Zone sprites
SPR_FUFO, // CD Special Stage UFO (don't ask me why it begins with an F)
SPR_RUST, // Rusty Rig sprites
SPR_BLON, // D2 Balloon Panic
SPR_VAPE, // Volcanic Valley
// Hill Top Zone
SPR_HTZA,
SPR_HTZB,
// Ports of gardens
SPR_SGVA,
SPR_SGVB,
SPR_SGVC,
SPR_PGTR,
SPR_PGF1,
SPR_PGF2,
SPR_PGF3,
SPR_PGBH,
SPR_DPLR,
// Midnight Channel stuff:
SPR_SPTL, // Spotlight
SPR_ENM1, // Shadows (Roaming and static)
@ -685,7 +715,74 @@ typedef enum sprite
SPR_CDMO,
SPR_CDBU,
SPR_VIEW, // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw!
// Daytona Speedway
SPR_PINE,
// Egg Zeppelin
SPR_PPLR,
// Desert Palace
SPR_DPPT,
// Aurora Atoll
SPR_AATR,
SPR_COCO,
// Barren Badlands
SPR_BDST,
SPR_FROG,
SPR_CBRA,
SPR_HOLE,
SPR_BBRA,
// Eerie Grove
SPR_EGFG,
// SMK ports
SPR_SMKP,
SPR_MTYM,
SPR_THWP,
SPR_SNOB,
SPR_ICEB,
// Ezo's maps - many single-use sprites!
SPR_CNDL,
SPR_DOCH,
SPR_DUCK,
SPR_GTRE,
SPR_CHES,
SPR_CHIM,
SPR_DRGN,
SPR_LZMN,
SPR_PGSS,
SPR_ZTCH,
SPR_MKMA,
SPR_MKMP,
SPR_RTCH,
SPR_BOWL,
SPR_BOWH,
SPR_BRRL,
SPR_BRRR,
SPR_HRSE,
SPR_TOAH,
SPR_BFRT,
SPR_OFRT,
SPR_RFRT,
SPR_PFRT,
SPR_ASPK,
SPR_HBST,
SPR_HBSO,
SPR_HBSF,
SPR_WBLZ,
SPR_WBLN,
SPR_MSMF,
// Xmas-specific sprites that don't fit aboxe
SPR_XMS4,
SPR_XMS5,
// First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later
SPR_VIEW,
SPR_FIRSTFREESLOT,
SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1,
@ -2142,6 +2239,10 @@ typedef enum state
S_XMASPOLE,
S_CANDYCANE,
S_SNOWMAN,
S_SNOWMANHAT,
S_LAMPPOST1,
S_LAMPPOST2,
S_HANGSTAR,
// Botanic Serenity's loads of scenery states
S_BSZTALLFLOWER_RED,
@ -3198,31 +3299,31 @@ typedef enum state
S_ROCKETSNEAKER_RVIBRATE,
//{ Eggman Monitor
S_FAKEITEM1,
S_FAKEITEM2,
S_FAKEITEM3,
S_FAKEITEM4,
S_FAKEITEM5,
S_FAKEITEM6,
S_FAKEITEM7,
S_FAKEITEM8,
S_FAKEITEM9,
S_FAKEITEM10,
S_FAKEITEM11,
S_FAKEITEM12,
S_FAKEITEM13,
S_FAKEITEM14,
S_FAKEITEM15,
S_FAKEITEM16,
S_FAKEITEM17,
S_FAKEITEM18,
S_FAKEITEM19,
S_FAKEITEM20,
S_FAKEITEM21,
S_FAKEITEM22,
S_FAKEITEM23,
S_FAKEITEM24,
S_DEADFAKEITEM,
S_EGGMANITEM1,
S_EGGMANITEM2,
S_EGGMANITEM3,
S_EGGMANITEM4,
S_EGGMANITEM5,
S_EGGMANITEM6,
S_EGGMANITEM7,
S_EGGMANITEM8,
S_EGGMANITEM9,
S_EGGMANITEM10,
S_EGGMANITEM11,
S_EGGMANITEM12,
S_EGGMANITEM13,
S_EGGMANITEM14,
S_EGGMANITEM15,
S_EGGMANITEM16,
S_EGGMANITEM17,
S_EGGMANITEM18,
S_EGGMANITEM19,
S_EGGMANITEM20,
S_EGGMANITEM21,
S_EGGMANITEM22,
S_EGGMANITEM23,
S_EGGMANITEM24,
S_EGGMANITEM_DEAD,
//}
// Banana
@ -3732,6 +3833,62 @@ typedef enum state
S_FZSLOWSMOKE4,
S_FZSLOWSMOKE5,
// Various plants
S_SONICBUSH,
S_SHRUB,
S_TALLBUSH,
S_AZURECITYTREE,
// Marble Zone
S_FLAMEPARTICLE,
S_MARBLETORCH,
S_MARBLELIGHT,
S_MARBLEBURNER,
// CD Special Stage
S_CDUFO,
S_CDUFO_DIE,
// Rusty Rig
S_RUSTYLAMP_ORANGE,
S_RUSTYCHAIN,
// D2 Balloon Panic
S_BALLOON,
S_BALLOONPOP1,
S_BALLOONPOP2,
S_BALLOONPOP3,
// Smokin' & Vapin' (Don't try this at home, kids!)
S_PETSMOKE0,
S_PETSMOKE1,
S_PETSMOKE2,
S_PETSMOKE3,
S_PETSMOKE4,
S_PETSMOKE5,
S_VVVAPING0,
S_VVVAPING1,
S_VVVAPING2,
S_VVVAPING3,
S_VVVAPING4,
S_VVVAPING5,
S_VVVAPE,
// Hill Top Zone
S_HTZTREE,
S_HTZBUSH,
// Ports of gardens
S_SGVINE1,
S_SGVINE2,
S_SGVINE3,
S_PGTREE,
S_PGFLOWER1,
S_PGFLOWER2,
S_PGFLOWER3,
S_PGBUSH,
S_DHPILLAR,
// Midnight Channel stuff:
S_SPOTLIGHT, // Spotlight decoration
S_RANDOMSHADOW, // Random Shadow. They're static and don't do nothing.
@ -3764,6 +3921,157 @@ typedef enum state
S_CDTREEASP,
S_CDTREEBSP,
// Daytona Speedway
S_PINETREE,
S_PINETREE_SIDE,
// Egg Zeppelin
S_EZZPROPELLER,
S_EZZPROPELLER_BLADE,
// Desert Palace
S_DP_PALMTREE,
// Aurora Atoll
S_AAZTREE_SEG,
S_AAZTREE_COCONUT,
S_AAZTREE_LEAF,
// Barren Badlands
S_BBZDUST1, // Dust
S_BBZDUST2,
S_BBZDUST3,
S_BBZDUST4,
S_FROGGER, // Frog badniks
S_FROGGER_ATTACK,
S_FROGGER_JUMP,
S_FROGTONGUE,
S_FROGTONGUE_JOINT,
S_ROBRA, // Black cobra badniks
S_ROBRA_HEAD,
S_ROBRA_JOINT,
S_ROBRASHELL_INSIDE,
S_ROBRASHELL_OUTSIDE,
S_BLUEROBRA, // Blue cobra badniks
S_BLUEROBRA_HEAD,
S_BLUEROBRA_JOINT,
// Eerie Grove
S_EERIEFOG1,
S_EERIEFOG2,
S_EERIEFOG3,
S_EERIEFOG4,
S_EERIEFOG5,
// SMK ports
S_SMK_PIPE1, // Generic pipes
S_SMK_PIPE2,
S_SMK_MOLE, // Donut Plains Monty Moles
S_SMK_THWOMP, // Bowser Castle Thwomps
S_SMK_SNOWBALL, // Vanilla Lake snowballs
S_SMK_ICEBLOCK, // Vanilla Lake breakable ice blocks
S_SMK_ICEBLOCK2,
S_SMK_ICEBLOCK_DEBRIS,
S_SMK_ICEBLOCK_DEBRIS2,
// Ezo's maps
S_BLUEFIRE1,
S_BLUEFIRE2,
S_BLUEFIRE3,
S_BLUEFIRE4,
S_GREENFIRE1,
S_GREENFIRE2,
S_GREENFIRE3,
S_GREENFIRE4,
S_REGALCHEST,
S_CHIMERASTATUE,
S_DRAGONSTATUE,
S_LIZARDMANSTATUE,
S_PEGASUSSTATUE,
S_ZELDAFIRE1,
S_ZELDAFIRE2,
S_ZELDAFIRE3,
S_ZELDAFIRE4,
S_GANBARETHING,
S_GANBAREDUCK,
S_GANBARETREE,
S_MONOIDLE,
S_MONOCHASE1,
S_MONOCHASE2,
S_MONOCHASE3,
S_MONOCHASE4,
S_MONOPAIN,
S_REDZELDAFIRE1,
S_REDZELDAFIRE2,
S_REDZELDAFIRE3,
S_REDZELDAFIRE4,
S_BOWLINGPIN,
S_BOWLINGHIT1,
S_BOWLINGHIT2,
S_BOWLINGHIT3,
S_BOWLINGHIT4,
S_ARIDTOAD,
S_TOADHIT1,
S_TOADHIT2,
S_TOADHIT3,
S_TOADHIT4,
S_EBARRELIDLE,
S_EBARREL1,
S_EBARREL2,
S_EBARREL3,
S_EBARREL4,
S_EBARREL5,
S_EBARREL6,
S_EBARREL7,
S_EBARREL8,
S_EBARREL9,
S_EBARREL10,
S_EBARREL11,
S_EBARREL12,
S_EBARREL13,
S_EBARREL14,
S_EBARREL15,
S_EBARREL16,
S_EBARREL17,
S_EBARREL18,
S_MERRYHORSE,
S_BLUEFRUIT,
S_ORANGEFRUIT,
S_REDFRUIT,
S_PINKFRUIT,
S_ADVENTURESPIKEA1,
S_ADVENTURESPIKEA2,
S_ADVENTURESPIKEB1,
S_ADVENTURESPIKEB2,
S_ADVENTURESPIKEC1,
S_ADVENTURESPIKEC2,
S_BOOSTPROMPT1,
S_BOOSTPROMPT2,
S_BOOSTOFF1,
S_BOOSTOFF2,
S_BOOSTON1,
S_BOOSTON2,
S_LIZARDMAN,
S_LIONMAN,
S_MOUSEMAN1,
S_MOUSEMAN2,
#ifdef SEENAMES
S_NAMECHECK,
#endif
@ -4067,6 +4375,10 @@ typedef enum mobj_type
MT_XMASPOLE,
MT_CANDYCANE,
MT_SNOWMAN,
MT_SNOWMANHAT,
MT_LAMPPOST1,
MT_LAMPPOST2,
MT_HANGSTAR,
// Botanic Serenity scenery
MT_BSZTALLFLOWER_RED,
@ -4316,8 +4628,8 @@ typedef enum mobj_type
MT_ROCKETSNEAKER,
MT_FAKESHIELD,
MT_FAKEITEM,
MT_EGGMANITEM, // Eggman items
MT_EGGMANITEM_SHIELD,
MT_BANANA, // Banana Stuff
MT_BANANA_SHIELD,
@ -4438,6 +4750,48 @@ typedef enum mobj_type
MT_FZEROBOOM,
// Various plants
MT_SONICBUSH,
MT_SHRUB,
MT_TALLBUSH,
MT_AZURECITYTREE,
// Marble Zone
MT_FLAMEPARTICLE,
MT_MARBLETORCH,
MT_MARBLELIGHT,
MT_MARBLEBURNER,
// CD Special Stage
MT_CDUFO,
// Rusty Rig
MT_RUSTYLAMP_ORANGE,
MT_RUSTYCHAIN,
// D2 Balloon Panic
MT_BALLOON,
// Smokin' & Vapin' (Don't try this at home, kids!)
MT_PETSMOKER,
MT_PETSMOKE,
MT_VVVAPE,
// Hill Top Zone
MT_HTZTREE,
MT_HTZBUSH,
// Ports of gardens
MT_SGVINE1,
MT_SGVINE2,
MT_SGVINE3,
MT_PGTREE,
MT_PGFLOWER1,
MT_PGFLOWER2,
MT_PGFLOWER3,
MT_PGBUSH,
MT_DHPILLAR,
// Midnight Channel stuff:
MT_SPOTLIGHT, // Spotlight Object
MT_RANDOMSHADOW, // Random static Shadows.
@ -4458,6 +4812,83 @@ typedef enum mobj_type
MT_CDTREEA,
MT_CDTREEB,
// Daytona Speedway
MT_PINETREE,
MT_PINETREE_SIDE,
// Egg Zeppelin
MT_EZZPROPELLER,
MT_EZZPROPELLER_BLADE,
// Desert Palace
MT_DP_PALMTREE,
// Aurora Atoll
MT_AAZTREE_HELPER,
MT_AAZTREE_SEG,
MT_AAZTREE_COCONUT,
MT_AAZTREE_LEAF,
// Barren Badlands
MT_BBZDUST,
MT_FROGGER,
MT_FROGTONGUE,
MT_FROGTONGUE_JOINT,
MT_ROBRA,
MT_ROBRA_HEAD,
MT_ROBRA_JOINT,
MT_BLUEROBRA,
MT_BLUEROBRA_HEAD,
MT_BLUEROBRA_JOINT,
// Eerie Grove
MT_EERIEFOG,
MT_EERIEFOGGEN,
// SMK ports
MT_SMK_PIPE,
MT_SMK_MOLESPAWNER,
MT_SMK_MOLE,
MT_SMK_THWOMP,
MT_SMK_SNOWBALL,
MT_SMK_ICEBLOCK,
MT_SMK_ICEBLOCK_SIDE,
MT_SMK_ICEBLOCK_DEBRIS,
// Ezo's maps
MT_BLUEFIRE,
MT_GREENFIRE,
MT_REGALCHEST,
MT_CHIMERASTATUE,
MT_DRAGONSTATUE,
MT_LIZARDMANSTATUE,
MT_PEGASUSSTATUE,
MT_ZELDAFIRE,
MT_GANBARETHING,
MT_GANBAREDUCK,
MT_GANBARETREE,
MT_MONOKUMA,
MT_REDZELDAFIRE,
MT_BOWLINGPIN,
MT_MERRYAMBIENCE,
MT_TWINKLECARTAMBIENCE,
MT_EXPLODINGBARREL,
MT_MERRYHORSE,
MT_ARIDTOAD,
MT_BLUEFRUIT,
MT_ORANGEFRUIT,
MT_REDFRUIT,
MT_PINKFRUIT,
MT_ADVENTURESPIKEA,
MT_ADVENTURESPIKEB,
MT_ADVENTURESPIKEC,
MT_BOOSTPROMPT,
MT_BOOSTOFF,
MT_BOOSTON,
MT_LIZARDMAN,
MT_LIONMAN,
MT_MOUSEMAN,
#ifdef SEENAMES
MT_NAMECHECK,
#endif

View File

@ -3283,9 +3283,9 @@ void K_DropHnextList(player_t *player)
dropall = false;
type = MT_SSMINE;
break;
case MT_FAKESHIELD:
case MT_EGGMANITEM_SHIELD:
orbit = false;
type = MT_FAKEITEM;
type = MT_EGGMANITEM;
break;
// intentionally do nothing
case MT_SINK_SHIELD:
@ -3553,7 +3553,7 @@ static void K_MoveHeldObjects(player_t *player)
break;
case MT_BANANA_SHIELD: // Kart trailing items
case MT_SSMINE_SHIELD:
case MT_FAKESHIELD:
case MT_EGGMANITEM_SHIELD:
case MT_SINK_SHIELD:
{
mobj_t *cur = player->mo->hnext;
@ -4741,7 +4741,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
}
else
{
newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FAKEITEM);
newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EGGMANITEM);
if (player->kartstuff[k_eggmanblame] >= 0
&& player->kartstuff[k_eggmanblame] < MAXPLAYERS
&& playeringame[player->kartstuff[k_eggmanblame]]
@ -4767,7 +4767,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
// Eggman Monitor throwing
else if (ATTACK_IS_DOWN && player->kartstuff[k_eggmanheld])
{
K_ThrowKartItem(player, false, MT_FAKEITEM, -1, 0);
K_ThrowKartItem(player, false, MT_EGGMANITEM, -1, 0);
K_PlayAttackTaunt(player->mo);
player->kartstuff[k_eggmanheld] = 0;
K_UpdateHnextList(player, true);
@ -4893,7 +4893,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->kartstuff[k_itemamount]--;
player->kartstuff[k_eggmanheld] = 1;
S_StartSound(player->mo, sfx_s254);
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FAKESHIELD);
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EGGMANITEM_SHIELD);
if (mo)
{
mo->flags |= MF_NOCLIPTHING;

View File

@ -201,6 +201,7 @@ void A_RoamingShadowThinker(mobj_t *actor); //SRB2kart
void A_MayonakaArrow(mobj_t *actor); //SRB2kart
void A_ReaperThinker(mobj_t *actor); //SRB2kart
void A_MementosTPParticles(mobj_t *actor); //SRB2kart
void A_FlameParticle(mobj_t *actor); // SRB2kart
void A_OrbitNights(mobj_t *actor);
void A_GhostMe(mobj_t *actor);
void A_SetObjectState(mobj_t *actor);
@ -8567,7 +8568,9 @@ void A_LightningFollowPlayer(mobj_t *actor)
if (LUA_CallAction("A_LightningFollowPlayer", actor))
return;
#endif
if (actor->target)
if (!actor->target)
return;
{
if (actor->extravalue1) // Make the radius also follow the player somewhat accuratly
{
@ -8582,7 +8585,6 @@ void A_LightningFollowPlayer(mobj_t *actor)
actor->momy = actor->target->momy;
actor->momz = actor->target->momz; // Give momentum since we don't teleport to our player literally every frame.
}
return;
}
// A_FZBoomFlash:
@ -9004,6 +9006,23 @@ void A_ReaperThinker(mobj_t *actor)
}
}
void A_FlameParticle(mobj_t *actor)
{
fixed_t rad = actor->radius>>FRACBITS, hei = actor->radius>>FRACBITS;
mobj_t *par;
#ifdef HAVE_BLUA
if (LUA_CallAction("A_FlameParticle", actor))
return;
#endif
par = P_SpawnMobj(
actor->x + (P_RandomRange(-rad, rad)<<FRACBITS),
actor->y + (P_RandomRange(-rad, rad)<<FRACBITS),
actor->z + (P_RandomRange(hei/2, hei)<<FRACBITS),
actor->info->painchance);
par->momz = actor->scale<<1;
}
//}
// Function: A_OrbitNights
@ -10319,6 +10338,8 @@ void A_SetScale(mobj_t *actor)
return;
}
locvar1 = FixedMul(locvar1, mapheaderinfo[gamemap-1]->mobj_scale); // SRB2Kart
target->destscale = locvar1; // destination scale
if (!(locvar2 & 65535))
P_SetScale(target, locvar1); // this instantly changes current scale to var1 if used, if not destscale will alter scale to var1 anyway
@ -11147,4 +11168,6 @@ void A_SpawnFreshCopy(mobj_t *actor)
if (newObject->info->seesound)
S_StartSound(newObject, newObject->info->seesound);
newObject->color = actor->color; // SRB2Kart
}

View File

@ -324,48 +324,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
return;
}
else if ((special->flags & MF_ENEMY) && !(special->flags & MF_MISSILE))
else if ((special->flags & MF_ENEMY) && !(special->flags & MF_MISSILE)
&& (special->type != MT_SPRINGSHELL)) // Kart: prevent random hits from these things
{
////////////////////////////////////////////////////////
/////ENEMIES!!//////////////////////////////////////////
////////////////////////////////////////////////////////
/*if (special->type == MT_GSNAPPER && !(((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|| player->powers[pw_invulnerability] || player->powers[pw_super])
&& toucher->z < special->z + special->height && toucher->z + toucher->height > special->z)
{
// Can only hit snapper from above
P_DamageMobj(toucher, special, special, 1);
}
else if (special->type == MT_SHARP
&& ((special->state == &states[special->info->xdeathstate]) || (toucher->z > special->z + special->height/2)))
{
// Cannot hit sharp from above or when red and angry
P_DamageMobj(toucher, special, special, 1);
}
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|| (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
{
if (P_MobjFlip(toucher)*toucher->momz < 0)
toucher->momz = -toucher->momz;
P_DamageMobj(special, toucher, toucher, 1);
}
else if (((toucher->z < special->z && !(toucher->eflags & MFE_VERTICALFLIP))
|| (toucher->z + toucher->height > special->z + special->height && (toucher->eflags & MFE_VERTICALFLIP))) // Flame is bad at logic - JTE
&& player->charability == CA_FLY
&& (player->powers[pw_tailsfly]
|| (toucher->state >= &states[S_PLAY_SPC1] && toucher->state <= &states[S_PLAY_SPC4]))) // Tails can shred stuff with his propeller.
{
if (P_MobjFlip(toucher)*toucher->momz < 0)
toucher->momz = -toucher->momz/2;
P_DamageMobj(special, toucher, toucher, 1);
}
// SRB2kart - Removed: No more fly states
else*/
P_DamageMobj(toucher, special, special, 1);
P_DamageMobj(toucher, special, special, 1);
return;
}
else if (special->flags & MF_FIRE)
@ -424,8 +386,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_SetTarget(&special->target, toucher);
P_KillMobj(special, toucher, toucher);
break;
case MT_FAKESHIELD: // SRB2kart
case MT_FAKEITEM:
case MT_EGGMANITEM_SHIELD: // SRB2kart
case MT_EGGMANITEM:
if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0))
return;
@ -631,8 +593,54 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
}
else
K_SpinPlayer(player, special, 0, false);
return;
/*case MT_EERIEFOG:
special->frame &= ~FF_TRANS80;
special->frame |= FF_TRANS90;
return;*/
case MT_SMK_MOLE:
if (special->target && !P_MobjWasRemoved(special->target))
return;
if (special->health <= 0 || toucher->health <= 0)
return;
if (!player->mo || player->spectator)
return;
// kill
if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0)
{
P_KillMobj(special, toucher, toucher);
return;
}
// no interaction
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0
|| player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0)
return;
// attach to player!
P_SetTarget(&special->target, toucher);
S_StartSound(special, sfx_s1a2);
return;
case MT_CDUFO: // SRB2kart
if (special->fuse || !P_CanPickupItem(player, 1) || (G_BattleGametype() && player->kartstuff[k_bumper] <= 0))
return;
player->kartstuff[k_itemroulette] = 1;
player->kartstuff[k_roulettetype] = 1;
S_StartSound(toucher, sfx_cdfm73); // they don't make this sound in the original game but it's nice to have a "reward" for good play
//special->momx = special->momy = special->momz = 0;
special->momz = -(3*special->scale)/2;
//P_SetTarget(&special->target, toucher);
special->fuse = 2*TICRATE;
break;
case MT_BALLOON: // SRB2kart
P_SetObjectMomZ(toucher, 20<<FRACBITS, false);
break;
// ***************************************** //
// Rings, coins, spheres, weapon panels, etc //
@ -2057,7 +2065,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
&& !(target->type == MT_ORBINAUT || target->type == MT_ORBINAUT_SHIELD
|| target->type == MT_JAWZ || target->type == MT_JAWZ_DUD || target->type == MT_JAWZ_SHIELD
|| target->type == MT_BANANA || target->type == MT_BANANA_SHIELD
|| target->type == MT_FAKEITEM || target->type == MT_FAKESHIELD
|| target->type == MT_EGGMANITEM || target->type == MT_EGGMANITEM_SHIELD
|| target->type == MT_BALLHOG || target->type == MT_SPB)) // kart dead items
target->flags |= MF_NOGRAVITY; // Don't drop Tails 03-08-2000
else
@ -2081,7 +2089,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
// I wish I knew a better way to do this
if (target->target && target->target->player && target->target->player->mo)
{
if (target->target->player->kartstuff[k_eggmanheld] && target->type == MT_FAKESHIELD)
if (target->target->player->kartstuff[k_eggmanheld] && target->type == MT_EGGMANITEM_SHIELD)
target->target->player->kartstuff[k_eggmanheld] = 0;
if (target->target->player->kartstuff[k_itemheld])
@ -2427,6 +2435,21 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
else
P_PlayDeathSound(target);
break;
// SRB2Kart:
case MT_SMK_ICEBLOCK:
{
mobj_t *cur = target->hnext;
while (cur && !P_MobjWasRemoved(cur))
{
P_SetMobjState(cur, S_SMK_ICEBLOCK2);
cur = cur->hnext;
}
target->fuse = 10;
S_StartSound(target, sfx_s3k80);
}
break;
default:
break;
}
@ -2487,6 +2510,40 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
target->z += P_MobjFlip(target)*20*target->scale;
}
// kill tracer
if (target->type == MT_FROGGER)
{
if (target->tracer && !P_MobjWasRemoved(target->tracer))
P_KillMobj(target->tracer, inflictor, source);
}
if (target->type == MT_FROGGER || target->type == MT_ROBRA_HEAD || target->type == MT_BLUEROBRA_HEAD) // clean hnext list
{
mobj_t *cur = target->hnext;
while (cur && !P_MobjWasRemoved(cur))
{
P_KillMobj(cur, inflictor, source);
cur = cur->hnext;
}
}
// Bounce up on death
if (target->type == MT_SMK_PIPE || target->type == MT_SMK_MOLE || target->type == MT_SMK_THWOMP)
{
target->flags &= (~MF_NOGRAVITY);
if (target->eflags & MFE_VERTICALFLIP)
target->z -= target->height;
else
target->z += target->height;
S_StartSound(target, target->info->deathsound);
P_SetObjectMomZ(target, 8<<FRACBITS, false);
if (inflictor)
P_InstaThrust(target, R_PointToAngle2(inflictor->x, inflictor->y, target->x, target->y)+ANGLE_90, 16<<FRACBITS);
}
if (target->type == MT_SPIKE && inflictor && target->info->deathstate != S_NULL)
{
const fixed_t x=target->x,y=target->y,z=target->z;
@ -3263,7 +3320,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
{
if (inflictor && (inflictor->type == MT_ORBINAUT || inflictor->type == MT_ORBINAUT_SHIELD
|| inflictor->type == MT_JAWZ || inflictor->type == MT_JAWZ_SHIELD || inflictor->type == MT_JAWZ_DUD
|| inflictor->player))
|| inflictor->type == MT_SMK_THWOMP || inflictor->player))
{
player->kartstuff[k_sneakertimer] = 0;
K_SpinPlayer(player, source, 1, false);

View File

@ -663,10 +663,41 @@ static boolean PIT_CheckThing(mobj_t *thing)
}
}
// SRB2kart 011617 - Colission code for kart items //{
// SRB2kart 011617 - Colission[sic] code for kart items //{
if (thing->type == MT_SMK_ICEBLOCK)
{
// see if it went over / under
if (tmthing->z > thing->z + thing->height)
return true; // overhead
if (tmthing->z + tmthing->height < thing->z)
return true; // underneath
if (!(tmthing->flags & MF_SOLID || tmthing->flags & MF_SHOOTABLE || tmthing->flags & MF_BOUNCE))
return true;
if (!(tmthing->health))
return true;
if (tmthing->type == MT_BANANA || tmthing->type == MT_BANANA_SHIELD
|| tmthing->type == MT_EGGMANITEM || tmthing->type == MT_EGGMANITEM_SHIELD
|| tmthing->type == MT_SSMINE || tmthing->type == MT_SSMINE_SHIELD
|| tmthing->type == MT_ORBINAUT_SHIELD || tmthing->type == MT_JAWZ_SHIELD)
return false;
if (thing->health)
P_KillMobj(thing, tmthing, tmthing);
/*if (tmthing->player && (tmthing->player->kartstuff[k_invincibilitytimer] > 0
|| tmthing->player->kartstuff[k_growshrinktimer] > 0))
return true;*/
K_KartBouncing(tmthing, thing, false, true);
return false;
}
// Push fakes out of other items
if (tmthing->type == MT_FAKEITEM && (thing->type == MT_RANDOMITEM || thing->type == MT_FAKEITEM))
if (tmthing->type == MT_EGGMANITEM && (thing->type == MT_RANDOMITEM || thing->type == MT_EGGMANITEM))
{
// see if it went over / under
if (tmthing->z > thing->z + thing->height)
@ -677,7 +708,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
P_InstaThrust(tmthing, R_PointToAngle2(thing->x, thing->y, tmthing->x, tmthing->y), thing->radius/4);
return true;
}
else if (thing->type == MT_FAKEITEM && (tmthing->type == MT_RANDOMITEM || tmthing->type == MT_FAKEITEM))
else if (thing->type == MT_EGGMANITEM && (tmthing->type == MT_RANDOMITEM || tmthing->type == MT_EGGMANITEM))
{
// see if it went over / under
if (tmthing->z > thing->z + thing->height)
@ -1562,6 +1593,106 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true;
}
else if (thing->type == MT_BLUEROBRA_HEAD || thing->type == MT_BLUEROBRA_JOINT)
{
// see if it went over / under
if (tmthing->z > thing->z + thing->height)
return true; // overhead
if (tmthing->z + tmthing->height < thing->z)
return true; // underneath
if (!thing->health)
return true; // dead
if (tmthing->player->kartstuff[k_invincibilitytimer] > 0
|| tmthing->player->kartstuff[k_growshrinktimer] > 0)
{
if (thing->type == MT_BLUEROBRA_JOINT)
P_KillMobj(thing->target, tmthing, tmthing);
else
P_KillMobj(thing, tmthing, tmthing);
return true;
}
else
{
K_KartBouncing(tmthing, thing, false, true);
return false;
}
}
else if (thing->type == MT_SMK_PIPE)
{
// see if it went over / under
if (tmthing->z > thing->z + thing->height)
return true; // overhead
if (tmthing->z + tmthing->height < thing->z)
return true; // underneath
if (!thing->health)
return true; // dead
if (tmthing->player->kartstuff[k_invincibilitytimer] > 0
|| tmthing->player->kartstuff[k_growshrinktimer] > 0)
{
P_KillMobj(thing, tmthing, tmthing);
return true; // kill
}
K_KartBouncing(tmthing, thing, false, true);
return false;
}
else if (thing->type == MT_SMK_THWOMP)
{
if (!thing->health)
return true; // dead
if (!thwompsactive)
return true; // not active yet
if ((tmthing->z < thing->z) && (thing->z >= thing->movefactor-(256<<FRACBITS)))
{
thing->extravalue1 = 1; // purposely try to stomp on players early
//S_StartSound(thing, sfx_s1bb);
}
// see if it went over / under
if (tmthing->z > thing->z + thing->height)
return true; // overhead
if (tmthing->z + tmthing->height < thing->z)
return true; // underneath
// kill
if (tmthing->player->kartstuff[k_invincibilitytimer] > 0
|| tmthing->player->kartstuff[k_growshrinktimer] > 0)
{
P_KillMobj(thing, tmthing, tmthing);
return true;
}
// continue to squish
if (tmthing->player->kartstuff[k_squishedtimer])
{
tmthing->player->kartstuff[k_squishedtimer] = 2*TICRATE;
tmthing->player->powers[pw_flashing] = K_GetKartFlashing(tmthing->player);
return true;
}
// no interaction
if (tmthing->player->powers[pw_flashing] > 0 || tmthing->player->kartstuff[k_hyudorotimer] > 0
|| tmthing->player->kartstuff[k_spinouttimer] > 0) //|| tmthing->player->kartstuff[k_squishedtimer] > 0
return true;
// collide
if (tmthing->z < thing->z && thing->momz < 0)
K_SquishPlayer(tmthing->player, thing);
else
{
if (thing->flags2 & MF2_AMBUSH)
P_DamageMobj(tmthing, thing, thing, 1);
K_KartBouncing(tmthing, thing, false, true);
}
return false;
}
else if (thing->flags & MF_SOLID)
{
// see if it went over / under
@ -1575,7 +1706,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
else
K_KartBouncing(tmthing, thing, false, true);
return true;
return false;
}
// Are you touching the side of the object you're interacting with?
else if (thing->z - FixedMul(FRACUNIT, thing->scale) <= tmthing->z + tmthing->height

View File

@ -1403,7 +1403,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
gravityadd >>= 1;
break;
case MT_BANANA:
case MT_FAKEITEM:
case MT_EGGMANITEM:
case MT_SSMINE:
gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2);
break;
@ -2345,7 +2345,7 @@ static boolean P_ZMovement(mobj_t *mo)
case MT_SHELL:
// SRB2kart stuff that should die in pits
// Shouldn't stop moving along the Z if there's no speed though!
case MT_FAKEITEM:
case MT_EGGMANITEM:
case MT_BANANA:
case MT_ORBINAUT:
case MT_JAWZ:
@ -6298,6 +6298,8 @@ void P_RunShadows(void)
for (mobj = shadowcap; mobj; mobj = next)
{
fixed_t floorz;
next = mobj->hnext;
P_SetTarget(&mobj->hnext, NULL);
@ -6307,37 +6309,16 @@ void P_RunShadows(void)
continue; // shouldn't you already be dead?
}
if ((mobj->target->flags2 & MF2_DONTDRAW)
|| (((mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z+mobj->target->height > mobj->target->ceilingz)
|| (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < mobj->target->floorz)))
if (mobj->target->player)
floorz = mobj->target->floorz;
else // FOR SOME REASON, plain floorz is not reliable for normal objects, only players?!
floorz = P_FloorzAtPos(mobj->target->x, mobj->target->y, mobj->target->z, mobj->target->height);
K_MatchGenericExtraFlags(mobj, mobj->target);
if (((mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z+mobj->target->height > mobj->target->ceilingz)
|| (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz))
mobj->flags2 |= MF2_DONTDRAW;
else
mobj->flags2 &= ~MF2_DONTDRAW;
if (mobj->target->eflags & MFE_VERTICALFLIP)
mobj->eflags |= MFE_VERTICALFLIP;
else
mobj->eflags &= ~MFE_VERTICALFLIP;
if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann...
mobj->eflags |= MFE_DRAWONLYFORP1;
else
mobj->eflags &= ~MFE_DRAWONLYFORP1;
if (mobj->target->eflags & MFE_DRAWONLYFORP2)
mobj->eflags |= MFE_DRAWONLYFORP2;
else
mobj->eflags &= ~MFE_DRAWONLYFORP2;
if (mobj->target->eflags & MFE_DRAWONLYFORP3)
mobj->eflags |= MFE_DRAWONLYFORP3;
else
mobj->eflags &= ~MFE_DRAWONLYFORP3;
if (mobj->target->eflags & MFE_DRAWONLYFORP4)
mobj->eflags |= MFE_DRAWONLYFORP4;
else
mobj->eflags &= ~MFE_DRAWONLYFORP4;
// First scale to the same radius
P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius));
@ -6350,12 +6331,12 @@ void P_RunShadows(void)
P_TeleportMove(mobj, dest->x, dest->y, mobj->target->z);
if (((mobj->eflags & MFE_VERTICALFLIP) && (mobj->ceilingz > mobj->z+mobj->height))
|| (!(mobj->eflags & MFE_VERTICALFLIP) && (mobj->floorz < mobj->z)))
|| (!(mobj->eflags & MFE_VERTICALFLIP) && (floorz < mobj->z)))
{
INT32 i;
fixed_t prevz;
mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : mobj->floorz);
mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : floorz);
for (i = 0; i < MAXFFLOORS; i++)
{
@ -6367,7 +6348,7 @@ void P_RunShadows(void)
// Check new position to see if you should still be on that ledge
P_TeleportMove(mobj, dest->x, dest->y, mobj->z);
mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : mobj->floorz);
mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : floorz);
if (mobj->z == prevz)
break;
@ -6646,7 +6627,7 @@ void P_MobjThinker(mobj_t *mobj)
case MT_JAWZ_SHIELD:
case MT_BANANA_SHIELD:
case MT_SSMINE_SHIELD:
case MT_FAKESHIELD:
case MT_EGGMANITEM_SHIELD:
case MT_SINK_SHIELD:
if ((mobj->health > 0
&& (!mobj->target || !mobj->target->player || mobj->target->player->health <= 0 || mobj->target->player->spectator))
@ -6843,7 +6824,8 @@ void P_MobjThinker(mobj_t *mobj)
if (!mobj->tracer)
{
mobj->tracer = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY);
mobj_t *overlay = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY);
P_SetTarget(&mobj->tracer, overlay);
P_SetTarget(&mobj->tracer->target, mobj);
P_SetMobjState(mobj->tracer, S_PLAYERARROW_ITEM);
P_SetMobjState(mobj->tracer, S_ITEMICON); // null sprite and frame to be overwritten later
@ -7043,6 +7025,14 @@ void P_MobjThinker(mobj_t *mobj)
return;
}
break;
case MT_PETSMOKER:
if (!(leveltime % 10))
{
mobj_t *smok = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_PETSMOKE);
if (mobj->spawnpoint && mobj->spawnpoint->options & MTF_OBJECTSPECIAL)
P_SetMobjStateNF(smok, smok->info->painstate); // same function, diff sprite
}
break;
//}
case MT_WATERDROP:
P_SceneryCheckWater(mobj);
@ -7410,7 +7400,7 @@ void P_MobjThinker(mobj_t *mobj)
//{ SRB2kart Items - Death States
case MT_ORBINAUT:
case MT_BANANA:
case MT_FAKEITEM:
case MT_EGGMANITEM:
case MT_SPB:
if (mobj->z <= mobj->floorz)
{
@ -7420,7 +7410,7 @@ void P_MobjThinker(mobj_t *mobj)
// fallthru
case MT_ORBINAUT_SHIELD:
case MT_BANANA_SHIELD:
case MT_FAKESHIELD:
case MT_EGGMANITEM_SHIELD:
mobj->flags2 ^= MF2_DONTDRAW;
break;
case MT_JAWZ:
@ -7447,6 +7437,45 @@ void P_MobjThinker(mobj_t *mobj)
case MT_MINEEXPLOSIONSOUND:
P_RemoveMobj(mobj);
return;
case MT_CDUFO:
if (mobj->fuse > TICRATE)
mobj->flags2 ^= MF2_DONTDRAW; // only by good fortune does this end with it having MF2_DONTDRAW... don't touch!
break;
case MT_SMK_PIPE:
if (mobj->flags2 & MF2_AMBUSH)
P_SetMobjStateNF(mobj, mobj->info->seestate);
else
P_SetMobjStateNF(mobj, mobj->info->spawnstate);
/* FALLTHRU */
case MT_SMK_MOLE:
mobj->flags2 ^= MF2_DONTDRAW;
if (mobj->z <= mobj->floorz)
{
P_RemoveMobj(mobj);
return;
}
break;
case MT_SMK_THWOMP:
if (mobj->flags2 & MF2_AMBUSH)
{
mobj->colorized = true;
mobj->color = (1 + (leveltime % (MAXSKINCOLORS-1)));
mobj->frame |= FF_FULLBRIGHT;
}
else
{
mobj->colorized = false;
mobj->color = SKINCOLOR_NONE;
mobj->frame &= (~FF_FULLBRIGHT);
}
mobj->flags2 ^= MF2_DONTDRAW;
if (mobj->z <= mobj->floorz)
{
P_RemoveMobj(mobj);
return;
}
break;
//}
default:
break;
@ -7889,50 +7918,6 @@ void P_MobjThinker(mobj_t *mobj)
}
break;
//{ SRB2kart Items
case MT_POKEY:
if (mobj->threshold)
{
if (mobj->state == &states[S_POKEY1])
mobj->health = 1;
else if (mobj->state == &states[S_POKEY2])
mobj->health = 2;
else if (mobj->state == &states[S_POKEY3])
mobj->health = 3;
else if (mobj->state == &states[S_POKEY4])
mobj->health = 4;
else if (mobj->state == &states[S_POKEY5])
mobj->health = 5;
else if (mobj->state == &states[S_POKEY6])
mobj->health = 6;
else if (mobj->state == &states[S_POKEY7])
mobj->health = 7;
else if (mobj->state == &states[S_POKEY8])
mobj->health = 8;
mobj->threshold++;
P_SetMobjState(mobj, S_POKEYIDLE);
}
if (mobj->state == &states[S_POKEYIDLE] && mobj->threshold >= 105)
{
if (mobj->health == 1)
P_SetMobjState(mobj, S_POKEY1);
else if (mobj->health == 2)
P_SetMobjState(mobj, S_POKEY2);
else if (mobj->health == 3)
P_SetMobjState(mobj, S_POKEY3);
else if (mobj->health == 4)
P_SetMobjState(mobj, S_POKEY4);
else if (mobj->health == 5)
P_SetMobjState(mobj, S_POKEY5);
else if (mobj->health == 6)
P_SetMobjState(mobj, S_POKEY6);
else if (mobj->health == 7)
P_SetMobjState(mobj, S_POKEY7);
else if (mobj->health == 8)
P_SetMobjState(mobj, S_POKEY8);
mobj->threshold = 0;
}
break;
case MT_FLOATINGITEM:
{
if (mobj->flags & MF_NOCLIPTHING)
@ -8155,7 +8140,7 @@ void P_MobjThinker(mobj_t *mobj)
break;
}
case MT_BANANA:
case MT_FAKEITEM:
case MT_EGGMANITEM:
mobj->friction = ORIG_FRICTION/4;
if (mobj->momx || mobj->momy)
P_SpawnGhostMobj(mobj);
@ -8568,6 +8553,30 @@ void P_MobjThinker(mobj_t *mobj)
}
}
break;
case MT_CDUFO:
if (!mobj->spawnpoint || mobj->fuse)
break;
if (mobj->movecount)
{
mobj->movecount--;
break;
}
else if (P_AproxDistance(mobj->x - (mobj->spawnpoint->x<<FRACBITS), mobj->y - (mobj->spawnpoint->y<<FRACBITS)) < (420<<FRACBITS))
break;
mobj->movecount = 3;
{
angle_t facing = P_RandomRange(0, 90);
if (facing >= 45)
facing = InvAngle((facing - 45)*ANG1);
else
facing *= ANG1;
mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->spawnpoint->x<<FRACBITS, mobj->spawnpoint->y<<FRACBITS) + facing;
}
break;
case MT_FZEROBOOM: // F-Zero explosion
if (!mobj->extravalue1)
{
@ -8626,6 +8635,449 @@ void P_MobjThinker(mobj_t *mobj)
}
}
break;
case MT_EZZPROPELLER:
if (mobj->hnext)
{
mobj_t *cur = mobj->hnext;
while (cur && !P_MobjWasRemoved(cur))
{
cur->angle += FixedAngle(mobj->info->speed);
P_TeleportMove(cur, mobj->x + FINECOSINE((cur->angle*8)>>ANGLETOFINESHIFT),
mobj->y + FINESINE((cur->angle*8)>>ANGLETOFINESHIFT), mobj->z);
//P_SpawnGhostMobj(cur)->tics = 2;
cur = cur->hnext;
}
}
if (!S_SoundPlaying(mobj, mobj->info->seesound))
S_StartSound(mobj, mobj->info->seesound);
break;
case MT_FROGGER:
{
statenum_t frogstate = (mobj->state-states);
// FROG ATTACK VALUES:
// threshold: distance
// movecount: time
// lastlook: direction
// extravalue1: x step
// extravalue2: y step
// cusval: z step
if (frogstate == S_FROGGER)
{
mobj->threshold = mobj->movecount = mobj->lastlook = 0; // clear tongue attack
mobj->extravalue1 = mobj->extravalue2 = mobj->cusval = 0;
if (mobj->hnext) // Clean hnext list
{
mobj_t *cur = mobj->hnext;
while (cur && !P_MobjWasRemoved(cur))
{
mobj_t *next = cur->hnext;
P_RemoveMobj(cur);
cur = next;
}
}
if (mobj->reactiontime)
mobj->reactiontime--;
else
{
if (mobj->flags2 & MF2_AMBUSH)
{
mobj->momz = P_RandomRange(12, 16)<<FRACBITS;
S_StartSound(mobj, sfx_s3kb1);
P_SetMobjState(mobj, S_FROGGER_JUMP);
}
else
{
mobj_t *tongue = P_SpawnMobj(mobj->x, mobj->y, mobj->z + (mobj->height/2), MT_FROGTONGUE);
P_SetTarget(&mobj->tracer, tongue);
P_SetMobjState(mobj, S_FROGGER_ATTACK);
}
}
}
else if (frogstate == S_FROGGER_ATTACK)
{
if (!mobj->tracer || P_MobjWasRemoved(mobj->tracer))
{
mobj->reactiontime = mobj->info->reactiontime;
P_SetMobjState(mobj, S_FROGGER);
break;
}
if (mobj->threshold == 0)
{
fixed_t targetz = mobj->tracer->z; //mobj->z + (mobj->height/2)
mobj->threshold = 256;
mobj->movecount = 1;
mobj->lastlook = 1;
mobj->tracer->angle = mobj->angle;
mobj->extravalue1 = FixedMul(FixedMul((mobj->threshold/16)<<FRACBITS,
FINECOSINE(((angle_t)targetz)>>ANGLETOFINESHIFT)),
FINECOSINE(mobj->angle>>ANGLETOFINESHIFT)) >> FRACBITS;
mobj->extravalue2 = FixedMul(FixedMul((mobj->threshold/16)<<FRACBITS,
FINECOSINE(((angle_t)targetz)>>ANGLETOFINESHIFT)),
FINESINE(mobj->angle>>ANGLETOFINESHIFT)) >> FRACBITS;
mobj->cusval = FixedMul((mobj->threshold/16)<<FRACBITS,
FINESINE(((angle_t)targetz)>>ANGLETOFINESHIFT)) >> FRACBITS;
S_StartSound(mobj, sfx_s3k8c); // Play that tongue-y sound.
}
mobj->movecount += mobj->lastlook;
if (!(P_TryMove(mobj->tracer, mobj->x + ((mobj->extravalue1<<FRACBITS) * mobj->movecount), mobj->y + ((mobj->extravalue2<<FRACBITS) * mobj->movecount), true))
|| (mobj->movecount >= 16) // maximum travel time
|| (mobj->tracer->z <= mobj->tracer->floorz) // Through the floor
|| ((mobj->tracer->z + mobj->tracer->height) >= mobj->tracer->ceilingz)) // Through the ceiling
{
mobj->lastlook = -1; // Reverse direction.
}
if (mobj->movecount == 0) // It's back to its source, time to reset.
{
mobj->threshold = mobj->lastlook = 0;
P_RemoveMobj(mobj->tracer);
if (mobj->hnext) // Clean hnext list
{
mobj_t *cur = mobj->hnext;
while (cur && !P_MobjWasRemoved(cur))
{
mobj_t *next = cur->hnext;
P_RemoveMobj(cur);
cur = next;
}
}
mobj->reactiontime = mobj->info->reactiontime;
P_SetMobjState(mobj, S_FROGGER);
}
else
{
const UINT8 numjoints = 11;
UINT8 joint = numjoints;
mobj_t *cur = mobj->hnext, *prev = mobj;
mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->tracer->x, mobj->tracer->y);
for (; joint > 0; joint--)
{
fixed_t wx = mobj->tracer->x + (joint * (mobj->x - mobj->tracer->x) / (numjoints+1));
fixed_t wy = mobj->tracer->y + (joint * (mobj->y - mobj->tracer->y) / (numjoints+1));
fixed_t wz = mobj->tracer->z + (joint * ((mobj->z + (mobj->height/2)) - mobj->tracer->z) / (numjoints+1));
if (cur && !P_MobjWasRemoved(cur))
P_TeleportMove(cur, wx, wy, wz);
else
cur = P_SpawnMobj(wx, wy, wz, MT_FROGTONGUE_JOINT);
P_SetTarget(&cur->target, mobj);
P_SetTarget(&prev->hnext, cur);
P_SetTarget(&cur->hprev, prev);
prev = cur;
cur = cur->hnext;
}
}
}
else if (frogstate == S_FROGGER_JUMP)
{
if (P_IsObjectOnGround(mobj))
{
mobj->reactiontime = mobj->info->reactiontime;
P_SetMobjState(mobj, S_FROGGER);
}
}
}
break;
case MT_ROBRA:
case MT_BLUEROBRA:
if (mobj->health)
{
boolean blue = (mobj->type == MT_BLUEROBRA);
if (blue)
{
if (mobj->spawnpoint)
mobj->extravalue2 = mobj->spawnpoint->angle;
else
mobj->extravalue2 = 128;
}
else
{
if (!mobj->extravalue2)
mobj->extravalue2 = P_RandomRange(64, 192);
}
if (mobj->reactiontime)
mobj->reactiontime--;
else
{
if (!mobj->extravalue1)
{
mobj_t *head = P_SpawnMobj(mobj->x, mobj->y, mobj->z, (blue ? MT_BLUEROBRA_HEAD : MT_ROBRA_HEAD));
P_SetTarget(&mobj->tracer, head);
mobj->destscale = mapheaderinfo[gamemap-1]->mobj_scale;
P_SetTarget(&mobj->tracer->target, mobj->target);
P_SetTarget(&mobj->tracer->tracer, mobj);
mobj->tracer->extravalue2 = mobj->extravalue2;
if (!blue)
mobj->tracer->angle = mobj->angle;
mobj->extravalue1 = 1;
}
}
if ((mobj->extravalue1) && !(mobj->tracer && !P_MobjWasRemoved(mobj->tracer)))
{
mobj->reactiontime = 20*mobj->info->reactiontime;
P_SetTarget(&mobj->target, NULL);
mobj->extravalue1 = 0;
}
if ((mobj->tracer && !P_MobjWasRemoved(mobj->tracer)) && !(leveltime % 10))
{
mobj_t *dust = P_SpawnMobj(mobj->x + (P_RandomRange(-4, 4)<<FRACBITS),
mobj->y + (P_RandomRange(-4, 4)<<FRACBITS),
mobj->z + (P_RandomRange(0, 2)<<FRACBITS), MT_BBZDUST);
P_SetScale(dust, mobj->scale/2);
P_InstaThrust(dust, FixedAngle(P_RandomRange(0,359)<<FRACBITS), abs(mobj->tracer->momz)/2);
if (abs(mobj->tracer->momz) >= 2<<FRACBITS)
S_StartSound(mobj, sfx_s3k7e);
}
}
break;
case MT_ROBRA_HEAD:
case MT_BLUEROBRA_HEAD:
if (mobj->health)
{
boolean blue = (mobj->type == MT_BLUEROBRA_HEAD);
UINT8 numsegs = abs(mobj->z - mobj->floorz) / (32 * mobj->scale);
UINT8 i;
mobj_t *cur = mobj->hnext, *prev = mobj;
if (blue)
mobj->angle = (angle_t)mobj->extravalue1;
mobj->extravalue1 += (FixedAngle(2*mobj->momz) * (blue ? -1 : 1));
for (i = 0; i < numsegs*2; i++) // *2 to check for any extra segs still present
{
fixed_t segz = mobj->z - ((i+1) * (32 * mobj->scale));
if (cur && !P_MobjWasRemoved(cur))
{
if (i >= numsegs) // Remove extras
{
mobj_t *next = cur->hnext;
P_RemoveMobj(cur);
cur = next;
continue;
}
else // Move into place
P_TeleportMove(cur, mobj->x, mobj->y, segz);
}
else
{
if (i >= numsegs) // We're done with this list
continue; //break;
else // Need another here!
cur = P_SpawnMobj(mobj->x, mobj->y, segz, (blue ? MT_BLUEROBRA_JOINT : MT_ROBRA_JOINT));
}
P_SetTarget(&cur->target, mobj);
P_SetScale(cur, (7*mobj->scale)/8);
cur->angle = mobj->extravalue1;
mobj->extravalue1 += (FixedAngle(2*mobj->momz) * (blue ? -1 : 1));
P_SetTarget(&prev->hnext, cur);
P_SetTarget(&cur->hprev, prev);
prev = cur;
cur = cur->hnext;
}
{
//fixed_t ceilingheight = mobj->ceilingz - (72<<FRACBITS);
fixed_t floorheight = mobj->floorz + (72<<FRACBITS);
fixed_t maxheight = mobj->floorz + (mobj->extravalue2<<FRACBITS);
fixed_t targetheight = maxheight;
if (mobj->z < targetheight)
{
mobj->momz += mobj->info->speed;
if ((mobj->z < floorheight) && (mobj->momz < 0))
mobj->momz /= 2;
}
else
{
mobj->momz -= mobj->info->speed;
if ((mobj->z > (targetheight + (64<<FRACBITS))) && (mobj->momz > 0))
mobj->momz /= 2;
}
}
}
break;
case MT_ROBRA_JOINT:
case MT_BLUEROBRA_JOINT:
if (!mobj->target || P_MobjWasRemoved(mobj->target))
{
P_RemoveMobj(mobj);
return;
}
break;
case MT_SMK_PIPE:
if (mobj->flags2 & MF2_AMBUSH)
P_SetMobjStateNF(mobj, mobj->info->seestate);
else
P_SetMobjStateNF(mobj, mobj->info->spawnstate);
break;
case MT_SMK_MOLESPAWNER:
if (!mobj->target || P_MobjWasRemoved(mobj->target))
{
mobj_t *newmole = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_MOLE);
P_SetTarget(&mobj->target, newmole);
return;
}
break;
case MT_SMK_MOLE:
if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player)
{
player_t *player = mobj->target->player;
mobj->extravalue1 = 1;
player->kartstuff[k_offroad] += 2<<FRACBITS;
P_TeleportMove(mobj,
player->mo->x + P_ReturnThrustX(NULL, player->mo->angle, player->mo->radius)
+ P_ReturnThrustX(NULL, player->mo->angle+ANGLE_90, (mobj->threshold)<<FRACBITS),
player->mo->y + P_ReturnThrustY(NULL, player->mo->angle, player->mo->radius)
+ P_ReturnThrustY(NULL, player->mo->angle+ANGLE_90, (mobj->threshold)<<FRACBITS),
player->mo->z + (player->mo->height/2 * P_MobjFlip(player->mo))
+ (P_RandomRange(-abs(mobj->threshold), abs(mobj->threshold))<<FRACBITS));
mobj->threshold /= 2;
mobj->momz = 0;
if (mobj->movecount > 8*TICRATE)
{
P_KillMobj(mobj, mobj->target, mobj->target);
break;
}
if (abs(player->cmd.driftturn) > 100)
{
INT32 lastsign = 0;
if (mobj->lastlook > 0)
lastsign = 1;
else if (mobj->lastlook < 0)
lastsign = -1;
if ((player->cmd.driftturn > 0 && lastsign < 0)
|| (player->cmd.driftturn < 0 && lastsign > 0))
{
mobj->movecount += (TICRATE/2);
mobj->threshold = 16*lastsign;
S_StartSound(mobj, sfx_s1ab);
}
mobj->lastlook = player->cmd.driftturn;
}
mobj->movecount++;
}
else if (mobj->extravalue1) // lost your player somehow, DIE
{
P_KillMobj(mobj, NULL, NULL);
break;
}
else
{
if (P_IsObjectOnGround(mobj))
{
if (mobj->reactiontime)
mobj->reactiontime--;
else
{
mobj->momz = (mobj->info->speed * P_MobjFlip(mobj));
mobj->reactiontime = mobj->info->reactiontime;
}
}
}
break;
case MT_SMK_THWOMP:
if (mobj->flags2 & MF2_AMBUSH)
{
mobj->colorized = true;
mobj->color = (1 + (leveltime % (MAXSKINCOLORS-1)));
mobj->frame |= FF_FULLBRIGHT;
}
else
{
mobj->colorized = false;
mobj->color = SKINCOLOR_NONE;
mobj->frame &= (~FF_FULLBRIGHT);
}
if (!thwompsactive)
break;
if (mobj->reactiontime)
mobj->reactiontime--;
else
{
if (mobj->extravalue1)
{
P_SpawnGhostMobj(mobj)->tics = 3;
if (mobj->z == mobj->floorz)
{
UINT8 i;
mobj->extravalue1 = 0;
mobj->reactiontime = mobj->info->reactiontime;
S_StartSound(mobj, sfx_s1bd);
for (i = 0; i < 8; i++)
{
mobj_t *dust = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_DRIFTDUST);
P_InstaThrust(dust, FixedAngle(((360*FRACUNIT)/8) * i), mobj->info->speed/8);
dust->momz = P_MobjFlip(mobj) * (P_RandomRange(1,4)<<FRACBITS);
dust->scale = mobj->scale/2;
dust->destscale = mobj->scale*3;
}
}
else
mobj->momz = (-mobj->info->speed) * P_MobjFlip(mobj);
}
else
{
if (mobj->z > mobj->movefactor)
mobj->z = mobj->movefactor;
if (mobj->z == mobj->movefactor)
{
mobj->extravalue1 = 1;
//S_StartSound(mobj, sfx_s1bb);
}
else
mobj->momz = (mobj->info->speed/16) * P_MobjFlip(mobj);
}
}
break;
//}
case MT_TURRET:
P_MobjCheckWater(mobj);
@ -8920,6 +9372,31 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
return;
case MT_PLAYER:
break; // don't remove
case MT_SMK_ICEBLOCK:
{
mobj_t *cur = mobj->hnext, *next;
UINT8 i;
for (i = 0; i < 5; i++)
{
mobj_t *debris = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_ICEBLOCK_DEBRIS);
debris->angle = FixedAngle(P_RandomRange(0,360)<<FRACBITS);
P_InstaThrust(debris, debris->angle, P_RandomRange(3,18)*(FRACUNIT/4));
debris->momz = P_RandomRange(4,8)<<FRACBITS;
if (!i) // kinda hacky :V
S_StartSound(debris, sfx_s3k82);
}
while (cur && !P_MobjWasRemoved(cur))
{
next = cur->hnext;
P_RemoveMobj(cur);
cur = next;
}
P_RemoveMobj(mobj);
return;
}
default:
P_SetMobjState(mobj, mobj->info->xdeathstate); // will remove the mobj if S_NULL.
break;
@ -8927,7 +9404,7 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
if (P_MobjWasRemoved(mobj))
return;
}
else if (((mobj->type == MT_RANDOMITEM && mobj->threshold == 69) || mobj->type == MT_FAKEITEM || mobj->type == MT_FALLINGROCK) && mobj->fuse <= TICRATE)
else if (((mobj->type == MT_RANDOMITEM && mobj->threshold == 69) || mobj->type == MT_EGGMANITEM || mobj->type == MT_FALLINGROCK) && mobj->fuse <= TICRATE)
mobj->flags2 ^= MF2_DONTDRAW;
}
@ -9428,7 +9905,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
case MT_BLUEBALL:
nummaprings++;
break;
case MT_KARMAHITBOX: // SRB2Kart
// SRB2Kart
case MT_KARMAHITBOX:
{
const fixed_t rad = FixedMul(mobjinfo[MT_PLAYER].radius, mobj->scale);
mobj_t *cur, *prev = mobj;
@ -9495,6 +9973,109 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
mobj->color = SKINCOLOR_AQUA;
break;
}
case MT_MARBLETORCH:
P_SpawnMobj(mobj->x, mobj->y, mobj->z + (29*mobj->scale), MT_MARBLELIGHT);
break;
case MT_RUSTYLAMP_ORANGE:
P_SpawnMobj(mobj->x, mobj->y, mobj->z + (69*mobj->scale), MT_MARBLELIGHT);
break;
case MT_PINETREE:
{
angle_t diff = FixedAngle((360/mobj->info->mass)*FRACUNIT);
UINT8 i;
for (i = 0; i < mobj->info->mass; i++)
{
angle_t ang = i * diff;
mobj_t *side = P_SpawnMobj(mobj->x + FINECOSINE((ang>>ANGLETOFINESHIFT) & FINEMASK),
mobj->y + FINESINE((ang>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_PINETREE_SIDE);
side->angle = ang;
side->target = mobj;
side->threshold = i;
}
break;
}
case MT_EZZPROPELLER:
{
mobj_t *cur, *prev = mobj;
UINT8 i;
for (i = 0; i < mobj->info->mass; i++)
{
mobj->angle = FixedAngle((i * (360/mobj->info->mass))<<FRACBITS);
cur = P_SpawnMobj(mobj->x + FINECOSINE(((mobj->angle*8)>>ANGLETOFINESHIFT) & FINEMASK),
mobj->y + FINESINE(((mobj->angle*8)>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_EZZPROPELLER_BLADE);
cur->angle = mobj->angle;
P_SetTarget(&cur->hprev, prev);
P_SetTarget(&prev->hnext, cur);
prev = cur;
}
break;
}
case MT_ROBRA:
case MT_BLUEROBRA:
P_SetScale(mobj, (mobj->destscale = 1));
break;
case MT_ROBRA_HEAD:
{
mobj_t *shell;
shell = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY);
P_SetTarget(&shell->target, mobj);
P_SetMobjState(shell, S_ROBRASHELL_INSIDE);
shell = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY);
P_SetTarget(&shell->target, mobj);
P_SetMobjState(shell, S_ROBRASHELL_OUTSIDE);
}
break;
case MT_EERIEFOGGEN:
{
UINT16 i;
for (i = 0; i < mobj->info->mass; i++)
{
fixed_t newx = mobj->x + (P_RandomRange(-mobj->info->mass, mobj->info->mass)<<FRACBITS);
fixed_t newy = mobj->y + (P_RandomRange(-mobj->info->mass, mobj->info->mass)<<FRACBITS);
if (P_FloorzAtPos(newx, newy, mobj->z, 8<<FRACBITS) == mobj->z)
P_SpawnMobj(newx, newy, mobj->z, MT_EERIEFOG);
}
}
break;
case MT_SMK_MOLE:
mobj->reactiontime = P_RandomRange(0, 3*mobj->info->reactiontime/2); // Random delay on start of level
break;
case MT_SMK_THWOMP:
mobj->reactiontime = P_RandomRange(0, 3*mobj->info->reactiontime); // Random delay on start of level
if (mobj->z == mobj->floorz)
mobj->z += (256<<FRACBITS);
mobj->movefactor = mobj->z + (256<<FRACBITS);
break;
case MT_SMK_ICEBLOCK:
mobj->flags2 |= MF2_STANDONME;
{
mobj_t *cur, *prev = mobj;
UINT8 i;
for (i = 0; i < 4; i++)
{
cur = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_ICEBLOCK_SIDE);
P_SetTarget(&cur->target, mobj);
cur->threshold = i;
P_TeleportMove(cur, cur->x + ((cur->radius>>FRACBITS) * FINECOSINE((FixedAngle((90*cur->threshold)<<FRACBITS)>>ANGLETOFINESHIFT) & FINEMASK)),
cur->y + ((cur->radius>>FRACBITS) * FINESINE((FixedAngle((90*cur->threshold)<<FRACBITS)>>ANGLETOFINESHIFT) & FINEMASK)), cur->z);
cur->angle = ANGLE_90*(cur->threshold+1);
P_SetTarget(&cur->hprev, prev);
P_SetTarget(&prev->hnext, cur);
prev = cur;
}
}
break;
default:
break;
}
@ -9502,17 +10083,19 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
switch (mobj->type)
{
case MT_PLAYER:
case MT_BIGMACE: case MT_SMALLMACE:
case MT_SMALLMACE: case MT_BIGMACE:
case MT_PUMA: case MT_BIGPUMA:
case MT_FALLINGROCK:
case MT_SMK_MOLE: case MT_SMK_THWOMP:
//case MT_RANDOMITEM:
case MT_FLOATINGITEM:
case MT_BATTLEBUMPER:
case MT_BANANA: case MT_BANANA_SHIELD:
//case MT_FAKEITEM: case MT_FAKESHIELD:
//case MT_EGGMANITEM: case MT_EGGMANSHIELD:
case MT_ORBINAUT: case MT_ORBINAUT_SHIELD:
case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD:
case MT_SSMINE: case MT_SSMINE_SHIELD:
case MT_BALLHOG: case MT_SINK:
case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD:
case MT_SSMINE: case MT_SSMINE_SHIELD:
case MT_BALLHOG: case MT_SINK:
case MT_THUNDERSHIELD: case MT_ROCKETSNEAKER:
case MT_SPB:
P_SpawnShadowMobj(mobj);
@ -11155,6 +11738,50 @@ ML_NOCLIMB : Direction not controllable
case MT_TRAPGOYLELONG:
if (mthing->angle >= 360)
mobj->tics += 7*(mthing->angle / 360) + 1; // starting delay
break;
// SRB2Kart
case MT_BALLOON:
if (mthing->angle < MAXSKINCOLORS && mthing->angle > 0)
mobj->color = mthing->angle;
break;
case MT_AAZTREE_HELPER:
{
fixed_t top = mobj->z;
UINT8 numsegs = (mthing->extrainfo)+2;
UINT8 numleaves = max(3, (abs(mthing->angle+1) % 6) + 3);
UINT8 i;
mobj_t *coconut;
// Spawn tree segments
for (i = 0; i < numsegs; i++)
{
P_SpawnMobj(mobj->x, mobj->y, top, MT_AAZTREE_SEG);
top += FixedMul(mobjinfo[MT_AAZTREE_SEG].height, mobj->scale);
}
// Big coconut topper
coconut = P_SpawnMobj(mobj->x, mobj->y, top - (8<<FRACBITS), MT_AAZTREE_COCONUT);
P_SetScale(coconut, (coconut->destscale = (2*mobj->scale)));
// Spawn all of the papersprite leaves
for (i = 0; i < numleaves; i++)
{
mobj_t *leaf;
mobj->angle = FixedAngle((i * (360/numleaves))<<FRACBITS);
leaf = P_SpawnMobj(mobj->x + FINECOSINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK),
mobj->y + FINESINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK), top, MT_AAZTREE_LEAF);
leaf->angle = mobj->angle;
// Small coconut for each leaf
P_SpawnMobj(mobj->x + (32 * FINECOSINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK)),
mobj->y + (32 * FINESINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK)), top - (24<<FRACBITS), MT_AAZTREE_COCONUT);
}
P_RemoveMobj(mobj); // Don't need this helper obj anymore
return;
}
default:
break;
}

View File

@ -3286,6 +3286,7 @@ static void P_NetArchiveMisc(void)
WRITEUINT32(save_p, indirectitemcooldown);
WRITEUINT32(save_p, mapreset);
WRITEUINT8(save_p, nospectategrief);
WRITEUINT8(save_p, thwompsactive);
// Is it paused?
if (paused)
@ -3391,6 +3392,7 @@ static inline boolean P_NetUnArchiveMisc(void)
indirectitemcooldown = READUINT32(save_p);
mapreset = READUINT32(save_p);
nospectategrief = READUINT8(save_p);
thwompsactive = (boolean)READUINT8(save_p);
// Is it paused?
if (READUINT8(save_p) == 0x2f)

View File

@ -3025,6 +3025,7 @@ boolean P_SetupLevel(boolean skipprecip)
indirectitemcooldown = 0;
mapreset = 0;
nospectategrief = 0;
thwompsactive = false;
// clear special respawning que
iquehead = iquetail = 0;

View File

@ -4265,6 +4265,8 @@ DoneSection2:
// Figure out how many are playing on the last lap, to prevent spectate griefing
if (!nospectategrief && player->laps >= (UINT8)(cv_numlaps.value - 1))
nospectategrief = nump;
thwompsactive = true; // Lap 2 effects
}
else if (player->starpostnum)
{

View File

@ -846,7 +846,8 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor)
fixed_t fallbackspeed;
if (inflictor && (inflictor->type != MT_PLAYER && inflictor->type != MT_ORBINAUT && inflictor->type != MT_ORBINAUT_SHIELD
&& inflictor->type != MT_JAWZ && inflictor->type != MT_JAWZ_DUD && inflictor->type != MT_JAWZ_SHIELD))
&& inflictor->type != MT_JAWZ && inflictor->type != MT_JAWZ_DUD && inflictor->type != MT_JAWZ_SHIELD
&& inflictor->type != MT_SMK_THWOMP))
{
if (player->mo->eflags & MFE_VERTICALFLIP)
player->mo->z--;
@ -7747,7 +7748,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ || mo->type == MT_JAWZ_DUD
|| mo->type == MT_ORBINAUT_SHIELD || mo->type == MT_JAWZ_SHIELD
|| mo->type == MT_BANANA || mo->type == MT_BANANA_SHIELD
|| mo->type == MT_FAKEITEM || mo->type == MT_FAKESHIELD
|| mo->type == MT_EGGMANITEM || mo->type == MT_EGGMANITEM_SHIELD
|| mo->type == MT_BALLHOG || mo->type == MT_SPB)
{
if (mo->eflags & MFE_VERTICALFLIP)

View File

@ -949,6 +949,21 @@ sfxinfo_t S_sfx[NUMSFX] =
{"krti11", false, 48, 65, -1, NULL, 0, -1, -1, LUMPERROR},
{"krti12", false, 48, 65, -1, NULL, 0, -1, -1, LUMPERROR},
// SOC_CHAO SFX
{"mkuma", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"mkpop", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"bfare", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"merry", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"bowlh", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"tcart", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"tppop", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"toada", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"hsdoor",false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"hstrn", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"aspkb", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"msmnj1",false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
{"msmnj2",false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR},
// SRB2kart - Skin sounds
{"kwin", false, 64, 96, -1, NULL, 0, SKSKWIN, -1, LUMPERROR},
{"klose", false, 64, 96, -1, NULL, 0, SKSKLOSE, -1, LUMPERROR},

View File

@ -1024,6 +1024,21 @@ typedef enum
sfx_krti11,
sfx_krti12,
// SOC_CHAO hardcode
sfx_mkuma,
sfx_mkpop,
sfx_bfare,
sfx_merry,
sfx_bowlh,
sfx_tcart,
sfx_tppop,
sfx_toada,
sfx_hsdoor,
sfx_hstrn,
sfx_aspkb,
sfx_msmnj1,
sfx_msmnj2,
// And LASTLY, Kart's skin sounds.
sfx_kwin,
sfx_klose,