DEADSOFTWARE

added player handicap
[d2df-sdl.git] / src / game / g_player.pas
index 9605c6de6e1a3c9c97b6b14165941b866023fb87..88070c61c04866a6c79bcea7dc8d39f88545fa12 100644 (file)
@@ -102,6 +102,7 @@ const
 
 type
   TPlayerStat = record
+    Num: Integer;
     Ping: Word;
     Loss: Byte;
     Name: String;
@@ -262,8 +263,10 @@ type
     FClientID:  SmallInt;
     FPing:      Word;
     FLoss:      Byte;
+    FReady:     Boolean;
     FDummy:     Boolean;
     FFireTime:  Integer;
+    FHandicap:  Integer;
 
     // debug: viewport offset
     viewPortX, viewPortY, viewPortW, viewPortH: Integer;
@@ -592,8 +595,9 @@ procedure g_Player_DrawShells();
 procedure g_Player_RemoveAllCorpses();
 procedure g_Player_Corpses_SaveState (st: TStream);
 procedure g_Player_Corpses_LoadState (st: TStream);
-procedure g_Bot_Add(Team, Difficult: Byte);
-procedure g_Bot_AddList(Team: Byte; lname: ShortString; num: Integer = -1);
+procedure g_Player_ResetReady();
+procedure g_Bot_Add(Team, Difficult: Byte; Handicap: Integer = 100);
+procedure g_Bot_AddList(Team: Byte; lname: ShortString; num: Integer = -1; Handicap: Integer = 100);
 procedure g_Bot_MixNames();
 procedure g_Bot_RemoveAll();
 
@@ -882,6 +886,8 @@ begin
   if b = 1 then gPlayers[a].FDirection := TDirection.D_LEFT else gPlayers[a].FDirection := TDirection.D_RIGHT; // b = 2
   // Çäîðîâüå
   gPlayers[a].FHealth := utils.readLongInt(st);
+  // Ôîðà
+  gPlayers[a].FHandicap := utils.readLongInt(st);
   // Æèçíè
   gPlayers[a].FLives := utils.readByte(st);
   // Áðîíÿ
@@ -1003,7 +1009,7 @@ begin
       end;
 end;
 
-procedure g_Bot_Add(Team, Difficult: Byte);
+procedure g_Bot_Add(Team, Difficult: Byte; Handicap: Integer = 100);
 var
   m: SSArray;
   _name, _model: String;
@@ -1092,6 +1098,8 @@ begin
       //FDifficult.SafeWeaponPrior[a] := WEAPON_PRIOR3[a];
     end;
 
+    FHandicap := Handicap;
+
     g_Console_Add(Format(_lc[I_PLAYER_JOIN], [Name]), True);
 
     if g_Game_IsNet then MH_SEND_PlayerCreate(UID);
@@ -1100,7 +1108,7 @@ begin
   end;
 end;
 
-procedure g_Bot_AddList(Team: Byte; lName: ShortString; num: Integer = -1);
+procedure g_Bot_AddList(Team: Byte; lName: ShortString; num: Integer = -1; Handicap: Integer = 100);
 var
   m: SSArray;
   _name, _model: String;
@@ -1163,6 +1171,8 @@ begin
     FDifficult.Cover := BotList[num].cover;
     FDifficult.CloseJump := BotList[num].close_jump;
 
+    FHandicap := Handicap;
+
     for a := WP_FIRST to WP_LAST do
     begin
       FDifficult.WeaponPrior[a] := BotList[num].w_prior1[a];
@@ -1471,6 +1481,7 @@ begin
       SetLength(Result, Length(Result)+1);
       with Result[High(Result)] do
       begin
+        Num := a;
         Ping := gPlayers[a].FPing;
         Loss := gPlayers[a].FLoss;
         Name := gPlayers[a].FName;
@@ -1485,6 +1496,22 @@ begin
     end;
 end;
 
+procedure g_Player_ResetReady();
+var
+  a: Integer;
+begin
+  if not g_Game_IsServer then Exit;
+  if gPlayers = nil then Exit;
+
+  for a := 0 to High(gPlayers) do
+    if gPlayers[a] <> nil then
+    begin
+      gPlayers[a].FReady := False;
+      if g_Game_IsNet then
+        MH_SEND_GameEvent(NET_EV_INTER_READY, gPlayers[a].UID, 'N');
+    end;
+end;
+
 procedure g_Player_RememberAll;
 var
   i: Integer;
@@ -2132,6 +2159,7 @@ begin
   FFireTime := 0;
   FFirePainTime := 0;
   FFireAttacker := 0;
+  FHandicap := 100;
 
   FActualModelName := 'doomer';
 
@@ -3717,7 +3745,7 @@ begin
       // i found her!
       result := Byte(i);
       resetWeaponQueue();
-      FNextWeapDelay := WEAPON_DELAY; // anyway, 'cause why not
+      FNextWeapDelay := WEAPON_DELAY * 2; // anyway, 'cause why not
       exit;
     end;
   end;
@@ -4266,6 +4294,7 @@ begin
   FMonsterKills := 0;
   FDeath := 0;
   FSecrets := 0;
+  FReady := False;
   if FNoRespawn then
   begin
     FSpectator := False;
@@ -4505,7 +4534,7 @@ begin
 // Âîñêðåøåíèå áåç îðóæèÿ:
   if not FAlive then
   begin
-    FHealth := PLAYER_HP_SOFT;
+    FHealth := Round(PLAYER_HP_SOFT * (FHandicap / 100));
     FArmor := 0;
     FAlive := True;
     FAir := AIR_DEF;
@@ -5788,6 +5817,11 @@ end;
 
 procedure TPlayer.GetSecret();
 begin
+  if (self = gPlayer1) or (self = gPlayer2) then
+  begin
+    g_Console_Add(Format(_lc[I_PLAYER_SECRET], [FName]), True);
+    g_Sound_PlayEx('SOUND_GAME_SECRET');
+  end;
   Inc(FSecrets);
 end;
 
@@ -5898,6 +5932,8 @@ begin
   utils.writeInt(st, Byte(b));
   // Çäîðîâüå
   utils.writeInt(st, LongInt(FHealth));
+  // Êîýôôèöèåíò èíâàëèäíîñòè
+  utils.writeInt(st, LongInt(FHandicap));
   // Æèçíè
   utils.writeInt(st, Byte(FLives));
   // Áðîíÿ
@@ -6000,6 +6036,8 @@ begin
   if b = 1 then FDirection := TDirection.D_LEFT else FDirection := TDirection.D_RIGHT; // b = 2
   // Çäîðîâüå
   FHealth := utils.readLongInt(st);
+  // Êîýôôèöèåíò èíâàëèäíîñòè
+  FHandicap := utils.readLongInt(st);
   // Æèçíè
   FLives := utils.readByte(st);
   // Áðîíÿ