//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2005-2014 Simon Howard
//
// 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.  See the
// GNU General Public License for more details.
//
// DESCRIPTION:
//   Duh.
// 


#ifndef __G_GAME__
#define __G_GAME__

#include "doomdef.h"
#include "d_event.h"
#include "d_ticcmd.h"
#include "m_fixed.h"


//
// GAME
//
void G_DeathMatchSpawnPlayer (int playernum);

void G_InitNew (skill_t skill, int episode, int map);

// Can be called by the startup code or M_Responder.
// A normal game starts at map 1,
// but a warp test can start elsewhere
void G_DeferedInitNew (skill_t skill, int episode, int map);

// Like G_DeferedInitNew, but starts with nobody in-game yet (not even
// the local host) and sets lobby_active - see m_menu.c's "Multiplayer"
// options item. The host is added automatically once the level loads
// (see G_DoNewGame); anyone else (phones, via the QR the lobby shows -
// see d_main.c) can join before the host presses Enter to start.
void G_DeferedInitLobby (skill_t skill, int episode, int map);

// True from G_DeferedInitLobby's game finishing loading until the host
// presses Enter - see d_main.c, which shows the lobby screen (QR code,
// joined-player list) and suppresses normal rendering for as long as
// this is true, and G_Responder, which watches for the Enter press.
extern boolean lobby_active;

void G_DeferedPlayDemo (const char* demo);

// Can be called by the startup code or M_Responder,
// calls P_SetupLevel or W_EnterWorld.
void G_LoadGame (char* name);

void G_DoLoadGame (void);

// Called by M_Responder.
void G_SaveGame (int slot, char* description);

// Only called by startup code.
void G_RecordDemo (const char* name);

void G_BeginRecording (void);

void G_PlayDemo (char* name);
void G_TimeDemo (char* name);
boolean G_CheckDemoStatus (void);

void G_ExitLevel (void);
void G_SecretExitLevel (void);

void G_WorldDone (void);

// Read current data from inputs and build a player movement command.
// localslot selects which local player's input devices/keybinds to read
// (0 for the primary keyboard+mouse player; see g_game.c for the
// splitscreen keyboard-zone/joystick-slot assignment).

void G_BuildTiccmd (ticcmd_t *cmd, int maketic, int localslot);

// Brings local splitscreen player playernum into the running game on
// the fly (see g_game.c). Returns false if it couldn't (already in-game,
// no level running, or no start position to fall back to).
boolean G_AddLocalPlayer (int playernum);

// The mirror of G_AddLocalPlayer: takes playernum back out of the
// running game. Returns false if they weren't in-game.
boolean G_RemoveLocalPlayer (int playernum);

// G_AddLocalPlayer/G_RemoveLocalPlayer for whichever slot is next to
// join/last to leave, without the caller needing to know slot
// numbering - used by the debug KEY_JOIN_PLAYER/KEY_LEAVE_PLAYER
// hotkeys (G_Responder), and G_AddNextLocalPlayer also brings the host
// into a freshly-started lobby (see G_DoNewGame). Same return value
// meaning as the functions they wrap.
boolean G_AddNextLocalPlayer (void);
boolean G_RemoveLastLocalPlayer (void);

// Remote (e.g. phone) input for one local player slot: a held-button
// bitmask (feeds the same gamekeydown[] state a local splitscreen
// keyboard zone would - see GetLocalKeybinds in g_game.c) plus a
// separate analog turn axis. Any slot other than 0 can be driven this
// way regardless of what, if anything, physically joins it. See
// i_webinput.c for the network side.
#define REMOTE_BIT_FORWARD     0x001
#define REMOTE_BIT_BACK        0x002
#define REMOTE_BIT_STRAFELEFT  0x010
#define REMOTE_BIT_STRAFERIGHT 0x020
#define REMOTE_BIT_FIRE        0x040
#define REMOTE_BIT_USE         0x080
#define REMOTE_BIT_SPEED       0x100

// turn_axis is -127..127 (a phone's turn-stick deflection, left to
// right) rather than a bit, so turning gets the same cubic response
// curve/acceleration feel as a real analog joystick (see G_BuildTiccmd's
// "use_analog && jx" branch) instead of the on/off snap a button would
// give it - see G_SetRemoteInputState's comment for how this reaches
// that code path.
void G_SetRemoteInputState (int localslot, unsigned int bits, int turn_axis);

void G_Ticker (void);
boolean G_Responder (event_t*	ev);

void G_ScreenShot (void);

void G_DrawMouseSpeedBox(void);
int G_VanillaVersionCode(void);

extern int vanilla_savegame_limit;
extern int vanilla_demo_limit;

extern fixed_t forwardmove[2];
extern fixed_t sidemove[2];

extern boolean sendpause;


#endif

