raze-gles/polymer/eduke32/package/sdk/samples/splitscr.con

371 lines
8.9 KiB
Plaintext

/*
--------------------------------------------------------------------------------
Duke Nukem 3D SplitScreen mod
Beta 1
By Bloodclaw
Modified from original for use with EDuke32 SVN.
Usage: eduke32 splitscr.con -q2
--------------------------------------------------------------------------------
*/
include GAME.CON
// 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