hedgewars/uGearsUtils.pas
author koda
Sun, 29 Jan 2012 18:52:01 +0100
changeset 6613 c7bf3b7c49dd
parent 6581 e510d1245bd7
child 6700 e04da46ee43c
permissions -rw-r--r--
disabling the discovery of SDL13+ on desktop. SDL13 has become SDL2 with a completely different ABI and will require a new FindSDL2 module for Cmake to be found; for current sdl development installations, hedgewars will either use the compatibility layer (present in sdl1.3 but not in sdl2) or just fail to build (in case sdl2 is installed but sdl1.2.* is not). whew
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6581
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     1
(*
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     2
 * Hedgewars, a free turn based strategy game
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     3
 * Copyright (c) 2004-2011 Andrey Korotaev <unC0Rr@gmail.com>
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     4
 *
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     8
 *
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    12
 * GNU General Public License for more details.
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    13
 *
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    14
 * You should have received a copy of the GNU General Public License
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    15
 * along with this program; if not, write to the Free Software
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    17
 *)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    18
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    19
{$INCLUDE "options.inc"}
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    20
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    21
unit uGearsUtils;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    22
interface
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    23
uses uTypes;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    24
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    25
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord = $FFFFFFFF); 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    26
function  ModifyDamage(dmg: Longword; Gear: PGear): Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    27
procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    28
procedure spawnHealthTagForHH(HHGear: PGear; dmg: Longword);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    29
procedure HHHurt(Hedgehog: PHedgehog; Source: TDamageSource);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    30
procedure CheckHHDamage(Gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    31
procedure CalcRotationDirAngle(Gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    32
procedure ResurrectHedgehog(gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    33
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean = false);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    34
function  CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    35
function  CheckGearsNear(mX, mY: LongInt; Kind: TGearsType; rX, rY: LongInt): PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    36
function  CheckGearDrowning(Gear: PGear): boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    37
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    38
var doStepHandlers: array[TGearType] of TGearStepProcedure;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    39
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    40
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    41
implementation
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    42
uses uFloat, uSound, uCollisions, uUtils, uConsts, uVisualGears, uAIMisc,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    43
    uVariables, uLandGraphics, uScript, uStats, uCaptions, uTeams, uStore,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    44
    uLocale, uTextures, uRenderUtils, uRandom, SDLh, uDebug, uGears,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    45
    uGearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    46
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    47
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    48
var Gear: PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    49
    dmg, dmgRadius, dmgBase: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    50
    fX, fY: hwFloat;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    51
    vg: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    52
    i, cnt: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    53
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    54
if Radius > 4 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')');
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    55
if Radius > 25 then KickFlakes(Radius, X, Y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    56
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    57
if ((Mask and EXPLNoGfx) = 0) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    58
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    59
    vg:= nil;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    60
    if Radius > 50 then vg:= AddVisualGear(X, Y, vgtBigExplosion)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    61
    else if Radius > 10 then vg:= AddVisualGear(X, Y, vgtExplosion);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    62
    if vg <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    63
        vg^.Tint:= Tint;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    64
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    65
if (Mask and EXPLAutoSound) <> 0 then PlaySound(sndExplosion);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    66
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    67
if (Mask and EXPLAllDamageInRadius) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    68
    dmgRadius:= Radius shl 1
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    69
else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    70
    dmgRadius:= Radius;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    71
dmgBase:= dmgRadius + cHHRadius div 2;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    72
fX:= int2hwFloat(X);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    73
fY:= int2hwFloat(Y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    74
Gear:= GearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    75
while Gear <> nil do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    76
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    77
    dmg:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    78
    //dmg:= dmgRadius  + cHHRadius div 2 - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y)));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    79
    //if (dmg > 1) and
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    80
    if (Gear^.State and gstNoDamage) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    81
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    82
        case Gear^.Kind of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    83
            gtHedgehog,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    84
                gtMine,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    85
                gtBall,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    86
                gtMelonPiece,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    87
                gtGrenade,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    88
                gtClusterBomb,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    89
            //    gtCluster, too game breaking I think
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    90
                gtSMine,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    91
                gtCase,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    92
                gtTarget,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    93
                gtFlame,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    94
                gtExplosives,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    95
                gtStructure: begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    96
// Run the calcs only once we know we have a type that will need damage
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    97
                        if hwRound(hwAbs(Gear^.X-fX)+hwAbs(Gear^.Y-fY)) < dmgBase then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    98
                            dmg:= dmgBase - max(hwRound(Distance(Gear^.X - fX, Gear^.Y - fY)),Gear^.Radius);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    99
                        if dmg > 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   100
                            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   101
                            dmg:= ModifyDamage(min(dmg div 2, Radius), Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   102
                            //AddFileLog('Damage: ' + inttostr(dmg));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   103
                            if (Mask and EXPLNoDamage) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   104
                                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   105
                                if not Gear^.Invulnerable then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   106
                                    ApplyDamage(Gear, AttackingHog, dmg, dsExplosion)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   107
                                else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   108
                                    Gear^.State:= Gear^.State or gstWinner;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   109
                                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   110
                            if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   111
                                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   112
                                DeleteCI(Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   113
                                Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, Gear^.X - fX)/(Gear^.Density/_3);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   114
                                Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, Gear^.Y - fY)/(Gear^.Density/_3);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   115
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   116
                                Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   117
                                if not Gear^.Invulnerable then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   118
                                    Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   119
                                Gear^.Active:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   120
                                if Gear^.Kind <> gtFlame then FollowGear:= Gear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   121
                                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   122
                            if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (not Gear^.Invulnerable) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   123
                                Gear^.Hedgehog^.Effects[hePoisoned] := true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   124
                            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   125
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   126
                        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   127
                gtGrave: begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   128
// Run the calcs only once we know we have a type that will need damage
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   129
                        if hwRound(hwAbs(Gear^.X-fX)+hwAbs(Gear^.Y-fY)) < dmgBase then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   130
                            dmg:= dmgBase - hwRound(Distance(Gear^.X - fX, Gear^.Y - fY));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   131
                        if dmg > 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   132
                            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   133
                            dmg:= ModifyDamage(min(dmg div 2, Radius), Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   134
                            Gear^.dY:= - _0_004 * dmg;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   135
                            Gear^.Active:= true
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   136
                            end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   137
                        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   138
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   139
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   140
    Gear:= Gear^.NextGear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   141
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   142
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   143
if (Mask and EXPLDontDraw) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   144
    if (GameFlags and gfSolidLand) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   145
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   146
        cnt:= DrawExplosion(X, Y, Radius) div 1608; // approx 2 16x16 circles to erase per chunk
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   147
        if (cnt > 0) and (SpritesData[sprChunk].Texture <> nil) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   148
            for i:= 0 to cnt do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   149
                AddVisualGear(X, Y, vgtChunk)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   150
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   151
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   152
uAIMisc.AwareOfExplosion(0, 0, 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   153
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   154
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   155
function ModifyDamage(dmg: Longword; Gear: PGear): Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   156
var i: hwFloat;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   157
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   158
(* Invulnerability cannot be placed in here due to still needing kicks
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   159
   Not without a new damage machine.
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   160
   King check should be in here instead of ApplyDamage since Tiy wants them kicked less
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   161
*)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   162
i:= _1;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   163
if (CurrentHedgehog <> nil) and CurrentHedgehog^.King then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   164
    i:= _1_5;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   165
if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.King) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   166
    ModifyDamage:= hwRound(_0_01 * cDamageModifier * dmg * i * cDamagePercent * _0_5)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   167
else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   168
    ModifyDamage:= hwRound(_0_01 * cDamageModifier * dmg * i * cDamagePercent)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   169
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   170
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   171
procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   172
var s: shortstring;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   173
    vampDmg, tmpDmg, i: Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   174
    vg: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   175
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   176
    if Damage = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   177
        exit; // nothing to apply
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   178
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   179
    if (Gear^.Kind = gtHedgehog) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   180
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   181
        Gear^.LastDamage := AttackerHog;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   182
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   183
        Gear^.Hedgehog^.Team^.Clan^.Flawless:= false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   184
        HHHurt(Gear^.Hedgehog, Source);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   185
        AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), Damage, Gear^.Hedgehog^.Team^.Clan^.Color);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   186
        tmpDmg:= min(Damage, max(0,Gear^.Health-Gear^.Damage));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   187
        if (Gear <> CurrentHedgehog^.Gear) and (CurrentHedgehog^.Gear <> nil) and (tmpDmg >= 1) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   188
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   189
            if cVampiric then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   190
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   191
                vampDmg:= hwRound(int2hwFloat(tmpDmg)*_0_8);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   192
                if vampDmg >= 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   193
                    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   194
                    // was considering pulsing on attack, Tiy thinks it should be permanent while in play
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   195
                    //CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State or gstVampiric;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   196
                    inc(CurrentHedgehog^.Gear^.Health,vampDmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   197
                    str(vampDmg, s);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   198
                    s:= '+' + s;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   199
                    AddCaption(s, CurrentHedgehog^.Team^.Clan^.Color, capgrpAmmoinfo);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   200
                    RenderHealth(CurrentHedgehog^);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   201
                    RecountTeamHealth(CurrentHedgehog^.Team);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   202
                    i:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   203
                    while i < vampDmg do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   204
                        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   205
                        vg:= AddVisualGear(hwRound(CurrentHedgehog^.Gear^.X), hwRound(CurrentHedgehog^.Gear^.Y), vgtStraightShot);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   206
                        if vg <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   207
                            with vg^ do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   208
                                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   209
                                Tint:= $FF0000FF;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   210
                                State:= ord(sprHealth)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   211
                                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   212
                        inc(i, 5);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   213
                        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   214
                    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   215
                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   216
        if ((GameFlags and gfKarma) <> 0) and 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   217
        ((GameFlags and gfInvulnerable) = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   218
        and (not CurrentHedgehog^.Gear^.Invulnerable) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   219
            begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   220
            inc(CurrentHedgehog^.Gear^.Karma, tmpDmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   221
            CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   222
            spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   223
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   224
        uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false);    
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   225
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   226
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   227
    else if Gear^.Kind <> gtStructure then // not gtHedgehog nor gtStructure
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   228
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   229
        Gear^.Hedgehog:= AttackerHog;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   230
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   231
    inc(Gear^.Damage, Damage);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   232
    
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   233
    ScriptCall('onGearDamage', Gear^.UID, Damage);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   234
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   235
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   236
procedure spawnHealthTagForHH(HHGear: PGear; dmg: Longword);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   237
var tag: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   238
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   239
tag:= AddVisualGear(hwRound(HHGear^.X), hwRound(HHGear^.Y), vgtHealthTag, dmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   240
if (tag <> nil) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   241
    tag^.Hedgehog:= HHGear^.Hedgehog; // the tag needs the tag to determine the text color
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   242
AllInactive:= false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   243
HHGear^.Active:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   244
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   245
    
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   246
procedure HHHurt(Hedgehog: PHedgehog; Source: TDamageSource);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   247
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   248
if (Source = dsFall) or (Source = dsExplosion) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   249
    case random(3) of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   250
        0: PlaySound(sndOoff1, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   251
        1: PlaySound(sndOoff2, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   252
        2: PlaySound(sndOoff3, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   253
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   254
else if (Source = dsPoison) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   255
    case random(2) of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   256
        0: PlaySound(sndPoisonCough, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   257
        1: PlaySound(sndPoisonMoan, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   258
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   259
else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   260
    case random(4) of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   261
        0: PlaySound(sndOw1, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   262
        1: PlaySound(sndOw2, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   263
        2: PlaySound(sndOw3, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   264
        3: PlaySound(sndOw4, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   265
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   266
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   267
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   268
procedure CheckHHDamage(Gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   269
var 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   270
    dmg: Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   271
    i: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   272
    particle: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   273
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   274
    if _0_4 < Gear^.dY then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   275
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   276
        dmg := ModifyDamage(1 + hwRound((hwAbs(Gear^.dY) - _0_4) * 70), Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   277
        PlaySound(sndBump);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   278
        if dmg < 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   279
            exit;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   280
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   281
        for i:= min(12, (3 + dmg div 10)) downto 0 do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   282
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   283
            particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   284
            if particle <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   285
                particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   286
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   287
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   288
        if (Gear^.Invulnerable) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   289
            exit;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   290
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   291
        //if _0_6 < Gear^.dY then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   292
        //    PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   293
        //else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   294
        //    PlaySound(sndOw1, Gear^.Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   295
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   296
        if Gear^.LastDamage <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   297
            ApplyDamage(Gear, Gear^.LastDamage, dmg, dsFall)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   298
        else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   299
            ApplyDamage(Gear, CurrentHedgehog, dmg, dsFall);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   300
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   301
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   302
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   303
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   304
procedure CalcRotationDirAngle(Gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   305
var 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   306
    dAngle: real;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   307
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   308
    dAngle := (Gear^.dX.QWordValue + Gear^.dY.QWordValue) / $80000000;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   309
    if not Gear^.dX.isNegative then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   310
        Gear^.DirAngle := Gear^.DirAngle + dAngle
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   311
    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   312
        Gear^.DirAngle := Gear^.DirAngle - dAngle;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   313
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   314
    if Gear^.DirAngle < 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   315
        Gear^.DirAngle := Gear^.DirAngle + 360
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   316
    else if 360 < Gear^.DirAngle then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   317
        Gear^.DirAngle := Gear^.DirAngle - 360
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   318
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   319
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   320
function CheckGearDrowning(Gear: PGear): boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   321
var 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   322
    skipSpeed, skipAngle, skipDecay: hwFloat;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   323
    i, maxDrops, X, Y: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   324
    vdX, vdY: real;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   325
    particle: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   326
    isSubmersible: boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   327
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   328
    // probably needs tweaking. might need to be in a case statement based upon gear type
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   329
    Y:= hwRound(Gear^.Y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   330
    if cWaterLine < Y + Gear^.Radius then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   331
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   332
        isSubmersible:= (Gear = CurrentHedgehog^.Gear) and (CurAmmoGear <> nil) and (CurAmmoGear^.AmmoType = amJetpack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   333
        skipSpeed := _0_25;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   334
        skipAngle := _1_9;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   335
        skipDecay := _0_87;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   336
        X:= hwRound(Gear^.X);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   337
        vdX:= hwFloat2Float(Gear^.dX);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   338
        vdY:= hwFloat2Float(Gear^.dY);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   339
        // this could perhaps be a tiny bit higher.
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   340
        if  (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > skipSpeed)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   341
        and (hwAbs(Gear^.dX) > skipAngle * hwAbs(Gear^.dY)) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   342
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   343
            Gear^.dY.isNegative := true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   344
            Gear^.dY := Gear^.dY * skipDecay;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   345
            Gear^.dX := Gear^.dX * skipDecay;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   346
            CheckGearDrowning := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   347
            PlaySound(sndSkip)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   348
            end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   349
        else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   350
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   351
            if not isSubmersible then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   352
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   353
                CheckGearDrowning := true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   354
                Gear^.State := gstDrowning;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   355
                Gear^.RenderTimer := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   356
                if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   357
                and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   358
                    if Gear^.Kind = gtHedgehog then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   359
                        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   360
                        if Gear^.Hedgehog^.Effects[heResurrectable] then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   361
                            ResurrectHedgehog(Gear)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   362
                        else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   363
                            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   364
                            Gear^.doStep := @doStepDrowningGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   365
                            Gear^.State := Gear^.State and (not gstHHDriven);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   366
                            AddCaption(Format(GetEventString(eidDrowned), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   367
                            end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   368
                        end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   369
                    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   370
                        Gear^.doStep := @doStepDrowningGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   371
                        if Gear^.Kind = gtFlake then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   372
                            exit // skip splashes 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   373
                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   374
            if ((not isSubmersible) and (Y < cWaterLine + 64 + Gear^.Radius))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   375
            or (isSubmersible and (Y < cWaterLine + 2 + Gear^.Radius) and ((CurAmmoGear^.Pos = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   376
            and (CurAmmoGear^.dY < _0_01))) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   377
                // don't play splash if they are already way past the surface
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   378
                PlaySound(sndSplash)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   379
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   380
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   381
        if ((cReducedQuality and rqPlainSplash) = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   382
        and (((not isSubmersible) and (Y < cWaterLine + 64 + Gear^.Radius))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   383
        or (isSubmersible and (Y < cWaterLine + 2 + Gear^.Radius) and ((CurAmmoGear^.Pos = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   384
        and (CurAmmoGear^.dY < _0_01)))) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   385
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   386
            AddVisualGear(X, cWaterLine, vgtSplash);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   387
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   388
            maxDrops := (Gear^.Radius div 2) + round(vdX * Gear^.Radius * 2) + round(vdY * Gear^.Radius * 2);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   389
            for i:= max(maxDrops div 3, min(32, Random(maxDrops))) downto 0 do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   390
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   391
                particle := AddVisualGear(X - 3 + Random(6), cWaterLine, vgtDroplet);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   392
                if particle <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   393
                    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   394
                    particle^.dX := particle^.dX - vdX / 10;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   395
                    particle^.dY := particle^.dY - vdY / 5;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   396
                    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   397
                end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   398
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   399
        if isSubmersible and (CurAmmoGear^.Pos = 0) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   400
            CurAmmoGear^.Pos := 1000
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   401
        end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   402
    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   403
        CheckGearDrowning := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   404
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   405
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   406
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   407
procedure ResurrectHedgehog(gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   408
var tempTeam : PTeam;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   409
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   410
    AttackBar:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   411
    gear^.dX := _0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   412
    gear^.dY := _0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   413
    gear^.Damage := 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   414
    gear^.Health := gear^.Hedgehog^.InitialHealth;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   415
    gear^.Hedgehog^.Effects[hePoisoned] := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   416
    if not CurrentHedgehog^.Effects[heResurrectable] then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   417
        with CurrentHedgehog^ do 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   418
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   419
            inc(Team^.stats.AIKills);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   420
            FreeTexture(Team^.AIKillsTex);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   421
            Team^.AIKillsTex := RenderStringTex(inttostr(Team^.stats.AIKills), Team^.Clan^.Color, fnt16);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   422
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   423
    tempTeam := gear^.Hedgehog^.Team;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   424
    DeleteCI(gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   425
    FindPlace(gear, false, 0, LAND_WIDTH, true); 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   426
    if gear <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   427
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   428
        RenderHealth(gear^.Hedgehog^);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   429
        ScriptCall('onGearResurrect', gear^.uid);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   430
        gear^.State := gstWait;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   431
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   432
    RecountTeamHealth(tempTeam);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   433
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   434
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   435
function CountNonZeroz(x, y, r, c: LongInt): LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   436
var i: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   437
    count: LongInt = 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   438
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   439
if (y and LAND_HEIGHT_MASK) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   440
    for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 4) do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   441
        if Land[y, i] <> 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   442
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   443
            inc(count);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   444
            if count = c then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   445
                exit(count)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   446
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   447
CountNonZeroz:= count;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   448
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   449
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   450
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   451
var x: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   452
    y, sy: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   453
    ar: array[0..511] of TPoint;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   454
    ar2: array[0..1023] of TPoint;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   455
    cnt, cnt2: Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   456
    delta: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   457
    reallySkip, tryAgain: boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   458
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   459
reallySkip:= false; // try not skipping proximity at first
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   460
tryAgain:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   461
while tryAgain do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   462
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   463
    delta:= 250;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   464
    cnt2:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   465
    repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   466
        x:= Left + LongInt(GetRandom(Delta));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   467
        repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   468
            inc(x, Delta);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   469
            cnt:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   470
            y:= min(1024, topY) - 2 * Gear^.Radius;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   471
            while y < cWaterLine do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   472
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   473
                repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   474
                    inc(y, 2);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   475
                until (y >= cWaterLine) or (CountNonZeroz(x, y, Gear^.Radius - 1, 1) = 0);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   476
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   477
                sy:= y;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   478
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   479
                repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   480
                    inc(y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   481
                until (y >= cWaterLine) or (CountNonZeroz(x, y, Gear^.Radius - 1, 1) <> 0);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   482
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   483
                if (y - sy > Gear^.Radius * 2)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   484
                    and (((Gear^.Kind = gtExplosives)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   485
                    and (y < cWaterLine)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   486
                    and (reallySkip or (CheckGearsNear(x, y - Gear^.Radius, [gtFlame, gtHedgehog, gtMine, gtCase, gtExplosives], 60, 60) = nil))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   487
                    and (CountNonZeroz(x, y+1, Gear^.Radius - 1, Gear^.Radius+1) > Gear^.Radius))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   488
                or
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   489
                    ((Gear^.Kind <> gtExplosives)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   490
                    and (y < cWaterLine)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   491
                    and (reallySkip or (CheckGearsNear(x, y - Gear^.Radius, [gtFlame, gtHedgehog, gtMine, gtCase, gtExplosives], 110, 110) = nil)))) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   492
                 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   493
                          begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   494
                    ar[cnt].X:= x;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   495
                    if withFall then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   496
                        ar[cnt].Y:= sy + Gear^.Radius
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   497
                    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   498
                        ar[cnt].Y:= y - Gear^.Radius;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   499
                    inc(cnt)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   500
                    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   501
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   502
                inc(y, 45)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   503
                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   504
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   505
            if cnt > 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   506
                with ar[GetRandom(cnt)] do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   507
                    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   508
                    ar2[cnt2].x:= x;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   509
                    ar2[cnt2].y:= y;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   510
                    inc(cnt2)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   511
                    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   512
        until (x + Delta > Right);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   513
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   514
        dec(Delta, 60)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   515
    until (cnt2 > 0) or (Delta < 70);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   516
    if (cnt2 = 0) and skipProximity and (not reallySkip) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   517
        tryAgain:= true
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   518
    else tryAgain:= false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   519
    reallySkip:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   520
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   521
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   522
if cnt2 > 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   523
    with ar2[GetRandom(cnt2)] do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   524
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   525
        Gear^.X:= int2hwFloat(x);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   526
        Gear^.Y:= int2hwFloat(y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   527
        AddFileLog('Assigned Gear coordinates (' + inttostr(x) + ',' + inttostr(y) + ')');
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   528
        end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   529
    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   530
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   531
    OutError('Can''t find place for Gear', false);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   532
    if Gear^.Kind = gtHedgehog then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   533
        Gear^.Hedgehog^.Effects[heResurrectable] := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   534
    DeleteGear(Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   535
    Gear:= nil
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   536
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   537
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   538
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   539
function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   540
var t: PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   541
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   542
t:= GearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   543
rX:= sqr(rX);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   544
rY:= sqr(rY);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   545
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   546
while t <> nil do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   547
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   548
    if (t <> Gear) and (t^.Kind = Kind) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   549
        if not((hwSqr(Gear^.X - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   550
        exit(t);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   551
    t:= t^.NextGear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   552
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   553
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   554
CheckGearNear:= nil
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   555
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   556
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   557
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   558
function CheckGearsNear(mX, mY: LongInt; Kind: TGearsType; rX, rY: LongInt): PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   559
var t: PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   560
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   561
t:= GearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   562
rX:= sqr(rX);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   563
rY:= sqr(rY);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   564
while t <> nil do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   565
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   566
    if t^.Kind in Kind then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   567
        if not (hwSqr(int2hwFloat(mX) - t^.X) / rX + hwSqr(int2hwFloat(mY) - t^.Y) / rY > _1) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   568
            exit(t);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   569
    t:= t^.NextGear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   570
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   571
CheckGearsNear:= nil
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   572
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   573
end.