// Emacs style mode select   -*- C++ -*- 
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// DESCRIPTION:
//
//
//-----------------------------------------------------------------------------


#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 "d_items.h"
#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"

#ifdef __GNUG__
#pragma interface
#endif

#ifdef __SASC
#pragma options align=mac68k
#endif

//
// 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, for cheats and debug.
//
typedef enum
{
    // No clipping, walk through barriers.
    CF_NOCLIP		= 1,
    // No damage, no health loss.
    CF_GODMODE		= 2,
    // Not really a cheat, just a debug aid.
    CF_NOMOMENTUM	= 4
}  cheat_t;

//
// Extended player object info: player_t
//
typedef struct player_s
{
    mobj_t  *		mo;
    playerstate_t	 playerstate;
    ticcmd_t		 cmd;

    // 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.
    fixed_t         	 deltaviewheight;
    // bounded/scaled total momentum.
    fixed_t         	 bob;	

    // This is only used between levels,
    // mo->health is used during levels.
    int			 health;	
    int			 armorpoints;
    // Armor type is 0-2.
    int			 armortype;	

    // Power ups. invinc and invis are tic counters.
    int			 powers[NUMPOWERS];
    boolean		 cards[NUMCARDS];
    boolean		 backpack;
    
    // Frags, kills of other players.
    int			 frags[MAXPLAYERS];
    weapontype_t	 readyweapon;
    
    // Is wp_nochange if not changing.
    weapontype_t	 pendingweapon;

    boolean		 weaponowned[NUMWEAPONS];
    int			 ammo[NUMAMMO];
    int			 maxammo[NUMAMMO];

    // True if button down last tic.
    int			 attackdown;
    int			 usedown;

    // Bit flags, for cheats and debug.
    // See cheat_t, above.
    int			 cheats;		

    // Refired shots are less accurate.
    int			 refire;		

     // For intermission stats.
    int			 killcount;
    int			 itemcount;
    int			 secretcount;

    // Hint messages.
    char  *		message;	
    
    // For screen flashing (red or bright).
    int			 damagecount;
    int			 bonuscount;

    // Who did damage (NULL for floors/ceilings).
    mobj_t  *		attacker;
    
    // So gun flashes light up areas.
    int			 extralight;

    // Current PLAYPAL, ???
    //  can be set to REDCOLORMAP for pain, etc.
    int			 fixedcolormap;

    // Player skin colorshift,
    //  0-3 for which color to draw player.
    int			 colormap;	

    // Overlay view sprites (gun, etc).
    pspdef_t		 psprites[NUMPSPRITES];

    // True if secret level has been done.
    boolean		 didsecret;	

}  player_t;

//
// INTERMISSION
// Structure passed e.g. to WI_Start(wb)
//
typedef struct
{
    boolean	 in;	// whether the player is in game
    
    // Player stats, kills, collected items etc.
    int		 skills;
    int		 sitems;
    int		 ssecret;
    int		 stime; 
    int		 frags[4];
    int		 score;	// current score on entry, modified on return
}  wbplayerstruct_t;

typedef struct
{
    int		 epsd;	// episode # (0-2)

    // if true, splash the secret level
    boolean	 didsecret;
    
    // previous and next levels, origin 0
    int		 last;
    int		 next;	
    
    int		 maxkills;
    int		 maxitems;
    int		 maxsecret;
    int		 maxfrags;

    // the par time
    int		 partime;
    
    // index of this player in game
    int		 pnum;	

    wbplayerstruct_t	 plyr[MAXPLAYERS];
}  wbstartstruct_t;

#ifdef __SASC
#pragma options align=power
#endif

#endif
//-----------------------------------------------------------------------------
//
// $Log:$
//
//-----------------------------------------------------------------------------
