mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
f_finale now compiles
This commit is contained in:
parent
7f9850644b
commit
135e9b9797
20 changed files with 195 additions and 2148 deletions
586
src/b_bot.c
586
src/b_bot.c
|
|
@ -1,586 +0,0 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
||||
// Copyright (C) 2011-2020 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \file b_bot.c
|
||||
/// \brief Basic bot handling
|
||||
|
||||
#include "doomdef.h"
|
||||
#include "d_player.h"
|
||||
#include "g_game.h"
|
||||
#include "r_main.h"
|
||||
#include "p_local.h"
|
||||
#include "b_bot.h"
|
||||
#include "lua_hook.h"
|
||||
|
||||
// If you want multiple bots, variables like this will
|
||||
// have to be stuffed in something accessible through player_t.
|
||||
static boolean lastForward = false;
|
||||
static boolean lastBlocked = false;
|
||||
static boolean blocked = false;
|
||||
|
||||
static boolean jump_last = false;
|
||||
static boolean spin_last = false;
|
||||
static UINT8 anxiety = 0;
|
||||
static boolean panic = false;
|
||||
static UINT8 flymode = 0;
|
||||
static boolean spinmode = false;
|
||||
static boolean thinkfly = false;
|
||||
|
||||
static inline void B_ResetAI(void)
|
||||
{
|
||||
jump_last = false;
|
||||
spin_last = false;
|
||||
anxiety = 0;
|
||||
panic = false;
|
||||
flymode = 0;
|
||||
spinmode = false;
|
||||
thinkfly = false;
|
||||
}
|
||||
|
||||
static void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
|
||||
{
|
||||
boolean forward=false, backward=false, left=false, right=false, jump=false, spin=false;
|
||||
|
||||
player_t *player = sonic->player, *bot = tails->player;
|
||||
ticcmd_t *pcmd = &player->cmd;
|
||||
boolean water = tails->eflags & MFE_UNDERWATER;
|
||||
SINT8 flip = P_MobjFlip(tails);
|
||||
boolean _2d = (tails->flags2 & MF2_TWOD) || twodlevel;
|
||||
fixed_t scale = tails->scale;
|
||||
|
||||
fixed_t dist = P_AproxDistance(sonic->x - tails->x, sonic->y - tails->y);
|
||||
fixed_t zdist = flip * (sonic->z - tails->z);
|
||||
angle_t ang = sonic->angle;
|
||||
fixed_t pmom = P_AproxDistance(sonic->momx, sonic->momy);
|
||||
fixed_t bmom = P_AproxDistance(tails->momx, tails->momy);
|
||||
fixed_t followmax = 128 * 8 * scale; // Max follow distance before AI begins to enter "panic" state
|
||||
fixed_t followthres = 92 * scale; // Distance that AI will try to reach
|
||||
fixed_t followmin = 32 * scale;
|
||||
fixed_t comfortheight = 96 * scale;
|
||||
fixed_t touchdist = 24 * scale;
|
||||
boolean stalled = (bmom < scale >> 1) && dist > followthres; // Helps to see if the AI is having trouble catching up
|
||||
boolean samepos = (sonic->x == tails->x && sonic->y == tails->y);
|
||||
|
||||
if (!samepos)
|
||||
ang = R_PointToAngle2(tails->x, tails->y, sonic->x, sonic->y);
|
||||
|
||||
// We can't follow Sonic if he's not around!
|
||||
if (!sonic || sonic->health <= 0)
|
||||
return;
|
||||
|
||||
// Lua can handle it!
|
||||
if (LUAh_BotAI(sonic, tails, cmd))
|
||||
return;
|
||||
|
||||
if (tails->player->powers[pw_carry] == CR_MACESPIN || tails->player->powers[pw_carry] == CR_GENERIC)
|
||||
{
|
||||
boolean isrelevant = (sonic->player->powers[pw_carry] == CR_MACESPIN || sonic->player->powers[pw_carry] == CR_GENERIC);
|
||||
dist = P_AproxDistance(tails->x-sonic->x, tails->y-sonic->y);
|
||||
if (sonic->player->cmd.buttons & BT_JUMP && (sonic->player->pflags & PF_JUMPED) && isrelevant)
|
||||
cmd->buttons |= BT_JUMP;
|
||||
if (isrelevant)
|
||||
{
|
||||
cmd->forwardmove = sonic->player->cmd.forwardmove;
|
||||
cmd->angleturn = abs((signed)(tails->angle - sonic->angle))>>16;
|
||||
if (sonic->angle < tails->angle)
|
||||
cmd->angleturn = -cmd->angleturn;
|
||||
} else if (dist > FixedMul(512*FRACUNIT, tails->scale))
|
||||
cmd->buttons |= BT_JUMP;
|
||||
return;
|
||||
}
|
||||
|
||||
// Adapted from CobaltBW's tails_AI.wad
|
||||
|
||||
// Check water
|
||||
if (water)
|
||||
{
|
||||
followmin = 0;
|
||||
followthres = 16*scale;
|
||||
followmax >>= 1;
|
||||
thinkfly = false;
|
||||
}
|
||||
|
||||
// Check anxiety
|
||||
if (spinmode)
|
||||
{
|
||||
anxiety = 0;
|
||||
panic = false;
|
||||
}
|
||||
else if (dist > followmax || zdist > comfortheight || stalled)
|
||||
{
|
||||
anxiety = min(anxiety + 2, 70);
|
||||
if (anxiety >= 70)
|
||||
panic = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
anxiety = max(anxiety - 1, 0);
|
||||
panic = false;
|
||||
}
|
||||
|
||||
// Orientation
|
||||
if (bot->pflags & (PF_SPINNING|PF_STARTDASH))
|
||||
{
|
||||
cmd->angleturn = (sonic->angle - tails->angle) >> 16; // NOT FRACBITS DAMNIT
|
||||
}
|
||||
else if (flymode == 2)
|
||||
{
|
||||
cmd->angleturn = sonic->player->cmd.angleturn - (tails->angle >> 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd->angleturn = (ang - tails->angle) >> 16; // NOT FRACBITS DAMNIT
|
||||
}
|
||||
|
||||
// ********
|
||||
// FLY MODE
|
||||
// spinmode check
|
||||
if (spinmode || player->exiting)
|
||||
thinkfly = false;
|
||||
else
|
||||
{
|
||||
// Activate co-op flight
|
||||
if (thinkfly && player->pflags & PF_JUMPED)
|
||||
{
|
||||
if (!jump_last)
|
||||
{
|
||||
jump = true;
|
||||
flymode = 1;
|
||||
thinkfly = false;
|
||||
bot->pflags |= PF_CANCARRY;
|
||||
}
|
||||
}
|
||||
|
||||
// Check positioning
|
||||
// Thinker for co-op flight
|
||||
if (!(water || pmom || bmom)
|
||||
&& (dist < touchdist && !samepos)
|
||||
&& !(pcmd->forwardmove || pcmd->sidemove || player->dashspeed)
|
||||
&& P_IsObjectOnGround(sonic) && P_IsObjectOnGround(tails)
|
||||
&& !(player->pflags & PF_STASIS)
|
||||
&& bot->charability == CA_FLY)
|
||||
thinkfly = true;
|
||||
else
|
||||
thinkfly = false;
|
||||
|
||||
// Set carried state
|
||||
if (player->powers[pw_carry] == CR_PLAYER && sonic->tracer == tails)
|
||||
{
|
||||
flymode = 2;
|
||||
}
|
||||
|
||||
// Ready for takeoff
|
||||
if (flymode == 1)
|
||||
{
|
||||
thinkfly = false;
|
||||
if (zdist < -64*scale || (flip * tails->momz) > scale) // Make sure we're not too high up
|
||||
spin = true;
|
||||
else if (!jump_last)
|
||||
jump = true;
|
||||
|
||||
// Abort if the player moves away or spins
|
||||
if (dist > followthres || player->dashspeed)
|
||||
flymode = 0;
|
||||
}
|
||||
// Read player inputs while carrying
|
||||
else if (flymode == 2)
|
||||
{
|
||||
cmd->forwardmove = pcmd->forwardmove;
|
||||
cmd->sidemove = pcmd->sidemove;
|
||||
if (pcmd->buttons & BT_USE)
|
||||
{
|
||||
spin = true;
|
||||
jump = false;
|
||||
}
|
||||
else if (!jump_last)
|
||||
jump = true;
|
||||
// End flymode
|
||||
if (player->powers[pw_carry] != CR_PLAYER)
|
||||
{
|
||||
flymode = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (flymode && P_IsObjectOnGround(tails) && !(pcmd->buttons & BT_JUMP))
|
||||
flymode = 0;
|
||||
|
||||
// ********
|
||||
// SPINNING
|
||||
if (panic || flymode || !(player->pflags & PF_SPINNING) || (player->pflags & PF_JUMPED))
|
||||
spinmode = false;
|
||||
else
|
||||
{
|
||||
if (!_2d)
|
||||
{
|
||||
// Spindash
|
||||
if (player->dashspeed)
|
||||
{
|
||||
if (dist < followthres && dist > touchdist) // Do positioning
|
||||
{
|
||||
cmd->angleturn = (ang - tails->angle) >> 16; // NOT FRACBITS DAMNIT
|
||||
cmd->forwardmove = 50;
|
||||
spinmode = true;
|
||||
}
|
||||
else if (dist < touchdist)
|
||||
{
|
||||
if (!bmom && (!(bot->pflags & PF_SPINNING) || (bot->dashspeed && bot->pflags & PF_SPINNING)))
|
||||
{
|
||||
cmd->angleturn = (sonic->angle - tails->angle) >> 16; // NOT FRACBITS DAMNIT
|
||||
spin = true;
|
||||
}
|
||||
spinmode = true;
|
||||
}
|
||||
else
|
||||
spinmode = false;
|
||||
}
|
||||
// Spin
|
||||
else if (player->dashspeed == bot->dashspeed && player->pflags & PF_SPINNING)
|
||||
{
|
||||
if (bot->pflags & PF_SPINNING || !spin_last)
|
||||
{
|
||||
spin = true;
|
||||
cmd->angleturn = (sonic->angle - tails->angle) >> 16; // NOT FRACBITS DAMNIT
|
||||
cmd->forwardmove = MAXPLMOVE;
|
||||
spinmode = true;
|
||||
}
|
||||
else
|
||||
spinmode = false;
|
||||
}
|
||||
}
|
||||
// 2D mode
|
||||
else
|
||||
{
|
||||
if (((player->dashspeed && !bmom) || (player->dashspeed == bot->dashspeed && (player->pflags & PF_SPINNING)))
|
||||
&& ((bot->pflags & PF_SPINNING) || !spin_last))
|
||||
{
|
||||
spin = true;
|
||||
spinmode = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ********
|
||||
// FOLLOW
|
||||
if (!(flymode || spinmode))
|
||||
{
|
||||
// Too far
|
||||
if (panic || dist > followthres)
|
||||
{
|
||||
if (!_2d)
|
||||
cmd->forwardmove = MAXPLMOVE;
|
||||
else if (sonic->x > tails->x)
|
||||
cmd->sidemove = MAXPLMOVE;
|
||||
else
|
||||
cmd->sidemove = -MAXPLMOVE;
|
||||
}
|
||||
// Within threshold
|
||||
else if (!panic && dist > followmin && abs(zdist) < 192*scale)
|
||||
{
|
||||
if (!_2d)
|
||||
cmd->forwardmove = FixedHypot(pcmd->forwardmove, pcmd->sidemove);
|
||||
else
|
||||
cmd->sidemove = pcmd->sidemove;
|
||||
}
|
||||
// Below min
|
||||
else if (dist < followmin)
|
||||
{
|
||||
// Copy inputs
|
||||
cmd->angleturn = (sonic->angle - tails->angle) >> 16; // NOT FRACBITS DAMNIT
|
||||
bot->drawangle = ang;
|
||||
cmd->forwardmove = 8 * pcmd->forwardmove / 10;
|
||||
cmd->sidemove = 8 * pcmd->sidemove / 10;
|
||||
}
|
||||
}
|
||||
|
||||
// ********
|
||||
// JUMP
|
||||
if (!(flymode || spinmode))
|
||||
{
|
||||
// Flying catch-up
|
||||
if (bot->pflags & PF_THOKKED)
|
||||
{
|
||||
cmd->forwardmove = min(MAXPLMOVE, (dist/scale)>>3);
|
||||
if (zdist < -64*scale)
|
||||
spin = true;
|
||||
else if (zdist > 0 && !jump_last)
|
||||
jump = true;
|
||||
}
|
||||
|
||||
// Just landed
|
||||
if (tails->eflags & MFE_JUSTHITFLOOR)
|
||||
jump = false;
|
||||
// Start jump
|
||||
else if (!jump_last && !(bot->pflags & PF_JUMPED) //&& !(player->pflags & PF_SPINNING)
|
||||
&& ((zdist > 32*scale && player->pflags & PF_JUMPED) // Following
|
||||
|| (zdist > 64*scale && panic) // Vertical catch-up
|
||||
|| (stalled && anxiety > 20 && bot->powers[pw_carry] == CR_NONE)
|
||||
//|| (bmom < scale>>3 && dist > followthres && !(bot->powers[pw_carry])) // Stopped & not in carry state
|
||||
|| (bot->pflags & PF_SPINNING && !(bot->pflags & PF_JUMPED)))) // Spinning
|
||||
jump = true;
|
||||
// Hold jump
|
||||
else if (bot->pflags & PF_JUMPED && jump_last && tails->momz*flip > 0 && (zdist > 0 || panic))
|
||||
jump = true;
|
||||
// Start flying
|
||||
else if (bot->pflags & PF_JUMPED && panic && !jump_last && bot->charability == CA_FLY)
|
||||
jump = true;
|
||||
}
|
||||
|
||||
// ********
|
||||
// HISTORY
|
||||
jump_last = jump;
|
||||
spin_last = spin;
|
||||
|
||||
// Turn the virtual keypresses into ticcmd_t.
|
||||
B_KeysToTiccmd(tails, cmd, forward, backward, left, right, false, false, jump, spin);
|
||||
|
||||
// Update our status
|
||||
lastForward = forward;
|
||||
lastBlocked = blocked;
|
||||
blocked = false;
|
||||
}
|
||||
|
||||
void B_BuildTiccmd(player_t *player, ticcmd_t *cmd)
|
||||
{
|
||||
// Can't build a ticcmd if we aren't spawned...
|
||||
if (!player->mo)
|
||||
return;
|
||||
|
||||
if (player->playerstate == PST_DEAD)
|
||||
{
|
||||
if (B_CheckRespawn(player))
|
||||
cmd->buttons |= BT_JUMP;
|
||||
return;
|
||||
}
|
||||
|
||||
// Bot AI isn't programmed in analog.
|
||||
CV_SetValue(&cv_analog[1], false);
|
||||
|
||||
// Let Lua scripts build ticcmds
|
||||
if (LUAh_BotTiccmd(player, cmd))
|
||||
return;
|
||||
|
||||
// We don't have any main character AI, sorry. D:
|
||||
if (player-players == consoleplayer)
|
||||
return;
|
||||
|
||||
// Basic Tails AI
|
||||
B_BuildTailsTiccmd(players[consoleplayer].mo, player->mo, cmd);
|
||||
}
|
||||
|
||||
void B_KeysToTiccmd(mobj_t *mo, ticcmd_t *cmd, boolean forward, boolean backward, boolean left, boolean right, boolean strafeleft, boolean straferight, boolean jump, boolean spin)
|
||||
{
|
||||
// don't try to do stuff if your sonic is in a minecart or something
|
||||
if (players[consoleplayer].powers[pw_carry] && players[consoleplayer].powers[pw_carry] != CR_PLAYER)
|
||||
return;
|
||||
// Turn the virtual keypresses into ticcmd_t.
|
||||
if (twodlevel || mo->flags2 & MF2_TWOD) {
|
||||
if (players[consoleplayer].climbing
|
||||
|| mo->player->pflags & PF_GLIDING) {
|
||||
// Don't mess with bot inputs during these unhandled movement conditions.
|
||||
// The normal AI doesn't use abilities, so custom AI should be sending us exactly what it wants anyway.
|
||||
if (forward)
|
||||
cmd->forwardmove += MAXPLMOVE<<FRACBITS>>16;
|
||||
if (backward)
|
||||
cmd->forwardmove -= MAXPLMOVE<<FRACBITS>>16;
|
||||
if (left || strafeleft)
|
||||
cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
|
||||
if (right || straferight)
|
||||
cmd->sidemove += MAXPLMOVE<<FRACBITS>>16;
|
||||
} else {
|
||||
// In standard 2D mode, interpret "forward" as "the way you're facing" and everything else as "the way you're not facing"
|
||||
if (left || right)
|
||||
backward = true;
|
||||
left = right = false;
|
||||
if (forward) {
|
||||
if (mo->angle < ANGLE_90 || mo->angle > ANGLE_270)
|
||||
right = true;
|
||||
else
|
||||
left = true;
|
||||
} else if (backward) {
|
||||
if (mo->angle < ANGLE_90 || mo->angle > ANGLE_270)
|
||||
left = true;
|
||||
else
|
||||
right = true;
|
||||
}
|
||||
if (left || strafeleft)
|
||||
cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
|
||||
if (right || straferight)
|
||||
cmd->sidemove += MAXPLMOVE<<FRACBITS>>16;
|
||||
}
|
||||
} else {
|
||||
angle_t angle;
|
||||
if (forward)
|
||||
cmd->forwardmove += MAXPLMOVE<<FRACBITS>>16;
|
||||
if (backward)
|
||||
cmd->forwardmove -= MAXPLMOVE<<FRACBITS>>16;
|
||||
if (left)
|
||||
cmd->angleturn += 1280;
|
||||
if (right)
|
||||
cmd->angleturn -= 1280;
|
||||
if (strafeleft)
|
||||
cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
|
||||
if (straferight)
|
||||
cmd->sidemove += MAXPLMOVE<<FRACBITS>>16;
|
||||
|
||||
// cap inputs so the bot can't accelerate faster diagonally
|
||||
angle = R_PointToAngle2(0, 0, cmd->sidemove << FRACBITS, cmd->forwardmove << FRACBITS);
|
||||
{
|
||||
INT32 maxforward = abs(P_ReturnThrustY(NULL, angle, MAXPLMOVE));
|
||||
INT32 maxside = abs(P_ReturnThrustX(NULL, angle, MAXPLMOVE));
|
||||
cmd->forwardmove = max(min(cmd->forwardmove, maxforward), -maxforward);
|
||||
cmd->sidemove = max(min(cmd->sidemove, maxside), -maxside);
|
||||
}
|
||||
}
|
||||
if (jump)
|
||||
cmd->buttons |= BT_JUMP;
|
||||
if (spin)
|
||||
cmd->buttons |= BT_USE;
|
||||
}
|
||||
|
||||
void B_MoveBlocked(player_t *player)
|
||||
{
|
||||
(void)player;
|
||||
blocked = true;
|
||||
}
|
||||
|
||||
boolean B_CheckRespawn(player_t *player)
|
||||
{
|
||||
mobj_t *sonic = players[consoleplayer].mo;
|
||||
mobj_t *tails = player->mo;
|
||||
|
||||
// We can't follow Sonic if he's not around!
|
||||
if (!sonic || sonic->health <= 0)
|
||||
return false;
|
||||
|
||||
// B_RespawnBot doesn't do anything if the condition above this isn't met
|
||||
{
|
||||
UINT8 shouldForce = LUAh_BotRespawn(sonic, tails);
|
||||
|
||||
if (P_MobjWasRemoved(sonic) || P_MobjWasRemoved(tails))
|
||||
return (shouldForce == 1); // mobj was removed
|
||||
|
||||
if (shouldForce == 1)
|
||||
return true;
|
||||
else if (shouldForce == 2)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if Sonic is busy first.
|
||||
// If he's doing any of these things, he probably doesn't want to see us.
|
||||
if (sonic->player->pflags & (PF_GLIDING|PF_SLIDING|PF_BOUNCING)
|
||||
|| (sonic->player->panim != PA_IDLE && sonic->player->panim != PA_WALK)
|
||||
|| (sonic->player->powers[pw_carry] && sonic->player->powers[pw_carry] != CR_PLAYER))
|
||||
return false;
|
||||
|
||||
// Low ceiling, do not want!
|
||||
if (sonic->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (sonic->z - sonic->floorz < (sonic->player->exiting ? 5 : 2)*sonic->height)
|
||||
return false;
|
||||
}
|
||||
else if (sonic->ceilingz - sonic->z < (sonic->player->exiting ? 6 : 3)*sonic->height)
|
||||
return false;
|
||||
|
||||
// If you're dead, wait a few seconds to respawn.
|
||||
if (player->playerstate == PST_DEAD) {
|
||||
if (player->deadtimer > 4*TICRATE)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// If you can't see Sonic, I guess we should?
|
||||
if (!P_CheckSight(sonic, tails) && P_AproxDistance(P_AproxDistance(tails->x-sonic->x, tails->y-sonic->y), tails->z-sonic->z) > FixedMul(1024*FRACUNIT, tails->scale))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void B_RespawnBot(INT32 playernum)
|
||||
{
|
||||
player_t *player = &players[playernum];
|
||||
fixed_t x,y,z;
|
||||
mobj_t *sonic = players[consoleplayer].mo;
|
||||
mobj_t *tails;
|
||||
|
||||
if (!sonic || sonic->health <= 0)
|
||||
return;
|
||||
|
||||
B_ResetAI();
|
||||
|
||||
player->bot = 1;
|
||||
P_SpawnPlayer(playernum);
|
||||
tails = player->mo;
|
||||
|
||||
x = sonic->x;
|
||||
y = sonic->y;
|
||||
if (sonic->eflags & MFE_VERTICALFLIP) {
|
||||
tails->eflags |= MFE_VERTICALFLIP;
|
||||
z = sonic->z - (512*sonic->scale);
|
||||
if (z < sonic->floorz)
|
||||
z = sonic->floorz;
|
||||
} else {
|
||||
z = sonic->z + sonic->height + (512*sonic->scale);
|
||||
if (z > sonic->ceilingz - sonic->height)
|
||||
z = sonic->ceilingz - sonic->height;
|
||||
}
|
||||
|
||||
if (sonic->flags2 & MF2_OBJECTFLIP)
|
||||
tails->flags2 |= MF2_OBJECTFLIP;
|
||||
if (sonic->flags2 & MF2_TWOD)
|
||||
tails->flags2 |= MF2_TWOD;
|
||||
if (sonic->eflags & MFE_UNDERWATER)
|
||||
tails->eflags |= MFE_UNDERWATER;
|
||||
player->powers[pw_underwater] = sonic->player->powers[pw_underwater];
|
||||
player->powers[pw_spacetime] = sonic->player->powers[pw_spacetime];
|
||||
player->powers[pw_gravityboots] = sonic->player->powers[pw_gravityboots];
|
||||
player->powers[pw_nocontrol] = sonic->player->powers[pw_nocontrol];
|
||||
player->acceleration = sonic->player->acceleration;
|
||||
player->accelstart = sonic->player->accelstart;
|
||||
player->thrustfactor = sonic->player->thrustfactor;
|
||||
player->normalspeed = sonic->player->normalspeed;
|
||||
player->pflags |= PF_AUTOBRAKE|(sonic->player->pflags & PF_DIRECTIONCHAR);
|
||||
|
||||
P_TeleportMove(tails, x, y, z);
|
||||
if (player->charability == CA_FLY)
|
||||
{
|
||||
P_SetPlayerMobjState(tails, S_PLAY_FLY);
|
||||
tails->player->powers[pw_tailsfly] = (UINT16)-1;
|
||||
}
|
||||
else
|
||||
P_SetPlayerMobjState(tails, S_PLAY_FALL);
|
||||
P_SetScale(tails, sonic->scale);
|
||||
tails->destscale = sonic->destscale;
|
||||
}
|
||||
|
||||
void B_HandleFlightIndicator(player_t *player)
|
||||
{
|
||||
mobj_t *tails = player->mo;
|
||||
|
||||
if (!tails)
|
||||
return;
|
||||
|
||||
if (thinkfly && player->bot == 1 && tails->health)
|
||||
{
|
||||
if (!tails->hnext)
|
||||
{
|
||||
P_SetTarget(&tails->hnext, P_SpawnMobjFromMobj(tails, 0, 0, 0, MT_OVERLAY));
|
||||
if (tails->hnext)
|
||||
{
|
||||
P_SetTarget(&tails->hnext->target, tails);
|
||||
P_SetTarget(&tails->hnext->hprev, tails);
|
||||
P_SetMobjState(tails->hnext, S_FLIGHTINDICATOR);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (tails->hnext && tails->hnext->type == MT_OVERLAY && tails->hnext->state == states+S_FLIGHTINDICATOR)
|
||||
{
|
||||
P_RemoveMobj(tails->hnext);
|
||||
P_SetTarget(&tails->hnext, NULL);
|
||||
}
|
||||
}
|
||||
18
src/b_bot.h
18
src/b_bot.h
|
|
@ -1,18 +0,0 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
||||
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \file b_bot.h
|
||||
/// \brief Basic bot handling
|
||||
|
||||
void B_BuildTiccmd(player_t *player, ticcmd_t *cmd);
|
||||
void B_KeysToTiccmd(mobj_t *mo, ticcmd_t *cmd, boolean forward, boolean backward, boolean left, boolean right, boolean strafeleft, boolean straferight, boolean jump, boolean spin);
|
||||
boolean B_CheckRespawn(player_t *player);
|
||||
void B_MoveBlocked(player_t *player);
|
||||
void B_RespawnBot(INT32 playernum);
|
||||
void B_HandleFlightIndicator(player_t *player);
|
||||
|
|
@ -2553,8 +2553,6 @@ static void readmenu(MYFILE *f, INT32 num)
|
|||
{
|
||||
if (fastcmp(word2, "USER"))
|
||||
menupres[num].ttmode = TTMODE_USER;
|
||||
else if (fastcmp(word2, "ALACROIX"))
|
||||
menupres[num].ttmode = TTMODE_ALACROIX;
|
||||
else if (fastcmp(word2, "HIDE") || fastcmp(word2, "HIDDEN") || fastcmp(word2, "NONE"))
|
||||
{
|
||||
menupres[num].ttmode = TTMODE_USER;
|
||||
|
|
@ -4067,8 +4065,6 @@ static void readmaincfg(MYFILE *f)
|
|||
{
|
||||
if (fastcmp(word2, "USER"))
|
||||
ttmode = TTMODE_USER;
|
||||
else if (fastcmp(word2, "ALACROIX"))
|
||||
ttmode = TTMODE_ALACROIX;
|
||||
else if (fastcmp(word2, "HIDE") || fastcmp(word2, "HIDDEN") || fastcmp(word2, "NONE"))
|
||||
{
|
||||
ttmode = TTMODE_USER;
|
||||
|
|
|
|||
1060
src/f_finale.c
1060
src/f_finale.c
File diff suppressed because it is too large
Load diff
|
|
@ -86,8 +86,8 @@ typedef enum
|
|||
{
|
||||
TTMODE_NONE = 0,
|
||||
TTMODE_OLD,
|
||||
TTMODE_ALACROIX,
|
||||
TTMODE_USER
|
||||
TTMODE_USER,
|
||||
//TTMODE_RINGRACERS
|
||||
} ttmode_enum;
|
||||
|
||||
#define TTMAX_ALACROIX 30 // max frames for SONIC typeface, plus one for NULL terminating entry
|
||||
|
|
|
|||
|
|
@ -3880,11 +3880,6 @@ void G_LoadGameData(void)
|
|||
//For records
|
||||
tic_t rectime;
|
||||
tic_t reclap;
|
||||
//UINT32 recscore;
|
||||
//UINT16 recrings;
|
||||
|
||||
//UINT8 recmares;
|
||||
//INT32 curmare;
|
||||
|
||||
// Clear things so previously read gamedata doesn't transfer
|
||||
// to new gamedata
|
||||
|
|
@ -4049,8 +4044,7 @@ void G_SaveGameData(boolean force)
|
|||
for (i = 0; i < PWRLV_NUMTYPES; i++)
|
||||
WRITEUINT16(save_p, vspowerlevel[i]);
|
||||
|
||||
btemp = (UINT8)(savemoddata); // what used to be here was profoundly dunderheaded
|
||||
WRITEUINT8(save_p, btemp);
|
||||
WRITEUINT8(save_p, (UINT8)savemoddata);
|
||||
|
||||
// TODO put another cipher on these things? meh, I don't care...
|
||||
for (i = 0; i < NUMMAPS; i++)
|
||||
|
|
|
|||
|
|
@ -128,6 +128,7 @@ extern INT32 gamecontroldefault[MAXSPLITSCREENPLAYERS][num_gamecontrolschemes][n
|
|||
|
||||
#define num_gcl_accelerate 1
|
||||
#define num_gcl_brake 1
|
||||
#define num_gcl_drift 1
|
||||
#define num_gcl_spindash 3
|
||||
#define num_gcl_movement 5
|
||||
#define num_gcl_item 3
|
||||
|
|
@ -135,6 +136,7 @@ extern INT32 gamecontroldefault[MAXSPLITSCREENPLAYERS][num_gamecontrolschemes][n
|
|||
|
||||
extern const INT32 gcl_accelerate[num_gcl_accelerate];
|
||||
extern const INT32 gcl_brake[num_gcl_brake];
|
||||
extern const INT32 gcl_drift[num_gcl_drift];
|
||||
extern const INT32 gcl_spindash[num_gcl_spindash];
|
||||
extern const INT32 gcl_movement[num_gcl_movement];
|
||||
extern const INT32 gcl_item[num_gcl_item];
|
||||
|
|
|
|||
|
|
@ -783,18 +783,18 @@ static void HW3S_UpdateListener(mobj_t *listener)
|
|||
if (!listener || !listener->player)
|
||||
return;
|
||||
|
||||
if (camera.chase)
|
||||
if (camera[0].chase)
|
||||
{
|
||||
data.x = FIXED_TO_FLOAT(camera.x);
|
||||
data.y = FIXED_TO_FLOAT(camera.y);
|
||||
data.z = FIXED_TO_FLOAT(camera.z + camera.height - (5 * FRACUNIT));
|
||||
data.x = FIXED_TO_FLOAT(camera[0].x);
|
||||
data.y = FIXED_TO_FLOAT(camera[0].y);
|
||||
data.z = FIXED_TO_FLOAT(camera[0].z + camera[0].height - (5 * FRACUNIT));
|
||||
|
||||
data.f_angle = ANGLE2DEG(camera.angle);
|
||||
data.h_angle = ANGLE2DEG(camera.aiming);
|
||||
data.f_angle = ANGLE2DEG(camera[0].angle);
|
||||
data.h_angle = ANGLE2DEG(camera[0].aiming);
|
||||
|
||||
data.momx = TPS(FIXED_TO_FLOAT(camera.momx));
|
||||
data.momy = TPS(FIXED_TO_FLOAT(camera.momy));
|
||||
data.momz = TPS(FIXED_TO_FLOAT(camera.momz));
|
||||
data.momx = TPS(FIXED_TO_FLOAT(camera[0].momx));
|
||||
data.momy = TPS(FIXED_TO_FLOAT(camera[0].momy));
|
||||
data.momz = TPS(FIXED_TO_FLOAT(camera[0].momz));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t
|
|||
float adjustx = ((option & V_NOSCALESTART) ? vid.width : BASEVIDWIDTH)/2.0f;
|
||||
fscalew /= 2;
|
||||
cx /= 2;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(option & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -224,7 +224,7 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t
|
|||
perplayershuffle |= 4;
|
||||
option &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(option & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -233,7 +233,7 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t
|
|||
cx += adjustx;
|
||||
option &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(option & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -242,7 +242,7 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t
|
|||
cy += adjusty;
|
||||
option &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(option & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -257,13 +257,13 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(option & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle = 1;
|
||||
option &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(option & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle = 2;
|
||||
|
|
@ -719,7 +719,7 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
|
|||
fixed_t adjustx = ((color & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)/2.0f;
|
||||
w >>= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -727,7 +727,7 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
|
|||
perplayershuffle |= 4;
|
||||
color &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -736,7 +736,7 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
|
|||
x += adjustx;
|
||||
color &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -745,7 +745,7 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
|
|||
y += adjusty;
|
||||
color &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -760,13 +760,13 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
color &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1198,7 +1198,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
|
|||
fixed_t adjustx = ((color & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)/2.0f;
|
||||
w >>= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1206,7 +1206,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
|
|||
perplayershuffle |= 4;
|
||||
color &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1215,7 +1215,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
|
|||
x += adjustx;
|
||||
color &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1224,7 +1224,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
|
|||
y += adjusty;
|
||||
color &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1239,13 +1239,13 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
color &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1369,7 +1369,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
|||
fixed_t adjustx = ((color & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)/2.0f;
|
||||
w >>= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1377,7 +1377,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
|||
perplayershuffle |= 4;
|
||||
color &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1386,7 +1386,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
|||
x += adjustx;
|
||||
color &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1395,7 +1395,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
|||
y += adjusty;
|
||||
color &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1410,13 +1410,13 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
color &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
|
|||
|
|
@ -5726,7 +5726,7 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
|
|||
// Make a viewangle int so we can render things based on mouselook
|
||||
if (player == &players[consoleplayer])
|
||||
viewangle = localaiming;
|
||||
else if (splitscreen && player == &players[secondarydisplayplayer])
|
||||
else if (splitscreen && player == &players[displayplayers[1]])
|
||||
viewangle = localaiming2;
|
||||
|
||||
// Handle stuff when you are looking farther up or down.
|
||||
|
|
@ -5948,7 +5948,7 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player)
|
|||
// Make a viewangle int so we can render things based on mouselook
|
||||
if (player == &players[consoleplayer])
|
||||
viewangle = localaiming;
|
||||
else if (splitscreen && player == &players[secondarydisplayplayer])
|
||||
else if (splitscreen && player == &players[displayplayers[1]])
|
||||
viewangle = localaiming2;
|
||||
|
||||
// Handle stuff when you are looking farther up or down.
|
||||
|
|
|
|||
|
|
@ -1972,12 +1972,6 @@ static void HU_DrawCEcho(void)
|
|||
*line = '\0';
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, y, realflags, echoptr);
|
||||
if (splitscreen)
|
||||
{
|
||||
stplyr = ((stplyr == &players[displayplayer]) ? &players[secondarydisplayplayer] : &players[displayplayer]);
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, y, realflags, echoptr);
|
||||
stplyr = ((stplyr == &players[displayplayer]) ? &players[secondarydisplayplayer] : &players[displayplayer]);
|
||||
}
|
||||
y += ((realflags & V_RETURN8) ? 8 : 12);
|
||||
|
||||
echoptr = line;
|
||||
|
|
|
|||
|
|
@ -1480,7 +1480,7 @@ void Command_ObjectPlace_f(void)
|
|||
op_oldmomy = players[0].mo->momy;
|
||||
op_oldmomz = players[0].mo->momz;
|
||||
op_oldheight = players[0].mo->height;
|
||||
op_oldstate = S_KART_STILL1; // SRB2kart - was S_PLAY_STND
|
||||
op_oldstate = S_KART_STILL;
|
||||
op_oldcolor = players[0].mo->color; // save color too in case of super/fireflower
|
||||
|
||||
// Remove ALL flags and motion.
|
||||
|
|
|
|||
|
|
@ -304,14 +304,14 @@ void P_CameraLineOpening(line_t *linedef)
|
|||
if (front->camsec >= 0)
|
||||
{
|
||||
// SRB2CBTODO: ESLOPE (sectors[front->heightsec].f_slope)
|
||||
frontfloor = P_GetSectorFloorZAt (§ors[front->camsec], camera.x, camera.y);
|
||||
frontceiling = P_GetSectorCeilingZAt(§ors[front->camsec], camera.x, camera.y);
|
||||
frontfloor = P_GetSectorFloorZAt (§ors[front->camsec], camera[0].x, camera[0].y);
|
||||
frontceiling = P_GetSectorCeilingZAt(§ors[front->camsec], camera[0].x, camera[0].y);
|
||||
}
|
||||
else if (front->heightsec >= 0)
|
||||
{
|
||||
// SRB2CBTODO: ESLOPE (sectors[front->heightsec].f_slope)
|
||||
frontfloor = P_GetSectorFloorZAt (§ors[front->heightsec], camera.x, camera.y);
|
||||
frontceiling = P_GetSectorCeilingZAt(§ors[front->heightsec], camera.x, camera.y);
|
||||
frontfloor = P_GetSectorFloorZAt (§ors[front->heightsec], camera[0].x, camera[0].y);
|
||||
frontceiling = P_GetSectorCeilingZAt(§ors[front->heightsec], camera[0].x, camera[0].y);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -322,14 +322,14 @@ void P_CameraLineOpening(line_t *linedef)
|
|||
if (back->camsec >= 0)
|
||||
{
|
||||
// SRB2CBTODO: ESLOPE (sectors[back->heightsec].f_slope)
|
||||
backfloor = P_GetSectorFloorZAt (§ors[back->camsec], camera.x, camera.y);
|
||||
backceiling = P_GetSectorCeilingZAt(§ors[back->camsec], camera.x, camera.y);
|
||||
backfloor = P_GetSectorFloorZAt (§ors[back->camsec], camera[0].x, camera[0].y);
|
||||
backceiling = P_GetSectorCeilingZAt(§ors[back->camsec], camera[0].x, camera[0].y);
|
||||
}
|
||||
else if (back->heightsec >= 0)
|
||||
{
|
||||
// SRB2CBTODO: ESLOPE (sectors[back->heightsec].f_slope)
|
||||
backfloor = P_GetSectorFloorZAt (§ors[back->heightsec], camera.x, camera.y);
|
||||
backceiling = P_GetSectorCeilingZAt(§ors[back->heightsec], camera.x, camera.y);
|
||||
backfloor = P_GetSectorFloorZAt (§ors[back->heightsec], camera[0].x, camera[0].y);
|
||||
backceiling = P_GetSectorCeilingZAt(§ors[back->heightsec], camera[0].x, camera[0].y);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
431
src/p_mobj.c
431
src/p_mobj.c
|
|
@ -6605,134 +6605,6 @@ static void P_RemoveOverlay(mobj_t *thing)
|
|||
}
|
||||
}
|
||||
|
||||
void A_BossDeath(mobj_t *mo);
|
||||
// AI for the Koopa boss.
|
||||
static void P_KoopaThinker(mobj_t *koopa)
|
||||
{
|
||||
P_MobjCheckWater(koopa);
|
||||
|
||||
if (koopa->watertop > koopa->z + koopa->height + FixedMul(128*FRACUNIT, koopa->scale) && koopa->health > 0)
|
||||
{
|
||||
A_BossDeath(koopa);
|
||||
P_RemoveMobj(koopa);
|
||||
return;
|
||||
}
|
||||
|
||||
// Koopa moves ONLY on the X axis!
|
||||
if (koopa->threshold > 0)
|
||||
{
|
||||
koopa->threshold--;
|
||||
koopa->momx = FixedMul(FRACUNIT, koopa->scale);
|
||||
|
||||
if (!koopa->threshold)
|
||||
koopa->threshold = -TICRATE*2;
|
||||
}
|
||||
else if (koopa->threshold < 0)
|
||||
{
|
||||
koopa->threshold++;
|
||||
koopa->momx = FixedMul(-FRACUNIT, koopa->scale);
|
||||
|
||||
if (!koopa->threshold)
|
||||
koopa->threshold = TICRATE*2;
|
||||
}
|
||||
else
|
||||
koopa->threshold = TICRATE*2;
|
||||
|
||||
P_XYMovement(koopa);
|
||||
|
||||
if (P_RandomChance(FRACUNIT/32) && koopa->z <= koopa->floorz)
|
||||
koopa->momz = FixedMul(5*FRACUNIT, koopa->scale);
|
||||
|
||||
if (koopa->z > koopa->floorz)
|
||||
koopa->momz += FixedMul(FRACUNIT/4, koopa->scale);
|
||||
|
||||
if (P_RandomChance(FRACUNIT/64))
|
||||
{
|
||||
mobj_t *flame;
|
||||
flame = P_SpawnMobj(koopa->x - koopa->radius + FixedMul(5*FRACUNIT, koopa->scale), koopa->y, koopa->z + (P_RandomByte()<<(FRACBITS-2)), MT_KOOPAFLAME);
|
||||
flame->momx = -FixedMul(flame->info->speed, flame->scale);
|
||||
S_StartSound(flame, sfx_koopfr);
|
||||
}
|
||||
else if (P_RandomChance(5*FRACUNIT/256))
|
||||
{
|
||||
mobj_t *hammer;
|
||||
hammer = P_SpawnMobj(koopa->x - koopa->radius, koopa->y, koopa->z + koopa->height, MT_HAMMER);
|
||||
hammer->momx = FixedMul(-5*FRACUNIT, hammer->scale);
|
||||
hammer->momz = FixedMul(7*FRACUNIT, hammer->scale);
|
||||
}
|
||||
}
|
||||
|
||||
// Spawns and chains the minecart sides.
|
||||
static void P_SpawnMinecartSegments(mobj_t *mobj, boolean mode)
|
||||
{
|
||||
fixed_t x = mobj->x;
|
||||
fixed_t y = mobj->y;
|
||||
fixed_t z = mobj->z;
|
||||
mobj_t *prevseg = mobj;
|
||||
mobj_t *seg;
|
||||
UINT8 i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
seg = P_SpawnMobj(x, y, z, MT_MINECARTSEG);
|
||||
P_SetMobjState(seg, (statenum_t)(S_MINECARTSEG_FRONT + i));
|
||||
if (i >= 2)
|
||||
seg->extravalue1 = (i == 2) ? -18 : 18; // make -20/20 when papersprite projection fixed
|
||||
else
|
||||
{
|
||||
seg->extravalue2 = (i == 0) ? 24 : -24;
|
||||
seg->cusval = -90;
|
||||
}
|
||||
if (!mode)
|
||||
seg->frame &= ~FF_ANIMATE;
|
||||
P_SetTarget(&prevseg->tracer, seg);
|
||||
prevseg = seg;
|
||||
}
|
||||
}
|
||||
|
||||
// Updates the chained segments.
|
||||
static void P_UpdateMinecartSegments(mobj_t *mobj)
|
||||
{
|
||||
mobj_t *seg = mobj->tracer;
|
||||
fixed_t x = mobj->x;
|
||||
fixed_t y = mobj->y;
|
||||
fixed_t z = mobj->z;
|
||||
angle_t ang = mobj->angle;
|
||||
angle_t fa = (ang >> ANGLETOFINESHIFT) & FINEMASK;
|
||||
fixed_t c = FINECOSINE(fa);
|
||||
fixed_t s = FINESINE(fa);
|
||||
INT32 dx, dy;
|
||||
INT32 sang;
|
||||
|
||||
while (seg)
|
||||
{
|
||||
dx = seg->extravalue1;
|
||||
dy = seg->extravalue2;
|
||||
sang = seg->cusval;
|
||||
P_TeleportMove(seg, x + s*dx + c*dy, y - c*dx + s*dy, z);
|
||||
seg->angle = ang + FixedAngle(FRACUNIT*sang);
|
||||
seg->flags2 = (seg->flags2 & ~MF2_DONTDRAW) | (mobj->flags2 & MF2_DONTDRAW);
|
||||
seg = seg->tracer;
|
||||
}
|
||||
}
|
||||
|
||||
void P_HandleMinecartSegments(mobj_t *mobj)
|
||||
{
|
||||
if (!mobj->tracer)
|
||||
P_SpawnMinecartSegments(mobj, (mobj->type == MT_MINECART));
|
||||
P_UpdateMinecartSegments(mobj);
|
||||
}
|
||||
|
||||
static void P_PyreFlyBurn(mobj_t *mobj, fixed_t hoffs, INT16 vrange, mobjtype_t mobjtype, fixed_t momz)
|
||||
{
|
||||
angle_t fa = (FixedAngle(P_RandomKey(360)*FRACUNIT) >> ANGLETOFINESHIFT) & FINEMASK;
|
||||
fixed_t xoffs = FixedMul(FINECOSINE(fa), mobj->radius + hoffs);
|
||||
fixed_t yoffs = FixedMul(FINESINE(fa), mobj->radius + hoffs);
|
||||
fixed_t zoffs = P_RandomRange(-vrange, vrange)*FRACUNIT;
|
||||
mobj_t *particle = P_SpawnMobjFromMobj(mobj, xoffs, yoffs, zoffs, mobjtype);
|
||||
particle->momz = momz;
|
||||
}
|
||||
|
||||
static void P_MobjScaleThink(mobj_t *mobj)
|
||||
{
|
||||
fixed_t oldheight = mobj->height;
|
||||
|
|
@ -6833,43 +6705,6 @@ static void P_MaceSceneryThink(mobj_t *mobj)
|
|||
P_MaceRotate(mobj, mobj->movedir, oldmovedir);
|
||||
}
|
||||
|
||||
static boolean P_DrownNumbersSceneryThink(mobj_t *mobj)
|
||||
{
|
||||
if (!mobj->target)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
}
|
||||
if (!mobj->target->player || !(mobj->target->player->powers[pw_underwater] || mobj->target->player->powers[pw_spacetime]))
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
}
|
||||
mobj->x = mobj->target->x;
|
||||
mobj->y = mobj->target->y;
|
||||
|
||||
mobj->destscale = mobj->target->destscale;
|
||||
P_SetScale(mobj, mobj->target->scale);
|
||||
|
||||
if (mobj->target->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
mobj->z = mobj->target->z - FixedMul(16*FRACUNIT, mobj->target->scale) - mobj->height;
|
||||
if (mobj->target->player->pflags & PF_FLIPCAM)
|
||||
mobj->eflags |= MFE_VERTICALFLIP;
|
||||
}
|
||||
else
|
||||
mobj->z = mobj->target->z + (mobj->target->height) + FixedMul(8*FRACUNIT, mobj->target->scale); // Adjust height for height changes
|
||||
|
||||
if (mobj->threshold <= 35)
|
||||
mobj->flags2 |= MF2_DONTDRAW;
|
||||
else
|
||||
mobj->flags2 &= ~MF2_DONTDRAW;
|
||||
if (mobj->threshold <= 30)
|
||||
mobj->threshold = 40;
|
||||
mobj->threshold--;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void P_FlameJetSceneryThink(mobj_t *mobj)
|
||||
{
|
||||
mobj_t *flame;
|
||||
|
|
@ -7009,218 +6844,6 @@ static boolean P_ParticleGenSceneryThink(mobj_t *mobj)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void P_RosySceneryThink(mobj_t *mobj)
|
||||
{
|
||||
UINT8 i;
|
||||
fixed_t pdist = 1700*mobj->scale, work, actualwork;
|
||||
player_t *player = NULL;
|
||||
statenum_t stat = (mobj->state - states);
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
if (!players[i].mo)
|
||||
continue;
|
||||
if (players[i].bot)
|
||||
continue;
|
||||
if (!players[i].mo->health)
|
||||
continue;
|
||||
actualwork = work = FixedHypot(mobj->x - players[i].mo->x, mobj->y - players[i].mo->y);
|
||||
if (player)
|
||||
{
|
||||
if (players[i].skin == 0 || players[i].skin == 5)
|
||||
work = (2*work)/3;
|
||||
if (work >= pdist)
|
||||
continue;
|
||||
}
|
||||
pdist = actualwork;
|
||||
player = &players[i];
|
||||
}
|
||||
|
||||
if (stat == S_ROSY_JUMP || stat == S_ROSY_PAIN)
|
||||
{
|
||||
if (P_IsObjectOnGround(mobj))
|
||||
{
|
||||
mobj->momx = mobj->momy = 0;
|
||||
if (player && mobj->cvmem < (-2*TICRATE))
|
||||
stat = S_ROSY_UNHAPPY;
|
||||
else
|
||||
stat = S_ROSY_WALK;
|
||||
P_SetMobjState(mobj, stat);
|
||||
}
|
||||
else if (P_MobjFlip(mobj)*mobj->momz < 0)
|
||||
mobj->frame = mobj->state->frame + mobj->state->var1;
|
||||
}
|
||||
|
||||
if (!player)
|
||||
{
|
||||
if ((stat < S_ROSY_IDLE1 || stat > S_ROSY_IDLE4) && stat != S_ROSY_JUMP)
|
||||
{
|
||||
mobj->momx = mobj->momy = 0;
|
||||
P_SetMobjState(mobj, S_ROSY_IDLE1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
boolean dojump = false, targonground, love, makeheart = false;
|
||||
if (mobj->target != player->mo)
|
||||
P_SetTarget(&mobj->target, player->mo);
|
||||
// Tatsuru: Don't try to hug them if they're above or below you!
|
||||
targonground = (P_IsObjectOnGround(mobj->target) && (player->panim == PA_IDLE || player->panim == PA_WALK || player->panim == PA_RUN) && player->mo->z == mobj->z);
|
||||
love = (player->skin == 0 || player->skin == 5);
|
||||
|
||||
switch (stat)
|
||||
{
|
||||
case S_ROSY_IDLE1:
|
||||
case S_ROSY_IDLE2:
|
||||
case S_ROSY_IDLE3:
|
||||
case S_ROSY_IDLE4:
|
||||
dojump = true;
|
||||
break;
|
||||
case S_ROSY_JUMP:
|
||||
case S_ROSY_PAIN:
|
||||
// handled above
|
||||
break;
|
||||
case S_ROSY_WALK:
|
||||
{
|
||||
fixed_t x = mobj->x, y = mobj->y, z = mobj->z;
|
||||
angle_t angletoplayer = R_PointToAngle2(x, y, mobj->target->x, mobj->target->y);
|
||||
boolean allowed = P_TryMove(mobj, mobj->target->x, mobj->target->y, false);
|
||||
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x = x;
|
||||
mobj->y = y;
|
||||
mobj->z = z;
|
||||
P_SetThingPosition(mobj);
|
||||
|
||||
if (allowed)
|
||||
{
|
||||
fixed_t mom, max;
|
||||
P_Thrust(mobj, angletoplayer, (3*FRACUNIT) >> 1);
|
||||
mom = FixedHypot(mobj->momx, mobj->momy);
|
||||
max = pdist;
|
||||
if ((--mobj->extravalue1) <= 0)
|
||||
{
|
||||
if (++mobj->frame > mobj->state->frame + mobj->state->var1)
|
||||
mobj->frame = mobj->state->frame;
|
||||
if (mom > 12*mobj->scale)
|
||||
mobj->extravalue1 = 2;
|
||||
else if (mom > 6*mobj->scale)
|
||||
mobj->extravalue1 = 3;
|
||||
else
|
||||
mobj->extravalue1 = 4;
|
||||
}
|
||||
if (max < (mobj->radius + mobj->target->radius))
|
||||
{
|
||||
mobj->momx = mobj->target->player->cmomx;
|
||||
mobj->momy = mobj->target->player->cmomy;
|
||||
if ((mobj->cvmem > TICRATE && !player->exiting) || !targonground)
|
||||
P_SetMobjState(mobj, (stat = S_ROSY_STND));
|
||||
else
|
||||
{
|
||||
mobj->target->momx = mobj->momx;
|
||||
mobj->target->momy = mobj->momy;
|
||||
P_SetMobjState(mobj, (stat = S_ROSY_HUG));
|
||||
S_StartSound(mobj, sfx_cdpcm6);
|
||||
mobj->angle = angletoplayer;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
max /= 3;
|
||||
if (max > 30*mobj->scale)
|
||||
max = 30*mobj->scale;
|
||||
if (mom > max && max > mobj->scale)
|
||||
{
|
||||
max = FixedDiv(max, mom);
|
||||
mobj->momx = FixedMul(mobj->momx, max);
|
||||
mobj->momy = FixedMul(mobj->momy, max);
|
||||
}
|
||||
if (abs(mobj->momx) > mobj->scale || abs(mobj->momy) > mobj->scale)
|
||||
mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy);
|
||||
}
|
||||
}
|
||||
else
|
||||
dojump = true;
|
||||
}
|
||||
break;
|
||||
case S_ROSY_HUG:
|
||||
if (targonground)
|
||||
{
|
||||
player->pflags |= PF_STASIS;
|
||||
if (mobj->cvmem < 5*TICRATE)
|
||||
mobj->cvmem++;
|
||||
if (love && !(leveltime & 7))
|
||||
makeheart = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mobj->cvmem < (love ? 5*TICRATE : 0))
|
||||
{
|
||||
P_SetMobjState(mobj, (stat = S_ROSY_PAIN));
|
||||
S_StartSound(mobj, sfx_cdpcm7);
|
||||
}
|
||||
else
|
||||
P_SetMobjState(mobj, (stat = S_ROSY_JUMP));
|
||||
var1 = var2 = 0;
|
||||
A_DoNPCPain(mobj);
|
||||
mobj->cvmem -= TICRATE;
|
||||
}
|
||||
break;
|
||||
case S_ROSY_STND:
|
||||
if ((pdist > (mobj->radius + mobj->target->radius + 3*(mobj->scale + mobj->target->scale))))
|
||||
P_SetMobjState(mobj, (stat = S_ROSY_WALK));
|
||||
else if (!targonground)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (love && !(leveltime & 15))
|
||||
makeheart = true;
|
||||
if (player->exiting || --mobj->cvmem < TICRATE)
|
||||
{
|
||||
P_SetMobjState(mobj, (stat = S_ROSY_HUG));
|
||||
S_StartSound(mobj, sfx_cdpcm6);
|
||||
mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->target->x, mobj->target->y);
|
||||
mobj->target->momx = mobj->momx;
|
||||
mobj->target->momy = mobj->momy;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case S_ROSY_UNHAPPY:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (stat == S_ROSY_HUG)
|
||||
{
|
||||
if (player->panim != PA_IDLE)
|
||||
P_SetPlayerMobjState(mobj->target, S_PLAY_STND);
|
||||
player->pflags |= PF_STASIS;
|
||||
}
|
||||
|
||||
if (dojump)
|
||||
{
|
||||
P_SetMobjState(mobj, S_ROSY_JUMP);
|
||||
mobj->z += P_MobjFlip(mobj);
|
||||
mobj->momx = mobj->momy = 0;
|
||||
P_SetObjectMomZ(mobj, 6 << FRACBITS, false);
|
||||
S_StartSound(mobj, sfx_cdfm02);
|
||||
}
|
||||
|
||||
if (makeheart)
|
||||
{
|
||||
mobj_t *cdlhrt = P_SpawnMobjFromMobj(mobj, 0, 0, mobj->height, MT_CDLHRT);
|
||||
cdlhrt->destscale = (5*mobj->scale) >> 4;
|
||||
P_SetScale(cdlhrt, cdlhrt->destscale);
|
||||
cdlhrt->fuse = (5*TICRATE) >> 1;
|
||||
cdlhrt->momz = mobj->scale;
|
||||
P_SetTarget(&cdlhrt->target, mobj);
|
||||
cdlhrt->extravalue1 = mobj->x;
|
||||
cdlhrt->extravalue2 = mobj->y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void P_MobjSceneryThink(mobj_t *mobj)
|
||||
{
|
||||
if (LUAh_MobjThinker(mobj))
|
||||
|
|
@ -11319,32 +10942,6 @@ static boolean P_FuseThink(mobj_t *mobj)
|
|||
else switch (mobj->type)
|
||||
{
|
||||
// gargoyle and snowman handled in P_PushableThinker, not here
|
||||
case MT_THROWNGRENADE:
|
||||
case MT_CYBRAKDEMON_NAPALM_BOMB_LARGE:
|
||||
P_SetMobjState(mobj, mobj->info->deathstate);
|
||||
break;
|
||||
case MT_LHRT:
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
break;
|
||||
case MT_BLUEFLAG:
|
||||
case MT_REDFLAG:
|
||||
P_FlagFuseThink(mobj);
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
case MT_FANG:
|
||||
if (mobj->flags2 & MF2_SLIDEPUSH)
|
||||
{
|
||||
var1 = 0;
|
||||
var2 = 0;
|
||||
A_BossDeath(mobj);
|
||||
return false;
|
||||
}
|
||||
P_SetMobjState(mobj, mobj->state->nextstate);
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
return false;
|
||||
break;
|
||||
case MT_METALSONIC_BATTLE:
|
||||
break; // don't remove
|
||||
case MT_SPIKE:
|
||||
P_SetMobjState(mobj, mobj->state->nextstate);
|
||||
mobj->fuse = mobj->info->speed;
|
||||
|
|
@ -11357,9 +10954,6 @@ static boolean P_FuseThink(mobj_t *mobj)
|
|||
if (mobj->spawnpoint)
|
||||
mobj->fuse += (mobj->spawnpoint->angle / 360);
|
||||
break;
|
||||
case MT_NIGHTSCORE:
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
case MT_LAVAFALL:
|
||||
if (mobj->state - states == S_LAVAFALL_DORMANT)
|
||||
{
|
||||
|
|
@ -11381,31 +10975,6 @@ static boolean P_FuseThink(mobj_t *mobj)
|
|||
S_StopSound(mobj);
|
||||
}
|
||||
return false;
|
||||
case MT_PYREFLY:
|
||||
if (mobj->health <= 0)
|
||||
break;
|
||||
|
||||
mobj->extravalue2 = (mobj->extravalue2 + 1) % 3;
|
||||
if (mobj->extravalue2 == 0)
|
||||
{
|
||||
P_SetMobjState(mobj, mobj->info->spawnstate);
|
||||
mobj->fuse = 100;
|
||||
S_StopSound(mobj);
|
||||
S_StartSound(mobj, sfx_s3k8c);
|
||||
}
|
||||
else if (mobj->extravalue2 == 1)
|
||||
{
|
||||
mobj->fuse = 50;
|
||||
S_StartSound(mobj, sfx_s3ka3);
|
||||
}
|
||||
else
|
||||
{
|
||||
P_SetMobjState(mobj, mobj->info->meleestate);
|
||||
mobj->fuse = 100;
|
||||
S_StopSound(mobj);
|
||||
S_StartSound(mobj, sfx_s3kc2l);
|
||||
}
|
||||
return false;
|
||||
case MT_RANDOMITEM:
|
||||
if ((gametyperules & GTR_BUMPERS) && (mobj->threshold != 70))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3742,18 +3742,18 @@ static void P_SetupCamera(UINT8 pnum, camera_t *cam)
|
|||
{
|
||||
mapthing_t *thing;
|
||||
|
||||
if (gametyperules & GTR_DEATHMATCHSTARTS)
|
||||
if (gametyperules & GTR_BATTLESTARTS)
|
||||
thing = deathmatchstarts[0];
|
||||
else
|
||||
thing = playerstarts[0];
|
||||
|
||||
if (thing)
|
||||
{
|
||||
camera.x = thing->x;
|
||||
camera.y = thing->y;
|
||||
camera.z = thing->z;
|
||||
camera.angle = FixedAngle((fixed_t)thing->angle << FRACBITS);
|
||||
camera.subsector = R_PointInSubsector(camera.x, camera.y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18)
|
||||
camera[0].x = thing->x;
|
||||
camera[0].y = thing->y;
|
||||
camera[0].z = thing->z;
|
||||
camera[0].angle = FixedAngle((fixed_t)thing->angle << FRACBITS);
|
||||
camera[0].subsector = R_PointInSubsector(camera.x, camera.y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2571,12 +2571,14 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
|||
else
|
||||
{
|
||||
UINT8 i = 0;
|
||||
mobj_t* camobj = players[displayplayer].mo;
|
||||
mobj_t* camobj;
|
||||
ffloor_t *rover;
|
||||
boolean foundit = false;
|
||||
|
||||
for (i = 0; i < 2; camobj = players[secondarydisplayplayer].mo, i++)
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
camobj = players[displayplayers[i]].mo;
|
||||
|
||||
if (!camobj)
|
||||
continue;
|
||||
|
||||
|
|
|
|||
45
src/p_user.c
45
src/p_user.c
|
|
@ -4675,33 +4675,50 @@ void P_SetPlayerAngle(player_t *player, angle_t angle)
|
|||
void P_SetLocalAngle(player_t *player, angle_t angle)
|
||||
{
|
||||
INT16 delta = (INT16)((angle - P_GetLocalAngle(player)) >> 16);
|
||||
UINT8 i;
|
||||
|
||||
P_ForceLocalAngle(player, P_GetLocalAngle(player) + (angle_t)(delta << 16));
|
||||
|
||||
if (player == &players[consoleplayer])
|
||||
ticcmd_oldangleturn[0] += delta;
|
||||
else if (player == &players[secondarydisplayplayer])
|
||||
ticcmd_oldangleturn[1] += delta;
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == &players[g_localplayers[i]])
|
||||
{
|
||||
ticcmd_oldangleturn[i] += delta;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
angle_t P_GetLocalAngle(player_t *player)
|
||||
{
|
||||
if (player == &players[consoleplayer])
|
||||
return localangle;
|
||||
else if (player == &players[secondarydisplayplayer])
|
||||
return localangle2;
|
||||
else
|
||||
return 0;
|
||||
// this function is from vanilla srb2. can you tell?
|
||||
// (hint: they have separate variables for all of this shit instead of arrays)
|
||||
|
||||
UINT8 i;
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == &players[g_localplayers[i]])
|
||||
return localangle[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void P_ForceLocalAngle(player_t *player, angle_t angle)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
angle = angle & ~UINT16_MAX;
|
||||
|
||||
if (player == &players[consoleplayer])
|
||||
localangle = angle;
|
||||
else if (player == &players[secondarydisplayplayer])
|
||||
localangle2 = angle;
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
if (player == &players[g_localplayers[i]])
|
||||
{
|
||||
localangle[i] = angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean P_PlayerFullbright(player_t *player)
|
||||
|
|
|
|||
|
|
@ -690,7 +690,7 @@ void R_CheckViewMorph(void)
|
|||
float fisheyemap[MAXVIDWIDTH/2 + 1];
|
||||
#endif
|
||||
|
||||
angle_t rollangle = players[displayplayer].viewrollangle;
|
||||
angle_t rollangle = players[displayplayers[0]].viewrollangle;
|
||||
#ifdef WOUGHMP_WOUGHMP
|
||||
fixed_t fisheye = cv_cam2_turnmultiplier.value; // temporary test value
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -773,7 +773,7 @@ void ST_drawTitleCard(void)
|
|||
if (lvlttlxpos < 0)
|
||||
lvlttlxpos = 0;
|
||||
|
||||
if (!splitscreen || (splitscreen && stplyr == &players[displayplayer]))
|
||||
if (!splitscreen || (splitscreen && stplyr == &players[displayplayers[0]]))
|
||||
{
|
||||
zzticker = lt_ticker;
|
||||
V_DrawMappedPatch(FixedInt(lt_zigzag), (-zzticker) % zigzag->height, V_SNAPTOTOP|V_SNAPTOLEFT, zigzag, colormap);
|
||||
|
|
@ -822,12 +822,11 @@ void ST_preLevelTitleCardDrawer(void)
|
|||
//
|
||||
void ST_drawWipeTitleCard(void)
|
||||
{
|
||||
stplyr = &players[consoleplayer];
|
||||
ST_preDrawTitleCard();
|
||||
ST_drawTitleCard();
|
||||
if (splitscreen)
|
||||
UINT8 i;
|
||||
|
||||
for (i = 0; i <= r_splitscreen; i++)
|
||||
{
|
||||
stplyr = &players[secondarydisplayplayer];
|
||||
stplyr = &players[displayplayers[i]];
|
||||
ST_preDrawTitleCard();
|
||||
ST_drawTitleCard();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -694,7 +694,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
|
|||
fdup >>= 1;
|
||||
colfrac <<= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -702,7 +702,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
|
|||
perplayershuffle |= 4;
|
||||
scrn &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -711,7 +711,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
|
|||
x += adjustx;
|
||||
scrn &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -720,7 +720,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
|
|||
y += adjusty;
|
||||
scrn &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -735,13 +735,13 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle = 1;
|
||||
scrn &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle = 2;
|
||||
|
|
@ -927,7 +927,7 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
|
|||
x >>= 1;
|
||||
sx >>= 1;
|
||||
w >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -935,7 +935,7 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
|
|||
perplayershuffle |= 4;
|
||||
scrn &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -945,7 +945,7 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
|
|||
sx += adjustx;
|
||||
scrn &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -955,7 +955,7 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
|
|||
sy += adjusty;
|
||||
scrn &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -972,13 +972,13 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
scrn &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(scrn & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1157,7 +1157,7 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
fixed_t adjustx = ((c & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)>>1;
|
||||
w >>= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1165,7 +1165,7 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
perplayershuffle |= 4;
|
||||
c &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1174,7 +1174,7 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
x += adjustx;
|
||||
c &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1183,7 +1183,7 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
y += adjusty;
|
||||
c &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1197,13 +1197,13 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
else
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
c &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1370,7 +1370,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
fixed_t adjustx = ((c & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)>>1;
|
||||
w >>= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1378,7 +1378,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
perplayershuffle |= 4;
|
||||
c &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1387,7 +1387,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
x += adjustx;
|
||||
c &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1396,7 +1396,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
y += adjusty;
|
||||
c &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1411,13 +1411,13 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
c &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1655,7 +1655,7 @@ void V_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c, UINT16 color, U
|
|||
fixed_t adjustx = ((c & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)>>1;
|
||||
w >>= 1;
|
||||
x >>= 1;
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1663,7 +1663,7 @@ void V_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c, UINT16 color, U
|
|||
perplayershuffle |= 4;
|
||||
c &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (stplyr == &players[secondarydisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
|
|
@ -1672,7 +1672,7 @@ void V_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c, UINT16 color, U
|
|||
x += adjustx;
|
||||
c &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
|
||||
}
|
||||
else if (stplyr == &players[thirddisplayplayer])
|
||||
else if (stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1681,7 +1681,7 @@ void V_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c, UINT16 color, U
|
|||
y += adjusty;
|
||||
c &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else //if (stplyr == &players[fourthdisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[3]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
@ -1696,13 +1696,13 @@ void V_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c, UINT16 color, U
|
|||
#endif
|
||||
// 2 players
|
||||
{
|
||||
if (stplyr == &players[displayplayer])
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 1;
|
||||
c &= ~V_SNAPTOBOTTOM;
|
||||
}
|
||||
else //if (stplyr == &players[secondarydisplayplayer])
|
||||
else //if (stplyr == &players[displayplayers[1]])
|
||||
{
|
||||
if (!(c & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
|
||||
perplayershuffle |= 2;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue