Created
March 10, 2015 07:00
-
-
Save pqr/956a3229944ec14c3cc5 to your computer and use it in GitHub Desktop.
Revisions
-
pqr created this gist
Mar 10, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,1071 @@ Нфк код физики 075 Писалось сами знаете когда ;) в детстве. Мне стыдно :) но сами просили... // ----------------------------------------------------------------------------- procedure playermove(i : byte); var Msg: TMP_IamRespawn; Msg2: TMP_GauntletState; Msg3: TMP_SoundData; Msg4: TMP_049t4_ShaftEnd; Msg5: TMP_SV_PlayerRespawn; MsgSize : word; e: integer; SPEED:byte; nwse:boolean; begin if players[i] = nil then exit; if not MATCH_DDEMOPLAY then if (players[i].health <= 0) and (players[i].dead = 0) then begin // kill prayer (ANIM ONLY). and DEAD := 2 herre; players[i].dead := 1; players[i].frame := 0; players[i].respawn := OPT_FORCERESPAWN*50; if (players[i].idd = 2) and (bp_donotrespawn_bots) then players[i].respawn := $FFFF; players[i].gantl_state := 0; players[i].gantl_s := 0; if (MATCH_GAMETYPE=GAMETYPE_TRIXARENA) and (OPT_TRIXMASTA) and (MATCH_STARTSIN=0) then applyHcommand('restart'); end; // if players[i].loadframe>0 then dec(players[i].loadframe) else players[i].loadframe:=23; // hack.. fix a bug. if players[i].justrespawned >50 then players[i].justrespawned:=50; if players[i].justrespawned >0 then dec(players[i].justrespawned); if players[i].justrespawned2>0 then dec(players[i].justrespawned2); // rotating machinegun. if players[i].mgfiretime > STIME then begin if players[i].mgspeed < 30 then inc (players[i].mgspeed); end else if players[i].mgspeed > 0 then dec (players[i].mgspeed); if (players[i].mgnextframetime < STIME) and (players[i].mgspeed > 0) then begin players[i].mgnextframetime := STIME + 70 - round(players[i].mgspeed * 1.5); inc( players[i].mgframe ); if players[i].mgframe >= 6 then players[i].mgframe := 0; end; players[i].Location := GetPlayerLocation(I); if players[i].netobject = true then begin playerphysic(i); // special timing for net. or demo player. if players[i].shaftsttime>0 then dec(players[i].shaftsttime); if players[i].inlava>0 then dec(players[i].inlava); if players[i].paintime>0 then dec(players[i].paintime); if players[i].hitsnd>0 then dec(players[i].hitsnd); if players[i].rewardtime > 0 then dec(players[i].rewardtime); if players[i].excellent > 0 then dec(players[i].excellent); if players[i].gantl_s > 0 then dec(players[i].gantl_s); if players[i].netnosignal < $FFFF then inc(players[i].netnosignal); if players[i].netnosignal > 150 then players[i].netupdated := False; // kickin, disconnectin, droppin. if players[i].gantl_refire > 0 then dec(players[i].gantl_refire); if players[i].item_quad_time>0 then dec(players[i].item_quad_time); if players[i].item_regen_time> 0 then dec(players[i].item_regen_time); if players[i].item_battle_time> 0 then dec(players[i].item_battle_time); if players[i].item_flight_time> 0 then dec(players[i].item_flight_time); if players[i].item_haste > 0 then begin if players[i].item_haste_time = 0 then begin SpawnSmoke(round(players[i].x),round(players[i].y+20)); players[i].item_haste_time := 5; end else dec(players[i].item_haste_time); end; if players[i].weapon = 0 then begin // gauntlet; if players[i].gantl_state > 0 then if players[i].gantl_refire = 0 then FireGauntlet(players[i]); if players[i].gantl_state > 0 then if players[i].gantl_s = 0 then begin if players[i].gauntl_s_order=0 then begin playsound(SND_gauntl_r1,players[i].x,players[i].y); players[i].gauntl_s_order := 1; end else begin playsound(SND_gauntl_r2,players[i].x,players[i].y); players[i].gauntl_s_order := 0; end; players[i].gantl_s := 12; end; if players[i].gantl_state > 0 then inc(players[i].gantl_state); if players[i].gantl_state > 3 then players[i].gantl_state := 1; end; exit; end; if (MATCH_GAMEEND) then begin playerphysic(i); // stop players at gameend. if (players[i].InertiaX = 0) and (players[i].InertiaX = 0) then begin if players[i].dir = 0 then players[i].dir := 2; if players[i].dir = 1 then players[i].dir := 3; end; exit; end; playerphysic(i); // timing if players[i].weapchg > 0 then dec(players[i].weapchg); if players[i].rewardtime > 0 then dec(players[i].rewardtime); if players[i].excellent > 0 then dec(players[i].excellent); if players[i].refire > 0 then dec(players[i].refire); if players[i].doublejump>0 then dec(players[i].doublejump); if players[i].shaftsttime>0 then dec(players[i].shaftsttime); if players[i].ammo_snd>0 then dec(players[i].ammo_snd); if players[i].inlava>0 then dec(players[i].inlava); if players[i].paintime>0 then dec(players[i].paintime); if players[i].hitsnd>0 then dec(players[i].hitsnd); if players[i].item_quad_time>0 then dec(players[i].item_quad_time); if players[i].item_regen_time> 0 then dec(players[i].item_regen_time); if players[i].item_battle_time> 0 then dec(players[i].item_battle_time); if players[i].item_flight_time> 0 then dec(players[i].item_flight_time); if players[i].gantl_s > 0 then dec(players[i].gantl_s); if players[i].gantl_refire > 0 then dec(players[i].gantl_refire); if not MATCH_DDEMOPLAY then begin// respawn to demo if(players[i].dead >= 1) then if players[i].respawn > 0 then dec(players[i].respawn); end; if players[i].dead > 0 then // if players[i].ammo_mg <> 255 then if players[i].respawn = 0 then begin // resetplayer(players[i]); if (ismultip=2) and ((players[i].ammo_mg < 255) or (players[i].clientrespawntimeout < gettickcount)) then begin players[i].ammo_mg := 255; // avoid double packed send. MsgSize := SizeOf(TMP_IamRespawn); Msg.Data := MMP_IAMRESPAWN; Msg.DXID := players[i].dxid; mainform.BNETSendData2HOST(Msg, MsgSize,net_Guaranteed); players[i].clientrespawntimeout := gettickcount + 3000; // avoid cant respawn bug. end else if ismultip=1 then begin resetplayer(players[i]); FindRespawnPoint(players[i], false); // setrespawn point here; MsgSize := SizeOf(TMP_SV_PlayerRespawn); Msg5.Data := MMP_PLAYERRESPAWN; Msg5.DXID := players[i].dxid; Msg5.x := SPAWNX; Msg5.y := SPAWNY; mainform.BNETSendData2All(Msg5,MsgSize,net_Guaranteed); end else if (ismultip<>2) then begin resetplayer(players[i]); FindRespawnPoint(players[i],false); // setrespawn point here; end; end; if players[i].dead > 0 then begin if (((ISKEY(CTRL_FIRE) and (players[i].control=1)) or ((ISKEY(CTRL_P2FIRE)) and (players[i].control=2)))) or ((players[i].idd = 2) and (players[i].keys and BKEY_FIRE=BKEY_FIRE)) then if players[i].respawn >= 3 then if players[i].respawn < OPT_FORCERESPAWN*50 - OPT_MINRESPAWNTIME then begin players[i].respawn := 2; players[i].refire := 25; end; exit; end; if (players[i].idd <>2) then if (INCONSOLE) or (INGAMEMENU) or (INCHATPOPUP) then begin ClipTriggers(players[i]); if players[i].dir < 2 then players[i].dir := players[i].dir+2; setcrosshairpos(players[i], trunc(players[i].x),trunc(players[i].y), players[i].clippixel,true); exit; end; if isparamstr('+showinput') then begin for e := 1 to 255 do if mainform.dxinput.Keyboard.Keys [e] then addmessage('KEY-'+chr(e)+'-'+inttostr(e)); end; if MATCH_DDEMOPLAY then exit; if (players[i].control = 1) then begin // up and down crosshair height; crossheight var is used as clippixel if (OPT_P1MOUSELOOK) then begin if OPT_MROTATED=false then begin e := mainform.dxinput.Mouse.y; if OPT_MINVERT then e:=-e; end else begin e := mainform.dxinput.Mouse.x; if OPT_MINVERT then e:=-e; end; if e > 0 then begin if OPT_MOUSESMOOTH > 0 then if e > 0 then if e > OPT_MOUSESMOOTH then e := OPT_MOUSESMOOTH; players[i].clippixel := players[i].clippixel + (e / (10-OPT_SENS)) + (e * OPT_MOUSEACCELDELIM/(10-OPT_SENS) / 10); if players[i].clippixel > CROSHDIST+CROSHADD then players[i].clippixel := CROSHDIST+CROSHADD; end; if e < 0 then begin if OPT_MOUSESMOOTH > 0 then if e < 0 then if e < -OPT_MOUSESMOOTH then e := -OPT_MOUSESMOOTH; players[i].clippixel := players[i].clippixel + (e / (10-OPT_SENS)) + (e * OPT_MOUSEACCELDELIM/(10-OPT_SENS) / 10); if players[i].clippixel < -CROSHDIST-CROSHADD then players[i].clippixel := -CROSHDIST-CROSHADD; end; end; // if (not (OPT_P1MOUSELOOK)) OR (NOT((ISKEY(CTRL_LOOKUP) and ISKEY(CTRL_LOOKDOWN)) then // if not ) then if not (OPT_P1MOUSELOOK) THEN IF NOT (ISKEY(CTRL_LOOKUP) and ISKEY(CTRL_LOOKDOWN)) THEN begin if OPT_P1KEYBACCELDELIM > 0 then begin if ISKEY(CTRL_LOOKUP) then begin players[i].clippixel := players[i].clippixel - (OPT_SENS+pkeyaccel div (10-OPT_P1KEYBACCELDELIM)); if pkeyaccel1 = 1 then inc(pkeyaccel) else pkeyaccel := 0; pkeyaccel1 := 1;end else if ISKEY(CTRL_LOOKDOWN) then begin players[i].clippixel := players[i].clippixel + (OPT_SENS+pkeyaccel div (10-OPT_P1KEYBACCELDELIM)); if pkeyaccel1 = 0 then inc(pkeyaccel) else pkeyaccel := 0; pkeyaccel1 := 0;end else pkeyaccel := 0; if pkeyaccel > (10-OPT_P1KEYBACCELDELIM)*10 then pkeyaccel := (10-OPT_P1KEYBACCELDELIM)*10; end else begin if ISKEY(CTRL_LOOKUP) then begin players[i].clippixel := players[i].clippixel - OPT_SENS end else if ISKEY(CTRL_LOOKDOWN) then begin players[i].clippixel := players[i].clippixel + OPT_SENS end; end; if players[i].clippixel > CROSHDIST+CROSHADD then players[i].clippixel := CROSHDIST+CROSHADD; if players[i].clippixel < -CROSHDIST-CROSHADD then players[i].clippixel := -CROSHDIST-CROSHADD; end; if ISKEY(CTRL_CENTER) then begin pkeyaccel := 0; players[i].clippixel := 0; end; end; if (players[i].control = 2) and (players[i].netobject = false) then if not (ISKEY(CTRL_P2LOOKUP) and ISKEY(CTRL_P2LOOKDOWN)) then begin // local second prayer. keyboard. if OPT_KEYBACCELDELIM > 0 then begin if ISKEY(CTRL_P2LOOKUP) then begin players[i].clippixel := players[i].clippixel - (OPT_KSENS+keyaccel div (10-OPT_KEYBACCELDELIM)); if keyaccel1 = 1 then inc(keyaccel) else keyaccel := 0; keyaccel1 := 1;end else if ISKEY(CTRL_P2LOOKDOWN) then begin players[i].clippixel := players[i].clippixel + (OPT_KSENS+keyaccel div (10-OPT_KEYBACCELDELIM)); if keyaccel1 = 0 then inc(keyaccel) else keyaccel := 0; keyaccel1 := 0;end else keyaccel := 0; if keyaccel > (10-OPT_KEYBACCELDELIM)*10 then keyaccel := (10-OPT_KEYBACCELDELIM)*10; end else begin if ISKEY(CTRL_P2LOOKUP) then begin players[i].clippixel := players[i].clippixel - OPT_KSENS end else if ISKEY(CTRL_P2LOOKDOWN) then begin players[i].clippixel := players[i].clippixel + OPT_KSENS end; end; if players[i].clippixel > CROSHDIST+CROSHADD then players[i].clippixel := CROSHDIST+CROSHADD; if players[i].clippixel < -CROSHDIST-CROSHADD then players[i].clippixel := -CROSHDIST-CROSHADD; end; if (players[i].control = 2) then if ISKEY(CTRL_P2CENTER) then begin keyaccel := 0; players[i].clippixel := 0; end; if (isonground(players[i])) then players[i].inertiay := 0; // really nice thing :) // team movement block. if TeamGame then if SYS_TEAMSELECT>0 then exit; if (( (ISKEY(CTRL_MOVEUP)) and (players[i].control=1)) or ((ISKEY(CTRL_P2MOVEUP)) and (players[i].control=2))) or ( (players[i].idd=2) and (players[i].keys and BKEY_MOVEUP = BKEY_MOVEUP) ) // bot then // JUMP! begin if (IsWaterContent(players[i])) or (IsWaterContentJUMP(players[i])) then begin players[i].inertiay := -1.5; end else if (isonground(players[i]) = false) and (brickonhead(players[i]) = false) and (players[i].item_flight > 0) then begin players[i].inertiay := -2; players[i].crouch := false; if players[i].item_flight_time = 0 then begin playsound(SND_flight,players[i].x,players[i].y); players[i].item_flight_time := 35; if ismultip>0 then begin MsgSize := SizeOf(TMP_SoundData); Msg3.Data := MMP_SENDSOUND; Msg3.DXID := players[i].dxid; Msg3.SoundType := 1; // flight code; if ismultip=1 then mainform.BNETSendData2All(Msg3, MsgSize, 0) else mainform.BNETSendData2HOST(Msg3, MsgSize, 0); end; if MATCH_DRECORD then begin DData.type0 := DDEMO_FLIGHTSOUND; DData.gametic := gametic; DData.gametime := gametime; DFlightSound.x := round(players[i].x); DFlightSound.y := round(players[i].y); DemoStream.Write( DData, Sizeof(DData)); DemoStream.Write( DFlightSound, Sizeof(DFlightSound)); end; end; end ELSE if ( (isonground(players[i])) or (isDoubleJumpPossible(players[i])) ) and (brickonhead(players[i]) = false) then begin if(players[i].doublejump > 4) then // double jumpz begin players[i].doublejump := 14; players[i].inertiay := -3; players[i].crouch := false; end else begin if players[i].doublejump = 0 then begin players[i].doublejump := 14; playsound(players[i].SND_Jump,players[i].x,players[i].y); if ismultip>0 then begin MsgSize := SizeOf(TMP_SoundData); Msg3.Data := MMP_SENDSOUND; Msg3.DXID := players[i].dxid; Msg3.SoundType := 0; // jump code; if ismultip=1 then mainform.BNETSendData2All(Msg3, MsgSize, 0) else mainform.BNETSendData2HOST(Msg3, MsgSize, 0); end; if MATCH_DRECORD then begin DData.type0 := DDEMO_JUMPSOUND; DData.gametic := gametic; DData.gametime := gametime; DPlayerJump.dxid := players[i].dxid; DemoStream.Write( DData, Sizeof(DData)); DemoStream.Write( DPlayerJump, Sizeof(DPlayerJump)); end; end; if CON_SIMPLEPHYSICS = true then players[i].inertiay := -2.9 else players[i].inertiay := -2; end; end; end; // CROUCH if not (( (ISKEY(CTRL_MOVEUP)) and (players[i].control=1)) or ((ISKEY(CTRL_P2MOVEUP)) and (players[i].control=2))) then if ((ISKEY(CTRL_MOVEDOWN) and (players[i].control=1)) or ((ISKEY(CTRL_P2MOVEDOWN)) and (players[i].control=2))) then begin if (IsOnground(players[i])) then players[i].crouch := true; end else if not BrickCrouchOnHead(players[i]) then players[i].crouch := false; // bot crouch..& wpn change. fire if players[i].idd = 2 then begin if players[i].keys and BKEY_MOVEUP <> BKEY_MOVEUP then if players[i].keys and BKEY_MOVEDOWN = BKEY_MOVEDOWN then begin if (IsOnground(players[i])) then players[i].crouch := true; end else if not BrickCrouchOnHead(players[i]) then players[i].crouch := false; if (players[i].refire = 0) and (players[i].weapon <> players[i].threadweapon) then players[i].weapon := players[i].threadweapon; if players[i].refire = 0 then if players[i].keys and BKEY_FIRE = BKEY_FIRE then Fire(players[i],players[i].x,players[i].y,90); end; if (BrickCrouchOnHead(players[i])=false) and (IsOnground(players[i])=false) then players[i].crouch := false; if OPT_TREADWEAPON then begin if (players[i].refire = 0) and (players[i].weapon <> players[i].threadweapon) then begin players[i].weapon := players[i].threadweapon; DoWeapBar(i); end; end; // player fire if players[i].weapchg = 0 then if ((ISKEY(CTRL_FIRE) and (players[i].control=1)) or ((ISKEY(CTRL_P2FIRE)) and (players[i].control=2))) then begin if players[i].refire = 0 then Fire(players[i],players[i].x,players[i].y,90); // Disable Shaft Firing. end else if players[i].shaft_state > 0 then begin players[i].shaft_state := 0; // addmessage('^5SEND: MMP_049test4_SHAFT_END'); if (ismultip>0) then begin MsgSize := SizeOf(TMP_049t4_ShaftEnd); Msg4.Data := MMP_049test4_SHAFT_END; Msg4.DXID := players[i].dxid; if ismultip=2 then mainform.BNETSendData2HOST(Msg4, MsgSize,0) else mainform.BNETSendData2All(Msg4, MsgSize,0); end; if MATCH_DRECORD then begin DData.type0 := DDEMO_NEW_SHAFTEND; DData.gametic := gametic; DData.gametime := gametime; // addmessage('recording: DDEMO_NEW_SHAFTEND'); D_049t4_ShaftEnd.DXID := players[i].DXID; DemoStream.Write(DData, Sizeof(DData)); DemoStream.Write(D_049t4_ShaftEnd, Sizeof(D_049t4_ShaftEnd)); end; end; // disable gauntlet BZZZZZZZ. if (players[i].refire = 0) then if players[i].gantl_state > 0 then begin players[i].gantl_state := 0; // send gauntlet off packet if ismultip>0 then if (players[i].netobject =false) then begin MsgSize := SizeOf(TMP_GauntletState); Msg2.DATA := MMP_GAUNTLETSTATE; Msg2.DXID := Players[i].DXID; Msg2.state := false; // off gauntlet if ismultip=1 then mainform.BNETSendData2All(Msg2,MsgSize,0) else mainform.BNETSendData2HOST(Msg2,MsgSize,0); end; if MATCH_DRECORD then begin DData.type0 := DDEMO_GAUNTLETSTATE; DData.gametic := gametic; DData.gametime := gametime; DGauntletState.DXID := players[i].DXID; DGauntletState.State := 0; DemoStream.Write( DData, Sizeof(DData)); DemoStream.Write( DGauntletState, Sizeof(DGauntletState)); end; end; // next weapon if ((ISKEY(CTRL_NEXTWEAPON)) and (players[i].control=1) and (players[i].weapchg = 0)) or // nextweapon ((ISKEY(CTRL_P2NEXTWEAPON)) and (players[i].control=2) and (players[i].weapchg = 0)) then begin if players[i].control=1 then nwse := OPT_P1NEXTWPNSKIPEMPTY else if players[i].control=2 then nwse := OPT_P2NEXTWPNSKIPEMPTY; with players[i] do begin inc(threadweapon); if (threadweapon = 1) and ((have_mg = false) or ((ammo_mg=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 2) and ((have_sg = false) or ((ammo_sg=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 3) and ((have_gl = false) or ((ammo_gl=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 4) and ((have_rl = false) or ((ammo_rl=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 5) and ((have_sh = false) or ((ammo_sh=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 6) and ((have_rg = false) or ((ammo_rg=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 7) and ((have_pl = false) or ((ammo_pl=0) and (nwse=true)) ) then inc(threadweapon); if (threadweapon = 8) and ((have_bfg = false) or ((ammo_bfg=0) and (nwse=true)) ) then inc(threadweapon); if threadweapon > 8 then begin // gauntlet toggle. if (have_sg=false) and (have_gl=false) and (have_rl=false) and (have_sh=false) and (have_rg=false) and (have_pl=false) and (have_bfg=false) then threadweapon := 0 else begin threadweapon := 0;//hheh if MATCH_GAMETYPE <> GAMETYPE_RAILARENA then begin if players[i].control = 1 then if not OPT_P1GAUNTLETNEXTWPN then threadweapon := 1; if players[i].control = 2 then if not OPT_P2GAUNTLETNEXTWPN then threadweapon := 1; end; end; end; if threadweapon <> C_WPN_SHAFT then players[i].shaft_state := 0; DoWeapBar(i); weapchg := 10; end; end; // prev weapon if ((ISKEY(CTRL_PREVWEAPON)) and (players[i].control=1) and (players[i].weapchg = 0)) or // nextweapon ((ISKEY(CTRL_P2PREVWEAPON)) and (players[i].control=2) and (players[i].weapchg = 0)) then begin with players[i] do begin if threadweapon=0 then threadweapon := 8 else dec(threadweapon); if threadweapon = 0 then begin // gauntlet toggle. if (have_sg=false) and (have_gl=false) and (have_rl=false) and (have_sh=false) and (have_rg=false) and (have_pl=false) and (have_bfg=false) then threadweapon := 0 else begin threadweapon := 0;//hheh if MATCH_GAMETYPE <> GAMETYPE_RAILARENA then begin if players[i].control = 1 then if not OPT_P1GAUNTLETNEXTWPN then threadweapon := 8; if players[i].control = 2 then if not OPT_P2GAUNTLETNEXTWPN then threadweapon := 8; end; end; end; if players[i].control=1 then nwse := OPT_P1NEXTWPNSKIPEMPTY else if players[i].control=2 then nwse := OPT_P2NEXTWPNSKIPEMPTY; if (threadweapon = 8) and ((have_bfg = false) or ((ammo_bfg=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 7) and ((have_pl = false) or ((ammo_pl=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 6) and ((have_rg = false) or ((ammo_rg=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 5) and ((have_sh = false) or ((ammo_sh=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 4) and ((have_rl = false) or ((ammo_rl=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 3) and ((have_gl = false) or ((ammo_gl=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 2) and ((have_sg = false) or ((ammo_sg=0) and (nwse=true)) ) then dec(threadweapon); if (threadweapon = 1) and ((have_mg = false) or ((ammo_mg=0) and (nwse=true)) ) then dec(threadweapon); DoWeapBar(i); weapchg := 10; end; end; //weaponz if ((ISKEY(CTRL_WEAPON0)) and (players[i].control=1) and (players[i].weapchg = 0)) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 0; end; if ((ISKEY(CTRL_WEAPON1)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_mg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 1; end; if ((ISKEY(CTRL_WEAPON2)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_sg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 2; end; if ((ISKEY(CTRL_WEAPON3)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_gl = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 3; end; if ((ISKEY(CTRL_WEAPON4)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_rl = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 4; end; if ((ISKEY(CTRL_WEAPON5)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_sh = true) then begin DoWeapBar(i); if players[i].weapon <> C_WPN_SHAFT then players[i].weapchg := 10; players[i].threadweapon := 5; end; if ((ISKEY(CTRL_WEAPON6)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_rg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 6; end; if ((ISKEY(CTRL_WEAPON7)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_pl = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 7; end; if ((ISKEY(CTRL_WEAPON8)) and (players[i].control=1) and (players[i].weapchg = 0)) and (players[i].have_bfg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 8; end; if ((ISKEY(CTRL_P2WEAPON0)) and (players[i].control=2) and (players[i].weapchg = 0)) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 0; end; if ((ISKEY(CTRL_P2WEAPON1)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_mg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 1; end; if ((ISKEY(CTRL_P2WEAPON2)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_sg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 2; end; if ((ISKEY(CTRL_P2WEAPON3)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_gl = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 3; end; if ((ISKEY(CTRL_P2WEAPON4)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_rl = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 4; end; if ((ISKEY(CTRL_P2WEAPON5)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_sh = true) then begin DoWeapBar(i); if players[i].weapon <> C_WPN_SHAFT then players[i].weapchg := 10; players[i].threadweapon := 5; end; if ((ISKEY(CTRL_P2WEAPON6)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_rg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 6; end; if ((ISKEY(CTRL_P2WEAPON7)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_pl = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 7; end; if ((ISKEY(CTRL_P2WEAPON8)) and (players[i].control=2) and (players[i].weapchg = 0)) and (players[i].have_bfg = true) then begin DoWeapBar(i); players[i].weapchg := 10; players[i].threadweapon := 8; end; ClipTriggers(players[i]); if (players[i].control=1) then begin if (ISKEY(CTRL_MOVELEFT)) and (ISKEY(CTRL_MOVERIGHT)) then begin if players[i].dir < 2 then players[i].dir := players[i].dir+2; exit; end; end; if (players[i].control = 2) then begin if (ISKEY(CTRL_P2MOVELEFT)) and (ISKEY(CTRL_P2MOVERIGHT)) then begin if players[i].dir < 2 then players[i].dir := players[i].dir+2; exit; end; end; if players[i].item_haste > 0 then begin if players[i].item_haste_time = 0 then begin SpawnSmoke(round(players[i].x),round(players[i].y+20)); players[i].item_haste_time := 5; end else dec(players[i].item_haste_time); end; if players[i].dir < 2 then players[i].dir := players[i].dir+2; if (((ISKEY(CTRL_MOVELEFT)) and (players[i].control=1)) or ((ISKEY(CTRL_P2MOVELEFT)) and (players[i].control=2))) or ( (players[i].idd=2) and (players[i].keys and BKEY_MOVELEFT = BKEY_MOVELEFT) ) then begin // if players[i].inertiax > -1 then players[i].inertiax := -1; SPEED := PLAYERMAXSPEED; if players[i].crouch=true then SPEED := PLAYERMAXSPEED-1; if players[i].item_haste>0 then SPEED := SPEED+1; if players[i].inertiax > 0 then players[i].inertiax := players[i].inertiax - 0.8; if players[i].inertiax > -SPEED then players[i].inertiax := players[i].inertiax - 0.35; if players[i].inertiax < -SPEED then players[i].inertiax := -SPEED; players[i].dir := 0; end; if (((ISKEY(CTRL_MOVERIGHT)) and (players[i].control=1)) or ((ISKEY(CTRL_P2MOVERIGHT)) and (players[i].control=2))) or ( (players[i].idd=2) and (players[i].keys and BKEY_MOVERIGHT = BKEY_MOVERIGHT) ) then begin SPEED := PLAYERMAXSPEED; if players[i].crouch=true then SPEED := PLAYERMAXSPEED-1; if players[i].item_haste>0 then SPEED := SPEED+1; if players[i].inertiax < 0 then players[i].inertiax := players[i].inertiax + 0.8; if players[i].inertiax < SPEED then players[i].inertiax := players[i].inertiax + 0.35; if players[i].inertiax > SPEED then players[i].inertiax := SPEED; players[i].dir := 1; end; { if (OPT_MOUSEANGRY) and (players[i].control=1) then begin if mainform.PowerInput.mDeltaX > 25 then players[i].dir := 1; if mainform.PowerInput.mDeltaX < -25 then players[i].dir := 0; end; } end; function BrickCrouchOnHead(sender:TPlayer) : boolean;//crouch head. begin with sender as TPlayer do begin if (bbb[ trunc(x-8) div 32, trunc(y-9) div 16].block = true) and (bbb[ trunc(x-8) div 32, trunc(y-7) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+8) div 32, trunc(y-9) div 16].block = true) and (bbb[ trunc(x+8) div 32, trunc(y-7) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x-8) div 32, trunc(y-23) div 16].block = true) then begin result := true; exit; end; if (bbb[ trunc(x+8) div 32, trunc(y-23) div 16].block = true) then begin result := true; exit; end; if (bbb[ trunc(x-8) div 32, trunc(y-16) div 16].block = true) then begin result := true; exit; end; if (bbb[ trunc(x+8) div 32, trunc(y-16) div 16].block = true) then begin result := true; exit; end; result := false; end; end; function BrickOnHead(sender:TPlayer) :boolean;//do not jump over brickz var c : byte; begin c := 0; //if sender.crouch then c := 5; with sender as TPlayer do begin if (bbb[ trunc(x-9) div 32, trunc(y-25+c) div 16].block = true) and (bbb[ trunc(x-9) div 32, trunc(y-23+c) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+9) div 32, trunc(y-25+c) div 16].block = true) and (bbb[ trunc(x+9) div 32, trunc(y-23+c) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x-9) div 32, trunc(y-24+c) div 16].block = true) and (bbb[ trunc(x-9) div 32, trunc(y-8+c) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+9) div 32, trunc(y-24+c) div 16].block = true) and (bbb[ trunc(x+9) div 32, trunc(y-8+c) div 16].block = false) then begin result := true; exit; end; result := false; end; end; function BrickFOnHead(sender:TMonoSprite) : boolean;//whats that?????? brick female on head?":)) // no, it is for monosprite.. dude begin with sender as TMonoSprite do begin if (bbb[ trunc(x-9) div 32, trunc(y-25) div 16].block = true) and (bbb[ trunc(x-9) div 32, trunc(y-23) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+9) div 32, trunc(y-25) div 16].block = true) and (bbb[ trunc(x+9) div 32, trunc(y-23) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x-9) div 32, trunc(y-24) div 16].block = true) and (bbb[ trunc(x-9) div 32, trunc(y-8) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+9) div 32, trunc(y-24) div 16].block = true) and (bbb[ trunc(x+9) div 32, trunc(y-8) div 16].block = false) then begin result := true; exit; end; result := false; end; end; function IsFOnground(sender : TMonoSprite) : boolean; // this procedure checkz if the corpse onground begin // compare current coordinates via brick matrix; if sender.x < 0 then exit; if sender.y < 0 then exit; result := false; try with sender as TMonoSprite do begin if (bbb[ trunc(x-1) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x-1) div 32, trunc(y+23) div 16].block = false) then begin {addmessage('onground');}result := true; exit; end; if (bbb[ trunc(x+1) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x+1) div 32, trunc(y+23) div 16].block = false) then begin {addmessage('onground');}result := true; exit; end; if (bbb[ trunc(x-1) div 32, trunc(y+24) div 16].block = true) and (bbb[ trunc(x-1) div 32, trunc(y-8) div 16].block = false) then begin {addmessage('onground');}result := true; exit; end; if (bbb[ trunc(x+1) div 32, trunc(y+24) div 16].block = true) and (bbb[ trunc(x+1) div 32, trunc(y-8) div 16].block = false) then begin {addmessage('onground');}result := true; exit; end; // result := false; end; except exit; end; end; function IsWaterContentJUMP(sender : TPlayer) : boolean; // this procedure checkz if the player onground var img : byte; begin result := false; with sender as TPlayer do begin img := bbb[ trunc(x) div 32, trunc(y+8) div 16].image; if (img = CONTENT_WATER) or (img = CONTENT_LAVA) then result:= true; end; end; function IsWaterContentHEAD(sender : TPlayer) : boolean; // this procedure checkz if the player'head in water var img : byte; begin result := false; with sender as TPlayer do begin img := bbb[ trunc(sender.x) div 32, trunc(sender.y-20) div 16].image; if (img = CONTENT_WATER) or (img = CONTENT_LAVA) then result:= true; end; end; function IsWaterContentCrouchHEAD(sender : TPlayer) : boolean; // this procedure checkz if the player'head in water var img : byte; begin result := false; with sender as TPlayer do begin img := bbb[ trunc(sender.x) div 32, trunc(sender.y-8) div 16].image; if (img = CONTENT_WATER) or (img = CONTENT_LAVA) then result:= true; end; end; function IsWaterContent(sender : TPlayer) : boolean; // this procedure checkz if the player inwater. var img : byte; begin result := false; with sender as TPlayer do begin // img := bbb[ trunc(x) div 32, trunc(y) div 16].image; // if (img = CONTENT_WATER) or (img = CONTENT_LAVA) then BEGIN img := bbb[ trunc(x) div 32, trunc(y) div 16].image; if (img = CONTENT_WATER) or (img = CONTENT_LAVA) then result:= true; //END; end; end; function isDoubleJumpPossible(sender : TPlayer) : boolean; var z : integer; begin with sender as TPlayer do begin z := 9; result := false; exit; if (bbb[ trunc(x+z) div 32, trunc(y+24) div 16].block = true) and (bbb[ trunc(x+z) div 32, trunc(y+8) div 16].block = false) then begin doublejump := 10; playsound(snd_hit,0,0); result := true; exit; end; if (bbb[ trunc(x-z+1) div 32, trunc(y+24) div 16].block = true) and (bbb[ trunc(x-z+1) div 32, trunc(y+8) div 16].block = false) then begin doublejump := 10; playsound(snd_hit,0,0); result := true; exit; end; end; end; function IsOnground(sender : TPlayer) : boolean; // this procedure checkz if the player onground var z : integer; begin // compare current coordinates via brick matrix; with sender as TPlayer do begin if dead > 0 then z := 0 else z := 9; // corpses donot stuck on wallz if x <= 0 then x := 100; // HACK: crash fix. if y <= 0 then y := 100; if ((y+25) / 16) > BRICK_Y then begin result:=true; exit; end; if (bbb[ trunc(x-z) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x-z) div 32, trunc(y+23) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+z) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x+z) div 32, trunc(y+23) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x-z) div 32, trunc(y+24) div 16].block = true) and (bbb[ trunc(x-z) div 32, trunc(y+8) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+z) div 32, trunc(y+24) div 16].block = true) and (bbb[ trunc(x+z) div 32, trunc(y+8) div 16].block = false) then begin result := true; exit; end; // mainform.PowerGraph.Line(trunc(x-z-100), trunc(y+25), trunc(x-z), trunc(y+25),cllime,effectNone); { if (bbb[ trunc(x-z) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x-z) div 32, trunc(y+16) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+z) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x+z) div 32, trunc(y+16) div 16].block = false) then begin result := true; exit; end; if (bbb[ trunc(x+z+2) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x+z+2) div 32, trunc(y+23) div 16].block = false) then begin result := true; exit; end; if inertiax<0 then if (bbb[ trunc(x-z-2) div 32, trunc(y+25) div 16].block = true) and (bbb[ trunc(x-z-2) div 32, trunc(y+23) div 16].block = false) then begin result := true; exit; end; } result := false; end; end; procedure CorpsePhysic(id : word); var defx : real; alph : cardinal; begin // aaa[id].dead := 2; // exit; if (aaa[id].spawner = nil) then begin aaa[id].dead := 2; exit; end; defx := aaa[id].x; // DIE ANIM if (aaa[id].weapon=0) and (aaa[id].spawner.dead > 0) then begin aaa[id].x := aaa[id].spawner.TESTPREDICT_X; aaa[id].y := aaa[id].spawner.TESTPREDICT_y; aaa[id].inertiax := aaa[id].spawner.inertiax; aaa[id].inertiay := aaa[id].spawner.inertiay; end; if (aaa[id].cx < OPT_CORPSETIME*50 - 20) then if (aaa[id].spawner.dead = 0) then aaa[id].weapon := 1; if aaa[id].cx >= 25 then alph := 255 else alph := trunc(aaa[id].cx*10); // emulate player dead movement. if (aaa[id].dir = 1) or (aaa[id].dir = 3) then mainform.PowerGraph.RenderEffectCol(mainform.Images[aaa[id].spawner.die_index], trunc(aaa[id].x-26)+GX, trunc(aaa[id].y-27)+GY+52-aaa[id].spawner.diesizey, 256, (Alph shl 24) +$FFFFFF, aaa[id].frame, 2 or $100) else mainform.PowerGraph.RenderEffectCol(mainform.Images[aaa[id].spawner.die_index], trunc(aaa[id].x-26)+GX, trunc(aaa[id].y-27)+GY+52-aaa[id].spawner.diesizey, 256, (Alph shl 24) +$FFFFFF, aaa[id].frame, 2 or $100 or effectMirror); if (aaa[id].frame < aaa[id].spawner.dieframes-1) then if aaa[id].fallt <= 0 then inc(aaa[id].frame); if aaa[id].fallt > 0 then dec(aaa[id].fallt) else aaa[id].fallt := aaa[id].spawner.dieframerefreshtime; if aaa[id].cx > 0 then aaa[id].cx := aaa[id].cx-1 else begin aaa[id].dead := 2; exit; end; { if MATCH_DDEMOPLAY then begin if (players[id].frame < players[id].dieframes-1) then if players[id].nextframe <= 0 then inc(players[id].frame); if players[id].rewardtime > 0 then if (players[id].frame >= players[id].dieframes-1) then players[id].rewardtime := 0; end; if players[id].nextframe > 0 then dec(players[id].nextframe) else players[id].nextframe := players[id].framerefreshtime; exit; end; } // emulate player physics. if aaa[id].objname <> 'corpse' then exit; if aaa[id].dead=2 then exit; aaa[id].InertiaY := aaa[id].InertiaY + (Gravity*2.8); // --> 10 if (aaa[id].inertiay > -1) and (aaa[id].inertiay < 0) then aaa[id].inertiay := aaa[id].inertiay/1.11; // progressive inertia if (aaa[id].inertiay > 0) and (aaa[id].inertiay < 5) then aaa[id].inertiay := aaa[id].inertiay*1.1; // progressive inertia if (aaa[id].inertiax < -0.2) or (aaa[id].Inertiax > 0.2) then begin try if (aaa[id].dir > 1) then begin if (isFonground(aaa[id])) then aaa[id].InertiaX := aaa[id].InertiaX / 1.14 /// ongroud stop speed. else aaa[id].InertiaX := aaa[id].InertiaX / 1.025; // inair stopspeed. end; except aaa[id].inertiax := 0; end; end else aaa[id].inertiax := 0; if (isFonground(aaa[id])) then aaa[id].InertiaX := aaa[id].InertiaX / 1.03; // corpse stop speed. aaa[id].x := aaa[id].x + aaa[id].inertiax; aaa[id].y := aaa[id].y + aaa[id].inertiay; // CLIPPING if aaa[id].inertiax < 0 then begin // check clip wallz. if (bbb[ (round(defx - 10) div 32), round(aaa[id].Y-16) div 16].block = true) or (bbb[ (round(defx - 10) div 32), round(aaa[id].Y) div 16].block = true) or (bbb[ (round(defx - 10) div 32), round(aaa[id].Y+16) div 16].block = true) then begin aaa[id].X := trunc(defx/32)*32+9; aaa[id].Inertiax := 0; end; end; if aaa[id].inertiax > 0 then begin if (bbb[ (round(defx + 10) div 32), round(aaa[id].Y-16) div 16].block = true) or (bbb[ (round(defx + 10) div 32), round(aaa[id].Y) div 16].block = true) or (bbb[ (round(defx + 10) div 32), round(aaa[id].Y+16) div 16].block = true) then begin aaa[id].X := trunc(defx/32)*32+22; aaa[id].Inertiax := 0; end; end; if (BrickFOnHead(aaa[id])) and (isFonground(aaa[id])) then begin aaa[id].inertiaY := 0; aaa[id].Y := (round(aaa[id].Y) div 16) * 16 + 8; end else if (BrickFOnHead(aaa[id])) and (aaa[id].inertiay < 0) then begin // fly up aaa[id].inertiaY := 0; aaa[id].Y := (round(aaa[id].Y) div 16) * 16 + 8; end else if (isFonground(aaa[id])) and (aaa[id].inertiay > 0) then begin aaa[id].inertiay := 0; aaa[id].Y := (round(aaa[id].Y) div 16) * 16 + 8; end; // water move. if (bbb[ trunc(aaa[id].x) div 32, trunc(aaa[id].y) div 16].image = CONTENT_WATER) or (bbb[ trunc(aaa[id].x) div 32, trunc(aaa[id].y) div 16].image = CONTENT_LAVA) then begin if aaa[id].InertiaY< -1 then aaa[id].InertiaY := -1; if aaa[id].InertiaY> 1 then aaa[id].InertiaY := 1; if aaa[id].InertiaX< -2 then aaa[id].InertiaX := -2; if aaa[id].InertiaX> 2 then aaa[id].InertiaX := 2; end else begin //normal move. if aaa[id].InertiaY< -5 then aaa[id].InertiaY := -5; if aaa[id].InertiaY> 5 then aaa[id].InertiaY := 5; if aaa[id].InertiaX< -5 then aaa[id].InertiaX := -5; if aaa[id].InertiaX> 5 then aaa[id].InertiaX := 5; end; if aaa[id].y > 16*250 then aaa[id].dead := 2; //bugfix. end; function playerphysic(id : byte):boolean; // here up and down player physics var defx : real; defy : real; begin result := true; // --!-!-!=!=!= ULTIMATE 3d[Power]'s PHYSIX M0DEL =!=!=!-!-!-- //if (players[id].dead > 1){ and (isonground(players[id]))} then exit; defx := players[id].x; defy := players[id].y; players[id].InertiaY := players[id].InertiaY + (Gravity*2.80); // --> 10 if (players[id].inertiay > -1) and (players[id].inertiay < 0) then players[id].inertiay := players[id].inertiay/1.11; // progressive inertia if (players[id].inertiay > 0) and (players[id].inertiay < 5) then players[id].inertiay := players[id].inertiay*1.1; // progressive inertia if (players[id].inertiax < -0.2) or (players[id].Inertiax > 0.2) then begin try if (players[id].dir > 1) then begin if (isonground(players[id])) then players[id].InertiaX := players[id].InertiaX / 1.14 /// ongroud stop speed. else players[id].InertiaX := players[id].InertiaX / 1.025; // inair stopspeed. end; except players[id].inertiax := 0; end; end else players[id].inertiax := 0; if(players[id].dead > 0 ) and (isonground(players[id])) then players[id].InertiaX := players[id].InertiaX / 1.03; // corpse stop speed. players[id].x := players[id].x + players[id].inertiax; players[id].y := players[id].y + players[id].inertiay; // wall CLIPPING if players[id].crouch then begin //VERTICAL CHECNING if (brickcrouchonhead(players[id])) and (isonground(players[id])) then begin players[id].inertiaY := 0; players[id].crouch := true; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; end else if (brickcrouchonhead(players[id])) and (players[id].inertiay < 0) then begin // fly up players[id].inertiaY := 0; players[id].doublejump := 3; players[id].crouch := true; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; // players[id].y := players[id].Y - round(players[id].InertiaY); end else if (isonground(players[id])) and (players[id].inertiay > 0) then begin players[id].crouch := true; players[id].inertiay := 0; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; end; // udivitelno ! why this bullshit works? // HORZ CHECK if players[id].inertiax < 0 then begin // check clip wallz. if (bbb[ (round(defx - 10) div 32), round(players[id].Y-8) div 16].block = true) or (bbb[ (round(defx - 10) div 32), round(players[id].Y) div 16].block = true) or (bbb[ (round(defx - 10) div 32), round(players[id].Y+16) div 16].block = true) then begin players[id].X := trunc(defx/32)*32+9; players[id].Inertiax := 0; result := false; end; end; if players[id].inertiax > 0 then begin if (bbb[ (round(defx + 10) div 32), round(players[id].Y-8) div 16].block = true) or (bbb[ (round(defx + 10) div 32), round(players[id].Y) div 16].block = true) or (bbb[ (round(defx + 10) div 32), round(players[id].Y+16) div 16].block = true) then begin players[id].X := trunc(defx/32)*32+22; players[id].Inertiax := 0; result := false; end; end; end else begin if players[id].inertiax < 0 then begin // check clip wallz. if (bbb[ (round(defx - 10) div 32), round(defy-16) div 16].block = true) or (bbb[ (round(defx - 10) div 32), round(defy) div 16].block = true) or (bbb[ (round(defx - 10) div 32), round(defy+16) div 16].block = true) // or (bbb[ (round(defx - 10) div 32), round(defy+22) div 16].block = true) then begin players[id].X := trunc(defx/32)*32+9; players[id].Inertiax := 0; result := false; end; end; if players[id].inertiax > 0 then begin if (bbb[ (round(defx + 10) div 32), round(defy-16) div 16].block = true) or (bbb[ (round(defx + 10) div 32), round(defy) div 16].block = true) or (bbb[ (round(defx + 10) div 32), round(defy+16) div 16].block = true) // or (bbb[ (round(defx + 10) div 32), round(defy+22) div 16].block = true) then begin players[id].X := trunc(defx/32)*32+22; players[id].Inertiax := 0; result := false; end; end; end; // end else begin if (brickonhead(players[id])) and (isonground(players[id])) then begin players[id].inertiaY := 0; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; end else if (brickonhead(players[id])) and (players[id].inertiay < 0) then begin // fly up players[id].inertiaY := 0; players[id].doublejump := 3; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; // players[id].y := players[id].Y - round(players[id].InertiaY); end else if isonground(players[id]) and (players[id].inertiay > 0) then begin players[id].inertiay := 0; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; end; { if (isonground(players[id])) and (players[id].inertiay > 0) then begin players[id].inertiay := 0; players[id].Y := (round(players[id].Y) div 16) * 16 + 8; end; // udivitelno ! why this bullshit works? if (isonground(players[id])) and (players[id].inertiay < 0) then begin players[id].inertiay := 0; playsound(snd_hit,0,0); players[id].Y := (round(players[id].Y) div 16) * 16 + 8; end; // udivitelno ! why this bullshit works? } // end; // WATER\LAVA MOVEMENT if IsWaterContent(players[id]) then begin if players[id].InertiaY< -1 then players[id].InertiaY := -1; if players[id].InertiaY> 1 then players[id].InertiaY := 1; if players[id].InertiaX< -2 then players[id].InertiaX := -2; if players[id].InertiaX> 2 then players[id].InertiaX := 2; end else begin if players[id].InertiaY< -5 then players[id].InertiaY := -5; if players[id].InertiaY> 5 then players[id].InertiaY := 5; if players[id].InertiaX< -5 then players[id].InertiaX := -5; if players[id].InertiaX> 5 then players[id].InertiaX := 5; end; if players[id].y > 16*250 then players[id].y := 16*250-16; end;