X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_player.pas;h=6c7006be15f110d75aa1774838a35812e255337e;hb=d44826b00888fb246e6c23cfb410070f3f845203;hp=cc6afb07be47661fa320584d0d6ecb2f80f5df1e;hpb=6c6b87eea9373ec4f1cb859223d3708d8e2a59c6;p=d2df-sdl.git diff --git a/src/game/g_player.pas b/src/game/g_player.pas index cc6afb0..6c7006b 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -267,6 +267,7 @@ type FReady: Boolean; FDummy: Boolean; FFireTime: Integer; + FSpawnInvul: Integer; FHandicap: Integer; FWaitForFirstSpawn: Boolean; // set to `true` in server, used to spawn a player on first full state request @@ -555,7 +556,7 @@ var gTeamStat: TTeamStat; gFly: Boolean = False; gAimLine: Boolean = False; - gChatBubble: Byte = 0; + gChatBubble: Integer = 0; gPlayerIndicator: Integer = 1; gPlayerIndicatorStyle: Integer = 0; gNumBots: Word = 0; @@ -613,7 +614,7 @@ uses g_holmes, {$ENDIF} e_log, g_map, g_items, g_console, g_gfx, Math, - g_options, g_triggers, g_menu, g_game, g_grid, + g_options, g_triggers, g_menu, g_game, g_grid, e_res, wadreader, g_main, g_monsters, CONFIG, g_language, g_net, g_netmsg, g_window, utils, xstreams; @@ -1254,14 +1255,16 @@ var a, b: Integer; config: TConfig; sa: SSArray; + path: AnsiString; begin BotNames := nil; - if not FileExists(DataDir + BOTNAMES_FILENAME) then + path := BOTNAMES_FILENAME; + if e_FindResource(DataDirs, path) = false then Exit; // ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà: - AssignFile(F, DataDir + BOTNAMES_FILENAME); + AssignFile(F, path); Reset(F); while not EOF(F) do @@ -1282,7 +1285,7 @@ begin g_Bot_MixNames(); // ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ: - config := TConfig.CreateFile(DataDir + BOTLIST_FILENAME); + config := TConfig.CreateFile(path); BotList := nil; a := 0; @@ -2227,6 +2230,7 @@ begin FMegaRulez[MR_SUIT] := 0; FMegaRulez[MR_INVUL] := 0; FMegaRulez[MR_INVIS] := 0; + FSpawnInvul := 0; FBerserk := 0; end; @@ -2505,7 +2509,7 @@ begin end; end; - if (FMegaRulez[MR_INVUL] > gTime) and (gPlayerDrawn <> Self) then + if (FMegaRulez[MR_INVUL] > gTime) and ((gPlayerDrawn <> Self) or (FSpawnInvul >= gTime)) then if g_Texture_Get('TEXTURE_PLAYER_INVULPENTA', ID) then begin e_GetTextureSize(ID, @w, @h); @@ -2873,7 +2877,7 @@ var dr: Boolean; begin // Ïðè âçÿòèè íåóÿçâèìîñòè ðèñóåòñÿ èíâåðñèîííûé áåëûé ôîí - if FMegaRulez[MR_INVUL] >= gTime then + if (FMegaRulez[MR_INVUL] >= gTime) and (FSpawnInvul < gTime) then begin if (FMegaRulez[MR_INVUL]-gTime) <= 2100 then dr := not Odd((FMegaRulez[MR_INVUL]-gTime) div 300) @@ -3537,7 +3541,8 @@ begin PushItem(ITEM_JETPACK); // Âûáðîñ êëþ÷åé: - if not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) then + if (not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF])) or + LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS) then begin if R_KEY_RED in FRulez then PushItem(ITEM_KEY_RED); @@ -3724,8 +3729,8 @@ begin result := false; case weapon of WEAPON_KASTET, WEAPON_SAW: result := true; - WEAPON_SHOTGUN1, WEAPON_SHOTGUN2: result := (FAmmo[A_SHELLS] > 0); - WEAPON_PISTOL, WEAPON_CHAINGUN, WEAPON_SUPERPULEMET: result := (FAmmo[A_BULLETS] > 0); + WEAPON_SHOTGUN1, WEAPON_SHOTGUN2, WEAPON_SUPERPULEMET: result := (FAmmo[A_SHELLS] > 0); + WEAPON_PISTOL, WEAPON_CHAINGUN: result := (FAmmo[A_BULLETS] > 0); WEAPON_ROCKETLAUNCHER: result := (FAmmo[A_ROCKETS] > 0); WEAPON_PLASMA, WEAPON_BFG: result := (FAmmo[A_CELLS] > 0); WEAPON_FLAMETHROWER: result := (FAmmo[A_FUEL] > 0); @@ -4277,6 +4282,7 @@ begin if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then begin FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME; + FSpawnInvul := 0; Result := True; remove := True; if gFlash = 2 then Inc(FPickup, 5); @@ -4632,7 +4638,8 @@ begin FMaxAmmo[A_CELLS] := AmmoLimits[0, A_CELLS]; FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL]; - if gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF] then + if (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) and + LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS) then FRulez := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE] else FRulez := []; @@ -4668,6 +4675,13 @@ begin for a := Low(FMegaRulez) to High(FMegaRulez) do FMegaRulez[a] := 0; +// Respawn invulnerability + if (gGameSettings.GameType <> GT_SINGLE) and (gGameSettings.SpawnInvul > 0) then + begin + FMegaRulez[MR_INVUL] := gTime + gGameSettings.SpawnInvul * 1000; + FSpawnInvul := FMegaRulez[MR_INVUL]; + end; + FDamageBuffer := 0; FJetpack := False; FCanJetpack := False; @@ -4813,7 +4827,7 @@ begin if FDirection = TDirection.D_LEFT then FAngle := ANGLE_LEFTDOWN else FAngle := ANGLE_RIGHTDOWN; - if FIncCam > -120 then DecMin(FIncCam, 5, -120); + if FIncCam > -120.0 * g_dbg_scale then DecMin(FIncCam, 5, Integer(-120.0 * g_dbg_scale)); end; procedure TPlayer.SeeUp(); @@ -4822,7 +4836,7 @@ begin if FDirection = TDirection.D_LEFT then FAngle := ANGLE_LEFTUP else FAngle := ANGLE_RIGHTUP; - if FIncCam < 120 then IncMax(FIncCam, 5, 120); + if FIncCam < 120.0 * g_dbg_scale then IncMax(FIncCam, 5, Integer(120.0 * g_dbg_scale)); end; procedure TPlayer.SetAction(Action: Byte; Force: Boolean = False);