Skip to content
Snippets Groups Projects
d_player.h 16.5 KiB
Newer Older
Alam Ed Arias's avatar
Alam Ed Arias committed
// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2018 by Sonic Team Junior.
Alam Ed Arias's avatar
Alam Ed Arias committed
//
// 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  d_player.h
/// \brief player data structures

#ifndef __D_PLAYER__
#define __D_PLAYER__

// The player data structure depends on a number
// of other structs: items (internal inventory),
// animation states (closely tied to the sprites
// used to represent them, unfortunately).
#include "p_pspr.h"

// In addition, the player is just a special
// case of the generic moving object/actor.
#include "p_mobj.h"

// Finally, for odd reasons, the player input
// is buffered within the player data struct,
// as commands per game tick.
#include "d_ticcmd.h"

// Extra abilities/settings for skins (combinable stuff)
typedef enum
{
wolfs's avatar
wolfs committed
	SF_HIRES = 1, // Draw the sprite 2x as small?
Alam Ed Arias's avatar
Alam Ed Arias committed
} skinflags_t;

//
// Player states.
//
typedef enum
{
	// Playing or camping.
	PST_LIVE,
	// Dead on the ground, view follows killer.
	PST_DEAD,
	// Ready to restart/respawn???
	PST_REBORN
} playerstate_t;

//
// Player internal flags
//
typedef enum
{
	// Flip camera angle with gravity flip prefrence.
	PF_FLIPCAM = 1,

	// Cheats
	PF_GODMODE = 1<<1,
	PF_NOCLIP  = 1<<2,
	PF_INVIS   = 1<<3,

	// True if button down last tic.
	PF_ATTACKDOWN = 1<<4,
	PF_USEDOWN    = 1<<5,
	PF_JUMPDOWN   = 1<<6,
	PF_WPNDOWN    = 1<<7,

	// Unmoving states
	PF_STASIS     = 1<<8, // Player is not allowed to move
	PF_JUMPSTASIS = 1<<9, // and that includes jumping.
	PF_FULLSTASIS = PF_STASIS|PF_JUMPSTASIS,

	// Did you get a time-over?
	PF_TIMEOVER = 1<<10,

Sal's avatar
Sal committed
	// SRB2Kart: Spectator that wants to join
	PF_WANTSTOJOIN = 1<<11,
Alam Ed Arias's avatar
Alam Ed Arias committed

	// Character action status
	PF_JUMPED    = 1<<12,
	PF_SPINNING  = 1<<13,
	PF_STARTDASH = 1<<14,
	PF_THOKKED   = 1<<15,

	// Are you gliding?
	PF_GLIDING   = 1<<16,

	// Tails pickup!
	PF_CARRIED   = 1<<17,

	// Sliding (usually in water) like Labyrinth/Oil Ocean
	PF_SLIDING   = 1<<18,

	// Hanging on a rope
	PF_ROPEHANG = 1<<19,

	// Hanging on an item of some kind - zipline, chain, etc. (->tracer)
	PF_ITEMHANG = 1<<20,

	// On the mace chain spinning around (->tracer)
	PF_MACESPIN = 1<<21,

	/*** NIGHTS STUFF ***/
	// Is the player in NiGHTS mode?
	PF_NIGHTSMODE        = 1<<22,
	PF_TRANSFERTOCLOSEST = 1<<23,

	// Spill rings after falling
	PF_NIGHTSFALL        = 1<<24,
	PF_DRILLING          = 1<<25,
	PF_SKIDDOWN          = 1<<26,

	/*** TAG STUFF ***/
	PF_TAGGED            = 1<<27, // Player has been tagged and awaits the next round in hide and seek.
	PF_TAGIT             = 1<<28, // The player is it! For Tag Mode

Alam Ed Arias's avatar
Alam Ed Arias committed
	/*** misc ***/
	PF_FORCESTRAFE       = 1<<29, // Turning inputs are translated into strafing inputs
Alam Ed Arias's avatar
Alam Ed Arias committed
	PF_ANALOGMODE        = 1<<30, // Analog mode?
Alam Ed Arias's avatar
Alam Ed Arias committed

	// free: 1<<30 and 1<<31
Alam Ed Arias's avatar
Alam Ed Arias committed
} pflags_t;

typedef enum
{
	// Are animation frames playing?
	PA_ETC=0,
	PA_IDLE,
	PA_WALK,
	PA_RUN,
	PA_ROLL,
	PA_FALL,
	PA_ABILITY
} panim_t;

typedef enum
{
	SH_NONE = 0,
	// Standard shields
	SH_JUMP,
	SH_ATTRACT,
	SH_ELEMENTAL,
	SH_BOMB,
	// Stupid useless unimplimented Sonic 3 shields
	SH_BUBBLEWRAP,
	SH_THUNDERCOIN,
	SH_FLAMEAURA,
	// Pity shield: the world's most basic shield ever, given to players who suck at Match
	SH_PITY,
	// The fireflower is special, it combines with other shields.
	SH_FIREFLOWER = 0x100,
	// The force shield uses the lower 8 bits to count how many hits are left.
	SH_FORCE = 0x200,

	SH_STACK = SH_FIREFLOWER,
	SH_NOSTACK = ~SH_STACK
} shieldtype_t;

// Player powers. (don't edit this comment)
typedef enum
{
	pw_invulnerability,
	pw_sneakers,
	pw_flashing,
	pw_shield,
	pw_tailsfly, // tails flying
	pw_underwater, // underwater timer
	pw_spacetime, // In space, no one can hear you spin!
	pw_extralife, // Extra Life timer

	pw_super, // Are you super?
	pw_gravityboots, // gravity boots

	// Weapon ammunition
	pw_infinityring,
	pw_automaticring,
	pw_bouncering,
	pw_scatterring,
	pw_grenadering,
	pw_explosionring,
	pw_railring,

	// Power Stones
	pw_emeralds, // stored like global 'emeralds' variable

	// NiGHTS powerups
	pw_nights_superloop,
	pw_nights_helper,
	pw_nights_linkfreeze,

	//for linedef exec 427
	pw_nocontrol,
	pw_ingoop, // In goop

	NUMPOWERS
} powertype_t;

Sal's avatar
Sal committed
typedef enum
{
	KITEM_SAD = -1,
	KITEM_NONE = 0,
	KITEM_SNEAKER,
	KITEM_ROCKETSNEAKER,
	KITEM_INVINCIBILITY,
	KITEM_BANANA,
Sal's avatar
Sal committed
	KITEM_EGGMAN,
Sal's avatar
Sal committed
	KITEM_ORBINAUT,
	KITEM_JAWZ,
	KITEM_MINE,
	KITEM_BALLHOG,
	KITEM_SPB,
	KITEM_GROW,
	KITEM_SHRINK,
Sal's avatar
Sal committed
	KITEM_THUNDERSHIELD,
Sal's avatar
Sal committed
	KITEM_HYUDORO,
	KITEM_POGOSPRING,
	KITEM_KITCHENSINK,

	NUMKARTITEMS,

	// Additional roulette numbers, only used for K_KartGetItemResult
	KRITEM_TRIPLESNEAKER = NUMKARTITEMS,
	KRITEM_TRIPLEBANANA,
	KRITEM_TENFOLDBANANA,
Sal's avatar
Sal committed
	KRITEM_TRIPLEORBINAUT,
Sal's avatar
Sal committed
	KRITEM_QUADORBINAUT,
Sal's avatar
Sal committed
	KRITEM_DUALJAWZ,

	NUMKARTRESULTS
} kartitems_t;

ZTsukei's avatar
ZTsukei committed
//{ SRB2kart - kartstuff
typedef enum
{
	// Basic gameplay things
	k_position,			// Used for Kart positions, mostly for deterministic stuff
	k_oldposition,		// Used for taunting when you pass someone
	k_positiondelay,	// Used for position number, so it can grow when passing/being passed
ZTsukei's avatar
ZTsukei committed
	k_prevcheck,		// Previous checkpoint distance; for p_user.c (was "pw_pcd")
	k_nextcheck,		// Next checkpoint distance; for p_user.c (was "pw_ncd")
	k_waypoint,			// Waypoints.
	k_starpostwp,		// Temporarily stores player waypoint for... some reason. Used when respawning and finishing.
	k_starpostflip,		// the last starpost we hit requires flipping?
	k_respawn,			// Timer for the DEZ laser respawn effect
Sal's avatar
Sal committed
	k_dropdash,			// Charge up for respawn Drop Dash
ZTsukei's avatar
ZTsukei committed
	k_throwdir, 		// Held dir of controls; 1 = forward, 0 = none, -1 = backward (was "player->heldDir")
Sal's avatar
Sal committed
	k_lapanimation,		// Used to show the lap start wing logo animation
Sal's avatar
Sal committed
	k_laphand,			// Lap hand gfx to use; 0 = none, 1 = :ok_hand:, 2 = :thumbs_up:, 3 = :thumps_down:
Sal's avatar
Sal committed
	k_cardanimation,	// Used to determine the position of some full-screen Battle Mode graphics
Sryder's avatar
Sryder committed
	k_voices,			// Used to stop the player saying more voices than it should
	k_tauntvoices,		// Used to specifically stop taunt voice spam
Sal's avatar
Sal committed
	k_instashield,		// Instashield no-damage animation timer
Sal's avatar
Sal committed
	k_enginesnd,		// Engine sound number you're on.
Sal's avatar
Sal committed
	k_floorboost,		// Prevents Sneaker sounds for a breif duration when triggered by a floor panel
ZTsukei's avatar
ZTsukei committed
	k_spinouttype,		// Determines whether to thrust forward or not while spinning out; 0 = move forwards, 1 = stay still
ZTsukei's avatar
ZTsukei committed
	k_drift,			// Drifting Left or Right, plus a bigger counter = sharper turn
	k_driftend,			// Drift has ended, used to adjust character angle after drift
ZTsukei's avatar
ZTsukei committed
	k_driftcharge,		// Charge your drift so you can release a burst of speed
	k_driftboost,		// Boost you get from drifting
Sal's avatar
Sal committed
	k_boostcharge,		// Charge-up for boosting at the start of the race
	k_startboost,		// Boost you get from start of race or respawn drop dash
ZTsukei's avatar
ZTsukei committed
	k_jmp,				// In Mario Kart, letting go of the jump button stops the drift
	k_offroad,			// In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed
	k_pogospring,		// Pogo spring bounce effect
Sal's avatar
Sal committed
	k_brakestop,		// Wait until you've made a complete stop for a few tics before letting brake go in reverse.
Sal's avatar
Sal committed
	k_waterskip,		// Water skipping counter
Sal's avatar
Sal committed
	k_dashpadcooldown,	// Separate the vanilla SA-style dash pads from using pw_flashing
Sal's avatar
Sal committed
	k_boostpower,		// Base boost value, for offroad
Sal's avatar
Sal committed
	k_speedboost,		// Boost value smoothing for max speed
	k_accelboost,		// Boost value smoothing for acceleration
	k_boostangle,		// angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted.
Sal's avatar
Sal committed
	k_boostcam,			// Camera push forward on boost
	k_destboostcam,		// Ditto
Sal's avatar
Sal committed
	k_timeovercam,		// Camera timer for leaving behind or not
	k_aizdriftstrat,	// Let go of your drift while boosting? Helper for the SICK STRATZ you have just unlocked
Sal's avatar
Sal committed
	k_brakedrift,		// Helper for brake-drift spark spawning
ZTsukei's avatar
ZTsukei committed
	k_itemroulette,		// Used for the roulette when deciding what item to give you (was "pw_kartitem")
Sal's avatar
Sal committed
	k_roulettetype,		// Used for the roulette, for deciding type (currently only used for Battle, to give you better items from Karma items)

	// Item held stuff
	k_itemtype,		// KITEM_ constant for item number
	k_itemamount,	// Amount of said item
Sal's avatar
Sal committed
	k_itemheld,		// Are you holding an item?
ZTsukei's avatar
ZTsukei committed

	// Some items use timers for their duration or effects
Sal's avatar
Sal committed
	//k_thunderanim,			// Duration of Thunder Shield's use animation
	k_curshield,			// 0 = no shield, 1 = thunder shield
Sal's avatar
Sal committed
	k_hyudorotimer,			// Duration of the Hyudoro offroad effect itself
	k_stealingtimer,		// You are stealing an item, this is your timer
	k_stolentimer,			// You are being stolen from, this is your timer
	k_sneakertimer,			// Duration of the Sneaker Boost itself
	k_growshrinktimer,		// > 0 = Big, < 0 = small
	k_squishedtimer,		// Squished frame timer
	k_rocketsneakertimer,	// Rocket Sneaker duration timer
	k_invincibilitytimer,	// Invincibility timer
	k_eggmanheld,			// Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items
SeventhSentinel's avatar
SeventhSentinel committed
	k_eggmanexplode,		// Fake item recieved, explode in a few seconds
SeventhSentinel's avatar
SeventhSentinel committed
	k_eggmanblame,			// Fake item recieved, who set this fake
Sal's avatar
Sal committed
	k_lastjawztarget,		// Last person you target with jawz, for playing the target switch sfx
Sal's avatar
Sal committed
	k_bananadrag,			// After a second of holding a banana behind you, you start to slow down
Sal's avatar
Sal committed
	k_spinouttimer,			// Spin-out from a banana peel or oil slick (was "pw_bananacam")
Sal's avatar
Sal committed
	k_wipeoutslow,			// Timer before you slowdown when getting wiped out
Sal's avatar
Sal committed
	k_justbumped,			// Prevent players from endlessly bumping into each other
	k_comebacktimer,		// Battle mode, how long before you become a bomb after death
	k_sadtimer,				// How long you've been sad
Sal's avatar
Sal committed
	// Battle Mode vars
	k_bumper,			// Number of bumpers left
	k_comebackpoints,	// Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a bumper
Sal's avatar
Sal committed
	k_comebackmode, 	// 0 = bomb, 1 = item
Sal's avatar
Sal committed
	k_wanted, 			// Timer for determining WANTED status, lowers when hitting people, prevents the game turning into Camp Lazlo
Sal's avatar
Sal committed
	k_yougotem, 		// "You Got Em" gfx when hitting someone as a karma player via a method that gets you back in the game instantly
Sal's avatar
Sal committed
	k_itemblink,		// Item flashing after roulette, prevents Hyudoro stealing AND serves as a mashing indicator
	k_itemblinkmode,	// Type of flashing: 0 = white (normal), 1 = red (mashing), 2 = rainbow (enhanced items)
	k_getsparks,		// Disable drift sparks at low speed, JUST enough to give acceleration the actual headstart above speed
	k_jawztargetdelay,	// Delay for Jawz target switching, to make it less twitchy
	k_spectatewait,		// How long have you been waiting as a spectator
Sal's avatar
Sal committed
	k_growcancel,		// Hold the item button down to cancel Grow
Sal's avatar
Sal committed

ZTsukei's avatar
ZTsukei committed
	NUMKARTSTUFF
} kartstufftype_t;
//}

Alam Ed Arias's avatar
Alam Ed Arias committed
#define WEP_AUTO    1
#define WEP_BOUNCE  2
#define WEP_SCATTER 3
#define WEP_GRENADE 4
#define WEP_EXPLODE 5
#define WEP_RAIL    6
#define NUM_WEAPONS 7

typedef enum
{
	RW_AUTO    =  1,
	RW_BOUNCE  =  2,
	RW_SCATTER =  4,
	RW_GRENADE =  8,
	RW_EXPLODE = 16,
	RW_RAIL    = 32
} ringweapons_t;

// ========================================================================
//                          PLAYER STRUCTURE
// ========================================================================
typedef struct player_s
{
	mobj_t *mo;

	// Caveat: ticcmd_t is ATTRPACK! Be careful what precedes it.
	ticcmd_t cmd;

	playerstate_t playerstate;

	// Determine POV, including viewpoint bobbing during movement.
	// Focal origin above r.z
	fixed_t viewz;
	// Base height above floor for viewz.
	fixed_t viewheight;
	// Bob/squat speed.
Sal's avatar
Sal committed
	//fixed_t deltaviewheight;
Alam Ed Arias's avatar
Alam Ed Arias committed
	// bounded/scaled total momentum.
Sal's avatar
Sal committed
	//fixed_t bob;
Alam Ed Arias's avatar
Alam Ed Arias committed

	// Mouse aiming, where the guy is looking at!
	// It is updated with cmd->aiming.
	angle_t aiming;

	// This is only used between levels,
	// mo->health is used during levels.
Alam Ed Arias's avatar
Alam Ed Arias committed
	/// \todo Remove this.  We don't need a second health definition for players.
Alam Ed Arias's avatar
Alam Ed Arias committed
	INT32 health;

	SINT8 pity; // i pity the fool.
	INT32 currentweapon; // current weapon selected.
	INT32 ringweapons; // weapons currently obtained.

	// Power ups. invinc and invis are tic counters.
	UINT16 powers[NUMPOWERS];

ZTsukei's avatar
ZTsukei committed
	// SRB2kart stuff
	INT32 kartstuff[NUMKARTSTUFF];
	angle_t frameangle; // for the player add the ability to have the sprite only face other angles
Eidolon's avatar
Eidolon committed
	angle_t old_frameangle, old_frameangle2;
	INT16 lturn_max[MAXPREDICTTICS]; // What's the expected turn value for full-left for a number of frames back (to account for netgame latency)?
	INT16 rturn_max[MAXPREDICTTICS]; // Ditto but for full-right
Alam Ed Arias's avatar
Alam Ed Arias committed
	// Bit flags.
	// See pflags_t, above.
	pflags_t pflags;

	// playing animation.
	panim_t panim;

	// For screen flashing (bright).
	UINT16 flashcount;
	UINT16 flashpal;

	// Player skin colorshift, 0-15 for which color to draw player.
	UINT8 skincolor;

	INT32 skin;

	UINT32 score; // player score
	fixed_t dashspeed; // dashing speed
	INT32 dashtime; // tics dashing, used for rev sound

	// SRB2kart
	UINT8 kartspeed; // Kart speed stat between 1 and 9
	UINT8 kartweight; // Kart weight stat between 1 and 9
	//

Alam Ed Arias's avatar
Alam Ed Arias committed
	UINT32 charflags; // Extra abilities/settings for skins (combinable stuff)
	                 // See SF_ flags
Alam Ed Arias's avatar
Alam Ed Arias committed
	SINT8 lives;
	SINT8 continues; // continues that player has acquired
Alam Ed Arias's avatar
Alam Ed Arias committed

Alam Ed Arias's avatar
Alam Ed Arias committed
	SINT8 xtralife; // Ring Extra Life counter
Alam Ed Arias's avatar
Alam Ed Arias committed
	UINT8 gotcontinue; // Got continue from this stage?

	fixed_t speed; // Player's speed (distance formula of MOMX and MOMY values)
Alam Ed Arias's avatar
Alam Ed Arias committed
	UINT8 jumping; // Jump counter
Alam Ed Arias's avatar
Alam Ed Arias committed
	UINT8 secondjump;

	UINT8 fly1; // Tails flying
	UINT8 scoreadd; // Used for multiple enemy attack bonus
	tic_t glidetime; // Glide counter for thrust
	UINT8 climbing; // Climbing on the wall
	INT32 deadtimer; // End game if game over lasts too long
	tic_t exiting; // Exitlevel timer

	UINT8 homing; // Are you homing?

	tic_t skidtime; // Skid timer

	////////////////////////////
	// Conveyor Belt Movement //
	////////////////////////////
	fixed_t cmomx; // Conveyor momx
	fixed_t cmomy; // Conveyor momy
	fixed_t rmomx; // "Real" momx (momx - cmomx)
	fixed_t rmomy; // "Real" momy (momy - cmomy)

	/////////////////////
	// Race Mode Stuff //
	/////////////////////
Alam Ed Arias's avatar
Alam Ed Arias committed
	INT16 numboxes; // Number of item boxes obtained for Race Mode
	INT16 totalring; // Total number of rings obtained for Race Mode
Alam Ed Arias's avatar
Alam Ed Arias committed
	tic_t realtime; // integer replacement for leveltime
Alam Ed Arias's avatar
Alam Ed Arias committed
	UINT8 laps; // Number of laps (optional)
Alam Ed Arias's avatar
Alam Ed Arias committed

	////////////////////
	// CTF Mode Stuff //
	////////////////////
	INT32 ctfteam; // 0 == Spectator, 1 == Red, 2 == Blue
	UINT16 gotflag; // 1 == Red, 2 == Blue Do you have the flag?

	INT32 weapondelay; // Delay (if any) to fire the weapon again
	INT32 tossdelay;   // Delay (if any) to toss a flag/emeralds again

	// Starpost information
	INT16 starpostx;
	INT16 starposty;
	INT16 starpostz;
	INT32 starpostnum; // The number of the last starpost you hit
	tic_t starposttime; // Your time when you hit the starpost
	angle_t starpostangle; // Angle that the starpost is facing - you respawn facing this way

	/////////////////
	// NiGHTS Stuff//
	/////////////////
	angle_t angle_pos;
	angle_t old_angle_pos;

	mobj_t *axis1;
	mobj_t *axis2;
	tic_t bumpertime; // Currently being bounced by MT_NIGHTSBUMPER
	INT32 flyangle;
	tic_t drilltimer;
	INT32 linkcount;
	tic_t linktimer;
	INT32 anotherflyangle;
	tic_t nightstime; // How long you can fly as NiGHTS.
	INT32 drillmeter;
	UINT8 drilldelay;
	boolean bonustime; // Capsule destroyed, now it's bonus time!
	mobj_t *capsule; // Go inside the capsule
	UINT8 mare; // Current mare

	// Statistical purposes.
	tic_t marebegunat; // Leveltime when mare begun
	tic_t startedtime; // Time which you started this mare with.
	tic_t finishedtime; // Time it took you to finish the mare (used for display)
	INT16 finishedrings; // The rings you had left upon finishing the mare
	UINT32 marescore; // SRB2Kart: Battle score
Alam Ed Arias's avatar
Alam Ed Arias committed
	UINT32 lastmarescore; // score for the last mare
	UINT8 lastmare; // previous mare
	INT32 maxlink; // maximum link obtained
	UINT8 texttimer; // nights_texttime should not be local
	UINT8 textvar; // which line of NiGHTS text to show -- let's not use cheap hacks

	INT16 lastsidehit, lastlinehit;

	tic_t losstime;
	UINT8 timeshit; // That's TIMES HIT, not TIME SHIT, you doofus!

	INT32 onconveyor; // You are on a conveyor belt if nonzero

	mobj_t *awayviewmobj;
	INT32 awayviewtics;
Alam Ed Arias's avatar
Alam Ed Arias committed
	angle_t awayviewaiming; // Used for cut-away view
Alam Ed Arias's avatar
Alam Ed Arias committed

	boolean spectator;
	UINT8 bot;

	tic_t jointime; // Timer when player joins game to change skin/color
Sal's avatar
Sal committed
	tic_t spectatorreentry;
Sal's avatar
Sal committed
	tic_t grieftime;
	UINT8 griefstrikes;

	UINT8 splitscreenindex;
Alam Ed Arias's avatar
Alam Ed Arias committed
#ifdef HWRENDER
	fixed_t fovadd; // adjust FOV for hw rendering
#endif
} player_t;

#endif