Jedi Outcast Patch v1.03

This commit is contained in:
James Monroe 2013-04-04 16:05:53 -05:00
parent fdf355590f
commit 6af9b594e1
353 changed files with 34219 additions and 7343 deletions

BIN
CODE-mp/ALut.lib Normal file

Binary file not shown.

BIN
CODE-mp/EaxMan.dll Normal file

Binary file not shown.

BIN
CODE-mp/OpenAL32.dll Normal file

Binary file not shown.

BIN
CODE-mp/OpenAL32.lib Normal file

Binary file not shown.

View file

@ -38,11 +38,11 @@ RSC=rc.exe
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Intermediate_Dir "Release/Dedicated"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEDICATED" /D "BOTLIB" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEDICATED" /D "BOTLIB" /FR /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
@ -50,7 +50,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib Winmm.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib Winmm.lib /nologo /subsystem:console /machine:I386 /out:"Release/jk2Ded.exe"
!ELSEIF "$(CFG)" == "WinDed - Win32 Debug"
@ -62,11 +62,11 @@ LINK32=link.exe
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Intermediate_Dir "Debug/dedicated"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEDICATED" /D "_JK2" /D "BOTLIB" /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEDICATED" /D "_JK2" /D "BOTLIB" /FR /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
@ -75,7 +75,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib Winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib Winmm.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/jk2Ded.exe" /pdbtype:sept
!ENDIF
@ -136,10 +136,6 @@ SOURCE=.\qcommon\cmd.cpp
# End Source File
# Begin Source File
SOURCE=.\qcommon\CNetProfile.cpp
# End Source File
# Begin Source File
SOURCE=.\qcommon\common.cpp
# End Source File
# Begin Source File
@ -160,30 +156,10 @@ SOURCE=.\qcommon\game_version.h
# End Source File
# Begin Source File
SOURCE=.\qcommon\GenericParser2.cpp
# End Source File
# Begin Source File
SOURCE=.\qcommon\GenericParser2.h
# End Source File
# Begin Source File
SOURCE=.\qcommon\hstring.cpp
# End Source File
# Begin Source File
SOURCE=.\qcommon\hstring.h
# End Source File
# Begin Source File
SOURCE=.\qcommon\huffman.cpp
# End Source File
# Begin Source File
SOURCE=.\qcommon\INetProfile.h
# End Source File
# Begin Source File
SOURCE=.\qcommon\md4.cpp
# End Source File
# Begin Source File
@ -756,14 +732,6 @@ SOURCE=.\png\png.h
# End Source File
# Begin Source File
SOURCE=.\game\q_math.c
# End Source File
# Begin Source File
SOURCE=.\game\q_shared.c
# End Source File
# Begin Source File
SOURCE=.\game\q_shared.h
# End Source File
# Begin Source File

View file

@ -6,114 +6,353 @@
--------------------Configuration: WinDed - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSPB2B.tmp" with contents
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP12B4.tmp" with contents
[
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEDICATED" /D "_JK2" /D "BOTLIB" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEDICATED" /D "_JK2" /D "BOTLIB" /FR"Debug/dedicated/" /Fo"Debug/dedicated/" /Fd"Debug/dedicated/" /FD /GZ /c
"C:\projects\jk2\CODE-mp\qcommon\cm_load.cpp"
"C:\projects\jk2\CODE-mp\qcommon\cm_patch.cpp"
"C:\projects\jk2\CODE-mp\qcommon\cm_polylib.cpp"
"C:\projects\jk2\CODE-mp\qcommon\cm_test.cpp"
"C:\projects\jk2\CODE-mp\qcommon\cm_trace.cpp"
"C:\projects\jk2\CODE-mp\qcommon\cmd.cpp"
"C:\projects\jk2\CODE-mp\qcommon\common.cpp"
"C:\projects\jk2\CODE-mp\qcommon\cvar.cpp"
"C:\projects\jk2\CODE-mp\qcommon\files.cpp"
"C:\projects\jk2\CODE-mp\qcommon\huffman.cpp"
"C:\projects\jk2\CODE-mp\qcommon\msg.cpp"
"C:\projects\jk2\CODE-mp\qcommon\net_chan.cpp"
"C:\projects\jk2\CODE-mp\qcommon\q_math.cpp"
"C:\projects\jk2\CODE-mp\qcommon\q_shared.cpp"
"C:\projects\jk2\CODE-mp\qcommon\RoffSystem.cpp"
"C:\projects\jk2\CODE-mp\qcommon\strip.cpp"
"C:\projects\jk2\CODE-mp\qcommon\unzip.cpp"
"C:\projects\jk2\CODE-mp\qcommon\vm.cpp"
"C:\projects\jk2\CODE-mp\qcommon\vm_interpreted.cpp"
"C:\projects\jk2\CODE-mp\qcommon\vm_x86.cpp"
"C:\projects\jk2\CODE-mp\ghoul2\G2_API.cpp"
"C:\projects\jk2\CODE-mp\ghoul2\G2_bolts.cpp"
"C:\projects\jk2\CODE-mp\ghoul2\G2_bones.cpp"
"C:\projects\jk2\CODE-mp\ghoul2\G2_misc.cpp"
"C:\projects\jk2\CODE-mp\ghoul2\G2_surfaces.cpp"
"C:\projects\jk2\CODE-mp\server\sv_bot.cpp"
"C:\projects\jk2\CODE-mp\server\sv_ccmds.cpp"
"C:\projects\jk2\CODE-mp\server\sv_client.cpp"
"C:\projects\jk2\CODE-mp\server\sv_game.cpp"
"C:\projects\jk2\CODE-mp\server\sv_init.cpp"
"C:\projects\jk2\CODE-mp\server\sv_main.cpp"
"C:\projects\jk2\CODE-mp\server\sv_net_chan.cpp"
"C:\projects\jk2\CODE-mp\server\sv_snapshot.cpp"
"C:\projects\jk2\CODE-mp\server\sv_world.cpp"
"C:\projects\jk2\CODE-mp\null\null_client.cpp"
"C:\projects\jk2\CODE-mp\null\null_glimp.cpp"
"C:\projects\jk2\CODE-mp\null\null_renderer.cpp"
"C:\projects\jk2\CODE-mp\null\null_input.cpp"
"C:\projects\jk2\CODE-mp\null\null_snddma.cpp"
"C:\projects\jk2\CODE-mp\null\win_main.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_backend.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_ghoul2.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_image.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_init.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_main.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_mesh.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_model.cpp"
"C:\projects\jk2\CODE-mp\renderer\tr_shader.cpp"
"C:\projects\jk2\CODE-mp\win32\win_net.cpp"
"C:\projects\jk2\CODE-mp\win32\win_shared.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_bspq3.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_cluster.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_debug.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_entity.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_file.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_main.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_move.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_optimize.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_reach.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_route.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_routealt.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_aas_sample.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_char.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_chat.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_gen.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_goal.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_move.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_weap.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ai_weight.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_ea.cpp"
"C:\projects\jk2\CODE-mp\botlib\be_interface.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_crc.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_libvar.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_log.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_memory.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_precomp.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_script.cpp"
"C:\projects\jk2\CODE-mp\botlib\l_struct.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSPB2B.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSPB2C.tmp" with contents
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP12B4.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP12B5.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib Winmm.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/WinDed.pdb" /debug /machine:I386 /out:"Debug/WinDed.exe" /pdbtype:sept
".\Debug\cm_load.obj"
".\Debug\cm_patch.obj"
".\Debug\cm_polylib.obj"
".\Debug\cm_test.obj"
".\Debug\cm_trace.obj"
".\Debug\cmd.obj"
".\Debug\CNetProfile.obj"
".\Debug\common.obj"
".\Debug\cvar.obj"
".\Debug\files.obj"
".\Debug\GenericParser2.obj"
".\Debug\hstring.obj"
".\Debug\huffman.obj"
".\Debug\md4.obj"
".\Debug\msg.obj"
".\Debug\net_chan.obj"
".\Debug\q_math.obj"
".\Debug\q_shared.obj"
".\Debug\RoffSystem.obj"
".\Debug\strip.obj"
".\Debug\unzip.obj"
".\Debug\vm.obj"
".\Debug\vm_interpreted.obj"
".\Debug\vm_x86.obj"
".\Debug\G2_API.obj"
".\Debug\G2_bolts.obj"
".\Debug\G2_bones.obj"
".\Debug\G2_misc.obj"
".\Debug\G2_surfaces.obj"
".\Debug\sv_bot.obj"
".\Debug\sv_ccmds.obj"
".\Debug\sv_client.obj"
".\Debug\sv_game.obj"
".\Debug\sv_init.obj"
".\Debug\sv_main.obj"
".\Debug\sv_net_chan.obj"
".\Debug\sv_snapshot.obj"
".\Debug\sv_world.obj"
".\Debug\null_client.obj"
".\Debug\null_glimp.obj"
".\Debug\null_input.obj"
".\Debug\null_renderer.obj"
".\Debug\null_snddma.obj"
".\Debug\win_main.obj"
".\Debug\matcomp.obj"
".\Debug\tr_backend.obj"
".\Debug\tr_ghoul2.obj"
".\Debug\tr_image.obj"
".\Debug\tr_init.obj"
".\Debug\tr_main.obj"
".\Debug\tr_mesh.obj"
".\Debug\tr_model.obj"
".\Debug\tr_shader.obj"
".\Debug\win_net.obj"
".\Debug\win_shared.obj"
".\Debug\be_aas_bspq3.obj"
".\Debug\be_aas_cluster.obj"
".\Debug\be_aas_debug.obj"
".\Debug\be_aas_entity.obj"
".\Debug\be_aas_file.obj"
".\Debug\be_aas_main.obj"
".\Debug\be_aas_move.obj"
".\Debug\be_aas_optimize.obj"
".\Debug\be_aas_reach.obj"
".\Debug\be_aas_route.obj"
".\Debug\be_aas_routealt.obj"
".\Debug\be_aas_sample.obj"
".\Debug\be_ai_char.obj"
".\Debug\be_ai_chat.obj"
".\Debug\be_ai_gen.obj"
".\Debug\be_ai_goal.obj"
".\Debug\be_ai_move.obj"
".\Debug\be_ai_weap.obj"
".\Debug\be_ai_weight.obj"
".\Debug\be_ea.obj"
".\Debug\be_interface.obj"
".\Debug\l_crc.obj"
".\Debug\l_libvar.obj"
".\Debug\l_log.obj"
".\Debug\l_memory.obj"
".\Debug\l_precomp.obj"
".\Debug\l_script.obj"
".\Debug\l_struct.obj"
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib Winmm.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/jk2Ded.pdb" /debug /machine:I386 /out:"Debug/jk2Ded.exe" /pdbtype:sept
".\Debug\dedicated\cm_load.obj"
".\Debug\dedicated\cm_patch.obj"
".\Debug\dedicated\cm_polylib.obj"
".\Debug\dedicated\cm_test.obj"
".\Debug\dedicated\cm_trace.obj"
".\Debug\dedicated\cmd.obj"
".\Debug\dedicated\common.obj"
".\Debug\dedicated\cvar.obj"
".\Debug\dedicated\files.obj"
".\Debug\dedicated\huffman.obj"
".\Debug\dedicated\md4.obj"
".\Debug\dedicated\msg.obj"
".\Debug\dedicated\net_chan.obj"
".\Debug\dedicated\q_math.obj"
".\Debug\dedicated\q_shared.obj"
".\Debug\dedicated\RoffSystem.obj"
".\Debug\dedicated\strip.obj"
".\Debug\dedicated\unzip.obj"
".\Debug\dedicated\vm.obj"
".\Debug\dedicated\vm_interpreted.obj"
".\Debug\dedicated\vm_x86.obj"
".\Debug\dedicated\G2_API.obj"
".\Debug\dedicated\G2_bolts.obj"
".\Debug\dedicated\G2_bones.obj"
".\Debug\dedicated\G2_misc.obj"
".\Debug\dedicated\G2_surfaces.obj"
".\Debug\dedicated\sv_bot.obj"
".\Debug\dedicated\sv_ccmds.obj"
".\Debug\dedicated\sv_client.obj"
".\Debug\dedicated\sv_game.obj"
".\Debug\dedicated\sv_init.obj"
".\Debug\dedicated\sv_main.obj"
".\Debug\dedicated\sv_net_chan.obj"
".\Debug\dedicated\sv_snapshot.obj"
".\Debug\dedicated\sv_world.obj"
".\Debug\dedicated\null_client.obj"
".\Debug\dedicated\null_glimp.obj"
".\Debug\dedicated\null_input.obj"
".\Debug\dedicated\null_renderer.obj"
".\Debug\dedicated\null_snddma.obj"
".\Debug\dedicated\win_main.obj"
".\Debug\dedicated\matcomp.obj"
".\Debug\dedicated\tr_backend.obj"
".\Debug\dedicated\tr_ghoul2.obj"
".\Debug\dedicated\tr_image.obj"
".\Debug\dedicated\tr_init.obj"
".\Debug\dedicated\tr_main.obj"
".\Debug\dedicated\tr_mesh.obj"
".\Debug\dedicated\tr_model.obj"
".\Debug\dedicated\tr_shader.obj"
".\Debug\dedicated\win_net.obj"
".\Debug\dedicated\win_shared.obj"
".\Debug\dedicated\be_aas_bspq3.obj"
".\Debug\dedicated\be_aas_cluster.obj"
".\Debug\dedicated\be_aas_debug.obj"
".\Debug\dedicated\be_aas_entity.obj"
".\Debug\dedicated\be_aas_file.obj"
".\Debug\dedicated\be_aas_main.obj"
".\Debug\dedicated\be_aas_move.obj"
".\Debug\dedicated\be_aas_optimize.obj"
".\Debug\dedicated\be_aas_reach.obj"
".\Debug\dedicated\be_aas_route.obj"
".\Debug\dedicated\be_aas_routealt.obj"
".\Debug\dedicated\be_aas_sample.obj"
".\Debug\dedicated\be_ai_char.obj"
".\Debug\dedicated\be_ai_chat.obj"
".\Debug\dedicated\be_ai_gen.obj"
".\Debug\dedicated\be_ai_goal.obj"
".\Debug\dedicated\be_ai_move.obj"
".\Debug\dedicated\be_ai_weap.obj"
".\Debug\dedicated\be_ai_weight.obj"
".\Debug\dedicated\be_ea.obj"
".\Debug\dedicated\be_interface.obj"
".\Debug\dedicated\l_crc.obj"
".\Debug\dedicated\l_libvar.obj"
".\Debug\dedicated\l_log.obj"
".\Debug\dedicated\l_memory.obj"
".\Debug\dedicated\l_precomp.obj"
".\Debug\dedicated\l_script.obj"
".\Debug\dedicated\l_struct.obj"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSPB2C.tmp"
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP12B5.tmp"
<h3>Output Window</h3>
Compiling...
G2_API.cpp
Generating Code...
Compiling...
cm_load.cpp
cm_patch.cpp
cm_polylib.cpp
cm_test.cpp
cm_trace.cpp
cmd.cpp
common.cpp
cvar.cpp
files.cpp
huffman.cpp
msg.cpp
net_chan.cpp
q_math.cpp
q_shared.cpp
RoffSystem.cpp
strip.cpp
unzip.cpp
vm.cpp
vm_interpreted.cpp
vm_x86.cpp
Generating Code...
Compiling...
G2_bolts.cpp
G2_bones.cpp
G2_misc.cpp
G2_surfaces.cpp
sv_bot.cpp
sv_ccmds.cpp
sv_client.cpp
sv_game.cpp
sv_init.cpp
sv_main.cpp
sv_net_chan.cpp
sv_snapshot.cpp
sv_world.cpp
null_client.cpp
null_glimp.cpp
null_renderer.cpp
null_input.cpp
null_snddma.cpp
win_main.cpp
tr_backend.cpp
tr_ghoul2.cpp
Generating Code...
Compiling...
tr_image.cpp
tr_init.cpp
tr_main.cpp
tr_mesh.cpp
tr_model.cpp
tr_shader.cpp
win_net.cpp
win_shared.cpp
be_aas_bspq3.cpp
be_aas_cluster.cpp
be_aas_debug.cpp
be_aas_entity.cpp
be_aas_file.cpp
be_aas_main.cpp
be_aas_move.cpp
be_aas_optimize.cpp
be_aas_reach.cpp
be_aas_route.cpp
be_aas_routealt.cpp
be_aas_sample.cpp
Generating Code...
Compiling...
be_ai_char.cpp
be_ai_chat.cpp
be_ai_gen.cpp
be_ai_goal.cpp
be_ai_move.cpp
be_ai_weap.cpp
be_ai_weight.cpp
be_ea.cpp
be_interface.cpp
l_crc.cpp
l_libvar.cpp
l_log.cpp
l_memory.cpp
l_precomp.cpp
l_script.cpp
l_struct.cpp
Generating Code...
Linking...
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP12B8.tmp" with contents
[
/nologo /o"Debug/WinDed.bsc"
".\Debug\dedicated\cm_load.sbr"
".\Debug\dedicated\cm_patch.sbr"
".\Debug\dedicated\cm_polylib.sbr"
".\Debug\dedicated\cm_test.sbr"
".\Debug\dedicated\cm_trace.sbr"
".\Debug\dedicated\cmd.sbr"
".\Debug\dedicated\common.sbr"
".\Debug\dedicated\cvar.sbr"
".\Debug\dedicated\files.sbr"
".\Debug\dedicated\huffman.sbr"
".\Debug\dedicated\md4.sbr"
".\Debug\dedicated\msg.sbr"
".\Debug\dedicated\net_chan.sbr"
".\Debug\dedicated\q_math.sbr"
".\Debug\dedicated\q_shared.sbr"
".\Debug\dedicated\RoffSystem.sbr"
".\Debug\dedicated\strip.sbr"
".\Debug\dedicated\unzip.sbr"
".\Debug\dedicated\vm.sbr"
".\Debug\dedicated\vm_interpreted.sbr"
".\Debug\dedicated\vm_x86.sbr"
".\Debug\dedicated\G2_API.sbr"
".\Debug\dedicated\G2_bolts.sbr"
".\Debug\dedicated\G2_bones.sbr"
".\Debug\dedicated\G2_misc.sbr"
".\Debug\dedicated\G2_surfaces.sbr"
".\Debug\dedicated\sv_bot.sbr"
".\Debug\dedicated\sv_ccmds.sbr"
".\Debug\dedicated\sv_client.sbr"
".\Debug\dedicated\sv_game.sbr"
".\Debug\dedicated\sv_init.sbr"
".\Debug\dedicated\sv_main.sbr"
".\Debug\dedicated\sv_net_chan.sbr"
".\Debug\dedicated\sv_snapshot.sbr"
".\Debug\dedicated\sv_world.sbr"
".\Debug\dedicated\null_client.sbr"
".\Debug\dedicated\null_glimp.sbr"
".\Debug\dedicated\null_input.sbr"
".\Debug\dedicated\null_renderer.sbr"
".\Debug\dedicated\null_snddma.sbr"
".\Debug\dedicated\win_main.sbr"
".\Debug\dedicated\matcomp.sbr"
".\Debug\dedicated\tr_backend.sbr"
".\Debug\dedicated\tr_ghoul2.sbr"
".\Debug\dedicated\tr_image.sbr"
".\Debug\dedicated\tr_init.sbr"
".\Debug\dedicated\tr_main.sbr"
".\Debug\dedicated\tr_mesh.sbr"
".\Debug\dedicated\tr_model.sbr"
".\Debug\dedicated\tr_shader.sbr"
".\Debug\dedicated\win_net.sbr"
".\Debug\dedicated\win_shared.sbr"
".\Debug\dedicated\be_aas_bspq3.sbr"
".\Debug\dedicated\be_aas_cluster.sbr"
".\Debug\dedicated\be_aas_debug.sbr"
".\Debug\dedicated\be_aas_entity.sbr"
".\Debug\dedicated\be_aas_file.sbr"
".\Debug\dedicated\be_aas_main.sbr"
".\Debug\dedicated\be_aas_move.sbr"
".\Debug\dedicated\be_aas_optimize.sbr"
".\Debug\dedicated\be_aas_reach.sbr"
".\Debug\dedicated\be_aas_route.sbr"
".\Debug\dedicated\be_aas_routealt.sbr"
".\Debug\dedicated\be_aas_sample.sbr"
".\Debug\dedicated\be_ai_char.sbr"
".\Debug\dedicated\be_ai_chat.sbr"
".\Debug\dedicated\be_ai_gen.sbr"
".\Debug\dedicated\be_ai_goal.sbr"
".\Debug\dedicated\be_ai_move.sbr"
".\Debug\dedicated\be_ai_weap.sbr"
".\Debug\dedicated\be_ai_weight.sbr"
".\Debug\dedicated\be_ea.sbr"
".\Debug\dedicated\be_interface.sbr"
".\Debug\dedicated\l_crc.sbr"
".\Debug\dedicated\l_libvar.sbr"
".\Debug\dedicated\l_log.sbr"
".\Debug\dedicated\l_memory.sbr"
".\Debug\dedicated\l_precomp.sbr"
".\Debug\dedicated\l_script.sbr"
".\Debug\dedicated\l_struct.sbr"]
Creating command line "bscmake.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP12B8.tmp"
Creating browse info file...
<h3>Output Window</h3>
<h3>Results</h3>
WinDed.exe - 0 error(s), 0 warning(s)
jk2Ded.exe - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

16
CODE-mp/botlib/botlib.plg Normal file
View file

@ -0,0 +1,16 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: botlib - Win32 Final JK2--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
botlib.lib - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

Binary file not shown.

View file

@ -8,6 +8,7 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
//=================================================
//ANIMS IN WHICH UPPER AND LOWER OBJECTS ARE IN MD3
//=================================================
ENUM2STRING(BOTH_1CRUFTFORGIL), //# G2 cannot have a reverse anim at beginning of file
//# #sep ENUM2STRING(BOTH_ DEATHS
ENUM2STRING(BOTH_DEATH1), //# First Death anim
ENUM2STRING(BOTH_DEATH2), //# Second Death anim
@ -23,13 +24,17 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_DEATH12), //#
ENUM2STRING(BOTH_DEATH13), //#
ENUM2STRING(BOTH_DEATH14), //#
ENUM2STRING(BOTH_DEATH14_UNGRIP), //# Desann's end death (cin #35)
ENUM2STRING(BOTH_DEATH14_SITUP), //# Tavion sitting up after having been thrown (cin #23)
ENUM2STRING(BOTH_DEATH15), //#
ENUM2STRING(BOTH_DEATH16), //#
ENUM2STRING(BOTH_DEATH17), //#
ENUM2STRING(BOTH_DEATH18), //#
ENUM2STRING(BOTH_DEATH19), //#
ENUM2STRING(BOTH_DEATH20), //#
ENUM2STRING(BOTH_DEATH21), //#
ENUM2STRING(BOTH_DEATH22), //#
ENUM2STRING(BOTH_DEATH23), //#
ENUM2STRING(BOTH_DEATH24), //#
ENUM2STRING(BOTH_DEATH25), //#
ENUM2STRING(BOTH_DEATHFORWARD1), //# First Death in which they get thrown forward
ENUM2STRING(BOTH_DEATHFORWARD2), //# Second Death in which they get thrown forward
@ -73,6 +78,12 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_DEAD17), //#
ENUM2STRING(BOTH_DEAD18), //#
ENUM2STRING(BOTH_DEAD19), //#
ENUM2STRING(BOTH_DEAD20), //#
ENUM2STRING(BOTH_DEAD21), //#
ENUM2STRING(BOTH_DEAD22), //#
ENUM2STRING(BOTH_DEAD23), //#
ENUM2STRING(BOTH_DEAD24), //#
ENUM2STRING(BOTH_DEAD25), //#
ENUM2STRING(BOTH_DEADFORWARD1), //# First thrown forward death finished pose
ENUM2STRING(BOTH_DEADFORWARD2), //# Second thrown forward death finished pose
ENUM2STRING(BOTH_DEADBACKWARD1), //# First thrown backward death finished pose
@ -124,6 +135,7 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
//# #sep ENUM2STRING(BOTH_ ATTACKS
ENUM2STRING(BOTH_ATTACK1), //# Attack with stun baton
ENUM2STRING(BOTH_ATTACK2), //# Attack with one-handed pistol
ENUM2STRING(BOTH_ATTACK2IDLE1), //# Idle with one-handed pistol
ENUM2STRING(BOTH_ATTACK3), //# Attack with blaster rifle
ENUM2STRING(BOTH_ATTACK4), //# Attack with disruptor
ENUM2STRING(BOTH_ATTACK5), //# Attack with bow caster
@ -607,19 +619,29 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_CCWCIRCLEBREAK), //#
ENUM2STRING(BOTH_CWCIRCLELOCK), //#
ENUM2STRING(BOTH_CCWCIRCLELOCK), //#
//other saber anims/attacks
ENUM2STRING(BOTH_SABERFAST_STANCE),
ENUM2STRING(BOTH_SABERSLOW_STANCE),
ENUM2STRING(BOTH_A2_STABBACK1), //# Stab saber backward
ENUM2STRING(BOTH_ATTACK_BACK), //# Swing around backwards and attack
ENUM2STRING(BOTH_JUMPFLIPSLASHDOWN1),//#
ENUM2STRING(BOTH_JUMPFLIPSTABDOWN),//#
ENUM2STRING(BOTH_FORCELEAP2_T__B_),//#
ENUM2STRING(BOTH_LUNGE2_B__T_),//#
ENUM2STRING(BOTH_CROUCHATTACKBACK1),//#
//# #sep ENUM2STRING(BOTH_ STANDING
ENUM2STRING(BOTH_STAND1), //# Standing idle), no weapon), hands down
ENUM2STRING(BOTH_STAND1_RANDOM1), //# Random standing idle
ENUM2STRING(BOTH_STAND1_RANDOM2), //# Random standing idle
ENUM2STRING(BOTH_STAND2), //# Standing idle with a weapon
ENUM2STRING(BOTH_STAND2_RANDOM1), //# Random standing idle
ENUM2STRING(BOTH_STAND2_RANDOM2), //# Random standing idle
ENUM2STRING(BOTH_STAND2_RANDOM3), //# Random standing idle
ENUM2STRING(BOTH_STAND2_RANDOM4), //# Random standing idle
ENUM2STRING(BOTH_STAND3), //# Standing hands behind back), at ease), etc.
ENUM2STRING(BOTH_STAND1), //# Standing idle, no weapon, hands down
ENUM2STRING(BOTH_STAND1IDLE1), //# Random standing idle
ENUM2STRING(BOTH_STAND2), //# Standing idle with a saber
ENUM2STRING(BOTH_STAND2IDLE1), //# Random standing idle
ENUM2STRING(BOTH_STAND2IDLE2),
ENUM2STRING(BOTH_STAND3), //# Standing idle with 2-handed weapon
ENUM2STRING(BOTH_STAND3IDLE1), //# Random standing idle
ENUM2STRING(BOTH_STAND4), //# hands clasp behind back
ENUM2STRING(BOTH_STAND5), //# standing idle), no weapon), hand down), back straight
ENUM2STRING(BOTH_STAND4IDLE1), //# Random standing idle
ENUM2STRING(BOTH_STAND5), //# standing idle, no weapon, hand down, back straight
ENUM2STRING(BOTH_STAND5IDLE1), //# Random standing idle
ENUM2STRING(BOTH_STAND6), //# one handed), gun at side), relaxed stand
ENUM2STRING(BOTH_STAND7), //# both hands on hips (female)
ENUM2STRING(BOTH_STAND8), //# both hands on hips (male)
@ -638,8 +660,21 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_STAND5_REELO), //# Reelo in his stand5 position (cin #18)
ENUM2STRING(BOTH_STAND1TOSTAND5), //# Transition from stand1 to stand5
ENUM2STRING(BOTH_STAND5TOSTAND1), //# Transition from stand5 to stand1
ENUM2STRING(BOTH_STAND5TOAIM), //# Transition of Kye aiming his gun at Desann (cin #9)
ENUM2STRING(BOTH_STAND5STARTLEDLOOKLEFT), //# Kyle turning to watch the bridge drop (cin #9)
ENUM2STRING(BOTH_STARTLEDLOOKLEFTTOSTAND5), //# Kyle returning to stand 5 from watching the bridge drop (cin #9)
ENUM2STRING(BOTH_STAND5TOSTAND8), //# Transition from stand5 to stand8
ENUM2STRING(BOTH_STAND7TOSTAND8), //# Tavion putting hands on back of chair (cin #11)
ENUM2STRING(BOTH_STAND8TOSTAND5), //# Transition from stand8 to stand5
ENUM2STRING(BOTH_STAND5SHIFTWEIGHT), //# Weightshift from stand5 to side and back to stand5
ENUM2STRING(BOTH_STAND5SHIFTWEIGHTSTART), //# From stand5 to side
ENUM2STRING(BOTH_STAND5SHIFTWEIGHTSTOP), //# From side to stand5
ENUM2STRING(BOTH_STAND5TURNLEFTSTART), //# Start turning left from stand5
ENUM2STRING(BOTH_STAND5TURNLEFTSTOP), //# Stop turning left from stand5
ENUM2STRING(BOTH_STAND5TURNRIGHTSTART), //# Start turning right from stand5
ENUM2STRING(BOTH_STAND5TURNRIGHTSTOP), //# Stop turning right from stand5
ENUM2STRING(BOTH_STAND5LOOK180LEFTSTART), //# Start looking over left shoulder (cin #17)
ENUM2STRING(BOTH_STAND5LOOK180LEFTSTOP), //# Stop looking over left shoulder (cin #17)
ENUM2STRING(BOTH_CONSOLE1START), //# typing at a console
ENUM2STRING(BOTH_CONSOLE1), //# typing at a console
@ -647,6 +682,8 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_CONSOLE2START), //# typing at a console with comm link in hand (cin #5)
ENUM2STRING(BOTH_CONSOLE2), //# typing at a console with comm link in hand (cin #5)
ENUM2STRING(BOTH_CONSOLE2STOP), //# typing at a console with comm link in hand (cin #5)
ENUM2STRING(BOTH_CONSOLE2HOLDCOMSTART), //# lean in to type at console while holding comm link in hand (cin #5)
ENUM2STRING(BOTH_CONSOLE2HOLDCOMSTOP), //# lean away after typing at console while holding comm link in hand (cin #5)
ENUM2STRING(BOTH_GUARD_LOOKAROUND1), //# Cradling weapon and looking around
ENUM2STRING(BOTH_GUARD_IDLE1), //# Cradling weapon and standing
@ -654,6 +691,53 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_GESTURE1), //# Generic gesture), non-specific
ENUM2STRING(BOTH_GESTURE2), //# Generic gesture), non-specific
ENUM2STRING(BOTH_GESTURE3), //# Generic gesture), non-specific
ENUM2STRING(BOTH_WALK1TALKCOMM1), //# Talking into coom link while walking
ENUM2STRING(BOTH_TALK1), //# Generic talk anim
ENUM2STRING(BOTH_TALK2), //# Generic talk anim
ENUM2STRING(BOTH_TALKCOMM1START), //# Start talking into a comm link
ENUM2STRING(BOTH_TALKCOMM1), //# Talking into a comm link
ENUM2STRING(BOTH_TALKCOMM1STOP), //# Stop talking into a comm link
ENUM2STRING(BOTH_TALKGESTURE1), //# Generic talk anim
ENUM2STRING(BOTH_TALKGESTURE2), //# Generic talk anim
ENUM2STRING(BOTH_TALKGESTURE3), //# Generic talk anim
ENUM2STRING(BOTH_TALKGESTURE4START), //# Beginning talk anim 4
ENUM2STRING(BOTH_TALKGESTURE4), //# Talk gesture 4
ENUM2STRING(BOTH_TALKGESTURE4STOP), //# Ending talk anim 4
ENUM2STRING(BOTH_TALKGESTURE5START), //# Start hand on chin
ENUM2STRING(BOTH_TALKGESTURE5), //# Hand on chin
ENUM2STRING(BOTH_TALKGESTURE5STOP), //# Stop hand on chin
ENUM2STRING(BOTH_TALKGESTURE6START), //# Starting Motions to self
ENUM2STRING(BOTH_TALKGESTURE6), //# Pointing at self
ENUM2STRING(BOTH_TALKGESTURE6STOP), //# Ending Motions to self
ENUM2STRING(BOTH_TALKGESTURE7START), //# Start touches Kyle on shoulder
ENUM2STRING(BOTH_TALKGESTURE7), //# Hold touches Kyle on shoulder
ENUM2STRING(BOTH_TALKGESTURE7STOP), //# Ending touches Kyle on shoulder
ENUM2STRING(BOTH_TALKGESTURE8START), //# Lando's chin hold
ENUM2STRING(BOTH_TALKGESTURE8), //# Lando's chin hold
ENUM2STRING(BOTH_TALKGESTURE8STOP), //# Lando's chin hold
ENUM2STRING(BOTH_TALKGESTURE9), //# Same as gesture 2 but with the right hand
ENUM2STRING(BOTH_TALKGESTURE10), //# Shoulder shrug
ENUM2STRING(BOTH_TALKGESTURE11START), //# Arms folded across chest
ENUM2STRING(BOTH_TALKGESTURE11STOP), //# Arms folded across chest
ENUM2STRING(BOTH_TALKGESTURE12), //# Tavion taunting Kyle
ENUM2STRING(BOTH_TALKGESTURE13START), //# Luke warning Kyle
ENUM2STRING(BOTH_TALKGESTURE13), //# Luke warning Kyle
ENUM2STRING(BOTH_TALKGESTURE13STOP), //# Luke warning Kyle
ENUM2STRING(BOTH_TALKGESTURE14), //# Luke gesturing to Kyle
ENUM2STRING(BOTH_TALKGESTURE15START), //# Desann taunting Kyle
ENUM2STRING(BOTH_TALKGESTURE15), //# Desann taunting Kyle
ENUM2STRING(BOTH_TALKGESTURE15STOP), //# Desann taunting Kyle
ENUM2STRING(BOTH_TALKGESTURE16), //# Bartender gesture cin #15
ENUM2STRING(BOTH_TALKGESTURE17), //# Bartender gesture cin #15
ENUM2STRING(BOTH_TALKGESTURE18), //# Bartender gesture cin #15
ENUM2STRING(BOTH_TALKGESTURE19START), //# Desann lifting his arm "Join me" (cin #34)
ENUM2STRING(BOTH_TALKGESTURE19STOP), //# Desann lifting his arm "Join me" (cin #34)
ENUM2STRING(BOTH_TALKGESTURE20START), //# Kyle lifting his arm "Join us" (cin #34)
ENUM2STRING(BOTH_TALKGESTURE21), //# generic talk gesture from stand3
ENUM2STRING(BOTH_TALKGESTURE22), //# generic talk gesture from stand3
ENUM2STRING(BOTH_TALKGESTURE23), //# generic talk gesture from stand3
ENUM2STRING(BOTH_PAUSE1START), //# Luke pauses to warn Kyle (cin #24) start
ENUM2STRING(BOTH_PAUSE1STOP), //# Luke pauses to warn Kyle (cin #24) stop
@ -670,6 +754,8 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_SITHEADTILTRSTOP), //# Head tilt to right from seated position
ENUM2STRING(BOTH_SITHEADNOD), //# Head shake YES from seated position
ENUM2STRING(BOTH_SITHEADSHAKE), //# Head shake NO from seated position
ENUM2STRING(BOTH_SIT2HEADTILTLSTART), //# Head tilt to left from seated position 2
ENUM2STRING(BOTH_SIT2HEADTILTLSTOP), //# Head tilt to left from seated position 2
ENUM2STRING(BOTH_REACH1START), //# Monmothma reaching for crystal
ENUM2STRING(BOTH_REACH1STOP), //# Monmothma reaching for crystal
@ -684,13 +770,6 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_EXAMINE3), //# Hold Lando looking around corner
ENUM2STRING(BOTH_EXAMINE3STOP), //# End Lando looking around corner
ENUM2STRING(BOTH_THROW1START), //# Kyle thrown to the right
ENUM2STRING(BOTH_THROW1), //# Kyle thrown to the right
ENUM2STRING(BOTH_THROW1STOP), //# Kyle thrown to the right
ENUM2STRING(BOTH_THROW2START), //# Kyle thrown to the left
ENUM2STRING(BOTH_THROW2), //# Kyle thrown to the left
ENUM2STRING(BOTH_THROW3), //# Kyle thrown backwards in cin #9
ENUM2STRING(BOTH_LEANLEFT2START), //# Start leaning left in chair
ENUM2STRING(BOTH_LEANLEFT2STOP), //# Stop leaning left in chair
ENUM2STRING(BOTH_LEANRIGHT3START), //# Start Lando leaning on wall
@ -726,6 +805,26 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_LAUGH1STOP), //# Reelo laughing (cin #18)
ENUM2STRING(BOTH_ESCAPEPOD_LEAVE1), //# Kyle leaving escape pod (cin #33)
ENUM2STRING(BOTH_ESCAPEPOD_LEAVE2), //# Jan leaving escape pod (cin #33)
ENUM2STRING(BOTH_HUGGER1), //# Kyle hugging Jan (cin #29)
ENUM2STRING(BOTH_HUGGERSTOP1), //# Kyle stop hugging Jan but don't let her go (cin #29)
ENUM2STRING(BOTH_HUGGERSTOP2), //# Kyle let go of Jan and step back (cin #29)
ENUM2STRING(BOTH_HUGGEE1), //# Jan being hugged (cin #29)
ENUM2STRING(BOTH_HUGGEESTOP1), //# Jan stop being hugged but don't let go (cin #29)
ENUM2STRING(BOTH_HUGGEESTOP2), //# Jan released from hug (cin #29)
ENUM2STRING(BOTH_KISSER1), //# Temp until the Kiss anim gets split up
ENUM2STRING(BOTH_KISSER1START1), //# Kyle start kissing Jan
ENUM2STRING(BOTH_KISSER1START2), //# Kyle start kissing Jan
ENUM2STRING(BOTH_KISSER1LOOP), //# Kyle loop kissing Jan
ENUM2STRING(BOTH_KISSER1STOP), //# Temp until the Kiss anim gets split up
ENUM2STRING(BOTH_KISSER1STOP1), //# Kyle stop kissing but don't let go
ENUM2STRING(BOTH_KISSER1STOP2), //# Kyle step back from Jan
ENUM2STRING(BOTH_KISSEE1), //# Temp until the Kiss anim gets split up
ENUM2STRING(BOTH_KISSEE1START1), //# Jan start being kissed
ENUM2STRING(BOTH_KISSEE1START2), //# Jan start2 being kissed
ENUM2STRING(BOTH_KISSEE1LOOP), //# Jan loop being kissed
ENUM2STRING(BOTH_KISSEE1STOP), //# Temp until the Kiss anim gets split up
ENUM2STRING(BOTH_KISSEE1STOP1), //# Jan stop being kissed but don't let go
ENUM2STRING(BOTH_KISSEE1STOP2), //# Jan wait for Kyle to step back
ENUM2STRING(BOTH_BARTENDER_IDLE1), //# Bartender idle in cin #15
ENUM2STRING(BOTH_BARTENDER_THROW1), //# Bartender throws glass in cin #15
ENUM2STRING(BOTH_BARTENDER_COWERSTART), //# Start of Bartender raising both hands up in surrender (cin #16)
@ -735,6 +834,7 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_THREATEN1), //# Kyle threatening Bartender with lightsaber (cin #16)
ENUM2STRING(BOTH_RADIO_ONOFF), //# Mech Galak turning on his suit radio (cin #32)
ENUM2STRING(BOTH_TRIUMPHANT1START), //# Mech Galak raising his arms in victory (cin #32)
ENUM2STRING(BOTH_TRIUMPHANT1STARTGESTURE), //# Mech Galak raising his arms in victory (cin #32)
ENUM2STRING(BOTH_TRIUMPHANT1STOP), //# Mech Galak lowering his arms in victory (cin #32)
ENUM2STRING(BOTH_SABERTHROW1START), //# Desann throwing his light saber (cin #26)
@ -758,6 +858,8 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_SIT2TO3), //# Trans from sit2 to sit3?
ENUM2STRING(BOTH_SIT2TOSTAND5), //# Transition from sit 2 to stand 5
ENUM2STRING(BOTH_STAND5TOSIT2), //# Transition from stand 5 to sit 2
ENUM2STRING(BOTH_SIT2TOSIT4), //# Trans from sit2 to sit4 (cin #12) Luke leaning back from lotus position.
ENUM2STRING(BOTH_SIT3TO1), //# Trans from sit3 to sit1?
ENUM2STRING(BOTH_SIT3TO2), //# Trans from sit3 to sit2?
ENUM2STRING(BOTH_SIT3TOSTAND5), //# transition from sit 3 to stand 5
@ -778,23 +880,22 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_UNCROUCH1), //# Transition from crouch to standing
ENUM2STRING(BOTH_CROUCH2IDLE), //# crouch and resting on back righ heel), no weapon
ENUM2STRING(BOTH_CROUCH2TOSTAND1), //# going from crouch2 to stand1
ENUM2STRING(BOTH_UNCROUCH3), //# Desann uncrouching down to Kyle (cin 9)
ENUM2STRING(BOTH_CROUCH3), //# Desann crouching down to Kyle (cin 9)
ENUM2STRING(BOTH_UNCROUCH3), //# Desann uncrouching down to Kyle (cin 9)
ENUM2STRING(BOTH_CROUCH4), //# Slower version of crouch1 for cinematics
ENUM2STRING(BOTH_UNCROUCH4), //# Slower version of uncrouch1 for cinematics
ENUM2STRING(BOTH_GET_UP1), //# Get up from the ground), face down
ENUM2STRING(BOTH_GET_UP2), //# Get up from the ground), face up
ENUM2STRING(BOTH_COCKPIT_CONSOLE1), //# work console1 while sitting in a cockpit.
ENUM2STRING(BOTH_COCKPIT_CONSOLE2), //# work console2 while sitting in a cockpit.
ENUM2STRING(BOTH_COCKPIT_SIT), //# sit in a cockpit.
ENUM2STRING(BOTH_GUNSIT1), //# sitting on an emplaced gun.
ENUM2STRING(BOTH_DEATH14_UNGRIP), //# Desann's end death (cin #35)
ENUM2STRING(BOTH_DEATH14_SITUP), //# Tavion sitting up after having been thrown (cin #23)
ENUM2STRING(BOTH_KNEES1), //# Tavion on her knees
ENUM2STRING(BOTH_KNEES2), //# Tavion on her knees looking down
ENUM2STRING(BOTH_KNEES2TO1), //# Transition of KNEES2 to KNEES1
ENUM2STRING(BOTH_STRUGGLE1START), //# Kyle struggling under crate
ENUM2STRING(BOTH_STRUGGLE1), //# Kyle struggling under crate
ENUM2STRING(BOTH_STRUGGLE1STOP), //# Kyle struggling under crate
ENUM2STRING(BOTH_RUMMAGE1START), //# Kyle rummaging for crystal (cin 2)
ENUM2STRING(BOTH_RUMMAGE1), //# Kyle rummaging for crystal (cin 2)
@ -812,6 +913,9 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_WALK5), //# Tavion taunting Kyle (cin 22)
ENUM2STRING(BOTH_WALK6), //# Slow walk for Luke (cin 12)
ENUM2STRING(BOTH_WALK7), //# Fast walk
ENUM2STRING(BOTH_WALK8), //# Normal walk with hands behind back (Luke in cin#12)
ENUM2STRING(BOTH_WALK9), //# Lando walk (cin #17)
ENUM2STRING(BOTH_WALK10), //# Lando walk (cin #17)
ENUM2STRING(BOTH_WALKTORUN1), //# transition from walk to run
ENUM2STRING(BOTH_RUN1), //# Full run
ENUM2STRING(BOTH_RUN1START), //# Start into full run1
@ -824,10 +928,12 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_RUNSTRAFE_RIGHT1), //# Sidestep right), should loop
ENUM2STRING(BOTH_TURN_LEFT1), //# Turn left), should loop
ENUM2STRING(BOTH_TURN_RIGHT1), //# Turn right), should loop
ENUM2STRING(BOTH_TURNSTAND1), //# Turn from STAND1 position
ENUM2STRING(BOTH_TURNSTAND2), //# Turn from STAND2 position
ENUM2STRING(BOTH_TURNSTAND3), //# Turn from STAND3 position
ENUM2STRING(BOTH_TURNSTAND4), //# Turn from STAND4 position
ENUM2STRING(BOTH_TURNSTAND5), //# Turn from STAND5 position
ENUM2STRING(BOTH_TURNCROUCH1), //# Turn from CROUCH1 position
ENUM2STRING(BOTH_RUNAWAY1), //# Running scared
ENUM2STRING(BOTH_SWIM1), //# Swimming
@ -898,16 +1004,7 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_DIVE1), //# Dive!
ENUM2STRING(BOTH_SABERFAST_STANCE),
ENUM2STRING(BOTH_SABERSLOW_STANCE),
ENUM2STRING(BOTH_ENGAGETAUNT),
ENUM2STRING(BOTH_A2_STABBACK1), //# Stab saber backward
ENUM2STRING(BOTH_ATTACK_BACK), //# Swing around backwards and attack
ENUM2STRING(BOTH_JUMPFLIPSLASHDOWN1),//#
ENUM2STRING(BOTH_JUMPFLIPSTABDOWN),//#
ENUM2STRING(BOTH_FORCELEAP2_T__B_),//#
ENUM2STRING(BOTH_LUNGE2_B__T_),//#
ENUM2STRING(BOTH_CROUCHATTACKBACK1),//#
ENUM2STRING(BOTH_ARIAL_LEFT), //#
ENUM2STRING(BOTH_ARIAL_RIGHT), //#
ENUM2STRING(BOTH_CARTWHEEL_LEFT), //#
@ -963,10 +1060,6 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_ARIAL_F1),//#
ENUM2STRING(BOTH_BUTTERFLY_FR1),//#
ENUM2STRING(BOTH_BUTTERFLY_FL1),//#
ENUM2STRING(BOTH_POSE1),//#
ENUM2STRING(BOTH_POSE2),//#
ENUM2STRING(BOTH_POSE3),//#
ENUM2STRING(BOTH_POSE4),//#
//# #sep BOTH_ MISC MOVEMENT
ENUM2STRING(BOTH_HIT1), //# Kyle hit by crate in cin #9
@ -999,12 +1092,7 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
//# #sep BOTH_ SWIMMING
ENUM2STRING(BOTH_SWIM_IDLE1), //# Swimming Idle 1
ENUM2STRING(BOTH_SWIMFORWARDSTART), //# Swim forward start
ENUM2STRING(BOTH_SWIMFORWARD), //# Swim forward loop
ENUM2STRING(BOTH_SWIMFORWARDSTOP), //# Swim forward end
ENUM2STRING(BOTH_SWIMBACKWARDSTART),//# Swim backward start
ENUM2STRING(BOTH_SWIMBACKWARD), //# Swim backward loop
ENUM2STRING(BOTH_SWIMBACKWARDSTOP), //# Swim backward end
//# #sep ENUM2STRING(BOTH_ LYING
ENUM2STRING(BOTH_LIE_DOWN1), //# From a stand position), get down on ground), face down
@ -1030,6 +1118,26 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_PROPUP1), //# Kyle getting up from having been knocked down (cin #9 end)
ENUM2STRING(BOTH_CRAWLBACK1), //# Lying on back), crawling backwards with elbows
ENUM2STRING(BOTH_SITWALL1), //# Sitting against a wall
ENUM2STRING(BOTH_SLEEP1), //# laying on back-rknee up-rhand on torso
ENUM2STRING(BOTH_SLEEP2), //# on floor-back against wall-arms crossed
ENUM2STRING(BOTH_SLEEP3), //# Sleeping in a chair
ENUM2STRING(BOTH_SLEEP4), //# Sleeping slumped over table
ENUM2STRING(BOTH_SLEEP5), //# Laying on side sleeping on flat sufrace
ENUM2STRING(BOTH_SLEEP6START), //# Kyle leaning back to sleep (cin 20)
ENUM2STRING(BOTH_SLEEP6STOP), //# Kyle waking up and shaking his head (cin 21)
ENUM2STRING(BOTH_SLEEP1GETUP), //# alarmed and getting up out of sleep1 pose to stand
ENUM2STRING(BOTH_SLEEP1GETUP2), //#
ENUM2STRING(BOTH_SLEEP2GETUP), //# alarmed and getting up out of sleep2 pose to stand
ENUM2STRING(BOTH_SLEEP3GETUP), //# alarmed and getting up out of sleep3 pose to stand
ENUM2STRING(BOTH_SLEEP3DEATH), //# death in chair), from sleep3 idle
ENUM2STRING(BOTH_SLEEP3DEAD), //# death in chair), from sleep3 idle
ENUM2STRING(BOTH_SLEEP_IDLE1), //# rub face and nose while asleep from sleep pose 1
ENUM2STRING(BOTH_SLEEP_IDLE2), //# shift position while asleep - stays in sleep2
ENUM2STRING(BOTH_SLEEP_IDLE3), //# Idle anim from sleep pose 3
ENUM2STRING(BOTH_SLEEP_IDLE4), //# Idle anim from sleep pose 4
ENUM2STRING(BOTH_SLEEP1_NOSE), //# Scratch nose from SLEEP1 pose
ENUM2STRING(BOTH_SLEEP2_SHIFT), //# Shift in sleep from SLEEP2 pose
ENUM2STRING(BOTH_RESTRAINED1), //# Telsia tied to medical table
ENUM2STRING(BOTH_RESTRAINED1POINT), //# Telsia tied to medical table pointing at Munro
ENUM2STRING(BOTH_LIFTED1), //# Fits with ENUM2STRING(BOTH_LIFT1), lifted on shoulder
@ -1060,6 +1168,7 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_MINDTRICK1), //# Use off-hand to do mind trick
ENUM2STRING(BOTH_MINDTRICK2), //# Use off-hand to do distraction
ENUM2STRING(BOTH_FORCELIGHTNING), //# Use off-hand to do lightning
ENUM2STRING(BOTH_FORCELIGHTNING_START), //# Use off-hand to do lightning - start
ENUM2STRING(BOTH_FORCELIGHTNING_HOLD), //# Use off-hand to do lightning - hold
ENUM2STRING(BOTH_FORCELIGHTNING_RELEASE),//# Use off-hand to do lightning - release
ENUM2STRING(BOTH_FORCEHEAL_START), //# Healing meditation pose start
@ -1067,13 +1176,51 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
ENUM2STRING(BOTH_FORCEHEAL_QUICK), //# Healing meditation gesture
ENUM2STRING(BOTH_SABERPULL), //# Use off-hand to do force power.
ENUM2STRING(BOTH_FORCEGRIP1), //# force-gripping (no anim?)
ENUM2STRING(BOTH_FORCEGRIP2), //# force-gripping (?)
ENUM2STRING(BOTH_FORCEGRIP3), //# force-gripping (right-hand)
ENUM2STRING(BOTH_FORCEGRIP3THROW), //# throwing while force-gripping (right hand)
ENUM2STRING(BOTH_FORCEGRIP_HOLD), //# Use off-hand to do grip - hold
ENUM2STRING(BOTH_FORCEGRIP_RELEASE),//# Use off-hand to do grip - release
ENUM2STRING(BOTH_TOSS1), //# throwing to left after force gripping
ENUM2STRING(BOTH_TOSS2), //# throwing to right after force gripping
ENUM2STRING(BOTH_COCKPIT_TALKR1START), //# turn head from straight forward to looking full right
ENUM2STRING(BOTH_COCKPIT_TALKR1STARTTOMID), //# from TALKR1START to looking at hologram (cin #1)
ENUM2STRING(BOTH_COCKPIT_TALKR1MIDTOSTART), //# from looking at hologram to TALKR1START (cin #1)
ENUM2STRING(BOTH_COCKPIT_TALKR1STOP), //# return head to straight forward from BOTH_COCKPIT_TALKR1
ENUM2STRING(BOTH_COCKPIT_TALKR1STOPTOMID), //# from TALKR1STOP to TALKR1MID
ENUM2STRING(BOTH_COCKPIT_TALKR1MIDTOSTOP), //# from looking at hologram to TALKR1STOP (cin #1)
ENUM2STRING(BOTH_COCKPIT_TALKR1), //# talk to right side
ENUM2STRING(BOTH_COCKPIT_TALKL1START), //# turn head from straight forward to looking full left
ENUM2STRING(BOTH_COCKPIT_TALKL1STARTTOMID), //# from TALKL1START to looking at hologram (cin #1)
ENUM2STRING(BOTH_COCKPIT_TALKL1MIDTOSTART), //# from looking at hologram to TALKL1START (cin #1)
ENUM2STRING(BOTH_COCKPIT_TALKL1STOP), //# return head to straight forward from BOTH_COCKPIT_TALKL1
ENUM2STRING(BOTH_COCKPIT_TALKL1STOPTOMID), //# from TALKL1STOP to TALKL1MID
ENUM2STRING(BOTH_COCKPIT_TALKL1MIDTOSTOP), //# from looking at hologram to TALKL1STOP (cin #1)
ENUM2STRING(BOTH_COCKPIT_TALKL1), //# talk to left side
ENUM2STRING(BOTH_COCKPIT_CONSOLE1), //# type at controls
ENUM2STRING(BOTH_COCKPIT_CONSOLE2), //# type at controls
ENUM2STRING(BOTH_COCKPIT_CONSOLE2_PARTIAL), //# last part of console2 anim (cin #1) used by Jan
ENUM2STRING(BOTH_COCKPIT_HEADNOD), //# nod head yes while sitting
ENUM2STRING(BOTH_COCKPIT_HEADSHAKE), //# shake head no while sitting
ENUM2STRING(BOTH_COCKPIT_HEADTILTLSTART), //# start tilt head left while sitting
ENUM2STRING(BOTH_COCKPIT_HEADTILTLSTOP), //# stop tilt head left while sitting
ENUM2STRING(BOTH_COCKPIT_HEADTILTRSTART), //# start tilt head right while sitting
ENUM2STRING(BOTH_COCKPIT_HEADTILTRSTOP), //# stop tilt head right while sitting
ENUM2STRING(BOTH_COCKPIT_TALKGESTURE7START), //# Lando's supporting hand to Kyle (cin #21)
ENUM2STRING(BOTH_COCKPIT_TALKGESTURE7STOP), //# Lando's supporting hand away from Kyle (cin #21)
ENUM2STRING(BOTH_COCKPIT_TALKGESTURE8START), //# Hand to Lando's chin (cin #21)
ENUM2STRING(BOTH_COCKPIT_TALKGESTURE8STOP), //# hand away from Lando's chin *cin #21)
ENUM2STRING(BOTH_COCKPIT_TALKGESTURE11START), //#
ENUM2STRING(BOTH_COCKPIT_TALKGESTURE11STOP), //#
ENUM2STRING(BOTH_COCKPIT_SLEEP6START), //#
ENUM2STRING(BOTH_COCKPIT_SLEEP6STOP), //#
//=================================================
//ANIMS IN WHICH ONLY THE UPPER OBJECTS ARE IN MD3
//=================================================
@ -1114,22 +1261,6 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] =
//# #sep ENUM2STRING(TORSO_ USING NON-WEAPON OBJECTS
//# #sep ENUM2STRING(TORSO_ MISC
ENUM2STRING(TORSO_TALKR1START), //# begin turning head for ENUM2STRING(BOTH_ENUM2STRING(TORSO_TALKR
ENUM2STRING(TORSO_TALKR1HOLD), //# non-looping version of talk to right side
ENUM2STRING(TORSO_TALKR1STOP), //# return head to straight forward from ENUM2STRING(BOTH_ENUM2STRING(TORSO_TALKL
ENUM2STRING(TORSO_TALKR1), //# talk to right side
ENUM2STRING(TORSO_TALKL1START), //# begin turning head for ENUM2STRING(BOTH_ENUM2STRING(TORSO_TALKL
ENUM2STRING(TORSO_TALKL1HOLD), //# non-looping version of talk to left side
ENUM2STRING(TORSO_TALKL1STOP), //# return head to straight forward from ENUM2STRING(BOTH_ENUM2STRING(TORSO_TALKL
ENUM2STRING(TORSO_TALKL1), //# talk to left side
ENUM2STRING(TORSO_LOOKL1), //# looking left
ENUM2STRING(TORSO_LOOKR1), //# looking right
ENUM2STRING(TORSO_LOOKR2START), //# turn not so far as TALKR1
ENUM2STRING(TORSO_LOOKR2STOP), //# turn not so far as TALKR1
ENUM2STRING(TORSO_LOOKR2), //# looking right - not so far as LOOKR1
ENUM2STRING(TORSO_LOOKL2START), //# turn not so far as TALKL1
ENUM2STRING(TORSO_LOOKL2STOP), //# turn not so far as TALKL1
ENUM2STRING(TORSO_LOOKL2), //# looking right - not so far as LOOKL1
ENUM2STRING(TORSO_HANDGESTURE1), //# gestures to left one hand
ENUM2STRING(TORSO_HANDGESTURE2), //# gestures to right one hand
ENUM2STRING(TORSO_HANDGESTURE3), //# gestures to the left both hands

View file

@ -30,24 +30,24 @@ char teamChat2[256];
char *showPowersName[] =
{
"Heal",//FP_HEAL
"Jump",//FP_LEVITATION
"Speed",//FP_SPEED
"Push",//FP_PUSH
"Pull",//FP_PULL
"Mind Trick",//FP_TELEPTAHY
"Grip",//FP_GRIP
"Lightning",//FP_LIGHTNING
"Dark Rage",//FP_RAGE
"Protect",//FP_PROTECT
"Absorb",//FP_ABSORB
"Team Heal",//FP_TEAM_HEAL
"Team Replenish",//FP_TEAM_FORCE
"Drain",//FP_DRAIN
"Seeing",//FP_SEE
"Saber Attack",//FP_SABERATTACK
"Saber Defend",//FP_SABERDEFEND
"Saber Throw",//FP_SABERTHROW
"HEAL2",//FP_HEAL
"JUMP2",//FP_LEVITATION
"SPEED2",//FP_SPEED
"PUSH2",//FP_PUSH
"PULL2",//FP_PULL
"MINDTRICK2",//FP_TELEPTAHY
"GRIP2",//FP_GRIP
"LIGHTNING2",//FP_LIGHTNING
"DARK_RAGE2",//FP_RAGE
"PROTECT2",//FP_PROTECT
"ABSORB2",//FP_ABSORB
"TEAM_HEAL2",//FP_TEAM_HEAL
"TEAM_REPLENISH2",//FP_TEAM_FORCE
"DRAIN2",//FP_DRAIN
"SEEING2",//FP_SEE
"SABER_OFFENSE2",//FP_SABERATTACK
"SABER_DEFENSE2",//FP_SABERDEFEND
"SABER_THROW2",//FP_SABERTHROW
NULL
};
@ -1134,7 +1134,12 @@ void CG_DrawHUD(centity_t *cent)
}
//scoreStr = va("Score: %i", cgs.clientinfo[cg.snap->ps.clientNum].score);
if (0 && cgs.gametype < GT_TEAM )
if ( cgs.gametype == GT_TOURNAMENT )
{//A duel that requires more than one kill to knock the current enemy back to the queue
//show current kills out of how many needed
scoreStr = va("Score: %i/%i", cg.snap->ps.persistant[PERS_SCORE], cgs.fraglimit);
}
else if (0 && cgs.gametype < GT_TEAM )
{ // This is a teamless mode, draw the score bias.
scoreBias = cg.snap->ps.persistant[PERS_SCORE] - cgs.scores1;
if (scoreBias == 0)
@ -1358,7 +1363,7 @@ void CG_DrawForceSelect( void )
if ( showPowersName[cg.forceSelect] )
{
UI_DrawProportionalString(320, y + 30, showPowersName[cg.forceSelect], UI_CENTER | UI_SMALLFONT, colorTable[CT_ICON_BLUE]);
UI_DrawProportionalString(320, y + 30, CG_GetStripEdString("INGAME", showPowersName[cg.forceSelect]), UI_CENTER | UI_SMALLFONT, colorTable[CT_ICON_BLUE]);
}
}
@ -1664,7 +1669,7 @@ static float CG_DrawMiniScoreboard ( float y )
Q_strcat ( temp, MAX_QPATH, " 2nd: " );
Q_strcat ( temp, MAX_QPATH, cgs.scores2==SCORE_NOT_PRESENT?"-":(va("%i",cgs.scores2)) );
CG_Text_Paint( 630 - CG_Text_Width ( temp, 0.75f, FONT_SMALL ), y, 0.75f, colorWhite, temp, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE, FONT_MEDIUM );
CG_Text_Paint( 630 - CG_Text_Width ( temp, 0.7f, FONT_SMALL ), y, 0.7f, colorWhite, temp, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE, FONT_MEDIUM );
y += 15;
*/
//rww - no longer doing this. Since the attacker now shows who is first, we print the score there.
@ -1698,13 +1703,16 @@ static float CG_DrawEnemyInfo ( float y )
if ( cgs.gametype == GT_JEDIMASTER )
{
title = "Jedi Master";
//title = "Jedi Master";
title = CG_GetStripEdString("INGAMETEXT", "MASTERY7");
clientNum = cgs.jediMaster;
if ( clientNum < 0 )
{
//return y;
title = "Get Saber!";
// title = "Get Saber!";
title = CG_GetStripEdString("INGAMETEXT", "GET_SABER");
size = ICON_SIZE * 1.25;
y += 5;
@ -1714,23 +1722,25 @@ static float CG_DrawEnemyInfo ( float y )
y += size;
/*
CG_Text_Paint( 630 - CG_Text_Width ( ci->name, 0.75f, FONT_MEDIUM ), y, 0.75f, colorWhite, ci->name, 0, 0, 0, FONT_MEDIUM );
CG_Text_Paint( 630 - CG_Text_Width ( ci->name, 0.7f, FONT_MEDIUM ), y, 0.7f, colorWhite, ci->name, 0, 0, 0, FONT_MEDIUM );
y += 15;
*/
CG_Text_Paint( 630 - CG_Text_Width ( title, 0.75f, FONT_MEDIUM ), y, 0.75f, colorWhite, title, 0, 0, 0, FONT_MEDIUM );
CG_Text_Paint( 630 - CG_Text_Width ( title, 0.7f, FONT_MEDIUM ), y, 0.7f, colorWhite, title, 0, 0, 0, FONT_MEDIUM );
return y + BIGCHAR_HEIGHT + 2;
}
}
else if ( cg.snap->ps.duelInProgress )
{
title = "Dueling";
// title = "Dueling";
title = CG_GetStripEdString("INGAMETEXT", "DUELING");
clientNum = cg.snap->ps.duelIndex;
}
else if ( cgs.gametype == GT_TOURNAMENT && cgs.clientinfo[cg.snap->ps.clientNum].team != TEAM_SPECTATOR)
{
title = "Dueling";
// title = "Dueling";
title = CG_GetStripEdString("INGAMETEXT", "DUELING");
if (cg.snap->ps.clientNum == cgs.duelist1)
{
clientNum = cgs.duelist2;
@ -1785,7 +1795,7 @@ static float CG_DrawEnemyInfo ( float y )
ci = &cgs.clientinfo[ clientNum ];
if (!ci || !ci->modelIcon)
if ( !ci )
{
return y;
}
@ -1793,14 +1803,25 @@ static float CG_DrawEnemyInfo ( float y )
size = ICON_SIZE * 1.25;
y += 5;
CG_DrawPic( 640 - size - 5, y, size, size, ci->modelIcon );
if ( ci->modelIcon )
{
CG_DrawPic( 640 - size - 5, y, size, size, ci->modelIcon );
}
y += size;
CG_Text_Paint( 630 - CG_Text_Width ( ci->name, 0.75f, FONT_MEDIUM ), y, 0.75f, colorWhite, ci->name, 0, 0, 0, FONT_MEDIUM );
CG_Text_Paint( 630 - CG_Text_Width ( ci->name, 0.7f, FONT_MEDIUM ), y, 0.7f, colorWhite, ci->name, 0, 0, 0, FONT_MEDIUM );
y += 15;
CG_Text_Paint( 630 - CG_Text_Width ( title, 0.75f, FONT_MEDIUM ), y, 0.75f, colorWhite, title, 0, 0, 0, FONT_MEDIUM );
CG_Text_Paint( 630 - CG_Text_Width ( title, 0.7f, FONT_MEDIUM ), y, 0.7f, colorWhite, title, 0, 0, 0, FONT_MEDIUM );
if ( cgs.gametype == GT_TOURNAMENT && cgs.clientinfo[cg.snap->ps.clientNum].team != TEAM_SPECTATOR)
{//also print their score
char text[1024];
y += 15;
Com_sprintf(text, sizeof(text), "%i/%i", cgs.clientinfo[clientNum].score, cgs.fraglimit );
CG_Text_Paint( 630 - CG_Text_Width ( text, 0.7f, FONT_MEDIUM ), y, 0.7f, colorWhite, text, 0, 0, 0, FONT_MEDIUM );
}
return y + BIGCHAR_HEIGHT + 2;
}
@ -2664,6 +2685,12 @@ static void CG_DrawCrosshair( vec3_t worldPoint, int chEntValid ) {
ecolor[1] = 0.0;//G
ecolor[2] = 0.0;//B
}
else if (crossEnt->currentState.eType == ET_GRAPPLE)
{
ecolor[0] = 1.0;//R
ecolor[1] = 0.0;//G
ecolor[2] = 0.0;//B
}
}
ecolor[3] = 1.0;
@ -3266,7 +3293,7 @@ CG_DrawSpectator
static void CG_DrawSpectator(void)
{
const char* s;
s = "SPECTATOR";
s = CG_GetStripEdString("INGAMETEXT", "SPECTATOR");
if (cgs.gametype == GT_TOURNAMENT &&
cgs.duelist1 != -1 &&
cgs.duelist2 != -1)
@ -3278,13 +3305,20 @@ static void CG_DrawSpectator(void)
CG_Text_Paint ( 320 - CG_Text_Width ( text, 1.0f, 3 ) / 2, 420, 1.0f, colorWhite, text, 0, 0, 0, 3 );
if (cgs.clientinfo[cgs.duelist1].modelIcon &&
cgs.clientinfo[cgs.duelist2].modelIcon)
trap_R_SetColor( colorTable[CT_WHITE] );
if ( cgs.clientinfo[cgs.duelist1].modelIcon )
{
trap_R_SetColor( colorTable[CT_WHITE] );
CG_DrawPic( 10, SCREEN_HEIGHT-(size*1.5), size, size, cgs.clientinfo[cgs.duelist1].modelIcon );
}
if ( cgs.clientinfo[cgs.duelist2].modelIcon )
{
CG_DrawPic( SCREEN_WIDTH-size-10, SCREEN_HEIGHT-(size*1.5), size, size, cgs.clientinfo[cgs.duelist2].modelIcon );
}
Com_sprintf(text, sizeof(text), "%i/%i", cgs.clientinfo[cgs.duelist1].score, cgs.fraglimit );
CG_Text_Paint( 42 - CG_Text_Width( text, 1.0f, 2 ) / 2, SCREEN_HEIGHT-(size*1.5) + 64, 1.0f, colorWhite, text, 0, 0, 0, 2 );
Com_sprintf(text, sizeof(text), "%i/%i", cgs.clientinfo[cgs.duelist2].score, cgs.fraglimit );
CG_Text_Paint( SCREEN_WIDTH-size+22 - CG_Text_Width( text, 1.0f, 2 ) / 2, SCREEN_HEIGHT-(size*1.5) + 64, 1.0f, colorWhite, text, 0, 0, 0, 2 );
}
else
{
@ -3293,7 +3327,7 @@ static void CG_DrawSpectator(void)
if ( cgs.gametype == GT_TOURNAMENT )
{
s = "waiting to play";
s = CG_GetStripEdString("INGAMETEXT", "WAITING_TO_PLAY"); // "waiting to play";
CG_Text_Paint ( 320 - CG_Text_Width ( s, 1.0f, 3 ) / 2, 440, 1.0f, colorWhite, s, 0, 0, 0, 3 );
}
else //if ( cgs.gametype >= GT_TEAM )
@ -3509,7 +3543,8 @@ static qboolean CG_DrawFollow( void )
return qfalse;
}
s = "following";
// s = "following";
s = CG_GetStripEdString("INGAMETEXT", "FOLLOWING");
CG_Text_Paint ( 320 - CG_Text_Width ( s, 1.0f, FONT_MEDIUM ) / 2, 60, 1.0f, colorWhite, s, 0, 0, 0, FONT_MEDIUM );
s = cgs.clientinfo[ cg.snap->ps.clientNum ].name;
@ -3601,7 +3636,8 @@ static void CG_DrawWarmup( void ) {
}
if ( sec < 0 ) {
s = "Waiting for players";
// s = "Waiting for players";
s = CG_GetStripEdString("INGAMETEXT", "WAITING_FOR_PLAYERS");
w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH;
CG_DrawBigString(320 - w / 2, 24, s, 1.0F);
cg.warmupCount = 0;
@ -3654,7 +3690,8 @@ static void CG_DrawWarmup( void ) {
cg.warmup = 0;
sec = 0;
}
s = va( "Starts in: %i", sec + 1 );
// s = va( "Starts in: %i", sec + 1 );
s = va( "%s: %i",CG_GetStripEdString("INGAMETEXT", "STARTS_IN"), sec + 1 );
if ( sec != cg.warmupCount ) {
cg.warmupCount = sec;
switch ( sec ) {
@ -4254,6 +4291,7 @@ static void CG_Draw2D( void ) {
CG_DrawSpectator();
CG_DrawCrosshair(NULL, 0);
CG_DrawCrosshairNames();
CG_SaberClashFlare();
} else {
// don't draw any status if dead or the scoreboard is being explicitly shown
if ( !cg.showScores && cg.snap->ps.stats[STAT_HEALTH] > 0 ) {

View file

@ -726,15 +726,69 @@ Throws specified debris from within a given bounding box in the world
#define DEBRIS_SPECIALCASE_CHUNKS -2
#define DEBRIS_SPECIALCASE_WOOD -3
#define DEBRIS_SPECIALCASE_GLASS -4
#define NUM_DEBRIS_MODELS_GLASS 8
#define NUM_DEBRIS_MODELS_WOOD 8
#define NUM_DEBRIS_MODELS_CHUNKS 3
#define NUM_DEBRIS_MODELS_ROCKS 4 //12
int dbModels_Glass[NUM_DEBRIS_MODELS_GLASS];
int dbModels_Wood[NUM_DEBRIS_MODELS_WOOD];
int dbModels_Chunks[NUM_DEBRIS_MODELS_CHUNKS];
int dbModels_Rocks[NUM_DEBRIS_MODELS_ROCKS];
void CG_CreateDebris(int entnum, vec3_t org, vec3_t mins, vec3_t maxs, int debrissound, int debrismodel)
{
vec3_t velocity, a, shardorg, dif, difx;
float windowmass;
float shardsthrow = 0;
char chunkname[256];
int rfact = 0;
int omodel = debrismodel;
if (omodel == DEBRIS_SPECIALCASE_GLASS && !dbModels_Glass[0])
{ //glass no longer exists, using it for metal.
dbModels_Glass[0] = trap_R_RegisterModel("models/chunks/metal/metal1_1.md3");
dbModels_Glass[1] = trap_R_RegisterModel("models/chunks/metal/metal1_2.md3");
dbModels_Glass[2] = trap_R_RegisterModel("models/chunks/metal/metal1_3.md3");
dbModels_Glass[3] = trap_R_RegisterModel("models/chunks/metal/metal1_4.md3");
dbModels_Glass[4] = trap_R_RegisterModel("models/chunks/metal/metal2_1.md3");
dbModels_Glass[5] = trap_R_RegisterModel("models/chunks/metal/metal2_2.md3");
dbModels_Glass[6] = trap_R_RegisterModel("models/chunks/metal/metal2_3.md3");
dbModels_Glass[7] = trap_R_RegisterModel("models/chunks/metal/metal2_4.md3");
}
if (omodel == DEBRIS_SPECIALCASE_WOOD && !dbModels_Wood[0])
{
dbModels_Wood[0] = trap_R_RegisterModel("models/chunks/crate/crate1_1.md3");
dbModels_Wood[1] = trap_R_RegisterModel("models/chunks/crate/crate1_2.md3");
dbModels_Wood[2] = trap_R_RegisterModel("models/chunks/crate/crate1_3.md3");
dbModels_Wood[3] = trap_R_RegisterModel("models/chunks/crate/crate1_4.md3");
dbModels_Wood[4] = trap_R_RegisterModel("models/chunks/crate/crate2_1.md3");
dbModels_Wood[5] = trap_R_RegisterModel("models/chunks/crate/crate2_2.md3");
dbModels_Wood[6] = trap_R_RegisterModel("models/chunks/crate/crate2_3.md3");
dbModels_Wood[7] = trap_R_RegisterModel("models/chunks/crate/crate2_4.md3");
}
if (omodel == DEBRIS_SPECIALCASE_CHUNKS && !dbModels_Chunks[0])
{
dbModels_Chunks[0] = trap_R_RegisterModel("models/chunks/generic/chunks_1.md3");
dbModels_Chunks[1] = trap_R_RegisterModel("models/chunks/generic/chunks_2.md3");
}
if (omodel == DEBRIS_SPECIALCASE_ROCK && !dbModels_Rocks[0])
{
dbModels_Rocks[0] = trap_R_RegisterModel("models/chunks/rock/rock1_1.md3");
dbModels_Rocks[1] = trap_R_RegisterModel("models/chunks/rock/rock1_2.md3");
dbModels_Rocks[2] = trap_R_RegisterModel("models/chunks/rock/rock1_3.md3");
dbModels_Rocks[3] = trap_R_RegisterModel("models/chunks/rock/rock1_4.md3");
/*
dbModels_Rocks[4] = trap_R_RegisterModel("models/chunks/rock/rock2_1.md3");
dbModels_Rocks[5] = trap_R_RegisterModel("models/chunks/rock/rock2_2.md3");
dbModels_Rocks[6] = trap_R_RegisterModel("models/chunks/rock/rock2_3.md3");
dbModels_Rocks[7] = trap_R_RegisterModel("models/chunks/rock/rock2_4.md3");
dbModels_Rocks[8] = trap_R_RegisterModel("models/chunks/rock/rock3_1.md3");
dbModels_Rocks[9] = trap_R_RegisterModel("models/chunks/rock/rock3_2.md3");
dbModels_Rocks[10] = trap_R_RegisterModel("models/chunks/rock/rock3_3.md3");
dbModels_Rocks[11] = trap_R_RegisterModel("models/chunks/rock/rock3_4.md3");
*/
}
VectorSubtract(maxs, mins, a);
windowmass = VectorLength(a); //should give us some idea of how big the chunk of glass is
@ -747,35 +801,19 @@ void CG_CreateDebris(int entnum, vec3_t org, vec3_t mins, vec3_t maxs, int debri
if (omodel == DEBRIS_SPECIALCASE_GLASS)
{
Com_sprintf(chunkname, sizeof(chunkname), "models/chunks/glass/glchunks_%i.md3", Q_irand(1, 6));
debrismodel = trap_R_RegisterModel(chunkname);
debrismodel = dbModels_Glass[Q_irand(0, NUM_DEBRIS_MODELS_GLASS-1)];
}
else if (omodel == DEBRIS_SPECIALCASE_WOOD)
{
Com_sprintf(chunkname, sizeof(chunkname), "models/chunks/generic/wood_%i.md3", Q_irand(1, 3));
debrismodel = trap_R_RegisterModel(chunkname);
debrismodel = dbModels_Wood[Q_irand(0, NUM_DEBRIS_MODELS_WOOD-1)];
}
else if (omodel == DEBRIS_SPECIALCASE_CHUNKS)
{
Com_sprintf(chunkname, sizeof(chunkname), "models/chunks/generic/chunks_%i.md3", Q_irand(1, 6));
debrismodel = trap_R_RegisterModel(chunkname);
debrismodel = dbModels_Chunks[Q_irand(0, NUM_DEBRIS_MODELS_CHUNKS-1)];
}
else if (omodel == DEBRIS_SPECIALCASE_ROCK)
{
rfact = Q_irand(1, 3);
if (rfact == 1)
{
Com_sprintf(chunkname, sizeof(chunkname), "models/chunks/rock/rock_small.md3");
}
else if (rfact == 2)
{
Com_sprintf(chunkname, sizeof(chunkname), "models/chunks/rock/rock_med.md3");
}
else
{
Com_sprintf(chunkname, sizeof(chunkname), "models/chunks/rock/rock_big.md3");
}
debrismodel = trap_R_RegisterModel(chunkname);
debrismodel = dbModels_Rocks[Q_irand(0, NUM_DEBRIS_MODELS_ROCKS-1)];
}
VectorCopy(org, shardorg);
@ -1158,168 +1196,3 @@ void CG_LaunchGib( vec3_t origin, vec3_t velocity, qhandle_t hModel ) {
le->leBounceSoundType = LEBS_BLOOD;
le->leMarkType = LEMT_BLOOD;
}
/*
===================
CG_GibPlayer
Generated a bunch of gibs launching out from the bodies location
===================
*/
#define GIB_VELOCITY 250
#define GIB_JUMP 250
void CG_GibPlayer( vec3_t playerOrigin ) {
vec3_t origin, velocity;
if ( !cg_blood.integer ) {
return;
}
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
if ( rand() & 1 ) {
// CG_LaunchGib( origin, velocity, cgs.media.gibSkull );
} else {
// CG_LaunchGib( origin, velocity, cgs.media.gibBrain );
}
// allow gibs to be turned off for speed
if ( !cg_gibs.integer ) {
return;
}
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibAbdomen );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibArm );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibChest );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibFist );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibFoot );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibForearm );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibIntestine );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibLeg );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*GIB_VELOCITY;
velocity[1] = crandom()*GIB_VELOCITY;
velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY;
// CG_LaunchGib( origin, velocity, cgs.media.gibLeg );
}
/*
==================
CG_LaunchGib
==================
*/
void CG_LaunchExplode( vec3_t origin, vec3_t velocity, qhandle_t hModel ) {
localEntity_t *le;
refEntity_t *re;
le = CG_AllocLocalEntity();
re = &le->refEntity;
le->leType = LE_FRAGMENT;
le->startTime = cg.time;
le->endTime = le->startTime + 10000 + random() * 6000;
VectorCopy( origin, re->origin );
AxisCopy( axisDefault, re->axis );
re->hModel = hModel;
le->pos.trType = TR_GRAVITY;
VectorCopy( origin, le->pos.trBase );
VectorCopy( velocity, le->pos.trDelta );
le->pos.trTime = cg.time;
le->bounceFactor = 0.1f;
le->leBounceSoundType = LEBS_BRASS;
le->leMarkType = LEMT_NONE;
}
#define EXP_VELOCITY 100
#define EXP_JUMP 150
/*
===================
CG_GibPlayer
Generated a bunch of gibs launching out from the bodies location
===================
*/
void CG_BigExplode( vec3_t playerOrigin ) {
vec3_t origin, velocity;
if ( !cg_blood.integer ) {
return;
}
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*EXP_VELOCITY;
velocity[1] = crandom()*EXP_VELOCITY;
velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY;
// CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*EXP_VELOCITY;
velocity[1] = crandom()*EXP_VELOCITY;
velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY;
// CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*EXP_VELOCITY*1.5;
velocity[1] = crandom()*EXP_VELOCITY*1.5;
velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY;
// CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*EXP_VELOCITY*2.0;
velocity[1] = crandom()*EXP_VELOCITY*2.0;
velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY;
// CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
VectorCopy( playerOrigin, origin );
velocity[0] = crandom()*EXP_VELOCITY*2.5;
velocity[1] = crandom()*EXP_VELOCITY*2.5;
velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY;
// CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
}

View file

@ -492,6 +492,7 @@ static void CG_General( centity_t *cent ) {
int beamID;
vec3_t beamOrg;
mdxaBone_t matrix;
qboolean doNotSetModel = qfalse;
if (cent->currentState.modelGhoul2 == 127)
{ //not ready to be drawn or initialized..
@ -512,8 +513,19 @@ static void CG_General( centity_t *cent ) {
cent->currentState.modelindex < MAX_CLIENTS &&
cent->currentState.weapon == G2_MODEL_PART)
{ //special case for client limbs
centity_t *clEnt = &cg_entities[cent->currentState.modelindex];
centity_t *clEnt;
int dismember_settings = cg_dismember.integer;
doNotSetModel = qtrue;
if (cent->currentState.modelindex >= 0)
{
clEnt = &cg_entities[cent->currentState.modelindex];
}
else
{
clEnt = &cg_entities[cent->currentState.modelindex2];
}
if (!dismember_settings)
{ //This client does not wish to see dismemberment.
@ -551,9 +563,8 @@ static void CG_General( centity_t *cent ) {
cent->bolt4 = -1;
cent->trailTime = 0;
switch (cent->currentState.modelGhoul2)
if (cent->currentState.modelGhoul2 == G2_MODELPART_HEAD)
{
case G2_MODELPART_HEAD:
limbBone = "cervical";
rotateBone = "cranium";
limbName = "head";
@ -562,8 +573,9 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*head_cap_torso";
stubTagName = "*torso_cap_head";
limb_anim = BOTH_DISMEMBER_HEAD1;
break;
case G2_MODELPART_WAIST:
}
else if (cent->currentState.modelGhoul2 == G2_MODELPART_WAIST)
{
limbBone = "pelvis";
rotateBone = "thoracic";
limbName = "torso";
@ -572,8 +584,9 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*torso_cap_hips";
stubTagName = "*hips_cap_torso";
limb_anim = BOTH_DISMEMBER_TORSO1;
break;
case G2_MODELPART_LARM:
}
else if (cent->currentState.modelGhoul2 == G2_MODELPART_LARM)
{
limbBone = "lhumerus";
rotateBone = "lradius";
limbName = "l_arm";
@ -582,8 +595,9 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*l_arm_cap_torso";
stubTagName = "*torso_cap_l_arm";
limb_anim = BOTH_DISMEMBER_LARM;
break;
case G2_MODELPART_RARM:
}
else if (cent->currentState.modelGhoul2 == G2_MODELPART_RARM)
{
limbBone = "rhumerus";
rotateBone = "rradius";
limbName = "r_arm";
@ -592,8 +606,20 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*r_arm_cap_torso";
stubTagName = "*torso_cap_r_arm";
limb_anim = BOTH_DISMEMBER_RARM;
break;
case G2_MODELPART_LLEG:
}
else if (cent->currentState.modelGhoul2 == G2_MODELPART_RHAND)
{
limbBone = "rradiusX";
rotateBone = "rhand";
limbName = "r_hand";
limbCapName = "r_hand_cap_r_arm_off";
stubCapName = "r_arm_cap_r_hand_off";
limbTagName = "*r_hand_cap_r_arm";
stubTagName = "*r_arm_cap_r_hand";
limb_anim = BOTH_DISMEMBER_RARM;
}
else if (cent->currentState.modelGhoul2 == G2_MODELPART_LLEG)
{
limbBone = "lfemurYZ";
rotateBone = "ltibia";
limbName = "l_leg";
@ -602,8 +628,9 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*l_leg_cap_hips";
stubTagName = "*hips_cap_l_leg";
limb_anim = BOTH_DISMEMBER_LLEG;
break;
case G2_MODELPART_RLEG:
}
else if (cent->currentState.modelGhoul2 == G2_MODELPART_RLEG)
{
limbBone = "rfemurYZ";
rotateBone = "rtibia";
limbName = "r_leg";
@ -612,8 +639,9 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*r_leg_cap_hips";
stubTagName = "*hips_cap_r_leg";
limb_anim = BOTH_DISMEMBER_RLEG;
break;
default:
}
else
{
limbBone = "rfemurYZ";
rotateBone = "rtibia";
limbName = "r_leg";
@ -622,7 +650,6 @@ static void CG_General( centity_t *cent ) {
limbTagName = "*r_leg_cap_hips";
stubTagName = "*hips_cap_r_leg";
limb_anim = BOTH_DISMEMBER_RLEG;
break;
}
if (clEnt && clEnt->ghoul2)
@ -632,28 +659,35 @@ static void CG_General( centity_t *cent ) {
int flags=BONE_ANIM_OVERRIDE_FREEZE;
clientInfo_t *ci;
ci = &cgs.clientinfo[ clEnt->currentState.number ];
if (clEnt->currentState.number < MAX_CLIENTS)
{
ci = &cgs.clientinfo[ clEnt->currentState.number ];
}
else
{
ci = NULL;
}
if (ci)
{
/*
if (cent->currentState.modelGhoul2 == G2_MODELPART_WAIST)
{
anim = &ci->animations[ cent->currentState.modelindex2 ];
}
else
*/
{
anim = &bgGlobalAnimations[ limb_anim ];
}
//anim = &bgGlobalAnimations[ limb_anim ];
//I guess it looks better to continue the body anim on the severed limb. If not a bit strange. It's what
//SP seems to do anyway.
anim = &bgGlobalAnimations[ (clEnt->currentState.torsoAnim&~ANIM_TOGGLEBIT) ];
}
else
{ //a g2anim ent, maybe? For those, we can settle for generic limb anims.
anim = &bgGlobalAnimations[ limb_anim ];
}
trap_G2API_DuplicateGhoul2Instance(clEnt->ghoul2, &cent->ghoul2);
if (anim)
{
int aNum;
animSpeed = 50.0f / anim->frameLerp;
/*
if (cent->currentState.modelGhoul2 == G2_MODELPART_WAIST)
{
trap_G2API_SetBoneAnim(cent->ghoul2, 0, "upper_lumbar", anim->firstFrame, anim->firstFrame + anim->numFrames, flags, animSpeed, cg.time, -1, 0);
@ -664,6 +698,31 @@ static void CG_General( centity_t *cent ) {
trap_G2API_SetBoneAnim(cent->ghoul2, 0, "upper_lumbar", anim->firstFrame + anim->numFrames-1, anim->firstFrame + anim->numFrames, flags, animSpeed, cg.time, -1, 0);
trap_G2API_SetBoneAnim(cent->ghoul2, 0, "model_root", anim->firstFrame + anim->numFrames-1, anim->firstFrame + anim->numFrames, flags, animSpeed, cg.time, -1, 0);
}
*/
//I guess it looks better to continue the body anim on the severed limb. If not a bit strange. It's what
//SP seems to do anyway.
if (ci)
{
aNum = ci->frame+1;
while (aNum >= anim->firstFrame+anim->numFrames)
{
aNum--;
}
if (aNum < anim->firstFrame-1)
{ //wrong animation...?
aNum = (anim->firstFrame+anim->numFrames)-1;
}
}
else
{
aNum = anim->firstFrame;
}
trap_G2API_SetBoneAnim(cent->ghoul2, 0, "upper_lumbar", aNum, anim->firstFrame + anim->numFrames, flags, animSpeed, cg.time, -1, 150);
trap_G2API_SetBoneAnim(cent->ghoul2, 0, "model_root", aNum, anim->firstFrame + anim->numFrames, flags, animSpeed, cg.time, -1, 150);
trap_G2API_SetBoneAnim(cent->ghoul2, 0, "Motion", aNum, anim->firstFrame + anim->numFrames, flags, animSpeed, cg.time, -1, 150);
}
}
@ -709,7 +768,7 @@ static void CG_General( centity_t *cent ) {
trap_FX_PlayEffectID(trap_FX_RegisterEffect("blaster/smoke_bolton"), boltOrg, boltAng);
}
if (cent->currentState.modelGhoul2 == G2_MODELPART_RARM || cent->currentState.modelGhoul2 == G2_MODELPART_WAIST)
if (cent->currentState.modelGhoul2 == G2_MODELPART_RARM || cent->currentState.modelGhoul2 == G2_MODELPART_RHAND || cent->currentState.modelGhoul2 == G2_MODELPART_WAIST)
{ //Cut his weapon holding arm off, so remove the weapon
if (trap_G2API_HasGhoul2ModelOnIndex(&(clEnt->ghoul2), 1))
{
@ -989,7 +1048,7 @@ Ghoul2 Insert End
VectorCopy( cg.autoAngles, cent->lerpAngles );
AxisCopy( cg.autoAxis, ent.axis );
}
else
else if (!doNotSetModel)
{
ent.hModel = cgs.gameModels[s1->modelindex];
}
@ -1076,6 +1135,13 @@ Ghoul2 Insert End
cent->dustTrailTime = 0;
}
if (cent->currentState.modelGhoul2 &&
!ent.ghoul2 &&
!ent.hModel)
{
return;
}
// add to refresh list
trap_R_AddRefEntityToScene (&ent);
@ -2294,10 +2360,16 @@ static void CG_TeamBase( centity_t *cent ) {
else {
model.hModel = cgs.media.neutralFlagBaseModel;
}
trap_R_AddRefEntityToScene( &model );
if (cent->currentState.eType != ET_GRAPPLE)
{ //do not do this for g2animents
trap_R_AddRefEntityToScene( &model );
}
}
}
void CG_G2Animated( centity_t *cent );
/*
===============
CG_AddCEntity
@ -2366,6 +2438,8 @@ Ghoul2 Insert End
case ET_SPEAKER:
CG_Speaker( cent );
break;
case ET_GRAPPLE: //An entity that wants to be able to use ghoul2 humanoid anims. Like a player, but not.
CG_G2Animated( cent );
case ET_TEAM:
CG_TeamBase( cent );
break;

View file

@ -640,6 +640,10 @@ void CG_ReattachLimb(centity_t *source)
limbName = "r_arm";
stubCapName = "torso_cap_r_arm_off";
break;
case G2_MODELPART_RHAND:
limbName = "r_hand";
stubCapName = "r_arm_cap_r_hand_off";
break;
case G2_MODELPART_LLEG:
limbName = "l_leg";
stubCapName = "hips_cap_l_leg_off";
@ -649,9 +653,9 @@ void CG_ReattachLimb(centity_t *source)
stubCapName = "hips_cap_r_leg_off";
break;
default:
limbName = "r_leg";
stubCapName = "hips_cap_r_leg_off";
break;
source->torsoBolt = 0;
source->ghoul2weapon = NULL;
return;
}
trap_G2API_SetSurfaceOnOff(source->ghoul2, limbName, 0);
@ -1014,7 +1018,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
cl_ent->isATST = 0;
cl_ent->atstFootClang = 0;
cl_ent->atstSwinging = 0;
cl_ent->torsoBolt = 0;
// cl_ent->torsoBolt = 0;
cl_ent->bolt1 = 0;
cl_ent->bolt2 = 0;
cl_ent->bolt3 = 0;
@ -1231,7 +1235,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
const char *strText = CG_GetStripEdString("INGAMETEXT", "PICKUPLINE");
//Com_Printf("%s %s\n", strText, showPowersName[index]);
CG_CenterPrint( va("%s %s\n", strText, showPowersName[index]), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH );
CG_CenterPrint( va("%s %s\n", strText, CG_GetStripEdString("INGAME",showPowersName[index])), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH );
}
//Show the player their force selection bar in case picking the holocron up changed the current selection
@ -1340,7 +1344,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
break;
case EV_FIRE_WEAPON:
DEBUGNAME("EV_FIRE_WEAPON");
if (cent->currentState.number >= MAX_CLIENTS)
if (cent->currentState.number >= MAX_CLIENTS && cent->currentState.eType != ET_GRAPPLE)
{ //special case for turret firing
vec3_t gunpoint, gunangle;
mdxaBone_t matrix;
@ -1431,7 +1435,23 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
case EV_SABER_HIT:
DEBUGNAME("EV_SABER_HIT");
if (es->eventParm)
if (es->eventParm == 16)
{ //Make lots of sparks, something special happened
vec3_t fxDir;
VectorCopy(es->angles, fxDir);
if (!fxDir[0] && !fxDir[1] && !fxDir[2])
{
fxDir[1] = 1;
}
trap_S_StartSound(es->origin, es->number, CHAN_AUTO, trap_S_RegisterSound("sound/weapons/saber/saberhit.wav"));
trap_FX_PlayEffectID( trap_FX_RegisterEffect("saber/blood_sparks.efx"), es->origin, fxDir );
trap_FX_PlayEffectID( trap_FX_RegisterEffect("saber/blood_sparks.efx"), es->origin, fxDir );
trap_FX_PlayEffectID( trap_FX_RegisterEffect("saber/blood_sparks.efx"), es->origin, fxDir );
trap_FX_PlayEffectID( trap_FX_RegisterEffect("saber/blood_sparks.efx"), es->origin, fxDir );
trap_FX_PlayEffectID( trap_FX_RegisterEffect("saber/blood_sparks.efx"), es->origin, fxDir );
trap_FX_PlayEffectID( trap_FX_RegisterEffect("saber/blood_sparks.efx"), es->origin, fxDir );
}
else if (es->eventParm)
{ //hit a person
vec3_t fxDir;
VectorCopy(es->angles, fxDir);
@ -1611,6 +1631,13 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
break;
case PDSOUND_ABSORBHIT:
sID = trap_S_RegisterSound("sound/weapons/force/absorbhit.mp3");
if (es->trickedentindex >= 0 && es->trickedentindex < MAX_CLIENTS)
{
int clnum = es->trickedentindex;
cg_entities[clnum].teamPowerEffectTime = cg.time + 1000;
cg_entities[clnum].teamPowerType = 3;
}
break;
case PDSOUND_ABSORB:
sID = trap_S_RegisterSound("sound/weapons/force/absorb.mp3");
@ -2265,7 +2292,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
case EV_GIB_PLAYER:
DEBUGNAME("EV_GIB_PLAYER");
//trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound );
CG_GibPlayer( cent->lerpOrigin );
//CG_GibPlayer( cent->lerpOrigin );
break;
case EV_STARTLOOPINGSOUND:

View file

@ -106,6 +106,7 @@ void CG_DrawInformation( void ) {
int value, valueNOFP;
qhandle_t levelshot;
char buf[1024];
int iPropHeight = 18; // I know, this is total crap, but as a post release asian-hack.... -Ste
info = CG_ConfigString( CS_SERVERINFO );
sysInfo = CG_ConfigString( CS_SYSTEMINFO );
@ -147,14 +148,15 @@ void CG_DrawInformation( void ) {
Q_CleanStr(buf);
UI_DrawProportionalString( 320, y, buf,
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
// pure server
s = Info_ValueForKey( sysInfo, "sv_pure" );
if ( s[0] == '1' ) {
UI_DrawProportionalString( 320, y, "Pure Server",
const char *psPure = CG_GetStripEdString("INGAMETEXT", "PURE_SERVER");
UI_DrawProportionalString( 320, y, psPure,
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
// server-specific message of the day
@ -162,7 +164,7 @@ void CG_DrawInformation( void ) {
if ( s[0] ) {
UI_DrawProportionalString( 320, y, s,
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
// some extra space after hostname and motd
@ -174,7 +176,7 @@ void CG_DrawInformation( void ) {
if ( s[0] ) {
UI_DrawProportionalString( 320, y, s,
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
// cheats warning
@ -182,7 +184,7 @@ void CG_DrawInformation( void ) {
if ( s[0] == '1' ) {
UI_DrawProportionalString( 320, y, CG_GetStripEdString("INGAMETEXT", "CHEATSAREENABLED"),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
// game type
@ -220,13 +222,13 @@ void CG_DrawInformation( void ) {
}
UI_DrawProportionalString( 320, y, s,
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
value = atoi( Info_ValueForKey( info, "timelimit" ) );
if ( value ) {
UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStripEdString("INGAMETEXT", "TIMELIMIT"), value ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
if (cgs.gametype < GT_CTF ) {
@ -234,7 +236,7 @@ void CG_DrawInformation( void ) {
if ( value ) {
UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStripEdString("INGAMETEXT", "FRAGLIMIT"), value ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
if (cgs.gametype == GT_TOURNAMENT)
@ -243,7 +245,7 @@ void CG_DrawInformation( void ) {
if ( value ) {
UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStripEdString("INGAMETEXT", "WINLIMIT"), value ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
}
}
@ -253,7 +255,7 @@ void CG_DrawInformation( void ) {
if ( value ) {
UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStripEdString("INGAMETEXT", "CAPTURELIMIT"), value ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
}
@ -263,7 +265,7 @@ void CG_DrawInformation( void ) {
if ( value ) {
UI_DrawProportionalString( 320, y, CG_GetStripEdString("INGAMETEXT", "FORCEBASEDTEAMS"),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
}
@ -277,7 +279,7 @@ void CG_DrawInformation( void ) {
UI_DrawProportionalString( 320, y, va( "%s %s", fmStr, CG_GetStripEdString("INGAMETEXT", forceMasteryLevels[value]) ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
else if (!valueNOFP)
{
@ -286,7 +288,7 @@ void CG_DrawInformation( void ) {
UI_DrawProportionalString( 320, y, va( "%s %s", fmStr, (char *)CG_GetStripEdString("INGAMETEXT", forceMasteryLevels[7]) ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
if (cgs.gametype == GT_TOURNAMENT)
@ -300,75 +302,75 @@ void CG_DrawInformation( void ) {
if ( cgs.gametype != GT_JEDIMASTER && value ) {
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "SABERONLYSET") ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
if ( valueNOFP ) {
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "NOFPSET") ),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
}
// Display the rules based on type
y += PROP_HEIGHT;
y += iPropHeight;
switch ( cgs.gametype ) {
case GT_FFA:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_FFA_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
case GT_HOLOCRON:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_HOLO_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_HOLO_2")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
case GT_JEDIMASTER:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_JEDI_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_JEDI_2")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
case GT_SINGLE_PLAYER:
break;
case GT_TOURNAMENT:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_DUEL_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_DUEL_2")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
case GT_TEAM:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_TEAM_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_TEAM_2")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
case GT_SAGA:
break;
case GT_CTF:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_CTF_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_CTF_2")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
case GT_CTY:
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_CTY_1")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStripEdString("INGAMETEXT", "RULES_CTY_2")),
UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite );
y += PROP_HEIGHT;
y += iPropHeight;
break;
default:
break;

View file

@ -76,9 +76,8 @@
#define TEAM_OVERLAY_MAXNAME_WIDTH 12
#define TEAM_OVERLAY_MAXLOCATION_WIDTH 16
#define DEFAULT_MODEL "kyle/default"
#define DEFAULT_TEAM_MODEL "kyle/default"
#define DEFAULT_TEAM_HEAD "kyle/default"
#define DEFAULT_MODEL "kyle"
#define DEFAULT_TEAM_MODEL "kyle"
#define DEFAULT_FORCEPOWERS "5-1-000000000000000000"
//"rank-side-heal.lev.speed.push.pull.tele.grip.lightning.rage.protect.absorb.teamheal.teamforce.drain.see"
@ -236,7 +235,7 @@ typedef struct centity_s {
int trickAlphaTime;
int teamPowerEffectTime;
qboolean teamPowerType; //0 regen, 1 heal, 2 drain
qboolean teamPowerType; //0 regen, 1 heal, 2 drain, 3 absorb
} centity_t;
@ -957,9 +956,9 @@ typedef struct {
qhandle_t teamRedShader;
qhandle_t teamBlueShader;
qhandle_t balloonShader;
qhandle_t connectionShader;
qhandle_t selectShader;
qhandle_t viewBloodShader;
qhandle_t tracerShader;
qhandle_t crosshairShader[NUM_CROSSHAIRS];
@ -968,9 +967,6 @@ typedef struct {
qhandle_t noammoShader;
qhandle_t smokePuffShader;
qhandle_t smokePuffRageProShader;
qhandle_t shotgunSmokePuffShader;
qhandle_t plasmaBallShader;
qhandle_t waterBubbleShader;
qhandle_t bloodTrailShader;
@ -1414,7 +1410,6 @@ extern vmCvar_t cg_bobpitch;
extern vmCvar_t cg_bobroll;
//extern vmCvar_t cg_swingSpeed;
extern vmCvar_t cg_shadows;
extern vmCvar_t cg_gibs;
extern vmCvar_t cg_drawTimer;
extern vmCvar_t cg_drawFPS;
extern vmCvar_t cg_drawSnapshot;
@ -1461,9 +1456,15 @@ extern vmCvar_t cg_zoomFov;
extern vmCvar_t cg_swingAngles;
#ifdef G2_COLLISION_ENABLED
extern vmCvar_t cg_saberModelTraceEffect;
#endif
extern vmCvar_t cg_saberContact;
extern vmCvar_t cg_saberTrail;
extern vmCvar_t cg_duelHeadAngles;
extern vmCvar_t cg_speedTrail;
extern vmCvar_t cg_auraShell;
@ -1789,9 +1790,6 @@ void CG_GlassShatter(int entnum, vec3_t dmgPt, vec3_t dmgDir, float dmgRadius, i
void CG_CreateDebris(int entnum, vec3_t org, vec3_t mins, vec3_t maxs, int debrissound, int debrismodel);
void CG_ScorePlum( int client, vec3_t org, int score );
void CG_GibPlayer( vec3_t playerOrigin );
void CG_BigExplode( vec3_t playerOrigin );
void CG_Bleed( vec3_t origin, int entityNum );
localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir,
@ -1964,7 +1962,9 @@ int trap_R_Font_StrLenPixels(const char *text, const int iFontIndex, const flo
int trap_R_Font_StrLenChars(const char *text);
int trap_R_Font_HeightPixels(const int iFontIndex, const float scale);
void trap_R_Font_DrawString(int ox, int oy, const char *text, const float *rgba, const int setIndex, int iCharLimit, const float scale);
unsigned trap_AnyLanguage_ReadCharFromString( const char **ppText );
qboolean trap_Language_IsAsian(void);
qboolean trap_Language_UsesSpaces(void);
unsigned trap_AnyLanguage_ReadCharFromString( const char *psText, int *piAdvanceCount, qboolean *pbIsTrailingPunctuation/* = NULL*/ );
// a scene is built up by calls to R_ClearScene and the various R_Add functions.
@ -2171,6 +2171,8 @@ void FX_BlasterWeaponHitWall( vec3_t origin, vec3_t normal );
void FX_BlasterWeaponHitPlayer( vec3_t origin, vec3_t normal, qboolean humanoid );
void trap_G2API_CollisionDetect ( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position,int frameNumber, int entNum, const vec3_t rayStart, const vec3_t rayEnd, const vec3_t scale, int traceFlags, int useLod, float fRadius );
/*
Ghoul2 Insert Start
@ -2184,6 +2186,8 @@ qboolean trap_G2API_GetBoltMatrix(void *ghoul2, const int modelIndex, const int
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale);
qboolean trap_G2API_GetBoltMatrix_NoReconstruct(void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix,
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale);
qboolean trap_G2API_GetBoltMatrix_NoRecNoRot(void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix,
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale);
int trap_G2API_InitGhoul2Model(void **ghoul2Ptr, const char *fileName, int modelIndex, qhandle_t customSkin,
qhandle_t customShader, int modelFlags, int lodBias);

View file

@ -365,7 +365,6 @@ vmCvar_t cg_bobpitch;
vmCvar_t cg_bobroll;
//vmCvar_t cg_swingSpeed;
vmCvar_t cg_shadows;
vmCvar_t cg_gibs;
vmCvar_t cg_drawTimer;
vmCvar_t cg_drawFPS;
vmCvar_t cg_drawSnapshot;
@ -411,9 +410,15 @@ vmCvar_t cg_zoomFov;
vmCvar_t cg_swingAngles;
#ifdef G2_COLLISION_ENABLED
vmCvar_t cg_saberModelTraceEffect;
#endif
vmCvar_t cg_saberContact;
vmCvar_t cg_saberTrail;
vmCvar_t cg_duelHeadAngles;
vmCvar_t cg_speedTrail;
vmCvar_t cg_auraShell;
@ -505,7 +510,6 @@ static cvarTable_t cvarTable[] = { // bk001129
{ &cg_viewsize, "cg_viewsize", "100", CVAR_ARCHIVE },
{ &cg_stereoSeparation, "cg_stereoSeparation", "0.4", CVAR_ARCHIVE },
{ &cg_shadows, "cg_shadows", "1", CVAR_ARCHIVE },
{ &cg_gibs, "cg_gibs", "1", CVAR_ARCHIVE },
{ &cg_draw2D, "cg_draw2D", "1", CVAR_ARCHIVE },
{ &cg_drawStatus, "cg_drawStatus", "1", CVAR_ARCHIVE },
{ &cg_drawTimer, "cg_drawTimer", "0", CVAR_ARCHIVE },
@ -553,15 +557,21 @@ static cvarTable_t cvarTable[] = { // bk001129
{ &cg_swingAngles, "cg_swingAngles", "1", 0 },
#ifdef G2_COLLISION_ENABLED
{ &cg_saberModelTraceEffect, "cg_saberModelTraceEffect", "0", 0 },
#endif
{ &cg_saberContact, "cg_saberContact", "1", 0 },
{ &cg_saberTrail, "cg_saberTrail", "1", 0 },
{ &cg_duelHeadAngles, "cg_duelHeadAngles", "0", 0 },
{ &cg_speedTrail, "cg_speedTrail", "1", 0 },
{ &cg_auraShell, "cg_auraShell", "1", 0 },
{ &cg_animBlend, "cg_animBlend", "1", 0 },
{ &cg_dismember, "cg_dismember", "0", 0 },
{ &cg_dismember, "cg_dismember", "0", CVAR_ARCHIVE },
{ &cg_thirdPerson, "cg_thirdPerson", "0", 0 },
{ &cg_thirdPersonRange, "cg_thirdPersonRange", "80", CVAR_CHEAT },
@ -1267,22 +1277,20 @@ static void CG_RegisterGraphics( void ) {
cgs.media.chunkyNumberShaders[i] = trap_R_RegisterShaderNoMip( sb_c_nums[i] );
}
cgs.media.balloonShader = trap_R_RegisterShader( "gfx/mp/chat_icon" );
cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" );
cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" );
cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" );
cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" );
cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" );
cgs.media.plasmaBallShader = trap_R_RegisterShader( "sprites/plasma1" );
cgs.media.bloodTrailShader = trap_R_RegisterShader( "bloodTrail" );
cgs.media.lagometerShader = trap_R_RegisterShader("gfx/2d/lag" );
cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" );
cgs.media.lagometerShader = trap_R_RegisterShaderNoMip("gfx/2d/lag" );
cgs.media.connectionShader = trap_R_RegisterShaderNoMip( "gfx/2d/net" );
cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" );
cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" );
cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" );
Com_Printf( S_COLOR_CYAN "---------- Fx System Initialization ---------\n" );
trap_FX_InitSystem();
@ -2005,14 +2013,15 @@ static clientInfo_t * CG_InfoFromScoreIndex(int index, int team, int *scoreIndex
return &cgs.clientinfo[ cg.scores[index].client ];
}
static const char *CG_FeederItemText(float feederID, int index, int column, qhandle_t *handle) {
static const char *CG_FeederItemText(float feederID, int index, int column,
qhandle_t *handle1, qhandle_t *handle2, qhandle_t *handle3) {
gitem_t *item;
int scoreIndex = 0;
clientInfo_t *info = NULL;
int team = -1;
score_t *sp = NULL;
*handle = -1;
*handle1 = *handle2 = *handle3 = -1;
if (feederID == FEEDER_REDTEAM_LIST) {
team = TEAM_RED;
@ -2028,17 +2037,17 @@ static const char *CG_FeederItemText(float feederID, int index, int column, qhan
case 0:
if ( info->powerups & ( 1 << PW_NEUTRALFLAG ) ) {
item = BG_FindItemForPowerup( PW_NEUTRALFLAG );
*handle = cg_items[ ITEM_INDEX(item) ].icon;
*handle1 = cg_items[ ITEM_INDEX(item) ].icon;
} else if ( info->powerups & ( 1 << PW_REDFLAG ) ) {
item = BG_FindItemForPowerup( PW_REDFLAG );
*handle = cg_items[ ITEM_INDEX(item) ].icon;
*handle1 = cg_items[ ITEM_INDEX(item) ].icon;
} else if ( info->powerups & ( 1 << PW_BLUEFLAG ) ) {
item = BG_FindItemForPowerup( PW_BLUEFLAG );
*handle = cg_items[ ITEM_INDEX(item) ].icon;
*handle1 = cg_items[ ITEM_INDEX(item) ].icon;
} else {
/*
if ( info->botSkill > 0 && info->botSkill <= 5 ) {
*handle = cgs.media.botSkillShaders[ info->botSkill - 1 ];
*handle1 = cgs.media.botSkillShaders[ info->botSkill - 1 ];
} else if ( info->handicap < 100 ) {
return va("%i", info->handicap );
}
@ -2049,7 +2058,7 @@ static const char *CG_FeederItemText(float feederID, int index, int column, qhan
if (team == -1) {
return "";
} else {
*handle = CG_StatusHandle(info->teamTask);
*handle1 = CG_StatusHandle(info->teamTask);
}
break;
case 2:
@ -2194,6 +2203,8 @@ void CG_LoadHudMenu()
cgDC.Font_StrLenChars = &trap_R_Font_StrLenChars;
cgDC.Font_HeightPixels = &trap_R_Font_HeightPixels;
cgDC.Font_DrawString = &trap_R_Font_DrawString;
cgDC.Language_IsAsian = &trap_Language_IsAsian;
cgDC.Language_UsesSpaces = &trap_Language_UsesSpaces;
cgDC.AnyLanguage_ReadCharFromString = &trap_AnyLanguage_ReadCharFromString;
cgDC.ownerDrawItem = &CG_OwnerDraw;
cgDC.getValue = &CG_GetValue;

View file

@ -379,6 +379,8 @@ extern int MenuFontToHandle(int iMenuFont);
//
static void CG_Text_Paint_Limit(float *maxX, float x, float y, float scale, vec4_t color, const char* text, float adjust, int limit, int iMenuFont)
{
qboolean bIsTrailingPunctuation;
// this is kinda dirty, but...
//
int iFontIndex = MenuFontToHandle(iMenuFont);
@ -400,9 +402,12 @@ static void CG_Text_Paint_Limit(float *maxX, float x, float y, float scale, vec4
&& psOut < &sTemp[sizeof(sTemp)-1] // sanity
)
{
psOutLastGood = psOut;
uiLetter = trap_AnyLanguage_ReadCharFromString(&psText);
int iAdvanceCount;
psOutLastGood = psOut;
uiLetter = trap_AnyLanguage_ReadCharFromString(psText, &iAdvanceCount, &bIsTrailingPunctuation);
psText += iAdvanceCount;
if (uiLetter > 255)
{
*psOut++ = uiLetter>>8;
@ -967,7 +972,7 @@ void CG_KeyEvent(int key, qboolean down) {
if (cgs.capturedItem) {
cgs.capturedItem = NULL;
} else {
if (key == K_MOUSE2 && down) {
if (key == A_MOUSE2 && down) {
cgs.capturedItem = Display_CaptureItem(cgs.cursorX, cgs.cursorY);
}
}

File diff suppressed because it is too large Load diff

View file

@ -49,7 +49,7 @@ functions imported from the main executable
==================================================================
*/
#define CGAME_IMPORT_API_VERSION 4
#define CGAME_IMPORT_API_VERSION 5
typedef enum {
CG_PRINT = 0,
@ -104,6 +104,8 @@ typedef enum {
CG_R_FONT_STRLENCHARS,
CG_R_FONT_STRHEIGHTPIXELS,
CG_R_FONT_DRAWSTRING,
CG_LANGUAGE_ISASIAN,
CG_LANGUAGE_USESSPACES,
CG_ANYLANGUAGE_READCHARFROMSTRING,
CGAME_MEMSET = 100,
@ -216,7 +218,9 @@ Ghoul2 Insert Start
CG_G2_GIVEMEVECTORFROMMATRIX,
CG_G2_GETBOLT,
CG_G2_GETBOLT_NOREC,
CG_G2_GETBOLT_NOREC_NOROT,
CG_G2_INITGHOUL2MODEL,
CG_G2_COLLISIONDETECT,
CG_G2_CLEANMODELS,
CG_G2_ANGLEOVERRIDE,
CG_G2_PLAYANIM,

View file

@ -173,7 +173,7 @@ static void CG_DrawClientScore( int y, score_t *score, float *color, float fade,
// add the "ready" marker for intermission exiting
if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << score->client ) )
{
CG_Text_Paint (SB_NAME_X - 64, y + 2, 0.7f * scale, colorWhite, "READY" ,0, 0, ITEM_TEXTSTYLE_OUTLINED, FONT_MEDIUM );
CG_Text_Paint (SB_NAME_X - 64, y + 2, 0.7f * scale, colorWhite, CG_GetStripEdString("INGAMETEXT", "READY"),0, 0, ITEM_TEXTSTYLE_OUTLINED, FONT_MEDIUM );
}
}
@ -257,11 +257,6 @@ qboolean CG_DrawOldScoreboard( void ) {
return qfalse;
}
if ( cgs.gametype == GT_SINGLE_PLAYER && cg.predictedPlayerState.pm_type == PM_INTERMISSION ) {
cg.deferredPlayerLoading = 0;
return qfalse;
}
// don't draw scoreboard during death while warmup up
if ( cg.warmup && !cg.showScores ) {
return qfalse;
@ -371,7 +366,10 @@ qboolean CG_DrawOldScoreboard( void ) {
CG_Text_Paint ( SB_NAME_X, y, 1.0f, colorWhite, "Name", 0, 0, ITEM_TEXTSTYLE_OUTLINED, FONT_MEDIUM );
if (cgs.gametype == GT_TOURNAMENT)
{
CG_Text_Paint ( SB_SCORE_X, y, 1.0f, colorWhite, "W/L", 0, 0, ITEM_TEXTSTYLE_OUTLINED, FONT_MEDIUM );
char sWL[100];
trap_SP_GetStringTextString("INGAMETEXT_W_L", sWL, sizeof(sWL));
CG_Text_Paint ( SB_SCORE_X, y, 1.0f, colorWhite, sWL, 0, 0, ITEM_TEXTSTYLE_OUTLINED, FONT_MEDIUM );
}
else
{

View file

@ -61,6 +61,8 @@ static void CG_ParseScores( void ) {
cg.numScores = MAX_CLIENTS;
}
cg.numScores = readScores;
cg.teamScores[0] = atoi( CG_Argv( 2 ) );
cg.teamScores[1] = atoi( CG_Argv( 3 ) );
@ -525,7 +527,7 @@ void CG_KillCEntityInstances()
cg_entities[i].frame_minus2_refreshed = 0;
cg_entities[i].dustTrailTime = 0;
cg_entities[i].ghoul2weapon = NULL;
cg_entities[i].torsoBolt = 0;
// cg_entities[i].torsoBolt = 0;
cg_entities[i].trailTime = 0;
cg_entities[i].frame_hold_time = 0;
cg_entities[i].frame_hold_refreshed = 0;

View file

@ -52,7 +52,9 @@ equ trap_R_Font_StrLenPixels -49 ; CG_R_FONT_STRLENPIXELS
equ trap_R_Font_StrLenChars -50 ; CG_R_FONT_STRLENCHARS
equ trap_R_Font_HeightPixels -51 ; CG_R_FONT_STRHEIGHTPIXELS
equ trap_R_Font_DrawString -52 ; CG_R_FONT_DRAWSTRING
equ trap_AnyLanguage_ReadCharFromString -53 ; CG_ANYLANGUAGE_READCHARFROMSTRING
equ trap_Language_IsAsian -53 ; CG_LANGUAGE_ISASIAN
equ trap_Language_UsesSpaces -54 ; CG_LANGUAGE_USESSPACES
equ trap_AnyLanguage_ReadCharFromString -55 ; CG_ANYLANGUAGE_READCHARFROMSTRING
equ trap_R_ClearScene -201 ; CG_R_CLEARSCENE
equ trap_R_AddRefEntityToScene -202 ; CG_R_ADDREFENTITYTOSCENE
equ trap_R_AddPolyToScene -203 ; CG_R_ADDPOLYTOSCENE
@ -136,22 +138,24 @@ equ trap_G2_HaveWeGhoul2Models -282 ; CG_G2_HAVEWEGHOULMODELS
equ trap_G2API_GiveMeVectorFromMatrix -283 ; CG_G2_GIVEMEVECTORFROMMATRIX
equ trap_G2API_GetBoltMatrix -284 ; CG_G2_GETBOLT
equ trap_G2API_GetBoltMatrix_NoReconstruct -285 ; CG_G2_GETBOLT_NOREC
equ trap_G2API_InitGhoul2Model -286 ; CG_G2_INITGHOUL2MODEL
equ trap_G2API_CleanGhoul2Models -287 ; CG_G2_CLEANMODELS
equ trap_G2API_SetBoneAngles -288 ; CG_G2_ANGLEOVERRIDE
equ trap_G2API_SetBoneAnim -289 ; CG_G2_PLAYANIM
equ trap_G2API_GetGLAName -290 ; CG_G2_GETGLANAME
equ trap_G2API_CopyGhoul2Instance -291 ; CG_G2_COPYGHOUL2INSTANCE
equ trap_G2API_CopySpecificGhoul2Model -292 ; CG_G2_COPYSPECIFICGHOUL2MODEL
equ trap_G2API_DuplicateGhoul2Instance -293 ; CG_G2_DUPLICATEGHOUL2INSTANCE
equ trap_G2API_HasGhoul2ModelOnIndex -294 ; CG_G2_HASGHOUL2MODELONINDEX
equ trap_G2API_RemoveGhoul2Model -295 ; CG_G2_REMOVEGHOUL2MODEL
equ trap_G2API_AddBolt -296 ; CG_G2_ADDBOLT
equ trap_G2API_SetBoltInfo -297 ; CG_G2_SETBOLTON
equ trap_G2API_SetRootSurface -298 ; CG_G2_SETROOTSURFACE
equ trap_G2API_SetSurfaceOnOff -299 ; CG_G2_SETSURFACEONOFF
equ trap_G2API_SetNewOrigin -300 ; CG_G2_SETNEWORIGIN
equ trap_CG_RegisterSharedMemory -301 ; CG_SET_SHARED_BUFFER
equ trap_G2API_GetBoltMatrix_NoRecNoRot -286 ; CG_G2_GETBOLT_NOREC_NOROT
equ trap_G2API_InitGhoul2Model -287 ; CG_G2_INITGHOUL2MODEL
equ trap_G2API_CollisionDetect -288 ; CG_G2_COLLISIONDETECT
equ trap_G2API_CleanGhoul2Models -289 ; CG_G2_CLEANMODELS
equ trap_G2API_SetBoneAngles -290 ; CG_G2_ANGLEOVERRIDE
equ trap_G2API_SetBoneAnim -291 ; CG_G2_PLAYANIM
equ trap_G2API_GetGLAName -292 ; CG_G2_GETGLANAME
equ trap_G2API_CopyGhoul2Instance -293 ; CG_G2_COPYGHOUL2INSTANCE
equ trap_G2API_CopySpecificGhoul2Model -294 ; CG_G2_COPYSPECIFICGHOUL2MODEL
equ trap_G2API_DuplicateGhoul2Instance -295 ; CG_G2_DUPLICATEGHOUL2INSTANCE
equ trap_G2API_HasGhoul2ModelOnIndex -296 ; CG_G2_HASGHOUL2MODELONINDEX
equ trap_G2API_RemoveGhoul2Model -297 ; CG_G2_REMOVEGHOUL2MODEL
equ trap_G2API_AddBolt -298 ; CG_G2_ADDBOLT
equ trap_G2API_SetBoltInfo -299 ; CG_G2_SETBOLTON
equ trap_G2API_SetRootSurface -300 ; CG_G2_SETROOTSURFACE
equ trap_G2API_SetSurfaceOnOff -301 ; CG_G2_SETSURFACEONOFF
equ trap_G2API_SetNewOrigin -302 ; CG_G2_SETNEWORIGIN
equ trap_CG_RegisterSharedMemory -303 ; CG_SET_SHARED_BUFFER
; hardcoded functions

View file

@ -244,9 +244,19 @@ void trap_R_Font_DrawString(int ox, int oy, const char *text, const float *rgba,
syscall( CG_R_FONT_DRAWSTRING, ox, oy, text, rgba, setIndex, iCharLimit, PASSFLOAT(scale));
}
unsigned int trap_AnyLanguage_ReadCharFromString( const char **ppText )
qboolean trap_Language_IsAsian(void)
{
return syscall( CG_ANYLANGUAGE_READCHARFROMSTRING, ppText);
return syscall( CG_LANGUAGE_ISASIAN );
}
qboolean trap_Language_UsesSpaces(void)
{
return syscall( CG_LANGUAGE_USESSPACES );
}
unsigned int trap_AnyLanguage_ReadCharFromString( const char *psText, int *piAdvanceCount, qboolean *pbIsTrailingPunctuation/* = NULL*/ )
{
return syscall( CG_ANYLANGUAGE_READCHARFROMSTRING, psText, piAdvanceCount, pbIsTrailingPunctuation);
}
void trap_R_ClearScene( void ) {
@ -659,12 +669,36 @@ qboolean trap_G2API_GetBoltMatrix_NoReconstruct(void *ghoul2, const int modelInd
return (qboolean)(syscall(CG_G2_GETBOLT_NOREC, ghoul2, modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale));
}
qboolean trap_G2API_GetBoltMatrix_NoRecNoRot(void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix,
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale)
{ //Same as above but force it to not reconstruct the skeleton before getting the bolt position
return (qboolean)(syscall(CG_G2_GETBOLT_NOREC_NOROT, ghoul2, modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale));
}
int trap_G2API_InitGhoul2Model(void **ghoul2Ptr, const char *fileName, int modelIndex, qhandle_t customSkin,
qhandle_t customShader, int modelFlags, int lodBias)
{
return syscall(CG_G2_INITGHOUL2MODEL, ghoul2Ptr, fileName, modelIndex, customSkin, customShader, modelFlags, lodBias);
}
void trap_G2API_CollisionDetect (
CollisionRecord_t *collRecMap,
void* ghoul2,
const vec3_t angles,
const vec3_t position,
int frameNumber,
int entNum,
const vec3_t rayStart,
const vec3_t rayEnd,
const vec3_t scale,
int traceFlags,
int useLod,
float fRadius
)
{
syscall ( CG_G2_COLLISIONDETECT, collRecMap, ghoul2, angles, position, frameNumber, entNum, rayStart, rayEnd, scale, traceFlags, useLod, PASSFLOAT(fRadius) );
}
void trap_G2API_CleanGhoul2Models(void **ghoul2Ptr)
{
syscall(CG_G2_CLEANMODELS, ghoul2Ptr);

View file

@ -1417,50 +1417,36 @@ void CG_Weapon_f( void ) {
if (num >= WP_THERMAL)
{
int prenum = 0;
int loopback = 0;
int weap, i = 0;
if (cg.snap->ps.weapon >= WP_THERMAL &&
cg.snap->ps.weapon <= WP_DET_PACK)
{
num = cg.snap->ps.weapon;
prenum = num;
num++;
// already in cycle range so start with next cycle item
weap = cg.snap->ps.weapon + 1;
}
else
{
prenum = num;
// not in cycle range, so start with thermal detonator
weap = WP_THERMAL;
}
if (num > WP_DET_PACK)
// prevent an endless loop
while ( i <= 4 )
{
num = WP_THERMAL;
}
while (prenum != num || !loopback)
{
if (num > WP_DET_PACK)
if (weap > WP_DET_PACK)
{
num = WP_THERMAL;
loopback = 1;
weap = WP_THERMAL;
}
if (CG_WeaponSelectable(num))
if (CG_WeaponSelectable(weap))
{
num = weap;
break;
}
if (num == prenum)
{
break;
}
num++;
}
if (num > WP_DET_PACK)
{
num = WP_THERMAL;
weap++;
i++;
}
}

Binary file not shown.

490
CODE-mp/client/OpenAL/al.h Normal file
View file

@ -0,0 +1,490 @@
#ifndef _AL_H_
#define _AL_H_
/**
* OpenAL cross platform audio library
* Copyright (C) 1999-2000 by authors.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
* Or go to http://www.gnu.org/copyleft/lgpl.html
*/
#include "altypes.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#ifdef _OPENAL32LIB
#define ALAPI __declspec(dllexport)
#else
#define ALAPI __declspec(dllimport)
#endif
#define ALAPIENTRY __cdecl
#define AL_CALLBACK
#else
#ifdef TARGET_OS_MAC
#if TARGET_OS_MAC
#pragma export on
#endif
#endif
#define ALAPI
#define ALAPIENTRY __cdecl
#define AL_CALLBACK
#endif
#define OPENAL
#ifndef AL_NO_PROTOTYPES
/**
* OpenAL Maintenance Functions
* Initialization and exiting.
* State Management and Query.
* Error Handling.
* Extension Support.
*/
/** State management. */
ALAPI ALvoid ALAPIENTRY alEnable( ALenum capability );
ALAPI ALvoid ALAPIENTRY alDisable( ALenum capability );
ALAPI ALboolean ALAPIENTRY alIsEnabled( ALenum capability );
/** Application preferences for driver performance choices. */
ALAPI ALvoid ALAPIENTRY alHint( ALenum target, ALenum mode );
/** State retrieval. */
ALAPI ALboolean ALAPIENTRY alGetBoolean( ALenum param );
ALAPI ALint ALAPIENTRY alGetInteger( ALenum param );
ALAPI ALfloat ALAPIENTRY alGetFloat( ALenum param );
ALAPI ALdouble ALAPIENTRY alGetDouble( ALenum param );
ALAPI ALvoid ALAPIENTRY alGetBooleanv( ALenum param, ALboolean* data );
ALAPI ALvoid ALAPIENTRY alGetIntegerv( ALenum param, ALint* data );
ALAPI ALvoid ALAPIENTRY alGetFloatv( ALenum param, ALfloat* data );
ALAPI ALvoid ALAPIENTRY alGetDoublev( ALenum param, ALdouble* data );
ALAPI ALubyte* ALAPIENTRY alGetString( ALenum param );
/**
* Error support.
* Obtain the most recent error generated in the AL state machine.
*/
ALAPI ALenum ALAPIENTRY alGetError( ALvoid );
/**
* Extension support.
* Obtain the address of a function (usually an extension)
* with the name fname. All addresses are context-independent.
*/
ALAPI ALboolean ALAPIENTRY alIsExtensionPresent( ALubyte* fname );
/**
* Extension support.
* Obtain the address of a function (usually an extension)
* with the name fname. All addresses are context-independent.
*/
ALAPI ALvoid* ALAPIENTRY alGetProcAddress( ALubyte* fname );
/**
* Extension support.
* Obtain the integer value of an enumeration (usually an extension) with the name ename.
*/
ALAPI ALenum ALAPIENTRY alGetEnumValue( ALubyte* ename );
/**
* LISTENER
* Listener is the sample position for a given context.
* The multi-channel (usually stereo) output stream generated
* by the mixer is parametrized by this Listener object:
* its position and velocity relative to Sources, within
* occluder and reflector geometry.
*/
/**
*
* Listener Environment: default 0.
*/
ALAPI ALvoid ALAPIENTRY alListeneri( ALenum param, ALint value );
/**
*
* Listener Gain: default 1.0f.
*/
ALAPI ALvoid ALAPIENTRY alListenerf( ALenum param, ALfloat value );
/**
*
* Listener Position.
* Listener Velocity.
*/
ALAPI ALvoid ALAPIENTRY alListener3f( ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 );
/**
*
* Listener Position: ALfloat[3]
* Listener Velocity: ALfloat[3]
* Listener Orientation: ALfloat[6] (forward and up vector).
*/
ALAPI ALvoid ALAPIENTRY alListenerfv( ALenum param, ALfloat* values );
ALAPI ALvoid ALAPIENTRY alGetListeneri( ALenum param, ALint* value );
ALAPI ALvoid ALAPIENTRY alGetListenerf( ALenum param, ALfloat* value );
ALAPI ALvoid ALAPIENTRY alGetListener3f( ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 );
ALAPI ALvoid ALAPIENTRY alGetListenerfv( ALenum param, ALfloat* values );
/**
* SOURCE
* Source objects are by default localized. Sources
* take the PCM data provided in the specified Buffer,
* apply Source-specific modifications, and then
* submit them to be mixed according to spatial
* arrangement etc.
*/
/** Create Source objects. */
ALAPI ALvoid ALAPIENTRY alGenSources( ALsizei n, ALuint* sources );
/** Delete Source objects. */
ALAPI ALvoid ALAPIENTRY alDeleteSources( ALsizei n, ALuint* sources );
/** Verify a handle is a valid Source. */
ALAPI ALboolean ALAPIENTRY alIsSource( ALuint id );
/** Set an integer parameter for a Source object. */
ALAPI ALvoid ALAPIENTRY alSourcei( ALuint source, ALenum param, ALint value );
ALAPI ALvoid ALAPIENTRY alSourcef( ALuint source, ALenum param, ALfloat value );
ALAPI ALvoid ALAPIENTRY alSource3f( ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 );
ALAPI ALvoid ALAPIENTRY alSourcefv( ALuint source, ALenum param, ALfloat* values );
/** Get an integer parameter for a Source object. */
ALAPI ALvoid ALAPIENTRY alGetSourcei( ALuint source, ALenum param, ALint* value );
ALAPI ALvoid ALAPIENTRY alGetSourcef( ALuint source, ALenum param, ALfloat* value );
ALAPI ALvoid ALAPIENTRY alGetSource3f( ALuint source, ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 );
ALAPI ALvoid ALAPIENTRY alGetSourcefv( ALuint source, ALenum param, ALfloat* values );
ALAPI ALvoid ALAPIENTRY alSourcePlayv( ALsizei n, ALuint *sources );
ALAPI ALvoid ALAPIENTRY alSourcePausev( ALsizei n, ALuint *sources );
ALAPI ALvoid ALAPIENTRY alSourceStopv( ALsizei n, ALuint *sources );
ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n,ALuint *sources);
/** Activate a source, start replay. */
ALAPI ALvoid ALAPIENTRY alSourcePlay( ALuint source );
/**
* Pause a source,
* temporarily remove it from the mixer list.
*/
ALAPI ALvoid ALAPIENTRY alSourcePause( ALuint source );
/**
* Stop a source,
* temporarily remove it from the mixer list,
* and reset its internal state to pre-Play.
* To remove a Source completely, it has to be
* deleted following Stop, or before Play.
*/
ALAPI ALvoid ALAPIENTRY alSourceStop( ALuint source );
/**
* Rewinds a source,
* temporarily remove it from the mixer list,
* and reset its internal state to pre-Play.
*/
ALAPI ALvoid ALAPIENTRY alSourceRewind( ALuint source );
/**
* BUFFER
* Buffer objects are storage space for sample data.
* Buffers are referred to by Sources. There can be more than
* one Source using the same Buffer data. If Buffers have
* to be duplicated on a per-Source basis, the driver has to
* take care of allocation, copying, and deallocation as well
* as propagating buffer data changes.
*/
/** Buffer object generation. */
ALAPI ALvoid ALAPIENTRY alGenBuffers( ALsizei n, ALuint* buffers );
ALAPI ALvoid ALAPIENTRY alDeleteBuffers( ALsizei n, ALuint* buffers );
ALAPI ALboolean ALAPIENTRY alIsBuffer( ALuint buffer );
/**
* Specify the data to be filled into a buffer.
*/
ALAPI ALvoid ALAPIENTRY alBufferData( ALuint buffer,
ALenum format,
ALvoid* data,
ALsizei size,
ALsizei freq );
ALAPI ALvoid ALAPIENTRY alGetBufferi( ALuint buffer, ALenum param, ALint* value );
ALAPI ALvoid ALAPIENTRY alGetBufferf( ALuint buffer, ALenum param, ALfloat* value );
/**
* Queue stuff
*/
ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers( ALuint source, ALsizei n, ALuint* buffers );
ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers( ALuint source, ALsizei n, ALuint* buffers );
/**
* Knobs and dials
*/
ALAPI ALvoid ALAPIENTRY alDistanceModel( ALenum value );
ALAPI ALvoid ALAPIENTRY alDopplerFactor( ALfloat value );
ALAPI ALvoid ALAPIENTRY alDopplerVelocity( ALfloat value );
#else /* AL_NO_PROTOTYPES */
/**
* OpenAL Maintenance Functions
* Initialization and exiting.
* State Management and Query.
* Error Handling.
* Extension Support.
*/
/** State management. */
ALAPI ALvoid ALAPIENTRY (*alEnable)( ALenum capability );
ALAPI ALvoid ALAPIENTRY (*alDisable)( ALenum capability );
ALAPI ALboolean ALAPIENTRY (*alIsEnabled)( ALenum capability );
/** Application preferences for driver performance choices. */
ALAPI ALvoid ALAPIENTRY (*alHint)( ALenum target, ALenum mode );
/** State retrieval. */
ALAPI ALboolean ALAPIENTRY (*alGetBoolean)( ALenum param );
ALAPI ALint ALAPIENTRY (*alGetInteger)( ALenum param );
ALAPI ALfloat ALAPIENTRY (*alGetFloat)( ALenum param );
ALAPI ALdouble ALAPIENTRY (*alGetDouble)( ALenum param );
ALAPI ALvoid ALAPIENTRY (*alGetBooleanv)( ALenum param, ALboolean* data );
ALAPI ALvoid ALAPIENTRY (*alGetIntegerv)( ALenum param, ALint* data );
ALAPI ALvoid ALAPIENTRY (*alGetFloatv)( ALenum param, ALfloat* data );
ALAPI ALvoid ALAPIENTRY (*alGetDoublev)( ALenum param, ALdouble* data );
ALAPI ALubyte* ALAPIENTRY (*alGetString)( ALenum param );
/**
* Error support.
* Obtain the most recent error generated in the AL state machine.
*/
ALAPI ALenum ALAPIENTRY (*alGetError)( ALvoid );
/**
* Extension support.
* Obtain the address of a function (usually an extension)
* with the name fname. All addresses are context-independent.
*/
ALAPI ALboolean ALAPIENTRY (*alIsExtensionPresent)( ALubyte* fname );
/**
* Extension support.
* Obtain the address of a function (usually an extension)
* with the name fname. All addresses are context-independent.
*/
ALAPI ALvoid* ALAPIENTRY (*alGetProcAddress)( ALubyte* fname );
/**
* Extension support.
* Obtain the integer value of an enumeration (usually an extension) with the name ename.
*/
ALAPI ALenum ALAPIENTRY (*alGetEnumValue)( ALubyte* ename );
/**
* LISTENER
* Listener is the sample position for a given context.
* The multi-channel (usually stereo) output stream generated
* by the mixer is parametrized by this Listener object:
* its position and velocity relative to Sources, within
* occluder and reflector geometry.
*/
/**
*
* Listener Environment: default 0.
*/
ALAPI ALvoid ALAPIENTRY (*alListeneri)( ALenum param, ALint value );
/**
*
* Listener Gain: default 1.0f.
*/
ALAPI ALvoid ALAPIENTRY (*alListenerf)( ALenum param, ALfloat value );
/**
*
* Listener Position.
* Listener Velocity.
*/
ALAPI ALvoid ALAPIENTRY (*alListener3f)( ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 );
/**
*
* Listener Position: ALfloat[3]
* Listener Velocity: ALfloat[3]
* Listener Orientation: ALfloat[6] (forward and up vector).
*/
ALAPI ALvoid ALAPIENTRY (*alListenerfv)( ALenum param, ALfloat* values );
ALAPI ALvoid ALAPIENTRY (*alGetListeneri)( ALenum param, ALint* value );
ALAPI ALvoid ALAPIENTRY (*alGetListenerf)( ALenum param, ALfloat* value );
ALAPI ALvoid ALAPIENTRY (*alGetListener3f)( ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3 );
ALAPI ALvoid ALAPIENTRY (*alGetListenerfv)( ALenum param, ALfloat* values );
/**
* SOURCE
* Source objects are by default localized. Sources
* take the PCM data provided in the specified Buffer,
* apply Source-specific modifications, and then
* submit them to be mixed according to spatial
* arrangement etc.
*/
/** Create Source objects. */
ALAPI ALvoid ALAPIENTRY (*alGenSources)( ALsizei n, ALuint* sources );
/** Delete Source objects. */
ALAPI ALvoid ALAPIENTRY (*alDeleteSources)( ALsizei n, ALuint* sources );
/** Verify a handle is a valid Source. */
ALAPI ALboolean ALAPIENTRY (*alIsSource)( ALuint id );
/** Set an integer parameter for a Source object. */
ALAPI ALvoid ALAPIENTRY (*alSourcei)( ALuint source, ALenum param, ALint value );
ALAPI ALvoid ALAPIENTRY (*alSourcef)( ALuint source, ALenum param, ALfloat value );
ALAPI ALvoid ALAPIENTRY (*alSource3f)( ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3 );
ALAPI ALvoid ALAPIENTRY (*alSourcefv)( ALuint source, ALenum param, ALfloat* values );
/** Get an integer parameter for a Source object. */
ALAPI ALvoid ALAPIENTRY (*alGetSourcei)( ALuint source, ALenum param, ALint* value );
ALAPI ALvoid ALAPIENTRY (*alGetSourcef)( ALuint source, ALenum param, ALfloat* value );
ALAPI ALvoid ALAPIENTRY (*alGetSourcefv)( ALuint source, ALenum param, ALfloat* values );
ALAPI ALvoid ALAPIENTRY (*alSourcePlayv)( ALsizei n, ALuint *sources );
ALAPI ALvoid ALAPIENTRY (*alSourceStopv)( ALsizei n, ALuint *sources );
/** Activate a source, start replay. */
ALAPI ALvoid ALAPIENTRY (*alSourcePlay)( ALuint source );
/**
* Pause a source,
* temporarily remove it from the mixer list.
*/
ALAPI ALvoid ALAPIENTRY (*alSourcePause)( ALuint source );
/**
* Stop a source,
* temporarily remove it from the mixer list,
* and reset its internal state to pre-Play.
* To remove a Source completely, it has to be
* deleted following Stop, or before Play.
*/
ALAPI ALvoid ALAPIENTRY (*alSourceStop)( ALuint source );
/**
* BUFFER
* Buffer objects are storage space for sample data.
* Buffers are referred to by Sources. There can be more than
* one Source using the same Buffer data. If Buffers have
* to be duplicated on a per-Source basis, the driver has to
* take care of allocation, copying, and deallocation as well
* as propagating buffer data changes.
*/
/** Buffer object generation. */
ALAPI ALvoid ALAPIENTRY (*alGenBuffers)( ALsizei n, ALuint* buffers );
ALAPI ALvoid ALAPIENTRY (*alDeleteBuffers)( ALsizei n, ALuint* buffers );
ALAPI ALboolean ALAPIENTRY (*alIsBuffer)( ALuint buffer );
/**
* Specify the data to be filled into a buffer.
*/
ALAPI ALvoid ALAPIENTRY (*alBufferData)( ALuint buffer,
ALenum format,
ALvoid* data,
ALsizei size,
ALsizei freq );
ALAPI ALvoid ALAPIENTRY (*alGetBufferi)( ALuint buffer, ALenum param, ALint* value );
ALAPI ALvoid ALAPIENTRY (*alGetBufferf)( ALuint buffer, ALenum param, ALfloat* value );
/**
* Queue stuff
*/
ALAPI ALvoid ALAPIENTRY (*alSourceQueueBuffers)( ALuint source, ALsizei n, ALuint* buffers );
ALAPI ALvoid ALAPIENTRY (*alSourceUnqueueBuffers)( ALuint source, ALsizei n, ALuint* buffers );
/**
* Knobs and dials
*/
ALAPI ALvoid ALAPIENTRY (*alDistanceModel)( ALenum value );
ALAPI ALvoid ALAPIENTRY (*alDopplerFactor)( ALfloat value );
ALAPI ALvoid ALAPIENTRY (*alDopplerVelocity)( ALfloat value );
#endif /* AL_NO_PROTOTYPES */
#ifdef TARGET_OS_MAC
#if TARGET_OS_MAC
#pragma export off
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,90 @@
#ifndef _ALC_H_
#define _ALC_H_
#include "altypes.h"
#include "alctypes.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#ifdef _OPENAL32LIB
#define ALCAPI __declspec(dllexport)
#else
#define ALCAPI __declspec(dllimport)
#endif
typedef struct ALCdevice_struct ALCdevice;
typedef struct ALCcontext_struct ALCcontext;
#define ALCAPIENTRY __cdecl
#else
#ifdef TARGET_OS_MAC
#if TARGET_OS_MAC
#pragma export on
#endif
#endif
#define ALCAPI
#define ALCAPIENTRY __cdecl
#endif
#ifndef ALC_NO_PROTOTYPES
ALCAPI ALCubyte* ALCAPIENTRY alcGetString(ALCdevice *device,ALCenum param);
ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALCsizei size,ALCint *data);
ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(ALCubyte *deviceName);
ALCAPI ALCvoid ALCAPIENTRY alcCloseDevice(ALCdevice *device);
ALCAPI ALCcontext*ALCAPIENTRY alcCreateContext(ALCdevice *device,ALCint *attrList);
ALCAPI ALCboolean ALCAPIENTRY alcMakeContextCurrent(ALCcontext *context);
ALCAPI ALCvoid ALCAPIENTRY alcProcessContext(ALCcontext *context);
ALCAPI ALCcontext*ALCAPIENTRY alcGetCurrentContext(ALCvoid);
ALCAPI ALCdevice* ALCAPIENTRY alcGetContextsDevice(ALCcontext *context);
ALCAPI ALCvoid ALCAPIENTRY alcSuspendContext(ALCcontext *context);
ALCAPI ALCvoid ALCAPIENTRY alcDestroyContext(ALCcontext *context);
ALCAPI ALCenum ALCAPIENTRY alcGetError(ALCdevice *device);
ALCAPI ALCboolean ALCAPIENTRY alcIsExtensionPresent(ALCdevice *device,ALCubyte *extName);
ALCAPI ALCvoid * ALCAPIENTRY alcGetProcAddress(ALCdevice *device,ALCubyte *funcName);
ALCAPI ALCenum ALCAPIENTRY alcGetEnumValue(ALCdevice *device,ALCubyte *enumName);
#else /* AL_NO_PROTOTYPES */
ALCAPI ALCubyte* ALCAPIENTRY (*alcGetString)(ALCdevice *device,ALCenum param);
ALCAPI ALCvoid ALCAPIENTRY (*alcGetIntegerv)(ALCdevice * device,ALCenum param,ALCsizei size,ALCint *data);
ALCAPI ALCdevice* ALCAPIENTRY (*alcOpenDevice)(ALubyte *deviceName);
ALCAPI ALCvoid ALCAPIENTRY (*alcCloseDevice)(ALCdevice *device);
ALCAPI ALCcontext*ALCAPIENTRY (*alcCreateContext)(ALCdevice *device,ALCint *attrList);
ALCAPI ALCboolean ALCAPIENTRY (*alcMakeContextCurrent)(ALCcontext *context);
ALCAPI ALCvoid ALCAPIENTRY (*alcProcessContext)(ALCcontext *context);
ALCAPI ALCcontext*ALCAPIENTRY (*alcGetCurrentContext)(ALCvoid);
ALCAPI ALCdevice* ALCAPIENTRY (*alcGetContextsDevice)(ALCcontext *context);
ALCAPI ALCvoid ALCAPIENTRY (*alcSuspendContext)(ALCcontext *context);
ALCAPI ALCvoid ALCAPIENTRY (*alcDestroyContext)(ALCcontext *context);
ALCAPI ALCenum ALCAPIENTRY (*alcGetError)(ALCdevice *device);
ALCAPI ALCboolean ALCAPIENTRY (*alcIsExtensionPresent)(ALCdevice *device,ALCubyte *extName);
ALCAPI ALCvoid * ALCAPIENTRY (*alcGetProcAddress)(ALCdevice *device,ALCubyte *funcName);
ALCAPI ALCenum ALCAPIENTRY (*alcGetEnumValue)(ALCdevice *device,ALCubyte *enumName);
#endif /* AL_NO_PROTOTYPES */
#ifdef TARGET_OS_MAC
#if TARGET_OS_MAC
#pragma export off
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,125 @@
#ifndef _ALCTYPES_H_
#define _ALCTYPES_H_
/**
* OpenAL cross platform audio library
* Copyright (C) 1999-2000 by authors.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
* Or go to http://www.gnu.org/copyleft/lgpl.html
*/
#ifdef __cplusplus
extern "C" {
#endif
/** ALC boolean type. */
typedef char ALCboolean;
/** ALC 8bit signed byte. */
typedef char ALCbyte;
/** ALC 8bit unsigned byte. */
typedef unsigned char ALCubyte;
/** ALC 16bit signed short integer type. */
typedef short ALCshort;
/** ALC 16bit unsigned short integer type. */
typedef unsigned short ALCushort;
/** ALC 32bit unsigned integer type. */
typedef unsigned ALCuint;
/** ALC 32bit signed integer type. */
typedef int ALCint;
/** ALC 32bit floating point type. */
typedef float ALCfloat;
/** ALC 64bit double point type. */
typedef double ALCdouble;
/** ALC 32bit type. */
typedef unsigned int ALCsizei;
/** ALC void type */
typedef void ALCvoid;
/** ALC enumerations. */
typedef int ALCenum;
/* Bad value. */
#define ALC_INVALID (-1)
/* Boolean False. */
#define ALC_FALSE 0
/* Boolean True. */
#define ALC_TRUE 1
/** Errors: No Error. */
#define ALC_NO_ERROR ALC_FALSE
#define ALC_MAJOR_VERSION 0x1000
#define ALC_MINOR_VERSION 0x1001
#define ALC_ATTRIBUTES_SIZE 0x1002
#define ALC_ALL_ATTRIBUTES 0x1003
#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004
#define ALC_DEVICE_SPECIFIER 0x1005
#define ALC_EXTENSIONS 0x1006
#define ALC_FREQUENCY 0x1007
#define ALC_REFRESH 0x1008
#define ALC_SYNC 0x1009
/**
* The device argument does not name a valid dvice.
*/
#define ALC_INVALID_DEVICE 0xA001
/**
* The context argument does not name a valid context.
*/
#define ALC_INVALID_CONTEXT 0xA002
/**
* A function was called at inappropriate time,
* or in an inappropriate way, causing an illegal state.
* This can be an incompatible ALenum, object ID,
* and/or function.
*/
#define ALC_INVALID_ENUM 0xA003
/**
* Illegal value passed as an argument to an AL call.
* Applies to parameter values, but not to enumerations.
*/
#define ALC_INVALID_VALUE 0xA004
/**
* A function could not be completed,
* because there is not enough memory available.
*/
#define ALC_OUT_OF_MEMORY 0xA005
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,332 @@
#ifndef _ALTYPES_H_
#define _ALTYPES_H_
/**
* OpenAL cross platform audio library
* Copyright (C) 1999-2000 by authors.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
* Or go to http://www.gnu.org/copyleft/lgpl.html
*/
#ifdef __cplusplus
extern "C" {
#endif
/** OpenAL boolean type. */
typedef char ALboolean;
/** OpenAL 8bit signed byte. */
typedef char ALbyte;
/** OpenAL 8bit unsigned byte. */
typedef unsigned char ALubyte;
/** OpenAL 16bit signed short integer type. */
typedef short ALshort;
/** OpenAL 16bit unsigned short integer type. */
typedef unsigned short ALushort;
/** OpenAL 32bit unsigned integer type. */
typedef unsigned ALuint;
/** OpenAL 32bit signed integer type. */
typedef int ALint;
/** OpenAL 32bit floating point type. */
typedef float ALfloat;
/** OpenAL 64bit double point type. */
typedef double ALdouble;
/** OpenAL 32bit type. */
typedef unsigned int ALsizei;
/** OpenAL void type */
typedef void ALvoid;
/** OpenAL enumerations. */
typedef int ALenum;
/* Bad value. */
#define AL_INVALID (-1)
/* Disable value. */
#define AL_NONE 0
/* Boolean False. */
#define AL_FALSE 0
/* Boolean True. */
#define AL_TRUE 1
/**
* Indicate the type of AL_SOURCE.
* Sources can be spatialized
*/
#define AL_SOURCE_TYPE 0x200
/** Indicate source has absolute coordinates. */
#define AL_SOURCE_ABSOLUTE 0x201
/** Indicate Source has listener relative coordinates. */
#define AL_SOURCE_RELATIVE 0x202
/**
* Directional source, inner cone angle, in degrees.
* Range: [0-360]
* Default: 360
*/
#define AL_CONE_INNER_ANGLE 0x1001
/**
* Directional source, outer cone angle, in degrees.
* Range: [0-360]
* Default: 360
*/
#define AL_CONE_OUTER_ANGLE 0x1002
/**
* Specify the pitch to be applied, either at source,
* or on mixer results, at listener.
* Range: [0.5-2.0]
* Default: 1.0
*/
#define AL_PITCH 0x1003
/**
* Specify the current location in three dimensional space.
* OpenAL, like OpenGL, uses a right handed coordinate system,
* where in a frontal default view X (thumb) points right,
* Y points up (index finger), and Z points towards the
* viewer/camera (middle finger).
* To switch from a left handed coordinate system, flip the
* sign on the Z coordinate.
* Listener position is always in the world coordinate system.
*/
#define AL_POSITION 0x1004
/** Specify the current direction as forward vector. */
#define AL_DIRECTION 0x1005
/** Specify the current velocity in three dimensional space. */
#define AL_VELOCITY 0x1006
/**
* Indicate whether source has to loop infinite.
* Type: ALboolean
* Range: [AL_TRUE, AL_FALSE]
* Default: AL_FALSE
*/
#define AL_LOOPING 0x1007
/**
* Indicate the buffer to provide sound samples.
* Type: ALuint.
* Range: any valid Buffer id.
*/
#define AL_BUFFER 0x1009
/**
* Indicate the gain (volume amplification) applied.
* Type: ALfloat.
* Range: ]0.0- ]
* A value of 1.0 means un-attenuated/unchanged.
* Each division by 2 equals an attenuation of -6dB.
* Each multiplicaton with 2 equals an amplification of +6dB.
* A value of 0.0 is meaningless with respect to a logarithmic
* scale; it is interpreted as zero volume - the channel
* is effectively disabled.
*/
#define AL_GAIN 0x100A
/**
* Indicate minimum source attenuation.
* Type: ALfloat
* Range: [0.0 - 1.0]
*/
#define AL_MIN_GAIN 0x100D
/**
* Indicate maximum source attenuation.
* Type: ALfloat
* Range: [0.0 - 1.0]
*/
#define AL_MAX_GAIN 0x100E
/**
* Specify the current orientation.
* Type: ALfv6 (at/up)
* Range: N/A
*/
#define AL_ORIENTATION 0x100F
/* byte offset into source (in canon format). -1 if source
* is not playing. Don't set this, get this.
*
* Type: ALfloat
* Range: [0.0 - ]
* Default: 1.0
*/
#define AL_REFERENCE_DISTANCE 0x1020
/**
* Indicate the rolloff factor for the source.
* Type: ALfloat
* Range: [0.0 - ]
* Default: 1.0
*/
#define AL_ROLLOFF_FACTOR 0x1021
/**
* Indicate the gain (volume amplification) applied.
* Type: ALfloat.
* Range: ]0.0- ]
* A value of 1.0 means un-attenuated/unchanged.
* Each division by 2 equals an attenuation of -6dB.
* Each multiplicaton with 2 equals an amplification of +6dB.
* A value of 0.0 is meaningless with respect to a logarithmic
* scale; it is interpreted as zero volume - the channel
* is effectively disabled.
*/
#define AL_CONE_OUTER_GAIN 0x1022
/**
* Specify the maximum distance.
* Type: ALfloat
* Range: [0.0 - ]
*/
#define AL_MAX_DISTANCE 0x1023
/**
* Specify the channel mask. (Creative)
* Type: ALuint
* Range: [0 - 255]
*/
#define AL_CHANNEL_MASK 0x3000
/**
* Source state information
*/
#define AL_SOURCE_STATE 0x1010
#define AL_INITIAL 0x1011
#define AL_PLAYING 0x1012
#define AL_PAUSED 0x1013
#define AL_STOPPED 0x1014
/**
* Buffer Queue params
*/
#define AL_BUFFERS_QUEUED 0x1015
#define AL_BUFFERS_PROCESSED 0x1016
/** Sound buffers: format specifier. */
#define AL_FORMAT_MONO8 0x1100
#define AL_FORMAT_MONO16 0x1101
#define AL_FORMAT_STEREO8 0x1102
#define AL_FORMAT_STEREO16 0x1103
/**
* Sound buffers: frequency, in units of Hertz [Hz].
* This is the number of samples per second. Half of the
* sample frequency marks the maximum significant
* frequency component.
*/
#define AL_FREQUENCY 0x2001
#define AL_BITS 0x2002
#define AL_CHANNELS 0x2003
#define AL_SIZE 0x2004
#define AL_DATA 0x2005
/**
* Buffer state.
*
* Not supported for public use (yet).
*/
#define AL_UNUSED 0x2010
#define AL_PENDING 0x2011
#define AL_PROCESSED 0x2012
/** Errors: No Error. */
#define AL_NO_ERROR AL_FALSE
/**
* Illegal name passed as an argument to an AL call.
*/
#define AL_INVALID_NAME 0xA001
/**
* Illegal enum passed as an argument to an AL call.
*/
#define AL_INVALID_ENUM 0xA002
/**
* Illegal value passed as an argument to an AL call.
* Applies to parameter values, but not to enumerations.
*/
#define AL_INVALID_VALUE 0xA003
/**
* A function was called at inappropriate time,
* or in an inappropriate way, causing an illegal state.
* This can be an incompatible ALenum, object ID,
* and/or function.
*/
#define AL_INVALID_OPERATION 0xA004
/**
* A function could not be completed,
* because there is not enough memory available.
*/
#define AL_OUT_OF_MEMORY 0xA005
/** Context strings: Vendor Name. */
#define AL_VENDOR 0xB001
#define AL_VERSION 0xB002
#define AL_RENDERER 0xB003
#define AL_EXTENSIONS 0xB004
/** Global tweakage. */
/**
* Doppler scale. Default 1.0
*/
#define AL_DOPPLER_FACTOR 0xC000
/**
* Doppler velocity. Default 1.0
*/
#define AL_DOPPLER_VELOCITY 0xC001
/**
* Distance model. Default AL_INVERSE_DISTANCE_CLAMPED
*/
#define AL_DISTANCE_MODEL 0xD000
/** Distance models. */
#define AL_INVERSE_DISTANCE 0xD001
#define AL_INVERSE_DISTANCE_CLAMPED 0xD002
/**
* enables
*/
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,34 @@
#ifndef _ALU_H_
#define _ALU_H_
#define ALUAPI
#define ALUAPIENTRY __cdecl
#define BUFFERSIZE 48000
#define FRACTIONBITS 14
#define FRACTIONMASK ((1L<<FRACTIONBITS)-1)
#define OUTPUTCHANNELS 2
#include "altypes.h"
#ifdef __cplusplus
extern "C" {
#endif
ALUAPI ALint ALUAPIENTRY aluF2L(ALfloat value);
ALUAPI ALshort ALUAPIENTRY aluF2S(ALfloat value);
ALUAPI ALvoid ALUAPIENTRY aluCrossproduct(ALfloat *inVector1,ALfloat *inVector2,ALfloat *outVector);
ALUAPI ALfloat ALUAPIENTRY aluDotproduct(ALfloat *inVector1,ALfloat *inVector2);
ALUAPI ALvoid ALUAPIENTRY aluNormalize(ALfloat *inVector);
ALUAPI ALvoid ALUAPIENTRY aluMatrixVector(ALfloat matrix[3][3],ALfloat *vector);
ALUAPI ALvoid ALUAPIENTRY aluCalculateSourceParameters(ALuint source,ALuint channels,ALfloat *drysend,ALfloat *wetsend,ALfloat *pitch);
ALUAPI ALvoid ALUAPIENTRY aluMixData(ALvoid *context,ALvoid *buffer,ALsizei size,ALenum format);
ALUAPI ALvoid ALUAPIENTRY aluSetReverb(ALvoid *Reverb,ALuint Environment);
ALUAPI ALvoid ALUAPIENTRY aluReverb(ALvoid *Reverb,ALfloat Buffer[][2],ALsizei BufferSize);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,24 @@
#ifndef _ALUT_H_
#define _ALUT_H_
#define ALUTAPI
#define ALUTAPIENTRY __cdecl
#include "al.h"
#include "alu.h"
#ifdef __cplusplus
extern "C" {
#endif
ALUTAPI ALvoid ALUTAPIENTRY alutInit(ALint *argc,ALbyte **argv);
ALUTAPI ALvoid ALUTAPIENTRY alutExit(ALvoid);
ALUTAPI ALvoid ALUTAPIENTRY alutLoadWAVFile(ALbyte *file,ALenum *format,ALvoid **data,ALsizei *size,ALsizei *freq,ALboolean *loop);
ALUTAPI ALvoid ALUTAPIENTRY alutLoadWAVMemory(ALbyte *memory,ALenum *format,ALvoid **data,ALsizei *size,ALsizei *freq,ALboolean *loop);
ALUTAPI ALvoid ALUTAPIENTRY alutUnloadWAV(ALenum format,ALvoid *data,ALsizei size,ALsizei freq);
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

View file

@ -28,6 +28,10 @@ Ghoul2 Insert Start
#include "../qcommon/strip.h"
#ifdef G2_COLLISION_ENABLED
extern CMiniHeap *G2VertSpaceClient;
#endif
/*
Ghoul2 Insert End
*/
@ -635,8 +639,12 @@ int CL_CgameSystemCalls( int *args ) {
case CG_R_FONT_DRAWSTRING:
re.Font_DrawString( args[1], args[2], (const char *)VMA(3), (const float *) VMA(4), args[5], args[6], VMF(7) );
return 0;
case CG_LANGUAGE_ISASIAN:
return re.Language_IsAsian();
case CG_LANGUAGE_USESSPACES:
return re.Language_UsesSpaces();
case CG_ANYLANGUAGE_READCHARFROMSTRING:
return re.AnyLanguage_ReadCharFromString( (const char **)VMA(1) );
return re.AnyLanguage_ReadCharFromString( (const char *) VMA(1), (int *) VMA(2), (qboolean *) VMA(3) );
case CG_R_CLEARSCENE:
re.ClearScene();
return 0;
@ -994,11 +1002,34 @@ Ghoul2 Insert Start
gG2_GBMNoReconstruct = qtrue;
return G2API_GetBoltMatrix(*((CGhoul2Info_v *)args[1]), args[2], args[3], (mdxaBone_t *)VMA(4), (const float *)VMA(5),(const float *)VMA(6), args[7], (qhandle_t *)VMA(8), (float *)VMA(9));
case CG_G2_GETBOLT_NOREC_NOROT:
gG2_GBMNoReconstruct = qtrue;
gG2_GBMUseSPMethod = qtrue;
return G2API_GetBoltMatrix(*((CGhoul2Info_v *)args[1]), args[2], args[3], (mdxaBone_t *)VMA(4), (const float *)VMA(5),(const float *)VMA(6), args[7], (qhandle_t *)VMA(8), (float *)VMA(9));
case CG_G2_INITGHOUL2MODEL:
RicksCrazyOnServer=false;
return G2API_InitGhoul2Model((CGhoul2Info_v **)VMA(1), (const char *)VMA(2), args[3], (qhandle_t) args[4],
(qhandle_t) args[5], args[6], args[7]);
case CG_G2_COLLISIONDETECT:
#ifdef G2_COLLISION_ENABLED
G2API_CollisionDetect ( (CollisionRecord_t*)VMA(1), *((CGhoul2Info_v *)args[2]),
(const float*)VMA(3),
(const float*)VMA(4),
args[5],
args[6],
(float*)VMA(7),
(float*)VMA(8),
(float*)VMA(9),
G2VertSpaceClient,
args[10],
args[11],
VMF(12) );
#endif
return 0;
case CG_G2_ANGLEOVERRIDE:
return G2API_SetBoneAngles(*((CGhoul2Info_v *)args[1]), args[2], (const char *)VMA(3), (float *)VMA(4), args[5],
(const Eorientations) args[6], (const Eorientations) args[7], (const Eorientations) args[8],

View file

@ -30,8 +30,8 @@ void Con_ToggleConsole_f (void) {
return;
}
Field_Clear( &g_consoleField );
g_consoleField.widthInChars = g_console_field_width;
Field_Clear( &kg.g_consoleField );
kg.g_consoleField.widthInChars = g_console_field_width;
Con_ClearNotify ();
cls.keyCatchers ^= KEYCATCH_CONSOLE;
@ -130,7 +130,7 @@ void Con_Dump_f (void)
if (Cmd_Argc() != 2)
{
Com_Printf(SP_GetStringText(CON_TEXT_DUMP_USAGE));
Com_Printf (SP_GetStringText(CON_TEXT_DUMP_USAGE));
return;
}
@ -139,7 +139,7 @@ void Con_Dump_f (void)
f = FS_FOpenFileWrite( Cmd_Argv( 1 ) );
if (!f)
{
Com_Printf ("ERROR: couldn't open.\n");
Com_Printf (S_COLOR_RED"ERROR: couldn't open.\n");
return;
}
@ -277,11 +277,11 @@ void Con_Init (void) {
con_notifytime = Cvar_Get ("con_notifytime", "3", 0);
con_conspeed = Cvar_Get ("scr_conspeed", "3", 0);
Field_Clear( &g_consoleField );
g_consoleField.widthInChars = g_console_field_width;
Field_Clear( &kg.g_consoleField );
kg.g_consoleField.widthInChars = g_console_field_width;
for ( i = 0 ; i < COMMAND_HISTORY ; i++ ) {
Field_Clear( &historyEditLines[i] );
historyEditLines[i].widthInChars = g_console_field_width;
Field_Clear( &kg.historyEditLines[i] );
kg.historyEditLines[i].widthInChars = g_console_field_width;
}
Cmd_AddCommand ("toggleconsole", Con_ToggleConsole_f);
@ -424,17 +424,19 @@ void Con_DrawInput (void) {
return;
}
y = con.vislines - ( SMALLCHAR_HEIGHT * 2 );
y = con.vislines - ( SMALLCHAR_HEIGHT * (re.Language_IsAsian() ? 1.5 : 2) );
re.SetColor( con.color );
SCR_DrawSmallChar( (int)(con.xadjust + 1 * SMALLCHAR_WIDTH), y, ']' );
Field_Draw( &g_consoleField, (int)(con.xadjust + 2 * SMALLCHAR_WIDTH), y,
Field_Draw( &kg.g_consoleField, (int)(con.xadjust + 2 * SMALLCHAR_WIDTH), y,
SCREEN_WIDTH - 3 * SMALLCHAR_WIDTH, qtrue );
}
/*
================
Con_DrawNotify
@ -471,22 +473,59 @@ void Con_DrawNotify (void)
continue;
}
for (x = 0 ; x < con.linewidth ; x++) {
if ( ( text[x] & 0xff ) == ' ' ) {
continue;
}
if ( ( (text[x]>>8)&7 ) != currentColor ) {
currentColor = (text[x]>>8)&7;
re.SetColor( g_color_table[currentColor] );
}
if (!cl_conXOffset)
{
cl_conXOffset = Cvar_Get ("cl_conXOffset", "0", 0);
}
SCR_DrawSmallChar( (int)(cl_conXOffset->integer + con.xadjust + (x+1)*SMALLCHAR_WIDTH), v, text[x] & 0xff );
if (!cl_conXOffset)
{
cl_conXOffset = Cvar_Get ("cl_conXOffset", "0", 0);
}
v += SMALLCHAR_HEIGHT;
// asian language needs to use the new font system to print glyphs...
//
// (ignore colours since we're going to print the whole thing as one string)
//
if (re.Language_IsAsian())
{
static int iFontIndex = re.RegisterFont("ocr_a"); // this seems naughty
const float fFontScale = 0.75f*con.yadjust;
const int iPixelHeightToAdvance = 2+(1.3/con.yadjust) * re.Font_HeightPixels(iFontIndex, fFontScale); // for asian spacing, since we don't want glyphs to touch.
// concat the text to be printed...
//
char sTemp[4096]={0}; // ott
for (x = 0 ; x < con.linewidth ; x++)
{
if ( ( (text[x]>>8)&7 ) != currentColor ) {
currentColor = (text[x]>>8)&7;
strcat(sTemp,va("^%i", (text[x]>>8)&7) );
}
strcat(sTemp,va("%c",text[x] & 0xFF));
}
//
// and print...
//
re.Font_DrawString(cl_conXOffset->integer + con.xadjust*(con.xadjust + (1*SMALLCHAR_WIDTH/*aesthetics*/)), con.yadjust*(v), sTemp, g_color_table[currentColor], iFontIndex, -1, fFontScale);
v += iPixelHeightToAdvance;
}
else
{
for (x = 0 ; x < con.linewidth ; x++) {
if ( ( text[x] & 0xff ) == ' ' ) {
continue;
}
if ( ( (text[x]>>8)&7 ) != currentColor ) {
currentColor = (text[x]>>8)&7;
re.SetColor( g_color_table[currentColor] );
}
if (!cl_conXOffset)
{
cl_conXOffset = Cvar_Get ("cl_conXOffset", "0", 0);
}
SCR_DrawSmallChar( (int)(cl_conXOffset->integer + con.xadjust + (x+1)*SMALLCHAR_WIDTH), v, text[x] & 0xff );
}
v += SMALLCHAR_HEIGHT;
}
}
re.SetColor( NULL );
@ -589,7 +628,19 @@ void Con_DrawSolidConsole( float frac ) {
currentColor = 7;
re.SetColor( g_color_table[currentColor] );
for (i=0 ; i<rows ; i++, y -= SMALLCHAR_HEIGHT, row--)
static int iFontIndexForAsian = 0;
const float fFontScaleForAsian = 0.75f*con.yadjust;
int iPixelHeightToAdvance = SMALLCHAR_HEIGHT;
if (re.Language_IsAsian())
{
if (!iFontIndexForAsian)
{
iFontIndexForAsian = re.RegisterFont("ocr_a");
}
iPixelHeightToAdvance = (1.3/con.yadjust) * re.Font_HeightPixels(iFontIndexForAsian, fFontScaleForAsian); // for asian spacing, since we don't want glyphs to touch.
}
for (i=0 ; i<rows ; i++, y -= iPixelHeightToAdvance, row--)
{
if (row < 0)
break;
@ -600,16 +651,41 @@ void Con_DrawSolidConsole( float frac ) {
text = con.text + (row % con.totallines)*con.linewidth;
for (x=0 ; x<con.linewidth ; x++) {
if ( ( text[x] & 0xff ) == ' ' ) {
continue;
// asian language needs to use the new font system to print glyphs...
//
// (ignore colours since we're going to print the whole thing as one string)
//
if (re.Language_IsAsian())
{
// concat the text to be printed...
//
char sTemp[4096]={0}; // ott
for (x = 0 ; x < con.linewidth ; x++)
{
if ( ( (text[x]>>8)&7 ) != currentColor ) {
currentColor = (text[x]>>8)&7;
strcat(sTemp,va("^%i", (text[x]>>8)&7) );
}
strcat(sTemp,va("%c",text[x] & 0xFF));
}
//
// and print...
//
re.Font_DrawString(con.xadjust*(con.xadjust + (1*SMALLCHAR_WIDTH/*(aesthetics)*/)), con.yadjust*(y), sTemp, g_color_table[currentColor], iFontIndexForAsian, -1, fFontScaleForAsian);
}
else
{
for (x=0 ; x<con.linewidth ; x++) {
if ( ( text[x] & 0xff ) == ' ' ) {
continue;
}
if ( ( (text[x]>>8)&7 ) != currentColor ) {
currentColor = (text[x]>>8)&7;
re.SetColor( g_color_table[currentColor] );
if ( ( (text[x]>>8)&7 ) != currentColor ) {
currentColor = (text[x]>>8)&7;
re.SetColor( g_color_table[currentColor] );
}
SCR_DrawSmallChar( (int) (con.xadjust + (x+1)*SMALLCHAR_WIDTH), y, text[x] & 0xff );
}
SCR_DrawSmallChar( (int) (con.xadjust + (x+1)*SMALLCHAR_WIDTH), y, text[x] & 0xff );
}
}
@ -712,7 +788,7 @@ void Con_Close( void ) {
if ( !com_cl_running->integer ) {
return;
}
Field_Clear( &g_consoleField );
Field_Clear( &kg.g_consoleField );
Con_ClearNotify ();
cls.keyCatchers &= ~KEYCATCH_CONSOLE;
con.finalFrac = 0; // none visible

View file

@ -586,12 +586,12 @@ void CL_CmdButtons( usercmd_t *cmd ) {
}
if ( cls.keyCatchers ) {
// cmd->buttons |= BUTTON_TALK;
cmd->buttons |= BUTTON_TALK;
}
// allow the game to know if any key at all is
// currently pressed, even if it isn't bound to anything
if ( anykeydown && !cls.keyCatchers ) {
if ( kg.anykeydown && !cls.keyCatchers ) {
cmd->buttons |= BUTTON_ANY;
}
}

File diff suppressed because it is too large Load diff

View file

@ -9,6 +9,12 @@
#include "..\ghoul2\G2_local.h"
#endif
#ifdef G2_COLLISION_ENABLED
#if !defined (MINIHEAP_H_INC)
#include "../qcommon/miniheap.h"
#endif
#endif
#ifdef _DONETPROFILE_
#include "../qcommon/INetProfile.h"
#endif
@ -93,6 +99,10 @@ typedef struct serverStatus_s
serverStatus_t cl_serverStatusList[MAX_SERVERSTATUSREQUESTS];
int serverStatusCount;
#ifdef G2_COLLISION_ENABLED
CMiniHeap *G2VertSpaceClient = 0;
#endif
#if defined __USEA3D && defined __A3D_GEOM
void hA3Dg_ExportRenderGeom (refexport_t *incoming_re);
#endif
@ -514,13 +524,7 @@ void CL_PlayDemo_f( void ) {
if (!clc.demofile) {
if (!Q_stricmp(arg, "(null)"))
{
extern cvar_t *sp_language;
switch (sp_language->integer)
{
case SP_LANGUAGE_GERMAN: Com_Error( ERR_DROP, "Kein demo ausgewählt." ); break;
case SP_LANGUAGE_FRENCH: Com_Error( ERR_DROP, "Aucun demo choisi." ); break;
default: Com_Error( ERR_DROP, "No demo selected." ); break;
}
Com_Error( ERR_DROP, SP_GetStringTextString("CON_TEXT_NO_DEMO_SELECTED") );
}
else
{
@ -758,9 +762,6 @@ void CL_Disconnect( qboolean showMainMenu ) {
cls.state = CA_DISCONNECTED;
// allow cheats locally
Cvar_Set( "sv_cheats", "1" );
// not connected to a pure server anymore
cl_connectedToPureServer = qfalse;
}
@ -1033,23 +1034,7 @@ void CL_Connect_f( void ) {
if ( !Cvar_VariableValue("fs_restrict") && !Sys_CheckCD() )
{
int iLanguage = Cvar_VariableValue("sp_language");
//rww - we don't have an actual cvar object for sp_language to use here.
if (iLanguage) // dunno if SP files are loaded at this point if no CD...
{
switch (iLanguage)
{
case SP_LANGUAGE_GERMAN:
Com_Error( ERR_NEED_CD, "Spiel CD nicht im Laufwerk" );
break; // keep compiler happy
case SP_LANGUAGE_FRENCH:
Com_Error( ERR_NEED_CD, "CD de jeu pas dans le lecteur" );
break; // keep compiler happy
}
}
Com_Error( ERR_NEED_CD, "Game CD not in drive" );
Com_Error( ERR_NEED_CD, SP_GetStringTextString("CON_TEXT_NEED_CD") ); //"Game CD not in drive" );
}
if ( Cmd_Argc() != 2 ) {
@ -1238,6 +1223,7 @@ void CL_Vid_Restart_f( void ) {
// if not running a server clear the whole hunk
if ( !com_sv_running->integer ) {
CM_ClearMap();
// clear the whole hunk
Hunk_Clear();
}
@ -1665,7 +1651,11 @@ void CL_InitServerInfo( serverInfo_t *server, serverAddress_t *address ) {
server->game[0] = '\0';
server->gameType = 0;
server->netType = 0;
server->allowAnonymous = 0;
server->needPassword = qfalse;
server->trueJedi = 0;
server->weaponDisable = 0;
server->forceDisable = 0;
//server->pure = qfalse;
}
#define MAX_SERVERSPERPACKET 256
@ -2096,6 +2086,10 @@ void CL_CheckUserinfo( void ) {
}
#ifdef G2_COLLISION_ENABLED
extern CMiniHeap *G2VertSpaceServer;
#endif
/*
==================
CL_Frame
@ -2125,10 +2119,14 @@ void CL_Frame ( int msec ) {
if ( cl_avidemo->integer && msec) {
// save the current screen
if ( cls.state == CA_ACTIVE || cl_forceavidemo->integer) {
Cbuf_ExecuteText( EXEC_NOW, "screenshot silent\n" );
if (cl_avidemo->integer > 0) {
Cbuf_ExecuteText( EXEC_NOW, "screenshot silent\n" );
} else {
Cbuf_ExecuteText( EXEC_NOW, "screenshot_tga silent\n" );
}
}
// fixed time for next frame'
msec = (1000 / cl_avidemo->integer) * com_timescale->value;
msec = (1000 / abs(cl_avidemo->integer)) * com_timescale->value;
if (msec == 0) {
msec = 1;
}
@ -2194,7 +2192,13 @@ void CL_Frame ( int msec ) {
SCR_RunCinematic();
Con_RunConsole();
#ifdef G2_COLLISION_ENABLED
// reset the heap for Ghoul2 vert transform space gameside
if (G2VertSpaceServer)
{
G2VertSpaceServer->ResetHeap();
}
#endif
cls.framecount++;
}
@ -2260,7 +2264,7 @@ void CL_InitRenderer( void ) {
cls.whiteShader = re.RegisterShader( "white" );
cls.consoleShader = re.RegisterShader( "console" );
g_console_field_width = cls.glconfig.vidWidth / SMALLCHAR_WIDTH - 2;
g_consoleField.widthInChars = g_console_field_width;
kg.g_consoleField.widthInChars = g_console_field_width;
}
/*
@ -2401,19 +2405,9 @@ void CL_SetForcePowers_f( void ) {
return;
}
/*
=======================
Register_StringPackets
=======================
*/
void Register_StringPackets (void)
{
SP_Register("con_text", SP_REGISTER_REQUIRED); //reference is CON_TEXT
SP_Register("mp_ingame",SP_REGISTER_REQUIRED); //reference is INGAMETEXT
SP_Register("mp_svgame",SP_REGISTER_REQUIRED); //reference is SVINGAME
SP_Register("sp_ingame",SP_REGISTER_REQUIRED); //reference is INGAME , needed for item pickups
}
#ifdef G2_COLLISION_ENABLED
#define G2_VERT_SPACE_CLIENT_SIZE 256
#endif
/*
====================
@ -2423,8 +2417,6 @@ CL_Init
void CL_Init( void ) {
Com_Printf( "----- Client Initialization -----\n" );
Register_StringPackets();
Con_Init ();
CL_ClearState ();
@ -2565,6 +2557,10 @@ void CL_Init( void ) {
Cvar_Set( "cl_running", "1" );
#ifdef G2_COLLISION_ENABLED
G2VertSpaceClient = new CMiniHeap(G2_VERT_SPACE_CLIENT_SIZE * 1024);
#endif
Com_Printf( "----- Client Initialization Complete -----\n" );
}
@ -2586,6 +2582,14 @@ void CL_Shutdown( void ) {
}
recursive = qtrue;
#ifdef G2_COLLISION_ENABLED
if (G2VertSpaceClient)
{
delete G2VertSpaceClient;
G2VertSpaceClient = 0;
}
#endif
CL_Disconnect( qtrue );
CL_ShutdownRef(); //must be before shutdown all so the images get dumped in RE_Shutdown
@ -2639,7 +2643,12 @@ static void CL_SetServerInfo(serverInfo_t *server, const char *info, int ping) {
server->netType = atoi(Info_ValueForKey(info, "nettype"));
server->minPing = atoi(Info_ValueForKey(info, "minping"));
server->maxPing = atoi(Info_ValueForKey(info, "maxping"));
server->allowAnonymous = atoi(Info_ValueForKey(info, "sv_allowAnonymous"));
// server->allowAnonymous = atoi(Info_ValueForKey(info, "sv_allowAnonymous"));
server->needPassword = (qboolean)atoi(Info_ValueForKey(info, "needpass" ));
server->trueJedi = atoi(Info_ValueForKey(info, "truejedi" ));
server->weaponDisable = atoi(Info_ValueForKey(info, "wdisable" ));
server->forceDisable = atoi(Info_ValueForKey(info, "fdisable" ));
// server->pure = (qboolean)atoi(Info_ValueForKey(info, "pure" ));
}
server->ping = ping;
}
@ -2770,7 +2779,12 @@ void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) {
cls.localServers[i].game[0] = '\0';
cls.localServers[i].gameType = 0;
cls.localServers[i].netType = from.type;
cls.localServers[i].allowAnonymous = 0;
// cls.localServers[i].allowAnonymous = 0;
cls.localServers[i].needPassword = qfalse;
cls.localServers[i].trueJedi = 0;
cls.localServers[i].weaponDisable = 0;
cls.localServers[i].forceDisable = 0;
// cls.localServers[i].pure = qfalse;
Q_strncpyz( info, MSG_ReadString( msg ), MAX_INFO_STRING );
if (strlen(info)) {

View file

@ -152,10 +152,19 @@ static int LAN_AddServer(int source, const char *name, const char *address) {
case AS_FAVORITES :
count = &cls.numfavoriteservers;
servers = &cls.favoriteServers[0];
/* if (!name || !*name)
{
name = "?";
}
*/
break;
}
if (servers && *count < max) {
NET_StringToAdr( address, &adr );
if (adr.type == NA_BAD)
{
return -1;
}
for ( i = 0; i < *count; i++ ) {
if (NET_CompareAdr(servers[i].adr, adr)) {
break;
@ -204,7 +213,7 @@ static void LAN_RemoveServer(int source, const char *addr) {
netadr_t comp;
NET_StringToAdr( addr, &comp );
for (i = 0; i < *count; i++) {
if (NET_CompareAdr( comp, servers[i].adr)) {
if (servers[i].adr.type==NA_BAD || NET_CompareAdr( comp, servers[i].adr)) {
int j = i;
while (j < *count - 1) {
Com_Memcpy(&servers[j], &servers[j+1], sizeof(servers[j]));
@ -320,7 +329,12 @@ static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) {
Info_SetValueForKey( info, "gametype", va("%i",server->gameType));
Info_SetValueForKey( info, "nettype", va("%i",server->netType));
Info_SetValueForKey( info, "addr", NET_AdrToString(server->adr));
Info_SetValueForKey( info, "sv_allowAnonymous", va("%i", server->allowAnonymous));
// Info_SetValueForKey( info, "sv_allowAnonymous", va("%i", server->allowAnonymous));
Info_SetValueForKey( info, "needpass", va("%i", server->needPassword ) );
Info_SetValueForKey( info, "truejedi", va("%i", server->trueJedi ) );
Info_SetValueForKey( info, "wdisable", va("%i", server->weaponDisable ) );
Info_SetValueForKey( info, "fdisable", va("%i", server->forceDisable ) );
// Info_SetValueForKey( info, "pure", va("%i", server->pure ) );
Q_strncpyz(buf, info, buflen);
} else {
if (buf) {
@ -640,10 +654,21 @@ static void GetClipboardData( char *buf, int buflen ) {
Key_KeynumToStringBuf
====================
*/
static void Key_KeynumToStringBuf( int keynum, char *buf, int buflen ) {
Q_strncpyz( buf, Key_KeynumToString( keynum, qtrue ), buflen );
// only ever called by binding-display code, therefore returns non-technical "friendly" names
// in any language that don't necessarily match those in the config file...
//
void Key_KeynumToStringBuf( int keynum, char *buf, int buflen )
{
const char *psKeyName = Key_KeynumToString( keynum/*, qtrue */);
// see if there's a more friendly (or localised) name...
//
const char *psKeyNameFriendly = SP_GetStringTextString( va("KEYNAMES_KEYNAME_%s",psKeyName) );
Q_strncpyz( buf, (psKeyNameFriendly && psKeyNameFriendly[0]) ? psKeyNameFriendly : psKeyName, buflen );
}
/*
====================
Key_GetBindingBuf
@ -1045,8 +1070,14 @@ int CL_UISystemCalls( int *args ) {
re.Font_DrawString( args[1], args[2], (const char *)VMA(3), (const float *) VMA(4), args[5], args[6], VMF(7) );
return 0;
case UI_LANGUAGE_ISASIAN:
return re.Language_IsAsian();
case UI_LANGUAGE_USESSPACES:
return re.Language_UsesSpaces();
case UI_ANYLANGUAGE_READCHARFROMSTRING:
return re.AnyLanguage_ReadCharFromString( (const char **)VMA(1) );
return re.AnyLanguage_ReadCharFromString( (const char *)VMA(1), (int *) VMA(2), (qboolean *) VMA(3) );
case UI_MEMSET:
Com_Memset( VMA(1), args[2], args[3] );
@ -1181,7 +1212,6 @@ void CL_ShutdownUI( void ) {
CL_InitUI
====================
*/
#define UI_OLD_API_VERSION 4
void CL_InitUI( void ) {
int v;
@ -1202,12 +1232,7 @@ void CL_InitUI( void ) {
// sanity check
v = VM_Call( uivm, UI_GETAPIVERSION );
if (v == UI_OLD_API_VERSION) {
// Com_Printf(S_COLOR_YELLOW "WARNING: loading old Quake III Arena User Interface version %d\n", v );
// init for this gamestate
VM_Call( uivm, UI_INIT, (cls.state >= CA_AUTHORIZING && cls.state < CA_ACTIVE));
}
else if (v != UI_API_VERSION) {
if (v != UI_API_VERSION) {
Com_Error( ERR_DROP, "User Interface is version %d, expected %d", v, UI_API_VERSION );
cls.uiStarted = qfalse;
}

View file

@ -234,7 +234,12 @@ typedef struct {
int maxPing;
int ping;
qboolean visible;
int allowAnonymous;
// int allowAnonymous;
qboolean needPassword;
int trueJedi;
int weaponDisable;
int forceDisable;
// qboolean pure;
} serverInfo_t;
typedef struct {
@ -437,7 +442,7 @@ void IN_CenterView (void);
void CL_VerifyCode( void );
float CL_KeyState (kbutton_t *key);
char *Key_KeynumToString( int keynum, qboolean bTranslate ); //note: translate is only called for menu display not configs
const char *Key_KeynumToString( int keynum/*, qboolean bTranslate */ ); //note: translate is only called for menu display not configs
//
// cl_parse.c

165
CODE-mp/client/eax/EaxMan.h Normal file
View file

@ -0,0 +1,165 @@
/*
*/
#ifndef __EAXMANH
#define __EAXMANH
#define COM_NO_WINDOWS_H
#include <objbase.h>
#include "eax.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#define CLSID_EAXMANAGER CLSID_EAX20_Manager
#define IID_IEaxManager IID_EAX20_Manager
#define EM_MAX_NAME 32
#define EMFLAG_IDDEFAULT (-1)
#define EMFLAG_IDNONE (-2)
#define EMFLAG_LOCKPOSITION 1
#define EMFLAG_LOADFROMMEMORY 2
#define EMFLAG_NODIFFRACTION 4
typedef struct _EMPOINT {
float fX;
float fY;
float fZ;
} EMPOINT;
typedef EMPOINT FAR *LPEMPOINT;
typedef struct _LISTENERATTRIBUTES {
float fDistanceFactor;
float fRolloffFactor;
float fDopplerFactor;
} LISTENERATTRIBUTES;
typedef LISTENERATTRIBUTES FAR *LPLISTENERATTRIBUTES;
typedef struct _SOURCEATTRIBUTES {
EAXBUFFERPROPERTIES eaxAttributes;
unsigned long ulInsideConeAngle;
unsigned long ulOutsideConeAngle;
long lConeOutsideVolume;
float fConeXdir;
float fConeYdir;
float fConeZdir;
float fMinDistance;
float fMaxDistance;
long lDupCount;
long lPriority;
} SOURCEATTRIBUTES;
typedef SOURCEATTRIBUTES FAR *LPSOURCEATTRIBUTES;
typedef struct _MATERIALATTRIBUTES {
long lLevel;
float fLFRatio;
float fRoomRatio;
DWORD dwFlags;
} MATERIALATTRIBUTES;
typedef MATERIALATTRIBUTES FAR *LPMATERIALATTRIBUTES;
#define EMMATERIAL_OBSTRUCTS 1
#define EMMATERIAL_OCCLUDES 3
typedef struct _DIFFRACTIONBOX {
long lSubspaceID;
EMPOINT empMin;
EMPOINT empMax;
} DIFFRACTIONBOX;
typedef DIFFRACTIONBOX FAR *LPDIFFRACTIONBOX;
// {7CE4D6E6-562F-11d3-8812-005004062F83}
DEFINE_GUID(CLSID_EAXMANAGER, 0x60b721a1, 0xf7c8, 0x11d2, 0xa0, 0x2e, 0x0, 0x50, 0x4, 0x6, 0x18, 0xb8);
#ifdef __cplusplus
struct IEaxManager;
#endif // __cplusplus
typedef struct IEaxManager *LPEAXMANAGER;
// {7CE4D6E8-562F-11d3-8812-005004062F83}
DEFINE_GUID(IID_IEaxManager, 0x60b721a2, 0xf7c8, 0x11d2, 0xa0, 0x2e, 0x0, 0x50, 0x4, 0x6, 0x18, 0xb8);
#undef INTERFACE
#define INTERFACE IEaxManager
extern HRESULT __stdcall EaxManagerCreate(LPEAXMANAGER*);
typedef HRESULT (__stdcall *LPEAXMANAGERCREATE)(LPEAXMANAGER*);
DECLARE_INTERFACE_(IEaxManager, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
STDMETHOD(GetDataSetSize) (THIS_ unsigned long*, DWORD) PURE;
STDMETHOD(LoadDataSet) (THIS_ char*, DWORD) PURE;
STDMETHOD(FreeDataSet) (THIS_ DWORD) PURE;
STDMETHOD(GetListenerAttributes) (THIS_ LPLISTENERATTRIBUTES) PURE;
STDMETHOD(GetSourceID) (THIS_ char*, long*) PURE;
STDMETHOD(GetSourceAttributes) (THIS_ long, LPSOURCEATTRIBUTES) PURE;
STDMETHOD(GetSourceNumInstances) (THIS_ long, long*) PURE;
STDMETHOD(GetSourceInstancePos) (THIS_ long, long, LPEMPOINT) PURE;
STDMETHOD(GetEnvironmentID) (THIS_ char*, long*) PURE;
STDMETHOD(GetEnvironmentAttributes) (THIS_ long, LPEAXLISTENERPROPERTIES) PURE;
STDMETHOD(GetMaterialID) (THIS_ char*, long*) PURE;
STDMETHOD(GetMaterialAttributes) (THIS_ long, LPMATERIALATTRIBUTES) PURE;
STDMETHOD(GetGeometrySetID) (THIS_ char*, long*) PURE;
STDMETHOD(GetListenerDynamicAttributes) (THIS_ long, LPEMPOINT, long*, DWORD) PURE;
STDMETHOD(GetSourceDynamicAttributes) (THIS_ long, LPEMPOINT, long*, float*, long*, float*, float*, LPEMPOINT, DWORD) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IEaxManager_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IEaxManager_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IEaxManager_Release(p) (p)->lpVtbl->Release(p)
#define IEaxManager_GetDataSetSize(p,a,b) (p)->lpVtbl->GetDataSetSize(p,a,b)
#define IEaxManager_LoadDataSet(p,a,b) (p)->lpVtbl->LoadDataSet(p,a,b)
#define IEaxManager_FreeDataSet(p,a) (p)->lpVtbl->FreeDataSet(p,a)
#define IEaxManager_GetListenerAttributes(p,a) (p)->lpVtbl->GetListenerAttributes(p,a)
#define IEaxManager_GetSourceID(p,a,b) (p)->lpVtbl->GetSourceID(p,a,b)
#define IEaxManager_GetSourceAttributes(p,a,b) (p)->lpVtbl->GetSourceAttributes(p,a,b)
#define IEaxManager_GetSourceNumInstances(p,a,b) (p)->lpVtbl->GetSourceNumInstances(p,a,b)
#define IEaxManager_GetSourceInstancePos(p,a,b,c) (p)->lpVtbl->GetSourceInstancePos(p,a,b,c)
#define IEaxManager_GetEnvironmentID(p,a,b) (p)->lpVtbl->GetEnvironmentID(p,a,b)
#define IEaxManager_GetEnvironmentAttributes(p,a,b) (p)->lpVtbl->GetEnvironmentAttributes(p,a,b)
#define IEaxManager_GetMaterialID(p,a,b) (p)->lpVtbl->GetMaterialID(p,a,b)
#define IEaxManager_GetMaterialAttributes(p,a,b) (p)->lpVtbl->GetMaterialAttributes(p,a,b)
#define IEaxManager_GetGeometrySetID(p,a,b) (p)->lpVtbl->GetGeometrySetID(p,a,b)
#define IEaxManager_GetListenerDynamicAttributes(p,a,b,c,d) (p)->lpVtbl->GetListenerDynamicAttributes(p,a,b,c,d)
#define IEaxManager_GetSourceDynamicAttributes(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->GetSourceDynamicAttributes(p,a,b,c,d,e,f,g,h,i)
#else
#define IEaxManager_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IEaxManager_AddRef(p) (p)->AddRef()
#define IEaxManager_Release(p) (p)->Release()
#define IEaxManager_GetDataSetSize(p,a,b) (p)->GetDataSetSize(a,b)
#define IEaxManager_LoadDataSet(p,a,b) (p)->LoadDataSet(a,b)
#define IEaxManager_FreeDataSet(p,a) (p)->FreeDataSet(a)
#define IEaxManager_GetListenerAttributes(p,a) (p)->GetListenerAttributes(a)
#define IEaxManager_GetSourceID(p,a,b) (p)->GetSourceID(a,b)
#define IEaxManager_GetSourceAttributes(p,a,b) (p)->GetSourceAttributes(a,b)
#define IEaxManager_GetSourceNumInstances(p,a,b) (p)->GetSourceNumInstances(a,b)
#define IEaxManager_GetSourceInstancePos(p,a,b,c) (p)->GetSourceInstancePos(a,b,c)
#define IEaxManager_GetEnvironmentID(p,a,b) (p)->GetEnvironmentID(a,b)
#define IEaxManager_GetEnvironmentAttributes(p,a,b) (p)->GetEnvironmentAttributes(a,b)
#define IEaxManager_GetMaterialID(p,a,b) (p)->GetMaterialID(a,b)
#define IEaxManager_GetMaterialAttributes(p,a,b) (p)->GetMaterialAttributes(a,b)
#define IEaxManager_GetGeometrySetID(p,a,b) (p)->GetGeometrySetID(a,b)
#define IEaxManager_GetListenerDynamicAttributes(p,a,b,c,d) (p)->GetListenerDynamicAttributes(a,b,c,d)
#define IEaxManager_GetSourceDynamicAttributes(p,a,b,c,d,e,f,g,h,i) (p)->GetSourceDynamicAttributes(a,b,c,d,e,f,g,h,i)
#endif
#define EM_OK 0
#define EM_INVALIDID MAKE_HRESULT(1, FACILITY_ITF, 1)
#define EM_IDNOTFOUND MAKE_HRESULT(1, FACILITY_ITF, 2)
#define EM_FILENOTFOUND MAKE_HRESULT(1, FACILITY_ITF, 3)
#define EM_FILEINVALID MAKE_HRESULT(1, FACILITY_ITF, 4)
#define EM_VERSIONINVALID MAKE_HRESULT(1, FACILITY_ITF, 5)
#define EM_INSTANCENOTFOUND MAKE_HRESULT(1, FACILITY_ITF, 6)
#ifdef __cplusplus
};
#endif // __cplusplus
#endif

531
CODE-mp/client/eax/eax.h Normal file
View file

@ -0,0 +1,531 @@
/*******************************************************************\
* *
* EAX.H - Environmental Audio Extensions version 3.0 *
* for OpenAL and DirectSound3D *
* *
********************************************************************/
#ifndef EAX_H_INCLUDED
#define EAX_H_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#ifndef OPENAL
#include <dsound.h>
/*
* EAX Wrapper Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5}
*/
DEFINE_GUID(CLSID_EAXDirectSound,
0x4ff53b81,
0x1ce0,
0x11d3,
0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5);
/*
* EAX Wrapper Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C}
*/
DEFINE_GUID(CLSID_EAXDirectSound8,
0xca503b60,
0xb176,
0x11d4,
0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc);
#ifdef DIRECTSOUND_VERSION
#if DIRECTSOUND_VERSION == 0x0800
__declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate8(GUID*, LPDIRECTSOUND8*, IUnknown FAR *);
typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE8)(GUID*, LPDIRECTSOUND8*, IUnknown FAR*);
#endif
#endif
__declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate(GUID*, LPDIRECTSOUND*, IUnknown FAR *);
typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE)(GUID*, LPDIRECTSOUND*, IUnknown FAR*);
#else // OPENAL
#include "../OpenAl/al.h"
#ifndef GUID_DEFINED
#define GUID_DEFINED
typedef struct _GUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID;
#endif // !GUID_DEFINED
#ifndef DEFINE_GUID
#ifndef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
extern const GUID /*FAR*/ name
#else
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
extern const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#endif // INITGUID
#endif // DEFINE_GUID
/*
* EAX OpenAL Extension
*/
typedef ALenum (*EAXSet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint);
typedef ALenum (*EAXGet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint);
#endif
#pragma pack(push, 4)
/*
* EAX 3.0 listener property set {A8FA6880-B476-11d3-BDB9-00C0F02DDF87}
*/
DEFINE_GUID(DSPROPSETID_EAX30_ListenerProperties,
0xa8fa6882,
0xb476,
0x11d3,
0xbd, 0xb9, 0x00, 0xc0, 0xf0, 0x2d, 0xdf, 0x87);
// For compatibility with future EAX versions:
#define DSPROPSETID_EAX_ListenerProperties DSPROPSETID_EAX30_ListenerProperties
typedef enum
{
DSPROPERTY_EAXLISTENER_NONE,
DSPROPERTY_EAXLISTENER_ALLPARAMETERS,
DSPROPERTY_EAXLISTENER_ENVIRONMENT,
DSPROPERTY_EAXLISTENER_ENVIRONMENTSIZE,
DSPROPERTY_EAXLISTENER_ENVIRONMENTDIFFUSION,
DSPROPERTY_EAXLISTENER_ROOM,
DSPROPERTY_EAXLISTENER_ROOMHF,
DSPROPERTY_EAXLISTENER_ROOMLF,
DSPROPERTY_EAXLISTENER_DECAYTIME,
DSPROPERTY_EAXLISTENER_DECAYHFRATIO,
DSPROPERTY_EAXLISTENER_DECAYLFRATIO,
DSPROPERTY_EAXLISTENER_REFLECTIONS,
DSPROPERTY_EAXLISTENER_REFLECTIONSDELAY,
DSPROPERTY_EAXLISTENER_REFLECTIONSPAN,
DSPROPERTY_EAXLISTENER_REVERB,
DSPROPERTY_EAXLISTENER_REVERBDELAY,
DSPROPERTY_EAXLISTENER_REVERBPAN,
DSPROPERTY_EAXLISTENER_ECHOTIME,
DSPROPERTY_EAXLISTENER_ECHODEPTH,
DSPROPERTY_EAXLISTENER_MODULATIONTIME,
DSPROPERTY_EAXLISTENER_MODULATIONDEPTH,
DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF,
DSPROPERTY_EAXLISTENER_HFREFERENCE,
DSPROPERTY_EAXLISTENER_LFREFERENCE,
DSPROPERTY_EAXLISTENER_ROOMROLLOFFFACTOR,
DSPROPERTY_EAXLISTENER_FLAGS
} DSPROPERTY_EAX_LISTENERPROPERTY;
// OR these flags with property id
#define DSPROPERTY_EAXLISTENER_IMMEDIATE 0x00000000 // changes take effect immediately
#define DSPROPERTY_EAXLISTENER_DEFERRED 0x80000000 // changes take effect later
#define DSPROPERTY_EAXLISTENER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXLISTENER_NONE | \
DSPROPERTY_EAXLISTENER_IMMEDIATE)
typedef struct _EAXVECTOR {
float x;
float y;
float z;
} EAXVECTOR;
// Use this structure for DSPROPERTY_EAXLISTENER_ALLPARAMETERS
// - all levels are hundredths of decibels
// - all times and delays are in seconds
//
// NOTE: This structure may change in future EAX versions.
// It is recommended to initialize fields by name:
// myListener.lRoom = -1000;
// myListener.lRoomHF = -100;
// ...
// myListener.dwFlags = myFlags /* see EAXLISTENERFLAGS below */ ;
// instead of:
// myListener = { -1000, -100, ... , 0x00000009 };
// If you want to save and load presets in binary form, you
// should define your own structure to insure future compatibility.
//
typedef struct _EAXLISTENERPROPERTIES
{
unsigned long ulEnvironment; // sets all listener properties
float flEnvironmentSize; // environment size in meters
float flEnvironmentDiffusion; // environment diffusion
long lRoom; // room effect level (at mid frequencies)
long lRoomHF; // relative room effect level at high frequencies
long lRoomLF; // relative room effect level at low frequencies
float flDecayTime; // reverberation decay time at mid frequencies
float flDecayHFRatio; // high-frequency to mid-frequency decay time ratio
float flDecayLFRatio; // low-frequency to mid-frequency decay time ratio
long lReflections; // early reflections level relative to room effect
float flReflectionsDelay; // initial reflection delay time
EAXVECTOR vReflectionsPan; // early reflections panning vector
long lReverb; // late reverberation level relative to room effect
float flReverbDelay; // late reverberation delay time relative to initial reflection
EAXVECTOR vReverbPan; // late reverberation panning vector
float flEchoTime; // echo time
float flEchoDepth; // echo depth
float flModulationTime; // modulation time
float flModulationDepth; // modulation depth
float flAirAbsorptionHF; // change in level per meter at high frequencies
float flHFReference; // reference high frequency
float flLFReference; // reference low frequency
float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
unsigned long ulFlags; // modifies the behavior of properties
} EAXLISTENERPROPERTIES, *LPEAXLISTENERPROPERTIES;
// used by DSPROPERTY_EAXLISTENER_ENVIRONMENT
enum
{
EAX_ENVIRONMENT_GENERIC,
EAX_ENVIRONMENT_PADDEDCELL,
EAX_ENVIRONMENT_ROOM,
EAX_ENVIRONMENT_BATHROOM,
EAX_ENVIRONMENT_LIVINGROOM,
EAX_ENVIRONMENT_STONEROOM,
EAX_ENVIRONMENT_AUDITORIUM,
EAX_ENVIRONMENT_CONCERTHALL,
EAX_ENVIRONMENT_CAVE,
EAX_ENVIRONMENT_ARENA,
EAX_ENVIRONMENT_HANGAR,
EAX_ENVIRONMENT_CARPETEDHALLWAY,
EAX_ENVIRONMENT_HALLWAY,
EAX_ENVIRONMENT_STONECORRIDOR,
EAX_ENVIRONMENT_ALLEY,
EAX_ENVIRONMENT_FOREST,
EAX_ENVIRONMENT_CITY,
EAX_ENVIRONMENT_MOUNTAINS,
EAX_ENVIRONMENT_QUARRY,
EAX_ENVIRONMENT_PLAIN,
EAX_ENVIRONMENT_PARKINGLOT,
EAX_ENVIRONMENT_SEWERPIPE,
EAX_ENVIRONMENT_UNDERWATER,
EAX_ENVIRONMENT_DRUGGED,
EAX_ENVIRONMENT_DIZZY,
EAX_ENVIRONMENT_PSYCHOTIC,
EAX_ENVIRONMENT_UNDEFINED,
EAX_ENVIRONMENT_COUNT
};
// Used by DSPROPERTY_EAXLISTENER_FLAGS
//
// Note: The number and order of flags may change in future EAX versions.
// It is recommended to use the flag defines as follows:
// myFlags = EAXLISTENERFLAGS_DECAYTIMESCALE | EAXLISTENERFLAGS_REVERBSCALE;
// instead of:
// myFlags = 0x00000009;
//
// These flags determine what properties are affected by environment size.
#define EAXLISTENERFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time
#define EAXLISTENERFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level
#define EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time
#define EAXLISTENERFLAGS_REVERBSCALE 0x00000008 // reflections level
#define EAXLISTENERFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time
#define EAXLISTENERFLAGS_ECHOTIMESCALE 0x00000040 // echo time
#define EAXLISTENERFLAGS_MODULATIONTIMESCALE 0x00000080 // modulation time
// This flag limits high-frequency decay time according to air absorption.
#define EAXLISTENERFLAGS_DECAYHFLIMIT 0x00000020
#define EAXLISTENERFLAGS_RESERVED 0xFFFFFF00 // reserved future use
// Property ranges and defaults:
#define EAXLISTENER_MINENVIRONMENT 0
#define EAXLISTENER_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1)
#define EAXLISTENER_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC
#define EAXLISTENER_MINENVIRONMENTSIZE 1.0f
#define EAXLISTENER_MAXENVIRONMENTSIZE 100.0f
#define EAXLISTENER_DEFAULTENVIRONMENTSIZE 7.5f
#define EAXLISTENER_MINENVIRONMENTDIFFUSION 0.0f
#define EAXLISTENER_MAXENVIRONMENTDIFFUSION 1.0f
#define EAXLISTENER_DEFAULTENVIRONMENTDIFFUSION 1.0f
#define EAXLISTENER_MINROOM (-10000)
#define EAXLISTENER_MAXROOM 0
#define EAXLISTENER_DEFAULTROOM (-1000)
#define EAXLISTENER_MINROOMHF (-10000)
#define EAXLISTENER_MAXROOMHF 0
#define EAXLISTENER_DEFAULTROOMHF (-100)
#define EAXLISTENER_MINROOMLF (-10000)
#define EAXLISTENER_MAXROOMLF 0
#define EAXLISTENER_DEFAULTROOMLF 0
#define EAXLISTENER_MINDECAYTIME 0.1f
#define EAXLISTENER_MAXDECAYTIME 20.0f
#define EAXLISTENER_DEFAULTDECAYTIME 1.49f
#define EAXLISTENER_MINDECAYHFRATIO 0.1f
#define EAXLISTENER_MAXDECAYHFRATIO 2.0f
#define EAXLISTENER_DEFAULTDECAYHFRATIO 0.83f
#define EAXLISTENER_MINDECAYLFRATIO 0.1f
#define EAXLISTENER_MAXDECAYLFRATIO 2.0f
#define EAXLISTENER_DEFAULTDECAYLFRATIO 1.00f
#define EAXLISTENER_MINREFLECTIONS (-10000)
#define EAXLISTENER_MAXREFLECTIONS 1000
#define EAXLISTENER_DEFAULTREFLECTIONS (-2602)
#define EAXLISTENER_MINREFLECTIONSDELAY 0.0f
#define EAXLISTENER_MAXREFLECTIONSDELAY 0.3f
#define EAXLISTENER_DEFAULTREFLECTIONSDELAY 0.007f
#define EAXLISTENER_MINREVERB (-10000)
#define EAXLISTENER_MAXREVERB 2000
#define EAXLISTENER_DEFAULTREVERB 200
#define EAXLISTENER_MINREVERBDELAY 0.0f
#define EAXLISTENER_MAXREVERBDELAY 0.1f
#define EAXLISTENER_DEFAULTREVERBDELAY 0.011f
#define EAXLISTENER_MINECHOTIME 0.075f
#define EAXLISTENER_MAXECHOTIME 0.25f
#define EAXLISTENER_DEFAULTECHOTIME 0.25f
#define EAXLISTENER_MINECHODEPTH 0.0f
#define EAXLISTENER_MAXECHODEPTH 1.0f
#define EAXLISTENER_DEFAULTECHODEPTH 0.0f
#define EAXLISTENER_MINMODULATIONTIME 0.04f
#define EAXLISTENER_MAXMODULATIONTIME 4.0f
#define EAXLISTENER_DEFAULTMODULATIONTIME 0.25f
#define EAXLISTENER_MINMODULATIONDEPTH 0.0f
#define EAXLISTENER_MAXMODULATIONDEPTH 1.0f
#define EAXLISTENER_DEFAULTMODULATIONDEPTH 0.0f
#define EAXLISTENER_MINAIRABSORPTIONHF (-100.0f)
#define EAXLISTENER_MAXAIRABSORPTIONHF 0.0f
#define EAXLISTENER_DEFAULTAIRABSORPTIONHF (-5.0f)
#define EAXLISTENER_MINHFREFERENCE 1000.0f
#define EAXLISTENER_MAXHFREFERENCE 20000.0f
#define EAXLISTENER_DEFAULTHFREFERENCE 5000.0f
#define EAXLISTENER_MINLFREFERENCE 20.0f
#define EAXLISTENER_MAXLFREFERENCE 1000.0f
#define EAXLISTENER_DEFAULTLFREFERENCE 250.0f
#define EAXLISTENER_MINROOMROLLOFFFACTOR 0.0f
#define EAXLISTENER_MAXROOMROLLOFFFACTOR 10.0f
#define EAXLISTENER_DEFAULTROOMROLLOFFFACTOR 0.0f
#define EAXLISTENER_DEFAULTFLAGS (EAXLISTENERFLAGS_DECAYTIMESCALE | \
EAXLISTENERFLAGS_REFLECTIONSSCALE | \
EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE | \
EAXLISTENERFLAGS_REVERBSCALE | \
EAXLISTENERFLAGS_REVERBDELAYSCALE | \
EAXLISTENERFLAGS_DECAYHFLIMIT)
/*
* EAX 3.0 buffer property set {A8FA6881-B476-11d3-BDB9-00C0F02DDF87}
*/
DEFINE_GUID(DSPROPSETID_EAX30_BufferProperties,
0xa8fa6881,
0xb476,
0x11d3,
0xbd, 0xb9, 0x0, 0xc0, 0xf0, 0x2d, 0xdf, 0x87);
// For compatibility with future EAX versions:
#define DSPROPSETID_EAX_BufferProperties DSPROPSETID_EAX30_BufferProperties
#define DSPROPSETID_EAX_SourceProperties DSPROPSETID_EAX30_BufferProperties
typedef enum
{
DSPROPERTY_EAXBUFFER_NONE,
DSPROPERTY_EAXBUFFER_ALLPARAMETERS,
DSPROPERTY_EAXBUFFER_OBSTRUCTIONPARAMETERS,
DSPROPERTY_EAXBUFFER_OCCLUSIONPARAMETERS,
DSPROPERTY_EAXBUFFER_EXCLUSIONPARAMETERS,
DSPROPERTY_EAXBUFFER_DIRECT,
DSPROPERTY_EAXBUFFER_DIRECTHF,
DSPROPERTY_EAXBUFFER_ROOM,
DSPROPERTY_EAXBUFFER_ROOMHF,
DSPROPERTY_EAXBUFFER_OBSTRUCTION,
DSPROPERTY_EAXBUFFER_OBSTRUCTIONLFRATIO,
DSPROPERTY_EAXBUFFER_OCCLUSION,
DSPROPERTY_EAXBUFFER_OCCLUSIONLFRATIO,
DSPROPERTY_EAXBUFFER_OCCLUSIONROOMRATIO,
DSPROPERTY_EAXBUFFER_OCCLUSIONDIRECTRATIO,
DSPROPERTY_EAXBUFFER_EXCLUSION,
DSPROPERTY_EAXBUFFER_EXCLUSIONLFRATIO,
DSPROPERTY_EAXBUFFER_OUTSIDEVOLUMEHF,
DSPROPERTY_EAXBUFFER_DOPPLERFACTOR,
DSPROPERTY_EAXBUFFER_ROLLOFFFACTOR,
DSPROPERTY_EAXBUFFER_ROOMROLLOFFFACTOR,
DSPROPERTY_EAXBUFFER_AIRABSORPTIONFACTOR,
DSPROPERTY_EAXBUFFER_FLAGS
} DSPROPERTY_EAX_BUFFERPROPERTY;
// OR these flags with property id
#define DSPROPERTY_EAXBUFFER_IMMEDIATE 0x00000000 // changes take effect immediately
#define DSPROPERTY_EAXBUFFER_DEFERRED 0x80000000 // changes take effect later
#define DSPROPERTY_EAXBUFFER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXBUFFER_NONE | \
DSPROPERTY_EAXBUFFER_IMMEDIATE)
// Use this structure for DSPROPERTY_EAXBUFFER_ALLPARAMETERS
// - all levels are hundredths of decibels
// - all delays are in seconds
//
// NOTE: This structure may change in future EAX versions.
// It is recommended to initialize fields by name:
// myBuffer.lDirect = 0;
// myBuffer.lDirectHF = -200;
// ...
// myBuffer.dwFlags = myFlags /* see EAXBUFFERFLAGS below */ ;
// instead of:
// myBuffer = { 0, -200, ... , 0x00000003 };
//
typedef struct _EAXBUFFERPROPERTIES
{
long lDirect; // direct path level (at low and mid frequencies)
long lDirectHF; // relative direct path level at high frequencies
long lRoom; // room effect level (at low and mid frequencies)
long lRoomHF; // relative room effect level at high frequencies
long lObstruction; // main obstruction control (attenuation at high frequencies)
float flObstructionLFRatio; // obstruction low-frequency level re. main control
long lOcclusion; // main occlusion control (attenuation at high frequencies)
float flOcclusionLFRatio; // occlusion low-frequency level re. main control
float flOcclusionRoomRatio; // relative occlusion control for room effect
float flOcclusionDirectRatio; // relative occlusion control for direct path
long lExclusion; // main exlusion control (attenuation at high frequencies)
float flExclusionLFRatio; // exclusion low-frequency level re. main control
long lOutsideVolumeHF; // outside sound cone level at high frequencies
float flDopplerFactor; // like DS3D flDopplerFactor but per source
float flRolloffFactor; // like DS3D flRolloffFactor but per source
float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
float flAirAbsorptionFactor; // multiplies DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF
unsigned long ulFlags; // modifies the behavior of properties
} EAXBUFFERPROPERTIES, *LPEAXBUFFERPROPERTIES;
// Use this structure for DSPROPERTY_EAXBUFFER_OBSTRUCTION,
typedef struct _EAXOBSTRUCTIONPROPERTIES
{
long lObstruction;
float flObstructionLFRatio;
} EAXOBSTRUCTIONPROPERTIES, *LPEAXOBSTRUCTIONPROPERTIES;
// Use this structure for DSPROPERTY_EAXBUFFER_OCCLUSION
typedef struct _EAXOCCLUSIONPROPERTIES
{
long lOcclusion;
float flOcclusionLFRatio;
float flOcclusionRoomRatio;
float flOcclusionDirectRatio;
} EAXOCCLUSIONPROPERTIES, *LPEAXOCCLUSIONPROPERTIES;
// Use this structure for DSPROPERTY_EAXBUFFER_EXCLUSION
typedef struct _EAXEXCLUSIONPROPERTIES
{
long lExclusion;
float flExclusionLFRatio;
} EAXEXCLUSIONPROPERTIES, *LPEAXEXCLUSIONPROPERTIES;
// Used by DSPROPERTY_EAXBUFFER_FLAGS
// TRUE: value is computed automatically - property is an offset
// FALSE: value is used directly
//
// Note: The number and order of flags may change in future EAX versions.
// To insure future compatibility, use flag defines as follows:
// myFlags = EAXBUFFERFLAGS_DIRECTHFAUTO | EAXBUFFERFLAGS_ROOMAUTO;
// instead of:
// myFlags = 0x00000003;
//
#define EAXBUFFERFLAGS_DIRECTHFAUTO 0x00000001 // affects DSPROPERTY_EAXBUFFER_DIRECTHF
#define EAXBUFFERFLAGS_ROOMAUTO 0x00000002 // affects DSPROPERTY_EAXBUFFER_ROOM
#define EAXBUFFERFLAGS_ROOMHFAUTO 0x00000004 // affects DSPROPERTY_EAXBUFFER_ROOMHF
#define EAXBUFFERFLAGS_RESERVED 0xFFFFFFF8 // reserved future use
// Property ranges and defaults:
#define EAXBUFFER_MINDIRECT (-10000)
#define EAXBUFFER_MAXDIRECT 1000
#define EAXBUFFER_DEFAULTDIRECT 0
#define EAXBUFFER_MINDIRECTHF (-10000)
#define EAXBUFFER_MAXDIRECTHF 0
#define EAXBUFFER_DEFAULTDIRECTHF 0
#define EAXBUFFER_MINROOM (-10000)
#define EAXBUFFER_MAXROOM 1000
#define EAXBUFFER_DEFAULTROOM 0
#define EAXBUFFER_MINROOMHF (-10000)
#define EAXBUFFER_MAXROOMHF 0
#define EAXBUFFER_DEFAULTROOMHF 0
#define EAXBUFFER_MINOBSTRUCTION (-10000)
#define EAXBUFFER_MAXOBSTRUCTION 0
#define EAXBUFFER_DEFAULTOBSTRUCTION 0
#define EAXBUFFER_MINOBSTRUCTIONLFRATIO 0.0f
#define EAXBUFFER_MAXOBSTRUCTIONLFRATIO 1.0f
#define EAXBUFFER_DEFAULTOBSTRUCTIONLFRATIO 0.0f
#define EAXBUFFER_MINOCCLUSION (-10000)
#define EAXBUFFER_MAXOCCLUSION 0
#define EAXBUFFER_DEFAULTOCCLUSION 0
#define EAXBUFFER_MINOCCLUSIONLFRATIO 0.0f
#define EAXBUFFER_MAXOCCLUSIONLFRATIO 1.0f
#define EAXBUFFER_DEFAULTOCCLUSIONLFRATIO 0.25f
#define EAXBUFFER_MINOCCLUSIONROOMRATIO 0.0f
#define EAXBUFFER_MAXOCCLUSIONROOMRATIO 10.0f
#define EAXBUFFER_DEFAULTOCCLUSIONROOMRATIO 1.5f
#define EAXBUFFER_MINOCCLUSIONDIRECTRATIO 0.0f
#define EAXBUFFER_MAXOCCLUSIONDIRECTRATIO 10.0f
#define EAXBUFFER_DEFAULTOCCLUSIONDIRECTRATIO 1.0f
#define EAXBUFFER_MINEXCLUSION (-10000)
#define EAXBUFFER_MAXEXCLUSION 0
#define EAXBUFFER_DEFAULTEXCLUSION 0
#define EAXBUFFER_MINEXCLUSIONLFRATIO 0.0f
#define EAXBUFFER_MAXEXCLUSIONLFRATIO 1.0f
#define EAXBUFFER_DEFAULTEXCLUSIONLFRATIO 1.0f
#define EAXBUFFER_MINOUTSIDEVOLUMEHF (-10000)
#define EAXBUFFER_MAXOUTSIDEVOLUMEHF 0
#define EAXBUFFER_DEFAULTOUTSIDEVOLUMEHF 0
#define EAXBUFFER_MINDOPPLERFACTOR 0.0f
#define EAXBUFFER_MAXDOPPLERFACTOR 10.f
#define EAXBUFFER_DEFAULTDOPPLERFACTOR 0.0f
#define EAXBUFFER_MINROLLOFFFACTOR 0.0f
#define EAXBUFFER_MAXROLLOFFFACTOR 10.f
#define EAXBUFFER_DEFAULTROLLOFFFACTOR 0.0f
#define EAXBUFFER_MINROOMROLLOFFFACTOR 0.0f
#define EAXBUFFER_MAXROOMROLLOFFFACTOR 10.f
#define EAXBUFFER_DEFAULTROOMROLLOFFFACTOR 0.0f
#define EAXBUFFER_MINAIRABSORPTIONFACTOR 0.0f
#define EAXBUFFER_MAXAIRABSORPTIONFACTOR 10.0f
#define EAXBUFFER_DEFAULTAIRABSORPTIONFACTOR 1.0f
#define EAXBUFFER_DEFAULTFLAGS (EAXBUFFERFLAGS_DIRECTHFAUTO | \
EAXBUFFERFLAGS_ROOMAUTO | \
EAXBUFFERFLAGS_ROOMHFAUTO )
#pragma pack(pop)
#ifdef __cplusplus
}
#endif // __cplusplus
#endif

Binary file not shown.

View file

@ -1,17 +1,14 @@
#include "../ui/keycodes.h"
#define MAX_KEYS 256
typedef struct {
qboolean down;
int repeats; // if > 1, it is autorepeating
char *binding;
} qkey_t;
extern qboolean key_overstrikeMode;
extern qkey_t keys[MAX_KEYS];
#define MAX_EDIT_LINE 256
#define COMMAND_HISTORY 32
#define MAX_EDIT_LINE 256
typedef struct {
int cursor;
int scroll;
@ -19,18 +16,43 @@ typedef struct {
char buffer[MAX_EDIT_LINE];
} field_t;
typedef struct keyGlobals_s
{
field_t historyEditLines[COMMAND_HISTORY];
int nextHistoryLine; // the last line in the history buffer, not masked
int historyLine; // the line being displayed from history buffer
// will be <= nextHistoryLine
field_t g_consoleField;
qboolean anykeydown;
qboolean key_overstrikeMode;
int keyDownCount;
qkey_t keys[MAX_KEYS];
} keyGlobals_t;
typedef struct
{
word upper;
word lower;
char *name;
int keynum;
bool menukey;
} keyname_t;
extern keyGlobals_t kg;
extern keyname_t keynames[MAX_KEYS];
void Field_Clear( field_t *edit );
void Field_KeyDownEvent( field_t *edit, int key );
void Field_CharEvent( field_t *edit, int ch );
void Field_Draw( field_t *edit, int x, int y, int width, qboolean showCursor );
void Field_BigDraw( field_t *edit, int x, int y, int width, qboolean showCursor );
#define COMMAND_HISTORY 32
extern field_t historyEditLines[COMMAND_HISTORY];
extern field_t g_consoleField;
extern field_t chatField;
extern qboolean anykeydown;
extern qboolean chat_team;
extern int chat_playerNum;

File diff suppressed because it is too large Load diff

View file

@ -8,6 +8,16 @@
#include "snd_public.h"
#include "../mp3code/mp3struct.h"
// Open AL Specific
#include "openal\al.h"
#include "openal\alc.h"
#include <objbase.h>
#include "eax\eax.h"
#include "eax\eaxman.h"
// Added for Open AL to know when to mute all sounds (e.g when app. loses focus)
void S_MuteAllSounds(bool bMute);
#define PAINTBUFFER_SIZE 4096 // this is in samples
#define SND_CHUNK_SIZE 1024 // samples
@ -54,9 +64,27 @@ typedef struct sfx_s {
float fVolRange; // used to set the highest volume this sample has at load time - used for lipsynching
int iLastLevelUsedOn; // used for cacheing purposes
struct sfx_s *next; // only used because of hash table when registering
// Open AL
ALuint Buffer;
} sfx_t;
// Open AL specific
typedef struct
{
ALuint BufferID;
ALuint Status;
char *Data;
} STREAMINGBUFFER;
#define NUM_STREAMING_BUFFERS 4
#define STREAMING_BUFFER_SIZE 4608 // 4 decoded MP3 frames
#define QUEUED 1
#define UNQUEUED 2
typedef struct {
int channels;
int samples; // mono samples in buffer
@ -80,6 +108,10 @@ typedef struct loopSound_s {
float oldDopplerScale;
int framenum;
// Open AL
bool bProcessed;
bool bPlaying;
bool bRelative;
} loopSound_t;
typedef struct
@ -104,6 +136,15 @@ typedef struct
byte MP3SlidingDecodeBuffer[50000/*12000*/]; // typical back-request = -3072, so roughly double is 6000 (safety), then doubled again so the 6K pos is in the middle of the buffer)
int iMP3SlidingDecodeWritePos;
int iMP3SlidingDecodeWindowPos;
// Open AL specific
bool bLooping; // Signifies if this channel / source is playing a looping sound
bool bProcessed; // Signifies if this channel / source has been processed
bool bStreaming; // Set to true if the data needs to be streamed (MP3 or dialogue)
STREAMINGBUFFER buffers[NUM_STREAMING_BUFFERS]; // AL Buffers for streaming
ALuint alSource; // Open AL Source
bool bPlaying; // Set to true when a sound is playing on this channel / source
int iStartTime; // Time playback of Source begins
} channel_t;

View file

@ -15,6 +15,9 @@
#include "snd_mp3.h"
// Open AL
extern int s_UseOpenAL;
/*
===============================================================================
@ -230,30 +233,48 @@ static qboolean S_LoadSound_FileLoadAndNameAdjuster(char *psFilename, byte **pDa
if (com_buildScript->integer)
{
fileHandle_t hFile;
//German
strncpy(psVoice,"chr_d",5); // same number of letters as "chars"
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache this file
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache the wav
if (!hFile)
{
strcpy(&psFilename[iNameStrlen-3],"mp3"); //not there try mp3
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache this file
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache the mp3
}
if (hFile)
{
FS_FCloseFile(hFile);
}
strcpy(&psFilename[iNameStrlen-3],"wav");
strcpy(&psFilename[iNameStrlen-3],"wav"); //put it back to wav
//French
strncpy(psVoice,"chr_f",5); // same number of letters as "chars"
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cahce this file
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache the wav
if (!hFile)
{
strcpy(&psFilename[iNameStrlen-3],"mp3"); //not there try mp3
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache this file
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache the mp3
}
if (hFile)
{
FS_FCloseFile(hFile);
}
strcpy(&psFilename[iNameStrlen-3],"wav"); //put it back to wav
//Spanish
strncpy(psVoice,"chr_e",5); // same number of letters as "chars"
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache the wav
if (!hFile)
{
strcpy(&psFilename[iNameStrlen-3],"mp3"); //not there try mp3
FS_FOpenFileRead(psFilename, &hFile, qfalse); //cache the mp3
}
if (hFile)
{
FS_FCloseFile(hFile);
}
strcpy(&psFilename[iNameStrlen-3],"wav"); //put it back to wav
strncpy(psVoice,"chars",5); //put it back to chars
}
@ -264,11 +285,14 @@ static qboolean S_LoadSound_FileLoadAndNameAdjuster(char *psFilename, byte **pDa
{
strncpy(psVoice,"chr_d",5); // same number of letters as "chars"
}
else
if (s_language && stricmp("FRANCAIS",s_language->string)==0)
else if (s_language && stricmp("FRANCAIS",s_language->string)==0)
{
strncpy(psVoice,"chr_f",5); // same number of letters as "chars"
}
else if (s_language && stricmp("ESPANOL",s_language->string)==0)
{
strncpy(psVoice,"chr_e",5); // same number of letters as "chars"
}
else
{
psVoice = NULL; // use this ptr as a flag as to whether or not we substituted with a foreign version
@ -340,6 +364,7 @@ static qboolean S_LoadSound_Actual( sfx_t *sfx )
short *samples;
wavinfo_t info;
int size;
ALuint Buffer;
// player specific sounds are never directly loaded...
//
@ -406,6 +431,27 @@ static qboolean S_LoadSound_Actual( sfx_t *sfx )
S_LoadSound_Finalize(&info,sfx,pbUnpackBuffer);
// Open AL
if (s_UseOpenAL)
{
// Clear Open AL Error state
alGetError();
// Generate AL Buffer
alGenBuffers(1, &Buffer);
if (alGetError() == AL_NO_ERROR)
{
// Copy audio data to AL Buffer
alBufferData(Buffer, AL_FORMAT_MONO16, sfx->pSoundData, sfx->iSoundLengthInSamples*2, 22050);
if (alGetError() == AL_NO_ERROR)
{
sfx->Buffer = Buffer;
Z_Free(sfx->pSoundData);
sfx->pSoundData = NULL;
}
}
}
Z_Free(pbUnpackBuffer);
}
}
@ -452,6 +498,28 @@ static qboolean S_LoadSound_Actual( sfx_t *sfx )
sfx->pSoundData = NULL;
ResampleSfx( sfx, info.rate, info.width, data + info.dataofs );
// Open AL
if (s_UseOpenAL)
{
// Clear Open AL Error State
alGetError();
// Generate AL Buffer
alGenBuffers(1, &Buffer);
if (alGetError() == AL_NO_ERROR)
{
// Copy audio data to AL Buffer
alBufferData(Buffer, AL_FORMAT_MONO16, sfx->pSoundData, sfx->iSoundLengthInSamples*2, 22050);
if (alGetError() == AL_NO_ERROR)
{
// Store AL Buffer in sfx struct, and release sample data
sfx->Buffer = Buffer;
Z_Free(sfx->pSoundData);
sfx->pSoundData = NULL;
}
}
}
Z_Free(samples);
}

View file

@ -523,10 +523,18 @@ qboolean MP3_ReadSpecialTagInfo(byte *pbLoadedFile, int iLoadedFileLen, // (in)
#define FUZZY_AMOUNT (5*1024) // so it has to be significantly over, not just break even, because of
// the xtra CPU time versus memory saving
#define OPENAL_FUZZY_AMOUNT (100*1024) // Speed up CPU time even more, at the cost of a bit more memory of course :)
cvar_t* cv_MP3overhead = NULL;
void MP3_InitCvars(void)
{
cv_MP3overhead = Cvar_Get("s_mp3overhead", va("%d", sizeof(MP3STREAM) + FUZZY_AMOUNT), CVAR_ARCHIVE );
extern int s_UseOpenAL;
if (s_UseOpenAL)
{
cv_MP3overhead->value += OPENAL_FUZZY_AMOUNT;
}
}

View file

@ -47,5 +47,5 @@ void S_DisplayFreeMemory(void);
void S_ClearSoundBuffer( void );
void SNDDMA_Activate( void );
void SNDDMA_Activate( qboolean bAppActive );

Binary file not shown.

View file

@ -61,6 +61,7 @@ boteventtracker_t gBotEventTracker[MAX_CLIENTS];
//rww - new bot cvars..
vmCvar_t bot_forcepowers;
vmCvar_t bot_forgimmick;
vmCvar_t bot_honorableduelacceptance;
#ifdef _DEBUG
vmCvar_t bot_nogoals;
vmCvar_t bot_debugmessages;
@ -5686,6 +5687,7 @@ void StandardBotAI(bot_state_t *bs, float thinktime)
}
trap_Cvar_Update(&bot_forgimmick);
trap_Cvar_Update(&bot_honorableduelacceptance);
if (bot_forgimmick.integer)
{
@ -5693,6 +5695,11 @@ void StandardBotAI(bot_state_t *bs, float thinktime)
bs->currentEnemy = NULL;
bs->wpDestination = NULL;
bs->wpDirection = 0;
if (bot_forgimmick.integer == 2)
{ //for debugging saber stuff, this is handy
trap_EA_Attack(bs->client);
}
return;
}
@ -6044,42 +6051,43 @@ void StandardBotAI(bot_state_t *bs, float thinktime)
}
}
/*
if (bs->currentEnemy && bs->currentEnemy->client &&
bs->cur_ps.weapon == WP_SABER &&
g_privateDuel.integer &&
bs->frame_Enemy_Vis &&
bs->frame_Enemy_Len < 400 &&
bs->currentEnemy->client->ps.weapon == WP_SABER &&
bs->currentEnemy->client->ps.saberHolstered)
if (bot_honorableduelacceptance.integer)
{
vec3_t e_ang_vec;
if (bs->currentEnemy && bs->currentEnemy->client &&
bs->cur_ps.weapon == WP_SABER &&
g_privateDuel.integer &&
bs->frame_Enemy_Vis &&
bs->frame_Enemy_Len < 400 &&
bs->currentEnemy->client->ps.weapon == WP_SABER &&
bs->currentEnemy->client->ps.saberHolstered)
{
vec3_t e_ang_vec;
VectorSubtract(bs->currentEnemy->client->ps.origin, bs->eye, e_ang_vec);
VectorSubtract(bs->currentEnemy->client->ps.origin, bs->eye, e_ang_vec);
if (InFieldOfVision(bs->viewangles, 100, e_ang_vec))
{ //Our enemy has his saber holstered and has challenged us to a duel, so challenge him back
if (!bs->cur_ps.saberHolstered)
{
Cmd_ToggleSaber_f(&g_entities[bs->client]);
}
else
{
if (bs->currentEnemy->client->ps.duelIndex == bs->client &&
bs->currentEnemy->client->ps.duelTime > level.time &&
!bs->cur_ps.duelInProgress)
if (InFieldOfVision(bs->viewangles, 100, e_ang_vec))
{ //Our enemy has his saber holstered and has challenged us to a duel, so challenge him back
if (!bs->cur_ps.saberHolstered)
{
Cmd_EngageDuel_f(&g_entities[bs->client]);
Cmd_ToggleSaber_f(&g_entities[bs->client]);
}
else
{
if (bs->currentEnemy->client->ps.duelIndex == bs->client &&
bs->currentEnemy->client->ps.duelTime > level.time &&
!bs->cur_ps.duelInProgress)
{
Cmd_EngageDuel_f(&g_entities[bs->client]);
}
}
}
bs->doAttack = 0;
bs->doAltAttack = 0;
bs->botChallengingTime = level.time + 100;
bs->beStill = level.time + 100;
bs->doAttack = 0;
bs->doAltAttack = 0;
bs->botChallengingTime = level.time + 100;
bs->beStill = level.time + 100;
}
}
}
*/
//Apparently this "allows you to cheese" when fighting against bots. I'm not sure why you'd want to con bots
//into an easy kill, since they're bots and all. But whatever.
@ -6914,7 +6922,7 @@ void StandardBotAI(bot_state_t *bs, float thinktime)
else
{
#endif
if (bot_forcepowers.integer)
if (bot_forcepowers.integer && !g_forcePowerDisable.integer)
{
trap_EA_ForcePower(bs->client);
}
@ -7006,6 +7014,7 @@ int BotAISetup( int restart ) {
//rww - new bot cvars..
trap_Cvar_Register(&bot_forcepowers, "bot_forcepowers", "1", CVAR_CHEAT);
trap_Cvar_Register(&bot_forgimmick, "bot_forgimmick", "0", CVAR_CHEAT);
trap_Cvar_Register(&bot_honorableduelacceptance, "bot_honorableduelacceptance", "0", CVAR_CHEAT);
#ifdef _DEBUG
trap_Cvar_Register(&bot_nogoals, "bot_nogoals", "0", CVAR_CHEAT);
trap_Cvar_Register(&bot_debugmessages, "bot_debugmessages", "0", CVAR_CHEAT);

View file

@ -374,6 +374,7 @@ char *ConcatArgs( int start );
extern vmCvar_t bot_forcepowers;
extern vmCvar_t bot_forgimmick;
extern vmCvar_t bot_honorableduelacceptance;
#ifdef _DEBUG
extern vmCvar_t bot_nogoals;
extern vmCvar_t bot_debugmessages;

View file

@ -8,8 +8,9 @@ typedef enum //# animNumber_e
//=================================================
//ANIMS IN WHICH UPPER AND LOWER OBJECTS ARE IN MD3
//=================================================
BOTH_1CRUFTFORGIL = 0, //# G2 cannot have a reverse anim at beginning of file
//# #sep BOTH_ DEATHS
BOTH_DEATH1 = 0, //# First Death anim
BOTH_DEATH1, //# First Death anim
BOTH_DEATH2, //# Second Death anim
BOTH_DEATH3, //# Third Death anim
BOTH_DEATH4, //# Fourth Death anim
@ -23,13 +24,17 @@ typedef enum //# animNumber_e
BOTH_DEATH12, //#
BOTH_DEATH13, //#
BOTH_DEATH14, //#
BOTH_DEATH14_UNGRIP, //# Desann's end death (cin #35)
BOTH_DEATH14_SITUP, //# Tavion sitting up after having been thrown (cin #23)
BOTH_DEATH15, //#
BOTH_DEATH16, //#
BOTH_DEATH17, //#
BOTH_DEATH18, //#
BOTH_DEATH19, //#
BOTH_DEATH20, //#
BOTH_DEATH21, //#
BOTH_DEATH22, //#
BOTH_DEATH23, //#
BOTH_DEATH24, //#
BOTH_DEATH25, //#
BOTH_DEATHFORWARD1, //# First Death in which they get thrown forward
BOTH_DEATHFORWARD2, //# Second Death in which they get thrown forward
@ -73,6 +78,12 @@ typedef enum //# animNumber_e
BOTH_DEAD17, //#
BOTH_DEAD18, //#
BOTH_DEAD19, //#
BOTH_DEAD20, //#
BOTH_DEAD21, //#
BOTH_DEAD22, //#
BOTH_DEAD23, //#
BOTH_DEAD24, //#
BOTH_DEAD25, //#
BOTH_DEADFORWARD1, //# First thrown forward death finished pose
BOTH_DEADFORWARD2, //# Second thrown forward death finished pose
BOTH_DEADBACKWARD1, //# First thrown backward death finished pose
@ -124,6 +135,7 @@ typedef enum //# animNumber_e
//# #sep BOTH_ ATTACKS
BOTH_ATTACK1, //# Attack with stun baton
BOTH_ATTACK2, //# Attack with one-handed pistol
BOTH_ATTACK2IDLE1, //# Idle with one-handed pistol
BOTH_ATTACK3, //# Attack with blaster rifle
BOTH_ATTACK4, //# Attack with disruptor
BOTH_ATTACK5, //# Attack with bow caster
@ -608,19 +620,28 @@ typedef enum //# animNumber_e
BOTH_CWCIRCLELOCK, //#
BOTH_CCWCIRCLELOCK, //#
BOTH_SABERFAST_STANCE,
BOTH_SABERSLOW_STANCE,
BOTH_A2_STABBACK1, //# Stab saber backward
BOTH_ATTACK_BACK, //# Swing around backwards and attack
BOTH_JUMPFLIPSLASHDOWN1,//#
BOTH_JUMPFLIPSTABDOWN,//#
BOTH_FORCELEAP2_T__B_,//#
BOTH_LUNGE2_B__T_,//#
BOTH_CROUCHATTACKBACK1,//#
//# #sep BOTH_ STANDING
BOTH_STAND1, //# Standing idle, no weapon, hands down
BOTH_STAND1_RANDOM1, //# Random standing idle
BOTH_STAND1_RANDOM2, //# Random standing idle
BOTH_STAND2, //# Standing idle with a weapon
BOTH_STAND2_RANDOM1, //# Random standing idle
BOTH_STAND2_RANDOM2, //# Random standing idle
BOTH_STAND2_RANDOM3, //# Random standing idle
BOTH_STAND2_RANDOM4, //# Random standing idle
BOTH_STAND3, //# Standing hands behind back, at ease, etc.
BOTH_STAND1IDLE1, //# Random standing idle
BOTH_STAND2, //# Standing idle with a saber
BOTH_STAND2IDLE1, //# Random standing idle
BOTH_STAND2IDLE2, //# Random standing idle
BOTH_STAND3, //# Standing idle with 2-handed weapon
BOTH_STAND3IDLE1, //# Random standing idle
BOTH_STAND4, //# hands clasp behind back
BOTH_STAND4IDLE1, //# Random standing idle
BOTH_STAND5, //# standing idle, no weapon, hand down, back straight
BOTH_STAND5IDLE1, //# Random standing idle
BOTH_STAND6, //# one handed, gun at side, relaxed stand
BOTH_STAND7, //# both hands on hips (female)
BOTH_STAND8, //# both hands on hips (male)
@ -639,8 +660,21 @@ typedef enum //# animNumber_e
BOTH_STAND5_REELO, //# Reelo in his stand5 position (cin #18)
BOTH_STAND1TOSTAND5, //# Transition from stand1 to stand5
BOTH_STAND5TOSTAND1, //# Transition from stand5 to stand1
BOTH_STAND5TOAIM, //# Transition of Kye aiming his gun at Desann (cin #9)
BOTH_STAND5STARTLEDLOOKLEFT, //# Kyle turning to watch the bridge drop (cin #9)
BOTH_STARTLEDLOOKLEFTTOSTAND5, //# Kyle returning to stand 5 from watching the bridge drop (cin #9)
BOTH_STAND5TOSTAND8, //# Transition from stand5 to stand8
BOTH_STAND7TOSTAND8, //# Tavion putting hands on back of chair (cin #11)
BOTH_STAND8TOSTAND5, //# Transition from stand8 to stand5
BOTH_STAND5SHIFTWEIGHT, //# Weightshift from stand5 to side and back to stand5
BOTH_STAND5SHIFTWEIGHTSTART, //# From stand5 to side
BOTH_STAND5SHIFTWEIGHTSTOP, //# From side to stand5
BOTH_STAND5TURNLEFTSTART, //# Start turning left from stand5
BOTH_STAND5TURNLEFTSTOP, //# Stop turning left from stand5
BOTH_STAND5TURNRIGHTSTART, //# Start turning right from stand5
BOTH_STAND5TURNRIGHTSTOP, //# Stop turning right from stand5
BOTH_STAND5LOOK180LEFTSTART, //# Start looking over left shoulder (cin #17)
BOTH_STAND5LOOK180LEFTSTOP, //# Stop looking over left shoulder (cin #17)
BOTH_CONSOLE1START, //# typing at a console
BOTH_CONSOLE1, //# typing at a console
@ -648,6 +682,8 @@ typedef enum //# animNumber_e
BOTH_CONSOLE2START, //# typing at a console with comm link in hand (cin #5)
BOTH_CONSOLE2, //# typing at a console with comm link in hand (cin #5)
BOTH_CONSOLE2STOP, //# typing at a console with comm link in hand (cin #5)
BOTH_CONSOLE2HOLDCOMSTART, //# lean in to type at console while holding comm link in hand (cin #5)
BOTH_CONSOLE2HOLDCOMSTOP, //# lean away after typing at console while holding comm link in hand (cin #5)
BOTH_GUARD_LOOKAROUND1, //# Cradling weapon and looking around
BOTH_GUARD_IDLE1, //# Cradling weapon and standing
@ -655,6 +691,51 @@ typedef enum //# animNumber_e
BOTH_GESTURE1, //# Generic gesture, non-specific
BOTH_GESTURE2, //# Generic gesture, non-specific
BOTH_GESTURE3, //# Generic gesture, non-specific
BOTH_WALK1TALKCOMM1, //# Talking into coom link while walking
BOTH_TALK1, //# Generic talk anim
BOTH_TALK2, //# Generic talk anim
BOTH_TALKCOMM1START, //# Start talking into a comm link
BOTH_TALKCOMM1, //# Talking into a comm link
BOTH_TALKCOMM1STOP, //# Stop talking into a comm link
BOTH_TALKGESTURE1, //# Generic talk anim
BOTH_TALKGESTURE2, //# Generic talk anim
BOTH_TALKGESTURE3, //# Generic talk anim
BOTH_TALKGESTURE4START, //# Beginning talk anim 4
BOTH_TALKGESTURE4, //# Talk gesture 4
BOTH_TALKGESTURE4STOP, //# Ending talk anim 4
BOTH_TALKGESTURE5START, //# Start hand on chin
BOTH_TALKGESTURE5, //# Hand on chin
BOTH_TALKGESTURE5STOP, //# Stop hand on chin
BOTH_TALKGESTURE6START, //# Starting Motions to self
BOTH_TALKGESTURE6, //# Pointing at self
BOTH_TALKGESTURE6STOP, //# Ending Motions to self
BOTH_TALKGESTURE7START, //# Start touches Kyle on shoulder
BOTH_TALKGESTURE7, //# Hold touches Kyle on shoulder
BOTH_TALKGESTURE7STOP, //# Ending touches Kyle on shoulder
BOTH_TALKGESTURE8START, //# Lando's chin hold
BOTH_TALKGESTURE8, //# Lando's chin hold
BOTH_TALKGESTURE8STOP, //# Lando's chin hold
BOTH_TALKGESTURE9, //# Same as gesture 2 but with the right hand
BOTH_TALKGESTURE10, //# Shoulder shrug
BOTH_TALKGESTURE11START, //# Arms folded across chest
BOTH_TALKGESTURE11STOP, //# Arms folded across chest
BOTH_TALKGESTURE12, //# Tavion taunting Kyle
BOTH_TALKGESTURE13START, //# Luke warning Kyle
BOTH_TALKGESTURE13, //# Luke warning Kyle
BOTH_TALKGESTURE13STOP, //# Luke warning Kyle
BOTH_TALKGESTURE14, //# Luke gesturing to Kyle
BOTH_TALKGESTURE15START, //# Desann taunting Kyle
BOTH_TALKGESTURE15, //# Desann taunting Kyle
BOTH_TALKGESTURE15STOP, //# Desann taunting Kyle
BOTH_TALKGESTURE16, //# Bartender gesture cin #15
BOTH_TALKGESTURE17, //# Bartender gesture cin #15
BOTH_TALKGESTURE18, //# Bartender gesture cin #15
BOTH_TALKGESTURE19START, //# Desann lifting his arm "Join me" (cin #34)
BOTH_TALKGESTURE19STOP, //# Desann lifting his arm "Join me" (cin #34)
BOTH_TALKGESTURE20START, //# Kyle lifting his arm "Join us" (cin #34)
BOTH_TALKGESTURE21, //# generic talk gesture from stand3
BOTH_TALKGESTURE22, //# generic talk gesture from stand3
BOTH_TALKGESTURE23, //# generic talk gesture from stand3
BOTH_PAUSE1START, //# Luke pauses to warn Kyle (cin #24) start
BOTH_PAUSE1STOP, //# Luke pauses to warn Kyle (cin #24) stop
@ -671,6 +752,8 @@ typedef enum //# animNumber_e
BOTH_SITHEADTILTRSTOP, //# Head tilt to right from seated position
BOTH_SITHEADNOD, //# Head shake YES from seated position
BOTH_SITHEADSHAKE, //# Head shake NO from seated position
BOTH_SIT2HEADTILTLSTART, //# Head tilt to left from seated position 2
BOTH_SIT2HEADTILTLSTOP, //# Head tilt to left from seated position 2
BOTH_REACH1START, //# Monmothma reaching for crystal
BOTH_REACH1STOP, //# Monmothma reaching for crystal
@ -685,13 +768,6 @@ typedef enum //# animNumber_e
BOTH_EXAMINE3, //# Hold Lando looking around corner
BOTH_EXAMINE3STOP, //# End Lando looking around corner
BOTH_THROW1START, //# Kyle thrown to the right
BOTH_THROW1, //# Kyle thrown to the right
BOTH_THROW1STOP, //# Kyle thrown to the right
BOTH_THROW2START, //# Kyle thrown to the left
BOTH_THROW2, //# Kyle thrown to the left
BOTH_THROW3, //# Kyle thrown backwards in cin #9
BOTH_LEANLEFT2START, //# Start leaning left in chair
BOTH_LEANLEFT2STOP, //# Stop leaning left in chair
BOTH_LEANRIGHT3START, //# Start Lando leaning on wall
@ -727,6 +803,26 @@ typedef enum //# animNumber_e
BOTH_LAUGH1STOP, //# Reelo laughing (cin #18)
BOTH_ESCAPEPOD_LEAVE1, //# Kyle leaving escape pod (cin #33)
BOTH_ESCAPEPOD_LEAVE2, //# Jan leaving escape pod (cin #33)
BOTH_HUGGER1, //# Kyle hugging Jan (cin #29)
BOTH_HUGGERSTOP1, //# Kyle stop hugging Jan but don't let her go (cin #29)
BOTH_HUGGERSTOP2, //# Kyle let go of Jan and step back (cin #29)
BOTH_HUGGEE1, //# Jan being hugged (cin #29)
BOTH_HUGGEESTOP1, //# Jan stop being hugged but don't let go (cin #29)
BOTH_HUGGEESTOP2, //# Jan released from hug (cin #29)
BOTH_KISSER1, //# Temp until the Kiss anim gets split up
BOTH_KISSER1START1, //# Kyle start kissing Jan
BOTH_KISSER1START2, //# Kyle start kissing Jan
BOTH_KISSER1LOOP, //# Kyle loop kissing Jan
BOTH_KISSER1STOP, //# Temp until the Kiss anim gets split up
BOTH_KISSER1STOP1, //# Kyle stop kissing but don't let go
BOTH_KISSER1STOP2, //# Kyle step back from Jan
BOTH_KISSEE1, //# Temp until the Kiss anim gets split up
BOTH_KISSEE1START1, //# Jan start being kissed
BOTH_KISSEE1START2, //# Jan start being kissed
BOTH_KISSEE1LOOP, //# Jan loop being kissed
BOTH_KISSEE1STOP, //# Temp until the Kiss anim gets split up
BOTH_KISSEE1STOP1, //# Jan stop being kissed but don't let go
BOTH_KISSEE1STOP2, //# Jan wait for Kyle to step back
BOTH_BARTENDER_IDLE1, //# Bartender idle in cin #15
BOTH_BARTENDER_THROW1, //# Bartender throws glass in cin #15
BOTH_BARTENDER_COWERSTART, //# Start of Bartender raising both hands up in surrender (cin #16)
@ -736,6 +832,7 @@ typedef enum //# animNumber_e
BOTH_THREATEN1, //# Kyle threatening Bartender with lightsaber (cin #16)
BOTH_RADIO_ONOFF, //# Mech Galak turning on his suit radio (cin #32)
BOTH_TRIUMPHANT1START, //# Mech Galak raising his arms in victory (cin #32)
BOTH_TRIUMPHANT1STARTGESTURE, //# Mech Galak raising his arms in victory (cin #32)
BOTH_TRIUMPHANT1STOP, //# Mech Galak lowering his arms in victory (cin #32)
BOTH_SABERTHROW1START, //# Desann throwing his light saber (cin #26)
@ -759,6 +856,8 @@ typedef enum //# animNumber_e
BOTH_SIT2TO3, //# Trans from sit2 to sit3?
BOTH_SIT2TOSTAND5, //# Transition from sit 2 to stand 5
BOTH_STAND5TOSIT2, //# Transition from stand 5 to sit 2
BOTH_SIT2TOSIT4, //# Trans from sit2 to sit4 (cin #12) Luke leaning back from lotus position.
BOTH_SIT3TO1, //# Trans from sit3 to sit1?
BOTH_SIT3TO2, //# Trans from sit3 to sit2?
BOTH_SIT3TOSTAND5, //# transition from sit 3 to stand 5
@ -781,21 +880,20 @@ typedef enum //# animNumber_e
BOTH_CROUCH2TOSTAND1, //# going from crouch2 to stand1
BOTH_CROUCH3, //# Desann crouching down to Kyle (cin 9)
BOTH_UNCROUCH3, //# Desann uncrouching down to Kyle (cin 9)
BOTH_CROUCH4, //# Slower version of crouch1 for cinematics
BOTH_UNCROUCH4, //# Slower version of uncrouch1 for cinematics
BOTH_GET_UP1, //# Get up from the ground, face down
BOTH_GET_UP2, //# Get up from the ground, face up
BOTH_COCKPIT_CONSOLE1, //# work console1 while sitting in a cockpit.
BOTH_COCKPIT_CONSOLE2, //# work console2 while sitting in a cockpit.
BOTH_COCKPIT_SIT, //# sit in a cockpit.
BOTH_GUNSIT1, //# sitting on an emplaced gun.
BOTH_DEATH14_UNGRIP, //# Desann's end death (cin #35)
BOTH_DEATH14_SITUP, //# Tavion sitting up after having been thrown (cin #23)
BOTH_KNEES1, //# Tavion on her knees
BOTH_KNEES2, //# Tavion on her knees looking down
BOTH_KNEES2TO1, //# Transition of KNEES2 to KNEES1
BOTH_STRUGGLE1START, //# Kyle struggling under crate
BOTH_STRUGGLE1, //# Kyle struggling under crate
BOTH_STRUGGLE1STOP, //# Kyle struggling under crate
BOTH_RUMMAGE1START, //# Kyle rummaging for crystal (cin 2)
BOTH_RUMMAGE1, //# Kyle rummaging for crystal (cin 2)
BOTH_RUMMAGE1STOP, //# Kyle rummaging for crystal (cin 2)
@ -811,6 +909,9 @@ typedef enum //# animNumber_e
BOTH_WALK5, //# Tavion taunting Kyle (cin 22)
BOTH_WALK6, //# Slow walk for Luke (cin 12)
BOTH_WALK7, //# Fast walk
BOTH_WALK8, //# Normal walk with hands behind back (Luke in cin#12)
BOTH_WALK9, //# Lando walk (cin #17)
BOTH_WALK10, //# Lando walk (cin #17)
BOTH_WALKTORUN1, //# transition from walk to run
BOTH_RUN1, //# Full run
BOTH_RUN1START, //# Start into full run1
@ -823,10 +924,12 @@ typedef enum //# animNumber_e
BOTH_RUNSTRAFE_RIGHT1, //# Sidestep right, should loop
BOTH_TURN_LEFT1, //# Turn left, should loop
BOTH_TURN_RIGHT1, //# Turn right, should loop
BOTH_TURNSTAND1, //# Turn from STAND1 position
BOTH_TURNSTAND2, //# Turn from STAND2 position
BOTH_TURNSTAND3, //# Turn from STAND3 position
BOTH_TURNSTAND4, //# Turn from STAND4 position
BOTH_TURNSTAND5, //# Turn from STAND5 position
BOTH_TURNCROUCH1, //# Turn from CROUCH1 position
BOTH_RUNAWAY1, //# Running scared
BOTH_SWIM1, //# Swimming
@ -897,16 +1000,7 @@ typedef enum //# animNumber_e
BOTH_DIVE1, //# Dive!
BOTH_SABERFAST_STANCE,
BOTH_SABERSLOW_STANCE,
BOTH_ENGAGETAUNT,
BOTH_A2_STABBACK1, //# Stab saber backward
BOTH_ATTACK_BACK, //# Swing around backwards and attack
BOTH_JUMPFLIPSLASHDOWN1,//#
BOTH_JUMPFLIPSTABDOWN,//#
BOTH_FORCELEAP2_T__B_,//#
BOTH_LUNGE2_B__T_,//#
BOTH_CROUCHATTACKBACK1,//#
BOTH_ARIAL_LEFT, //#
BOTH_ARIAL_RIGHT, //#
BOTH_CARTWHEEL_LEFT, //#
@ -962,10 +1056,6 @@ typedef enum //# animNumber_e
BOTH_ARIAL_F1,//#
BOTH_BUTTERFLY_FR1,//#
BOTH_BUTTERFLY_FL1,//#
BOTH_POSE1,//#
BOTH_POSE2,//#
BOTH_POSE3,//#
BOTH_POSE4,//#
//# #sep BOTH_ MISC MOVEMENT
BOTH_HIT1, //# Kyle hit by crate in cin #9
@ -998,12 +1088,7 @@ typedef enum //# animNumber_e
//# #sep BOTH_ SWIMMING
BOTH_SWIM_IDLE1, //# Swimming Idle 1
BOTH_SWIMFORWARDSTART, //# Swim forward start
BOTH_SWIMFORWARD, //# Swim forward loop
BOTH_SWIMFORWARDSTOP, //# Swim forward end
BOTH_SWIMBACKWARDSTART, //# Swim backward start
BOTH_SWIMBACKWARD, //# Swim backward loop
BOTH_SWIMBACKWARDSTOP, //# Swim backward end
//# #sep BOTH_ LYING
BOTH_LIE_DOWN1, //# From a stand position, get down on ground, face down
@ -1029,6 +1114,26 @@ typedef enum //# animNumber_e
BOTH_PROPUP1, //# Kyle getting up from having been knocked down (cin #9 end)
BOTH_CRAWLBACK1, //# Lying on back, crawling backwards with elbows
BOTH_SITWALL1, //# Sitting against a wall
BOTH_SLEEP1, //# laying on back-rknee up-rhand on torso
BOTH_SLEEP2, //# on floor-back against wall-arms crossed
BOTH_SLEEP3, //# Sleeping in a chair
BOTH_SLEEP4, //# Sleeping slumped over table
BOTH_SLEEP5, //# Laying on side sleeping on flat sufrace
BOTH_SLEEP6START, //# Kyle leaning back to sleep (cin 20)
BOTH_SLEEP6STOP, //# Kyle waking up and shaking his head (cin 21)
BOTH_SLEEP1GETUP, //# alarmed and getting up out of sleep1 pose to stand
BOTH_SLEEP1GETUP2, //#
BOTH_SLEEP2GETUP, //# alarmed and getting up out of sleep2 pose to stand
BOTH_SLEEP3GETUP, //# alarmed and getting up out of sleep3 pose to stand
BOTH_SLEEP3DEATH, //# death in chair, from sleep3 idle
BOTH_SLEEP3DEAD, //# death in chair, from sleep3 idle
BOTH_SLEEP_IDLE1, //# rub face and nose while asleep from sleep pose 1
BOTH_SLEEP_IDLE2, //# shift position while asleep - stays in sleep2
BOTH_SLEEP_IDLE3, //# Idle anim from sleep pose 3
BOTH_SLEEP_IDLE4, //# Idle anim from sleep pose 4
BOTH_SLEEP1_NOSE, //# Scratch nose from SLEEP1 pose
BOTH_SLEEP2_SHIFT, //# Shift in sleep from SLEEP2 pose
BOTH_RESTRAINED1, //# Telsia tied to medical table
BOTH_RESTRAINED1POINT, //# Telsia tied to medical table pointing at Munro
BOTH_LIFTED1, //# Fits with BOTH_LIFT1, lifted on shoulder
@ -1060,6 +1165,7 @@ typedef enum //# animNumber_e
BOTH_MINDTRICK1, //# Use off-hand to do mind trick
BOTH_MINDTRICK2, //# Use off-hand to do distraction
BOTH_FORCELIGHTNING, //# Use off-hand to do lightning
BOTH_FORCELIGHTNING_START, //# Use off-hand to do lightning - start
BOTH_FORCELIGHTNING_HOLD, //# Use off-hand to do lightning - hold
BOTH_FORCELIGHTNING_RELEASE,//# Use off-hand to do lightning - release
BOTH_FORCEHEAL_START, //# Healing meditation pose start
@ -1067,13 +1173,51 @@ typedef enum //# animNumber_e
BOTH_FORCEHEAL_QUICK, //# Healing meditation gesture
BOTH_SABERPULL, //# Use off-hand to do force power.
BOTH_FORCEGRIP1, //# force-gripping (no anim?)
BOTH_FORCEGRIP2, //# force-gripping (?)
BOTH_FORCEGRIP3, //# force-gripping (right hand)
BOTH_FORCEGRIP3THROW, //# throwing while force-gripping (right hand)
BOTH_FORCEGRIP_HOLD, //# Use off-hand to do grip - hold
BOTH_FORCEGRIP_RELEASE,//# Use off-hand to do grip - release
BOTH_TOSS1, //# throwing to left after force gripping
BOTH_TOSS2, //# throwing to right after force gripping
BOTH_COCKPIT_TALKR1START, //# turn head from straight forward to looking full right
BOTH_COCKPIT_TALKR1STARTTOMID, //# from TALKR1START to looking at hologram (cin #1)
BOTH_COCKPIT_TALKR1MIDTOSTART, //# from looking at hologram to TALKR1START (cin #1)
BOTH_COCKPIT_TALKR1STOP, //# return head to straight forward from BOTH_COCKPIT_TALKR1
BOTH_COCKPIT_TALKR1STOPTOMID, //# from TALKR1STOP to TALKR1MID
BOTH_COCKPIT_TALKR1MIDTOSTOP, //# from looking at hologram to TALKR1STOP (cin #1)
BOTH_COCKPIT_TALKR1, //# talk to right side
BOTH_COCKPIT_TALKL1START, //# turn head from straight forward to looking full left
BOTH_COCKPIT_TALKL1STARTTOMID, //# from TALKL1START to looking at hologram (cin #1)
BOTH_COCKPIT_TALKL1MIDTOSTART, //# from looking at hologram to TALKL1START (cin #1)
BOTH_COCKPIT_TALKL1STOP, //# return head to straight forward from BOTH_COCKPIT_TALKL1
BOTH_COCKPIT_TALKL1STOPTOMID, //# from TALKL1STOP to TALKL1MID
BOTH_COCKPIT_TALKL1MIDTOSTOP, //# from looking at hologram to TALKL1STOP (cin #1)
BOTH_COCKPIT_TALKL1, //# talk to left side
BOTH_COCKPIT_CONSOLE1, //# type at controls
BOTH_COCKPIT_CONSOLE2, //# type at controls
BOTH_COCKPIT_CONSOLE2_PARTIAL, //# last part of console2 anim (cin #1) used by Jan
BOTH_COCKPIT_HEADNOD, //# nod head yes while sitting
BOTH_COCKPIT_HEADSHAKE, //# shake head no while sitting
BOTH_COCKPIT_HEADTILTLSTART, //# start tilt head left while sitting
BOTH_COCKPIT_HEADTILTLSTOP, //# stop tilt head left while sitting
BOTH_COCKPIT_HEADTILTRSTART, //# start tilt head right while sitting
BOTH_COCKPIT_HEADTILTRSTOP, //# stop tilt head right while sitting
BOTH_COCKPIT_TALKGESTURE7START, //# Lando's supporting hand to Kyle (cin #21)
BOTH_COCKPIT_TALKGESTURE7STOP, //# Lando's supporting hand away from Kyle (cin #21)
BOTH_COCKPIT_TALKGESTURE8START, //# Hand to Lando's chin (cin #21)
BOTH_COCKPIT_TALKGESTURE8STOP, //# hand away from Lando's chin *cin #21)
BOTH_COCKPIT_TALKGESTURE11START, //#
BOTH_COCKPIT_TALKGESTURE11STOP, //#
BOTH_COCKPIT_SLEEP6START, //#
BOTH_COCKPIT_SLEEP6STOP, //#
//=================================================
//ANIMS IN WHICH ONLY THE UPPER OBJECTS ARE IN MD3
//=================================================
@ -1111,25 +1255,7 @@ typedef enum //# animNumber_e
TORSO_WEAPONIDLE11, //# Holding laser trap
TORSO_WEAPONIDLE12, //# Holding detpack
//# #sep TORSO_ USING NON-WEAPON OBJECTS
//# #sep TORSO_ MISC
TORSO_TALKR1START, //# begin turning head for BOTH_TORSO_TALKR
TORSO_TALKR1HOLD, //# non-looping version of talk to right side
TORSO_TALKR1STOP, //# return head to straight forward from BOTH_TORSO_TALKL
TORSO_TALKR1, //# talk to right side
TORSO_TALKL1START, //# begin turning head for BOTH_TORSO_TALKL
TORSO_TALKL1HOLD, //# non-looping version of talk to left side
TORSO_TALKL1STOP, //# return head to straight forward from BOTH_TORSO_TALKL
TORSO_TALKL1, //# talk to left side
TORSO_LOOKL1, //# looking left
TORSO_LOOKR1, //# looking right
TORSO_LOOKR2START, //# turn not so far as TALKR1
TORSO_LOOKR2STOP, //# turn not so far as TALKR1
TORSO_LOOKR2, //# looking right - not so far as LOOKR1
TORSO_LOOKL2START, //# turn not so far as TALKL1
TORSO_LOOKL2STOP, //# turn not so far as TALKL1
TORSO_LOOKL2, //# looking right - not so far as LOOKL1
TORSO_HANDGESTURE1, //# gestures to left one hand
TORSO_HANDGESTURE2, //# gestures to right one hand
TORSO_HANDGESTURE3, //# gestures to the left both hands

View file

@ -61,6 +61,7 @@ void trap_FS_FCloseFile( fileHandle_t f );
//PM anim utility functions:
qboolean PM_SaberInParry( int move );
qboolean PM_SaberInKnockaway( int move );
qboolean PM_SaberInReflect( int move );
qboolean PM_SaberInStart( int move );
qboolean PM_InSaberAnim( int anim );

View file

@ -394,12 +394,6 @@ qboolean BG_LegalizedForcePowers(char *powerOut, int maxRank, qboolean freeSaber
}
}
if (final_Powers[FP_SABERATTACK] < 1)
{
final_Powers[FP_SABERDEFEND] = 0;
final_Powers[FP_SABERTHROW] = 0;
}
if (freeSaber)
{
if (final_Powers[FP_SABERATTACK] < 1)
@ -416,6 +410,7 @@ qboolean BG_LegalizedForcePowers(char *powerOut, int maxRank, qboolean freeSaber
final_Powers[FP_LEVITATION] = 1;
}
/*
if (fpDisabled)
{
final_Powers[FP_LEVITATION] = 1;
@ -423,6 +418,31 @@ qboolean BG_LegalizedForcePowers(char *powerOut, int maxRank, qboolean freeSaber
final_Powers[FP_SABERDEFEND] = 3;
final_Powers[FP_SABERTHROW] = 0;
}
*/
//Ahh. I have no idea why I did this, but I would say that it makes me a very bad man.
if (fpDisabled)
{ //If we specifically have attack or def disabled, force them up to level 3. It's the way
//things work for the case of all powers disabled.
//If jump is disabled, down-cap it to level 1. Otherwise don't do a thing.
if (fpDisabled & (1 << FP_LEVITATION))
{
final_Powers[FP_LEVITATION] = 1;
}
if (fpDisabled & (1 << FP_SABERATTACK))
{
final_Powers[FP_SABERATTACK] = 3;
}
if (fpDisabled & (1 << FP_SABERDEFEND))
{
final_Powers[FP_SABERDEFEND] = 3;
}
}
if (final_Powers[FP_SABERATTACK] < 1)
{
final_Powers[FP_SABERDEFEND] = 0;
final_Powers[FP_SABERTHROW] = 0;
}
//We finally have all the force powers legalized and stored locally.
//Put them all into the string and return the result. We already have
@ -1276,6 +1296,11 @@ qboolean BG_CanUseFPNow(int gametype, playerState_t *ps, int time, forcePowers_t
return qfalse;
}
if ( ps->forceRestricted || ps->trueNonJedi )
{
return qfalse;
}
if (ps->duelInProgress)
{
if (power != FP_SABERATTACK && power != FP_SABERDEFEND && power != FP_SABERTHROW &&
@ -1581,13 +1606,39 @@ qboolean BG_CanItemBeGrabbed( int gametype, const entityState_t *ent, const play
item = &bg_itemlist[ent->modelindex];
if (ps && ps->isJediMaster && item && (item->giType == IT_WEAPON || item->giType == IT_AMMO))
if ( ps )
{
return qfalse;
if ( ps->trueJedi )
{//force powers and saber only
if ( item->giType != IT_TEAM //not a flag
&& item->giType != IT_ARMOR//not shields
&& (item->giType != IT_WEAPON || item->giTag != WP_SABER)//not a saber
&& (item->giType != IT_HOLDABLE || item->giTag != HI_SEEKER)//not a seeker
&& (item->giType != IT_POWERUP || item->giTag == PW_YSALAMIRI) )//not a force pick-up
{
return qfalse;
}
}
else if ( ps->trueNonJedi )
{//can't pick up force powerups
if ( (item->giType == IT_POWERUP && item->giTag != PW_YSALAMIRI) //if a powerup, can only can pick up ysalamiri
|| (item->giType == IT_HOLDABLE && item->giTag == HI_SEEKER)//if holdable, cannot pick up seeker
|| (item->giType == IT_WEAPON && item->giTag == WP_SABER ) )//or if it's a saber
{
return qfalse;
}
}
if ( ps->isJediMaster && item && (item->giType == IT_WEAPON || item->giType == IT_AMMO))
{//jedi master cannot pick up weapons
return qfalse;
}
if ( ps->duelInProgress )
{ //no picking stuff up while in a duel, no matter what the type is
return qfalse;
}
}
if (ps && ps->duelInProgress)
{ //no picking stuff up while in a duel, no matter what the type is
else
{//safety return since below code assumes a non-null ps
return qfalse;
}
@ -2131,6 +2182,8 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean
s->isJediMaster = ps->isJediMaster;
s->time2 = ps->holocronBits;
s->fireflag = ps->fd.saberAnimLevel;
}
/*
@ -2269,6 +2322,8 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s
s->isJediMaster = ps->isJediMaster;
s->time2 = ps->holocronBits;
s->fireflag = ps->fd.saberAnimLevel;
}
/*

View file

@ -114,7 +114,7 @@ qboolean BG_SaberInIdle( int move )
qboolean BG_FlippingAnim( int anim )
{
switch ( anim )
switch ( anim&~ANIM_TOGGLEBIT )
{
case BOTH_FLIP_F: //# Flip forward
case BOTH_FLIP_B: //# Flip backwards
@ -151,7 +151,7 @@ qboolean BG_FlippingAnim( int anim )
qboolean BG_SpinningSaberAnim( int anim )
{
switch ( anim )
switch ( anim&~ANIM_TOGGLEBIT )
{
//level 1 - FIXME: level 1 will have *no* spins
case BOTH_T1_BR_BL:
@ -236,6 +236,103 @@ qboolean BG_SaberInSpecialAttack( int anim )
return qfalse;
}
int BG_BrokenParryForAttack( int move )
{
//Our attack was knocked away by a knockaway parry
//FIXME: need actual anims for this
//FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center
switch ( saberMoveData[move].startQuad )
{
case Q_B:
return LS_V1_B_;
break;
case Q_BR:
return LS_V1_BR;
break;
case Q_R:
return LS_V1__R;
break;
case Q_TR:
return LS_V1_TR;
break;
case Q_T:
return LS_V1_T_;
break;
case Q_TL:
return LS_V1_TL;
break;
case Q_L:
return LS_V1__L;
break;
case Q_BL:
return LS_V1_BL;
break;
}
return LS_NONE;
}
int BG_BrokenParryForParry( int move )
{
//FIXME: need actual anims for this
//FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center
switch ( move )
{
case LS_PARRY_UP:
//Hmm... since we don't know what dir the hit came from, randomly pick knock down or knock back
if ( Q_irand( 0, 1 ) )
{
return LS_H1_B_;
}
else
{
return LS_H1_T_;
}
break;
case LS_PARRY_UR:
return LS_H1_TR;
break;
case LS_PARRY_UL:
return LS_H1_TL;
break;
case LS_PARRY_LR:
return LS_H1_BR;
break;
case LS_PARRY_LL:
return LS_H1_BL;
break;
case LS_READY:
return LS_H1_B_;//???
break;
}
return LS_NONE;
}
int BG_KnockawayForParry( int move )
{
//FIXME: need actual anims for this
//FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center
switch ( move )
{
case BLOCKED_TOP://LS_PARRY_UP:
return LS_K1_T_;//push up
break;
case BLOCKED_UPPER_RIGHT://LS_PARRY_UR:
default://case LS_READY:
return LS_K1_TR;//push up, slightly to right
break;
case BLOCKED_UPPER_LEFT://LS_PARRY_UL:
return LS_K1_TL;//push up and to left
break;
case BLOCKED_LOWER_RIGHT://LS_PARRY_LR:
return LS_K1_BR;//push down and to left
break;
case BLOCKED_LOWER_LEFT://LS_PARRY_LL:
return LS_K1_BL;//push down and to right
break;
}
//return LS_NONE;
}
qboolean BG_InRoll( playerState_t *ps, int anim )
{
switch ( (anim&~ANIM_TOGGLEBIT) )
@ -285,6 +382,77 @@ qboolean BG_InDeathAnim( int anim )
}
//Called only where pm is valid (not all require pm, but some do):
int PM_SaberBounceForAttack( int move )
{
switch ( saberMoveData[move].startQuad )
{
case Q_B:
case Q_BR:
return LS_B1_BR;
break;
case Q_R:
return LS_B1__R;
break;
case Q_TR:
return LS_B1_TR;
break;
case Q_T:
return LS_B1_T_;
break;
case Q_TL:
return LS_B1_TL;
break;
case Q_L:
return LS_B1__L;
break;
case Q_BL:
return LS_B1_BL;
break;
}
return LS_NONE;
}
int PM_SaberDeflectionForQuad( int quad )
{
switch ( quad )
{
case Q_B:
return LS_D1_B_;
break;
case Q_BR:
return LS_D1_BR;
break;
case Q_R:
return LS_D1__R;
break;
case Q_TR:
return LS_D1_TR;
break;
case Q_T:
return LS_D1_T_;
break;
case Q_TL:
return LS_D1_TL;
break;
case Q_L:
return LS_D1__L;
break;
case Q_BL:
return LS_D1_BL;
break;
}
return LS_NONE;
}
qboolean PM_SaberInDeflect( int move )
{
if ( move >= LS_D1_BR && move <= LS_D1_B_ )
{
return qtrue;
}
return qfalse;
}
qboolean PM_SaberInParry( int move )
{
if ( move >= LS_PARRY_UP && move <= LS_PARRY_LL )
@ -294,6 +462,15 @@ qboolean PM_SaberInParry( int move )
return qfalse;
}
qboolean PM_SaberInKnockaway( int move )
{
if ( move >= LS_K1_T_ && move <= LS_K1_BL )
{
return qtrue;
}
return qfalse;
}
qboolean PM_SaberInReflect( int move )
{
if ( move >= LS_REFLECT_UP && move <= LS_REFLECT_LL )
@ -312,6 +489,15 @@ qboolean PM_SaberInStart( int move )
return qfalse;
}
qboolean PM_SaberInReturn( int move )
{
if ( move >= LS_R_TL2BR && move <= LS_R_TL2BR )
{
return qtrue;
}
return qfalse;
}
qboolean PM_InSaberAnim( int anim )
{
if ( (anim&~ANIM_TOGGLEBIT) >= BOTH_A1_T__B_ && (anim&~ANIM_TOGGLEBIT) <= BOTH_H1_S1_BR )
@ -544,6 +730,34 @@ char BGPAFtext[40000];
qboolean BGPAFtextLoaded = qfalse;
animation_t bgGlobalAnimations[MAX_TOTALANIMATIONS];
//#define CONVENIENT_ANIMATION_FILE_DEBUG_THING
#ifdef CONVENIENT_ANIMATION_FILE_DEBUG_THING
void SpewDebugStuffToFile()
{
fileHandle_t f;
int i = 0;
trap_FS_FOpenFile("file_of_debug_stuff_MP.txt", &f, FS_WRITE);
if (!f)
{
return;
}
BGPAFtext[0] = 0;
while (i < MAX_ANIMATIONS)
{
strcat(BGPAFtext, va("%i %i\n", i, bgGlobalAnimations[i].frameLerp));
i++;
}
trap_FS_Write(BGPAFtext, strlen(BGPAFtext), f);
trap_FS_FCloseFile(f);
}
#endif
qboolean BG_ParseAnimationFile(const char *filename)
{
char *text_p;
@ -673,6 +887,9 @@ qboolean BG_ParseAnimationFile(const char *filename)
}
#endif // _DEBUG
#ifdef CONVENIENT_ANIMATION_FILE_DEBUG_THING
SpewDebugStuffToFile();
#endif
BGPAFtextLoaded = qtrue;
return qtrue;
}
@ -831,7 +1048,7 @@ void PM_SetAnimFinal(int setAnimParts,int anim,int setAnimFlags,
{
animation_t *animations = pm->animations;
float editAnimSpeed = 0;
float editAnimSpeed = 1;
if (!animations)
{
@ -864,10 +1081,13 @@ void PM_SetAnimFinal(int setAnimParts,int anim,int setAnimFlags,
if (setAnimFlags & SETANIM_FLAG_HOLDLESS)
{ // Make sure to only wait in full 1/20 sec server frame intervals.
int dur;
int speedDif;
dur = (animations[anim].numFrames ) * fabs(animations[anim].frameLerp);
dur = (animations[anim].numFrames-1) * fabs(animations[anim].frameLerp);
//dur = ((int)(dur/50.0)) * 50 / timeScaleMod;
dur -= blendTime+fabs(animations[anim].frameLerp)*2;
//dur -= blendTime+fabs(animations[anim].frameLerp)*2;
speedDif = dur - (dur * editAnimSpeed);
dur += speedDif;
if (dur > 1)
{
pm->ps->torsoTimer = dur-1;
@ -886,11 +1106,6 @@ void PM_SetAnimFinal(int setAnimParts,int anim,int setAnimFlags,
{
pm->ps->torsoTimer /= 1.7;
}
if (editAnimSpeed)
{
pm->ps->torsoTimer /= editAnimSpeed;
}
}
}
@ -916,10 +1131,13 @@ setAnimLegs:
if (setAnimFlags & SETANIM_FLAG_HOLDLESS)
{ // Make sure to only wait in full 1/20 sec server frame intervals.
int dur;
int speedDif;
dur = (animations[anim].numFrames -1) * fabs(animations[anim].frameLerp);
dur = (animations[anim].numFrames-1) * fabs(animations[anim].frameLerp);
//dur = ((int)(dur/50.0)) * 50 / timeScaleMod;
dur -= blendTime+fabs(animations[anim].frameLerp)*2;
//dur -= blendTime+fabs(animations[anim].frameLerp)*2;
speedDif = dur - (dur * editAnimSpeed);
dur += speedDif;
if (dur > 1)
{
pm->ps->legsTimer = dur-1;

View file

@ -64,7 +64,7 @@ int forcePowerNeeded[NUM_FORCE_POWER_LEVELS][NUM_FORCE_POWERS] =
//NUM_FORCE_POWERS
},
{
25,//FP_HEAL,//instant
65,//FP_HEAL,//instant //was 25, but that was way too little
10,//FP_LEVITATION,//hold/duration
50,//FP_SPEED,//duration
20,//FP_PUSH,//hold/duration
@ -77,7 +77,7 @@ int forcePowerNeeded[NUM_FORCE_POWER_LEVELS][NUM_FORCE_POWERS] =
50,//FP_ABSORB,//duration
50,//FP_TEAM_HEAL,//instant
50,//FP_TEAM_FORCE,//instant
10,//FP_DRAIN,//hold/duration
20,//FP_DRAIN,//hold/duration
20,//FP_SEE,//duration
0,//FP_SABERATTACK,
2,//FP_SABERDEFEND,
@ -85,7 +85,7 @@ int forcePowerNeeded[NUM_FORCE_POWER_LEVELS][NUM_FORCE_POWERS] =
//NUM_FORCE_POWERS
},
{
25,//FP_HEAL,//instant
60,//FP_HEAL,//instant
10,//FP_LEVITATION,//hold/duration
50,//FP_SPEED,//duration
20,//FP_PUSH,//hold/duration
@ -98,7 +98,7 @@ int forcePowerNeeded[NUM_FORCE_POWER_LEVELS][NUM_FORCE_POWERS] =
25,//FP_ABSORB,//duration
33,//FP_TEAM_HEAL,//instant
33,//FP_TEAM_FORCE,//instant
10,//FP_DRAIN,//hold/duration
20,//FP_DRAIN,//hold/duration
20,//FP_SEE,//duration
0,//FP_SABERATTACK,
1,//FP_SABERDEFEND,
@ -106,7 +106,7 @@ int forcePowerNeeded[NUM_FORCE_POWER_LEVELS][NUM_FORCE_POWERS] =
//NUM_FORCE_POWERS
},
{
25,//FP_HEAL,//instant
50,//FP_HEAL,//instant //You get 5 points of health.. for 50 force points!
10,//FP_LEVITATION,//hold/duration
50,//FP_SPEED,//duration
20,//FP_PUSH,//hold/duration
@ -119,7 +119,7 @@ int forcePowerNeeded[NUM_FORCE_POWER_LEVELS][NUM_FORCE_POWERS] =
10,//FP_ABSORB,//duration
25,//FP_TEAM_HEAL,//instant
25,//FP_TEAM_FORCE,//instant
10,//FP_DRAIN,//hold/duration
20,//FP_DRAIN,//hold/duration
20,//FP_SEE,//duration
0,//FP_SABERATTACK,
0,//FP_SABERDEFEND,
@ -871,6 +871,7 @@ static qboolean PM_CheckJump( void )
pm->cmd.upmove = 0;
return qfalse;
}
/*
else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )
{
int legsAnim = (pm->ps->legsAnim&~ANIM_TOGGLEBIT);
@ -879,13 +880,14 @@ static qboolean PM_CheckJump( void )
return qfalse;
}
}
*/
}
}
#endif
//Not jumping
if ( pm->cmd.upmove < 10 ) {
if ( pm->cmd.upmove < 10 && pm->ps->groundEntityNum != ENTITYNUM_NONE) {
return qfalse;
}
@ -954,11 +956,13 @@ static qboolean PM_CheckJump( void )
anim = BOTH_WALL_FLIP_LEFT;
}
}
/*
else if ( pm->cmd.forwardmove > 0 && pm->ps->fd.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 )
{//run up wall, flip backwards
vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.25f;
anim = BOTH_WALL_FLIP_BACK1;
}
*/
else if ( pm->cmd.forwardmove < 0 && !(pm->cmd.buttons&BUTTON_ATTACK) )
{//backflip
vertPush = JUMP_VELOCITY;
@ -1186,6 +1190,58 @@ static qboolean PM_CheckJump( void )
return qfalse;
}
}
else if ( pm->cmd.forwardmove > 0 //pushing forward
&& pm->ps->fd.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1
&& pm->ps->velocity[2] > 200
&& /*(level.time - pm->ps->lastOnGround) <= 500*/ PM_GroundDistance() <= 80 //unfortunately we do not have a happy ground timer.
&& !BG_InSpecialJump(pm->ps->legsAnim))
{//run up wall, flip backwards
//FIXME: have to be moving... make sure it's opposite the wall... or at least forward?
vec3_t fwd, traceto, mins, maxs, fwdAngles;
trace_t trace;
vec3_t idealNormal;
VectorSet(mins, pm->mins[0],pm->mins[1],pm->mins[2]);
VectorSet(maxs, pm->maxs[0],pm->maxs[1],pm->maxs[2]);
VectorSet(fwdAngles, 0, pm->ps->viewangles[YAW], 0);
AngleVectors( fwdAngles, fwd, NULL, NULL );
VectorMA( pm->ps->origin, 32, fwd, traceto );
pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, MASK_PLAYERSOLID );//FIXME: clip brushes too?
VectorSubtract( pm->ps->origin, traceto, idealNormal );
VectorNormalize( idealNormal );
if ( trace.fraction < 1.0f )
{//there is a wall there
int parts = SETANIM_LEGS;
pm->ps->velocity[0] = pm->ps->velocity[1] = 0;
VectorMA( pm->ps->velocity, -150, fwd, pm->ps->velocity );
pm->ps->velocity[2] += 128;
if ( !pm->ps->weaponTime )
{
parts = SETANIM_BOTH;
}
PM_SetAnim( parts, BOTH_WALL_FLIP_BACK1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 );
pm->ps->legsTimer -= 600; //I force this anim to play to the end to prevent landing on your head and suddenly flipping over.
//It is a bit too long at the end though, so I'll just shorten it.
pm->ps->fd.forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height
//pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL;
pm->cmd.upmove = 0;
//G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" );
pm->ps->fd.forceJumpSound = 1;
BG_ForcePowerDrain( pm->ps, FP_LEVITATION, 5 );
if (trace.entityNum < MAX_CLIENTS)
{
pm->ps->forceKickFlip = trace.entityNum+1; //let the server know that this person gets kicked by this client
}
}
}
else
{
//FIXME: if in a butterfly, kick people away?
@ -1235,6 +1291,7 @@ static qboolean PM_CheckJump( void )
else if ( pm->ps->fd.saberAnimLevel == FORCE_LEVEL_3 )
{//using strong attacks
if ( pm->cmd.forwardmove > 0 && //going forward
(pm->cmd.buttons & BUTTON_ATTACK) && //must be holding attack still
PM_GroundDistance() < 32 &&
!BG_InSpecialJump(pm->ps->legsAnim))
{//strong attack: jump-hack
@ -1447,13 +1504,19 @@ static void PM_FlyMove( void ) {
PM_Friction ();
scale = PM_CmdScale( &pm->cmd );
if ( pm->ps->pm_type == PM_SPECTATOR && pm->cmd.buttons & BUTTON_ALT_ATTACK) {
//turbo boost
scale *= 10;
}
//
// user intentions
//
if ( !scale ) {
wishvel[0] = 0;
wishvel[1] = 0;
wishvel[2] = 0;
wishvel[2] = pm->ps->speed * (pm->cmd.upmove/127.0f);
} else {
for (i=0 ; i<3 ; i++) {
wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove;
@ -1825,7 +1888,7 @@ static int PM_TryRoll( void )
if ( BG_SaberInAttack( pm->ps->saberMove ) || BG_SaberInSpecialAttack( pm->ps->torsoAnim )
|| BG_SpinningSaberAnim( pm->ps->legsAnim )
|| (!pm->ps->clientNum&&PM_SaberInStart( pm->ps->saberMove )) )
|| PM_SaberInStart( pm->ps->saberMove ) )
{//attacking or spinning (or, if player, starting an attack)
return 0;
}
@ -2169,7 +2232,25 @@ static void PM_GroundTraceMissed( void ) {
trace_t trace;
vec3_t point;
if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) {
//rww - don't want to do this when handextend_choke, because you can be standing on the ground
//while still holding your throat.
if ( pm->ps->pm_type == PM_FLOAT ) {
//we're assuming this is because you're being choked
int parts = SETANIM_LEGS;
/*
if ( !pm->ps->weaponTime && pm->ps->forceHandExtend >= HANDEXTEND_CHOKE )
{//still on ground, only set anim on torso
parts = SETANIM_BOTH;
}
*/
//rww - also don't use SETANIM_FLAG_HOLD, it will cause the legs to float around a bit before going into
//a proper anim even when on the ground.
PM_SetAnim(parts, BOTH_CHOKE3, SETANIM_FLAG_OVERRIDE, 100);
//pm->ps->torsoTimer = 1;
//pm->ps->legsTimer = 1;
}
//If the anim is choke3, act like we just went into the air because we aren't in a float
else if ( pm->ps->groundEntityNum != ENTITYNUM_NONE || (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_CHOKE3 ) {
// we just transitioned into freefall
if ( pm->debugLevel ) {
Com_Printf("%i:lift\n", c_pmove);
@ -2531,6 +2612,22 @@ static void PM_Footsteps( void ) {
float bobmove;
int old;
qboolean footstep;
int setAnimFlags = 0;
if ( (PM_InSaberAnim( (pm->ps->legsAnim&~ANIM_TOGGLEBIT) ) && !BG_SpinningSaberAnim( (pm->ps->legsAnim&~ANIM_TOGGLEBIT) ))
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_STAND1
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_STAND1TO2
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_STAND2TO1
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_STAND2
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_SABERFAST_STANCE
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_SABERSLOW_STANCE
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_BUTTON_HOLD
|| (pm->ps->legsAnim&~ANIM_TOGGLEBIT) == BOTH_BUTTON_RELEASE
|| PM_LandingAnim( (pm->ps->legsAnim&~ANIM_TOGGLEBIT) )
|| PM_PainAnim( (pm->ps->legsAnim&~ANIM_TOGGLEBIT) ))
{//legs are in a saber anim, and not spinning, be sure to override it
setAnimFlags |= SETANIM_FLAG_OVERRIDE;
}
//
// calculate speed and cycle to be used for
@ -2542,8 +2639,16 @@ static void PM_Footsteps( void ) {
if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) {
// airborne leaves position in cycle intact, but doesn't advance
if ( pm->waterlevel > 1 ) {
PM_ContinueLegsAnim( BOTH_SWIM1 );
if ( pm->waterlevel > 1 )
{
if (pm->xyspeed > 60)
{
PM_ContinueLegsAnim( BOTH_SWIMFORWARD );
}
else
{
PM_ContinueLegsAnim( BOTH_SWIM_IDLE1 );
}
}
return;
}
@ -2553,7 +2658,14 @@ static void PM_Footsteps( void ) {
if ( pm->xyspeed < 5 ) {
pm->ps->bobCycle = 0; // start at beginning of cycle again
if ( (pm->ps->pm_flags & PMF_DUCKED) || (pm->ps->pm_flags & PMF_ROLLING) ) {
PM_ContinueLegsAnim( BOTH_CROUCH1IDLE );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_CROUCH1IDLE)
{
PM_SetAnim(SETANIM_LEGS, BOTH_CROUCH1IDLE, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_CROUCH1IDLE );
}
} else {
if (pm->ps->weapon == WP_DISRUPTOR && pm->ps->zoomMode == 1)
{
@ -2590,10 +2702,24 @@ static void PM_Footsteps( void ) {
if ( !rolled )
{
if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) {
PM_ContinueLegsAnim( BOTH_CROUCH1WALKBACK );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_CROUCH1WALKBACK)
{
PM_SetAnim(SETANIM_LEGS, BOTH_CROUCH1WALKBACK, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_CROUCH1WALKBACK );
}
}
else {
PM_ContinueLegsAnim( BOTH_CROUCH1WALK );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_CROUCH1WALK)
{
PM_SetAnim(SETANIM_LEGS, BOTH_CROUCH1WALK, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_CROUCH1WALK );
}
}
}
else
@ -2626,11 +2752,25 @@ static void PM_Footsteps( void ) {
if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN )
{
PM_ContinueLegsAnim( BOTH_CROUCH1WALKBACK );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_CROUCH1WALKBACK)
{
PM_SetAnim(SETANIM_LEGS, BOTH_CROUCH1WALKBACK, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_CROUCH1WALKBACK );
}
}
else
{
PM_ContinueLegsAnim( BOTH_CROUCH1WALK );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_CROUCH1WALK)
{
PM_SetAnim(SETANIM_LEGS, BOTH_CROUCH1WALK, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_CROUCH1WALK );
}
}
}
else
@ -2638,19 +2778,47 @@ static void PM_Footsteps( void ) {
if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) {
bobmove = 0.4f; // faster speeds bob faster
if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) {
PM_ContinueLegsAnim( BOTH_RUNBACK1 );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_RUNBACK1)
{
PM_SetAnim(SETANIM_LEGS, BOTH_RUNBACK1, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_RUNBACK1 );
}
}
else {
PM_ContinueLegsAnim( BOTH_RUN1 );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_RUN1)
{
PM_SetAnim(SETANIM_LEGS, BOTH_RUN1, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_RUN1 );
}
}
footstep = qtrue;
} else {
bobmove = 0.2f; // walking bobs slow
if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) {
PM_ContinueLegsAnim( BOTH_WALKBACK1 );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_WALKBACK1)
{
PM_SetAnim(SETANIM_LEGS, BOTH_WALKBACK1, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_WALKBACK1 );
}
}
else {
PM_ContinueLegsAnim( BOTH_WALK1 );
if ((pm->ps->legsAnim&~ANIM_TOGGLEBIT) != BOTH_WALK1)
{
PM_SetAnim(SETANIM_LEGS, BOTH_WALK1, setAnimFlags, 100);
}
else
{
PM_ContinueLegsAnim( BOTH_WALK1 );
}
}
}
}
@ -3249,7 +3417,13 @@ static void PM_Weapon( void ) {
desiredAnim = BOTH_SABERPULL;
break;
case HANDEXTEND_CHOKE:
desiredAnim = BOTH_CHOKE3;//TORSO_CHOKING1;
desiredAnim = BOTH_CHOKE3; //left-handed choke
/*
if ( pm->ps->weapon == WP_NONE || pm->ps->weapon == WP_MELEE )
{
desiredAnim = BOTH_CHOKE1; //two-handed choke
}
*/
break;
case HANDEXTEND_DODGE:
desiredAnim = pm->ps->forceDodgeAnim;
@ -3281,6 +3455,17 @@ static void PM_Weapon( void ) {
case HANDEXTEND_TAUNT:
desiredAnim = pm->ps->forceDodgeAnim;
break;
//Hmm... maybe use these, too?
//BOTH_FORCEHEAL_QUICK //quick heal (SP level 2 & 3)
//BOTH_MINDTRICK1 // wave (maybe for mind trick 2 & 3 - whole area, and for force seeing)
//BOTH_MINDTRICK2 // tap (maybe for mind trick 1 - one person)
//BOTH_FORCEGRIP_START //start grip
//BOTH_FORCEGRIP_HOLD //hold grip
//BOTH_FORCEGRIP_RELEASE //release grip
//BOTH_FORCELIGHTNING //quick lightning burst (level 1)
//BOTH_FORCELIGHTNING_START //start lightning
//BOTH_FORCELIGHTNING_HOLD //hold lightning
//BOTH_FORCELIGHTNING_RELEASE //release lightning
default:
desiredAnim = BOTH_FORCEPUSH;
break;
@ -3289,9 +3474,9 @@ static void PM_Weapon( void ) {
PM_SetAnim(SETANIM_TORSO, desiredAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100);
pm->ps->torsoTimer = 1;
if (pm->ps->forceHandExtend == HANDEXTEND_DODGE || pm->ps->forceHandExtend == HANDEXTEND_KNOCKDOWN /*||
pm->ps->forceHandExtend == HANDEXTEND_CHOKE*/)
{ //special case, play dodge anim on whole body
if (pm->ps->forceHandExtend == HANDEXTEND_DODGE || pm->ps->forceHandExtend == HANDEXTEND_KNOCKDOWN ||
(pm->ps->forceHandExtend == HANDEXTEND_CHOKE && pm->ps->groundEntityNum == ENTITYNUM_NONE) )
{ //special case, play dodge anim on whole body, choke anim too if off ground
PM_SetAnim(SETANIM_LEGS, desiredAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100);
pm->ps->legsTimer = 1;
}
@ -3451,12 +3636,12 @@ static void PM_Weapon( void ) {
PM_StartTorsoAnim( BOTH_GUNSIT1 );
}
if (pm->ps->isJediMaster || pm->ps->duelInProgress)
if (pm->ps->isJediMaster || pm->ps->duelInProgress || pm->ps->trueJedi)
{
pm->cmd.weapon = WP_SABER;
pm->ps->weapon = WP_SABER;
if (pm->ps->isJediMaster)
if (pm->ps->isJediMaster || pm->ps->trueJedi)
{
pm->ps->stats[STAT_WEAPONS] = (1 << WP_SABER);
}
@ -3690,7 +3875,7 @@ PM_Animate
static void PM_Animate( void ) {
if ( pm->cmd.buttons & BUTTON_GESTURE ) {
if ( pm->ps->torsoTimer < 1 && pm->ps->forceHandExtend == HANDEXTEND_NONE &&
pm->ps->legsTimer < 1 && pm->ps->weaponTime < 1 ) {
pm->ps->legsTimer < 1 && pm->ps->weaponTime < 1 && pm->ps->saberLockTime < pm->cmd.serverTime) {
/*
PM_StartTorsoAnim( BOTH_TALKGESTURE3 );
pm->ps->torsoTimer = TIMER_GESTURE;
@ -4022,6 +4207,8 @@ void BG_CmdForRoll( int anim, usercmd_t *pCmd )
pCmd->upmove = 0;
}
qboolean PM_SaberInTransition( int move );
void BG_AdjustClientSpeed(playerState_t *ps, usercmd_t *cmd, int svTime)
{
//For prediction, always reset speed back to the last known server base speed
@ -4102,6 +4289,11 @@ void BG_AdjustClientSpeed(playerState_t *ps, usercmd_t *cmd, int svTime)
}
}
if (ps->fd.forcePowersActive & (1 << FP_GRIP))
{
ps->speed *= 0.4;
}
if (ps->fd.forcePowersActive & (1 << FP_SPEED))
{
if (ps->fd.forceSpeedSmash < 1.2)
@ -4160,7 +4352,14 @@ void BG_AdjustClientSpeed(playerState_t *ps, usercmd_t *cmd, int svTime)
}
else if ( BG_SpinningSaberAnim( ps->legsAnim ) )
{
ps->speed *= 0.5f;
if (ps->fd.saberAnimLevel == FORCE_LEVEL_3)
{
ps->speed *= 0.3f;
}
else
{
ps->speed *= 0.5f;
}
}
else if ( ps->weapon == WP_SABER && BG_SaberInAttack( ps->saberMove ) )
{//if attacking with saber while running, drop your speed
@ -4170,12 +4369,25 @@ void BG_AdjustClientSpeed(playerState_t *ps, usercmd_t *cmd, int svTime)
ps->speed *= 0.85f;
break;
case FORCE_LEVEL_3:
ps->speed *= 0.70f;
//ps->speed *= 0.70f;
ps->speed *= 0.55f;
break;
default:
break;
}
}
else if (ps->weapon == WP_SABER && ps->fd.saberAnimLevel == FORCE_LEVEL_3 &&
PM_SaberInTransition(ps->saberMove))
{ //Now, we want to even slow down in transitions for level 3 (since it has chains and stuff now)
if (cmd->forwardmove < 0)
{
ps->speed *= 0.4f;
}
else
{
ps->speed *= 0.6f;
}
}
if ( BG_InRoll( ps, ps->legsAnim ) && ps->speed > 200 )
@ -4313,6 +4525,13 @@ void PmoveSingle (pmove_t *pmove) {
pm->cmd.buttons &= ~BUTTON_WALKING;
}
// set the talk balloon flag
if ( pm->cmd.buttons & BUTTON_TALK ) {
pm->ps->eFlags |= EF_TALK;
} else {
pm->ps->eFlags &= ~EF_TALK;
}
// In certain situations, we may want to control which attack buttons are pressed and what kind of functionality
// is attached to them
PM_AdjustAttackStates( pm );
@ -4323,6 +4542,18 @@ void PmoveSingle (pmove_t *pmove) {
pm->ps->pm_flags &= ~PMF_RESPAWNED;
}
// if talk button is down, dissallow all other input
// this is to prevent any possible intercept proxy from
// adding fake talk balloons
if ( pmove->cmd.buttons & BUTTON_TALK ) {
// keep the talk button set tho for when the cmd.serverTime > 66 msec
// and the same cmd is used multiple times in Pmove
pmove->cmd.buttons = BUTTON_TALK;
pmove->cmd.forwardmove = 0;
pmove->cmd.rightmove = 0;
pmove->cmd.upmove = 0;
}
// clear all pmove local vars
memset (&pml, 0, sizeof(pml));
@ -4345,6 +4576,28 @@ void PmoveSingle (pmove_t *pmove) {
PM_AdjustAngleForWallRun(pm->ps, &pm->cmd, qtrue);
if (pm->ps->saberMove == LS_A_JUMP_T__B_ || pm->ps->saberMove == LS_A_LUNGE)
{
/*
if (pm->ps->velocity[0] ||
pm->ps->velocity[1] ||
pm->ps->velocity[2])
{ //if we're doing a lunge and we have a velocity, force us to look in the direction we are
//flying with the lunge
vec3_t velAngles;
vectoangles(pm->ps->velocity, velAngles);
PM_SetPMViewAngle(pm->ps, velAngles, &pm->cmd);
}
else
{ //otherwise, if there is no valid velocity, just don't let us readjust the angles.
PM_SetPMViewAngle(pm->ps, pm->ps->viewangles, &pm->cmd);
}
*/
//FIXME: Use the above method, and don't let the angles mess up when you hit something.
PM_SetPMViewAngle(pm->ps, pm->ps->viewangles, &pm->cmd);
}
// update the viewangles
PM_UpdateViewAngles( pm->ps, &pm->cmd );

View file

@ -105,6 +105,7 @@ typedef enum {
G2_MODELPART_WAIST,
G2_MODELPART_LARM,
G2_MODELPART_RARM,
G2_MODELPART_RHAND,
G2_MODELPART_LLEG,
G2_MODELPART_RLEG
} g2ModelParts_t;
@ -273,6 +274,7 @@ typedef struct {
int (*pointcontents)( const vec3_t point, int passEntityNum );
playerState_t *bgClients[MAX_CLIENTS];
int checkDuelLoss;
} pmove_t;
extern pmove_t *pm;
@ -338,25 +340,36 @@ typedef enum {
#define EF_DEAD 0x00000001 // don't draw a foe marker over players with EF_DEAD
#define EF_BOUNCE_SHRAPNEL 0x00000002 // special shrapnel flag
#define EF_TELEPORT_BIT 0x00000004 // toggled every time the origin abruptly changes
//doesn't do anything
#define EF_AWARD_EXCELLENT 0x00000008 // draw an excellent sprite
#define EF_PLAYER_EVENT 0x00000010
#define EF_BOUNCE 0x00000010 // for missiles
#define EF_BOUNCE_HALF 0x00000020 // for missiles
//doesn't do anything
#define EF_AWARD_GAUNTLET 0x00000040 // draw a gauntlet sprite
#define EF_NODRAW 0x00000080 // may have an event, but no model (unspawned items)
#define EF_FIRING 0x00000100 // for lightning gun
#define EF_ALT_FIRING 0x00000200 // for alt-fires, mostly for lightning guns though
#define EF_MOVER_STOP 0x00000400 // will push otherwise
//doesn't do anything
#define EF_AWARD_CAP 0x00000800 // draw the capture sprite
#define EF_TALK 0x00001000 // draw a talk balloon
#define EF_CONNECTION 0x00002000 // draw a connection trouble sprite
#define EF_VOTED 0x00004000 // already cast a vote
//next 4 don't actually do anything
#define EF_AWARD_IMPRESSIVE 0x00008000 // draw an impressive sprite
#define EF_AWARD_DEFEND 0x00010000 // draw a defend sprite
#define EF_AWARD_ASSIST 0x00020000 // draw a assist sprite
#define EF_AWARD_DENIED 0x00040000 // denied
#define EF_TEAMVOTED 0x00080000 // already cast a team vote
#define EF_SEEKERDRONE 0x00100000 // show seeker drone floating around head
#define EF_MISSILE_STICK 0x00200000 // missiles that stick to the wall.
@ -1000,6 +1013,9 @@ qboolean BG_SaberInIdle( int move );
qboolean BG_FlippingAnim( int anim );
qboolean BG_SpinningSaberAnim( int anim );
qboolean BG_SaberInSpecialAttack( int anim );
int BG_BrokenParryForAttack( int move );
int BG_BrokenParryForParry( int move );
int BG_KnockawayForParry( int move );
qboolean BG_InRoll( playerState_t *ps, int anim );
qboolean BG_InDeathAnim( int anim );

View file

@ -250,6 +250,7 @@ saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized
{"Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL,
};
int transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] =
{
LS_NONE, //Can't transition to same pos!
@ -348,9 +349,11 @@ saberMoveName_t PM_AttackMoveForQuad( int quad )
return LS_NONE;
}
qboolean PM_SaberKataDone(int curmove, int newmove);
int PM_SaberAnimTransitionAnim( int curmove, int newmove )
{
//FIXME: take FP_SABERATTACK into account here somehow?
//FIXME: take FP_SABER_OFFENSE into account here somehow?
int retmove = newmove;
if ( curmove == LS_READY )
{//just standing there
@ -397,11 +400,21 @@ int PM_SaberAnimTransitionAnim( int curmove, int newmove )
case LS_A_R2L:
case LS_A_TR2BL:
case LS_A_T2B:
/*if ( newmove == curmove )
if ( newmove == curmove )
{//FIXME: need a spin or something or go to next level, but for now, just play the return
retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR);
//going into another attack...
//allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3
//FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?)
if ( PM_SaberKataDone( curmove, newmove ) )
{//done with this kata, must return to ready before attack again
retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR);
}
else
{//okay to chain to another attack
retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad];
}
}
else */if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad )
else if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad )
{//new move starts from same quadrant
retmove = newmove;
}
@ -417,6 +430,14 @@ int PM_SaberAnimTransitionAnim( int curmove, int newmove )
case LS_A_R2L:
case LS_A_TR2BL:
case LS_A_T2B:
case LS_D1_BR:
case LS_D1__R:
case LS_D1_TR:
case LS_D1_T_:
case LS_D1_TL:
case LS_D1__L:
case LS_D1_BL:
case LS_D1_B_:
retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad];
break;
//transitioning from a return
@ -445,17 +466,35 @@ int PM_SaberAnimTransitionAnim( int curmove, int newmove )
case LS_BOUNCE_LR:
case LS_BOUNCE_LL:
*/
//transitioning from a parry/deflection
//transitioning from a parry/reflection/knockaway/broken parry
case LS_PARRY_UP:
case LS_REFLECT_UP:
case LS_PARRY_UR:
case LS_REFLECT_UR:
case LS_PARRY_UL:
case LS_REFLECT_UL:
case LS_PARRY_LR:
case LS_REFLECT_LR:
case LS_PARRY_LL:
case LS_REFLECT_UP:
case LS_REFLECT_UR:
case LS_REFLECT_UL:
case LS_REFLECT_LR:
case LS_REFLECT_LL:
case LS_K1_T_:
case LS_K1_TR:
case LS_K1_TL:
case LS_K1_BR:
case LS_K1_BL:
case LS_V1_BR:
case LS_V1__R:
case LS_V1_TR:
case LS_V1_T_:
case LS_V1_TL:
case LS_V1__L:
case LS_V1_BL:
case LS_V1_B_:
case LS_H1_T_:
case LS_H1_TR:
case LS_H1_TL:
case LS_H1_BR:
case LS_H1_BL:
retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad];
break;
//NB: transitioning from transitions is fine
@ -474,7 +513,6 @@ int PM_SaberAnimTransitionAnim( int curmove, int newmove )
return retmove;
}
int PM_SaberMoveQuadrantForMovement( usercmd_t *ucmd )
{
if ( ucmd->rightmove > 0 )
@ -548,12 +586,150 @@ qboolean PM_SaberInTransition( int move )
return qfalse;
}
qboolean PM_SaberKataDone( void )
int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] =
{
if ( (pm->ps->fd.saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > PM_irand_timesync( 0, 1 )) ||
( pm->ps->fd.saberAnimLevel == FORCE_LEVEL_2 && pm->ps->saberAttackChainCount > PM_irand_timesync( 2, 5 ) ) )
0,//Q_BR,Q_BR,
45,//Q_BR,Q_R,
90,//Q_BR,Q_TR,
135,//Q_BR,Q_T,
180,//Q_BR,Q_TL,
215,//Q_BR,Q_L,
270,//Q_BR,Q_BL,
45,//Q_BR,Q_B,
45,//Q_R,Q_BR,
0,//Q_R,Q_R,
45,//Q_R,Q_TR,
90,//Q_R,Q_T,
135,//Q_R,Q_TL,
180,//Q_R,Q_L,
215,//Q_R,Q_BL,
90,//Q_R,Q_B,
90,//Q_TR,Q_BR,
45,//Q_TR,Q_R,
0,//Q_TR,Q_TR,
45,//Q_TR,Q_T,
90,//Q_TR,Q_TL,
135,//Q_TR,Q_L,
180,//Q_TR,Q_BL,
135,//Q_TR,Q_B,
135,//Q_T,Q_BR,
90,//Q_T,Q_R,
45,//Q_T,Q_TR,
0,//Q_T,Q_T,
45,//Q_T,Q_TL,
90,//Q_T,Q_L,
135,//Q_T,Q_BL,
180,//Q_T,Q_B,
180,//Q_TL,Q_BR,
135,//Q_TL,Q_R,
90,//Q_TL,Q_TR,
45,//Q_TL,Q_T,
0,//Q_TL,Q_TL,
45,//Q_TL,Q_L,
90,//Q_TL,Q_BL,
135,//Q_TL,Q_B,
215,//Q_L,Q_BR,
180,//Q_L,Q_R,
135,//Q_L,Q_TR,
90,//Q_L,Q_T,
45,//Q_L,Q_TL,
0,//Q_L,Q_L,
45,//Q_L,Q_BL,
90,//Q_L,Q_B,
270,//Q_BL,Q_BR,
215,//Q_BL,Q_R,
180,//Q_BL,Q_TR,
135,//Q_BL,Q_T,
90,//Q_BL,Q_TL,
45,//Q_BL,Q_L,
0,//Q_BL,Q_BL,
45,//Q_BL,Q_B,
45,//Q_B,Q_BR,
90,//Q_B,Q_R,
135,//Q_B,Q_TR,
180,//Q_B,Q_T,
135,//Q_B,Q_TL,
90,//Q_B,Q_L,
45,//Q_B,Q_BL,
0//Q_B,Q_B,
};
int PM_SaberAttackChainAngle( int move1, int move2 )
{
if ( move1 == -1 || move2 == -1 )
{
return qtrue;
return -1;
}
return saberMoveTransitionAngle[saberMoveData[move1].endQuad][saberMoveData[move2].startQuad];
}
qboolean PM_SaberKataDone(int curmove, int newmove)
{
if ( pm->ps->fd.saberAnimLevel == FORCE_LEVEL_3 )
{
if ( curmove == LS_NONE || newmove == LS_NONE )
{
if ( pm->ps->fd.saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > PM_irand_timesync( 0, 1 ) )
{
return qtrue;
}
}
else if ( pm->ps->saberAttackChainCount > PM_irand_timesync( 2, 3 ) )
{
return qtrue;
}
else if ( pm->ps->saberAttackChainCount > 0 )
{
int chainAngle = PM_SaberAttackChainAngle( curmove, newmove );
if ( chainAngle < 135 || chainAngle > 215 )
{//if trying to chain to a move that doesn't continue the momentum
return qtrue;
}
else if ( chainAngle == 180 )
{//continues the momentum perfectly, allow it to chain 66% of the time
if ( pm->ps->saberAttackChainCount > 1 )
{
return qtrue;
}
}
else
{//would continue the movement somewhat, 50% chance of continuing
if ( pm->ps->saberAttackChainCount > 2 )
{
return qtrue;
}
}
}
}
else
{//FIXME: have chainAngle influence fast and medium chains as well?
if (newmove == LS_A_TL2BR ||
newmove == LS_A_L2R ||
newmove == LS_A_BL2TR ||
newmove == LS_A_BR2TL ||
newmove == LS_A_R2L ||
newmove == LS_A_TR2BL )
{ //lower chaining tolerance for spinning saber anims
int chainTolerance;
if (pm->ps->fd.saberAnimLevel == FORCE_LEVEL_1)
{
chainTolerance = 5;
}
else
{
chainTolerance = 3;
}
if (pm->ps->saberAttackChainCount >= chainTolerance && PM_irand_timesync(1, pm->ps->saberAttackChainCount) > chainTolerance)
{
return qtrue;
}
}
if ( pm->ps->fd.saberAnimLevel == FORCE_LEVEL_2 && pm->ps->saberAttackChainCount > PM_irand_timesync( 2, 5 ) )
{
return qtrue;
}
}
return qfalse;
}
@ -649,6 +825,8 @@ void PM_SaberLockBreak( playerState_t *genemy, qboolean victory )
genemy->velocity[0] = oppDir[0]*(strength*40);
genemy->velocity[1] = oppDir[1]*(strength*40);
genemy->velocity[2] = 100;
pm->checkDuelLoss = genemy->clientNum+1;
}
else
{
@ -688,7 +866,7 @@ void PM_SaberLockBreak( playerState_t *genemy, qboolean victory )
}
else
{
if ( Q_irand( 0, 1 ) )
if ( PM_irand_timesync( 0, 1 ) )
{
BG_AddPredictableEventToPlayerstate(EV_JUMP, PM_irand_timesync( 0, 75 ), genemy);
}
@ -781,7 +959,7 @@ void PM_SaberLocked( void )
remaining = anim->firstFrame+anim->numFrames-curFrame;
}
}
if ( !Q_irand( 0, 2 ) )
if ( !PM_irand_timesync( 0, 2 ) )
{
PM_AddEvent( EV_JUMP );
}
@ -798,7 +976,7 @@ void PM_SaberLocked( void )
if ( (genemy->torsoAnim&~ANIM_TOGGLEBIT) == BOTH_CWCIRCLELOCK ||
(genemy->torsoAnim&~ANIM_TOGGLEBIT) == BOTH_BF1LOCK )
{
if ( !Q_irand( 0, 2 ) )
if ( !PM_irand_timesync( 0, 2 ) )
{
BG_AddPredictableEventToPlayerstate(EV_PAIN, floor((float)80/100*100.0f), genemy);
}
@ -819,6 +997,10 @@ void PM_SaberLocked( void )
qboolean PM_SaberInBrokenParry( int move )
{
if ( move >= LS_V1_BR && move <= LS_V1_B_ )
{
return qtrue;
}
if ( move >= LS_H1_T_ && move <= LS_H1_BL )
{
return qtrue;
@ -932,7 +1114,7 @@ saberMoveName_t PM_SaberFlipOverAttackMove(trace_t *tr)
pm->ps->fd.forceJumpSound = 1;
pm->cmd.upmove = 0;
if ( Q_irand( 0, 1 ) )
if ( PM_irand_timesync( 0, 1 ) )
{
return LS_A_FLIP_STAB;
}
@ -1108,7 +1290,9 @@ saberMoveName_t PM_SaberAttackForMovement(saberMoveName_t curmove)
}
else if ( PM_SaberInBounce( curmove ) )
{//bounces should go to their default attack if you don't specify a direction but are attacking
if ( PM_SaberKataDone() )
newmove = saberMoveData[curmove].chain_attack;
if ( PM_SaberKataDone(curmove, newmove) )
{
newmove = saberMoveData[curmove].chain_idle;
}
@ -1124,7 +1308,9 @@ saberMoveName_t PM_SaberAttackForMovement(saberMoveName_t curmove)
//rww - If we don't seed with a "common" value, the client and server will get mismatched
//prediction values. Under laggy conditions this will cause the appearance of rapid swing
//sequence changes.
newmove = PM_irand_timesync(LS_A_TL2BR, LS_A_T2B);
//newmove = PM_irand_timesync(LS_A_TL2BR, LS_A_T2B);
newmove = LS_A_T2B; //decided we don't like random attacks when idle, use an overhead instead.
}
}
@ -1252,9 +1438,12 @@ void PM_WeaponLightsaber(void)
}
// don't allow attack until all buttons are up
//This is bad. It freezes the attack state and the animations if you hold the button after respawning, and it looks strange.
/*
if ( pm->ps->pm_flags & PMF_RESPAWNED ) {
return;
}
*/
// check for dead player
if ( pm->ps->stats[STAT_HEALTH] <= 0 ) {
@ -1306,6 +1495,13 @@ void PM_WeaponLightsaber(void)
switch ( pm->ps->saberBlocked )
{
case BLOCKED_BOUNCE_MOVE:
{ //act as a bounceMove and reset the saberMove instead of using a seperate value for it
PM_SetSaberMove( pm->ps->saberMove );
pm->ps->weaponTime = pm->ps->torsoTimer;
pm->ps->saberBlocked = 0;
}
break;
case BLOCKED_PARRY_BROKEN:
//whatever parry we were is in now broken, play the appropriate knocked-away anim
{
@ -1326,6 +1522,10 @@ void PM_WeaponLightsaber(void)
}
else
{//Maybe in a knockaway?
if (pm->ps->weaponTime <= 0)
{
pm->ps->saberBlocked = 0;
}
}
}
break;
@ -1584,7 +1784,7 @@ weapChecks:
if ( anim == -1 )
{
//FIXME: take FP_SABER_OFFENSE into account here somehow?
if ( curmove >= LS_T1_BR__R && curmove <= LS_T1_BL__L )
if ( PM_SaberInTransition( curmove ) )
{//in a transition, must play sequential attack
newmove = saberMoveData[curmove].chain_attack;
}
@ -1592,13 +1792,35 @@ weapChecks:
{//started a swing, must continue from here
newmove = LS_A_TL2BR + (curmove-LS_S_TL2BR);
}
else
{
else if ( PM_SaberInBrokenParry( curmove ) )
{//broken parries must always return to ready
newmove = LS_READY;
}
else//if ( pm->cmd.buttons&BUTTON_ATTACK && !(pm->ps->pm_flags&PMF_ATTACK_HELD) )//only do this if just pressed attack button?
{//get attack move from movement command
/*
if ( PM_SaberKataDone() )
{//we came from a bounce and cannot chain to another attack because our kata is done
newmove = saberMoveData[curmove].chain_idle;
}
else
else */
saberMoveName_t checkMove = PM_SaberAttackForMovement(curmove);
if (checkMove != -1)
{
newmove = checkMove;
}
if ( (PM_SaberInBounce( curmove )||PM_SaberInBrokenParry( curmove ))
&& saberMoveData[newmove].startQuad == saberMoveData[curmove].endQuad )
{//this attack would be a repeat of the last (which was blocked), so don't actually use it, use the default chain attack for this bounce
newmove = saberMoveData[curmove].chain_attack;
}
if ( PM_SaberKataDone(curmove, newmove) )
{//we came from a bounce and cannot chain to another attack because our kata is done
newmove = saberMoveData[curmove].chain_idle;
}
/*else
{
saberMoveName_t checkMove = PM_SaberAttackForMovement(curmove);
if (checkMove != -1)
@ -1606,6 +1828,7 @@ weapChecks:
newmove = checkMove;
}
}
*/
}
/*
if ( newmove == LS_NONE )
@ -1665,6 +1888,11 @@ weapChecks:
{
anim = PM_GetSaberStance();
}
if (anim == BOTH_RUN2 && !pm->cmd.forwardmove && !pm->cmd.rightmove)
{ //semi-hacky
anim = PM_GetSaberStance();
}
newmove = LS_READY;
}
@ -1709,8 +1937,8 @@ void PM_SetSaberMove(short newMove)
int anim = saberMoveData[newMove].animToUse;
int parts = SETANIM_TORSO;
if ( newMove == LS_READY )
{//finished with a kata, reset attack counter
if ( newMove == LS_READY || newMove == LS_A_FLIP_STAB || newMove == LS_A_FLIP_SLASH )
{//finished with a kata (or in a special move) reset attack counter
pm->ps->saberAttackChainCount = 0;
}
else if ( BG_SaberInAttack( newMove ) )
@ -1724,13 +1952,10 @@ void PM_SetSaberMove(short newMove)
}
if ( pm->ps->fd.saberAnimLevel > FORCE_LEVEL_1 &&
!BG_SaberInIdle( newMove ) && !PM_SaberInParry( newMove ) && !PM_SaberInReflect( newMove ) && !BG_SaberInSpecial(newMove))
!BG_SaberInIdle( newMove ) && !PM_SaberInParry( newMove ) && !PM_SaberInKnockaway( newMove ) && !PM_SaberInBrokenParry( newMove ) && !PM_SaberInReflect( newMove ) && !BG_SaberInSpecial(newMove))
{//readies, parries and reflections have only 1 level
//increment the anim to the next level of saber anims
if ( !PM_SaberInTransition( newMove ) )
{//FIXME: only have level 1 transitions for now
anim += (pm->ps->fd.saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE;
}
anim += (pm->ps->fd.saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE;
}
// If the move does the same animation as the last one, we need to force a restart...
@ -1739,8 +1964,17 @@ void PM_SetSaberMove(short newMove)
setflags |= SETANIM_FLAG_RESTART;
}
//saber torso anims should always be highest priority
setflags |= SETANIM_FLAG_OVERRIDE;
//saber torso anims should always be highest priority (4/12/02 - for special anims only)
if ( newMove == LS_A_LUNGE
|| newMove == LS_A_JUMP_T__B_
|| newMove == LS_A_BACKSTAB
|| newMove == LS_A_BACK
|| newMove == LS_A_BACK_CR
|| newMove == LS_A_FLIP_STAB
|| newMove == LS_A_FLIP_SLASH )
{
setflags |= SETANIM_FLAG_OVERRIDE;
}
if ( BG_InSaberStandAnim(anim) || anim == BOTH_STAND1 )
{
@ -1779,7 +2013,24 @@ void PM_SetSaberMove(short newMove)
{//spins must be played on entire body
parts = SETANIM_BOTH;
}
PM_SetAnim(parts, anim, setflags|SETANIM_FLAG_HOLD, saberMoveData[newMove].blendTime);
else if ( (!pm->cmd.forwardmove&&!pm->cmd.rightmove&&!pm->cmd.upmove))
{//not trying to run, duck or jump
if ( !BG_FlippingAnim( pm->ps->legsAnim ) &&
!BG_InRoll( pm->ps, pm->ps->legsAnim ) &&
!PM_InKnockDown( pm->ps ) &&
!PM_JumpingAnim( pm->ps->legsAnim ) &&
!BG_InSpecialJump( pm->ps->legsAnim ) &&
anim != PM_GetSaberStance() &&
//!PM_CrouchAnim( pm->ps->legsAnim ) &&
//pm->cmd.upmove >= 0 &&
pm->ps->groundEntityNum != ENTITYNUM_NONE &&
!(pm->ps->pm_flags & PMF_DUCKED))
{
parts = SETANIM_BOTH;
}
}
PM_SetAnim(parts, anim, setflags, saberMoveData[newMove].blendTime);
if ( (pm->ps->torsoAnim&~ANIM_TOGGLEBIT) == anim )
{//successfully changed anims

View file

@ -153,7 +153,7 @@ weaponData_t weaponData[WP_NUM_WEAPONS] =
1, // int energyPerShot; // Amount of energy used per shot
100, // int fireTime; // Amount of time between firings
8192, // int range; // Range of weapon
8, // int altEnergyPerShot; // Amount of energy used for alt-fire
25, // int altEnergyPerShot; // Amount of energy used for alt-fire
800, // int altFireTime; // Amount of time between alt-firings
8192, // int altRange; // Range of alt-fire
0, // int chargeSubTime; // ms interval for subtracting ammo during charge
@ -187,7 +187,7 @@ weaponData_t weaponData[WP_NUM_WEAPONS] =
10, // int energyPerShot; // Amount of energy used per shot
700, // int fireTime; // Amount of time between firings
8192, // int range; // Range of weapon
15, // int altEnergyPerShot; // Amount of energy used for alt-fire
25, // int altEnergyPerShot; // Amount of energy used for alt-fire
800, // int altFireTime; // Amount of time between alt-firings
8192, // int altRange; // Range of alt-fire
0, // int chargeSubTime; // ms interval for subtracting ammo during charge

View file

@ -3,6 +3,10 @@
#include "g_local.h"
qboolean PM_SaberInTransition( int move );
qboolean PM_SaberInStart( int move );
qboolean PM_SaberInReturn( int move );
void P_SetTwitchInfo(gclient_t *client)
{
client->ps.painTime = level.time;
@ -1362,10 +1366,47 @@ void ClientThink_real( gentity_t *ent ) {
else
{
ent->client->ps.saberLockFrame = 0;
//check for taunt
if ( (pm.cmd.generic_cmd == GENCMD_ENGAGE_DUEL) && (g_gametype.integer == GT_TOURNAMENT) )
{//already in a duel, make it a taunt command
pm.cmd.buttons |= BUTTON_GESTURE;
}
}
Pmove (&pm);
if (pm.checkDuelLoss)
{
if (pm.checkDuelLoss > 0 && pm.checkDuelLoss <= MAX_CLIENTS)
{
gentity_t *clientLost = &g_entities[pm.checkDuelLoss-1];
if (clientLost && clientLost->inuse && clientLost->client && Q_irand(0, 40) > clientLost->health)
{
vec3_t attDir;
VectorSubtract(ent->client->ps.origin, clientLost->client->ps.origin, attDir);
VectorNormalize(attDir);
VectorClear(clientLost->client->ps.velocity);
clientLost->client->ps.forceHandExtend = HANDEXTEND_NONE;
clientLost->client->ps.forceHandExtendTime = 0;
gGAvoidDismember = 1;
G_Damage(clientLost, ent, ent, attDir, clientLost->client->ps.origin, 9999, DAMAGE_NO_PROTECTION, MOD_SABER);
if (clientLost->health < 1)
{
gGAvoidDismember = 2;
G_CheckForDismemberment(clientLost, clientLost->client->ps.origin, 999, (clientLost->client->ps.legsAnim&~ANIM_TOGGLEBIT));
}
gGAvoidDismember = 0;
}
}
pm.checkDuelLoss = 0;
}
switch(pm.cmd.generic_cmd)
{
case 0:
@ -1374,7 +1415,13 @@ void ClientThink_real( gentity_t *ent ) {
Cmd_ToggleSaber_f(ent);
break;
case GENCMD_ENGAGE_DUEL:
Cmd_EngageDuel_f(ent);
if ( g_gametype.integer == GT_TOURNAMENT )
{//already in a duel, made it a taunt command
}
else
{
Cmd_EngageDuel_f(ent);
}
break;
case GENCMD_FORCE_HEAL:
ForceHeal(ent);
@ -1561,24 +1608,29 @@ void ClientThink_real( gentity_t *ent ) {
G_Damage( faceKicked, ent, ent, oppDir, client->ps.origin, strength, DAMAGE_NO_ARMOR, MOD_MELEE );
if (faceKicked->health > 0 &&
faceKicked->client->ps.stats[STAT_HEALTH] > 0 &&
faceKicked->client->ps.forceHandExtend != HANDEXTEND_KNOCKDOWN)
if ( faceKicked->client->ps.weapon != WP_SABER ||
faceKicked->client->ps.fd.saberAnimLevel < FORCE_LEVEL_3 ||
(!BG_SaberInAttack(faceKicked->client->ps.saberMove) && !PM_SaberInStart(faceKicked->client->ps.saberMove) && !PM_SaberInReturn(faceKicked->client->ps.saberMove) && !PM_SaberInTransition(faceKicked->client->ps.saberMove)) )
{
if (Q_irand(1, 10) <= 3)
{ //only actually knock over sometimes, but always do velocity hit
faceKicked->client->ps.forceHandExtend = HANDEXTEND_KNOCKDOWN;
faceKicked->client->ps.forceHandExtendTime = level.time + 1100;
faceKicked->client->ps.forceDodgeAnim = 0; //this toggles between 1 and 0, when it's 1 we should play the get up anim
if (faceKicked->health > 0 &&
faceKicked->client->ps.stats[STAT_HEALTH] > 0 &&
faceKicked->client->ps.forceHandExtend != HANDEXTEND_KNOCKDOWN)
{
if (Q_irand(1, 10) <= 3)
{ //only actually knock over sometimes, but always do velocity hit
faceKicked->client->ps.forceHandExtend = HANDEXTEND_KNOCKDOWN;
faceKicked->client->ps.forceHandExtendTime = level.time + 1100;
faceKicked->client->ps.forceDodgeAnim = 0; //this toggles between 1 and 0, when it's 1 we should play the get up anim
}
faceKicked->client->ps.otherKiller = ent->s.number;
faceKicked->client->ps.otherKillerTime = level.time + 5000;
faceKicked->client->ps.otherKillerDebounceTime = level.time + 100;
faceKicked->client->ps.velocity[0] = oppDir[0]*(strength*40);
faceKicked->client->ps.velocity[1] = oppDir[1]*(strength*40);
faceKicked->client->ps.velocity[2] = 200;
}
faceKicked->client->ps.otherKiller = ent->s.number;
faceKicked->client->ps.otherKillerTime = level.time + 5000;
faceKicked->client->ps.otherKillerDebounceTime = level.time + 100;
faceKicked->client->ps.velocity[0] = oppDir[0]*(strength*40);
faceKicked->client->ps.velocity[1] = oppDir[1]*(strength*40);
faceKicked->client->ps.velocity[2] = 200;
}
G_Sound( faceKicked, CHAN_AUTO, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) );

View file

@ -338,7 +338,7 @@ const char *G_GetArenaInfoByMap( const char *map ) {
return NULL;
}
#if 0
/*
=================
PlayerIntroSound
@ -363,6 +363,7 @@ static void PlayerIntroSound( const char *modelAndSkin ) {
trap_SendConsoleCommand( EXEC_APPEND, va( "play sound/player/announce/%s.wav\n", skin ) );
}
#endif
/*
===============
@ -619,7 +620,6 @@ G_CheckBotSpawn
*/
void G_CheckBotSpawn( void ) {
int n;
char userinfo[MAX_INFO_VALUE];
G_CheckMinimumPlayers();
@ -633,10 +633,12 @@ void G_CheckBotSpawn( void ) {
ClientBegin( botSpawnQueue[n].clientNum, qfalse );
botSpawnQueue[n].spawnTime = 0;
/*
if( g_gametype.integer == GT_SINGLE_PLAYER ) {
trap_GetUserinfo( botSpawnQueue[n].clientNum, userinfo, sizeof(userinfo) );
PlayerIntroSound( Info_ValueForKey (userinfo, "model") );
}
*/
}
}
@ -992,7 +994,7 @@ void Svcmd_BotList_f( void ) {
}
}
#if 0
/*
===============
G_SpawnBots
@ -1049,6 +1051,7 @@ static void G_SpawnBots( char *botList, int baseDelay ) {
delay += BOT_BEGIN_DELAY_INCREMENT;
}
}
#endif
/*
@ -1165,14 +1168,6 @@ G_InitBots
===============
*/
void G_InitBots( qboolean restart ) {
int fragLimit;
int timeLimit;
const char *arenainfo;
char *strValue;
int basedelay;
char map[MAX_QPATH];
char serverinfo[MAX_INFO_STRING];
G_LoadBots();
G_LoadArenas();
@ -1181,46 +1176,4 @@ void G_InitBots( qboolean restart ) {
//rww - new bot route stuff
LoadPath_ThisLevel();
//end rww
if( g_gametype.integer == GT_SINGLE_PLAYER ) {
trap_GetServerinfo( serverinfo, sizeof(serverinfo) );
Q_strncpyz( map, Info_ValueForKey( serverinfo, "mapname" ), sizeof(map) );
arenainfo = G_GetArenaInfoByMap( map );
if ( !arenainfo ) {
return;
}
strValue = Info_ValueForKey( arenainfo, "fraglimit" );
fragLimit = atoi( strValue );
if ( fragLimit ) {
trap_Cvar_Set( "fraglimit", strValue );
}
else {
trap_Cvar_Set( "fraglimit", "0" );
}
strValue = Info_ValueForKey( arenainfo, "timelimit" );
timeLimit = atoi( strValue );
if ( timeLimit ) {
trap_Cvar_Set( "timelimit", strValue );
}
else {
trap_Cvar_Set( "timelimit", "0" );
}
if ( !fragLimit && !timeLimit ) {
trap_Cvar_Set( "fraglimit", "10" );
trap_Cvar_Set( "timelimit", "0" );
}
basedelay = BOT_BEGIN_DELAY_BASE;
strValue = Info_ValueForKey( arenainfo, "special" );
if( Q_stricmp( strValue, "training" ) == 0 ) {
basedelay += 10000;
}
if( !restart ) {
G_SpawnBots( Info_ValueForKey( arenainfo, "bots" ), basedelay );
}
}
}

View file

@ -769,6 +769,15 @@ void respawn( gentity_t *ent ) {
CopyToBodyQue (ent);
if (gEscaping)
{
ent->client->sess.sessionTeam = TEAM_SPECTATOR;
ent->client->sess.spectatorState = SPECTATOR_FREE;
ent->client->sess.spectatorClient = 0;
ent->client->pers.teamState.state = TEAM_BEGIN;
}
trap_UnlinkEntity (ent);
ClientSpawn(ent);
@ -1268,7 +1277,7 @@ void ClientUserinfoChanged( int clientNum ) {
trap_SetConfigstring( CS_PLAYERS+clientNum, s );
G_LogPrintf( "ClientUserinfoChanged: %i %s\n", clientNum, s );
//G_LogPrintf( "ClientUserinfoChanged: %i %s\n", clientNum, s );
}
@ -1315,7 +1324,9 @@ char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) {
value = Info_ValueForKey (userinfo, "password");
if ( g_password.string[0] && Q_stricmp( g_password.string, "none" ) &&
strcmp( g_password.string, value) != 0) {
return "Invalid password";
static char sTemp[1024];
Q_strncpyz(sTemp, G_GetStripEdString("SVINGAME","INVALID_PASSWORD"), sizeof (sTemp) );
return sTemp;// return "Invalid password";
}
}
@ -1524,6 +1535,26 @@ void ClientBegin( int clientNum, qboolean allowTeamReset ) {
G_ClearClientLog(clientNum);
}
static qboolean AllForceDisabled(int force)
{
int i;
if (force)
{
for (i=0;i<NUM_FORCE_POWERS;i++)
{
if (!(force & (1<<i)))
{
return qfalse;
}
}
return qtrue;
}
return qfalse;
}
/*
===========
ClientSpawn
@ -1533,6 +1564,7 @@ after the first ClientBegin, and after each respawn
Initializes all non-persistant parts of playerState
============
*/
extern qboolean WP_HasForcePowers( const playerState_t *ps );
void ClientSpawn(gentity_t *ent) {
int index;
vec3_t spawn_origin, spawn_angles;
@ -1693,23 +1725,6 @@ void ClientSpawn(gentity_t *ent) {
//give default weapons
client->ps.stats[STAT_WEAPONS] = ( 1 << WP_NONE );
if (g_gametype.integer == GT_HOLOCRON)
{
//always get free saber level 1 in holocron
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //these are precached in g_items, ClearRegisteredItems()
}
else
{
if (client->ps.fd.forcePowerLevel[FP_SABERATTACK])
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //these are precached in g_items, ClearRegisteredItems()
}
else
{ //if you don't have saber attack rank then you don't get a saber
client->ps.stats[STAT_WEAPONS] |= (1 << WP_STUN_BATON);
}
}
if (g_gametype.integer == GT_TOURNAMENT)
{
wDisable = g_duelWeaponDisable.integer;
@ -1719,32 +1734,81 @@ void ClientSpawn(gentity_t *ent) {
wDisable = g_weaponDisable.integer;
}
if (!wDisable || !(wDisable & (1 << WP_BRYAR_PISTOL)))
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BRYAR_PISTOL );
}
else if (g_gametype.integer == GT_JEDIMASTER)
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BRYAR_PISTOL );
}
if (g_gametype.integer == GT_JEDIMASTER)
{
client->ps.stats[STAT_WEAPONS] &= ~(1 << WP_SABER);
client->ps.stats[STAT_WEAPONS] |= (1 << WP_STUN_BATON);
}
if (client->ps.stats[STAT_WEAPONS] & (1 << WP_BRYAR_PISTOL))
if ( g_gametype.integer != GT_HOLOCRON
&& g_gametype.integer != GT_JEDIMASTER
&& !HasSetSaberOnly()
&& !AllForceDisabled( g_forcePowerDisable.integer )
&& g_trueJedi.integer )
{
client->ps.weapon = WP_BRYAR_PISTOL;
}
else if (client->ps.stats[STAT_WEAPONS] & (1 << WP_SABER))
{
client->ps.weapon = WP_SABER;
if ( WP_HasForcePowers( &client->ps ) )
{
client->ps.trueNonJedi = qfalse;
client->ps.trueJedi = qtrue;
//make sure they only use the saber
client->ps.weapon = WP_SABER;
client->ps.stats[STAT_WEAPONS] = (1 << WP_SABER);
}
else
{//no force powers set
client->ps.trueNonJedi = qtrue;
client->ps.trueJedi = qfalse;
if (!wDisable || !(wDisable & (1 << WP_BRYAR_PISTOL)))
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BRYAR_PISTOL );
}
client->ps.stats[STAT_WEAPONS] &= ~(1 << WP_SABER);
client->ps.stats[STAT_WEAPONS] |= (1 << WP_STUN_BATON);
client->ps.weapon = WP_BRYAR_PISTOL;
}
}
else
{
client->ps.weapon = WP_STUN_BATON;
if (g_gametype.integer == GT_HOLOCRON)
{
//always get free saber level 1 in holocron
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //these are precached in g_items, ClearRegisteredItems()
}
else
{
if (client->ps.fd.forcePowerLevel[FP_SABERATTACK])
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //these are precached in g_items, ClearRegisteredItems()
}
else
{ //if you don't have saber attack rank then you don't get a saber
client->ps.stats[STAT_WEAPONS] |= (1 << WP_STUN_BATON);
}
}
if (!wDisable || !(wDisable & (1 << WP_BRYAR_PISTOL)))
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BRYAR_PISTOL );
}
else if (g_gametype.integer == GT_JEDIMASTER)
{
client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BRYAR_PISTOL );
}
if (g_gametype.integer == GT_JEDIMASTER)
{
client->ps.stats[STAT_WEAPONS] &= ~(1 << WP_SABER);
client->ps.stats[STAT_WEAPONS] |= (1 << WP_STUN_BATON);
}
if (client->ps.stats[STAT_WEAPONS] & (1 << WP_BRYAR_PISTOL))
{
client->ps.weapon = WP_BRYAR_PISTOL;
}
else if (client->ps.stats[STAT_WEAPONS] & (1 << WP_SABER))
{
client->ps.weapon = WP_SABER;
}
else
{
client->ps.weapon = WP_STUN_BATON;
}
}
/*
@ -1950,12 +2014,20 @@ void ClientDisconnect( int clientNum ) {
G_LogPrintf( "ClientDisconnect: %i\n", clientNum );
// if we are playing in tourney mode and losing, give a win to the other player
// if we are playing in tourney mode, give a win to the other player and clear his frags for this round
if ( (g_gametype.integer == GT_TOURNAMENT )
&& !level.intermissiontime
&& !level.warmupTime && level.sortedClients[1] == clientNum ) {
level.clients[ level.sortedClients[0] ].sess.wins++;
ClientUserinfoChanged( level.sortedClients[0] );
&& !level.warmupTime ) {
if ( level.sortedClients[1] == clientNum ) {
level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE] = 0;
level.clients[ level.sortedClients[0] ].sess.wins++;
ClientUserinfoChanged( level.sortedClients[0] );
}
else if ( level.sortedClients[0] == clientNum ) {
level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE] = 0;
level.clients[ level.sortedClients[1] ].sess.wins++;
ClientUserinfoChanged( level.sortedClients[1] );
}
}
trap_UnlinkEntity (ent);

View file

@ -748,7 +748,9 @@ void SetTeam( gentity_t *ent, char *s ) {
}
// they go to the end of the line for tournements
if ( team == TEAM_SPECTATOR ) {
client->sess.spectatorTime = level.time;
if ( (g_gametype.integer != GT_TOURNAMENT) || (oldTeam != TEAM_SPECTATOR) ) {//so you don't get dropped to the bottom of the queue for changing skins, etc.
client->sess.spectatorTime = level.time;
}
}
client->sess.sessionTeam = team;
@ -827,10 +829,19 @@ void Cmd_Team_f( gentity_t *ent ) {
return;
}
if (gEscaping)
{
return;
}
// if they are playing a tournement game, count as a loss
if ( (g_gametype.integer == GT_TOURNAMENT )
&& ent->client->sess.sessionTeam == TEAM_FREE ) {
ent->client->sess.losses++;
&& ent->client->sess.sessionTeam == TEAM_FREE ) {//in a tournament game
//disallow changing teams
trap_SendServerCommand( ent-g_entities, "print \"Cannot switch teams in Duel\n\"" );
return;
//FIXME: why should this be a loss???
//ent->client->sess.losses++;
}
trap_Argv( 1, s, sizeof( s ) );
@ -862,10 +873,15 @@ void Cmd_ForceChanged_f( gentity_t *ent )
strcpy(fpChStr, buf);
trap_SendServerCommand( ent-g_entities, va("print \"%s%s\n\"", S_COLOR_GREEN, fpChStr) );
trap_SendServerCommand( ent-g_entities, va("print \"%s%s\n\n\"", S_COLOR_GREEN, fpChStr) );
ent->client->ps.fd.forceDoInit = 1;
argCheck:
if (g_gametype.integer == GT_TOURNAMENT)
{ //If this is duel, don't even bother changing team in relation to this.
return;
}
if (trap_Argc() > 1)
{
char arg[MAX_TOKEN_CHARS];
@ -914,6 +930,7 @@ void Cmd_Follow_f( gentity_t *ent ) {
// if they are playing a tournement game, count as a loss
if ( (g_gametype.integer == GT_TOURNAMENT )
&& ent->client->sess.sessionTeam == TEAM_FREE ) {
//WTF???
ent->client->sess.losses++;
}
@ -937,7 +954,8 @@ void Cmd_FollowCycle_f( gentity_t *ent, int dir ) {
// if they are playing a tournement game, count as a loss
if ( (g_gametype.integer == GT_TOURNAMENT )
&& ent->client->sess.sessionTeam == TEAM_FREE ) {
&& ent->client->sess.sessionTeam == TEAM_FREE ) {\
//WTF???
ent->client->sess.losses++;
}
// first set them to spectator
@ -1006,6 +1024,7 @@ static void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, cons
if ( (g_gametype.integer == GT_TOURNAMENT )
&& other->client->sess.sessionTeam == TEAM_FREE
&& ent->client->sess.sessionTeam != TEAM_FREE ) {
//Hmm, maybe some option to do so if allowed? Or at least in developer mode...
return;
}
@ -1925,6 +1944,11 @@ void Cmd_ToggleSaber_f(gentity_t *ent)
return;
}
if (ent->client->ps.saberLockTime >= level.time)
{
return;
}
if (ent->client && ent->client->ps.weaponTime < 1)
{
if (ent->client->ps.saberHolstered)
@ -2150,6 +2174,93 @@ void Cmd_EngageDuel_f(gentity_t *ent)
}
}
#ifdef _DEBUG
extern stringID_table_t animTable[MAX_ANIMATIONS+1];
void PM_SetAnim(int setAnimParts,int anim,int setAnimFlags, int blendTime);
void Cmd_DebugSetSaberMove_f(gentity_t *self)
{
int argNum = trap_Argc();
char arg[MAX_STRING_CHARS];
if (argNum < 2)
{
return;
}
trap_Argv( 1, arg, sizeof( arg ) );
if (!arg[0])
{
return;
}
self->client->ps.saberMove = atoi(arg);
self->client->ps.saberBlocked = BLOCKED_BOUNCE_MOVE;
if (self->client->ps.saberMove >= LS_MOVE_MAX)
{
self->client->ps.saberMove = LS_MOVE_MAX-1;
}
Com_Printf("Anim for move: %s\n", animTable[saberMoveData[self->client->ps.saberMove].animToUse].name);
}
void Cmd_DebugSetBodyAnim_f(gentity_t *self)
{
int argNum = trap_Argc();
char arg[MAX_STRING_CHARS];
int i = 0;
pmove_t pmv;
if (argNum < 2)
{
return;
}
trap_Argv( 1, arg, sizeof( arg ) );
if (!arg[0])
{
return;
}
while (i < MAX_ANIMATIONS)
{
if (!Q_stricmp(arg, animTable[i].name))
{
break;
}
i++;
}
if (i == MAX_ANIMATIONS)
{
Com_Printf("Animation '%s' does not exist\n", arg);
return;
}
memset (&pmv, 0, sizeof(pmv));
pmv.ps = &self->client->ps;
pmv.animations = bgGlobalAnimations;
pmv.cmd = self->client->pers.cmd;
pmv.trace = trap_Trace;
pmv.pointcontents = trap_PointContents;
pmv.gametype = g_gametype.integer;
pm = &pmv;
PM_SetAnim(SETANIM_BOTH, i, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0);
Com_Printf("Set body anim to %s\n", arg);
}
#endif
void DismembermentTest(gentity_t *self);
#ifdef _DEBUG
void DismembermentByNum(gentity_t *self, int num);
#endif
/*
=================
ClientCommand
@ -2359,10 +2470,29 @@ void ClientCommand( int clientNum ) {
Cmd_SetViewpos_f( ent );
else if (Q_stricmp (cmd, "stats") == 0)
Cmd_Stats_f( ent );
/*
else if (Q_stricmp(cmd, "#mm") == 0 && CheatsOk( ent ))
{
G_PlayerBecomeATST(ent);
}
*/
//I broke the ATST when I restructured it to use a single global anim set for all client animation.
//You can fix it, but you'll have to implement unique animations (per character) again.
else if (Q_stricmp(cmd, "headexplodey") == 0 && CheatsOk( ent ))
{
Cmd_Kill_f (ent);
if (ent->health < 1)
{
float presaveVel = ent->client->ps.velocity[2];
ent->client->ps.velocity[2] = 500;
DismembermentTest(ent);
ent->client->ps.velocity[2] = presaveVel;
}
}
else if (Q_stricmp(cmd, "g2animent") == 0 && CheatsOk( ent ))
{
G_CreateExampleAnimEnt(ent);
}
else if (Q_stricmp(cmd, "thedestroyer") == 0 && CheatsOk( ent ) && ent && ent->client && ent->client->ps.saberHolstered && ent->client->ps.weapon == WP_SABER)
{
Cmd_ToggleSaber_f(ent);
@ -2385,39 +2515,43 @@ void ClientCommand( int clientNum ) {
}
}
#ifdef _DEBUG
else if (Q_stricmp(cmd, "gotocoord") == 0 && CheatsOk( ent ))
else if (Q_stricmp(cmd, "debugSetSaberMove") == 0)
{
char x[64], y[64], z[64];
vec3_t xyz;
if (trap_Argc() < 3)
Cmd_DebugSetSaberMove_f(ent);
}
else if (Q_stricmp(cmd, "debugSetBodyAnim") == 0)
{
Cmd_DebugSetBodyAnim_f(ent);
}
else if (Q_stricmp(cmd, "debugDismemberment") == 0)
{
Cmd_Kill_f (ent);
if (ent->health < 1)
{
return;
char arg[MAX_STRING_CHARS];
int iArg = 0;
if (trap_Argc() > 1)
{
trap_Argv( 1, arg, sizeof( arg ) );
if (arg[0])
{
iArg = atoi(arg);
}
}
DismembermentByNum(ent, iArg);
}
trap_Argv( 1, x, sizeof( x ) );
trap_Argv( 2, y, sizeof( y ) );
trap_Argv( 3, z, sizeof( z ) );
xyz[0] = atof(x);
xyz[1] = atof(y);
xyz[2] = atof(z);
VectorCopy(xyz, ent->client->ps.origin);
}
#endif
/*
else if (Q_stricmp (cmd, "offwithmyhead") == 0)
{
DismembermentTest(ent);
}
*/
else
{
if (Q_stricmp(cmd, "addbot") == 0)
{ //because addbot isn't a recognized command unless you're the server, but it is in the menus regardless
trap_SendServerCommand( clientNum, va("print \"You can only add bots as the server.\n\"" ) );
// trap_SendServerCommand( clientNum, va("print \"You can only add bots as the server.\n\"" ) );
trap_SendServerCommand( clientNum, va("print \"%s.\n\"", G_GetStripEdString("SVINGAME", "ONLY_ADD_BOTS_AS_SERVER")));
}
else
{

View file

@ -890,24 +890,60 @@ void CheckAlmostCapture( gentity_t *self, gentity_t *attacker ) {
#endif
}
static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, int hitLoc )
int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, int hitLoc )
{//FIXME: play dead flop anims on body if in an appropriate _DEAD anim when this func is called
int deathAnim = -1;
int max_health;
int legAnim = 0;
vec3_t objVelocity;
if (!self || !self->client)
{
return 0;
if (!self || self->s.eType != ET_GRAPPLE)
{ //g2animent
return 0;
}
}
max_health = self->client->ps.stats[STAT_MAX_HEALTH];
if (self->client)
{
max_health = self->client->ps.stats[STAT_MAX_HEALTH];
}
else
{
max_health = 60;
}
if (self->client)
{
VectorCopy(self->client->ps.velocity, objVelocity);
}
else
{
VectorCopy(self->s.pos.trDelta, objVelocity);
}
if ( hitLoc == HL_NONE )
{
hitLoc = G_GetHitLocation( self, point );//self->hitLoc
}
if (self->client)
{
legAnim = self->client->ps.legsAnim;
}
else
{
legAnim = self->s.legsAnim;
}
if (gGAvoidDismember)
{
return BOTH_RIGHTHANDCHOPPEDOFF;
}
//dead flops
switch( self->client->ps.legsAnim&~ANIM_TOGGLEBIT )
switch( legAnim&~ANIM_TOGGLEBIT )
{
case BOTH_DEATH1: //# First Death anim
case BOTH_DEAD1:
@ -1051,7 +1087,7 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod,
}
break;
case HL_BACK:
if ( !VectorLengthSquared( self->client->ps.velocity ) )
if ( !VectorLengthSquared( objVelocity ) )
{
deathAnim = BOTH_DEATH17;//head/back: croak
}
@ -1155,7 +1191,7 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod,
break;
case HL_CHEST:
case HL_WAIST:
if ( damage <= max_health*0.25 || !VectorLengthSquared( self->client->ps.velocity ) )
if ( damage <= max_health*0.25 || !VectorLengthSquared( objVelocity ) )
{
if ( !Q_irand( 0, 1 ) )
{
@ -1203,8 +1239,6 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod,
return deathAnim;
}
void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int deathAnim);
gentity_t *G_GetJediMaster(void)
{
int i = 0;
@ -1230,6 +1264,7 @@ gentity_t *G_GetJediMaster(void)
player_die
==================
*/
extern stringID_table_t animTable[MAX_ANIMATIONS+1];
void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) {
gentity_t *ent;
int anim;
@ -1305,6 +1340,25 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
killer, self->s.number, meansOfDeath, killerName,
self->client->pers.netname, obit );
if ( g_austrian.integer
&& g_gametype.integer == GT_TOURNAMENT
&& level.numPlayingClients >= 2 )
{
int spawnTime = (level.clients[level.sortedClients[0]].respawnTime > level.clients[level.sortedClients[1]].respawnTime) ? level.clients[level.sortedClients[0]].respawnTime : level.clients[level.sortedClients[1]].respawnTime;
G_LogPrintf("Duel Kill Details:\n");
G_LogPrintf("Kill Time: %d\n", level.time-spawnTime );
G_LogPrintf("victim: %s, hits on enemy %d\n", self->client->pers.netname, self->client->ps.persistant[PERS_HITS] );
if ( attacker && attacker->client )
{
G_LogPrintf("killer: %s, hits on enemy %d, health: %d\n", attacker->client->pers.netname, attacker->client->ps.persistant[PERS_HITS], attacker->health );
//also - if MOD_SABER, list the animation and saber style
if ( meansOfDeath == MOD_SABER )
{
G_LogPrintf("killer saber style: %d, killer saber anim %s\n", attacker->client->ps.fd.saberAnimLevel, animTable[(attacker->client->ps.torsoAnim&~ANIM_TOGGLEBIT)].name );
}
}
}
G_LogWeaponKill(killer, meansOfDeath);
G_LogWeaponDeath(self->s.number, self->s.weapon);
if (attacker && attacker->client && attacker->inuse)
@ -1807,8 +1861,108 @@ void LimbThink( gentity_t *ent )
G_RunObject(ent);
}
char *hitLocName[HL_MAX] =
{
"none", //HL_NONE = 0,
"right foot", //HL_FOOT_RT,
"left foot", //HL_FOOT_LT,
"right leg", //HL_LEG_RT,
"left leg", //HL_LEG_LT,
"waist", //HL_WAIST,
"back right shoulder", //HL_BACK_RT,
"back left shoulder", //HL_BACK_LT,
"back", //HL_BACK,
"front right shouler", //HL_CHEST_RT,
"front left shoulder", //HL_CHEST_LT,
"chest", //HL_CHEST,
"right arm", //HL_ARM_RT,
"left arm", //HL_ARM_LT,
"right hand", //HL_HAND_RT,
"left hand", //HL_HAND_LT,
"head", //HL_HEAD
"generic1", //HL_GENERIC1,
"generic2", //HL_GENERIC2,
"generic3", //HL_GENERIC3,
"generic4", //HL_GENERIC4,
"generic5", //HL_GENERIC5,
"generic6" //HL_GENERIC6
};
void G_G2PlayerAngles( gentity_t *ent, vec3_t legs[3], vec3_t legsAngles);
void G_GetDismemberLoc(gentity_t *self, vec3_t boltPoint, int limbType)
{ //Just get the general area without using server-side ghoul2
vec3_t fwd, right, up;
AngleVectors(self->r.currentAngles, fwd, right, up);
VectorCopy(self->r.currentOrigin, boltPoint);
switch (limbType)
{
case G2_MODELPART_HEAD:
boltPoint[0] += up[0]*24;
boltPoint[1] += up[1]*24;
boltPoint[2] += up[2]*24;
break;
case G2_MODELPART_WAIST:
boltPoint[0] += up[0]*4;
boltPoint[1] += up[1]*4;
boltPoint[2] += up[2]*4;
break;
case G2_MODELPART_LARM:
boltPoint[0] += up[0]*18;
boltPoint[1] += up[1]*18;
boltPoint[2] += up[2]*18;
boltPoint[0] -= right[0]*10;
boltPoint[1] -= right[1]*10;
boltPoint[2] -= right[2]*10;
break;
case G2_MODELPART_RARM:
boltPoint[0] += up[0]*18;
boltPoint[1] += up[1]*18;
boltPoint[2] += up[2]*18;
boltPoint[0] += right[0]*10;
boltPoint[1] += right[1]*10;
boltPoint[2] += right[2]*10;
break;
case G2_MODELPART_RHAND:
boltPoint[0] += up[0]*8;
boltPoint[1] += up[1]*8;
boltPoint[2] += up[2]*8;
boltPoint[0] += right[0]*10;
boltPoint[1] += right[1]*10;
boltPoint[2] += right[2]*10;
break;
case G2_MODELPART_LLEG:
boltPoint[0] -= up[0]*4;
boltPoint[1] -= up[1]*4;
boltPoint[2] -= up[2]*4;
boltPoint[0] -= right[0]*10;
boltPoint[1] -= right[1]*10;
boltPoint[2] -= right[2]*10;
break;
case G2_MODELPART_RLEG:
boltPoint[0] -= up[0]*4;
boltPoint[1] -= up[1]*4;
boltPoint[2] -= up[2]*4;
boltPoint[0] += right[0]*10;
boltPoint[1] += right[1]*10;
boltPoint[2] += right[2]*10;
break;
default:
break;
}
return;
}
void G_GetDismemberBolt(gentity_t *self, vec3_t boltPoint, int limbType)
{
int useBolt = self->bolt_Head;
@ -1831,6 +1985,9 @@ void G_GetDismemberBolt(gentity_t *self, vec3_t boltPoint, int limbType)
case G2_MODELPART_RARM:
useBolt = self->bolt_RArm;
break;
case G2_MODELPART_RHAND:
useBolt = trap_G2API_AddBolt(self->client->ghoul2, 0, "rhand");
break;
case G2_MODELPART_LLEG:
useBolt = self->bolt_LLeg;
break;
@ -1892,6 +2049,30 @@ void G_GetDismemberBolt(gentity_t *self, vec3_t boltPoint, int limbType)
boltPoint[0] = boltMatrix.matrix[0][3];
boltPoint[1] = boltMatrix.matrix[1][3];
boltPoint[2] = boltMatrix.matrix[2][3];
trap_G2API_GetBoltMatrix(self->client->ghoul2, 1, 0, &boltMatrix, properAngles, properOrigin, level.time, NULL, vec3_origin);
if (self->client && limbType == G2_MODELPART_RHAND)
{ //Make some saber hit sparks over the severed wrist area
vec3_t boltAngles;
gentity_t *te;
boltAngles[0] = -boltMatrix.matrix[0][1];
boltAngles[1] = -boltMatrix.matrix[1][1];
boltAngles[2] = -boltMatrix.matrix[2][1];
te = G_TempEntity( boltPoint, EV_SABER_HIT );
VectorCopy(boltPoint, te->s.origin);
VectorCopy(boltAngles, te->s.angles);
if (!te->s.angles[0] && !te->s.angles[1] && !te->s.angles[2])
{ //don't let it play with no direction
te->s.angles[1] = 1;
}
te->s.eventParm = 16; //lots of sparks
}
}
void G_Dismember( gentity_t *ent, vec3_t point, int limbType, float limbRollBase, float limbPitchBase, int deathAnim )
@ -1913,8 +2094,8 @@ void G_Dismember( gentity_t *ent, vec3_t point, int limbType, float limbRollBase
limb->r.svFlags = SVF_USE_CURRENT_ORIGIN;
limb->clipmask = MASK_SOLID;
limb->r.contents = CONTENTS_TRIGGER;
VectorSet( limb->r.mins, -3.0f, -3.0f, -3.0f );
VectorSet( limb->r.maxs, 3.0f, 3.0f, 3.0f );
VectorSet( limb->r.mins, -6.0f, -6.0f, -9.0f );
VectorSet( limb->r.maxs, 6.0f, 6.0f, 6.0f );
// VectorClear(limb->r.mins);
// VectorClear(limb->r.maxs);
@ -1934,20 +2115,45 @@ void G_Dismember( gentity_t *ent, vec3_t point, int limbType, float limbRollBase
limb->s.pos.trTime = level.time; // move a bit on the very first frame
VectorSubtract( point, ent->r.currentOrigin, dir );
VectorNormalize( dir );
VectorCopy(ent->client->ps.velocity, vel);
if (ent->client)
{
VectorCopy(ent->client->ps.velocity, vel);
}
else
{
VectorCopy(ent->s.pos.trDelta, vel);
}
VectorMA( vel, 100, dir, limb->s.pos.trDelta );
//add some vertical velocity
if (limbType == G2_MODELPART_HEAD ||
limbType == G2_MODELPART_WAIST)
{
limb->s.pos.trDelta[2] += 100;
}
//make it bounce some
limb->s.eFlags |= EF_BOUNCE_HALF;
//no trDuration?
//spin it
VectorClear( limb->s.apos.trBase );
/*
limb->s.apos.trBase[0] = limbPitchBase;
limb->s.apos.trBase[1] = ent->client->ps.viewangles[1];
limb->s.apos.trBase[2] = limbRollBase;
*/
if (ent->client)
{
limb->s.apos.trBase[1] = ent->client->ps.viewangles[1];
}
else
{
limb->s.apos.trBase[1] = ent->r.currentAngles[1];
}
VectorClear( limb->s.apos.trDelta );
/*
limb->s.apos.trDelta[0] = Q_irand( -300, 300 );
limb->s.apos.trDelta[2] = Q_irand( -300, 300 );
limb->s.apos.trDelta[1] = Q_irand( -300, 300 );
@ -1958,34 +2164,71 @@ void G_Dismember( gentity_t *ent, vec3_t point, int limbType, float limbRollBase
limb->s.apos.trDelta[2] = Q_irand( -60, 60 );
limb->s.apos.trDelta[1] = Q_irand( -60, 60 );
}
*/
VectorClear(limb->s.apos.trDelta);
limb->s.apos.trTime = level.time;
limb->s.apos.trType = TR_LINEAR;
limb->s.modelGhoul2 = limbType;
limb->s.g2radius = 200;
limb->s.modelindex = ent->s.number;
limb->s.modelindex2 = deathAnim;
if (ent->client)
{
limb->s.modelindex = ent->s.number;
limb->s.modelindex2 = deathAnim;
}
else
{
limb->s.modelindex = -1;
limb->s.modelindex2 = ent->s.number;
}
trap_LinkEntity( limb );
}
/*
void DismembermentTest(gentity_t *self)
{
int sect = G2_MODELPART_HEAD;
vec3_t boltPoint;
char *sectc = ConcatArgs( 1 );
if (sectc && sectc[0])
G_GetDismemberBolt(self, boltPoint, sect);
G_Dismember( self, boltPoint, sect, 90, 0, BOTH_DEATH1 );
}
void DismembermentByNum(gentity_t *self, int num)
{
int sect = G2_MODELPART_HEAD;
vec3_t boltPoint;
switch (num)
{
sect = atoi(sectc)+G2_MODELPART_HEAD;
case 0:
sect = G2_MODELPART_HEAD;
break;
case 1:
sect = G2_MODELPART_WAIST;
break;
case 2:
sect = G2_MODELPART_LARM;
break;
case 3:
sect = G2_MODELPART_RARM;
break;
case 4:
sect = G2_MODELPART_RHAND;
break;
case 5:
sect = G2_MODELPART_LLEG;
break;
case 6:
sect = G2_MODELPART_RLEG;
break;
default:
break;
}
G_GetDismemberBolt(self, boltPoint, sect);
G_Dismember( self, boltPoint, sect, 90, 0 );
G_Dismember( self, boltPoint, sect, 90, 0, BOTH_DEATH1 );
}
*/
int G_GetHitQuad( gentity_t *self, vec3_t hitloc )
{
@ -1995,14 +2238,29 @@ int G_GetHitQuad( gentity_t *self, vec3_t hitloc )
float zdiff;
int hitLoc = -1;
VectorCopy(self->client->ps.origin, clEye);
clEye[2] += self->client->ps.viewheight;
if (self->client)
{
VectorCopy(self->client->ps.origin, clEye);
clEye[2] += self->client->ps.viewheight;
}
else
{
VectorCopy(self->s.pos.trBase, clEye);
clEye[2] += 16;
}
VectorSubtract( hitloc, clEye, diff );
diff[2] = 0;
VectorNormalize( diff );
fwdangles[1] = self->client->ps.viewangles[1];
if (self->client)
{
fwdangles[1] = self->client->ps.viewangles[1];
}
else
{
fwdangles[1] = self->s.apos.trBase[1];
}
// Ultimately we might care if the shot was ahead or behind, but for now, just quadrant is fine.
AngleVectors( fwdangles, NULL, right, NULL );
@ -2054,6 +2312,8 @@ int G_GetHitQuad( gentity_t *self, vec3_t hitloc )
return hitLoc;
}
int gGAvoidDismember = 0;
void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int deathAnim)
{
int hitLoc, hitLocUse = -1;
@ -2065,17 +2325,32 @@ void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int death
return;
}
if (Q_irand(0, 100) > dismember)
if (gGAvoidDismember == 1)
{
return;
}
if (damage < 20)
{
return;
if (!gGAvoidDismember != 2)
{ //this means do the dismemberment regardless of randomness and damage
if (Q_irand(0, 100) > dismember)
{
return;
}
if (damage < 20)
{
return;
}
}
hitLoc = G_GetHitLocation( ent, point );
if (gGAvoidDismember == 2)
{
hitLoc = HL_HAND_RT;
}
else
{
hitLoc = G_GetHitLocation( ent, point );
}
switch(hitLoc)
{
@ -2086,6 +2361,7 @@ void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int death
case HL_FOOT_LT:
case HL_LEG_LT:
hitLocUse = G2_MODELPART_LLEG;
break;
case HL_WAIST:
hitLocUse = G2_MODELPART_WAIST;
@ -2100,15 +2376,18 @@ void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int death
break;
*/
case HL_ARM_RT:
case HL_HAND_RT:
hitLocUse = G2_MODELPART_RARM;
break;
case HL_HAND_RT:
hitLocUse = G2_MODELPART_RHAND;
break;
case HL_ARM_LT:
case HL_HAND_LT:
hitLocUse = G2_MODELPART_LARM;
break;
case HL_HEAD:
hitLocUse = G2_MODELPART_HEAD;
break;
default:
hitLocUse = G_GetHitQuad(ent, point);
break;
@ -2119,7 +2398,19 @@ void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int death
return;
}
G_GetDismemberBolt(ent, boltPoint, hitLocUse);
if (ent->client)
{
G_GetDismemberBolt(ent, boltPoint, hitLocUse);
if ( g_austrian.integer
&& g_gametype.integer == GT_TOURNAMENT )
{
G_LogPrintf( "Duel Dismemberment: %s dismembered at %s\n", ent->client->pers.netname, hitLocName[hitLoc] );
}
}
else
{
G_GetDismemberLoc(ent, boltPoint, hitLocUse);
}
G_Dismember(ent, boltPoint, hitLocUse, 90, 0, deathAnim);
}
@ -2285,7 +2576,14 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
mass = 200;
VectorScale (dir, g_knockback.value * (float)knockback / mass, kvel);
if (mod == MOD_SABER)
{
VectorScale (dir, (g_knockback.value * (float)knockback / mass)*g_saberDmgVelocityScale.integer, kvel);
}
else
{
VectorScale (dir, g_knockback.value * (float)knockback / mass, kvel);
}
VectorAdd (targ->client->ps.velocity, kvel, targ->client->ps.velocity);
if (attacker && attacker->client && attacker != targ)
@ -2296,7 +2594,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
}
// set the timer so that the other client can't cancel
// out the movement immediately
if ( !targ->client->ps.pm_time ) {
if ( !targ->client->ps.pm_time && (g_saberDmgVelocityScale.integer || mod != MOD_SABER) ) {
int t;
t = knockback * 2;
@ -2311,6 +2609,43 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
}
}
if ( g_trueJedi.integer )
{//less explosive damage for jedi, more saber damage for non-jedi
if ( client->ps.trueJedi )
{//if the target is a trueJedi, reduce splash and explosive damage to 1/2
switch ( mod )
{
case MOD_REPEATER_ALT:
case MOD_REPEATER_ALT_SPLASH:
case MOD_DEMP2_ALT:
case MOD_FLECHETTE_ALT_SPLASH:
case MOD_ROCKET:
case MOD_ROCKET_SPLASH:
case MOD_ROCKET_HOMING:
case MOD_ROCKET_HOMING_SPLASH:
case MOD_THERMAL:
case MOD_THERMAL_SPLASH:
case MOD_TRIP_MINE_SPLASH:
case MOD_TIMED_MINE_SPLASH:
case MOD_DET_PACK_SPLASH:
damage *= 0.5;
break;
}
}
else if ( client->ps.trueNonJedi && mod == MOD_SABER )
{//if the target is a trueNonJedi, take more saber damage... combined with the 1.5 in the w_saber stuff, this is 6 times damage!
if ( damage < 100 )
{
damage *= 4;
if ( damage > 100 )
{
damage = 100;
}
}
}
}
// check for completely getting out of the damage
if ( !(dflags & DAMAGE_NO_PROTECTION) ) {
@ -2483,7 +2818,11 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
int maxtake = take;
//G_Sound(targ, CHAN_AUTO, protectHitSound);
G_PreDefSound(targ->client->ps.origin, PDSOUND_PROTECTHIT);
if (targ->client->forcePowerSoundDebounce < level.time)
{
G_PreDefSound(targ->client->ps.origin, PDSOUND_PROTECTHIT);
targ->client->forcePowerSoundDebounce = level.time + 400;
}
if (targ->client->ps.fd.forcePowerLevel[FP_PROTECT] == FORCE_LEVEL_1)
{
@ -2611,6 +2950,10 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
VectorCopy(targ->client->ps.origin, targ->pos1);
}
}
else if (targ->s.eType == ET_GRAPPLE)
{ //g2animent
VectorCopy(point, targ->pos1);
}
if (targ->health < -999)
targ->health = -999;

View file

@ -1723,32 +1723,11 @@ free fall from their spawn points
void FinishSpawningItem( gentity_t *ent ) {
trace_t tr;
vec3_t dest;
int wDisable = 0;
// gitem_t *item;
// VectorSet( ent->r.mins, -ITEM_RADIUS, -ITEM_RADIUS, -ITEM_RADIUS );
// VectorSet( ent->r.maxs, ITEM_RADIUS, ITEM_RADIUS, ITEM_RADIUS );
if (g_gametype.integer == GT_TOURNAMENT)
{
wDisable = g_duelWeaponDisable.integer;
}
else
{
wDisable = g_weaponDisable.integer;
}
if (ent->item->giType == IT_WEAPON &&
wDisable &&
(wDisable & (1 << ent->item->giTag)))
{
if (g_gametype.integer != GT_JEDIMASTER)
{
G_FreeEntity( ent );
return;
}
}
if (g_gametype.integer != GT_JEDIMASTER)
{
if (HasSetSaberOnly())
@ -2027,9 +2006,31 @@ be on an entity that hasn't spawned yet.
============
*/
void G_SpawnItem (gentity_t *ent, gitem_t *item) {
int wDisable = 0;
G_SpawnFloat( "random", "0", &ent->random );
G_SpawnFloat( "wait", "0", &ent->wait );
if (g_gametype.integer == GT_TOURNAMENT)
{
wDisable = g_duelWeaponDisable.integer;
}
else
{
wDisable = g_weaponDisable.integer;
}
if (item->giType == IT_WEAPON &&
wDisable &&
(wDisable & (1 << item->giTag)))
{
if (g_gametype.integer != GT_JEDIMASTER)
{
G_FreeEntity( ent );
return;
}
}
RegisterItem( item );
if ( G_ItemDisabled(item) )
return;

View file

@ -33,6 +33,8 @@
#define FL_NO_HUMANS 0x00004000 // spawn point just for bots
#define FL_FORCE_GESTURE 0x00008000 // force gesture on client
#define ANIMENT_SPAWNER //allow animent spawners
// movers are things like doors, plats, buttons, etc
typedef enum {
MOVER_POS1,
@ -88,6 +90,9 @@ typedef enum
extern void *precachedKyle;
extern void *g2SaberInstance;
extern qboolean gEscaping;
extern int gEscapeTime;
typedef struct gentity_s gentity_t;
typedef struct gclient_s gclient_t;
@ -405,10 +410,17 @@ struct gclient_s {
vec3_t lastSaberTip; //position of saber tip last update
vec3_t lastSaberBase; //position of saber base last update
vec3_t lastSaberDir_Always; //every getboltmatrix, set to saber dir
vec3_t lastSaberBase_Always; //every getboltmatrix, set to saber base
int lastSaberStorageTime; //server time that the above two values were updated (for making sure they aren't out of date)
qboolean hasCurrentPosition; //are lastSaberTip and lastSaberBase valid?
int dangerTime; // level.time when last attack occured
int forcePowerSoundDebounce; //if > level.time, don't do certain sound events again (drain sound, absorb sound, etc)
qboolean fjDidJump;
};
@ -621,6 +633,8 @@ qboolean trap_G2API_GetBoltMatrix(void *ghoul2, const int modelIndex, const int
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale);
qboolean trap_G2API_GetBoltMatrix_NoReconstruct(void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix,
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale);
qboolean trap_G2API_GetBoltMatrix_NoRecNoRot(void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix,
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale);
int trap_G2API_InitGhoul2Model(void **ghoul2Ptr, const char *fileName, int modelIndex, qhandle_t customSkin,
qhandle_t customShader, int modelFlags, int lodBias);
int trap_G2API_AddBolt(void *ghoul2, int modelIndex, const char *boneName);
@ -632,6 +646,8 @@ void trap_G2API_DuplicateGhoul2Instance(void *g2From, void **g2To);
qboolean trap_G2API_HasGhoul2ModelOnIndex(void *ghlInfo, int modelIndex);
qboolean trap_G2API_RemoveGhoul2Model(void *ghlInfo, int modelIndex);
void trap_G2API_CleanGhoul2Models(void **ghoul2Ptr);
void trap_G2API_CollisionDetect ( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position,
int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius );
qboolean trap_G2API_SetBoneAngles(void *ghoul2, int modelIndex, const char *boneName, const vec3_t angles, const int flags,
const int up, const int right, const int forward, qhandle_t *modelList,
@ -654,6 +670,9 @@ void TossClientWeapon(gentity_t *self, vec3_t direction, float speed);
void TossClientItems( gentity_t *self );
void TossClientCubes( gentity_t *self );
void ExplodeDeath( gentity_t *self );
void G_CheckForDismemberment(gentity_t *ent, vec3_t point, int damage, int deathAnim);
extern int gGAvoidDismember;
// damage flags
#define DAMAGE_NORMAL 0x00000000 // No flags set.
@ -688,6 +707,9 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a
//
// g_mover.c
//
#define SPF_BUTTON_USABLE 1
#define SPF_BUTTON_FPUSHABLE 2
void G_RunMover( gentity_t *ent );
void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace );
@ -703,6 +725,7 @@ void trigger_teleporter_touch (gentity_t *self, gentity_t *other, trace_t *trace
void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles );
void ATST_ManageDamageBoxes(gentity_t *ent);
int G_PlayerBecomeATST(gentity_t *ent);
void G_CreateExampleAnimEnt(gentity_t *ent);
//
@ -842,7 +865,7 @@ qboolean G_DoesMapSupportGametype(const char *mapname, int gametype);
const char *G_RefreshNextMap(int gametype, qboolean forced);
// w_force.c / w_saber.c
void G_PreDefSound(vec3_t org, int pdSound);
gentity_t *G_PreDefSound(vec3_t org, int pdSound);
qboolean HasSetSaberOnly(void);
void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower );
void WP_SaberPositionUpdate( gentity_t *self, usercmd_t *ucmd );
@ -924,12 +947,23 @@ extern vmCvar_t g_maxclients; // allow this many total, including spectators
extern vmCvar_t g_maxGameClients; // allow this many active
extern vmCvar_t g_restarted;
extern vmCvar_t g_trueJedi;
extern vmCvar_t g_autoMapCycle;
extern vmCvar_t g_dmflags;
extern vmCvar_t g_maxForceRank;
extern vmCvar_t g_forceBasedTeams;
extern vmCvar_t g_privateDuel;
extern vmCvar_t g_saberLocking;
extern vmCvar_t g_saberLockFactor;
extern vmCvar_t g_saberTraceSaberFirst;
#ifdef G2_COLLISION_ENABLED
extern vmCvar_t g_saberGhoul2Collision;
#endif
extern vmCvar_t g_saberAlwaysBoxTrace;
extern vmCvar_t g_saberBoxTraceSize;
extern vmCvar_t g_forceRegenTime;
extern vmCvar_t g_spawnInvulnerability;
extern vmCvar_t g_forcePowerDisable;
@ -982,6 +1016,14 @@ extern vmCvar_t g_dismember;
extern vmCvar_t g_forceDodge;
extern vmCvar_t g_timeouttospec;
extern vmCvar_t g_saberDmgVelocityScale;
extern vmCvar_t g_saberDmgDelay_Idle;
extern vmCvar_t g_saberDmgDelay_Wound;
extern vmCvar_t g_saberDebugPrint;
extern vmCvar_t g_austrian;
void trap_Printf( const char *fmt );
void trap_Error( const char *fmt );
int trap_Milliseconds( void );

View file

@ -20,6 +20,8 @@ gclient_t g_clients[MAX_CLIENTS];
qboolean gDuelExit = qfalse;
vmCvar_t g_trueJedi;
vmCvar_t g_gametype;
vmCvar_t g_MaxHolocronCarry;
vmCvar_t g_ff_objectives;
@ -29,6 +31,15 @@ vmCvar_t g_maxForceRank;
vmCvar_t g_forceBasedTeams;
vmCvar_t g_privateDuel;
vmCvar_t g_saberLocking;
vmCvar_t g_saberLockFactor;
vmCvar_t g_saberTraceSaberFirst;
#ifdef G2_COLLISION_ENABLED
vmCvar_t g_saberGhoul2Collision;
#endif
vmCvar_t g_saberAlwaysBoxTrace;
vmCvar_t g_saberBoxTraceSize;
vmCvar_t g_forceRegenTime;
vmCvar_t g_spawnInvulnerability;
vmCvar_t g_forcePowerDisable;
@ -93,6 +104,14 @@ vmCvar_t g_dismember;
vmCvar_t g_forceDodge;
vmCvar_t g_timeouttospec;
vmCvar_t g_saberDmgVelocityScale;
vmCvar_t g_saberDmgDelay_Idle;
vmCvar_t g_saberDmgDelay_Wound;
vmCvar_t g_saberDebugPrint;
vmCvar_t g_austrian;
int gDuelist1 = -1;
int gDuelist2 = -1;
@ -117,6 +136,8 @@ static cvarTable_t gameCvarTable[] = {
// change anytime vars
{ &g_ff_objectives, "g_ff_objectives", "0", /*CVAR_SERVERINFO |*/ CVAR_NORESTART, 0, qtrue },
{ &g_trueJedi, "g_jediVmerc", "0", CVAR_INTERNAL |CVAR_SERVERINFO | CVAR_LATCH, 0, qtrue },
{ &g_autoMapCycle, "g_autoMapCycle", "0", CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
{ &g_dmflags, "dmflags", "0", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qtrue },
@ -124,6 +145,15 @@ static cvarTable_t gameCvarTable[] = {
{ &g_forceBasedTeams, "g_forceBasedTeams", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_USERINFO | CVAR_LATCH, 0, qfalse },
{ &g_privateDuel, "g_privateDuel", "1", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qtrue },
{ &g_saberLocking, "g_saberLocking", "1", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qtrue },
{ &g_saberLockFactor, "g_saberLockFactor", "6", CVAR_ARCHIVE, 0, qtrue },
{ &g_saberTraceSaberFirst, "g_saberTraceSaberFirst", "1", CVAR_ARCHIVE, 0, qtrue },
#ifdef G2_COLLISION_ENABLED
{ &g_saberGhoul2Collision, "g_saberGhoul2Collision", "0", 0, 0, qtrue },
#endif
{ &g_saberAlwaysBoxTrace, "g_saberAlwaysBoxTrace", "0", 0, 0, qtrue },
{ &g_saberBoxTraceSize, "g_saberBoxTraceSize", "2", 0, 0, qtrue },
{ &g_forceRegenTime, "g_forceRegenTime", "200", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qtrue },
{ &g_spawnInvulnerability, "g_spawnInvulnerability", "3000", CVAR_ARCHIVE, 0, qtrue },
@ -203,10 +233,18 @@ static cvarTable_t gameCvarTable[] = {
{ &g_rankings, "g_rankings", "0", 0, 0, qfalse},
{ &g_dismember, "g_dismember", "0", 0, 0, qtrue },
{ &g_dismember, "g_dismember", "0", CVAR_ARCHIVE, 0, qtrue },
{ &g_forceDodge, "g_forceDodge", "1", 0, 0, qtrue },
{ &g_timeouttospec, "g_timeouttospec", "70", CVAR_ARCHIVE, 0, qfalse },
{ &g_saberDmgVelocityScale, "g_saberDmgVelocityScale", "0", CVAR_ARCHIVE, 0, qtrue },
{ &g_saberDmgDelay_Idle, "g_saberDmgDelay_Idle", "350", CVAR_ARCHIVE, 0, qtrue },
{ &g_saberDmgDelay_Wound, "g_saberDmgDelay_Wound", "0", CVAR_ARCHIVE, 0, qtrue },
{ &g_saberDebugPrint, "g_saberDebugPrint", "0", CVAR_CHEAT, 0, qfalse },
{ &g_austrian, "g_austrian", "0", CVAR_ARCHIVE, 0, qfalse },
};
// bk001129 - made static to avoid aliasing
@ -461,7 +499,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) {
//trap_SP_RegisterServer("mp_svgame");
if ( g_gametype.integer != GT_SINGLE_PLAYER && g_log.string[0] ) {
if ( g_log.string[0] ) {
if ( g_logSync.integer ) {
trap_FS_FOpenFile( g_log.string, &level.logFile, FS_APPEND_SYNC );
} else {
@ -554,6 +592,11 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) {
}
G_RemapTeamShaders();
if ( g_gametype.integer == GT_TOURNAMENT )
{
G_LogPrintf("Duel Tournament Begun: kill limit %d, win limit: %d\n", g_fraglimit.integer, g_duel_fraglimit.integer );
}
}
@ -702,6 +745,47 @@ void RemoveTournamentLoser( void ) {
SetTeam( &g_entities[ clientNum ], "s" );
}
void RemoveDuelDrawLoser(void)
{
int clFirst = 0;
int clSec = 0;
int clFailure = 0;
if ( level.clients[ level.sortedClients[0] ].pers.connected != CON_CONNECTED )
{
return;
}
if ( level.clients[ level.sortedClients[1] ].pers.connected != CON_CONNECTED )
{
return;
}
clFirst = level.clients[ level.sortedClients[0] ].ps.stats[STAT_HEALTH] + level.clients[ level.sortedClients[0] ].ps.stats[STAT_ARMOR];
clSec = level.clients[ level.sortedClients[1] ].ps.stats[STAT_HEALTH] + level.clients[ level.sortedClients[1] ].ps.stats[STAT_ARMOR];
if (clFirst > clSec)
{
clFailure = 1;
}
else if (clSec > clFirst)
{
clFailure = 0;
}
else
{
clFailure = 2;
}
if (clFailure != 2)
{
SetTeam( &g_entities[ level.sortedClients[clFailure] ], "s" );
}
else
{ //we could be more elegant about this, but oh well.
SetTeam( &g_entities[ level.sortedClients[1] ], "s" );
}
}
/*
=======================
RemoveTournamentWinner
@ -732,20 +816,78 @@ AdjustTournamentScores
void AdjustTournamentScores( void ) {
int clientNum;
clientNum = level.sortedClients[0];
if ( level.clients[ clientNum ].pers.connected == CON_CONNECTED ) {
level.clients[ clientNum ].sess.wins++;
ClientUserinfoChanged( clientNum );
if (level.clients[level.sortedClients[0]].ps.persistant[PERS_SCORE] ==
level.clients[level.sortedClients[1]].ps.persistant[PERS_SCORE] &&
level.clients[level.sortedClients[0]].pers.connected == CON_CONNECTED &&
level.clients[level.sortedClients[1]].pers.connected == CON_CONNECTED)
{
int clFirst = level.clients[ level.sortedClients[0] ].ps.stats[STAT_HEALTH] + level.clients[ level.sortedClients[0] ].ps.stats[STAT_ARMOR];
int clSec = level.clients[ level.sortedClients[1] ].ps.stats[STAT_HEALTH] + level.clients[ level.sortedClients[1] ].ps.stats[STAT_ARMOR];
int clFailure = 0;
int clSuccess = 0;
trap_SetConfigstring ( CS_CLIENT_DUELWINNER, va("%i", clientNum ) );
if (clFirst > clSec)
{
clFailure = 1;
clSuccess = 0;
}
else if (clSec > clFirst)
{
clFailure = 0;
clSuccess = 1;
}
else
{
clFailure = 2;
clSuccess = 2;
}
if (clFailure != 2)
{
clientNum = level.sortedClients[clSuccess];
level.clients[ clientNum ].sess.wins++;
ClientUserinfoChanged( clientNum );
trap_SetConfigstring ( CS_CLIENT_DUELWINNER, va("%i", clientNum ) );
clientNum = level.sortedClients[clFailure];
level.clients[ clientNum ].sess.losses++;
ClientUserinfoChanged( clientNum );
}
else
{
clSuccess = 0;
clFailure = 1;
clientNum = level.sortedClients[clSuccess];
level.clients[ clientNum ].sess.wins++;
ClientUserinfoChanged( clientNum );
trap_SetConfigstring ( CS_CLIENT_DUELWINNER, va("%i", clientNum ) );
clientNum = level.sortedClients[clFailure];
level.clients[ clientNum ].sess.losses++;
ClientUserinfoChanged( clientNum );
}
}
else
{
clientNum = level.sortedClients[0];
if ( level.clients[ clientNum ].pers.connected == CON_CONNECTED ) {
level.clients[ clientNum ].sess.wins++;
ClientUserinfoChanged( clientNum );
clientNum = level.sortedClients[1];
if ( level.clients[ clientNum ].pers.connected == CON_CONNECTED ) {
level.clients[ clientNum ].sess.losses++;
ClientUserinfoChanged( clientNum );
trap_SetConfigstring ( CS_CLIENT_DUELWINNER, va("%i", clientNum ) );
}
clientNum = level.sortedClients[1];
if ( level.clients[ clientNum ].pers.connected == CON_CONNECTED ) {
level.clients[ clientNum ].sess.losses++;
ClientUserinfoChanged( clientNum );
}
}
}
/*
@ -806,6 +948,9 @@ int QDECL SortRanks( const void *a, const void *b ) {
return 0;
}
qboolean gQueueScoreMessage = qfalse;
int gQueueScoreMessageTime = 0;
/*
============
CalculateRanks
@ -953,9 +1098,12 @@ void CalculateRanks( void ) {
// see if it is time to end the level
CheckExitRules();
// if we are at the intermission, send the new info to everyone
if ( level.intermissiontime ) {
SendScoreboardMessageToAllClients();
// if we are at the intermission or in multi-frag Duel game mode, send the new info to everyone
if ( level.intermissiontime || g_gametype.integer == GT_TOURNAMENT ) {
gQueueScoreMessage = qtrue;
gQueueScoreMessageTime = level.time + 500;
//SendScoreboardMessageToAllClients();
//rww - Made this operate on a "queue" system because it was causing large overflows
}
}
@ -1313,10 +1461,6 @@ void CheckIntermissionExit( void ) {
gclient_t *cl;
int readyMask;
if ( g_gametype.integer == GT_SINGLE_PLAYER ) {
return;
}
// see which players are ready
ready = 0;
notReady = 0;
@ -1345,14 +1489,51 @@ void CheckIntermissionExit( void ) {
{
gDidDuelStuff = qtrue;
if ( g_austrian.integer )
{
G_LogPrintf("Duel Results:\n");
//G_LogPrintf("Duel Time: %d\n", level.time );
G_LogPrintf("winner: %s, score: %d, wins/losses: %d/%d\n",
level.clients[level.sortedClients[0]].pers.netname,
level.clients[level.sortedClients[0]].ps.persistant[PERS_SCORE],
level.clients[level.sortedClients[0]].sess.wins,
level.clients[level.sortedClients[0]].sess.losses );
G_LogPrintf("loser: %s, score: %d, wins/losses: %d/%d\n",
level.clients[level.sortedClients[1]].pers.netname,
level.clients[level.sortedClients[1]].ps.persistant[PERS_SCORE],
level.clients[level.sortedClients[1]].sess.wins,
level.clients[level.sortedClients[1]].sess.losses );
}
// if we are running a tournement map, kick the loser to spectator status,
// which will automatically grab the next spectator and restart
if (!DuelLimitHit())
{
RemoveTournamentLoser();
if (level.clients[level.sortedClients[0]].ps.persistant[PERS_SCORE] ==
level.clients[level.sortedClients[1]].ps.persistant[PERS_SCORE] &&
level.clients[level.sortedClients[0]].pers.connected == CON_CONNECTED &&
level.clients[level.sortedClients[1]].pers.connected == CON_CONNECTED)
{
RemoveDuelDrawLoser();
}
else
{
RemoveTournamentLoser();
}
AddTournamentPlayer();
if ( g_austrian.integer )
{
G_LogPrintf("Duel Initiated: %s %d/%d vs %s %d/%d, kill limit: %d\n",
level.clients[level.sortedClients[0]].pers.netname,
level.clients[level.sortedClients[0]].sess.wins,
level.clients[level.sortedClients[0]].sess.losses,
level.clients[level.sortedClients[1]].pers.netname,
level.clients[level.sortedClients[1]].sess.wins,
level.clients[level.sortedClients[1]].sess.losses,
g_fraglimit.integer );
}
if (level.numPlayingClients >= 2)
{
trap_SetConfigstring ( CS_CLIENT_DUELISTS, va("%i|%i", level.sortedClients[0], level.sortedClients[1] ) );
@ -1365,11 +1546,30 @@ void CheckIntermissionExit( void ) {
return;
}
if ( g_austrian.integer )
{
G_LogPrintf("Duel Tournament Winner: %s wins/losses: %d/%d\n",
level.clients[level.sortedClients[0]].pers.netname,
level.clients[level.sortedClients[0]].sess.wins,
level.clients[level.sortedClients[0]].sess.losses );
}
//this means we hit the duel limit so reset the wins/losses
//but still push the loser to the back of the line, and retain the order for
//the map change
RemoveTournamentLoser();
if (level.clients[level.sortedClients[0]].ps.persistant[PERS_SCORE] ==
level.clients[level.sortedClients[1]].ps.persistant[PERS_SCORE] &&
level.clients[level.sortedClients[0]].pers.connected == CON_CONNECTED &&
level.clients[level.sortedClients[1]].pers.connected == CON_CONNECTED)
{
RemoveDuelDrawLoser();
}
else
{
RemoveTournamentLoser();
}
AddTournamentPlayer();
if (level.numPlayingClients >= 2)
{
trap_SetConfigstring ( CS_CLIENT_DUELISTS, va("%i|%i", level.sortedClients[0], level.sortedClients[1] ) );
@ -1485,6 +1685,38 @@ void CheckExitRules( void ) {
return;
}
if (gEscaping)
{
int i = 0;
int numLiveClients = 0;
while (i < MAX_CLIENTS)
{
if (g_entities[i].inuse && g_entities[i].client && g_entities[i].health > 0)
{
if (g_entities[i].client->sess.sessionTeam != TEAM_SPECTATOR &&
!(g_entities[i].client->ps.pm_flags & PMF_FOLLOW))
{
numLiveClients++;
}
}
i++;
}
if (gEscapeTime < level.time)
{
gEscaping = qfalse;
LogExit( "Escape time ended." );
return;
}
if (!numLiveClients)
{
gEscaping = qfalse;
LogExit( "Everyone failed to escape." );
return;
}
}
if ( level.intermissionQueued ) {
int time = (g_singlePlayer.integer) ? SP_INTERMISSION_DELAY_TIME : INTERMISSION_DELAY_TIME;
if ( level.time - level.intermissionQueued >= time ) {
@ -1497,12 +1729,16 @@ void CheckExitRules( void ) {
// check for sudden death
if ( ScoreIsTied() ) {
// always wait for sudden death
return;
if (g_gametype.integer != GT_TOURNAMENT || !g_timelimit.integer)
{
return;
}
}
if ( g_timelimit.integer && !level.warmupTime ) {
if ( level.time - level.startTime >= g_timelimit.integer*60000 ) {
trap_SendServerCommand( -1, "print \"Timelimit hit.\n\"");
// trap_SendServerCommand( -1, "print \"Timelimit hit.\n\"");
trap_SendServerCommand( -1, va("print \"%s.\n\"",G_GetStripEdString("SVINGAME", "TIMELIMIT_HIT")));
LogExit( "Timelimit hit." );
return;
}
@ -1618,6 +1854,19 @@ void CheckTournament( void ) {
trap_SetConfigstring ( CS_CLIENT_DUELISTS, va("%i|%i", level.sortedClients[0], level.sortedClients[1] ) );
gDuelist1 = level.sortedClients[0];
gDuelist2 = level.sortedClients[1];
if ( g_austrian.integer )
{
G_LogPrintf("Duel Initiated: %s %d/%d vs %s %d/%d, kill limit: %d\n",
level.clients[level.sortedClients[0]].pers.netname,
level.clients[level.sortedClients[0]].sess.wins,
level.clients[level.sortedClients[0]].sess.losses,
level.clients[level.sortedClients[1]].pers.netname,
level.clients[level.sortedClients[1]].sess.wins,
level.clients[level.sortedClients[1]].sess.losses,
g_fraglimit.integer );
}
//trap_SendConsoleCommand( EXEC_APPEND, "map_restart 0\n" );
//FIXME: This seems to cause problems. But we'd like to reset things whenever a new opponent is set.
}
}
@ -1672,7 +1921,7 @@ void CheckTournament( void ) {
return;
}
#endif
} else if ( g_gametype.integer != GT_SINGLE_PLAYER && level.warmupTime != 0 ) {
} else if ( level.warmupTime != 0 ) {
int counts[TEAM_NUM_TEAMS];
qboolean notEnough = qfalse;
@ -2100,6 +2349,18 @@ end = trap_Milliseconds();
//At the end of the frame, send out the ghoul2 kill queue, if there is one
G_SendG2KillQueue();
if (gQueueScoreMessage)
{
if (gQueueScoreMessageTime < level.time)
{
SendScoreboardMessageToAllClients();
gQueueScoreMessageTime = 0;
gQueueScoreMessage = 0;
}
}
g_LastFrameTime = level.time;
}

File diff suppressed because it is too large Load diff

View file

@ -1197,9 +1197,10 @@ void Touch_Button(gentity_t *ent, gentity_t *other, trace_t *trace ) {
}
}
/*QUAKED func_button (0 .5 .8) ?
/*QUAKED func_button (0 .5 .8) ? USABLE FPUSHABLE
When a button is touched, it moves some distance in the direction of it's angle, triggers all of it's targets, waits some time, then returns to it's original position where it can be triggered again.
USABLE - Can activate with use button
FPUSHABLE - Can force-push it
"model2" .md3 model to also draw
"angle" determines the opening direction
@ -1268,6 +1269,11 @@ void SP_func_button( gentity_t *ent ) {
ent->touch = Touch_Button;
}
if ( (ent->spawnflags&SPF_BUTTON_USABLE) )
{
ent->r.svFlags |= SVF_PLAYER_USABLE;
}
InitMover( ent );
}
@ -1793,18 +1799,40 @@ void SP_func_breakable( gentity_t *ent ) {
if (strcmp(model, "rock") == 0)
{
G_ModelIndex("models/chunks/rock/rock1_1.md3");
G_ModelIndex("models/chunks/rock/rock1_2.md3");
G_ModelIndex("models/chunks/rock/rock1_3.md3");
G_ModelIndex("models/chunks/rock/rock1_4.md3");
ent->boltpoint2 = DEBRIS_SPECIALCASE_ROCK;
}
else if (strcmp(model, "chunks") == 0)
{
G_ModelIndex("models/chunks/generic/chunks_1.md3");
G_ModelIndex("models/chunks/generic/chunks_2.md3");
ent->boltpoint2 = DEBRIS_SPECIALCASE_CHUNKS;
}
else if (strcmp(model, "wood") == 0)
{
G_ModelIndex("models/chunks/crate/crate1_1.md3");
G_ModelIndex("models/chunks/crate/crate1_2.md3");
G_ModelIndex("models/chunks/crate/crate1_3.md3");
G_ModelIndex("models/chunks/crate/crate1_4.md3");
G_ModelIndex("models/chunks/crate/crate2_1.md3");
G_ModelIndex("models/chunks/crate/crate2_2.md3");
G_ModelIndex("models/chunks/crate/crate2_3.md3");
G_ModelIndex("models/chunks/crate/crate2_4.md3");
ent->boltpoint2 = DEBRIS_SPECIALCASE_WOOD;
}
else if (strcmp(model, "glass") == 0)
{
G_ModelIndex("models/chunks/metal/metal1_1.md3");
G_ModelIndex("models/chunks/metal/metal1_2.md3");
G_ModelIndex("models/chunks/metal/metal1_3.md3");
G_ModelIndex("models/chunks/metal/metal1_4.md3");
G_ModelIndex("models/chunks/metal/metal2_1.md3");
G_ModelIndex("models/chunks/metal/metal2_2.md3");
G_ModelIndex("models/chunks/metal/metal2_3.md3");
G_ModelIndex("models/chunks/metal/metal2_4.md3");
ent->boltpoint2 = DEBRIS_SPECIALCASE_GLASS;
}
else if (strcmp(model, "none") == 0)

View file

@ -265,7 +265,11 @@ void G_RunObject( gentity_t *ent )
}
// G_Sound( ent, G_SoundIndex( "sound/movers/objects/objectHit.wav" ) );
}
DoImpact( ent, traceEnt, qtrue );
if (ent->s.weapon != WP_SABER)
{
DoImpact( ent, traceEnt, qtrue );
}
}
if ( !ent || (ent->takedamage&&ent->health <= 0) )

View file

@ -408,6 +408,7 @@ Ghoul2 Insert Start
G_G2_SETMODELS,
G_G2_GETBOLT,
G_G2_GETBOLT_NOREC,
G_G2_GETBOLT_NOREC_NOROT,
G_G2_INITGHOUL2MODEL,
G_G2_ADDBOLT,
G_G2_SETBOLTINFO,
@ -420,6 +421,7 @@ Ghoul2 Insert Start
G_G2_HASGHOUL2MODELONINDEX,
G_G2_REMOVEGHOUL2MODEL,
G_G2_CLEANMODELS,
G_G2_COLLISIONDETECT,
/*
Ghoul2 Insert End

View file

@ -175,6 +175,12 @@ void SP_misc_model_health_power_converter( gentity_t *ent );
void SP_fx_runner( gentity_t *ent );
#ifdef ANIMENT_SPAWNER
void SP_misc_animent_spawner(gentity_t *ent);
void SP_target_screenshake(gentity_t *ent);
void SP_target_escapetrig(gentity_t *ent);
#endif
void SP_misc_holocron(gentity_t *ent);
void SP_shooter_blaster( gentity_t *ent );
@ -262,6 +268,11 @@ spawn_t spawns[] = {
{"misc_model_health_power_converter", SP_misc_model_health_power_converter},
{"fx_runner", SP_fx_runner},
#ifdef ANIMENT_SPAWNER
{"misc_animent_spawner", SP_misc_animent_spawner},
{"target_screenshake", SP_target_screenshake},
{"target_escapetrig", SP_target_escapetrig},
#endif
{"misc_holocron", SP_misc_holocron},
@ -733,6 +744,16 @@ Every map should have exactly one worldspawn.
"music" music wav file
"gravity" 800 is default gravity
"message" Text to print during connection process
BSP Options
"gridsize" size of lighting grid to "X Y Z". default="64 64 128"
"ambient" scale of global light (from _color)
"fog" shader name of the global fog texture - must include the full path, such as "textures/rj/fog1"
"distancecull" value for vis for the maximum viewing distance
"chopsize" value for bsp on the maximum polygon / portal size
"ls_Xr" override lightstyle X with this pattern for Red.
"ls_Xg" green (valid patterns are "a-z")
"ls_Xb" blue (a is OFF, z is ON)
*/
void SP_worldspawn( void )
{

View file

@ -197,18 +197,20 @@ equ trap_G2_HaveWeGhoul2Models -585 ; G_G2_HAVEWEGHOULMODELS
equ trap_G2_SetGhoul2ModelIndexes -586 ; G_G2_SETMODELS
equ trap_G2API_GetBoltMatrix -587 ; G_G2_GETBOLT
equ trap_G2API_GetBoltMatrix_NoReconstruct -588 ; G_G2_GETBOLT_NOREC
equ trap_G2API_InitGhoul2Model -589 ; G_G2_INITGHOUL2MODEL
equ trap_G2API_AddBolt -590 ; G_G2_ADDBOLT
equ trap_G2API_SetBoltInfo -591 ; G_G2_SETBOLTINFO
equ trap_G2API_SetBoneAngles -592 ; G_G2_ANGLEOVERRIDE
equ trap_G2API_SetBoneAnim -593 ; G_G2_PLAYANIM
equ trap_G2API_GetGLAName -594 ; G_G2_GETGLANAME
equ trap_G2API_CopyGhoul2Instance -595 ; G_G2_COPYGHOUL2INSTANCE
equ trap_G2API_CopySpecificGhoul2Model -596 ; G_G2_COPYSPECIFICGHOUL2MODEL
equ trap_G2API_DuplicateGhoul2Instance -597 ; G_G2_DUPLICATEGHOUL2INSTANCE
equ trap_G2API_HasGhoul2ModelOnIndex -598 ; G_G2_HASGHOUL2MODELONINDEX
equ trap_G2API_RemoveGhoul2Model -599 ; G_G2_REMOVEGHOUL2MODEL
equ trap_G2API_CleanGhoul2Models -600 ; G_G2_CLEANMODELS
equ trap_G2API_GetBoltMatrix_NoRecNoRot -589 ; G_G2_GETBOLT_NOREC_NOROT
equ trap_G2API_InitGhoul2Model -590 ; G_G2_INITGHOUL2MODEL
equ trap_G2API_AddBolt -591 ; G_G2_ADDBOLT
equ trap_G2API_SetBoltInfo -592 ; G_G2_SETBOLTINFO
equ trap_G2API_SetBoneAngles -593 ; G_G2_ANGLEOVERRIDE
equ trap_G2API_SetBoneAnim -594 ; G_G2_PLAYANIM
equ trap_G2API_GetGLAName -595 ; G_G2_GETGLANAME
equ trap_G2API_CopyGhoul2Instance -596 ; G_G2_COPYGHOUL2INSTANCE
equ trap_G2API_CopySpecificGhoul2Model -597 ; G_G2_COPYSPECIFICGHOUL2MODEL
equ trap_G2API_DuplicateGhoul2Instance -598 ; G_G2_DUPLICATEGHOUL2INSTANCE
equ trap_G2API_HasGhoul2ModelOnIndex -599 ; G_G2_HASGHOUL2MODELONINDEX
equ trap_G2API_RemoveGhoul2Model -600 ; G_G2_REMOVEGHOUL2MODEL
equ trap_G2API_CleanGhoul2Models -601 ; G_G2_CLEANMODELS
equ trap_G2API_CollisionDetect -602 ; G_G2_COLLISIONDETECT
; hardcoded functions

View file

@ -841,6 +841,12 @@ qboolean trap_G2API_GetBoltMatrix_NoReconstruct(void *ghoul2, const int modelInd
return (qboolean)(syscall(G_G2_GETBOLT_NOREC, ghoul2, modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale));
}
qboolean trap_G2API_GetBoltMatrix_NoRecNoRot(void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix,
const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale)
{ //Same as above but force it to not reconstruct the skeleton before getting the bolt position
return (qboolean)(syscall(G_G2_GETBOLT_NOREC_NOROT, ghoul2, modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale));
}
int trap_G2API_InitGhoul2Model(void **ghoul2Ptr, const char *fileName, int modelIndex, qhandle_t customSkin,
qhandle_t customShader, int modelFlags, int lodBias)
{
@ -905,6 +911,24 @@ void trap_G2API_CleanGhoul2Models(void **ghoul2Ptr)
syscall(G_G2_CLEANMODELS, ghoul2Ptr);
}
void trap_G2API_CollisionDetect (
CollisionRecord_t *collRecMap,
void* ghoul2,
const vec3_t angles,
const vec3_t position,
int frameNumber,
int entNum,
vec3_t rayStart,
vec3_t rayEnd,
vec3_t scale,
int traceFlags,
int useLod,
float fRadius
)
{
syscall ( G_G2_COLLISIONDETECT, collRecMap, ghoul2, angles, position, frameNumber, entNum, rayStart, rayEnd, scale, traceFlags, useLod, PASSFLOAT(fRadius) );
}
/*
Ghoul2 Insert End
*/

View file

@ -188,6 +188,11 @@ qboolean OnSameTeam( gentity_t *ent1, gentity_t *ent2 ) {
return qfalse;
}
if (g_gametype.integer == GT_SINGLE_PLAYER)
{
return qtrue;
}
if ( g_gametype.integer < GT_TEAM ) {
return qfalse;
}

View file

@ -293,14 +293,17 @@ void Use_target_push( gentity_t *self, gentity_t *other, gentity_t *activator )
// 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 );
if (self->noise_index)
{
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
if "bouncepad", play bounce noise instead of none
*/
void SP_target_push( gentity_t *self ) {
if (!self->speed) {

View file

@ -951,6 +951,7 @@ Try and use an entity in the world, directly ahead of us
#define USE_DISTANCE 64.0f
extern void Touch_Button(gentity_t *ent, gentity_t *other, trace_t *trace );
void TryUse( gentity_t *ent )
{
gentity_t *target;
@ -986,8 +987,14 @@ void TryUse( gentity_t *ent )
NPC_SetAnim( ent, SETANIM_LEGS, BOTH_FORCEPUSH, SETANIM_FLAG_NORMAL|SETANIM_FLAG_HOLD );
}
*/
target->use(target, ent, ent);
if ( target->touch == Touch_Button )
{//pretend we touched it
target->touch(target, ent, NULL);
}
else
{
target->use(target, ent, ent);
}
return;
}
}

View file

@ -298,6 +298,10 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a
int damage = BLASTER_DAMAGE;
gentity_t *missile;
if (ent->s.eType == ET_GRAPPLE)
{ //animent
damage = 10;
}
// NOTENOTE Vehicle models are not yet implemented
/* if ( ent->client && ent->client->ps.vehicleModel != 0 )
{
@ -549,10 +553,20 @@ void WP_DisruptorAltFire( gentity_t *ent )
VectorCopy( muzzle, muzzle2 ); // making a backup copy
VectorCopy( ent->client->ps.origin, start );
start[2] += ent->client->ps.viewheight;//By eyes
if (ent->client)
{
VectorCopy( ent->client->ps.origin, start );
start[2] += ent->client->ps.viewheight;//By eyes
count = ( level.time - ent->client->ps.weaponChargeTime ) / DISRUPTOR_CHARGE_UNIT;
count = ( level.time - ent->client->ps.weaponChargeTime ) / DISRUPTOR_CHARGE_UNIT;
}
else
{
VectorCopy( ent->r.currentOrigin, start );
start[2] += 24;
count = ( 100 ) / DISRUPTOR_CHARGE_UNIT;
}
count *= 2;
@ -652,7 +666,10 @@ void WP_DisruptorAltFire( gentity_t *ent )
if ( LogAccuracyHit( traceEnt, ent ))
{
ent->client->accuracy_hits++;
if (ent->client)
{
ent->client->accuracy_hits++;
}
}
}
else
@ -741,6 +758,12 @@ static void WP_FireDisruptor( gentity_t *ent, qboolean altFire )
altFire = qfalse;
}
if (ent && ent->s.eType == ET_GRAPPLE && !ent->client)
{ //special case for animents
WP_DisruptorAltFire( ent );
return;
}
if ( altFire )
{
WP_DisruptorAltFire( ent );
@ -2831,6 +2854,107 @@ void FireWeapon( gentity_t *ent, qboolean altFire ) {
G_LogWeaponFire(ent->s.number, ent->s.weapon);
}
void AnimEntCalcMuzzlePoint ( gentity_t *ent, vec3_t forward, vec3_t right, vec3_t up, vec3_t muzzlePoint )
{
int weapontype;
vec3_t muzzleOffPoint;
weapontype = ent->s.weapon;
VectorCopy( ent->s.pos.trBase, muzzlePoint );
VectorCopy(WP_MuzzlePoint[weapontype], muzzleOffPoint);
if (weapontype > WP_NONE && weapontype < WP_NUM_WEAPONS)
{ // Use the table to generate the muzzlepoint;
{ // Crouching. Use the add-to-Z method to adjust vertically.
VectorMA(muzzlePoint, muzzleOffPoint[0], forward, muzzlePoint);
VectorMA(muzzlePoint, muzzleOffPoint[1], right, muzzlePoint);
muzzlePoint[2] += 24 + muzzleOffPoint[2];
}
}
// snap to integer coordinates for more efficient network bandwidth usage
SnapVector( muzzlePoint );
}
void AnimEntFireWeapon( gentity_t *ent, qboolean altFire )
{
vec3_t modifiedAngles;
VectorCopy(ent->s.apos.trBase, modifiedAngles);
// modifiedAngles[PITCH] = -modifiedAngles[PITCH];
if (modifiedAngles[PITCH] < -180)
{
modifiedAngles[PITCH] += 90;
}
AngleVectors( modifiedAngles, forward, right, up );
AnimEntCalcMuzzlePoint ( ent, forward, right, up, muzzle );
//rww - NOTE: I have only tested the bryar, blaster, and disruptor for weapon firing.
//Other routines will likely have a client pointer reference in them and cause a crash.
// fire the specific weapon
switch( ent->s.weapon )
{
case WP_STUN_BATON:
WP_FireStunBaton( ent, altFire );
break;
case WP_SABER:
break;
case WP_BRYAR_PISTOL:
WP_FireBryarPistol( ent, altFire );
break;
case WP_BLASTER:
WP_FireBlaster( ent, altFire );
break;
case WP_DISRUPTOR:
WP_FireDisruptor( ent, altFire );
break;
case WP_BOWCASTER:
WP_FireBowcaster( ent, altFire );
break;
case WP_REPEATER:
WP_FireRepeater( ent, altFire );
break;
case WP_DEMP2:
WP_FireDEMP2( ent, altFire );
break;
case WP_FLECHETTE:
WP_FireFlechette( ent, altFire );
break;
case WP_ROCKET_LAUNCHER:
WP_FireRocket( ent, altFire );
break;
case WP_THERMAL:
WP_FireThermalDetonator( ent, altFire );
break;
case WP_TRIP_MINE:
WP_PlaceLaserTrap( ent, altFire );
break;
case WP_DET_PACK:
WP_DropDetPack( ent, altFire );
break;
case WP_EMPLACED_GUN:
WP_FireEmplaced( ent, altFire );
break;
default:
break;
}
}
//---------------------------------------------------------
static void WP_FireEmplaced( gentity_t *ent, qboolean altFire )
//---------------------------------------------------------

View file

@ -568,6 +568,83 @@ int COM_ParseInfos( char *buf, int max, char infos[][MAX_INFO_STRING] ) {
}
#endif
/*
===============
COM_ParseString
===============
*/
qboolean COM_ParseString( const char **data, const char **s )
{
// *s = COM_ParseExt( data, qtrue );
*s = COM_ParseExt( data, qfalse );
if ( s[0] == 0 )
{
Com_Printf("unexpected EOF\n");
return qtrue;
}
return qfalse;
}
/*
===============
COM_ParseInt
===============
*/
qboolean COM_ParseInt( const char **data, int *i )
{
const char *token;
token = COM_ParseExt( data, qfalse );
if ( token[0] == 0 )
{
Com_Printf( "unexpected EOF\n" );
return qtrue;
}
*i = atoi( token );
return qfalse;
}
/*
===============
COM_ParseFloat
===============
*/
qboolean COM_ParseFloat( const char **data, float *f )
{
const char *token;
token = COM_ParseExt( data, qfalse );
if ( token[0] == 0 )
{
Com_Printf( "unexpected EOF\n" );
return qtrue;
}
*f = atof( token );
return qfalse;
}
/*
===============
COM_ParseVec4
===============
*/
qboolean COM_ParseVec4( const char **buffer, vec4_t *c)
{
int i;
float f;
for (i = 0; i < 4; i++)
{
if (COM_ParseFloat(buffer, &f))
{
return qtrue;
}
(*c)[i] = f;
}
return qfalse;
}
/*
==================

View file

@ -292,6 +292,7 @@ typedef int sfxHandle_t;
typedef int fileHandle_t;
typedef int clipHandle_t;
#define G2_COLLISION_ENABLED
#ifndef NULL
#define NULL ((void *)0)
@ -364,6 +365,7 @@ typedef enum {
typedef enum {
BLOCKED_NONE,
BLOCKED_BOUNCE_MOVE,
BLOCKED_PARRY_BROKEN,
BLOCKED_ATK_BOUNCE,
BLOCKED_UPPER_RIGHT,
@ -669,7 +671,9 @@ extern vec4_t colorLtBlue;
extern vec4_t colorDkBlue;
#define Q_COLOR_ESCAPE '^'
#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) != Q_COLOR_ESCAPE )
// you MUST have the last bit on here about colour strings being less than 7 or taiwanese strings register as colour!!!!
#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) != Q_COLOR_ESCAPE && *((p)+1) <= '7' )
#define COLOR_BLACK '0'
#define COLOR_RED '1'
@ -939,6 +943,10 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreak );
int COM_Compress( char *data_p );
void COM_ParseError( char *format, ... );
void COM_ParseWarning( char *format, ... );
qboolean COM_ParseString( const char **data, const char **s );
qboolean COM_ParseInt( const char **data, int *i );
qboolean COM_ParseFloat( const char **data, float *f );
qboolean COM_ParseVec4( const char **buffer, vec4_t *c);
//int COM_ParseInfos( char *buf, int max, char infos[][MAX_INFO_STRING] );
#define MAX_TOKENLENGTH 1024
@ -1178,6 +1186,11 @@ typedef struct
}CollisionRecord_t;
#define MAX_G2_COLLISIONS 16
#ifdef G2_COLLISION_ENABLED
typedef CollisionRecord_t G2Trace_t[MAX_G2_COLLISIONS]; // map that describes all of the parts of ghoul2 models that got hit
#endif
/*
Ghoul2 Insert End
*/
@ -1526,6 +1539,9 @@ typedef struct playerState_s {
float emplacedTime;
qboolean isJediMaster;
qboolean forceRestricted;
qboolean trueJedi;
qboolean trueNonJedi;
int saberIndex;
int genericEnemyIndex;
@ -1619,8 +1635,7 @@ typedef struct playerState_s {
// so they aren't game/cgame only definitions
//
#define BUTTON_ATTACK 1
//#define BUTTON_TALK 2 // displays talk balloon and disables actions
//#define BUTTON_FORCEJUMP 2 //rww - might be better to just reassign this from button1 on the client..
#define BUTTON_TALK 2 // displays talk balloon and disables actions
#define BUTTON_USE_HOLDABLE 4
#define BUTTON_GESTURE 8
#define BUTTON_WALKING 16 // walking can't just be infered from MOVE_RUN

Binary file not shown.

View file

@ -21,13 +21,15 @@ int ysalamiriLoopSound = 0;
#define FORCE_VELOCITY_DAMAGE 0
void G_PreDefSound(vec3_t org, int pdSound)
gentity_t *G_PreDefSound(vec3_t org, int pdSound)
{
gentity_t *te;
te = G_TempEntity( org, EV_PREDEFSOUND );
te->s.eventParm = pdSound;
VectorCopy(org, te->s.origin);
return te;
}
qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold )
@ -422,6 +424,13 @@ void WP_InitForcePowers( gentity_t *ent )
ent->client->ps.fd.forcePowerSelected = 0;
}
}
while (i < NUM_FORCE_POWERS)
{
ent->client->ps.fd.forcePowerBaseLevel[i] = ent->client->ps.fd.forcePowerLevel[i];
i++;
}
ent->client->ps.fd.forceUsingAdded = 0;
}
void WP_SpawnInitForcePowers( gentity_t *ent )
@ -492,7 +501,8 @@ void WP_SpawnInitForcePowers( gentity_t *ent )
while (i < NUM_FORCE_POWERS)
{
ent->client->ps.fd.forcePowerBaseLevel[i] = ent->client->ps.fd.forcePowerLevel[i];
//Don't know why I was doing this here either.
//ent->client->ps.fd.forcePowerBaseLevel[i] = ent->client->ps.fd.forcePowerLevel[i];
ent->client->ps.fd.forcePowerDebounce[i] = 0;
ent->client->ps.fd.forcePowerDuration[i] = 0;
@ -501,7 +511,8 @@ void WP_SpawnInitForcePowers( gentity_t *ent )
}
ent->client->ps.fd.forcePowerRegenDebounceTime = 0;
ent->client->ps.fd.forceUsingAdded = 0;
//I wonder why I was doing this.
//ent->client->ps.fd.forceUsingAdded = 0;
ent->client->ps.fd.forceJumpZStart = 0;
ent->client->ps.fd.forceJumpCharge = 0;
ent->client->ps.fd.forceJumpSound = 0;
@ -655,6 +666,7 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke
{
int getLevel = 0;
int addTot = 0;
gentity_t *abSound;
if (atPower != FP_LIGHTNING &&
atPower != FP_DRAIN &&
@ -698,7 +710,13 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke
}
//play sound indicating that attack was absorbed
G_PreDefSound(attacker->client->ps.origin, PDSOUND_ABSORBHIT);
if (attacked->client->forcePowerSoundDebounce < level.time)
{
abSound = G_PreDefSound(attacked->client->ps.origin, PDSOUND_ABSORBHIT);
abSound->s.trickedentindex = attacked->s.number;
attacked->client->forcePowerSoundDebounce = level.time + 400;
}
return getLevel;
}
@ -958,7 +976,7 @@ void ForceHeal( gentity_t *self )
if (self->client->ps.fd.forcePowerLevel[FP_HEAL] == FORCE_LEVEL_3)
{
self->health += 50;
self->health += 25; //This was 50, but that angered the Balance God.
if (self->health > self->client->ps.stats[STAT_MAX_HEALTH])
{
@ -968,7 +986,7 @@ void ForceHeal( gentity_t *self )
}
else if (self->client->ps.fd.forcePowerLevel[FP_HEAL] == FORCE_LEVEL_2)
{
self->health += 25;
self->health += 10;
if (self->health > self->client->ps.stats[STAT_MAX_HEALTH])
{
@ -978,7 +996,7 @@ void ForceHeal( gentity_t *self )
}
else
{
self->health += 10;
self->health += 5;
if (self->health > self->client->ps.stats[STAT_MAX_HEALTH])
{
@ -1502,6 +1520,13 @@ void ForceLightningDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec
if ( traceEnt && traceEnt->takedamage )
{
if (!traceEnt->client && traceEnt->s.eType == ET_GRAPPLE)
{ //g2animent
if (traceEnt->s.genericenemyindex < level.time)
{
traceEnt->s.genericenemyindex = level.time + 2000;
}
}
if ( traceEnt->client )
{//an enemy or object
if (ForcePowerUsableOn(self, traceEnt, FP_LIGHTNING))
@ -1724,6 +1749,13 @@ void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t
{
if ( traceEnt->client && (!OnSameTeam(self, traceEnt) || g_friendlyFire.integer) && self->client->ps.fd.forceDrainTime < level.time && traceEnt->client->ps.fd.forcePower )
{//an enemy or object
if (!traceEnt->client && traceEnt->s.eType == ET_GRAPPLE)
{ //g2animent
if (traceEnt->s.genericenemyindex < level.time)
{
traceEnt->s.genericenemyindex = level.time + 2000;
}
}
if (ForcePowerUsableOn(self, traceEnt, FP_DRAIN))
{
int modPowerLevel = -1;
@ -1766,7 +1798,7 @@ void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t
if (dmg)
{
traceEnt->client->ps.fd.forcePower -= dmg;
traceEnt->client->ps.fd.forcePower -= (dmg);
}
if (traceEnt->client->ps.fd.forcePower < 0)
{
@ -1819,9 +1851,14 @@ void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t
// traceEnt->client->ps.powerups[PW_DISINT_1] = level.time + 500;
}
tent = G_TempEntity( impactPoint, EV_FORCE_DRAINED);
tent->s.eventParm = DirToByte(dir);
tent->s.owner = traceEnt->s.number;
if (traceEnt->client->forcePowerSoundDebounce < level.time)
{
tent = G_TempEntity( impactPoint, EV_FORCE_DRAINED);
tent->s.eventParm = DirToByte(dir);
tent->s.owner = traceEnt->s.number;
traceEnt->client->forcePowerSoundDebounce = level.time + 400;
}
}
}
}
@ -1962,7 +1999,7 @@ int ForceShootDrain( gentity_t *self )
}
else*/
{
BG_ForcePowerDrain( &self->client->ps, FP_DRAIN, 1 );
BG_ForcePowerDrain( &self->client->ps, FP_DRAIN, 5 ); //used to be 1, but this did, too, anger the God of Balance.
}
self->client->ps.fd.forcePowerRegenDebounceTime = level.time + 500;
@ -2528,6 +2565,7 @@ qboolean CanCounterThrow(gentity_t *self, qboolean pull)
return 1;
}
extern void Touch_Button(gentity_t *ent, gentity_t *other, trace_t *trace );
void ForceThrow( gentity_t *self, qboolean pull )
{
//shove things in front of you away
@ -2669,6 +2707,14 @@ void ForceThrow( gentity_t *self, qboolean pull )
if (tr.fraction != 1.0 &&
tr.entityNum != ENTITYNUM_NONE)
{
if (!g_entities[tr.entityNum].client && g_entities[tr.entityNum].s.eType == ET_GRAPPLE)
{ //g2animent
if (g_entities[tr.entityNum].s.genericenemyindex < level.time)
{
g_entities[tr.entityNum].s.genericenemyindex = level.time + 2000;
}
}
numListedEntities = 0;
entityList[numListedEntities] = tr.entityNum;
numListedEntities++;
@ -2689,6 +2735,14 @@ void ForceThrow( gentity_t *self, qboolean pull )
{
ent = &g_entities[entityList[e]];
if (!ent->client && ent->s.eType == ET_GRAPPLE)
{ //g2animent
if (ent->s.genericenemyindex < level.time)
{
ent->s.genericenemyindex = level.time + 2000;
}
}
if (ent)
{
if (ent->client)
@ -2767,30 +2821,40 @@ void ForceThrow( gentity_t *self, qboolean pull )
if ( ent->s.eType != ET_ITEM /*&& ent->e_ThinkFunc != thinkF_G_RunObject*/ )//|| !(ent->flags&FL_DROPPED_ITEM) )//was only dropped items
{
//FIXME: need pushable objects
if ( ent->s.eFlags & EF_NODRAW )
{
continue;
if ( Q_stricmp( "func_button", ent->classname ) == 0 )
{//we might push it
if ( pull || !(ent->spawnflags&SPF_BUTTON_FPUSHABLE) )
{//not force-pushable, never pullable
continue;
}
}
if ( !ent->client )
else
{
if ( Q_stricmp( "lightsaber", ent->classname ) != 0 )
{//not a lightsaber
// if ( !(ent->svFlags&SVF_GLASS_BRUSH) )
// {//and not glass
if ( Q_stricmp( "func_door", ent->classname ) != 0 || !(ent->spawnflags & 2/*MOVER_FORCE_ACTIVATE*/) )
{//not a force-usable door
if ( Q_stricmp( "limb", ent->classname ) )
{//not a limb
if ( ent->s.eFlags & EF_NODRAW )
{
continue;
}
if ( !ent->client )
{
if ( Q_stricmp( "lightsaber", ent->classname ) != 0 )
{//not a lightsaber
// if ( !(ent->svFlags&SVF_GLASS_BRUSH) )
// {//and not glass
if ( Q_stricmp( "func_door", ent->classname ) != 0 || !(ent->spawnflags & 2/*MOVER_FORCE_ACTIVATE*/) )
{//not a force-usable door
if ( Q_stricmp( "limb", ent->classname ) )
{//not a limb
continue;
}
}
else if ( ent->moverState != MOVER_POS1 && ent->moverState != MOVER_POS2 )
{//not at rest
continue;
}
}
else if ( ent->moverState != MOVER_POS1 && ent->moverState != MOVER_POS2 )
{//not at rest
continue;
}
// }
// }
}
//continue;
}
//continue;
}
}
}
@ -3134,6 +3198,11 @@ void ForceThrow( gentity_t *self, qboolean pull )
}
GEntity_UseFunc( push_list[x], self, self );
}
else if ( Q_stricmp( "func_button", push_list[x]->classname ) == 0 )
{//pretend you pushed it
Touch_Button( push_list[x], self, NULL );
continue;
}
}
}
@ -3658,6 +3727,19 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
WP_ForcePowerStop(self, FP_GRIP);
break;
}
if (self->client->ps.fd.forcePowerDebounce[FP_PULL] < level.time)
{ //This is sort of not ideal. Using the debounce value reserved for pull for this because pull doesn't need it.
BG_ForcePowerDrain( &self->client->ps, forcePower, 1 );
self->client->ps.fd.forcePowerDebounce[FP_PULL] = level.time + 100;
}
if (self->client->ps.fd.forcePower < 1)
{
WP_ForcePowerStop(self, FP_GRIP);
break;
}
DoGripAction(self, forcePower);
break;
case FP_LEVITATION:
@ -3779,7 +3861,6 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
case FP_SABERTHROW:
break;
case FP_PROTECT:
case FP_ABSORB:
if (self->client->ps.fd.forcePowerDebounce[forcePower] < level.time)
{
BG_ForcePowerDrain( &self->client->ps, forcePower, 1 );
@ -3791,6 +3872,18 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
self->client->ps.fd.forcePowerDebounce[forcePower] = level.time + 300;
}
break;
case FP_ABSORB:
if (self->client->ps.fd.forcePowerDebounce[forcePower] < level.time)
{
BG_ForcePowerDrain( &self->client->ps, forcePower, 1 );
if (self->client->ps.fd.forcePower < 1)
{
WP_ForcePowerStop(self, forcePower);
}
self->client->ps.fd.forcePowerDebounce[forcePower] = level.time + 600;
}
break;
default:
break;
}
@ -4307,6 +4400,29 @@ void JediMasterUpdate(gentity_t *self)
}
}
qboolean WP_HasForcePowers( const playerState_t *ps )
{
int i;
if ( ps )
{
for ( i = 0; i < NUM_FORCE_POWERS; i++ )
{
if ( i == FP_LEVITATION )
{
if ( ps->fd.forcePowerLevel[i] > FORCE_LEVEL_1 )
{
return qtrue;
}
}
else if ( ps->fd.forcePowerLevel[i] > FORCE_LEVEL_0 )
{
return qtrue;
}
}
}
return qfalse;
}
void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd )
{
qboolean usingForce = qfalse;
@ -4333,6 +4449,19 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd )
return;
}
/*
if (g_trueJedi.integer)
{
if (self->client->ps.weapon != WP_SABER)
{
self->client->ps.forceRestricted = qtrue;
}
else
{
self->client->ps.forceRestricted = qfalse;
}
}
*/
if (self->client->ps.fd.saberAnimLevel > self->client->ps.fd.forcePowerLevel[FP_SABERATTACK])
{
self->client->ps.fd.saberAnimLevel = self->client->ps.fd.forcePowerLevel[FP_SABERATTACK];
@ -4768,18 +4897,28 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd )
{
if (g_gametype.integer != GT_HOLOCRON || g_MaxHolocronCarry.value)
{
if (self->client->ps.powerups[PW_FORCE_BOON])
//if (!g_trueJedi.integer || self->client->ps.weapon == WP_SABER)
//let non-jedi force regen since we're doing a more strict jedi/non-jedi thing... this gives dark jedi something to drain
{
WP_ForcePowerRegenerate( self, 6 );
if (self->client->ps.powerups[PW_FORCE_BOON])
{
WP_ForcePowerRegenerate( self, 6 );
}
else if (self->client->ps.isJediMaster && g_gametype.integer == GT_JEDIMASTER)
{
WP_ForcePowerRegenerate( self, 4 ); //jedi master regenerates 4 times as fast
}
else
{
WP_ForcePowerRegenerate( self, 0 );
}
}
else if (self->client->ps.isJediMaster && g_gametype.integer == GT_JEDIMASTER)
/*
else if (g_trueJedi.integer && self->client->ps.weapon != WP_SABER)
{
WP_ForcePowerRegenerate( self, 4 ); //jedi master regenerates 4 times as fast
}
else
{
WP_ForcePowerRegenerate( self, 0 );
self->client->ps.fd.forcePower = 0;
}
*/
}
else
{ //regenerate based on the number of holocrons carried

File diff suppressed because it is too large Load diff

View file

@ -15,6 +15,10 @@
#endif
#include "G2_local.h"
#ifdef G2_COLLISION_ENABLED
#include "../qcommon/miniheap.h"
#endif
#include <set>
extern mdxaBone_t worldMatrix;
@ -172,6 +176,7 @@ int G2API_InitGhoul2Model(CGhoul2Info_v **ghoul2Ptr, const char *fileName, int m
{
if (ghoul2.size() == 0)//very first model created
{//you can't have an empty vector, so let's not give it one
G2API_CleanGhoul2Models(ghoul2Ptr);
delete *ghoul2Ptr;
*ghoul2Ptr = 0;
}
@ -777,11 +782,76 @@ void G2API_DetachEnt(int *boltInfo)
}
qboolean gG2_GBMNoReconstruct;
qboolean gG2_GBMUseSPMethod;
qboolean G2API_GetBoltMatrix_SPMethod(CGhoul2Info_v &ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles,
const vec3_t position, const int frameNum, qhandle_t *modelList, const vec3_t scale )
{
assert(ghoul2.size() > modelIndex);
if ((int)&ghoul2 && (ghoul2.size() > modelIndex))
{
CGhoul2Info *ghlInfo = &ghoul2[modelIndex];
//assert(boltIndex < ghlInfo->mBltlist.size());
if (ghlInfo && (boltIndex < ghlInfo->mBltlist.size()) && boltIndex >= 0 )
{
// make sure we have transformed the skeleton
if (!gG2_GBMNoReconstruct)
{
G2_ConstructGhoulSkeleton(ghoul2, frameNum, modelList, true, angles, position, scale, false);
}
gG2_GBMNoReconstruct = qfalse;
mdxaBone_t scaled;
mdxaBone_t *use;
use=&ghlInfo->mBltlist[boltIndex].position;
if (scale[0]||scale[1]||scale[2])
{
scaled=*use;
use=&scaled;
// scale the bolt position by the scale factor for this model since at this point its still in model space
if (scale[0])
{
scaled.matrix[0][3] *= scale[0];
}
if (scale[1])
{
scaled.matrix[1][3] *= scale[1];
}
if (scale[2])
{
scaled.matrix[2][3] *= scale[2];
}
}
// pre generate the world matrix
G2_GenerateWorldMatrix(angles, position);
VectorNormalize((float*)use->matrix[0]);
VectorNormalize((float*)use->matrix[1]);
VectorNormalize((float*)use->matrix[2]);
Multiply_3x4Matrix(matrix, &worldMatrix, use);
return qtrue;
}
}
return qfalse;
}
qboolean G2API_GetBoltMatrix(CGhoul2Info_v &ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale )
{
assert(ghoul2.size() > modelIndex);
if (gG2_GBMUseSPMethod)
{
gG2_GBMUseSPMethod = qfalse;
return G2API_GetBoltMatrix_SPMethod(ghoul2, modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale);
}
if ((int)&ghoul2 && (ghoul2.size() > modelIndex))
{
CGhoul2Info *ghlInfo = &ghoul2[modelIndex];
@ -950,7 +1020,7 @@ static int QDECL QsortDistance( const void *a, const void *b ) {
void G2API_CollisionDetect(CollisionRecord_t *collRecMap, CGhoul2Info_v &ghoul2, const vec3_t angles, const vec3_t position,
int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, CMiniHeap *G2VertSpace, int traceFlags, int useLod)
int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, CMiniHeap *G2VertSpace, int traceFlags, int useLod, float fRadius)
{
if ((int)&ghoul2)
@ -963,6 +1033,10 @@ void G2API_CollisionDetect(CollisionRecord_t *collRecMap, CGhoul2Info_v &ghoul2,
// pre generate the world matrix - used to transform the incoming ray
G2_GenerateWorldMatrix(angles, position);
#ifdef G2_COLLISION_ENABLED
G2VertSpace->ResetHeap();
#endif
// now having done that, time to build the model
G2_TransformModel(ghoul2, frameNumber, scale, G2VertSpace, useLod);
@ -972,11 +1046,20 @@ void G2API_CollisionDetect(CollisionRecord_t *collRecMap, CGhoul2Info_v &ghoul2,
TransformAndTranslatePoint(rayEnd, transRayEnd, &worldMatrixInv);
// now walk each model and check the ray against each poly - sigh, this is SO expensive. I wish there was a better way to do this.
G2_TraceModels(ghoul2, transRayStart, transRayEnd, collRecMap, entNum, traceFlags, useLod);
G2_TraceModels(ghoul2, transRayStart, transRayEnd, collRecMap, entNum, traceFlags, useLod, fRadius);
#ifdef G2_COLLISION_ENABLED
int i;
for ( i = 0; i < MAX_G2_COLLISIONS && collRecMap[i].mEntityNum != -1; i ++ );
// now sort the resulting array of collision records so they are distance ordered
qsort( collRecMap, i,
sizeof( CCollisionRecord ), QsortDistance );
#else
// now sort the resulting array of collision records so they are distance ordered
qsort( collRecMap, MAX_G2_COLLISIONS,
sizeof( CCollisionRecord ), QsortDistance );
#endif
}
}

View file

@ -55,7 +55,7 @@ qboolean G2_Get_Bone_Anim_Index( boneInfo_v &blist, const int index, const int c
void G2_List_Model_Surfaces(const char *fileName);
void G2_List_Model_Bones(const char *fileName, int frame);
qboolean G2_GetAnimFileName(const char *fileName, char **filename);
void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CollisionRecord_t *collRecMap, int entNum, int traceFlags, int useLod);
void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CollisionRecord_t *collRecMap, int entNum, int traceFlags, int useLod, float fRadius);
void TransformAndTranslatePoint (vec3_t in, vec3_t out, mdxaBone_t *mat);
void G2_TransformModel(CGhoul2Info_v &ghoul2, const int frameNum, vec3_t scale, CMiniHeap *G2VertSpace, int useLod);
void G2_GenerateWorldMatrix(const vec3_t angles, const vec3_t origin);
@ -128,7 +128,7 @@ int G2API_GetGhoul2ModelFlags(CGhoul2Info *ghlInfo);
qboolean G2API_GetAnimFileName(CGhoul2Info *ghlInfo, char **filename);
void G2API_CollisionDetect(CollisionRecord_t *collRecMap, CGhoul2Info_v &ghoul2, const vec3_t angles, const vec3_t position,
int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, CMiniHeap *G2VertSpace, int traceFlags, int useLod);
int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, CMiniHeap *G2VertSpace, int traceFlags, int useLod, float fRadius);
void G2API_GiveMeVectorFromMatrix(mdxaBone_t *boltMatrix, Eorientations flags, vec3_t vec);
int G2API_CopyGhoul2Instance(CGhoul2Info_v &g2From, CGhoul2Info_v &g2To, int modelIndex);
@ -160,6 +160,7 @@ void G2API_DuplicateGhoul2Instance(CGhoul2Info_v &g2From, CGhoul2Info_v **g2To)
void G2API_SetBoltInfo(CGhoul2Info_v &ghoul2, int modelIndex, int boltInfo);
extern qboolean gG2_GBMNoReconstruct;
extern qboolean gG2_GBMUseSPMethod;
// From tr_ghoul2.cpp
void G2_ConstructGhoulSkeleton( CGhoul2Info_v &ghoul2, const int frameNum, qhandle_t *modelList, bool checkForNewOrigin, const vec3_t angles, const vec3_t position, const vec3_t scale, bool modelSet);

View file

@ -151,6 +151,7 @@ public:
int *TransformedVertsArray;
int traceFlags;
bool hitOne;
float m_fRadius;
CTraceSurface(
@ -166,7 +167,8 @@ public:
skin_t *initskin,
shader_t *initcust_shader,
int *initTransformedVertsArray,
int inittraceFlags):
int inittraceFlags,
float fRadius):
surfaceNum(initsurfaceNum),
rootSList(initrootSList),
@ -178,7 +180,8 @@ public:
skin(initskin),
cust_shader(initcust_shader),
traceFlags(inittraceFlags),
TransformedVertsArray(initTransformedVertsArray)
TransformedVertsArray(initTransformedVertsArray),
m_fRadius(fRadius)
{
VectorCopy(initrayStart, rayStart);
VectorCopy(initrayEnd, rayEnd);
@ -307,6 +310,99 @@ int G2_DecideTraceLod(CGhoul2Info &ghoul2, int useLod, model_t *mod)
return returnLod;
}
#ifdef G2_COLLISION_ENABLED
void R_TransformEachSurface( mdxmSurface_t *surface, vec3_t scale, CMiniHeap *G2VertSpace, int *TransformedVertsArray, mdxaBone_v &bonePtr) {
int j, k, pos;
int numVerts;
mdxmVertex_t *v;
float *TransformedVerts;
//
// deform the vertexes by the lerped bones
//
// alloc some space for the transformed verts to get put in
v = (mdxmVertex_t *) ((byte *)surface + surface->ofsVerts);
numVerts = surface->numVerts;
mdxmVertexTexCoord_t *pTexCoords = (mdxmVertexTexCoord_t *) &v[numVerts];
TransformedVerts = (float *)G2VertSpace->MiniHeapAlloc(numVerts * 5 * 4);
TransformedVertsArray[surface->thisSurfaceIndex] = (int)TransformedVerts;
if (!TransformedVerts)
{
Com_Error(ERR_DROP, "Ran out of transform space gameside for Ghoul2 Models.\n");
}
// whip through and actually transform each vertex
int *piBoneRefs = (int*) ((byte*)surface + surface->ofsBoneReferences);
// optimisation issue
if ((scale[0] != 1.0) || (scale[1] != 1.0) || (scale[2] != 1.0))
{
for ( j = pos = 0; j < numVerts; j++ )
{
vec3_t tempVert;
VectorClear( tempVert );
const int iNumWeights = G2_GetVertWeights( v );
float fTotalWeight = 0.0f;
for ( k = 0 ; k < iNumWeights ; k++ )
{
int iBoneIndex = G2_GetVertBoneIndex( v, k );
float fBoneWeight = G2_GetVertBoneWeight( v, k, fTotalWeight, iNumWeights );
const mdxaBone_t &bone=bonePtr[piBoneRefs[iBoneIndex]].second;
tempVert[0] += fBoneWeight * ( DotProduct( bone.matrix[0], v->vertCoords ) + bone.matrix[0][3] );
tempVert[1] += fBoneWeight * ( DotProduct( bone.matrix[1], v->vertCoords ) + bone.matrix[1][3] );
tempVert[2] += fBoneWeight * ( DotProduct( bone.matrix[2], v->vertCoords ) + bone.matrix[2][3] );
}
// copy tranformed verts into temp space
TransformedVerts[pos++] = tempVert[0] * scale[0];
TransformedVerts[pos++] = tempVert[1] * scale[1];
TransformedVerts[pos++] = tempVert[2] * scale[2];
// we will need the S & T coors too for hitlocation and hitmaterial stuff
TransformedVerts[pos++] = pTexCoords[j].texCoords[0];
TransformedVerts[pos++] = pTexCoords[j].texCoords[1];
v++;// = (mdxmVertex_t *)&v->weights[/*v->numWeights*/surface->maxVertBoneWeights];
}
}
else
{
for ( j = pos = 0; j < numVerts; j++ )
{
vec3_t tempVert;
VectorClear( tempVert );
const int iNumWeights = G2_GetVertWeights( v );
float fTotalWeight = 0.0f;
for ( k = 0 ; k < iNumWeights ; k++ )
{
int iBoneIndex = G2_GetVertBoneIndex( v, k );
float fBoneWeight = G2_GetVertBoneWeight( v, k, fTotalWeight, iNumWeights );
const mdxaBone_t &bone=bonePtr[piBoneRefs[iBoneIndex]].second;
tempVert[0] += fBoneWeight * ( DotProduct( bone.matrix[0], v->vertCoords ) + bone.matrix[0][3] );
tempVert[1] += fBoneWeight * ( DotProduct( bone.matrix[1], v->vertCoords ) + bone.matrix[1][3] );
tempVert[2] += fBoneWeight * ( DotProduct( bone.matrix[2], v->vertCoords ) + bone.matrix[2][3] );
}
// copy tranformed verts into temp space
TransformedVerts[pos++] = tempVert[0];
TransformedVerts[pos++] = tempVert[1];
TransformedVerts[pos++] = tempVert[2];
// we will need the S & T coors too for hitlocation and hitmaterial stuff
TransformedVerts[pos++] = pTexCoords[j].texCoords[0];
TransformedVerts[pos++] = pTexCoords[j].texCoords[1];
v++;// = (mdxmVertex_t *)&v->weights[/*v->numWeights*/surface->maxVertBoneWeights];
}
}
}
#else
void R_TransformEachSurface( mdxmSurface_t *surface, vec3_t scale, CMiniHeap *G2VertSpace, int *TransformedVertsArray, mdxaBone_v &bonePtr) {
int j, k;
int numVerts;
@ -415,6 +511,7 @@ void R_TransformEachSurface( mdxmSurface_t *surface, vec3_t scale, CMiniHeap *G2
}
}
}
#endif
void G2_TransformSurfaces(int surfaceNum, surfaceInfo_v &rootSList,
mdxaBone_v &bonePtr, model_t *currentModel, int lod, vec3_t scale, CMiniHeap *G2VertSpace, int *TransformedVertArray, bool secondTimeAround)
@ -845,6 +942,222 @@ void G2_GorePolys( const mdxmSurface_t *surface, const vec3_t rayStart, const ve
}
#endif // _SOF2
//Sorry for the sloppiness here, this stuff is just hacked together to work from SP
#ifdef G2_COLLISION_ENABLED
#ifndef _SOF2
struct SVertexTemp
{
int flags;
int touch;
int newindex;
float tex[2];
SVertexTemp()
{
touch=0;
}
};
#define MAX_GORE_VERTS (3000)
static SVertexTemp GoreVerts[MAX_GORE_VERTS];
#endif
void TransformAndTranslatePoint_SP (const vec3_t in, vec3_t out, mdxaBone_t *mat)
{
for (int i=0;i<3;i++)
{
out[i]= in[0]*mat->matrix[i][0] + in[1]*mat->matrix[i][1] + in[2]*mat->matrix[i][2] + mat->matrix[i][3];
}
}
// now we're at poly level, check each model space transformed poly against the model world transfomed ray
static bool G2_RadiusTracePolys( const mdxmSurface_t *surface, const vec3_t rayStart, const vec3_t rayEnd, CollisionRecord_t *collRecMap, int entNum, int modelIndex, const skin_t *skin, const shader_t *cust_shader, const mdxmSurfHierarchy_t *surfInfo, int *TransformedVertsArray, int traceFlags, float fRadius)
{
int j;
vec3_t basis1;
vec3_t basis2;
vec3_t taxis;
vec3_t saxis;
basis2[0]=0.0f;
basis2[1]=0.0f;
basis2[2]=1.0f;
vec3_t v3RayDir;
VectorSubtract(rayEnd, rayStart, v3RayDir);
CrossProduct(v3RayDir,basis2,basis1);
if (DotProduct(basis1,basis1)<.1f)
{
basis2[0]=0.0f;
basis2[1]=1.0f;
basis2[2]=0.0f;
CrossProduct(v3RayDir,basis2,basis1);
}
CrossProduct(v3RayDir,basis1,basis2);
// Give me a shot direction not a bunch of zeros :) -Gil
// assert(DotProduct(basis1,basis1)>.0001f);
// assert(DotProduct(basis2,basis2)>.0001f);
VectorNormalize(basis1);
VectorNormalize(basis2);
const float c=cos(0);//theta
const float s=sin(0);//theta
VectorScale(basis1, 0.5f * c / fRadius,taxis);
VectorMA(taxis, 0.5f * s / fRadius,basis2,taxis);
VectorScale(basis1,-0.5f * s /fRadius,saxis);
VectorMA( saxis, 0.5f * c /fRadius,basis2,saxis);
const float * const verts = (float *)TransformedVertsArray[surface->thisSurfaceIndex];
const int numVerts = surface->numVerts;
int flags=63;
//rayDir/=lengthSquared(raydir);
const float f = VectorLengthSquared(v3RayDir);
v3RayDir[0]/=f;
v3RayDir[1]/=f;
v3RayDir[2]/=f;
for ( j = 0; j < numVerts; j++ )
{
const int pos=j*5;
vec3_t delta;
delta[0]=verts[pos+0]-rayStart[0];
delta[1]=verts[pos+1]-rayStart[1];
delta[2]=verts[pos+2]-rayStart[2];
const float s=DotProduct(delta,saxis)+0.5f;
const float t=DotProduct(delta,taxis)+0.5f;
const float u=DotProduct(delta,v3RayDir);
int vflags=0;
if (s>0)
{
vflags|=1;
}
if (s<1)
{
vflags|=2;
}
if (t>0)
{
vflags|=4;
}
if (t<1)
{
vflags|=8;
}
if (u>0)
{
vflags|=16;
}
if (u<1)
{
vflags|=32;
}
vflags=(~vflags);
flags&=vflags;
GoreVerts[j].flags=vflags;
}
if (flags)
{
return false; // completely off the gore splotch (so presumably hit nothing? -Ste)
}
const int numTris = surface->numTriangles;
const mdxmTriangle_t * const tris = (mdxmTriangle_t *) ((byte *)surface + surface->ofsTriangles);
for ( j = 0; j < numTris; j++ )
{
assert(tris[j].indexes[0]>=0&&tris[j].indexes[0]<numVerts);
assert(tris[j].indexes[1]>=0&&tris[j].indexes[1]<numVerts);
assert(tris[j].indexes[2]>=0&&tris[j].indexes[2]<numVerts);
flags=63&
GoreVerts[tris[j].indexes[0]].flags&
GoreVerts[tris[j].indexes[1]].flags&
GoreVerts[tris[j].indexes[2]].flags;
if (flags)
{
continue;
}
else
{
// we hit a triangle, so init a collision record...
//
for (int i=0; i<MAX_G2_COLLISIONS;i++)
{
if (collRecMap[i].mEntityNum == -1)
{
CollisionRecord_t &newCol = collRecMap[i];
newCol.mPolyIndex = j;
newCol.mEntityNum = entNum;
newCol.mSurfaceIndex = surface->thisSurfaceIndex;
newCol.mModelIndex = modelIndex;
// if (face>0)
// {
newCol.mFlags = G2_FRONTFACE;
// }
// else
// {
// newCol.mFlags = G2_BACKFACE;
// }
//get normal from triangle
const float *A = &verts[(tris[j].indexes[0] * 5)];
const float *B = &verts[(tris[j].indexes[1] * 5)];
const float *C = &verts[(tris[j].indexes[2] * 5)];
vec3_t normal;
vec3_t edgeAC, edgeBA;
VectorSubtract(C, A, edgeAC);
VectorSubtract(B, A, edgeBA);
CrossProduct(edgeBA, edgeAC, normal);
// transform normal (but don't translate) into world angles
TransformPoint(normal, newCol.mCollisionNormal, &worldMatrix);
VectorNormalize(newCol.mCollisionNormal);
newCol.mMaterial = newCol.mLocation = 0;
// exit now if we should
if (traceFlags & G2_RETURNONHIT)
{
//hitOne = true;
return true;
}
//i don't know the hitPoint, but let's just assume it's the first vert for now...
const float *hitPoint = A;
vec3_t distVect;
VectorSubtract(hitPoint, rayStart, distVect);
newCol.mDistance = VectorLength(distVect);
// put the hit point back into world space
TransformAndTranslatePoint_SP(hitPoint, newCol.mCollisionPosition, &worldMatrix);
newCol.mBarycentricI = newCol.mBarycentricJ = 0.0f;
break;
}
}
if (i==MAX_G2_COLLISIONS)
{
//assert(i!=MAX_G2_COLLISIONS); // run out of collision record space - happens OFTEN
//hitOne = true; //force stop recursion
return true; // return true to avoid wasting further time, but no hit will result without a record
}
}
}
return false;
}
#endif
// now we're at poly level, check each model space transformed poly against the model world transfomed ray
bool G2_TracePolys( const mdxmSurface_t *surface, const vec3_t rayStart, const vec3_t rayEnd, CollisionRecord_t *collRecMap, int entNum, int modelIndex, const skin_t *skin, const shader_t *cust_shader, const mdxmSurfHierarchy_t *surfInfo, int *TransformedVertsArray, int traceFlags)
{
@ -1002,13 +1315,30 @@ void G2_TraceSurfaces(CTraceSurface &TS)
// if this surface is not off, add it to the shader render list
if (!offFlags)
{
// go away and trace the polys in this surface
if (G2_TracePolys(surface, TS.rayStart, TS.rayEnd, TS.collRecMap, TS.entNum, TS.modelIndex, TS.skin, TS.cust_shader, surfInfo, TS.TransformedVertsArray, TS.traceFlags) && (TS.traceFlags & G2_RETURNONHIT))
#ifdef G2_COLLISION_ENABLED
if (!(fabs(TS.m_fRadius) < 0.1)) // if not a point-trace
{
// ok, we hit one, *and* we want to return instantly because the returnOnHit is set
// so indicate we've hit one, so other surfaces don't get hit and return
TS.hitOne = true;
return;
// .. then use radius check
//
if (G2_RadiusTracePolys(surface, TS.rayStart, TS.rayEnd, TS.collRecMap, TS.entNum, TS.modelIndex, TS.skin, TS.cust_shader, surfInfo, TS.TransformedVertsArray, TS.traceFlags, TS.m_fRadius) && (TS.traceFlags & G2_RETURNONHIT))
{
// ok, we hit one, *and* we want to return instantly because the returnOnHit is set
// so indicate we've hit one, so other surfaces don't get hit and return
TS.hitOne = true;
return;
}
}
else
#endif
{
// go away and trace the polys in this surface
if (G2_TracePolys(surface, TS.rayStart, TS.rayEnd, TS.collRecMap, TS.entNum, TS.modelIndex, TS.skin, TS.cust_shader, surfInfo, TS.TransformedVertsArray, TS.traceFlags) && (TS.traceFlags & G2_RETURNONHIT))
{
// ok, we hit one, *and* we want to return instantly because the returnOnHit is set
// so indicate we've hit one, so other surfaces don't get hit and return
TS.hitOne = true;
return;
}
}
}
@ -1027,7 +1357,7 @@ void G2_TraceSurfaces(CTraceSurface &TS)
}
void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CollisionRecord_t *collRecMap, int entNum, int traceFlags, int useLod)
void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CollisionRecord_t *collRecMap, int entNum, int traceFlags, int useLod, float fRadius)
{
int i, lod;
model_t *currentModel;
@ -1075,10 +1405,24 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, Colli
{
skin = NULL;
}
#ifdef G2_COLLISION_ENABLED
if (collRecMap)
{
lod = G2_DecideTraceLod(ghoul2[i],useLod, currentModel);
}
else
{
lod=useLod;
if (lod>=currentModel->numLods)
{
return;
}
}
#else
lod = G2_DecideTraceLod(ghoul2[i],useLod, currentModel);
#endif
CTraceSurface TS(ghoul2[i].mSurfaceRoot, ghoul2[i].mSlist, currentModel, lod, rayStart, rayEnd, collRecMap, entNum, i, skin, cust_shader, ghoul2[i].mTransformedVertsArray, traceFlags);
CTraceSurface TS(ghoul2[i].mSurfaceRoot, ghoul2[i].mSlist, currentModel, lod, rayStart, rayEnd, collRecMap, entNum, i, skin, cust_shader, ghoul2[i].mTransformedVertsArray, traceFlags, fRadius);
// start the surface recursion loop
G2_TraceSurfaces(TS);

Binary file not shown.

View file

@ -57,7 +57,7 @@ BSC32=bscmake.exe
LINK32=link.exe
# ADD BASE LINK32 advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map /debug /machine:I386
# SUBTRACT BASE LINK32 /incremental:yes /nodefaultlib
# ADD LINK32 advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Release/jk2mp.map" /debug /machine:I386
# ADD LINK32 ALut.lib OpenAL32.lib advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Release/jk2mp.map" /debug /machine:I386
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "jk2mp - Win32 Debug JK2"
@ -86,7 +86,7 @@ BSC32=bscmake.exe
LINK32=link.exe
# ADD BASE LINK32 advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /profile /map /debug /machine:I386
# SUBTRACT BASE LINK32 /nodefaultlib
# ADD LINK32 ./debug/jk2/smrtheap.obj advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Debug/jk2mp.map" /debug /machine:I386
# ADD LINK32 ./debug/jk2/smrtheap.obj ALut.lib OpenAL32.lib advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Debug/jk2mp.map" /debug /machine:I386
# SUBTRACT LINK32 /profile
!ELSEIF "$(CFG)" == "jk2mp - Win32 Final JK2"
@ -116,7 +116,7 @@ BSC32=bscmake.exe
LINK32=link.exe
# ADD BASE LINK32 advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Release/jk2mp.map" /debug /machine:I386 /out:".\Release/jk2mp.exe"
# SUBTRACT BASE LINK32 /pdb:none
# ADD LINK32 advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Final/jk2mp.map" /machine:I386
# ADD LINK32 ALut.lib OpenAL32.lib advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /map:"Final/jk2mp.map" /machine:I386
# SUBTRACT LINK32 /pdb:none /debug
!ENDIF
@ -159,6 +159,14 @@ SOURCE=.\ui\ui_public.h
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\EaxMan.dll
# End Source File
# Begin Source File
SOURCE=.\OpenAL32.dll
# End Source File
# Begin Source File
SOURCE=.\win32\qe3.ico
# End Source File
# Begin Source File
@ -176,6 +184,14 @@ SOURCE=.\win32\winquake.rc
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\OpenAL32.lib
# End Source File
# Begin Source File
SOURCE=.\ALut.lib
# End Source File
# End Group
# Begin Group "Client"
@ -346,10 +362,6 @@ SOURCE=.\qcommon\cm_public.h
# End Source File
# Begin Source File
SOURCE=.\qcommon\cm_shader.cpp
# End Source File
# Begin Source File
SOURCE=.\qcommon\cm_test.cpp
# End Source File
# Begin Source File
@ -764,6 +776,46 @@ SOURCE=.\mp3code\upsf.c
SOURCE=.\mp3code\wavep.c
# End Source File
# End Group
# Begin Group "EAX"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\client\eax\eax.h
# End Source File
# Begin Source File
SOURCE=.\client\eax\EaxMan.h
# End Source File
# End Group
# Begin Group "OpenAL"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\client\OpenAL\al.h
# End Source File
# Begin Source File
SOURCE=.\client\OpenAL\alc.h
# End Source File
# Begin Source File
SOURCE=.\client\OpenAL\alctypes.h
# End Source File
# Begin Source File
SOURCE=.\client\OpenAL\altypes.h
# End Source File
# Begin Source File
SOURCE=.\client\OpenAL\alu.h
# End Source File
# Begin Source File
SOURCE=.\client\OpenAL\alut.h
# End Source File
# End Group
# Begin Source File
SOURCE=.\client\snd_dma.cpp

View file

@ -3,13 +3,13 @@ Microsoft Developer Studio Workspace File, Format Version 6.00
###############################################################################
Project: "JK2cgame"=.\cgame\JK2_cgame.dsp - Package Owner=<4>
Project: "JK2cgame"=".\cgame\JK2_cgame.dsp" - Package Owner=<4>
Package=<5>
{{{
begin source code control
"$/General/code/cgame", UPCAAAAA
.\cgame
"$/General/code/cgame", UPCAAAAA
.\cgame
end source code control
}}}
@ -19,13 +19,13 @@ Package=<4>
###############################################################################
Project: "JK2game"=.\game\JK2_game.dsp - Package Owner=<4>
Project: "JK2game"=".\game\JK2_game.dsp" - Package Owner=<4>
Package=<5>
{{{
begin source code control
"$/General/code/game", VPCAAAAA
.\game
"$/General/code/game", VPCAAAAA
.\game
end source code control
}}}
@ -35,7 +35,23 @@ Package=<4>
###############################################################################
Project: "botlib"=.\botlib\botlib.dsp - Package Owner=<4>
Project: "WinDed"=".\WinDed.dsp" - Package Owner=<4>
Package=<5>
{{{
begin source code control
"$/General/code", EAAAAAAA
.
end source code control
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "botlib"=".\botlib\botlib.dsp" - Package Owner=<4>
Package=<5>
{{{
@ -51,7 +67,7 @@ Package=<4>
###############################################################################
Project: "jk2mp"=.\jk2mp.dsp - Package Owner=<4>
Project: "jk2mp"=".\jk2mp.dsp" - Package Owner=<4>
Package=<5>
{{{
@ -79,7 +95,7 @@ Package=<4>
###############################################################################
Project: "ui"=.\ui\ui.dsp - Package Owner=<4>
Project: "ui"=".\ui\ui.dsp" - Package Owner=<4>
Package=<5>
{{{

Binary file not shown.

View file

@ -3,696 +3,36 @@
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: ui - Win32 Release JK2--------------------
--------------------Configuration: WinDed - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP67C.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /Zi /O2 /D "NDEBUG" /D "_USRDL" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "UI_EXPORTS" /D "MISSIONPACK" /D "_JK2" /Fp"../Release/ui/ui.pch" /YX /Fo"../Release/ui/" /Fd"../Release/ui/" /FD /c
"C:\projects\jk2\CODE-mp\ui\ui_main.c"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP67C.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP67D.tmp" with contents
[
/nologo /base:"0x40000000" /dll /incremental:no /pdb:"../Release/uix86.pdb" /map:"../Release/ui/uix86.map" /debug /machine:I386 /def:".\ui.def" /out:"../Release/uix86.dll" /implib:"../Release/uix86.lib"
"\projects\jk2\CODE-mp\Release\ui\bg_misc.obj"
"\projects\jk2\CODE-mp\Release\ui\bg_weapons.obj"
"\projects\jk2\CODE-mp\Release\ui\q_math.obj"
"\projects\jk2\CODE-mp\Release\ui\q_shared.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_atoms.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_force.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_gameinfo.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_main.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_shared.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_syscalls.obj"
"\projects\jk2\CODE-mp\Release\ui\ui_util.obj"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP67D.tmp"
<h3>Output Window</h3>
Compiling...
ui_main.c
Linking...
Creating library ../Release/uix86.lib and object ../Release/uix86.exp
<h3>Results</h3>
jk2Ded.exe - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: jk2mp - Win32 Release JK2--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP686.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /Zi /O2 /Ob0 /D "_WIN32" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_JK2" /Fp".\Release\jk2/jk2mp.pch" /YX /Fo".\Release\jk2/" /Fd".\Release\jk2/" /FD /c
"C:\projects\jk2\CODE-mp\client\cl_console.cpp"
"C:\projects\jk2\CODE-mp\qcommon\common.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP686.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP687.tmp" with contents
[
advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /incremental:no /pdb:".\Release/jk2mp.pdb" /map:"Release/jk2mp.map" /debug /machine:I386 /out:".\Release/jk2mp.exe"
".\Release\jk2\cl_cgame.obj"
".\Release\jk2\cl_cin.obj"
".\Release\jk2\cl_console.obj"
".\Release\jk2\cl_input.obj"
".\Release\jk2\cl_keys.obj"
".\Release\jk2\cl_main.obj"
".\Release\jk2\cl_net_chan.obj"
".\Release\jk2\cl_parse.obj"
".\Release\jk2\cl_scrn.obj"
".\Release\jk2\cl_ui.obj"
".\Release\jk2\FXExport.obj"
".\Release\jk2\FxPrimitives.obj"
".\Release\jk2\FxScheduler.obj"
".\Release\jk2\FxSystem.obj"
".\Release\jk2\FxTemplate.obj"
".\Release\jk2\FxUtil.obj"
".\Release\jk2\cm_load.obj"
".\Release\jk2\cm_patch.obj"
".\Release\jk2\cm_polylib.obj"
".\Release\jk2\cm_shader.obj"
".\Release\jk2\cm_test.obj"
".\Release\jk2\cm_trace.obj"
".\Release\jk2\cmd.obj"
".\Release\jk2\CNetProfile.obj"
".\Release\jk2\common.obj"
".\Release\jk2\cvar.obj"
".\Release\jk2\files.obj"
".\Release\jk2\GenericParser2.obj"
".\Release\jk2\hstring.obj"
".\Release\jk2\huffman.obj"
".\Release\jk2\md4.obj"
".\Release\jk2\msg.obj"
".\Release\jk2\net_chan.obj"
".\Release\jk2\q_math.obj"
".\Release\jk2\q_shared.obj"
".\Release\jk2\RoffSystem.obj"
".\Release\jk2\strip.obj"
".\Release\jk2\unzip.obj"
".\Release\jk2\vm.obj"
".\Release\jk2\vm_interpreted.obj"
".\Release\jk2\vm_x86.obj"
".\Release\jk2\win_input.obj"
".\Release\jk2\win_main.obj"
".\Release\jk2\win_net.obj"
".\Release\jk2\win_shared.obj"
".\Release\jk2\win_snd.obj"
".\Release\jk2\win_syscon.obj"
".\Release\jk2\win_wndproc.obj"
".\Release\jk2\sv_bot.obj"
".\Release\jk2\sv_ccmds.obj"
".\Release\jk2\sv_client.obj"
".\Release\jk2\sv_game.obj"
".\Release\jk2\sv_init.obj"
".\Release\jk2\sv_main.obj"
".\Release\jk2\sv_net_chan.obj"
".\Release\jk2\sv_snapshot.obj"
".\Release\jk2\sv_world.obj"
".\Release\jk2\cdct.obj"
".\Release\jk2\csbt.obj"
".\Release\jk2\csbtb.obj"
".\Release\jk2\csbtl3.obj"
".\Release\jk2\cup.obj"
".\Release\jk2\cupini.obj"
".\Release\jk2\cupl1.obj"
".\Release\jk2\cupl3.obj"
".\Release\jk2\cwin.obj"
".\Release\jk2\cwinb.obj"
".\Release\jk2\cwinm.obj"
".\Release\jk2\hwin.obj"
".\Release\jk2\l3dq.obj"
".\Release\jk2\l3init.obj"
".\Release\jk2\mdct.obj"
".\Release\jk2\mhead.obj"
".\Release\jk2\msis.obj"
".\Release\jk2\towave.obj"
".\Release\jk2\uph.obj"
".\Release\jk2\upsf.obj"
".\Release\jk2\wavep.obj"
".\Release\jk2\snd_dma.obj"
".\Release\jk2\snd_mem.obj"
".\Release\jk2\snd_mix.obj"
".\Release\jk2\snd_mp3.obj"
".\Release\jk2\jcapimin.obj"
".\Release\jk2\jccoefct.obj"
".\Release\jk2\jccolor.obj"
".\Release\jk2\jcdctmgr.obj"
".\Release\jk2\jchuff.obj"
".\Release\jk2\jcinit.obj"
".\Release\jk2\jcmainct.obj"
".\Release\jk2\jcmarker.obj"
".\Release\jk2\jcmaster.obj"
".\Release\jk2\jcomapi.obj"
".\Release\jk2\jcparam.obj"
".\Release\jk2\jcphuff.obj"
".\Release\jk2\jcprepct.obj"
".\Release\jk2\jcsample.obj"
".\Release\jk2\jctrans.obj"
".\Release\jk2\jdapimin.obj"
".\Release\jk2\jdapistd.obj"
".\Release\jk2\jdatadst.obj"
".\Release\jk2\jdatasrc.obj"
".\Release\jk2\jdcoefct.obj"
".\Release\jk2\jdcolor.obj"
".\Release\jk2\jddctmgr.obj"
".\Release\jk2\jdhuff.obj"
".\Release\jk2\jdinput.obj"
".\Release\jk2\jdmainct.obj"
".\Release\jk2\jdmarker.obj"
".\Release\jk2\jdmaster.obj"
".\Release\jk2\jdpostct.obj"
".\Release\jk2\jdsample.obj"
".\Release\jk2\jdtrans.obj"
".\Release\jk2\jerror.obj"
".\Release\jk2\jfdctflt.obj"
".\Release\jk2\jidctflt.obj"
".\Release\jk2\jmemmgr.obj"
".\Release\jk2\jmemnobs.obj"
".\Release\jk2\jutils.obj"
".\Release\jk2\png.obj"
".\Release\jk2\matcomp.obj"
".\Release\jk2\tr_animation.obj"
".\Release\jk2\tr_backend.obj"
".\Release\jk2\tr_bsp.obj"
".\Release\jk2\tr_cmds.obj"
".\Release\jk2\tr_curve.obj"
".\Release\jk2\tr_flares.obj"
".\Release\jk2\tr_font.obj"
".\Release\jk2\tr_ghoul2.obj"
".\Release\jk2\tr_image.obj"
".\Release\jk2\tr_init.obj"
".\Release\jk2\tr_light.obj"
".\Release\jk2\tr_main.obj"
".\Release\jk2\tr_marks.obj"
".\Release\jk2\tr_mesh.obj"
".\Release\jk2\tr_model.obj"
".\Release\jk2\tr_noise.obj"
".\Release\jk2\tr_quicksprite.obj"
".\Release\jk2\tr_scene.obj"
".\Release\jk2\tr_shade.obj"
".\Release\jk2\tr_shade_calc.obj"
".\Release\jk2\tr_shader.obj"
".\Release\jk2\tr_shadows.obj"
".\Release\jk2\tr_sky.obj"
".\Release\jk2\tr_surface.obj"
".\Release\jk2\tr_surfacesprites.obj"
".\Release\jk2\tr_world.obj"
".\Release\jk2\tr_WorldEffects.obj"
".\Release\jk2\win_gamma.obj"
".\Release\jk2\win_glimp.obj"
".\Release\jk2\win_qgl.obj"
".\Release\jk2\G2_API.obj"
".\Release\jk2\G2_bolts.obj"
".\Release\jk2\G2_bones.obj"
".\Release\jk2\G2_misc.obj"
".\Release\jk2\G2_surfaces.obj"
".\Release\jk2\adler32.obj"
".\Release\jk2\crc32.obj"
".\Release\jk2\deflate.obj"
".\Release\jk2\infblock.obj"
".\Release\jk2\infcodes.obj"
".\Release\jk2\inffast.obj"
".\Release\jk2\inflate.obj"
".\Release\jk2\inftrees.obj"
".\Release\jk2\infutil.obj"
".\Release\jk2\trees.obj"
".\Release\jk2\zutil.obj"
".\Release\jk2\buffer.obj"
".\Release\jk2\cpp_interface.obj"
".\Release\jk2\sockets.obj"
".\Release\jk2\winquake.res"
".\Release\botlib.lib"
".\Release\uix86.lib"
".\Release\cgamex86.lib"
".\Release\jk2mpgamex86.lib"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP687.tmp"
<h3>Output Window</h3>
Compiling...
cl_console.cpp
common.cpp
Linking...
<h3>Results</h3>
jk2mp.exe - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: ui - Win32 Debug JK2--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP68C.tmp" with contents
[
/nologo /G6 /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "_USRDLL" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "UI_EXPORTS" /D "MISSIONPACK" /D "_JK2" /FR"../Debug/ui/" /Fp"../Debug/ui/ui.pch" /YX /Fo"../Debug/ui/" /Fd"../Debug/ui/" /FD /GZ /c
"C:\projects\jk2\CODE-mp\ui\ui_main.c"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP68C.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP68D.tmp" with contents
[
/nologo /base:"0x40000000" /dll /incremental:yes /pdb:"../Debug/uix86.pdb" /map:"../Debug/ui/uix86.map" /debug /machine:I386 /def:".\ui.def" /out:"../Debug/uix86.dll" /implib:"../Debug/uix86.lib" /pdbtype:sept
"\projects\jk2\CODE-mp\Debug\ui\bg_misc.obj"
"\projects\jk2\CODE-mp\Debug\ui\bg_weapons.obj"
"\projects\jk2\CODE-mp\Debug\ui\q_math.obj"
"\projects\jk2\CODE-mp\Debug\ui\q_shared.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_atoms.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_force.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_gameinfo.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_main.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_shared.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_syscalls.obj"
"\projects\jk2\CODE-mp\Debug\ui\ui_util.obj"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP68D.tmp"
<h3>Output Window</h3>
Compiling...
ui_main.c
Linking...
<h3>
--------------------Configuration: jk2mp - Win32 Debug JK2--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP68F.tmp" with contents
[
/nologo /G6 /MLd /W3 /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_JK2" /D "MEM_DEBUG" /Fr".\Debug\jk2/" /Fo".\Debug\jk2/" /Fd".\Debug\jk2/" /FD /GZ /c
"C:\projects\jk2\CODE-mp\client\cl_console.cpp"
"C:\projects\jk2\CODE-mp\qcommon\common.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP68F.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP690.tmp" with contents
[
./debug/jk2/smrtheap.obj advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /incremental:yes /pdb:".\Debug/jk2mp.pdb" /map:"Debug/jk2mp.map" /debug /machine:I386 /out:".\Debug/jk2mp.exe"
".\Debug\jk2\0_SH_Leak.obj"
".\Debug\jk2\cl_cgame.obj"
".\Debug\jk2\cl_cin.obj"
".\Debug\jk2\cl_console.obj"
".\Debug\jk2\cl_input.obj"
".\Debug\jk2\cl_keys.obj"
".\Debug\jk2\cl_main.obj"
".\Debug\jk2\cl_net_chan.obj"
".\Debug\jk2\cl_parse.obj"
".\Debug\jk2\cl_scrn.obj"
".\Debug\jk2\cl_ui.obj"
".\Debug\jk2\FXExport.obj"
".\Debug\jk2\FxPrimitives.obj"
".\Debug\jk2\FxScheduler.obj"
".\Debug\jk2\FxSystem.obj"
".\Debug\jk2\FxTemplate.obj"
".\Debug\jk2\FxUtil.obj"
".\Debug\jk2\cm_load.obj"
".\Debug\jk2\cm_patch.obj"
".\Debug\jk2\cm_polylib.obj"
".\Debug\jk2\cm_shader.obj"
".\Debug\jk2\cm_test.obj"
".\Debug\jk2\cm_trace.obj"
".\Debug\jk2\cmd.obj"
".\Debug\jk2\CNetProfile.obj"
".\Debug\jk2\common.obj"
".\Debug\jk2\cvar.obj"
".\Debug\jk2\files.obj"
".\Debug\jk2\GenericParser2.obj"
".\Debug\jk2\hstring.obj"
".\Debug\jk2\huffman.obj"
".\Debug\jk2\md4.obj"
".\Debug\jk2\msg.obj"
".\Debug\jk2\net_chan.obj"
".\Debug\jk2\q_math.obj"
".\Debug\jk2\q_shared.obj"
".\Debug\jk2\RoffSystem.obj"
".\Debug\jk2\strip.obj"
".\Debug\jk2\unzip.obj"
".\Debug\jk2\vm.obj"
".\Debug\jk2\vm_interpreted.obj"
".\Debug\jk2\vm_x86.obj"
".\Debug\jk2\win_input.obj"
".\Debug\jk2\win_main.obj"
".\Debug\jk2\win_net.obj"
".\Debug\jk2\win_shared.obj"
".\Debug\jk2\win_snd.obj"
".\Debug\jk2\win_syscon.obj"
".\Debug\jk2\win_wndproc.obj"
".\Debug\jk2\sv_bot.obj"
".\Debug\jk2\sv_ccmds.obj"
".\Debug\jk2\sv_client.obj"
".\Debug\jk2\sv_game.obj"
".\Debug\jk2\sv_init.obj"
".\Debug\jk2\sv_main.obj"
".\Debug\jk2\sv_net_chan.obj"
".\Debug\jk2\sv_snapshot.obj"
".\Debug\jk2\sv_world.obj"
".\Debug\jk2\cdct.obj"
".\Debug\jk2\csbt.obj"
".\Debug\jk2\csbtb.obj"
".\Debug\jk2\csbtl3.obj"
".\Debug\jk2\cup.obj"
".\Debug\jk2\cupini.obj"
".\Debug\jk2\cupl1.obj"
".\Debug\jk2\cupl3.obj"
".\Debug\jk2\cwin.obj"
".\Debug\jk2\cwinb.obj"
".\Debug\jk2\cwinm.obj"
".\Debug\jk2\hwin.obj"
".\Debug\jk2\l3dq.obj"
".\Debug\jk2\l3init.obj"
".\Debug\jk2\mdct.obj"
".\Debug\jk2\mhead.obj"
".\Debug\jk2\msis.obj"
".\Debug\jk2\towave.obj"
".\Debug\jk2\uph.obj"
".\Debug\jk2\upsf.obj"
".\Debug\jk2\wavep.obj"
".\Debug\jk2\snd_dma.obj"
".\Debug\jk2\snd_mem.obj"
".\Debug\jk2\snd_mix.obj"
".\Debug\jk2\snd_mp3.obj"
".\Debug\jk2\jcapimin.obj"
".\Debug\jk2\jccoefct.obj"
".\Debug\jk2\jccolor.obj"
".\Debug\jk2\jcdctmgr.obj"
".\Debug\jk2\jchuff.obj"
".\Debug\jk2\jcinit.obj"
".\Debug\jk2\jcmainct.obj"
".\Debug\jk2\jcmarker.obj"
".\Debug\jk2\jcmaster.obj"
".\Debug\jk2\jcomapi.obj"
".\Debug\jk2\jcparam.obj"
".\Debug\jk2\jcphuff.obj"
".\Debug\jk2\jcprepct.obj"
".\Debug\jk2\jcsample.obj"
".\Debug\jk2\jctrans.obj"
".\Debug\jk2\jdapimin.obj"
".\Debug\jk2\jdapistd.obj"
".\Debug\jk2\jdatadst.obj"
".\Debug\jk2\jdatasrc.obj"
".\Debug\jk2\jdcoefct.obj"
".\Debug\jk2\jdcolor.obj"
".\Debug\jk2\jddctmgr.obj"
".\Debug\jk2\jdhuff.obj"
".\Debug\jk2\jdinput.obj"
".\Debug\jk2\jdmainct.obj"
".\Debug\jk2\jdmarker.obj"
".\Debug\jk2\jdmaster.obj"
".\Debug\jk2\jdpostct.obj"
".\Debug\jk2\jdsample.obj"
".\Debug\jk2\jdtrans.obj"
".\Debug\jk2\jerror.obj"
".\Debug\jk2\jfdctflt.obj"
".\Debug\jk2\jidctflt.obj"
".\Debug\jk2\jmemmgr.obj"
".\Debug\jk2\jmemnobs.obj"
".\Debug\jk2\jutils.obj"
".\Debug\jk2\png.obj"
".\Debug\jk2\matcomp.obj"
".\Debug\jk2\tr_animation.obj"
".\Debug\jk2\tr_backend.obj"
".\Debug\jk2\tr_bsp.obj"
".\Debug\jk2\tr_cmds.obj"
".\Debug\jk2\tr_curve.obj"
".\Debug\jk2\tr_flares.obj"
".\Debug\jk2\tr_font.obj"
".\Debug\jk2\tr_ghoul2.obj"
".\Debug\jk2\tr_image.obj"
".\Debug\jk2\tr_init.obj"
".\Debug\jk2\tr_light.obj"
".\Debug\jk2\tr_main.obj"
".\Debug\jk2\tr_marks.obj"
".\Debug\jk2\tr_mesh.obj"
".\Debug\jk2\tr_model.obj"
".\Debug\jk2\tr_noise.obj"
".\Debug\jk2\tr_quicksprite.obj"
".\Debug\jk2\tr_scene.obj"
".\Debug\jk2\tr_shade.obj"
".\Debug\jk2\tr_shade_calc.obj"
".\Debug\jk2\tr_shader.obj"
".\Debug\jk2\tr_shadows.obj"
".\Debug\jk2\tr_sky.obj"
".\Debug\jk2\tr_surface.obj"
".\Debug\jk2\tr_surfacesprites.obj"
".\Debug\jk2\tr_world.obj"
".\Debug\jk2\tr_WorldEffects.obj"
".\Debug\jk2\win_gamma.obj"
".\Debug\jk2\win_glimp.obj"
".\Debug\jk2\win_qgl.obj"
".\Debug\jk2\G2_API.obj"
".\Debug\jk2\G2_bolts.obj"
".\Debug\jk2\G2_bones.obj"
".\Debug\jk2\G2_misc.obj"
".\Debug\jk2\G2_surfaces.obj"
".\Debug\jk2\adler32.obj"
".\Debug\jk2\crc32.obj"
".\Debug\jk2\deflate.obj"
".\Debug\jk2\infblock.obj"
".\Debug\jk2\infcodes.obj"
".\Debug\jk2\inffast.obj"
".\Debug\jk2\inflate.obj"
".\Debug\jk2\inftrees.obj"
".\Debug\jk2\infutil.obj"
".\Debug\jk2\trees.obj"
".\Debug\jk2\zutil.obj"
".\Debug\jk2\buffer.obj"
".\Debug\jk2\cpp_interface.obj"
".\Debug\jk2\sockets.obj"
".\Debug\jk2\SMRTHEAP.OBJ"
".\win32\winquake.res"
".\smartheap\HAW32M.LIB"
".\Debug\botlib.lib"
".\Debug\uix86.lib"
".\Debug\cgamex86.lib"
".\Debug\jk2mpgamex86.lib"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP690.tmp"
<h3>Output Window</h3>
Compiling...
cl_console.cpp
common.cpp
Generating Code...
Linking...
<h3>Results</h3>
jk2mp.exe - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: ui - Win32 Final JK2--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP692.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /D "NDEBUG" /D "_USRDL" /D "_WINDOWS" /D "_MBCS" /D "UI_EXPORTS" /D "MISSIONPACK" /D "WIN32" /D "_JK2" /D "FINAL_BUILD" /Fp"../Final/ui/ui.pch" /YX /Fo"../Final/ui/" /Fd"../Final/ui/" /FD /c
"C:\projects\jk2\CODE-mp\ui\ui_main.c"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP692.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP693.tmp" with contents
[
/nologo /base:"0x40000000" /dll /incremental:no /pdb:"../Final/uix86.pdb" /map:"../Final/ui/uix86.map" /debug /machine:I386 /def:".\ui.def" /out:"../Final/uix86.dll" /implib:"../Final/uix86.lib"
"\projects\jk2\CODE-mp\Final\ui\bg_misc.obj"
"\projects\jk2\CODE-mp\Final\ui\bg_weapons.obj"
"\projects\jk2\CODE-mp\Final\ui\q_math.obj"
"\projects\jk2\CODE-mp\Final\ui\q_shared.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_atoms.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_force.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_gameinfo.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_main.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_shared.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_syscalls.obj"
"\projects\jk2\CODE-mp\Final\ui\ui_util.obj"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP693.tmp"
<h3>Output Window</h3>
Compiling...
ui_main.c
Linking...
Creating library ../Final/uix86.lib and object ../Final/uix86.exp
<h3>
--------------------Configuration: jk2mp - Win32 Final JK2--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP698.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /Ob0 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32" /D "_JK2" /D "FINAL_BUILD" /Fp".\Final\jk2/jk2mp.pch" /YX /Fo".\Final\jk2/" /Fd".\Final\jk2/" /FD /c
"C:\projects\jk2\CODE-mp\client\cl_console.cpp"
"C:\projects\jk2\CODE-mp\qcommon\common.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP698.tmp"
Creating temporary file "C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP699.tmp" with contents
[
advapi32.lib winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib ole32.lib /nologo /stack:0x800000 /subsystem:windows /incremental:no /pdb:".\Final/jk2mp.pdb" /map:"Final/jk2mp.map" /machine:I386 /out:".\Final/jk2mp.exe"
".\Final\jk2\cl_cgame.obj"
".\Final\jk2\cl_cin.obj"
".\Final\jk2\cl_console.obj"
".\Final\jk2\cl_input.obj"
".\Final\jk2\cl_keys.obj"
".\Final\jk2\cl_main.obj"
".\Final\jk2\cl_net_chan.obj"
".\Final\jk2\cl_parse.obj"
".\Final\jk2\cl_scrn.obj"
".\Final\jk2\cl_ui.obj"
".\Final\jk2\FXExport.obj"
".\Final\jk2\FxPrimitives.obj"
".\Final\jk2\FxScheduler.obj"
".\Final\jk2\FxSystem.obj"
".\Final\jk2\FxTemplate.obj"
".\Final\jk2\FxUtil.obj"
".\Final\jk2\cm_load.obj"
".\Final\jk2\cm_patch.obj"
".\Final\jk2\cm_polylib.obj"
".\Final\jk2\cm_shader.obj"
".\Final\jk2\cm_test.obj"
".\Final\jk2\cm_trace.obj"
".\Final\jk2\cmd.obj"
".\Final\jk2\CNetProfile.obj"
".\Final\jk2\common.obj"
".\Final\jk2\cvar.obj"
".\Final\jk2\files.obj"
".\Final\jk2\GenericParser2.obj"
".\Final\jk2\hstring.obj"
".\Final\jk2\huffman.obj"
".\Final\jk2\md4.obj"
".\Final\jk2\msg.obj"
".\Final\jk2\net_chan.obj"
".\Final\jk2\q_math.obj"
".\Final\jk2\q_shared.obj"
".\Final\jk2\RoffSystem.obj"
".\Final\jk2\strip.obj"
".\Final\jk2\unzip.obj"
".\Final\jk2\vm.obj"
".\Final\jk2\vm_interpreted.obj"
".\Final\jk2\vm_x86.obj"
".\Final\jk2\win_input.obj"
".\Final\jk2\win_main.obj"
".\Final\jk2\win_net.obj"
".\Final\jk2\win_shared.obj"
".\Final\jk2\win_snd.obj"
".\Final\jk2\win_syscon.obj"
".\Final\jk2\win_wndproc.obj"
".\Final\jk2\sv_bot.obj"
".\Final\jk2\sv_ccmds.obj"
".\Final\jk2\sv_client.obj"
".\Final\jk2\sv_game.obj"
".\Final\jk2\sv_init.obj"
".\Final\jk2\sv_main.obj"
".\Final\jk2\sv_net_chan.obj"
".\Final\jk2\sv_snapshot.obj"
".\Final\jk2\sv_world.obj"
".\Final\jk2\cdct.obj"
".\Final\jk2\csbt.obj"
".\Final\jk2\csbtb.obj"
".\Final\jk2\csbtl3.obj"
".\Final\jk2\cup.obj"
".\Final\jk2\cupini.obj"
".\Final\jk2\cupl1.obj"
".\Final\jk2\cupl3.obj"
".\Final\jk2\cwin.obj"
".\Final\jk2\cwinb.obj"
".\Final\jk2\cwinm.obj"
".\Final\jk2\hwin.obj"
".\Final\jk2\l3dq.obj"
".\Final\jk2\l3init.obj"
".\Final\jk2\mdct.obj"
".\Final\jk2\mhead.obj"
".\Final\jk2\msis.obj"
".\Final\jk2\towave.obj"
".\Final\jk2\uph.obj"
".\Final\jk2\upsf.obj"
".\Final\jk2\wavep.obj"
".\Final\jk2\snd_dma.obj"
".\Final\jk2\snd_mem.obj"
".\Final\jk2\snd_mix.obj"
".\Final\jk2\snd_mp3.obj"
".\Final\jk2\jcapimin.obj"
".\Final\jk2\jccoefct.obj"
".\Final\jk2\jccolor.obj"
".\Final\jk2\jcdctmgr.obj"
".\Final\jk2\jchuff.obj"
".\Final\jk2\jcinit.obj"
".\Final\jk2\jcmainct.obj"
".\Final\jk2\jcmarker.obj"
".\Final\jk2\jcmaster.obj"
".\Final\jk2\jcomapi.obj"
".\Final\jk2\jcparam.obj"
".\Final\jk2\jcphuff.obj"
".\Final\jk2\jcprepct.obj"
".\Final\jk2\jcsample.obj"
".\Final\jk2\jctrans.obj"
".\Final\jk2\jdapimin.obj"
".\Final\jk2\jdapistd.obj"
".\Final\jk2\jdatadst.obj"
".\Final\jk2\jdatasrc.obj"
".\Final\jk2\jdcoefct.obj"
".\Final\jk2\jdcolor.obj"
".\Final\jk2\jddctmgr.obj"
".\Final\jk2\jdhuff.obj"
".\Final\jk2\jdinput.obj"
".\Final\jk2\jdmainct.obj"
".\Final\jk2\jdmarker.obj"
".\Final\jk2\jdmaster.obj"
".\Final\jk2\jdpostct.obj"
".\Final\jk2\jdsample.obj"
".\Final\jk2\jdtrans.obj"
".\Final\jk2\jerror.obj"
".\Final\jk2\jfdctflt.obj"
".\Final\jk2\jidctflt.obj"
".\Final\jk2\jmemmgr.obj"
".\Final\jk2\jmemnobs.obj"
".\Final\jk2\jutils.obj"
".\Final\jk2\png.obj"
".\Final\jk2\matcomp.obj"
".\Final\jk2\tr_animation.obj"
".\Final\jk2\tr_backend.obj"
".\Final\jk2\tr_bsp.obj"
".\Final\jk2\tr_cmds.obj"
".\Final\jk2\tr_curve.obj"
".\Final\jk2\tr_flares.obj"
".\Final\jk2\tr_font.obj"
".\Final\jk2\tr_ghoul2.obj"
".\Final\jk2\tr_image.obj"
".\Final\jk2\tr_init.obj"
".\Final\jk2\tr_light.obj"
".\Final\jk2\tr_main.obj"
".\Final\jk2\tr_marks.obj"
".\Final\jk2\tr_mesh.obj"
".\Final\jk2\tr_model.obj"
".\Final\jk2\tr_noise.obj"
".\Final\jk2\tr_quicksprite.obj"
".\Final\jk2\tr_scene.obj"
".\Final\jk2\tr_shade.obj"
".\Final\jk2\tr_shade_calc.obj"
".\Final\jk2\tr_shader.obj"
".\Final\jk2\tr_shadows.obj"
".\Final\jk2\tr_sky.obj"
".\Final\jk2\tr_surface.obj"
".\Final\jk2\tr_surfacesprites.obj"
".\Final\jk2\tr_world.obj"
".\Final\jk2\tr_WorldEffects.obj"
".\Final\jk2\win_gamma.obj"
".\Final\jk2\win_glimp.obj"
".\Final\jk2\win_qgl.obj"
".\Final\jk2\G2_API.obj"
".\Final\jk2\G2_bolts.obj"
".\Final\jk2\G2_bones.obj"
".\Final\jk2\G2_misc.obj"
".\Final\jk2\G2_surfaces.obj"
".\Final\jk2\adler32.obj"
".\Final\jk2\crc32.obj"
".\Final\jk2\deflate.obj"
".\Final\jk2\infblock.obj"
".\Final\jk2\infcodes.obj"
".\Final\jk2\inffast.obj"
".\Final\jk2\inflate.obj"
".\Final\jk2\inftrees.obj"
".\Final\jk2\infutil.obj"
".\Final\jk2\trees.obj"
".\Final\jk2\zutil.obj"
".\Final\jk2\buffer.obj"
".\Final\jk2\cpp_interface.obj"
".\Final\jk2\sockets.obj"
".\Final\jk2\winquake.res"
".\Final\botlib.lib"
".\Final\uix86.lib"
".\Final\cgamex86.lib"
".\Final\jk2mpgamex86.lib"
]
Creating command line "link.exe @C:\DOCUME~1\jmonroe\LOCALS~1\Temp\RSP699.tmp"
<h3>Output Window</h3>
Compiling...
cl_console.cpp
common.cpp
Linking...

View file

@ -1,5 +1,9 @@
SCC = This is a Source Code Control file
[WinDed.dsp]
SCC_Aux_Path = "\\ravend\vss_projects\jk2sof2MP"
SCC_Project_Name = "$/General/code", EAAAAAAA
[jk2mp.dsp]
SCC_Aux_Path = "\\ravend\vss_projects\jk2sof2MP"
SCC_Project_Name = "$/General/code", EAAAAAAA

Binary file not shown.

View file

@ -22,85 +22,20 @@
static char sys_cmdline[MAX_STRING_CHARS];
clientStatic_t cls;
// enable this for executable checksumming
#ifdef FINAL_BUILD
#define SPANK_MONKEYS
#endif
static int sys_monkeySpank;
static int sys_checksum;
static unsigned busyCount = 0;
static bool otherTasksRunning = false;
unsigned otherTaskTime = 0;
#pragma optimize("", off)
void busyFunction(void)
{
float a = MEM_THRESHOLD;
float b = 9343;
short c = 4;
while((int)b > (float)(b-1))
{
a = a + b / c;
busyCount++;
}
}
void CheckProcessTime(void)
{
HANDLE threadHandle;
int threadId;
FILETIME creationTime; // thread creation time
FILETIME exitTime; // thread exit time
FILETIME kernelTime; // thread kernel-mode time
FILETIME userTime; // thread user-mode time
// char temp[1024];
busyCount = 0;
threadHandle = CreateThread(
NULL, // LPSECURITY_ATTRIBUTES lpsa,
0, // DWORD cbStack,
(LPTHREAD_START_ROUTINE)busyFunction, // LPTHREAD_START_ROUTINE lpStartAddr,
0, // LPVOID lpvThreadParm,
CREATE_SUSPENDED, // DWORD fdwCreate,
(unsigned long *)&threadId );
SetThreadPriority(threadHandle, THREAD_PRIORITY_IDLE);
ResumeThread(threadHandle);
while(busyCount < 10)
{
Sleep(100);
}
Sleep(1000);
TerminateThread(threadHandle, 0);
GetThreadTimes(threadHandle, &creationTime, &exitTime, &kernelTime, &userTime);
CloseHandle(threadHandle);
// sprintf(temp, "Time = %u\n", userTime.dwLowDateTime);
// OutputDebugString(temp);
otherTaskTime = userTime.dwLowDateTime;
if (userTime.dwLowDateTime < 7500000)
{
otherTasksRunning = true;
// OutputDebugString("WARNING: possibly running on a system with another task\n");
}
}
#pragma optimize("", on)
void *Sys_GetBotAIAPI (void *parms ) {
return NULL;
}
void Conbuf_AppendText( const char *pMsg )
{
printf(pMsg);
char msg[4096];
strcpy(msg, pMsg);
printf(Q_CleanStr(msg));
printf("\n");
}
/*
@ -236,136 +171,6 @@ int Sys_MonkeyShouldBeSpanked( void ) {
return sys_monkeySpank;
}
/*
==================
Sys_CodeInMemoryChecksum
==================
*/
#define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (addValue) )
int Sys_CodeInMemoryChecksum( void *codeBase ) {
PIMAGE_DOS_HEADER dosHeader;
PIMAGE_NT_HEADERS pNTHeader;
PIMAGE_SECTION_HEADER section;
dosHeader = (PIMAGE_DOS_HEADER)codeBase;
pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew );
// First, verify that the e_lfanew field gave us a reasonable
// pointer, then verify the PE signature.
if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
pNTHeader->Signature != IMAGE_NT_SIGNATURE )
{
//printf("Unhandled EXE type, or invalid .EXE\n");
return 0;
}
// first section oughta be the code section
section = (PIMAGE_SECTION_HEADER)(pNTHeader+1);
/*
// the name of the code section should be .text
if ( Q_stricmp( section->Name, ".text" ) ) {
return 0;
}
*/
return Com_BlockChecksum( ((byte *) codeBase) + section->VirtualAddress, section->SizeOfRawData );
}
/*
==================
Sys_ChecksumExe
==================
*/
// make sure this string is unique in the executable
// 01234567890123
byte *exeChecksumId = (unsigned char *)"q3monkeyid\0\0\0\0";
void Sys_ChecksumExe( void *codeBase ) {
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
STARTUPINFO si;
TCHAR szCmdLine[512];
HANDLE hfile, hProcessOrig;
PROCESS_INFORMATION pi;
int l, i, n;
FILE *f;
byte *buf, *ptr;
// Is this the original EXE or the clone EXE?
if ( Q_stricmp(__argv[1], "monkey") ) {
// Original EXE: Spawn clone EXE to delete this EXE
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
// Spawn the clone EXE passing it our EXE's process handle
// and the full path name to the original EXE file.
hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,
GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s monkey %d %d \"%s\""), szPathClone,
sys_checksum, hProcessOrig, szPathOrig);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
} else {
// Clone EXE: When original EXE terminates, overwrite it with a new one
sys_checksum = atoi( __argv[2] );
hProcessOrig = (HANDLE) atoi( __argv[3] );
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
// open the original executable
f = fopen( __argv[4], "rb" );
if ( !f ) {
return;
}
fseek (f, 0, SEEK_END);
l = ftell (f);
fseek (f, 0, SEEK_SET);
buf = (unsigned char *)malloc(l);
if ( fread(buf, l, 1, f) != 1 ) {
return;
}
fclose(f);
// search for the exe name string, nice brute force
n = strlen((const char *)exeChecksumId);
for ( i = 0; i < l; i++ ) {
if ( !Q_strncmp((const char *)(buf + i), (const char *)exeChecksumId, n) ) {
break;
}
}
if ( i >= l ) {
return;
}
ptr = buf + i;
// write checksum into exe memory image
ptr[0] = (sys_checksum >> 24) & 0xFF;
ptr[1] = (sys_checksum >> 16) & 0xFF;
ptr[2] = (sys_checksum >> 8) & 0xFF;
ptr[3] = (sys_checksum >> 0) & 0xFF;
ptr[4] = ptr[5] = ptr[6] = ptr[7] = ptr[8] = ptr[9] = 0;
// write out new exe with checksum
f = fopen( __argv[4], "wb" );
if ( !f ) {
return;
}
if ( fwrite(buf, l, 1, f) != 1 ) {
return;
}
fclose(f);
free(buf);
// The system will delete the clone EXE automatically
// because it was opened with FILE_FLAG_DELETE_ON_CLOSE
}
//
exit(0);
}
/*
==================
@ -373,89 +178,124 @@ Sys_VerifyCodeChecksum
==================
*/
void Sys_VerifyCodeChecksum( void *codeBase ) {
// NOTE: should not checksum code in debug mode because the memory image changes
// as soon as you set a break point!
#if defined(SPANK_MONKEYS) && !defined(_DEBUG)
int exeChecksum;
}
// if the checksum is not yet stored in the executable
if ( exeChecksumId[4] != 0 ) {
// spawn another process that will replace this executable with one that has a checksum
Sys_ChecksumExe( codeBase );
return;
}
/*
===============
PrintMatches
exeChecksum = (exeChecksumId[0] << 24) | (exeChecksumId[1] << 16) | (exeChecksumId[2] << 8) | exeChecksumId[3];
if ( exeChecksum != sys_checksum ) {
sys_monkeySpank = qtrue;
===============
*/
static char g_consoleField1[256];
static char g_consoleField2[256];
static void PrintMatches( const char *s ) {
if ( !Q_stricmpn( s, g_consoleField1, strlen( g_consoleField1 ) ) ) {
printf( " %s\n", s );
}
#endif
}
//qboolean stdin_active = qtrue;
char *Sys_ConsoleInput(void)
{
static char text[256];
static int len=0;
fd_set fdset;
struct timeval timeout;
const char ClearLine[] = "\r \r";
// if (!com_dedicated || !com_dedicated->value)
// return NULL;
// if (!stdin_active)
// return NULL;
// FD_ZERO(&fdset);
// FD_SET(0, &fdset); // stdin
// timeout.tv_sec = 0;
// timeout.tv_usec = 0;
// if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset))
// return NULL;
if (!kbhit()) return NULL;
if (len == 0) memset(text,0,sizeof(text));
text[len] = getch();
static int len=0;
static bool bPendingExtended = false;
switch (text[len])
if (!kbhit()) return NULL;
if (len == 0) memset(g_consoleField1,0,sizeof(g_consoleField1));
g_consoleField1[len] = getch();
if (bPendingExtended)
{
switch (g_consoleField1[len])
{
case 'H': //up
strcpy(g_consoleField1, g_consoleField2);
printf(ClearLine);
printf("%s",g_consoleField1);
len = strlen(g_consoleField1);
break;
case 'K': //left
break;
case 'M': //right
break;
case 'P': //down
break;
}
g_consoleField1[len] = 0; //erase last key hit
bPendingExtended = false;
}
else
switch ((unsigned char) g_consoleField1[len])
{
case 0x00: //fkey is next
case 0xe0: //extended = arrow keys
g_consoleField1[len] = 0; //erase last key hit
bPendingExtended = true;
break;
case 8: // backspace
printf("%c %c",text[len],text[len]);
text[len] = 0;
printf("%c %c",g_consoleField1[len],g_consoleField1[len]);
g_consoleField1[len] = 0;
if (len > 0) len--;
text[len] = 0;
g_consoleField1[len] = 0;
break;
case 9: //Tab
if (len) {
g_consoleField1[len] = 0; //erase last key hit
printf( "\n");
// run through again, printing matches
Cmd_CommandCompletion( PrintMatches );
Cvar_CommandCompletion( PrintMatches );
printf( "\n%s", g_consoleField1);
}
break;
case 27: // esc
// clear the line
printf(ClearLine);
len = 0;
printf("\n");
break;
case '\r':
case '\r': //enter
g_consoleField1[len] = 0; //erase last key hit
printf("\n");
text[len] = 0;
len = 0;
return text;
if (len) {
len = 0;
strcpy(g_consoleField2, g_consoleField1);
return g_consoleField1;
}
break;
case 'v' - 'a' + 1: // ctrl-v is paste
g_consoleField1[len] = 0; //erase last key hit
char *cbd;
cbd = Sys_GetClipboardData();
if (cbd) {
strncpy (&g_consoleField1[len], cbd, sizeof(g_consoleField1) );
printf("%s",cbd);
len += strlen(cbd);
Z_Free( cbd );
if (len == sizeof(g_consoleField1))
{
len = 0;
return g_consoleField1;
}
}
break;
default:
printf("%c",text[len]);
printf("%c",g_consoleField1[len]);
len++;
if (len == sizeof(text))
if (len == sizeof(g_consoleField1))
{
len = 0;
return text;
return g_consoleField1;
}
break;
}
// len = read (0, text, sizeof(text));
// if (len == 0) { // eof!
// stdin_active = qfalse;
// return NULL;
// }
// if (len < 1)
// return NULL;
// len = strlen(text);
// text[len-1] = 0; // rip off the /n and terminate
return NULL;
}
@ -509,7 +349,7 @@ void QDECL Sys_Error( const char *error, ... ) {
// Sys_DestroyConsole();
Com_ShutdownZoneMemory();
// Com_ShutdownHunkMemory();
Com_ShutdownHunkMemory();
exit (1);
}
@ -524,7 +364,7 @@ void Sys_Quit( void ) {
IN_Shutdown();
// Sys_DestroyConsole();
Com_ShutdownZoneMemory();
// Com_ShutdownHunkMemory();
Com_ShutdownHunkMemory();
exit (0);
}
@ -1247,7 +1087,8 @@ EVENT LOOP
#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 )
sysEvent_t eventQue[MAX_QUED_EVENTS];
int eventHead, eventTail;
static int eventHead=0;
static int eventTail=0;
byte sys_packetReceived[MAX_MSGLEN];
/*
@ -1531,50 +1372,6 @@ void Sys_Init( void ) {
IN_Init(); // FIXME: not in dedicated?
}
// do a quick mem test to check for any potential future mem problems...
//
void QuickMemTest(void)
{
// if (!Sys_LowPhysicalMemory())
{
const int iMemTestMegs = 64; // useful search label
// special test,
void *pvData = malloc(iMemTestMegs * 1024 * 1024);
if (pvData)
{
free(pvData);
}
else
{
// err...
//
LPCSTR psContinue = "Your machine failed to allocate %dMB in a memory test, which may mean you'll have problems running this game all the way through.\n\nContinue anyway?";
LPCSTR psNoMem = "Insufficient memory to run this game!\n";
switch (Language_GetIntegerValue())
{
case SP_LANGUAGE_GERMAN:
psContinue = "Ihr Computer konnte bei einem Speichertest keine %dMB reservieren, daher werden Sie mit dem Starten des Spiels Probleme haben.\n\nDennoch fortsetzen?";
psNoMem = "Unzureichender Speicher zum Starten!\n";
break;
case SP_LANGUAGE_FRENCH:
psContinue = "Votre système n'a pu allouer %d Mo lors d'une vérification de la mémoire, ce qui signifie que vous aurez peut-être du mal à faire fonctionner ce jeu. \n\nSouhaitez-vous continuer malgré tout ?";
psNoMem = "Mémoire insuffisante pour lancer ce jeu !\n";
break;
}
#define GetYesNo(psQuery) (!!(MessageBox(NULL,psQuery,"Query",MB_YESNO|MB_ICONWARNING|MB_TASKMODAL)==IDYES))
if (!GetYesNo(va(psContinue,iMemTestMegs)))
{
Com_Error( ERR_FATAL, psNoMem );
}
}
}
}
//=======================================================================
//int totalMsec, countMsec;

View file

@ -801,7 +801,6 @@ qboolean CROFFSystem::ApplyROFF( SROFFEntity *roff_ent, CROFFSystem::CROFF *roff
sharedEntity_t *ent = NULL;
trajectory_t *originTrajectory, *angleTrajectory;
vec_t *origin, *angle;
vec3_t originTemp, angleTemp;
if ( svs.time < roff_ent->mNextROFFTime )
@ -812,6 +811,7 @@ qboolean CROFFSystem::ApplyROFF( SROFFEntity *roff_ent, CROFFSystem::CROFF *roff
if (roff_ent->mIsClient)
{
#ifndef DEDICATED
vec3_t originTemp, angleTemp;
originTrajectory = (trajectory_t *)VM_Call( cgvm, CG_GET_ORIGIN_TRAJECTORY, roff_ent->mEntID );
angleTrajectory = (trajectory_t *)VM_Call( cgvm, CG_GET_ANGLE_TRAJECTORY, roff_ent->mEntID );
VM_Call( cgvm, CG_GET_ORIGIN, roff_ent->mEntID, originTemp );
@ -949,11 +949,11 @@ qboolean CROFFSystem::ClearLerp( SROFFEntity *roff_ent )
sharedEntity_t *ent;
trajectory_t *originTrajectory, *angleTrajectory;
vec_t *origin, *angle;
vec3_t originTemp, angleTemp;
if (roff_ent->mIsClient)
{
#ifndef DEDICATED
vec3_t originTemp, angleTemp;
originTrajectory = (trajectory_t *)VM_Call( cgvm, CG_GET_ORIGIN_TRAJECTORY, roff_ent->mEntID );
angleTrajectory = (trajectory_t *)VM_Call( cgvm, CG_GET_ANGLE_TRAJECTORY, roff_ent->mEntID );
VM_Call( cgvm, CG_GET_ORIGIN, roff_ent->mEntID, originTemp );

View file

@ -91,7 +91,6 @@ void CMod_LoadShaders( lump_t *l )
out->contentFlags = LittleLong( in->contentFlags );
out->surfaceFlags = LittleLong( in->surfaceFlags );
}
CM_SetupShaderProperties();
}
@ -674,9 +673,6 @@ static void CM_LoadMap_Actual( const char *name, qboolean clientload, int *check
, name, header.version, BSP_VERSION );
}
// Load in the shader text - return instantly if already loaded
CM_LoadShaderText(qfalse);
cmod_base = (byte *)buf;
// load into heap
@ -747,10 +743,6 @@ CM_ClearMap
*/
void CM_ClearMap( void )
{
#if !defined(BSPC)
CM_ShutdownShaderProperties();
#endif
Com_Memset( &cm, 0, sizeof( cm ) );
CM_ClearLevelPatches();
}

View file

@ -194,10 +194,3 @@ struct patchCollide_s *CM_GeneratePatchCollide( int width, int height, vec3_t *p
void CM_TraceThroughPatchCollide( traceWork_t *tw, const struct patchCollide_s *pc );
qboolean CM_PositionTestInPatchCollide( traceWork_t *tw, const struct patchCollide_s *pc );
void CM_ClearLevelPatches( void );
// cm_shader.cpp
void CM_SetupShaderProperties( void );
void CM_ShutdownShaderProperties(void);
CCMShader *CM_GetShaderInfo( const char *name );
CCMShader *CM_GetShaderInfo( int shaderNum );
int CM_HandleDamageShader(int sideNum, int damage);

View file

@ -278,6 +278,7 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
va_end (argptr);
if ( code != ERR_DISCONNECT ) {
Cvar_Get("com_errorMessage", "", CVAR_ROM); //give com_errorMessage a default so it won't come back to life after a resetDefaults
Cvar_Set("com_errorMessage", com_errorMessage);
}
@ -857,7 +858,11 @@ void *Z_Malloc(int iSize, memtag_t eTag, qboolean bZeroit /* = qfalse */)
zoneHeader_t *pMemory = NULL;
while (pMemory == NULL)
{
pMemory = (zoneHeader_t *) malloc ( iRealSize );
if (bZeroit) {
pMemory = (zoneHeader_t *) calloc ( iRealSize, 1 );
} else {
pMemory = (zoneHeader_t *) malloc ( iRealSize );
}
if (!pMemory)
{
// new bit, if we fail to malloc memory, try dumping some of the cached stuff that's non-vital and try again...
@ -980,9 +985,6 @@ void *Z_Malloc(int iSize, memtag_t eTag, qboolean bZeroit /* = qfalse */)
Z_Validate(); // check for corruption
void *pvReturnMem = &pMemory[1];
if (bZeroit) {
memset(pvReturnMem, 0, iSize);
}
return pvReturnMem;
}
@ -1641,6 +1643,15 @@ void Com_InitHunkMemory( void ) {
#endif
}
void Com_ShutdownHunkMemory(void)
{
if(s_hunkData)
{
free(s_hunkData);
s_hunkData = NULL;
}
}
/*
====================
Hunk_MemoryRemaining
@ -2494,7 +2505,11 @@ void Com_Init( char *commandLine ) {
// skip the jk2mpconfig.cfg if "safe" is on the command line
if ( !Com_SafeMode() ) {
#ifdef DEDICATED
Cbuf_AddText ("exec jk2mpserver.cfg\n");
#else
Cbuf_AddText ("exec jk2mpconfig.cfg\n");
#endif
}
Cbuf_AddText ("exec autoexec.cfg\n");
@ -2532,7 +2547,7 @@ void Com_Init( char *commandLine ) {
com_dropsim = Cvar_Get ("com_dropsim", "0", CVAR_CHEAT);
com_viewlog = Cvar_Get( "viewlog", "0", CVAR_CHEAT );
com_speeds = Cvar_Get ("com_speeds", "0", 0);
com_timedemo = Cvar_Get ("timedemo", "0", CVAR_CHEAT);
com_timedemo = Cvar_Get ("timedemo", "0", 0);
com_cameraMode = Cvar_Get ("com_cameraMode", "0", CVAR_CHEAT);
cl_paused = Cvar_Get ("cl_paused", "0", CVAR_ROM);
@ -2569,7 +2584,7 @@ void Com_Init( char *commandLine ) {
com_version = Cvar_Get ("version", s, CVAR_ROM | CVAR_SERVERINFO );
SP_Init();
#ifndef __linux__
#ifndef DEDICATED
extern void QuickMemTest(void);
QuickMemTest();
#endif
@ -2669,7 +2684,11 @@ void Com_WriteConfiguration( void ) {
}
cvar_modifiedFlags &= ~CVAR_ARCHIVE;
#ifdef DEDICATED
Com_WriteConfigToFile( "jk2mpserver.cfg" );
#else
Com_WriteConfigToFile( "jk2mpconfig.cfg" );
#endif
// bk001119 - tentative "not needed for dedicated"
#ifndef DEDICATED
@ -2938,7 +2957,6 @@ void MSG_shutdownHuffman();
void Com_Shutdown (void)
{
CM_ClearMap();
CM_FreeShaderText();
if (logfile) {
FS_FCloseFile (logfile);

View file

@ -150,6 +150,11 @@ void Cvar_CommandCompletion( void(*callback)(const char *s) ) {
cvar_t *cvar;
for ( cvar = cvar_vars ; cvar ; cvar = cvar->next ) {
// Dont show internal cvars
if ( cvar->flags & CVAR_INTERNAL )
{
continue;
}
callback( cvar->name );
}
}
@ -463,11 +468,11 @@ qboolean Cvar_Command( void ) {
// perform a variable print or set
if ( Cmd_Argc() == 1 )
{
if (v->flags & CVAR_INTERNAL) // don't display
/* if (v->flags & CVAR_INTERNAL) // don't display
{
return qtrue;
}
*/
Com_Printf ("\"%s\" is:\"%s" S_COLOR_WHITE "\" default:\"%s" S_COLOR_WHITE "\"\n", v->name, v->string, v->resetString );
if ( v->latchedString ) {
Com_Printf( "latched: \"%s\"\n", v->latchedString );
@ -902,7 +907,7 @@ Reads in all archived cvars
============
*/
void Cvar_Init (void) {
cvar_cheats = Cvar_Get("sv_cheats", "1", CVAR_ROM | CVAR_SYSTEMINFO );
cvar_cheats = Cvar_Get("sv_cheats", "0", CVAR_ROM | CVAR_SYSTEMINFO );
Cmd_AddCommand ("toggle", Cvar_Toggle_f);
Cmd_AddCommand ("set", Cvar_Set_f);

View file

@ -2531,7 +2531,7 @@ qboolean FS_idPak( char *pak, char *base ) {
int i;
for (i = 0; i < NUM_ID_PAKS; i++) {
if ( !FS_FilenameCompare(pak, va("%s/pak%d", base, i)) ) {
if ( !FS_FilenameCompare(pak, va("%s/assets%d", base, i)) ) {
break;
}
}
@ -3266,7 +3266,11 @@ void FS_Restart( int checksumFeed ) {
if ( Q_stricmp(fs_gamedirvar->string, lastValidGame) ) {
// skip the jk2mpconfig.cfg if "safe" is on the command line
if ( !Com_SafeMode() ) {
#ifdef DEDICATED
Cbuf_AddText ("exec jk2mpserver.cfg\n");
#else
Cbuf_AddText ("exec jk2mpconfig.cfg\n");
#endif
}
}

Some files were not shown because too many files have changed in this diff Show more