X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=d1246ba0c7dabdc027035501fe4fee5bd9bfc6a7;hp=add8be44def44354fd817f129e847a4e9c914944;hb=06ce403977f0da3911c62eed46414ad03afa9111;hpb=546a929a401a64c32fda3380c3fe71306fd54eb1 diff --git a/src/game/g_game.pas b/src/game/g_game.pas index add8be4..d1246ba 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -62,6 +62,11 @@ type Model: String; Color: TRGB; Team: Byte; + // ones below are sent only to the server + WeaponSwitch: Byte; + WeaponPreferences: Array[WP_FIRST..WP_LAST+1] of Byte; + SwitchToEmpty: Byte; + SkipFist: Byte; end; TMegaWADInfo = record @@ -1781,6 +1786,16 @@ var if mon.gncNeedSend then MH_SEND_MonsterPos(mon.UID); end; + function sendItemPos (it: PItem): Boolean; + begin + result := false; // don't stop + if it.needSend then + begin + MH_SEND_ItemPos(it.myId); + it.needSend := False; + end; + end; + var reliableUpdate: Boolean; begin @@ -2239,6 +2254,18 @@ begin g_Mons_ForEach(sendMonsPos); + // update flags that aren't stationary + if gGameSettings.GameMode = GM_CTF then + for I := FLAG_RED to FLAG_BLUE do + if gFlags[I].NeedSend then + begin + gFlags[I].NeedSend := False; + MH_SEND_FlagPos(I); + end; + + // update items that aren't stationary + g_Items_ForEachAlive(sendItemPos); + if reliableUpdate then begin NetTimeToReliable := 0; @@ -4324,6 +4351,10 @@ begin else begin gPlayer1.Name := gPlayer1Settings.Name; + gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty; + gPlayer1.SkipFist := gPlayer1Settings.SkipFist; g_Console_Add(Format(_lc[I_PLAYER_JOIN], [gPlayer1.Name]), True); if g_Game_IsServer and g_Game_IsNet then MH_SEND_PlayerCreate(gPlayer1.UID); @@ -4354,6 +4385,10 @@ begin else begin gPlayer2.Name := gPlayer2Settings.Name; + gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch; + gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences); + gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty; + gPlayer2.SkipFist := gPlayer2Settings.SkipFist; g_Console_Add(Format(_lc[I_PLAYER_JOIN], [gPlayer2.Name]), True); if g_Game_IsServer and g_Game_IsNet then MH_SEND_PlayerCreate(gPlayer2.UID); @@ -4469,6 +4504,10 @@ begin end; gPlayer1.Name := gPlayer1Settings.Name; + gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty; + gPlayer1.SkipFist := gPlayer1Settings.SkipFist; nPl := 1; // Ñîçäàíèå âòîðîãî èãðîêà, åñëè åñòü: @@ -4484,6 +4523,10 @@ begin end; gPlayer2.Name := gPlayer2Settings.Name; + gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch; + gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences); + gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty; + gPlayer2.SkipFist := gPlayer2Settings.SkipFist; Inc(nPl); end; @@ -4563,6 +4606,10 @@ begin end; gPlayer1.Name := gPlayer1Settings.Name; + gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty; + gPlayer1.SkipFist := gPlayer1Settings.SkipFist; Inc(nPl); end; @@ -4579,6 +4626,10 @@ begin end; gPlayer2.Name := gPlayer2Settings.Name; + gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch; + gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences); + gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty; + gPlayer2.SkipFist := gPlayer2Settings.SkipFist; Inc(nPl); end; @@ -4666,6 +4717,10 @@ begin end; gPlayer1.Name := gPlayer1Settings.Name; + gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty; + gPlayer1.SkipFist := gPlayer1Settings.SkipFist; end; if nPlayers >= 2 then @@ -4681,6 +4736,10 @@ begin end; gPlayer2.Name := gPlayer2Settings.Name; + gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch; + gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences); + gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty; + gPlayer2.SkipFist := gPlayer2Settings.SkipFist; end; g_Game_SetLoadingText(_lc[I_LOAD_HOST], 0, False); @@ -4859,6 +4918,10 @@ begin end; gPlayer1.Name := gPlayer1Settings.Name; + gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty; + gPlayer1.SkipFist := gPlayer1Settings.SkipFist; gPlayer1.UID := NetPlrUID1; gPlayer1.Reset(True); @@ -5638,7 +5701,7 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); + a := Max(0, StrToIntDef(p[1], 0)); g_GFX_SetMax(a) end else if Length(p) = 1 then @@ -5654,7 +5717,7 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); + a := Max(0, StrToIntDef(p[1], 0)); g_Shells_SetMax(a) end else if Length(p) = 1 then @@ -5670,7 +5733,7 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); + a := Max(0, StrToIntDef(p[1], 0)); g_Gibs_SetMax(a) end else if Length(p) = 1 then @@ -5686,7 +5749,7 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); + a := Max(0, StrToIntDef(p[1], 0)); g_Corpses_SetMax(a) end else if Length(p) = 1 then @@ -5895,6 +5958,156 @@ begin g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); end; end; + 'p1_autoswitch': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponSwitch := EnsureRange(StrTointDef(P[1], 0), 0, 2); + end; + 'p2_autoswitch': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponSwitch := EnsureRange(StrTointDef(P[1], 0), 0, 2); + end; + 'p1_switch_empty': + begin + if (Length(P) = 2) then + gPlayer1Settings.SwitchToEmpty := EnsureRange(StrTointDef(P[1], 0), 0, 1); + end; + 'p2_switch_empty': + begin + if (Length(P) = 2) then + gPlayer2Settings.SwitchToEmpty := EnsureRange(StrTointDef(P[1], 0), 0, 1); + end; + 'p1_skip_fist': + begin + if (Length(P) = 2) then + gPlayer1Settings.SkipFist := EnsureRange(StrTointDef(P[1], 0), 0, 1); + end; + 'p2_skip_fist': + begin + if (Length(P) = 2) then + gPlayer2Settings.SkipFist := EnsureRange(StrTointDef(P[1], 0), 0, 1); + end; + 'p1_priority_kastet': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_kastet': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_saw': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_SAW] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_saw': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_SAW] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_pistol': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_pistol': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_shotgun1': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_SHOTGUN1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_shotgun1': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_SHOTGUN1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_shotgun2': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_SHOTGUN2] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_shotgun2': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_SHOTGUN2] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_chaingun': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_CHAINGUN] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_chaingun': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_CHAINGUN] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_rocketlauncher': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_ROCKETLAUNCHER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_rocketlauncher': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_ROCKETLAUNCHER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_plasma': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_PLASMA] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_plasma': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_PLASMA] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_bfg': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_BFG] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_bfg': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_BFG] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_super': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_SUPERPULEMET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_super': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_SUPERPULEMET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_flamethrower': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WEAPON_FLAMETHROWER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_flamethrower': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WEAPON_FLAMETHROWER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p1_priority_berserk': + begin + if (Length(P) = 2) then + gPlayer1Settings.WeaponPreferences[WP_LAST+1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; + 'p2_priority_berserk': + begin + if (Length(P) = 2) then + gPlayer2Settings.WeaponPreferences[WP_LAST+1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; end; end; @@ -6763,6 +6976,34 @@ begin end else g_Console_Add(_lc[I_MSG_GM_UNAVAIL]); end + else if (cmd = 'an') or (cmd = 'announce') then + begin + if g_Game_IsNet then + begin + if Length(P) > 1 then + begin + for a := 1 to High(P) do + chstr := chstr + P[a] + ' '; + + if Length(chstr) > 200 then SetLength(chstr, 200); + + if Length(chstr) < 1 then + begin + g_Console_Add('announce '); + Exit; + end; + + chstr := 'centerprint 100 ' + b_Text_Format(chstr); + if g_Game_IsClient then + MC_SEND_RCONCommand(chstr) + else + g_Console_Process(chstr, True); + end + else + g_Console_Add('announce '); + end else + g_Console_Add(_lc[I_MSG_GM_UNAVAIL]); + end else if cmd = 'game' then begin if gGameSettings.GameType <> GT_NONE then @@ -7219,7 +7460,7 @@ begin begin if Length(p) = 2 then begin - a := WP_FIRST + StrToInt(p[1]) - 1; + a := WP_FIRST + StrToIntDef(p[1], 0) - 1; if (a >= WP_FIRST) and (a <= WP_LAST) then gSelectWeapon[0, a] := True end @@ -7238,12 +7479,20 @@ begin begin if Length(p) = 2 then begin - a := WP_FIRST + StrToInt(p[1]) - 1; + a := WP_FIRST + StrToIntDef(p[1], 0) - 1; b := ord(cmd[2]) - ord('1'); if (a >= WP_FIRST) and (a <= WP_LAST) then gSelectWeapon[b, a] := True end end + else if (cmd = 'p1_weapbest') or (cmd = 'p2_weapbest') then + begin + b := ord(cmd[2]) - ord('1'); + if b = 0 then + gSelectWeapon[b, gPlayer1.GetMorePrefered()] := True + else + gSelectWeapon[b, gPlayer2.GetMorePrefered()] := True; + end else if (cmd = 'dropflag') then begin if g_Game_IsServer then @@ -7554,7 +7803,7 @@ begin name := e_CatPath(dir, Filename + '.png'); s := createDiskFile(name); try - e_MakeScreenshot(s, gScreenWidth, gScreenHeight); + e_MakeScreenshot(s, gWinSizeX, gWinSizeX); s.Free; g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name])) except