//-------------------------------------------------------------------------
/*
Copyright (C) 2010 EDuke32 developers and contributors
Modified by Raze developers and contributors

This file was part of EDuke32.

EDuke32 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.

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.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
//-------------------------------------------------------------------------

#include "ns.h"	// Must come before everything else!

#include "ns.h"

#include "build.h"

#include "names2.h"
#include "panel.h"
#include "game.h"
#include "mytypes.h"

#include "gamecontrol.h"
#include "gstrings.h"

#include "v_text.h"
#include "printf.h"

#include "misc.h"
#include "menus.h"
#include "mapinfo.h"
#include "jsector.h"
#include "network.h"
#include "gamestate.h"
#include "player.h"

BEGIN_SW_NS

static int osdcmd_warptocoords(CCmdFuncPtr parm)
{
    if (parm->numparms < 3 || parm->numparms > 5)
        return CCMD_SHOWHELP;

    Player->oposx = Player->posx = atoi(parm->parms[0]);
    Player->oposy = Player->posy = atoi(parm->parms[1]);
    Player->oposz = Player->posz = atoi(parm->parms[2]);

    if (parm->numparms >= 4)
    {
		Player->oq16ang = Player->q16ang = IntToFixed(atoi(parm->parms[3]));
    }

    if (parm->numparms == 5)
    {
    	Player->oq16horiz = Player->q16horiz = IntToFixed(atoi(parm->parms[4]));
    }

    return CCMD_OK;
}

static int osdcmd_mirror(CCmdFuncPtr parm)
{
    char base[80];
    int16_t op1 = 0;

    if (parm->numparms < 1)
    {
        return CCMD_SHOWHELP;
    }

    if (op1 < 0 || op1 > 9)
    {
        Printf("Mirror number is out of range!");
        return CCMD_OK;
    }

    Printf("camera is the ST1 sprite used as the view spot");
    Printf("camspite is the SpriteNum of the drawtotile tile in editart");
    Printf("camspic is the tile number of the drawtotile in editart");
    Printf("iscamera is whether or not this mirror is a camera type");
    Printf(" ");
    Printf("mirror[%d].mirrorwall = %d", op1, mirror[op1].mirrorwall);
    Printf("mirror[%d].mirrorsector = %d", op1, mirror[op1].mirrorsector);
    Printf("mirror[%d].camera = %d", op1, mirror[op1].camera);
    Printf("mirror[%d].camsprite = %d", op1, mirror[op1].camsprite);
    Printf("mirror[%d].campic = %d", op1, mirror[op1].campic);
    Printf("mirror[%d].iscamera = %d", op1, mirror[op1].ismagic);
    return CCMD_OK;
}

static int osdcmd_third_person_view(CCmdFuncPtr parm)
{
    if (gamestate != GS_LEVEL || System_WantGuiCapture()) return CCMD_OK;
    auto pp = &Player[myconnectindex];
    if (inputState.ShiftPressed())
    {
        if (TEST(pp->Flags, PF_VIEW_FROM_OUTSIDE))
            pp->view_outside_dang = NORM_ANGLE(pp->view_outside_dang + 256);
    }
    else
    {
        if (TEST(pp->Flags, PF_VIEW_FROM_OUTSIDE))
        {
            RESET(pp->Flags, PF_VIEW_FROM_OUTSIDE);
        }
        else
        {
            SET(pp->Flags, PF_VIEW_FROM_OUTSIDE);
            pp->camera_dist = 0;
        }
    }
    return CCMD_OK;
}

static int osdcmd_coop_view(CCmdFuncPtr parm)
{
    if (gamestate != GS_LEVEL || System_WantGuiCapture()) return CCMD_OK;
    if (gNet.MultiGameType == MULTI_GAME_COOPERATIVE)
    {
        screenpeek = connectpoint2[screenpeek];

        if (screenpeek < 0)
            screenpeek = connecthead;

        if (screenpeek == myconnectindex)
        {
            // JBF: figure out what's going on here
            auto pp = &Player[myconnectindex];
            DoPlayerDivePalette(pp);  // Check Dive again
            DoPlayerNightVisionPalette(pp);  // Check Night Vision again
        }
        else
        {
            PLAYERp tp = Player + screenpeek;
            DoPlayerDivePalette(tp);
            DoPlayerNightVisionPalette(tp);
        }
    }
    return CCMD_OK;
}

static int osdcmd_noop(CCmdFuncPtr parm)
{
	// this is for silencing key bindings only.
	return CCMD_OK;
}

int32_t registerosdcommands(void)
{
    C_RegisterFunction("mirror_debug", "mirror [mirrornum]: print mirror debug info", osdcmd_mirror);
    C_RegisterFunction("warptocoords","warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates",osdcmd_warptocoords);
    C_RegisterFunction("third_person_view", "Switch to third person view", osdcmd_third_person_view);
    C_RegisterFunction("coop_view", "Switch player to view from in coop", osdcmd_coop_view);
	C_RegisterFunction("show_weapon", "Show opponents' weapons", osdcmd_noop);

    return 0;
}

END_SW_NS
