# HG changeset patch # User Wuzzy # Date 1492821212 -7200 # Node ID 071a05275798f419895690fabdaa3ff71c7bdf90 # Parent 62975c0a89c67098d9cd17beb2ac82b89955e9c9 Allow to press [Precise]+[Slot] to cycle through weapons in reverse order diff -r 62975c0a89c6 -r 071a05275798 ChangeLog.txt --- a/ChangeLog.txt Fri Apr 21 17:54:28 2017 +0200 +++ b/ChangeLog.txt Sat Apr 22 02:33:32 2017 +0200 @@ -14,6 +14,7 @@ + AI hedgehogs can now use Bee and Vampirism + Divided Teams mode will now work with more than 2 teams (Hint: you probably want to set world edges to "wrap" in such games) + Fort Mode will now work with more than 2 teams + + Can press [Precise]+[Slot] to cycle through weapons in reverse order + Render graves behind everything else, so that they can't hide mines etc. + Show indicator symbols at bottom right while extra damage or low gravity are active + Color coding for the turn timer: green = ready timer, yellow = turn in progress, red = retreat timer, gray = timer paused diff -r 62975c0a89c6 -r 071a05275798 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Fri Apr 21 17:54:28 2017 +0200 +++ b/hedgewars/uGearsHedgehog.pas Sat Apr 22 02:33:32 2017 +0200 @@ -52,9 +52,10 @@ end; // Shouldn't more of this ammo switching stuff be moved to uAmmos ? -function ChangeAmmo(HHGear: PGear): boolean; +function ChangeAmmo(HHGear: PGear; reverse: boolean): boolean; var slot, i: Longword; - ammoidx: LongInt; + ammoidx, + ammochangedir: LongInt; prevAmmo: TAmmoType; begin ChangeAmmo:= false; @@ -65,13 +66,21 @@ HHGear^.Message:= HHGear^.Message and (not gmSlot); prevAmmo:= CurAmmoType; ammoidx:= 0; + if (reverse = true) then + ammochangedir:= -1 + else + ammochangedir:= 1; + if (((HHGear^.State and (gstAttacking or gstAttacked)) <> 0) and (GameFlags and gfInfAttack = 0)) or ((HHGear^.State and gstHHDriven) = 0) then exit; ChangeAmmo:= true; - - while (ammoidx < cMaxSlotAmmoIndex) and (Ammo^[slot, ammoidx].AmmoType <> CurAmmoType) do - inc(ammoidx); + + if CurAmmoType = amNothing then + ammoidx:= cMaxSlotAmmoIndex + else + while (ammoidx < cMaxSlotAmmoIndex) and (Ammo^[slot, ammoidx].AmmoType <> CurAmmoType) do + inc(ammoidx); if (MultiShootAttacks > 0) then begin @@ -88,12 +97,12 @@ MultiShootAttacks:= 0; HHGear^.Message:= HHGear^.Message and (not (gmLJump or gmHJump)); - if Ammoz[CurAmmoType].Slot = slot then + if (Ammoz[CurAmmoType].Slot = slot) and (CurAmmoType <> amNothing) then begin i:= 0; repeat - inc(ammoidx); - if (ammoidx > cMaxSlotAmmoIndex) then + inc(ammoidx, ammochangedir); + if (ammoidx < 0) or (ammoidx > cMaxSlotAmmoIndex) then begin inc(i); CurAmmoType:= amNothing; @@ -101,29 +110,33 @@ //TryDo(i < 2, 'Engine bug: no ammo in current slot', true) end; until (i = 1) or ((Ammo^[slot, ammoidx].Count > 0) + and (Ammo^[slot, ammoidx].AmmoType <> amNothing) and (Team^.Clan^.TurnNumber > Ammoz[Ammo^[slot, ammoidx].AmmoType].SkipTurns)) end else begin - i:= 0; + if reverse then + i:= cMaxSlotAmmoIndex + else + i:= 0; // check whether there is ammo in slot - while (i <= cMaxSlotAmmoIndex) and ((Ammo^[slot, i].Count = 0) - or (Team^.Clan^.TurnNumber <= Ammoz[Ammo^[slot, i].AmmoType].SkipTurns)) - do inc(i); + while (ammoidx >= 0) and (i <= cMaxSlotAmmoIndex) and + ((Ammo^[slot, i].Count = 0) or (Team^.Clan^.TurnNumber <= Ammoz[Ammo^[slot, i].AmmoType].SkipTurns) or (Ammo^[slot, i].AmmoType = amNothing)) + do inc(i, ammochangedir); - if i <= cMaxSlotAmmoIndex then + if (i >= 0) and (i <= cMaxSlotAmmoIndex) then ammoidx:= i else ammoidx:= -1 end; if ammoidx >= 0 then CurAmmoType:= Ammo^[slot, ammoidx].AmmoType; - // Try again in the next slot - if (CurAmmoType = prevAmmo) and (slot < cMaxSlotIndex) then + // Try again in the next or previous slot + if (CurAmmoType = prevAmmo) and (((reverse = false) and (slot < cMaxSlotIndex)) or ((reverse = true) and (slot > 0))) then begin - inc(slot); + inc(slot, ammochangedir); HHGear^.MsgParam:= slot; - ChangeAmmo(HHGear) + ChangeAmmo(HHGear, reverse) end end end; @@ -154,7 +167,7 @@ with Hedgehog^ do while (CurAmmoType <> weap) and (t >= 0) do begin - s:= ChangeAmmo(HHGear); + s:= ChangeAmmo(HHGear, false); if HHGear^.State <> prevState then // so we can keep gstAttacked out of consideration when looping newState:= HHGear^.State; HHGear^.State:= prevState; @@ -1313,8 +1326,18 @@ if (CurAmmoGear = nil) or ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0) then begin + // Press slot key to select weapon slot if ((HHGear^.Message and gmSlot) <> 0) then - if ChangeAmmo(HHGear) then ApplyAmmoChanges(Hedgehog^); + if ((HHGear^.Message and gmPrecise) <> 0) then + begin + // Reverse weapon selection by holding down the Precise key + HHGear^.Message := HHGear^.Message and (not gmPrecise); + if ChangeAmmo(HHGear, true) then ApplyAmmoChanges(Hedgehog^); + HHGear^.Message:= HHGear^.Message or gmPrecise + end + else + // Select next weapon + if ChangeAmmo(HHGear, false) then ApplyAmmoChanges(Hedgehog^); if ((HHGear^.Message and gmWeapon) <> 0) then HHSetWeapon(HHGear);