DEADSOFTWARE

FPC3.2.0 compat patch by deaddoomer
[d2df-sdl.git] / src / shared / MAPDEF.pas
index ecfad90a9710b2acbf0d8d79cce801f7d1a2de92..5316d010f6a7875df557254d7ea4df71b3d35136 100644 (file)
@@ -1,9 +1,8 @@
-(* Copyright (C)  DooM 2D:Forever Developers
+(* Copyright (C)  Doom 2D: Forever Developers
  *
  * 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, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -55,28 +54,40 @@ type
     function isValid (): Boolean; inline;
   end;
 
-  Char16     = packed array[0..15] of Char;
-  Char32     = packed array[0..31] of Char;
-  Char64     = packed array[0..63] of Char;
-  Char100    = packed array[0..99] of Char;
-  Char256    = packed array[0..255] of Char;
-  Byte128    = packed array[0..127] of Byte;
+  TDFColor = packed record
+  public
+    r, g, b, a: Byte; // a: 0 is transparent, 255 is opaque
+
+  public
+    constructor Create (ar, ag, ab: LongInt; aa: LongInt=0);
+
+    function isTransparent (): Boolean; inline;
+    function isOpaque (): Boolean; inline;
+    function isBlack (): Boolean; inline;
+    function isWhite (): Boolean; inline;
+  end;
 
 {$INCLUDE mapdef.inc}
 
 // various helpers to access map structures
 type
+  TDynFieldHelper = class helper for TDynField
+  public
+    function getRGBA (): TDFColor; inline;
+    procedure setRGBA (const v: TDFColor); inline;
+
+  public
+    property rgba: TDFColor read getRGBA write setRGBA; // for `TColor`
+  end;
+
   TDynRecordHelper = class helper for TDynRecord
   private
     function getFieldWithType (const aname: AnsiString; atype: TDynField.TType): TDynField; inline;
 
     function getPanelByIdx (idx: Integer): TDynRecord; inline;
 
-    function getPanelId (): Integer; inline;
-    //procedure setPanelId (v: Integer); inline;
-
     function getTexturePanel (): Integer; inline;
-    //procedure setTexturePanel (v: Integer); inline;
+    function getTexturePanelRec (): TDynRecord; inline;
 
     function getPanelIndex (pan: TDynRecord): Integer;
 
@@ -133,7 +144,7 @@ type
     //function Direction (): Byte; inline; // direction, ubyte
 
     // trigger
-    function trigRec (): TDynRecord; inline;
+    function trigRec (): TDynRecord; {inline;}
     function Enabled (): Boolean; inline; // enabled, bool
     function TriggerType (): Byte; inline; // type, ubyte
     function ActivateType (): Byte; inline; // activatetype, ubyte
@@ -143,6 +154,7 @@ type
     {$INCLUDE mapdef_help.inc}
     function trigMonsterId (): Integer; inline;
     function trigPanelId (): Integer; inline; // panel index in list
+    function trigPanelRec (): TDynRecord; inline;
 
   private
     // user fields
@@ -156,9 +168,10 @@ type
     property panel[idx: Integer]: TDynRecord read getPanelByIdx;
     property panelIndex[pan: TDynRecord]: Integer read getPanelIndex;
     // triggers
-    property tgPanelID: Integer read getPanelId {write setPanelId};
-    property tgShotPanelID: Integer read getPanelId {write setPanelId};
-    property TexturePanel: Integer read getTexturePanel {write setTexturePanel}; // texturepanel, int
+    property tgPanelId: Integer read trigPanelId;
+    property tgPanelRec: TDynRecord read trigPanelRec;
+    property TexturePanelId: Integer read getTexturePanel; // texturepanel, int
+    property TexturePanelRec: TDynRecord read getTexturePanelRec;
     // user fields
     property userPanelId: Integer read getUserPanelId write setUserPanelId;
     property userPanelTrigRef: Boolean read getUserTrigRef write setUserTrigRef;
@@ -179,6 +192,23 @@ constructor TDFSize.Create (aw, ah: LongInt); begin w := aw; h := ah; end;
 function TDFSize.isZero (): Boolean; inline; begin result := (w = 0) and (h = 0); end;
 function TDFSize.isValid (): Boolean; inline; begin result := (w > 0) and (h > 0); end;
 
+constructor TDFColor.Create (ar, ag, ab: LongInt; aa: LongInt=0);
+begin
+  if (ar < 0) then r := 0 else if (ar > 255) then r := 255 else r := Byte(ar);
+  if (ag < 0) then g := 0 else if (ag > 255) then g := 255 else g := Byte(ag);
+  if (ab < 0) then b := 0 else if (ab > 255) then b := 255 else b := Byte(ab);
+  if (aa < 0) then a := 0 else if (aa > 255) then a := 255 else a := Byte(aa);
+end;
+function TDFColor.isTransparent (): Boolean; inline; begin result := (a = 0); end;
+function TDFColor.isOpaque (): Boolean; inline; begin result := (a = 255); end;
+function TDFColor.isBlack (): Boolean; inline; begin result := (r = 0) and (g = 0) and (b = 0); end;
+function TDFColor.isWhite (): Boolean; inline; begin result := (r = 255) and (g = 255) and (b = 255); end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
+function TDynFieldHelper.getRGBA (): TDFColor; inline; begin result := TDFColor.Create(red, green, blue, alpha); end;
+procedure TDynFieldHelper.setRGBA (const v: TDFColor); inline; begin red := v.r; green := v.g; blue := v.b; alpha := v.a; end;
+
 
 // ////////////////////////////////////////////////////////////////////////// //
 function TDynRecordHelper.getUserPanelId (): Integer; inline;
@@ -256,7 +286,7 @@ var
 begin
   fld := field[aname];
   if (fld = nil) then raise Exception.Create(Format('field ''%s'' not found in record ''%s'' of type ''%s''', [aname, typeName, id]));
-  if (fld.baseType <> TPoint) then raise Exception.Create(Format('field ''%s'' in record ''%s'' of type ''%s'' has invalid data type', [aname, typeName, id]));
+  if (fld.baseType <> fld.TType.TPoint) then raise Exception.Create(Format('field ''%s'' in record ''%s'' of type ''%s'' has invalid data type', [aname, typeName, id]));
   result := TDFPoint.Create(fld.ival, fld.ival2);
 end;
 
@@ -267,7 +297,7 @@ var
 begin
   fld := field[aname];
   if (fld = nil) then raise Exception.Create(Format('field ''%s'' not found in record ''%s'' of type ''%s''', [aname, typeName, id]));
-  if (fld.baseType <> TSize) and (fld.baseType <> TPoint) then raise Exception.Create(Format('field ''%s'' in record ''%s'' of type ''%s'' has invalid data type', [aname, typeName, id]));
+  if (fld.baseType <> fld.TType.TSize) and (fld.baseType <> fld.TType.TPoint) then raise Exception.Create(Format('field ''%s'' in record ''%s'' of type ''%s'' has invalid data type', [aname, typeName, id]));
   result := TDFSize.Create(fld.ival, fld.ival2);
 end;
 
@@ -320,7 +350,7 @@ end;
 
 // ////////////////////////////////////////////////////////////////////////// //
 // trigger
-function TDynRecordHelper.trigRec (): TDynRecord; inline;
+function TDynRecordHelper.trigRec (): TDynRecord; {inline;}
 var
   fld: TDynField;
 begin
@@ -328,22 +358,66 @@ begin
   if (fld <> nil) then result := fld.recref else result := nil;
 end;
 
-
 function TDynRecordHelper.trigMonsterId (): Integer; inline;
 var
   fld: TDynField;
 begin
-  fld := getFieldWithType('monsterid', TDynField.TType.TInt);
+  result := -1;
+  fld := field['monsterid'];
+  if (fld = nil) then exit;
+  if (fld.baseType <> TDynField.TType.TInt) then exit;
+  if (fld.recref = nil) then exit;
   result := fld.recrefIndex;
 end;
 
+function TDynRecordHelper.trigPanelRec (): TDynRecord; inline;
+var
+  fld: TDynField;
+begin
+  result := nil;
+  fld := field['panelid'];
+  if (fld = nil) then exit;
+  if (fld.baseType <> TDynField.TType.TInt) then exit;
+  result := fld.recref;
+  if (result <> nil) and (result.typeName <> 'panel') then result := nil;
+end;
 
 // panel index in list
 function TDynRecordHelper.trigPanelId (): Integer; inline;
 var
   fld: TDynField;
 begin
-  fld := getFieldWithType('panelid', TDynField.TType.TInt);
+  result := -1;
+  fld := field['panelid'];
+  if (fld = nil) then exit;
+  if (fld.baseType <> TDynField.TType.TInt) then exit;
+  if (fld.recref = nil) then exit;
+  if (fld.recref.typeName <> 'panel') then exit;
+  result := fld.recrefIndex;
+end;
+
+function TDynRecordHelper.getTexturePanelRec (): TDynRecord;
+var
+  fld: TDynField;
+begin
+  result := nil;
+  fld := field['texture_panel'];
+  if (fld = nil) then exit;
+  if (fld.baseType <> TDynField.TType.TInt) then exit;
+  result := fld.recref;
+  if (result <> nil) and (result.typeName <> 'panel') then result := nil;
+end;
+
+function TDynRecordHelper.getTexturePanel (): Integer;
+var
+  fld: TDynField;
+begin
+  result := -1;
+  fld := field['texture_panel'];
+  if (fld = nil) then exit;
+  if (fld.baseType <> TDynField.TType.TInt) then exit;
+  if (fld.recref = nil) then exit;
+  if (fld.recref.typeName <> 'panel') then exit;
   result := fld.recrefIndex;
 end;
 
@@ -374,9 +448,6 @@ function TDynRecordHelper.TriggerType (): Byte; inline; begin result := Byte(get
 function TDynRecordHelper.ActivateType (): Byte; inline; begin result := Byte(getFieldWithType('activate_type', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.Keys (): Byte; inline; begin result := Byte(getFieldWithType('keys', TDynField.TType.TUByte).ival); end;
 
-function TDynRecordHelper.getPanelId (): Integer; inline; begin result := getFieldWithType('panelid', TDynField.TType.TInt).recrefIndex; end;
-function TDynRecordHelper.getTexturePanel (): Integer; begin result := getFieldWithType('texture_panel', TDynField.TType.TInt).recrefIndex; end;
-
 {$INCLUDE mapdef_impl.inc}