2020-07-04 19:36:27 +00:00
//-------------------------------------------------------------------------
/*
Copyright ( C ) 1996 , 2003 - 3 D Realms Entertainment
2020-07-04 19:50:16 +00:00
Copyright 2020 Christoph Oelckers
2020-07-04 19:36:27 +00:00
This file is part of Duke Nukem 3 D version 1.5 - Atomic Edition
Duke Nukem 3 D 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 .
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 . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
Original Source : 1996 - Todd Replogle
Prepared for public release : 03 / 21 / 2003 - Charlie Wiederhold , 3 D Realms
Modifications for JonoF ' s port by Jonathon Fowler ( jf @ jonof . id . au )
*/
//-------------------------------------------------------------------------
# include "ns.h"
# include "duke3d.h"
# include "sbar.h"
# include "mapinfo.h"
# include "cheathandler.h"
2020-07-14 12:00:27 +00:00
# include "c_dispatch.h"
2020-08-29 15:49:15 +00:00
# include "gamestate.h"
2020-10-21 17:14:41 +00:00
# include "dukeactor.h"
2020-07-04 19:36:27 +00:00
BEGIN_DUKE_NS
2020-07-15 10:34:42 +00:00
int getlabelvalue ( const char * text ) ;
2020-07-04 19:36:27 +00:00
static int ccmd_spawn ( CCmdFuncPtr parm )
{
2020-07-20 21:21:27 +00:00
int x = 0 , y = 0 , z = 0 ;
unsigned int cstat = 0 , picnum = 0 ;
unsigned int pal = 0 ;
int ang = 0 ;
int set = 0 , idx ;
2020-09-03 21:10:28 +00:00
#if 0 // fixme - route through the network and this limitation becomes irrelevant
if ( netgame | | numplayers > 1 | | ! ( ps [ myconnectindex ] . gm & MODE_GAME ) ) {
2020-07-20 21:21:27 +00:00
Printf ( " spawn: Can't spawn sprites in multiplayer games or demos \n " ) ;
return CCMD_OK ;
}
2020-09-03 21:10:28 +00:00
# endif
2020-07-20 21:21:27 +00:00
switch ( parm - > numparms ) {
case 7 : // x,y,z
x = atol ( parm - > parms [ 4 ] ) ;
y = atol ( parm - > parms [ 5 ] ) ;
z = atol ( parm - > parms [ 6 ] ) ;
set | = 8 ;
case 4 : // ang
ang = atol ( parm - > parms [ 3 ] ) & 2047 ; set | = 4 ;
case 3 : // cstat
cstat = ( unsigned short ) atol ( parm - > parms [ 2 ] ) ; set | = 2 ;
case 2 : // pal
pal = ( unsigned char ) atol ( parm - > parms [ 1 ] ) ; set | = 1 ;
case 1 : // tile number
if ( isdigit ( parm - > parms [ 0 ] [ 0 ] ) ) {
picnum = ( unsigned short ) atol ( parm - > parms [ 0 ] ) ;
}
else {
picnum = getlabelvalue ( parm - > parms [ 0 ] ) ;
if ( picnum < 0 ) {
Printf ( " spawn: Invalid tile label given \n " ) ;
return CCMD_OK ;
}
}
if ( picnum > = MAXTILES ) {
Printf ( " spawn: Invalid tile number \n " ) ;
return CCMD_OK ;
}
break ;
default :
return CCMD_SHOWHELP ;
}
idx = fi . spawn ( ps [ myconnectindex ] . i , ( short ) picnum ) ;
if ( set & 1 ) sprite [ idx ] . pal = ( char ) pal ;
if ( set & 2 ) sprite [ idx ] . cstat = ( short ) cstat ;
if ( set & 4 ) sprite [ idx ] . ang = ang ;
if ( set & 8 ) {
if ( setsprite ( idx , x , y , z ) < 0 ) {
Printf ( " spawn: Sprite can't be spawned into null space \n " ) ;
deletesprite ( idx ) ;
}
}
return CCMD_OK ;
2020-07-04 19:36:27 +00:00
}
2020-08-04 08:03:47 +00:00
static int osdcmd_warptocoords ( CCmdFuncPtr parm )
{
2020-08-04 12:33:17 +00:00
if ( parm - > numparms < 3 | | parm - > numparms > 5 )
2020-08-04 08:03:47 +00:00
return CCMD_SHOWHELP ;
player_struct * p = & ps [ myconnectindex ] ;
2020-08-04 12:33:17 +00:00
p - > oposx = p - > posx = atoi ( parm - > parms [ 0 ] ) ;
p - > oposy = p - > posy = atoi ( parm - > parms [ 1 ] ) ;
p - > oposz = p - > posz = atoi ( parm - > parms [ 2 ] ) ;
2020-08-04 13:13:22 +00:00
if ( parm - > numparms > = 4 )
2020-08-04 12:33:17 +00:00
{
2020-10-07 12:13:21 +00:00
p - > angle . oang = p - > angle . ang = buildang ( atoi ( parm - > parms [ 3 ] ) ) ;
2020-08-04 12:33:17 +00:00
}
if ( parm - > numparms = = 5 )
{
2020-10-07 06:12:37 +00:00
p - > horizon . ohoriz = p - > horizon . horiz = buildhoriz ( atoi ( parm - > parms [ 4 ] ) ) ;
2020-08-04 12:33:17 +00:00
}
2020-08-04 08:03:47 +00:00
return CCMD_OK ;
}
2020-08-29 15:49:15 +00:00
static int osdcmd_third_person_view ( CCmdFuncPtr parm )
{
2020-10-12 17:48:47 +00:00
if ( gamestate ! = GS_LEVEL ) return CCMD_OK ;
2020-08-29 15:49:15 +00:00
if ( ! isRRRA ( ) | | ( ! ps [ myconnectindex ] . OnMotorcycle & & ! ps [ myconnectindex ] . OnBoat ) )
{
if ( ps [ myconnectindex ] . over_shoulder_on )
ps [ myconnectindex ] . over_shoulder_on = 0 ;
else
{
ps [ myconnectindex ] . over_shoulder_on = 1 ;
cameradist = 0 ;
2020-08-31 17:27:22 +00:00
cameraclock = INT_MIN ;
2020-08-29 15:49:15 +00:00
}
FTA ( QUOTE_VIEW_MODE_OFF + ps [ myconnectindex ] . over_shoulder_on , & ps [ myconnectindex ] ) ;
}
return CCMD_OK ;
}
static int osdcmd_coop_view ( CCmdFuncPtr parm )
{
2020-10-12 17:48:47 +00:00
if ( gamestate ! = GS_LEVEL ) return CCMD_OK ;
2020-08-29 15:49:15 +00:00
if ( ud . coop | | ud . recstat = = 2 )
{
screenpeek = connectpoint2 [ screenpeek ] ;
if ( screenpeek = = - 1 ) screenpeek = 0 ;
}
return CCMD_OK ;
}
static int osdcmd_show_weapon ( CCmdFuncPtr parm )
{
2020-10-12 17:48:47 +00:00
if ( gamestate ! = GS_LEVEL ) return CCMD_OK ;
2020-08-29 15:49:15 +00:00
if ( ud . multimode > 1 )
{
ud . showweapons = 1 - ud . showweapons ;
cl_showweapon = ud . showweapons ;
FTA ( QUOTE_WEAPON_MODE_OFF - ud . showweapons , & ps [ screenpeek ] ) ;
}
return CCMD_OK ;
}
2020-07-04 19:36:27 +00:00
int registerosdcommands ( void )
{
2020-07-20 21:21:27 +00:00
C_RegisterFunction ( " spawn " , " spawn <picnum> [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties " , ccmd_spawn ) ;
2020-08-04 12:33:17 +00:00
C_RegisterFunction ( " warptocoords " , " warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates " , osdcmd_warptocoords ) ;
2020-08-29 15:49:15 +00:00
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_show_weapon ) ;
2020-08-04 08:03:47 +00:00
2020-07-20 21:21:27 +00:00
return 0 ;
2020-07-04 19:36:27 +00:00
}
END_DUKE_NS