DEADSOFTWARE

some more exoma code
authorKetmar Dark <ketmar@ketmar.no-ip.org>
Sat, 9 Sep 2017 10:56:33 +0000 (13:56 +0300)
committerKetmar Dark <ketmar@ketmar.no-ip.org>
Sat, 9 Sep 2017 10:56:42 +0000 (13:56 +0300)
src/game/g_map.pas
src/game/g_monsters.pas
src/game/g_net.pas
src/game/g_player.pas
src/game/g_triggers.pas
src/game/g_weapons.pas
src/mapdef/mapdef.txt
src/shared/exoma.pas
src/shared/mapdef.inc
src/shared/xdynrec.pas

index c395dab92374f94db5ffefe36903406bf1646bfd..ac54bd535a9d82d6e3d1c00ae97795761348f24c 100644 (file)
@@ -1620,6 +1620,7 @@ var
   moveSpeed{, moveStart, moveEnd}: TDFPoint;
   //moveActive: Boolean;
   pan: TPanel;
+  mapOk: Boolean = false;
 begin
   mapGrid.Free();
   mapGrid := nil;
@@ -1690,6 +1691,8 @@ begin
       exit;
     end;
 
+    gCurrentMap := mapReader;
+
     generateExternalResourcesList(mapReader);
     mapTextureList := mapReader['texture'];
     // get all other lists here too
@@ -1778,6 +1781,8 @@ begin
         begin
           e_WriteLog('error loading map: invalid texture index for panel', MSG_FATALERROR);
           result := false;
+          gCurrentMap := nil;
+          gCurrentMapFileName := '';
           exit;
         end;
       end;
@@ -2156,10 +2161,16 @@ begin
 
     stt := curTimeMicro()-stt;
     e_LogWritefln('map loaded in %s.%s milliseconds', [Integer(stt div 1000), Integer(stt mod 1000)]);
+    mapOk := true;
   finally
     sfsGCEnable(); // enable releasing unused volumes
     mapReader.Free();
     e_ClearInputBuffer(); // why not?
+    if not mapOk then
+    begin
+      gCurrentMap := nil;
+      gCurrentMapFileName := '';
+    end;
   end;
 
   e_WriteLog('Done loading map.', MSG_NOTIFY);
index 71619512a3648a3d69e88eb390f5a5f2f8941a20..834220a1b40d316a4634bfc93f432739c077f860 100644 (file)
@@ -91,6 +91,8 @@ type
 
     mNeedSend: Boolean; // for network
 
+    mEDamageType: Integer;
+
     procedure Turn();
     function findNewPrey(): Boolean;
     procedure ActivateTriggers();
@@ -98,6 +100,8 @@ type
     procedure setGameX (v: Integer); inline;
     procedure setGameY (v: Integer); inline;
 
+    procedure doDamage (v: Integer);
+
   public
     FNoRespawn: Boolean;
     FFireTime: Integer;
@@ -158,7 +162,6 @@ type
     property proxyId: Integer read mProxyId;
     property arrIdx: Integer read mArrIdx;
 
-  published
     property MonsterType: Byte read FMonsterType;
     property MonsterHealth: Integer read FHealth write FHealth;
     property MonsterAmmo: Integer read FAmmo write FAmmo;
@@ -183,6 +186,36 @@ type
     property GameDirection: TDirection read FDirection write FDirection;
 
     property StartID: Integer read FStartID;
+
+  published
+    property eMonsterType: Byte read FMonsterType;
+    property eMonsterHealth: Integer read FHealth write FHealth;
+    property eMonsterAmmo: Integer read FAmmo write FAmmo;
+    property eMonsterTargetUID: Word read FTargetUID write FTargetUID;
+    property eMonsterTargetTime: Integer read FTargetTime write FTargetTime;
+    property eMonsterBehaviour: Byte read FBehaviour write FBehaviour;
+    property eMonsterSleep: Integer read FSleep write FSleep;
+    property eMonsterState: Byte read FState write FState;
+    property eMonsterRemoved: Boolean read FRemoved;
+    property eMonsterPain: Integer read FPain write FPain;
+    property eMonsterAnim: Byte read FCurAnim;
+
+    property eUID: Word read FUID;
+    property eSpawnTrigger: Integer read FSpawnTrigger;
+
+    property eGameX: Integer read FObj.X write setGameX;
+    property eGameY: Integer read FObj.Y write setGameY;
+    property eGameVelX: Integer read FObj.Vel.X write FObj.Vel.X;
+    property eGameVelY: Integer read FObj.Vel.Y write FObj.Vel.Y;
+    property eGameAccelX: Integer read FObj.Accel.X write FObj.Accel.X;
+    property eGameAccelY: Integer read FObj.Accel.Y write FObj.Accel.Y;
+    property eGameDirection: TDirection read FDirection write FDirection;
+
+    property eStartID: Integer read FStartID;
+
+    // set this before assigning something to `eDamage`
+    property eDamageType: Integer read mEDamageType write mEDamageType;
+    property eDamage: Integer write doDamage;
   end;
 
 
@@ -1587,6 +1620,12 @@ begin
   end;
 end;
 
+procedure TMonster.doDamage (v: Integer);
+begin
+  if (v <= 0) then exit;
+  if (v > 32767) then v := 32767;
+  Damage(v, 0, 0, 0, mEDamageType);
+end;
 
 procedure TMonster.ActionSound();
 begin
@@ -1833,6 +1872,7 @@ begin
   FFireTime := 0;
   FFirePainTime := 0;
   FFireAttacker := 0;
+  mEDamageType := HIT_SOME;
 
   mProxyId := -1;
   mArrIdx := -1;
index 95f96739e62eea4e74a3d662097d2421261c1a50..78b8eeaa6d0da6e722a118ee4c6c60b06ce6347d 100644 (file)
@@ -19,7 +19,7 @@ unit g_net;
 interface
 
 uses
-  e_log, e_msg, ENet, Classes;
+  e_log, e_msg, ENet, Classes, MAPDEF;
 
 const
   NET_PROTOCOL_VER = 173;
index fb96ef9e3d56654ab0074c557ebc05f8c62aa23c..9c20c904f520d41a9855248c2a9822ee95e46138 100644 (file)
@@ -195,34 +195,38 @@ type
     FNoReload:  Boolean;
     FJustTeleported: Boolean;
     FNetTime: LongWord;
-
-    function    CollideLevel(XInc, YInc: Integer): Boolean;
-    function    StayOnStep(XInc, YInc: Integer): Boolean;
-    function    HeadInLiquid(XInc, YInc: Integer): Boolean;
-    function    BodyInLiquid(XInc, YInc: Integer): Boolean;
-    function    BodyInAcid(XInc, YInc: Integer): Boolean;
-    function    FullInLift(XInc, YInc: Integer): Integer;
-    {procedure   CollideItem();}
-    procedure   FlySmoke(Times: DWORD = 1);
-    procedure   OnFireFlame(Times: DWORD = 1);
-    function    GetAmmoByWeapon(Weapon: Byte): Word;
-    procedure   SetAction(Action: Byte; Force: Boolean = False);
-    procedure   OnDamage(Angle: SmallInt); virtual;
-    function    firediry(): Integer;
-
-    procedure   Run(Direction: TDirection);
-    procedure   NextWeapon();
-    procedure   PrevWeapon();
-    procedure   SeeUp();
-    procedure   SeeDown();
-    procedure   Fire();
-    procedure   Jump();
-    procedure   Use();
+    mEDamageType: Integer;
+
+
+    function CollideLevel(XInc, YInc: Integer): Boolean;
+    function StayOnStep(XInc, YInc: Integer): Boolean;
+    function HeadInLiquid(XInc, YInc: Integer): Boolean;
+    function BodyInLiquid(XInc, YInc: Integer): Boolean;
+    function BodyInAcid(XInc, YInc: Integer): Boolean;
+    function FullInLift(XInc, YInc: Integer): Integer;
+    {procedure CollideItem();}
+    procedure FlySmoke(Times: DWORD = 1);
+    procedure OnFireFlame(Times: DWORD = 1);
+    function GetAmmoByWeapon(Weapon: Byte): Word;
+    procedure SetAction(Action: Byte; Force: Boolean = False);
+    procedure OnDamage(Angle: SmallInt); virtual;
+    function firediry(): Integer;
+
+    procedure Run(Direction: TDirection);
+    procedure NextWeapon();
+    procedure PrevWeapon();
+    procedure SeeUp();
+    procedure SeeDown();
+    procedure Fire();
+    procedure Jump();
+    procedure Use();
 
     function getNextWeaponIndex (): Byte; // return 255 for "no switch"
     procedure resetWeaponQueue ();
     function hasAmmoForWeapon (weapon: Byte): Boolean;
 
+    procedure doDamage (v: Integer);
+
   public
     FDamageBuffer:   Integer;
 
@@ -327,7 +331,6 @@ type
     property    Vel: TPoint2i read FObj.Vel;
     property    Obj: TObj read FObj;
 
-  published
     property    Name: String read FName write FName;
     property    Model: TPlayerModel read FModel;
     property    Health: Integer read FHealth write FHealth;
@@ -358,6 +361,41 @@ type
     property    UID: Word read FUID write FUID;
     property    JustTeleported: Boolean read FJustTeleported write FJustTeleported;
     property    NetTime: LongWord read FNetTime write FNetTime;
+
+  published
+    property eName: String read FName write FName;
+    property eHealth: Integer read FHealth write FHealth;
+    property eLives: Byte read FLives write FLives;
+    property eArmor: Integer read FArmor write FArmor;
+    property eAir:   Integer read FAir write FAir;
+    property eJetFuel: Integer read FJetFuel write FJetFuel;
+    property eFrags: Integer read FFrags write FFrags;
+    property eDeath: Integer read FDeath write FDeath;
+    property eKills: Integer read FKills write FKills;
+    property eCurrWeap: Byte read FCurrWeap write FCurrWeap;
+    property eMonsterKills: Integer read FMonsterKills write FMonsterKills;
+    property eSecrets: Integer read FSecrets write FSecrets;
+    property eGodMode: Boolean read FGodMode write FGodMode;
+    property eNoTarget: Boolean read FNoTarget write FNoTarget;
+    property eNoReload: Boolean read FNoReload write FNoReload;
+    property eAlive: Boolean read FAlive write FAlive;
+    property eFlag: Byte read FFlag;
+    property eTeam: Byte read FTeam write FTeam;
+    property eDirection: TDirection read FDirection;
+    property eGameX: Integer read FObj.X write FObj.X;
+    property eGameY: Integer read FObj.Y write FObj.Y;
+    property eGameVelX: Integer read FObj.Vel.X write FObj.Vel.X;
+    property eGameVelY: Integer read FObj.Vel.Y write FObj.Vel.Y;
+    property eGameAccelX: Integer read FObj.Accel.X write FObj.Accel.X;
+    property eGameAccelY: Integer read FObj.Accel.Y write FObj.Accel.Y;
+    property eIncCam: Integer read FIncCam write FIncCam;
+    property eUID: Word read FUID;
+    property eJustTeleported: Boolean read FJustTeleported;
+    property eNetTime: LongWord read FNetTime;
+
+    // set this before assigning something to `eDamage`
+    property eDamageType: Integer read mEDamageType write mEDamageType;
+    property eDamage: Integer write doDamage;
   end;
 
   TDifficult = record
@@ -2056,6 +2094,7 @@ begin
   viewPortY := 0;
   viewPortW := 0;
   viewPortH := 0;
+  mEDamageType := HIT_SOME;
 
   FIamBot := False;
   FDummy := False;
@@ -2103,6 +2142,13 @@ procedure TPlayer.positionChanged (); inline;
 begin
 end;
 
+procedure TPlayer.doDamage (v: Integer);
+begin
+  if (v <= 0) then exit;
+  if (v > 32767) then v := 32767;
+  Damage(v, 0, 0, 0, mEDamageType);
+end;
+
 procedure TPlayer.Damage(value: Word; SpawnerUID: Word; vx, vy: Integer; t: Byte);
 var
   c: Word;
index e49a4ef493e49baed5ab454213ceae3125545729..2aa9cfa7fb9b6a17c1cfe81ab4a50f47dcfed398 100644 (file)
@@ -139,12 +139,53 @@ type
   end;
 
 
+// ////////////////////////////////////////////////////////////////////////// //
+type
+  TMyConstList = class(TExprConstList)
+  public
+    function valid (const cname: AnsiString): Boolean; override;
+    function get (const cname: AnsiString; out v: Variant): Boolean; override;
+  end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
+function TMyConstList.valid (const cname: AnsiString): Boolean;
+begin
+  //writeln('CHECK: ''', cname, '''');
+  result :=
+    (cname = 'player') or
+    (cname = 'self') or
+    false;
+end;
+
+function TMyConstList.get (const cname: AnsiString; out v: Variant): Boolean;
+var
+  eidx: Integer;
+  ebs: TDynEBS;
+begin
+  //if (cname = 'answer') then begin v := LongInt(42); result := true; exit; end;
+  result := false;
+  if (gCurrentMap = nil) then exit;
+  for eidx := 0 to gCurrentMap.mapdef.ebsTypeCount-1 do
+  begin
+    ebs := gCurrentMap.mapdef.ebsTypeAt[eidx];
+    if ebs.has[cname] then
+    begin
+      //writeln('FOUND: ''', cname, '''');
+      v := ebs[cname];
+      result := true;
+      exit;
+    end;
+  end;
+end;
+
+
 // ////////////////////////////////////////////////////////////////////////// //
 constructor TTrigScope.Create ();
 begin
-  plrprops := TPropHash.Create(TPlayer);
-  monsprops := TPropHash.Create(TMonster);
-  platprops := TPropHash.Create(TPanel);
+  plrprops := TPropHash.Create(TPlayer, 'e');
+  monsprops := TPropHash.Create(TMonster, 'e');
+  platprops := TPropHash.Create(TPanel, 'e');
   me := nil;
 end;
 
@@ -209,6 +250,7 @@ end;
 // ////////////////////////////////////////////////////////////////////////// //
 var
   tgscope: TTrigScope = nil;
+  tgclist: TMyConstList = nil;
 
 
 // ////////////////////////////////////////////////////////////////////////// //
@@ -1189,10 +1231,12 @@ begin
       tvval := Trigger.exoCheck.value(tgscope);
       tgscope.me := nil;
       if not Boolean(tvval) then exit;
-    except
-      tgscope.me := nil;
-      conwritefln('trigger exocheck error: %s', [Trigger.exoCheck.toString()]);
-      exit;
+    except on e: Exception do
+      begin
+        tgscope.me := nil;
+        conwritefln('trigger exocheck error: %s [%s]', [e.message, Trigger.exoCheck.toString()]);
+        exit;
+      end;
     end;
   end;
 
@@ -1207,10 +1251,12 @@ begin
       tgscope.me := @Trigger;
       Trigger.exoAction.value(tgscope);
       tgscope.me := nil;
-    except
-      tgscope.me := nil;
-      conwritefln('trigger exoactivate error: %s', [Trigger.exoAction.toString()]);
-      exit;
+    except on e: Exception do
+      begin
+        tgscope.me := nil;
+        conwritefln('trigger exoactivate error: %s [%s]', [e.message, Trigger.exoAction.toString()]);
+        exit;
+      end;
     end;
   end;
 
@@ -2301,6 +2347,7 @@ var
   f, olen: Integer;
 begin
   if (tgscope = nil) then tgscope := TTrigScope.Create();
+  if (tgclist = nil) then tgclist := TMyConstList.Create();
 
   // Íå ñîçäàâàòü âûõîä, åñëè èãðà áåç âûõîäà
   if (Trigger.TriggerType = TRIGGER_EXIT) and
@@ -2403,28 +2450,48 @@ begin
   gTriggers[find_id].userVars := nil; //THashStrVariant.Create(hsihash, hsiequ);
 
   try
-    gTriggers[find_id].exoThink := TExprBase.parseStatList(VarToStr(trec.user['exoma_think']));
+    gTriggers[find_id].exoThink := TExprBase.parseStatList(tgclist, VarToStr(trec.user['exoma_think']));
   except
-    conwritefln('*** ERROR parsing exoma_think: [%s]', [VarToStr(trec.user['exoma_think'])]);
-    gTriggers[find_id].exoThink := nil;
+    on e: TExomaParseException do
+      begin
+        conwritefln('*** ERROR parsing exoma_think (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_think'])]);
+        gTriggers[find_id].exoThink := nil;
+      end;
+    else
+      raise;
   end;
   try
-    gTriggers[find_id].exoCheck := TExprBase.parse(VarToStr(trec.user['exoma_check']));
+    gTriggers[find_id].exoCheck := TExprBase.parse(tgclist, VarToStr(trec.user['exoma_check']));
   except
-    conwritefln('*** ERROR parsing exoma_check: [%s]', [VarToStr(trec.user['exoma_check'])]);
-    gTriggers[find_id].exoCheck := nil;
+    on e: TExomaParseException do
+      begin
+        conwritefln('*** ERROR parsing exoma_check (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_check'])]);
+        gTriggers[find_id].exoCheck := nil;
+      end;
+    else
+      raise;
   end;
   try
-    gTriggers[find_id].exoAction := TExprBase.parseStatList(VarToStr(trec.user['exoma_action']));
+    gTriggers[find_id].exoAction := TExprBase.parseStatList(tgclist, VarToStr(trec.user['exoma_action']));
   except
-    conwritefln('*** ERROR parsing exoma_action: [%s]', [VarToStr(trec.user['exoma_action'])]);
-    gTriggers[find_id].exoAction := nil;
+    on e: TExomaParseException do
+      begin
+        conwritefln('*** ERROR parsing exoma_action (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_action'])]);
+        gTriggers[find_id].exoAction := nil;
+      end;
+    else
+      raise;
   end;
   try
-    gTriggers[find_id].exoInit := TExprBase.parseStatList(VarToStr(trec.user['exoma_init']));
+    gTriggers[find_id].exoInit := TExprBase.parseStatList(tgclist, VarToStr(trec.user['exoma_init']));
   except
-    conwritefln('*** ERROR parsing exoma_init: [%s]', [VarToStr(trec.user['exoma_init'])]);
-    gTriggers[find_id].exoInit := nil;
+    on e: TExomaParseException do
+      begin
+        conwritefln('*** ERROR parsing exoma_init (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_init'])]);
+        gTriggers[find_id].exoInit := nil;
+      end;
+    else
+      raise;
   end;
 
   if (forceInternalIndex < 0) and (gTriggers[find_id].exoInit <> nil) then
index 034642c34561165f8398d2d11153c2764cd5c071..5ba00a7ad526f3a3e025954efc7dbd20510eefa1 100644 (file)
@@ -22,6 +22,7 @@ interface
 uses
   g_textures, g_basic, e_graphics, g_phys, BinEditor, xprofiler;
 
+{
 const
   HIT_SOME    = 0;
   HIT_ROCKET  = 1;
@@ -34,6 +35,7 @@ const
   HIT_FLAME   = 8;
   HIT_SELF    = 9;
   HIT_DISCON  = 10;
+}
 
 type
   TShot = record
index afa87222a21dd5c5312a1f45f26f2be0cc0c435b..ab27f7f8336d7d59f77b611a38e2fb3b1cdb709e 100644 (file)
@@ -375,6 +375,20 @@ bitset Key {
   KEY_BLUETEAM, // 16
 }
 
+enum HitType {
+  HIT_SOME, // 0
+  HIT_ROCKET, // 1
+  HIT_BFG, // 2
+  HIT_TRAP, // 3
+  HIT_FALL, // 4
+  HIT_WATER, // 5
+  HIT_ACID, // 6
+  HIT_ELECTRO, // 7
+  HIT_FLAME, // 8
+  HIT_SELF, // 9
+  HIT_DISCON, // 10
+}
+
 
 ////////////////////////////////////////////////////////////////////////////////
 // various triggers
index 8e8cc3ff1f4a490ffa65173c25536df843440fff..8616b7ba21d138914aaf2f109b91c7669799f7ef 100644 (file)
@@ -49,7 +49,7 @@ type
     pc: Integer;
 
   public
-    constructor Create (aklass: TClass);
+    constructor Create (aklass: TClass; const apfx: AnsiString='');
     destructor Destroy (); override;
 
     function get (obj: TObject; const fldname: AnsiString; out v: Variant): Boolean;
@@ -57,6 +57,15 @@ type
   end;
 
 
+// ////////////////////////////////////////////////////////////////////////// //
+type
+  TExprConstList = class
+  public
+    function valid (const cname: AnsiString): Boolean; virtual; abstract;
+    function get (const cname: AnsiString; out v: Variant): Boolean; virtual; abstract;
+  end;
+
+
 // ////////////////////////////////////////////////////////////////////////// //
 type
   TExprScope = class
@@ -78,11 +87,11 @@ type
     class procedure errorfmt (const afmt: AnsiString; const args: array of const);
 
     class procedure parseError (pr: TTextParser; const amsg: AnsiString);
-    class procedure parseError (pr: TTextParser; const afmt: AnsiString; const args: array of const);
+    class procedure parseErrorFmt (pr: TTextParser; const afmt: AnsiString; const args: array of const);
 
-    class function parse (pr: TTextParser; allowAssign: Boolean=false): TExprBase;
-    class function parse (const str: AnsiString; allowAssign: Boolean=false): TExprBase;
-    class function parseStatList (const str: AnsiString): TExprBase;
+    class function parse (clist: TExprConstList; pr: TTextParser; allowAssign: Boolean=false): TExprBase;
+    class function parse (clist: TExprConstList; const str: AnsiString; allowAssign: Boolean=false): TExprBase;
+    class function parseStatList (clist: TExprConstList; const str: AnsiString): TExprBase;
 
     class function isFloat (var v: Variant): Boolean; inline;
     class function isInt (var v: Variant): Boolean; inline;
@@ -101,6 +110,7 @@ type
   public
     constructor Create ();
     destructor Destroy (); override;
+    procedure append (e: TExprBase);
     function value (scope: TExprScope): Variant; override;
     function toString (): AnsiString; override;
     function clone (): TExprBase; override;
@@ -124,6 +134,7 @@ type
     constructor Create (aval: Boolean);
     constructor Create (aval: LongInt);
     constructor Create (const aval: AnsiString);
+    constructor Create (var v: Variant);
 
     function value (scope: TExprScope): Variant; override;
     function toString (): AnsiString; override;
@@ -326,11 +337,12 @@ end;
 
 
 // ////////////////////////////////////////////////////////////////////////// //
-constructor TPropHash.Create (aklass: TClass);
+constructor TPropHash.Create (aklass: TClass; const apfx: AnsiString='');
 var
   pi: PTypeInfo;
   pt: PTypeData;
   idx: Integer;
+  n: AnsiString;
 begin
   mClass := aklass;
   mNames := hashNewStrInt();
@@ -338,7 +350,21 @@ begin
   pt := GetTypeData(pi);
   GetMem(pl, pt^.PropCount*sizeof(Pointer));
   pc := GetPropList(pi, [tkInteger, tkBool, tkSString, tkLString, tkAString, {tkSet,} tkEnumeration], pl);
-  for idx := 0 to pc-1 do mNames.put(pl^[idx].name, idx);
+  for idx := 0 to pc-1 do
+  begin
+    if (Length(apfx) > 0) then
+    begin
+      if (Length(pl^[idx].name) < Length(apfx)) then continue;
+      n := pl^[idx].name;
+      if (Copy(n, 1, Length(apfx)) <> apfx) then continue;
+      Delete(n, 1, Length(apfx));
+      mNames.put(n, idx);
+    end
+    else
+    begin
+      mNames.put(pl^[idx].name, idx);
+    end;
+  end;
 end;
 
 destructor TPropHash.Destroy ();
@@ -413,7 +439,7 @@ class procedure TExprBase.error (const amsg: AnsiString); begin raise TExomaExce
 class procedure TExprBase.errorfmt (const afmt: AnsiString; const args: array of const); begin raise TExomaException.CreateFmt(afmt, args); end;
 
 class procedure TExprBase.parseError (pr: TTextParser; const amsg: AnsiString); begin raise TExomaParseException.Create(pr, amsg); end;
-class procedure TExprBase.parseError (pr: TTextParser; const afmt: AnsiString; const args: array of const); begin raise TExomaParseException.CreateFmt(pr, afmt, args); end;
+class procedure TExprBase.parseErrorFmt (pr: TTextParser; const afmt: AnsiString; const args: array of const); begin raise TExomaParseException.CreateFmt(pr, afmt, args); end;
 
 class function TExprBase.coerce2bool (var v0: Variant): Boolean;
 begin
@@ -476,6 +502,15 @@ procedure TExprBase.assign (scope: TExprScope; var v: Variant); begin error('not
 constructor TExprStatList.Create (); begin mList := nil; end;
 destructor TExprStatList.Destroy (); var f: Integer; begin for f := 0 to High(mList) do mList[f].Free(); mList := nil; end;
 
+procedure TExprStatList.append (e: TExprBase);
+begin
+  if (e <> nil) then
+  begin
+    SetLength(mList, Length(mList)+1);
+    mList[High(mList)] := e;
+  end;
+end;
+
 function TExprStatList.value (scope: TExprScope): Variant;
 var
   f: Integer;
@@ -539,6 +574,7 @@ function TObjExpr.clone (): TExprBase; begin result := TObjExpr.Create(mName); e
 constructor TLitExpr.Create (aval: Boolean); begin mValue := aval; end;
 constructor TLitExpr.Create (aval: LongInt); begin mValue := aval; end;
 constructor TLitExpr.Create (const aval: AnsiString); begin mValue := aval; end;
+constructor TLitExpr.Create (var v: Variant); begin mValue := v; end;
 function TLitExpr.value (scope: TExprScope): Variant; begin result := mValue; end;
 function TLitExpr.toString (): AnsiString; begin result := VarToStr(mValue); if isStr(mValue) then result := quoteStr(result); end;
 function TLitExpr.clone (): TExprBase; begin result := TLitExpr.Create(0); (result as TLitExpr).mValue := mValue; end;
@@ -868,43 +904,54 @@ function TBinAssign.toString (): AnsiString; begin result := mOp0.toString()+'='
 
 
 // ////////////////////////////////////////////////////////////////////////// //
-class function TExprBase.parse (const str: AnsiString; allowAssign: Boolean=false): TExprBase;
+class function TExprBase.parse (clist: TExprConstList; const str: AnsiString; allowAssign: Boolean=false): TExprBase;
 var
   pr: TTextParser;
 begin
   pr := TStrTextParser.Create(str);
   try
-    result := parse(pr, allowAssign);
+    result := parse(clist, pr, allowAssign);
     if (pr.tokType <> pr.TTEOF) then begin result.Free(); parseError(pr, 'extra code in expression'); end;
   finally
     pr.Free();
   end;
 end;
 
-class function TExprBase.parseStatList (const str: AnsiString): TExprBase;
+class function TExprBase.parseStatList (clist: TExprConstList; const str: AnsiString): TExprBase;
 var
-  pr: TTextParser;
-  r: TExprStatList;
-  e: TExprBase;
+  pr: TTextParser = nil;
+  r: TExprStatList = nil;
+  e: TExprBase = nil;
 begin
   pr := TStrTextParser.Create(str);
   if (pr.tokType = pr.TTEOF) then begin pr.Free(); result := nil; exit; end;
   r := TExprStatList.Create();
   result := nil;
   try
-    while true do
-    begin
-      while pr.eatTT(pr.TTSemi) do begin end;
-      if (pr.tokType = pr.TTEOF) then break;
-      e := parse(pr, true);
-      if (e = nil) then break;
-      SetLength(r.mList, Length(r.mList)+1);
-      r.mList[High(r.mList)] := e;
-      if (pr.tokType = pr.TTEOF) then break;
-      pr.expectTT(pr.TTSemi);
+    try
+      while true do
+      begin
+        while pr.eatTT(pr.TTSemi) do begin end;
+        if (pr.tokType = pr.TTEOF) then break;
+        e := parse(clist, pr, true);
+        if (e = nil) then break;
+        //writeln(': ', e.toString());
+        r.append(e);
+        if (pr.tokType = pr.TTEOF) then break;
+        //writeln('tt=', pr.tokType, ' <', pr.tokStr, '>');
+        //writeln(r.toString());
+        pr.expectTT(pr.TTSemi);
+      end;
+      result := r;
+      r := nil;
+    except
+      on e: TExomaException do
+        raise TExomaParseException.Create(pr, e.message);
+      on e: Exception do
+        raise TExomaParseException.Create(pr, e.message);
+      else
+        raise;
     end;
-    result := r;
-    r := nil;
   finally
     r.Free();
     pr.Free();
@@ -912,11 +959,14 @@ begin
 end;
 
 
-class function TExprBase.parse (pr: TTextParser; allowAssign: Boolean=false): TExprBase;
+class function TExprBase.parse (clist: TExprConstList; pr: TTextParser; allowAssign: Boolean=false): TExprBase;
 
   function expr (): TExprBase; forward;
 
   function doTerm (): TExprBase;
+  var
+    id: AnsiString;
+    v: Variant;
   begin
     result := nil;
     try
@@ -931,7 +981,17 @@ class function TExprBase.parse (pr: TTextParser; allowAssign: Boolean=false): TE
         if (pr.tokStr = 'true') then begin result := TLitExpr.Create(true); pr.skipToken(); exit; end;
         if (pr.tokStr = 'false') then begin result := TLitExpr.Create(false); pr.skipToken(); exit; end;
         if (CompareText(pr.tokStr, 'true') = 0) or (CompareText(pr.tokStr, 'false') = 0) then parseError(pr, '`true` and `false` are case-sensitive');
-        result := TObjExpr.Create(pr.expectId());
+        id := pr.expectId();
+        if (clist <> nil) then
+        begin
+          if clist.get(id, v) then
+          begin
+            result := TLitExpr.Create(v);
+            exit;
+          end;
+          if not clist.valid(id) then parseErrorFmt(pr, 'unknown identifier ''%s''', [id]);
+        end;
+        result := TObjExpr.Create(id);
         while (pr.tokType = pr.TTDelim) and (pr.tokChar = '.') do
         begin
           pr.skipToken();
@@ -1054,34 +1114,56 @@ class function TExprBase.parse (pr: TTextParser; allowAssign: Boolean=false): TE
   // &&
   // ||
 
-  function expr (): TExprBase;
+  function expr0 (): TExprBase;
   var
-    neg: Boolean = false;
+    neg: Boolean;
+    e: TExprBase = nil;
+    list: TExprStatList = nil;
   begin
-         if pr.eatDelim('-') then neg := true
-    else if pr.eatDelim('+') then neg := false;
-    result := doLogOr();
-    if neg then result := TUnExprNeg.Create(result);
+    result := nil;
+    try
+      while true do
+      begin
+             if pr.eatDelim('-') then neg := true
+        else if pr.eatDelim('+') then neg := false
+        else neg := false;
+        e := doLogOr();
+        if neg then e := TUnExprNeg.Create(e);
+        if allowAssign and pr.eatDelim('=') then e := TBinAssign.Create(e, expr());
+        if not pr.eatTT(pr.TTComma) then
+        begin
+          if (result = nil) then result := e else list.append(e);
+          break;
+        end;
+        //assert(false);
+        if (list = nil) then
+        begin
+          list := TExprStatList.Create();
+          result := list;
+        end;
+        list.append(e);
+        e := nil;
+      end;
+    except
+      e.Free();
+      list.Free();
+    end;
   end;
 
-  function exprMain (): TExprBase;
+  function expr (): TExprBase;
   var
-    neg: Boolean = false;
     c: TExprCond;
   begin
-         if pr.eatDelim('-') then neg := true
-    else if pr.eatDelim('+') then neg := false;
-    result := doLogOr();
-    if neg then result := TUnExprNeg.Create(result);
+    result := expr0();
     // ternary
     if pr.eatDelim('?') then
     begin
       c := TExprCond.Create();
       c.mCond := result;
       try
-        c.mTrue := exprMain();
+        c.mTrue := expr();
         pr.expectTT(pr.TTColon);
-        c.mFalse := exprMain();
+        c.mFalse := expr();
         result := c;
       except
         c.Free();
@@ -1097,13 +1179,7 @@ begin
   try
     pr.allowSignedNumbers := false;
     try
-      result := exprMain();
-      if allowAssign and pr.eatDelim('=') then
-      try
-        result := TBinAssign.Create(result, expr());
-      except
-        result.Free();
-      end;
+      result := expr();
     finally
       pr.allowSignedNumbers := oas;
     end;
index 1fe1c0363f03904daafb1d02382ec3bc5a79f2e8..f65ba0d4cd8a2265a22b638c89d9ce89f8181be1 100644 (file)
@@ -281,6 +281,20 @@ const
   KEY_REDTEAM = 8;
   KEY_BLUETEAM = 16;
 
+// HitType
+const
+  HIT_SOME = 0;
+  HIT_ROCKET = 1;
+  HIT_BFG = 2;
+  HIT_TRAP = 3;
+  HIT_FALL = 4;
+  HIT_WATER = 5;
+  HIT_ACID = 6;
+  HIT_ELECTRO = 7;
+  HIT_FLAME = 8;
+  HIT_SELF = 9;
+  HIT_DISCON = 10;
+
 // TriggerScoreTeam
 const
   TRIGGER_SCORE_TEAM_MINE_RED = 0;
@@ -762,271 +776,280 @@ const defaultMapDef: AnsiString = ''+
   #32#47#47#32#49#10#32#32#75#69#89#95#71#82#69#69#78#44#32#47#47#32#50#10#32+
   #32#75#69#89#95#66#76#85#69#44#32#47#47#32#52#10#32#32#75#69#89#95#82#69#68+
   #84#69#65#77#44#32#47#47#32#56#10#32#32#75#69#89#95#66#76#85#69#84#69#65#77+
-  #44#32#47#47#32#49#54#10#125#10#10#10#47#47#47#47#47#47#47#47#47#47#47#47#47+
+  #44#32#47#47#32#49#54#10#125#10#10#101#110#117#109#32#72#105#116#84#121#112+
+  #101#32#123#10#32#32#72#73#84#95#83#79#77#69#44#32#47#47#32#48#10#32#32#72+
+  #73#84#95#82#79#67#75#69#84#44#32#47#47#32#49#10#32#32#72#73#84#95#66#70#71+
+  #44#32#47#47#32#50#10#32#32#72#73#84#95#84#82#65#80#44#32#47#47#32#51#10#32+
+  #32#72#73#84#95#70#65#76#76#44#32#47#47#32#52#10#32#32#72#73#84#95#87#65#84+
+  #69#82#44#32#47#47#32#53#10#32#32#72#73#84#95#65#67#73#68#44#32#47#47#32#54+
+  #10#32#32#72#73#84#95#69#76#69#67#84#82#79#44#32#47#47#32#55#10#32#32#72#73+
+  #84#95#70#76#65#77#69#44#32#47#47#32#56#10#32#32#72#73#84#95#83#69#76#70#44+
+  #32#47#47#32#57#10#32#32#72#73#84#95#68#73#83#67#79#78#44#32#47#47#32#49#48+
+  #10#125#10#10#10#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
-  #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47#32#118#97#114+
-  #105#111#117#115#32#116#114#105#103#103#101#114#115#10#84#114#105#103#103+
-  #101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#69#88#73#84+
-  #32#123#10#32#32#34#109#97#112#34#32#116#121#112#101#32#99#104#97#114#91#49+
-  #54#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101#102+
-  #97#117#108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32+
-  #102#111#114#32#84#82#73#71#71#69#82#95#84#69#76#69#80#79#82#84#32#123#10#32+
-  #32#34#116#97#114#103#101#116#34#32#116#121#112#101#32#112#111#105#110#116+
-  #32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117+
-  #108#116#59#10#32#32#34#100#50#100#34#32#116#121#112#101#32#98#111#111#108+
-  #32#111#102#102#115#101#116#32#56#32#100#101#102#97#117#108#116#32#102#97+
-  #108#115#101#59#10#32#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32+
-  #98#111#111#108#32#111#102#102#115#101#116#32#57#32#100#101#102#97#117#108+
-  #116#32#102#97#108#115#101#59#10#32#32#34#100#105#114#101#99#116#105#111#110+
-  #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
-  #49#48#32#101#110#117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117+
-  #108#116#32#68#73#82#95#76#69#70#84#59#10#125#10#10#84#114#105#103#103#101+
-  #114#68#97#116#97#32#102#111#114#32#40#84#82#73#71#71#69#82#95#79#80#69#78+
-  #68#79#79#82#44#32#84#82#73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32+
-  #84#82#73#71#71#69#82#95#68#79#79#82#44#32#84#82#73#71#71#69#82#95#68#79#79+
-  #82#53#44#32#84#82#73#71#71#69#82#95#67#76#79#83#69#84#82#65#80#44#32#84#82+
-  #73#71#71#69#82#95#84#82#65#80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#85+
-  #80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#68#79#87#78#44#32#84#82#73#71+
-  #71#69#82#95#76#73#70#84#41#32#123#10#32#32#34#112#97#110#101#108#105#100#34+
-  #32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#32#112+
-  #97#110#101#108#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32+
-  #32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32+
-  #111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116#32#102#97#108+
-  #115#101#59#10#32#32#34#100#50#100#34#32#116#121#112#101#32#98#111#111#108+
-  #32#111#102#102#115#101#116#32#53#32#100#101#102#97#117#108#116#32#102#97+
-  #108#115#101#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
-  #111#114#32#40#84#82#73#71#71#69#82#95#80#82#69#83#83#44#32#84#82#73#71#71+
-  #69#82#95#79#78#44#32#84#82#73#71#71#69#82#95#79#70#70#44#32#84#82#73#71#71+
-  #69#82#95#79#78#79#70#70#41#32#123#10#32#32#34#112#111#115#105#116#105#111+
-  #110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115#101#116+
-  #32#48#32#97#115#32#116#120#121#32#100#101#102#97#117#108#116#32#40#48#32#48+
-  #41#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#105+
-  #122#101#34#32#116#121#112#101#32#115#105#122#101#32#111#102#102#115#101#116+
-  #32#56#32#97#115#32#116#119#104#32#100#101#102#97#117#108#116#32#40#48#32#48+
-  #41#59#10#32#32#34#119#97#105#116#34#32#116#121#112#101#32#117#115#104#111+
-  #114#116#32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117#108#116+
-  #32#48#59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97#115#32#112#114+
-  #101#115#115#67#111#117#110#116#32#116#121#112#101#32#117#115#104#111#114+
-  #116#32#111#102#102#115#101#116#32#49#52#32#100#101#102#97#117#108#116#32#48+
-  #59#10#32#32#34#109#111#110#115#116#101#114#105#100#34#32#116#121#112#101#32+
-  #105#110#116#32#111#102#102#115#101#116#32#49#54#32#109#111#110#115#116#101+
-  #114#32#97#115#32#109#111#110#115#116#101#114#105#100#32#100#101#102#97#117+
-  #108#116#32#110#117#108#108#59#10#32#32#34#101#120#116#95#114#97#110#100#111+
-  #109#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32+
-  #50#48#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32#47#47+
-  #32#116#104#105#115#32#111#110#101#32#105#115#32#102#111#114#32#109#111#118+
-  #105#110#103#32#112#108#97#116#102#111#114#109#115#10#32#32#34#112#97#110+
-  #101#108#105#100#34#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32+
-  #110#117#108#108#59#10#32#32#34#115#105#108#101#110#116#34#32#116#121#112+
-  #101#32#98#111#111#108#32#100#101#102#97#117#108#116#32#116#114#117#101#59+
-  #10#32#32#34#115#111#117#110#100#34#32#116#121#112#101#32#115#116#114#105+
-  #110#103#32#100#101#102#97#117#108#116#32#34#34#59#10#125#10#10#101#110#117+
-  #109#32#84#114#105#103#103#101#114#83#99#111#114#101#84#101#97#109#32#123#10+
-  #32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#77#73#78#69+
-  #95#82#69#68#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82+
-  #69#95#84#69#65#77#95#77#73#78#69#95#66#76#85#69#44#32#47#47#32#49#10#32#32+
-  #84#82#73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#70#79#82#67#69#95+
-  #82#69#68#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69+
-  #95#84#69#65#77#95#70#79#82#67#69#95#66#76#85#69#44#32#47#47#32#51#10#125#10+
-  #10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71+
-  #69#82#95#83#69#67#82#69#84#32#123#10#125#10#10#84#114#105#103#103#101#114+
-  #68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69+
-  #32#123#10#32#32#34#97#99#116#105#118#97#116#101#95#111#110#99#101#34#32#116+
-  #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#48#32#100#101+
-  #102#97#117#108#116#32#102#97#108#115#101#32#119#114#105#116#101#100#101#102+
-  #97#117#108#116#59#10#32#32#34#97#110#105#109#97#116#101#95#111#110#99#101+
-  #34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#32+
-  #100#101#102#97#117#108#116#32#102#97#108#115#101#32#119#114#105#116#101#100+
-  #101#102#97#117#108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116+
-  #97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#79#85#78#68#32#123#10#32#32+
-  #34#115#111#117#110#100#95#110#97#109#101#34#32#116#121#112#101#32#99#104#97+
-  #114#91#54#52#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100+
-  #101#102#97#117#108#116#59#10#32#32#34#118#111#108#117#109#101#34#32#116#121+
-  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#52#32#100+
-  #101#102#97#117#108#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108+
-  #116#59#32#47#47#63#63#63#32#100#101#102#97#117#108#116#32#63#63#63#10#32#32+
-  #34#112#97#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#54#53#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34#108+
-  #111#99#97#108#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+
-  #101#116#32#54#54#32#100#101#102#97#117#108#116#32#116#114#117#101#59#32#47+
-  #47#63#63#63#32#100#101#102#97#117#108#116#32#63#63#63#10#32#32#34#112#108+
-  #97#121#95#99#111#117#110#116#34#32#116#121#112#101#32#117#98#121#116#101#32+
-  #111#102#102#115#101#116#32#54#55#32#100#101#102#97#117#108#116#32#49#59#10+
-  #32#32#34#115#111#117#110#100#95#115#119#105#116#99#104#34#32#116#121#112+
-  #101#32#98#111#111#108#32#111#102#102#115#101#116#32#54#56#32#100#101#102#97+
-  #117#108#116#32#102#97#108#115#101#59#32#47#47#63#63#63#32#100#101#102#97+
-  #117#108#116#32#63#63#63#10#125#10#10#84#114#105#103#103#101#114#68#97#116+
-  #97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#77#79#78#83#84+
-  #69#82#32#123#10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112+
-  #101#32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32+
-  #116#120#121#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
-  #34#116#121#112#101#34#32#97#108#105#97#115#32#115#112#97#119#110#77#111#110+
-  #115#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#56#32#101#110#117#109#32#77#111#110#115#116#101#114#32#100+
-  #101#102#97#117#108#116#32#77#79#78#83#84#69#82#95#73#77#80#32#119#114#105+
-  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#104#101#97#108#116#104#34+
-  #32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#49#50#32+
-  #119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#100#105#114+
-  #101#99#116#105#111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111+
-  #102#102#115#101#116#32#49#54#32#101#110#117#109#32#68#105#114#84#121#112+
-  #101#32#100#101#102#97#117#108#116#32#68#73#82#95#76#69#70#84#32#119#114#105+
-  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#97#99#116#105#118#101#34+
-  #32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#55#32+
-  #100#101#102#97#117#108#116#32#116#114#117#101#59#10#32#32#34#99#111#117#110+
-  #116#34#32#97#108#105#97#115#32#109#111#110#115#67#111#117#110#116#32#116+
-  #121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#50#48#32#100#101+
-  #102#97#117#108#116#32#49#32#119#114#105#116#101#100#101#102#97#117#108#116+
-  #59#10#32#32#34#101#102#102#101#99#116#34#32#116#121#112#101#32#117#98#121+
-  #116#101#32#111#102#102#115#101#116#32#50#52#32#101#110#117#109#32#69#102+
-  #102#101#99#116#65#99#116#105#111#110#32#100#101#102#97#117#108#116#32#69#70+
-  #70#69#67#84#95#78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108+
-  #116#59#10#32#32#34#109#97#120#34#32#116#121#112#101#32#117#115#104#111#114+
-  #116#32#111#102#102#115#101#116#32#50#54#32#100#101#102#97#117#108#116#32#49+
-  #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#100#101+
-  #108#97#121#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+
-  #115#101#116#32#50#56#32#100#101#102#97#117#108#116#32#49#48#48#48#32#119+
-  #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#98#101#104#97#118+
-  #105#111#117#114#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#51#48#32#101#110#117#109#32#77#111#110#115#116#101#114#66+
-  #101#104#97#118#105#111#117#114#32#100#101#102#97#117#108#116#32#66#72#95#78+
-  #79#82#77#65#76#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32+
-  #102#111#114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#32#123#10+
-  #32#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111+
-  #105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#116#120#121#32+
-  #119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112+
-  #101#34#32#97#108#105#97#115#32#115#112#97#119#110#73#116#101#109#84#121#112+
-  #101#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
-  #56#32#101#110#117#109#32#73#116#101#109#32#100#101#102#97#117#108#116#32#73+
-  #84#69#77#95#78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108#116+
-  #59#10#32#32#34#103#114#97#118#105#116#121#34#32#116#121#112#101#32#98#111+
-  #111#108#32#111#102#102#115#101#116#32#57#32#100#101#102#97#117#108#116#32+
-  #116#114#117#101#59#10#32#32#34#100#109#111#110#108#121#34#32#116#121#112+
-  #101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#48#32#100#101#102#97+
-  #117#108#116#32#102#97#108#115#101#59#10#32#32#34#99#111#117#110#116#34#32+
-  #97#108#105#97#115#32#105#116#101#109#67#111#117#110#116#32#116#121#112#101+
-  #32#105#110#116#32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117+
-  #108#116#32#49#59#10#32#32#34#101#102#102#101#99#116#34#32#116#121#112#101+
-  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#32#101#110#117+
-  #109#32#69#102#102#101#99#116#65#99#116#105#111#110#32#100#101#102#97#117+
-  #108#116#32#69#70#70#69#67#84#95#78#79#78#69#32#119#114#105#116#101#100#101+
-  #102#97#117#108#116#59#10#32#32#34#109#97#120#34#32#116#121#112#101#32#117+
-  #115#104#111#114#116#32#111#102#102#115#101#116#32#49#56#32#100#101#102#97+
-  #117#108#116#32#49#59#10#32#32#34#100#101#108#97#121#34#32#116#121#112#101+
-  #32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#48#32#100#101+
-  #102#97#117#108#116#32#49#48#48#48#32#119#114#105#116#101#100#101#102#97#117+
-  #108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111+
-  #114#32#84#82#73#71#71#69#82#95#77#85#83#73#67#32#123#10#32#32#34#110#97#109+
-  #101#34#32#97#108#105#97#115#32#109#117#115#105#99#78#97#109#101#32#116#121+
-  #112#101#32#99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48#32+
-  #119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#97#99#116#105+
-  #111#110#34#32#97#108#105#97#115#32#109#117#115#105#99#65#99#116#105#111#110+
-  #32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54+
-  #52#32#101#110#117#109#32#84#114#105#103#103#101#114#77#117#115#105#99#65#99+
-  #116#105#111#110#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125+
-  #10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71+
-  #71#69#82#95#80#85#83#72#32#123#10#32#32#34#97#110#103#108#101#34#32#116#121+
-  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#48#32#119+
-  #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#102#111#114#99+
-  #101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+
-  #32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#114+
-  #101#115#101#116#95#118#101#108#111#99#105#116#121#34#32#116#121#112#101#32+
-  #98#111#111#108#32#111#102#102#115#101#116#32#51#32#100#101#102#97#117#108+
-  #116#32#102#97#108#115#101#32#119#114#105#116#101#100#101#102#97#117#108#116+
-  #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+
-  #84#82#73#71#71#69#82#95#83#67#79#82#69#32#123#10#32#32#34#97#99#116#105#111+
-  #110#34#32#97#108#105#97#115#32#115#99#111#114#101#65#99#116#105#111#110#32+
-  #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#32+
-  #101#110#117#109#32#84#114#105#103#103#101#114#83#99#111#114#101#65#99#116+
-  #105#111#110#32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#83#67+
-  #79#82#69#95#65#67#84#73#79#78#95#65#68#68#32#119#114#105#116#101#100#101+
-  #102#97#117#108#116#59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97+
-  #115#32#115#99#111#114#101#67#111#117#110#116#32#116#121#112#101#32#117#98+
-  #121#116#101#32#111#102#102#115#101#116#32#49#32#100#101#102#97#117#108#116+
-  #32#49#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116+
-  #101#97#109#34#32#97#108#105#97#115#32#115#99#111#114#101#84#101#97#109#32+
-  #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32+
-  #101#110#117#109#32#84#114#105#103#103#101#114#83#99#111#114#101#84#101#97+
-  #109#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#99#111+
-  #110#115#111#108#101#34#32#97#108#105#97#115#32#115#99#111#114#101#67#111+
-  #110#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#51+
-  #32#100#101#102#97#117#108#116#32#102#97#108#115#101#32#119#114#105#116#101+
-  #100#101#102#97#117#108#116#59#10#32#32#34#109#101#115#115#97#103#101#34#32+
-  #97#108#105#97#115#32#115#99#111#114#101#77#115#103#32#116#121#112#101#32#98+
-  #111#111#108#32#111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116+
-  #32#116#114#117#101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #47#47#47#47#47#47#47#47#47#47#10#47#47#32#118#97#114#105#111#117#115#32#116+
+  #114#105#103#103#101#114#115#10#84#114#105#103#103#101#114#68#97#116#97#32+
+  #102#111#114#32#84#82#73#71#71#69#82#95#69#88#73#84#32#123#10#32#32#34#109+
+  #97#112#34#32#116#121#112#101#32#99#104#97#114#91#49#54#93#32#111#102#102+
+  #115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
   #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+
-  #73#71#71#69#82#95#77#69#83#83#65#71#69#32#123#10#32#32#34#107#105#110#100+
+  #73#71#71#69#82#95#84#69#76#69#80#79#82#84#32#123#10#32#32#34#116#97#114#103+
+  #101#116#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115#101+
+  #116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34+
+  #100#50#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101+
+  #116#32#56#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32+
+  #34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111+
+  #102#102#115#101#116#32#57#32#100#101#102#97#117#108#116#32#102#97#108#115+
+  #101#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#48#32#101#110#117+
+  #109#32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73#82+
+  #95#76#69#70#84#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32+
+  #102#111#114#32#40#84#82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32#84+
+  #82#73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#84#82#73#71#71#69#82+
+  #95#68#79#79#82#44#32#84#82#73#71#71#69#82#95#68#79#79#82#53#44#32#84#82#73+
+  #71#71#69#82#95#67#76#79#83#69#84#82#65#80#44#32#84#82#73#71#71#69#82#95#84+
+  #82#65#80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#84#82#73#71+
+  #71#69#82#95#76#73#70#84#68#79#87#78#44#32#84#82#73#71#71#69#82#95#76#73#70+
+  #84#41#32#123#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101+
+  #32#105#110#116#32#111#102#102#115#101#116#32#48#32#112#97#110#101#108#32+
+  #119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#105#108+
+  #101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101+
+  #116#32#52#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32+
+  #34#100#50#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+
+  #101#116#32#53#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#125+
+  #10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#40#84#82#73+
+  #71#71#69#82#95#80#82#69#83#83#44#32#84#82#73#71#71#69#82#95#79#78#44#32#84+
+  #82#73#71#71#69#82#95#79#70#70#44#32#84#82#73#71#71#69#82#95#79#78#79#70#70+
+  #41#32#123#10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101+
+  #32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#116+
+  #120#121#32#100#101#102#97#117#108#116#32#40#48#32#48#41#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#115#105#122#101#34#32#116#121+
+  #112#101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32+
+  #116#119#104#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#34+
+  #119#97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
+  #102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34+
+  #99#111#117#110#116#34#32#97#108#105#97#115#32#112#114#101#115#115#67#111+
+  #117#110#116#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+
+  #115#101#116#32#49#52#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34#109+
+  #111#110#115#116#101#114#105#100#34#32#116#121#112#101#32#105#110#116#32#111+
+  #102#102#115#101#116#32#49#54#32#109#111#110#115#116#101#114#32#97#115#32+
+  #109#111#110#115#116#101#114#105#100#32#100#101#102#97#117#108#116#32#110+
+  #117#108#108#59#10#32#32#34#101#120#116#95#114#97#110#100#111#109#34#32#116+
+  #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#50#48#32#100+
+  #101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32#47#47#32#116#104+
+  #105#115#32#111#110#101#32#105#115#32#102#111#114#32#109#111#118#105#110#103+
+  #32#112#108#97#116#102#111#114#109#115#10#32#32#34#112#97#110#101#108#105+
+  #100#34#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110#117#108+
+  #108#59#10#32#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111+
+  #111#108#32#100#101#102#97#117#108#116#32#116#114#117#101#59#10#32#32#34#115+
+  #111#117#110#100#34#32#116#121#112#101#32#115#116#114#105#110#103#32#100#101+
+  #102#97#117#108#116#32#34#34#59#10#125#10#10#101#110#117#109#32#84#114#105+
+  #103#103#101#114#83#99#111#114#101#84#101#97#109#32#123#10#32#32#84#82#73#71+
+  #71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#77#73#78#69#95#82#69#68#44#32+
+  #47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77+
+  #95#77#73#78#69#95#66#76#85#69#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69+
+  #82#95#83#67#79#82#69#95#84#69#65#77#95#70#79#82#67#69#95#82#69#68#44#32#47+
+  #47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95+
+  #70#79#82#67#69#95#66#76#85#69#44#32#47#47#32#51#10#125#10#10#84#114#105#103+
+  #103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#69#67+
+  #82#69#84#32#123#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
+  #111#114#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#32#123#10#32#32#34+
+  #97#99#116#105#118#97#116#101#95#111#110#99#101#34#32#116#121#112#101#32#98+
+  #111#111#108#32#111#102#102#115#101#116#32#48#32#100#101#102#97#117#108#116+
+  #32#102#97#108#115#101#32#119#114#105#116#101#100#101#102#97#117#108#116#59+
+  #10#32#32#34#97#110#105#109#97#116#101#95#111#110#99#101#34#32#116#121#112+
+  #101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#32#100#101#102#97+
+  #117#108#116#32#102#97#108#115#101#32#119#114#105#116#101#100#101#102#97#117+
+  #108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111+
+  #114#32#84#82#73#71#71#69#82#95#83#79#85#78#68#32#123#10#32#32#34#115#111+
+  #117#110#100#95#110#97#109#101#34#32#116#121#112#101#32#99#104#97#114#91#54+
+  #52#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#118#111#108#117#109#101#34#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97+
+  #117#108#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#32+
+  #47#47#63#63#63#32#100#101#102#97#117#108#116#32#63#63#63#10#32#32#34#112#97+
+  #110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+
+  #32#54#53#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34#108#111#99#97+
+  #108#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32+
+  #54#54#32#100#101#102#97#117#108#116#32#116#114#117#101#59#32#47#47#63#63#63+
+  #32#100#101#102#97#117#108#116#32#63#63#63#10#32#32#34#112#108#97#121#95#99+
+  #111#117#110#116#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
+  #115#101#116#32#54#55#32#100#101#102#97#117#108#116#32#49#59#10#32#32#34#115+
+  #111#117#110#100#95#115#119#105#116#99#104#34#32#116#121#112#101#32#98#111+
+  #111#108#32#111#102#102#115#101#116#32#54#56#32#100#101#102#97#117#108#116+
+  #32#102#97#108#115#101#59#32#47#47#63#63#63#32#100#101#102#97#117#108#116#32+
+  #63#63#63#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111+
+  #114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#77#79#78#83#84#69#82#32#123+
+  #10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112+
+  #111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#116#120#121+
+  #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#121+
+  #112#101#34#32#97#108#105#97#115#32#115#112#97#119#110#77#111#110#115#84#121+
+  #112#101#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+
+  #32#56#32#101#110#117#109#32#77#111#110#115#116#101#114#32#100#101#102#97+
+  #117#108#116#32#77#79#78#83#84#69#82#95#73#77#80#32#119#114#105#116#101#100+
+  #101#102#97#117#108#116#59#10#32#32#34#104#101#97#108#116#104#34#32#116#121+
+  #112#101#32#105#110#116#32#111#102#102#115#101#116#32#49#50#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#100#105#114#101#99#116+
+  #105#111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115+
+  #101#116#32#49#54#32#101#110#117#109#32#68#105#114#84#121#112#101#32#100#101+
+  #102#97#117#108#116#32#68#73#82#95#76#69#70#84#32#119#114#105#116#101#100+
+  #101#102#97#117#108#116#59#10#32#32#34#97#99#116#105#118#101#34#32#116#121+
+  #112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#55#32#100#101+
+  #102#97#117#108#116#32#116#114#117#101#59#10#32#32#34#99#111#117#110#116#34+
+  #32#97#108#105#97#115#32#109#111#110#115#67#111#117#110#116#32#116#121#112+
+  #101#32#105#110#116#32#111#102#102#115#101#116#32#50#48#32#100#101#102#97+
+  #117#108#116#32#49#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#101#102#102#101#99#116#34#32#116#121#112#101#32#117#98#121#116#101+
+  #32#111#102#102#115#101#116#32#50#52#32#101#110#117#109#32#69#102#102#101#99+
+  #116#65#99#116#105#111#110#32#100#101#102#97#117#108#116#32#69#70#70#69#67+
+  #84#95#78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#109#97#120#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111+
+  #102#102#115#101#116#32#50#54#32#100#101#102#97#117#108#116#32#49#32#119#114+
+  #105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#100#101#108#97#121#34+
+  #32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32+
+  #50#56#32#100#101#102#97#117#108#116#32#49#48#48#48#32#119#114#105#116#101+
+  #100#101#102#97#117#108#116#59#10#32#32#34#98#101#104#97#118#105#111#117#114+
   #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
-  #48#32#101#110#117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103+
-  #101#75#105#110#100#32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95+
-  #77#69#83#83#65#71#69#95#75#73#78#68#95#71#65#77#69#32#119#114#105#116#101+
-  #100#101#102#97#117#108#116#59#10#32#32#34#100#101#115#116#34#32#97#108#105+
-  #97#115#32#109#115#103#68#101#115#116#32#116#121#112#101#32#117#98#121#116+
-  #101#32#101#110#117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103+
-  #101#68#101#115#116#32#111#102#102#115#101#116#32#49#59#10#32#32#34#116#101+
-  #120#116#34#32#116#121#112#101#32#99#104#97#114#91#49#48#48#93#32#111#102+
+  #51#48#32#101#110#117#109#32#77#111#110#115#116#101#114#66#101#104#97#118+
+  #105#111#117#114#32#100#101#102#97#117#108#116#32#66#72#95#78#79#82#77#65#76+
+  #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+
+  #84#82#73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#32#123#10#32#32#34#112+
+  #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+
+  #111#102#102#115#101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108+
+  #105#97#115#32#115#112#97#119#110#73#116#101#109#84#121#112#101#32#116#121+
+  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110+
+  #117#109#32#73#116#101#109#32#100#101#102#97#117#108#116#32#73#84#69#77#95+
+  #78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
+  #34#103#114#97#118#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32+
+  #111#102#102#115#101#116#32#57#32#100#101#102#97#117#108#116#32#116#114#117+
+  #101#59#10#32#32#34#100#109#111#110#108#121#34#32#116#121#112#101#32#98#111+
+  #111#108#32#111#102#102#115#101#116#32#49#48#32#100#101#102#97#117#108#116+
+  #32#102#97#108#115#101#59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97+
+  #115#32#105#116#101#109#67#111#117#110#116#32#116#121#112#101#32#105#110#116+
+  #32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#49#59+
+  #10#32#32#34#101#102#102#101#99#116#34#32#116#121#112#101#32#117#98#121#116+
+  #101#32#111#102#102#115#101#116#32#49#54#32#101#110#117#109#32#69#102#102+
+  #101#99#116#65#99#116#105#111#110#32#100#101#102#97#117#108#116#32#69#70#70+
+  #69#67#84#95#78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#32#32#34#109#97#120#34#32#116#121#112#101#32#117#115#104#111#114#116+
+  #32#111#102#102#115#101#116#32#49#56#32#100#101#102#97#117#108#116#32#49#59+
+  #10#32#32#34#100#101#108#97#121#34#32#116#121#112#101#32#117#115#104#111#114+
+  #116#32#111#102#102#115#101#116#32#50#48#32#100#101#102#97#117#108#116#32#49+
+  #48#48#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10+
+  #84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69+
+  #82#95#77#85#83#73#67#32#123#10#32#32#34#110#97#109#101#34#32#97#108#105#97+
+  #115#32#109#117#115#105#99#78#97#109#101#32#116#121#112#101#32#99#104#97#114+
+  #91#54#52#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#97#99#116#105#111#110#34#32#97#108#105#97+
+  #115#32#109#117#115#105#99#65#99#116#105#111#110#32#116#121#112#101#32#117+
+  #98#121#116#101#32#111#102#102#115#101#116#32#54#52#32#101#110#117#109#32#84+
+  #114#105#103#103#101#114#77#117#115#105#99#65#99#116#105#111#110#32#119#114+
+  #105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84#114#105#103#103+
+  #101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#80#85#83#72+
+  #32#123#10#32#32#34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104+
+  #111#114#116#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#102#111#114#99#101#34#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#114#101#115#101#116#95#118+
+  #101#108#111#99#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32#111+
+  #102#102#115#101#116#32#51#32#100#101#102#97#117#108#116#32#102#97#108#115+
+  #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+
+  #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+
+  #95#83#67#79#82#69#32#123#10#32#32#34#97#99#116#105#111#110#34#32#97#108#105+
+  #97#115#32#115#99#111#114#101#65#99#116#105#111#110#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#101#110#117#109#32+
+  #84#114#105#103#103#101#114#83#99#111#114#101#65#99#116#105#111#110#32#100+
+  #101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65#67+
+  #84#73#79#78#95#65#68#68#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97#115#32#115#99#111#114+
+  #101#67#111#117#110#116#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
+  #102#115#101#116#32#49#32#100#101#102#97#117#108#116#32#49#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#101#97#109#34#32#97+
+  #108#105#97#115#32#115#99#111#114#101#84#101#97#109#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#101#110#117#109#32+
+  #84#114#105#103#103#101#114#83#99#111#114#101#84#101#97#109#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#99#111#110#115#111#108+
+  #101#34#32#97#108#105#97#115#32#115#99#111#114#101#67#111#110#32#116#121#112+
+  #101#32#98#111#111#108#32#111#102#102#115#101#116#32#51#32#100#101#102#97+
+  #117#108#116#32#102#97#108#115#101#32#119#114#105#116#101#100#101#102#97#117+
+  #108#116#59#10#32#32#34#109#101#115#115#97#103#101#34#32#97#108#105#97#115+
+  #32#115#99#111#114#101#77#115#103#32#116#121#112#101#32#98#111#111#108#32+
+  #111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116#32#116#114#117+
+  #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+
+  #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+
+  #95#77#69#83#83#65#71#69#32#123#10#32#32#34#107#105#110#100#34#32#116#121+
+  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#101#110+
+  #117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103#101#75#105#110+
+  #100#32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#77#69#83#83#65+
+  #71#69#95#75#73#78#68#95#71#65#77#69#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#100#101#115#116#34#32#97#108#105#97#115#32#109+
+  #115#103#68#101#115#116#32#116#121#112#101#32#117#98#121#116#101#32#101#110+
+  #117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103#101#68#101#115+
+  #116#32#111#102#102#115#101#116#32#49#59#10#32#32#34#116#101#120#116#34#32+
+  #116#121#112#101#32#99#104#97#114#91#49#48#48#93#32#111#102#102#115#101#116+
+  #32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116+
+  #105#109#101#34#32#97#108#105#97#115#32#109#115#103#84#105#109#101#32#116+
+  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#48+
+  #50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84#114+
+  #105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95+
+  #68#65#77#65#71#69#32#123#10#32#32#34#97#109#111#117#110#116#34#32#116#121+
+  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#48#32#119+
+  #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#105#110#116#101+
+  #114#118#97#108#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
   #102#115#101#116#32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59+
-  #10#32#32#34#116#105#109#101#34#32#97#108#105#97#115#32#109#115#103#84#105+
-  #109#101#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
-  #101#116#32#49#48#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84+
+  #82#73#71#71#69#82#95#72#69#65#76#84#72#32#123#10#32#32#34#97#109#111#117+
+  #110#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
+  #101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
+  #34#105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117#115#104#111+
+  #114#116#32#111#102#102#115#101#116#32#50#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#109#97#120#34#32#97#108#105#97#115#32#104#101+
+  #97#108#77#97#120#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+
+  #101#116#32#52#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
+  #34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111+
+  #102#102#115#101#116#32#53#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+
+  #84#82#73#71#71#69#82#95#83#72#79#84#32#123#10#32#32#34#112#111#115#105#116+
+  #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+
+  #101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105#97#115#32+
+  #115#104#111#116#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32+
+  #111#102#102#115#101#116#32#56#32#101#110#117#109#32#84#114#105#103#103#101+
+  #114#83#104#111#116#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#116#97#114#103#101#116#34#32#97#108#105#97#115#32#115#104#111#116+
+  #84#97#114#103#101#116#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
+  #102#115#101#116#32#57#32#101#110#117#109#32#84#114#105#103#103#101#114#83+
+  #104#111#116#84#97#114#103#101#116#32#119#114#105#116#101#100#101#102#97#117+
+  #108#116#59#10#32#32#34#113#117#105#101#116#34#32#116#121#112#101#32#110#101+
+  #103#98#111#111#108#32#111#102#102#115#101#116#32#49#48#59#32#47#47#32#110+
+  #101#103#98#111#111#108#33#10#32#32#34#97#105#109#34#32#116#121#112#101#32+
+  #98#121#116#101#32#111#102#102#115#101#116#32#49#49#32#101#110#117#109#32#84+
+  #114#105#103#103#101#114#83#104#111#116#65#105#109#32#100#101#102#97#117#108+
+  #116#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#68#69#70#65#85#76+
+  #84#59#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32#105+
+  #110#116#32#111#102#102#115#101#116#32#49#50#32#112#97#110#101#108#32#100+
+  #101#102#97#117#108#116#32#110#117#108#108#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#115#105#103#104#116#34#32#116#121#112#101+
+  #32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#54#59#10#32#32+
+  #34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104#111#114#116#32+
+  #111#102#102#115#101#116#32#49#56#59#10#32#32#34#119#97#105#116#34#32#116+
+  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#48+
+  #59#10#32#32#34#97#99#99#117#114#97#99#121#34#32#116#121#112#101#32#117#115+
+  #104#111#114#116#32#111#102#102#115#101#116#32#50#50#59#10#32#32#34#97#109+
+  #109#111#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
+  #101#116#32#50#52#59#10#32#32#34#114#101#108#111#97#100#34#32#116#121#112+
+  #101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#54#59#10+
   #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+
-  #73#71#71#69#82#95#68#65#77#65#71#69#32#123#10#32#32#34#97#109#111#117#110+
-  #116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101+
-  #116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34+
-  #105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117#115#104#111#114+
-  #116#32#111#102#102#115#101#116#32#50#32#119#114#105#116#101#100#101#102#97+
-  #117#108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
-  #111#114#32#84#82#73#71#71#69#82#95#72#69#65#76#84#72#32#123#10#32#32#34#97+
-  #109#111#117#110#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111+
-  #102#102#115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116+
-  #59#10#32#32#34#105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117+
-  #115#104#111#114#116#32#111#102#102#115#101#116#32#50#32#119#114#105#116#101+
-  #100#101#102#97#117#108#116#59#10#32#32#34#109#97#120#34#32#97#108#105#97+
-  #115#32#104#101#97#108#77#97#120#32#116#121#112#101#32#98#111#111#108#32#111+
-  #102#102#115#101#116#32#52#32#119#114#105#116#101#100#101#102#97#117#108#116+
-  #59#10#32#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111+
-  #108#32#111#102#102#115#101#116#32#53#32#119#114#105#116#101#100#101#102#97+
-  #117#108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
-  #111#114#32#84#82#73#71#71#69#82#95#83#72#79#84#32#123#10#32#32#34#112#111+
-  #115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111+
-  #102#102#115#101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116#101+
+  #73#71#71#69#82#95#69#70#70#69#67#84#32#123#10#32#32#34#99#111#117#110#116+
+  #34#32#97#108#105#97#115#32#70#88#67#111#117#110#116#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101+
   #100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105+
-  #97#115#32#115#104#111#116#84#121#112#101#32#116#121#112#101#32#117#98#121+
-  #116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109#32#84#114#105+
-  #103#103#101#114#83#104#111#116#32#119#114#105#116#101#100#101#102#97#117+
-  #108#116#59#10#32#32#34#116#97#114#103#101#116#34#32#97#108#105#97#115#32+
-  #115#104#111#116#84#97#114#103#101#116#32#116#121#112#101#32#117#98#121#116+
-  #101#32#111#102#102#115#101#116#32#57#32#101#110#117#109#32#84#114#105#103+
-  #103#101#114#83#104#111#116#84#97#114#103#101#116#32#119#114#105#116#101#100+
-  #101#102#97#117#108#116#59#10#32#32#34#113#117#105#101#116#34#32#116#121#112+
-  #101#32#110#101#103#98#111#111#108#32#111#102#102#115#101#116#32#49#48#59#32+
-  #47#47#32#110#101#103#98#111#111#108#33#10#32#32#34#97#105#109#34#32#116#121+
-  #112#101#32#98#121#116#101#32#111#102#102#115#101#116#32#49#49#32#101#110+
-  #117#109#32#84#114#105#103#103#101#114#83#104#111#116#65#105#109#32#100#101+
-  #102#97#117#108#116#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#68+
-  #69#70#65#85#76#84#59#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121+
-  #112#101#32#105#110#116#32#111#102#102#115#101#116#32#49#50#32#112#97#110+
-  #101#108#32#100#101#102#97#117#108#116#32#110#117#108#108#32#119#114#105#116+
-  #101#100#101#102#97#117#108#116#59#10#32#32#34#115#105#103#104#116#34#32#116+
-  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#54+
-  #59#10#32#32#34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104#111+
-  #114#116#32#111#102#102#115#101#116#32#49#56#59#10#32#32#34#119#97#105#116+
-  #34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116+
-  #32#50#48#59#10#32#32#34#97#99#99#117#114#97#99#121#34#32#116#121#112#101#32+
-  #117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#50#59#10#32#32#34+
-  #97#109#109#111#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
-  #102#115#101#116#32#50#52#59#10#32#32#34#114#101#108#111#97#100#34#32#116+
-  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#54+
-  #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+
-  #84#82#73#71#71#69#82#95#69#70#70#69#67#84#32#123#10#32#32#34#99#111#117#110+
-  #116#34#32#97#108#105#97#115#32#70#88#67#111#117#110#116#32#116#121#112#101+
-  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#119#114#105#116+
-  #101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108+
-  #105#97#115#32#70#88#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101+
-  #32#111#102#102#115#101#116#32#49#32#101#110#117#109#32#84#114#105#103#103+
-  #101#114#69#102#102#101#99#116#32#100#101#102#97#117#108#116#32#84#82#73#71+
-  #71#69#82#95#69#70#70#69#67#84#95#80#65#82#84#73#67#76#69#32#119#114#105#116+
+  #97#115#32#70#88#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32+
+  #111#102#102#115#101#116#32#49#32#101#110#117#109#32#84#114#105#103#103#101+
+  #114#69#102#102#101#99#116#32#100#101#102#97#117#108#116#32#84#82#73#71#71+
+  #69#82#95#69#70#70#69#67#84#95#80#65#82#84#73#67#76#69#32#119#114#105#116+
   #101#100#101#102#97#117#108#116#59#10#32#32#34#115#117#98#116#121#112#101#34+
   #32#97#108#105#97#115#32#70#88#83#117#98#84#121#112#101#32#116#121#112#101+
   #32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#101#110#117#109+
index 53bda03d96112b758ace00a676b9b235fc0cb59c..c992997d32ce55a4f21c73b764ad62dbbaa3cc95 100644 (file)
@@ -412,7 +412,7 @@ type
     property typeName: AnsiString read mTypeName; // enum/bitset type name
     property isEnum: Boolean read mIsEnum; // is this enum? `false` means "bitset"
     property has[const aname: AnsiString]: Boolean read hasByName;
-    property field[const aname: AnsiString]: Integer read getFieldByName;
+    property field[const aname: AnsiString]: Integer read getFieldByName; default;
 
     property tip: AnsiString read mTip;
     property help: AnsiString read mHelp;