Itsa me, quake3io!
This commit is contained in:
parent
dbe4ddb103
commit
5b755058f5
1409 changed files with 798983 additions and 798983 deletions
280
code/game/Conscript
Normal file → Executable file
280
code/game/Conscript
Normal file → Executable file
|
@ -1,140 +1,140 @@
|
|||
# game building
|
||||
# builds the game for vanilla Q3 and TA
|
||||
|
||||
# there are slight differences between Q3 and TA build:
|
||||
# -DMISSIONPACK
|
||||
# the config is passed in the imported variable TARGET_DIR
|
||||
|
||||
# qvm building against native:
|
||||
# only native has g_syscalls.c
|
||||
# only qvm has ../game/bg_lib.c
|
||||
# qvm uses a custom g_syscalls.asm with equ stubs
|
||||
|
||||
Import qw( BASE_CFLAGS TARGET_DIR INSTALL_DIR NO_VM NO_SO CC CXX LINK );
|
||||
|
||||
$env = new cons(
|
||||
# the code has the very bad habit of doing things like #include "../ui/ui_shared.h"
|
||||
# this seems to confuse the dependency analysis, explicit toplevel includes seem to fix
|
||||
CPPPATH => '#cgame:#game:#q3_ui',
|
||||
CC => $CC,
|
||||
CXX => $CXX,
|
||||
LINK => $LINK,
|
||||
ENV => { PATH => $ENV{PATH}, HOME => $ENV{HOME} },
|
||||
CFLAGS => $BASE_CFLAGS . '-fPIC',
|
||||
LDFLAGS => '-shared -ldl -lm'
|
||||
);
|
||||
|
||||
# for TA, use -DMISSIONPACK
|
||||
%ta_env_hash = $env->copy(
|
||||
CPPPATH => '#cgame:#game:#ui'
|
||||
);
|
||||
$ta_env_hash{CFLAGS} = '-DMISSIONPACK ' . $ta_env_hash{CFLAGS};
|
||||
$ta_env = new cons(%ta_env_hash);
|
||||
|
||||
# qvm building
|
||||
# we heavily customize the cons environment
|
||||
$vm_env = new cons(
|
||||
# the code has the very bad habit of doing things like #include "../ui/ui_shared.h"
|
||||
# this seems to confuse the dependency analysis, explicit toplevel includes seem to fix
|
||||
CPPPATH => '#cgame:#game:#q3_ui',
|
||||
CC => 'q3lcc',
|
||||
CCCOM => '%CC %CFLAGS %_IFLAGS -c %< -o %>',
|
||||
SUFOBJ => '.asm',
|
||||
LINK => 'q3asm',
|
||||
CFLAGS => '-DQ3_VM -S -Wf-target=bytecode -Wf-g',
|
||||
# need to know where to find the compiler tools
|
||||
ENV => { PATH => $ENV{PATH} . ":./qvmtools", },
|
||||
);
|
||||
|
||||
# TA qvm building
|
||||
%vm_ta_env_hash = $vm_env->copy(
|
||||
CPPPATH => '#cgame:#game:#ui'
|
||||
);
|
||||
$vm_ta_env_hash{CFLAGS} = '-DMISSIONPACK ' . $vm_ta_env_hash{CFLAGS};
|
||||
$vm_ta_env = new cons(%vm_ta_env_hash);
|
||||
|
||||
# the file with vmMain function MUST be the first one of the list
|
||||
@FILES = qw(
|
||||
g_main.c
|
||||
ai_chat.c
|
||||
ai_cmd.c
|
||||
ai_dmnet.c
|
||||
ai_dmq3.c
|
||||
ai_main.c
|
||||
ai_team.c
|
||||
ai_vcmd.c
|
||||
bg_misc.c
|
||||
bg_pmove.c
|
||||
bg_slidemove.c
|
||||
g_active.c
|
||||
g_arenas.c
|
||||
g_bot.c
|
||||
g_client.c
|
||||
g_cmds.c
|
||||
g_combat.c
|
||||
g_items.c
|
||||
g_mem.c
|
||||
g_misc.c
|
||||
g_missile.c
|
||||
g_mover.c
|
||||
g_session.c
|
||||
g_spawn.c
|
||||
g_svcmds.c
|
||||
g_target.c
|
||||
g_team.c
|
||||
g_trigger.c
|
||||
g_utils.c
|
||||
g_weapon.c
|
||||
q_math.c
|
||||
q_shared.c
|
||||
);
|
||||
$FILESREF = \@FILES;
|
||||
|
||||
# only in .so
|
||||
# (VM uses a custom .asm with equ stubs)
|
||||
@SO_FILES = qw(
|
||||
g_syscalls.c
|
||||
);
|
||||
$SO_FILESREF = \@SO_FILES;
|
||||
|
||||
# only for VM
|
||||
@VM_FILES = qw(
|
||||
bg_lib.c
|
||||
g_syscalls.asm
|
||||
);
|
||||
$VM_FILESREF = \@VM_FILES;
|
||||
|
||||
# FIXME CPU string?
|
||||
# NOTE: $env $ta_env and $vm_env $vm_ta_env may not be necessary
|
||||
# we could alter the $env and $ta_env based on $TARGET_DIR
|
||||
# doing it this way to ensure homogeneity with cgame building
|
||||
if ($TARGET_DIR eq 'Q3')
|
||||
{
|
||||
if ($NO_SO eq 0)
|
||||
{
|
||||
Program $env 'qagamei386.so', @$FILESREF, @$SO_FILESREF;
|
||||
Install $env $INSTALL_DIR, 'qagamei386.so';
|
||||
}
|
||||
if ($NO_VM eq 0)
|
||||
{
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3lcc';
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3asm';
|
||||
Program $vm_env 'qagame.qvm', @$FILESREF, @$VM_FILESREF;
|
||||
Install $vm_env $INSTALL_DIR . '/vm', 'qagame.qvm';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($NO_SO eq 0)
|
||||
{
|
||||
Program $ta_env 'qagamei386.so', @$FILESREF, @$SO_FILESREF;
|
||||
Install $ta_env $INSTALL_DIR, 'qagamei386.so';
|
||||
}
|
||||
if ($NO_VM eq 0)
|
||||
{
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3lcc';
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3asm';
|
||||
Program $vm_ta_env 'qagame.qvm', @$FILESREF, @$VM_FILESREF;
|
||||
Install $vm_ta_env $INSTALL_DIR . '/vm', 'qagame.qvm';
|
||||
}
|
||||
}
|
||||
# game building
|
||||
# builds the game for vanilla Q3 and TA
|
||||
|
||||
# there are slight differences between Q3 and TA build:
|
||||
# -DMISSIONPACK
|
||||
# the config is passed in the imported variable TARGET_DIR
|
||||
|
||||
# qvm building against native:
|
||||
# only native has g_syscalls.c
|
||||
# only qvm has ../game/bg_lib.c
|
||||
# qvm uses a custom g_syscalls.asm with equ stubs
|
||||
|
||||
Import qw( BASE_CFLAGS TARGET_DIR INSTALL_DIR NO_VM NO_SO CC CXX LINK );
|
||||
|
||||
$env = new cons(
|
||||
# the code has the very bad habit of doing things like #include "../ui/ui_shared.h"
|
||||
# this seems to confuse the dependency analysis, explicit toplevel includes seem to fix
|
||||
CPPPATH => '#cgame:#game:#q3_ui',
|
||||
CC => $CC,
|
||||
CXX => $CXX,
|
||||
LINK => $LINK,
|
||||
ENV => { PATH => $ENV{PATH}, HOME => $ENV{HOME} },
|
||||
CFLAGS => $BASE_CFLAGS . '-fPIC',
|
||||
LDFLAGS => '-shared -ldl -lm'
|
||||
);
|
||||
|
||||
# for TA, use -DMISSIONPACK
|
||||
%ta_env_hash = $env->copy(
|
||||
CPPPATH => '#cgame:#game:#ui'
|
||||
);
|
||||
$ta_env_hash{CFLAGS} = '-DMISSIONPACK ' . $ta_env_hash{CFLAGS};
|
||||
$ta_env = new cons(%ta_env_hash);
|
||||
|
||||
# qvm building
|
||||
# we heavily customize the cons environment
|
||||
$vm_env = new cons(
|
||||
# the code has the very bad habit of doing things like #include "../ui/ui_shared.h"
|
||||
# this seems to confuse the dependency analysis, explicit toplevel includes seem to fix
|
||||
CPPPATH => '#cgame:#game:#q3_ui',
|
||||
CC => 'q3lcc',
|
||||
CCCOM => '%CC %CFLAGS %_IFLAGS -c %< -o %>',
|
||||
SUFOBJ => '.asm',
|
||||
LINK => 'q3asm',
|
||||
CFLAGS => '-DQ3_VM -S -Wf-target=bytecode -Wf-g',
|
||||
# need to know where to find the compiler tools
|
||||
ENV => { PATH => $ENV{PATH} . ":./qvmtools", },
|
||||
);
|
||||
|
||||
# TA qvm building
|
||||
%vm_ta_env_hash = $vm_env->copy(
|
||||
CPPPATH => '#cgame:#game:#ui'
|
||||
);
|
||||
$vm_ta_env_hash{CFLAGS} = '-DMISSIONPACK ' . $vm_ta_env_hash{CFLAGS};
|
||||
$vm_ta_env = new cons(%vm_ta_env_hash);
|
||||
|
||||
# the file with vmMain function MUST be the first one of the list
|
||||
@FILES = qw(
|
||||
g_main.c
|
||||
ai_chat.c
|
||||
ai_cmd.c
|
||||
ai_dmnet.c
|
||||
ai_dmq3.c
|
||||
ai_main.c
|
||||
ai_team.c
|
||||
ai_vcmd.c
|
||||
bg_misc.c
|
||||
bg_pmove.c
|
||||
bg_slidemove.c
|
||||
g_active.c
|
||||
g_arenas.c
|
||||
g_bot.c
|
||||
g_client.c
|
||||
g_cmds.c
|
||||
g_combat.c
|
||||
g_items.c
|
||||
g_mem.c
|
||||
g_misc.c
|
||||
g_missile.c
|
||||
g_mover.c
|
||||
g_session.c
|
||||
g_spawn.c
|
||||
g_svcmds.c
|
||||
g_target.c
|
||||
g_team.c
|
||||
g_trigger.c
|
||||
g_utils.c
|
||||
g_weapon.c
|
||||
q_math.c
|
||||
q_shared.c
|
||||
);
|
||||
$FILESREF = \@FILES;
|
||||
|
||||
# only in .so
|
||||
# (VM uses a custom .asm with equ stubs)
|
||||
@SO_FILES = qw(
|
||||
g_syscalls.c
|
||||
);
|
||||
$SO_FILESREF = \@SO_FILES;
|
||||
|
||||
# only for VM
|
||||
@VM_FILES = qw(
|
||||
bg_lib.c
|
||||
g_syscalls.asm
|
||||
);
|
||||
$VM_FILESREF = \@VM_FILES;
|
||||
|
||||
# FIXME CPU string?
|
||||
# NOTE: $env $ta_env and $vm_env $vm_ta_env may not be necessary
|
||||
# we could alter the $env and $ta_env based on $TARGET_DIR
|
||||
# doing it this way to ensure homogeneity with cgame building
|
||||
if ($TARGET_DIR eq 'Q3')
|
||||
{
|
||||
if ($NO_SO eq 0)
|
||||
{
|
||||
Program $env 'qagamei386.so', @$FILESREF, @$SO_FILESREF;
|
||||
Install $env $INSTALL_DIR, 'qagamei386.so';
|
||||
}
|
||||
if ($NO_VM eq 0)
|
||||
{
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3lcc';
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3asm';
|
||||
Program $vm_env 'qagame.qvm', @$FILESREF, @$VM_FILESREF;
|
||||
Install $vm_env $INSTALL_DIR . '/vm', 'qagame.qvm';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($NO_SO eq 0)
|
||||
{
|
||||
Program $ta_env 'qagamei386.so', @$FILESREF, @$SO_FILESREF;
|
||||
Install $ta_env $INSTALL_DIR, 'qagamei386.so';
|
||||
}
|
||||
if ($NO_VM eq 0)
|
||||
{
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3lcc';
|
||||
Depends $vm_env 'qagame.qvm', '#qvmtools/q3asm';
|
||||
Program $vm_ta_env 'qagame.qvm', @$FILESREF, @$VM_FILESREF;
|
||||
Install $vm_ta_env $INSTALL_DIR . '/vm', 'qagame.qvm';
|
||||
}
|
||||
}
|
||||
|
|
2452
code/game/ai_chat.c
Normal file → Executable file
2452
code/game/ai_chat.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
122
code/game/ai_chat.h
Normal file → Executable file
122
code/game/ai_chat.h
Normal file → Executable file
|
@ -1,61 +1,61 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_chat.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
int BotChat_EnterGame(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_ExitGame(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_StartLevel(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_EndLevel(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_HitTalking(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_HitNoDeath(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_HitNoKill(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_Death(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_Kill(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_EnemySuicide(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_Random(bot_state_t *bs);
|
||||
// time the selected chat takes to type in
|
||||
float BotChatTime(bot_state_t *bs);
|
||||
// returns true if the bot can chat at the current position
|
||||
int BotValidChatPosition(bot_state_t *bs);
|
||||
// test the initial bot chats
|
||||
void BotChatTest(bot_state_t *bs);
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_chat.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
int BotChat_EnterGame(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_ExitGame(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_StartLevel(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_EndLevel(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_HitTalking(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_HitNoDeath(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_HitNoKill(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_Death(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_Kill(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_EnemySuicide(bot_state_t *bs);
|
||||
//
|
||||
int BotChat_Random(bot_state_t *bs);
|
||||
// time the selected chat takes to type in
|
||||
float BotChatTime(bot_state_t *bs);
|
||||
// returns true if the bot can chat at the current position
|
||||
int BotValidChatPosition(bot_state_t *bs);
|
||||
// test the initial bot chats
|
||||
void BotChatTest(bot_state_t *bs);
|
||||
|
||||
|
|
3984
code/game/ai_cmd.c
Normal file → Executable file
3984
code/game/ai_cmd.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
74
code/game/ai_cmd.h
Normal file → Executable file
74
code/game/ai_cmd.h
Normal file → Executable file
|
@ -1,37 +1,37 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_cmd.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
extern int notleader[MAX_CLIENTS];
|
||||
|
||||
int BotMatchMessage(bot_state_t *bs, char *message);
|
||||
void BotPrintTeamGoal(bot_state_t *bs);
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_cmd.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
extern int notleader[MAX_CLIENTS];
|
||||
|
||||
int BotMatchMessage(bot_state_t *bs, char *message);
|
||||
void BotPrintTeamGoal(bot_state_t *bs);
|
||||
|
||||
|
|
5220
code/game/ai_dmnet.c
Normal file → Executable file
5220
code/game/ai_dmnet.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
122
code/game/ai_dmnet.h
Normal file → Executable file
122
code/game/ai_dmnet.h
Normal file → Executable file
|
@ -1,61 +1,61 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_dmnet.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_NODESWITCHES 50
|
||||
|
||||
void AIEnter_Intermission(bot_state_t *bs, char *s);
|
||||
void AIEnter_Observer(bot_state_t *bs, char *s);
|
||||
void AIEnter_Respawn(bot_state_t *bs, char *s);
|
||||
void AIEnter_Stand(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_ActivateEntity(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_NBG(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_LTG(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_Camp(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_Fight(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_Chase(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_Retreat(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_NBG(bot_state_t *bs, char *s);
|
||||
int AINode_Intermission(bot_state_t *bs);
|
||||
int AINode_Observer(bot_state_t *bs);
|
||||
int AINode_Respawn(bot_state_t *bs);
|
||||
int AINode_Stand(bot_state_t *bs);
|
||||
int AINode_Seek_ActivateEntity(bot_state_t *bs);
|
||||
int AINode_Seek_NBG(bot_state_t *bs);
|
||||
int AINode_Seek_LTG(bot_state_t *bs);
|
||||
int AINode_Battle_Fight(bot_state_t *bs);
|
||||
int AINode_Battle_Chase(bot_state_t *bs);
|
||||
int AINode_Battle_Retreat(bot_state_t *bs);
|
||||
int AINode_Battle_NBG(bot_state_t *bs);
|
||||
|
||||
void BotResetNodeSwitches(void);
|
||||
void BotDumpNodeSwitches(bot_state_t *bs);
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_dmnet.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_NODESWITCHES 50
|
||||
|
||||
void AIEnter_Intermission(bot_state_t *bs, char *s);
|
||||
void AIEnter_Observer(bot_state_t *bs, char *s);
|
||||
void AIEnter_Respawn(bot_state_t *bs, char *s);
|
||||
void AIEnter_Stand(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_ActivateEntity(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_NBG(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_LTG(bot_state_t *bs, char *s);
|
||||
void AIEnter_Seek_Camp(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_Fight(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_Chase(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_Retreat(bot_state_t *bs, char *s);
|
||||
void AIEnter_Battle_NBG(bot_state_t *bs, char *s);
|
||||
int AINode_Intermission(bot_state_t *bs);
|
||||
int AINode_Observer(bot_state_t *bs);
|
||||
int AINode_Respawn(bot_state_t *bs);
|
||||
int AINode_Stand(bot_state_t *bs);
|
||||
int AINode_Seek_ActivateEntity(bot_state_t *bs);
|
||||
int AINode_Seek_NBG(bot_state_t *bs);
|
||||
int AINode_Seek_LTG(bot_state_t *bs);
|
||||
int AINode_Battle_Fight(bot_state_t *bs);
|
||||
int AINode_Battle_Chase(bot_state_t *bs);
|
||||
int AINode_Battle_Retreat(bot_state_t *bs);
|
||||
int AINode_Battle_NBG(bot_state_t *bs);
|
||||
|
||||
void BotResetNodeSwitches(void);
|
||||
void BotDumpNodeSwitches(bot_state_t *bs);
|
||||
|
||||
|
|
10922
code/game/ai_dmq3.c
Normal file → Executable file
10922
code/game/ai_dmq3.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
412
code/game/ai_dmq3.h
Normal file → Executable file
412
code/game/ai_dmq3.h
Normal file → Executable file
|
@ -1,206 +1,206 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_dmq3.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//setup the deathmatch AI
|
||||
void BotSetupDeathmatchAI(void);
|
||||
//shutdown the deathmatch AI
|
||||
void BotShutdownDeathmatchAI(void);
|
||||
//let the bot live within it's deathmatch AI net
|
||||
void BotDeathmatchAI(bot_state_t *bs, float thinktime);
|
||||
//free waypoints
|
||||
void BotFreeWaypoints(bot_waypoint_t *wp);
|
||||
//choose a weapon
|
||||
void BotChooseWeapon(bot_state_t *bs);
|
||||
//setup movement stuff
|
||||
void BotSetupForMovement(bot_state_t *bs);
|
||||
//update the inventory
|
||||
void BotUpdateInventory(bot_state_t *bs);
|
||||
//update the inventory during battle
|
||||
void BotUpdateBattleInventory(bot_state_t *bs, int enemy);
|
||||
//use holdable items during battle
|
||||
void BotBattleUseItems(bot_state_t *bs);
|
||||
//return true if the bot is dead
|
||||
qboolean BotIsDead(bot_state_t *bs);
|
||||
//returns true if the bot is in observer mode
|
||||
qboolean BotIsObserver(bot_state_t *bs);
|
||||
//returns true if the bot is in the intermission
|
||||
qboolean BotIntermission(bot_state_t *bs);
|
||||
//returns true if the bot is in lava or slime
|
||||
qboolean BotInLavaOrSlime(bot_state_t *bs);
|
||||
//returns true if the entity is dead
|
||||
qboolean EntityIsDead(aas_entityinfo_t *entinfo);
|
||||
//returns true if the entity is invisible
|
||||
qboolean EntityIsInvisible(aas_entityinfo_t *entinfo);
|
||||
//returns true if the entity is shooting
|
||||
qboolean EntityIsShooting(aas_entityinfo_t *entinfo);
|
||||
#ifdef MISSIONPACK
|
||||
//returns true if this entity has the kamikaze
|
||||
qboolean EntityHasKamikaze(aas_entityinfo_t *entinfo);
|
||||
#endif
|
||||
// set a user info key/value pair
|
||||
void BotSetUserInfo(bot_state_t *bs, char *key, char *value);
|
||||
// set the team status (offense, defense etc.)
|
||||
void BotSetTeamStatus(bot_state_t *bs);
|
||||
//returns the name of the client
|
||||
char *ClientName(int client, char *name, int size);
|
||||
//returns an simplyfied client name
|
||||
char *EasyClientName(int client, char *name, int size);
|
||||
//returns the skin used by the client
|
||||
char *ClientSkin(int client, char *skin, int size);
|
||||
// returns the appropriate synonym context for the current game type and situation
|
||||
int BotSynonymContext(bot_state_t *bs);
|
||||
// set last ordered task
|
||||
int BotSetLastOrderedTask(bot_state_t *bs);
|
||||
// selection of goals for teamplay
|
||||
void BotTeamGoals(bot_state_t *bs, int retreat);
|
||||
//returns the aggression of the bot in the range [0, 100]
|
||||
float BotAggression(bot_state_t *bs);
|
||||
//returns how bad the bot feels
|
||||
float BotFeelingBad(bot_state_t *bs);
|
||||
//returns true if the bot wants to retreat
|
||||
int BotWantsToRetreat(bot_state_t *bs);
|
||||
//returns true if the bot wants to chase
|
||||
int BotWantsToChase(bot_state_t *bs);
|
||||
//returns true if the bot wants to help
|
||||
int BotWantsToHelp(bot_state_t *bs);
|
||||
//returns true if the bot can and wants to rocketjump
|
||||
int BotCanAndWantsToRocketJump(bot_state_t *bs);
|
||||
// returns true if the bot has a persistant powerup and a weapon
|
||||
int BotHasPersistantPowerupAndWeapon(bot_state_t *bs);
|
||||
//returns true if the bot wants to and goes camping
|
||||
int BotWantsToCamp(bot_state_t *bs);
|
||||
//the bot will perform attack movements
|
||||
bot_moveresult_t BotAttackMove(bot_state_t *bs, int tfl);
|
||||
//returns true if the bot and the entity are in the same team
|
||||
int BotSameTeam(bot_state_t *bs, int entnum);
|
||||
//returns true if teamplay is on
|
||||
int TeamPlayIsOn(void);
|
||||
// returns the client number of the team mate flag carrier (-1 if none)
|
||||
int BotTeamFlagCarrier(bot_state_t *bs);
|
||||
//returns visible team mate flag carrier if available
|
||||
int BotTeamFlagCarrierVisible(bot_state_t *bs);
|
||||
//returns visible enemy flag carrier if available
|
||||
int BotEnemyFlagCarrierVisible(bot_state_t *bs);
|
||||
//get the number of visible teammates and enemies
|
||||
void BotVisibleTeamMatesAndEnemies(bot_state_t *bs, int *teammates, int *enemies, float range);
|
||||
//returns true if within the field of vision for the given angles
|
||||
qboolean InFieldOfVision(vec3_t viewangles, float fov, vec3_t angles);
|
||||
//returns true and sets the .enemy field when an enemy is found
|
||||
int BotFindEnemy(bot_state_t *bs, int curenemy);
|
||||
//returns a roam goal
|
||||
void BotRoamGoal(bot_state_t *bs, vec3_t goal);
|
||||
//returns entity visibility in the range [0, 1]
|
||||
float BotEntityVisible(int viewer, vec3_t eye, vec3_t viewangles, float fov, int ent);
|
||||
//the bot will aim at the current enemy
|
||||
void BotAimAtEnemy(bot_state_t *bs);
|
||||
//check if the bot should attack
|
||||
void BotCheckAttack(bot_state_t *bs);
|
||||
//AI when the bot is blocked
|
||||
void BotAIBlocked(bot_state_t *bs, bot_moveresult_t *moveresult, int activate);
|
||||
//AI to predict obstacles
|
||||
int BotAIPredictObstacles(bot_state_t *bs, bot_goal_t *goal);
|
||||
//enable or disable the areas the blocking entity is in
|
||||
void BotEnableActivateGoalAreas(bot_activategoal_t *activategoal, int enable);
|
||||
//pop an activate goal from the stack
|
||||
int BotPopFromActivateGoalStack(bot_state_t *bs);
|
||||
//clear the activate goal stack
|
||||
void BotClearActivateGoalStack(bot_state_t *bs);
|
||||
//returns the team the bot is in
|
||||
int BotTeam(bot_state_t *bs);
|
||||
//retuns the opposite team of the bot
|
||||
int BotOppositeTeam(bot_state_t *bs);
|
||||
//returns the flag the bot is carrying (CTFFLAG_?)
|
||||
int BotCTFCarryingFlag(bot_state_t *bs);
|
||||
//remember the last ordered task
|
||||
void BotRememberLastOrderedTask(bot_state_t *bs);
|
||||
//set ctf goals (defend base, get enemy flag) during seek
|
||||
void BotCTFSeekGoals(bot_state_t *bs);
|
||||
//set ctf goals (defend base, get enemy flag) during retreat
|
||||
void BotCTFRetreatGoals(bot_state_t *bs);
|
||||
//
|
||||
#ifdef MISSIONPACK
|
||||
int Bot1FCTFCarryingFlag(bot_state_t *bs);
|
||||
int BotHarvesterCarryingCubes(bot_state_t *bs);
|
||||
void Bot1FCTFSeekGoals(bot_state_t *bs);
|
||||
void Bot1FCTFRetreatGoals(bot_state_t *bs);
|
||||
void BotObeliskSeekGoals(bot_state_t *bs);
|
||||
void BotObeliskRetreatGoals(bot_state_t *bs);
|
||||
void BotGoHarvest(bot_state_t *bs);
|
||||
void BotHarvesterSeekGoals(bot_state_t *bs);
|
||||
void BotHarvesterRetreatGoals(bot_state_t *bs);
|
||||
int BotTeamCubeCarrierVisible(bot_state_t *bs);
|
||||
int BotEnemyCubeCarrierVisible(bot_state_t *bs);
|
||||
#endif
|
||||
//get a random alternate route goal towards the given base
|
||||
int BotGetAlternateRouteGoal(bot_state_t *bs, int base);
|
||||
//returns either the alternate route goal or the given goal
|
||||
bot_goal_t *BotAlternateRoute(bot_state_t *bs, bot_goal_t *goal);
|
||||
//create a new waypoint
|
||||
bot_waypoint_t *BotCreateWayPoint(char *name, vec3_t origin, int areanum);
|
||||
//find a waypoint with the given name
|
||||
bot_waypoint_t *BotFindWayPoint(bot_waypoint_t *waypoints, char *name);
|
||||
//strstr but case insensitive
|
||||
char *stristr(char *str, char *charset);
|
||||
//returns the number of the client with the given name
|
||||
int ClientFromName(char *name);
|
||||
int ClientOnSameTeamFromName(bot_state_t *bs, char *name);
|
||||
//
|
||||
int BotPointAreaNum(vec3_t origin);
|
||||
//
|
||||
void BotMapScripts(bot_state_t *bs);
|
||||
|
||||
//ctf flags
|
||||
#define CTF_FLAG_NONE 0
|
||||
#define CTF_FLAG_RED 1
|
||||
#define CTF_FLAG_BLUE 2
|
||||
//CTF skins
|
||||
#define CTF_SKIN_REDTEAM "red"
|
||||
#define CTF_SKIN_BLUETEAM "blue"
|
||||
|
||||
extern int gametype; //game type
|
||||
extern int maxclients; //maximum number of clients
|
||||
|
||||
extern vmCvar_t bot_grapple;
|
||||
extern vmCvar_t bot_rocketjump;
|
||||
extern vmCvar_t bot_fastchat;
|
||||
extern vmCvar_t bot_nochat;
|
||||
extern vmCvar_t bot_testrchat;
|
||||
extern vmCvar_t bot_challenge;
|
||||
|
||||
extern bot_goal_t ctf_redflag;
|
||||
extern bot_goal_t ctf_blueflag;
|
||||
#ifdef MISSIONPACK
|
||||
extern bot_goal_t ctf_neutralflag;
|
||||
extern bot_goal_t redobelisk;
|
||||
extern bot_goal_t blueobelisk;
|
||||
extern bot_goal_t neutralobelisk;
|
||||
#endif
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_dmq3.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//setup the deathmatch AI
|
||||
void BotSetupDeathmatchAI(void);
|
||||
//shutdown the deathmatch AI
|
||||
void BotShutdownDeathmatchAI(void);
|
||||
//let the bot live within it's deathmatch AI net
|
||||
void BotDeathmatchAI(bot_state_t *bs, float thinktime);
|
||||
//free waypoints
|
||||
void BotFreeWaypoints(bot_waypoint_t *wp);
|
||||
//choose a weapon
|
||||
void BotChooseWeapon(bot_state_t *bs);
|
||||
//setup movement stuff
|
||||
void BotSetupForMovement(bot_state_t *bs);
|
||||
//update the inventory
|
||||
void BotUpdateInventory(bot_state_t *bs);
|
||||
//update the inventory during battle
|
||||
void BotUpdateBattleInventory(bot_state_t *bs, int enemy);
|
||||
//use holdable items during battle
|
||||
void BotBattleUseItems(bot_state_t *bs);
|
||||
//return true if the bot is dead
|
||||
qboolean BotIsDead(bot_state_t *bs);
|
||||
//returns true if the bot is in observer mode
|
||||
qboolean BotIsObserver(bot_state_t *bs);
|
||||
//returns true if the bot is in the intermission
|
||||
qboolean BotIntermission(bot_state_t *bs);
|
||||
//returns true if the bot is in lava or slime
|
||||
qboolean BotInLavaOrSlime(bot_state_t *bs);
|
||||
//returns true if the entity is dead
|
||||
qboolean EntityIsDead(aas_entityinfo_t *entinfo);
|
||||
//returns true if the entity is invisible
|
||||
qboolean EntityIsInvisible(aas_entityinfo_t *entinfo);
|
||||
//returns true if the entity is shooting
|
||||
qboolean EntityIsShooting(aas_entityinfo_t *entinfo);
|
||||
#ifdef MISSIONPACK
|
||||
//returns true if this entity has the kamikaze
|
||||
qboolean EntityHasKamikaze(aas_entityinfo_t *entinfo);
|
||||
#endif
|
||||
// set a user info key/value pair
|
||||
void BotSetUserInfo(bot_state_t *bs, char *key, char *value);
|
||||
// set the team status (offense, defense etc.)
|
||||
void BotSetTeamStatus(bot_state_t *bs);
|
||||
//returns the name of the client
|
||||
char *ClientName(int client, char *name, int size);
|
||||
//returns an simplyfied client name
|
||||
char *EasyClientName(int client, char *name, int size);
|
||||
//returns the skin used by the client
|
||||
char *ClientSkin(int client, char *skin, int size);
|
||||
// returns the appropriate synonym context for the current game type and situation
|
||||
int BotSynonymContext(bot_state_t *bs);
|
||||
// set last ordered task
|
||||
int BotSetLastOrderedTask(bot_state_t *bs);
|
||||
// selection of goals for teamplay
|
||||
void BotTeamGoals(bot_state_t *bs, int retreat);
|
||||
//returns the aggression of the bot in the range [0, 100]
|
||||
float BotAggression(bot_state_t *bs);
|
||||
//returns how bad the bot feels
|
||||
float BotFeelingBad(bot_state_t *bs);
|
||||
//returns true if the bot wants to retreat
|
||||
int BotWantsToRetreat(bot_state_t *bs);
|
||||
//returns true if the bot wants to chase
|
||||
int BotWantsToChase(bot_state_t *bs);
|
||||
//returns true if the bot wants to help
|
||||
int BotWantsToHelp(bot_state_t *bs);
|
||||
//returns true if the bot can and wants to rocketjump
|
||||
int BotCanAndWantsToRocketJump(bot_state_t *bs);
|
||||
// returns true if the bot has a persistant powerup and a weapon
|
||||
int BotHasPersistantPowerupAndWeapon(bot_state_t *bs);
|
||||
//returns true if the bot wants to and goes camping
|
||||
int BotWantsToCamp(bot_state_t *bs);
|
||||
//the bot will perform attack movements
|
||||
bot_moveresult_t BotAttackMove(bot_state_t *bs, int tfl);
|
||||
//returns true if the bot and the entity are in the same team
|
||||
int BotSameTeam(bot_state_t *bs, int entnum);
|
||||
//returns true if teamplay is on
|
||||
int TeamPlayIsOn(void);
|
||||
// returns the client number of the team mate flag carrier (-1 if none)
|
||||
int BotTeamFlagCarrier(bot_state_t *bs);
|
||||
//returns visible team mate flag carrier if available
|
||||
int BotTeamFlagCarrierVisible(bot_state_t *bs);
|
||||
//returns visible enemy flag carrier if available
|
||||
int BotEnemyFlagCarrierVisible(bot_state_t *bs);
|
||||
//get the number of visible teammates and enemies
|
||||
void BotVisibleTeamMatesAndEnemies(bot_state_t *bs, int *teammates, int *enemies, float range);
|
||||
//returns true if within the field of vision for the given angles
|
||||
qboolean InFieldOfVision(vec3_t viewangles, float fov, vec3_t angles);
|
||||
//returns true and sets the .enemy field when an enemy is found
|
||||
int BotFindEnemy(bot_state_t *bs, int curenemy);
|
||||
//returns a roam goal
|
||||
void BotRoamGoal(bot_state_t *bs, vec3_t goal);
|
||||
//returns entity visibility in the range [0, 1]
|
||||
float BotEntityVisible(int viewer, vec3_t eye, vec3_t viewangles, float fov, int ent);
|
||||
//the bot will aim at the current enemy
|
||||
void BotAimAtEnemy(bot_state_t *bs);
|
||||
//check if the bot should attack
|
||||
void BotCheckAttack(bot_state_t *bs);
|
||||
//AI when the bot is blocked
|
||||
void BotAIBlocked(bot_state_t *bs, bot_moveresult_t *moveresult, int activate);
|
||||
//AI to predict obstacles
|
||||
int BotAIPredictObstacles(bot_state_t *bs, bot_goal_t *goal);
|
||||
//enable or disable the areas the blocking entity is in
|
||||
void BotEnableActivateGoalAreas(bot_activategoal_t *activategoal, int enable);
|
||||
//pop an activate goal from the stack
|
||||
int BotPopFromActivateGoalStack(bot_state_t *bs);
|
||||
//clear the activate goal stack
|
||||
void BotClearActivateGoalStack(bot_state_t *bs);
|
||||
//returns the team the bot is in
|
||||
int BotTeam(bot_state_t *bs);
|
||||
//retuns the opposite team of the bot
|
||||
int BotOppositeTeam(bot_state_t *bs);
|
||||
//returns the flag the bot is carrying (CTFFLAG_?)
|
||||
int BotCTFCarryingFlag(bot_state_t *bs);
|
||||
//remember the last ordered task
|
||||
void BotRememberLastOrderedTask(bot_state_t *bs);
|
||||
//set ctf goals (defend base, get enemy flag) during seek
|
||||
void BotCTFSeekGoals(bot_state_t *bs);
|
||||
//set ctf goals (defend base, get enemy flag) during retreat
|
||||
void BotCTFRetreatGoals(bot_state_t *bs);
|
||||
//
|
||||
#ifdef MISSIONPACK
|
||||
int Bot1FCTFCarryingFlag(bot_state_t *bs);
|
||||
int BotHarvesterCarryingCubes(bot_state_t *bs);
|
||||
void Bot1FCTFSeekGoals(bot_state_t *bs);
|
||||
void Bot1FCTFRetreatGoals(bot_state_t *bs);
|
||||
void BotObeliskSeekGoals(bot_state_t *bs);
|
||||
void BotObeliskRetreatGoals(bot_state_t *bs);
|
||||
void BotGoHarvest(bot_state_t *bs);
|
||||
void BotHarvesterSeekGoals(bot_state_t *bs);
|
||||
void BotHarvesterRetreatGoals(bot_state_t *bs);
|
||||
int BotTeamCubeCarrierVisible(bot_state_t *bs);
|
||||
int BotEnemyCubeCarrierVisible(bot_state_t *bs);
|
||||
#endif
|
||||
//get a random alternate route goal towards the given base
|
||||
int BotGetAlternateRouteGoal(bot_state_t *bs, int base);
|
||||
//returns either the alternate route goal or the given goal
|
||||
bot_goal_t *BotAlternateRoute(bot_state_t *bs, bot_goal_t *goal);
|
||||
//create a new waypoint
|
||||
bot_waypoint_t *BotCreateWayPoint(char *name, vec3_t origin, int areanum);
|
||||
//find a waypoint with the given name
|
||||
bot_waypoint_t *BotFindWayPoint(bot_waypoint_t *waypoints, char *name);
|
||||
//strstr but case insensitive
|
||||
char *stristr(char *str, char *charset);
|
||||
//returns the number of the client with the given name
|
||||
int ClientFromName(char *name);
|
||||
int ClientOnSameTeamFromName(bot_state_t *bs, char *name);
|
||||
//
|
||||
int BotPointAreaNum(vec3_t origin);
|
||||
//
|
||||
void BotMapScripts(bot_state_t *bs);
|
||||
|
||||
//ctf flags
|
||||
#define CTF_FLAG_NONE 0
|
||||
#define CTF_FLAG_RED 1
|
||||
#define CTF_FLAG_BLUE 2
|
||||
//CTF skins
|
||||
#define CTF_SKIN_REDTEAM "red"
|
||||
#define CTF_SKIN_BLUETEAM "blue"
|
||||
|
||||
extern int gametype; //game type
|
||||
extern int maxclients; //maximum number of clients
|
||||
|
||||
extern vmCvar_t bot_grapple;
|
||||
extern vmCvar_t bot_rocketjump;
|
||||
extern vmCvar_t bot_fastchat;
|
||||
extern vmCvar_t bot_nochat;
|
||||
extern vmCvar_t bot_testrchat;
|
||||
extern vmCvar_t bot_challenge;
|
||||
|
||||
extern bot_goal_t ctf_redflag;
|
||||
extern bot_goal_t ctf_blueflag;
|
||||
#ifdef MISSIONPACK
|
||||
extern bot_goal_t ctf_neutralflag;
|
||||
extern bot_goal_t redobelisk;
|
||||
extern bot_goal_t blueobelisk;
|
||||
extern bot_goal_t neutralobelisk;
|
||||
#endif
|
||||
|
|
3390
code/game/ai_main.c
Normal file → Executable file
3390
code/game/ai_main.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
598
code/game/ai_main.h
Normal file → Executable file
598
code/game/ai_main.h
Normal file → Executable file
|
@ -1,299 +1,299 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_main.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//#define DEBUG
|
||||
#define CTF
|
||||
|
||||
#define MAX_ITEMS 256
|
||||
//bot flags
|
||||
#define BFL_STRAFERIGHT 1 //strafe to the right
|
||||
#define BFL_ATTACKED 2 //bot has attacked last ai frame
|
||||
#define BFL_ATTACKJUMPED 4 //bot jumped during attack last frame
|
||||
#define BFL_AIMATENEMY 8 //bot aimed at the enemy this frame
|
||||
#define BFL_AVOIDRIGHT 16 //avoid obstacles by going to the right
|
||||
#define BFL_IDEALVIEWSET 32 //bot has ideal view angles set
|
||||
#define BFL_FIGHTSUICIDAL 64 //bot is in a suicidal fight
|
||||
//long term goal types
|
||||
#define LTG_TEAMHELP 1 //help a team mate
|
||||
#define LTG_TEAMACCOMPANY 2 //accompany a team mate
|
||||
#define LTG_DEFENDKEYAREA 3 //defend a key area
|
||||
#define LTG_GETFLAG 4 //get the enemy flag
|
||||
#define LTG_RUSHBASE 5 //rush to the base
|
||||
#define LTG_RETURNFLAG 6 //return the flag
|
||||
#define LTG_CAMP 7 //camp somewhere
|
||||
#define LTG_CAMPORDER 8 //ordered to camp somewhere
|
||||
#define LTG_PATROL 9 //patrol
|
||||
#define LTG_GETITEM 10 //get an item
|
||||
#define LTG_KILL 11 //kill someone
|
||||
#define LTG_HARVEST 12 //harvest skulls
|
||||
#define LTG_ATTACKENEMYBASE 13 //attack the enemy base
|
||||
#define LTG_MAKELOVE_UNDER 14
|
||||
#define LTG_MAKELOVE_ONTOP 15
|
||||
//some goal dedication times
|
||||
#define TEAM_HELP_TIME 60 //1 minute teamplay help time
|
||||
#define TEAM_ACCOMPANY_TIME 600 //10 minutes teamplay accompany time
|
||||
#define TEAM_DEFENDKEYAREA_TIME 600 //10 minutes ctf defend base time
|
||||
#define TEAM_CAMP_TIME 600 //10 minutes camping time
|
||||
#define TEAM_PATROL_TIME 600 //10 minutes patrolling time
|
||||
#define TEAM_LEAD_TIME 600 //10 minutes taking the lead
|
||||
#define TEAM_GETITEM_TIME 60 //1 minute
|
||||
#define TEAM_KILL_SOMEONE 180 //3 minute to kill someone
|
||||
#define TEAM_ATTACKENEMYBASE_TIME 600 //10 minutes
|
||||
#define TEAM_HARVEST_TIME 120 //2 minutes
|
||||
#define CTF_GETFLAG_TIME 600 //10 minutes ctf get flag time
|
||||
#define CTF_RUSHBASE_TIME 120 //2 minutes ctf rush base time
|
||||
#define CTF_RETURNFLAG_TIME 180 //3 minutes to return the flag
|
||||
#define CTF_ROAM_TIME 60 //1 minute ctf roam time
|
||||
//patrol flags
|
||||
#define PATROL_LOOP 1
|
||||
#define PATROL_REVERSE 2
|
||||
#define PATROL_BACK 4
|
||||
//teamplay task preference
|
||||
#define TEAMTP_DEFENDER 1
|
||||
#define TEAMTP_ATTACKER 2
|
||||
//CTF strategy
|
||||
#define CTFS_AGRESSIVE 1
|
||||
//copied from the aas file header
|
||||
#define PRESENCE_NONE 1
|
||||
#define PRESENCE_NORMAL 2
|
||||
#define PRESENCE_CROUCH 4
|
||||
//
|
||||
#define MAX_PROXMINES 64
|
||||
|
||||
//check points
|
||||
typedef struct bot_waypoint_s
|
||||
{
|
||||
int inuse;
|
||||
char name[32];
|
||||
bot_goal_t goal;
|
||||
struct bot_waypoint_s *next, *prev;
|
||||
} bot_waypoint_t;
|
||||
|
||||
#define MAX_ACTIVATESTACK 8
|
||||
#define MAX_ACTIVATEAREAS 32
|
||||
|
||||
typedef struct bot_activategoal_s
|
||||
{
|
||||
int inuse;
|
||||
bot_goal_t goal; //goal to activate (buttons etc.)
|
||||
float time; //time to activate something
|
||||
float start_time; //time starting to activate something
|
||||
float justused_time; //time the goal was used
|
||||
int shoot; //true if bot has to shoot to activate
|
||||
int weapon; //weapon to be used for activation
|
||||
vec3_t target; //target to shoot at to activate something
|
||||
vec3_t origin; //origin of the blocking entity to activate
|
||||
int areas[MAX_ACTIVATEAREAS]; //routing areas disabled by blocking entity
|
||||
int numareas; //number of disabled routing areas
|
||||
int areasdisabled; //true if the areas are disabled for the routing
|
||||
struct bot_activategoal_s *next; //next activate goal on stack
|
||||
} bot_activategoal_t;
|
||||
|
||||
//bot state
|
||||
typedef struct bot_state_s
|
||||
{
|
||||
int inuse; //true if this state is used by a bot client
|
||||
int botthink_residual; //residual for the bot thinks
|
||||
int client; //client number of the bot
|
||||
int entitynum; //entity number of the bot
|
||||
playerState_t cur_ps; //current player state
|
||||
int last_eFlags; //last ps flags
|
||||
usercmd_t lastucmd; //usercmd from last frame
|
||||
int entityeventTime[1024]; //last entity event time
|
||||
//
|
||||
bot_settings_t settings; //several bot settings
|
||||
int (*ainode)(struct bot_state_s *bs); //current AI node
|
||||
float thinktime; //time the bot thinks this frame
|
||||
vec3_t origin; //origin of the bot
|
||||
vec3_t velocity; //velocity of the bot
|
||||
int presencetype; //presence type of the bot
|
||||
vec3_t eye; //eye coordinates of the bot
|
||||
int areanum; //the number of the area the bot is in
|
||||
int inventory[MAX_ITEMS]; //string with items amounts the bot has
|
||||
int tfl; //the travel flags the bot uses
|
||||
int flags; //several flags
|
||||
int respawn_wait; //wait until respawned
|
||||
int lasthealth; //health value previous frame
|
||||
int lastkilledplayer; //last killed player
|
||||
int lastkilledby; //player that last killed this bot
|
||||
int botdeathtype; //the death type of the bot
|
||||
int enemydeathtype; //the death type of the enemy
|
||||
int botsuicide; //true when the bot suicides
|
||||
int enemysuicide; //true when the enemy of the bot suicides
|
||||
int setupcount; //true when the bot has just been setup
|
||||
int map_restart; //true when the map is being restarted
|
||||
int entergamechat; //true when the bot used an enter game chat
|
||||
int num_deaths; //number of time this bot died
|
||||
int num_kills; //number of kills of this bot
|
||||
int revenge_enemy; //the revenge enemy
|
||||
int revenge_kills; //number of kills the enemy made
|
||||
int lastframe_health; //health value the last frame
|
||||
int lasthitcount; //number of hits last frame
|
||||
int chatto; //chat to all or team
|
||||
float walker; //walker charactertic
|
||||
float ltime; //local bot time
|
||||
float entergame_time; //time the bot entered the game
|
||||
float ltg_time; //long term goal time
|
||||
float nbg_time; //nearby goal time
|
||||
float respawn_time; //time the bot takes to respawn
|
||||
float respawnchat_time; //time the bot started a chat during respawn
|
||||
float chase_time; //time the bot will chase the enemy
|
||||
float enemyvisible_time; //time the enemy was last visible
|
||||
float check_time; //time to check for nearby items
|
||||
float stand_time; //time the bot is standing still
|
||||
float lastchat_time; //time the bot last selected a chat
|
||||
float kamikaze_time; //time to check for kamikaze usage
|
||||
float invulnerability_time; //time to check for invulnerability usage
|
||||
float standfindenemy_time; //time to find enemy while standing
|
||||
float attackstrafe_time; //time the bot is strafing in one dir
|
||||
float attackcrouch_time; //time the bot will stop crouching
|
||||
float attackchase_time; //time the bot chases during actual attack
|
||||
float attackjump_time; //time the bot jumped during attack
|
||||
float enemysight_time; //time before reacting to enemy
|
||||
float enemydeath_time; //time the enemy died
|
||||
float enemyposition_time; //time the position and velocity of the enemy were stored
|
||||
float defendaway_time; //time away while defending
|
||||
float defendaway_range; //max travel time away from defend area
|
||||
float rushbaseaway_time; //time away from rushing to the base
|
||||
float attackaway_time; //time away from attacking the enemy base
|
||||
float harvestaway_time; //time away from harvesting
|
||||
float ctfroam_time; //time the bot is roaming in ctf
|
||||
float killedenemy_time; //time the bot killed the enemy
|
||||
float arrive_time; //time arrived (at companion)
|
||||
float lastair_time; //last time the bot had air
|
||||
float teleport_time; //last time the bot teleported
|
||||
float camp_time; //last time camped
|
||||
float camp_range; //camp range
|
||||
float weaponchange_time; //time the bot started changing weapons
|
||||
float firethrottlewait_time; //amount of time to wait
|
||||
float firethrottleshoot_time; //amount of time to shoot
|
||||
float notblocked_time; //last time the bot was not blocked
|
||||
float blockedbyavoidspot_time; //time blocked by an avoid spot
|
||||
float predictobstacles_time; //last time the bot predicted obstacles
|
||||
int predictobstacles_goalareanum; //last goal areanum the bot predicted obstacles for
|
||||
vec3_t aimtarget;
|
||||
vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle
|
||||
vec3_t enemyorigin; //enemy origin 0.5 secs ago during battle
|
||||
//
|
||||
int kamikazebody; //kamikaze body
|
||||
int proxmines[MAX_PROXMINES];
|
||||
int numproxmines;
|
||||
//
|
||||
int character; //the bot character
|
||||
int ms; //move state of the bot
|
||||
int gs; //goal state of the bot
|
||||
int cs; //chat state of the bot
|
||||
int ws; //weapon state of the bot
|
||||
//
|
||||
int enemy; //enemy entity number
|
||||
int lastenemyareanum; //last reachability area the enemy was in
|
||||
vec3_t lastenemyorigin; //last origin of the enemy in the reachability area
|
||||
int weaponnum; //current weapon number
|
||||
vec3_t viewangles; //current view angles
|
||||
vec3_t ideal_viewangles; //ideal view angles
|
||||
vec3_t viewanglespeed;
|
||||
//
|
||||
int ltgtype; //long term goal type
|
||||
// team goals
|
||||
int teammate; //team mate involved in this team goal
|
||||
int decisionmaker; //player who decided to go for this goal
|
||||
int ordered; //true if ordered to do something
|
||||
float order_time; //time ordered to do something
|
||||
int owndecision_time; //time the bot made it's own decision
|
||||
bot_goal_t teamgoal; //the team goal
|
||||
bot_goal_t altroutegoal; //alternative route goal
|
||||
float reachedaltroutegoal_time; //time the bot reached the alt route goal
|
||||
float teammessage_time; //time to message team mates what the bot is doing
|
||||
float teamgoal_time; //time to stop helping team mate
|
||||
float teammatevisible_time; //last time the team mate was NOT visible
|
||||
int teamtaskpreference; //team task preference
|
||||
// last ordered team goal
|
||||
int lastgoal_decisionmaker;
|
||||
int lastgoal_ltgtype;
|
||||
int lastgoal_teammate;
|
||||
bot_goal_t lastgoal_teamgoal;
|
||||
// for leading team mates
|
||||
int lead_teammate; //team mate the bot is leading
|
||||
bot_goal_t lead_teamgoal; //team goal while leading
|
||||
float lead_time; //time leading someone
|
||||
float leadvisible_time; //last time the team mate was visible
|
||||
float leadmessage_time; //last time a messaged was sent to the team mate
|
||||
float leadbackup_time; //time backing up towards team mate
|
||||
//
|
||||
char teamleader[32]; //netname of the team leader
|
||||
float askteamleader_time; //time asked for team leader
|
||||
float becometeamleader_time; //time the bot will become the team leader
|
||||
float teamgiveorders_time; //time to give team orders
|
||||
float lastflagcapture_time; //last time a flag was captured
|
||||
int numteammates; //number of team mates
|
||||
int redflagstatus; //0 = at base, 1 = not at base
|
||||
int blueflagstatus; //0 = at base, 1 = not at base
|
||||
int neutralflagstatus; //0 = at base, 1 = our team has flag, 2 = enemy team has flag, 3 = enemy team dropped the flag
|
||||
int flagstatuschanged; //flag status changed
|
||||
int forceorders; //true if forced to give orders
|
||||
int flagcarrier; //team mate carrying the enemy flag
|
||||
int ctfstrategy; //ctf strategy
|
||||
char subteam[32]; //sub team name
|
||||
float formation_dist; //formation team mate intervening space
|
||||
char formation_teammate[16]; //netname of the team mate the bot uses for relative positioning
|
||||
float formation_angle; //angle relative to the formation team mate
|
||||
vec3_t formation_dir; //the direction the formation is moving in
|
||||
vec3_t formation_origin; //origin the bot uses for relative positioning
|
||||
bot_goal_t formation_goal; //formation goal
|
||||
|
||||
bot_activategoal_t *activatestack; //first activate goal on the stack
|
||||
bot_activategoal_t activategoalheap[MAX_ACTIVATESTACK]; //activate goal heap
|
||||
|
||||
bot_waypoint_t *checkpoints; //check points
|
||||
bot_waypoint_t *patrolpoints; //patrol points
|
||||
bot_waypoint_t *curpatrolpoint; //current patrol point the bot is going for
|
||||
int patrolflags; //patrol flags
|
||||
} bot_state_t;
|
||||
|
||||
//resets the whole bot state
|
||||
void BotResetState(bot_state_t *bs);
|
||||
//returns the number of bots in the game
|
||||
int NumBots(void);
|
||||
//returns info about the entity
|
||||
void BotEntityInfo(int entnum, aas_entityinfo_t *info);
|
||||
|
||||
extern float floattime;
|
||||
#define FloatTime() floattime
|
||||
|
||||
// from the game source
|
||||
void QDECL BotAI_Print(int type, char *fmt, ...);
|
||||
void QDECL QDECL BotAI_BotInitialChat( bot_state_t *bs, char *type, ... );
|
||||
void BotAI_Trace(bsp_trace_t *bsptrace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask);
|
||||
int BotAI_GetClientState( int clientNum, playerState_t *state );
|
||||
int BotAI_GetEntityState( int entityNum, entityState_t *state );
|
||||
int BotAI_GetSnapshotEntity( int clientNum, int sequence, entityState_t *state );
|
||||
int BotTeamLeader(bot_state_t *bs);
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_main.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//#define DEBUG
|
||||
#define CTF
|
||||
|
||||
#define MAX_ITEMS 256
|
||||
//bot flags
|
||||
#define BFL_STRAFERIGHT 1 //strafe to the right
|
||||
#define BFL_ATTACKED 2 //bot has attacked last ai frame
|
||||
#define BFL_ATTACKJUMPED 4 //bot jumped during attack last frame
|
||||
#define BFL_AIMATENEMY 8 //bot aimed at the enemy this frame
|
||||
#define BFL_AVOIDRIGHT 16 //avoid obstacles by going to the right
|
||||
#define BFL_IDEALVIEWSET 32 //bot has ideal view angles set
|
||||
#define BFL_FIGHTSUICIDAL 64 //bot is in a suicidal fight
|
||||
//long term goal types
|
||||
#define LTG_TEAMHELP 1 //help a team mate
|
||||
#define LTG_TEAMACCOMPANY 2 //accompany a team mate
|
||||
#define LTG_DEFENDKEYAREA 3 //defend a key area
|
||||
#define LTG_GETFLAG 4 //get the enemy flag
|
||||
#define LTG_RUSHBASE 5 //rush to the base
|
||||
#define LTG_RETURNFLAG 6 //return the flag
|
||||
#define LTG_CAMP 7 //camp somewhere
|
||||
#define LTG_CAMPORDER 8 //ordered to camp somewhere
|
||||
#define LTG_PATROL 9 //patrol
|
||||
#define LTG_GETITEM 10 //get an item
|
||||
#define LTG_KILL 11 //kill someone
|
||||
#define LTG_HARVEST 12 //harvest skulls
|
||||
#define LTG_ATTACKENEMYBASE 13 //attack the enemy base
|
||||
#define LTG_MAKELOVE_UNDER 14
|
||||
#define LTG_MAKELOVE_ONTOP 15
|
||||
//some goal dedication times
|
||||
#define TEAM_HELP_TIME 60 //1 minute teamplay help time
|
||||
#define TEAM_ACCOMPANY_TIME 600 //10 minutes teamplay accompany time
|
||||
#define TEAM_DEFENDKEYAREA_TIME 600 //10 minutes ctf defend base time
|
||||
#define TEAM_CAMP_TIME 600 //10 minutes camping time
|
||||
#define TEAM_PATROL_TIME 600 //10 minutes patrolling time
|
||||
#define TEAM_LEAD_TIME 600 //10 minutes taking the lead
|
||||
#define TEAM_GETITEM_TIME 60 //1 minute
|
||||
#define TEAM_KILL_SOMEONE 180 //3 minute to kill someone
|
||||
#define TEAM_ATTACKENEMYBASE_TIME 600 //10 minutes
|
||||
#define TEAM_HARVEST_TIME 120 //2 minutes
|
||||
#define CTF_GETFLAG_TIME 600 //10 minutes ctf get flag time
|
||||
#define CTF_RUSHBASE_TIME 120 //2 minutes ctf rush base time
|
||||
#define CTF_RETURNFLAG_TIME 180 //3 minutes to return the flag
|
||||
#define CTF_ROAM_TIME 60 //1 minute ctf roam time
|
||||
//patrol flags
|
||||
#define PATROL_LOOP 1
|
||||
#define PATROL_REVERSE 2
|
||||
#define PATROL_BACK 4
|
||||
//teamplay task preference
|
||||
#define TEAMTP_DEFENDER 1
|
||||
#define TEAMTP_ATTACKER 2
|
||||
//CTF strategy
|
||||
#define CTFS_AGRESSIVE 1
|
||||
//copied from the aas file header
|
||||
#define PRESENCE_NONE 1
|
||||
#define PRESENCE_NORMAL 2
|
||||
#define PRESENCE_CROUCH 4
|
||||
//
|
||||
#define MAX_PROXMINES 64
|
||||
|
||||
//check points
|
||||
typedef struct bot_waypoint_s
|
||||
{
|
||||
int inuse;
|
||||
char name[32];
|
||||
bot_goal_t goal;
|
||||
struct bot_waypoint_s *next, *prev;
|
||||
} bot_waypoint_t;
|
||||
|
||||
#define MAX_ACTIVATESTACK 8
|
||||
#define MAX_ACTIVATEAREAS 32
|
||||
|
||||
typedef struct bot_activategoal_s
|
||||
{
|
||||
int inuse;
|
||||
bot_goal_t goal; //goal to activate (buttons etc.)
|
||||
float time; //time to activate something
|
||||
float start_time; //time starting to activate something
|
||||
float justused_time; //time the goal was used
|
||||
int shoot; //true if bot has to shoot to activate
|
||||
int weapon; //weapon to be used for activation
|
||||
vec3_t target; //target to shoot at to activate something
|
||||
vec3_t origin; //origin of the blocking entity to activate
|
||||
int areas[MAX_ACTIVATEAREAS]; //routing areas disabled by blocking entity
|
||||
int numareas; //number of disabled routing areas
|
||||
int areasdisabled; //true if the areas are disabled for the routing
|
||||
struct bot_activategoal_s *next; //next activate goal on stack
|
||||
} bot_activategoal_t;
|
||||
|
||||
//bot state
|
||||
typedef struct bot_state_s
|
||||
{
|
||||
int inuse; //true if this state is used by a bot client
|
||||
int botthink_residual; //residual for the bot thinks
|
||||
int client; //client number of the bot
|
||||
int entitynum; //entity number of the bot
|
||||
playerState_t cur_ps; //current player state
|
||||
int last_eFlags; //last ps flags
|
||||
usercmd_t lastucmd; //usercmd from last frame
|
||||
int entityeventTime[1024]; //last entity event time
|
||||
//
|
||||
bot_settings_t settings; //several bot settings
|
||||
int (*ainode)(struct bot_state_s *bs); //current AI node
|
||||
float thinktime; //time the bot thinks this frame
|
||||
vec3_t origin; //origin of the bot
|
||||
vec3_t velocity; //velocity of the bot
|
||||
int presencetype; //presence type of the bot
|
||||
vec3_t eye; //eye coordinates of the bot
|
||||
int areanum; //the number of the area the bot is in
|
||||
int inventory[MAX_ITEMS]; //string with items amounts the bot has
|
||||
int tfl; //the travel flags the bot uses
|
||||
int flags; //several flags
|
||||
int respawn_wait; //wait until respawned
|
||||
int lasthealth; //health value previous frame
|
||||
int lastkilledplayer; //last killed player
|
||||
int lastkilledby; //player that last killed this bot
|
||||
int botdeathtype; //the death type of the bot
|
||||
int enemydeathtype; //the death type of the enemy
|
||||
int botsuicide; //true when the bot suicides
|
||||
int enemysuicide; //true when the enemy of the bot suicides
|
||||
int setupcount; //true when the bot has just been setup
|
||||
int map_restart; //true when the map is being restarted
|
||||
int entergamechat; //true when the bot used an enter game chat
|
||||
int num_deaths; //number of time this bot died
|
||||
int num_kills; //number of kills of this bot
|
||||
int revenge_enemy; //the revenge enemy
|
||||
int revenge_kills; //number of kills the enemy made
|
||||
int lastframe_health; //health value the last frame
|
||||
int lasthitcount; //number of hits last frame
|
||||
int chatto; //chat to all or team
|
||||
float walker; //walker charactertic
|
||||
float ltime; //local bot time
|
||||
float entergame_time; //time the bot entered the game
|
||||
float ltg_time; //long term goal time
|
||||
float nbg_time; //nearby goal time
|
||||
float respawn_time; //time the bot takes to respawn
|
||||
float respawnchat_time; //time the bot started a chat during respawn
|
||||
float chase_time; //time the bot will chase the enemy
|
||||
float enemyvisible_time; //time the enemy was last visible
|
||||
float check_time; //time to check for nearby items
|
||||
float stand_time; //time the bot is standing still
|
||||
float lastchat_time; //time the bot last selected a chat
|
||||
float kamikaze_time; //time to check for kamikaze usage
|
||||
float invulnerability_time; //time to check for invulnerability usage
|
||||
float standfindenemy_time; //time to find enemy while standing
|
||||
float attackstrafe_time; //time the bot is strafing in one dir
|
||||
float attackcrouch_time; //time the bot will stop crouching
|
||||
float attackchase_time; //time the bot chases during actual attack
|
||||
float attackjump_time; //time the bot jumped during attack
|
||||
float enemysight_time; //time before reacting to enemy
|
||||
float enemydeath_time; //time the enemy died
|
||||
float enemyposition_time; //time the position and velocity of the enemy were stored
|
||||
float defendaway_time; //time away while defending
|
||||
float defendaway_range; //max travel time away from defend area
|
||||
float rushbaseaway_time; //time away from rushing to the base
|
||||
float attackaway_time; //time away from attacking the enemy base
|
||||
float harvestaway_time; //time away from harvesting
|
||||
float ctfroam_time; //time the bot is roaming in ctf
|
||||
float killedenemy_time; //time the bot killed the enemy
|
||||
float arrive_time; //time arrived (at companion)
|
||||
float lastair_time; //last time the bot had air
|
||||
float teleport_time; //last time the bot teleported
|
||||
float camp_time; //last time camped
|
||||
float camp_range; //camp range
|
||||
float weaponchange_time; //time the bot started changing weapons
|
||||
float firethrottlewait_time; //amount of time to wait
|
||||
float firethrottleshoot_time; //amount of time to shoot
|
||||
float notblocked_time; //last time the bot was not blocked
|
||||
float blockedbyavoidspot_time; //time blocked by an avoid spot
|
||||
float predictobstacles_time; //last time the bot predicted obstacles
|
||||
int predictobstacles_goalareanum; //last goal areanum the bot predicted obstacles for
|
||||
vec3_t aimtarget;
|
||||
vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle
|
||||
vec3_t enemyorigin; //enemy origin 0.5 secs ago during battle
|
||||
//
|
||||
int kamikazebody; //kamikaze body
|
||||
int proxmines[MAX_PROXMINES];
|
||||
int numproxmines;
|
||||
//
|
||||
int character; //the bot character
|
||||
int ms; //move state of the bot
|
||||
int gs; //goal state of the bot
|
||||
int cs; //chat state of the bot
|
||||
int ws; //weapon state of the bot
|
||||
//
|
||||
int enemy; //enemy entity number
|
||||
int lastenemyareanum; //last reachability area the enemy was in
|
||||
vec3_t lastenemyorigin; //last origin of the enemy in the reachability area
|
||||
int weaponnum; //current weapon number
|
||||
vec3_t viewangles; //current view angles
|
||||
vec3_t ideal_viewangles; //ideal view angles
|
||||
vec3_t viewanglespeed;
|
||||
//
|
||||
int ltgtype; //long term goal type
|
||||
// team goals
|
||||
int teammate; //team mate involved in this team goal
|
||||
int decisionmaker; //player who decided to go for this goal
|
||||
int ordered; //true if ordered to do something
|
||||
float order_time; //time ordered to do something
|
||||
int owndecision_time; //time the bot made it's own decision
|
||||
bot_goal_t teamgoal; //the team goal
|
||||
bot_goal_t altroutegoal; //alternative route goal
|
||||
float reachedaltroutegoal_time; //time the bot reached the alt route goal
|
||||
float teammessage_time; //time to message team mates what the bot is doing
|
||||
float teamgoal_time; //time to stop helping team mate
|
||||
float teammatevisible_time; //last time the team mate was NOT visible
|
||||
int teamtaskpreference; //team task preference
|
||||
// last ordered team goal
|
||||
int lastgoal_decisionmaker;
|
||||
int lastgoal_ltgtype;
|
||||
int lastgoal_teammate;
|
||||
bot_goal_t lastgoal_teamgoal;
|
||||
// for leading team mates
|
||||
int lead_teammate; //team mate the bot is leading
|
||||
bot_goal_t lead_teamgoal; //team goal while leading
|
||||
float lead_time; //time leading someone
|
||||
float leadvisible_time; //last time the team mate was visible
|
||||
float leadmessage_time; //last time a messaged was sent to the team mate
|
||||
float leadbackup_time; //time backing up towards team mate
|
||||
//
|
||||
char teamleader[32]; //netname of the team leader
|
||||
float askteamleader_time; //time asked for team leader
|
||||
float becometeamleader_time; //time the bot will become the team leader
|
||||
float teamgiveorders_time; //time to give team orders
|
||||
float lastflagcapture_time; //last time a flag was captured
|
||||
int numteammates; //number of team mates
|
||||
int redflagstatus; //0 = at base, 1 = not at base
|
||||
int blueflagstatus; //0 = at base, 1 = not at base
|
||||
int neutralflagstatus; //0 = at base, 1 = our team has flag, 2 = enemy team has flag, 3 = enemy team dropped the flag
|
||||
int flagstatuschanged; //flag status changed
|
||||
int forceorders; //true if forced to give orders
|
||||
int flagcarrier; //team mate carrying the enemy flag
|
||||
int ctfstrategy; //ctf strategy
|
||||
char subteam[32]; //sub team name
|
||||
float formation_dist; //formation team mate intervening space
|
||||
char formation_teammate[16]; //netname of the team mate the bot uses for relative positioning
|
||||
float formation_angle; //angle relative to the formation team mate
|
||||
vec3_t formation_dir; //the direction the formation is moving in
|
||||
vec3_t formation_origin; //origin the bot uses for relative positioning
|
||||
bot_goal_t formation_goal; //formation goal
|
||||
|
||||
bot_activategoal_t *activatestack; //first activate goal on the stack
|
||||
bot_activategoal_t activategoalheap[MAX_ACTIVATESTACK]; //activate goal heap
|
||||
|
||||
bot_waypoint_t *checkpoints; //check points
|
||||
bot_waypoint_t *patrolpoints; //patrol points
|
||||
bot_waypoint_t *curpatrolpoint; //current patrol point the bot is going for
|
||||
int patrolflags; //patrol flags
|
||||
} bot_state_t;
|
||||
|
||||
//resets the whole bot state
|
||||
void BotResetState(bot_state_t *bs);
|
||||
//returns the number of bots in the game
|
||||
int NumBots(void);
|
||||
//returns info about the entity
|
||||
void BotEntityInfo(int entnum, aas_entityinfo_t *info);
|
||||
|
||||
extern float floattime;
|
||||
#define FloatTime() floattime
|
||||
|
||||
// from the game source
|
||||
void QDECL BotAI_Print(int type, char *fmt, ...);
|
||||
void QDECL QDECL BotAI_BotInitialChat( bot_state_t *bs, char *type, ... );
|
||||
void BotAI_Trace(bsp_trace_t *bsptrace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask);
|
||||
int BotAI_GetClientState( int clientNum, playerState_t *state );
|
||||
int BotAI_GetEntityState( int entityNum, entityState_t *state );
|
||||
int BotAI_GetSnapshotEntity( int clientNum, int sequence, entityState_t *state );
|
||||
int BotTeamLeader(bot_state_t *bs);
|
||||
|
|
4160
code/game/ai_team.c
Normal file → Executable file
4160
code/game/ai_team.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
78
code/game/ai_team.h
Normal file → Executable file
78
code/game/ai_team.h
Normal file → Executable file
|
@ -1,39 +1,39 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_team.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
void BotTeamAI(bot_state_t *bs);
|
||||
int BotGetTeamMateTaskPreference(bot_state_t *bs, int teammate);
|
||||
void BotSetTeamMateTaskPreference(bot_state_t *bs, int teammate, int preference);
|
||||
void BotVoiceChat(bot_state_t *bs, int toclient, char *voicechat);
|
||||
void BotVoiceChatOnly(bot_state_t *bs, int toclient, char *voicechat);
|
||||
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_team.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_chat.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
void BotTeamAI(bot_state_t *bs);
|
||||
int BotGetTeamMateTaskPreference(bot_state_t *bs, int teammate);
|
||||
void BotSetTeamMateTaskPreference(bot_state_t *bs, int teammate, int preference);
|
||||
void BotVoiceChat(bot_state_t *bs, int toclient, char *voicechat);
|
||||
void BotVoiceChatOnly(bot_state_t *bs, int toclient, char *voicechat);
|
||||
|
||||
|
||||
|
|
1100
code/game/ai_vcmd.c
Normal file → Executable file
1100
code/game/ai_vcmd.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
72
code/game/ai_vcmd.h
Normal file → Executable file
72
code/game/ai_vcmd.h
Normal file → Executable file
|
@ -1,36 +1,36 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_vcmd.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_vcmd.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
int BotVoiceChatCommand(bot_state_t *bs, int mode, char *voicechat);
|
||||
void BotVoiceChat_Defend(bot_state_t *bs, int client, int mode);
|
||||
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: ai_vcmd.h
|
||||
*
|
||||
* desc: Quake3 bot AI
|
||||
*
|
||||
* $Archive: /source/code/botai/ai_vcmd.c $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
int BotVoiceChatCommand(bot_state_t *bs, int mode, char *voicechat);
|
||||
void BotVoiceChat_Defend(bot_state_t *bs, int client, int mode);
|
||||
|
||||
|
||||
|
|
442
code/game/be_aas.h
Normal file → Executable file
442
code/game/be_aas.h
Normal file → Executable file
|
@ -1,221 +1,221 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_aas.h
|
||||
*
|
||||
* desc: Area Awareness System, stuff exported to the AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_aas.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef MAX_STRINGFIELD
|
||||
#define MAX_STRINGFIELD 80
|
||||
#endif
|
||||
|
||||
//travel flags
|
||||
#define TFL_INVALID 0x00000001 //traveling temporary not possible
|
||||
#define TFL_WALK 0x00000002 //walking
|
||||
#define TFL_CROUCH 0x00000004 //crouching
|
||||
#define TFL_BARRIERJUMP 0x00000008 //jumping onto a barrier
|
||||
#define TFL_JUMP 0x00000010 //jumping
|
||||
#define TFL_LADDER 0x00000020 //climbing a ladder
|
||||
#define TFL_WALKOFFLEDGE 0x00000080 //walking of a ledge
|
||||
#define TFL_SWIM 0x00000100 //swimming
|
||||
#define TFL_WATERJUMP 0x00000200 //jumping out of the water
|
||||
#define TFL_TELEPORT 0x00000400 //teleporting
|
||||
#define TFL_ELEVATOR 0x00000800 //elevator
|
||||
#define TFL_ROCKETJUMP 0x00001000 //rocket jumping
|
||||
#define TFL_BFGJUMP 0x00002000 //bfg jumping
|
||||
#define TFL_GRAPPLEHOOK 0x00004000 //grappling hook
|
||||
#define TFL_DOUBLEJUMP 0x00008000 //double jump
|
||||
#define TFL_RAMPJUMP 0x00010000 //ramp jump
|
||||
#define TFL_STRAFEJUMP 0x00020000 //strafe jump
|
||||
#define TFL_JUMPPAD 0x00040000 //jump pad
|
||||
#define TFL_AIR 0x00080000 //travel through air
|
||||
#define TFL_WATER 0x00100000 //travel through water
|
||||
#define TFL_SLIME 0x00200000 //travel through slime
|
||||
#define TFL_LAVA 0x00400000 //travel through lava
|
||||
#define TFL_DONOTENTER 0x00800000 //travel through donotenter area
|
||||
#define TFL_FUNCBOB 0x01000000 //func bobbing
|
||||
#define TFL_FLIGHT 0x02000000 //flight
|
||||
#define TFL_BRIDGE 0x04000000 //move over a bridge
|
||||
//
|
||||
#define TFL_NOTTEAM1 0x08000000 //not team 1
|
||||
#define TFL_NOTTEAM2 0x10000000 //not team 2
|
||||
|
||||
//default travel flags
|
||||
#define TFL_DEFAULT TFL_WALK|TFL_CROUCH|TFL_BARRIERJUMP|\
|
||||
TFL_JUMP|TFL_LADDER|\
|
||||
TFL_WALKOFFLEDGE|TFL_SWIM|TFL_WATERJUMP|\
|
||||
TFL_TELEPORT|TFL_ELEVATOR|\
|
||||
TFL_AIR|TFL_WATER|TFL_JUMPPAD|TFL_FUNCBOB
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SOLID_NOT, // no interaction with other objects
|
||||
SOLID_TRIGGER, // only touch when inside, after moving
|
||||
SOLID_BBOX, // touch on edge
|
||||
SOLID_BSP // bsp clip, touch on edge
|
||||
} solid_t;
|
||||
|
||||
//a trace is returned when a box is swept through the AAS world
|
||||
typedef struct aas_trace_s
|
||||
{
|
||||
qboolean startsolid; // if true, the initial point was in a solid area
|
||||
float fraction; // time completed, 1.0 = didn't hit anything
|
||||
vec3_t endpos; // final position
|
||||
int ent; // entity blocking the trace
|
||||
int lastarea; // last area the trace was in (zero if none)
|
||||
int area; // area blocking the trace (zero if none)
|
||||
int planenum; // number of the plane that was hit
|
||||
} aas_trace_t;
|
||||
|
||||
/* Defined in botlib.h
|
||||
|
||||
//bsp_trace_t hit surface
|
||||
typedef struct bsp_surface_s
|
||||
{
|
||||
char name[16];
|
||||
int flags;
|
||||
int value;
|
||||
} bsp_surface_t;
|
||||
|
||||
//a trace is returned when a box is swept through the BSP world
|
||||
typedef struct bsp_trace_s
|
||||
{
|
||||
qboolean allsolid; // if true, plane is not valid
|
||||
qboolean startsolid; // if true, the initial point was in a solid area
|
||||
float fraction; // time completed, 1.0 = didn't hit anything
|
||||
vec3_t endpos; // final position
|
||||
cplane_t plane; // surface normal at impact
|
||||
float exp_dist; // expanded plane distance
|
||||
int sidenum; // number of the brush side hit
|
||||
bsp_surface_t surface; // hit surface
|
||||
int contents; // contents on other side of surface hit
|
||||
int ent; // number of entity hit
|
||||
} bsp_trace_t;
|
||||
//
|
||||
*/
|
||||
|
||||
//entity info
|
||||
typedef struct aas_entityinfo_s
|
||||
{
|
||||
int valid; // true if updated this frame
|
||||
int type; // entity type
|
||||
int flags; // entity flags
|
||||
float ltime; // local time
|
||||
float update_time; // time between last and current update
|
||||
int number; // number of the entity
|
||||
vec3_t origin; // origin of the entity
|
||||
vec3_t angles; // angles of the model
|
||||
vec3_t old_origin; // for lerping
|
||||
vec3_t lastvisorigin; // last visible origin
|
||||
vec3_t mins; // bounding box minimums
|
||||
vec3_t maxs; // bounding box maximums
|
||||
int groundent; // ground entity
|
||||
int solid; // solid type
|
||||
int modelindex; // model used
|
||||
int modelindex2; // weapons, CTF flags, etc
|
||||
int frame; // model frame number
|
||||
int event; // impulse events -- muzzle flashes, footsteps, etc
|
||||
int eventParm; // even parameter
|
||||
int powerups; // bit flags
|
||||
int weapon; // determines weapon and flash model, etc
|
||||
int legsAnim; // mask off ANIM_TOGGLEBIT
|
||||
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
||||
} aas_entityinfo_t;
|
||||
|
||||
// area info
|
||||
typedef struct aas_areainfo_s
|
||||
{
|
||||
int contents;
|
||||
int flags;
|
||||
int presencetype;
|
||||
int cluster;
|
||||
vec3_t mins;
|
||||
vec3_t maxs;
|
||||
vec3_t center;
|
||||
} aas_areainfo_t;
|
||||
|
||||
// client movement prediction stop events, stop as soon as:
|
||||
#define SE_NONE 0
|
||||
#define SE_HITGROUND 1 // the ground is hit
|
||||
#define SE_LEAVEGROUND 2 // there's no ground
|
||||
#define SE_ENTERWATER 4 // water is entered
|
||||
#define SE_ENTERSLIME 8 // slime is entered
|
||||
#define SE_ENTERLAVA 16 // lava is entered
|
||||
#define SE_HITGROUNDDAMAGE 32 // the ground is hit with damage
|
||||
#define SE_GAP 64 // there's a gap
|
||||
#define SE_TOUCHJUMPPAD 128 // touching a jump pad area
|
||||
#define SE_TOUCHTELEPORTER 256 // touching teleporter
|
||||
#define SE_ENTERAREA 512 // the given stoparea is entered
|
||||
#define SE_HITGROUNDAREA 1024 // a ground face in the area is hit
|
||||
#define SE_HITBOUNDINGBOX 2048 // hit the specified bounding box
|
||||
#define SE_TOUCHCLUSTERPORTAL 4096 // touching a cluster portal
|
||||
|
||||
typedef struct aas_clientmove_s
|
||||
{
|
||||
vec3_t endpos; //position at the end of movement prediction
|
||||
int endarea; //area at end of movement prediction
|
||||
vec3_t velocity; //velocity at the end of movement prediction
|
||||
aas_trace_t trace; //last trace
|
||||
int presencetype; //presence type at end of movement prediction
|
||||
int stopevent; //event that made the prediction stop
|
||||
int endcontents; //contents at the end of movement prediction
|
||||
float time; //time predicted ahead
|
||||
int frames; //number of frames predicted ahead
|
||||
} aas_clientmove_t;
|
||||
|
||||
// alternate route goals
|
||||
#define ALTROUTEGOAL_ALL 1
|
||||
#define ALTROUTEGOAL_CLUSTERPORTALS 2
|
||||
#define ALTROUTEGOAL_VIEWPORTALS 4
|
||||
|
||||
typedef struct aas_altroutegoal_s
|
||||
{
|
||||
vec3_t origin;
|
||||
int areanum;
|
||||
unsigned short starttraveltime;
|
||||
unsigned short goaltraveltime;
|
||||
unsigned short extratraveltime;
|
||||
} aas_altroutegoal_t;
|
||||
|
||||
// route prediction stop events
|
||||
#define RSE_NONE 0
|
||||
#define RSE_NOROUTE 1 //no route to goal
|
||||
#define RSE_USETRAVELTYPE 2 //stop as soon as on of the given travel types is used
|
||||
#define RSE_ENTERCONTENTS 4 //stop when entering the given contents
|
||||
#define RSE_ENTERAREA 8 //stop when entering the given area
|
||||
|
||||
typedef struct aas_predictroute_s
|
||||
{
|
||||
vec3_t endpos; //position at the end of movement prediction
|
||||
int endarea; //area at end of movement prediction
|
||||
int stopevent; //event that made the prediction stop
|
||||
int endcontents; //contents at the end of movement prediction
|
||||
int endtravelflags; //end travel flags
|
||||
int numareas; //number of areas predicted ahead
|
||||
int time; //time predicted ahead (in hundreth of a sec)
|
||||
} aas_predictroute_t;
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_aas.h
|
||||
*
|
||||
* desc: Area Awareness System, stuff exported to the AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_aas.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef MAX_STRINGFIELD
|
||||
#define MAX_STRINGFIELD 80
|
||||
#endif
|
||||
|
||||
//travel flags
|
||||
#define TFL_INVALID 0x00000001 //traveling temporary not possible
|
||||
#define TFL_WALK 0x00000002 //walking
|
||||
#define TFL_CROUCH 0x00000004 //crouching
|
||||
#define TFL_BARRIERJUMP 0x00000008 //jumping onto a barrier
|
||||
#define TFL_JUMP 0x00000010 //jumping
|
||||
#define TFL_LADDER 0x00000020 //climbing a ladder
|
||||
#define TFL_WALKOFFLEDGE 0x00000080 //walking of a ledge
|
||||
#define TFL_SWIM 0x00000100 //swimming
|
||||
#define TFL_WATERJUMP 0x00000200 //jumping out of the water
|
||||
#define TFL_TELEPORT 0x00000400 //teleporting
|
||||
#define TFL_ELEVATOR 0x00000800 //elevator
|
||||
#define TFL_ROCKETJUMP 0x00001000 //rocket jumping
|
||||
#define TFL_BFGJUMP 0x00002000 //bfg jumping
|
||||
#define TFL_GRAPPLEHOOK 0x00004000 //grappling hook
|
||||
#define TFL_DOUBLEJUMP 0x00008000 //double jump
|
||||
#define TFL_RAMPJUMP 0x00010000 //ramp jump
|
||||
#define TFL_STRAFEJUMP 0x00020000 //strafe jump
|
||||
#define TFL_JUMPPAD 0x00040000 //jump pad
|
||||
#define TFL_AIR 0x00080000 //travel through air
|
||||
#define TFL_WATER 0x00100000 //travel through water
|
||||
#define TFL_SLIME 0x00200000 //travel through slime
|
||||
#define TFL_LAVA 0x00400000 //travel through lava
|
||||
#define TFL_DONOTENTER 0x00800000 //travel through donotenter area
|
||||
#define TFL_FUNCBOB 0x01000000 //func bobbing
|
||||
#define TFL_FLIGHT 0x02000000 //flight
|
||||
#define TFL_BRIDGE 0x04000000 //move over a bridge
|
||||
//
|
||||
#define TFL_NOTTEAM1 0x08000000 //not team 1
|
||||
#define TFL_NOTTEAM2 0x10000000 //not team 2
|
||||
|
||||
//default travel flags
|
||||
#define TFL_DEFAULT TFL_WALK|TFL_CROUCH|TFL_BARRIERJUMP|\
|
||||
TFL_JUMP|TFL_LADDER|\
|
||||
TFL_WALKOFFLEDGE|TFL_SWIM|TFL_WATERJUMP|\
|
||||
TFL_TELEPORT|TFL_ELEVATOR|\
|
||||
TFL_AIR|TFL_WATER|TFL_JUMPPAD|TFL_FUNCBOB
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SOLID_NOT, // no interaction with other objects
|
||||
SOLID_TRIGGER, // only touch when inside, after moving
|
||||
SOLID_BBOX, // touch on edge
|
||||
SOLID_BSP // bsp clip, touch on edge
|
||||
} solid_t;
|
||||
|
||||
//a trace is returned when a box is swept through the AAS world
|
||||
typedef struct aas_trace_s
|
||||
{
|
||||
qboolean startsolid; // if true, the initial point was in a solid area
|
||||
float fraction; // time completed, 1.0 = didn't hit anything
|
||||
vec3_t endpos; // final position
|
||||
int ent; // entity blocking the trace
|
||||
int lastarea; // last area the trace was in (zero if none)
|
||||
int area; // area blocking the trace (zero if none)
|
||||
int planenum; // number of the plane that was hit
|
||||
} aas_trace_t;
|
||||
|
||||
/* Defined in botlib.h
|
||||
|
||||
//bsp_trace_t hit surface
|
||||
typedef struct bsp_surface_s
|
||||
{
|
||||
char name[16];
|
||||
int flags;
|
||||
int value;
|
||||
} bsp_surface_t;
|
||||
|
||||
//a trace is returned when a box is swept through the BSP world
|
||||
typedef struct bsp_trace_s
|
||||
{
|
||||
qboolean allsolid; // if true, plane is not valid
|
||||
qboolean startsolid; // if true, the initial point was in a solid area
|
||||
float fraction; // time completed, 1.0 = didn't hit anything
|
||||
vec3_t endpos; // final position
|
||||
cplane_t plane; // surface normal at impact
|
||||
float exp_dist; // expanded plane distance
|
||||
int sidenum; // number of the brush side hit
|
||||
bsp_surface_t surface; // hit surface
|
||||
int contents; // contents on other side of surface hit
|
||||
int ent; // number of entity hit
|
||||
} bsp_trace_t;
|
||||
//
|
||||
*/
|
||||
|
||||
//entity info
|
||||
typedef struct aas_entityinfo_s
|
||||
{
|
||||
int valid; // true if updated this frame
|
||||
int type; // entity type
|
||||
int flags; // entity flags
|
||||
float ltime; // local time
|
||||
float update_time; // time between last and current update
|
||||
int number; // number of the entity
|
||||
vec3_t origin; // origin of the entity
|
||||
vec3_t angles; // angles of the model
|
||||
vec3_t old_origin; // for lerping
|
||||
vec3_t lastvisorigin; // last visible origin
|
||||
vec3_t mins; // bounding box minimums
|
||||
vec3_t maxs; // bounding box maximums
|
||||
int groundent; // ground entity
|
||||
int solid; // solid type
|
||||
int modelindex; // model used
|
||||
int modelindex2; // weapons, CTF flags, etc
|
||||
int frame; // model frame number
|
||||
int event; // impulse events -- muzzle flashes, footsteps, etc
|
||||
int eventParm; // even parameter
|
||||
int powerups; // bit flags
|
||||
int weapon; // determines weapon and flash model, etc
|
||||
int legsAnim; // mask off ANIM_TOGGLEBIT
|
||||
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
||||
} aas_entityinfo_t;
|
||||
|
||||
// area info
|
||||
typedef struct aas_areainfo_s
|
||||
{
|
||||
int contents;
|
||||
int flags;
|
||||
int presencetype;
|
||||
int cluster;
|
||||
vec3_t mins;
|
||||
vec3_t maxs;
|
||||
vec3_t center;
|
||||
} aas_areainfo_t;
|
||||
|
||||
// client movement prediction stop events, stop as soon as:
|
||||
#define SE_NONE 0
|
||||
#define SE_HITGROUND 1 // the ground is hit
|
||||
#define SE_LEAVEGROUND 2 // there's no ground
|
||||
#define SE_ENTERWATER 4 // water is entered
|
||||
#define SE_ENTERSLIME 8 // slime is entered
|
||||
#define SE_ENTERLAVA 16 // lava is entered
|
||||
#define SE_HITGROUNDDAMAGE 32 // the ground is hit with damage
|
||||
#define SE_GAP 64 // there's a gap
|
||||
#define SE_TOUCHJUMPPAD 128 // touching a jump pad area
|
||||
#define SE_TOUCHTELEPORTER 256 // touching teleporter
|
||||
#define SE_ENTERAREA 512 // the given stoparea is entered
|
||||
#define SE_HITGROUNDAREA 1024 // a ground face in the area is hit
|
||||
#define SE_HITBOUNDINGBOX 2048 // hit the specified bounding box
|
||||
#define SE_TOUCHCLUSTERPORTAL 4096 // touching a cluster portal
|
||||
|
||||
typedef struct aas_clientmove_s
|
||||
{
|
||||
vec3_t endpos; //position at the end of movement prediction
|
||||
int endarea; //area at end of movement prediction
|
||||
vec3_t velocity; //velocity at the end of movement prediction
|
||||
aas_trace_t trace; //last trace
|
||||
int presencetype; //presence type at end of movement prediction
|
||||
int stopevent; //event that made the prediction stop
|
||||
int endcontents; //contents at the end of movement prediction
|
||||
float time; //time predicted ahead
|
||||
int frames; //number of frames predicted ahead
|
||||
} aas_clientmove_t;
|
||||
|
||||
// alternate route goals
|
||||
#define ALTROUTEGOAL_ALL 1
|
||||
#define ALTROUTEGOAL_CLUSTERPORTALS 2
|
||||
#define ALTROUTEGOAL_VIEWPORTALS 4
|
||||
|
||||
typedef struct aas_altroutegoal_s
|
||||
{
|
||||
vec3_t origin;
|
||||
int areanum;
|
||||
unsigned short starttraveltime;
|
||||
unsigned short goaltraveltime;
|
||||
unsigned short extratraveltime;
|
||||
} aas_altroutegoal_t;
|
||||
|
||||
// route prediction stop events
|
||||
#define RSE_NONE 0
|
||||
#define RSE_NOROUTE 1 //no route to goal
|
||||
#define RSE_USETRAVELTYPE 2 //stop as soon as on of the given travel types is used
|
||||
#define RSE_ENTERCONTENTS 4 //stop when entering the given contents
|
||||
#define RSE_ENTERAREA 8 //stop when entering the given area
|
||||
|
||||
typedef struct aas_predictroute_s
|
||||
{
|
||||
vec3_t endpos; //position at the end of movement prediction
|
||||
int endarea; //area at end of movement prediction
|
||||
int stopevent; //event that made the prediction stop
|
||||
int endcontents; //contents at the end of movement prediction
|
||||
int endtravelflags; //end travel flags
|
||||
int numareas; //number of areas predicted ahead
|
||||
int time; //time predicted ahead (in hundreth of a sec)
|
||||
} aas_predictroute_t;
|
||||
|
|
96
code/game/be_ai_char.h
Normal file → Executable file
96
code/game/be_ai_char.h
Normal file → Executable file
|
@ -1,48 +1,48 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_char.h
|
||||
*
|
||||
* desc: bot characters
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_char.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//loads a bot character from a file
|
||||
int BotLoadCharacter(char *charfile, float skill);
|
||||
//frees a bot character
|
||||
void BotFreeCharacter(int character);
|
||||
//returns a float characteristic
|
||||
float Characteristic_Float(int character, int index);
|
||||
//returns a bounded float characteristic
|
||||
float Characteristic_BFloat(int character, int index, float min, float max);
|
||||
//returns an integer characteristic
|
||||
int Characteristic_Integer(int character, int index);
|
||||
//returns a bounded integer characteristic
|
||||
int Characteristic_BInteger(int character, int index, int min, int max);
|
||||
//returns a string characteristic
|
||||
void Characteristic_String(int character, int index, char *buf, int size);
|
||||
//free cached bot characters
|
||||
void BotShutdownCharacters(void);
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_char.h
|
||||
*
|
||||
* desc: bot characters
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_char.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//loads a bot character from a file
|
||||
int BotLoadCharacter(char *charfile, float skill);
|
||||
//frees a bot character
|
||||
void BotFreeCharacter(int character);
|
||||
//returns a float characteristic
|
||||
float Characteristic_Float(int character, int index);
|
||||
//returns a bounded float characteristic
|
||||
float Characteristic_BFloat(int character, int index, float min, float max);
|
||||
//returns an integer characteristic
|
||||
int Characteristic_Integer(int character, int index);
|
||||
//returns a bounded integer characteristic
|
||||
int Characteristic_BInteger(int character, int index, int min, int max);
|
||||
//returns a string characteristic
|
||||
void Characteristic_String(int character, int index, char *buf, int size);
|
||||
//free cached bot characters
|
||||
void BotShutdownCharacters(void);
|
||||
|
|
226
code/game/be_ai_chat.h
Normal file → Executable file
226
code/game/be_ai_chat.h
Normal file → Executable file
|
@ -1,113 +1,113 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
/*****************************************************************************
|
||||
* name: be_ai_chat.h
|
||||
*
|
||||
* desc: char AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_chat.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_MESSAGE_SIZE 256
|
||||
#define MAX_CHATTYPE_NAME 32
|
||||
#define MAX_MATCHVARIABLES 8
|
||||
|
||||
#define CHAT_GENDERLESS 0
|
||||
#define CHAT_GENDERFEMALE 1
|
||||
#define CHAT_GENDERMALE 2
|
||||
|
||||
#define CHAT_ALL 0
|
||||
#define CHAT_TEAM 1
|
||||
#define CHAT_TELL 2
|
||||
|
||||
//a console message
|
||||
typedef struct bot_consolemessage_s
|
||||
{
|
||||
int handle;
|
||||
float time; //message time
|
||||
int type; //message type
|
||||
char message[MAX_MESSAGE_SIZE]; //message
|
||||
struct bot_consolemessage_s *prev, *next; //prev and next in list
|
||||
} bot_consolemessage_t;
|
||||
|
||||
//match variable
|
||||
typedef struct bot_matchvariable_s
|
||||
{
|
||||
char offset;
|
||||
int length;
|
||||
} bot_matchvariable_t;
|
||||
//returned to AI when a match is found
|
||||
typedef struct bot_match_s
|
||||
{
|
||||
char string[MAX_MESSAGE_SIZE];
|
||||
int type;
|
||||
int subtype;
|
||||
bot_matchvariable_t variables[MAX_MATCHVARIABLES];
|
||||
} bot_match_t;
|
||||
|
||||
//setup the chat AI
|
||||
int BotSetupChatAI(void);
|
||||
//shutdown the chat AI
|
||||
void BotShutdownChatAI(void);
|
||||
//returns the handle to a newly allocated chat state
|
||||
int BotAllocChatState(void);
|
||||
//frees the chatstate
|
||||
void BotFreeChatState(int handle);
|
||||
//adds a console message to the chat state
|
||||
void BotQueueConsoleMessage(int chatstate, int type, char *message);
|
||||
//removes the console message from the chat state
|
||||
void BotRemoveConsoleMessage(int chatstate, int handle);
|
||||
//returns the next console message from the state
|
||||
int BotNextConsoleMessage(int chatstate, bot_consolemessage_t *cm);
|
||||
//returns the number of console messages currently stored in the state
|
||||
int BotNumConsoleMessages(int chatstate);
|
||||
//selects a chat message of the given type
|
||||
void BotInitialChat(int chatstate, char *type, int mcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7);
|
||||
//returns the number of initial chat messages of the given type
|
||||
int BotNumInitialChats(int chatstate, char *type);
|
||||
//find and select a reply for the given message
|
||||
int BotReplyChat(int chatstate, char *message, int mcontext, int vcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7);
|
||||
//returns the length of the currently selected chat message
|
||||
int BotChatLength(int chatstate);
|
||||
//enters the selected chat message
|
||||
void BotEnterChat(int chatstate, int clientto, int sendto);
|
||||
//get the chat message ready to be output
|
||||
void BotGetChatMessage(int chatstate, char *buf, int size);
|
||||
//checks if the first string contains the second one, returns index into first string or -1 if not found
|
||||
int StringContains(char *str1, char *str2, int casesensitive);
|
||||
//finds a match for the given string using the match templates
|
||||
int BotFindMatch(char *str, bot_match_t *match, unsigned long int context);
|
||||
//returns a variable from a match
|
||||
void BotMatchVariable(bot_match_t *match, int variable, char *buf, int size);
|
||||
//unify all the white spaces in the string
|
||||
void UnifyWhiteSpaces(char *string);
|
||||
//replace all the context related synonyms in the string
|
||||
void BotReplaceSynonyms(char *string, unsigned long int context);
|
||||
//loads a chat file for the chat state
|
||||
int BotLoadChatFile(int chatstate, char *chatfile, char *chatname);
|
||||
//store the gender of the bot in the chat state
|
||||
void BotSetChatGender(int chatstate, int gender);
|
||||
//store the bot name in the chat state
|
||||
void BotSetChatName(int chatstate, char *name, int client);
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
/*****************************************************************************
|
||||
* name: be_ai_chat.h
|
||||
*
|
||||
* desc: char AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_chat.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_MESSAGE_SIZE 256
|
||||
#define MAX_CHATTYPE_NAME 32
|
||||
#define MAX_MATCHVARIABLES 8
|
||||
|
||||
#define CHAT_GENDERLESS 0
|
||||
#define CHAT_GENDERFEMALE 1
|
||||
#define CHAT_GENDERMALE 2
|
||||
|
||||
#define CHAT_ALL 0
|
||||
#define CHAT_TEAM 1
|
||||
#define CHAT_TELL 2
|
||||
|
||||
//a console message
|
||||
typedef struct bot_consolemessage_s
|
||||
{
|
||||
int handle;
|
||||
float time; //message time
|
||||
int type; //message type
|
||||
char message[MAX_MESSAGE_SIZE]; //message
|
||||
struct bot_consolemessage_s *prev, *next; //prev and next in list
|
||||
} bot_consolemessage_t;
|
||||
|
||||
//match variable
|
||||
typedef struct bot_matchvariable_s
|
||||
{
|
||||
char offset;
|
||||
int length;
|
||||
} bot_matchvariable_t;
|
||||
//returned to AI when a match is found
|
||||
typedef struct bot_match_s
|
||||
{
|
||||
char string[MAX_MESSAGE_SIZE];
|
||||
int type;
|
||||
int subtype;
|
||||
bot_matchvariable_t variables[MAX_MATCHVARIABLES];
|
||||
} bot_match_t;
|
||||
|
||||
//setup the chat AI
|
||||
int BotSetupChatAI(void);
|
||||
//shutdown the chat AI
|
||||
void BotShutdownChatAI(void);
|
||||
//returns the handle to a newly allocated chat state
|
||||
int BotAllocChatState(void);
|
||||
//frees the chatstate
|
||||
void BotFreeChatState(int handle);
|
||||
//adds a console message to the chat state
|
||||
void BotQueueConsoleMessage(int chatstate, int type, char *message);
|
||||
//removes the console message from the chat state
|
||||
void BotRemoveConsoleMessage(int chatstate, int handle);
|
||||
//returns the next console message from the state
|
||||
int BotNextConsoleMessage(int chatstate, bot_consolemessage_t *cm);
|
||||
//returns the number of console messages currently stored in the state
|
||||
int BotNumConsoleMessages(int chatstate);
|
||||
//selects a chat message of the given type
|
||||
void BotInitialChat(int chatstate, char *type, int mcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7);
|
||||
//returns the number of initial chat messages of the given type
|
||||
int BotNumInitialChats(int chatstate, char *type);
|
||||
//find and select a reply for the given message
|
||||
int BotReplyChat(int chatstate, char *message, int mcontext, int vcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7);
|
||||
//returns the length of the currently selected chat message
|
||||
int BotChatLength(int chatstate);
|
||||
//enters the selected chat message
|
||||
void BotEnterChat(int chatstate, int clientto, int sendto);
|
||||
//get the chat message ready to be output
|
||||
void BotGetChatMessage(int chatstate, char *buf, int size);
|
||||
//checks if the first string contains the second one, returns index into first string or -1 if not found
|
||||
int StringContains(char *str1, char *str2, int casesensitive);
|
||||
//finds a match for the given string using the match templates
|
||||
int BotFindMatch(char *str, bot_match_t *match, unsigned long int context);
|
||||
//returns a variable from a match
|
||||
void BotMatchVariable(bot_match_t *match, int variable, char *buf, int size);
|
||||
//unify all the white spaces in the string
|
||||
void UnifyWhiteSpaces(char *string);
|
||||
//replace all the context related synonyms in the string
|
||||
void BotReplaceSynonyms(char *string, unsigned long int context);
|
||||
//loads a chat file for the chat state
|
||||
int BotLoadChatFile(int chatstate, char *chatfile, char *chatname);
|
||||
//store the gender of the bot in the chat state
|
||||
void BotSetChatGender(int chatstate, int gender);
|
||||
//store the bot name in the chat state
|
||||
void BotSetChatName(int chatstate, char *name, int client);
|
||||
|
||||
|
|
66
code/game/be_ai_gen.h
Normal file → Executable file
66
code/game/be_ai_gen.h
Normal file → Executable file
|
@ -1,33 +1,33 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_gen.h
|
||||
*
|
||||
* desc: genetic selection
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_gen.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
int GeneticParentsAndChildSelection(int numranks, float *ranks, int *parent1, int *parent2, int *child);
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_gen.h
|
||||
*
|
||||
* desc: genetic selection
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_gen.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
int GeneticParentsAndChildSelection(int numranks, float *ranks, int *parent1, int *parent2, int *child);
|
||||
|
|
236
code/game/be_ai_goal.h
Normal file → Executable file
236
code/game/be_ai_goal.h
Normal file → Executable file
|
@ -1,118 +1,118 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
/*****************************************************************************
|
||||
* name: be_ai_goal.h
|
||||
*
|
||||
* desc: goal AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_goal.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_AVOIDGOALS 256
|
||||
#define MAX_GOALSTACK 8
|
||||
|
||||
#define GFL_NONE 0
|
||||
#define GFL_ITEM 1
|
||||
#define GFL_ROAM 2
|
||||
#define GFL_DROPPED 4
|
||||
|
||||
//a bot goal
|
||||
typedef struct bot_goal_s
|
||||
{
|
||||
vec3_t origin; //origin of the goal
|
||||
int areanum; //area number of the goal
|
||||
vec3_t mins, maxs; //mins and maxs of the goal
|
||||
int entitynum; //number of the goal entity
|
||||
int number; //goal number
|
||||
int flags; //goal flags
|
||||
int iteminfo; //item information
|
||||
} bot_goal_t;
|
||||
|
||||
//reset the whole goal state, but keep the item weights
|
||||
void BotResetGoalState(int goalstate);
|
||||
//reset avoid goals
|
||||
void BotResetAvoidGoals(int goalstate);
|
||||
//remove the goal with the given number from the avoid goals
|
||||
void BotRemoveFromAvoidGoals(int goalstate, int number);
|
||||
//push a goal onto the goal stack
|
||||
void BotPushGoal(int goalstate, bot_goal_t *goal);
|
||||
//pop a goal from the goal stack
|
||||
void BotPopGoal(int goalstate);
|
||||
//empty the bot's goal stack
|
||||
void BotEmptyGoalStack(int goalstate);
|
||||
//dump the avoid goals
|
||||
void BotDumpAvoidGoals(int goalstate);
|
||||
//dump the goal stack
|
||||
void BotDumpGoalStack(int goalstate);
|
||||
//get the name name of the goal with the given number
|
||||
void BotGoalName(int number, char *name, int size);
|
||||
//get the top goal from the stack
|
||||
int BotGetTopGoal(int goalstate, bot_goal_t *goal);
|
||||
//get the second goal on the stack
|
||||
int BotGetSecondGoal(int goalstate, bot_goal_t *goal);
|
||||
//choose the best long term goal item for the bot
|
||||
int BotChooseLTGItem(int goalstate, vec3_t origin, int *inventory, int travelflags);
|
||||
//choose the best nearby goal item for the bot
|
||||
//the item may not be further away from the current bot position than maxtime
|
||||
//also the travel time from the nearby goal towards the long term goal may not
|
||||
//be larger than the travel time towards the long term goal from the current bot position
|
||||
int BotChooseNBGItem(int goalstate, vec3_t origin, int *inventory, int travelflags,
|
||||
bot_goal_t *ltg, float maxtime);
|
||||
//returns true if the bot touches the goal
|
||||
int BotTouchingGoal(vec3_t origin, bot_goal_t *goal);
|
||||
//returns true if the goal should be visible but isn't
|
||||
int BotItemGoalInVisButNotVisible(int viewer, vec3_t eye, vec3_t viewangles, bot_goal_t *goal);
|
||||
//search for a goal for the given classname, the index can be used
|
||||
//as a start point for the search when multiple goals are available with that same classname
|
||||
int BotGetLevelItemGoal(int index, char *classname, bot_goal_t *goal);
|
||||
//get the next camp spot in the map
|
||||
int BotGetNextCampSpotGoal(int num, bot_goal_t *goal);
|
||||
//get the map location with the given name
|
||||
int BotGetMapLocationGoal(char *name, bot_goal_t *goal);
|
||||
//returns the avoid goal time
|
||||
float BotAvoidGoalTime(int goalstate, int number);
|
||||
//set the avoid goal time
|
||||
void BotSetAvoidGoalTime(int goalstate, int number, float avoidtime);
|
||||
//initializes the items in the level
|
||||
void BotInitLevelItems(void);
|
||||
//regularly update dynamic entity items (dropped weapons, flags etc.)
|
||||
void BotUpdateEntityItems(void);
|
||||
//interbreed the goal fuzzy logic
|
||||
void BotInterbreedGoalFuzzyLogic(int parent1, int parent2, int child);
|
||||
//save the goal fuzzy logic to disk
|
||||
void BotSaveGoalFuzzyLogic(int goalstate, char *filename);
|
||||
//mutate the goal fuzzy logic
|
||||
void BotMutateGoalFuzzyLogic(int goalstate, float range);
|
||||
//loads item weights for the bot
|
||||
int BotLoadItemWeights(int goalstate, char *filename);
|
||||
//frees the item weights of the bot
|
||||
void BotFreeItemWeights(int goalstate);
|
||||
//returns the handle of a newly allocated goal state
|
||||
int BotAllocGoalState(int client);
|
||||
//free the given goal state
|
||||
void BotFreeGoalState(int handle);
|
||||
//setup the goal AI
|
||||
int BotSetupGoalAI(void);
|
||||
//shut down the goal AI
|
||||
void BotShutdownGoalAI(void);
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
/*****************************************************************************
|
||||
* name: be_ai_goal.h
|
||||
*
|
||||
* desc: goal AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_goal.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_AVOIDGOALS 256
|
||||
#define MAX_GOALSTACK 8
|
||||
|
||||
#define GFL_NONE 0
|
||||
#define GFL_ITEM 1
|
||||
#define GFL_ROAM 2
|
||||
#define GFL_DROPPED 4
|
||||
|
||||
//a bot goal
|
||||
typedef struct bot_goal_s
|
||||
{
|
||||
vec3_t origin; //origin of the goal
|
||||
int areanum; //area number of the goal
|
||||
vec3_t mins, maxs; //mins and maxs of the goal
|
||||
int entitynum; //number of the goal entity
|
||||
int number; //goal number
|
||||
int flags; //goal flags
|
||||
int iteminfo; //item information
|
||||
} bot_goal_t;
|
||||
|
||||
//reset the whole goal state, but keep the item weights
|
||||
void BotResetGoalState(int goalstate);
|
||||
//reset avoid goals
|
||||
void BotResetAvoidGoals(int goalstate);
|
||||
//remove the goal with the given number from the avoid goals
|
||||
void BotRemoveFromAvoidGoals(int goalstate, int number);
|
||||
//push a goal onto the goal stack
|
||||
void BotPushGoal(int goalstate, bot_goal_t *goal);
|
||||
//pop a goal from the goal stack
|
||||
void BotPopGoal(int goalstate);
|
||||
//empty the bot's goal stack
|
||||
void BotEmptyGoalStack(int goalstate);
|
||||
//dump the avoid goals
|
||||
void BotDumpAvoidGoals(int goalstate);
|
||||
//dump the goal stack
|
||||
void BotDumpGoalStack(int goalstate);
|
||||
//get the name name of the goal with the given number
|
||||
void BotGoalName(int number, char *name, int size);
|
||||
//get the top goal from the stack
|
||||
int BotGetTopGoal(int goalstate, bot_goal_t *goal);
|
||||
//get the second goal on the stack
|
||||
int BotGetSecondGoal(int goalstate, bot_goal_t *goal);
|
||||
//choose the best long term goal item for the bot
|
||||
int BotChooseLTGItem(int goalstate, vec3_t origin, int *inventory, int travelflags);
|
||||
//choose the best nearby goal item for the bot
|
||||
//the item may not be further away from the current bot position than maxtime
|
||||
//also the travel time from the nearby goal towards the long term goal may not
|
||||
//be larger than the travel time towards the long term goal from the current bot position
|
||||
int BotChooseNBGItem(int goalstate, vec3_t origin, int *inventory, int travelflags,
|
||||
bot_goal_t *ltg, float maxtime);
|
||||
//returns true if the bot touches the goal
|
||||
int BotTouchingGoal(vec3_t origin, bot_goal_t *goal);
|
||||
//returns true if the goal should be visible but isn't
|
||||
int BotItemGoalInVisButNotVisible(int viewer, vec3_t eye, vec3_t viewangles, bot_goal_t *goal);
|
||||
//search for a goal for the given classname, the index can be used
|
||||
//as a start point for the search when multiple goals are available with that same classname
|
||||
int BotGetLevelItemGoal(int index, char *classname, bot_goal_t *goal);
|
||||
//get the next camp spot in the map
|
||||
int BotGetNextCampSpotGoal(int num, bot_goal_t *goal);
|
||||
//get the map location with the given name
|
||||
int BotGetMapLocationGoal(char *name, bot_goal_t *goal);
|
||||
//returns the avoid goal time
|
||||
float BotAvoidGoalTime(int goalstate, int number);
|
||||
//set the avoid goal time
|
||||
void BotSetAvoidGoalTime(int goalstate, int number, float avoidtime);
|
||||
//initializes the items in the level
|
||||
void BotInitLevelItems(void);
|
||||
//regularly update dynamic entity items (dropped weapons, flags etc.)
|
||||
void BotUpdateEntityItems(void);
|
||||
//interbreed the goal fuzzy logic
|
||||
void BotInterbreedGoalFuzzyLogic(int parent1, int parent2, int child);
|
||||
//save the goal fuzzy logic to disk
|
||||
void BotSaveGoalFuzzyLogic(int goalstate, char *filename);
|
||||
//mutate the goal fuzzy logic
|
||||
void BotMutateGoalFuzzyLogic(int goalstate, float range);
|
||||
//loads item weights for the bot
|
||||
int BotLoadItemWeights(int goalstate, char *filename);
|
||||
//frees the item weights of the bot
|
||||
void BotFreeItemWeights(int goalstate);
|
||||
//returns the handle of a newly allocated goal state
|
||||
int BotAllocGoalState(int client);
|
||||
//free the given goal state
|
||||
void BotFreeGoalState(int handle);
|
||||
//setup the goal AI
|
||||
int BotSetupGoalAI(void);
|
||||
//shut down the goal AI
|
||||
void BotShutdownGoalAI(void);
|
||||
|
|
284
code/game/be_ai_move.h
Normal file → Executable file
284
code/game/be_ai_move.h
Normal file → Executable file
|
@ -1,142 +1,142 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_move.h
|
||||
*
|
||||
* desc: movement AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_move.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//movement types
|
||||
#define MOVE_WALK 1
|
||||
#define MOVE_CROUCH 2
|
||||
#define MOVE_JUMP 4
|
||||
#define MOVE_GRAPPLE 8
|
||||
#define MOVE_ROCKETJUMP 16
|
||||
#define MOVE_BFGJUMP 32
|
||||
//move flags
|
||||
#define MFL_BARRIERJUMP 1 //bot is performing a barrier jump
|
||||
#define MFL_ONGROUND 2 //bot is in the ground
|
||||
#define MFL_SWIMMING 4 //bot is swimming
|
||||
#define MFL_AGAINSTLADDER 8 //bot is against a ladder
|
||||
#define MFL_WATERJUMP 16 //bot is waterjumping
|
||||
#define MFL_TELEPORTED 32 //bot is being teleported
|
||||
#define MFL_GRAPPLEPULL 64 //bot is being pulled by the grapple
|
||||
#define MFL_ACTIVEGRAPPLE 128 //bot is using the grapple hook
|
||||
#define MFL_GRAPPLERESET 256 //bot has reset the grapple
|
||||
#define MFL_WALK 512 //bot should walk slowly
|
||||
// move result flags
|
||||
#define MOVERESULT_MOVEMENTVIEW 1 //bot uses view for movement
|
||||
#define MOVERESULT_SWIMVIEW 2 //bot uses view for swimming
|
||||
#define MOVERESULT_WAITING 4 //bot is waiting for something
|
||||
#define MOVERESULT_MOVEMENTVIEWSET 8 //bot has set the view in movement code
|
||||
#define MOVERESULT_MOVEMENTWEAPON 16 //bot uses weapon for movement
|
||||
#define MOVERESULT_ONTOPOFOBSTACLE 32 //bot is ontop of obstacle
|
||||
#define MOVERESULT_ONTOPOF_FUNCBOB 64 //bot is ontop of a func_bobbing
|
||||
#define MOVERESULT_ONTOPOF_ELEVATOR 128 //bot is ontop of an elevator (func_plat)
|
||||
#define MOVERESULT_BLOCKEDBYAVOIDSPOT 256 //bot is blocked by an avoid spot
|
||||
//
|
||||
#define MAX_AVOIDREACH 1
|
||||
#define MAX_AVOIDSPOTS 32
|
||||
// avoid spot types
|
||||
#define AVOID_CLEAR 0 //clear all avoid spots
|
||||
#define AVOID_ALWAYS 1 //avoid always
|
||||
#define AVOID_DONTBLOCK 2 //never totally block
|
||||
// restult types
|
||||
#define RESULTTYPE_ELEVATORUP 1 //elevator is up
|
||||
#define RESULTTYPE_WAITFORFUNCBOBBING 2 //waiting for func bobbing to arrive
|
||||
#define RESULTTYPE_BADGRAPPLEPATH 4 //grapple path is obstructed
|
||||
#define RESULTTYPE_INSOLIDAREA 8 //stuck in solid area, this is bad
|
||||
|
||||
//structure used to initialize the movement state
|
||||
//the or_moveflags MFL_ONGROUND, MFL_TELEPORTED and MFL_WATERJUMP come from the playerstate
|
||||
typedef struct bot_initmove_s
|
||||
{
|
||||
vec3_t origin; //origin of the bot
|
||||
vec3_t velocity; //velocity of the bot
|
||||
vec3_t viewoffset; //view offset
|
||||
int entitynum; //entity number of the bot
|
||||
int client; //client number of the bot
|
||||
float thinktime; //time the bot thinks
|
||||
int presencetype; //presencetype of the bot
|
||||
vec3_t viewangles; //view angles of the bot
|
||||
int or_moveflags; //values ored to the movement flags
|
||||
} bot_initmove_t;
|
||||
|
||||
//NOTE: the ideal_viewangles are only valid if MFL_MOVEMENTVIEW is set
|
||||
typedef struct bot_moveresult_s
|
||||
{
|
||||
int failure; //true if movement failed all together
|
||||
int type; //failure or blocked type
|
||||
int blocked; //true if blocked by an entity
|
||||
int blockentity; //entity blocking the bot
|
||||
int traveltype; //last executed travel type
|
||||
int flags; //result flags
|
||||
int weapon; //weapon used for movement
|
||||
vec3_t movedir; //movement direction
|
||||
vec3_t ideal_viewangles; //ideal viewangles for the movement
|
||||
} bot_moveresult_t;
|
||||
|
||||
// bk001204: from code/botlib/be_ai_move.c
|
||||
// TTimo 04/12/2001 was moved here to avoid dup defines
|
||||
typedef struct bot_avoidspot_s
|
||||
{
|
||||
vec3_t origin;
|
||||
float radius;
|
||||
int type;
|
||||
} bot_avoidspot_t;
|
||||
|
||||
//resets the whole move state
|
||||
void BotResetMoveState(int movestate);
|
||||
//moves the bot to the given goal
|
||||
void BotMoveToGoal(bot_moveresult_t *result, int movestate, bot_goal_t *goal, int travelflags);
|
||||
//moves the bot in the specified direction using the specified type of movement
|
||||
int BotMoveInDirection(int movestate, vec3_t dir, float speed, int type);
|
||||
//reset avoid reachability
|
||||
void BotResetAvoidReach(int movestate);
|
||||
//resets the last avoid reachability
|
||||
void BotResetLastAvoidReach(int movestate);
|
||||
//returns a reachability area if the origin is in one
|
||||
int BotReachabilityArea(vec3_t origin, int client);
|
||||
//view target based on movement
|
||||
int BotMovementViewTarget(int movestate, bot_goal_t *goal, int travelflags, float lookahead, vec3_t target);
|
||||
//predict the position of a player based on movement towards a goal
|
||||
int BotPredictVisiblePosition(vec3_t origin, int areanum, bot_goal_t *goal, int travelflags, vec3_t target);
|
||||
//returns the handle of a newly allocated movestate
|
||||
int BotAllocMoveState(void);
|
||||
//frees the movestate with the given handle
|
||||
void BotFreeMoveState(int handle);
|
||||
//initialize movement state before performing any movement
|
||||
void BotInitMoveState(int handle, bot_initmove_t *initmove);
|
||||
//add a spot to avoid (if type == AVOID_CLEAR all spots are removed)
|
||||
void BotAddAvoidSpot(int movestate, vec3_t origin, float radius, int type);
|
||||
//must be called every map change
|
||||
void BotSetBrushModelTypes(void);
|
||||
//setup movement AI
|
||||
int BotSetupMoveAI(void);
|
||||
//shutdown movement AI
|
||||
void BotShutdownMoveAI(void);
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_move.h
|
||||
*
|
||||
* desc: movement AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_move.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//movement types
|
||||
#define MOVE_WALK 1
|
||||
#define MOVE_CROUCH 2
|
||||
#define MOVE_JUMP 4
|
||||
#define MOVE_GRAPPLE 8
|
||||
#define MOVE_ROCKETJUMP 16
|
||||
#define MOVE_BFGJUMP 32
|
||||
//move flags
|
||||
#define MFL_BARRIERJUMP 1 //bot is performing a barrier jump
|
||||
#define MFL_ONGROUND 2 //bot is in the ground
|
||||
#define MFL_SWIMMING 4 //bot is swimming
|
||||
#define MFL_AGAINSTLADDER 8 //bot is against a ladder
|
||||
#define MFL_WATERJUMP 16 //bot is waterjumping
|
||||
#define MFL_TELEPORTED 32 //bot is being teleported
|
||||
#define MFL_GRAPPLEPULL 64 //bot is being pulled by the grapple
|
||||
#define MFL_ACTIVEGRAPPLE 128 //bot is using the grapple hook
|
||||
#define MFL_GRAPPLERESET 256 //bot has reset the grapple
|
||||
#define MFL_WALK 512 //bot should walk slowly
|
||||
// move result flags
|
||||
#define MOVERESULT_MOVEMENTVIEW 1 //bot uses view for movement
|
||||
#define MOVERESULT_SWIMVIEW 2 //bot uses view for swimming
|
||||
#define MOVERESULT_WAITING 4 //bot is waiting for something
|
||||
#define MOVERESULT_MOVEMENTVIEWSET 8 //bot has set the view in movement code
|
||||
#define MOVERESULT_MOVEMENTWEAPON 16 //bot uses weapon for movement
|
||||
#define MOVERESULT_ONTOPOFOBSTACLE 32 //bot is ontop of obstacle
|
||||
#define MOVERESULT_ONTOPOF_FUNCBOB 64 //bot is ontop of a func_bobbing
|
||||
#define MOVERESULT_ONTOPOF_ELEVATOR 128 //bot is ontop of an elevator (func_plat)
|
||||
#define MOVERESULT_BLOCKEDBYAVOIDSPOT 256 //bot is blocked by an avoid spot
|
||||
//
|
||||
#define MAX_AVOIDREACH 1
|
||||
#define MAX_AVOIDSPOTS 32
|
||||
// avoid spot types
|
||||
#define AVOID_CLEAR 0 //clear all avoid spots
|
||||
#define AVOID_ALWAYS 1 //avoid always
|
||||
#define AVOID_DONTBLOCK 2 //never totally block
|
||||
// restult types
|
||||
#define RESULTTYPE_ELEVATORUP 1 //elevator is up
|
||||
#define RESULTTYPE_WAITFORFUNCBOBBING 2 //waiting for func bobbing to arrive
|
||||
#define RESULTTYPE_BADGRAPPLEPATH 4 //grapple path is obstructed
|
||||
#define RESULTTYPE_INSOLIDAREA 8 //stuck in solid area, this is bad
|
||||
|
||||
//structure used to initialize the movement state
|
||||
//the or_moveflags MFL_ONGROUND, MFL_TELEPORTED and MFL_WATERJUMP come from the playerstate
|
||||
typedef struct bot_initmove_s
|
||||
{
|
||||
vec3_t origin; //origin of the bot
|
||||
vec3_t velocity; //velocity of the bot
|
||||
vec3_t viewoffset; //view offset
|
||||
int entitynum; //entity number of the bot
|
||||
int client; //client number of the bot
|
||||
float thinktime; //time the bot thinks
|
||||
int presencetype; //presencetype of the bot
|
||||
vec3_t viewangles; //view angles of the bot
|
||||
int or_moveflags; //values ored to the movement flags
|
||||
} bot_initmove_t;
|
||||
|
||||
//NOTE: the ideal_viewangles are only valid if MFL_MOVEMENTVIEW is set
|
||||
typedef struct bot_moveresult_s
|
||||
{
|
||||
int failure; //true if movement failed all together
|
||||
int type; //failure or blocked type
|
||||
int blocked; //true if blocked by an entity
|
||||
int blockentity; //entity blocking the bot
|
||||
int traveltype; //last executed travel type
|
||||
int flags; //result flags
|
||||
int weapon; //weapon used for movement
|
||||
vec3_t movedir; //movement direction
|
||||
vec3_t ideal_viewangles; //ideal viewangles for the movement
|
||||
} bot_moveresult_t;
|
||||
|
||||
// bk001204: from code/botlib/be_ai_move.c
|
||||
// TTimo 04/12/2001 was moved here to avoid dup defines
|
||||
typedef struct bot_avoidspot_s
|
||||
{
|
||||
vec3_t origin;
|
||||
float radius;
|
||||
int type;
|
||||
} bot_avoidspot_t;
|
||||
|
||||
//resets the whole move state
|
||||
void BotResetMoveState(int movestate);
|
||||
//moves the bot to the given goal
|
||||
void BotMoveToGoal(bot_moveresult_t *result, int movestate, bot_goal_t *goal, int travelflags);
|
||||
//moves the bot in the specified direction using the specified type of movement
|
||||
int BotMoveInDirection(int movestate, vec3_t dir, float speed, int type);
|
||||
//reset avoid reachability
|
||||
void BotResetAvoidReach(int movestate);
|
||||
//resets the last avoid reachability
|
||||
void BotResetLastAvoidReach(int movestate);
|
||||
//returns a reachability area if the origin is in one
|
||||
int BotReachabilityArea(vec3_t origin, int client);
|
||||
//view target based on movement
|
||||
int BotMovementViewTarget(int movestate, bot_goal_t *goal, int travelflags, float lookahead, vec3_t target);
|
||||
//predict the position of a player based on movement towards a goal
|
||||
int BotPredictVisiblePosition(vec3_t origin, int areanum, bot_goal_t *goal, int travelflags, vec3_t target);
|
||||
//returns the handle of a newly allocated movestate
|
||||
int BotAllocMoveState(void);
|
||||
//frees the movestate with the given handle
|
||||
void BotFreeMoveState(int handle);
|
||||
//initialize movement state before performing any movement
|
||||
void BotInitMoveState(int handle, bot_initmove_t *initmove);
|
||||
//add a spot to avoid (if type == AVOID_CLEAR all spots are removed)
|
||||
void BotAddAvoidSpot(int movestate, vec3_t origin, float radius, int type);
|
||||
//must be called every map change
|
||||
void BotSetBrushModelTypes(void);
|
||||
//setup movement AI
|
||||
int BotSetupMoveAI(void);
|
||||
//shutdown movement AI
|
||||
void BotShutdownMoveAI(void);
|
||||
|
||||
|
|
208
code/game/be_ai_weap.h
Normal file → Executable file
208
code/game/be_ai_weap.h
Normal file → Executable file
|
@ -1,104 +1,104 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_weap.h
|
||||
*
|
||||
* desc: weapon AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_weap.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//projectile flags
|
||||
#define PFL_WINDOWDAMAGE 1 //projectile damages through window
|
||||
#define PFL_RETURN 2 //set when projectile returns to owner
|
||||
//weapon flags
|
||||
#define WFL_FIRERELEASED 1 //set when projectile is fired with key-up event
|
||||
//damage types
|
||||
#define DAMAGETYPE_IMPACT 1 //damage on impact
|
||||
#define DAMAGETYPE_RADIAL 2 //radial damage
|
||||
#define DAMAGETYPE_VISIBLE 4 //damage to all entities visible to the projectile
|
||||
|
||||
typedef struct projectileinfo_s
|
||||
{
|
||||
char name[MAX_STRINGFIELD];
|
||||
char model[MAX_STRINGFIELD];
|
||||
int flags;
|
||||
float gravity;
|
||||
int damage;
|
||||
float radius;
|
||||
int visdamage;
|
||||
int damagetype;
|
||||
int healthinc;
|
||||
float push;
|
||||
float detonation;
|
||||
float bounce;
|
||||
float bouncefric;
|
||||
float bouncestop;
|
||||
} projectileinfo_t;
|
||||
|
||||
typedef struct weaponinfo_s
|
||||
{
|
||||
int valid; //true if the weapon info is valid
|
||||
int number; //number of the weapon
|
||||
char name[MAX_STRINGFIELD];
|
||||
char model[MAX_STRINGFIELD];
|
||||
int level;
|
||||
int weaponindex;
|
||||
int flags;
|
||||
char projectile[MAX_STRINGFIELD];
|
||||
int numprojectiles;
|
||||
float hspread;
|
||||
float vspread;
|
||||
float speed;
|
||||
float acceleration;
|
||||
vec3_t recoil;
|
||||
vec3_t offset;
|
||||
vec3_t angleoffset;
|
||||
float extrazvelocity;
|
||||
int ammoamount;
|
||||
int ammoindex;
|
||||
float activate;
|
||||
float reload;
|
||||
float spinup;
|
||||
float spindown;
|
||||
projectileinfo_t proj; //pointer to the used projectile
|
||||
} weaponinfo_t;
|
||||
|
||||
//setup the weapon AI
|
||||
int BotSetupWeaponAI(void);
|
||||
//shut down the weapon AI
|
||||
void BotShutdownWeaponAI(void);
|
||||
//returns the best weapon to fight with
|
||||
int BotChooseBestFightWeapon(int weaponstate, int *inventory);
|
||||
//returns the information of the current weapon
|
||||
void BotGetWeaponInfo(int weaponstate, int weapon, weaponinfo_t *weaponinfo);
|
||||
//loads the weapon weights
|
||||
int BotLoadWeaponWeights(int weaponstate, char *filename);
|
||||
//returns a handle to a newly allocated weapon state
|
||||
int BotAllocWeaponState(void);
|
||||
//frees the weapon state
|
||||
void BotFreeWeaponState(int weaponstate);
|
||||
//resets the whole weapon state
|
||||
void BotResetWeaponState(int weaponstate);
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ai_weap.h
|
||||
*
|
||||
* desc: weapon AI
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ai_weap.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//projectile flags
|
||||
#define PFL_WINDOWDAMAGE 1 //projectile damages through window
|
||||
#define PFL_RETURN 2 //set when projectile returns to owner
|
||||
//weapon flags
|
||||
#define WFL_FIRERELEASED 1 //set when projectile is fired with key-up event
|
||||
//damage types
|
||||
#define DAMAGETYPE_IMPACT 1 //damage on impact
|
||||
#define DAMAGETYPE_RADIAL 2 //radial damage
|
||||
#define DAMAGETYPE_VISIBLE 4 //damage to all entities visible to the projectile
|
||||
|
||||
typedef struct projectileinfo_s
|
||||
{
|
||||
char name[MAX_STRINGFIELD];
|
||||
char model[MAX_STRINGFIELD];
|
||||
int flags;
|
||||
float gravity;
|
||||
int damage;
|
||||
float radius;
|
||||
int visdamage;
|
||||
int damagetype;
|
||||
int healthinc;
|
||||
float push;
|
||||
float detonation;
|
||||
float bounce;
|
||||
float bouncefric;
|
||||
float bouncestop;
|
||||
} projectileinfo_t;
|
||||
|
||||
typedef struct weaponinfo_s
|
||||
{
|
||||
int valid; //true if the weapon info is valid
|
||||
int number; //number of the weapon
|
||||
char name[MAX_STRINGFIELD];
|
||||
char model[MAX_STRINGFIELD];
|
||||
int level;
|
||||
int weaponindex;
|
||||
int flags;
|
||||
char projectile[MAX_STRINGFIELD];
|
||||
int numprojectiles;
|
||||
float hspread;
|
||||
float vspread;
|
||||
float speed;
|
||||
float acceleration;
|
||||
vec3_t recoil;
|
||||
vec3_t offset;
|
||||
vec3_t angleoffset;
|
||||
float extrazvelocity;
|
||||
int ammoamount;
|
||||
int ammoindex;
|
||||
float activate;
|
||||
float reload;
|
||||
float spinup;
|
||||
float spindown;
|
||||
projectileinfo_t proj; //pointer to the used projectile
|
||||
} weaponinfo_t;
|
||||
|
||||
//setup the weapon AI
|
||||
int BotSetupWeaponAI(void);
|
||||
//shut down the weapon AI
|
||||
void BotShutdownWeaponAI(void);
|
||||
//returns the best weapon to fight with
|
||||
int BotChooseBestFightWeapon(int weaponstate, int *inventory);
|
||||
//returns the information of the current weapon
|
||||
void BotGetWeaponInfo(int weaponstate, int weapon, weaponinfo_t *weaponinfo);
|
||||
//loads the weapon weights
|
||||
int BotLoadWeaponWeights(int weaponstate, char *filename);
|
||||
//returns a handle to a newly allocated weapon state
|
||||
int BotAllocWeaponState(void);
|
||||
//frees the weapon state
|
||||
void BotFreeWeaponState(int weaponstate);
|
||||
//resets the whole weapon state
|
||||
void BotResetWeaponState(int weaponstate);
|
||||
|
|
132
code/game/be_ea.h
Normal file → Executable file
132
code/game/be_ea.h
Normal file → Executable file
|
@ -1,66 +1,66 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ea.h
|
||||
*
|
||||
* desc: elementary actions
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ea.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//ClientCommand elementary actions
|
||||
void EA_Say(int client, char *str);
|
||||
void EA_SayTeam(int client, char *str);
|
||||
void EA_Command(int client, char *command );
|
||||
|
||||
void EA_Action(int client, int action);
|
||||
void EA_Crouch(int client);
|
||||
void EA_Walk(int client);
|
||||
void EA_MoveUp(int client);
|
||||
void EA_MoveDown(int client);
|
||||
void EA_MoveForward(int client);
|
||||
void EA_MoveBack(int client);
|
||||
void EA_MoveLeft(int client);
|
||||
void EA_MoveRight(int client);
|
||||
void EA_Attack(int client);
|
||||
void EA_Respawn(int client);
|
||||
void EA_Talk(int client);
|
||||
void EA_Gesture(int client);
|
||||
void EA_Use(int client);
|
||||
|
||||
//regular elementary actions
|
||||
void EA_SelectWeapon(int client, int weapon);
|
||||
void EA_Jump(int client);
|
||||
void EA_DelayedJump(int client);
|
||||
void EA_Move(int client, vec3_t dir, float speed);
|
||||
void EA_View(int client, vec3_t viewangles);
|
||||
|
||||
//send regular input to the server
|
||||
void EA_EndRegular(int client, float thinktime);
|
||||
void EA_GetInput(int client, float thinktime, bot_input_t *input);
|
||||
void EA_ResetInput(int client);
|
||||
//setup and shutdown routines
|
||||
int EA_Setup(void);
|
||||
void EA_Shutdown(void);
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
/*****************************************************************************
|
||||
* name: be_ea.h
|
||||
*
|
||||
* desc: elementary actions
|
||||
*
|
||||
* $Archive: /source/code/botlib/be_ea.h $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//ClientCommand elementary actions
|
||||
void EA_Say(int client, char *str);
|
||||
void EA_SayTeam(int client, char *str);
|
||||
void EA_Command(int client, char *command );
|
||||
|
||||
void EA_Action(int client, int action);
|
||||
void EA_Crouch(int client);
|
||||
void EA_Walk(int client);
|
||||
void EA_MoveUp(int client);
|
||||
void EA_MoveDown(int client);
|
||||
void EA_MoveForward(int client);
|
||||
void EA_MoveBack(int client);
|
||||
void EA_MoveLeft(int client);
|
||||
void EA_MoveRight(int client);
|
||||
void EA_Attack(int client);
|
||||
void EA_Respawn(int client);
|
||||
void EA_Talk(int client);
|
||||
void EA_Gesture(int client);
|
||||
void EA_Use(int client);
|
||||
|
||||
//regular elementary actions
|
||||
void EA_SelectWeapon(int client, int weapon);
|
||||
void EA_Jump(int client);
|
||||
void EA_DelayedJump(int client);
|
||||
void EA_Move(int client, vec3_t dir, float speed);
|
||||
void EA_View(int client, vec3_t viewangles);
|
||||
|
||||
//send regular input to the server
|
||||
void EA_EndRegular(int client, float thinktime);
|
||||
void EA_GetInput(int client, float thinktime, bot_input_t *input);
|
||||
void EA_ResetInput(int client);
|
||||
//setup and shutdown routines
|
||||
int EA_Setup(void);
|
||||
void EA_Shutdown(void);
|
||||
|
|
2648
code/game/bg_lib.c
Normal file → Executable file
2648
code/game/bg_lib.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
182
code/game/bg_lib.h
Normal file → Executable file
182
code/game/bg_lib.h
Normal file → Executable file
|
@ -1,91 +1,91 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
// bg_lib.h -- standard C library replacement routines used by code
|
||||
// compiled for the virtual machine
|
||||
|
||||
// This file is NOT included on native builds
|
||||
|
||||
typedef int size_t;
|
||||
|
||||
typedef char * va_list;
|
||||
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
|
||||
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
|
||||
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
|
||||
#define va_end(ap) ( ap = (va_list)0 )
|
||||
|
||||
#define CHAR_BIT 8 /* number of bits in a char */
|
||||
#define SCHAR_MIN (-128) /* minimum signed char value */
|
||||
#define SCHAR_MAX 127 /* maximum signed char value */
|
||||
#define UCHAR_MAX 0xff /* maximum unsigned char value */
|
||||
|
||||
#define SHRT_MIN (-32768) /* minimum (signed) short value */
|
||||
#define SHRT_MAX 32767 /* maximum (signed) short value */
|
||||
#define USHRT_MAX 0xffff /* maximum unsigned short value */
|
||||
#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */
|
||||
#define INT_MAX 2147483647 /* maximum (signed) int value */
|
||||
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
|
||||
#define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */
|
||||
#define LONG_MAX 2147483647L /* maximum (signed) long value */
|
||||
#define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */
|
||||
|
||||
// Misc functions
|
||||
typedef int cmp_t(const void *, const void *);
|
||||
void qsort(void *a, size_t n, size_t es, cmp_t *cmp);
|
||||
void srand( unsigned seed );
|
||||
int rand( void );
|
||||
|
||||
// String functions
|
||||
size_t strlen( const char *string );
|
||||
char *strcat( char *strDestination, const char *strSource );
|
||||
char *strcpy( char *strDestination, const char *strSource );
|
||||
int strcmp( const char *string1, const char *string2 );
|
||||
char *strchr( const char *string, int c );
|
||||
char *strstr( const char *string, const char *strCharSet );
|
||||
char *strncpy( char *strDest, const char *strSource, size_t count );
|
||||
int tolower( int c );
|
||||
int toupper( int c );
|
||||
|
||||
double atof( const char *string );
|
||||
double _atof( const char **stringPtr );
|
||||
int atoi( const char *string );
|
||||
int _atoi( const char **stringPtr );
|
||||
|
||||
int vsprintf( char *buffer, const char *fmt, va_list argptr );
|
||||
int sscanf( const char *buffer, const char *fmt, ... );
|
||||
|
||||
// Memory functions
|
||||
void *memmove( void *dest, const void *src, size_t count );
|
||||
void *memset( void *dest, int c, size_t count );
|
||||
void *memcpy( void *dest, const void *src, size_t count );
|
||||
|
||||
// Math functions
|
||||
double ceil( double x );
|
||||
double floor( double x );
|
||||
double sqrt( double x );
|
||||
double sin( double x );
|
||||
double cos( double x );
|
||||
double atan2( double y, double x );
|
||||
double tan( double x );
|
||||
int abs( int n );
|
||||
double fabs( double x );
|
||||
double acos( double x );
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
// bg_lib.h -- standard C library replacement routines used by code
|
||||
// compiled for the virtual machine
|
||||
|
||||
// This file is NOT included on native builds
|
||||
|
||||
typedef int size_t;
|
||||
|
||||
typedef char * va_list;
|
||||
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
|
||||
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
|
||||
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
|
||||
#define va_end(ap) ( ap = (va_list)0 )
|
||||
|
||||
#define CHAR_BIT 8 /* number of bits in a char */
|
||||
#define SCHAR_MIN (-128) /* minimum signed char value */
|
||||
#define SCHAR_MAX 127 /* maximum signed char value */
|
||||
#define UCHAR_MAX 0xff /* maximum unsigned char value */
|
||||
|
||||
#define SHRT_MIN (-32768) /* minimum (signed) short value */
|
||||
#define SHRT_MAX 32767 /* maximum (signed) short value */
|
||||
#define USHRT_MAX 0xffff /* maximum unsigned short value */
|
||||
#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */
|
||||
#define INT_MAX 2147483647 /* maximum (signed) int value */
|
||||
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
|
||||
#define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */
|
||||
#define LONG_MAX 2147483647L /* maximum (signed) long value */
|
||||
#define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */
|
||||
|
||||
// Misc functions
|
||||
typedef int cmp_t(const void *, const void *);
|
||||
void qsort(void *a, size_t n, size_t es, cmp_t *cmp);
|
||||
void srand( unsigned seed );
|
||||
int rand( void );
|
||||
|
||||
// String functions
|
||||
size_t strlen( const char *string );
|
||||
char *strcat( char *strDestination, const char *strSource );
|
||||
char *strcpy( char *strDestination, const char *strSource );
|
||||
int strcmp( const char *string1, const char *string2 );
|
||||
char *strchr( const char *string, int c );
|
||||
char *strstr( const char *string, const char *strCharSet );
|
||||
char *strncpy( char *strDest, const char *strSource, size_t count );
|
||||
int tolower( int c );
|
||||
int toupper( int c );
|
||||
|
||||
double atof( const char *string );
|
||||
double _atof( const char **stringPtr );
|
||||
int atoi( const char *string );
|
||||
int _atoi( const char **stringPtr );
|
||||
|
||||
int vsprintf( char *buffer, const char *fmt, va_list argptr );
|
||||
int sscanf( const char *buffer, const char *fmt, ... );
|
||||
|
||||
// Memory functions
|
||||
void *memmove( void *dest, const void *src, size_t count );
|
||||
void *memset( void *dest, int c, size_t count );
|
||||
void *memcpy( void *dest, const void *src, size_t count );
|
||||
|
||||
// Math functions
|
||||
double ceil( double x );
|
||||
double floor( double x );
|
||||
double sqrt( double x );
|
||||
double sin( double x );
|
||||
double cos( double x );
|
||||
double atan2( double y, double x );
|
||||
double tan( double x );
|
||||
int abs( int n );
|
||||
double fabs( double x );
|
||||
double acos( double x );
|
||||
|
||||
|
|
166
code/game/bg_local.h
Normal file → Executable file
166
code/game/bg_local.h
Normal file → Executable file
|
@ -1,83 +1,83 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// bg_local.h -- local definitions for the bg (both games) files
|
||||
|
||||
#define MIN_WALK_NORMAL 0.7f // can't walk on very steep slopes
|
||||
|
||||
#define STEPSIZE 18
|
||||
|
||||
#define JUMP_VELOCITY 270
|
||||
|
||||
#define TIMER_LAND 130
|
||||
#define TIMER_GESTURE (34*66+50)
|
||||
|
||||
#define OVERCLIP 1.001f
|
||||
|
||||
// all of the locals will be zeroed before each
|
||||
// pmove, just to make damn sure we don't have
|
||||
// any differences when running on client or server
|
||||
typedef struct {
|
||||
vec3_t forward, right, up;
|
||||
float frametime;
|
||||
|
||||
int msec;
|
||||
|
||||
qboolean walking;
|
||||
qboolean groundPlane;
|
||||
trace_t groundTrace;
|
||||
|
||||
float impactSpeed;
|
||||
|
||||
vec3_t previous_origin;
|
||||
vec3_t previous_velocity;
|
||||
int previous_waterlevel;
|
||||
} pml_t;
|
||||
|
||||
extern pmove_t *pm;
|
||||
extern pml_t pml;
|
||||
|
||||
// movement parameters
|
||||
extern float pm_stopspeed;
|
||||
extern float pm_duckScale;
|
||||
extern float pm_swimScale;
|
||||
extern float pm_wadeScale;
|
||||
|
||||
extern float pm_accelerate;
|
||||
extern float pm_airaccelerate;
|
||||
extern float pm_wateraccelerate;
|
||||
extern float pm_flyaccelerate;
|
||||
|
||||
extern float pm_friction;
|
||||
extern float pm_waterfriction;
|
||||
extern float pm_flightfriction;
|
||||
|
||||
extern int c_pmove;
|
||||
|
||||
void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce );
|
||||
void PM_AddTouchEnt( int entityNum );
|
||||
void PM_AddEvent( int newEvent );
|
||||
|
||||
qboolean PM_SlideMove( qboolean gravity );
|
||||
void PM_StepSlideMove( qboolean gravity );
|
||||
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// bg_local.h -- local definitions for the bg (both games) files
|
||||
|
||||
#define MIN_WALK_NORMAL 0.7f // can't walk on very steep slopes
|
||||
|
||||
#define STEPSIZE 18
|
||||
|
||||
#define JUMP_VELOCITY 270
|
||||
|
||||
#define TIMER_LAND 130
|
||||
#define TIMER_GESTURE (34*66+50)
|
||||
|
||||
#define OVERCLIP 1.001f
|
||||
|
||||
// all of the locals will be zeroed before each
|
||||
// pmove, just to make damn sure we don't have
|
||||
// any differences when running on client or server
|
||||
typedef struct {
|
||||
vec3_t forward, right, up;
|
||||
float frametime;
|
||||
|
||||
int msec;
|
||||
|
||||
qboolean walking;
|
||||
qboolean groundPlane;
|
||||
trace_t groundTrace;
|
||||
|
||||
float impactSpeed;
|
||||
|
||||
vec3_t previous_origin;
|
||||
vec3_t previous_velocity;
|
||||
int previous_waterlevel;
|
||||
} pml_t;
|
||||
|
||||
extern pmove_t *pm;
|
||||
extern pml_t pml;
|
||||
|
||||
// movement parameters
|
||||
extern float pm_stopspeed;
|
||||
extern float pm_duckScale;
|
||||
extern float pm_swimScale;
|
||||
extern float pm_wadeScale;
|
||||
|
||||
extern float pm_accelerate;
|
||||
extern float pm_airaccelerate;
|
||||
extern float pm_wateraccelerate;
|
||||
extern float pm_flyaccelerate;
|
||||
|
||||
extern float pm_friction;
|
||||
extern float pm_waterfriction;
|
||||
extern float pm_flightfriction;
|
||||
|
||||
extern int c_pmove;
|
||||
|
||||
void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce );
|
||||
void PM_AddTouchEnt( int entityNum );
|
||||
void PM_AddEvent( int newEvent );
|
||||
|
||||
qboolean PM_SlideMove( qboolean gravity );
|
||||
void PM_StepSlideMove( qboolean gravity );
|
||||
|
||||
|
||||
|
|
3208
code/game/bg_misc.c
Normal file → Executable file
3208
code/game/bg_misc.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
4138
code/game/bg_pmove.c
Normal file → Executable file
4138
code/game/bg_pmove.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
1476
code/game/bg_public.h
Normal file → Executable file
1476
code/game/bg_public.h
Normal file → Executable file
File diff suppressed because it is too large
Load diff
650
code/game/bg_slidemove.c
Normal file → Executable file
650
code/game/bg_slidemove.c
Normal file → Executable file
|
@ -1,325 +1,325 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// bg_slidemove.c -- part of bg_pmove functionality
|
||||
|
||||
#include "q_shared.h"
|
||||
#include "bg_public.h"
|
||||
#include "bg_local.h"
|
||||
|
||||
/*
|
||||
|
||||
input: origin, velocity, bounds, groundPlane, trace function
|
||||
|
||||
output: origin, velocity, impacts, stairup boolean
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
==================
|
||||
PM_SlideMove
|
||||
|
||||
Returns qtrue if the velocity was clipped in some way
|
||||
==================
|
||||
*/
|
||||
#define MAX_CLIP_PLANES 5
|
||||
qboolean PM_SlideMove( qboolean gravity ) {
|
||||
int bumpcount, numbumps;
|
||||
vec3_t dir;
|
||||
float d;
|
||||
int numplanes;
|
||||
vec3_t planes[MAX_CLIP_PLANES];
|
||||
vec3_t primal_velocity;
|
||||
vec3_t clipVelocity;
|
||||
int i, j, k;
|
||||
trace_t trace;
|
||||
vec3_t end;
|
||||
float time_left;
|
||||
float into;
|
||||
vec3_t endVelocity;
|
||||
vec3_t endClipVelocity;
|
||||
|
||||
numbumps = 4;
|
||||
|
||||
VectorCopy (pm->ps->velocity, primal_velocity);
|
||||
|
||||
if ( gravity ) {
|
||||
VectorCopy( pm->ps->velocity, endVelocity );
|
||||
endVelocity[2] -= pm->ps->gravity * pml.frametime;
|
||||
pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5;
|
||||
primal_velocity[2] = endVelocity[2];
|
||||
if ( pml.groundPlane ) {
|
||||
// slide along the ground plane
|
||||
PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal,
|
||||
pm->ps->velocity, OVERCLIP );
|
||||
}
|
||||
}
|
||||
|
||||
time_left = pml.frametime;
|
||||
|
||||
// never turn against the ground plane
|
||||
if ( pml.groundPlane ) {
|
||||
numplanes = 1;
|
||||
VectorCopy( pml.groundTrace.plane.normal, planes[0] );
|
||||
} else {
|
||||
numplanes = 0;
|
||||
}
|
||||
|
||||
// never turn against original velocity
|
||||
VectorNormalize2( pm->ps->velocity, planes[numplanes] );
|
||||
numplanes++;
|
||||
|
||||
for ( bumpcount=0 ; bumpcount < numbumps ; bumpcount++ ) {
|
||||
|
||||
// calculate position we are trying to move to
|
||||
VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end );
|
||||
|
||||
// see if we can make it there
|
||||
pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask);
|
||||
|
||||
if (trace.allsolid) {
|
||||
// entity is completely trapped in another solid
|
||||
pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
if (trace.fraction > 0) {
|
||||
// actually covered some distance
|
||||
VectorCopy (trace.endpos, pm->ps->origin);
|
||||
}
|
||||
|
||||
if (trace.fraction == 1) {
|
||||
break; // moved the entire distance
|
||||
}
|
||||
|
||||
// save entity for contact
|
||||
PM_AddTouchEnt( trace.entityNum );
|
||||
|
||||
time_left -= time_left * trace.fraction;
|
||||
|
||||
if (numplanes >= MAX_CLIP_PLANES) {
|
||||
// this shouldn't really happen
|
||||
VectorClear( pm->ps->velocity );
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
//
|
||||
// if this is the same plane we hit before, nudge velocity
|
||||
// out along it, which fixes some epsilon issues with
|
||||
// non-axial planes
|
||||
//
|
||||
for ( i = 0 ; i < numplanes ; i++ ) {
|
||||
if ( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) {
|
||||
VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i < numplanes ) {
|
||||
continue;
|
||||
}
|
||||
VectorCopy (trace.plane.normal, planes[numplanes]);
|
||||
numplanes++;
|
||||
|
||||
//
|
||||
// modify velocity so it parallels all of the clip planes
|
||||
//
|
||||
|
||||
// find a plane that it enters
|
||||
for ( i = 0 ; i < numplanes ; i++ ) {
|
||||
into = DotProduct( pm->ps->velocity, planes[i] );
|
||||
if ( into >= 0.1 ) {
|
||||
continue; // move doesn't interact with the plane
|
||||
}
|
||||
|
||||
// see how hard we are hitting things
|
||||
if ( -into > pml.impactSpeed ) {
|
||||
pml.impactSpeed = -into;
|
||||
}
|
||||
|
||||
// slide along the plane
|
||||
PM_ClipVelocity (pm->ps->velocity, planes[i], clipVelocity, OVERCLIP );
|
||||
|
||||
// slide along the plane
|
||||
PM_ClipVelocity (endVelocity, planes[i], endClipVelocity, OVERCLIP );
|
||||
|
||||
// see if there is a second plane that the new move enters
|
||||
for ( j = 0 ; j < numplanes ; j++ ) {
|
||||
if ( j == i ) {
|
||||
continue;
|
||||
}
|
||||
if ( DotProduct( clipVelocity, planes[j] ) >= 0.1 ) {
|
||||
continue; // move doesn't interact with the plane
|
||||
}
|
||||
|
||||
// try clipping the move to the plane
|
||||
PM_ClipVelocity( clipVelocity, planes[j], clipVelocity, OVERCLIP );
|
||||
PM_ClipVelocity( endClipVelocity, planes[j], endClipVelocity, OVERCLIP );
|
||||
|
||||
// see if it goes back into the first clip plane
|
||||
if ( DotProduct( clipVelocity, planes[i] ) >= 0 ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// slide the original velocity along the crease
|
||||
CrossProduct (planes[i], planes[j], dir);
|
||||
VectorNormalize( dir );
|
||||
d = DotProduct( dir, pm->ps->velocity );
|
||||
VectorScale( dir, d, clipVelocity );
|
||||
|
||||
CrossProduct (planes[i], planes[j], dir);
|
||||
VectorNormalize( dir );
|
||||
d = DotProduct( dir, endVelocity );
|
||||
VectorScale( dir, d, endClipVelocity );
|
||||
|
||||
// see if there is a third plane the the new move enters
|
||||
for ( k = 0 ; k < numplanes ; k++ ) {
|
||||
if ( k == i || k == j ) {
|
||||
continue;
|
||||
}
|
||||
if ( DotProduct( clipVelocity, planes[k] ) >= 0.1 ) {
|
||||
continue; // move doesn't interact with the plane
|
||||
}
|
||||
|
||||
// stop dead at a tripple plane interaction
|
||||
VectorClear( pm->ps->velocity );
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
// if we have fixed all interactions, try another move
|
||||
VectorCopy( clipVelocity, pm->ps->velocity );
|
||||
VectorCopy( endClipVelocity, endVelocity );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( gravity ) {
|
||||
VectorCopy( endVelocity, pm->ps->velocity );
|
||||
}
|
||||
|
||||
// don't change velocity if in a timer (FIXME: is this correct?)
|
||||
if ( pm->ps->pm_time ) {
|
||||
VectorCopy( primal_velocity, pm->ps->velocity );
|
||||
}
|
||||
|
||||
return ( bumpcount != 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
PM_StepSlideMove
|
||||
|
||||
==================
|
||||
*/
|
||||
void PM_StepSlideMove( qboolean gravity ) {
|
||||
vec3_t start_o, start_v;
|
||||
vec3_t down_o, down_v;
|
||||
trace_t trace;
|
||||
// float down_dist, up_dist;
|
||||
// vec3_t delta, delta2;
|
||||
vec3_t up, down;
|
||||
float stepSize;
|
||||
|
||||
VectorCopy (pm->ps->origin, start_o);
|
||||
VectorCopy (pm->ps->velocity, start_v);
|
||||
|
||||
if ( PM_SlideMove( gravity ) == 0 ) {
|
||||
return; // we got exactly where we wanted to go first try
|
||||
}
|
||||
|
||||
VectorCopy(start_o, down);
|
||||
down[2] -= STEPSIZE;
|
||||
pm->trace (&trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
||||
VectorSet(up, 0, 0, 1);
|
||||
// never step up when you still have up velocity
|
||||
if ( pm->ps->velocity[2] > 0 && (trace.fraction == 1.0 ||
|
||||
DotProduct(trace.plane.normal, up) < 0.7)) {
|
||||
return;
|
||||
}
|
||||
|
||||
VectorCopy (pm->ps->origin, down_o);
|
||||
VectorCopy (pm->ps->velocity, down_v);
|
||||
|
||||
VectorCopy (start_o, up);
|
||||
up[2] += STEPSIZE;
|
||||
|
||||
// test the player position if they were a stepheight higher
|
||||
pm->trace (&trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask);
|
||||
if ( trace.allsolid ) {
|
||||
if ( pm->debugLevel ) {
|
||||
Com_Printf("%i:bend can't step\n", c_pmove);
|
||||
}
|
||||
return; // can't step up
|
||||
}
|
||||
|
||||
stepSize = trace.endpos[2] - start_o[2];
|
||||
// try slidemove from this position
|
||||
VectorCopy (trace.endpos, pm->ps->origin);
|
||||
VectorCopy (start_v, pm->ps->velocity);
|
||||
|
||||
PM_SlideMove( gravity );
|
||||
|
||||
// push down the final amount
|
||||
VectorCopy (pm->ps->origin, down);
|
||||
down[2] -= stepSize;
|
||||
pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
||||
if ( !trace.allsolid ) {
|
||||
VectorCopy (trace.endpos, pm->ps->origin);
|
||||
}
|
||||
if ( trace.fraction < 1.0 ) {
|
||||
PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP );
|
||||
}
|
||||
|
||||
#if 0
|
||||
// if the down trace can trace back to the original position directly, don't step
|
||||
pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, start_o, pm->ps->clientNum, pm->tracemask);
|
||||
if ( trace.fraction == 1.0 ) {
|
||||
// use the original move
|
||||
VectorCopy (down_o, pm->ps->origin);
|
||||
VectorCopy (down_v, pm->ps->velocity);
|
||||
if ( pm->debugLevel ) {
|
||||
Com_Printf("%i:bend\n", c_pmove);
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
// use the step move
|
||||
float delta;
|
||||
|
||||
delta = pm->ps->origin[2] - start_o[2];
|
||||
if ( delta > 2 ) {
|
||||
if ( delta < 7 ) {
|
||||
PM_AddEvent( EV_STEP_4 );
|
||||
} else if ( delta < 11 ) {
|
||||
PM_AddEvent( EV_STEP_8 );
|
||||
} else if ( delta < 15 ) {
|
||||
PM_AddEvent( EV_STEP_12 );
|
||||
} else {
|
||||
PM_AddEvent( EV_STEP_16 );
|
||||
}
|
||||
}
|
||||
if ( pm->debugLevel ) {
|
||||
Com_Printf("%i:stepped\n", c_pmove);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// bg_slidemove.c -- part of bg_pmove functionality
|
||||
|
||||
#include "q_shared.h"
|
||||
#include "bg_public.h"
|
||||
#include "bg_local.h"
|
||||
|
||||
/*
|
||||
|
||||
input: origin, velocity, bounds, groundPlane, trace function
|
||||
|
||||
output: origin, velocity, impacts, stairup boolean
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
==================
|
||||
PM_SlideMove
|
||||
|
||||
Returns qtrue if the velocity was clipped in some way
|
||||
==================
|
||||
*/
|
||||
#define MAX_CLIP_PLANES 5
|
||||
qboolean PM_SlideMove( qboolean gravity ) {
|
||||
int bumpcount, numbumps;
|
||||
vec3_t dir;
|
||||
float d;
|
||||
int numplanes;
|
||||
vec3_t planes[MAX_CLIP_PLANES];
|
||||
vec3_t primal_velocity;
|
||||
vec3_t clipVelocity;
|
||||
int i, j, k;
|
||||
trace_t trace;
|
||||
vec3_t end;
|
||||
float time_left;
|
||||
float into;
|
||||
vec3_t endVelocity;
|
||||
vec3_t endClipVelocity;
|
||||
|
||||
numbumps = 4;
|
||||
|
||||
VectorCopy (pm->ps->velocity, primal_velocity);
|
||||
|
||||
if ( gravity ) {
|
||||
VectorCopy( pm->ps->velocity, endVelocity );
|
||||
endVelocity[2] -= pm->ps->gravity * pml.frametime;
|
||||
pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5;
|
||||
primal_velocity[2] = endVelocity[2];
|
||||
if ( pml.groundPlane ) {
|
||||
// slide along the ground plane
|
||||
PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal,
|
||||
pm->ps->velocity, OVERCLIP );
|
||||
}
|
||||
}
|
||||
|
||||
time_left = pml.frametime;
|
||||
|
||||
// never turn against the ground plane
|
||||
if ( pml.groundPlane ) {
|
||||
numplanes = 1;
|
||||
VectorCopy( pml.groundTrace.plane.normal, planes[0] );
|
||||
} else {
|
||||
numplanes = 0;
|
||||
}
|
||||
|
||||
// never turn against original velocity
|
||||
VectorNormalize2( pm->ps->velocity, planes[numplanes] );
|
||||
numplanes++;
|
||||
|
||||
for ( bumpcount=0 ; bumpcount < numbumps ; bumpcount++ ) {
|
||||
|
||||
// calculate position we are trying to move to
|
||||
VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end );
|
||||
|
||||
// see if we can make it there
|
||||
pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask);
|
||||
|
||||
if (trace.allsolid) {
|
||||
// entity is completely trapped in another solid
|
||||
pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
if (trace.fraction > 0) {
|
||||
// actually covered some distance
|
||||
VectorCopy (trace.endpos, pm->ps->origin);
|
||||
}
|
||||
|
||||
if (trace.fraction == 1) {
|
||||
break; // moved the entire distance
|
||||
}
|
||||
|
||||
// save entity for contact
|
||||
PM_AddTouchEnt( trace.entityNum );
|
||||
|
||||
time_left -= time_left * trace.fraction;
|
||||
|
||||
if (numplanes >= MAX_CLIP_PLANES) {
|
||||
// this shouldn't really happen
|
||||
VectorClear( pm->ps->velocity );
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
//
|
||||
// if this is the same plane we hit before, nudge velocity
|
||||
// out along it, which fixes some epsilon issues with
|
||||
// non-axial planes
|
||||
//
|
||||
for ( i = 0 ; i < numplanes ; i++ ) {
|
||||
if ( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) {
|
||||
VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i < numplanes ) {
|
||||
continue;
|
||||
}
|
||||
VectorCopy (trace.plane.normal, planes[numplanes]);
|
||||
numplanes++;
|
||||
|
||||
//
|
||||
// modify velocity so it parallels all of the clip planes
|
||||
//
|
||||
|
||||
// find a plane that it enters
|
||||
for ( i = 0 ; i < numplanes ; i++ ) {
|
||||
into = DotProduct( pm->ps->velocity, planes[i] );
|
||||
if ( into >= 0.1 ) {
|
||||
continue; // move doesn't interact with the plane
|
||||
}
|
||||
|
||||
// see how hard we are hitting things
|
||||
if ( -into > pml.impactSpeed ) {
|
||||
pml.impactSpeed = -into;
|
||||
}
|
||||
|
||||
// slide along the plane
|
||||
PM_ClipVelocity (pm->ps->velocity, planes[i], clipVelocity, OVERCLIP );
|
||||
|
||||
// slide along the plane
|
||||
PM_ClipVelocity (endVelocity, planes[i], endClipVelocity, OVERCLIP );
|
||||
|
||||
// see if there is a second plane that the new move enters
|
||||
for ( j = 0 ; j < numplanes ; j++ ) {
|
||||
if ( j == i ) {
|
||||
continue;
|
||||
}
|
||||
if ( DotProduct( clipVelocity, planes[j] ) >= 0.1 ) {
|
||||
continue; // move doesn't interact with the plane
|
||||
}
|
||||
|
||||
// try clipping the move to the plane
|
||||
PM_ClipVelocity( clipVelocity, planes[j], clipVelocity, OVERCLIP );
|
||||
PM_ClipVelocity( endClipVelocity, planes[j], endClipVelocity, OVERCLIP );
|
||||
|
||||
// see if it goes back into the first clip plane
|
||||
if ( DotProduct( clipVelocity, planes[i] ) >= 0 ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// slide the original velocity along the crease
|
||||
CrossProduct (planes[i], planes[j], dir);
|
||||
VectorNormalize( dir );
|
||||
d = DotProduct( dir, pm->ps->velocity );
|
||||
VectorScale( dir, d, clipVelocity );
|
||||
|
||||
CrossProduct (planes[i], planes[j], dir);
|
||||
VectorNormalize( dir );
|
||||
d = DotProduct( dir, endVelocity );
|
||||
VectorScale( dir, d, endClipVelocity );
|
||||
|
||||
// see if there is a third plane the the new move enters
|
||||
for ( k = 0 ; k < numplanes ; k++ ) {
|
||||
if ( k == i || k == j ) {
|
||||
continue;
|
||||
}
|
||||
if ( DotProduct( clipVelocity, planes[k] ) >= 0.1 ) {
|
||||
continue; // move doesn't interact with the plane
|
||||
}
|
||||
|
||||
// stop dead at a tripple plane interaction
|
||||
VectorClear( pm->ps->velocity );
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
// if we have fixed all interactions, try another move
|
||||
VectorCopy( clipVelocity, pm->ps->velocity );
|
||||
VectorCopy( endClipVelocity, endVelocity );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( gravity ) {
|
||||
VectorCopy( endVelocity, pm->ps->velocity );
|
||||
}
|
||||
|
||||
// don't change velocity if in a timer (FIXME: is this correct?)
|
||||
if ( pm->ps->pm_time ) {
|
||||
VectorCopy( primal_velocity, pm->ps->velocity );
|
||||
}
|
||||
|
||||
return ( bumpcount != 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
PM_StepSlideMove
|
||||
|
||||
==================
|
||||
*/
|
||||
void PM_StepSlideMove( qboolean gravity ) {
|
||||
vec3_t start_o, start_v;
|
||||
vec3_t down_o, down_v;
|
||||
trace_t trace;
|
||||
// float down_dist, up_dist;
|
||||
// vec3_t delta, delta2;
|
||||
vec3_t up, down;
|
||||
float stepSize;
|
||||
|
||||
VectorCopy (pm->ps->origin, start_o);
|
||||
VectorCopy (pm->ps->velocity, start_v);
|
||||
|
||||
if ( PM_SlideMove( gravity ) == 0 ) {
|
||||
return; // we got exactly where we wanted to go first try
|
||||
}
|
||||
|
||||
VectorCopy(start_o, down);
|
||||
down[2] -= STEPSIZE;
|
||||
pm->trace (&trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
||||
VectorSet(up, 0, 0, 1);
|
||||
// never step up when you still have up velocity
|
||||
if ( pm->ps->velocity[2] > 0 && (trace.fraction == 1.0 ||
|
||||
DotProduct(trace.plane.normal, up) < 0.7)) {
|
||||
return;
|
||||
}
|
||||
|
||||
VectorCopy (pm->ps->origin, down_o);
|
||||
VectorCopy (pm->ps->velocity, down_v);
|
||||
|
||||
VectorCopy (start_o, up);
|
||||
up[2] += STEPSIZE;
|
||||
|
||||
// test the player position if they were a stepheight higher
|
||||
pm->trace (&trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask);
|
||||
if ( trace.allsolid ) {
|
||||
if ( pm->debugLevel ) {
|
||||
Com_Printf("%i:bend can't step\n", c_pmove);
|
||||
}
|
||||
return; // can't step up
|
||||
}
|
||||
|
||||
stepSize = trace.endpos[2] - start_o[2];
|
||||
// try slidemove from this position
|
||||
VectorCopy (trace.endpos, pm->ps->origin);
|
||||
VectorCopy (start_v, pm->ps->velocity);
|
||||
|
||||
PM_SlideMove( gravity );
|
||||
|
||||
// push down the final amount
|
||||
VectorCopy (pm->ps->origin, down);
|
||||
down[2] -= stepSize;
|
||||
pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
||||
if ( !trace.allsolid ) {
|
||||
VectorCopy (trace.endpos, pm->ps->origin);
|
||||
}
|
||||
if ( trace.fraction < 1.0 ) {
|
||||
PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP );
|
||||
}
|
||||
|
||||
#if 0
|
||||
// if the down trace can trace back to the original position directly, don't step
|
||||
pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, start_o, pm->ps->clientNum, pm->tracemask);
|
||||
if ( trace.fraction == 1.0 ) {
|
||||
// use the original move
|
||||
VectorCopy (down_o, pm->ps->origin);
|
||||
VectorCopy (down_v, pm->ps->velocity);
|
||||
if ( pm->debugLevel ) {
|
||||
Com_Printf("%i:bend\n", c_pmove);
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
// use the step move
|
||||
float delta;
|
||||
|
||||
delta = pm->ps->origin[2] - start_o[2];
|
||||
if ( delta > 2 ) {
|
||||
if ( delta < 7 ) {
|
||||
PM_AddEvent( EV_STEP_4 );
|
||||
} else if ( delta < 11 ) {
|
||||
PM_AddEvent( EV_STEP_8 );
|
||||
} else if ( delta < 15 ) {
|
||||
PM_AddEvent( EV_STEP_12 );
|
||||
} else {
|
||||
PM_AddEvent( EV_STEP_16 );
|
||||
}
|
||||
}
|
||||
if ( pm->debugLevel ) {
|
||||
Com_Printf("%i:stepped\n", c_pmove);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
1032
code/game/botlib.h
Normal file → Executable file
1032
code/game/botlib.h
Normal file → Executable file
File diff suppressed because it is too large
Load diff
268
code/game/chars.h
Normal file → Executable file
268
code/game/chars.h
Normal file → Executable file
|
@ -1,134 +1,134 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
//========================================================
|
||||
//========================================================
|
||||
//name
|
||||
#define CHARACTERISTIC_NAME 0 //string
|
||||
//gender of the bot
|
||||
#define CHARACTERISTIC_GENDER 1 //string ("male", "female", "it")
|
||||
//attack skill
|
||||
// > 0.0 && < 0.2 = don't move
|
||||
// > 0.3 && < 1.0 = aim at enemy during retreat
|
||||
// > 0.0 && < 0.4 = only move forward/backward
|
||||
// >= 0.4 && < 1.0 = circle strafing
|
||||
// > 0.7 && < 1.0 = random strafe direction change
|
||||
#define CHARACTERISTIC_ATTACK_SKILL 2 //float [0, 1]
|
||||
//weapon weight file
|
||||
#define CHARACTERISTIC_WEAPONWEIGHTS 3 //string
|
||||
//view angle difference to angle change factor
|
||||
#define CHARACTERISTIC_VIEW_FACTOR 4 //float <0, 1]
|
||||
//maximum view angle change
|
||||
#define CHARACTERISTIC_VIEW_MAXCHANGE 5 //float [1, 360]
|
||||
//reaction time in seconds
|
||||
#define CHARACTERISTIC_REACTIONTIME 6 //float [0, 5]
|
||||
//accuracy when aiming
|
||||
#define CHARACTERISTIC_AIM_ACCURACY 7 //float [0, 1]
|
||||
//weapon specific aim accuracy
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 8 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 9 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 10 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 11 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 12
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 13 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_RAILGUN 14
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_BFG10K 15 //float [0, 1]
|
||||
//skill when aiming
|
||||
// > 0.0 && < 0.9 = aim is affected by enemy movement
|
||||
// > 0.4 && <= 0.8 = enemy linear leading
|
||||
// > 0.8 && <= 1.0 = enemy exact movement leading
|
||||
// > 0.5 && <= 1.0 = prediction shots when enemy is not visible
|
||||
// > 0.6 && <= 1.0 = splash damage by shooting nearby geometry
|
||||
#define CHARACTERISTIC_AIM_SKILL 16 //float [0, 1]
|
||||
//weapon specific aim skill
|
||||
#define CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 17 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 18 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_SKILL_PLASMAGUN 19 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_SKILL_BFG10K 20 //float [0, 1]
|
||||
//========================================================
|
||||
//chat
|
||||
//========================================================
|
||||
//file with chats
|
||||
#define CHARACTERISTIC_CHAT_FILE 21 //string
|
||||
//name of the chat character
|
||||
#define CHARACTERISTIC_CHAT_NAME 22 //string
|
||||
//characters per minute type speed
|
||||
#define CHARACTERISTIC_CHAT_CPM 23 //integer [1, 4000]
|
||||
//tendency to insult/praise
|
||||
#define CHARACTERISTIC_CHAT_INSULT 24 //float [0, 1]
|
||||
//tendency to chat misc
|
||||
#define CHARACTERISTIC_CHAT_MISC 25 //float [0, 1]
|
||||
//tendency to chat at start or end of level
|
||||
#define CHARACTERISTIC_CHAT_STARTENDLEVEL 26 //float [0, 1]
|
||||
//tendency to chat entering or exiting the game
|
||||
#define CHARACTERISTIC_CHAT_ENTEREXITGAME 27 //float [0, 1]
|
||||
//tendency to chat when killed someone
|
||||
#define CHARACTERISTIC_CHAT_KILL 28 //float [0, 1]
|
||||
//tendency to chat when died
|
||||
#define CHARACTERISTIC_CHAT_DEATH 29 //float [0, 1]
|
||||
//tendency to chat when enemy suicides
|
||||
#define CHARACTERISTIC_CHAT_ENEMYSUICIDE 30 //float [0, 1]
|
||||
//tendency to chat when hit while talking
|
||||
#define CHARACTERISTIC_CHAT_HITTALKING 31 //float [0, 1]
|
||||
//tendency to chat when bot was hit but didn't dye
|
||||
#define CHARACTERISTIC_CHAT_HITNODEATH 32 //float [0, 1]
|
||||
//tendency to chat when bot hit the enemy but enemy didn't dye
|
||||
#define CHARACTERISTIC_CHAT_HITNOKILL 33 //float [0, 1]
|
||||
//tendency to randomly chat
|
||||
#define CHARACTERISTIC_CHAT_RANDOM 34 //float [0, 1]
|
||||
//tendency to reply
|
||||
#define CHARACTERISTIC_CHAT_REPLY 35 //float [0, 1]
|
||||
//========================================================
|
||||
//movement
|
||||
//========================================================
|
||||
//tendency to crouch
|
||||
#define CHARACTERISTIC_CROUCHER 36 //float [0, 1]
|
||||
//tendency to jump
|
||||
#define CHARACTERISTIC_JUMPER 37 //float [0, 1]
|
||||
//tendency to walk
|
||||
#define CHARACTERISTIC_WALKER 48 //float [0, 1]
|
||||
//tendency to jump using a weapon
|
||||
#define CHARACTERISTIC_WEAPONJUMPING 38 //float [0, 1]
|
||||
//tendency to use the grapple hook when available
|
||||
#define CHARACTERISTIC_GRAPPLE_USER 39 //float [0, 1] //use this!!
|
||||
//========================================================
|
||||
//goal
|
||||
//========================================================
|
||||
//item weight file
|
||||
#define CHARACTERISTIC_ITEMWEIGHTS 40 //string
|
||||
//the aggression of the bot
|
||||
#define CHARACTERISTIC_AGGRESSION 41 //float [0, 1]
|
||||
//the self preservation of the bot (rockets near walls etc.)
|
||||
#define CHARACTERISTIC_SELFPRESERVATION 42 //float [0, 1]
|
||||
//how likely the bot is to take revenge
|
||||
#define CHARACTERISTIC_VENGEFULNESS 43 //float [0, 1] //use this!!
|
||||
//tendency to camp
|
||||
#define CHARACTERISTIC_CAMPER 44 //float [0, 1]
|
||||
//========================================================
|
||||
//========================================================
|
||||
//tendency to get easy frags
|
||||
#define CHARACTERISTIC_EASY_FRAGGER 45 //float [0, 1]
|
||||
//how alert the bot is (view distance)
|
||||
#define CHARACTERISTIC_ALERTNESS 46 //float [0, 1]
|
||||
//how much the bot fires it's weapon
|
||||
#define CHARACTERISTIC_FIRETHROTTLE 47 //float [0, 1]
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
//========================================================
|
||||
//========================================================
|
||||
//name
|
||||
#define CHARACTERISTIC_NAME 0 //string
|
||||
//gender of the bot
|
||||
#define CHARACTERISTIC_GENDER 1 //string ("male", "female", "it")
|
||||
//attack skill
|
||||
// > 0.0 && < 0.2 = don't move
|
||||
// > 0.3 && < 1.0 = aim at enemy during retreat
|
||||
// > 0.0 && < 0.4 = only move forward/backward
|
||||
// >= 0.4 && < 1.0 = circle strafing
|
||||
// > 0.7 && < 1.0 = random strafe direction change
|
||||
#define CHARACTERISTIC_ATTACK_SKILL 2 //float [0, 1]
|
||||
//weapon weight file
|
||||
#define CHARACTERISTIC_WEAPONWEIGHTS 3 //string
|
||||
//view angle difference to angle change factor
|
||||
#define CHARACTERISTIC_VIEW_FACTOR 4 //float <0, 1]
|
||||
//maximum view angle change
|
||||
#define CHARACTERISTIC_VIEW_MAXCHANGE 5 //float [1, 360]
|
||||
//reaction time in seconds
|
||||
#define CHARACTERISTIC_REACTIONTIME 6 //float [0, 5]
|
||||
//accuracy when aiming
|
||||
#define CHARACTERISTIC_AIM_ACCURACY 7 //float [0, 1]
|
||||
//weapon specific aim accuracy
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 8 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 9 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 10 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 11 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 12
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 13 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_RAILGUN 14
|
||||
#define CHARACTERISTIC_AIM_ACCURACY_BFG10K 15 //float [0, 1]
|
||||
//skill when aiming
|
||||
// > 0.0 && < 0.9 = aim is affected by enemy movement
|
||||
// > 0.4 && <= 0.8 = enemy linear leading
|
||||
// > 0.8 && <= 1.0 = enemy exact movement leading
|
||||
// > 0.5 && <= 1.0 = prediction shots when enemy is not visible
|
||||
// > 0.6 && <= 1.0 = splash damage by shooting nearby geometry
|
||||
#define CHARACTERISTIC_AIM_SKILL 16 //float [0, 1]
|
||||
//weapon specific aim skill
|
||||
#define CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 17 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 18 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_SKILL_PLASMAGUN 19 //float [0, 1]
|
||||
#define CHARACTERISTIC_AIM_SKILL_BFG10K 20 //float [0, 1]
|
||||
//========================================================
|
||||
//chat
|
||||
//========================================================
|
||||
//file with chats
|
||||
#define CHARACTERISTIC_CHAT_FILE 21 //string
|
||||
//name of the chat character
|
||||
#define CHARACTERISTIC_CHAT_NAME 22 //string
|
||||
//characters per minute type speed
|
||||
#define CHARACTERISTIC_CHAT_CPM 23 //integer [1, 4000]
|
||||
//tendency to insult/praise
|
||||
#define CHARACTERISTIC_CHAT_INSULT 24 //float [0, 1]
|
||||
//tendency to chat misc
|
||||
#define CHARACTERISTIC_CHAT_MISC 25 //float [0, 1]
|
||||
//tendency to chat at start or end of level
|
||||
#define CHARACTERISTIC_CHAT_STARTENDLEVEL 26 //float [0, 1]
|
||||
//tendency to chat entering or exiting the game
|
||||
#define CHARACTERISTIC_CHAT_ENTEREXITGAME 27 //float [0, 1]
|
||||
//tendency to chat when killed someone
|
||||
#define CHARACTERISTIC_CHAT_KILL 28 //float [0, 1]
|
||||
//tendency to chat when died
|
||||
#define CHARACTERISTIC_CHAT_DEATH 29 //float [0, 1]
|
||||
//tendency to chat when enemy suicides
|
||||
#define CHARACTERISTIC_CHAT_ENEMYSUICIDE 30 //float [0, 1]
|
||||
//tendency to chat when hit while talking
|
||||
#define CHARACTERISTIC_CHAT_HITTALKING 31 //float [0, 1]
|
||||
//tendency to chat when bot was hit but didn't dye
|
||||
#define CHARACTERISTIC_CHAT_HITNODEATH 32 //float [0, 1]
|
||||
//tendency to chat when bot hit the enemy but enemy didn't dye
|
||||
#define CHARACTERISTIC_CHAT_HITNOKILL 33 //float [0, 1]
|
||||
//tendency to randomly chat
|
||||
#define CHARACTERISTIC_CHAT_RANDOM 34 //float [0, 1]
|
||||
//tendency to reply
|
||||
#define CHARACTERISTIC_CHAT_REPLY 35 //float [0, 1]
|
||||
//========================================================
|
||||
//movement
|
||||
//========================================================
|
||||
//tendency to crouch
|
||||
#define CHARACTERISTIC_CROUCHER 36 //float [0, 1]
|
||||
//tendency to jump
|
||||
#define CHARACTERISTIC_JUMPER 37 //float [0, 1]
|
||||
//tendency to walk
|
||||
#define CHARACTERISTIC_WALKER 48 //float [0, 1]
|
||||
//tendency to jump using a weapon
|
||||
#define CHARACTERISTIC_WEAPONJUMPING 38 //float [0, 1]
|
||||
//tendency to use the grapple hook when available
|
||||
#define CHARACTERISTIC_GRAPPLE_USER 39 //float [0, 1] //use this!!
|
||||
//========================================================
|
||||
//goal
|
||||
//========================================================
|
||||
//item weight file
|
||||
#define CHARACTERISTIC_ITEMWEIGHTS 40 //string
|
||||
//the aggression of the bot
|
||||
#define CHARACTERISTIC_AGGRESSION 41 //float [0, 1]
|
||||
//the self preservation of the bot (rockets near walls etc.)
|
||||
#define CHARACTERISTIC_SELFPRESERVATION 42 //float [0, 1]
|
||||
//how likely the bot is to take revenge
|
||||
#define CHARACTERISTIC_VENGEFULNESS 43 //float [0, 1] //use this!!
|
||||
//tendency to camp
|
||||
#define CHARACTERISTIC_CAMPER 44 //float [0, 1]
|
||||
//========================================================
|
||||
//========================================================
|
||||
//tendency to get easy frags
|
||||
#define CHARACTERISTIC_EASY_FRAGGER 45 //float [0, 1]
|
||||
//how alert the bot is (view distance)
|
||||
#define CHARACTERISTIC_ALERTNESS 46 //float [0, 1]
|
||||
//how much the bot fires it's weapon
|
||||
#define CHARACTERISTIC_FIRETHROTTLE 47 //float [0, 1]
|
||||
|
||||
|
|
2382
code/game/g_active.c
Normal file → Executable file
2382
code/game/g_active.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
752
code/game/g_arenas.c
Normal file → Executable file
752
code/game/g_arenas.c
Normal file → Executable file
|
@ -1,376 +1,376 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
//
|
||||
// g_arenas.c
|
||||
//
|
||||
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
gentity_t *podium1;
|
||||
gentity_t *podium2;
|
||||
gentity_t *podium3;
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
UpdateTournamentInfo
|
||||
==================
|
||||
*/
|
||||
void UpdateTournamentInfo( void ) {
|
||||
int i;
|
||||
gentity_t *player;
|
||||
int playerClientNum;
|
||||
int n, accuracy, perfect, msglen;
|
||||
int buflen;
|
||||
#ifdef MISSIONPACK // bk001205
|
||||
int score1, score2;
|
||||
qboolean won;
|
||||
#endif
|
||||
char buf[32];
|
||||
char msg[MAX_STRING_CHARS];
|
||||
|
||||
// find the real player
|
||||
player = NULL;
|
||||
for (i = 0; i < level.maxclients; i++ ) {
|
||||
player = &g_entities[i];
|
||||
if ( !player->inuse ) {
|
||||
continue;
|
||||
}
|
||||
if ( !( player->r.svFlags & SVF_BOT ) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// this should never happen!
|
||||
if ( !player || i == level.maxclients ) {
|
||||
return;
|
||||
}
|
||||
playerClientNum = i;
|
||||
|
||||
CalculateRanks();
|
||||
|
||||
if ( level.clients[playerClientNum].sess.sessionTeam == TEAM_SPECTATOR ) {
|
||||
#ifdef MISSIONPACK
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i 0 0 0 0 0 0 0 0 0 0 0", level.numNonSpectatorClients, playerClientNum );
|
||||
#else
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i 0 0 0 0 0 0", level.numNonSpectatorClients, playerClientNum );
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
if( player->client->accuracy_shots ) {
|
||||
accuracy = player->client->accuracy_hits * 100 / player->client->accuracy_shots;
|
||||
}
|
||||
else {
|
||||
accuracy = 0;
|
||||
}
|
||||
#ifdef MISSIONPACK
|
||||
won = qfalse;
|
||||
if (g_gametype.integer >= GT_CTF) {
|
||||
score1 = level.teamScores[TEAM_RED];
|
||||
score2 = level.teamScores[TEAM_BLUE];
|
||||
if (level.clients[playerClientNum].sess.sessionTeam == TEAM_RED) {
|
||||
won = (level.teamScores[TEAM_RED] > level.teamScores[TEAM_BLUE]);
|
||||
} else {
|
||||
won = (level.teamScores[TEAM_BLUE] > level.teamScores[TEAM_RED]);
|
||||
}
|
||||
} else {
|
||||
if (&level.clients[playerClientNum] == &level.clients[ level.sortedClients[0] ]) {
|
||||
won = qtrue;
|
||||
score1 = level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE];
|
||||
score2 = level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE];
|
||||
} else {
|
||||
score2 = level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE];
|
||||
score1 = level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE];
|
||||
}
|
||||
}
|
||||
if (won && player->client->ps.persistant[PERS_KILLED] == 0) {
|
||||
perfect = 1;
|
||||
} else {
|
||||
perfect = 0;
|
||||
}
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i %i %i %i %i %i %i %i %i %i %i %i %i", level.numNonSpectatorClients, playerClientNum, accuracy,
|
||||
player->client->ps.persistant[PERS_IMPRESSIVE_COUNT], player->client->ps.persistant[PERS_EXCELLENT_COUNT],player->client->ps.persistant[PERS_DEFEND_COUNT],
|
||||
player->client->ps.persistant[PERS_ASSIST_COUNT], player->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], player->client->ps.persistant[PERS_SCORE],
|
||||
perfect, score1, score2, level.time, player->client->ps.persistant[PERS_CAPTURES] );
|
||||
|
||||
#else
|
||||
perfect = ( level.clients[playerClientNum].ps.persistant[PERS_RANK] == 0 && player->client->ps.persistant[PERS_KILLED] == 0 ) ? 1 : 0;
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i %i %i %i %i %i %i", level.numNonSpectatorClients, playerClientNum, accuracy,
|
||||
player->client->ps.persistant[PERS_IMPRESSIVE_COUNT], player->client->ps.persistant[PERS_EXCELLENT_COUNT],
|
||||
player->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], player->client->ps.persistant[PERS_SCORE],
|
||||
perfect );
|
||||
#endif
|
||||
}
|
||||
|
||||
msglen = strlen( msg );
|
||||
for( i = 0; i < level.numNonSpectatorClients; i++ ) {
|
||||
n = level.sortedClients[i];
|
||||
Com_sprintf( buf, sizeof(buf), " %i %i %i", n, level.clients[n].ps.persistant[PERS_RANK], level.clients[n].ps.persistant[PERS_SCORE] );
|
||||
buflen = strlen( buf );
|
||||
if( msglen + buflen + 1 >= sizeof(msg) ) {
|
||||
break;
|
||||
}
|
||||
strcat( msg, buf );
|
||||
}
|
||||
trap_SendConsoleCommand( EXEC_APPEND, msg );
|
||||
}
|
||||
|
||||
|
||||
static gentity_t *SpawnModelOnVictoryPad( gentity_t *pad, vec3_t offset, gentity_t *ent, int place ) {
|
||||
gentity_t *body;
|
||||
vec3_t vec;
|
||||
vec3_t f, r, u;
|
||||
|
||||
body = G_Spawn();
|
||||
if ( !body ) {
|
||||
G_Printf( S_COLOR_RED "ERROR: out of gentities\n" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
body->classname = ent->client->pers.netname;
|
||||
body->client = ent->client;
|
||||
body->s = ent->s;
|
||||
body->s.eType = ET_PLAYER; // could be ET_INVISIBLE
|
||||
body->s.eFlags = 0; // clear EF_TALK, etc
|
||||
body->s.powerups = 0; // clear powerups
|
||||
body->s.loopSound = 0; // clear lava burning
|
||||
body->s.number = body - g_entities;
|
||||
body->timestamp = level.time;
|
||||
body->physicsObject = qtrue;
|
||||
body->physicsBounce = 0; // don't bounce
|
||||
body->s.event = 0;
|
||||
body->s.pos.trType = TR_STATIONARY;
|
||||
body->s.groundEntityNum = ENTITYNUM_WORLD;
|
||||
body->s.legsAnim = LEGS_IDLE;
|
||||
body->s.torsoAnim = TORSO_STAND;
|
||||
if( body->s.weapon == WP_NONE ) {
|
||||
body->s.weapon = WP_MACHINEGUN;
|
||||
}
|
||||
if( body->s.weapon == WP_GAUNTLET) {
|
||||
body->s.torsoAnim = TORSO_STAND2;
|
||||
}
|
||||
body->s.event = 0;
|
||||
body->r.svFlags = ent->r.svFlags;
|
||||
VectorCopy (ent->r.mins, body->r.mins);
|
||||
VectorCopy (ent->r.maxs, body->r.maxs);
|
||||
VectorCopy (ent->r.absmin, body->r.absmin);
|
||||
VectorCopy (ent->r.absmax, body->r.absmax);
|
||||
body->clipmask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP;
|
||||
body->r.contents = CONTENTS_BODY;
|
||||
body->r.ownerNum = ent->r.ownerNum;
|
||||
body->takedamage = qfalse;
|
||||
|
||||
VectorSubtract( level.intermission_origin, pad->r.currentOrigin, vec );
|
||||
vectoangles( vec, body->s.apos.trBase );
|
||||
body->s.apos.trBase[PITCH] = 0;
|
||||
body->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( body->s.apos.trBase, f, r, u );
|
||||
VectorMA( pad->r.currentOrigin, offset[0], f, vec );
|
||||
VectorMA( vec, offset[1], r, vec );
|
||||
VectorMA( vec, offset[2], u, vec );
|
||||
|
||||
G_SetOrigin( body, vec );
|
||||
|
||||
trap_LinkEntity (body);
|
||||
|
||||
body->count = place;
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
|
||||
static void CelebrateStop( gentity_t *player ) {
|
||||
int anim;
|
||||
|
||||
if( player->s.weapon == WP_GAUNTLET) {
|
||||
anim = TORSO_STAND2;
|
||||
}
|
||||
else {
|
||||
anim = TORSO_STAND;
|
||||
}
|
||||
player->s.torsoAnim = ( ( player->s.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim;
|
||||
}
|
||||
|
||||
|
||||
#define TIMER_GESTURE (34*66+50)
|
||||
static void CelebrateStart( gentity_t *player ) {
|
||||
player->s.torsoAnim = ( ( player->s.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | TORSO_GESTURE;
|
||||
player->nextthink = level.time + TIMER_GESTURE;
|
||||
player->think = CelebrateStop;
|
||||
|
||||
/*
|
||||
player->client->ps.events[player->client->ps.eventSequence & (MAX_PS_EVENTS-1)] = EV_TAUNT;
|
||||
player->client->ps.eventParms[player->client->ps.eventSequence & (MAX_PS_EVENTS-1)] = 0;
|
||||
player->client->ps.eventSequence++;
|
||||
*/
|
||||
G_AddEvent(player, EV_TAUNT, 0);
|
||||
}
|
||||
|
||||
|
||||
static vec3_t offsetFirst = {0, 0, 74};
|
||||
static vec3_t offsetSecond = {-10, 60, 54};
|
||||
static vec3_t offsetThird = {-19, -60, 45};
|
||||
|
||||
static void PodiumPlacementThink( gentity_t *podium ) {
|
||||
vec3_t vec;
|
||||
vec3_t origin;
|
||||
vec3_t f, r, u;
|
||||
|
||||
podium->nextthink = level.time + 100;
|
||||
|
||||
AngleVectors( level.intermission_angle, vec, NULL, NULL );
|
||||
VectorMA( level.intermission_origin, trap_Cvar_VariableIntegerValue( "g_podiumDist" ), vec, origin );
|
||||
origin[2] -= trap_Cvar_VariableIntegerValue( "g_podiumDrop" );
|
||||
G_SetOrigin( podium, origin );
|
||||
|
||||
if( podium1 ) {
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
vectoangles( vec, podium1->s.apos.trBase );
|
||||
podium1->s.apos.trBase[PITCH] = 0;
|
||||
podium1->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( podium1->s.apos.trBase, f, r, u );
|
||||
VectorMA( podium->r.currentOrigin, offsetFirst[0], f, vec );
|
||||
VectorMA( vec, offsetFirst[1], r, vec );
|
||||
VectorMA( vec, offsetFirst[2], u, vec );
|
||||
|
||||
G_SetOrigin( podium1, vec );
|
||||
}
|
||||
|
||||
if( podium2 ) {
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
vectoangles( vec, podium2->s.apos.trBase );
|
||||
podium2->s.apos.trBase[PITCH] = 0;
|
||||
podium2->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( podium2->s.apos.trBase, f, r, u );
|
||||
VectorMA( podium->r.currentOrigin, offsetSecond[0], f, vec );
|
||||
VectorMA( vec, offsetSecond[1], r, vec );
|
||||
VectorMA( vec, offsetSecond[2], u, vec );
|
||||
|
||||
G_SetOrigin( podium2, vec );
|
||||
}
|
||||
|
||||
if( podium3 ) {
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
vectoangles( vec, podium3->s.apos.trBase );
|
||||
podium3->s.apos.trBase[PITCH] = 0;
|
||||
podium3->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( podium3->s.apos.trBase, f, r, u );
|
||||
VectorMA( podium->r.currentOrigin, offsetThird[0], f, vec );
|
||||
VectorMA( vec, offsetThird[1], r, vec );
|
||||
VectorMA( vec, offsetThird[2], u, vec );
|
||||
|
||||
G_SetOrigin( podium3, vec );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static gentity_t *SpawnPodium( void ) {
|
||||
gentity_t *podium;
|
||||
vec3_t vec;
|
||||
vec3_t origin;
|
||||
|
||||
podium = G_Spawn();
|
||||
if ( !podium ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
podium->classname = "podium";
|
||||
podium->s.eType = ET_GENERAL;
|
||||
podium->s.number = podium - g_entities;
|
||||
podium->clipmask = CONTENTS_SOLID;
|
||||
podium->r.contents = CONTENTS_SOLID;
|
||||
podium->s.modelindex = G_ModelIndex( SP_PODIUM_MODEL );
|
||||
|
||||
AngleVectors( level.intermission_angle, vec, NULL, NULL );
|
||||
VectorMA( level.intermission_origin, trap_Cvar_VariableIntegerValue( "g_podiumDist" ), vec, origin );
|
||||
origin[2] -= trap_Cvar_VariableIntegerValue( "g_podiumDrop" );
|
||||
G_SetOrigin( podium, origin );
|
||||
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
podium->s.apos.trBase[YAW] = vectoyaw( vec );
|
||||
trap_LinkEntity (podium);
|
||||
|
||||
podium->think = PodiumPlacementThink;
|
||||
podium->nextthink = level.time + 100;
|
||||
return podium;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
SpawnModelsOnVictoryPads
|
||||
==================
|
||||
*/
|
||||
void SpawnModelsOnVictoryPads( void ) {
|
||||
gentity_t *player;
|
||||
gentity_t *podium;
|
||||
|
||||
podium1 = NULL;
|
||||
podium2 = NULL;
|
||||
podium3 = NULL;
|
||||
|
||||
podium = SpawnPodium();
|
||||
|
||||
player = SpawnModelOnVictoryPad( podium, offsetFirst, &g_entities[level.sortedClients[0]],
|
||||
level.clients[ level.sortedClients[0] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG );
|
||||
if ( player ) {
|
||||
player->nextthink = level.time + 2000;
|
||||
player->think = CelebrateStart;
|
||||
podium1 = player;
|
||||
}
|
||||
|
||||
player = SpawnModelOnVictoryPad( podium, offsetSecond, &g_entities[level.sortedClients[1]],
|
||||
level.clients[ level.sortedClients[1] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG );
|
||||
if ( player ) {
|
||||
podium2 = player;
|
||||
}
|
||||
|
||||
if ( level.numNonSpectatorClients > 2 ) {
|
||||
player = SpawnModelOnVictoryPad( podium, offsetThird, &g_entities[level.sortedClients[2]],
|
||||
level.clients[ level.sortedClients[2] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG );
|
||||
if ( player ) {
|
||||
podium3 = player;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
Svcmd_AbortPodium_f
|
||||
===============
|
||||
*/
|
||||
void Svcmd_AbortPodium_f( void ) {
|
||||
if( g_gametype.integer != GT_SINGLE_PLAYER ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( podium1 ) {
|
||||
podium1->nextthink = level.time;
|
||||
podium1->think = CelebrateStop;
|
||||
}
|
||||
}
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
//
|
||||
// g_arenas.c
|
||||
//
|
||||
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
gentity_t *podium1;
|
||||
gentity_t *podium2;
|
||||
gentity_t *podium3;
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
UpdateTournamentInfo
|
||||
==================
|
||||
*/
|
||||
void UpdateTournamentInfo( void ) {
|
||||
int i;
|
||||
gentity_t *player;
|
||||
int playerClientNum;
|
||||
int n, accuracy, perfect, msglen;
|
||||
int buflen;
|
||||
#ifdef MISSIONPACK // bk001205
|
||||
int score1, score2;
|
||||
qboolean won;
|
||||
#endif
|
||||
char buf[32];
|
||||
char msg[MAX_STRING_CHARS];
|
||||
|
||||
// find the real player
|
||||
player = NULL;
|
||||
for (i = 0; i < level.maxclients; i++ ) {
|
||||
player = &g_entities[i];
|
||||
if ( !player->inuse ) {
|
||||
continue;
|
||||
}
|
||||
if ( !( player->r.svFlags & SVF_BOT ) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// this should never happen!
|
||||
if ( !player || i == level.maxclients ) {
|
||||
return;
|
||||
}
|
||||
playerClientNum = i;
|
||||
|
||||
CalculateRanks();
|
||||
|
||||
if ( level.clients[playerClientNum].sess.sessionTeam == TEAM_SPECTATOR ) {
|
||||
#ifdef MISSIONPACK
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i 0 0 0 0 0 0 0 0 0 0 0", level.numNonSpectatorClients, playerClientNum );
|
||||
#else
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i 0 0 0 0 0 0", level.numNonSpectatorClients, playerClientNum );
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
if( player->client->accuracy_shots ) {
|
||||
accuracy = player->client->accuracy_hits * 100 / player->client->accuracy_shots;
|
||||
}
|
||||
else {
|
||||
accuracy = 0;
|
||||
}
|
||||
#ifdef MISSIONPACK
|
||||
won = qfalse;
|
||||
if (g_gametype.integer >= GT_CTF) {
|
||||
score1 = level.teamScores[TEAM_RED];
|
||||
score2 = level.teamScores[TEAM_BLUE];
|
||||
if (level.clients[playerClientNum].sess.sessionTeam == TEAM_RED) {
|
||||
won = (level.teamScores[TEAM_RED] > level.teamScores[TEAM_BLUE]);
|
||||
} else {
|
||||
won = (level.teamScores[TEAM_BLUE] > level.teamScores[TEAM_RED]);
|
||||
}
|
||||
} else {
|
||||
if (&level.clients[playerClientNum] == &level.clients[ level.sortedClients[0] ]) {
|
||||
won = qtrue;
|
||||
score1 = level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE];
|
||||
score2 = level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE];
|
||||
} else {
|
||||
score2 = level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE];
|
||||
score1 = level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE];
|
||||
}
|
||||
}
|
||||
if (won && player->client->ps.persistant[PERS_KILLED] == 0) {
|
||||
perfect = 1;
|
||||
} else {
|
||||
perfect = 0;
|
||||
}
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i %i %i %i %i %i %i %i %i %i %i %i %i", level.numNonSpectatorClients, playerClientNum, accuracy,
|
||||
player->client->ps.persistant[PERS_IMPRESSIVE_COUNT], player->client->ps.persistant[PERS_EXCELLENT_COUNT],player->client->ps.persistant[PERS_DEFEND_COUNT],
|
||||
player->client->ps.persistant[PERS_ASSIST_COUNT], player->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], player->client->ps.persistant[PERS_SCORE],
|
||||
perfect, score1, score2, level.time, player->client->ps.persistant[PERS_CAPTURES] );
|
||||
|
||||
#else
|
||||
perfect = ( level.clients[playerClientNum].ps.persistant[PERS_RANK] == 0 && player->client->ps.persistant[PERS_KILLED] == 0 ) ? 1 : 0;
|
||||
Com_sprintf( msg, sizeof(msg), "postgame %i %i %i %i %i %i %i %i", level.numNonSpectatorClients, playerClientNum, accuracy,
|
||||
player->client->ps.persistant[PERS_IMPRESSIVE_COUNT], player->client->ps.persistant[PERS_EXCELLENT_COUNT],
|
||||
player->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], player->client->ps.persistant[PERS_SCORE],
|
||||
perfect );
|
||||
#endif
|
||||
}
|
||||
|
||||
msglen = strlen( msg );
|
||||
for( i = 0; i < level.numNonSpectatorClients; i++ ) {
|
||||
n = level.sortedClients[i];
|
||||
Com_sprintf( buf, sizeof(buf), " %i %i %i", n, level.clients[n].ps.persistant[PERS_RANK], level.clients[n].ps.persistant[PERS_SCORE] );
|
||||
buflen = strlen( buf );
|
||||
if( msglen + buflen + 1 >= sizeof(msg) ) {
|
||||
break;
|
||||
}
|
||||
strcat( msg, buf );
|
||||
}
|
||||
trap_SendConsoleCommand( EXEC_APPEND, msg );
|
||||
}
|
||||
|
||||
|
||||
static gentity_t *SpawnModelOnVictoryPad( gentity_t *pad, vec3_t offset, gentity_t *ent, int place ) {
|
||||
gentity_t *body;
|
||||
vec3_t vec;
|
||||
vec3_t f, r, u;
|
||||
|
||||
body = G_Spawn();
|
||||
if ( !body ) {
|
||||
G_Printf( S_COLOR_RED "ERROR: out of gentities\n" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
body->classname = ent->client->pers.netname;
|
||||
body->client = ent->client;
|
||||
body->s = ent->s;
|
||||
body->s.eType = ET_PLAYER; // could be ET_INVISIBLE
|
||||
body->s.eFlags = 0; // clear EF_TALK, etc
|
||||
body->s.powerups = 0; // clear powerups
|
||||
body->s.loopSound = 0; // clear lava burning
|
||||
body->s.number = body - g_entities;
|
||||
body->timestamp = level.time;
|
||||
body->physicsObject = qtrue;
|
||||
body->physicsBounce = 0; // don't bounce
|
||||
body->s.event = 0;
|
||||
body->s.pos.trType = TR_STATIONARY;
|
||||
body->s.groundEntityNum = ENTITYNUM_WORLD;
|
||||
body->s.legsAnim = LEGS_IDLE;
|
||||
body->s.torsoAnim = TORSO_STAND;
|
||||
if( body->s.weapon == WP_NONE ) {
|
||||
body->s.weapon = WP_MACHINEGUN;
|
||||
}
|
||||
if( body->s.weapon == WP_GAUNTLET) {
|
||||
body->s.torsoAnim = TORSO_STAND2;
|
||||
}
|
||||
body->s.event = 0;
|
||||
body->r.svFlags = ent->r.svFlags;
|
||||
VectorCopy (ent->r.mins, body->r.mins);
|
||||
VectorCopy (ent->r.maxs, body->r.maxs);
|
||||
VectorCopy (ent->r.absmin, body->r.absmin);
|
||||
VectorCopy (ent->r.absmax, body->r.absmax);
|
||||
body->clipmask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP;
|
||||
body->r.contents = CONTENTS_BODY;
|
||||
body->r.ownerNum = ent->r.ownerNum;
|
||||
body->takedamage = qfalse;
|
||||
|
||||
VectorSubtract( level.intermission_origin, pad->r.currentOrigin, vec );
|
||||
vectoangles( vec, body->s.apos.trBase );
|
||||
body->s.apos.trBase[PITCH] = 0;
|
||||
body->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( body->s.apos.trBase, f, r, u );
|
||||
VectorMA( pad->r.currentOrigin, offset[0], f, vec );
|
||||
VectorMA( vec, offset[1], r, vec );
|
||||
VectorMA( vec, offset[2], u, vec );
|
||||
|
||||
G_SetOrigin( body, vec );
|
||||
|
||||
trap_LinkEntity (body);
|
||||
|
||||
body->count = place;
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
|
||||
static void CelebrateStop( gentity_t *player ) {
|
||||
int anim;
|
||||
|
||||
if( player->s.weapon == WP_GAUNTLET) {
|
||||
anim = TORSO_STAND2;
|
||||
}
|
||||
else {
|
||||
anim = TORSO_STAND;
|
||||
}
|
||||
player->s.torsoAnim = ( ( player->s.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim;
|
||||
}
|
||||
|
||||
|
||||
#define TIMER_GESTURE (34*66+50)
|
||||
static void CelebrateStart( gentity_t *player ) {
|
||||
player->s.torsoAnim = ( ( player->s.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | TORSO_GESTURE;
|
||||
player->nextthink = level.time + TIMER_GESTURE;
|
||||
player->think = CelebrateStop;
|
||||
|
||||
/*
|
||||
player->client->ps.events[player->client->ps.eventSequence & (MAX_PS_EVENTS-1)] = EV_TAUNT;
|
||||
player->client->ps.eventParms[player->client->ps.eventSequence & (MAX_PS_EVENTS-1)] = 0;
|
||||
player->client->ps.eventSequence++;
|
||||
*/
|
||||
G_AddEvent(player, EV_TAUNT, 0);
|
||||
}
|
||||
|
||||
|
||||
static vec3_t offsetFirst = {0, 0, 74};
|
||||
static vec3_t offsetSecond = {-10, 60, 54};
|
||||
static vec3_t offsetThird = {-19, -60, 45};
|
||||
|
||||
static void PodiumPlacementThink( gentity_t *podium ) {
|
||||
vec3_t vec;
|
||||
vec3_t origin;
|
||||
vec3_t f, r, u;
|
||||
|
||||
podium->nextthink = level.time + 100;
|
||||
|
||||
AngleVectors( level.intermission_angle, vec, NULL, NULL );
|
||||
VectorMA( level.intermission_origin, trap_Cvar_VariableIntegerValue( "g_podiumDist" ), vec, origin );
|
||||
origin[2] -= trap_Cvar_VariableIntegerValue( "g_podiumDrop" );
|
||||
G_SetOrigin( podium, origin );
|
||||
|
||||
if( podium1 ) {
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
vectoangles( vec, podium1->s.apos.trBase );
|
||||
podium1->s.apos.trBase[PITCH] = 0;
|
||||
podium1->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( podium1->s.apos.trBase, f, r, u );
|
||||
VectorMA( podium->r.currentOrigin, offsetFirst[0], f, vec );
|
||||
VectorMA( vec, offsetFirst[1], r, vec );
|
||||
VectorMA( vec, offsetFirst[2], u, vec );
|
||||
|
||||
G_SetOrigin( podium1, vec );
|
||||
}
|
||||
|
||||
if( podium2 ) {
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
vectoangles( vec, podium2->s.apos.trBase );
|
||||
podium2->s.apos.trBase[PITCH] = 0;
|
||||
podium2->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( podium2->s.apos.trBase, f, r, u );
|
||||
VectorMA( podium->r.currentOrigin, offsetSecond[0], f, vec );
|
||||
VectorMA( vec, offsetSecond[1], r, vec );
|
||||
VectorMA( vec, offsetSecond[2], u, vec );
|
||||
|
||||
G_SetOrigin( podium2, vec );
|
||||
}
|
||||
|
||||
if( podium3 ) {
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
vectoangles( vec, podium3->s.apos.trBase );
|
||||
podium3->s.apos.trBase[PITCH] = 0;
|
||||
podium3->s.apos.trBase[ROLL] = 0;
|
||||
|
||||
AngleVectors( podium3->s.apos.trBase, f, r, u );
|
||||
VectorMA( podium->r.currentOrigin, offsetThird[0], f, vec );
|
||||
VectorMA( vec, offsetThird[1], r, vec );
|
||||
VectorMA( vec, offsetThird[2], u, vec );
|
||||
|
||||
G_SetOrigin( podium3, vec );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static gentity_t *SpawnPodium( void ) {
|
||||
gentity_t *podium;
|
||||
vec3_t vec;
|
||||
vec3_t origin;
|
||||
|
||||
podium = G_Spawn();
|
||||
if ( !podium ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
podium->classname = "podium";
|
||||
podium->s.eType = ET_GENERAL;
|
||||
podium->s.number = podium - g_entities;
|
||||
podium->clipmask = CONTENTS_SOLID;
|
||||
podium->r.contents = CONTENTS_SOLID;
|
||||
podium->s.modelindex = G_ModelIndex( SP_PODIUM_MODEL );
|
||||
|
||||
AngleVectors( level.intermission_angle, vec, NULL, NULL );
|
||||
VectorMA( level.intermission_origin, trap_Cvar_VariableIntegerValue( "g_podiumDist" ), vec, origin );
|
||||
origin[2] -= trap_Cvar_VariableIntegerValue( "g_podiumDrop" );
|
||||
G_SetOrigin( podium, origin );
|
||||
|
||||
VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec );
|
||||
podium->s.apos.trBase[YAW] = vectoyaw( vec );
|
||||
trap_LinkEntity (podium);
|
||||
|
||||
podium->think = PodiumPlacementThink;
|
||||
podium->nextthink = level.time + 100;
|
||||
return podium;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
SpawnModelsOnVictoryPads
|
||||
==================
|
||||
*/
|
||||
void SpawnModelsOnVictoryPads( void ) {
|
||||
gentity_t *player;
|
||||
gentity_t *podium;
|
||||
|
||||
podium1 = NULL;
|
||||
podium2 = NULL;
|
||||
podium3 = NULL;
|
||||
|
||||
podium = SpawnPodium();
|
||||
|
||||
player = SpawnModelOnVictoryPad( podium, offsetFirst, &g_entities[level.sortedClients[0]],
|
||||
level.clients[ level.sortedClients[0] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG );
|
||||
if ( player ) {
|
||||
player->nextthink = level.time + 2000;
|
||||
player->think = CelebrateStart;
|
||||
podium1 = player;
|
||||
}
|
||||
|
||||
player = SpawnModelOnVictoryPad( podium, offsetSecond, &g_entities[level.sortedClients[1]],
|
||||
level.clients[ level.sortedClients[1] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG );
|
||||
if ( player ) {
|
||||
podium2 = player;
|
||||
}
|
||||
|
||||
if ( level.numNonSpectatorClients > 2 ) {
|
||||
player = SpawnModelOnVictoryPad( podium, offsetThird, &g_entities[level.sortedClients[2]],
|
||||
level.clients[ level.sortedClients[2] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG );
|
||||
if ( player ) {
|
||||
podium3 = player;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
Svcmd_AbortPodium_f
|
||||
===============
|
||||
*/
|
||||
void Svcmd_AbortPodium_f( void ) {
|
||||
if( g_gametype.integer != GT_SINGLE_PLAYER ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( podium1 ) {
|
||||
podium1->nextthink = level.time;
|
||||
podium1->think = CelebrateStop;
|
||||
}
|
||||
}
|
||||
|
|
2034
code/game/g_bot.c
Normal file → Executable file
2034
code/game/g_bot.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
2688
code/game/g_client.c
Normal file → Executable file
2688
code/game/g_client.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
3402
code/game/g_cmds.c
Normal file → Executable file
3402
code/game/g_cmds.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
2390
code/game/g_combat.c
Normal file → Executable file
2390
code/game/g_combat.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
2020
code/game/g_items.c
Normal file → Executable file
2020
code/game/g_items.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
1942
code/game/g_local.h
Normal file → Executable file
1942
code/game/g_local.h
Normal file → Executable file
File diff suppressed because it is too large
Load diff
3664
code/game/g_main.c
Normal file → Executable file
3664
code/game/g_main.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
122
code/game/g_mem.c
Normal file → Executable file
122
code/game/g_mem.c
Normal file → Executable file
|
@ -1,61 +1,61 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
//
|
||||
// g_mem.c
|
||||
//
|
||||
|
||||
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
#define POOLSIZE (256 * 1024)
|
||||
|
||||
static char memoryPool[POOLSIZE];
|
||||
static int allocPoint;
|
||||
|
||||
void *G_Alloc( int size ) {
|
||||
char *p;
|
||||
|
||||
if ( g_debugAlloc.integer ) {
|
||||
G_Printf( "G_Alloc of %i bytes (%i left)\n", size, POOLSIZE - allocPoint - ( ( size + 31 ) & ~31 ) );
|
||||
}
|
||||
|
||||
if ( allocPoint + size > POOLSIZE ) {
|
||||
G_Error( "G_Alloc: failed on allocation of %i bytes\n", size ); // bk010103 - was %u, but is signed
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p = &memoryPool[allocPoint];
|
||||
|
||||
allocPoint += ( size + 31 ) & ~31;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void G_InitMemory( void ) {
|
||||
allocPoint = 0;
|
||||
}
|
||||
|
||||
void Svcmd_GameMem_f( void ) {
|
||||
G_Printf( "Game memory status: %i out of %i bytes allocated\n", allocPoint, POOLSIZE );
|
||||
}
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
//
|
||||
// g_mem.c
|
||||
//
|
||||
|
||||
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
#define POOLSIZE (256 * 1024)
|
||||
|
||||
static char memoryPool[POOLSIZE];
|
||||
static int allocPoint;
|
||||
|
||||
void *G_Alloc( int size ) {
|
||||
char *p;
|
||||
|
||||
if ( g_debugAlloc.integer ) {
|
||||
G_Printf( "G_Alloc of %i bytes (%i left)\n", size, POOLSIZE - allocPoint - ( ( size + 31 ) & ~31 ) );
|
||||
}
|
||||
|
||||
if ( allocPoint + size > POOLSIZE ) {
|
||||
G_Error( "G_Alloc: failed on allocation of %i bytes\n", size ); // bk010103 - was %u, but is signed
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p = &memoryPool[allocPoint];
|
||||
|
||||
allocPoint += ( size + 31 ) & ~31;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void G_InitMemory( void ) {
|
||||
allocPoint = 0;
|
||||
}
|
||||
|
||||
void Svcmd_GameMem_f( void ) {
|
||||
G_Printf( "Game memory status: %i out of %i bytes allocated\n", allocPoint, POOLSIZE );
|
||||
}
|
||||
|
|
964
code/game/g_misc.c
Normal file → Executable file
964
code/game/g_misc.c
Normal file → Executable file
|
@ -1,482 +1,482 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// g_misc.c
|
||||
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
/*QUAKED func_group (0 0 0) ?
|
||||
Used to group brushes together just for editor convenience. They are turned into normal brushes by the utilities.
|
||||
*/
|
||||
|
||||
|
||||
/*QUAKED info_camp (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for calculations in the utilities (spotlights, etc), but removed during gameplay.
|
||||
*/
|
||||
void SP_info_camp( gentity_t *self ) {
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for calculations in the utilities (spotlights, etc), but removed during gameplay.
|
||||
*/
|
||||
void SP_info_null( gentity_t *self ) {
|
||||
G_FreeEntity( self );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for in-game calculation, like jumppad targets.
|
||||
target_position does the same thing
|
||||
*/
|
||||
void SP_info_notnull( gentity_t *self ){
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) linear
|
||||
Non-displayed light.
|
||||
"light" overrides the default 300 intensity.
|
||||
Linear checbox gives linear falloff instead of inverse square
|
||||
Lights pointed at a target will be spotlights.
|
||||
"radius" overrides the default 64 unit radius of a spotlight at the target point.
|
||||
*/
|
||||
void SP_light( gentity_t *self ) {
|
||||
G_FreeEntity( self );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
=================================================================================
|
||||
|
||||
TELEPORTERS
|
||||
|
||||
=================================================================================
|
||||
*/
|
||||
|
||||
void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) {
|
||||
gentity_t *tent;
|
||||
|
||||
// use temp events at source and destination to prevent the effect
|
||||
// from getting dropped by a second player event
|
||||
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
tent = G_TempEntity( player->client->ps.origin, EV_PLAYER_TELEPORT_OUT );
|
||||
tent->s.clientNum = player->s.clientNum;
|
||||
|
||||
tent = G_TempEntity( origin, EV_PLAYER_TELEPORT_IN );
|
||||
tent->s.clientNum = player->s.clientNum;
|
||||
}
|
||||
|
||||
// unlink to make sure it can't possibly interfere with G_KillBox
|
||||
trap_UnlinkEntity (player);
|
||||
|
||||
VectorCopy ( origin, player->client->ps.origin );
|
||||
player->client->ps.origin[2] += 1;
|
||||
|
||||
// spit the player out
|
||||
AngleVectors( angles, player->client->ps.velocity, NULL, NULL );
|
||||
VectorScale( player->client->ps.velocity, 400, player->client->ps.velocity );
|
||||
player->client->ps.pm_time = 160; // hold time
|
||||
player->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
|
||||
|
||||
// toggle the teleport bit so the client knows to not lerp
|
||||
player->client->ps.eFlags ^= EF_TELEPORT_BIT;
|
||||
|
||||
// set angles
|
||||
SetClientViewAngle( player, angles );
|
||||
|
||||
// kill anything at the destination
|
||||
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
G_KillBox (player);
|
||||
}
|
||||
|
||||
// save results of pmove
|
||||
BG_PlayerStateToEntityState( &player->client->ps, &player->s, qtrue );
|
||||
|
||||
// use the precise origin for linking
|
||||
VectorCopy( player->client->ps.origin, player->r.currentOrigin );
|
||||
|
||||
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
trap_LinkEntity (player);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED misc_teleporter_dest (1 0 0) (-32 -32 -24) (32 32 -16)
|
||||
Point teleporters at these.
|
||||
Now that we don't have teleport destination pads, this is just
|
||||
an info_notnull
|
||||
*/
|
||||
void SP_misc_teleporter_dest( gentity_t *ent ) {
|
||||
}
|
||||
|
||||
|
||||
//===========================================================
|
||||
|
||||
/*QUAKED misc_model (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
"model" arbitrary .md3 file to display
|
||||
*/
|
||||
void SP_misc_model( gentity_t *ent ) {
|
||||
|
||||
#if 0
|
||||
ent->s.modelindex = G_ModelIndex( ent->model );
|
||||
VectorSet (ent->mins, -16, -16, -16);
|
||||
VectorSet (ent->maxs, 16, 16, 16);
|
||||
trap_LinkEntity (ent);
|
||||
|
||||
G_SetOrigin( ent, ent->s.origin );
|
||||
VectorCopy( ent->s.angles, ent->s.apos.trBase );
|
||||
#else
|
||||
G_FreeEntity( ent );
|
||||
#endif
|
||||
}
|
||||
|
||||
//===========================================================
|
||||
|
||||
void locateCamera( gentity_t *ent ) {
|
||||
vec3_t dir;
|
||||
gentity_t *target;
|
||||
gentity_t *owner;
|
||||
|
||||
owner = G_PickTarget( ent->target );
|
||||
if ( !owner ) {
|
||||
G_Printf( "Couldn't find target for misc_partal_surface\n" );
|
||||
G_FreeEntity( ent );
|
||||
return;
|
||||
}
|
||||
ent->r.ownerNum = owner->s.number;
|
||||
|
||||
// frame holds the rotate speed
|
||||
if ( owner->spawnflags & 1 ) {
|
||||
ent->s.frame = 25;
|
||||
} else if ( owner->spawnflags & 2 ) {
|
||||
ent->s.frame = 75;
|
||||
}
|
||||
|
||||
// swing camera ?
|
||||
if ( owner->spawnflags & 4 ) {
|
||||
// set to 0 for no rotation at all
|
||||
ent->s.powerups = 0;
|
||||
}
|
||||
else {
|
||||
ent->s.powerups = 1;
|
||||
}
|
||||
|
||||
// clientNum holds the rotate offset
|
||||
ent->s.clientNum = owner->s.clientNum;
|
||||
|
||||
VectorCopy( owner->s.origin, ent->s.origin2 );
|
||||
|
||||
// see if the portal_camera has a target
|
||||
target = G_PickTarget( owner->target );
|
||||
if ( target ) {
|
||||
VectorSubtract( target->s.origin, owner->s.origin, dir );
|
||||
VectorNormalize( dir );
|
||||
} else {
|
||||
G_SetMovedir( owner->s.angles, dir );
|
||||
}
|
||||
|
||||
ent->s.eventParm = DirToByte( dir );
|
||||
}
|
||||
|
||||
/*QUAKED misc_portal_surface (0 0 1) (-8 -8 -8) (8 8 8)
|
||||
The portal surface nearest this entity will show a view from the targeted misc_portal_camera, or a mirror view if untargeted.
|
||||
This must be within 64 world units of the surface!
|
||||
*/
|
||||
void SP_misc_portal_surface(gentity_t *ent) {
|
||||
VectorClear( ent->r.mins );
|
||||
VectorClear( ent->r.maxs );
|
||||
trap_LinkEntity (ent);
|
||||
|
||||
ent->r.svFlags = SVF_PORTAL;
|
||||
ent->s.eType = ET_PORTAL;
|
||||
|
||||
if ( !ent->target ) {
|
||||
VectorCopy( ent->s.origin, ent->s.origin2 );
|
||||
} else {
|
||||
ent->think = locateCamera;
|
||||
ent->nextthink = level.time + 100;
|
||||
}
|
||||
}
|
||||
|
||||
/*QUAKED misc_portal_camera (0 0 1) (-8 -8 -8) (8 8 8) slowrotate fastrotate noswing
|
||||
The target for a misc_portal_director. You can set either angles or target another entity to determine the direction of view.
|
||||
"roll" an angle modifier to orient the camera around the target vector;
|
||||
*/
|
||||
void SP_misc_portal_camera(gentity_t *ent) {
|
||||
float roll;
|
||||
|
||||
VectorClear( ent->r.mins );
|
||||
VectorClear( ent->r.maxs );
|
||||
trap_LinkEntity (ent);
|
||||
|
||||
G_SpawnFloat( "roll", "0", &roll );
|
||||
|
||||
ent->s.clientNum = roll/360.0 * 256;
|
||||
}
|
||||
|
||||
/*
|
||||
======================================================================
|
||||
|
||||
SHOOTERS
|
||||
|
||||
======================================================================
|
||||
*/
|
||||
|
||||
void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
vec3_t dir;
|
||||
float deg;
|
||||
vec3_t up, right;
|
||||
|
||||
// see if we have a target
|
||||
if ( ent->enemy ) {
|
||||
VectorSubtract( ent->enemy->r.currentOrigin, ent->s.origin, dir );
|
||||
VectorNormalize( dir );
|
||||
} else {
|
||||
VectorCopy( ent->movedir, dir );
|
||||
}
|
||||
|
||||
// randomize a bit
|
||||
PerpendicularVector( up, dir );
|
||||
CrossProduct( up, dir, right );
|
||||
|
||||
deg = crandom() * ent->random;
|
||||
VectorMA( dir, deg, up, dir );
|
||||
|
||||
deg = crandom() * ent->random;
|
||||
VectorMA( dir, deg, right, dir );
|
||||
|
||||
VectorNormalize( dir );
|
||||
|
||||
switch ( ent->s.weapon ) {
|
||||
case WP_GRENADE_LAUNCHER:
|
||||
fire_grenade( ent, ent->s.origin, dir );
|
||||
break;
|
||||
case WP_ROCKET_LAUNCHER:
|
||||
fire_rocket( ent, ent->s.origin, dir );
|
||||
break;
|
||||
case WP_PLASMAGUN:
|
||||
fire_plasma( ent, ent->s.origin, dir );
|
||||
break;
|
||||
}
|
||||
|
||||
G_AddEvent( ent, EV_FIRE_WEAPON, 0 );
|
||||
}
|
||||
|
||||
|
||||
static void InitShooter_Finish( gentity_t *ent ) {
|
||||
ent->enemy = G_PickTarget( ent->target );
|
||||
ent->think = 0;
|
||||
ent->nextthink = 0;
|
||||
}
|
||||
|
||||
void InitShooter( gentity_t *ent, int weapon ) {
|
||||
ent->use = Use_Shooter;
|
||||
ent->s.weapon = weapon;
|
||||
|
||||
RegisterItem( BG_FindItemForWeapon( weapon ) );
|
||||
|
||||
G_SetMovedir( ent->s.angles, ent->movedir );
|
||||
|
||||
if ( !ent->random ) {
|
||||
ent->random = 1.0;
|
||||
}
|
||||
ent->random = sin( M_PI * ent->random / 180 );
|
||||
// target might be a moving object, so we can't set movedir for it
|
||||
if ( ent->target ) {
|
||||
ent->think = InitShooter_Finish;
|
||||
ent->nextthink = level.time + 500;
|
||||
}
|
||||
trap_LinkEntity( ent );
|
||||
}
|
||||
|
||||
/*QUAKED shooter_rocket (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
Fires at either the target or the current direction.
|
||||
"random" the number of degrees of deviance from the taget. (1.0 default)
|
||||
*/
|
||||
void SP_shooter_rocket( gentity_t *ent ) {
|
||||
InitShooter( ent, WP_ROCKET_LAUNCHER );
|
||||
}
|
||||
|
||||
/*QUAKED shooter_plasma (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
Fires at either the target or the current direction.
|
||||
"random" is the number of degrees of deviance from the taget. (1.0 default)
|
||||
*/
|
||||
void SP_shooter_plasma( gentity_t *ent ) {
|
||||
InitShooter( ent, WP_PLASMAGUN);
|
||||
}
|
||||
|
||||
/*QUAKED shooter_grenade (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
Fires at either the target or the current direction.
|
||||
"random" is the number of degrees of deviance from the taget. (1.0 default)
|
||||
*/
|
||||
void SP_shooter_grenade( gentity_t *ent ) {
|
||||
InitShooter( ent, WP_GRENADE_LAUNCHER);
|
||||
}
|
||||
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
static void PortalDie (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod) {
|
||||
G_FreeEntity( self );
|
||||
//FIXME do something more interesting
|
||||
}
|
||||
|
||||
|
||||
void DropPortalDestination( gentity_t *player ) {
|
||||
gentity_t *ent;
|
||||
vec3_t snapped;
|
||||
|
||||
// create the portal destination
|
||||
ent = G_Spawn();
|
||||
ent->s.modelindex = G_ModelIndex( "models/powerups/teleporter/tele_exit.md3" );
|
||||
|
||||
VectorCopy( player->s.pos.trBase, snapped );
|
||||
SnapVector( snapped );
|
||||
G_SetOrigin( ent, snapped );
|
||||
VectorCopy( player->r.mins, ent->r.mins );
|
||||
VectorCopy( player->r.maxs, ent->r.maxs );
|
||||
|
||||
ent->classname = "hi_portal destination";
|
||||
ent->s.pos.trType = TR_STATIONARY;
|
||||
|
||||
ent->r.contents = CONTENTS_CORPSE;
|
||||
ent->takedamage = qtrue;
|
||||
ent->health = 200;
|
||||
ent->die = PortalDie;
|
||||
|
||||
VectorCopy( player->s.apos.trBase, ent->s.angles );
|
||||
|
||||
ent->think = G_FreeEntity;
|
||||
ent->nextthink = level.time + 2 * 60 * 1000;
|
||||
|
||||
trap_LinkEntity( ent );
|
||||
|
||||
player->client->portalID = ++level.portalSequence;
|
||||
ent->count = player->client->portalID;
|
||||
|
||||
// give the item back so they can drop the source now
|
||||
player->client->ps.stats[STAT_HOLDABLE_ITEM] = BG_FindItem( "Portal" ) - bg_itemlist;
|
||||
}
|
||||
|
||||
|
||||
static void PortalTouch( gentity_t *self, gentity_t *other, trace_t *trace) {
|
||||
gentity_t *destination;
|
||||
|
||||
// see if we will even let other try to use it
|
||||
if( other->health <= 0 ) {
|
||||
return;
|
||||
}
|
||||
if( !other->client ) {
|
||||
return;
|
||||
}
|
||||
// if( other->client->ps.persistant[PERS_TEAM] != self->spawnflags ) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
if ( other->client->ps.powerups[PW_NEUTRALFLAG] ) { // only happens in One Flag CTF
|
||||
Drop_Item( other, BG_FindItemForPowerup( PW_NEUTRALFLAG ), 0 );
|
||||
other->client->ps.powerups[PW_NEUTRALFLAG] = 0;
|
||||
}
|
||||
else if ( other->client->ps.powerups[PW_REDFLAG] ) { // only happens in standard CTF
|
||||
Drop_Item( other, BG_FindItemForPowerup( PW_REDFLAG ), 0 );
|
||||
other->client->ps.powerups[PW_REDFLAG] = 0;
|
||||
}
|
||||
else if ( other->client->ps.powerups[PW_BLUEFLAG] ) { // only happens in standard CTF
|
||||
Drop_Item( other, BG_FindItemForPowerup( PW_BLUEFLAG ), 0 );
|
||||
other->client->ps.powerups[PW_BLUEFLAG] = 0;
|
||||
}
|
||||
|
||||
// find the destination
|
||||
destination = NULL;
|
||||
while( (destination = G_Find(destination, FOFS(classname), "hi_portal destination")) != NULL ) {
|
||||
if( destination->count == self->count ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if there is not one, die!
|
||||
if( !destination ) {
|
||||
if( self->pos1[0] || self->pos1[1] || self->pos1[2] ) {
|
||||
TeleportPlayer( other, self->pos1, self->s.angles );
|
||||
}
|
||||
G_Damage( other, other, other, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG );
|
||||
return;
|
||||
}
|
||||
|
||||
TeleportPlayer( other, destination->s.pos.trBase, destination->s.angles );
|
||||
}
|
||||
|
||||
|
||||
static void PortalEnable( gentity_t *self ) {
|
||||
self->touch = PortalTouch;
|
||||
self->think = G_FreeEntity;
|
||||
self->nextthink = level.time + 2 * 60 * 1000;
|
||||
}
|
||||
|
||||
|
||||
void DropPortalSource( gentity_t *player ) {
|
||||
gentity_t *ent;
|
||||
gentity_t *destination;
|
||||
vec3_t snapped;
|
||||
|
||||
// create the portal source
|
||||
ent = G_Spawn();
|
||||
ent->s.modelindex = G_ModelIndex( "models/powerups/teleporter/tele_enter.md3" );
|
||||
|
||||
VectorCopy( player->s.pos.trBase, snapped );
|
||||
SnapVector( snapped );
|
||||
G_SetOrigin( ent, snapped );
|
||||
VectorCopy( player->r.mins, ent->r.mins );
|
||||
VectorCopy( player->r.maxs, ent->r.maxs );
|
||||
|
||||
ent->classname = "hi_portal source";
|
||||
ent->s.pos.trType = TR_STATIONARY;
|
||||
|
||||
ent->r.contents = CONTENTS_CORPSE | CONTENTS_TRIGGER;
|
||||
ent->takedamage = qtrue;
|
||||
ent->health = 200;
|
||||
ent->die = PortalDie;
|
||||
|
||||
trap_LinkEntity( ent );
|
||||
|
||||
ent->count = player->client->portalID;
|
||||
player->client->portalID = 0;
|
||||
|
||||
// ent->spawnflags = player->client->ps.persistant[PERS_TEAM];
|
||||
|
||||
ent->nextthink = level.time + 1000;
|
||||
ent->think = PortalEnable;
|
||||
|
||||
// find the destination
|
||||
destination = NULL;
|
||||
while( (destination = G_Find(destination, FOFS(classname), "hi_portal destination")) != NULL ) {
|
||||
if( destination->count == ent->count ) {
|
||||
VectorCopy( destination->s.pos.trBase, ent->pos1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// g_misc.c
|
||||
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
/*QUAKED func_group (0 0 0) ?
|
||||
Used to group brushes together just for editor convenience. They are turned into normal brushes by the utilities.
|
||||
*/
|
||||
|
||||
|
||||
/*QUAKED info_camp (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for calculations in the utilities (spotlights, etc), but removed during gameplay.
|
||||
*/
|
||||
void SP_info_camp( gentity_t *self ) {
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for calculations in the utilities (spotlights, etc), but removed during gameplay.
|
||||
*/
|
||||
void SP_info_null( gentity_t *self ) {
|
||||
G_FreeEntity( self );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for in-game calculation, like jumppad targets.
|
||||
target_position does the same thing
|
||||
*/
|
||||
void SP_info_notnull( gentity_t *self ){
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) linear
|
||||
Non-displayed light.
|
||||
"light" overrides the default 300 intensity.
|
||||
Linear checbox gives linear falloff instead of inverse square
|
||||
Lights pointed at a target will be spotlights.
|
||||
"radius" overrides the default 64 unit radius of a spotlight at the target point.
|
||||
*/
|
||||
void SP_light( gentity_t *self ) {
|
||||
G_FreeEntity( self );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
=================================================================================
|
||||
|
||||
TELEPORTERS
|
||||
|
||||
=================================================================================
|
||||
*/
|
||||
|
||||
void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) {
|
||||
gentity_t *tent;
|
||||
|
||||
// use temp events at source and destination to prevent the effect
|
||||
// from getting dropped by a second player event
|
||||
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
tent = G_TempEntity( player->client->ps.origin, EV_PLAYER_TELEPORT_OUT );
|
||||
tent->s.clientNum = player->s.clientNum;
|
||||
|
||||
tent = G_TempEntity( origin, EV_PLAYER_TELEPORT_IN );
|
||||
tent->s.clientNum = player->s.clientNum;
|
||||
}
|
||||
|
||||
// unlink to make sure it can't possibly interfere with G_KillBox
|
||||
trap_UnlinkEntity (player);
|
||||
|
||||
VectorCopy ( origin, player->client->ps.origin );
|
||||
player->client->ps.origin[2] += 1;
|
||||
|
||||
// spit the player out
|
||||
AngleVectors( angles, player->client->ps.velocity, NULL, NULL );
|
||||
VectorScale( player->client->ps.velocity, 400, player->client->ps.velocity );
|
||||
player->client->ps.pm_time = 160; // hold time
|
||||
player->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
|
||||
|
||||
// toggle the teleport bit so the client knows to not lerp
|
||||
player->client->ps.eFlags ^= EF_TELEPORT_BIT;
|
||||
|
||||
// set angles
|
||||
SetClientViewAngle( player, angles );
|
||||
|
||||
// kill anything at the destination
|
||||
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
G_KillBox (player);
|
||||
}
|
||||
|
||||
// save results of pmove
|
||||
BG_PlayerStateToEntityState( &player->client->ps, &player->s, qtrue );
|
||||
|
||||
// use the precise origin for linking
|
||||
VectorCopy( player->client->ps.origin, player->r.currentOrigin );
|
||||
|
||||
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
trap_LinkEntity (player);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED misc_teleporter_dest (1 0 0) (-32 -32 -24) (32 32 -16)
|
||||
Point teleporters at these.
|
||||
Now that we don't have teleport destination pads, this is just
|
||||
an info_notnull
|
||||
*/
|
||||
void SP_misc_teleporter_dest( gentity_t *ent ) {
|
||||
}
|
||||
|
||||
|
||||
//===========================================================
|
||||
|
||||
/*QUAKED misc_model (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
"model" arbitrary .md3 file to display
|
||||
*/
|
||||
void SP_misc_model( gentity_t *ent ) {
|
||||
|
||||
#if 0
|
||||
ent->s.modelindex = G_ModelIndex( ent->model );
|
||||
VectorSet (ent->mins, -16, -16, -16);
|
||||
VectorSet (ent->maxs, 16, 16, 16);
|
||||
trap_LinkEntity (ent);
|
||||
|
||||
G_SetOrigin( ent, ent->s.origin );
|
||||
VectorCopy( ent->s.angles, ent->s.apos.trBase );
|
||||
#else
|
||||
G_FreeEntity( ent );
|
||||
#endif
|
||||
}
|
||||
|
||||
//===========================================================
|
||||
|
||||
void locateCamera( gentity_t *ent ) {
|
||||
vec3_t dir;
|
||||
gentity_t *target;
|
||||
gentity_t *owner;
|
||||
|
||||
owner = G_PickTarget( ent->target );
|
||||
if ( !owner ) {
|
||||
G_Printf( "Couldn't find target for misc_partal_surface\n" );
|
||||
G_FreeEntity( ent );
|
||||
return;
|
||||
}
|
||||
ent->r.ownerNum = owner->s.number;
|
||||
|
||||
// frame holds the rotate speed
|
||||
if ( owner->spawnflags & 1 ) {
|
||||
ent->s.frame = 25;
|
||||
} else if ( owner->spawnflags & 2 ) {
|
||||
ent->s.frame = 75;
|
||||
}
|
||||
|
||||
// swing camera ?
|
||||
if ( owner->spawnflags & 4 ) {
|
||||
// set to 0 for no rotation at all
|
||||
ent->s.powerups = 0;
|
||||
}
|
||||
else {
|
||||
ent->s.powerups = 1;
|
||||
}
|
||||
|
||||
// clientNum holds the rotate offset
|
||||
ent->s.clientNum = owner->s.clientNum;
|
||||
|
||||
VectorCopy( owner->s.origin, ent->s.origin2 );
|
||||
|
||||
// see if the portal_camera has a target
|
||||
target = G_PickTarget( owner->target );
|
||||
if ( target ) {
|
||||
VectorSubtract( target->s.origin, owner->s.origin, dir );
|
||||
VectorNormalize( dir );
|
||||
} else {
|
||||
G_SetMovedir( owner->s.angles, dir );
|
||||
}
|
||||
|
||||
ent->s.eventParm = DirToByte( dir );
|
||||
}
|
||||
|
||||
/*QUAKED misc_portal_surface (0 0 1) (-8 -8 -8) (8 8 8)
|
||||
The portal surface nearest this entity will show a view from the targeted misc_portal_camera, or a mirror view if untargeted.
|
||||
This must be within 64 world units of the surface!
|
||||
*/
|
||||
void SP_misc_portal_surface(gentity_t *ent) {
|
||||
VectorClear( ent->r.mins );
|
||||
VectorClear( ent->r.maxs );
|
||||
trap_LinkEntity (ent);
|
||||
|
||||
ent->r.svFlags = SVF_PORTAL;
|
||||
ent->s.eType = ET_PORTAL;
|
||||
|
||||
if ( !ent->target ) {
|
||||
VectorCopy( ent->s.origin, ent->s.origin2 );
|
||||
} else {
|
||||
ent->think = locateCamera;
|
||||
ent->nextthink = level.time + 100;
|
||||
}
|
||||
}
|
||||
|
||||
/*QUAKED misc_portal_camera (0 0 1) (-8 -8 -8) (8 8 8) slowrotate fastrotate noswing
|
||||
The target for a misc_portal_director. You can set either angles or target another entity to determine the direction of view.
|
||||
"roll" an angle modifier to orient the camera around the target vector;
|
||||
*/
|
||||
void SP_misc_portal_camera(gentity_t *ent) {
|
||||
float roll;
|
||||
|
||||
VectorClear( ent->r.mins );
|
||||
VectorClear( ent->r.maxs );
|
||||
trap_LinkEntity (ent);
|
||||
|
||||
G_SpawnFloat( "roll", "0", &roll );
|
||||
|
||||
ent->s.clientNum = roll/360.0 * 256;
|
||||
}
|
||||
|
||||
/*
|
||||
======================================================================
|
||||
|
||||
SHOOTERS
|
||||
|
||||
======================================================================
|
||||
*/
|
||||
|
||||
void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
vec3_t dir;
|
||||
float deg;
|
||||
vec3_t up, right;
|
||||
|
||||
// see if we have a target
|
||||
if ( ent->enemy ) {
|
||||
VectorSubtract( ent->enemy->r.currentOrigin, ent->s.origin, dir );
|
||||
VectorNormalize( dir );
|
||||
} else {
|
||||
VectorCopy( ent->movedir, dir );
|
||||
}
|
||||
|
||||
// randomize a bit
|
||||
PerpendicularVector( up, dir );
|
||||
CrossProduct( up, dir, right );
|
||||
|
||||
deg = crandom() * ent->random;
|
||||
VectorMA( dir, deg, up, dir );
|
||||
|
||||
deg = crandom() * ent->random;
|
||||
VectorMA( dir, deg, right, dir );
|
||||
|
||||
VectorNormalize( dir );
|
||||
|
||||
switch ( ent->s.weapon ) {
|
||||
case WP_GRENADE_LAUNCHER:
|
||||
fire_grenade( ent, ent->s.origin, dir );
|
||||
break;
|
||||
case WP_ROCKET_LAUNCHER:
|
||||
fire_rocket( ent, ent->s.origin, dir );
|
||||
break;
|
||||
case WP_PLASMAGUN:
|
||||
fire_plasma( ent, ent->s.origin, dir );
|
||||
break;
|
||||
}
|
||||
|
||||
G_AddEvent( ent, EV_FIRE_WEAPON, 0 );
|
||||
}
|
||||
|
||||
|
||||
static void InitShooter_Finish( gentity_t *ent ) {
|
||||
ent->enemy = G_PickTarget( ent->target );
|
||||
ent->think = 0;
|
||||
ent->nextthink = 0;
|
||||
}
|
||||
|
||||
void InitShooter( gentity_t *ent, int weapon ) {
|
||||
ent->use = Use_Shooter;
|
||||
ent->s.weapon = weapon;
|
||||
|
||||
RegisterItem( BG_FindItemForWeapon( weapon ) );
|
||||
|
||||
G_SetMovedir( ent->s.angles, ent->movedir );
|
||||
|
||||
if ( !ent->random ) {
|
||||
ent->random = 1.0;
|
||||
}
|
||||
ent->random = sin( M_PI * ent->random / 180 );
|
||||
// target might be a moving object, so we can't set movedir for it
|
||||
if ( ent->target ) {
|
||||
ent->think = InitShooter_Finish;
|
||||
ent->nextthink = level.time + 500;
|
||||
}
|
||||
trap_LinkEntity( ent );
|
||||
}
|
||||
|
||||
/*QUAKED shooter_rocket (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
Fires at either the target or the current direction.
|
||||
"random" the number of degrees of deviance from the taget. (1.0 default)
|
||||
*/
|
||||
void SP_shooter_rocket( gentity_t *ent ) {
|
||||
InitShooter( ent, WP_ROCKET_LAUNCHER );
|
||||
}
|
||||
|
||||
/*QUAKED shooter_plasma (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
Fires at either the target or the current direction.
|
||||
"random" is the number of degrees of deviance from the taget. (1.0 default)
|
||||
*/
|
||||
void SP_shooter_plasma( gentity_t *ent ) {
|
||||
InitShooter( ent, WP_PLASMAGUN);
|
||||
}
|
||||
|
||||
/*QUAKED shooter_grenade (1 0 0) (-16 -16 -16) (16 16 16)
|
||||
Fires at either the target or the current direction.
|
||||
"random" is the number of degrees of deviance from the taget. (1.0 default)
|
||||
*/
|
||||
void SP_shooter_grenade( gentity_t *ent ) {
|
||||
InitShooter( ent, WP_GRENADE_LAUNCHER);
|
||||
}
|
||||
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
static void PortalDie (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod) {
|
||||
G_FreeEntity( self );
|
||||
//FIXME do something more interesting
|
||||
}
|
||||
|
||||
|
||||
void DropPortalDestination( gentity_t *player ) {
|
||||
gentity_t *ent;
|
||||
vec3_t snapped;
|
||||
|
||||
// create the portal destination
|
||||
ent = G_Spawn();
|
||||
ent->s.modelindex = G_ModelIndex( "models/powerups/teleporter/tele_exit.md3" );
|
||||
|
||||
VectorCopy( player->s.pos.trBase, snapped );
|
||||
SnapVector( snapped );
|
||||
G_SetOrigin( ent, snapped );
|
||||
VectorCopy( player->r.mins, ent->r.mins );
|
||||
VectorCopy( player->r.maxs, ent->r.maxs );
|
||||
|
||||
ent->classname = "hi_portal destination";
|
||||
ent->s.pos.trType = TR_STATIONARY;
|
||||
|
||||
ent->r.contents = CONTENTS_CORPSE;
|
||||
ent->takedamage = qtrue;
|
||||
ent->health = 200;
|
||||
ent->die = PortalDie;
|
||||
|
||||
VectorCopy( player->s.apos.trBase, ent->s.angles );
|
||||
|
||||
ent->think = G_FreeEntity;
|
||||
ent->nextthink = level.time + 2 * 60 * 1000;
|
||||
|
||||
trap_LinkEntity( ent );
|
||||
|
||||
player->client->portalID = ++level.portalSequence;
|
||||
ent->count = player->client->portalID;
|
||||
|
||||
// give the item back so they can drop the source now
|
||||
player->client->ps.stats[STAT_HOLDABLE_ITEM] = BG_FindItem( "Portal" ) - bg_itemlist;
|
||||
}
|
||||
|
||||
|
||||
static void PortalTouch( gentity_t *self, gentity_t *other, trace_t *trace) {
|
||||
gentity_t *destination;
|
||||
|
||||
// see if we will even let other try to use it
|
||||
if( other->health <= 0 ) {
|
||||
return;
|
||||
}
|
||||
if( !other->client ) {
|
||||
return;
|
||||
}
|
||||
// if( other->client->ps.persistant[PERS_TEAM] != self->spawnflags ) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
if ( other->client->ps.powerups[PW_NEUTRALFLAG] ) { // only happens in One Flag CTF
|
||||
Drop_Item( other, BG_FindItemForPowerup( PW_NEUTRALFLAG ), 0 );
|
||||
other->client->ps.powerups[PW_NEUTRALFLAG] = 0;
|
||||
}
|
||||
else if ( other->client->ps.powerups[PW_REDFLAG] ) { // only happens in standard CTF
|
||||
Drop_Item( other, BG_FindItemForPowerup( PW_REDFLAG ), 0 );
|
||||
other->client->ps.powerups[PW_REDFLAG] = 0;
|
||||
}
|
||||
else if ( other->client->ps.powerups[PW_BLUEFLAG] ) { // only happens in standard CTF
|
||||
Drop_Item( other, BG_FindItemForPowerup( PW_BLUEFLAG ), 0 );
|
||||
other->client->ps.powerups[PW_BLUEFLAG] = 0;
|
||||
}
|
||||
|
||||
// find the destination
|
||||
destination = NULL;
|
||||
while( (destination = G_Find(destination, FOFS(classname), "hi_portal destination")) != NULL ) {
|
||||
if( destination->count == self->count ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if there is not one, die!
|
||||
if( !destination ) {
|
||||
if( self->pos1[0] || self->pos1[1] || self->pos1[2] ) {
|
||||
TeleportPlayer( other, self->pos1, self->s.angles );
|
||||
}
|
||||
G_Damage( other, other, other, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG );
|
||||
return;
|
||||
}
|
||||
|
||||
TeleportPlayer( other, destination->s.pos.trBase, destination->s.angles );
|
||||
}
|
||||
|
||||
|
||||
static void PortalEnable( gentity_t *self ) {
|
||||
self->touch = PortalTouch;
|
||||
self->think = G_FreeEntity;
|
||||
self->nextthink = level.time + 2 * 60 * 1000;
|
||||
}
|
||||
|
||||
|
||||
void DropPortalSource( gentity_t *player ) {
|
||||
gentity_t *ent;
|
||||
gentity_t *destination;
|
||||
vec3_t snapped;
|
||||
|
||||
// create the portal source
|
||||
ent = G_Spawn();
|
||||
ent->s.modelindex = G_ModelIndex( "models/powerups/teleporter/tele_enter.md3" );
|
||||
|
||||
VectorCopy( player->s.pos.trBase, snapped );
|
||||
SnapVector( snapped );
|
||||
G_SetOrigin( ent, snapped );
|
||||
VectorCopy( player->r.mins, ent->r.mins );
|
||||
VectorCopy( player->r.maxs, ent->r.maxs );
|
||||
|
||||
ent->classname = "hi_portal source";
|
||||
ent->s.pos.trType = TR_STATIONARY;
|
||||
|
||||
ent->r.contents = CONTENTS_CORPSE | CONTENTS_TRIGGER;
|
||||
ent->takedamage = qtrue;
|
||||
ent->health = 200;
|
||||
ent->die = PortalDie;
|
||||
|
||||
trap_LinkEntity( ent );
|
||||
|
||||
ent->count = player->client->portalID;
|
||||
player->client->portalID = 0;
|
||||
|
||||
// ent->spawnflags = player->client->ps.persistant[PERS_TEAM];
|
||||
|
||||
ent->nextthink = level.time + 1000;
|
||||
ent->think = PortalEnable;
|
||||
|
||||
// find the destination
|
||||
destination = NULL;
|
||||
while( (destination = G_Find(destination, FOFS(classname), "hi_portal destination")) != NULL ) {
|
||||
if( destination->count == ent->count ) {
|
||||
VectorCopy( destination->s.pos.trBase, ent->pos1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
|
1616
code/game/g_missile.c
Normal file → Executable file
1616
code/game/g_missile.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
3224
code/game/g_mover.c
Normal file → Executable file
3224
code/game/g_mover.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
858
code/game/g_public.h
Normal file → Executable file
858
code/game/g_public.h
Normal file → Executable file
|
@ -1,429 +1,429 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
// g_public.h -- game module information visible to server
|
||||
|
||||
#define GAME_API_VERSION 8
|
||||
|
||||
// entity->svFlags
|
||||
// the server does not know how to interpret most of the values
|
||||
// in entityStates (level eType), so the game must explicitly flag
|
||||
// special server behaviors
|
||||
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
|
||||
|
||||
// TTimo
|
||||
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=551
|
||||
#define SVF_CLIENTMASK 0x00000002
|
||||
|
||||
#define SVF_BOT 0x00000008 // set if the entity is a bot
|
||||
#define SVF_BROADCAST 0x00000020 // send to all connected clients
|
||||
#define SVF_PORTAL 0x00000040 // merge a second pvs at origin2 into snapshots
|
||||
#define SVF_USE_CURRENT_ORIGIN 0x00000080 // entity->r.currentOrigin instead of entity->s.origin
|
||||
// for link position (missiles and movers)
|
||||
#define SVF_SINGLECLIENT 0x00000100 // only send to a single client (entityShared_t->singleClient)
|
||||
#define SVF_NOSERVERINFO 0x00000200 // don't send CS_SERVERINFO updates to this client
|
||||
// so that it can be updated for ping tools without
|
||||
// lagging clients
|
||||
#define SVF_CAPSULE 0x00000400 // use capsule for collision detection instead of bbox
|
||||
#define SVF_NOTSINGLECLIENT 0x00000800 // send entity to everyone but one client
|
||||
// (entityShared_t->singleClient)
|
||||
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
|
||||
typedef struct {
|
||||
entityState_t s; // communicated by server to clients
|
||||
|
||||
qboolean linked; // qfalse if not in any good cluster
|
||||
int linkcount;
|
||||
|
||||
int svFlags; // SVF_NOCLIENT, SVF_BROADCAST, etc
|
||||
|
||||
// only send to this client when SVF_SINGLECLIENT is set
|
||||
// if SVF_CLIENTMASK is set, use bitmask for clients to send to (maxclients must be <= 32, up to the mod to enforce this)
|
||||
int singleClient;
|
||||
|
||||
qboolean bmodel; // if false, assume an explicit mins / maxs bounding box
|
||||
// only set by trap_SetBrushModel
|
||||
vec3_t mins, maxs;
|
||||
int contents; // CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc
|
||||
// a non-solid entity should set to 0
|
||||
|
||||
vec3_t absmin, absmax; // derived from mins/maxs and origin + rotation
|
||||
|
||||
// currentOrigin will be used for all collision detection and world linking.
|
||||
// it will not necessarily be the same as the trajectory evaluation for the current
|
||||
// time, because each entity must be moved one at a time after time is advanced
|
||||
// to avoid simultanious collision issues
|
||||
vec3_t currentOrigin;
|
||||
vec3_t currentAngles;
|
||||
|
||||
// when a trace call is made and passEntityNum != ENTITYNUM_NONE,
|
||||
// an ent will be excluded from testing if:
|
||||
// ent->s.number == passEntityNum (don't interact with self)
|
||||
// ent->s.ownerNum = passEntityNum (don't interact with your own missiles)
|
||||
// entity[ent->s.ownerNum].ownerNum = passEntityNum (don't interact with other missiles from owner)
|
||||
int ownerNum;
|
||||
} entityShared_t;
|
||||
|
||||
|
||||
|
||||
// the server looks at a sharedEntity, which is the start of the game's gentity_t structure
|
||||
typedef struct {
|
||||
entityState_t s; // communicated by server to clients
|
||||
entityShared_t r; // shared by both the server system and game
|
||||
} sharedEntity_t;
|
||||
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
//
|
||||
// system traps provided by the main engine
|
||||
//
|
||||
typedef enum {
|
||||
//============== general Quake services ==================
|
||||
|
||||
G_PRINT, // ( const char *string );
|
||||
// print message on the local console
|
||||
|
||||
G_ERROR, // ( const char *string );
|
||||
// abort the game
|
||||
|
||||
G_MILLISECONDS, // ( void );
|
||||
// get current time for profiling reasons
|
||||
// this should NOT be used for any game related tasks,
|
||||
// because it is not journaled
|
||||
|
||||
// console variable interaction
|
||||
G_CVAR_REGISTER, // ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags );
|
||||
G_CVAR_UPDATE, // ( vmCvar_t *vmCvar );
|
||||
G_CVAR_SET, // ( const char *var_name, const char *value );
|
||||
G_CVAR_VARIABLE_INTEGER_VALUE, // ( const char *var_name );
|
||||
|
||||
G_CVAR_VARIABLE_STRING_BUFFER, // ( const char *var_name, char *buffer, int bufsize );
|
||||
|
||||
G_ARGC, // ( void );
|
||||
// ClientCommand and ServerCommand parameter access
|
||||
|
||||
G_ARGV, // ( int n, char *buffer, int bufferLength );
|
||||
|
||||
G_FS_FOPEN_FILE, // ( const char *qpath, fileHandle_t *file, fsMode_t mode );
|
||||
G_FS_READ, // ( void *buffer, int len, fileHandle_t f );
|
||||
G_FS_WRITE, // ( const void *buffer, int len, fileHandle_t f );
|
||||
G_FS_FCLOSE_FILE, // ( fileHandle_t f );
|
||||
|
||||
G_SEND_CONSOLE_COMMAND, // ( const char *text );
|
||||
// add commands to the console as if they were typed in
|
||||
// for map changing, etc
|
||||
|
||||
|
||||
//=========== server specific functionality =============
|
||||
|
||||
G_LOCATE_GAME_DATA, // ( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t,
|
||||
// playerState_t *clients, int sizeofGameClient );
|
||||
// the game needs to let the server system know where and how big the gentities
|
||||
// are, so it can look at them directly without going through an interface
|
||||
|
||||
G_DROP_CLIENT, // ( int clientNum, const char *reason );
|
||||
// kick a client off the server with a message
|
||||
|
||||
G_SEND_SERVER_COMMAND, // ( int clientNum, const char *fmt, ... );
|
||||
// reliably sends a command string to be interpreted by the given
|
||||
// client. If clientNum is -1, it will be sent to all clients
|
||||
|
||||
G_SET_CONFIGSTRING, // ( int num, const char *string );
|
||||
// config strings hold all the index strings, and various other information
|
||||
// that is reliably communicated to all clients
|
||||
// All of the current configstrings are sent to clients when
|
||||
// they connect, and changes are sent to all connected clients.
|
||||
// All confgstrings are cleared at each level start.
|
||||
|
||||
G_GET_CONFIGSTRING, // ( int num, char *buffer, int bufferSize );
|
||||
|
||||
G_GET_USERINFO, // ( int num, char *buffer, int bufferSize );
|
||||
// userinfo strings are maintained by the server system, so they
|
||||
// are persistant across level loads, while all other game visible
|
||||
// data is completely reset
|
||||
|
||||
G_SET_USERINFO, // ( int num, const char *buffer );
|
||||
|
||||
G_GET_SERVERINFO, // ( char *buffer, int bufferSize );
|
||||
// the serverinfo info string has all the cvars visible to server browsers
|
||||
|
||||
G_SET_BRUSH_MODEL, // ( gentity_t *ent, const char *name );
|
||||
// sets mins and maxs based on the brushmodel name
|
||||
|
||||
G_TRACE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
||||
// collision detection against all linked entities
|
||||
|
||||
G_POINT_CONTENTS, // ( const vec3_t point, int passEntityNum );
|
||||
// point contents against all linked entities
|
||||
|
||||
G_IN_PVS, // ( const vec3_t p1, const vec3_t p2 );
|
||||
|
||||
G_IN_PVS_IGNORE_PORTALS, // ( const vec3_t p1, const vec3_t p2 );
|
||||
|
||||
G_ADJUST_AREA_PORTAL_STATE, // ( gentity_t *ent, qboolean open );
|
||||
|
||||
G_AREAS_CONNECTED, // ( int area1, int area2 );
|
||||
|
||||
G_LINKENTITY, // ( gentity_t *ent );
|
||||
// an entity will never be sent to a client or used for collision
|
||||
// if it is not passed to linkentity. If the size, position, or
|
||||
// solidity changes, it must be relinked.
|
||||
|
||||
G_UNLINKENTITY, // ( gentity_t *ent );
|
||||
// call before removing an interactive entity
|
||||
|
||||
G_ENTITIES_IN_BOX, // ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount );
|
||||
// EntitiesInBox will return brush models based on their bounding box,
|
||||
// so exact determination must still be done with EntityContact
|
||||
|
||||
G_ENTITY_CONTACT, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
|
||||
// perform an exact check against inline brush models of non-square shape
|
||||
|
||||
// access for bots to get and free a server client (FIXME?)
|
||||
G_BOT_ALLOCATE_CLIENT, // ( void );
|
||||
|
||||
G_BOT_FREE_CLIENT, // ( int clientNum );
|
||||
|
||||
G_GET_USERCMD, // ( int clientNum, usercmd_t *cmd )
|
||||
|
||||
G_GET_ENTITY_TOKEN, // qboolean ( char *buffer, int bufferSize )
|
||||
// Retrieves the next string token from the entity spawn text, returning
|
||||
// false when all tokens have been parsed.
|
||||
// This should only be done at GAME_INIT time.
|
||||
|
||||
G_FS_GETFILELIST,
|
||||
G_DEBUG_POLYGON_CREATE,
|
||||
G_DEBUG_POLYGON_DELETE,
|
||||
G_REAL_TIME,
|
||||
G_SNAPVECTOR,
|
||||
|
||||
G_TRACECAPSULE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
||||
G_ENTITY_CONTACTCAPSULE, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
|
||||
|
||||
// 1.32
|
||||
G_FS_SEEK,
|
||||
|
||||
BOTLIB_SETUP = 200, // ( void );
|
||||
BOTLIB_SHUTDOWN, // ( void );
|
||||
BOTLIB_LIBVAR_SET,
|
||||
BOTLIB_LIBVAR_GET,
|
||||
BOTLIB_PC_ADD_GLOBAL_DEFINE,
|
||||
BOTLIB_START_FRAME,
|
||||
BOTLIB_LOAD_MAP,
|
||||
BOTLIB_UPDATENTITY,
|
||||
BOTLIB_TEST,
|
||||
|
||||
BOTLIB_GET_SNAPSHOT_ENTITY, // ( int client, int ent );
|
||||
BOTLIB_GET_CONSOLE_MESSAGE, // ( int client, char *message, int size );
|
||||
BOTLIB_USER_COMMAND, // ( int client, usercmd_t *ucmd );
|
||||
|
||||
BOTLIB_AAS_ENABLE_ROUTING_AREA = 300,
|
||||
BOTLIB_AAS_BBOX_AREAS,
|
||||
BOTLIB_AAS_AREA_INFO,
|
||||
BOTLIB_AAS_ENTITY_INFO,
|
||||
|
||||
BOTLIB_AAS_INITIALIZED,
|
||||
BOTLIB_AAS_PRESENCE_TYPE_BOUNDING_BOX,
|
||||
BOTLIB_AAS_TIME,
|
||||
|
||||
BOTLIB_AAS_POINT_AREA_NUM,
|
||||
BOTLIB_AAS_TRACE_AREAS,
|
||||
|
||||
BOTLIB_AAS_POINT_CONTENTS,
|
||||
BOTLIB_AAS_NEXT_BSP_ENTITY,
|
||||
BOTLIB_AAS_VALUE_FOR_BSP_EPAIR_KEY,
|
||||
BOTLIB_AAS_VECTOR_FOR_BSP_EPAIR_KEY,
|
||||
BOTLIB_AAS_FLOAT_FOR_BSP_EPAIR_KEY,
|
||||
BOTLIB_AAS_INT_FOR_BSP_EPAIR_KEY,
|
||||
|
||||
BOTLIB_AAS_AREA_REACHABILITY,
|
||||
|
||||
BOTLIB_AAS_AREA_TRAVEL_TIME_TO_GOAL_AREA,
|
||||
|
||||
BOTLIB_AAS_SWIMMING,
|
||||
BOTLIB_AAS_PREDICT_CLIENT_MOVEMENT,
|
||||
|
||||
BOTLIB_EA_SAY = 400,
|
||||
BOTLIB_EA_SAY_TEAM,
|
||||
BOTLIB_EA_COMMAND,
|
||||
|
||||
BOTLIB_EA_ACTION,
|
||||
BOTLIB_EA_GESTURE,
|
||||
BOTLIB_EA_TALK,
|
||||
BOTLIB_EA_ATTACK,
|
||||
BOTLIB_EA_USE,
|
||||
BOTLIB_EA_RESPAWN,
|
||||
BOTLIB_EA_CROUCH,
|
||||
BOTLIB_EA_MOVE_UP,
|
||||
BOTLIB_EA_MOVE_DOWN,
|
||||
BOTLIB_EA_MOVE_FORWARD,
|
||||
BOTLIB_EA_MOVE_BACK,
|
||||
BOTLIB_EA_MOVE_LEFT,
|
||||
BOTLIB_EA_MOVE_RIGHT,
|
||||
|
||||
BOTLIB_EA_SELECT_WEAPON,
|
||||
BOTLIB_EA_JUMP,
|
||||
BOTLIB_EA_DELAYED_JUMP,
|
||||
BOTLIB_EA_MOVE,
|
||||
BOTLIB_EA_VIEW,
|
||||
|
||||
BOTLIB_EA_END_REGULAR,
|
||||
BOTLIB_EA_GET_INPUT,
|
||||
BOTLIB_EA_RESET_INPUT,
|
||||
|
||||
|
||||
BOTLIB_AI_LOAD_CHARACTER = 500,
|
||||
BOTLIB_AI_FREE_CHARACTER,
|
||||
BOTLIB_AI_CHARACTERISTIC_FLOAT,
|
||||
BOTLIB_AI_CHARACTERISTIC_BFLOAT,
|
||||
BOTLIB_AI_CHARACTERISTIC_INTEGER,
|
||||
BOTLIB_AI_CHARACTERISTIC_BINTEGER,
|
||||
BOTLIB_AI_CHARACTERISTIC_STRING,
|
||||
|
||||
BOTLIB_AI_ALLOC_CHAT_STATE,
|
||||
BOTLIB_AI_FREE_CHAT_STATE,
|
||||
BOTLIB_AI_QUEUE_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_REMOVE_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_NEXT_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_NUM_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_INITIAL_CHAT,
|
||||
BOTLIB_AI_REPLY_CHAT,
|
||||
BOTLIB_AI_CHAT_LENGTH,
|
||||
BOTLIB_AI_ENTER_CHAT,
|
||||
BOTLIB_AI_STRING_CONTAINS,
|
||||
BOTLIB_AI_FIND_MATCH,
|
||||
BOTLIB_AI_MATCH_VARIABLE,
|
||||
BOTLIB_AI_UNIFY_WHITE_SPACES,
|
||||
BOTLIB_AI_REPLACE_SYNONYMS,
|
||||
BOTLIB_AI_LOAD_CHAT_FILE,
|
||||
BOTLIB_AI_SET_CHAT_GENDER,
|
||||
BOTLIB_AI_SET_CHAT_NAME,
|
||||
|
||||
BOTLIB_AI_RESET_GOAL_STATE,
|
||||
BOTLIB_AI_RESET_AVOID_GOALS,
|
||||
BOTLIB_AI_PUSH_GOAL,
|
||||
BOTLIB_AI_POP_GOAL,
|
||||
BOTLIB_AI_EMPTY_GOAL_STACK,
|
||||
BOTLIB_AI_DUMP_AVOID_GOALS,
|
||||
BOTLIB_AI_DUMP_GOAL_STACK,
|
||||
BOTLIB_AI_GOAL_NAME,
|
||||
BOTLIB_AI_GET_TOP_GOAL,
|
||||
BOTLIB_AI_GET_SECOND_GOAL,
|
||||
BOTLIB_AI_CHOOSE_LTG_ITEM,
|
||||
BOTLIB_AI_CHOOSE_NBG_ITEM,
|
||||
BOTLIB_AI_TOUCHING_GOAL,
|
||||
BOTLIB_AI_ITEM_GOAL_IN_VIS_BUT_NOT_VISIBLE,
|
||||
BOTLIB_AI_GET_LEVEL_ITEM_GOAL,
|
||||
BOTLIB_AI_AVOID_GOAL_TIME,
|
||||
BOTLIB_AI_INIT_LEVEL_ITEMS,
|
||||
BOTLIB_AI_UPDATE_ENTITY_ITEMS,
|
||||
BOTLIB_AI_LOAD_ITEM_WEIGHTS,
|
||||
BOTLIB_AI_FREE_ITEM_WEIGHTS,
|
||||
BOTLIB_AI_SAVE_GOAL_FUZZY_LOGIC,
|
||||
BOTLIB_AI_ALLOC_GOAL_STATE,
|
||||
BOTLIB_AI_FREE_GOAL_STATE,
|
||||
|
||||
BOTLIB_AI_RESET_MOVE_STATE,
|
||||
BOTLIB_AI_MOVE_TO_GOAL,
|
||||
BOTLIB_AI_MOVE_IN_DIRECTION,
|
||||
BOTLIB_AI_RESET_AVOID_REACH,
|
||||
BOTLIB_AI_RESET_LAST_AVOID_REACH,
|
||||
BOTLIB_AI_REACHABILITY_AREA,
|
||||
BOTLIB_AI_MOVEMENT_VIEW_TARGET,
|
||||
BOTLIB_AI_ALLOC_MOVE_STATE,
|
||||
BOTLIB_AI_FREE_MOVE_STATE,
|
||||
BOTLIB_AI_INIT_MOVE_STATE,
|
||||
|
||||
BOTLIB_AI_CHOOSE_BEST_FIGHT_WEAPON,
|
||||
BOTLIB_AI_GET_WEAPON_INFO,
|
||||
BOTLIB_AI_LOAD_WEAPON_WEIGHTS,
|
||||
BOTLIB_AI_ALLOC_WEAPON_STATE,
|
||||
BOTLIB_AI_FREE_WEAPON_STATE,
|
||||
BOTLIB_AI_RESET_WEAPON_STATE,
|
||||
|
||||
BOTLIB_AI_GENETIC_PARENTS_AND_CHILD_SELECTION,
|
||||
BOTLIB_AI_INTERBREED_GOAL_FUZZY_LOGIC,
|
||||
BOTLIB_AI_MUTATE_GOAL_FUZZY_LOGIC,
|
||||
BOTLIB_AI_GET_NEXT_CAMP_SPOT_GOAL,
|
||||
BOTLIB_AI_GET_MAP_LOCATION_GOAL,
|
||||
BOTLIB_AI_NUM_INITIAL_CHATS,
|
||||
BOTLIB_AI_GET_CHAT_MESSAGE,
|
||||
BOTLIB_AI_REMOVE_FROM_AVOID_GOALS,
|
||||
BOTLIB_AI_PREDICT_VISIBLE_POSITION,
|
||||
|
||||
BOTLIB_AI_SET_AVOID_GOAL_TIME,
|
||||
BOTLIB_AI_ADD_AVOID_SPOT,
|
||||
BOTLIB_AAS_ALTERNATIVE_ROUTE_GOAL,
|
||||
BOTLIB_AAS_PREDICT_ROUTE,
|
||||
BOTLIB_AAS_POINT_REACHABILITY_AREA_INDEX,
|
||||
|
||||
BOTLIB_PC_LOAD_SOURCE,
|
||||
BOTLIB_PC_FREE_SOURCE,
|
||||
BOTLIB_PC_READ_TOKEN,
|
||||
BOTLIB_PC_SOURCE_FILE_AND_LINE
|
||||
|
||||
} gameImport_t;
|
||||
|
||||
|
||||
//
|
||||
// functions exported by the game subsystem
|
||||
//
|
||||
typedef enum {
|
||||
GAME_INIT, // ( int levelTime, int randomSeed, int restart );
|
||||
// init and shutdown will be called every single level
|
||||
// The game should call G_GET_ENTITY_TOKEN to parse through all the
|
||||
// entity configuration text and spawn gentities.
|
||||
|
||||
GAME_SHUTDOWN, // (void);
|
||||
|
||||
GAME_CLIENT_CONNECT, // ( int clientNum, qboolean firstTime, qboolean isBot );
|
||||
// return NULL if the client is allowed to connect, otherwise return
|
||||
// a text string with the reason for denial
|
||||
|
||||
GAME_CLIENT_BEGIN, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_USERINFO_CHANGED, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_DISCONNECT, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_COMMAND, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_THINK, // ( int clientNum );
|
||||
|
||||
GAME_RUN_FRAME, // ( int levelTime );
|
||||
|
||||
GAME_CONSOLE_COMMAND, // ( void );
|
||||
// ConsoleCommand will be called when a command has been issued
|
||||
// that is not recognized as a builtin function.
|
||||
// The game can issue trap_argc() / trap_argv() commands to get the command
|
||||
// and parameters. Return qfalse if the game doesn't recognize it as a command.
|
||||
|
||||
BOTAI_START_FRAME // ( int time );
|
||||
} gameExport_t;
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
// g_public.h -- game module information visible to server
|
||||
|
||||
#define GAME_API_VERSION 8
|
||||
|
||||
// entity->svFlags
|
||||
// the server does not know how to interpret most of the values
|
||||
// in entityStates (level eType), so the game must explicitly flag
|
||||
// special server behaviors
|
||||
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
|
||||
|
||||
// TTimo
|
||||
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=551
|
||||
#define SVF_CLIENTMASK 0x00000002
|
||||
|
||||
#define SVF_BOT 0x00000008 // set if the entity is a bot
|
||||
#define SVF_BROADCAST 0x00000020 // send to all connected clients
|
||||
#define SVF_PORTAL 0x00000040 // merge a second pvs at origin2 into snapshots
|
||||
#define SVF_USE_CURRENT_ORIGIN 0x00000080 // entity->r.currentOrigin instead of entity->s.origin
|
||||
// for link position (missiles and movers)
|
||||
#define SVF_SINGLECLIENT 0x00000100 // only send to a single client (entityShared_t->singleClient)
|
||||
#define SVF_NOSERVERINFO 0x00000200 // don't send CS_SERVERINFO updates to this client
|
||||
// so that it can be updated for ping tools without
|
||||
// lagging clients
|
||||
#define SVF_CAPSULE 0x00000400 // use capsule for collision detection instead of bbox
|
||||
#define SVF_NOTSINGLECLIENT 0x00000800 // send entity to everyone but one client
|
||||
// (entityShared_t->singleClient)
|
||||
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
|
||||
typedef struct {
|
||||
entityState_t s; // communicated by server to clients
|
||||
|
||||
qboolean linked; // qfalse if not in any good cluster
|
||||
int linkcount;
|
||||
|
||||
int svFlags; // SVF_NOCLIENT, SVF_BROADCAST, etc
|
||||
|
||||
// only send to this client when SVF_SINGLECLIENT is set
|
||||
// if SVF_CLIENTMASK is set, use bitmask for clients to send to (maxclients must be <= 32, up to the mod to enforce this)
|
||||
int singleClient;
|
||||
|
||||
qboolean bmodel; // if false, assume an explicit mins / maxs bounding box
|
||||
// only set by trap_SetBrushModel
|
||||
vec3_t mins, maxs;
|
||||
int contents; // CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc
|
||||
// a non-solid entity should set to 0
|
||||
|
||||
vec3_t absmin, absmax; // derived from mins/maxs and origin + rotation
|
||||
|
||||
// currentOrigin will be used for all collision detection and world linking.
|
||||
// it will not necessarily be the same as the trajectory evaluation for the current
|
||||
// time, because each entity must be moved one at a time after time is advanced
|
||||
// to avoid simultanious collision issues
|
||||
vec3_t currentOrigin;
|
||||
vec3_t currentAngles;
|
||||
|
||||
// when a trace call is made and passEntityNum != ENTITYNUM_NONE,
|
||||
// an ent will be excluded from testing if:
|
||||
// ent->s.number == passEntityNum (don't interact with self)
|
||||
// ent->s.ownerNum = passEntityNum (don't interact with your own missiles)
|
||||
// entity[ent->s.ownerNum].ownerNum = passEntityNum (don't interact with other missiles from owner)
|
||||
int ownerNum;
|
||||
} entityShared_t;
|
||||
|
||||
|
||||
|
||||
// the server looks at a sharedEntity, which is the start of the game's gentity_t structure
|
||||
typedef struct {
|
||||
entityState_t s; // communicated by server to clients
|
||||
entityShared_t r; // shared by both the server system and game
|
||||
} sharedEntity_t;
|
||||
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
//
|
||||
// system traps provided by the main engine
|
||||
//
|
||||
typedef enum {
|
||||
//============== general Quake services ==================
|
||||
|
||||
G_PRINT, // ( const char *string );
|
||||
// print message on the local console
|
||||
|
||||
G_ERROR, // ( const char *string );
|
||||
// abort the game
|
||||
|
||||
G_MILLISECONDS, // ( void );
|
||||
// get current time for profiling reasons
|
||||
// this should NOT be used for any game related tasks,
|
||||
// because it is not journaled
|
||||
|
||||
// console variable interaction
|
||||
G_CVAR_REGISTER, // ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags );
|
||||
G_CVAR_UPDATE, // ( vmCvar_t *vmCvar );
|
||||
G_CVAR_SET, // ( const char *var_name, const char *value );
|
||||
G_CVAR_VARIABLE_INTEGER_VALUE, // ( const char *var_name );
|
||||
|
||||
G_CVAR_VARIABLE_STRING_BUFFER, // ( const char *var_name, char *buffer, int bufsize );
|
||||
|
||||
G_ARGC, // ( void );
|
||||
// ClientCommand and ServerCommand parameter access
|
||||
|
||||
G_ARGV, // ( int n, char *buffer, int bufferLength );
|
||||
|
||||
G_FS_FOPEN_FILE, // ( const char *qpath, fileHandle_t *file, fsMode_t mode );
|
||||
G_FS_READ, // ( void *buffer, int len, fileHandle_t f );
|
||||
G_FS_WRITE, // ( const void *buffer, int len, fileHandle_t f );
|
||||
G_FS_FCLOSE_FILE, // ( fileHandle_t f );
|
||||
|
||||
G_SEND_CONSOLE_COMMAND, // ( const char *text );
|
||||
// add commands to the console as if they were typed in
|
||||
// for map changing, etc
|
||||
|
||||
|
||||
//=========== server specific functionality =============
|
||||
|
||||
G_LOCATE_GAME_DATA, // ( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t,
|
||||
// playerState_t *clients, int sizeofGameClient );
|
||||
// the game needs to let the server system know where and how big the gentities
|
||||
// are, so it can look at them directly without going through an interface
|
||||
|
||||
G_DROP_CLIENT, // ( int clientNum, const char *reason );
|
||||
// kick a client off the server with a message
|
||||
|
||||
G_SEND_SERVER_COMMAND, // ( int clientNum, const char *fmt, ... );
|
||||
// reliably sends a command string to be interpreted by the given
|
||||
// client. If clientNum is -1, it will be sent to all clients
|
||||
|
||||
G_SET_CONFIGSTRING, // ( int num, const char *string );
|
||||
// config strings hold all the index strings, and various other information
|
||||
// that is reliably communicated to all clients
|
||||
// All of the current configstrings are sent to clients when
|
||||
// they connect, and changes are sent to all connected clients.
|
||||
// All confgstrings are cleared at each level start.
|
||||
|
||||
G_GET_CONFIGSTRING, // ( int num, char *buffer, int bufferSize );
|
||||
|
||||
G_GET_USERINFO, // ( int num, char *buffer, int bufferSize );
|
||||
// userinfo strings are maintained by the server system, so they
|
||||
// are persistant across level loads, while all other game visible
|
||||
// data is completely reset
|
||||
|
||||
G_SET_USERINFO, // ( int num, const char *buffer );
|
||||
|
||||
G_GET_SERVERINFO, // ( char *buffer, int bufferSize );
|
||||
// the serverinfo info string has all the cvars visible to server browsers
|
||||
|
||||
G_SET_BRUSH_MODEL, // ( gentity_t *ent, const char *name );
|
||||
// sets mins and maxs based on the brushmodel name
|
||||
|
||||
G_TRACE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
||||
// collision detection against all linked entities
|
||||
|
||||
G_POINT_CONTENTS, // ( const vec3_t point, int passEntityNum );
|
||||
// point contents against all linked entities
|
||||
|
||||
G_IN_PVS, // ( const vec3_t p1, const vec3_t p2 );
|
||||
|
||||
G_IN_PVS_IGNORE_PORTALS, // ( const vec3_t p1, const vec3_t p2 );
|
||||
|
||||
G_ADJUST_AREA_PORTAL_STATE, // ( gentity_t *ent, qboolean open );
|
||||
|
||||
G_AREAS_CONNECTED, // ( int area1, int area2 );
|
||||
|
||||
G_LINKENTITY, // ( gentity_t *ent );
|
||||
// an entity will never be sent to a client or used for collision
|
||||
// if it is not passed to linkentity. If the size, position, or
|
||||
// solidity changes, it must be relinked.
|
||||
|
||||
G_UNLINKENTITY, // ( gentity_t *ent );
|
||||
// call before removing an interactive entity
|
||||
|
||||
G_ENTITIES_IN_BOX, // ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount );
|
||||
// EntitiesInBox will return brush models based on their bounding box,
|
||||
// so exact determination must still be done with EntityContact
|
||||
|
||||
G_ENTITY_CONTACT, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
|
||||
// perform an exact check against inline brush models of non-square shape
|
||||
|
||||
// access for bots to get and free a server client (FIXME?)
|
||||
G_BOT_ALLOCATE_CLIENT, // ( void );
|
||||
|
||||
G_BOT_FREE_CLIENT, // ( int clientNum );
|
||||
|
||||
G_GET_USERCMD, // ( int clientNum, usercmd_t *cmd )
|
||||
|
||||
G_GET_ENTITY_TOKEN, // qboolean ( char *buffer, int bufferSize )
|
||||
// Retrieves the next string token from the entity spawn text, returning
|
||||
// false when all tokens have been parsed.
|
||||
// This should only be done at GAME_INIT time.
|
||||
|
||||
G_FS_GETFILELIST,
|
||||
G_DEBUG_POLYGON_CREATE,
|
||||
G_DEBUG_POLYGON_DELETE,
|
||||
G_REAL_TIME,
|
||||
G_SNAPVECTOR,
|
||||
|
||||
G_TRACECAPSULE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
||||
G_ENTITY_CONTACTCAPSULE, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
|
||||
|
||||
// 1.32
|
||||
G_FS_SEEK,
|
||||
|
||||
BOTLIB_SETUP = 200, // ( void );
|
||||
BOTLIB_SHUTDOWN, // ( void );
|
||||
BOTLIB_LIBVAR_SET,
|
||||
BOTLIB_LIBVAR_GET,
|
||||
BOTLIB_PC_ADD_GLOBAL_DEFINE,
|
||||
BOTLIB_START_FRAME,
|
||||
BOTLIB_LOAD_MAP,
|
||||
BOTLIB_UPDATENTITY,
|
||||
BOTLIB_TEST,
|
||||
|
||||
BOTLIB_GET_SNAPSHOT_ENTITY, // ( int client, int ent );
|
||||
BOTLIB_GET_CONSOLE_MESSAGE, // ( int client, char *message, int size );
|
||||
BOTLIB_USER_COMMAND, // ( int client, usercmd_t *ucmd );
|
||||
|
||||
BOTLIB_AAS_ENABLE_ROUTING_AREA = 300,
|
||||
BOTLIB_AAS_BBOX_AREAS,
|
||||
BOTLIB_AAS_AREA_INFO,
|
||||
BOTLIB_AAS_ENTITY_INFO,
|
||||
|
||||
BOTLIB_AAS_INITIALIZED,
|
||||
BOTLIB_AAS_PRESENCE_TYPE_BOUNDING_BOX,
|
||||
BOTLIB_AAS_TIME,
|
||||
|
||||
BOTLIB_AAS_POINT_AREA_NUM,
|
||||
BOTLIB_AAS_TRACE_AREAS,
|
||||
|
||||
BOTLIB_AAS_POINT_CONTENTS,
|
||||
BOTLIB_AAS_NEXT_BSP_ENTITY,
|
||||
BOTLIB_AAS_VALUE_FOR_BSP_EPAIR_KEY,
|
||||
BOTLIB_AAS_VECTOR_FOR_BSP_EPAIR_KEY,
|
||||
BOTLIB_AAS_FLOAT_FOR_BSP_EPAIR_KEY,
|
||||
BOTLIB_AAS_INT_FOR_BSP_EPAIR_KEY,
|
||||
|
||||
BOTLIB_AAS_AREA_REACHABILITY,
|
||||
|
||||
BOTLIB_AAS_AREA_TRAVEL_TIME_TO_GOAL_AREA,
|
||||
|
||||
BOTLIB_AAS_SWIMMING,
|
||||
BOTLIB_AAS_PREDICT_CLIENT_MOVEMENT,
|
||||
|
||||
BOTLIB_EA_SAY = 400,
|
||||
BOTLIB_EA_SAY_TEAM,
|
||||
BOTLIB_EA_COMMAND,
|
||||
|
||||
BOTLIB_EA_ACTION,
|
||||
BOTLIB_EA_GESTURE,
|
||||
BOTLIB_EA_TALK,
|
||||
BOTLIB_EA_ATTACK,
|
||||
BOTLIB_EA_USE,
|
||||
BOTLIB_EA_RESPAWN,
|
||||
BOTLIB_EA_CROUCH,
|
||||
BOTLIB_EA_MOVE_UP,
|
||||
BOTLIB_EA_MOVE_DOWN,
|
||||
BOTLIB_EA_MOVE_FORWARD,
|
||||
BOTLIB_EA_MOVE_BACK,
|
||||
BOTLIB_EA_MOVE_LEFT,
|
||||
BOTLIB_EA_MOVE_RIGHT,
|
||||
|
||||
BOTLIB_EA_SELECT_WEAPON,
|
||||
BOTLIB_EA_JUMP,
|
||||
BOTLIB_EA_DELAYED_JUMP,
|
||||
BOTLIB_EA_MOVE,
|
||||
BOTLIB_EA_VIEW,
|
||||
|
||||
BOTLIB_EA_END_REGULAR,
|
||||
BOTLIB_EA_GET_INPUT,
|
||||
BOTLIB_EA_RESET_INPUT,
|
||||
|
||||
|
||||
BOTLIB_AI_LOAD_CHARACTER = 500,
|
||||
BOTLIB_AI_FREE_CHARACTER,
|
||||
BOTLIB_AI_CHARACTERISTIC_FLOAT,
|
||||
BOTLIB_AI_CHARACTERISTIC_BFLOAT,
|
||||
BOTLIB_AI_CHARACTERISTIC_INTEGER,
|
||||
BOTLIB_AI_CHARACTERISTIC_BINTEGER,
|
||||
BOTLIB_AI_CHARACTERISTIC_STRING,
|
||||
|
||||
BOTLIB_AI_ALLOC_CHAT_STATE,
|
||||
BOTLIB_AI_FREE_CHAT_STATE,
|
||||
BOTLIB_AI_QUEUE_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_REMOVE_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_NEXT_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_NUM_CONSOLE_MESSAGE,
|
||||
BOTLIB_AI_INITIAL_CHAT,
|
||||
BOTLIB_AI_REPLY_CHAT,
|
||||
BOTLIB_AI_CHAT_LENGTH,
|
||||
BOTLIB_AI_ENTER_CHAT,
|
||||
BOTLIB_AI_STRING_CONTAINS,
|
||||
BOTLIB_AI_FIND_MATCH,
|
||||
BOTLIB_AI_MATCH_VARIABLE,
|
||||
BOTLIB_AI_UNIFY_WHITE_SPACES,
|
||||
BOTLIB_AI_REPLACE_SYNONYMS,
|
||||
BOTLIB_AI_LOAD_CHAT_FILE,
|
||||
BOTLIB_AI_SET_CHAT_GENDER,
|
||||
BOTLIB_AI_SET_CHAT_NAME,
|
||||
|
||||
BOTLIB_AI_RESET_GOAL_STATE,
|
||||
BOTLIB_AI_RESET_AVOID_GOALS,
|
||||
BOTLIB_AI_PUSH_GOAL,
|
||||
BOTLIB_AI_POP_GOAL,
|
||||
BOTLIB_AI_EMPTY_GOAL_STACK,
|
||||
BOTLIB_AI_DUMP_AVOID_GOALS,
|
||||
BOTLIB_AI_DUMP_GOAL_STACK,
|
||||
BOTLIB_AI_GOAL_NAME,
|
||||
BOTLIB_AI_GET_TOP_GOAL,
|
||||
BOTLIB_AI_GET_SECOND_GOAL,
|
||||
BOTLIB_AI_CHOOSE_LTG_ITEM,
|
||||
BOTLIB_AI_CHOOSE_NBG_ITEM,
|
||||
BOTLIB_AI_TOUCHING_GOAL,
|
||||
BOTLIB_AI_ITEM_GOAL_IN_VIS_BUT_NOT_VISIBLE,
|
||||
BOTLIB_AI_GET_LEVEL_ITEM_GOAL,
|
||||
BOTLIB_AI_AVOID_GOAL_TIME,
|
||||
BOTLIB_AI_INIT_LEVEL_ITEMS,
|
||||
BOTLIB_AI_UPDATE_ENTITY_ITEMS,
|
||||
BOTLIB_AI_LOAD_ITEM_WEIGHTS,
|
||||
BOTLIB_AI_FREE_ITEM_WEIGHTS,
|
||||
BOTLIB_AI_SAVE_GOAL_FUZZY_LOGIC,
|
||||
BOTLIB_AI_ALLOC_GOAL_STATE,
|
||||
BOTLIB_AI_FREE_GOAL_STATE,
|
||||
|
||||
BOTLIB_AI_RESET_MOVE_STATE,
|
||||
BOTLIB_AI_MOVE_TO_GOAL,
|
||||
BOTLIB_AI_MOVE_IN_DIRECTION,
|
||||
BOTLIB_AI_RESET_AVOID_REACH,
|
||||
BOTLIB_AI_RESET_LAST_AVOID_REACH,
|
||||
BOTLIB_AI_REACHABILITY_AREA,
|
||||
BOTLIB_AI_MOVEMENT_VIEW_TARGET,
|
||||
BOTLIB_AI_ALLOC_MOVE_STATE,
|
||||
BOTLIB_AI_FREE_MOVE_STATE,
|
||||
BOTLIB_AI_INIT_MOVE_STATE,
|
||||
|
||||
BOTLIB_AI_CHOOSE_BEST_FIGHT_WEAPON,
|
||||
BOTLIB_AI_GET_WEAPON_INFO,
|
||||
BOTLIB_AI_LOAD_WEAPON_WEIGHTS,
|
||||
BOTLIB_AI_ALLOC_WEAPON_STATE,
|
||||
BOTLIB_AI_FREE_WEAPON_STATE,
|
||||
BOTLIB_AI_RESET_WEAPON_STATE,
|
||||
|
||||
BOTLIB_AI_GENETIC_PARENTS_AND_CHILD_SELECTION,
|
||||
BOTLIB_AI_INTERBREED_GOAL_FUZZY_LOGIC,
|
||||
BOTLIB_AI_MUTATE_GOAL_FUZZY_LOGIC,
|
||||
BOTLIB_AI_GET_NEXT_CAMP_SPOT_GOAL,
|
||||
BOTLIB_AI_GET_MAP_LOCATION_GOAL,
|
||||
BOTLIB_AI_NUM_INITIAL_CHATS,
|
||||
BOTLIB_AI_GET_CHAT_MESSAGE,
|
||||
BOTLIB_AI_REMOVE_FROM_AVOID_GOALS,
|
||||
BOTLIB_AI_PREDICT_VISIBLE_POSITION,
|
||||
|
||||
BOTLIB_AI_SET_AVOID_GOAL_TIME,
|
||||
BOTLIB_AI_ADD_AVOID_SPOT,
|
||||
BOTLIB_AAS_ALTERNATIVE_ROUTE_GOAL,
|
||||
BOTLIB_AAS_PREDICT_ROUTE,
|
||||
BOTLIB_AAS_POINT_REACHABILITY_AREA_INDEX,
|
||||
|
||||
BOTLIB_PC_LOAD_SOURCE,
|
||||
BOTLIB_PC_FREE_SOURCE,
|
||||
BOTLIB_PC_READ_TOKEN,
|
||||
BOTLIB_PC_SOURCE_FILE_AND_LINE
|
||||
|
||||
} gameImport_t;
|
||||
|
||||
|
||||
//
|
||||
// functions exported by the game subsystem
|
||||
//
|
||||
typedef enum {
|
||||
GAME_INIT, // ( int levelTime, int randomSeed, int restart );
|
||||
// init and shutdown will be called every single level
|
||||
// The game should call G_GET_ENTITY_TOKEN to parse through all the
|
||||
// entity configuration text and spawn gentities.
|
||||
|
||||
GAME_SHUTDOWN, // (void);
|
||||
|
||||
GAME_CLIENT_CONNECT, // ( int clientNum, qboolean firstTime, qboolean isBot );
|
||||
// return NULL if the client is allowed to connect, otherwise return
|
||||
// a text string with the reason for denial
|
||||
|
||||
GAME_CLIENT_BEGIN, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_USERINFO_CHANGED, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_DISCONNECT, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_COMMAND, // ( int clientNum );
|
||||
|
||||
GAME_CLIENT_THINK, // ( int clientNum );
|
||||
|
||||
GAME_RUN_FRAME, // ( int levelTime );
|
||||
|
||||
GAME_CONSOLE_COMMAND, // ( void );
|
||||
// ConsoleCommand will be called when a command has been issued
|
||||
// that is not recognized as a builtin function.
|
||||
// The game can issue trap_argc() / trap_argv() commands to get the command
|
||||
// and parameters. Return qfalse if the game doesn't recognize it as a command.
|
||||
|
||||
BOTAI_START_FRAME // ( int time );
|
||||
} gameExport_t;
|
||||
|
||||
|
|
2270
code/game/g_rankings.c
Normal file → Executable file
2270
code/game/g_rankings.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
792
code/game/g_rankings.h
Normal file → Executable file
792
code/game/g_rankings.h
Normal file → Executable file
|
@ -1,396 +1,396 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
// g_rankings.h -- score keys for global rankings
|
||||
|
||||
#ifndef _G_RANKINGS_H_
|
||||
#define _G_RANKINGS_H_
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
Key digits:
|
||||
10^9: report type
|
||||
1 = normal
|
||||
2 = developer-only
|
||||
10^8: stat type
|
||||
0 = match stat
|
||||
1 = single player stat
|
||||
2 = duel stat
|
||||
10^7: data type
|
||||
0 = string
|
||||
1 = uint32
|
||||
10^6: calculation
|
||||
0 = use raw value
|
||||
1 = add to total
|
||||
2 = average
|
||||
3 = max
|
||||
4 = min
|
||||
10^5
|
||||
10^4: category
|
||||
00 = general
|
||||
01 = session
|
||||
02 = weapon
|
||||
03 = ammo
|
||||
04 = health
|
||||
05 = armor
|
||||
06 = powerup
|
||||
07 = holdable
|
||||
08 = hazard
|
||||
09 = reward
|
||||
10 = teammate
|
||||
11 = ctf
|
||||
10^3:
|
||||
10^2: sub-category
|
||||
10^1:
|
||||
10^0: ordinal
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
// general keys
|
||||
#define QGR_KEY_MATCH_RATING 1112000001
|
||||
#define QGR_KEY_PLAYED_WITH 1210000002
|
||||
|
||||
// session keys
|
||||
#define QGR_KEY_HOSTNAME 1000010000
|
||||
#define QGR_KEY_MAP 1000010001
|
||||
#define QGR_KEY_MOD 1000010002
|
||||
#define QGR_KEY_GAMETYPE 1010010003
|
||||
#define QGR_KEY_FRAGLIMIT 1010010004
|
||||
#define QGR_KEY_TIMELIMIT 1010010005
|
||||
#define QGR_KEY_MAXCLIENTS 1010010006
|
||||
#define QGR_KEY_MAXRATE 1010010007
|
||||
#define QGR_KEY_MINPING 1010010008
|
||||
#define QGR_KEY_MAXPING 1010010009
|
||||
#define QGR_KEY_DEDICATED 1010010010
|
||||
#define QGR_KEY_VERSION 1000010011
|
||||
|
||||
// weapon keys
|
||||
#define QGR_KEY_FRAG 1211020000
|
||||
#define QGR_KEY_SUICIDE 1111020001
|
||||
#define QGR_KEY_SHOT_FIRED 1111020002
|
||||
#define QGR_KEY_HIT_GIVEN 1111020003
|
||||
#define QGR_KEY_HIT_TAKEN 1111020004
|
||||
#define QGR_KEY_DAMAGE_GIVEN 1111020005
|
||||
#define QGR_KEY_DAMAGE_TAKEN 1111020006
|
||||
#define QGR_KEY_SPLASH_GIVEN 1111020007
|
||||
#define QGR_KEY_SPLASH_TAKEN 1111020008
|
||||
#define QGR_KEY_PICKUP_WEAPON 1111020009
|
||||
#define QGR_KEY_TIME 1111020010
|
||||
|
||||
#define QGR_KEY_FRAG_GAUNTLET 1211020100
|
||||
#define QGR_KEY_SUICIDE_GAUNTLET 1111020101
|
||||
#define QGR_KEY_SHOT_FIRED_GAUNTLET 1111020102
|
||||
#define QGR_KEY_HIT_GIVEN_GAUNTLET 1111020103
|
||||
#define QGR_KEY_HIT_TAKEN_GAUNTLET 1111020104
|
||||
#define QGR_KEY_DAMAGE_GIVEN_GAUNTLET 1111020105
|
||||
#define QGR_KEY_DAMAGE_TAKEN_GAUNTLET 1111020106
|
||||
#define QGR_KEY_SPLASH_GIVEN_GAUNTLET 1111020107
|
||||
#define QGR_KEY_SPLASH_TAKEN_GAUNTLET 1111020108
|
||||
#define QGR_KEY_PICKUP_GAUNTLET 1111020109
|
||||
#define QGR_KEY_TIME_GAUNTLET 1111020110
|
||||
|
||||
#define QGR_KEY_FRAG_MACHINEGUN 1211020200
|
||||
#define QGR_KEY_SUICIDE_MACHINEGUN 1111020201
|
||||
#define QGR_KEY_SHOT_FIRED_MACHINEGUN 1111020202
|
||||
#define QGR_KEY_HIT_GIVEN_MACHINEGUN 1111020203
|
||||
#define QGR_KEY_HIT_TAKEN_MACHINEGUN 1111020204
|
||||
#define QGR_KEY_DAMAGE_GIVEN_MACHINEGUN 1111020205
|
||||
#define QGR_KEY_DAMAGE_TAKEN_MACHINEGUN 1111020206
|
||||
#define QGR_KEY_SPLASH_GIVEN_MACHINEGUN 1111020207
|
||||
#define QGR_KEY_SPLASH_TAKEN_MACHINEGUN 1111020208
|
||||
#define QGR_KEY_PICKUP_MACHINEGUN 1111020209
|
||||
#define QGR_KEY_TIME_MACHINEGUN 1111020210
|
||||
|
||||
#define QGR_KEY_FRAG_SHOTGUN 1211020300
|
||||
#define QGR_KEY_SUICIDE_SHOTGUN 1111020301
|
||||
#define QGR_KEY_SHOT_FIRED_SHOTGUN 1111020302
|
||||
#define QGR_KEY_HIT_GIVEN_SHOTGUN 1111020303
|
||||
#define QGR_KEY_HIT_TAKEN_SHOTGUN 1111020304
|
||||
#define QGR_KEY_DAMAGE_GIVEN_SHOTGUN 1111020305
|
||||
#define QGR_KEY_DAMAGE_TAKEN_SHOTGUN 1111020306
|
||||
#define QGR_KEY_SPLASH_GIVEN_SHOTGUN 1111020307
|
||||
#define QGR_KEY_SPLASH_TAKEN_SHOTGUN 1111020308
|
||||
#define QGR_KEY_PICKUP_SHOTGUN 1111020309
|
||||
#define QGR_KEY_TIME_SHOTGUN 1111020310
|
||||
|
||||
#define QGR_KEY_FRAG_GRENADE 1211020400
|
||||
#define QGR_KEY_SUICIDE_GRENADE 1111020401
|
||||
#define QGR_KEY_SHOT_FIRED_GRENADE 1111020402
|
||||
#define QGR_KEY_HIT_GIVEN_GRENADE 1111020403
|
||||
#define QGR_KEY_HIT_TAKEN_GRENADE 1111020404
|
||||
#define QGR_KEY_DAMAGE_GIVEN_GRENADE 1111020405
|
||||
#define QGR_KEY_DAMAGE_TAKEN_GRENADE 1111020406
|
||||
#define QGR_KEY_SPLASH_GIVEN_GRENADE 1111020407
|
||||
#define QGR_KEY_SPLASH_TAKEN_GRENADE 1111020408
|
||||
#define QGR_KEY_PICKUP_GRENADE 1111020409
|
||||
#define QGR_KEY_TIME_GRENADE 1111020410
|
||||
|
||||
#define QGR_KEY_FRAG_ROCKET 1211020500
|
||||
#define QGR_KEY_SUICIDE_ROCKET 1111020501
|
||||
#define QGR_KEY_SHOT_FIRED_ROCKET 1111020502
|
||||
#define QGR_KEY_HIT_GIVEN_ROCKET 1111020503
|
||||
#define QGR_KEY_HIT_TAKEN_ROCKET 1111020504
|
||||
#define QGR_KEY_DAMAGE_GIVEN_ROCKET 1111020505
|
||||
#define QGR_KEY_DAMAGE_TAKEN_ROCKET 1111020506
|
||||
#define QGR_KEY_SPLASH_GIVEN_ROCKET 1111020507
|
||||
#define QGR_KEY_SPLASH_TAKEN_ROCKET 1111020508
|
||||
#define QGR_KEY_PICKUP_ROCKET 1111020509
|
||||
#define QGR_KEY_TIME_ROCKET 1111020510
|
||||
|
||||
#define QGR_KEY_FRAG_PLASMA 1211020600
|
||||
#define QGR_KEY_SUICIDE_PLASMA 1111020601
|
||||
#define QGR_KEY_SHOT_FIRED_PLASMA 1111020602
|
||||
#define QGR_KEY_HIT_GIVEN_PLASMA 1111020603
|
||||
#define QGR_KEY_HIT_TAKEN_PLASMA 1111020604
|
||||
#define QGR_KEY_DAMAGE_GIVEN_PLASMA 1111020605
|
||||
#define QGR_KEY_DAMAGE_TAKEN_PLASMA 1111020606
|
||||
#define QGR_KEY_SPLASH_GIVEN_PLASMA 1111020607
|
||||
#define QGR_KEY_SPLASH_TAKEN_PLASMA 1111020608
|
||||
#define QGR_KEY_PICKUP_PLASMA 1111020609
|
||||
#define QGR_KEY_TIME_PLASMA 1111020610
|
||||
|
||||
#define QGR_KEY_FRAG_RAILGUN 1211020700
|
||||
#define QGR_KEY_SUICIDE_RAILGUN 1111020701
|
||||
#define QGR_KEY_SHOT_FIRED_RAILGUN 1111020702
|
||||
#define QGR_KEY_HIT_GIVEN_RAILGUN 1111020703
|
||||
#define QGR_KEY_HIT_TAKEN_RAILGUN 1111020704
|
||||
#define QGR_KEY_DAMAGE_GIVEN_RAILGUN 1111020705
|
||||
#define QGR_KEY_DAMAGE_TAKEN_RAILGUN 1111020706
|
||||
#define QGR_KEY_SPLASH_GIVEN_RAILGUN 1111020707
|
||||
#define QGR_KEY_SPLASH_TAKEN_RAILGUN 1111020708
|
||||
#define QGR_KEY_PICKUP_RAILGUN 1111020709
|
||||
#define QGR_KEY_TIME_RAILGUN 1111020710
|
||||
|
||||
#define QGR_KEY_FRAG_LIGHTNING 1211020800
|
||||
#define QGR_KEY_SUICIDE_LIGHTNING 1111020801
|
||||
#define QGR_KEY_SHOT_FIRED_LIGHTNING 1111020802
|
||||
#define QGR_KEY_HIT_GIVEN_LIGHTNING 1111020803
|
||||
#define QGR_KEY_HIT_TAKEN_LIGHTNING 1111020804
|
||||
#define QGR_KEY_DAMAGE_GIVEN_LIGHTNING 1111020805
|
||||
#define QGR_KEY_DAMAGE_TAKEN_LIGHTNING 1111020806
|
||||
#define QGR_KEY_SPLASH_GIVEN_LIGHTNING 1111020807
|
||||
#define QGR_KEY_SPLASH_TAKEN_LIGHTNING 1111020808
|
||||
#define QGR_KEY_PICKUP_LIGHTNING 1111020809
|
||||
#define QGR_KEY_TIME_LIGHTNING 1111020810
|
||||
|
||||
#define QGR_KEY_FRAG_BFG 1211020900
|
||||
#define QGR_KEY_SUICIDE_BFG 1111020901
|
||||
#define QGR_KEY_SHOT_FIRED_BFG 1111020902
|
||||
#define QGR_KEY_HIT_GIVEN_BFG 1111020903
|
||||
#define QGR_KEY_HIT_TAKEN_BFG 1111020904
|
||||
#define QGR_KEY_DAMAGE_GIVEN_BFG 1111020905
|
||||
#define QGR_KEY_DAMAGE_TAKEN_BFG 1111020906
|
||||
#define QGR_KEY_SPLASH_GIVEN_BFG 1111020907
|
||||
#define QGR_KEY_SPLASH_TAKEN_BFG 1111020908
|
||||
#define QGR_KEY_PICKUP_BFG 1111020909
|
||||
#define QGR_KEY_TIME_BFG 1111020910
|
||||
|
||||
#define QGR_KEY_FRAG_GRAPPLE 1211021000
|
||||
#define QGR_KEY_SUICIDE_GRAPPLE 1111021001
|
||||
#define QGR_KEY_SHOT_FIRED_GRAPPLE 1111021002
|
||||
#define QGR_KEY_HIT_GIVEN_GRAPPLE 1111021003
|
||||
#define QGR_KEY_HIT_TAKEN_GRAPPLE 1111021004
|
||||
#define QGR_KEY_DAMAGE_GIVEN_GRAPPLE 1111021005
|
||||
#define QGR_KEY_DAMAGE_TAKEN_GRAPPLE 1111021006
|
||||
#define QGR_KEY_SPLASH_GIVEN_GRAPPLE 1111021007
|
||||
#define QGR_KEY_SPLASH_TAKEN_GRAPPLE 1111021008
|
||||
#define QGR_KEY_PICKUP_GRAPPLE 1111021009
|
||||
#define QGR_KEY_TIME_GRAPPLE 1111021010
|
||||
|
||||
#define QGR_KEY_FRAG_UNKNOWN 1211021100
|
||||
#define QGR_KEY_SUICIDE_UNKNOWN 1111021101
|
||||
#define QGR_KEY_SHOT_FIRED_UNKNOWN 1111021102
|
||||
#define QGR_KEY_HIT_GIVEN_UNKNOWN 1111021103
|
||||
#define QGR_KEY_HIT_TAKEN_UNKNOWN 1111021104
|
||||
#define QGR_KEY_DAMAGE_GIVEN_UNKNOWN 1111021105
|
||||
#define QGR_KEY_DAMAGE_TAKEN_UNKNOWN 1111021106
|
||||
#define QGR_KEY_SPLASH_GIVEN_UNKNOWN 1111021107
|
||||
#define QGR_KEY_SPLASH_TAKEN_UNKNOWN 1111021108
|
||||
#define QGR_KEY_PICKUP_UNKNOWN 1111021109
|
||||
#define QGR_KEY_TIME_UNKNOWN 1111021110
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// new to team arena
|
||||
#define QGR_KEY_FRAG_NAILGIN 1211021200
|
||||
#define QGR_KEY_SUICIDE_NAILGIN 1111021201
|
||||
#define QGR_KEY_SHOT_FIRED_NAILGIN 1111021202
|
||||
#define QGR_KEY_HIT_GIVEN_NAILGIN 1111021203
|
||||
#define QGR_KEY_HIT_TAKEN_NAILGIN 1111021204
|
||||
#define QGR_KEY_DAMAGE_GIVEN_NAILGIN 1111021205
|
||||
#define QGR_KEY_DAMAGE_TAKEN_NAILGIN 1111021206
|
||||
#define QGR_KEY_SPLASH_GIVEN_NAILGIN 1111021207
|
||||
#define QGR_KEY_SPLASH_TAKEN_NAILGIN 1111021208
|
||||
#define QGR_KEY_PICKUP_NAILGIN 1111021209
|
||||
#define QGR_KEY_TIME_NAILGIN 1111021210
|
||||
// new to team arena
|
||||
#define QGR_KEY_FRAG_PROX_LAUNCHER 1211021300
|
||||
#define QGR_KEY_SUICIDE_PROX_LAUNCHER 1111021301
|
||||
#define QGR_KEY_SHOT_FIRED_PROX_LAUNCHER 1111021302
|
||||
#define QGR_KEY_HIT_GIVEN_PROX_LAUNCHER 1111021303
|
||||
#define QGR_KEY_HIT_TAKEN_PROX_LAUNCHER 1111021304
|
||||
#define QGR_KEY_DAMAGE_GIVEN_PROX_LAUNCHER 1111021305
|
||||
#define QGR_KEY_DAMAGE_TAKEN_PROX_LAUNCHER 1111021306
|
||||
#define QGR_KEY_SPLASH_GIVEN_PROX_LAUNCHER 1111021307
|
||||
#define QGR_KEY_SPLASH_TAKEN_PROX_LAUNCHER 1111021308
|
||||
#define QGR_KEY_PICKUP_PROX_LAUNCHER 1111021309
|
||||
#define QGR_KEY_TIME_PROX_LAUNCHER 1111021310
|
||||
// new to team arena
|
||||
#define QGR_KEY_FRAG_CHAINGUN 1211021400
|
||||
#define QGR_KEY_SUICIDE_CHAINGUN 1111021401
|
||||
#define QGR_KEY_SHOT_FIRED_CHAINGUN 1111021402
|
||||
#define QGR_KEY_HIT_GIVEN_CHAINGUN 1111021403
|
||||
#define QGR_KEY_HIT_TAKEN_CHAINGUN 1111021404
|
||||
#define QGR_KEY_DAMAGE_GIVEN_CHAINGUN 1111021405
|
||||
#define QGR_KEY_DAMAGE_TAKEN_CHAINGUN 1111021406
|
||||
#define QGR_KEY_SPLASH_GIVEN_CHAINGUN 1111021407
|
||||
#define QGR_KEY_SPLASH_TAKEN_CHAINGUN 1111021408
|
||||
#define QGR_KEY_PICKUP_CHAINGUN 1111021409
|
||||
#define QGR_KEY_TIME_CHAINGUN 1111021410
|
||||
#endif /* MISSIONPACK */
|
||||
|
||||
// ammo keys
|
||||
#define QGR_KEY_BOXES 1111030000
|
||||
#define QGR_KEY_ROUNDS 1111030001
|
||||
|
||||
#define QGR_KEY_BOXES_BULLETS 1111030100
|
||||
#define QGR_KEY_ROUNDS_BULLETS 1111030101
|
||||
|
||||
#define QGR_KEY_BOXES_SHELLS 1111030200
|
||||
#define QGR_KEY_ROUNDS_SHELLS 1111030201
|
||||
|
||||
#define QGR_KEY_BOXES_GRENADES 1111030300
|
||||
#define QGR_KEY_ROUNDS_GRENADES 1111030301
|
||||
|
||||
#define QGR_KEY_BOXES_ROCKETS 1111030400
|
||||
#define QGR_KEY_ROUNDS_ROCKETS 1111030401
|
||||
|
||||
#define QGR_KEY_BOXES_CELLS 1111030500
|
||||
#define QGR_KEY_ROUNDS_CELLS 1111030501
|
||||
|
||||
#define QGR_KEY_BOXES_SLUGS 1111030600
|
||||
#define QGR_KEY_ROUNDS_SLUGS 1111030601
|
||||
|
||||
#define QGR_KEY_BOXES_LG_AMMO 1111030700
|
||||
#define QGR_KEY_ROUNDS_LG_AMMO 1111030701
|
||||
|
||||
#define QGR_KEY_BOXES_BFG_AMMO 1111030800
|
||||
#define QGR_KEY_ROUNDS_BFG_AMMO 1111030801
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// new to team arena
|
||||
#define QGR_KEY_BOXES_NAILGUN_AMMO 1111030900
|
||||
#define QGR_KEY_ROUNDS_NAILGUN_AMMO 1111030901
|
||||
// new to team arena
|
||||
#define QGR_KEY_BOXES_PROX_LAUNCHER_AMMO 1111031000
|
||||
#define QGR_KEY_ROUNDS_PROX_LAUNCHER_AMMO 1111031001
|
||||
// new to team arena
|
||||
#define QGR_KEY_BOXES_CHAINGUN_AMMO 1111031100
|
||||
#define QGR_KEY_ROUNDS_CHAINGUN_AMMO 1111031101
|
||||
#endif /* MISSIONPACK */
|
||||
|
||||
// health keys
|
||||
#define QGR_KEY_HEALTH 1111040000
|
||||
#define QGR_KEY_HEALTH_TOTAL 1111040001
|
||||
|
||||
#define QGR_KEY_HEALTH_5 1111040100
|
||||
#define QGR_KEY_HEALTH_25 1111040200
|
||||
#define QGR_KEY_HEALTH_50 1111040300
|
||||
#define QGR_KEY_HEALTH_MEGA 1111040400
|
||||
|
||||
// armor keys
|
||||
#define QGR_KEY_ARMOR 1111050000
|
||||
#define QGR_KEY_ARMOR_TOTAL 1111050001
|
||||
|
||||
#define QGR_KEY_ARMOR_SHARD 1111050100
|
||||
#define QGR_KEY_ARMOR_YELLOW 1111050200
|
||||
#define QGR_KEY_ARMOR_RED 1111050300
|
||||
|
||||
// powerup keys
|
||||
#define QGR_KEY_POWERUP 1111060000
|
||||
#define QGR_KEY_QUAD 1111060100
|
||||
#define QGR_KEY_SUIT 1111060200
|
||||
#define QGR_KEY_HASTE 1111060300
|
||||
#define QGR_KEY_INVIS 1111060400
|
||||
#define QGR_KEY_REGEN 1111060500
|
||||
#define QGR_KEY_FLIGHT 1111060600
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// persistant powerup keys
|
||||
// new to team arena
|
||||
#define QGR_KEY_SCOUT 1111160800
|
||||
#define QGR_KEY_GUARD 1111160801
|
||||
#define QGR_KEY_DOUBLER 1111160802
|
||||
#define QGR_KEY_AMMOREGEN 1111160803
|
||||
|
||||
#endif //MISSIONPACK
|
||||
|
||||
// holdable item keys
|
||||
#define QGR_KEY_MEDKIT 1111070000
|
||||
#define QGR_KEY_MEDKIT_USE 1111070001
|
||||
|
||||
#define QGR_KEY_TELEPORTER 1111070100
|
||||
#define QGR_KEY_TELEPORTER_USE 1111070101
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// new to team arena
|
||||
#define QGR_KEY_KAMIKAZE 1111070200
|
||||
#define QGR_KEY_KAMIKAZE_USE 1111070201
|
||||
// new to team arena
|
||||
#define QGR_KEY_PORTAL 1111070300
|
||||
#define QGR_KEY_PORTAL_USE 1111070301
|
||||
// new to team arena
|
||||
#define QGR_KEY_INVULNERABILITY 1111070400
|
||||
#define QGR_KEY_INVULNERABILITY_USE 1111070401
|
||||
#endif /* MISSIONPACK */
|
||||
|
||||
// hazard keys
|
||||
#define QGR_KEY_HAZARD_DEATH 1111080000
|
||||
#define QGR_KEY_WATER 1111080100
|
||||
#define QGR_KEY_SLIME 1111080200
|
||||
#define QGR_KEY_LAVA 1111080300
|
||||
#define QGR_KEY_CRUSH 1111080400
|
||||
#define QGR_KEY_TELEFRAG 1111080500
|
||||
#define QGR_KEY_FALLING 1111080600
|
||||
#define QGR_KEY_SUICIDE_CMD 1111080700
|
||||
#define QGR_KEY_TRIGGER_HURT 1111080800
|
||||
#define QGR_KEY_HAZARD_MISC 1111080900
|
||||
|
||||
// reward keys
|
||||
#define QGR_KEY_IMPRESSIVE 1111090000
|
||||
#define QGR_KEY_EXCELLENT 1111090100
|
||||
|
||||
// teammate keys
|
||||
#define QGR_KEY_TEAMMATE_FRAG 1211100000
|
||||
#define QGR_KEY_TEAMMATE_HIT_GIVEN 1111100001
|
||||
#define QGR_KEY_TEAMMATE_HIT_TAKEN 1111100002
|
||||
#define QGR_KEY_TEAMMATE_DAMAGE_GIVEN 1111100003
|
||||
#define QGR_KEY_TEAMMATE_DAMAGE_TAKEN 1111100004
|
||||
#define QGR_KEY_TEAMMATE_SPLASH_GIVEN 1111100005
|
||||
#define QGR_KEY_TEAMMATE_SPLASH_TAKEN 1111100006
|
||||
#define QGR_KEY_TEAM_NAME 1100100007
|
||||
|
||||
// ctf keys
|
||||
#define QGR_KEY_FLAG_PICKUP 1111110000
|
||||
#define QGR_KEY_FLAG_CAPTURE 1111110001
|
||||
|
||||
#endif // _G_RANKINGS_H_
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
// g_rankings.h -- score keys for global rankings
|
||||
|
||||
#ifndef _G_RANKINGS_H_
|
||||
#define _G_RANKINGS_H_
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
Key digits:
|
||||
10^9: report type
|
||||
1 = normal
|
||||
2 = developer-only
|
||||
10^8: stat type
|
||||
0 = match stat
|
||||
1 = single player stat
|
||||
2 = duel stat
|
||||
10^7: data type
|
||||
0 = string
|
||||
1 = uint32
|
||||
10^6: calculation
|
||||
0 = use raw value
|
||||
1 = add to total
|
||||
2 = average
|
||||
3 = max
|
||||
4 = min
|
||||
10^5
|
||||
10^4: category
|
||||
00 = general
|
||||
01 = session
|
||||
02 = weapon
|
||||
03 = ammo
|
||||
04 = health
|
||||
05 = armor
|
||||
06 = powerup
|
||||
07 = holdable
|
||||
08 = hazard
|
||||
09 = reward
|
||||
10 = teammate
|
||||
11 = ctf
|
||||
10^3:
|
||||
10^2: sub-category
|
||||
10^1:
|
||||
10^0: ordinal
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
// general keys
|
||||
#define QGR_KEY_MATCH_RATING 1112000001
|
||||
#define QGR_KEY_PLAYED_WITH 1210000002
|
||||
|
||||
// session keys
|
||||
#define QGR_KEY_HOSTNAME 1000010000
|
||||
#define QGR_KEY_MAP 1000010001
|
||||
#define QGR_KEY_MOD 1000010002
|
||||
#define QGR_KEY_GAMETYPE 1010010003
|
||||
#define QGR_KEY_FRAGLIMIT 1010010004
|
||||
#define QGR_KEY_TIMELIMIT 1010010005
|
||||
#define QGR_KEY_MAXCLIENTS 1010010006
|
||||
#define QGR_KEY_MAXRATE 1010010007
|
||||
#define QGR_KEY_MINPING 1010010008
|
||||
#define QGR_KEY_MAXPING 1010010009
|
||||
#define QGR_KEY_DEDICATED 1010010010
|
||||
#define QGR_KEY_VERSION 1000010011
|
||||
|
||||
// weapon keys
|
||||
#define QGR_KEY_FRAG 1211020000
|
||||
#define QGR_KEY_SUICIDE 1111020001
|
||||
#define QGR_KEY_SHOT_FIRED 1111020002
|
||||
#define QGR_KEY_HIT_GIVEN 1111020003
|
||||
#define QGR_KEY_HIT_TAKEN 1111020004
|
||||
#define QGR_KEY_DAMAGE_GIVEN 1111020005
|
||||
#define QGR_KEY_DAMAGE_TAKEN 1111020006
|
||||
#define QGR_KEY_SPLASH_GIVEN 1111020007
|
||||
#define QGR_KEY_SPLASH_TAKEN 1111020008
|
||||
#define QGR_KEY_PICKUP_WEAPON 1111020009
|
||||
#define QGR_KEY_TIME 1111020010
|
||||
|
||||
#define QGR_KEY_FRAG_GAUNTLET 1211020100
|
||||
#define QGR_KEY_SUICIDE_GAUNTLET 1111020101
|
||||
#define QGR_KEY_SHOT_FIRED_GAUNTLET 1111020102
|
||||
#define QGR_KEY_HIT_GIVEN_GAUNTLET 1111020103
|
||||
#define QGR_KEY_HIT_TAKEN_GAUNTLET 1111020104
|
||||
#define QGR_KEY_DAMAGE_GIVEN_GAUNTLET 1111020105
|
||||
#define QGR_KEY_DAMAGE_TAKEN_GAUNTLET 1111020106
|
||||
#define QGR_KEY_SPLASH_GIVEN_GAUNTLET 1111020107
|
||||
#define QGR_KEY_SPLASH_TAKEN_GAUNTLET 1111020108
|
||||
#define QGR_KEY_PICKUP_GAUNTLET 1111020109
|
||||
#define QGR_KEY_TIME_GAUNTLET 1111020110
|
||||
|
||||
#define QGR_KEY_FRAG_MACHINEGUN 1211020200
|
||||
#define QGR_KEY_SUICIDE_MACHINEGUN 1111020201
|
||||
#define QGR_KEY_SHOT_FIRED_MACHINEGUN 1111020202
|
||||
#define QGR_KEY_HIT_GIVEN_MACHINEGUN 1111020203
|
||||
#define QGR_KEY_HIT_TAKEN_MACHINEGUN 1111020204
|
||||
#define QGR_KEY_DAMAGE_GIVEN_MACHINEGUN 1111020205
|
||||
#define QGR_KEY_DAMAGE_TAKEN_MACHINEGUN 1111020206
|
||||
#define QGR_KEY_SPLASH_GIVEN_MACHINEGUN 1111020207
|
||||
#define QGR_KEY_SPLASH_TAKEN_MACHINEGUN 1111020208
|
||||
#define QGR_KEY_PICKUP_MACHINEGUN 1111020209
|
||||
#define QGR_KEY_TIME_MACHINEGUN 1111020210
|
||||
|
||||
#define QGR_KEY_FRAG_SHOTGUN 1211020300
|
||||
#define QGR_KEY_SUICIDE_SHOTGUN 1111020301
|
||||
#define QGR_KEY_SHOT_FIRED_SHOTGUN 1111020302
|
||||
#define QGR_KEY_HIT_GIVEN_SHOTGUN 1111020303
|
||||
#define QGR_KEY_HIT_TAKEN_SHOTGUN 1111020304
|
||||
#define QGR_KEY_DAMAGE_GIVEN_SHOTGUN 1111020305
|
||||
#define QGR_KEY_DAMAGE_TAKEN_SHOTGUN 1111020306
|
||||
#define QGR_KEY_SPLASH_GIVEN_SHOTGUN 1111020307
|
||||
#define QGR_KEY_SPLASH_TAKEN_SHOTGUN 1111020308
|
||||
#define QGR_KEY_PICKUP_SHOTGUN 1111020309
|
||||
#define QGR_KEY_TIME_SHOTGUN 1111020310
|
||||
|
||||
#define QGR_KEY_FRAG_GRENADE 1211020400
|
||||
#define QGR_KEY_SUICIDE_GRENADE 1111020401
|
||||
#define QGR_KEY_SHOT_FIRED_GRENADE 1111020402
|
||||
#define QGR_KEY_HIT_GIVEN_GRENADE 1111020403
|
||||
#define QGR_KEY_HIT_TAKEN_GRENADE 1111020404
|
||||
#define QGR_KEY_DAMAGE_GIVEN_GRENADE 1111020405
|
||||
#define QGR_KEY_DAMAGE_TAKEN_GRENADE 1111020406
|
||||
#define QGR_KEY_SPLASH_GIVEN_GRENADE 1111020407
|
||||
#define QGR_KEY_SPLASH_TAKEN_GRENADE 1111020408
|
||||
#define QGR_KEY_PICKUP_GRENADE 1111020409
|
||||
#define QGR_KEY_TIME_GRENADE 1111020410
|
||||
|
||||
#define QGR_KEY_FRAG_ROCKET 1211020500
|
||||
#define QGR_KEY_SUICIDE_ROCKET 1111020501
|
||||
#define QGR_KEY_SHOT_FIRED_ROCKET 1111020502
|
||||
#define QGR_KEY_HIT_GIVEN_ROCKET 1111020503
|
||||
#define QGR_KEY_HIT_TAKEN_ROCKET 1111020504
|
||||
#define QGR_KEY_DAMAGE_GIVEN_ROCKET 1111020505
|
||||
#define QGR_KEY_DAMAGE_TAKEN_ROCKET 1111020506
|
||||
#define QGR_KEY_SPLASH_GIVEN_ROCKET 1111020507
|
||||
#define QGR_KEY_SPLASH_TAKEN_ROCKET 1111020508
|
||||
#define QGR_KEY_PICKUP_ROCKET 1111020509
|
||||
#define QGR_KEY_TIME_ROCKET 1111020510
|
||||
|
||||
#define QGR_KEY_FRAG_PLASMA 1211020600
|
||||
#define QGR_KEY_SUICIDE_PLASMA 1111020601
|
||||
#define QGR_KEY_SHOT_FIRED_PLASMA 1111020602
|
||||
#define QGR_KEY_HIT_GIVEN_PLASMA 1111020603
|
||||
#define QGR_KEY_HIT_TAKEN_PLASMA 1111020604
|
||||
#define QGR_KEY_DAMAGE_GIVEN_PLASMA 1111020605
|
||||
#define QGR_KEY_DAMAGE_TAKEN_PLASMA 1111020606
|
||||
#define QGR_KEY_SPLASH_GIVEN_PLASMA 1111020607
|
||||
#define QGR_KEY_SPLASH_TAKEN_PLASMA 1111020608
|
||||
#define QGR_KEY_PICKUP_PLASMA 1111020609
|
||||
#define QGR_KEY_TIME_PLASMA 1111020610
|
||||
|
||||
#define QGR_KEY_FRAG_RAILGUN 1211020700
|
||||
#define QGR_KEY_SUICIDE_RAILGUN 1111020701
|
||||
#define QGR_KEY_SHOT_FIRED_RAILGUN 1111020702
|
||||
#define QGR_KEY_HIT_GIVEN_RAILGUN 1111020703
|
||||
#define QGR_KEY_HIT_TAKEN_RAILGUN 1111020704
|
||||
#define QGR_KEY_DAMAGE_GIVEN_RAILGUN 1111020705
|
||||
#define QGR_KEY_DAMAGE_TAKEN_RAILGUN 1111020706
|
||||
#define QGR_KEY_SPLASH_GIVEN_RAILGUN 1111020707
|
||||
#define QGR_KEY_SPLASH_TAKEN_RAILGUN 1111020708
|
||||
#define QGR_KEY_PICKUP_RAILGUN 1111020709
|
||||
#define QGR_KEY_TIME_RAILGUN 1111020710
|
||||
|
||||
#define QGR_KEY_FRAG_LIGHTNING 1211020800
|
||||
#define QGR_KEY_SUICIDE_LIGHTNING 1111020801
|
||||
#define QGR_KEY_SHOT_FIRED_LIGHTNING 1111020802
|
||||
#define QGR_KEY_HIT_GIVEN_LIGHTNING 1111020803
|
||||
#define QGR_KEY_HIT_TAKEN_LIGHTNING 1111020804
|
||||
#define QGR_KEY_DAMAGE_GIVEN_LIGHTNING 1111020805
|
||||
#define QGR_KEY_DAMAGE_TAKEN_LIGHTNING 1111020806
|
||||
#define QGR_KEY_SPLASH_GIVEN_LIGHTNING 1111020807
|
||||
#define QGR_KEY_SPLASH_TAKEN_LIGHTNING 1111020808
|
||||
#define QGR_KEY_PICKUP_LIGHTNING 1111020809
|
||||
#define QGR_KEY_TIME_LIGHTNING 1111020810
|
||||
|
||||
#define QGR_KEY_FRAG_BFG 1211020900
|
||||
#define QGR_KEY_SUICIDE_BFG 1111020901
|
||||
#define QGR_KEY_SHOT_FIRED_BFG 1111020902
|
||||
#define QGR_KEY_HIT_GIVEN_BFG 1111020903
|
||||
#define QGR_KEY_HIT_TAKEN_BFG 1111020904
|
||||
#define QGR_KEY_DAMAGE_GIVEN_BFG 1111020905
|
||||
#define QGR_KEY_DAMAGE_TAKEN_BFG 1111020906
|
||||
#define QGR_KEY_SPLASH_GIVEN_BFG 1111020907
|
||||
#define QGR_KEY_SPLASH_TAKEN_BFG 1111020908
|
||||
#define QGR_KEY_PICKUP_BFG 1111020909
|
||||
#define QGR_KEY_TIME_BFG 1111020910
|
||||
|
||||
#define QGR_KEY_FRAG_GRAPPLE 1211021000
|
||||
#define QGR_KEY_SUICIDE_GRAPPLE 1111021001
|
||||
#define QGR_KEY_SHOT_FIRED_GRAPPLE 1111021002
|
||||
#define QGR_KEY_HIT_GIVEN_GRAPPLE 1111021003
|
||||
#define QGR_KEY_HIT_TAKEN_GRAPPLE 1111021004
|
||||
#define QGR_KEY_DAMAGE_GIVEN_GRAPPLE 1111021005
|
||||
#define QGR_KEY_DAMAGE_TAKEN_GRAPPLE 1111021006
|
||||
#define QGR_KEY_SPLASH_GIVEN_GRAPPLE 1111021007
|
||||
#define QGR_KEY_SPLASH_TAKEN_GRAPPLE 1111021008
|
||||
#define QGR_KEY_PICKUP_GRAPPLE 1111021009
|
||||
#define QGR_KEY_TIME_GRAPPLE 1111021010
|
||||
|
||||
#define QGR_KEY_FRAG_UNKNOWN 1211021100
|
||||
#define QGR_KEY_SUICIDE_UNKNOWN 1111021101
|
||||
#define QGR_KEY_SHOT_FIRED_UNKNOWN 1111021102
|
||||
#define QGR_KEY_HIT_GIVEN_UNKNOWN 1111021103
|
||||
#define QGR_KEY_HIT_TAKEN_UNKNOWN 1111021104
|
||||
#define QGR_KEY_DAMAGE_GIVEN_UNKNOWN 1111021105
|
||||
#define QGR_KEY_DAMAGE_TAKEN_UNKNOWN 1111021106
|
||||
#define QGR_KEY_SPLASH_GIVEN_UNKNOWN 1111021107
|
||||
#define QGR_KEY_SPLASH_TAKEN_UNKNOWN 1111021108
|
||||
#define QGR_KEY_PICKUP_UNKNOWN 1111021109
|
||||
#define QGR_KEY_TIME_UNKNOWN 1111021110
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// new to team arena
|
||||
#define QGR_KEY_FRAG_NAILGIN 1211021200
|
||||
#define QGR_KEY_SUICIDE_NAILGIN 1111021201
|
||||
#define QGR_KEY_SHOT_FIRED_NAILGIN 1111021202
|
||||
#define QGR_KEY_HIT_GIVEN_NAILGIN 1111021203
|
||||
#define QGR_KEY_HIT_TAKEN_NAILGIN 1111021204
|
||||
#define QGR_KEY_DAMAGE_GIVEN_NAILGIN 1111021205
|
||||
#define QGR_KEY_DAMAGE_TAKEN_NAILGIN 1111021206
|
||||
#define QGR_KEY_SPLASH_GIVEN_NAILGIN 1111021207
|
||||
#define QGR_KEY_SPLASH_TAKEN_NAILGIN 1111021208
|
||||
#define QGR_KEY_PICKUP_NAILGIN 1111021209
|
||||
#define QGR_KEY_TIME_NAILGIN 1111021210
|
||||
// new to team arena
|
||||
#define QGR_KEY_FRAG_PROX_LAUNCHER 1211021300
|
||||
#define QGR_KEY_SUICIDE_PROX_LAUNCHER 1111021301
|
||||
#define QGR_KEY_SHOT_FIRED_PROX_LAUNCHER 1111021302
|
||||
#define QGR_KEY_HIT_GIVEN_PROX_LAUNCHER 1111021303
|
||||
#define QGR_KEY_HIT_TAKEN_PROX_LAUNCHER 1111021304
|
||||
#define QGR_KEY_DAMAGE_GIVEN_PROX_LAUNCHER 1111021305
|
||||
#define QGR_KEY_DAMAGE_TAKEN_PROX_LAUNCHER 1111021306
|
||||
#define QGR_KEY_SPLASH_GIVEN_PROX_LAUNCHER 1111021307
|
||||
#define QGR_KEY_SPLASH_TAKEN_PROX_LAUNCHER 1111021308
|
||||
#define QGR_KEY_PICKUP_PROX_LAUNCHER 1111021309
|
||||
#define QGR_KEY_TIME_PROX_LAUNCHER 1111021310
|
||||
// new to team arena
|
||||
#define QGR_KEY_FRAG_CHAINGUN 1211021400
|
||||
#define QGR_KEY_SUICIDE_CHAINGUN 1111021401
|
||||
#define QGR_KEY_SHOT_FIRED_CHAINGUN 1111021402
|
||||
#define QGR_KEY_HIT_GIVEN_CHAINGUN 1111021403
|
||||
#define QGR_KEY_HIT_TAKEN_CHAINGUN 1111021404
|
||||
#define QGR_KEY_DAMAGE_GIVEN_CHAINGUN 1111021405
|
||||
#define QGR_KEY_DAMAGE_TAKEN_CHAINGUN 1111021406
|
||||
#define QGR_KEY_SPLASH_GIVEN_CHAINGUN 1111021407
|
||||
#define QGR_KEY_SPLASH_TAKEN_CHAINGUN 1111021408
|
||||
#define QGR_KEY_PICKUP_CHAINGUN 1111021409
|
||||
#define QGR_KEY_TIME_CHAINGUN 1111021410
|
||||
#endif /* MISSIONPACK */
|
||||
|
||||
// ammo keys
|
||||
#define QGR_KEY_BOXES 1111030000
|
||||
#define QGR_KEY_ROUNDS 1111030001
|
||||
|
||||
#define QGR_KEY_BOXES_BULLETS 1111030100
|
||||
#define QGR_KEY_ROUNDS_BULLETS 1111030101
|
||||
|
||||
#define QGR_KEY_BOXES_SHELLS 1111030200
|
||||
#define QGR_KEY_ROUNDS_SHELLS 1111030201
|
||||
|
||||
#define QGR_KEY_BOXES_GRENADES 1111030300
|
||||
#define QGR_KEY_ROUNDS_GRENADES 1111030301
|
||||
|
||||
#define QGR_KEY_BOXES_ROCKETS 1111030400
|
||||
#define QGR_KEY_ROUNDS_ROCKETS 1111030401
|
||||
|
||||
#define QGR_KEY_BOXES_CELLS 1111030500
|
||||
#define QGR_KEY_ROUNDS_CELLS 1111030501
|
||||
|
||||
#define QGR_KEY_BOXES_SLUGS 1111030600
|
||||
#define QGR_KEY_ROUNDS_SLUGS 1111030601
|
||||
|
||||
#define QGR_KEY_BOXES_LG_AMMO 1111030700
|
||||
#define QGR_KEY_ROUNDS_LG_AMMO 1111030701
|
||||
|
||||
#define QGR_KEY_BOXES_BFG_AMMO 1111030800
|
||||
#define QGR_KEY_ROUNDS_BFG_AMMO 1111030801
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// new to team arena
|
||||
#define QGR_KEY_BOXES_NAILGUN_AMMO 1111030900
|
||||
#define QGR_KEY_ROUNDS_NAILGUN_AMMO 1111030901
|
||||
// new to team arena
|
||||
#define QGR_KEY_BOXES_PROX_LAUNCHER_AMMO 1111031000
|
||||
#define QGR_KEY_ROUNDS_PROX_LAUNCHER_AMMO 1111031001
|
||||
// new to team arena
|
||||
#define QGR_KEY_BOXES_CHAINGUN_AMMO 1111031100
|
||||
#define QGR_KEY_ROUNDS_CHAINGUN_AMMO 1111031101
|
||||
#endif /* MISSIONPACK */
|
||||
|
||||
// health keys
|
||||
#define QGR_KEY_HEALTH 1111040000
|
||||
#define QGR_KEY_HEALTH_TOTAL 1111040001
|
||||
|
||||
#define QGR_KEY_HEALTH_5 1111040100
|
||||
#define QGR_KEY_HEALTH_25 1111040200
|
||||
#define QGR_KEY_HEALTH_50 1111040300
|
||||
#define QGR_KEY_HEALTH_MEGA 1111040400
|
||||
|
||||
// armor keys
|
||||
#define QGR_KEY_ARMOR 1111050000
|
||||
#define QGR_KEY_ARMOR_TOTAL 1111050001
|
||||
|
||||
#define QGR_KEY_ARMOR_SHARD 1111050100
|
||||
#define QGR_KEY_ARMOR_YELLOW 1111050200
|
||||
#define QGR_KEY_ARMOR_RED 1111050300
|
||||
|
||||
// powerup keys
|
||||
#define QGR_KEY_POWERUP 1111060000
|
||||
#define QGR_KEY_QUAD 1111060100
|
||||
#define QGR_KEY_SUIT 1111060200
|
||||
#define QGR_KEY_HASTE 1111060300
|
||||
#define QGR_KEY_INVIS 1111060400
|
||||
#define QGR_KEY_REGEN 1111060500
|
||||
#define QGR_KEY_FLIGHT 1111060600
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// persistant powerup keys
|
||||
// new to team arena
|
||||
#define QGR_KEY_SCOUT 1111160800
|
||||
#define QGR_KEY_GUARD 1111160801
|
||||
#define QGR_KEY_DOUBLER 1111160802
|
||||
#define QGR_KEY_AMMOREGEN 1111160803
|
||||
|
||||
#endif //MISSIONPACK
|
||||
|
||||
// holdable item keys
|
||||
#define QGR_KEY_MEDKIT 1111070000
|
||||
#define QGR_KEY_MEDKIT_USE 1111070001
|
||||
|
||||
#define QGR_KEY_TELEPORTER 1111070100
|
||||
#define QGR_KEY_TELEPORTER_USE 1111070101
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// new to team arena
|
||||
#define QGR_KEY_KAMIKAZE 1111070200
|
||||
#define QGR_KEY_KAMIKAZE_USE 1111070201
|
||||
// new to team arena
|
||||
#define QGR_KEY_PORTAL 1111070300
|
||||
#define QGR_KEY_PORTAL_USE 1111070301
|
||||
// new to team arena
|
||||
#define QGR_KEY_INVULNERABILITY 1111070400
|
||||
#define QGR_KEY_INVULNERABILITY_USE 1111070401
|
||||
#endif /* MISSIONPACK */
|
||||
|
||||
// hazard keys
|
||||
#define QGR_KEY_HAZARD_DEATH 1111080000
|
||||
#define QGR_KEY_WATER 1111080100
|
||||
#define QGR_KEY_SLIME 1111080200
|
||||
#define QGR_KEY_LAVA 1111080300
|
||||
#define QGR_KEY_CRUSH 1111080400
|
||||
#define QGR_KEY_TELEFRAG 1111080500
|
||||
#define QGR_KEY_FALLING 1111080600
|
||||
#define QGR_KEY_SUICIDE_CMD 1111080700
|
||||
#define QGR_KEY_TRIGGER_HURT 1111080800
|
||||
#define QGR_KEY_HAZARD_MISC 1111080900
|
||||
|
||||
// reward keys
|
||||
#define QGR_KEY_IMPRESSIVE 1111090000
|
||||
#define QGR_KEY_EXCELLENT 1111090100
|
||||
|
||||
// teammate keys
|
||||
#define QGR_KEY_TEAMMATE_FRAG 1211100000
|
||||
#define QGR_KEY_TEAMMATE_HIT_GIVEN 1111100001
|
||||
#define QGR_KEY_TEAMMATE_HIT_TAKEN 1111100002
|
||||
#define QGR_KEY_TEAMMATE_DAMAGE_GIVEN 1111100003
|
||||
#define QGR_KEY_TEAMMATE_DAMAGE_TAKEN 1111100004
|
||||
#define QGR_KEY_TEAMMATE_SPLASH_GIVEN 1111100005
|
||||
#define QGR_KEY_TEAMMATE_SPLASH_TAKEN 1111100006
|
||||
#define QGR_KEY_TEAM_NAME 1100100007
|
||||
|
||||
// ctf keys
|
||||
#define QGR_KEY_FLAG_PICKUP 1111110000
|
||||
#define QGR_KEY_FLAG_CAPTURE 1111110001
|
||||
|
||||
#endif // _G_RANKINGS_H_
|
||||
|
|
386
code/game/g_session.c
Normal file → Executable file
386
code/game/g_session.c
Normal file → Executable file
|
@ -1,193 +1,193 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
/*
|
||||
=======================================================================
|
||||
|
||||
SESSION DATA
|
||||
|
||||
Session data is the only data that stays persistant across level loads
|
||||
and tournament restarts.
|
||||
=======================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
================
|
||||
G_WriteClientSessionData
|
||||
|
||||
Called on game shutdown
|
||||
================
|
||||
*/
|
||||
void G_WriteClientSessionData( gclient_t *client ) {
|
||||
const char *s;
|
||||
const char *var;
|
||||
|
||||
s = va("%i %i %i %i %i %i %i",
|
||||
client->sess.sessionTeam,
|
||||
client->sess.spectatorTime,
|
||||
client->sess.spectatorState,
|
||||
client->sess.spectatorClient,
|
||||
client->sess.wins,
|
||||
client->sess.losses,
|
||||
client->sess.teamLeader
|
||||
);
|
||||
|
||||
var = va( "session%i", client - level.clients );
|
||||
|
||||
trap_Cvar_Set( var, s );
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
G_ReadSessionData
|
||||
|
||||
Called on a reconnect
|
||||
================
|
||||
*/
|
||||
void G_ReadSessionData( gclient_t *client ) {
|
||||
char s[MAX_STRING_CHARS];
|
||||
const char *var;
|
||||
|
||||
// bk001205 - format
|
||||
int teamLeader;
|
||||
int spectatorState;
|
||||
int sessionTeam;
|
||||
|
||||
var = va( "session%i", client - level.clients );
|
||||
trap_Cvar_VariableStringBuffer( var, s, sizeof(s) );
|
||||
|
||||
sscanf( s, "%i %i %i %i %i %i %i",
|
||||
&sessionTeam, // bk010221 - format
|
||||
&client->sess.spectatorTime,
|
||||
&spectatorState, // bk010221 - format
|
||||
&client->sess.spectatorClient,
|
||||
&client->sess.wins,
|
||||
&client->sess.losses,
|
||||
&teamLeader // bk010221 - format
|
||||
);
|
||||
|
||||
// bk001205 - format issues
|
||||
client->sess.sessionTeam = (team_t)sessionTeam;
|
||||
client->sess.spectatorState = (spectatorState_t)spectatorState;
|
||||
client->sess.teamLeader = (qboolean)teamLeader;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
G_InitSessionData
|
||||
|
||||
Called on a first-time connect
|
||||
================
|
||||
*/
|
||||
void G_InitSessionData( gclient_t *client, char *userinfo ) {
|
||||
clientSession_t *sess;
|
||||
const char *value;
|
||||
|
||||
sess = &client->sess;
|
||||
|
||||
// initial team determination
|
||||
if ( g_gametype.integer >= GT_TEAM ) {
|
||||
if ( g_teamAutoJoin.integer ) {
|
||||
sess->sessionTeam = PickTeam( -1 );
|
||||
BroadcastTeamChange( client, -1 );
|
||||
} else {
|
||||
// always spawn as spectator in team games
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
}
|
||||
} else {
|
||||
value = Info_ValueForKey( userinfo, "team" );
|
||||
if ( value[0] == 's' ) {
|
||||
// a willing spectator, not a waiting-in-line
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
} else {
|
||||
switch ( g_gametype.integer ) {
|
||||
default:
|
||||
case GT_FFA:
|
||||
case GT_SINGLE_PLAYER:
|
||||
if ( g_maxGameClients.integer > 0 &&
|
||||
level.numNonSpectatorClients >= g_maxGameClients.integer ) {
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
} else {
|
||||
sess->sessionTeam = TEAM_FREE;
|
||||
}
|
||||
break;
|
||||
case GT_TOURNAMENT:
|
||||
// if the game is full, go into a waiting mode
|
||||
if ( level.numNonSpectatorClients >= 2 ) {
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
} else {
|
||||
sess->sessionTeam = TEAM_FREE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sess->spectatorState = SPECTATOR_FREE;
|
||||
sess->spectatorTime = level.time;
|
||||
|
||||
G_WriteClientSessionData( client );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
G_InitWorldSession
|
||||
|
||||
==================
|
||||
*/
|
||||
void G_InitWorldSession( void ) {
|
||||
char s[MAX_STRING_CHARS];
|
||||
int gt;
|
||||
|
||||
trap_Cvar_VariableStringBuffer( "session", s, sizeof(s) );
|
||||
gt = atoi( s );
|
||||
|
||||
// if the gametype changed since the last session, don't use any
|
||||
// client sessions
|
||||
if ( g_gametype.integer != gt ) {
|
||||
level.newSession = qtrue;
|
||||
G_Printf( "Gametype changed, clearing session data.\n" );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
G_WriteSessionData
|
||||
|
||||
==================
|
||||
*/
|
||||
void G_WriteSessionData( void ) {
|
||||
int i;
|
||||
|
||||
trap_Cvar_Set( "session", va("%i", g_gametype.integer) );
|
||||
|
||||
for ( i = 0 ; i < level.maxclients ; i++ ) {
|
||||
if ( level.clients[i].pers.connected == CON_CONNECTED ) {
|
||||
G_WriteClientSessionData( &level.clients[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
/*
|
||||
=======================================================================
|
||||
|
||||
SESSION DATA
|
||||
|
||||
Session data is the only data that stays persistant across level loads
|
||||
and tournament restarts.
|
||||
=======================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
================
|
||||
G_WriteClientSessionData
|
||||
|
||||
Called on game shutdown
|
||||
================
|
||||
*/
|
||||
void G_WriteClientSessionData( gclient_t *client ) {
|
||||
const char *s;
|
||||
const char *var;
|
||||
|
||||
s = va("%i %i %i %i %i %i %i",
|
||||
client->sess.sessionTeam,
|
||||
client->sess.spectatorTime,
|
||||
client->sess.spectatorState,
|
||||
client->sess.spectatorClient,
|
||||
client->sess.wins,
|
||||
client->sess.losses,
|
||||
client->sess.teamLeader
|
||||
);
|
||||
|
||||
var = va( "session%i", client - level.clients );
|
||||
|
||||
trap_Cvar_Set( var, s );
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
G_ReadSessionData
|
||||
|
||||
Called on a reconnect
|
||||
================
|
||||
*/
|
||||
void G_ReadSessionData( gclient_t *client ) {
|
||||
char s[MAX_STRING_CHARS];
|
||||
const char *var;
|
||||
|
||||
// bk001205 - format
|
||||
int teamLeader;
|
||||
int spectatorState;
|
||||
int sessionTeam;
|
||||
|
||||
var = va( "session%i", client - level.clients );
|
||||
trap_Cvar_VariableStringBuffer( var, s, sizeof(s) );
|
||||
|
||||
sscanf( s, "%i %i %i %i %i %i %i",
|
||||
&sessionTeam, // bk010221 - format
|
||||
&client->sess.spectatorTime,
|
||||
&spectatorState, // bk010221 - format
|
||||
&client->sess.spectatorClient,
|
||||
&client->sess.wins,
|
||||
&client->sess.losses,
|
||||
&teamLeader // bk010221 - format
|
||||
);
|
||||
|
||||
// bk001205 - format issues
|
||||
client->sess.sessionTeam = (team_t)sessionTeam;
|
||||
client->sess.spectatorState = (spectatorState_t)spectatorState;
|
||||
client->sess.teamLeader = (qboolean)teamLeader;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
G_InitSessionData
|
||||
|
||||
Called on a first-time connect
|
||||
================
|
||||
*/
|
||||
void G_InitSessionData( gclient_t *client, char *userinfo ) {
|
||||
clientSession_t *sess;
|
||||
const char *value;
|
||||
|
||||
sess = &client->sess;
|
||||
|
||||
// initial team determination
|
||||
if ( g_gametype.integer >= GT_TEAM ) {
|
||||
if ( g_teamAutoJoin.integer ) {
|
||||
sess->sessionTeam = PickTeam( -1 );
|
||||
BroadcastTeamChange( client, -1 );
|
||||
} else {
|
||||
// always spawn as spectator in team games
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
}
|
||||
} else {
|
||||
value = Info_ValueForKey( userinfo, "team" );
|
||||
if ( value[0] == 's' ) {
|
||||
// a willing spectator, not a waiting-in-line
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
} else {
|
||||
switch ( g_gametype.integer ) {
|
||||
default:
|
||||
case GT_FFA:
|
||||
case GT_SINGLE_PLAYER:
|
||||
if ( g_maxGameClients.integer > 0 &&
|
||||
level.numNonSpectatorClients >= g_maxGameClients.integer ) {
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
} else {
|
||||
sess->sessionTeam = TEAM_FREE;
|
||||
}
|
||||
break;
|
||||
case GT_TOURNAMENT:
|
||||
// if the game is full, go into a waiting mode
|
||||
if ( level.numNonSpectatorClients >= 2 ) {
|
||||
sess->sessionTeam = TEAM_SPECTATOR;
|
||||
} else {
|
||||
sess->sessionTeam = TEAM_FREE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sess->spectatorState = SPECTATOR_FREE;
|
||||
sess->spectatorTime = level.time;
|
||||
|
||||
G_WriteClientSessionData( client );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
G_InitWorldSession
|
||||
|
||||
==================
|
||||
*/
|
||||
void G_InitWorldSession( void ) {
|
||||
char s[MAX_STRING_CHARS];
|
||||
int gt;
|
||||
|
||||
trap_Cvar_VariableStringBuffer( "session", s, sizeof(s) );
|
||||
gt = atoi( s );
|
||||
|
||||
// if the gametype changed since the last session, don't use any
|
||||
// client sessions
|
||||
if ( g_gametype.integer != gt ) {
|
||||
level.newSession = qtrue;
|
||||
G_Printf( "Gametype changed, clearing session data.\n" );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
G_WriteSessionData
|
||||
|
||||
==================
|
||||
*/
|
||||
void G_WriteSessionData( void ) {
|
||||
int i;
|
||||
|
||||
trap_Cvar_Set( "session", va("%i", g_gametype.integer) );
|
||||
|
||||
for ( i = 0 ; i < level.maxclients ; i++ ) {
|
||||
if ( level.clients[i].pers.connected == CON_CONNECTED ) {
|
||||
G_WriteClientSessionData( &level.clients[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
1286
code/game/g_spawn.c
Normal file → Executable file
1286
code/game/g_spawn.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
1016
code/game/g_svcmds.c
Normal file → Executable file
1016
code/game/g_svcmds.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
450
code/game/g_syscalls.asm
Normal file → Executable file
450
code/game/g_syscalls.asm
Normal file → Executable file
|
@ -1,225 +1,225 @@
|
|||
code
|
||||
|
||||
equ trap_Printf -1
|
||||
equ trap_Error -2
|
||||
equ trap_Milliseconds -3
|
||||
equ trap_Cvar_Register -4
|
||||
equ trap_Cvar_Update -5
|
||||
equ trap_Cvar_Set -6
|
||||
equ trap_Cvar_VariableIntegerValue -7
|
||||
equ trap_Cvar_VariableStringBuffer -8
|
||||
equ trap_Argc -9
|
||||
equ trap_Argv -10
|
||||
equ trap_FS_FOpenFile -11
|
||||
equ trap_FS_Read -12
|
||||
equ trap_FS_Write -13
|
||||
equ trap_FS_FCloseFile -14
|
||||
equ trap_SendConsoleCommand -15
|
||||
equ trap_LocateGameData -16
|
||||
equ trap_DropClient -17
|
||||
equ trap_SendServerCommand -18
|
||||
equ trap_SetConfigstring -19
|
||||
equ trap_GetConfigstring -20
|
||||
equ trap_GetUserinfo -21
|
||||
equ trap_SetUserinfo -22
|
||||
equ trap_GetServerinfo -23
|
||||
equ trap_SetBrushModel -24
|
||||
equ trap_Trace -25
|
||||
equ trap_PointContents -26
|
||||
equ trap_InPVS -27
|
||||
equ trap_InPVSIgnorePortals -28
|
||||
equ trap_AdjustAreaPortalState -29
|
||||
equ trap_AreasConnected -30
|
||||
equ trap_LinkEntity -31
|
||||
equ trap_UnlinkEntity -32
|
||||
equ trap_EntitiesInBox -33
|
||||
equ trap_EntityContact -34
|
||||
equ trap_BotAllocateClient -35
|
||||
equ trap_BotFreeClient -36
|
||||
equ trap_GetUsercmd -37
|
||||
equ trap_GetEntityToken -38
|
||||
equ trap_FS_GetFileList -39
|
||||
equ trap_DebugPolygonCreate -40
|
||||
equ trap_DebugPolygonDelete -41
|
||||
equ trap_RealTime -42
|
||||
equ trap_SnapVector -43
|
||||
equ trap_TraceCapsule -44
|
||||
equ trap_EntityContactCapsule -45
|
||||
equ trap_FS_Seek -46
|
||||
|
||||
equ memset -101
|
||||
equ memcpy -102
|
||||
equ strncpy -103
|
||||
equ sin -104
|
||||
equ cos -105
|
||||
equ atan2 -106
|
||||
equ sqrt -107
|
||||
equ floor -111
|
||||
equ ceil -112
|
||||
equ testPrintInt -113
|
||||
equ testPrintFloat -114
|
||||
|
||||
|
||||
|
||||
equ trap_BotLibSetup -201
|
||||
equ trap_BotLibShutdown -202
|
||||
equ trap_BotLibVarSet -203
|
||||
equ trap_BotLibVarGet -204
|
||||
equ trap_BotLibDefine -205
|
||||
equ trap_BotLibStartFrame -206
|
||||
equ trap_BotLibLoadMap -207
|
||||
equ trap_BotLibUpdateEntity -208
|
||||
equ trap_BotLibTest -209
|
||||
|
||||
equ trap_BotGetSnapshotEntity -210
|
||||
equ trap_BotGetServerCommand -211
|
||||
equ trap_BotUserCommand -212
|
||||
|
||||
|
||||
|
||||
equ trap_AAS_EnableRoutingArea -301
|
||||
equ trap_AAS_BBoxAreas -302
|
||||
equ trap_AAS_AreaInfo -303
|
||||
equ trap_AAS_EntityInfo -304
|
||||
|
||||
equ trap_AAS_Initialized -305
|
||||
equ trap_AAS_PresenceTypeBoundingBox -306
|
||||
equ trap_AAS_Time -307
|
||||
|
||||
equ trap_AAS_PointAreaNum -308
|
||||
equ trap_AAS_TraceAreas -309
|
||||
|
||||
equ trap_AAS_PointContents -310
|
||||
equ trap_AAS_NextBSPEntity -311
|
||||
equ trap_AAS_ValueForBSPEpairKey -312
|
||||
equ trap_AAS_VectorForBSPEpairKey -313
|
||||
equ trap_AAS_FloatForBSPEpairKey -314
|
||||
equ trap_AAS_IntForBSPEpairKey -315
|
||||
|
||||
equ trap_AAS_AreaReachability -316
|
||||
|
||||
equ trap_AAS_AreaTravelTimeToGoalArea -317
|
||||
|
||||
equ trap_AAS_Swimming -318
|
||||
equ trap_AAS_PredictClientMovement -319
|
||||
|
||||
|
||||
|
||||
equ trap_EA_Say -401
|
||||
equ trap_EA_SayTeam -402
|
||||
equ trap_EA_Command -403
|
||||
|
||||
equ trap_EA_Action -404
|
||||
equ trap_EA_Gesture -405
|
||||
equ trap_EA_Talk -406
|
||||
equ trap_EA_Attack -407
|
||||
equ trap_EA_Use -408
|
||||
equ trap_EA_Respawn -409
|
||||
equ trap_EA_Crouch -410
|
||||
equ trap_EA_MoveUp -411
|
||||
equ trap_EA_MoveDown -412
|
||||
equ trap_EA_MoveForward -413
|
||||
equ trap_EA_MoveBack -414
|
||||
equ trap_EA_MoveLeft -415
|
||||
equ trap_EA_MoveRight -416
|
||||
|
||||
equ trap_EA_SelectWeapon -417
|
||||
equ trap_EA_Jump -418
|
||||
equ trap_EA_DelayedJump -419
|
||||
equ trap_EA_Move -420
|
||||
equ trap_EA_View -421
|
||||
|
||||
equ trap_EA_EndRegular -422
|
||||
equ trap_EA_GetInput -423
|
||||
equ trap_EA_ResetInput -424
|
||||
|
||||
|
||||
|
||||
equ trap_BotLoadCharacter -501
|
||||
equ trap_BotFreeCharacter -502
|
||||
equ trap_Characteristic_Float -503
|
||||
equ trap_Characteristic_BFloat -504
|
||||
equ trap_Characteristic_Integer -505
|
||||
equ trap_Characteristic_BInteger -506
|
||||
equ trap_Characteristic_String -507
|
||||
|
||||
equ trap_BotAllocChatState -508
|
||||
equ trap_BotFreeChatState -509
|
||||
equ trap_BotQueueConsoleMessage -510
|
||||
equ trap_BotRemoveConsoleMessage -511
|
||||
equ trap_BotNextConsoleMessage -512
|
||||
equ trap_BotNumConsoleMessages -513
|
||||
equ trap_BotInitialChat -514
|
||||
equ trap_BotReplyChat -515
|
||||
equ trap_BotChatLength -516
|
||||
equ trap_BotEnterChat -517
|
||||
equ trap_StringContains -518
|
||||
equ trap_BotFindMatch -519
|
||||
equ trap_BotMatchVariable -520
|
||||
equ trap_UnifyWhiteSpaces -521
|
||||
equ trap_BotReplaceSynonyms -522
|
||||
equ trap_BotLoadChatFile -523
|
||||
equ trap_BotSetChatGender -524
|
||||
equ trap_BotSetChatName -525
|
||||
|
||||
equ trap_BotResetGoalState -526
|
||||
equ trap_BotResetAvoidGoals -527
|
||||
equ trap_BotPushGoal -528
|
||||
equ trap_BotPopGoal -529
|
||||
equ trap_BotEmptyGoalStack -530
|
||||
equ trap_BotDumpAvoidGoals -531
|
||||
equ trap_BotDumpGoalStack -532
|
||||
equ trap_BotGoalName -533
|
||||
equ trap_BotGetTopGoal -534
|
||||
equ trap_BotGetSecondGoal -535
|
||||
equ trap_BotChooseLTGItem -536
|
||||
equ trap_BotChooseNBGItem -537
|
||||
equ trap_BotTouchingGoal -538
|
||||
equ trap_BotItemGoalInVisButNotVisible -539
|
||||
equ trap_BotGetLevelItemGoal -540
|
||||
equ trap_BotAvoidGoalTime -541
|
||||
equ trap_BotInitLevelItems -542
|
||||
equ trap_BotUpdateEntityItems -543
|
||||
equ trap_BotLoadItemWeights -544
|
||||
equ trap_BotFreeItemWeights -546
|
||||
equ trap_BotSaveGoalFuzzyLogic -546
|
||||
equ trap_BotAllocGoalState -547
|
||||
equ trap_BotFreeGoalState -548
|
||||
|
||||
equ trap_BotResetMoveState -549
|
||||
equ trap_BotMoveToGoal -550
|
||||
equ trap_BotMoveInDirection -551
|
||||
equ trap_BotResetAvoidReach -552
|
||||
equ trap_BotResetLastAvoidReach -553
|
||||
equ trap_BotReachabilityArea -554
|
||||
equ trap_BotMovementViewTarget -555
|
||||
equ trap_BotAllocMoveState -556
|
||||
equ trap_BotFreeMoveState -557
|
||||
equ trap_BotInitMoveState -558
|
||||
|
||||
equ trap_BotChooseBestFightWeapon -559
|
||||
equ trap_BotGetWeaponInfo -560
|
||||
equ trap_BotLoadWeaponWeights -561
|
||||
equ trap_BotAllocWeaponState -562
|
||||
equ trap_BotFreeWeaponState -563
|
||||
equ trap_BotResetWeaponState -564
|
||||
equ trap_GeneticParentsAndChildSelection -565
|
||||
equ trap_BotInterbreedGoalFuzzyLogic -566
|
||||
equ trap_BotMutateGoalFuzzyLogic -567
|
||||
equ trap_BotGetNextCampSpotGoal -568
|
||||
equ trap_BotGetMapLocationGoal -569
|
||||
equ trap_BotNumInitialChats -570
|
||||
equ trap_BotGetChatMessage -571
|
||||
equ trap_BotRemoveFromAvoidGoals -572
|
||||
equ trap_BotPredictVisiblePosition -573
|
||||
equ trap_BotSetAvoidGoalTime -574
|
||||
equ trap_BotAddAvoidSpot -575
|
||||
equ trap_AAS_AlternativeRouteGoals -576
|
||||
equ trap_AAS_PredictRoute -577
|
||||
equ trap_AAS_PointReachabilityAreaIndex -578
|
||||
|
||||
equ trap_BotLibLoadSource -579
|
||||
equ trap_BotLibFreeSource -580
|
||||
equ trap_BotLibReadToken -581
|
||||
equ trap_BotLibSourceFileAndLine -582
|
||||
|
||||
code
|
||||
|
||||
equ trap_Printf -1
|
||||
equ trap_Error -2
|
||||
equ trap_Milliseconds -3
|
||||
equ trap_Cvar_Register -4
|
||||
equ trap_Cvar_Update -5
|
||||
equ trap_Cvar_Set -6
|
||||
equ trap_Cvar_VariableIntegerValue -7
|
||||
equ trap_Cvar_VariableStringBuffer -8
|
||||
equ trap_Argc -9
|
||||
equ trap_Argv -10
|
||||
equ trap_FS_FOpenFile -11
|
||||
equ trap_FS_Read -12
|
||||
equ trap_FS_Write -13
|
||||
equ trap_FS_FCloseFile -14
|
||||
equ trap_SendConsoleCommand -15
|
||||
equ trap_LocateGameData -16
|
||||
equ trap_DropClient -17
|
||||
equ trap_SendServerCommand -18
|
||||
equ trap_SetConfigstring -19
|
||||
equ trap_GetConfigstring -20
|
||||
equ trap_GetUserinfo -21
|
||||
equ trap_SetUserinfo -22
|
||||
equ trap_GetServerinfo -23
|
||||
equ trap_SetBrushModel -24
|
||||
equ trap_Trace -25
|
||||
equ trap_PointContents -26
|
||||
equ trap_InPVS -27
|
||||
equ trap_InPVSIgnorePortals -28
|
||||
equ trap_AdjustAreaPortalState -29
|
||||
equ trap_AreasConnected -30
|
||||
equ trap_LinkEntity -31
|
||||
equ trap_UnlinkEntity -32
|
||||
equ trap_EntitiesInBox -33
|
||||
equ trap_EntityContact -34
|
||||
equ trap_BotAllocateClient -35
|
||||
equ trap_BotFreeClient -36
|
||||
equ trap_GetUsercmd -37
|
||||
equ trap_GetEntityToken -38
|
||||
equ trap_FS_GetFileList -39
|
||||
equ trap_DebugPolygonCreate -40
|
||||
equ trap_DebugPolygonDelete -41
|
||||
equ trap_RealTime -42
|
||||
equ trap_SnapVector -43
|
||||
equ trap_TraceCapsule -44
|
||||
equ trap_EntityContactCapsule -45
|
||||
equ trap_FS_Seek -46
|
||||
|
||||
equ memset -101
|
||||
equ memcpy -102
|
||||
equ strncpy -103
|
||||
equ sin -104
|
||||
equ cos -105
|
||||
equ atan2 -106
|
||||
equ sqrt -107
|
||||
equ floor -111
|
||||
equ ceil -112
|
||||
equ testPrintInt -113
|
||||
equ testPrintFloat -114
|
||||
|
||||
|
||||
|
||||
equ trap_BotLibSetup -201
|
||||
equ trap_BotLibShutdown -202
|
||||
equ trap_BotLibVarSet -203
|
||||
equ trap_BotLibVarGet -204
|
||||
equ trap_BotLibDefine -205
|
||||
equ trap_BotLibStartFrame -206
|
||||
equ trap_BotLibLoadMap -207
|
||||
equ trap_BotLibUpdateEntity -208
|
||||
equ trap_BotLibTest -209
|
||||
|
||||
equ trap_BotGetSnapshotEntity -210
|
||||
equ trap_BotGetServerCommand -211
|
||||
equ trap_BotUserCommand -212
|
||||
|
||||
|
||||
|
||||
equ trap_AAS_EnableRoutingArea -301
|
||||
equ trap_AAS_BBoxAreas -302
|
||||
equ trap_AAS_AreaInfo -303
|
||||
equ trap_AAS_EntityInfo -304
|
||||
|
||||
equ trap_AAS_Initialized -305
|
||||
equ trap_AAS_PresenceTypeBoundingBox -306
|
||||
equ trap_AAS_Time -307
|
||||
|
||||
equ trap_AAS_PointAreaNum -308
|
||||
equ trap_AAS_TraceAreas -309
|
||||
|
||||
equ trap_AAS_PointContents -310
|
||||
equ trap_AAS_NextBSPEntity -311
|
||||
equ trap_AAS_ValueForBSPEpairKey -312
|
||||
equ trap_AAS_VectorForBSPEpairKey -313
|
||||
equ trap_AAS_FloatForBSPEpairKey -314
|
||||
equ trap_AAS_IntForBSPEpairKey -315
|
||||
|
||||
equ trap_AAS_AreaReachability -316
|
||||
|
||||
equ trap_AAS_AreaTravelTimeToGoalArea -317
|
||||
|
||||
equ trap_AAS_Swimming -318
|
||||
equ trap_AAS_PredictClientMovement -319
|
||||
|
||||
|
||||
|
||||
equ trap_EA_Say -401
|
||||
equ trap_EA_SayTeam -402
|
||||
equ trap_EA_Command -403
|
||||
|
||||
equ trap_EA_Action -404
|
||||
equ trap_EA_Gesture -405
|
||||
equ trap_EA_Talk -406
|
||||
equ trap_EA_Attack -407
|
||||
equ trap_EA_Use -408
|
||||
equ trap_EA_Respawn -409
|
||||
equ trap_EA_Crouch -410
|
||||
equ trap_EA_MoveUp -411
|
||||
equ trap_EA_MoveDown -412
|
||||
equ trap_EA_MoveForward -413
|
||||
equ trap_EA_MoveBack -414
|
||||
equ trap_EA_MoveLeft -415
|
||||
equ trap_EA_MoveRight -416
|
||||
|
||||
equ trap_EA_SelectWeapon -417
|
||||
equ trap_EA_Jump -418
|
||||
equ trap_EA_DelayedJump -419
|
||||
equ trap_EA_Move -420
|
||||
equ trap_EA_View -421
|
||||
|
||||
equ trap_EA_EndRegular -422
|
||||
equ trap_EA_GetInput -423
|
||||
equ trap_EA_ResetInput -424
|
||||
|
||||
|
||||
|
||||
equ trap_BotLoadCharacter -501
|
||||
equ trap_BotFreeCharacter -502
|
||||
equ trap_Characteristic_Float -503
|
||||
equ trap_Characteristic_BFloat -504
|
||||
equ trap_Characteristic_Integer -505
|
||||
equ trap_Characteristic_BInteger -506
|
||||
equ trap_Characteristic_String -507
|
||||
|
||||
equ trap_BotAllocChatState -508
|
||||
equ trap_BotFreeChatState -509
|
||||
equ trap_BotQueueConsoleMessage -510
|
||||
equ trap_BotRemoveConsoleMessage -511
|
||||
equ trap_BotNextConsoleMessage -512
|
||||
equ trap_BotNumConsoleMessages -513
|
||||
equ trap_BotInitialChat -514
|
||||
equ trap_BotReplyChat -515
|
||||
equ trap_BotChatLength -516
|
||||
equ trap_BotEnterChat -517
|
||||
equ trap_StringContains -518
|
||||
equ trap_BotFindMatch -519
|
||||
equ trap_BotMatchVariable -520
|
||||
equ trap_UnifyWhiteSpaces -521
|
||||
equ trap_BotReplaceSynonyms -522
|
||||
equ trap_BotLoadChatFile -523
|
||||
equ trap_BotSetChatGender -524
|
||||
equ trap_BotSetChatName -525
|
||||
|
||||
equ trap_BotResetGoalState -526
|
||||
equ trap_BotResetAvoidGoals -527
|
||||
equ trap_BotPushGoal -528
|
||||
equ trap_BotPopGoal -529
|
||||
equ trap_BotEmptyGoalStack -530
|
||||
equ trap_BotDumpAvoidGoals -531
|
||||
equ trap_BotDumpGoalStack -532
|
||||
equ trap_BotGoalName -533
|
||||
equ trap_BotGetTopGoal -534
|
||||
equ trap_BotGetSecondGoal -535
|
||||
equ trap_BotChooseLTGItem -536
|
||||
equ trap_BotChooseNBGItem -537
|
||||
equ trap_BotTouchingGoal -538
|
||||
equ trap_BotItemGoalInVisButNotVisible -539
|
||||
equ trap_BotGetLevelItemGoal -540
|
||||
equ trap_BotAvoidGoalTime -541
|
||||
equ trap_BotInitLevelItems -542
|
||||
equ trap_BotUpdateEntityItems -543
|
||||
equ trap_BotLoadItemWeights -544
|
||||
equ trap_BotFreeItemWeights -546
|
||||
equ trap_BotSaveGoalFuzzyLogic -546
|
||||
equ trap_BotAllocGoalState -547
|
||||
equ trap_BotFreeGoalState -548
|
||||
|
||||
equ trap_BotResetMoveState -549
|
||||
equ trap_BotMoveToGoal -550
|
||||
equ trap_BotMoveInDirection -551
|
||||
equ trap_BotResetAvoidReach -552
|
||||
equ trap_BotResetLastAvoidReach -553
|
||||
equ trap_BotReachabilityArea -554
|
||||
equ trap_BotMovementViewTarget -555
|
||||
equ trap_BotAllocMoveState -556
|
||||
equ trap_BotFreeMoveState -557
|
||||
equ trap_BotInitMoveState -558
|
||||
|
||||
equ trap_BotChooseBestFightWeapon -559
|
||||
equ trap_BotGetWeaponInfo -560
|
||||
equ trap_BotLoadWeaponWeights -561
|
||||
equ trap_BotAllocWeaponState -562
|
||||
equ trap_BotFreeWeaponState -563
|
||||
equ trap_BotResetWeaponState -564
|
||||
equ trap_GeneticParentsAndChildSelection -565
|
||||
equ trap_BotInterbreedGoalFuzzyLogic -566
|
||||
equ trap_BotMutateGoalFuzzyLogic -567
|
||||
equ trap_BotGetNextCampSpotGoal -568
|
||||
equ trap_BotGetMapLocationGoal -569
|
||||
equ trap_BotNumInitialChats -570
|
||||
equ trap_BotGetChatMessage -571
|
||||
equ trap_BotRemoveFromAvoidGoals -572
|
||||
equ trap_BotPredictVisiblePosition -573
|
||||
equ trap_BotSetAvoidGoalTime -574
|
||||
equ trap_BotAddAvoidSpot -575
|
||||
equ trap_AAS_AlternativeRouteGoals -576
|
||||
equ trap_AAS_PredictRoute -577
|
||||
equ trap_AAS_PointReachabilityAreaIndex -578
|
||||
|
||||
equ trap_BotLibLoadSource -579
|
||||
equ trap_BotLibFreeSource -580
|
||||
equ trap_BotLibReadToken -581
|
||||
equ trap_BotLibSourceFileAndLine -582
|
||||
|
||||
|
|
1580
code/game/g_syscalls.c
Normal file → Executable file
1580
code/game/g_syscalls.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
934
code/game/g_target.c
Normal file → Executable file
934
code/game/g_target.c
Normal file → Executable file
|
@ -1,467 +1,467 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
#include "g_local.h"
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_give (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
Gives the activator all the items pointed to.
|
||||
*/
|
||||
void Use_Target_Give( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
gentity_t *t;
|
||||
trace_t trace;
|
||||
|
||||
if ( !activator->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !ent->target ) {
|
||||
return;
|
||||
}
|
||||
|
||||
memset( &trace, 0, sizeof( trace ) );
|
||||
t = NULL;
|
||||
while ( (t = G_Find (t, FOFS(targetname), ent->target)) != NULL ) {
|
||||
if ( !t->item ) {
|
||||
continue;
|
||||
}
|
||||
Touch_Item( t, activator, &trace );
|
||||
|
||||
// make sure it isn't going to respawn or show any events
|
||||
t->nextthink = 0;
|
||||
trap_UnlinkEntity( t );
|
||||
}
|
||||
}
|
||||
|
||||
void SP_target_give( gentity_t *ent ) {
|
||||
ent->use = Use_Target_Give;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_remove_powerups (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
takes away all the activators powerups.
|
||||
Used to drop flight powerups into death puts.
|
||||
*/
|
||||
void Use_target_remove_powerups( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
if( !activator->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( activator->client->ps.powerups[PW_REDFLAG] ) {
|
||||
Team_ReturnFlag( TEAM_RED );
|
||||
} else if( activator->client->ps.powerups[PW_BLUEFLAG] ) {
|
||||
Team_ReturnFlag( TEAM_BLUE );
|
||||
} else if( activator->client->ps.powerups[PW_NEUTRALFLAG] ) {
|
||||
Team_ReturnFlag( TEAM_FREE );
|
||||
}
|
||||
|
||||
memset( activator->client->ps.powerups, 0, sizeof( activator->client->ps.powerups ) );
|
||||
}
|
||||
|
||||
void SP_target_remove_powerups( gentity_t *ent ) {
|
||||
ent->use = Use_target_remove_powerups;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_delay (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
"wait" seconds to pause before firing targets.
|
||||
"random" delay variance, total delay = delay +/- random seconds
|
||||
*/
|
||||
void Think_Target_Delay( gentity_t *ent ) {
|
||||
G_UseTargets( ent, ent->activator );
|
||||
}
|
||||
|
||||
void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000;
|
||||
ent->think = Think_Target_Delay;
|
||||
ent->activator = activator;
|
||||
}
|
||||
|
||||
void SP_target_delay( gentity_t *ent ) {
|
||||
// check delay for backwards compatability
|
||||
if ( !G_SpawnFloat( "delay", "0", &ent->wait ) ) {
|
||||
G_SpawnFloat( "wait", "1", &ent->wait );
|
||||
}
|
||||
|
||||
if ( !ent->wait ) {
|
||||
ent->wait = 1;
|
||||
}
|
||||
ent->use = Use_Target_Delay;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_score (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
"count" number of points to add, default 1
|
||||
|
||||
The activator is given this many points.
|
||||
*/
|
||||
void Use_Target_Score (gentity_t *ent, gentity_t *other, gentity_t *activator) {
|
||||
AddScore( activator, ent->r.currentOrigin, ent->count );
|
||||
}
|
||||
|
||||
void SP_target_score( gentity_t *ent ) {
|
||||
if ( !ent->count ) {
|
||||
ent->count = 1;
|
||||
}
|
||||
ent->use = Use_Target_Score;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_print (1 0 0) (-8 -8 -8) (8 8 8) redteam blueteam private
|
||||
"message" text to print
|
||||
If "private", only the activator gets the message. If no checks, all clients get the message.
|
||||
*/
|
||||
void Use_Target_Print (gentity_t *ent, gentity_t *other, gentity_t *activator) {
|
||||
if ( activator->client && ( ent->spawnflags & 4 ) ) {
|
||||
trap_SendServerCommand( activator-g_entities, va("cp \"%s\"", ent->message ));
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ent->spawnflags & 3 ) {
|
||||
if ( ent->spawnflags & 1 ) {
|
||||
G_TeamCommand( TEAM_RED, va("cp \"%s\"", ent->message) );
|
||||
}
|
||||
if ( ent->spawnflags & 2 ) {
|
||||
G_TeamCommand( TEAM_BLUE, va("cp \"%s\"", ent->message) );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
trap_SendServerCommand( -1, va("cp \"%s\"", ent->message ));
|
||||
}
|
||||
|
||||
void SP_target_print( gentity_t *ent ) {
|
||||
ent->use = Use_Target_Print;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
|
||||
/*QUAKED target_speaker (1 0 0) (-8 -8 -8) (8 8 8) looped-on looped-off global activator
|
||||
"noise" wav file to play
|
||||
|
||||
A global sound will play full volume throughout the level.
|
||||
Activator sounds will play on the player that activated the target.
|
||||
Global and activator sounds can't be combined with looping.
|
||||
Normal sounds play each time the target is used.
|
||||
Looped sounds will be toggled by use functions.
|
||||
Multiple identical looping sounds will just increase volume without any speed cost.
|
||||
"wait" : Seconds between auto triggerings, 0 = don't auto trigger
|
||||
"random" wait variance, default is 0
|
||||
*/
|
||||
void Use_Target_Speaker (gentity_t *ent, gentity_t *other, gentity_t *activator) {
|
||||
if (ent->spawnflags & 3) { // looping sound toggles
|
||||
if (ent->s.loopSound)
|
||||
ent->s.loopSound = 0; // turn it off
|
||||
else
|
||||
ent->s.loopSound = ent->noise_index; // start it
|
||||
}else { // normal sound
|
||||
if ( ent->spawnflags & 8 ) {
|
||||
G_AddEvent( activator, EV_GENERAL_SOUND, ent->noise_index );
|
||||
} else if (ent->spawnflags & 4) {
|
||||
G_AddEvent( ent, EV_GLOBAL_SOUND, ent->noise_index );
|
||||
} else {
|
||||
G_AddEvent( ent, EV_GENERAL_SOUND, ent->noise_index );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SP_target_speaker( gentity_t *ent ) {
|
||||
char buffer[MAX_QPATH];
|
||||
char *s;
|
||||
|
||||
G_SpawnFloat( "wait", "0", &ent->wait );
|
||||
G_SpawnFloat( "random", "0", &ent->random );
|
||||
|
||||
if ( !G_SpawnString( "noise", "NOSOUND", &s ) ) {
|
||||
G_Error( "target_speaker without a noise key at %s", vtos( ent->s.origin ) );
|
||||
}
|
||||
|
||||
// force all client reletive sounds to be "activator" speakers that
|
||||
// play on the entity that activates it
|
||||
if ( s[0] == '*' ) {
|
||||
ent->spawnflags |= 8;
|
||||
}
|
||||
|
||||
if (!strstr( s, ".wav" )) {
|
||||
Com_sprintf (buffer, sizeof(buffer), "%s.wav", s );
|
||||
} else {
|
||||
Q_strncpyz( buffer, s, sizeof(buffer) );
|
||||
}
|
||||
ent->noise_index = G_SoundIndex(buffer);
|
||||
|
||||
// a repeating speaker can be done completely client side
|
||||
ent->s.eType = ET_SPEAKER;
|
||||
ent->s.eventParm = ent->noise_index;
|
||||
ent->s.frame = ent->wait * 10;
|
||||
ent->s.clientNum = ent->random * 10;
|
||||
|
||||
|
||||
// check for prestarted looping sound
|
||||
if ( ent->spawnflags & 1 ) {
|
||||
ent->s.loopSound = ent->noise_index;
|
||||
}
|
||||
|
||||
ent->use = Use_Target_Speaker;
|
||||
|
||||
if (ent->spawnflags & 4) {
|
||||
ent->r.svFlags |= SVF_BROADCAST;
|
||||
}
|
||||
|
||||
VectorCopy( ent->s.origin, ent->s.pos.trBase );
|
||||
|
||||
// must link the entity so we get areas and clusters so
|
||||
// the server can determine who to send updates to
|
||||
trap_LinkEntity( ent );
|
||||
}
|
||||
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_laser (0 .5 .8) (-8 -8 -8) (8 8 8) START_ON
|
||||
When triggered, fires a laser. You can either set a target or a direction.
|
||||
*/
|
||||
void target_laser_think (gentity_t *self) {
|
||||
vec3_t end;
|
||||
trace_t tr;
|
||||
vec3_t point;
|
||||
|
||||
// if pointed at another entity, set movedir to point at it
|
||||
if ( self->enemy ) {
|
||||
VectorMA (self->enemy->s.origin, 0.5, self->enemy->r.mins, point);
|
||||
VectorMA (point, 0.5, self->enemy->r.maxs, point);
|
||||
VectorSubtract (point, self->s.origin, self->movedir);
|
||||
VectorNormalize (self->movedir);
|
||||
}
|
||||
|
||||
// fire forward and see what we hit
|
||||
VectorMA (self->s.origin, 2048, self->movedir, end);
|
||||
|
||||
trap_Trace( &tr, self->s.origin, NULL, NULL, end, self->s.number, CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE);
|
||||
|
||||
if ( tr.entityNum ) {
|
||||
// hurt it if we can
|
||||
G_Damage ( &g_entities[tr.entityNum], self, self->activator, self->movedir,
|
||||
tr.endpos, self->damage, DAMAGE_NO_KNOCKBACK, MOD_TARGET_LASER);
|
||||
}
|
||||
|
||||
VectorCopy (tr.endpos, self->s.origin2);
|
||||
|
||||
trap_LinkEntity( self );
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
}
|
||||
|
||||
void target_laser_on (gentity_t *self)
|
||||
{
|
||||
if (!self->activator)
|
||||
self->activator = self;
|
||||
target_laser_think (self);
|
||||
}
|
||||
|
||||
void target_laser_off (gentity_t *self)
|
||||
{
|
||||
trap_UnlinkEntity( self );
|
||||
self->nextthink = 0;
|
||||
}
|
||||
|
||||
void target_laser_use (gentity_t *self, gentity_t *other, gentity_t *activator)
|
||||
{
|
||||
self->activator = activator;
|
||||
if ( self->nextthink > 0 )
|
||||
target_laser_off (self);
|
||||
else
|
||||
target_laser_on (self);
|
||||
}
|
||||
|
||||
void target_laser_start (gentity_t *self)
|
||||
{
|
||||
gentity_t *ent;
|
||||
|
||||
self->s.eType = ET_BEAM;
|
||||
|
||||
if (self->target) {
|
||||
ent = G_Find (NULL, FOFS(targetname), self->target);
|
||||
if (!ent) {
|
||||
G_Printf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target);
|
||||
}
|
||||
self->enemy = ent;
|
||||
} else {
|
||||
G_SetMovedir (self->s.angles, self->movedir);
|
||||
}
|
||||
|
||||
self->use = target_laser_use;
|
||||
self->think = target_laser_think;
|
||||
|
||||
if ( !self->damage ) {
|
||||
self->damage = 1;
|
||||
}
|
||||
|
||||
if (self->spawnflags & 1)
|
||||
target_laser_on (self);
|
||||
else
|
||||
target_laser_off (self);
|
||||
}
|
||||
|
||||
void SP_target_laser (gentity_t *self)
|
||||
{
|
||||
// let everything else get spawned before we start firing
|
||||
self->think = target_laser_start;
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
void target_teleporter_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
gentity_t *dest;
|
||||
|
||||
if (!activator->client)
|
||||
return;
|
||||
dest = G_PickTarget( self->target );
|
||||
if (!dest) {
|
||||
G_Printf ("Couldn't find teleporter destination\n");
|
||||
return;
|
||||
}
|
||||
|
||||
TeleportPlayer( activator, dest->s.origin, dest->s.angles );
|
||||
}
|
||||
|
||||
/*QUAKED target_teleporter (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
The activator will be teleported away.
|
||||
*/
|
||||
void SP_target_teleporter( gentity_t *self ) {
|
||||
if (!self->targetname)
|
||||
G_Printf("untargeted %s at %s\n", self->classname, vtos(self->s.origin));
|
||||
|
||||
self->use = target_teleporter_use;
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
|
||||
|
||||
/*QUAKED target_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) RED_ONLY BLUE_ONLY RANDOM
|
||||
This doesn't perform any actions except fire its targets.
|
||||
The activator can be forced to be from a certain team.
|
||||
if RANDOM is checked, only one of the targets will be fired, not all of them
|
||||
*/
|
||||
void target_relay_use (gentity_t *self, gentity_t *other, gentity_t *activator) {
|
||||
if ( ( self->spawnflags & 1 ) && activator->client
|
||||
&& activator->client->sess.sessionTeam != TEAM_RED ) {
|
||||
return;
|
||||
}
|
||||
if ( ( self->spawnflags & 2 ) && activator->client
|
||||
&& activator->client->sess.sessionTeam != TEAM_BLUE ) {
|
||||
return;
|
||||
}
|
||||
if ( self->spawnflags & 4 ) {
|
||||
gentity_t *ent;
|
||||
|
||||
ent = G_PickTarget( self->target );
|
||||
if ( ent && ent->use ) {
|
||||
ent->use( ent, self, activator );
|
||||
}
|
||||
return;
|
||||
}
|
||||
G_UseTargets (self, activator);
|
||||
}
|
||||
|
||||
void SP_target_relay (gentity_t *self) {
|
||||
self->use = target_relay_use;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_kill (.5 .5 .5) (-8 -8 -8) (8 8 8)
|
||||
Kills the activator.
|
||||
*/
|
||||
void target_kill_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
G_Damage ( activator, NULL, NULL, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
|
||||
}
|
||||
|
||||
void SP_target_kill( gentity_t *self ) {
|
||||
self->use = target_kill_use;
|
||||
}
|
||||
|
||||
/*QUAKED target_position (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for in-game calculation, like jumppad targets.
|
||||
*/
|
||||
void SP_target_position( gentity_t *self ){
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
static void target_location_linkup(gentity_t *ent)
|
||||
{
|
||||
int i;
|
||||
int n;
|
||||
|
||||
if (level.locationLinked)
|
||||
return;
|
||||
|
||||
level.locationLinked = qtrue;
|
||||
|
||||
level.locationHead = NULL;
|
||||
|
||||
trap_SetConfigstring( CS_LOCATIONS, "unknown" );
|
||||
|
||||
for (i = 0, ent = g_entities, n = 1;
|
||||
i < level.num_entities;
|
||||
i++, ent++) {
|
||||
if (ent->classname && !Q_stricmp(ent->classname, "target_location")) {
|
||||
// lets overload some variables!
|
||||
ent->health = n; // use for location marking
|
||||
trap_SetConfigstring( CS_LOCATIONS + n, ent->message );
|
||||
n++;
|
||||
ent->nextTrain = level.locationHead;
|
||||
level.locationHead = ent;
|
||||
}
|
||||
}
|
||||
|
||||
// All linked together now
|
||||
}
|
||||
|
||||
/*QUAKED target_location (0 0.5 0) (-8 -8 -8) (8 8 8)
|
||||
Set "message" to the name of this location.
|
||||
Set "count" to 0-7 for color.
|
||||
0:white 1:red 2:green 3:yellow 4:blue 5:cyan 6:magenta 7:white
|
||||
|
||||
Closest target_location in sight used for the location, if none
|
||||
in site, closest in distance
|
||||
*/
|
||||
void SP_target_location( gentity_t *self ){
|
||||
self->think = target_location_linkup;
|
||||
self->nextthink = level.time + 200; // Let them all spawn first
|
||||
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
#include "g_local.h"
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_give (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
Gives the activator all the items pointed to.
|
||||
*/
|
||||
void Use_Target_Give( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
gentity_t *t;
|
||||
trace_t trace;
|
||||
|
||||
if ( !activator->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !ent->target ) {
|
||||
return;
|
||||
}
|
||||
|
||||
memset( &trace, 0, sizeof( trace ) );
|
||||
t = NULL;
|
||||
while ( (t = G_Find (t, FOFS(targetname), ent->target)) != NULL ) {
|
||||
if ( !t->item ) {
|
||||
continue;
|
||||
}
|
||||
Touch_Item( t, activator, &trace );
|
||||
|
||||
// make sure it isn't going to respawn or show any events
|
||||
t->nextthink = 0;
|
||||
trap_UnlinkEntity( t );
|
||||
}
|
||||
}
|
||||
|
||||
void SP_target_give( gentity_t *ent ) {
|
||||
ent->use = Use_Target_Give;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_remove_powerups (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
takes away all the activators powerups.
|
||||
Used to drop flight powerups into death puts.
|
||||
*/
|
||||
void Use_target_remove_powerups( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
if( !activator->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( activator->client->ps.powerups[PW_REDFLAG] ) {
|
||||
Team_ReturnFlag( TEAM_RED );
|
||||
} else if( activator->client->ps.powerups[PW_BLUEFLAG] ) {
|
||||
Team_ReturnFlag( TEAM_BLUE );
|
||||
} else if( activator->client->ps.powerups[PW_NEUTRALFLAG] ) {
|
||||
Team_ReturnFlag( TEAM_FREE );
|
||||
}
|
||||
|
||||
memset( activator->client->ps.powerups, 0, sizeof( activator->client->ps.powerups ) );
|
||||
}
|
||||
|
||||
void SP_target_remove_powerups( gentity_t *ent ) {
|
||||
ent->use = Use_target_remove_powerups;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_delay (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
"wait" seconds to pause before firing targets.
|
||||
"random" delay variance, total delay = delay +/- random seconds
|
||||
*/
|
||||
void Think_Target_Delay( gentity_t *ent ) {
|
||||
G_UseTargets( ent, ent->activator );
|
||||
}
|
||||
|
||||
void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000;
|
||||
ent->think = Think_Target_Delay;
|
||||
ent->activator = activator;
|
||||
}
|
||||
|
||||
void SP_target_delay( gentity_t *ent ) {
|
||||
// check delay for backwards compatability
|
||||
if ( !G_SpawnFloat( "delay", "0", &ent->wait ) ) {
|
||||
G_SpawnFloat( "wait", "1", &ent->wait );
|
||||
}
|
||||
|
||||
if ( !ent->wait ) {
|
||||
ent->wait = 1;
|
||||
}
|
||||
ent->use = Use_Target_Delay;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_score (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
"count" number of points to add, default 1
|
||||
|
||||
The activator is given this many points.
|
||||
*/
|
||||
void Use_Target_Score (gentity_t *ent, gentity_t *other, gentity_t *activator) {
|
||||
AddScore( activator, ent->r.currentOrigin, ent->count );
|
||||
}
|
||||
|
||||
void SP_target_score( gentity_t *ent ) {
|
||||
if ( !ent->count ) {
|
||||
ent->count = 1;
|
||||
}
|
||||
ent->use = Use_Target_Score;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_print (1 0 0) (-8 -8 -8) (8 8 8) redteam blueteam private
|
||||
"message" text to print
|
||||
If "private", only the activator gets the message. If no checks, all clients get the message.
|
||||
*/
|
||||
void Use_Target_Print (gentity_t *ent, gentity_t *other, gentity_t *activator) {
|
||||
if ( activator->client && ( ent->spawnflags & 4 ) ) {
|
||||
trap_SendServerCommand( activator-g_entities, va("cp \"%s\"", ent->message ));
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ent->spawnflags & 3 ) {
|
||||
if ( ent->spawnflags & 1 ) {
|
||||
G_TeamCommand( TEAM_RED, va("cp \"%s\"", ent->message) );
|
||||
}
|
||||
if ( ent->spawnflags & 2 ) {
|
||||
G_TeamCommand( TEAM_BLUE, va("cp \"%s\"", ent->message) );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
trap_SendServerCommand( -1, va("cp \"%s\"", ent->message ));
|
||||
}
|
||||
|
||||
void SP_target_print( gentity_t *ent ) {
|
||||
ent->use = Use_Target_Print;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
|
||||
/*QUAKED target_speaker (1 0 0) (-8 -8 -8) (8 8 8) looped-on looped-off global activator
|
||||
"noise" wav file to play
|
||||
|
||||
A global sound will play full volume throughout the level.
|
||||
Activator sounds will play on the player that activated the target.
|
||||
Global and activator sounds can't be combined with looping.
|
||||
Normal sounds play each time the target is used.
|
||||
Looped sounds will be toggled by use functions.
|
||||
Multiple identical looping sounds will just increase volume without any speed cost.
|
||||
"wait" : Seconds between auto triggerings, 0 = don't auto trigger
|
||||
"random" wait variance, default is 0
|
||||
*/
|
||||
void Use_Target_Speaker (gentity_t *ent, gentity_t *other, gentity_t *activator) {
|
||||
if (ent->spawnflags & 3) { // looping sound toggles
|
||||
if (ent->s.loopSound)
|
||||
ent->s.loopSound = 0; // turn it off
|
||||
else
|
||||
ent->s.loopSound = ent->noise_index; // start it
|
||||
}else { // normal sound
|
||||
if ( ent->spawnflags & 8 ) {
|
||||
G_AddEvent( activator, EV_GENERAL_SOUND, ent->noise_index );
|
||||
} else if (ent->spawnflags & 4) {
|
||||
G_AddEvent( ent, EV_GLOBAL_SOUND, ent->noise_index );
|
||||
} else {
|
||||
G_AddEvent( ent, EV_GENERAL_SOUND, ent->noise_index );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SP_target_speaker( gentity_t *ent ) {
|
||||
char buffer[MAX_QPATH];
|
||||
char *s;
|
||||
|
||||
G_SpawnFloat( "wait", "0", &ent->wait );
|
||||
G_SpawnFloat( "random", "0", &ent->random );
|
||||
|
||||
if ( !G_SpawnString( "noise", "NOSOUND", &s ) ) {
|
||||
G_Error( "target_speaker without a noise key at %s", vtos( ent->s.origin ) );
|
||||
}
|
||||
|
||||
// force all client reletive sounds to be "activator" speakers that
|
||||
// play on the entity that activates it
|
||||
if ( s[0] == '*' ) {
|
||||
ent->spawnflags |= 8;
|
||||
}
|
||||
|
||||
if (!strstr( s, ".wav" )) {
|
||||
Com_sprintf (buffer, sizeof(buffer), "%s.wav", s );
|
||||
} else {
|
||||
Q_strncpyz( buffer, s, sizeof(buffer) );
|
||||
}
|
||||
ent->noise_index = G_SoundIndex(buffer);
|
||||
|
||||
// a repeating speaker can be done completely client side
|
||||
ent->s.eType = ET_SPEAKER;
|
||||
ent->s.eventParm = ent->noise_index;
|
||||
ent->s.frame = ent->wait * 10;
|
||||
ent->s.clientNum = ent->random * 10;
|
||||
|
||||
|
||||
// check for prestarted looping sound
|
||||
if ( ent->spawnflags & 1 ) {
|
||||
ent->s.loopSound = ent->noise_index;
|
||||
}
|
||||
|
||||
ent->use = Use_Target_Speaker;
|
||||
|
||||
if (ent->spawnflags & 4) {
|
||||
ent->r.svFlags |= SVF_BROADCAST;
|
||||
}
|
||||
|
||||
VectorCopy( ent->s.origin, ent->s.pos.trBase );
|
||||
|
||||
// must link the entity so we get areas and clusters so
|
||||
// the server can determine who to send updates to
|
||||
trap_LinkEntity( ent );
|
||||
}
|
||||
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_laser (0 .5 .8) (-8 -8 -8) (8 8 8) START_ON
|
||||
When triggered, fires a laser. You can either set a target or a direction.
|
||||
*/
|
||||
void target_laser_think (gentity_t *self) {
|
||||
vec3_t end;
|
||||
trace_t tr;
|
||||
vec3_t point;
|
||||
|
||||
// if pointed at another entity, set movedir to point at it
|
||||
if ( self->enemy ) {
|
||||
VectorMA (self->enemy->s.origin, 0.5, self->enemy->r.mins, point);
|
||||
VectorMA (point, 0.5, self->enemy->r.maxs, point);
|
||||
VectorSubtract (point, self->s.origin, self->movedir);
|
||||
VectorNormalize (self->movedir);
|
||||
}
|
||||
|
||||
// fire forward and see what we hit
|
||||
VectorMA (self->s.origin, 2048, self->movedir, end);
|
||||
|
||||
trap_Trace( &tr, self->s.origin, NULL, NULL, end, self->s.number, CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE);
|
||||
|
||||
if ( tr.entityNum ) {
|
||||
// hurt it if we can
|
||||
G_Damage ( &g_entities[tr.entityNum], self, self->activator, self->movedir,
|
||||
tr.endpos, self->damage, DAMAGE_NO_KNOCKBACK, MOD_TARGET_LASER);
|
||||
}
|
||||
|
||||
VectorCopy (tr.endpos, self->s.origin2);
|
||||
|
||||
trap_LinkEntity( self );
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
}
|
||||
|
||||
void target_laser_on (gentity_t *self)
|
||||
{
|
||||
if (!self->activator)
|
||||
self->activator = self;
|
||||
target_laser_think (self);
|
||||
}
|
||||
|
||||
void target_laser_off (gentity_t *self)
|
||||
{
|
||||
trap_UnlinkEntity( self );
|
||||
self->nextthink = 0;
|
||||
}
|
||||
|
||||
void target_laser_use (gentity_t *self, gentity_t *other, gentity_t *activator)
|
||||
{
|
||||
self->activator = activator;
|
||||
if ( self->nextthink > 0 )
|
||||
target_laser_off (self);
|
||||
else
|
||||
target_laser_on (self);
|
||||
}
|
||||
|
||||
void target_laser_start (gentity_t *self)
|
||||
{
|
||||
gentity_t *ent;
|
||||
|
||||
self->s.eType = ET_BEAM;
|
||||
|
||||
if (self->target) {
|
||||
ent = G_Find (NULL, FOFS(targetname), self->target);
|
||||
if (!ent) {
|
||||
G_Printf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target);
|
||||
}
|
||||
self->enemy = ent;
|
||||
} else {
|
||||
G_SetMovedir (self->s.angles, self->movedir);
|
||||
}
|
||||
|
||||
self->use = target_laser_use;
|
||||
self->think = target_laser_think;
|
||||
|
||||
if ( !self->damage ) {
|
||||
self->damage = 1;
|
||||
}
|
||||
|
||||
if (self->spawnflags & 1)
|
||||
target_laser_on (self);
|
||||
else
|
||||
target_laser_off (self);
|
||||
}
|
||||
|
||||
void SP_target_laser (gentity_t *self)
|
||||
{
|
||||
// let everything else get spawned before we start firing
|
||||
self->think = target_laser_start;
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
void target_teleporter_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
gentity_t *dest;
|
||||
|
||||
if (!activator->client)
|
||||
return;
|
||||
dest = G_PickTarget( self->target );
|
||||
if (!dest) {
|
||||
G_Printf ("Couldn't find teleporter destination\n");
|
||||
return;
|
||||
}
|
||||
|
||||
TeleportPlayer( activator, dest->s.origin, dest->s.angles );
|
||||
}
|
||||
|
||||
/*QUAKED target_teleporter (1 0 0) (-8 -8 -8) (8 8 8)
|
||||
The activator will be teleported away.
|
||||
*/
|
||||
void SP_target_teleporter( gentity_t *self ) {
|
||||
if (!self->targetname)
|
||||
G_Printf("untargeted %s at %s\n", self->classname, vtos(self->s.origin));
|
||||
|
||||
self->use = target_teleporter_use;
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
|
||||
|
||||
/*QUAKED target_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) RED_ONLY BLUE_ONLY RANDOM
|
||||
This doesn't perform any actions except fire its targets.
|
||||
The activator can be forced to be from a certain team.
|
||||
if RANDOM is checked, only one of the targets will be fired, not all of them
|
||||
*/
|
||||
void target_relay_use (gentity_t *self, gentity_t *other, gentity_t *activator) {
|
||||
if ( ( self->spawnflags & 1 ) && activator->client
|
||||
&& activator->client->sess.sessionTeam != TEAM_RED ) {
|
||||
return;
|
||||
}
|
||||
if ( ( self->spawnflags & 2 ) && activator->client
|
||||
&& activator->client->sess.sessionTeam != TEAM_BLUE ) {
|
||||
return;
|
||||
}
|
||||
if ( self->spawnflags & 4 ) {
|
||||
gentity_t *ent;
|
||||
|
||||
ent = G_PickTarget( self->target );
|
||||
if ( ent && ent->use ) {
|
||||
ent->use( ent, self, activator );
|
||||
}
|
||||
return;
|
||||
}
|
||||
G_UseTargets (self, activator);
|
||||
}
|
||||
|
||||
void SP_target_relay (gentity_t *self) {
|
||||
self->use = target_relay_use;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
|
||||
/*QUAKED target_kill (.5 .5 .5) (-8 -8 -8) (8 8 8)
|
||||
Kills the activator.
|
||||
*/
|
||||
void target_kill_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
G_Damage ( activator, NULL, NULL, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
|
||||
}
|
||||
|
||||
void SP_target_kill( gentity_t *self ) {
|
||||
self->use = target_kill_use;
|
||||
}
|
||||
|
||||
/*QUAKED target_position (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for in-game calculation, like jumppad targets.
|
||||
*/
|
||||
void SP_target_position( gentity_t *self ){
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
static void target_location_linkup(gentity_t *ent)
|
||||
{
|
||||
int i;
|
||||
int n;
|
||||
|
||||
if (level.locationLinked)
|
||||
return;
|
||||
|
||||
level.locationLinked = qtrue;
|
||||
|
||||
level.locationHead = NULL;
|
||||
|
||||
trap_SetConfigstring( CS_LOCATIONS, "unknown" );
|
||||
|
||||
for (i = 0, ent = g_entities, n = 1;
|
||||
i < level.num_entities;
|
||||
i++, ent++) {
|
||||
if (ent->classname && !Q_stricmp(ent->classname, "target_location")) {
|
||||
// lets overload some variables!
|
||||
ent->health = n; // use for location marking
|
||||
trap_SetConfigstring( CS_LOCATIONS + n, ent->message );
|
||||
n++;
|
||||
ent->nextTrain = level.locationHead;
|
||||
level.locationHead = ent;
|
||||
}
|
||||
}
|
||||
|
||||
// All linked together now
|
||||
}
|
||||
|
||||
/*QUAKED target_location (0 0.5 0) (-8 -8 -8) (8 8 8)
|
||||
Set "message" to the name of this location.
|
||||
Set "count" to 0-7 for color.
|
||||
0:white 1:red 2:green 3:yellow 4:blue 5:cyan 6:magenta 7:white
|
||||
|
||||
Closest target_location in sight used for the location, if none
|
||||
in site, closest in distance
|
||||
*/
|
||||
void SP_target_location( gentity_t *self ){
|
||||
self->think = target_location_linkup;
|
||||
self->nextthink = level.time + 200; // Let them all spawn first
|
||||
|
||||
G_SetOrigin( self, self->s.origin );
|
||||
}
|
||||
|
||||
|
|
2966
code/game/g_team.c
Normal file → Executable file
2966
code/game/g_team.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
176
code/game/g_team.h
Normal file → Executable file
176
code/game/g_team.h
Normal file → Executable file
|
@ -1,88 +1,88 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
|
||||
#define CTF_CAPTURE_BONUS 100 // what you get for capture
|
||||
#define CTF_TEAM_BONUS 25 // what your team gets for capture
|
||||
#define CTF_RECOVERY_BONUS 10 // what you get for recovery
|
||||
#define CTF_FLAG_BONUS 10 // what you get for picking up enemy flag
|
||||
#define CTF_FRAG_CARRIER_BONUS 20 // what you get for fragging enemy flag carrier
|
||||
#define CTF_FLAG_RETURN_TIME 40000 // seconds until auto return
|
||||
|
||||
#define CTF_CARRIER_DANGER_PROTECT_BONUS 5 // bonus for fraggin someone who has recently hurt your flag carrier
|
||||
#define CTF_CARRIER_PROTECT_BONUS 2 // bonus for fraggin someone while either you or your target are near your flag carrier
|
||||
#define CTF_FLAG_DEFENSE_BONUS 10 // bonus for fraggin someone while either you or your target are near your flag
|
||||
#define CTF_RETURN_FLAG_ASSIST_BONUS 10 // awarded for returning a flag that causes a capture to happen almost immediately
|
||||
#define CTF_FRAG_CARRIER_ASSIST_BONUS 10 // award for fragging a flag carrier if a capture happens almost immediately
|
||||
|
||||
#else
|
||||
|
||||
#define CTF_CAPTURE_BONUS 5 // what you get for capture
|
||||
#define CTF_TEAM_BONUS 0 // what your team gets for capture
|
||||
#define CTF_RECOVERY_BONUS 1 // what you get for recovery
|
||||
#define CTF_FLAG_BONUS 0 // what you get for picking up enemy flag
|
||||
#define CTF_FRAG_CARRIER_BONUS 2 // what you get for fragging enemy flag carrier
|
||||
#define CTF_FLAG_RETURN_TIME 40000 // seconds until auto return
|
||||
|
||||
#define CTF_CARRIER_DANGER_PROTECT_BONUS 2 // bonus for fraggin someone who has recently hurt your flag carrier
|
||||
#define CTF_CARRIER_PROTECT_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag carrier
|
||||
#define CTF_FLAG_DEFENSE_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag
|
||||
#define CTF_RETURN_FLAG_ASSIST_BONUS 1 // awarded for returning a flag that causes a capture to happen almost immediately
|
||||
#define CTF_FRAG_CARRIER_ASSIST_BONUS 2 // award for fragging a flag carrier if a capture happens almost immediately
|
||||
|
||||
#endif
|
||||
|
||||
#define CTF_TARGET_PROTECT_RADIUS 1000 // the radius around an object being defended where a target will be worth extra frags
|
||||
#define CTF_ATTACKER_PROTECT_RADIUS 1000 // the radius around an object being defended where an attacker will get extra frags when making kills
|
||||
|
||||
#define CTF_CARRIER_DANGER_PROTECT_TIMEOUT 8000
|
||||
#define CTF_FRAG_CARRIER_ASSIST_TIMEOUT 10000
|
||||
#define CTF_RETURN_FLAG_ASSIST_TIMEOUT 10000
|
||||
|
||||
#define CTF_GRAPPLE_SPEED 750 // speed of grapple in flight
|
||||
#define CTF_GRAPPLE_PULL_SPEED 750 // speed player is pulled at
|
||||
|
||||
#define OVERLOAD_ATTACK_BASE_SOUND_TIME 20000
|
||||
|
||||
// Prototypes
|
||||
|
||||
int OtherTeam(int team);
|
||||
const char *TeamName(int team);
|
||||
const char *OtherTeamName(int team);
|
||||
const char *TeamColorString(int team);
|
||||
void AddTeamScore(vec3_t origin, int team, int score);
|
||||
|
||||
void Team_DroppedFlagThink(gentity_t *ent);
|
||||
void Team_FragBonuses(gentity_t *targ, gentity_t *inflictor, gentity_t *attacker);
|
||||
void Team_CheckHurtCarrier(gentity_t *targ, gentity_t *attacker);
|
||||
void Team_InitGame(void);
|
||||
void Team_ReturnFlag(int team);
|
||||
void Team_FreeEntity(gentity_t *ent);
|
||||
gentity_t *SelectCTFSpawnPoint ( team_t team, int teamstate, vec3_t origin, vec3_t angles );
|
||||
gentity_t *Team_GetLocation(gentity_t *ent);
|
||||
qboolean Team_GetLocationMsg(gentity_t *ent, char *loc, int loclen);
|
||||
void TeamplayInfoMessage( gentity_t *ent );
|
||||
void CheckTeamStatus(void);
|
||||
|
||||
int Pickup_Team( gentity_t *ent, gentity_t *other );
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
|
||||
#define CTF_CAPTURE_BONUS 100 // what you get for capture
|
||||
#define CTF_TEAM_BONUS 25 // what your team gets for capture
|
||||
#define CTF_RECOVERY_BONUS 10 // what you get for recovery
|
||||
#define CTF_FLAG_BONUS 10 // what you get for picking up enemy flag
|
||||
#define CTF_FRAG_CARRIER_BONUS 20 // what you get for fragging enemy flag carrier
|
||||
#define CTF_FLAG_RETURN_TIME 40000 // seconds until auto return
|
||||
|
||||
#define CTF_CARRIER_DANGER_PROTECT_BONUS 5 // bonus for fraggin someone who has recently hurt your flag carrier
|
||||
#define CTF_CARRIER_PROTECT_BONUS 2 // bonus for fraggin someone while either you or your target are near your flag carrier
|
||||
#define CTF_FLAG_DEFENSE_BONUS 10 // bonus for fraggin someone while either you or your target are near your flag
|
||||
#define CTF_RETURN_FLAG_ASSIST_BONUS 10 // awarded for returning a flag that causes a capture to happen almost immediately
|
||||
#define CTF_FRAG_CARRIER_ASSIST_BONUS 10 // award for fragging a flag carrier if a capture happens almost immediately
|
||||
|
||||
#else
|
||||
|
||||
#define CTF_CAPTURE_BONUS 5 // what you get for capture
|
||||
#define CTF_TEAM_BONUS 0 // what your team gets for capture
|
||||
#define CTF_RECOVERY_BONUS 1 // what you get for recovery
|
||||
#define CTF_FLAG_BONUS 0 // what you get for picking up enemy flag
|
||||
#define CTF_FRAG_CARRIER_BONUS 2 // what you get for fragging enemy flag carrier
|
||||
#define CTF_FLAG_RETURN_TIME 40000 // seconds until auto return
|
||||
|
||||
#define CTF_CARRIER_DANGER_PROTECT_BONUS 2 // bonus for fraggin someone who has recently hurt your flag carrier
|
||||
#define CTF_CARRIER_PROTECT_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag carrier
|
||||
#define CTF_FLAG_DEFENSE_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag
|
||||
#define CTF_RETURN_FLAG_ASSIST_BONUS 1 // awarded for returning a flag that causes a capture to happen almost immediately
|
||||
#define CTF_FRAG_CARRIER_ASSIST_BONUS 2 // award for fragging a flag carrier if a capture happens almost immediately
|
||||
|
||||
#endif
|
||||
|
||||
#define CTF_TARGET_PROTECT_RADIUS 1000 // the radius around an object being defended where a target will be worth extra frags
|
||||
#define CTF_ATTACKER_PROTECT_RADIUS 1000 // the radius around an object being defended where an attacker will get extra frags when making kills
|
||||
|
||||
#define CTF_CARRIER_DANGER_PROTECT_TIMEOUT 8000
|
||||
#define CTF_FRAG_CARRIER_ASSIST_TIMEOUT 10000
|
||||
#define CTF_RETURN_FLAG_ASSIST_TIMEOUT 10000
|
||||
|
||||
#define CTF_GRAPPLE_SPEED 750 // speed of grapple in flight
|
||||
#define CTF_GRAPPLE_PULL_SPEED 750 // speed player is pulled at
|
||||
|
||||
#define OVERLOAD_ATTACK_BASE_SOUND_TIME 20000
|
||||
|
||||
// Prototypes
|
||||
|
||||
int OtherTeam(int team);
|
||||
const char *TeamName(int team);
|
||||
const char *OtherTeamName(int team);
|
||||
const char *TeamColorString(int team);
|
||||
void AddTeamScore(vec3_t origin, int team, int score);
|
||||
|
||||
void Team_DroppedFlagThink(gentity_t *ent);
|
||||
void Team_FragBonuses(gentity_t *targ, gentity_t *inflictor, gentity_t *attacker);
|
||||
void Team_CheckHurtCarrier(gentity_t *targ, gentity_t *attacker);
|
||||
void Team_InitGame(void);
|
||||
void Team_ReturnFlag(int team);
|
||||
void Team_FreeEntity(gentity_t *ent);
|
||||
gentity_t *SelectCTFSpawnPoint ( team_t team, int teamstate, vec3_t origin, vec3_t angles );
|
||||
gentity_t *Team_GetLocation(gentity_t *ent);
|
||||
qboolean Team_GetLocationMsg(gentity_t *ent, char *loc, int loclen);
|
||||
void TeamplayInfoMessage( gentity_t *ent );
|
||||
void CheckTeamStatus(void);
|
||||
|
||||
int Pickup_Team( gentity_t *ent, gentity_t *other );
|
||||
|
|
930
code/game/g_trigger.c
Normal file → Executable file
930
code/game/g_trigger.c
Normal file → Executable file
|
@ -1,465 +1,465 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
void InitTrigger( gentity_t *self ) {
|
||||
if (!VectorCompare (self->s.angles, vec3_origin))
|
||||
G_SetMovedir (self->s.angles, self->movedir);
|
||||
|
||||
trap_SetBrushModel( self, self->model );
|
||||
self->r.contents = CONTENTS_TRIGGER; // replaces the -1 from trap_SetBrushModel
|
||||
self->r.svFlags = SVF_NOCLIENT;
|
||||
}
|
||||
|
||||
|
||||
// the wait time has passed, so set back up for another activation
|
||||
void multi_wait( gentity_t *ent ) {
|
||||
ent->nextthink = 0;
|
||||
}
|
||||
|
||||
|
||||
// the trigger was just activated
|
||||
// ent->activator should be set to the activator so it can be held through a delay
|
||||
// so wait for the delay time before firing
|
||||
void multi_trigger( gentity_t *ent, gentity_t *activator ) {
|
||||
ent->activator = activator;
|
||||
if ( ent->nextthink ) {
|
||||
return; // can't retrigger until the wait is over
|
||||
}
|
||||
|
||||
if ( activator->client ) {
|
||||
if ( ( ent->spawnflags & 1 ) &&
|
||||
activator->client->sess.sessionTeam != TEAM_RED ) {
|
||||
return;
|
||||
}
|
||||
if ( ( ent->spawnflags & 2 ) &&
|
||||
activator->client->sess.sessionTeam != TEAM_BLUE ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
G_UseTargets (ent, ent->activator);
|
||||
|
||||
if ( ent->wait > 0 ) {
|
||||
ent->think = multi_wait;
|
||||
ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000;
|
||||
} else {
|
||||
// we can't just remove (self) here, because this is a touch function
|
||||
// called while looping through area links...
|
||||
ent->touch = 0;
|
||||
ent->nextthink = level.time + FRAMETIME;
|
||||
ent->think = G_FreeEntity;
|
||||
}
|
||||
}
|
||||
|
||||
void Use_Multi( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
multi_trigger( ent, activator );
|
||||
}
|
||||
|
||||
void Touch_Multi( gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
if( !other->client ) {
|
||||
return;
|
||||
}
|
||||
multi_trigger( self, other );
|
||||
}
|
||||
|
||||
/*QUAKED trigger_multiple (.5 .5 .5) ?
|
||||
"wait" : Seconds between triggerings, 0.5 default, -1 = one time only.
|
||||
"random" wait variance, default is 0
|
||||
Variable sized repeatable trigger. Must be targeted at one or more entities.
|
||||
so, the basic time between firing is a random time between
|
||||
(wait - random) and (wait + random)
|
||||
*/
|
||||
void SP_trigger_multiple( gentity_t *ent ) {
|
||||
G_SpawnFloat( "wait", "0.5", &ent->wait );
|
||||
G_SpawnFloat( "random", "0", &ent->random );
|
||||
|
||||
if ( ent->random >= ent->wait && ent->wait >= 0 ) {
|
||||
ent->random = ent->wait - FRAMETIME;
|
||||
G_Printf( "trigger_multiple has random >= wait\n" );
|
||||
}
|
||||
|
||||
ent->touch = Touch_Multi;
|
||||
ent->use = Use_Multi;
|
||||
|
||||
InitTrigger( ent );
|
||||
trap_LinkEntity (ent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_always
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
void trigger_always_think( gentity_t *ent ) {
|
||||
G_UseTargets(ent, ent);
|
||||
G_FreeEntity( ent );
|
||||
}
|
||||
|
||||
/*QUAKED trigger_always (.5 .5 .5) (-8 -8 -8) (8 8 8)
|
||||
This trigger will always fire. It is activated by the world.
|
||||
*/
|
||||
void SP_trigger_always (gentity_t *ent) {
|
||||
// we must have some delay to make sure our use targets are present
|
||||
ent->nextthink = level.time + 300;
|
||||
ent->think = trigger_always_think;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_push
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
void trigger_push_touch (gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
|
||||
if ( !other->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
BG_TouchJumpPad( &other->client->ps, &self->s );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
AimAtTarget
|
||||
|
||||
Calculate origin2 so the target apogee will be hit
|
||||
=================
|
||||
*/
|
||||
void AimAtTarget( gentity_t *self ) {
|
||||
gentity_t *ent;
|
||||
vec3_t origin;
|
||||
float height, gravity, time, forward;
|
||||
float dist;
|
||||
|
||||
VectorAdd( self->r.absmin, self->r.absmax, origin );
|
||||
VectorScale ( origin, 0.5, origin );
|
||||
|
||||
ent = G_PickTarget( self->target );
|
||||
if ( !ent ) {
|
||||
G_FreeEntity( self );
|
||||
return;
|
||||
}
|
||||
|
||||
height = ent->s.origin[2] - origin[2];
|
||||
gravity = g_gravity.value;
|
||||
time = sqrt( height / ( .5 * gravity ) );
|
||||
if ( !time ) {
|
||||
G_FreeEntity( self );
|
||||
return;
|
||||
}
|
||||
|
||||
// set s.origin2 to the push velocity
|
||||
VectorSubtract ( ent->s.origin, origin, self->s.origin2 );
|
||||
self->s.origin2[2] = 0;
|
||||
dist = VectorNormalize( self->s.origin2);
|
||||
|
||||
forward = dist / time;
|
||||
VectorScale( self->s.origin2, forward, self->s.origin2 );
|
||||
|
||||
self->s.origin2[2] = time * gravity;
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED trigger_push (.5 .5 .5) ?
|
||||
Must point at a target_position, which will be the apex of the leap.
|
||||
This will be client side predicted, unlike target_push
|
||||
*/
|
||||
void SP_trigger_push( gentity_t *self ) {
|
||||
InitTrigger (self);
|
||||
|
||||
// unlike other triggers, we need to send this one to the client
|
||||
self->r.svFlags &= ~SVF_NOCLIENT;
|
||||
|
||||
// make sure the client precaches this sound
|
||||
G_SoundIndex("sound/world/jumppad.wav");
|
||||
|
||||
self->s.eType = ET_PUSH_TRIGGER;
|
||||
self->touch = trigger_push_touch;
|
||||
self->think = AimAtTarget;
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
trap_LinkEntity (self);
|
||||
}
|
||||
|
||||
|
||||
void Use_target_push( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
if ( !activator->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( activator->client->ps.pm_type != PM_NORMAL ) {
|
||||
return;
|
||||
}
|
||||
if ( activator->client->ps.powerups[PW_FLIGHT] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
VectorCopy (self->s.origin2, activator->client->ps.velocity);
|
||||
|
||||
// play fly sound every 1.5 seconds
|
||||
if ( activator->fly_sound_debounce_time < level.time ) {
|
||||
activator->fly_sound_debounce_time = level.time + 1500;
|
||||
G_Sound( activator, CHAN_AUTO, self->noise_index );
|
||||
}
|
||||
}
|
||||
|
||||
/*QUAKED target_push (.5 .5 .5) (-8 -8 -8) (8 8 8) bouncepad
|
||||
Pushes the activator in the direction.of angle, or towards a target apex.
|
||||
"speed" defaults to 1000
|
||||
if "bouncepad", play bounce noise instead of windfly
|
||||
*/
|
||||
void SP_target_push( gentity_t *self ) {
|
||||
if (!self->speed) {
|
||||
self->speed = 1000;
|
||||
}
|
||||
G_SetMovedir (self->s.angles, self->s.origin2);
|
||||
VectorScale (self->s.origin2, self->speed, self->s.origin2);
|
||||
|
||||
if ( self->spawnflags & 1 ) {
|
||||
self->noise_index = G_SoundIndex("sound/world/jumppad.wav");
|
||||
} else {
|
||||
self->noise_index = G_SoundIndex("sound/misc/windfly.wav");
|
||||
}
|
||||
if ( self->target ) {
|
||||
VectorCopy( self->s.origin, self->r.absmin );
|
||||
VectorCopy( self->s.origin, self->r.absmax );
|
||||
self->think = AimAtTarget;
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
}
|
||||
self->use = Use_target_push;
|
||||
}
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_teleport
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
void trigger_teleporter_touch (gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
gentity_t *dest;
|
||||
|
||||
if ( !other->client ) {
|
||||
return;
|
||||
}
|
||||
if ( other->client->ps.pm_type == PM_DEAD ) {
|
||||
return;
|
||||
}
|
||||
// Spectators only?
|
||||
if ( ( self->spawnflags & 1 ) &&
|
||||
other->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
dest = G_PickTarget( self->target );
|
||||
if (!dest) {
|
||||
G_Printf ("Couldn't find teleporter destination\n");
|
||||
return;
|
||||
}
|
||||
|
||||
TeleportPlayer( other, dest->s.origin, dest->s.angles );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED trigger_teleport (.5 .5 .5) ? SPECTATOR
|
||||
Allows client side prediction of teleportation events.
|
||||
Must point at a target_position, which will be the teleport destination.
|
||||
|
||||
If spectator is set, only spectators can use this teleport
|
||||
Spectator teleporters are not normally placed in the editor, but are created
|
||||
automatically near doors to allow spectators to move through them
|
||||
*/
|
||||
void SP_trigger_teleport( gentity_t *self ) {
|
||||
InitTrigger (self);
|
||||
|
||||
// unlike other triggers, we need to send this one to the client
|
||||
// unless is a spectator trigger
|
||||
if ( self->spawnflags & 1 ) {
|
||||
self->r.svFlags |= SVF_NOCLIENT;
|
||||
} else {
|
||||
self->r.svFlags &= ~SVF_NOCLIENT;
|
||||
}
|
||||
|
||||
// make sure the client precaches this sound
|
||||
G_SoundIndex("sound/world/jumppad.wav");
|
||||
|
||||
self->s.eType = ET_TELEPORT_TRIGGER;
|
||||
self->touch = trigger_teleporter_touch;
|
||||
|
||||
trap_LinkEntity (self);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_hurt
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
/*QUAKED trigger_hurt (.5 .5 .5) ? START_OFF - SILENT NO_PROTECTION SLOW
|
||||
Any entity that touches this will be hurt.
|
||||
It does dmg points of damage each server frame
|
||||
Targeting the trigger will toggle its on / off state.
|
||||
|
||||
SILENT supresses playing the sound
|
||||
SLOW changes the damage rate to once per second
|
||||
NO_PROTECTION *nothing* stops the damage
|
||||
|
||||
"dmg" default 5 (whole numbers only)
|
||||
|
||||
*/
|
||||
void hurt_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
if ( self->r.linked ) {
|
||||
trap_UnlinkEntity( self );
|
||||
} else {
|
||||
trap_LinkEntity( self );
|
||||
}
|
||||
}
|
||||
|
||||
void hurt_touch( gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
int dflags;
|
||||
|
||||
if ( !other->takedamage ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self->timestamp > level.time ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self->spawnflags & 16 ) {
|
||||
self->timestamp = level.time + 1000;
|
||||
} else {
|
||||
self->timestamp = level.time + FRAMETIME;
|
||||
}
|
||||
|
||||
// play sound
|
||||
if ( !(self->spawnflags & 4) ) {
|
||||
G_Sound( other, CHAN_AUTO, self->noise_index );
|
||||
}
|
||||
|
||||
if (self->spawnflags & 8)
|
||||
dflags = DAMAGE_NO_PROTECTION;
|
||||
else
|
||||
dflags = 0;
|
||||
G_Damage (other, self, self, NULL, NULL, self->damage, dflags, MOD_TRIGGER_HURT);
|
||||
}
|
||||
|
||||
void SP_trigger_hurt( gentity_t *self ) {
|
||||
InitTrigger (self);
|
||||
|
||||
self->noise_index = G_SoundIndex( "sound/world/electro.wav" );
|
||||
self->touch = hurt_touch;
|
||||
|
||||
if ( !self->damage ) {
|
||||
self->damage = 5;
|
||||
}
|
||||
|
||||
self->r.contents = CONTENTS_TRIGGER;
|
||||
|
||||
if ( self->spawnflags & 2 ) {
|
||||
self->use = hurt_use;
|
||||
}
|
||||
|
||||
// link in to the world if starting active
|
||||
if ( ! (self->spawnflags & 1) ) {
|
||||
trap_LinkEntity (self);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
timer
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*QUAKED func_timer (0.3 0.1 0.6) (-8 -8 -8) (8 8 8) START_ON
|
||||
This should be renamed trigger_timer...
|
||||
Repeatedly fires its targets.
|
||||
Can be turned on or off by using.
|
||||
|
||||
"wait" base time between triggering all targets, default is 1
|
||||
"random" wait variance, default is 0
|
||||
so, the basic time between firing is a random time between
|
||||
(wait - random) and (wait + random)
|
||||
|
||||
*/
|
||||
void func_timer_think( gentity_t *self ) {
|
||||
G_UseTargets (self, self->activator);
|
||||
// set time before next firing
|
||||
self->nextthink = level.time + 1000 * ( self->wait + crandom() * self->random );
|
||||
}
|
||||
|
||||
void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
self->activator = activator;
|
||||
|
||||
// if on, turn it off
|
||||
if ( self->nextthink ) {
|
||||
self->nextthink = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// turn it on
|
||||
func_timer_think (self);
|
||||
}
|
||||
|
||||
void SP_func_timer( gentity_t *self ) {
|
||||
G_SpawnFloat( "random", "1", &self->random);
|
||||
G_SpawnFloat( "wait", "1", &self->wait );
|
||||
|
||||
self->use = func_timer_use;
|
||||
self->think = func_timer_think;
|
||||
|
||||
if ( self->random >= self->wait ) {
|
||||
self->random = self->wait - FRAMETIME;
|
||||
G_Printf( "func_timer at %s has random >= wait\n", vtos( self->s.origin ) );
|
||||
}
|
||||
|
||||
if ( self->spawnflags & 1 ) {
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
self->activator = self;
|
||||
}
|
||||
|
||||
self->r.svFlags = SVF_NOCLIENT;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
#include "g_local.h"
|
||||
|
||||
|
||||
void InitTrigger( gentity_t *self ) {
|
||||
if (!VectorCompare (self->s.angles, vec3_origin))
|
||||
G_SetMovedir (self->s.angles, self->movedir);
|
||||
|
||||
trap_SetBrushModel( self, self->model );
|
||||
self->r.contents = CONTENTS_TRIGGER; // replaces the -1 from trap_SetBrushModel
|
||||
self->r.svFlags = SVF_NOCLIENT;
|
||||
}
|
||||
|
||||
|
||||
// the wait time has passed, so set back up for another activation
|
||||
void multi_wait( gentity_t *ent ) {
|
||||
ent->nextthink = 0;
|
||||
}
|
||||
|
||||
|
||||
// the trigger was just activated
|
||||
// ent->activator should be set to the activator so it can be held through a delay
|
||||
// so wait for the delay time before firing
|
||||
void multi_trigger( gentity_t *ent, gentity_t *activator ) {
|
||||
ent->activator = activator;
|
||||
if ( ent->nextthink ) {
|
||||
return; // can't retrigger until the wait is over
|
||||
}
|
||||
|
||||
if ( activator->client ) {
|
||||
if ( ( ent->spawnflags & 1 ) &&
|
||||
activator->client->sess.sessionTeam != TEAM_RED ) {
|
||||
return;
|
||||
}
|
||||
if ( ( ent->spawnflags & 2 ) &&
|
||||
activator->client->sess.sessionTeam != TEAM_BLUE ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
G_UseTargets (ent, ent->activator);
|
||||
|
||||
if ( ent->wait > 0 ) {
|
||||
ent->think = multi_wait;
|
||||
ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000;
|
||||
} else {
|
||||
// we can't just remove (self) here, because this is a touch function
|
||||
// called while looping through area links...
|
||||
ent->touch = 0;
|
||||
ent->nextthink = level.time + FRAMETIME;
|
||||
ent->think = G_FreeEntity;
|
||||
}
|
||||
}
|
||||
|
||||
void Use_Multi( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
|
||||
multi_trigger( ent, activator );
|
||||
}
|
||||
|
||||
void Touch_Multi( gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
if( !other->client ) {
|
||||
return;
|
||||
}
|
||||
multi_trigger( self, other );
|
||||
}
|
||||
|
||||
/*QUAKED trigger_multiple (.5 .5 .5) ?
|
||||
"wait" : Seconds between triggerings, 0.5 default, -1 = one time only.
|
||||
"random" wait variance, default is 0
|
||||
Variable sized repeatable trigger. Must be targeted at one or more entities.
|
||||
so, the basic time between firing is a random time between
|
||||
(wait - random) and (wait + random)
|
||||
*/
|
||||
void SP_trigger_multiple( gentity_t *ent ) {
|
||||
G_SpawnFloat( "wait", "0.5", &ent->wait );
|
||||
G_SpawnFloat( "random", "0", &ent->random );
|
||||
|
||||
if ( ent->random >= ent->wait && ent->wait >= 0 ) {
|
||||
ent->random = ent->wait - FRAMETIME;
|
||||
G_Printf( "trigger_multiple has random >= wait\n" );
|
||||
}
|
||||
|
||||
ent->touch = Touch_Multi;
|
||||
ent->use = Use_Multi;
|
||||
|
||||
InitTrigger( ent );
|
||||
trap_LinkEntity (ent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_always
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
void trigger_always_think( gentity_t *ent ) {
|
||||
G_UseTargets(ent, ent);
|
||||
G_FreeEntity( ent );
|
||||
}
|
||||
|
||||
/*QUAKED trigger_always (.5 .5 .5) (-8 -8 -8) (8 8 8)
|
||||
This trigger will always fire. It is activated by the world.
|
||||
*/
|
||||
void SP_trigger_always (gentity_t *ent) {
|
||||
// we must have some delay to make sure our use targets are present
|
||||
ent->nextthink = level.time + 300;
|
||||
ent->think = trigger_always_think;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_push
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
void trigger_push_touch (gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
|
||||
if ( !other->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
BG_TouchJumpPad( &other->client->ps, &self->s );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
AimAtTarget
|
||||
|
||||
Calculate origin2 so the target apogee will be hit
|
||||
=================
|
||||
*/
|
||||
void AimAtTarget( gentity_t *self ) {
|
||||
gentity_t *ent;
|
||||
vec3_t origin;
|
||||
float height, gravity, time, forward;
|
||||
float dist;
|
||||
|
||||
VectorAdd( self->r.absmin, self->r.absmax, origin );
|
||||
VectorScale ( origin, 0.5, origin );
|
||||
|
||||
ent = G_PickTarget( self->target );
|
||||
if ( !ent ) {
|
||||
G_FreeEntity( self );
|
||||
return;
|
||||
}
|
||||
|
||||
height = ent->s.origin[2] - origin[2];
|
||||
gravity = g_gravity.value;
|
||||
time = sqrt( height / ( .5 * gravity ) );
|
||||
if ( !time ) {
|
||||
G_FreeEntity( self );
|
||||
return;
|
||||
}
|
||||
|
||||
// set s.origin2 to the push velocity
|
||||
VectorSubtract ( ent->s.origin, origin, self->s.origin2 );
|
||||
self->s.origin2[2] = 0;
|
||||
dist = VectorNormalize( self->s.origin2);
|
||||
|
||||
forward = dist / time;
|
||||
VectorScale( self->s.origin2, forward, self->s.origin2 );
|
||||
|
||||
self->s.origin2[2] = time * gravity;
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED trigger_push (.5 .5 .5) ?
|
||||
Must point at a target_position, which will be the apex of the leap.
|
||||
This will be client side predicted, unlike target_push
|
||||
*/
|
||||
void SP_trigger_push( gentity_t *self ) {
|
||||
InitTrigger (self);
|
||||
|
||||
// unlike other triggers, we need to send this one to the client
|
||||
self->r.svFlags &= ~SVF_NOCLIENT;
|
||||
|
||||
// make sure the client precaches this sound
|
||||
G_SoundIndex("sound/world/jumppad.wav");
|
||||
|
||||
self->s.eType = ET_PUSH_TRIGGER;
|
||||
self->touch = trigger_push_touch;
|
||||
self->think = AimAtTarget;
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
trap_LinkEntity (self);
|
||||
}
|
||||
|
||||
|
||||
void Use_target_push( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
if ( !activator->client ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( activator->client->ps.pm_type != PM_NORMAL ) {
|
||||
return;
|
||||
}
|
||||
if ( activator->client->ps.powerups[PW_FLIGHT] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
VectorCopy (self->s.origin2, activator->client->ps.velocity);
|
||||
|
||||
// play fly sound every 1.5 seconds
|
||||
if ( activator->fly_sound_debounce_time < level.time ) {
|
||||
activator->fly_sound_debounce_time = level.time + 1500;
|
||||
G_Sound( activator, CHAN_AUTO, self->noise_index );
|
||||
}
|
||||
}
|
||||
|
||||
/*QUAKED target_push (.5 .5 .5) (-8 -8 -8) (8 8 8) bouncepad
|
||||
Pushes the activator in the direction.of angle, or towards a target apex.
|
||||
"speed" defaults to 1000
|
||||
if "bouncepad", play bounce noise instead of windfly
|
||||
*/
|
||||
void SP_target_push( gentity_t *self ) {
|
||||
if (!self->speed) {
|
||||
self->speed = 1000;
|
||||
}
|
||||
G_SetMovedir (self->s.angles, self->s.origin2);
|
||||
VectorScale (self->s.origin2, self->speed, self->s.origin2);
|
||||
|
||||
if ( self->spawnflags & 1 ) {
|
||||
self->noise_index = G_SoundIndex("sound/world/jumppad.wav");
|
||||
} else {
|
||||
self->noise_index = G_SoundIndex("sound/misc/windfly.wav");
|
||||
}
|
||||
if ( self->target ) {
|
||||
VectorCopy( self->s.origin, self->r.absmin );
|
||||
VectorCopy( self->s.origin, self->r.absmax );
|
||||
self->think = AimAtTarget;
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
}
|
||||
self->use = Use_target_push;
|
||||
}
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_teleport
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
void trigger_teleporter_touch (gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
gentity_t *dest;
|
||||
|
||||
if ( !other->client ) {
|
||||
return;
|
||||
}
|
||||
if ( other->client->ps.pm_type == PM_DEAD ) {
|
||||
return;
|
||||
}
|
||||
// Spectators only?
|
||||
if ( ( self->spawnflags & 1 ) &&
|
||||
other->client->sess.sessionTeam != TEAM_SPECTATOR ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
dest = G_PickTarget( self->target );
|
||||
if (!dest) {
|
||||
G_Printf ("Couldn't find teleporter destination\n");
|
||||
return;
|
||||
}
|
||||
|
||||
TeleportPlayer( other, dest->s.origin, dest->s.angles );
|
||||
}
|
||||
|
||||
|
||||
/*QUAKED trigger_teleport (.5 .5 .5) ? SPECTATOR
|
||||
Allows client side prediction of teleportation events.
|
||||
Must point at a target_position, which will be the teleport destination.
|
||||
|
||||
If spectator is set, only spectators can use this teleport
|
||||
Spectator teleporters are not normally placed in the editor, but are created
|
||||
automatically near doors to allow spectators to move through them
|
||||
*/
|
||||
void SP_trigger_teleport( gentity_t *self ) {
|
||||
InitTrigger (self);
|
||||
|
||||
// unlike other triggers, we need to send this one to the client
|
||||
// unless is a spectator trigger
|
||||
if ( self->spawnflags & 1 ) {
|
||||
self->r.svFlags |= SVF_NOCLIENT;
|
||||
} else {
|
||||
self->r.svFlags &= ~SVF_NOCLIENT;
|
||||
}
|
||||
|
||||
// make sure the client precaches this sound
|
||||
G_SoundIndex("sound/world/jumppad.wav");
|
||||
|
||||
self->s.eType = ET_TELEPORT_TRIGGER;
|
||||
self->touch = trigger_teleporter_touch;
|
||||
|
||||
trap_LinkEntity (self);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
trigger_hurt
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
/*QUAKED trigger_hurt (.5 .5 .5) ? START_OFF - SILENT NO_PROTECTION SLOW
|
||||
Any entity that touches this will be hurt.
|
||||
It does dmg points of damage each server frame
|
||||
Targeting the trigger will toggle its on / off state.
|
||||
|
||||
SILENT supresses playing the sound
|
||||
SLOW changes the damage rate to once per second
|
||||
NO_PROTECTION *nothing* stops the damage
|
||||
|
||||
"dmg" default 5 (whole numbers only)
|
||||
|
||||
*/
|
||||
void hurt_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
if ( self->r.linked ) {
|
||||
trap_UnlinkEntity( self );
|
||||
} else {
|
||||
trap_LinkEntity( self );
|
||||
}
|
||||
}
|
||||
|
||||
void hurt_touch( gentity_t *self, gentity_t *other, trace_t *trace ) {
|
||||
int dflags;
|
||||
|
||||
if ( !other->takedamage ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self->timestamp > level.time ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self->spawnflags & 16 ) {
|
||||
self->timestamp = level.time + 1000;
|
||||
} else {
|
||||
self->timestamp = level.time + FRAMETIME;
|
||||
}
|
||||
|
||||
// play sound
|
||||
if ( !(self->spawnflags & 4) ) {
|
||||
G_Sound( other, CHAN_AUTO, self->noise_index );
|
||||
}
|
||||
|
||||
if (self->spawnflags & 8)
|
||||
dflags = DAMAGE_NO_PROTECTION;
|
||||
else
|
||||
dflags = 0;
|
||||
G_Damage (other, self, self, NULL, NULL, self->damage, dflags, MOD_TRIGGER_HURT);
|
||||
}
|
||||
|
||||
void SP_trigger_hurt( gentity_t *self ) {
|
||||
InitTrigger (self);
|
||||
|
||||
self->noise_index = G_SoundIndex( "sound/world/electro.wav" );
|
||||
self->touch = hurt_touch;
|
||||
|
||||
if ( !self->damage ) {
|
||||
self->damage = 5;
|
||||
}
|
||||
|
||||
self->r.contents = CONTENTS_TRIGGER;
|
||||
|
||||
if ( self->spawnflags & 2 ) {
|
||||
self->use = hurt_use;
|
||||
}
|
||||
|
||||
// link in to the world if starting active
|
||||
if ( ! (self->spawnflags & 1) ) {
|
||||
trap_LinkEntity (self);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
timer
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*QUAKED func_timer (0.3 0.1 0.6) (-8 -8 -8) (8 8 8) START_ON
|
||||
This should be renamed trigger_timer...
|
||||
Repeatedly fires its targets.
|
||||
Can be turned on or off by using.
|
||||
|
||||
"wait" base time between triggering all targets, default is 1
|
||||
"random" wait variance, default is 0
|
||||
so, the basic time between firing is a random time between
|
||||
(wait - random) and (wait + random)
|
||||
|
||||
*/
|
||||
void func_timer_think( gentity_t *self ) {
|
||||
G_UseTargets (self, self->activator);
|
||||
// set time before next firing
|
||||
self->nextthink = level.time + 1000 * ( self->wait + crandom() * self->random );
|
||||
}
|
||||
|
||||
void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) {
|
||||
self->activator = activator;
|
||||
|
||||
// if on, turn it off
|
||||
if ( self->nextthink ) {
|
||||
self->nextthink = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// turn it on
|
||||
func_timer_think (self);
|
||||
}
|
||||
|
||||
void SP_func_timer( gentity_t *self ) {
|
||||
G_SpawnFloat( "random", "1", &self->random);
|
||||
G_SpawnFloat( "wait", "1", &self->wait );
|
||||
|
||||
self->use = func_timer_use;
|
||||
self->think = func_timer_think;
|
||||
|
||||
if ( self->random >= self->wait ) {
|
||||
self->random = self->wait - FRAMETIME;
|
||||
G_Printf( "func_timer at %s has random >= wait\n", vtos( self->s.origin ) );
|
||||
}
|
||||
|
||||
if ( self->spawnflags & 1 ) {
|
||||
self->nextthink = level.time + FRAMETIME;
|
||||
self->activator = self;
|
||||
}
|
||||
|
||||
self->r.svFlags = SVF_NOCLIENT;
|
||||
}
|
||||
|
||||
|
||||
|
|
1332
code/game/g_utils.c
Normal file → Executable file
1332
code/game/g_utils.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
2290
code/game/g_weapon.c
Normal file → Executable file
2290
code/game/g_weapon.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
170
code/game/game.bat
Normal file → Executable file
170
code/game/game.bat
Normal file → Executable file
|
@ -1,85 +1,85 @@
|
|||
rem make sure we have a safe environement
|
||||
set LIBRARY=
|
||||
set INCLUDE=
|
||||
|
||||
mkdir vm
|
||||
cd vm
|
||||
set cc=lcc -DQ3_VM -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui %1
|
||||
|
||||
%cc% ../g_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_syscalls.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../bg_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_lib.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_pmove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_slidemove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_math.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_shared.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../ai_dmnet.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_dmq3.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_chat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_cmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_active.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_arenas.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_bot.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_client.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_cmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_combat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_items.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mem.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_missile.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mover.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_session.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_spawn.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_svcmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_target.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_trigger.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_utils.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_weapon.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_vcmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
|
||||
q3asm -f ../game
|
||||
:quit
|
||||
cd ..
|
||||
rem make sure we have a safe environement
|
||||
set LIBRARY=
|
||||
set INCLUDE=
|
||||
|
||||
mkdir vm
|
||||
cd vm
|
||||
set cc=lcc -DQ3_VM -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui %1
|
||||
|
||||
%cc% ../g_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_syscalls.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../bg_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_lib.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_pmove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_slidemove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_math.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_shared.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../ai_dmnet.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_dmq3.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_chat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_cmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_active.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_arenas.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_bot.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_client.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_cmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_combat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_items.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mem.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_missile.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mover.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_session.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_spawn.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_svcmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_target.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_trigger.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_utils.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_weapon.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_vcmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
|
||||
q3asm -f ../game
|
||||
:quit
|
||||
cd ..
|
||||
|
|
6
code/game/game.def
Normal file → Executable file
6
code/game/game.def
Normal file → Executable file
|
@ -1,3 +1,3 @@
|
|||
EXPORTS
|
||||
dllEntry
|
||||
vmMain
|
||||
EXPORTS
|
||||
dllEntry
|
||||
vmMain
|
||||
|
|
70
code/game/game.q3asm
Normal file → Executable file
70
code/game/game.q3asm
Normal file → Executable file
|
@ -1,35 +1,35 @@
|
|||
-o "\quake3\baseq3\vm\qagame"
|
||||
g_main
|
||||
..\g_syscalls
|
||||
bg_misc
|
||||
bg_lib
|
||||
bg_pmove
|
||||
bg_slidemove
|
||||
q_math
|
||||
q_shared
|
||||
ai_dmnet
|
||||
ai_dmq3
|
||||
ai_team
|
||||
ai_main
|
||||
ai_chat
|
||||
ai_cmd
|
||||
ai_vcmd
|
||||
g_active
|
||||
g_arenas
|
||||
g_bot
|
||||
g_client
|
||||
g_cmds
|
||||
g_combat
|
||||
g_items
|
||||
g_mem
|
||||
g_misc
|
||||
g_missile
|
||||
g_mover
|
||||
g_session
|
||||
g_spawn
|
||||
g_svcmds
|
||||
g_target
|
||||
g_team
|
||||
g_trigger
|
||||
g_utils
|
||||
g_weapon
|
||||
-o "\quake3\baseq3\vm\qagame"
|
||||
g_main
|
||||
..\g_syscalls
|
||||
bg_misc
|
||||
bg_lib
|
||||
bg_pmove
|
||||
bg_slidemove
|
||||
q_math
|
||||
q_shared
|
||||
ai_dmnet
|
||||
ai_dmq3
|
||||
ai_team
|
||||
ai_main
|
||||
ai_chat
|
||||
ai_cmd
|
||||
ai_vcmd
|
||||
g_active
|
||||
g_arenas
|
||||
g_bot
|
||||
g_client
|
||||
g_cmds
|
||||
g_combat
|
||||
g_items
|
||||
g_mem
|
||||
g_misc
|
||||
g_missile
|
||||
g_mover
|
||||
g_session
|
||||
g_spawn
|
||||
g_svcmds
|
||||
g_target
|
||||
g_team
|
||||
g_trigger
|
||||
g_utils
|
||||
g_weapon
|
||||
|
|
96
code/game/game.sh
Normal file → Executable file
96
code/game/game.sh
Normal file → Executable file
|
@ -1,48 +1,48 @@
|
|||
#!/bin/sh
|
||||
|
||||
mkdir -p vm
|
||||
cd vm
|
||||
|
||||
CC="q3lcc -DQ3_VM -S -Wf-target=bytecode -Wf-g -I../../cgame -I../../game -I../../q3_ui"
|
||||
|
||||
$CC ../g_main.c
|
||||
$CC ../g_syscalls.c
|
||||
|
||||
$CC ../bg_misc.c
|
||||
$CC ../bg_lib.c
|
||||
$CC ../bg_pmove.c
|
||||
$CC ../bg_slidemove.c
|
||||
$CC ../q_math.c
|
||||
$CC ../q_shared.c
|
||||
|
||||
$CC ../ai_vcmd.c
|
||||
$CC ../ai_dmnet.c
|
||||
$CC ../ai_dmq3.c
|
||||
$CC ../ai_main.c
|
||||
$CC ../ai_chat.c
|
||||
$CC ../ai_cmd.c
|
||||
$CC ../ai_team.c
|
||||
|
||||
$CC ../g_active.c
|
||||
$CC ../g_arenas.c
|
||||
$CC ../g_bot.c
|
||||
$CC ../g_client.c
|
||||
$CC ../g_cmds.c
|
||||
$CC ../g_combat.c
|
||||
$CC ../g_items.c
|
||||
$CC ../g_mem.c
|
||||
$CC ../g_misc.c
|
||||
$CC ../g_missile.c
|
||||
$CC ../g_mover.c
|
||||
$CC ../g_session.c
|
||||
$CC ../g_spawn.c
|
||||
$CC ../g_svcmds.c
|
||||
$CC ../g_target.c
|
||||
$CC ../g_team.c
|
||||
$CC ../g_trigger.c
|
||||
$CC ../g_utils.c
|
||||
$CC ../g_weapon.c
|
||||
|
||||
q3asm -f ../game
|
||||
|
||||
cd ..
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p vm
|
||||
cd vm
|
||||
|
||||
CC="q3lcc -DQ3_VM -S -Wf-target=bytecode -Wf-g -I../../cgame -I../../game -I../../q3_ui"
|
||||
|
||||
$CC ../g_main.c
|
||||
$CC ../g_syscalls.c
|
||||
|
||||
$CC ../bg_misc.c
|
||||
$CC ../bg_lib.c
|
||||
$CC ../bg_pmove.c
|
||||
$CC ../bg_slidemove.c
|
||||
$CC ../q_math.c
|
||||
$CC ../q_shared.c
|
||||
|
||||
$CC ../ai_vcmd.c
|
||||
$CC ../ai_dmnet.c
|
||||
$CC ../ai_dmq3.c
|
||||
$CC ../ai_main.c
|
||||
$CC ../ai_chat.c
|
||||
$CC ../ai_cmd.c
|
||||
$CC ../ai_team.c
|
||||
|
||||
$CC ../g_active.c
|
||||
$CC ../g_arenas.c
|
||||
$CC ../g_bot.c
|
||||
$CC ../g_client.c
|
||||
$CC ../g_cmds.c
|
||||
$CC ../g_combat.c
|
||||
$CC ../g_items.c
|
||||
$CC ../g_mem.c
|
||||
$CC ../g_misc.c
|
||||
$CC ../g_missile.c
|
||||
$CC ../g_mover.c
|
||||
$CC ../g_session.c
|
||||
$CC ../g_spawn.c
|
||||
$CC ../g_svcmds.c
|
||||
$CC ../g_target.c
|
||||
$CC ../g_team.c
|
||||
$CC ../g_trigger.c
|
||||
$CC ../g_utils.c
|
||||
$CC ../g_weapon.c
|
||||
|
||||
q3asm -f ../game
|
||||
|
||||
cd ..
|
||||
|
|
4264
code/game/game.vcproj
Normal file → Executable file
4264
code/game/game.vcproj
Normal file → Executable file
File diff suppressed because it is too large
Load diff
172
code/game/game_ta.bat
Normal file → Executable file
172
code/game/game_ta.bat
Normal file → Executable file
|
@ -1,86 +1,86 @@
|
|||
rem make sure we have a safe environement
|
||||
set LIBRARY=
|
||||
set INCLUDE=
|
||||
|
||||
mkdir vm
|
||||
cd vm
|
||||
set cc=lcc -DQ3_VM -DMISSIONPACK -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui %1
|
||||
|
||||
%cc% ../g_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_syscalls.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../bg_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_lib.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_pmove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_slidemove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_math.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_shared.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../ai_dmnet.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_dmq3.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_chat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_cmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_active.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_arenas.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_bot.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_client.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_cmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_combat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_items.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mem.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_missile.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mover.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_session.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_spawn.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_svcmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_target.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_trigger.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_utils.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_weapon.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_vcmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
|
||||
|
||||
q3asm -f ../game_ta
|
||||
:quit
|
||||
cd ..
|
||||
rem make sure we have a safe environement
|
||||
set LIBRARY=
|
||||
set INCLUDE=
|
||||
|
||||
mkdir vm
|
||||
cd vm
|
||||
set cc=lcc -DQ3_VM -DMISSIONPACK -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui %1
|
||||
|
||||
%cc% ../g_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_syscalls.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../bg_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_lib.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_pmove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../bg_slidemove.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_math.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../q_shared.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../ai_dmnet.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_dmq3.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_main.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_chat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_cmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
%cc% ../g_active.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_arenas.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_bot.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_client.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_cmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_combat.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_items.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mem.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_misc.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_missile.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_mover.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_session.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_spawn.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_svcmds.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_target.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_team.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_trigger.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_utils.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../g_weapon.c
|
||||
@if errorlevel 1 goto quit
|
||||
%cc% ../ai_vcmd.c
|
||||
@if errorlevel 1 goto quit
|
||||
|
||||
|
||||
|
||||
q3asm -f ../game_ta
|
||||
:quit
|
||||
cd ..
|
||||
|
|
70
code/game/game_ta.q3asm
Normal file → Executable file
70
code/game/game_ta.q3asm
Normal file → Executable file
|
@ -1,35 +1,35 @@
|
|||
-o "\quake3\missionpack\vm\qagame"
|
||||
g_main
|
||||
..\g_syscalls
|
||||
bg_misc
|
||||
bg_lib
|
||||
bg_pmove
|
||||
bg_slidemove
|
||||
q_math
|
||||
q_shared
|
||||
ai_dmnet
|
||||
ai_dmq3
|
||||
ai_team
|
||||
ai_main
|
||||
ai_chat
|
||||
ai_cmd
|
||||
g_active
|
||||
g_arenas
|
||||
g_bot
|
||||
g_client
|
||||
g_cmds
|
||||
g_combat
|
||||
g_items
|
||||
g_mem
|
||||
g_misc
|
||||
g_missile
|
||||
g_mover
|
||||
g_session
|
||||
g_spawn
|
||||
g_svcmds
|
||||
g_target
|
||||
g_team
|
||||
g_trigger
|
||||
g_utils
|
||||
g_weapon
|
||||
ai_vcmd
|
||||
-o "\quake3\missionpack\vm\qagame"
|
||||
g_main
|
||||
..\g_syscalls
|
||||
bg_misc
|
||||
bg_lib
|
||||
bg_pmove
|
||||
bg_slidemove
|
||||
q_math
|
||||
q_shared
|
||||
ai_dmnet
|
||||
ai_dmq3
|
||||
ai_team
|
||||
ai_main
|
||||
ai_chat
|
||||
ai_cmd
|
||||
g_active
|
||||
g_arenas
|
||||
g_bot
|
||||
g_client
|
||||
g_cmds
|
||||
g_combat
|
||||
g_items
|
||||
g_mem
|
||||
g_misc
|
||||
g_missile
|
||||
g_mover
|
||||
g_session
|
||||
g_spawn
|
||||
g_svcmds
|
||||
g_target
|
||||
g_team
|
||||
g_trigger
|
||||
g_utils
|
||||
g_weapon
|
||||
ai_vcmd
|
||||
|
|
96
code/game/game_ta.sh
Normal file → Executable file
96
code/game/game_ta.sh
Normal file → Executable file
|
@ -1,48 +1,48 @@
|
|||
#!/bin/sh
|
||||
|
||||
mkdir -p vm
|
||||
cd vm
|
||||
|
||||
CC="q3lcc -DQ3_VM -DMISSIONPACK -S -Wf-target=bytecode -Wf-g -I../../cgame -I../../game -I../../ui"
|
||||
|
||||
$CC ../g_main.c
|
||||
$CC ../g_syscalls.c
|
||||
|
||||
$CC ../bg_misc.c
|
||||
$CC ../bg_lib.c
|
||||
$CC ../bg_pmove.c
|
||||
$CC ../bg_slidemove.c
|
||||
$CC ../q_math.c
|
||||
$CC ../q_shared.c
|
||||
|
||||
$CC ../ai_vcmd.c
|
||||
$CC ../ai_dmnet.c
|
||||
$CC ../ai_dmq3.c
|
||||
$CC ../ai_main.c
|
||||
$CC ../ai_chat.c
|
||||
$CC ../ai_cmd.c
|
||||
$CC ../ai_team.c
|
||||
|
||||
$CC ../g_active.c
|
||||
$CC ../g_arenas.c
|
||||
$CC ../g_bot.c
|
||||
$CC ../g_client.c
|
||||
$CC ../g_cmds.c
|
||||
$CC ../g_combat.c
|
||||
$CC ../g_items.c
|
||||
$CC ../g_mem.c
|
||||
$CC ../g_misc.c
|
||||
$CC ../g_missile.c
|
||||
$CC ../g_mover.c
|
||||
$CC ../g_session.c
|
||||
$CC ../g_spawn.c
|
||||
$CC ../g_svcmds.c
|
||||
$CC ../g_target.c
|
||||
$CC ../g_team.c
|
||||
$CC ../g_trigger.c
|
||||
$CC ../g_utils.c
|
||||
$CC ../g_weapon.c
|
||||
|
||||
q3asm -f ../game_ta
|
||||
|
||||
cd ..
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p vm
|
||||
cd vm
|
||||
|
||||
CC="q3lcc -DQ3_VM -DMISSIONPACK -S -Wf-target=bytecode -Wf-g -I../../cgame -I../../game -I../../ui"
|
||||
|
||||
$CC ../g_main.c
|
||||
$CC ../g_syscalls.c
|
||||
|
||||
$CC ../bg_misc.c
|
||||
$CC ../bg_lib.c
|
||||
$CC ../bg_pmove.c
|
||||
$CC ../bg_slidemove.c
|
||||
$CC ../q_math.c
|
||||
$CC ../q_shared.c
|
||||
|
||||
$CC ../ai_vcmd.c
|
||||
$CC ../ai_dmnet.c
|
||||
$CC ../ai_dmq3.c
|
||||
$CC ../ai_main.c
|
||||
$CC ../ai_chat.c
|
||||
$CC ../ai_cmd.c
|
||||
$CC ../ai_team.c
|
||||
|
||||
$CC ../g_active.c
|
||||
$CC ../g_arenas.c
|
||||
$CC ../g_bot.c
|
||||
$CC ../g_client.c
|
||||
$CC ../g_cmds.c
|
||||
$CC ../g_combat.c
|
||||
$CC ../g_items.c
|
||||
$CC ../g_mem.c
|
||||
$CC ../g_misc.c
|
||||
$CC ../g_missile.c
|
||||
$CC ../g_mover.c
|
||||
$CC ../g_session.c
|
||||
$CC ../g_spawn.c
|
||||
$CC ../g_svcmds.c
|
||||
$CC ../g_target.c
|
||||
$CC ../g_team.c
|
||||
$CC ../g_trigger.c
|
||||
$CC ../g_utils.c
|
||||
$CC ../g_weapon.c
|
||||
|
||||
q3asm -f ../game_ta
|
||||
|
||||
cd ..
|
||||
|
|
332
code/game/inv.h
Normal file → Executable file
332
code/game/inv.h
Normal file → Executable file
|
@ -1,166 +1,166 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#define INVENTORY_NONE 0
|
||||
//armor
|
||||
#define INVENTORY_ARMOR 1
|
||||
//weapons
|
||||
#define INVENTORY_GAUNTLET 4
|
||||
#define INVENTORY_SHOTGUN 5
|
||||
#define INVENTORY_MACHINEGUN 6
|
||||
#define INVENTORY_GRENADELAUNCHER 7
|
||||
#define INVENTORY_ROCKETLAUNCHER 8
|
||||
#define INVENTORY_LIGHTNING 9
|
||||
#define INVENTORY_RAILGUN 10
|
||||
#define INVENTORY_PLASMAGUN 11
|
||||
#define INVENTORY_BFG10K 13
|
||||
#define INVENTORY_GRAPPLINGHOOK 14
|
||||
#define INVENTORY_NAILGUN 15
|
||||
#define INVENTORY_PROXLAUNCHER 16
|
||||
#define INVENTORY_CHAINGUN 17
|
||||
//ammo
|
||||
#define INVENTORY_SHELLS 18
|
||||
#define INVENTORY_BULLETS 19
|
||||
#define INVENTORY_GRENADES 20
|
||||
#define INVENTORY_CELLS 21
|
||||
#define INVENTORY_LIGHTNINGAMMO 22
|
||||
#define INVENTORY_ROCKETS 23
|
||||
#define INVENTORY_SLUGS 24
|
||||
#define INVENTORY_BFGAMMO 25
|
||||
#define INVENTORY_NAILS 26
|
||||
#define INVENTORY_MINES 27
|
||||
#define INVENTORY_BELT 28
|
||||
//powerups
|
||||
#define INVENTORY_HEALTH 29
|
||||
#define INVENTORY_TELEPORTER 30
|
||||
#define INVENTORY_MEDKIT 31
|
||||
#define INVENTORY_KAMIKAZE 32
|
||||
#define INVENTORY_PORTAL 33
|
||||
#define INVENTORY_INVULNERABILITY 34
|
||||
#define INVENTORY_QUAD 35
|
||||
#define INVENTORY_ENVIRONMENTSUIT 36
|
||||
#define INVENTORY_HASTE 37
|
||||
#define INVENTORY_INVISIBILITY 38
|
||||
#define INVENTORY_REGEN 39
|
||||
#define INVENTORY_FLIGHT 40
|
||||
#define INVENTORY_SCOUT 41
|
||||
#define INVENTORY_GUARD 42
|
||||
#define INVENTORY_DOUBLER 43
|
||||
#define INVENTORY_AMMOREGEN 44
|
||||
|
||||
#define INVENTORY_REDFLAG 45
|
||||
#define INVENTORY_BLUEFLAG 46
|
||||
#define INVENTORY_NEUTRALFLAG 47
|
||||
#define INVENTORY_REDCUBE 48
|
||||
#define INVENTORY_BLUECUBE 49
|
||||
//enemy stuff
|
||||
#define ENEMY_HORIZONTAL_DIST 200
|
||||
#define ENEMY_HEIGHT 201
|
||||
#define NUM_VISIBLE_ENEMIES 202
|
||||
#define NUM_VISIBLE_TEAMMATES 203
|
||||
|
||||
// if running the mission pack
|
||||
#ifdef MISSIONPACK
|
||||
|
||||
//#error "running mission pack"
|
||||
|
||||
#endif
|
||||
|
||||
//item numbers (make sure they are in sync with bg_itemlist in bg_misc.c)
|
||||
#define MODELINDEX_ARMORSHARD 1
|
||||
#define MODELINDEX_ARMORCOMBAT 2
|
||||
#define MODELINDEX_ARMORBODY 3
|
||||
#define MODELINDEX_HEALTHSMALL 4
|
||||
#define MODELINDEX_HEALTH 5
|
||||
#define MODELINDEX_HEALTHLARGE 6
|
||||
#define MODELINDEX_HEALTHMEGA 7
|
||||
|
||||
#define MODELINDEX_GAUNTLET 8
|
||||
#define MODELINDEX_SHOTGUN 9
|
||||
#define MODELINDEX_MACHINEGUN 10
|
||||
#define MODELINDEX_GRENADELAUNCHER 11
|
||||
#define MODELINDEX_ROCKETLAUNCHER 12
|
||||
#define MODELINDEX_LIGHTNING 13
|
||||
#define MODELINDEX_RAILGUN 14
|
||||
#define MODELINDEX_PLASMAGUN 15
|
||||
#define MODELINDEX_BFG10K 16
|
||||
#define MODELINDEX_GRAPPLINGHOOK 17
|
||||
|
||||
#define MODELINDEX_SHELLS 18
|
||||
#define MODELINDEX_BULLETS 19
|
||||
#define MODELINDEX_GRENADES 20
|
||||
#define MODELINDEX_CELLS 21
|
||||
#define MODELINDEX_LIGHTNINGAMMO 22
|
||||
#define MODELINDEX_ROCKETS 23
|
||||
#define MODELINDEX_SLUGS 24
|
||||
#define MODELINDEX_BFGAMMO 25
|
||||
|
||||
#define MODELINDEX_TELEPORTER 26
|
||||
#define MODELINDEX_MEDKIT 27
|
||||
#define MODELINDEX_QUAD 28
|
||||
#define MODELINDEX_ENVIRONMENTSUIT 29
|
||||
#define MODELINDEX_HASTE 30
|
||||
#define MODELINDEX_INVISIBILITY 31
|
||||
#define MODELINDEX_REGEN 32
|
||||
#define MODELINDEX_FLIGHT 33
|
||||
|
||||
#define MODELINDEX_REDFLAG 34
|
||||
#define MODELINDEX_BLUEFLAG 35
|
||||
|
||||
// mission pack only defines
|
||||
|
||||
#define MODELINDEX_KAMIKAZE 36
|
||||
#define MODELINDEX_PORTAL 37
|
||||
#define MODELINDEX_INVULNERABILITY 38
|
||||
|
||||
#define MODELINDEX_NAILS 39
|
||||
#define MODELINDEX_MINES 40
|
||||
#define MODELINDEX_BELT 41
|
||||
|
||||
#define MODELINDEX_SCOUT 42
|
||||
#define MODELINDEX_GUARD 43
|
||||
#define MODELINDEX_DOUBLER 44
|
||||
#define MODELINDEX_AMMOREGEN 45
|
||||
|
||||
#define MODELINDEX_NEUTRALFLAG 46
|
||||
#define MODELINDEX_REDCUBE 47
|
||||
#define MODELINDEX_BLUECUBE 48
|
||||
|
||||
#define MODELINDEX_NAILGUN 49
|
||||
#define MODELINDEX_PROXLAUNCHER 50
|
||||
#define MODELINDEX_CHAINGUN 51
|
||||
|
||||
|
||||
//
|
||||
#define WEAPONINDEX_GAUNTLET 1
|
||||
#define WEAPONINDEX_MACHINEGUN 2
|
||||
#define WEAPONINDEX_SHOTGUN 3
|
||||
#define WEAPONINDEX_GRENADE_LAUNCHER 4
|
||||
#define WEAPONINDEX_ROCKET_LAUNCHER 5
|
||||
#define WEAPONINDEX_LIGHTNING 6
|
||||
#define WEAPONINDEX_RAILGUN 7
|
||||
#define WEAPONINDEX_PLASMAGUN 8
|
||||
#define WEAPONINDEX_BFG 9
|
||||
#define WEAPONINDEX_GRAPPLING_HOOK 10
|
||||
#define WEAPONINDEX_NAILGUN 11
|
||||
#define WEAPONINDEX_PROXLAUNCHER 12
|
||||
#define WEAPONINDEX_CHAINGUN 13
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#define INVENTORY_NONE 0
|
||||
//armor
|
||||
#define INVENTORY_ARMOR 1
|
||||
//weapons
|
||||
#define INVENTORY_GAUNTLET 4
|
||||
#define INVENTORY_SHOTGUN 5
|
||||
#define INVENTORY_MACHINEGUN 6
|
||||
#define INVENTORY_GRENADELAUNCHER 7
|
||||
#define INVENTORY_ROCKETLAUNCHER 8
|
||||
#define INVENTORY_LIGHTNING 9
|
||||
#define INVENTORY_RAILGUN 10
|
||||
#define INVENTORY_PLASMAGUN 11
|
||||
#define INVENTORY_BFG10K 13
|
||||
#define INVENTORY_GRAPPLINGHOOK 14
|
||||
#define INVENTORY_NAILGUN 15
|
||||
#define INVENTORY_PROXLAUNCHER 16
|
||||
#define INVENTORY_CHAINGUN 17
|
||||
//ammo
|
||||
#define INVENTORY_SHELLS 18
|
||||
#define INVENTORY_BULLETS 19
|
||||
#define INVENTORY_GRENADES 20
|
||||
#define INVENTORY_CELLS 21
|
||||
#define INVENTORY_LIGHTNINGAMMO 22
|
||||
#define INVENTORY_ROCKETS 23
|
||||
#define INVENTORY_SLUGS 24
|
||||
#define INVENTORY_BFGAMMO 25
|
||||
#define INVENTORY_NAILS 26
|
||||
#define INVENTORY_MINES 27
|
||||
#define INVENTORY_BELT 28
|
||||
//powerups
|
||||
#define INVENTORY_HEALTH 29
|
||||
#define INVENTORY_TELEPORTER 30
|
||||
#define INVENTORY_MEDKIT 31
|
||||
#define INVENTORY_KAMIKAZE 32
|
||||
#define INVENTORY_PORTAL 33
|
||||
#define INVENTORY_INVULNERABILITY 34
|
||||
#define INVENTORY_QUAD 35
|
||||
#define INVENTORY_ENVIRONMENTSUIT 36
|
||||
#define INVENTORY_HASTE 37
|
||||
#define INVENTORY_INVISIBILITY 38
|
||||
#define INVENTORY_REGEN 39
|
||||
#define INVENTORY_FLIGHT 40
|
||||
#define INVENTORY_SCOUT 41
|
||||
#define INVENTORY_GUARD 42
|
||||
#define INVENTORY_DOUBLER 43
|
||||
#define INVENTORY_AMMOREGEN 44
|
||||
|
||||
#define INVENTORY_REDFLAG 45
|
||||
#define INVENTORY_BLUEFLAG 46
|
||||
#define INVENTORY_NEUTRALFLAG 47
|
||||
#define INVENTORY_REDCUBE 48
|
||||
#define INVENTORY_BLUECUBE 49
|
||||
//enemy stuff
|
||||
#define ENEMY_HORIZONTAL_DIST 200
|
||||
#define ENEMY_HEIGHT 201
|
||||
#define NUM_VISIBLE_ENEMIES 202
|
||||
#define NUM_VISIBLE_TEAMMATES 203
|
||||
|
||||
// if running the mission pack
|
||||
#ifdef MISSIONPACK
|
||||
|
||||
//#error "running mission pack"
|
||||
|
||||
#endif
|
||||
|
||||
//item numbers (make sure they are in sync with bg_itemlist in bg_misc.c)
|
||||
#define MODELINDEX_ARMORSHARD 1
|
||||
#define MODELINDEX_ARMORCOMBAT 2
|
||||
#define MODELINDEX_ARMORBODY 3
|
||||
#define MODELINDEX_HEALTHSMALL 4
|
||||
#define MODELINDEX_HEALTH 5
|
||||
#define MODELINDEX_HEALTHLARGE 6
|
||||
#define MODELINDEX_HEALTHMEGA 7
|
||||
|
||||
#define MODELINDEX_GAUNTLET 8
|
||||
#define MODELINDEX_SHOTGUN 9
|
||||
#define MODELINDEX_MACHINEGUN 10
|
||||
#define MODELINDEX_GRENADELAUNCHER 11
|
||||
#define MODELINDEX_ROCKETLAUNCHER 12
|
||||
#define MODELINDEX_LIGHTNING 13
|
||||
#define MODELINDEX_RAILGUN 14
|
||||
#define MODELINDEX_PLASMAGUN 15
|
||||
#define MODELINDEX_BFG10K 16
|
||||
#define MODELINDEX_GRAPPLINGHOOK 17
|
||||
|
||||
#define MODELINDEX_SHELLS 18
|
||||
#define MODELINDEX_BULLETS 19
|
||||
#define MODELINDEX_GRENADES 20
|
||||
#define MODELINDEX_CELLS 21
|
||||
#define MODELINDEX_LIGHTNINGAMMO 22
|
||||
#define MODELINDEX_ROCKETS 23
|
||||
#define MODELINDEX_SLUGS 24
|
||||
#define MODELINDEX_BFGAMMO 25
|
||||
|
||||
#define MODELINDEX_TELEPORTER 26
|
||||
#define MODELINDEX_MEDKIT 27
|
||||
#define MODELINDEX_QUAD 28
|
||||
#define MODELINDEX_ENVIRONMENTSUIT 29
|
||||
#define MODELINDEX_HASTE 30
|
||||
#define MODELINDEX_INVISIBILITY 31
|
||||
#define MODELINDEX_REGEN 32
|
||||
#define MODELINDEX_FLIGHT 33
|
||||
|
||||
#define MODELINDEX_REDFLAG 34
|
||||
#define MODELINDEX_BLUEFLAG 35
|
||||
|
||||
// mission pack only defines
|
||||
|
||||
#define MODELINDEX_KAMIKAZE 36
|
||||
#define MODELINDEX_PORTAL 37
|
||||
#define MODELINDEX_INVULNERABILITY 38
|
||||
|
||||
#define MODELINDEX_NAILS 39
|
||||
#define MODELINDEX_MINES 40
|
||||
#define MODELINDEX_BELT 41
|
||||
|
||||
#define MODELINDEX_SCOUT 42
|
||||
#define MODELINDEX_GUARD 43
|
||||
#define MODELINDEX_DOUBLER 44
|
||||
#define MODELINDEX_AMMOREGEN 45
|
||||
|
||||
#define MODELINDEX_NEUTRALFLAG 46
|
||||
#define MODELINDEX_REDCUBE 47
|
||||
#define MODELINDEX_BLUECUBE 48
|
||||
|
||||
#define MODELINDEX_NAILGUN 49
|
||||
#define MODELINDEX_PROXLAUNCHER 50
|
||||
#define MODELINDEX_CHAINGUN 51
|
||||
|
||||
|
||||
//
|
||||
#define WEAPONINDEX_GAUNTLET 1
|
||||
#define WEAPONINDEX_MACHINEGUN 2
|
||||
#define WEAPONINDEX_SHOTGUN 3
|
||||
#define WEAPONINDEX_GRENADE_LAUNCHER 4
|
||||
#define WEAPONINDEX_ROCKET_LAUNCHER 5
|
||||
#define WEAPONINDEX_LIGHTNING 6
|
||||
#define WEAPONINDEX_RAILGUN 7
|
||||
#define WEAPONINDEX_PLASMAGUN 8
|
||||
#define WEAPONINDEX_BFG 9
|
||||
#define WEAPONINDEX_GRAPPLING_HOOK 10
|
||||
#define WEAPONINDEX_NAILGUN 11
|
||||
#define WEAPONINDEX_PROXLAUNCHER 12
|
||||
#define WEAPONINDEX_CHAINGUN 13
|
||||
|
|
268
code/game/match.h
Normal file → Executable file
268
code/game/match.h
Normal file → Executable file
|
@ -1,134 +1,134 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// make sure this is the same character as we use in chats in g_cmd.c
|
||||
#define EC "\x19"
|
||||
|
||||
//match template contexts
|
||||
#define MTCONTEXT_MISC 2
|
||||
#define MTCONTEXT_INITIALTEAMCHAT 4
|
||||
#define MTCONTEXT_TIME 8
|
||||
#define MTCONTEXT_TEAMMATE 16
|
||||
#define MTCONTEXT_ADDRESSEE 32
|
||||
#define MTCONTEXT_PATROLKEYAREA 64
|
||||
#define MTCONTEXT_REPLYCHAT 128
|
||||
#define MTCONTEXT_CTF 256
|
||||
|
||||
//message types
|
||||
#define MSG_NEWLEADER 1 //new leader
|
||||
#define MSG_ENTERGAME 2 //enter game message
|
||||
#define MSG_HELP 3 //help someone
|
||||
#define MSG_ACCOMPANY 4 //accompany someone
|
||||
#define MSG_DEFENDKEYAREA 5 //defend a key area
|
||||
#define MSG_RUSHBASE 6 //everyone rush to base
|
||||
#define MSG_GETFLAG 7 //get the enemy flag
|
||||
#define MSG_STARTTEAMLEADERSHIP 8 //someone wants to become the team leader
|
||||
#define MSG_STOPTEAMLEADERSHIP 9 //someone wants to stop being the team leader
|
||||
#define MSG_WHOISTEAMLAEDER 10 //who is the team leader
|
||||
#define MSG_WAIT 11 //wait for someone
|
||||
#define MSG_WHATAREYOUDOING 12 //what are you doing?
|
||||
#define MSG_JOINSUBTEAM 13 //join a sub-team
|
||||
#define MSG_LEAVESUBTEAM 14 //leave a sub-team
|
||||
#define MSG_CREATENEWFORMATION 15 //create a new formation
|
||||
#define MSG_FORMATIONPOSITION 16 //tell someone his/her position in a formation
|
||||
#define MSG_FORMATIONSPACE 17 //set the formation intervening space
|
||||
#define MSG_DOFORMATION 18 //form a known formation
|
||||
#define MSG_DISMISS 19 //dismiss commanded team mates
|
||||
#define MSG_CAMP 20 //camp somewhere
|
||||
#define MSG_CHECKPOINT 21 //remember a check point
|
||||
#define MSG_PATROL 22 //patrol between certain keypoints
|
||||
#define MSG_LEADTHEWAY 23 //lead the way
|
||||
#define MSG_GETITEM 24 //get an item
|
||||
#define MSG_KILL 25 //kill someone
|
||||
#define MSG_WHEREAREYOU 26 //where is someone
|
||||
#define MSG_RETURNFLAG 27 //return the flag
|
||||
#define MSG_WHATISMYCOMMAND 28 //ask the team leader what to do
|
||||
#define MSG_WHICHTEAM 29 //ask which team a bot is in
|
||||
#define MSG_TASKPREFERENCE 30 //tell your teamplay task preference
|
||||
#define MSG_ATTACKENEMYBASE 31 //attack the enemy base
|
||||
#define MSG_HARVEST 32 //go harvest
|
||||
#define MSG_SUICIDE 33 //order to suicide
|
||||
//
|
||||
#define MSG_ME 100
|
||||
#define MSG_EVERYONE 101
|
||||
#define MSG_MULTIPLENAMES 102
|
||||
#define MSG_NAME 103
|
||||
#define MSG_PATROLKEYAREA 104
|
||||
#define MSG_MINUTES 105
|
||||
#define MSG_SECONDS 106
|
||||
#define MSG_FOREVER 107
|
||||
#define MSG_FORALONGTIME 108
|
||||
#define MSG_FORAWHILE 109
|
||||
//
|
||||
#define MSG_CHATALL 200
|
||||
#define MSG_CHATTEAM 201
|
||||
#define MSG_CHATTELL 202
|
||||
//
|
||||
#define MSG_CTF 300 //ctf message
|
||||
|
||||
//command sub types
|
||||
#define ST_SOMEWHERE 0
|
||||
#define ST_NEARITEM 1
|
||||
#define ST_ADDRESSED 2
|
||||
#define ST_METER 4
|
||||
#define ST_FEET 8
|
||||
#define ST_TIME 16
|
||||
#define ST_HERE 32
|
||||
#define ST_THERE 64
|
||||
#define ST_I 128
|
||||
#define ST_MORE 256
|
||||
#define ST_BACK 512
|
||||
#define ST_REVERSE 1024
|
||||
#define ST_SOMEONE 2048
|
||||
#define ST_GOTFLAG 4096
|
||||
#define ST_CAPTUREDFLAG 8192
|
||||
#define ST_RETURNEDFLAG 16384
|
||||
#define ST_TEAM 32768
|
||||
#define ST_1FCTFGOTFLAG 65535
|
||||
//ctf task preferences
|
||||
#define ST_DEFENDER 1
|
||||
#define ST_ATTACKER 2
|
||||
#define ST_ROAMER 4
|
||||
|
||||
|
||||
//word replacement variables
|
||||
#define THE_ENEMY 7
|
||||
#define THE_TEAM 7
|
||||
//team message variables
|
||||
#define NETNAME 0
|
||||
#define PLACE 1
|
||||
#define FLAG 1
|
||||
#define MESSAGE 2
|
||||
#define ADDRESSEE 2
|
||||
#define ITEM 3
|
||||
#define TEAMMATE 4
|
||||
#define TEAMNAME 4
|
||||
#define ENEMY 4
|
||||
#define KEYAREA 5
|
||||
#define FORMATION 5
|
||||
#define POSITION 5
|
||||
#define NUMBER 5
|
||||
#define TIME 6
|
||||
#define NAME 6
|
||||
#define MORE 6
|
||||
|
||||
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// make sure this is the same character as we use in chats in g_cmd.c
|
||||
#define EC "\x19"
|
||||
|
||||
//match template contexts
|
||||
#define MTCONTEXT_MISC 2
|
||||
#define MTCONTEXT_INITIALTEAMCHAT 4
|
||||
#define MTCONTEXT_TIME 8
|
||||
#define MTCONTEXT_TEAMMATE 16
|
||||
#define MTCONTEXT_ADDRESSEE 32
|
||||
#define MTCONTEXT_PATROLKEYAREA 64
|
||||
#define MTCONTEXT_REPLYCHAT 128
|
||||
#define MTCONTEXT_CTF 256
|
||||
|
||||
//message types
|
||||
#define MSG_NEWLEADER 1 //new leader
|
||||
#define MSG_ENTERGAME 2 //enter game message
|
||||
#define MSG_HELP 3 //help someone
|
||||
#define MSG_ACCOMPANY 4 //accompany someone
|
||||
#define MSG_DEFENDKEYAREA 5 //defend a key area
|
||||
#define MSG_RUSHBASE 6 //everyone rush to base
|
||||
#define MSG_GETFLAG 7 //get the enemy flag
|
||||
#define MSG_STARTTEAMLEADERSHIP 8 //someone wants to become the team leader
|
||||
#define MSG_STOPTEAMLEADERSHIP 9 //someone wants to stop being the team leader
|
||||
#define MSG_WHOISTEAMLAEDER 10 //who is the team leader
|
||||
#define MSG_WAIT 11 //wait for someone
|
||||
#define MSG_WHATAREYOUDOING 12 //what are you doing?
|
||||
#define MSG_JOINSUBTEAM 13 //join a sub-team
|
||||
#define MSG_LEAVESUBTEAM 14 //leave a sub-team
|
||||
#define MSG_CREATENEWFORMATION 15 //create a new formation
|
||||
#define MSG_FORMATIONPOSITION 16 //tell someone his/her position in a formation
|
||||
#define MSG_FORMATIONSPACE 17 //set the formation intervening space
|
||||
#define MSG_DOFORMATION 18 //form a known formation
|
||||
#define MSG_DISMISS 19 //dismiss commanded team mates
|
||||
#define MSG_CAMP 20 //camp somewhere
|
||||
#define MSG_CHECKPOINT 21 //remember a check point
|
||||
#define MSG_PATROL 22 //patrol between certain keypoints
|
||||
#define MSG_LEADTHEWAY 23 //lead the way
|
||||
#define MSG_GETITEM 24 //get an item
|
||||
#define MSG_KILL 25 //kill someone
|
||||
#define MSG_WHEREAREYOU 26 //where is someone
|
||||
#define MSG_RETURNFLAG 27 //return the flag
|
||||
#define MSG_WHATISMYCOMMAND 28 //ask the team leader what to do
|
||||
#define MSG_WHICHTEAM 29 //ask which team a bot is in
|
||||
#define MSG_TASKPREFERENCE 30 //tell your teamplay task preference
|
||||
#define MSG_ATTACKENEMYBASE 31 //attack the enemy base
|
||||
#define MSG_HARVEST 32 //go harvest
|
||||
#define MSG_SUICIDE 33 //order to suicide
|
||||
//
|
||||
#define MSG_ME 100
|
||||
#define MSG_EVERYONE 101
|
||||
#define MSG_MULTIPLENAMES 102
|
||||
#define MSG_NAME 103
|
||||
#define MSG_PATROLKEYAREA 104
|
||||
#define MSG_MINUTES 105
|
||||
#define MSG_SECONDS 106
|
||||
#define MSG_FOREVER 107
|
||||
#define MSG_FORALONGTIME 108
|
||||
#define MSG_FORAWHILE 109
|
||||
//
|
||||
#define MSG_CHATALL 200
|
||||
#define MSG_CHATTEAM 201
|
||||
#define MSG_CHATTELL 202
|
||||
//
|
||||
#define MSG_CTF 300 //ctf message
|
||||
|
||||
//command sub types
|
||||
#define ST_SOMEWHERE 0
|
||||
#define ST_NEARITEM 1
|
||||
#define ST_ADDRESSED 2
|
||||
#define ST_METER 4
|
||||
#define ST_FEET 8
|
||||
#define ST_TIME 16
|
||||
#define ST_HERE 32
|
||||
#define ST_THERE 64
|
||||
#define ST_I 128
|
||||
#define ST_MORE 256
|
||||
#define ST_BACK 512
|
||||
#define ST_REVERSE 1024
|
||||
#define ST_SOMEONE 2048
|
||||
#define ST_GOTFLAG 4096
|
||||
#define ST_CAPTUREDFLAG 8192
|
||||
#define ST_RETURNEDFLAG 16384
|
||||
#define ST_TEAM 32768
|
||||
#define ST_1FCTFGOTFLAG 65535
|
||||
//ctf task preferences
|
||||
#define ST_DEFENDER 1
|
||||
#define ST_ATTACKER 2
|
||||
#define ST_ROAMER 4
|
||||
|
||||
|
||||
//word replacement variables
|
||||
#define THE_ENEMY 7
|
||||
#define THE_TEAM 7
|
||||
//team message variables
|
||||
#define NETNAME 0
|
||||
#define PLACE 1
|
||||
#define FLAG 1
|
||||
#define MESSAGE 2
|
||||
#define ADDRESSEE 2
|
||||
#define ITEM 3
|
||||
#define TEAMMATE 4
|
||||
#define TEAMNAME 4
|
||||
#define ENEMY 4
|
||||
#define KEYAREA 5
|
||||
#define FORMATION 5
|
||||
#define POSITION 5
|
||||
#define NUMBER 5
|
||||
#define TIME 6
|
||||
#define NAME 6
|
||||
#define MORE 6
|
||||
|
||||
|
||||
|
|
2616
code/game/q_math.c
Normal file → Executable file
2616
code/game/q_math.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
2516
code/game/q_shared.c
Normal file → Executable file
2516
code/game/q_shared.c
Normal file → Executable file
File diff suppressed because it is too large
Load diff
2864
code/game/q_shared.h
Normal file → Executable file
2864
code/game/q_shared.h
Normal file → Executable file
File diff suppressed because it is too large
Load diff
160
code/game/surfaceflags.h
Normal file → Executable file
160
code/game/surfaceflags.h
Normal file → Executable file
|
@ -1,80 +1,80 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// This file must be identical in the quake and utils directories
|
||||
|
||||
// contents flags are seperate bits
|
||||
// a given brush can contribute multiple content bits
|
||||
|
||||
// these definitions also need to be in q_shared.h!
|
||||
|
||||
#define CONTENTS_SOLID 1 // an eye is never valid in a solid
|
||||
#define CONTENTS_LAVA 8
|
||||
#define CONTENTS_SLIME 16
|
||||
#define CONTENTS_WATER 32
|
||||
#define CONTENTS_FOG 64
|
||||
|
||||
#define CONTENTS_NOTTEAM1 0x0080
|
||||
#define CONTENTS_NOTTEAM2 0x0100
|
||||
#define CONTENTS_NOBOTCLIP 0x0200
|
||||
|
||||
#define CONTENTS_AREAPORTAL 0x8000
|
||||
|
||||
#define CONTENTS_PLAYERCLIP 0x10000
|
||||
#define CONTENTS_MONSTERCLIP 0x20000
|
||||
//bot specific contents types
|
||||
#define CONTENTS_TELEPORTER 0x40000
|
||||
#define CONTENTS_JUMPPAD 0x80000
|
||||
#define CONTENTS_CLUSTERPORTAL 0x100000
|
||||
#define CONTENTS_DONOTENTER 0x200000
|
||||
#define CONTENTS_BOTCLIP 0x400000
|
||||
#define CONTENTS_MOVER 0x800000
|
||||
|
||||
#define CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity
|
||||
|
||||
#define CONTENTS_BODY 0x2000000 // should never be on a brush, only in game
|
||||
#define CONTENTS_CORPSE 0x4000000
|
||||
#define CONTENTS_DETAIL 0x8000000 // brushes not used for the bsp
|
||||
#define CONTENTS_STRUCTURAL 0x10000000 // brushes used for the bsp
|
||||
#define CONTENTS_TRANSLUCENT 0x20000000 // don't consume surface fragments inside
|
||||
#define CONTENTS_TRIGGER 0x40000000
|
||||
#define CONTENTS_NODROP 0x80000000 // don't leave bodies or items (death fog, lava)
|
||||
|
||||
#define SURF_NODAMAGE 0x1 // never give falling damage
|
||||
#define SURF_SLICK 0x2 // effects game physics
|
||||
#define SURF_SKY 0x4 // lighting from environment map
|
||||
#define SURF_LADDER 0x8
|
||||
#define SURF_NOIMPACT 0x10 // don't make missile explosions
|
||||
#define SURF_NOMARKS 0x20 // don't leave missile marks
|
||||
#define SURF_FLESH 0x40 // make flesh sounds and effects
|
||||
#define SURF_NODRAW 0x80 // don't generate a drawsurface at all
|
||||
#define SURF_HINT 0x100 // make a primary bsp splitter
|
||||
#define SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes
|
||||
#define SURF_NOLIGHTMAP 0x400 // surface doesn't need a lightmap
|
||||
#define SURF_POINTLIGHT 0x800 // generate lighting info at vertexes
|
||||
#define SURF_METALSTEPS 0x1000 // clanking footsteps
|
||||
#define SURF_NOSTEPS 0x2000 // no footstep sounds
|
||||
#define SURF_NONSOLID 0x4000 // don't collide against curves with this set
|
||||
#define SURF_LIGHTFILTER 0x8000 // act as a light filter during q3map -light
|
||||
#define SURF_ALPHASHADOW 0x10000 // do per-pixel light shadow casting in q3map
|
||||
#define SURF_NODLIGHT 0x20000 // don't dlight even if solid (solid lava, skies)
|
||||
#define SURF_DUST 0x40000 // leave a dust trail when walking on this surface
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
//
|
||||
// This file must be identical in the quake and utils directories
|
||||
|
||||
// contents flags are seperate bits
|
||||
// a given brush can contribute multiple content bits
|
||||
|
||||
// these definitions also need to be in q_shared.h!
|
||||
|
||||
#define CONTENTS_SOLID 1 // an eye is never valid in a solid
|
||||
#define CONTENTS_LAVA 8
|
||||
#define CONTENTS_SLIME 16
|
||||
#define CONTENTS_WATER 32
|
||||
#define CONTENTS_FOG 64
|
||||
|
||||
#define CONTENTS_NOTTEAM1 0x0080
|
||||
#define CONTENTS_NOTTEAM2 0x0100
|
||||
#define CONTENTS_NOBOTCLIP 0x0200
|
||||
|
||||
#define CONTENTS_AREAPORTAL 0x8000
|
||||
|
||||
#define CONTENTS_PLAYERCLIP 0x10000
|
||||
#define CONTENTS_MONSTERCLIP 0x20000
|
||||
//bot specific contents types
|
||||
#define CONTENTS_TELEPORTER 0x40000
|
||||
#define CONTENTS_JUMPPAD 0x80000
|
||||
#define CONTENTS_CLUSTERPORTAL 0x100000
|
||||
#define CONTENTS_DONOTENTER 0x200000
|
||||
#define CONTENTS_BOTCLIP 0x400000
|
||||
#define CONTENTS_MOVER 0x800000
|
||||
|
||||
#define CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity
|
||||
|
||||
#define CONTENTS_BODY 0x2000000 // should never be on a brush, only in game
|
||||
#define CONTENTS_CORPSE 0x4000000
|
||||
#define CONTENTS_DETAIL 0x8000000 // brushes not used for the bsp
|
||||
#define CONTENTS_STRUCTURAL 0x10000000 // brushes used for the bsp
|
||||
#define CONTENTS_TRANSLUCENT 0x20000000 // don't consume surface fragments inside
|
||||
#define CONTENTS_TRIGGER 0x40000000
|
||||
#define CONTENTS_NODROP 0x80000000 // don't leave bodies or items (death fog, lava)
|
||||
|
||||
#define SURF_NODAMAGE 0x1 // never give falling damage
|
||||
#define SURF_SLICK 0x2 // effects game physics
|
||||
#define SURF_SKY 0x4 // lighting from environment map
|
||||
#define SURF_LADDER 0x8
|
||||
#define SURF_NOIMPACT 0x10 // don't make missile explosions
|
||||
#define SURF_NOMARKS 0x20 // don't leave missile marks
|
||||
#define SURF_FLESH 0x40 // make flesh sounds and effects
|
||||
#define SURF_NODRAW 0x80 // don't generate a drawsurface at all
|
||||
#define SURF_HINT 0x100 // make a primary bsp splitter
|
||||
#define SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes
|
||||
#define SURF_NOLIGHTMAP 0x400 // surface doesn't need a lightmap
|
||||
#define SURF_POINTLIGHT 0x800 // generate lighting info at vertexes
|
||||
#define SURF_METALSTEPS 0x1000 // clanking footsteps
|
||||
#define SURF_NOSTEPS 0x2000 // no footstep sounds
|
||||
#define SURF_NONSOLID 0x4000 // don't collide against curves with this set
|
||||
#define SURF_LIGHTFILTER 0x8000 // act as a light filter during q3map -light
|
||||
#define SURF_ALPHASHADOW 0x10000 // do per-pixel light shadow casting in q3map
|
||||
#define SURF_NODLIGHT 0x20000 // don't dlight even if solid (solid lava, skies)
|
||||
#define SURF_DUST 0x40000 // leave a dust trail when walking on this surface
|
||||
|
|
68
code/game/syn.h
Normal file → Executable file
68
code/game/syn.h
Normal file → Executable file
|
@ -1,34 +1,34 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#define CONTEXT_ALL 0xFFFFFFFF
|
||||
#define CONTEXT_NORMAL 1
|
||||
#define CONTEXT_NEARBYITEM 2
|
||||
#define CONTEXT_CTFREDTEAM 4
|
||||
#define CONTEXT_CTFBLUETEAM 8
|
||||
#define CONTEXT_REPLY 16
|
||||
#define CONTEXT_OBELISKREDTEAM 32
|
||||
#define CONTEXT_OBELISKBLUETEAM 64
|
||||
#define CONTEXT_HARVESTERREDTEAM 128
|
||||
#define CONTEXT_HARVESTERBLUETEAM 256
|
||||
|
||||
#define CONTEXT_NAMES 1024
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1999-2005 Id Software, Inc.
|
||||
|
||||
This file is part of Quake III Arena source code.
|
||||
|
||||
Quake III Arena source code 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.
|
||||
|
||||
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#define CONTEXT_ALL 0xFFFFFFFF
|
||||
#define CONTEXT_NORMAL 1
|
||||
#define CONTEXT_NEARBYITEM 2
|
||||
#define CONTEXT_CTFREDTEAM 4
|
||||
#define CONTEXT_CTFBLUETEAM 8
|
||||
#define CONTEXT_REPLY 16
|
||||
#define CONTEXT_OBELISKREDTEAM 32
|
||||
#define CONTEXT_OBELISKBLUETEAM 64
|
||||
#define CONTEXT_HARVESTERREDTEAM 128
|
||||
#define CONTEXT_HARVESTERBLUETEAM 256
|
||||
|
||||
#define CONTEXT_NAMES 1024
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue