Start implementing 'visual gears' - gears, that don't need to be synchronized (clouds and flakes)
(* * Hedgewars, a worms-like game * Copyright (c) 2008 Andrey Korotaev <unC0Rr@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *)unit uVisualGears;interfaceuses SDLh, uConsts, uFloat;{$INCLUDE options.inc}const AllInactive: boolean = false;type PVisualGear = ^TVisualGear; TVGearStepProcedure = procedure (Gear: PVisualGear; Steps: Longword); TVisualGear = record NextGear, PrevGear: PVisualGear; State : Longword; X : hwFloat; Y : hwFloat; dX: hwFloat; dY: hwFloat; Kind: TVisualGearType; doStep: TVGearStepProcedure; end;function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; dX, dY: hwFloat): PVisualGear;procedure ProcessVisualGears(Steps: Longword);procedure DrawVisualGears();//procedure AddClouds;var VisualGearsList: PVisualGear = nil;implementationuses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, uLand, uIO, uLandGraphics, uAIMisc, uLocale, uAI, uAmmos, uTriggers, GL;procedure doStepFlake(Gear: PVisualGear; Steps: Longword);beginend;// =============const doStepHandlers: array[TVisualGearType] of TVGearStepProcedure = ( @doStepFlake );function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; dX, dY: hwFloat): PVisualGear;var Result: PVisualGear;beginNew(Result);FillChar(Result^, sizeof(TVisualGearType), 0);Result^.X:= int2hwFloat(X);Result^.Y:= int2hwFloat(Y);Result^.Kind := Kind;Result^.dX:= dX;Result^.dY:= dY;Result^.doStep:= doStepHandlers[Kind];if VisualGearsList <> nil then begin VisualGearsList^.PrevGear:= Result; Result^.NextGear:= VisualGearsList end;VisualGearsList:= Result;AddVisualGear:= Resultend;procedure ProcessVisualGears(Steps: Longword);var Gear, t: PVisualGear;begint:= VisualGearsList;while t <> nil do begin Gear:= t; t:= Gear^.NextGear; Gear^.doStep(Gear, Steps) endend;procedure DrawVisualGears();var Gear: PVisualGear;beginGear:= VisualGearsList;while Gear <> nil do begin case Gear^.Kind of// gtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, nil); vgtFlake: ; end; Gear:= Gear^.NextGear end;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); AddVisualGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, vgtCloud, dx, dy) end*)end;initializationfinalizationend.