# HG changeset patch # User unc0rr # Date 1204913403 0 # Node ID 3f73901a350a63a941ebc24f9eb90d471788a33e # Parent ed5450a89b9699295edeedab8282f5ae22e9f6f5 - Use cloud as 'visual gear' - Small fixes diff -r ed5450a89b96 -r 3f73901a350a hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Fri Mar 07 17:43:05 2008 +0000 +++ b/hedgewars/GSHandlers.inc Fri Mar 07 18:10:03 2008 +0000 @@ -109,17 +109,6 @@ end; //////////////////////////////////////////////////////////////////////////////// -procedure doStepCloud(Gear: PGear); -begin -Gear^.X:= Gear^.X + cWindSpeed * 200 + Gear^.dX; -if hwRound(Gear^.Y) > -160 then Gear^.dY:= Gear^.dY - _1div50000 - else Gear^.dY:= Gear^.dY + _1div50000; -Gear^.Y:= Gear^.Y + Gear^.dY; -if hwRound(Gear^.X) < -cScreenWidth - 256 then Gear^.X:= int2hwFloat(cScreenWidth + 2048) else -if hwRound(Gear^.X) > cScreenWidth + 2048 then Gear^.X:= int2hwFloat(-cScreenWidth - 256) -end; - -//////////////////////////////////////////////////////////////////////////////// procedure doStepBomb(Gear: PGear); var i: LongInt; begin diff -r ed5450a89b96 -r 3f73901a350a hedgewars/hwengine.dpr --- a/hedgewars/hwengine.dpr Fri Mar 07 17:43:05 2008 +0000 +++ b/hedgewars/hwengine.dpr Fri Mar 07 18:10:03 2008 +0000 @@ -100,10 +100,12 @@ gsGame : begin ProcessKbd; DoGameTick(Lag); + ProcessVisualGears(Lag); DrawWorld(Lag, SDLPrimSurface); end; gsConsole: begin DoGameTick(Lag); + ProcessVisualGears(Lag); DrawWorld(Lag, SDLPrimSurface); DrawConsole(SDLPrimSurface); end; diff -r ed5450a89b96 -r 3f73901a350a hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Fri Mar 07 17:43:05 2008 +0000 +++ b/hedgewars/uConsts.pas Fri Mar 07 18:10:03 2008 +0000 @@ -43,7 +43,7 @@ sprQuestion, sprPowerBar, sprWindBar, sprWindL, sprWindR); - TGearType = (gtCloud, gtAmmo_Bomb, gtHedgehog, gtAmmo_Grenade, gtHealthTag, + TGearType = (gtAmmo_Bomb, gtHedgehog, gtAmmo_Grenade, gtHealthTag, gtGrave, gtUFO, gtShotgunShot, gtPickHammer, gtRope, gtSmokeTrace, gtExplosion, gtMine, gtCase, gtDEagleShot, gtDynamite, gtTeamHealthSorter, gtClusterBomb, gtCluster, gtShover, gtFlame, @@ -51,7 +51,7 @@ gtParachute, gtAirAttack, gtAirBomb, gtBlowTorch, gtGirder, gtTeleport, gtSmallDamage, gtSwitcher, gtTarget); - TVisualGearType = (vgtFlake); + TVisualGearType = (vgtFlake, vgtCloud); TGearsType = set of TGearType; diff -r ed5450a89b96 -r 3f73901a350a hedgewars/uGears.pas --- a/hedgewars/uGears.pas Fri Mar 07 17:43:05 2008 +0000 +++ b/hedgewars/uGears.pas Fri Mar 07 18:10:03 2008 +0000 @@ -59,7 +59,6 @@ procedure DrawGears(Surface: PSDL_Surface); procedure FreeGearsList; procedure AddMiscGears; -procedure AddClouds; procedure AssignHHCoords; procedure InsertGearToList(Gear: PGear); procedure RemoveGearFromList(Gear: PGear); @@ -101,7 +100,6 @@ {$INCLUDE HHHandlers.inc} const doStepHandlers: array[TGearType] of TGearStepProcedure = ( - @doStepCloud, @doStepBomb, @doStepHedgehog, @doStepGrenade, @@ -138,21 +136,27 @@ ); procedure InsertGearToList(Gear: PGear); -var tmp: PGear; +var tmp, ptmp: PGear; begin if GearsList = nil then GearsList:= Gear else begin - // WARNING: this code assumes that the first gears added to the list are clouds (have maximal Z) tmp:= GearsList; - while (tmp <> nil) and (tmp^.Z < Gear^.Z) do - tmp:= tmp^.NextGear; + ptmp:= GearsList; + while (tmp <> nil) and (tmp^.Z <= Gear^.Z) do + begin + ptmp:= tmp; + tmp:= tmp^.NextGear + end; - if tmp^.PrevGear <> nil then tmp^.PrevGear^.NextGear:= Gear; - Gear^.PrevGear:= tmp^.PrevGear; - tmp^.PrevGear:= Gear; - Gear^.NextGear:= tmp; - if GearsList = tmp then GearsList:= Gear + if ptmp <> nil then + begin + Gear^.NextGear:= ptmp^.NextGear; + Gear^.PrevGear:= ptmp; + if ptmp^.NextGear <> nil then ptmp^.NextGear^.PrevGear:= Gear; + ptmp^.NextGear:= Gear + end + else GearsList:= Gear end end; @@ -193,7 +197,6 @@ end; case Kind of - gtCloud: Result^.Z:= High(Result^.Z); gtAmmo_Bomb: begin Result^.Radius:= 4; Result^.Elasticity:= _0_6; @@ -579,7 +582,6 @@ while Gear<>nil do begin case Gear^.Kind of - gtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); gtAmmo_Bomb: DrawRotated(sprBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.DirAngle); gtHedgehog: DrawHH(Gear, Surface); gtAmmo_Grenade: DrawRotated(sprGrenade, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, DxDy2Angle(Gear^.dY, Gear^.dX)); @@ -656,21 +658,6 @@ FindPlace(AddGear(0, 0, gtMine, 0, _0, _0, 0), false, 0, 2048); end; -procedure AddClouds; -var i: LongInt; - dx, dy: hwFloat; -begin -for i:= 0 to cCloudsNumber do - begin - dx.isNegative:= random(2) = 1; - dx.QWordValue:= random(214748364); - dy.isNegative:= (i and 1) = 1; - dy.QWordValue:= 21474836 + random(64424509); - AddGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, - gtCloud, random(4), dx, dy, 0) - end -end; - procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); var Gear: PGear; dmg, dmgRadius: LongInt; diff -r ed5450a89b96 -r 3f73901a350a hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Fri Mar 07 17:43:05 2008 +0000 +++ b/hedgewars/uVisualGears.pas Fri Mar 07 18:10:03 2008 +0000 @@ -38,22 +38,33 @@ function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; dX, dY: hwFloat): PVisualGear; procedure ProcessVisualGears(Steps: Longword); procedure DrawVisualGears(); -//procedure AddClouds; +procedure AddClouds; var VisualGearsList: PVisualGear = nil; implementation -uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, - uLand, uIO, uLandGraphics, uAIMisc, uLocale, uAI, uAmmos, uTriggers, GL; +uses uWorld, uMisc, uStore, GL; +// ================================================================== procedure doStepFlake(Gear: PVisualGear; Steps: Longword); begin end; -// ============= +procedure doStepCloud(Gear: PVisualGear; Steps: Longword); +begin +Gear^.X:= Gear^.X + (cWindSpeed * 200 + Gear^.dX) * Steps; +if hwRound(Gear^.Y) > -160 then Gear^.dY:= Gear^.dY - _1div50000 + else Gear^.dY:= Gear^.dY + _1div50000; +Gear^.Y:= Gear^.Y + Gear^.dY * Steps; +if hwRound(Gear^.X) < -cScreenWidth - 256 then Gear^.X:= int2hwFloat(cScreenWidth + 2048) else +if hwRound(Gear^.X) > cScreenWidth + 2048 then Gear^.X:= int2hwFloat(-cScreenWidth - 256) +end; + +// ================================================================== const doStepHandlers: array[TVisualGearType] of TVGearStepProcedure = ( - @doStepFlake + @doStepFlake, + @doStepCloud ); function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; dX, dY: hwFloat): PVisualGear; @@ -68,6 +79,10 @@ Result^.dY:= dY; Result^.doStep:= doStepHandlers[Kind]; +case Kind of + vgtCloud: Result^.State:= random(4); + end; + if VisualGearsList <> nil then begin VisualGearsList^.PrevGear:= Result; @@ -82,6 +97,8 @@ procedure ProcessVisualGears(Steps: Longword); var Gear, t: PVisualGear; begin +if Steps = 0 then exit; + t:= VisualGearsList; while t <> nil do begin @@ -98,8 +115,8 @@ while Gear <> nil do begin case Gear^.Kind of -// gtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, nil); vgtFlake: ; + vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, nil); end; Gear:= Gear^.NextGear end; @@ -108,7 +125,7 @@ procedure AddClouds; var i: LongInt; dx, dy: hwFloat; -begin(* +begin for i:= 0 to cCloudsNumber do begin dx.isNegative:= random(2) = 1; @@ -117,7 +134,7 @@ dy.QWordValue:= 21474836 + random(64424509); AddVisualGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, vgtCloud, dx, dy) - end*) + end end; initialization diff -r ed5450a89b96 -r 3f73901a350a hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Fri Mar 07 17:43:05 2008 +0000 +++ b/hedgewars/uWorld.pas Fri Mar 07 18:10:03 2008 +0000 @@ -38,7 +38,8 @@ Frames: Longword = 0; implementation -uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound, GL, uAmmos; +uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound, GL, + uAmmos, uVisualGears; const FPS: Longword = 0; CountTicks: Longword = 0; SoundTimerTicks: Longword = 0; @@ -183,6 +184,8 @@ DrawRepeated(sprSky, WorldDx * 3 div 8); DrawRepeated(sprHorizont, WorldDx * 3 div 5); +DrawVisualGears; + // Waves {$WARNINGS OFF} for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (RealTicks shr 6) ) and $FF), cWaterLine + WorldDy - 64, 0, Surface);