// LADDER.CON - Advanced Player Movement Mechanics // Global Configuration Flags define MANTLING YES define DODGING YES define FREERUNNER YES define REALRUNNING YES define MANTCHECK 6 define MANTDIST 480 define DODGE_IMPULSE_MULTIPLIER 2 // Fator de escala para impulso de dodge define DODGE_DISTANCE 640 // Distância padrão para dodge // DEFINES FOR RUNNING: THESE DO NOTHING UNLESS REALRUNNING IS ON define SPEED1 45000 // the speed that you start at when you begin to run define SPEED2TIME 30 // the number of ticks of acceleration before reaching RUNNINGSPEED define RUNACCEL 256 // the rate of acceleration between SPEED1 and SPEED2 define LADDER 2951 define MOVEMENT 2952 define LADDER_CLIMB_SPEED -256 // Velocidade base de subida define LADDER_DETECT_DIST 480 // Distância para detectar escada (similar ao MANTDIST) define LADDER_STATE_NONE 0 define LADDER_STATE_CLIMBING 1 define LADDER_STATE_DISMOUNTING 2 define pforward 1 define pbackward 2 gamevar cannonid -1 1 gamevar sleeping 0 1 gamevar numallies 0 0 gamearray ptrails 100 gamevar ptrailtimer 0 1 gamevar dpsounds YES 0 // replaces some standard sounds gamevar menunag 1 1 gamevar nomenu 0 0 gamevar nagpos 900 1 gamevar menutoggle 0 1 gamevar ONCAR 0 1 // Player Movement Game Variables gamevar timer 0 0 gamevar canmantle MANTLING 0 gamevar mantling 0 1 gamevar mantwait 0 1 gamevar mantwaittime 0 1 gamevar mantcheck 0 1 gamevar mantz 0 1 gamevar jumped 0 1 gamevar backview 0 1 gamevar holding -1 1 gamevar pickup 0 1 gamevar holdingpic 0 1 gamevar drinksoda 0 1 gamevar monstflags 0 2 gamevar hitag 0 2 gamevar lotag 0 2 gamevar spriteid 0 0 gamevar monstatus 0 2 gamevar target -1 2 gamevar candodge DODGING 0 gamevar dodge 0 1 gamevar botdodge 0 2 gamevar dodgeagain 0 1 gamevar dodgeang 0 1 gamevar nofalldamage 0 1 gamevar ftap 0 1 gamevar fpresstime 0 1 gamevar btap 0 1 gamevar bpresstime 0 1 gamevar ltap 0 1 gamevar lpresstime 0 1 gamevar rtap 0 1 gamevar rpresstime 0 1 gamevar fhold 0 1 gamevar bhold 0 1 gamevar lhold 0 1 gamevar rhold 0 1 gamevar mx 0 0 gamevar my 0 0 gamevar mz 0 0 gamevar initx 0 2 gamevar inity 0 2 gamevar initz 0 2 gamevar walljump 0 1 gamevar jumptap 0 1 gamevar jumpadxvel 0 1 gamevar onladder 0 1 gamevar topladder 0 2 gamevar laddervel 0 1 gamevar lastladderx 0 1 gamevar lastladdery 0 1 gamevar laddersound -1 1 gamevar scaled NO 0 gamevar doubled NO 0 gamevar onblock 0 1 gamevar bits 0 1 gamevar thrust 0 1 gamevar extbits 0 1 gamevar fpress 0 1 gamevar bpress 0 1 gamevar mysector -1 2 gamevar mywall -1 2 gamevar underwater 0 2 gamevar xvel 0 0 gamevar yvel 0 0 gamevar zvel 0 0 gamevar tempc 0 0 gamevar tempd 0 0 gamevar tempe 0 0 gamevar zdist 0 0 gamevar xydist 0 0 gamevar xydist2 0 0 gamevar angvar 0 0 gamevar canseeplayer 0 2 gamevar canshootplayer 0 2 gamevar mysin 0 1 gamevar mycos 0 1 gamevar hitsector 0 1 gamevar hitwall 0 1 gamevar hitwall2 0 1 gamevar nextsector 0 1 gamevar hitsprite -1 1 gamevar scannedsprite -1 1 gamevar hitx 0 2 gamevar hity 0 2 gamevar hitz 0 2 gamevar clipmask 4294901808 0 gamevar hp 0 2 gamevar slowrunaccel REALRUNNING 0 gamevar pspeed 0 1 gamevar camshake 0 1 gamevar runcount 0 1 gamevar runflag 0 1 gamevar strafedir 0 1 gamevar laststrafedir 0 1 gamevar forbackdir 0 1 gamevar lastforbackdir 0 1 gamevar oposxv 0 1 // velocities from last tick gamevar oposyv 0 1 gamevar oposzv 0 1 gamevar offground 0 1 // counter gamevar weight 0 2 gamevar activator 0 2 gamevar initshade 0 2 gamevar playerally 0 2 gamevar pal 0 2 gamevar peractor1 0 2 gamevar peractor2 0 2 gamevar peractor3 0 2 gamevar fallflag 0 2 gamevar peractor4 0 2 gamevar peractor5 0 2 gamevar peractor6 0 2 gamevar peractor7 0 2 gamevar target2 -1 2 gamevar intensity 0 2 gamevar mtype 0 2 gamevar countvar 0 2 gamevar countvarb 0 2 gamevar myspawner -1 2 gamevar teleported 0 2 gamevar digx 0 1 gamevar digy 0 1 gamevar digz 0 1 gamevar orientation 0 1 gamevar shade 0 1 gamevar superkicking 0 1 gamevar superkickdone 0 1 gamevar spinkick 0 1 gamevar reversekick 0 1 gamevar kicktarg -1 1 gamevar kickimpact 0 1 // set when the kick hits an enemy, so it only hits them once define KENERGY 780 //650 gamevar kickenergy KENERGY 1 //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// state pythagoras // Calculates distance between (x,y) and (hitx,hity), puts result in xydist setvarvar xydist x subvarvar xydist hitx mulvarvar xydist xydist setvarvar tempb y subvarvar tempb hity mulvarvar tempb tempb addvarvar xydist tempb sqrt xydist xydist ends //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// state laddercode { ifaction PSTAND nullop else action PSTAND ifp ponground setvar bpress 0 setplayer[THISACTOR].falling_counter 0 // Se o jogador estiver pressionando para cima ou para baixo ifvare fpress 0 ifvare bpress 0 { setvar laddervel -256 // Define a velocidade de subida getplayer[THISACTOR].posx lastladderx getplayer[THISACTOR].posy lastladdery } else { ifvarn laddersound -1 soundoncevar laddersound getplayer[THISACTOR].posz z updatesectorz lastladderx lastladdery z mysector ifvarn mysector -1 { setplayer[THISACTOR].posx lastladderx setplayer[THISACTOR].posy lastladdery getplayer[THISACTOR].i spriteid setactor[spriteid].x lastladderx setactor[spriteid].y lastladdery } } ifp ponground { ifvarg laddervel 0 setvar laddervel 0 } else { setplayer[THISACTOR].posxv 0 setplayer[THISACTOR].posyv 0 } // Ajusta a posição Z do jogador subvar onladder 1 setplayer[THISACTOR].poszv laddervel // Se o jogador não estiver mais na escada, reseta a variável ifvare onladder 0 { setvar onladder 0 } } ends //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// state checkwall // checks to see if there is a close wall to grab onto // mantling will be set to 1 if the answer is yes, 0 otherwise setvar mantling 0 getactor[THISACTOR].z z getactor[THISACTOR].x x getactor[THISACTOR].y y getactor[THISACTOR].sectnum mysector getactor[THISACTOR].ang angvar setvar zdist 0 cos mycos angvar sin mysin angvar hitscan x y z mysector mycos mysin zdist hitsector hitwall hitsprite hitx hity hitz clipmask state pythagoras setvarvar xydist2 xydist // saves the distance subvar z 1536 hitscan x y z mysector mycos mysin zdist hitsector hitwall2 hitsprite hitx hity hitz clipmask state pythagoras subvar z 4096 setvar hp 10 whilevarn hp 0 { setvar initcstat 1 hitscan x y z mysector mycos mysin zdist hitsector hitwall hitsprite hitx hity hitz clipmask state pythagoras ifvarn hitsprite -1 ifvarl xydist MANTDIST getactor[hitsprite].cstat initcstat setvarvar xydist2 xydist subvar z 512 //256 hitscan x y z mysector mycos mysin zdist hitsector hitwall2 hitsprite hitx hity hitz clipmask state pythagoras ifvarn hitsprite -1 ifvarl xydist MANTDIST { getactor[hitsprite].picnum picnum ifvarn picnum BGRATE1 ifvarn picnum FANSPRITEBROKE getactor[hitsprite].cstat initcstat } ifvarg xydist2 MANTDIST nullop else ifvare hitsprite -1 ifvare hitwall -1 nullop else ifvarn hitwall -1 ifvarvare hitwall hitwall2 nullop else ifvarand initcstat 1 { ifvarvarg xydist xydist2 { setvar mantling 1 ifvare hitsprite -1 setvar mantling 1 else { getactor[hitsprite].cstat tempb ifvarand tempb 32768 nullop else ifvarand tempb 1 setvar mantling 1 } } else ifvarn hitsprite -1 { ifvare picnum BGRATE1 setvar mantling 1 ifvare picnum FANSPRITEBROKE setvar mantling 1 } } subvar hp 1 ifvare mantling 1 setvar hp 0 //10 subvar z 512 // 256 } ends //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// state ladderinteraction { // Lógica de interação com a escada ifvarg fpress 0 subvar fpress 1 ifvarg bpress 0 subvar bpress 1 ifvarl onladder 0 addvar onladder 1 ifvarg onladder 0 state laddercode ifp ponground setvar nofalldamage 0 ifvarn nofalldamage 0 setplayer[THISACTOR].falling_counter 0 ifvarg bhold 7 { setvar btap 0 setvar bhold 0 } ifvarg fhold 7 { setvar ftap 0 setvar fhold 0 } ifvarg lhold 7 { setvar ltap 0 setvar lhold 0 } ifvarg rhold 7 { setvar rtap 0 setvar rhold 0 } ifvarvarn timer fpresstime setvar fhold 0 ifvarvarn timer bpresstime setvar bhold 0 setvarvar tempb timer subvarvar tempb fpresstime ifvarg tempb 4 setvar ftap 0 setvarvar tempb timer subvarvar tempb bpresstime ifvarg tempb 4 setvar btap 0 setvarvar tempb timer subvarvar tempb lpresstime ifvarg tempb 4 setvar ltap 0 setvarvar tempb timer subvarvar tempb rpresstime ifvarg tempb 4 setvar rtap 0 } ends //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// eventloadactor LADDER { getactor[THISACTOR].extra monstflags ifvare monstflags 1 setactor[THISACTOR].cstat 32768 setactor[THISACTOR].extra -1 getactor[THISACTOR].hitag hitag getactor[THISACTOR].lotag lotag } enda //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// onevent EVENT_GAME { getactor[THISACTOR].picnum picnum switch picnum { case LADDER { ifvare monstflags 1 { ifvare monstatus 0 { setvar monstatus 1 setvar temp 0 whilevarn temp 16384 { getactor[temp].picnum picnum ifvare picnum LADDER ifvarvarn temp THISACTOR { getactorvar[temp].monstflags tempb ifvare tempb 1 { getactorvar[temp].hitag tempc ifvarvare hitag tempc { setvarvar myspawner temp setvar monstatus 1 setvar temp 16383 getactor[THISACTOR].z z getactor[myspawner].z mz ifvarvarg z mz { setvar mtype 1 setvarvar topladder mz } } } } addvar temp 1 } } ifvare mtype 1 ifvare dodge 0 { getplayer[THISACTOR].posz mz ifp pducking subvar mz 4096 getactor[THISACTOR].z z addvar z 1024 ifvarvarg mz topladder ifvarvarl mz z { getplayer[THISACTOR].i target ldist xydist THISACTOR target ifangdiffl 384 ifvarl xydist 384 { ifvare onladder 0 { getplayer[THISACTOR].posx lastladderx getplayer[THISACTOR].posy lastladdery } setvar onladder 3 ifvarn lotag 0 setvarvar laddersound lotag else setvar laddersound -1 } } } } break } case APLAYER // Verifica se é o ator APLAYER { ifvarg onladder 0 state ladderinteraction break } } endswitch } endevent //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// onevent EVENT_MOVEFORWARD { setvar fpress 2 ifp prunning setvar runflag 2 setvar forbackdir 2 ifvarg onladder 0 ifp palive { setvar RETURN -1 ifp ponground { getplayer[THISACTOR].posz z subvar z 1024 setplayer[THISACTOR].posz z addvar z 8192 getplayer[THISACTOR].i temp setactor[temp].z z setplayer[THISACTOR].jumping_counter 901 } setvar temp RUNNINGSPEED divvar temp -50 setvarvar laddervel temp } else // Se o jogador estiver na escada { // Impede que o jogador pule ou se mova para frente enquanto estiver na escada setvar fpress 0 setvar forbackdir 0 } addvar fpresstime 1 ifvarvare timer fpresstime addvar fhold 1 else { addvar ftap 1 setvar fhold 0 } setvarvar fpresstime timer } endevent //////////////////////////////////////////////////////////////////////////////////////////////////// onevent EVENT_MOVEBACKWARD setvar bpress 2 ifp prunning setvar runflag 2 setvar forbackdir -2 ifvarg onladder 0 ifp palive { setvar RETURN -1 setvar temp RUNNINGSPEED divvar temp 50 subvar temp 512 setvarvar laddervel temp } addvar bpresstime 1 ifvarvare timer bpresstime addvar bhold 1 else { addvar btap 1 setvar bhold 0 ifvarg ftap 1 setvarvar fpresstime timer } setvarvar bpresstime timer endevent //////////////////////////////////////////////////////////////////////////////////////////////////// onevent EVENT_JUMP { setvar cannonid -1 ifvarg underwater 0 { setvar RETURN -1 break } // Impede o pulo se o jogador estiver na escada ifvarg onladder 0 { setvar jumped 1 ifvarg numallies 0 { setvarvar tempd RETURN getplayer[THISACTOR].posz z addvar z 4096 setactor[RETURN].z z setvar ptrailtimer 0 setactorvar[RETURN].mtype 1 setvarvar RETURN tempd } ifvarg dodge 0 addvar dodge 10 ifvare dpsounds YES { randvar temp 2 ifvare temp 0 sound JUMP5 else ifvare temp 1 sound JUMP2 else sound JUMP2 } } } endevent //////////////////////////////////////////////////////////////////////////////////////////////////// onevent EVENT_PROCESSINPUT { getinput[THISACTOR].bits bits getinput[THISACTOR].extbits extbits ife player[].hard_landing 0 ifvarand bits 1 // jumping { ifvarg underwater 0 ifvare mantling 0 ifvare onladder 0 { getplayer[THISACTOR].posz z addvar z 3072 ifvarvarg z peractor2 { ifvarand bits 2 nullop else getplayer[THISACTOR].poszv zvel subvar zvel 384 ifvarl zvel -1024 setvar zvel -1024 setplayer[THISACTOR].poszv zvel } ifp ponground { getplayer[THISACTOR].posz z subvar z 128 setplayer[THISACTOR].posz z setplayer[THISACTOR].jumping_counter 181 setplayer[THISACTOR].jumping_toggle 1 setvar jumped 1 } } ifvare mantling 1 ifvarvarg mantwait mantwaittime setvar mantling 2 ifvarg onladder 0 { setvar onladder -6 setplayer[THISACTOR].jumping_toggle 1 } } ifvarand bits 2 // crouching { ifvare mantling 1 setvar mantling -10 ifvarg underwater 0 { getplayer[THISACTOR].poszv zvel addvar zvel 640 ifvarg zvel 768 setvar zvel 768 setplayer[THISACTOR].poszv zvel } } } endevent //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// useractor notenemy JUMPAD 0 { ifvare DODGING NO break ifvarn lotag 1 break cstat 32768 getplayer[THISACTOR].i spriteid ldist xydist THISACTOR spriteid ifvarvarl xydist hitag { getplayer[THISACTOR].falling_counter temp ifvarg temp 8 { ifpdistg 1536 setvar temp 0 } else { ifpdistl 1024 setvar temp 1 else ifpdistl 8192 ifvarn dodge 0 setvar temp 1 else setvar temp 0 } ifvarn temp 0 { getplayer[THISACTOR].i spriteid getactor[spriteid].z mz subvar mz 8192 setactor[spriteid].z mz getplayer[THISACTOR].posz z subvar z 8192 setplayer[THISACTOR].posz z setplayer[THISACTOR].jumping_counter 0 setplayer[THISACTOR].jumping_toggle 0 setplayer[THISACTOR].poszv initz getplayer[THISACTOR].ang angvar cos xvel angvar sin yvel angvar mulvar xvel 256 // Impulso horizontal mulvar yvel 256 // Impulso horizontal setplayer[THISACTOR].posxv xvel setplayer[THISACTOR].posyv yvel getactor[THISACTOR].ang dodgeang setvarvar dodge inity setvarvar jumpadxvel initx setplayer[THISACTOR].falling_counter 0 setvar nofalldamage 1 soundonce LAUNCHSND setvar onladder 0 // Reseta a variável de escada setvar inity 0 // Reseta a velocidade inicial Y setvar initx 0 // Reseta a velocidade inicial X setvar initz -4096 // Reseta a velocidade inicial Z } } ifvare candodge YES { // Verificações adicionais de dodge ifvarn dodge 0 { // Lógica de impulso de dodge setvarvar jumpadxvel initx mulvar jumpadxvel DODGE_IMPULSE_MULTIPLIER // Reduzir velocidade vertical durante dodge divvar initz 2 } } } enda //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// eventloadactor JUMPAD { readgamevar scaled getactor[THISACTOR].extra monstflags ifvare monstflags -1 setvar monstflags 0 getactor[THISACTOR].lotag lotag getactor[THISACTOR].hitag hitag // Default hitag if not set ifvare hitag 0 setvar hitag 640 // Initialize velocity components getactor[THISACTOR].yvel inity getactor[THISACTOR].xvel initx ifvare inity 0 setvar inity 26 getactor[THISACTOR].zvel initz mulvar initz -8 ifvare scaled YES { // More controlled scaling mulvar initx 1.5 // Less aggressive horizontal scaling mulvar initz 2 // More vertical boost } // Ensure minimum and maximum velocity limits ifvarg initx 1024 setvar initx 1024 ifvarg initz 512 setvar initz 512 // Optional scaling for jump pad ifvare scaled YES { mulvar initx 2 mulvar initz 3 divvar initz 2 } ifvare candodge YES { // Opcional: Escalar velocidade de dodge ifvarn jumpadxvel 0 { mulvarvar xvel jumpadxvel mulvarvar yvel jumpadxvel } // Cálculo de ângulo de dodge getincangle dodgeang angvar sprite[spriteid].ang } } enda