/*
Copyright (C) 1994-1995  Apogee Software, Ltd.
Copyright (C) 2002-2015  icculus.org, GNU/Linux port
Copyright (C) 2017-2018  Steven LeVesque

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/
/**********************************************************************
   module: RT_BATTL.H

   author: James R. Dose
   phone:  (214)-271-1365 Ext #221
   date:   September 8, 1994

   Public header for RT_BATTL.C

   (c) Copyright 1994 Apogee Software.  All Rights Reserved.
**********************************************************************/

#ifndef __RT_BATTLE_public
#define __RT_BATTLE_public


#define BIT_MASK( bit_number )   ( 1 << ( bit_number ) )
#define MINUTES_TO_GAMECOUNT( minutes ) \
   ( ( minutes ) * 60 * VBLCOUNTER )

//
// Return codes
//

typedef enum
{
    battle_no_event,
    battle_end_game,
    battle_end_round,
    battle_out_of_time
} battle_status;

//
// Types of battle events
//

typedef enum
{
    battle_refresh,
    battle_player_killed,
    battle_player_tagged,
    battle_kill_with_missile,
    battle_kill_with_bullet,
    battle_kill_with_missile_in_air,
    battle_kill_with_bullet_in_air,
    battle_kill_by_crushing,
    battle_get_collector_item,
    battle_caught_eluder,
    battle_shot_deluder,
    battle_captured_triad
} battle_event;

//
// Battle modes
//

enum
{
    battle_StandAloneGame,
    battle_Normal,
    battle_ScoreMore,
    battle_Collector,
    battle_Scavenger,
    battle_Hunter,
    battle_Tag,
    battle_Eluder,
    battle_Deluder,
    battle_CaptureTheTriad,
    battle_NumBattleModes
};

//
// Battle mode option : Gravity
//

//enum
//   {
//   bo_low_gravity,
//   bo_normal_gravity,
//   bo_high_gravity
//   };

//
// Battle mode option : Speed
//

enum
{
    bo_normal_speed,
    bo_fast_speed
};

//
// Battle mode option : Ammo
//

enum
{
    bo_one_shot,
    bo_normal_shots,
    bo_infinite_shots
};

//
// Battle mode option : Hit points
//

#define bo_character_hitpoints 0
#define bo_default_hitpoints   250

//
// Battle mode option : Light levels
//

enum
{
    bo_light_dark,
    bo_light_normal,
    bo_light_bright,
    bo_light_fog,
    bo_light_periodic,
    bo_light_lightning
};

//
// Battle mode option : Number of kills
//

enum
{
    bo_kills_random   = -2,
    bo_kills_blind    = -1,
    bo_kills_infinite = 0,
    bo_kills_default  = 21
};

//
// Battle mode option : Environment danger damage
//

enum
{
    bo_danger_normal = -1,
    bo_danger_low    = 1,
    bo_danger_kill   = 30000
};

//
// Battle mode option : Time limit
//
#define bo_time_infinite 0

//
// Battle mode configuration
//
typedef struct
{
    unsigned Gravity;
    unsigned Speed;
    unsigned Ammo;
    unsigned HitPoints;
    unsigned SpawnDangers;
    unsigned SpawnHealth;
    unsigned SpawnWeapons;
    unsigned SpawnMines;
    unsigned RespawnItems;
    unsigned WeaponPersistence;
    unsigned RandomWeapons;
    unsigned FriendlyFire;
    unsigned LightLevel;
    int      Kills;
    int      DangerDamage;
    unsigned TimeLimit;
    unsigned RespawnTime;
} battle_type;

#define bo_normal_respawn_time 30

extern boolean  BATTLEMODE;
extern short    WhoKilledWho[ MAXPLAYERS ][ MAXPLAYERS ];
extern short    BATTLE_Points[ MAXPLAYERS ];
extern short    BATTLE_PlayerOrder[ MAXPLAYERS ];
extern int      BATTLE_NumCollectorItems;
extern int      PointGoal;
extern int      DisplayPoints;
extern int      BATTLE_It;
extern boolean  BATTLE_ShowKillCount;
extern short    BATTLE_Team[ MAXPLAYERS ];
extern short    BATTLE_TeamLeader[ MAXPLAYERS ];
extern int      BATTLE_NumberOfTeams;
extern boolean  UpdateKills;

// Located in RT_MENU.C
extern battle_type    BATTLE_Options[ battle_NumBattleModes ];

void          BATTLE_Init( int battlemode, int numplayers );
void          BATTLE_GetSpecials( void );
void          BATTLE_SetOptions( battle_type *options );
void          BATTLE_GetOptions( battle_type *options );
battle_status BATTLE_CheckGameStatus( battle_event reason, int player );
void          BATTLE_SortPlayerRanks( void );
battle_status BATTLE_PlayerKilledPlayer( battle_event reason, int killer, int victim );
void          BATTLE_Shutdown( void );

#endif
