mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-22 21:41:31 +00:00
Lightning Shield fixs
- Rename to Lightning Shield (it keeps fucking me up when I want to kartgiveitem it to myself) - Fix inflictors causing damage being considered damage hitlag. Fixes the player using Lightning Shield being in damage hitlag state (most notable in the DI branch because hurting someone with it lets you DI afterwards, which also fucks with your turning) - Rewrote attack function to use custom blockmap search instead of P_NukeEnemies. - It can no longer attack below you, only above & around you. - Increased the attack radius, so that it actually lines up with the sprites... - Fixed extremely inconsistent ring blockmap search by moving it to playerafterthink (don't ask me why) - Rings get joulsted by Lightning Shield when you pass by them without - Added MAXRADIUS to the blockmap checks for lightning shield & mines, to reduce blockmap inconsistencies
This commit is contained in:
parent
ee21b2493a
commit
6e8e0ad0f5
16 changed files with 362 additions and 196 deletions
|
|
@ -354,7 +354,7 @@ consvar_t cv_ballhog = CVAR_INIT ("ballhog", "On", CV_NETVAR|CV_CHEAT, CV
|
|||
consvar_t cv_selfpropelledbomb = CVAR_INIT ("selfpropelledbomb", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_grow = CVAR_INIT ("grow", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_shrink = CVAR_INIT ("shrink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_thundershield = CVAR_INIT ("thundershield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_lightningshield = CVAR_INIT ("lightningshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_bubbleshield = CVAR_INIT ("bubbleshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_flameshield = CVAR_INIT ("flameshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
consvar_t cv_hyudoro = CVAR_INIT ("hyudoro", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_res
|
|||
extern consvar_t cv_superring, cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine, cv_landmine, cv_droptarget;
|
||||
extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_grow, cv_shrink;
|
||||
extern consvar_t cv_thundershield, cv_bubbleshield, cv_flameshield;
|
||||
extern consvar_t cv_lightningshield, cv_bubbleshield, cv_flameshield;
|
||||
extern consvar_t cv_hyudoro, cv_pogospring, cv_kitchensink;
|
||||
|
||||
extern consvar_t cv_dualsneaker, cv_triplesneaker, cv_triplebanana, cv_decabanana;
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ Run this macro, then #undef FOREACH afterward
|
|||
FOREACH (SPB, 11),\
|
||||
FOREACH (GROW, 12),\
|
||||
FOREACH (SHRINK, 13),\
|
||||
FOREACH (THUNDERSHIELD, 14),\
|
||||
FOREACH (LIGHTNINGSHIELD, 14),\
|
||||
FOREACH (BUBBLESHIELD, 15),\
|
||||
FOREACH (FLAMESHIELD, 16),\
|
||||
FOREACH (HYUDORO, 17),\
|
||||
|
|
@ -177,7 +177,7 @@ typedef enum
|
|||
typedef enum
|
||||
{
|
||||
KSHIELD_NONE = 0,
|
||||
KSHIELD_THUNDER = 1,
|
||||
KSHIELD_LIGHTNING = 1,
|
||||
KSHIELD_BUBBLE = 2,
|
||||
KSHIELD_FLAME = 3,
|
||||
NUMKARTSHIELDS
|
||||
|
|
|
|||
|
|
@ -3640,31 +3640,31 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_SPB20",
|
||||
"S_SPB_DEAD",
|
||||
|
||||
// Thunder Shield
|
||||
"S_THUNDERSHIELD1",
|
||||
"S_THUNDERSHIELD2",
|
||||
"S_THUNDERSHIELD3",
|
||||
"S_THUNDERSHIELD4",
|
||||
"S_THUNDERSHIELD5",
|
||||
"S_THUNDERSHIELD6",
|
||||
"S_THUNDERSHIELD7",
|
||||
"S_THUNDERSHIELD8",
|
||||
"S_THUNDERSHIELD9",
|
||||
"S_THUNDERSHIELD10",
|
||||
"S_THUNDERSHIELD11",
|
||||
"S_THUNDERSHIELD12",
|
||||
"S_THUNDERSHIELD13",
|
||||
"S_THUNDERSHIELD14",
|
||||
"S_THUNDERSHIELD15",
|
||||
"S_THUNDERSHIELD16",
|
||||
"S_THUNDERSHIELD17",
|
||||
"S_THUNDERSHIELD18",
|
||||
"S_THUNDERSHIELD19",
|
||||
"S_THUNDERSHIELD20",
|
||||
"S_THUNDERSHIELD21",
|
||||
"S_THUNDERSHIELD22",
|
||||
"S_THUNDERSHIELD23",
|
||||
"S_THUNDERSHIELD24",
|
||||
// Lightning Shield
|
||||
"S_LIGHTNINGSHIELD1",
|
||||
"S_LIGHTNINGSHIELD2",
|
||||
"S_LIGHTNINGSHIELD3",
|
||||
"S_LIGHTNINGSHIELD4",
|
||||
"S_LIGHTNINGSHIELD5",
|
||||
"S_LIGHTNINGSHIELD6",
|
||||
"S_LIGHTNINGSHIELD7",
|
||||
"S_LIGHTNINGSHIELD8",
|
||||
"S_LIGHTNINGSHIELD9",
|
||||
"S_LIGHTNINGSHIELD10",
|
||||
"S_LIGHTNINGSHIELD11",
|
||||
"S_LIGHTNINGSHIELD12",
|
||||
"S_LIGHTNINGSHIELD13",
|
||||
"S_LIGHTNINGSHIELD14",
|
||||
"S_LIGHTNINGSHIELD15",
|
||||
"S_LIGHTNINGSHIELD16",
|
||||
"S_LIGHTNINGSHIELD17",
|
||||
"S_LIGHTNINGSHIELD18",
|
||||
"S_LIGHTNINGSHIELD19",
|
||||
"S_LIGHTNINGSHIELD20",
|
||||
"S_LIGHTNINGSHIELD21",
|
||||
"S_LIGHTNINGSHIELD22",
|
||||
"S_LIGHTNINGSHIELD23",
|
||||
"S_LIGHTNINGSHIELD24",
|
||||
|
||||
// Bubble Shield
|
||||
"S_BUBBLESHIELD1",
|
||||
|
|
@ -4049,7 +4049,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_BATTLEPOINT3H",
|
||||
"S_BATTLEPOINT3I",
|
||||
|
||||
// Thunder shield use stuff;
|
||||
// Lightning shield use stuff;
|
||||
"S_KSPARK1", // Sparkling Radius
|
||||
"S_KSPARK2",
|
||||
"S_KSPARK3",
|
||||
|
|
@ -5306,7 +5306,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_SPB", // Self-Propelled Bomb
|
||||
"MT_SPBEXPLOSION",
|
||||
|
||||
"MT_THUNDERSHIELD", // Shields
|
||||
"MT_LIGHTNINGSHIELD", // Shields
|
||||
"MT_BUBBLESHIELD",
|
||||
"MT_FLAMESHIELD",
|
||||
"MT_FLAMESHIELDUNDERLAY",
|
||||
|
|
@ -6711,7 +6711,7 @@ struct int_const_s const INT_CONST[] = {
|
|||
|
||||
// kartshields_t
|
||||
{"KSHIELD_NONE",KSHIELD_NONE},
|
||||
{"KSHIELD_THUNDER",KSHIELD_THUNDER},
|
||||
{"KSHIELD_LIGHTNING",KSHIELD_LIGHTNING},
|
||||
{"KSHIELD_BUBBLE",KSHIELD_BUBBLE},
|
||||
{"KSHIELD_FLAME",KSHIELD_FLAME},
|
||||
{"NUMKARTSHIELDS",NUMKARTSHIELDS},
|
||||
|
|
|
|||
60
src/info.c
60
src/info.c
|
|
@ -562,7 +562,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"BHOG", // Ballhog
|
||||
"BHBM", // Ballhog BOOM
|
||||
"SPBM", // Self-Propelled Bomb
|
||||
"THNS", // Thunder Shield
|
||||
"THNS", // Lightning Shield
|
||||
"BUBS", // Bubble Shield (not Bubs)
|
||||
"BWVE", // Bubble Shield waves
|
||||
"FLMS", // Flame Shield
|
||||
|
|
@ -4197,30 +4197,30 @@ state_t states[NUMSTATES] =
|
|||
{SPR_SPBM, 8, 1, {A_SPBChase}, 0, 0, S_SPB1}, // S_SPB20
|
||||
{SPR_SPBM, 8, 175, {NULL}, 0, 0, S_NULL}, // S_SPB_DEAD
|
||||
|
||||
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD2}, // S_THUNDERSHIELD1
|
||||
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD3}, // S_THUNDERSHIELD2
|
||||
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD4}, // S_THUNDERSHIELD3
|
||||
{SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_THUNDERSHIELD5}, // S_THUNDERSHIELD4
|
||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD6}, // S_THUNDERSHIELD5
|
||||
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD7}, // S_THUNDERSHIELD6
|
||||
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD8}, // S_THUNDERSHIELD7
|
||||
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD9}, // S_THUNDERSHIELD8
|
||||
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD10}, // S_THUNDERSHIELD9
|
||||
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD11}, // S_THUNDERSHIELD10
|
||||
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD12}, // S_THUNDERSHIELD11
|
||||
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD13}, // S_THUNDERSHIELD12
|
||||
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD14}, // S_THUNDERSHIELD13
|
||||
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD15}, // S_THUNDERSHIELD14
|
||||
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD16}, // S_THUNDERSHIELD15
|
||||
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD17}, // S_THUNDERSHIELD16
|
||||
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD18}, // S_THUNDERSHIELD17
|
||||
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD19}, // S_THUNDERSHIELD18
|
||||
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD20}, // S_THUNDERSHIELD19
|
||||
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD21}, // S_THUNDERSHIELD20
|
||||
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD22}, // S_THUNDERSHIELD21
|
||||
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD23}, // S_THUNDERSHIELD22
|
||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23
|
||||
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24
|
||||
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD2}, // S_LIGHTNINGSHIELD1
|
||||
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD3}, // S_LIGHTNINGSHIELD2
|
||||
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD4}, // S_LIGHTNINGSHIELD3
|
||||
{SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD5}, // S_LIGHTNINGSHIELD4
|
||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD6}, // S_LIGHTNINGSHIELD5
|
||||
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD7}, // S_LIGHTNINGSHIELD6
|
||||
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD8}, // S_LIGHTNINGSHIELD7
|
||||
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD9}, // S_LIGHTNINGSHIELD8
|
||||
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD10}, // S_LIGHTNINGSHIELD9
|
||||
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD11}, // S_LIGHTNINGSHIELD10
|
||||
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD12}, // S_LIGHTNINGSHIELD11
|
||||
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD13}, // S_LIGHTNINGSHIELD12
|
||||
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD14}, // S_LIGHTNINGSHIELD13
|
||||
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD15}, // S_LIGHTNINGSHIELD14
|
||||
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD16}, // S_LIGHTNINGSHIELD15
|
||||
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD17}, // S_LIGHTNINGSHIELD16
|
||||
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD18}, // S_LIGHTNINGSHIELD17
|
||||
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD19}, // S_LIGHTNINGSHIELD18
|
||||
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD20}, // S_LIGHTNINGSHIELD19
|
||||
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD21}, // S_LIGHTNINGSHIELD20
|
||||
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD22}, // S_LIGHTNINGSHIELD21
|
||||
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD23}, // S_LIGHTNINGSHIELD22
|
||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD24}, // S_LIGHTNINGSHIELD23
|
||||
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD1}, // S_LIGHTNINGSHIELD24
|
||||
|
||||
{SPR_BUBS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_BUBBLESHIELD2}, // S_BUBBLESHIELD1
|
||||
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD3}, // S_BUBBLESHIELD2
|
||||
|
|
@ -7562,7 +7562,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
MT_FLINGRING, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
MT_RING, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
|
|
@ -7613,10 +7613,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
MT_FLINGRING, // reactiontime
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
MT_RING, // painchance
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
|
|
@ -23716,9 +23716,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_THUNDERSHIELD
|
||||
{ // MT_LIGHTNINGSHIELD
|
||||
-1, // doomednum
|
||||
S_THUNDERSHIELD1, // spawnstate
|
||||
S_LIGHTNINGSHIELD1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
|
|
|
|||
50
src/info.h
50
src/info.h
|
|
@ -4626,30 +4626,30 @@ typedef enum state
|
|||
S_SPB_DEAD,
|
||||
|
||||
// Thunder Shield
|
||||
S_THUNDERSHIELD1,
|
||||
S_THUNDERSHIELD2,
|
||||
S_THUNDERSHIELD3,
|
||||
S_THUNDERSHIELD4,
|
||||
S_THUNDERSHIELD5,
|
||||
S_THUNDERSHIELD6,
|
||||
S_THUNDERSHIELD7,
|
||||
S_THUNDERSHIELD8,
|
||||
S_THUNDERSHIELD9,
|
||||
S_THUNDERSHIELD10,
|
||||
S_THUNDERSHIELD11,
|
||||
S_THUNDERSHIELD12,
|
||||
S_THUNDERSHIELD13,
|
||||
S_THUNDERSHIELD14,
|
||||
S_THUNDERSHIELD15,
|
||||
S_THUNDERSHIELD16,
|
||||
S_THUNDERSHIELD17,
|
||||
S_THUNDERSHIELD18,
|
||||
S_THUNDERSHIELD19,
|
||||
S_THUNDERSHIELD20,
|
||||
S_THUNDERSHIELD21,
|
||||
S_THUNDERSHIELD22,
|
||||
S_THUNDERSHIELD23,
|
||||
S_THUNDERSHIELD24,
|
||||
S_LIGHTNINGSHIELD1,
|
||||
S_LIGHTNINGSHIELD2,
|
||||
S_LIGHTNINGSHIELD3,
|
||||
S_LIGHTNINGSHIELD4,
|
||||
S_LIGHTNINGSHIELD5,
|
||||
S_LIGHTNINGSHIELD6,
|
||||
S_LIGHTNINGSHIELD7,
|
||||
S_LIGHTNINGSHIELD8,
|
||||
S_LIGHTNINGSHIELD9,
|
||||
S_LIGHTNINGSHIELD10,
|
||||
S_LIGHTNINGSHIELD11,
|
||||
S_LIGHTNINGSHIELD12,
|
||||
S_LIGHTNINGSHIELD13,
|
||||
S_LIGHTNINGSHIELD14,
|
||||
S_LIGHTNINGSHIELD15,
|
||||
S_LIGHTNINGSHIELD16,
|
||||
S_LIGHTNINGSHIELD17,
|
||||
S_LIGHTNINGSHIELD18,
|
||||
S_LIGHTNINGSHIELD19,
|
||||
S_LIGHTNINGSHIELD20,
|
||||
S_LIGHTNINGSHIELD21,
|
||||
S_LIGHTNINGSHIELD22,
|
||||
S_LIGHTNINGSHIELD23,
|
||||
S_LIGHTNINGSHIELD24,
|
||||
|
||||
// Bubble Shield
|
||||
S_BUBBLESHIELD1,
|
||||
|
|
@ -6328,7 +6328,7 @@ typedef enum mobj_type
|
|||
MT_SPB, // SPB stuff
|
||||
MT_SPBEXPLOSION,
|
||||
|
||||
MT_THUNDERSHIELD, // Shields
|
||||
MT_LIGHTNINGSHIELD, // Shields
|
||||
MT_BUBBLESHIELD,
|
||||
MT_FLAMESHIELD,
|
||||
MT_FLAMESHIELDUNDERLAY,
|
||||
|
|
|
|||
|
|
@ -1021,9 +1021,9 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd)
|
|||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
static void K_BotItemThunder(player_t *player, ticcmd_t *cmd)
|
||||
static void K_BotItemLightning(player_t *player, ticcmd_t *cmd)
|
||||
|
||||
Item usage for Thunder Shield.
|
||||
Item usage for Lightning Shield.
|
||||
|
||||
Input Arguments:-
|
||||
player - Bot to do this for.
|
||||
|
|
@ -1032,7 +1032,7 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd)
|
|||
Return:-
|
||||
None
|
||||
--------------------------------------------------*/
|
||||
static void K_BotItemThunder(player_t *player, ticcmd_t *cmd)
|
||||
static void K_BotItemLightning(player_t *player, ticcmd_t *cmd)
|
||||
{
|
||||
if (K_BotUseItemNearPlayer(player, cmd, 192*player->mo->scale) == false)
|
||||
{
|
||||
|
|
@ -1355,8 +1355,8 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt)
|
|||
K_BotItemDropTarget(player, cmd);
|
||||
}
|
||||
break;
|
||||
case KITEM_THUNDERSHIELD:
|
||||
K_BotItemThunder(player, cmd);
|
||||
case KITEM_LIGHTNINGSHIELD:
|
||||
K_BotItemLightning(player, cmd);
|
||||
break;
|
||||
case KITEM_BUBBLESHIELD:
|
||||
K_BotItemBubble(player, cmd);
|
||||
|
|
|
|||
|
|
@ -478,7 +478,7 @@ static boolean K_FindObjectsForNudging(mobj_t *thing)
|
|||
if ((RINGTOTAL(globalsmuggle.botmo->player) < 20 && !(globalsmuggle.botmo->player->pflags & PF_RINGLOCK)
|
||||
&& P_CanPickupItem(globalsmuggle.botmo->player, 0))
|
||||
&& !thing->extravalue1
|
||||
&& (globalsmuggle.botmo->player->itemtype != KITEM_THUNDERSHIELD))
|
||||
&& (globalsmuggle.botmo->player->itemtype != KITEM_LIGHTNINGSHIELD))
|
||||
{
|
||||
K_AddAttackObject(thing, side, (RINGTOTAL(globalsmuggle.botmo->player) < 3) ? 5 : 1);
|
||||
}
|
||||
|
|
@ -505,10 +505,10 @@ static boolean K_FindObjectsForNudging(mobj_t *thing)
|
|||
{
|
||||
break;
|
||||
}
|
||||
// Thunder Shield
|
||||
// Lightning Shield
|
||||
else if (K_PlayerAttackSteer(thing, side, 20,
|
||||
globalsmuggle.botmo->player->itemtype == KITEM_THUNDERSHIELD,
|
||||
thing->player->itemtype == KITEM_THUNDERSHIELD
|
||||
globalsmuggle.botmo->player->itemtype == KITEM_LIGHTNINGSHIELD,
|
||||
thing->player->itemtype == KITEM_LIGHTNINGSHIELD
|
||||
))
|
||||
{
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -352,10 +352,10 @@ void K_DoMineSearch(mobj_t *actor, fixed_t size)
|
|||
explodedist = FixedMul(size, actor->scale);
|
||||
grenade = actor;
|
||||
|
||||
yh = (unsigned)(actor->y + explodedist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(actor->y - explodedist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(actor->x + explodedist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(actor->x - explodedist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
yh = (unsigned)(actor->y + (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(actor->y - (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(actor->x + (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(actor->x - (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
||||
BMBOUNDFIX (xl, xh, yl, yh);
|
||||
|
||||
|
|
@ -664,6 +664,85 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2)
|
|||
return true;
|
||||
}
|
||||
|
||||
static mobj_t *lightningSource;
|
||||
static fixed_t lightningDist;
|
||||
|
||||
static inline boolean PIT_LightningShieldAttack(mobj_t *thing)
|
||||
{
|
||||
if (lightningSource == NULL || P_MobjWasRemoved(lightningSource))
|
||||
{
|
||||
// Invalid?
|
||||
return false;
|
||||
}
|
||||
|
||||
if (thing == lightningSource)
|
||||
{
|
||||
// Don't explode yourself!!
|
||||
return true;
|
||||
}
|
||||
|
||||
if (thing->health <= 0)
|
||||
{
|
||||
// Dead
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(thing->flags & MF_SHOOTABLE) || (thing->flags & MF_SCENERY))
|
||||
{
|
||||
// Not shootable
|
||||
return true;
|
||||
}
|
||||
|
||||
if (thing->player && thing->player->spectator)
|
||||
{
|
||||
// Spectator
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((lightningSource->eflags & MFE_VERTICALFLIP)
|
||||
? (thing->z > lightningSource->z + lightningSource->height)
|
||||
: (thing->z + thing->height < lightningSource->z))
|
||||
{
|
||||
// Underneath
|
||||
return true;
|
||||
}
|
||||
|
||||
if (P_AproxDistance(thing->x - lightningSource->x, thing->y - lightningSource->y) > lightningDist + thing->radius)
|
||||
{
|
||||
// Too far away
|
||||
return true;
|
||||
}
|
||||
|
||||
if (P_CheckSight(lightningSource, thing) == false)
|
||||
{
|
||||
// Not in sight
|
||||
return true;
|
||||
}
|
||||
|
||||
P_DamageMobj(thing, lightningSource, lightningSource, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO);
|
||||
return true;
|
||||
}
|
||||
|
||||
void K_LightningShieldAttack(mobj_t *actor, fixed_t size)
|
||||
{
|
||||
INT32 bx, by, xl, xh, yl, yh;
|
||||
|
||||
lightningDist = FixedMul(size, actor->scale);
|
||||
lightningSource = actor;
|
||||
|
||||
// Use blockmap to check for nearby shootables
|
||||
yh = (unsigned)(actor->y + lightningDist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(actor->y - lightningDist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(actor->x + lightningDist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(actor->x - lightningDist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
||||
BMBOUNDFIX (xl, xh, yl, yh);
|
||||
|
||||
for (by = yl; by <= yh; by++)
|
||||
for (bx = xl; bx <= xh; bx++)
|
||||
P_BlockThingsIterator(bx, by, PIT_LightningShieldAttack);
|
||||
}
|
||||
|
||||
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
if (t2->type == MT_PLAYER)
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2);
|
|||
|
||||
boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2);
|
||||
|
||||
void K_LightningShieldAttack(mobj_t *actor, fixed_t size);
|
||||
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2);
|
||||
|
||||
boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2);
|
||||
|
|
|
|||
18
src/k_hud.c
18
src/k_hud.c
|
|
@ -126,7 +126,7 @@ static patch_t *kp_ballhog[2];
|
|||
static patch_t *kp_selfpropelledbomb[2];
|
||||
static patch_t *kp_grow[2];
|
||||
static patch_t *kp_shrink[2];
|
||||
static patch_t *kp_thundershield[2];
|
||||
static patch_t *kp_lightningshield[2];
|
||||
static patch_t *kp_bubbleshield[2];
|
||||
static patch_t *kp_flameshield[2];
|
||||
static patch_t *kp_hyudoro[2];
|
||||
|
|
@ -416,7 +416,7 @@ void K_LoadKartHUDGraphics(void)
|
|||
HU_UpdatePatch(&kp_selfpropelledbomb[0], "K_ITSPB");
|
||||
HU_UpdatePatch(&kp_grow[0], "K_ITGROW");
|
||||
HU_UpdatePatch(&kp_shrink[0], "K_ITSHRK");
|
||||
HU_UpdatePatch(&kp_thundershield[0], "K_ITTHNS");
|
||||
HU_UpdatePatch(&kp_lightningshield[0], "K_ITTHNS");
|
||||
HU_UpdatePatch(&kp_bubbleshield[0], "K_ITBUBS");
|
||||
HU_UpdatePatch(&kp_flameshield[0], "K_ITFLMS");
|
||||
HU_UpdatePatch(&kp_hyudoro[0], "K_ITHYUD");
|
||||
|
|
@ -467,7 +467,7 @@ void K_LoadKartHUDGraphics(void)
|
|||
HU_UpdatePatch(&kp_selfpropelledbomb[1], "K_ISSPB");
|
||||
HU_UpdatePatch(&kp_grow[1], "K_ISGROW");
|
||||
HU_UpdatePatch(&kp_shrink[1], "K_ISSHRK");
|
||||
HU_UpdatePatch(&kp_thundershield[1], "K_ISTHNS");
|
||||
HU_UpdatePatch(&kp_lightningshield[1], "K_ISTHNS");
|
||||
HU_UpdatePatch(&kp_bubbleshield[1], "K_ISBUBS");
|
||||
HU_UpdatePatch(&kp_flameshield[1], "K_ISFLMS");
|
||||
HU_UpdatePatch(&kp_hyudoro[1], "K_ISHYUD");
|
||||
|
|
@ -670,7 +670,7 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
|
|||
return (tiny ? "K_ISGROW" : "K_ITGROW");
|
||||
case KITEM_SHRINK:
|
||||
return (tiny ? "K_ISSHRK" : "K_ITSHRK");
|
||||
case KITEM_THUNDERSHIELD:
|
||||
case KITEM_LIGHTNINGSHIELD:
|
||||
return (tiny ? "K_ISTHNS" : "K_ITTHNS");
|
||||
case KITEM_BUBBLESHIELD:
|
||||
return (tiny ? "K_ISBUBS" : "K_ITBUBS");
|
||||
|
|
@ -1170,8 +1170,8 @@ static void K_drawKartItem(void)
|
|||
localpatch = kp_ballhog[offset];
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Thunder Shield
|
||||
localpatch = kp_thundershield[offset];
|
||||
case 13: // Lightning Shield
|
||||
localpatch = kp_lightningshield[offset];
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
case 14: // Super Ring
|
||||
|
|
@ -1290,8 +1290,8 @@ static void K_drawKartItem(void)
|
|||
case KITEM_SHRINK:
|
||||
localpatch = kp_shrink[offset];
|
||||
break;
|
||||
case KITEM_THUNDERSHIELD:
|
||||
localpatch = kp_thundershield[offset];
|
||||
case KITEM_LIGHTNINGSHIELD:
|
||||
localpatch = kp_lightningshield[offset];
|
||||
localbg = kp_itembg[offset+1];
|
||||
break;
|
||||
case KITEM_BUBBLESHIELD:
|
||||
|
|
@ -4578,7 +4578,7 @@ static void K_drawDistributionDebugger(void)
|
|||
kp_selfpropelledbomb[1],
|
||||
kp_grow[1],
|
||||
kp_shrink[1],
|
||||
kp_thundershield[1],
|
||||
kp_lightningshield[1],
|
||||
kp_bubbleshield[1],
|
||||
kp_flameshield[1],
|
||||
kp_hyudoro[1],
|
||||
|
|
|
|||
143
src/k_kart.c
143
src/k_kart.c
|
|
@ -36,6 +36,7 @@
|
|||
#include "k_hud.h"
|
||||
#include "k_terrain.h"
|
||||
#include "k_director.h"
|
||||
#include "k_collide.h"
|
||||
|
||||
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
|
||||
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
|
||||
|
|
@ -220,7 +221,7 @@ void K_RegisterKartStuff(void)
|
|||
CV_RegisterVar(&cv_selfpropelledbomb);
|
||||
CV_RegisterVar(&cv_grow);
|
||||
CV_RegisterVar(&cv_shrink);
|
||||
CV_RegisterVar(&cv_thundershield);
|
||||
CV_RegisterVar(&cv_lightningshield);
|
||||
CV_RegisterVar(&cv_bubbleshield);
|
||||
CV_RegisterVar(&cv_flameshield);
|
||||
CV_RegisterVar(&cv_hyudoro);
|
||||
|
|
@ -327,7 +328,7 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] =
|
|||
&cv_selfpropelledbomb,
|
||||
&cv_grow,
|
||||
&cv_shrink,
|
||||
&cv_thundershield,
|
||||
&cv_lightningshield,
|
||||
&cv_bubbleshield,
|
||||
&cv_flameshield,
|
||||
&cv_hyudoro,
|
||||
|
|
@ -362,7 +363,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
|
|||
/*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 2, 4, 0 }, // Self-Propelled Bomb
|
||||
/*Grow*/ { 0, 0, 0, 1, 2, 3, 0, 0 }, // Grow
|
||||
/*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink
|
||||
/*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield
|
||||
/*Lightning Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Lightning Shield
|
||||
/*Bubble Shield*/ { 0, 1, 2, 1, 0, 0, 0, 0 }, // Bubble Shield
|
||||
/*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield
|
||||
/*Hyudoro*/ { 0, 0, 0, 1, 1, 0, 0, 0 }, // Hyudoro
|
||||
|
|
@ -395,7 +396,7 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] =
|
|||
/*Self-Propelled Bomb*/ { 0, 0 }, // Self-Propelled Bomb
|
||||
/*Grow*/ { 2, 1 }, // Grow
|
||||
/*Shrink*/ { 0, 0 }, // Shrink
|
||||
/*Thunder Shield*/ { 4, 0 }, // Thunder Shield
|
||||
/*Lightning Shield*/ { 4, 0 }, // Lightning Shield
|
||||
/*Bubble Shield*/ { 1, 0 }, // Bubble Shield
|
||||
/*Flame Shield*/ { 0, 0 }, // Flame Shield
|
||||
/*Hyudoro*/ { 2, 0 }, // Hyudoro
|
||||
|
|
@ -437,7 +438,7 @@ INT32 K_GetShieldFromItem(INT32 item)
|
|||
{
|
||||
switch (item)
|
||||
{
|
||||
case KITEM_THUNDERSHIELD: return KSHIELD_THUNDER;
|
||||
case KITEM_LIGHTNINGSHIELD: return KSHIELD_LIGHTNING;
|
||||
case KITEM_BUBBLESHIELD: return KSHIELD_BUBBLE;
|
||||
case KITEM_FLAMESHIELD: return KSHIELD_FLAME;
|
||||
default: return KSHIELD_NONE;
|
||||
|
|
@ -733,7 +734,7 @@ INT32 K_KartGetItemOdds(
|
|||
if (pingame-1 <= pexiting)
|
||||
newodds = 0;
|
||||
break;
|
||||
case KITEM_THUNDERSHIELD:
|
||||
case KITEM_LIGHTNINGSHIELD:
|
||||
cooldownOnStart = true;
|
||||
powerItem = true;
|
||||
|
||||
|
|
@ -3361,7 +3362,7 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDam
|
|||
}
|
||||
|
||||
K_AddHitLag(mo1, finalTics, fromDamage);
|
||||
K_AddHitLag(mo2, finalTics, fromDamage);
|
||||
K_AddHitLag(mo2, finalTics, false); // mo2 is the inflictor, so don't use the damage property.
|
||||
}
|
||||
|
||||
void K_DoInstashield(player_t *player)
|
||||
|
|
@ -5249,7 +5250,12 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter)
|
|||
|
||||
#define THUNDERRADIUS 320
|
||||
|
||||
static void K_DoThunderShield(player_t *player)
|
||||
// Rough size of the outer-rim sprites, after scaling.
|
||||
// (The hitbox is already pretty strict due to only 1 active frame,
|
||||
// we don't need to have it disjointedly small too...)
|
||||
#define THUNDERSPRITE 80
|
||||
|
||||
static void K_DoLightningShield(player_t *player)
|
||||
{
|
||||
mobj_t *mo;
|
||||
int i = 0;
|
||||
|
|
@ -5258,7 +5264,7 @@ static void K_DoThunderShield(player_t *player)
|
|||
angle_t an;
|
||||
|
||||
S_StartSound(player->mo, sfx_zio3);
|
||||
P_NukeEnemies(player->mo, player->mo, RING_DIST/4);
|
||||
K_LightningShieldAttack(player->mo, (THUNDERRADIUS + THUNDERSPRITE) * FRACUNIT);
|
||||
|
||||
// spawn vertical bolt
|
||||
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK);
|
||||
|
|
@ -5299,6 +5305,7 @@ static void K_DoThunderShield(player_t *player)
|
|||
}
|
||||
|
||||
#undef THUNDERRADIUS
|
||||
#undef THUNDERSPRITE
|
||||
|
||||
static void K_FlameDashLeftoverSmoke(mobj_t *src)
|
||||
{
|
||||
|
|
@ -5708,9 +5715,9 @@ void K_DropHnextList(player_t *player, boolean keepshields)
|
|||
|
||||
if (shield != KSHIELD_NONE && !keepshields)
|
||||
{
|
||||
if (shield == KSHIELD_THUNDER)
|
||||
if (shield == KSHIELD_LIGHTNING)
|
||||
{
|
||||
K_DoThunderShield(player);
|
||||
K_DoLightningShield(player);
|
||||
}
|
||||
|
||||
player->curshield = KSHIELD_NONE;
|
||||
|
|
@ -6988,39 +6995,85 @@ void K_KartPlayerHUDUpdate(player_t *player)
|
|||
// SRB2Kart: blockmap iterate for attraction shield users
|
||||
static mobj_t *attractmo;
|
||||
static fixed_t attractdist;
|
||||
static fixed_t attractzdist;
|
||||
|
||||
static inline boolean PIT_AttractingRings(mobj_t *thing)
|
||||
{
|
||||
if (!attractmo || P_MobjWasRemoved(attractmo))
|
||||
if (attractmo == NULL || P_MobjWasRemoved(attractmo) || attractmo->player == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!attractmo->player)
|
||||
return false; // not a player
|
||||
if (thing == NULL || P_MobjWasRemoved(thing))
|
||||
{
|
||||
return true; // invalid
|
||||
}
|
||||
|
||||
if (thing->health <= 0 || !thing)
|
||||
return true; // dead
|
||||
if (thing == attractmo)
|
||||
{
|
||||
return true; // invalid
|
||||
}
|
||||
|
||||
if (thing->type != MT_RING && thing->type != MT_FLINGRING)
|
||||
if (!(thing->type == MT_RING || thing->type == MT_FLINGRING))
|
||||
{
|
||||
return true; // not a ring
|
||||
}
|
||||
|
||||
if (thing->health <= 0)
|
||||
{
|
||||
return true; // dead
|
||||
}
|
||||
|
||||
if (thing->extravalue1)
|
||||
{
|
||||
return true; // in special ring animation
|
||||
}
|
||||
|
||||
if (thing->cusval)
|
||||
if (thing->tracer != NULL && P_MobjWasRemoved(thing->tracer) == false)
|
||||
{
|
||||
return true; // already attracted
|
||||
}
|
||||
|
||||
// see if it went over / under
|
||||
if (attractmo->z - (attractdist>>2) > thing->z + thing->height)
|
||||
if (attractmo->z - attractzdist > thing->z + thing->height)
|
||||
{
|
||||
return true; // overhead
|
||||
if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z)
|
||||
}
|
||||
|
||||
if (attractmo->z + attractmo->height + attractzdist < thing->z)
|
||||
{
|
||||
return true; // underneath
|
||||
}
|
||||
|
||||
if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist)
|
||||
if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) > attractdist + thing->radius)
|
||||
{
|
||||
return true; // Too far away
|
||||
}
|
||||
|
||||
if (RINGTOTAL(attractmo->player) >= 20 || (attractmo->player->pflags & PF_RINGLOCK))
|
||||
{
|
||||
// Already reached max -- just joustle rings around.
|
||||
|
||||
// Regular ring -> fling ring
|
||||
if (thing->info->reactiontime && thing->type != (mobjtype_t)thing->info->reactiontime)
|
||||
{
|
||||
thing->type = thing->info->reactiontime;
|
||||
thing->info = &mobjinfo[thing->type];
|
||||
thing->flags = thing->info->flags;
|
||||
|
||||
P_InstaThrust(thing, P_RandomRange(0,7) * ANGLE_45, 2 * thing->scale);
|
||||
P_SetObjectMomZ(thing, 8<<FRACBITS, false);
|
||||
thing->fuse = 120*TICRATE;
|
||||
|
||||
thing->cusval = 0; // Reset attraction flag
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// set target
|
||||
P_SetTarget(&thing->tracer, attractmo);
|
||||
}
|
||||
|
||||
// set target
|
||||
P_SetTarget(&thing->tracer, attractmo);
|
||||
// flag to show it's been attracted once before
|
||||
thing->cusval = 1;
|
||||
return true; // find other rings
|
||||
}
|
||||
|
||||
|
|
@ -7032,15 +7085,18 @@ static inline boolean PIT_AttractingRings(mobj_t *thing)
|
|||
static void K_LookForRings(mobj_t *pmo)
|
||||
{
|
||||
INT32 bx, by, xl, xh, yl, yh;
|
||||
attractdist = FixedMul(RING_DIST, pmo->scale)>>2;
|
||||
|
||||
// Use blockmap to check for nearby rings
|
||||
yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
||||
attractmo = pmo;
|
||||
attractdist = (400 * pmo->scale);
|
||||
attractzdist = attractdist >> 2;
|
||||
|
||||
// Use blockmap to check for nearby rings
|
||||
yh = (unsigned)(pmo->y + (attractdist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(pmo->y - (attractdist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(pmo->x + (attractdist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(pmo->x - (attractdist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
||||
BMBOUNDFIX(xl, xh, yl, yh);
|
||||
|
||||
for (by = yl; by <= yh; by++)
|
||||
for (bx = xl; bx <= xh; bx++)
|
||||
|
|
@ -7462,12 +7518,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
}
|
||||
}
|
||||
|
||||
if (player->itemtype == KITEM_THUNDERSHIELD)
|
||||
{
|
||||
if (RINGTOTAL(player) < 20 && !(player->pflags & PF_RINGLOCK))
|
||||
K_LookForRings(player->mo);
|
||||
}
|
||||
|
||||
if (player->itemtype == KITEM_BUBBLESHIELD)
|
||||
{
|
||||
if (player->bubblecool)
|
||||
|
|
@ -7678,6 +7728,11 @@ void K_KartPlayerAfterThink(player_t *player)
|
|||
player->lastjawztarget = -1;
|
||||
player->jawztargetdelay = 0;
|
||||
}
|
||||
|
||||
if (player->itemtype == KITEM_LIGHTNINGSHIELD)
|
||||
{
|
||||
K_LookForRings(player->mo);
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
|
|
@ -9751,23 +9806,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
K_PlayPowerGloatSound(player->mo);
|
||||
}
|
||||
break;
|
||||
case KITEM_THUNDERSHIELD:
|
||||
if (player->curshield != KSHIELD_THUNDER)
|
||||
case KITEM_LIGHTNINGSHIELD:
|
||||
if (player->curshield != KSHIELD_LIGHTNING)
|
||||
{
|
||||
mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THUNDERSHIELD);
|
||||
mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_LIGHTNINGSHIELD);
|
||||
P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2));
|
||||
P_SetTarget(&shield->target, player->mo);
|
||||
S_StartSound(player->mo, sfx_s3k41);
|
||||
player->curshield = KSHIELD_THUNDER;
|
||||
player->curshield = KSHIELD_LIGHTNING;
|
||||
}
|
||||
|
||||
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
||||
{
|
||||
K_DoThunderShield(player);
|
||||
K_DoLightningShield(player);
|
||||
if (player->itemamount > 0)
|
||||
{
|
||||
// Why is this a conditional?
|
||||
// Thunder shield: the only item that allows you to
|
||||
// Lightning shield: the only item that allows you to
|
||||
// activate a mine while you're out of its radius,
|
||||
// the SAME tic it sets your itemamount to 0
|
||||
// ...:dumbestass:
|
||||
|
|
|
|||
|
|
@ -1590,7 +1590,7 @@ static menuitem_t OP_MonitorToggleMenu[] =
|
|||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Invinciblity", {.routine = M_HandleMonitorToggles}, KITEM_INVINCIBILITY},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Grow", {.routine = M_HandleMonitorToggles}, KITEM_GROW},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Shrink", {.routine = M_HandleMonitorToggles}, KITEM_SHRINK},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Thunder Shields", {.routine = M_HandleMonitorToggles}, KITEM_THUNDERSHIELD},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Lightning Shields", {.routine = M_HandleMonitorToggles}, KITEM_LIGHTNINGSHIELD},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Hyudoros", {.routine = M_HandleMonitorToggles}, KITEM_HYUDORO},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Pogo Springs", {.routine = M_HandleMonitorToggles}, KITEM_POGOSPRING},
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Super Rings", {.routine = M_HandleMonitorToggles}, KITEM_SUPERRING},
|
||||
|
|
|
|||
|
|
@ -4044,57 +4044,76 @@ void A_AttractChase(mobj_t *actor)
|
|||
actor->renderflags &= ~RF_DONTDRAW;
|
||||
|
||||
// spilled rings get capped to a certain speed
|
||||
if (actor->type == (mobjtype_t)actor->info->reactiontime)
|
||||
if (actor->info->reactiontime && actor->type == (mobjtype_t)actor->info->reactiontime)
|
||||
{
|
||||
const fixed_t maxspeed = 4<<FRACBITS;
|
||||
const fixed_t maxspeed = 4 * actor->scale;
|
||||
fixed_t oldspeed = R_PointToDist2(0, 0, actor->momx, actor->momy);
|
||||
|
||||
if (oldspeed > maxspeed)
|
||||
{
|
||||
fixed_t newspeed = max(maxspeed, oldspeed-FRACUNIT);
|
||||
fixed_t newspeed = max(maxspeed, oldspeed - actor->scale);
|
||||
actor->momx = FixedMul(FixedDiv(actor->momx, oldspeed), newspeed);
|
||||
actor->momy = FixedMul(FixedDiv(actor->momy, oldspeed), newspeed);
|
||||
}
|
||||
}
|
||||
|
||||
if (actor->tracer && actor->tracer->player && actor->tracer->health
|
||||
//&& P_CheckSight(actor, actor->tracer)
|
||||
&& actor->tracer->player->itemtype == KITEM_THUNDERSHIELD
|
||||
&& RINGTOTAL(actor->tracer->player) < 20
|
||||
&& !(actor->tracer->player->pflags & PF_RINGLOCK))
|
||||
if (actor->tracer != NULL && P_MobjWasRemoved(actor->tracer) == false)
|
||||
{
|
||||
fixed_t dist;
|
||||
angle_t hang, vang;
|
||||
// Set attraction flag
|
||||
actor->cusval = 1;
|
||||
|
||||
// If a flung ring gets attracted by a shield, change it into a normal ring.
|
||||
if (actor->type == (mobjtype_t)actor->info->reactiontime)
|
||||
if (
|
||||
actor->tracer->player && actor->tracer->health
|
||||
&& actor->tracer->player->itemtype == KITEM_LIGHTNINGSHIELD
|
||||
&& RINGTOTAL(actor->tracer->player) < 20
|
||||
&& !(actor->tracer->player->pflags & PF_RINGLOCK)
|
||||
//&& P_CheckSight(actor, actor->tracer)
|
||||
)
|
||||
{
|
||||
P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->painchance);
|
||||
P_RemoveMobj(actor);
|
||||
return;
|
||||
fixed_t dist;
|
||||
angle_t hang, vang;
|
||||
|
||||
// If a flung ring gets attracted by a shield, change it into a normal ring.
|
||||
if (actor->info->painchance && actor->type != (mobjtype_t)actor->info->painchance)
|
||||
{
|
||||
#if 0 // old
|
||||
P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->painchance);
|
||||
P_RemoveMobj(actor);
|
||||
return;
|
||||
#else // new
|
||||
actor->type = actor->info->painchance;
|
||||
actor->info = &mobjinfo[actor->type];
|
||||
actor->flags = actor->info->flags;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Keep stuff from going down inside floors and junk
|
||||
actor->flags &= ~MF_NOCLIPHEIGHT;
|
||||
|
||||
// Let attracted rings move through walls and such.
|
||||
actor->flags |= MF_NOCLIP;
|
||||
|
||||
// P_Attract is too "smart" for Kart; keep it simple, stupid!
|
||||
dist = P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z);
|
||||
hang = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y);
|
||||
vang = R_PointToAngle2(actor->z, 0, actor->tracer->z, dist);
|
||||
|
||||
actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4;
|
||||
actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
||||
actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
||||
actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
P_SetTarget(&actor->tracer, NULL);
|
||||
}
|
||||
|
||||
// Keep stuff from going down inside floors and junk
|
||||
actor->flags &= ~MF_NOCLIPHEIGHT;
|
||||
|
||||
// Let attracted rings move through walls and such.
|
||||
actor->flags |= MF_NOCLIP;
|
||||
|
||||
// P_Attract is too "smart" for Kart; keep it simple, stupid!
|
||||
dist = P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z);
|
||||
hang = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y);
|
||||
vang = R_PointToAngle2(actor->z , 0, actor->tracer->z, dist);
|
||||
|
||||
actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4;
|
||||
actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
||||
actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
||||
actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Turn rings back into flung rings if lost
|
||||
if (actor->cusval && actor->info->reactiontime && actor->type != (mobjtype_t)actor->info->reactiontime)
|
||||
{
|
||||
#if 0 // old
|
||||
mobj_t *newring;
|
||||
newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime);
|
||||
P_InstaThrust(newring, P_RandomRange(0,7) * ANGLE_45, 2<<FRACBITS);
|
||||
|
|
@ -4102,10 +4121,18 @@ void A_AttractChase(mobj_t *actor)
|
|||
newring->fuse = 120*TICRATE;
|
||||
P_RemoveMobj(actor);
|
||||
return;
|
||||
#else // new
|
||||
actor->type = actor->info->reactiontime;
|
||||
actor->info = &mobjinfo[actor->type];
|
||||
actor->flags = actor->info->flags;
|
||||
|
||||
P_InstaThrust(actor, P_RandomRange(0,7) * ANGLE_45, 2 * actor->scale);
|
||||
P_SetObjectMomZ(actor, 8<<FRACBITS, false);
|
||||
actor->fuse = 120*TICRATE;
|
||||
#endif
|
||||
}
|
||||
/*else
|
||||
P_LookForShield(actor);*/
|
||||
// SRB2Kart: now it's the PLAYER'S job to use the blockmap to find rings, not the ring's.
|
||||
|
||||
actor->cusval = 0; // Reset attraction flag
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
18
src/p_mobj.c
18
src/p_mobj.c
|
|
@ -5904,8 +5904,8 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
mobj->tracer->frame = KITEM_BALLHOG;
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Thunder Shield
|
||||
mobj->tracer->frame = KITEM_THUNDERSHIELD;
|
||||
case 13: // Lightning Shield
|
||||
mobj->tracer->frame = KITEM_LIGHTNINGSHIELD;
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
case 14: // Super Ring
|
||||
|
|
@ -6507,6 +6507,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
|
||||
// No need to check water. Who cares?
|
||||
P_RingThinker(mobj);
|
||||
|
||||
if (mobj->flags2 & MF2_NIGHTSPULL)
|
||||
P_NightsItemChase(mobj);
|
||||
else
|
||||
|
|
@ -7385,11 +7386,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT);
|
||||
}
|
||||
break;
|
||||
case MT_THUNDERSHIELD:
|
||||
case MT_LIGHTNINGSHIELD:
|
||||
{
|
||||
fixed_t destx, desty;
|
||||
if (!mobj->target || !mobj->target->health || !mobj->target->player
|
||||
|| mobj->target->player->curshield != KSHIELD_THUNDER)
|
||||
|| mobj->target->player->curshield != KSHIELD_LIGHTNING)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
|
|
@ -7408,7 +7409,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
else
|
||||
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y);
|
||||
|
||||
if (curstate > S_THUNDERSHIELD15 && curstate <= S_THUNDERSHIELD24)
|
||||
if (curstate > S_LIGHTNINGSHIELD15 && curstate <= S_LIGHTNINGSHIELD24)
|
||||
viewingangle += ANGLE_180;
|
||||
|
||||
destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4);
|
||||
|
|
@ -9338,10 +9339,13 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
|| mobj->type == MT_FALLINGROCK
|
||||
|| mobj->type == MT_ORBINAUT
|
||||
|| mobj->type == MT_JAWZ || mobj->type == MT_JAWZ_DUD
|
||||
|| (mobj->type == MT_DROPTARGET && mobj->reactiontime)) {
|
||||
|| (mobj->type == MT_DROPTARGET && mobj->reactiontime))
|
||||
{
|
||||
P_TryMove(mobj, mobj->x, mobj->y, true); // Sets mo->standingslope correctly
|
||||
|
||||
if (P_MobjWasRemoved(mobj)) // anything that calls checkposition can be lethal
|
||||
return;
|
||||
|
||||
//if (mobj->standingslope) CONS_Printf("slope physics on mobj\n");
|
||||
P_ButteredSlope(mobj);
|
||||
}
|
||||
|
|
@ -9668,7 +9672,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
|
|||
thing->shadowscale = 5*FRACUNIT/4;
|
||||
thing->whiteshadow = true;
|
||||
break;
|
||||
case MT_THUNDERSHIELD:
|
||||
case MT_LIGHTNINGSHIELD:
|
||||
case MT_BUBBLESHIELD:
|
||||
case MT_BUBBLESHIELDTRAP:
|
||||
case MT_FLAMESHIELD:
|
||||
|
|
|
|||
|
|
@ -2507,7 +2507,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
|
|||
|
||||
if (mo->flags & MF_BOSS) //don't OHKO bosses nor players!
|
||||
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF);
|
||||
else if (mo->type == MT_PLAYER) // Thunder shield: Combo players.
|
||||
else if (mo->type == MT_PLAYER) // Lightning shield: Combo players.
|
||||
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO);
|
||||
else
|
||||
P_DamageMobj(mo, inflictor, source, 1000, DMG_NORMAL|DMG_CANTHURTSELF);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue