hedgewars/uGearsUtils.pas
author nemo
Sun, 11 Mar 2012 20:12:31 -0400
changeset 6770 7d2c6cdb816a
parent 6769 44ad49a3a126
child 6803 0e70f3ea3bf8
permissions -rw-r--r--
Start on adding drowning bonus to bat/firepunch/whip. AI still is not smart enough to change direction when firepunching to face the water, or change the angle of the bat. Also try to weight cost of switches based on how many switches were available.
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
6700
e04da46ee43c the most important commit of the year
koda
parents: 6581
diff changeset
     3
 * Copyright (c) 2004-2012 Andrey Korotaev <unC0Rr@gmail.com>
6581
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;
6769
44ad49a3a126 Add drowning to grenade too, try some little optimisations
nemo
parents: 6765
diff changeset
    49
    dmg, dmgBase: LongInt;
6765
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
    50
    fX, fY, tdX, tdY: hwFloat;
6581
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
6765
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
    67
(*if (Mask and EXPLAllDamageInRadius) = 0 then
6581
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;
6765
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
    71
dmgBase:= dmgRadius + cHHRadius div 2;*)
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
    72
dmgBase:= Radius shl 1 + cHHRadius div 2;
6581
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    73
fX:= int2hwFloat(X);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    74
fY:= int2hwFloat(Y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    75
Gear:= GearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    76
while Gear <> nil do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    77
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    78
    dmg:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    79
    //dmg:= dmgRadius  + cHHRadius div 2 - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y)));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    80
    //if (dmg > 1) and
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    81
    if (Gear^.State and gstNoDamage) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    82
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    83
        case Gear^.Kind of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    84
            gtHedgehog,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    85
                gtMine,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    86
                gtBall,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    87
                gtMelonPiece,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    88
                gtGrenade,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    89
                gtClusterBomb,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    90
            //    gtCluster, too game breaking I think
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    91
                gtSMine,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    92
                gtCase,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    93
                gtTarget,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    94
                gtFlame,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    95
                gtExplosives,
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    96
                gtStructure: begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
    97
// Run the calcs only once we know we have a type that will need damage
6765
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
    98
                        tdX:= Gear^.X-fX;
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
    99
                        tdY:= Gear^.Y-fY;
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   100
                        if hwRound(hwAbs(tdX)+hwAbs(tdY)) < dmgBase then
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   101
                            dmg:= dmgBase - max(hwRound(Distance(tdX, tdY)),Gear^.Radius);
6581
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   102
                        if dmg > 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   103
                            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   104
                            dmg:= ModifyDamage(min(dmg div 2, Radius), Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   105
                            //AddFileLog('Damage: ' + inttostr(dmg));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   106
                            if (Mask and EXPLNoDamage) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   107
                                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   108
                                if not Gear^.Invulnerable then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   109
                                    ApplyDamage(Gear, AttackingHog, dmg, dsExplosion)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   110
                                else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   111
                                    Gear^.State:= Gear^.State or gstWinner;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   112
                                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   113
                            if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   114
                                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   115
                                DeleteCI(Gear);
6765
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   116
                                Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3);
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   117
                                Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3);
6581
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   118
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   119
                                Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   120
                                if not Gear^.Invulnerable then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   121
                                    Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   122
                                Gear^.Active:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   123
                                if Gear^.Kind <> gtFlame then FollowGear:= Gear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   124
                                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   125
                            if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (not Gear^.Invulnerable) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   126
                                Gear^.Hedgehog^.Effects[hePoisoned] := true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   127
                            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   128
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   129
                        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   130
                gtGrave: begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   131
// Run the calcs only once we know we have a type that will need damage
6765
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   132
                        tdX:= Gear^.X-fX;
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   133
                        tdY:= Gear^.Y-fY;
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   134
                        if hwRound(hwAbs(tdX)+hwAbs(tdY)) < dmgBase then
8fcd2508c49f bug #336
nemo
parents: 6700
diff changeset
   135
                            dmg:= dmgBase - hwRound(Distance(tdX, tdY));
6581
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   136
                        if dmg > 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   137
                            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   138
                            dmg:= ModifyDamage(min(dmg div 2, Radius), Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   139
                            Gear^.dY:= - _0_004 * dmg;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   140
                            Gear^.Active:= true
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   141
                            end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   142
                        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   143
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   144
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   145
    Gear:= Gear^.NextGear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   146
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   147
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   148
if (Mask and EXPLDontDraw) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   149
    if (GameFlags and gfSolidLand) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   150
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   151
        cnt:= DrawExplosion(X, Y, Radius) div 1608; // approx 2 16x16 circles to erase per chunk
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   152
        if (cnt > 0) and (SpritesData[sprChunk].Texture <> nil) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   153
            for i:= 0 to cnt do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   154
                AddVisualGear(X, Y, vgtChunk)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   155
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   156
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   157
uAIMisc.AwareOfExplosion(0, 0, 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   158
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   159
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   160
function ModifyDamage(dmg: Longword; Gear: PGear): Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   161
var i: hwFloat;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   162
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   163
(* Invulnerability cannot be placed in here due to still needing kicks
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   164
   Not without a new damage machine.
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   165
   King check should be in here instead of ApplyDamage since Tiy wants them kicked less
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   166
*)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   167
i:= _1;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   168
if (CurrentHedgehog <> nil) and CurrentHedgehog^.King then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   169
    i:= _1_5;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   170
if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.King) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   171
    ModifyDamage:= hwRound(_0_01 * cDamageModifier * dmg * i * cDamagePercent * _0_5)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   172
else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   173
    ModifyDamage:= hwRound(_0_01 * cDamageModifier * dmg * i * cDamagePercent)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   174
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   175
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   176
procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   177
var s: shortstring;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   178
    vampDmg, tmpDmg, i: Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   179
    vg: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   180
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   181
    if Damage = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   182
        exit; // nothing to apply
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   183
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   184
    if (Gear^.Kind = gtHedgehog) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   185
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   186
        Gear^.LastDamage := AttackerHog;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   187
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   188
        Gear^.Hedgehog^.Team^.Clan^.Flawless:= false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   189
        HHHurt(Gear^.Hedgehog, Source);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   190
        AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), Damage, Gear^.Hedgehog^.Team^.Clan^.Color);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   191
        tmpDmg:= min(Damage, max(0,Gear^.Health-Gear^.Damage));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   192
        if (Gear <> CurrentHedgehog^.Gear) and (CurrentHedgehog^.Gear <> nil) and (tmpDmg >= 1) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   193
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   194
            if cVampiric then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   195
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   196
                vampDmg:= hwRound(int2hwFloat(tmpDmg)*_0_8);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   197
                if vampDmg >= 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   198
                    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   199
                    // was considering pulsing on attack, Tiy thinks it should be permanent while in play
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   200
                    //CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State or gstVampiric;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   201
                    inc(CurrentHedgehog^.Gear^.Health,vampDmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   202
                    str(vampDmg, s);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   203
                    s:= '+' + s;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   204
                    AddCaption(s, CurrentHedgehog^.Team^.Clan^.Color, capgrpAmmoinfo);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   205
                    RenderHealth(CurrentHedgehog^);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   206
                    RecountTeamHealth(CurrentHedgehog^.Team);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   207
                    i:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   208
                    while i < vampDmg do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   209
                        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   210
                        vg:= AddVisualGear(hwRound(CurrentHedgehog^.Gear^.X), hwRound(CurrentHedgehog^.Gear^.Y), vgtStraightShot);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   211
                        if vg <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   212
                            with vg^ do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   213
                                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   214
                                Tint:= $FF0000FF;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   215
                                State:= ord(sprHealth)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   216
                                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   217
                        inc(i, 5);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   218
                        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   219
                    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   220
                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   221
        if ((GameFlags and gfKarma) <> 0) and 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   222
        ((GameFlags and gfInvulnerable) = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   223
        and (not CurrentHedgehog^.Gear^.Invulnerable) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   224
            begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   225
            inc(CurrentHedgehog^.Gear^.Karma, tmpDmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   226
            CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   227
            spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   228
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   229
        uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false);    
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   230
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   231
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   232
    else if Gear^.Kind <> gtStructure then // not gtHedgehog nor gtStructure
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   233
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   234
        Gear^.Hedgehog:= AttackerHog;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   235
        end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   236
    inc(Gear^.Damage, Damage);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   237
    
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   238
    ScriptCall('onGearDamage', Gear^.UID, Damage);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   239
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   240
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   241
procedure spawnHealthTagForHH(HHGear: PGear; dmg: Longword);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   242
var tag: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   243
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   244
tag:= AddVisualGear(hwRound(HHGear^.X), hwRound(HHGear^.Y), vgtHealthTag, dmg);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   245
if (tag <> nil) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   246
    tag^.Hedgehog:= HHGear^.Hedgehog; // the tag needs the tag to determine the text color
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   247
AllInactive:= false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   248
HHGear^.Active:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   249
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   250
    
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   251
procedure HHHurt(Hedgehog: PHedgehog; Source: TDamageSource);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   252
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   253
if (Source = dsFall) or (Source = dsExplosion) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   254
    case random(3) of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   255
        0: PlaySound(sndOoff1, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   256
        1: PlaySound(sndOoff2, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   257
        2: PlaySound(sndOoff3, 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 if (Source = dsPoison) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   260
    case random(2) of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   261
        0: PlaySound(sndPoisonCough, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   262
        1: PlaySound(sndPoisonMoan, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   263
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   264
else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   265
    case random(4) of
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   266
        0: PlaySound(sndOw1, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   267
        1: PlaySound(sndOw2, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   268
        2: PlaySound(sndOw3, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   269
        3: PlaySound(sndOw4, Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   270
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   271
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   272
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   273
procedure CheckHHDamage(Gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   274
var 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   275
    dmg: Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   276
    i: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   277
    particle: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   278
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   279
    if _0_4 < Gear^.dY then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   280
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   281
        dmg := ModifyDamage(1 + hwRound((hwAbs(Gear^.dY) - _0_4) * 70), Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   282
        PlaySound(sndBump);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   283
        if dmg < 1 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   284
            exit;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   285
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   286
        for i:= min(12, (3 + dmg div 10)) downto 0 do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   287
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   288
            particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   289
            if particle <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   290
                particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   291
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   292
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   293
        if (Gear^.Invulnerable) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   294
            exit;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   295
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   296
        //if _0_6 < Gear^.dY then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   297
        //    PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   298
        //else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   299
        //    PlaySound(sndOw1, Gear^.Hedgehog^.Team^.voicepack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   300
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   301
        if Gear^.LastDamage <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   302
            ApplyDamage(Gear, Gear^.LastDamage, dmg, dsFall)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   303
        else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   304
            ApplyDamage(Gear, CurrentHedgehog, dmg, dsFall);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   305
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   306
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   307
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   308
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   309
procedure CalcRotationDirAngle(Gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   310
var 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   311
    dAngle: real;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   312
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   313
    dAngle := (Gear^.dX.QWordValue + Gear^.dY.QWordValue) / $80000000;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   314
    if not Gear^.dX.isNegative then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   315
        Gear^.DirAngle := Gear^.DirAngle + dAngle
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   316
    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   317
        Gear^.DirAngle := Gear^.DirAngle - dAngle;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   318
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   319
    if Gear^.DirAngle < 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   320
        Gear^.DirAngle := Gear^.DirAngle + 360
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   321
    else if 360 < Gear^.DirAngle then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   322
        Gear^.DirAngle := Gear^.DirAngle - 360
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   323
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   324
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   325
function CheckGearDrowning(Gear: PGear): boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   326
var 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   327
    skipSpeed, skipAngle, skipDecay: hwFloat;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   328
    i, maxDrops, X, Y: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   329
    vdX, vdY: real;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   330
    particle: PVisualGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   331
    isSubmersible: boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   332
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   333
    // probably needs tweaking. might need to be in a case statement based upon gear type
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   334
    Y:= hwRound(Gear^.Y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   335
    if cWaterLine < Y + Gear^.Radius then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   336
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   337
        isSubmersible:= (Gear = CurrentHedgehog^.Gear) and (CurAmmoGear <> nil) and (CurAmmoGear^.AmmoType = amJetpack);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   338
        skipSpeed := _0_25;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   339
        skipAngle := _1_9;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   340
        skipDecay := _0_87;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   341
        X:= hwRound(Gear^.X);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   342
        vdX:= hwFloat2Float(Gear^.dX);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   343
        vdY:= hwFloat2Float(Gear^.dY);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   344
        // this could perhaps be a tiny bit higher.
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   345
        if  (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > skipSpeed)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   346
        and (hwAbs(Gear^.dX) > skipAngle * hwAbs(Gear^.dY)) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   347
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   348
            Gear^.dY.isNegative := true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   349
            Gear^.dY := Gear^.dY * skipDecay;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   350
            Gear^.dX := Gear^.dX * skipDecay;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   351
            CheckGearDrowning := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   352
            PlaySound(sndSkip)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   353
            end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   354
        else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   355
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   356
            if not isSubmersible then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   357
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   358
                CheckGearDrowning := true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   359
                Gear^.State := gstDrowning;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   360
                Gear^.RenderTimer := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   361
                if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   362
                and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   363
                    if Gear^.Kind = gtHedgehog then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   364
                        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   365
                        if Gear^.Hedgehog^.Effects[heResurrectable] then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   366
                            ResurrectHedgehog(Gear)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   367
                        else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   368
                            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   369
                            Gear^.doStep := @doStepDrowningGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   370
                            Gear^.State := Gear^.State and (not gstHHDriven);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   371
                            AddCaption(Format(GetEventString(eidDrowned), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   372
                            end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   373
                        end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   374
                    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   375
                        Gear^.doStep := @doStepDrowningGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   376
                        if Gear^.Kind = gtFlake then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   377
                            exit // skip splashes 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   378
                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   379
            if ((not isSubmersible) and (Y < cWaterLine + 64 + Gear^.Radius))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   380
            or (isSubmersible and (Y < cWaterLine + 2 + Gear^.Radius) and ((CurAmmoGear^.Pos = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   381
            and (CurAmmoGear^.dY < _0_01))) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   382
                // don't play splash if they are already way past the surface
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   383
                PlaySound(sndSplash)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   384
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   385
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   386
        if ((cReducedQuality and rqPlainSplash) = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   387
        and (((not isSubmersible) and (Y < cWaterLine + 64 + Gear^.Radius))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   388
        or (isSubmersible and (Y < cWaterLine + 2 + Gear^.Radius) and ((CurAmmoGear^.Pos = 0)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   389
        and (CurAmmoGear^.dY < _0_01)))) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   390
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   391
            AddVisualGear(X, cWaterLine, vgtSplash);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   392
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   393
            maxDrops := (Gear^.Radius div 2) + round(vdX * Gear^.Radius * 2) + round(vdY * Gear^.Radius * 2);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   394
            for i:= max(maxDrops div 3, min(32, Random(maxDrops))) downto 0 do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   395
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   396
                particle := AddVisualGear(X - 3 + Random(6), cWaterLine, vgtDroplet);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   397
                if particle <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   398
                    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   399
                    particle^.dX := particle^.dX - vdX / 10;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   400
                    particle^.dY := particle^.dY - vdY / 5;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   401
                    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   402
                end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   403
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   404
        if isSubmersible and (CurAmmoGear^.Pos = 0) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   405
            CurAmmoGear^.Pos := 1000
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   406
        end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   407
    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   408
        CheckGearDrowning := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   409
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   410
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   411
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   412
procedure ResurrectHedgehog(gear: PGear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   413
var tempTeam : PTeam;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   414
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   415
    AttackBar:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   416
    gear^.dX := _0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   417
    gear^.dY := _0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   418
    gear^.Damage := 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   419
    gear^.Health := gear^.Hedgehog^.InitialHealth;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   420
    gear^.Hedgehog^.Effects[hePoisoned] := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   421
    if not CurrentHedgehog^.Effects[heResurrectable] then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   422
        with CurrentHedgehog^ do 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   423
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   424
            inc(Team^.stats.AIKills);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   425
            FreeTexture(Team^.AIKillsTex);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   426
            Team^.AIKillsTex := RenderStringTex(inttostr(Team^.stats.AIKills), Team^.Clan^.Color, fnt16);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   427
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   428
    tempTeam := gear^.Hedgehog^.Team;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   429
    DeleteCI(gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   430
    FindPlace(gear, false, 0, LAND_WIDTH, true); 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   431
    if gear <> nil then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   432
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   433
        RenderHealth(gear^.Hedgehog^);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   434
        ScriptCall('onGearResurrect', gear^.uid);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   435
        gear^.State := gstWait;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   436
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   437
    RecountTeamHealth(tempTeam);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   438
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   439
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   440
function CountNonZeroz(x, y, r, c: LongInt): LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   441
var i: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   442
    count: LongInt = 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   443
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   444
if (y and LAND_HEIGHT_MASK) = 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   445
    for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 4) do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   446
        if Land[y, i] <> 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   447
            begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   448
            inc(count);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   449
            if count = c then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   450
                exit(count)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   451
            end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   452
CountNonZeroz:= count;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   453
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   454
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   455
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   456
var x: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   457
    y, sy: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   458
    ar: array[0..511] of TPoint;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   459
    ar2: array[0..1023] of TPoint;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   460
    cnt, cnt2: Longword;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   461
    delta: LongInt;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   462
    reallySkip, tryAgain: boolean;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   463
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   464
reallySkip:= false; // try not skipping proximity at first
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   465
tryAgain:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   466
while tryAgain do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   467
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   468
    delta:= 250;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   469
    cnt2:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   470
    repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   471
        x:= Left + LongInt(GetRandom(Delta));
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   472
        repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   473
            inc(x, Delta);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   474
            cnt:= 0;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   475
            y:= min(1024, topY) - 2 * Gear^.Radius;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   476
            while y < cWaterLine do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   477
                begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   478
                repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   479
                    inc(y, 2);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   480
                until (y >= cWaterLine) or (CountNonZeroz(x, y, Gear^.Radius - 1, 1) = 0);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   481
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   482
                sy:= y;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   483
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   484
                repeat
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   485
                    inc(y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   486
                until (y >= cWaterLine) or (CountNonZeroz(x, y, Gear^.Radius - 1, 1) <> 0);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   487
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   488
                if (y - sy > Gear^.Radius * 2)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   489
                    and (((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], 60, 60) = nil))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   492
                    and (CountNonZeroz(x, y+1, Gear^.Radius - 1, Gear^.Radius+1) > Gear^.Radius))
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   493
                or
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   494
                    ((Gear^.Kind <> gtExplosives)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   495
                    and (y < cWaterLine)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   496
                    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
   497
                 
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   498
                          begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   499
                    ar[cnt].X:= x;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   500
                    if withFall then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   501
                        ar[cnt].Y:= sy + Gear^.Radius
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   502
                    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   503
                        ar[cnt].Y:= y - Gear^.Radius;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   504
                    inc(cnt)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   505
                    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   506
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   507
                inc(y, 45)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   508
                end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   509
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   510
            if cnt > 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   511
                with ar[GetRandom(cnt)] do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   512
                    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   513
                    ar2[cnt2].x:= x;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   514
                    ar2[cnt2].y:= y;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   515
                    inc(cnt2)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   516
                    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   517
        until (x + Delta > Right);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   518
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   519
        dec(Delta, 60)
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   520
    until (cnt2 > 0) or (Delta < 70);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   521
    if (cnt2 = 0) and skipProximity and (not reallySkip) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   522
        tryAgain:= true
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   523
    else tryAgain:= false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   524
    reallySkip:= true;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   525
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   526
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   527
if cnt2 > 0 then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   528
    with ar2[GetRandom(cnt2)] do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   529
        begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   530
        Gear^.X:= int2hwFloat(x);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   531
        Gear^.Y:= int2hwFloat(y);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   532
        AddFileLog('Assigned Gear coordinates (' + inttostr(x) + ',' + inttostr(y) + ')');
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   533
        end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   534
    else
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   535
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   536
    OutError('Can''t find place for Gear', false);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   537
    if Gear^.Kind = gtHedgehog then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   538
        Gear^.Hedgehog^.Effects[heResurrectable] := false;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   539
    DeleteGear(Gear);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   540
    Gear:= nil
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   541
    end
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   542
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   543
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   544
function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   545
var t: PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   546
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   547
t:= GearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   548
rX:= sqr(rX);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   549
rY:= sqr(rY);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   550
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   551
while t <> nil do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   552
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   553
    if (t <> Gear) and (t^.Kind = Kind) then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   554
        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
   555
        exit(t);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   556
    t:= t^.NextGear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   557
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   558
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   559
CheckGearNear:= nil
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   560
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   561
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   562
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   563
function CheckGearsNear(mX, mY: LongInt; Kind: TGearsType; rX, rY: LongInt): PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   564
var t: PGear;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   565
begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   566
t:= GearsList;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   567
rX:= sqr(rX);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   568
rY:= sqr(rY);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   569
while t <> nil do
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   570
    begin
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   571
    if t^.Kind in Kind then
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   572
        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
   573
            exit(t);
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   574
    t:= t^.NextGear
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   575
    end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   576
CheckGearsNear:= nil
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   577
end;
e510d1245bd7 fix line endings
nemo
parents: 6580
diff changeset
   578
end.