X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_player.pas;h=a0496da85e63e8314c938bcea0aa18bd7a957495;hb=2257ac7163318bab560e4351f2b139c9ca4ed9e5;hp=1ec0ccd237bc56c85df03b3d26c9d286fe1131d5;hpb=2f7fe10481b508addb4db1243d34c3aff4fb525e;p=d2df-sdl.git diff --git a/src/game/g_player.pas b/src/game/g_player.pas index 1ec0ccd..a0496da 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -50,7 +50,12 @@ const A_SHELLS = 1; A_ROCKETS = 2; A_CELLS = 3; - A_HIGH = 3; + A_FUEL = 4; + A_HIGH = 4; + + AmmoLimits: Array [0..1] of Array [A_BULLETS..A_HIGH] of Word = + ((200, 50, 50, 300, 100), + (400, 100, 100, 600, 200)); K_SIMPLEKILL = 0; K_HARDKILL = 1; @@ -162,6 +167,7 @@ type FObj: TObj; FXTo, FYTo: Integer; FSpectatePlayer: Integer; + FFirePainTime: Integer; FSavedState: TPlayerSavedState; @@ -196,6 +202,7 @@ type function FullInLift(XInc, YInc: Integer): Integer; {procedure CollideItem();} procedure FlySmoke(Times: DWORD = 1); + procedure OnFireFlame(Times: DWORD = 1); function GetAmmoByWeapon(Weapon: Byte): Word; procedure SetAction(Action: Byte; Force: Boolean = False); procedure OnDamage(Angle: SmallInt); virtual; @@ -239,6 +246,7 @@ type FPing: Word; FLoss: Byte; FDummy: Boolean; + FFireTime: Integer; constructor Create(); virtual; destructor Destroy(); override; @@ -300,6 +308,7 @@ type procedure RealizeCurrentWeapon(); procedure JetpackOn; procedure JetpackOff; + procedure CatchFire(); property Name: String read FName write FName; property Model: TPlayerModel read FModel; @@ -543,27 +552,30 @@ const (R:0; G:0; B:255)); DIFFICULT_EASY: TDifficult = (DiagFire: 32; InvisFire: 32; DiagPrecision: 32; FlyPrecision: 32; Cover: 32; CloseJump: 32; - WeaponPrior:(0,0,0,0,0,0,0,0,0,0); CloseWeaponPrior:(0,0,0,0,0,0,0,0,0,0)); + WeaponPrior:(0,0,0,0,0,0,0,0,0,0,0); CloseWeaponPrior:(0,0,0,0,0,0,0,0,0,0,0)); DIFFICULT_MEDIUM: TDifficult = (DiagFire: 127; InvisFire: 127; DiagPrecision: 127; FlyPrecision: 127; Cover: 127; CloseJump: 127; - WeaponPrior:(0,0,0,0,0,0,0,0,0,0); CloseWeaponPrior:(0,0,0,0,0,0,0,0,0,0)); + WeaponPrior:(0,0,0,0,0,0,0,0,0,0,0); CloseWeaponPrior:(0,0,0,0,0,0,0,0,0,0,0)); DIFFICULT_HARD: TDifficult = (DiagFire: 255; InvisFire: 255; DiagPrecision: 255; FlyPrecision: 255; Cover: 255; CloseJump: 255; - WeaponPrior:(0,0,0,0,0,0,0,0,0,0); CloseWeaponPrior:(0,0,0,0,0,0,0,0,0,0)); + WeaponPrior:(0,0,0,0,0,0,0,0,0,0,0); CloseWeaponPrior:(0,0,0,0,0,0,0,0,0,0,0)); WEAPON_PRIOR1: Array [WP_FIRST..WP_LAST] of Byte = - (WEAPON_SUPERPULEMET, WEAPON_SHOTGUN2, WEAPON_SHOTGUN1, + (WEAPON_FLAMETHROWER, WEAPON_SUPERPULEMET, + WEAPON_SHOTGUN2, WEAPON_SHOTGUN1, WEAPON_CHAINGUN, WEAPON_PLASMA, WEAPON_ROCKETLAUNCHER, WEAPON_BFG, WEAPON_PISTOL, WEAPON_SAW, WEAPON_KASTET); WEAPON_PRIOR2: Array [WP_FIRST..WP_LAST] of Byte = - (WEAPON_SUPERPULEMET, WEAPON_BFG, WEAPON_ROCKETLAUNCHER, + (WEAPON_FLAMETHROWER, WEAPON_SUPERPULEMET, + WEAPON_BFG, WEAPON_ROCKETLAUNCHER, WEAPON_SHOTGUN2, WEAPON_PLASMA, WEAPON_SHOTGUN1, WEAPON_CHAINGUN, WEAPON_PISTOL, WEAPON_SAW, WEAPON_KASTET); //WEAPON_PRIOR3: Array [WP_FIRST..WP_LAST] of Byte = - // (WEAPON_SUPERPULEMET, WEAPON_BFG, WEAPON_PLASMA, - // WEAPON_SHOTGUN2, WEAPON_CHAINGUN, WEAPON_SHOTGUN1, - // WEAPON_SAW, WEAPON_ROCKETLAUNCHER, WEAPON_PISTOL, WEAPON_KASTET); + // (WEAPON_FLAMETHROWER, WEAPON_SUPERPULEMET, + // WEAPON_BFG, WEAPON_PLASMA, WEAPON_SHOTGUN2, + // WEAPON_CHAINGUN, WEAPON_SHOTGUN1, WEAPON_SAW, + // WEAPON_ROCKETLAUNCHER, WEAPON_PISTOL, WEAPON_KASTET); WEAPON_RELOAD: Array [WP_FIRST..WP_LAST] of Byte = - (5, 2, 6, 18, 36, 2, 12, 2, 14, 2); + (5, 2, 6, 18, 36, 2, 12, 2, 14, 2, 0); PLAYER_SIGNATURE = $52594C50; // 'PLYR' CORPSE_SIGNATURE = $50524F43; // 'CORP' @@ -1979,6 +1991,8 @@ begin FLoss := 0; FSavedState.WaitRecall := False; FShellTimer := -1; + FFireTime := 0; + FFirePainTime := 0; FActualModelName := 'doomer'; @@ -2488,6 +2502,7 @@ begin WEAPON_ROCKETLAUNCHER: ID := gItemsTexturesID[ITEM_WEAPON_ROCKETLAUNCHER]; WEAPON_PLASMA: ID := gItemsTexturesID[ITEM_WEAPON_PLASMA]; WEAPON_BFG: ID := gItemsTexturesID[ITEM_WEAPON_BFG]; + WEAPON_FLAMETHROWER: ID := gItemsTexturesID[ITEM_WEAPON_FLAMETHROWER]; end; e_CharFont_GetSize(gMenuFont, s, tw, th); @@ -2795,6 +2810,17 @@ begin g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX, GameVelX, GameVelY-2, SHELL_SHELL); end; + + WEAPON_FLAMETHROWER: + if FAmmo[A_FUEL] > 0 then + begin + g_Weapon_flame(wx, wy, xd, yd, FUID); + FReloading[FCurrWeap] := WEAPON_RELOAD[FCurrWeap]; + Dec(FAmmo[A_FUEL]); + FFireAngle := FAngle; + f := True; + DidFire := True; + end; end; if g_Game_IsNet then @@ -2825,6 +2851,7 @@ begin WEAPON_SHOTGUN1, WEAPON_SHOTGUN2, WEAPON_SUPERPULEMET: Result := FAmmo[A_SHELLS]; WEAPON_ROCKETLAUNCHER: Result := FAmmo[A_ROCKETS]; WEAPON_PLASMA, WEAPON_BFG: Result := FAmmo[A_CELLS]; + WEAPON_FLAMETHROWER: Result := FAmmo[A_FUEL]; else Result := 0; end; end; @@ -2853,6 +2880,13 @@ begin FJetSoundOff.PlayAt(FObj.X, FObj.Y); end; +procedure TPlayer.CatchFire(); +begin + FFireTime := 360; + if g_Game_IsNet and g_Game_IsServer then + MH_SEND_PlayerStats(FUID); +end; + procedure TPlayer.Jump(); begin if gFly or FJetpack then @@ -3096,6 +3130,7 @@ begin WEAPON_PLASMA: i := ITEM_WEAPON_PLASMA; WEAPON_BFG: i := ITEM_WEAPON_BFG; WEAPON_SUPERPULEMET: i := ITEM_WEAPON_SUPERPULEMET; + WEAPON_FLAMETHROWER: i := ITEM_WEAPON_FLAMETHROWER; else i := 0; end; @@ -3303,6 +3338,7 @@ begin WEAPON_PISTOL, WEAPON_CHAINGUN, WEAPON_SUPERPULEMET: 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); else result := (weapon < length(FWeapon)); end; end; @@ -3607,6 +3643,18 @@ begin if a and g_Game_IsNet then MH_SEND_Sound(GameX, GameY, 'SOUND_ITEM_GETWEAPON'); end; + ITEM_WEAPON_FLAMETHROWER: + if (FAmmo[A_FUEL] < FMaxAmmo[A_FUEL]) or not FWeapon[WEAPON_FLAMETHROWER] then + begin + if a and FWeapon[WEAPON_FLAMETHROWER] then Exit; + + IncMax(FAmmo[A_FUEL], 100, FMaxAmmo[A_FUEL]); + FWeapon[WEAPON_FLAMETHROWER] := True; + Result := True; + if gFlash = 2 then Inc(FPickup, 5); + if a and g_Game_IsNet then MH_SEND_Sound(GameX, GameY, 'SOUND_ITEM_GETWEAPON'); + end; + ITEM_AMMO_BULLETS: if FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS] then begin @@ -3679,17 +3727,28 @@ begin if gFlash = 2 then Inc(FPickup, 5); end; + ITEM_AMMO_FUELCAN: + if FAmmo[A_FUEL] < FMaxAmmo[A_FUEL] then + begin + IncMax(FAmmo[A_FUEL], 100, FMaxAmmo[A_FUEL]); + Result := True; + remove := True; + if gFlash = 2 then Inc(FPickup, 5); + end; + ITEM_AMMO_BACKPACK: if not(R_ITEM_BACKPACK in FRulez) or (FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS]) or (FAmmo[A_SHELLS] < FMaxAmmo[A_SHELLS]) or (FAmmo[A_ROCKETS] < FMaxAmmo[A_ROCKETS]) or - (FAmmo[A_CELLS] < FMaxAmmo[A_CELLS]) then + (FAmmo[A_CELLS] < FMaxAmmo[A_CELLS]) or + (FMaxAmmo[A_FUEL] < AmmoLimits[1, A_FUEL]) then begin - FMaxAmmo[A_BULLETS] := 400; - FMaxAmmo[A_SHELLS] := 100; - FMaxAmmo[A_ROCKETS] := 100; - FMaxAmmo[A_CELLS] := 600; + FMaxAmmo[A_BULLETS] := AmmoLimits[1, A_BULLETS]; + FMaxAmmo[A_SHELLS] := AmmoLimits[1, A_SHELLS]; + FMaxAmmo[A_ROCKETS] := AmmoLimits[1, A_ROCKETS]; + FMaxAmmo[A_CELLS] := AmmoLimits[1, A_CELLS]; + FMaxAmmo[A_FUEL] := AmmoLimits[1, A_FUEL]; if FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS] then IncMax(FAmmo[A_BULLETS], 10, FMaxAmmo[A_BULLETS]); @@ -4126,10 +4185,11 @@ begin FAmmo[A_BULLETS] := 50; - FMaxAmmo[A_BULLETS] := 200; - FMaxAmmo[A_SHELLS] := 50; - FMaxAmmo[A_ROCKETS] := 50; - FMaxAmmo[A_CELLS] := 300; + FMaxAmmo[A_BULLETS] := AmmoLimits[0, A_BULLETS]; + FMaxAmmo[A_SHELLS] := AmmoLimits[0, A_SHELLS]; + FMaxAmmo[A_ROCKETS] := AmmoLimits[0, A_SHELLS]; + 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 FRulez := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE] @@ -4767,6 +4827,29 @@ begin end else if FAir < AIR_DEF then FAir := AIR_DEF; + if FFireTime > 0 then + begin + if BodyInLiquid(0, 0) then + begin + FFireTime := 0; + FFirePainTime := 0; + end + else + begin + OnFireFlame(1); + if FFirePainTime <= 0 then + begin + if g_Game_IsServer then + Damage(5, 0, 0, 0, HIT_FLAME); + FFirePainTime := 18; + end; + FFirePainTime := FFirePainTime - 1; + FFireTime := FFireTime - 1; + if (FFireTime = 0) and g_Game_IsNet and g_Game_IsServer then + MH_SEND_PlayerStats(FUID); + end; + end; + if FDamageBuffer > 0 then begin if FDamageBuffer >= 9 then @@ -5038,6 +5121,13 @@ begin g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX, GameVelX, GameVelY-2, SHELL_SHELL); end; + + WEAPON_FLAMETHROWER: + begin + g_Weapon_flame(wx, wy, xd, yd, FUID, WID); + FFireAngle := FAngle; + f := True; + end; end; if not f then Exit; @@ -5722,6 +5812,7 @@ begin ITEM_WEAPON_PLASMA: FWeapon[WEAPON_PLASMA] := True; ITEM_WEAPON_BFG: FWeapon[WEAPON_BFG] := True; ITEM_WEAPON_SUPERPULEMET: FWeapon[WEAPON_SUPERPULEMET] := True; + ITEM_WEAPON_FLAMETHROWER: FWeapon[WEAPON_FLAMETHROWER] := True; ITEM_AMMO_BULLETS: if FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS] then IncMax(FAmmo[A_BULLETS], 10, FMaxAmmo[A_BULLETS]); ITEM_AMMO_BULLETS_BOX: if FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS] then IncMax(FAmmo[A_BULLETS], 50, FMaxAmmo[A_BULLETS]); @@ -5731,17 +5822,20 @@ begin ITEM_AMMO_ROCKET_BOX: if FAmmo[A_ROCKETS] < FMaxAmmo[A_ROCKETS] then IncMax(FAmmo[A_ROCKETS], 5, FMaxAmmo[A_ROCKETS]); ITEM_AMMO_CELL: if FAmmo[A_CELLS] < FMaxAmmo[A_CELLS] then IncMax(FAmmo[A_CELLS], 40, FMaxAmmo[A_CELLS]); ITEM_AMMO_CELL_BIG: if FAmmo[A_CELLS] < FMaxAmmo[A_CELLS] then IncMax(FAmmo[A_CELLS], 100, FMaxAmmo[A_CELLS]); + ITEM_AMMO_FUELCAN: if FAmmo[A_FUEL] < FMaxAmmo[A_FUEL] then IncMax(FAmmo[A_FUEL], 100, FMaxAmmo[A_FUEL]); ITEM_AMMO_BACKPACK: if (FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS]) or (FAmmo[A_SHELLS] < FMaxAmmo[A_SHELLS]) or (FAmmo[A_ROCKETS] < FMaxAmmo[A_ROCKETS]) or - (FAmmo[A_CELLS] < FMaxAmmo[A_CELLS]) then + (FAmmo[A_CELLS] < FMaxAmmo[A_CELLS]) or + (FMaxAmmo[A_FUEL] < AmmoLimits[1, A_FUEL]) then begin - FMaxAmmo[A_BULLETS] := 400; - FMaxAmmo[A_SHELLS] := 100; - FMaxAmmo[A_ROCKETS] := 100; - FMaxAmmo[A_CELLS] := 600; + FMaxAmmo[A_BULLETS] := AmmoLimits[1, A_BULLETS]; + FMaxAmmo[A_SHELLS] := AmmoLimits[1, A_SHELLS]; + FMaxAmmo[A_ROCKETS] := AmmoLimits[1, A_ROCKETS]; + FMaxAmmo[A_CELLS] := AmmoLimits[1, A_CELLS]; + FMaxAmmo[A_FUEL] := AmmoLimits[1, A_FUEL]; if FAmmo[A_BULLETS] < FMaxAmmo[A_BULLETS] then IncMax(FAmmo[A_BULLETS], 10, FMaxAmmo[A_BULLETS]); if FAmmo[A_SHELLS] < FMaxAmmo[A_SHELLS] then IncMax(FAmmo[A_SHELLS], 4, FMaxAmmo[A_SHELLS]); @@ -5797,6 +5891,27 @@ begin end; end; +procedure TPlayer.OnFireFlame(Times: DWORD = 1); +var + id, i: DWORD; + Anim: TAnimation; +begin + if (Random(10) = 1) and (Times = 1) then + Exit; + + if g_Frames_Get(id, 'FRAMES_FLAME') then + begin + for i := 1 to Times do + begin + Anim := TAnimation.Create(id, False, 3); + Anim.Alpha := 0; + g_GFX_OnceAnim(Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(Anim.Width div 2), + Obj.Y+8+Random(8+Times*2), Anim, ONCEANIM_SMOKE); + Anim.Free(); + end; + end; +end; + procedure TPlayer.PauseSounds(Enable: Boolean); begin FSawSound.Pause(Enable); @@ -6106,7 +6221,7 @@ begin case FCurrWeap of WEAPON_PLASMA, WEAPON_SUPERPULEMET, WEAPON_CHAINGUN: PressKey(KEY_FIRE, 20); - WEAPON_SAW, WEAPON_KASTET, WEAPON_MEGAKASTET: PressKey(KEY_FIRE, 40); + WEAPON_SAW, WEAPON_KASTET, WEAPON_FLAMETHROWER: PressKey(KEY_FIRE, 40); else PressKey(KEY_FIRE); end; end; @@ -7078,6 +7193,7 @@ var WEAPON_PLASMA: Result := FAmmo[A_CELLS] >= 10; WEAPON_BFG: Result := FAmmo[A_CELLS] >= 40; WEAPON_SUPERPULEMET: Result := FAmmo[A_SHELLS] >= 1; + WEAPON_FLAMETHROWER: Result := FAmmo[A_FUEL] >= 1; else Result := True; end; end;