X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=e84d82965bcc48850e4d971a28234fb4adbf7a18;hp=01dcc3ce0182044baf67cbcef01a4b57c49e7802;hb=228d34465e847f7953a4b2a9e6a32c3b5d2316ae;hpb=71bc9a3606d5d13ecd76a3e0dca5b35fe1192d7d diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index 01dcc3c..e84d829 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -109,6 +109,7 @@ const NET_EV_LMS_DRAW = 16; NET_EV_KILLCOMBO = 17; NET_EV_PLAYER_TOUCH = 18; + NET_EV_SECRET = 19; NET_VE_STARTED = 1; NET_VE_PASSED = 2; @@ -1070,6 +1071,7 @@ begin NetOut.Write(Byte(FNoRespawn)); NetOut.Write(Byte(FJetpack)); NetOut.Write(FFireTime); + NetOut.Write(Byte(FFlaming)); end; g_Net_Host_Send(ID, True, NET_CHAN_PLAYER); @@ -1830,6 +1832,16 @@ begin pl.Touch(); end; + NET_EV_SECRET: + begin + pl := g_Player_Get(EvNum); + if pl <> nil then + begin + g_Console_Add(Format(_lc[I_PLAYER_SECRET], [pl.Name]), True); + g_Sound_PlayEx('SOUND_GAME_SECRET'); + end; + end; + end; end; @@ -1838,7 +1850,7 @@ var PID: Word; Pl: TPlayer; EvType: Byte; - Fl: Byte; + Fl, a: Byte; Quiet: Boolean; s, ts: string; begin @@ -1875,6 +1887,16 @@ begin s := _lc[I_PLAYER_FLAG_BLUE]; g_Game_Message(Format(_lc[I_MESSAGE_FLAG_RETURN], [AnsiUpperCase(s)]), 144); + + if ((Pl = gPlayer1) or (Pl = gPlayer2) + or ((gPlayer1 <> nil) and (gPlayer1.Team = Pl.Team)) + or ((gPlayer2 <> nil) and (gPlayer2.Team = Pl.Team))) then + a := 0 + else + a := 1; + + if not sound_ret_flag[a].IsPlaying() then + sound_ret_flag[a].Play(); end; FLAG_STATE_CAPTURED: @@ -1890,6 +1912,16 @@ begin g_Console_Add(Format(_lc[I_PLAYER_FLAG_GET], [Pl.Name, s]), True); g_Game_Message(Format(_lc[I_MESSAGE_FLAG_GET], [AnsiUpperCase(s)]), 144); + + if ((Pl = gPlayer1) or (Pl = gPlayer2) + or ((gPlayer1 <> nil) and (gPlayer1.Team = Pl.Team)) + or ((gPlayer2 <> nil) and (gPlayer2.Team = Pl.Team))) then + a := 0 + else + a := 1; + + if not sound_get_flag[a].IsPlaying() then + sound_get_flag[a].Play(); end; FLAG_STATE_DROPPED: @@ -1905,6 +1937,16 @@ begin g_Console_Add(Format(_lc[I_PLAYER_FLAG_DROP], [Pl.Name, s]), True); g_Game_Message(Format(_lc[I_MESSAGE_FLAG_DROP], [AnsiUpperCase(s)]), 144); + + if ((Pl = gPlayer1) or (Pl = gPlayer2) + or ((gPlayer1 <> nil) and (gPlayer1.Team = Pl.Team)) + or ((gPlayer2 <> nil) and (gPlayer2.Team = Pl.Team))) then + a := 0 + else + a := 1; + + if not sound_lost_flag[a].IsPlaying() then + sound_lost_flag[a].Play(); end; FLAG_STATE_SCORED: @@ -1923,6 +1965,16 @@ begin Insert('.', ts, Length(ts) + 1 - 3); g_Console_Add(Format(_lc[I_PLAYER_FLAG_CAPTURE], [Pl.Name, s, ts]), True); g_Game_Message(Format(_lc[I_MESSAGE_FLAG_CAPTURE], [AnsiUpperCase(s)]), 144); + + if ((Pl = gPlayer1) or (Pl = gPlayer2) + or ((gPlayer1 <> nil) and (gPlayer1.Team = Pl.Team)) + or ((gPlayer2 <> nil) and (gPlayer2.Team = Pl.Team))) then + a := 0 + else + a := 1; + + if not sound_cap_flag[a].IsPlaying() then + sound_cap_flag[a].Play(); end; FLAG_STATE_RETURNED: @@ -1936,6 +1988,16 @@ begin s := _lc[I_PLAYER_FLAG_BLUE]; g_Game_Message(Format(_lc[I_MESSAGE_FLAG_RETURN], [AnsiUpperCase(s)]), 144); + + if ((Pl = gPlayer1) or (Pl = gPlayer2) + or ((gPlayer1 <> nil) and (gPlayer1.Team = Pl.Team)) + or ((gPlayer2 <> nil) and (gPlayer2.Team = Pl.Team))) then + a := 0 + else + a := 1; + + if not sound_ret_flag[a].IsPlaying() then + sound_ret_flag[a].Play(); end; end; end; @@ -2065,8 +2127,8 @@ function MC_RECV_PlayerStats(var M: TMsg): Word; var PID: Word; Pl: TPlayer; - I: Integer; - OldJet: Boolean; + I, OldFire: Integer; + OldJet, Flam: Boolean; NewTeam: Byte; begin PID := M.ReadWord(); @@ -2141,11 +2203,17 @@ begin FNoRespawn := M.ReadByte() <> 0; OldJet := FJetpack; FJetpack := M.ReadByte() <> 0; + OldFire := FFireTime; FFireTime := M.ReadLongInt(); + if (OldFire <= 0) and (FFireTime > 0) then + g_Sound_PlayExAt('SOUND_IGNITE', Obj.X, Obj.Y); + Flam := M.ReadByte() <> 0; if OldJet and not FJetpack then JetpackOff else if not OldJet and FJetpack then JetpackOn; + if FFlaming and not Flam then + FlamerOff; if Team <> NewTeam then Pl.ChangeTeam(NewTeam); end; @@ -2578,7 +2646,7 @@ end; procedure MC_RECV_MonsterState(var M: TMsg); var - ID: Integer; + ID, OldFire: Integer; MState, MFAnm: Byte; Mon: TMonster; AnimRevert: Boolean; @@ -2599,7 +2667,10 @@ begin MonsterAmmo := M.ReadLongInt(); MonsterPain := M.ReadLongInt(); AnimRevert := M.ReadByte() <> 0; + OldFire := FFireTime; FFireTime := M.ReadLongInt(); + if (OldFire <= 0) and (FFireTime > 0) then + g_Sound_PlayExAt('SOUND_IGNITE', Obj.X, Obj.Y); RevertAnim(AnimRevert); if MonsterState <> MState then @@ -2710,20 +2781,12 @@ begin g_Net_Client_Send(True, NET_CHAN_CHAT); end; -function isKeyPressed (key1: Word; key2: Word): Boolean; -begin - if (key1 <> 0) and e_KeyPressed(key1) then begin result := true; exit; end; - if (key2 <> 0) and e_KeyPressed(key2) then begin result := true; exit; end; - result := false; -end; - procedure MC_SEND_PlayerPos(); var kByte: Word; Predict: Boolean; strafeDir: Byte; WeaponSelect: Word = 0; - I: Integer; begin if not gGameOn then Exit; if gPlayers = nil then Exit; @@ -2736,82 +2799,76 @@ begin begin strafeDir := P1MoveButton shr 4; P1MoveButton := P1MoveButton and $0F; - with gGameControls.P1Control do - begin - if isKeyPressed(KeyLeft, KeyLeft2) and (not isKeyPressed(KeyRight, KeyRight2)) then P1MoveButton := 1 - else if (not isKeyPressed(KeyLeft, KeyLeft2)) and isKeyPressed(KeyRight, KeyRight2) then P1MoveButton := 2 - else if (not isKeyPressed(KeyLeft, KeyLeft2)) and (not isKeyPressed(KeyRight, KeyRight2)) then P1MoveButton := 0; - // strafing - if isKeyPressed(KeyStrafe, KeyStrafe2) then - begin - // new strafe mechanics - if (strafeDir = 0) then strafeDir := P1MoveButton; // start strafing - // now set direction according to strafe (reversed) - if (strafeDir = 2) then gPlayer1.SetDirection(TDirection.D_LEFT) - else if (strafeDir = 1) then gPlayer1.SetDirection(TDirection.D_RIGHT); - end - else - begin - if (P1MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then gPlayer1.SetDirection(TDirection.D_LEFT) - else if (P1MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then gPlayer1.SetDirection(TDirection.D_RIGHT) - else if P1MoveButton <> 0 then gPlayer1.SetDirection(TDirection(P1MoveButton-1)); - end; + if gPlayerAction[0, ACTION_MOVELEFT] and (not gPlayerAction[0, ACTION_MOVERIGHT]) then + P1MoveButton := 1 + else if (not gPlayerAction[0, ACTION_MOVELEFT]) and gPlayerAction[0, ACTION_MOVERIGHT] then + P1MoveButton := 2 + else if (not gPlayerAction[0, ACTION_MOVELEFT]) and (not gPlayerAction[0, ACTION_MOVERIGHT]) then + P1MoveButton := 0; - gPlayer1.ReleaseKeys; - gPlayer1.weaponSwitchKeysStateChange(-1, isKeyPressed(KeyNextWeapon, KeyNextWeapon2)); - gPlayer1.weaponSwitchKeysStateChange(-2, isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2)); + // strafing + if gPlayerAction[0, ACTION_STRAFE] then + begin + // new strafe mechanics + if (strafeDir = 0) then strafeDir := P1MoveButton; // start strafing + // now set direction according to strafe (reversed) + if (strafeDir = 2) then gPlayer1.SetDirection(TDirection.D_LEFT) + else if (strafeDir = 1) then gPlayer1.SetDirection(TDirection.D_RIGHT); + end + else + begin + if (P1MoveButton = 2) and gPlayerAction[0, ACTION_MOVELEFT] then + gPlayer1.SetDirection(TDirection.D_LEFT) + else if (P1MoveButton = 1) and gPlayerAction[0, ACTION_MOVERIGHT] then + gPlayer1.SetDirection(TDirection.D_RIGHT) + else if P1MoveButton <> 0 then + gPlayer1.SetDirection(TDirection(P1MoveButton-1)); + end; - if P1MoveButton = 1 then - begin - kByte := kByte or NET_KEY_LEFT; - if Predict then gPlayer1.PressKey(KEY_LEFT, 10000); - end; - if P1MoveButton = 2 then - begin - kByte := kByte or NET_KEY_RIGHT; - if Predict then gPlayer1.PressKey(KEY_RIGHT, 10000); - end; - if isKeyPressed(KeyUp, KeyUp2) then - begin - kByte := kByte or NET_KEY_UP; - gPlayer1.PressKey(KEY_UP, 10000); - end; - if isKeyPressed(KeyDown, KeyDown2) then - begin - kByte := kByte or NET_KEY_DOWN; - gPlayer1.PressKey(KEY_DOWN, 10000); - end; - if isKeyPressed(KeyJump, KeyJump2) then - begin - kByte := kByte or NET_KEY_JUMP; - // gPlayer1.PressKey(KEY_JUMP, 10000); // TODO: Make a prediction option - end; - if isKeyPressed(KeyFire, KeyFire2) then kByte := kByte or NET_KEY_FIRE; - if isKeyPressed(KeyOpen, KeyOpen2) then kByte := kByte or NET_KEY_OPEN; - if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) and gPlayer1.isWeaponSwitchKeyReleased(-1) then kByte := kByte or NET_KEY_NW; - if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) and gPlayer1.isWeaponSwitchKeyReleased(-2) then kByte := kByte or NET_KEY_PW; - for I := 0 to High(KeyWeapon) do - begin - if isKeyPressed(KeyWeapon[I], KeyWeapon2[I]) then - begin - gPlayer1.weaponSwitchKeysStateChange(i, true); - if gPlayer1.isWeaponSwitchKeyReleased(i) then WeaponSelect := WeaponSelect or Word(1 shl I); - end - else - begin - gPlayer1.weaponSwitchKeysStateChange(i, false); - end; - end; + gPlayer1.ReleaseKeys; + if P1MoveButton = 1 then + begin + kByte := kByte or NET_KEY_LEFT; + if Predict then gPlayer1.PressKey(KEY_LEFT, 10000); end; + if P1MoveButton = 2 then + begin + kByte := kByte or NET_KEY_RIGHT; + if Predict then gPlayer1.PressKey(KEY_RIGHT, 10000); + end; + if gPlayerAction[0, ACTION_LOOKUP] then + begin + kByte := kByte or NET_KEY_UP; + gPlayer1.PressKey(KEY_UP, 10000); + end; + if gPlayerAction[0, ACTION_LOOKDOWN] then + begin + kByte := kByte or NET_KEY_DOWN; + gPlayer1.PressKey(KEY_DOWN, 10000); + end; + if gPlayerAction[0, ACTION_JUMP] then + begin + kByte := kByte or NET_KEY_JUMP; + // gPlayer1.PressKey(KEY_JUMP, 10000); // TODO: Make a prediction option + end; + if gPlayerAction[0, ACTION_ATTACK] then kByte := kByte or NET_KEY_FIRE; + if gPlayerAction[0, ACTION_ACTIVATE] then kByte := kByte or NET_KEY_OPEN; + if gPlayerAction[0, ACTION_WEAPNEXT] then kByte := kByte or NET_KEY_NW; + if gPlayerAction[0, ACTION_WEAPPREV] then kByte := kByte or NET_KEY_PW; + + if gSelectWeapon[0] >= 0 then + begin + WeaponSelect := gSelectWeapon[0]; + //gSelectWeapon[0] := -1 + end; + // fix movebutton state P1MoveButton := P1MoveButton or (strafeDir shl 4); end else kByte := NET_KEY_CHAT; - gPlayer1.weaponSwitchKeysShiftNewStates(); - NetOut.Write(Byte(NET_MSG_PLRPOS)); NetOut.Write(gTime); NetOut.Write(kByte);