mirror of
https://github.com/ZDoom/Raze.git
synced 2024-12-21 01:40:51 +00:00
3ed90ca4f2
These hacks could no longer be allowed to co-opt the fake multiplayer mode, used for local testing and mod development. I have half a mind to remove the hacks outright because they could be likened to drilling bolts directly into your car engine just so you could mount a bowling ball as a hood ornament. However, I don't want to take away the splitscreen hack mod from anyone who uses it, and the work done on these hacks should be useful if proper splitscreen were implemented internally using per-player input and multiple renderer/audio passes. git-svn-id: https://svn.eduke32.com/eduke32@4249 1a8010ca-5511-0410-912e-c29ae57300e0
369 lines
9 KiB
Text
369 lines
9 KiB
Text
/*
|
|
--------------------------------------------------------------------------------
|
|
Duke Nukem 3D SplitScreen mod
|
|
Beta 1
|
|
By Bloodclaw
|
|
|
|
Modified from original for use with EDuke32 SVN.
|
|
Requires an EDuke32 binary built with SPLITSCREEN_MOD_HACKS preprocessor flag.
|
|
Usage: eduke32 -mx splitscr.con -q2
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
// Key name definitions
|
|
definegamefuncname 11 P2_Move_Forward
|
|
definegamefuncname 12 P2_Move_Backward
|
|
definegamefuncname 13 P2_Turn_Left
|
|
definegamefuncname 14 P2_Turn_Right
|
|
definegamefuncname 17 P2_Aim_Up
|
|
definegamefuncname 18 P2_Aim_Down
|
|
definegamefuncname 19 P2_Fire
|
|
definegamefuncname 20 P2_Open
|
|
definegamefuncname 21 P2_Jump
|
|
definegamefuncname 22 P2_Crouch
|
|
definegamefuncname 23 P2_Inventory
|
|
definegamefuncname 24 P2_Inventory_Left
|
|
definegamefuncname 25 P2_Inventory_Right
|
|
definegamefuncname 26 P2_Quick_Kick
|
|
definegamefuncname 27 P2_Previous_Weapon
|
|
definegamefuncname 28 P2_Next_Weapon
|
|
|
|
|
|
gamevar pid 1 0 // This hold player 2 id
|
|
gamevar pnum 0 0 // This is set to player 2 sprite number
|
|
|
|
// Temp variables
|
|
gamevar tmp 0 0
|
|
gamevar px 0 0 // Player (both 1 and 2) X coordinate
|
|
gamevar py 0 0 // Player Y coordinate
|
|
gamevar pz 0 0 // Player Z coordinate
|
|
gamevar psect 0 0 // Player sector number
|
|
gamevar pang 0 0 // Player angle
|
|
gamevar phoriz 0 0 // Player vertical angle
|
|
gamevar phorizoff 0 0 // Something similar
|
|
gamevar pangcos 0 0 // Cosinus of player angle (used for player 2 movements)
|
|
gamevar pangsin 0 0 // Sinus of player angle
|
|
gamevar pinput 0 0 // Set to input, used in the PROCESSINPUT event
|
|
|
|
gamevar pcrosshair 0 0 // Do you like crosshairs? Game options will tell.
|
|
gamevar crossscale 0 0 // crosshair scale
|
|
gamevar pweapon 0 0 // Player weapon
|
|
|
|
gamevar p1heat 0 0 // Common night vision googles
|
|
gamevar p2heat 0 0
|
|
|
|
|
|
// Crosshair need to be redone for two players
|
|
onevent EVENT_DISPLAYCROSSHAIR
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
|
|
define KNEE_WEAPON 0
|
|
define PISTOL_WEAPON 1
|
|
define SHOTGUN_WEAPON 2
|
|
define CHAINGUN_WEAPON 3
|
|
define RPG_WEAPON 4
|
|
define HANDBOMB_WEAPON 5
|
|
define SHRINKER_WEAPON 6
|
|
define DEVISTATOR_WEAPON 7
|
|
define TRIPBOMB_WEAPON 8
|
|
define FREEZE_WEAPON 9
|
|
define HANDREMOTE_WEAPON 10
|
|
define GROW_WEAPON 11
|
|
|
|
// Next and previous weapon actions will never pick the expander.
|
|
onevent EVENT_NEXTWEAPON
|
|
getplayer[THISACTOR].curr_weapon pweapon
|
|
ifvare pweapon HANDBOMB_WEAPON // XXX: HANDREMOTE_WEAPON?
|
|
{
|
|
getplayer[THISACTOR].subweapon tmp
|
|
andvar tmp 0xfffff7ff
|
|
setplayer[THISACTOR].subweapon tmp
|
|
}
|
|
else ifvare pweapon SHRINKER_WEAPON
|
|
{
|
|
ifvarg player[THISACTOR].ammo_amount GROW_WEAPON 0
|
|
setvar RETURN SHRINKER_WEAPON // select expander
|
|
// else select next weapon
|
|
}
|
|
endevent
|
|
|
|
onevent EVENT_PREVIOUSWEAPON
|
|
getplayer[THISACTOR].curr_weapon pweapon
|
|
|
|
ifvare pweapon DEVISTATOR_WEAPON
|
|
{
|
|
ifvarg player[THISACTOR].ammo_amount GROW_WEAPON 0
|
|
{
|
|
getplayer[THISACTOR].subweapon tmp
|
|
orvar tmp 0x800
|
|
setplayer[THISACTOR].subweapon tmp
|
|
// select previous weapon
|
|
}
|
|
}
|
|
ifvare pweapon GROW_WEAPON
|
|
{
|
|
ifvarg player[THISACTOR].ammo_amount SHRINKER_WEAPON 0
|
|
setvar RETURN SHRINKER_WEAPON // select shrinker
|
|
// else select previous weapon
|
|
}
|
|
endevent
|
|
|
|
// Disable all the following keys, need room for player 2
|
|
onevent EVENT_LOOKUP // Move Forward
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_LOOKDOWN // Move Backward
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_LOOKLEFT // Turn Left
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_LOOKRIGHT // Turn Right
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_AIMUP // Aim Up
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_AIMDOWN // Aim Down
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY1 // Fire
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY2 // Open
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY3 // Jump
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY4 // Crouch
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY5 // Inventory
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY6 // Inventory Left
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY7 // Inventory Right
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY8 // Quick Kick
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY9 // Previous Weapon
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
onevent EVENT_WEAPKEY10 // Next Weapon
|
|
setvar RETURN -1
|
|
endevent
|
|
|
|
|
|
// Controls for player 2
|
|
onevent EVENT_PROCESSINPUT // I had to use this event in case player 1 die
|
|
getinput[THISACTOR].bits pinput
|
|
|
|
ifvarand pinput 8
|
|
{
|
|
setinput[pid].bits 8
|
|
ifvarl phoriz 199 addvar phoriz 14
|
|
setplayer[pid].horiz phoriz // For some reasons, only setting the bits won't work
|
|
}
|
|
ifvarand pinput 16
|
|
{
|
|
setinput[pid].bits 16
|
|
ifvarg phoriz 1 subvar phoriz 14
|
|
setplayer[pid].horiz phoriz
|
|
}
|
|
ifvarand pinput 64
|
|
{
|
|
setinput[pid].avel -20
|
|
}
|
|
ifvarand pinput 128
|
|
{
|
|
setinput[pid].avel 20
|
|
}
|
|
ifvarand pinput 8192 // This block and the following one are for moving forward and backward, with X and Y speeds set with help of sinus and cosinus
|
|
{
|
|
setvar RETURN -1
|
|
getplayer[pid].i pnum
|
|
getactor[pnum].ang pang
|
|
cos pangcos pang
|
|
mulvar pangcos 10
|
|
divvar pangcos 64
|
|
sin pangsin pang
|
|
mulvar pangsin 10
|
|
divvar pangsin 64
|
|
setinput[pid].fvel pangcos
|
|
setinput[pid].svel pangsin
|
|
}
|
|
ifvarand pinput 16384
|
|
{
|
|
setvar RETURN -1
|
|
getplayer[pid].i pnum
|
|
getactor[pnum].ang pang
|
|
cos pangcos pang
|
|
mulvar pangcos -10
|
|
divvar pangcos 64
|
|
sin pangsin pang
|
|
mulvar pangsin -10
|
|
divvar pangsin 64
|
|
setinput[pid].fvel pangcos
|
|
setinput[pid].svel pangsin
|
|
}
|
|
// Following code come from Eduke32 wiki
|
|
shiftvarr pinput 8
|
|
andvar pinput 0xF
|
|
switch pinput
|
|
case 1:
|
|
setinput[pid].bits 4
|
|
break
|
|
case 2:
|
|
setinput[pid].bits 536870912
|
|
break
|
|
case 3:
|
|
setinput[pid].bits 1
|
|
break
|
|
case 4:
|
|
setinput[pid].bits 2
|
|
break
|
|
case 5:
|
|
setinput[pid].bits 1073741824
|
|
break
|
|
case 6:
|
|
setinput[pid].bits 1048576
|
|
break
|
|
case 7:
|
|
setinput[pid].bits 134217728
|
|
break
|
|
case 8:
|
|
setinput[pid].bits 4194304
|
|
break
|
|
case 9:
|
|
setinput[pid].bits 2816
|
|
break
|
|
case 10:
|
|
setinput[pid].bits 3072
|
|
break
|
|
endswitch
|
|
endevent
|
|
|
|
|
|
// NOTE: status bar is displayed for both players (EDuke32 splitscreen hack)
|
|
|
|
|
|
// orientation bits for the crosshairs for left/right split
|
|
define ORIENT 1032 // 26
|
|
|
|
// gametext args
|
|
define P1X 4
|
|
define P2X 164
|
|
|
|
gamevar arg_player_id 0 0
|
|
|
|
state show_player_view
|
|
getplayer[arg_player_id].posx px
|
|
getplayer[arg_player_id].posy py
|
|
getplayer[arg_player_id].posz pz
|
|
getplayer[arg_player_id].ang pang
|
|
getplayer[arg_player_id].horiz phoriz
|
|
getplayer[arg_player_id].horizoff phorizoff
|
|
addvarvar phoriz phorizoff
|
|
|
|
// simulate corresponding part in G_DrawRooms (almost)
|
|
ifvarvare player[arg_player_id].spritebridge 0
|
|
{
|
|
setvarvar tmp player[arg_player_id].truecz
|
|
addvar tmp 1024
|
|
ifvarvarl pz tmp
|
|
setvarvar pz tmp
|
|
else
|
|
{
|
|
setvarvar tmp player[arg_player_id].truefz
|
|
subvar tmp 1024
|
|
ifvarvarg pz tmp
|
|
setvarvar pz tmp
|
|
}
|
|
}
|
|
|
|
getplayer[arg_player_id].cursectnum psect
|
|
|
|
ifvarg psect -1
|
|
{
|
|
getuserdef .screen_size tmp
|
|
|
|
ifvare tmp 0
|
|
{
|
|
// above/below split: first player is above
|
|
ifvare arg_player_id 0
|
|
showviewunbiased px py pz pang phoriz psect 0 0 319 100
|
|
else
|
|
showviewunbiased px py pz pang phoriz psect 0 100 319 199
|
|
}
|
|
else
|
|
{
|
|
// side by side split: first player is left
|
|
ifvare arg_player_id 0
|
|
showviewunbiased px py pz pang phoriz psect 0 0 160 199
|
|
else
|
|
showviewunbiased px py pz pang phoriz psect 160 0 319 199
|
|
}
|
|
}
|
|
ends
|
|
|
|
onevent EVENT_DISPLAYROOMS
|
|
setvar RETURN 1 // don't draw them
|
|
|
|
// an EDuke32 hack now:
|
|
// setplayer[THISACTOR].rotscrnang 0 // (almost) Prevent the screen rotation when player 1 die
|
|
|
|
// DRAW THE PLAYER VIEWS!
|
|
setvar arg_player_id 0
|
|
state show_player_view
|
|
setvar arg_player_id 1
|
|
state show_player_view
|
|
|
|
// Draw crosshairs if they are enabled
|
|
getuserdef[THISACTOR].crosshair pcrosshair
|
|
ifvare pcrosshair 1
|
|
{
|
|
getuserdef .crosshairscale crossscale
|
|
shiftvarl crossscale 16, divvar crossscale 100
|
|
|
|
getuserdef .screen_size tmp
|
|
ifvarn tmp 0
|
|
{
|
|
// left/right
|
|
|
|
rotatesprite 80 100 crossscale 0 CROSSHAIR 0 0 ORIENT 0 0 xdim ydim
|
|
rotatesprite 240 100 crossscale 0 CROSSHAIR 0 0 ORIENT 0 0 xdim ydim
|
|
}
|
|
else
|
|
{
|
|
// above/below
|
|
setvar tmp 8
|
|
rotatesprite 160 50 crossscale 0 CROSSHAIR 0 0 tmp 0 0 xdim ydim
|
|
rotatesprite 160 150 crossscale 0 CROSSHAIR 0 0 tmp 0 0 xdim ydim
|
|
}
|
|
}
|
|
|
|
|
|
// NOTE: weapons are drawn for both players now (EDuke32 hack)
|
|
endevent
|