diff -r 5618915f9ea4 -r 6e05013899b2 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Mon Mar 02 17:33:49 2009 +0000 +++ b/hedgewars/uGears.pas Mon Mar 02 21:13:07 2009 +0000 @@ -598,13 +598,13 @@ inc(GameTicks) end; -(* Purpose, to reset all transient attributes toggled by a utility. Right now that is just Low Gravity and Extra Damage and Invulnerability. -Other possibilities include: Laser Sight... more? -*) +//Purpose, to reset all transient attributes toggled by a utility. +//If any of these are set as permanent toggles in the frontend, that needs to be checked and skipped here. procedure ResetUtilities; begin cGravity:= cMaxWindSpeed; cDamageModifier:= _1; + cLaserSighting:= false; if (CurrentHedgehog^.Gear <> nil) then CurrentHedgehog^.Gear^.Invulnerable:= false; end; @@ -636,8 +636,8 @@ procedure DrawHH(Gear: PGear); var t: LongInt; amt: TAmmoType; - hx, hy, m: LongInt; - aAngle, dAngle: real; + hx, hy, cx, cy, tx, ty, m: LongInt; + lx, ly, dx, dy, aAngle, dAngle: real; defaultPos, HatVisible: boolean; begin if (Gear^.State and gstHHDeath) <> 0 then @@ -655,7 +655,7 @@ hwSign(Gear^.dX), 1, 7, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end else @@ -665,7 +665,7 @@ hwSign(Gear^.dX), 2, 0, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end else @@ -705,7 +705,7 @@ m, 1, 0, - DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + dAngle); + DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + dAngle, Gear^.Invulnerable); defaultPos:= false end; gtBlowTorch: begin @@ -714,7 +714,7 @@ hwSign(Gear^.dX), 3, PHedgehog(Gear^.Hedgehog)^.visStepPos div 2, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end; gtShover: DrawRotated(sprHandBaseball, hx, hy, hwSign(Gear^.dX), aangle + 180); @@ -723,7 +723,7 @@ hwSign(Gear^.dX), 1, 4, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end; gtPickHammer, @@ -743,7 +743,7 @@ hwSign(Gear^.dX), 1, 6, - 0) + 0, Gear^.Invulnerable) else DrawRotatedF(sprKamikaze, hwRound(Gear^.X) + WorldDx, @@ -760,7 +760,7 @@ hwSign(Gear^.dX), 2, 2, - 0) + 0, Gear^.Invulnerable) else begin DrawRotatedF(sprDress, @@ -783,7 +783,7 @@ hwSign(Gear^.dX), 0, 4, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end end @@ -796,13 +796,13 @@ - hwSign(Gear^.dX), 1, 1, - 0) + 0, Gear^.Invulnerable) else DrawHedgehog(hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y) - 3 + WorldDy, hwSign(Gear^.dX), 1, 1, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end else @@ -812,7 +812,7 @@ hwSign(Gear^.dX), 0, PHedgehog(Gear^.Hedgehog)^.visStepPos div 2, - 0); + 0, Gear^.Invulnerable); defaultPos:= false; HatVisible:= true end @@ -854,18 +854,18 @@ hwSign(Gear^.dX), 1, 2, - 0); + 0, Gear^.Invulnerable); amBlowTorch: DrawHedgehog(hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y) - 3 + WorldDy, hwSign(Gear^.dX), 1, 3, - 0); + 0, Gear^.Invulnerable); amTeleport: DrawRotatedF(sprTeleport, hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y) - 3 + WorldDy, 0, hwSign(Gear^.dX), 0); amKamikaze: DrawHedgehog(hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y) - 3 + WorldDy, hwSign(Gear^.dX), 1, 5, - 0); + 0, Gear^.Invulnerable); amWhip: DrawRotatedF(sprWhip, hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y) - 3 + WorldDy, @@ -877,12 +877,13 @@ hwSign(Gear^.dX), 0, 4, - 0); + 0, Gear^.Invulnerable); HatVisible:= true; with PHedgehog(Gear^.Hedgehog)^ do if (HatTex <> nil) - and (HatVisibility > 0) then + and (HatVisibility > 0) + and (not Gear^.Invulnerable) then DrawTextureF(HatTex, HatVisibility, hwRound(Gear^.X) + 1 + WorldDx, @@ -909,7 +910,7 @@ hwSign(Gear^.dX), 2, 1, - Gear^.DirAngle); + Gear^.DirAngle, Gear^.Invulnerable); defaultPos:= false end else @@ -920,13 +921,13 @@ - hwSign(Gear^.dX), 1, 1, - 0) + 0, Gear^.Invulnerable) else DrawHedgehog(hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y) - 3 + WorldDy, hwSign(Gear^.dX), 1, 1, - 0); + 0, Gear^.Invulnerable); defaultPos:= false end; end; @@ -952,7 +953,7 @@ if HatVisibility > 0.0 then HatVisibility:= HatVisibility - 0.2; - if (HatTex <> nil) + if (HatTex <> nil) and (not Gear^.Invulnerable) and (HatVisibility > 0) then if DefaultPos then DrawTextureF(HatTex, @@ -1007,12 +1008,67 @@ else if ShowCrosshair and ((Gear^.State and (gstAttacked or gstAnimation)) = 0) then begin +(* These calculations are a little complex for a few reasons: + 1: I need to draw the laser from weapon origin to nearest land + 2: I need to start the beam outside the hedgie for attractiveness. + I can't do the calc from there, or it accumulates more error visible in a deagle shot. + 3: I need to extend the beam beyond land. + This routine perhaps should be pushed into uStore or somesuch instead of continuuing the increase in size of this function. + Additionally, using crosshairs, amusingly, makes the laser imprecise to about 0.05% of a deagle shot. This means that if you are firing across an entire 4096px map your laser will be a few pixels off of the the deagle shot. This is still a lot more accurate than real laser sights - feel free to change if it bothers you. +*) + if cLaserSighting then + begin + lx:= hwRound(Gear^.X); + ly:= hwRound(Gear^.Y); + dx:= hwSign(Gear^.dX) * Sin(Gear^.Angle * pi / cMaxAngle); + dy:= - Cos(Gear^.Angle * pi / cMaxAngle); + lx:= lx + dx * 16; + ly:= ly + dy * 16; + + dx:= dx * 4; + dy:= dy * 4; + + tx:= round(lx); + ty:= round(ly); + hx:= tx; + hy:= ty; + while ((ty and LAND_HEIGHT_MASK) = 0) and + ((tx and LAND_WIDTH_MASK) = 0) and + (Land[ty, tx] = 0) do + begin + lx:= lx + dx; + ly:= ly + dy; + tx:= round(lx); + ty:= round(ly) + end; + // reached edge of land. assume infinite beam. Extend it way out past camera + if ((ty and LAND_HEIGHT_MASK) <> 0) or ((tx and LAND_WIDTH_MASK) <> 0) then + begin + lx:= lx + dx * (LAND_WIDTH div 4); + ly:= ly + dy * (LAND_WIDTH div 4) + end; + + //if (abs(lx-tx)>8) or (abs(ly-ty)>8) then + begin + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glBegin(GL_LINES); + glColor4ub($FF, $00, $00, $C0); + glVertex2i(hx + WorldDx, hy + WorldDy); + glVertex2i(tx + WorldDx, ty + WorldDy); + glEnd(); + glColor4f(1, 1, 1, 1); + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); + end; + end; + // draw crossahair if ((Gear^.State and gstHHHJump) <> 0) then m:= -1 else m:= 1; + cx:= Round(hwRound(Gear^.X) + hwSign(Gear^.dX) * m * Sin(Gear^.Angle*pi/cMaxAngle) * 80); + cy:= Round(hwRound(Gear^.Y) - Cos(Gear^.Angle*pi/cMaxAngle) * 80); DrawRotatedTex(Team^.CrosshairTex, - 12, 12, - Round(hwRound(Gear^.X) + hwSign(Gear^.dX) * m * Sin(Gear^.Angle*pi/cMaxAngle) * 80) + WorldDx, - Round(hwRound(Gear^.Y) - Cos(Gear^.Angle*pi/cMaxAngle) * 80) + WorldDy, 0, - hwSign(Gear^.dX) * (Gear^.Angle * 180.0) / cMaxAngle) + 12, 12, cx+WorldDx, cy+WorldDy, 0, + hwSign(Gear^.dX) * (Gear^.Angle * 180.0) / cMaxAngle); end end end @@ -1242,9 +1298,11 @@ if (Mask and EXPLNoDamage) = 0 then begin if not Gear^.Invulnerable then - inc(Gear^.Damage, dmg); - if Gear^.Kind = gtHedgehog then - AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.Color) + begin + inc(Gear^.Damage, dmg); + if Gear^.Kind = gtHedgehog then + AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.Color); + end; end; if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog) then begin @@ -1286,11 +1344,12 @@ gtMine, gtCase, gtTarget: begin - if (not Gear^.Invulnerable) then + if (not t^.Invulnerable) then + begin inc(t^.Damage, dmg); - - if t^.Kind = gtHedgehog then - AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(t^.Hedgehog)^.Team^.Clan^.Color); + if t^.Kind = gtHedgehog then + AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(t^.Hedgehog)^.Team^.Clan^.Color); + end; DeleteCI(t); t^.dX:= t^.dX + Gear^.dX * dmg * _0_01 + SignAs(cHHKick, Gear^.dX); @@ -1326,10 +1385,13 @@ gtTarget, gtCase: begin if (Ammo^.Kind = gtDrill) then begin Ammo^.Timer:= 0; exit; end; - inc(t^.ar[i]^.Damage, Damage); + if (not t^.ar[i]^.Invulnerable) then + begin + inc(t^.ar[i]^.Damage, Damage); - if (t^.ar[i]^.Kind = gtHedgehog) and (Damage > 0) then - AddDamageTag(hwRound(t^.ar[i]^.X), hwRound(t^.ar[i]^.Y), Damage, PHedgehog(t^.ar[i]^.Hedgehog)^.Team^.Clan^.Color); + if (t^.ar[i]^.Kind = gtHedgehog) and (Damage > 0) then + AddDamageTag(hwRound(t^.ar[i]^.X), hwRound(t^.ar[i]^.Y), Damage, PHedgehog(t^.ar[i]^.Hedgehog)^.Team^.Clan^.Color); + end; DeleteCI(t^.ar[i]); t^.ar[i]^.dX:= Ammo^.dX * Power * _0_01;