{$MODE OBJFPC} { -*- delphi -*- } {$INCLUDE settings.inc} unit facilities; interface uses storable, autostorable, tokenutils, rpc, methodregistry, properties; type {$TYPEINFO ON} TFacility = class(TAbstractFacility) private FActor: TAbstractActor; protected procedure MarkDirty(DirtyFlags: TDirtyFlags); function GetParent(): TAbstractTreeNode; override; procedure SetParent(const NewParent: TAbstractTreeNode); override; class function GetHasPhysicalProperty(): Boolean; virtual; public constructor Create(Actor: TAbstractActor); overload; constructor Create(Actor: TAbstractActor; Settings: TAutoStorable); override; overload; procedure Init(Actor: TAbstractActor); virtual; constructor Read(Stream: TReadStream); override; procedure Write(Stream: TWriteStream); override; class function ParseSettings(Tokens: TTokenArray; var Index: Cardinal; var ErrorMessage: TErrorString): TAutoStorable; override; function AddChild(const NewChild: TAbstractTreeNode; const Location: TAbstractLocation): Boolean; override; procedure ApplyPhysicalProperties(Target: PPhysicalProperties); override; procedure Tick(Interval: TDateTime); override; procedure KillChildren(Game: TAbstractGame); override; end; {$TYPEINFO OFF} procedure RegisterFacilityClass(AClass: TAbstractFacilityClass); function GetFacilityClass(AName: UTF8String): TAbstractFacilityClass; implementation uses exceptions, hashtable, stringutils, sysutils, hashfunctions; type TFacilityClassesHashTable = specialize THashTable; var FacilityClasses: TFacilityClassesHashTable; constructor TFacility.Create(Actor: TAbstractActor); begin inherited Create(); Init(Actor); end; constructor TFacility.Create(Actor: TAbstractActor; Settings: TAutoStorable); begin inherited; Init(Actor); end; procedure TFacility.Init(Actor: TAbstractActor); begin Assert(Assigned(Actor)); FActor := Actor; end; constructor TFacility.Read(Stream: TReadStream); begin inherited; Stream.ReadReference(@Pointer(FActor)); end; procedure TFacility.Write(Stream: TWriteStream); begin inherited; Stream.WriteReference(FActor); end; class function TFacility.GetHasPhysicalProperty(): Boolean; begin Result := False; end; function TFacility.GetParent(): TAbstractTreeNode; begin Result := FActor; end; procedure TFacility.SetParent(const NewParent: TAbstractTreeNode); begin Assert(False, 'The parent of a TFacility is set when the facility is created'); end; class function TFacility.ParseSettings(Tokens: TTokenArray; var Index: Cardinal; var ErrorMessage: TErrorString): TAutoStorable; begin Result := nil; ErrorMessage := ''; Assert(Index = 1); Assert(Length(Tokens) >= Index); end; procedure TFacility.MarkDirty(DirtyFlags: TDirtyFlags); begin Assert(Assigned(FActor)); FActor.MarkDirty(DirtyFlags); end; function TFacility.AddChild(const NewChild: TAbstractTreeNode; const Location: TAbstractLocation): Boolean; begin Assert(Assigned(NewChild)); Assert(not Assigned(Location)); if (Assigned(NewChild.Parent)) then NewChild.Parent.RemoveChild(NewChild); NewChild.Parent := Self; Result := True; // caller is responsible for tracking that this is a child end; procedure TFacility.Tick(Interval: TDateTime); begin end; procedure TFacility.KillChildren(Game: TAbstractGame); begin end; procedure TFacility.ApplyPhysicalProperties(Target: PPhysicalProperties); begin end; procedure RegisterFacilityClass(AClass: TAbstractFacilityClass); begin Assert(not FacilityClasses.Has(AClass.ClassName), AClass.ClassName + ' registered twice'); FacilityClasses[AClass.ClassName] := AClass; RegisterStorableClass(AClass); end; function GetFacilityClass(AName: UTF8String): TAbstractFacilityClass; begin Result := FacilityClasses[AName]; // returns nil if not declared end; initialization FacilityClasses := TFacilityClassesHashTable.Create(@UTF8StringHash32); finalization FacilityClasses.Free(); end.