From: Ketmar Dark Date: Sat, 9 Sep 2017 10:56:33 +0000 (+0300) Subject: some more exoma code X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=commitdiff_plain;h=2e74c901511298e44d168948d85e9cff009fcb7e some more exoma code --- diff --git a/src/game/g_map.pas b/src/game/g_map.pas index c395dab..ac54bd5 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -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); diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 7161951..834220a 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -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; diff --git a/src/game/g_net.pas b/src/game/g_net.pas index 95f9673..78b8eea 100644 --- a/src/game/g_net.pas +++ b/src/game/g_net.pas @@ -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; diff --git a/src/game/g_player.pas b/src/game/g_player.pas index fb96ef9..9c20c90 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -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; diff --git a/src/game/g_triggers.pas b/src/game/g_triggers.pas index e49a4ef..2aa9cfa 100644 --- a/src/game/g_triggers.pas +++ b/src/game/g_triggers.pas @@ -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 diff --git a/src/game/g_weapons.pas b/src/game/g_weapons.pas index 034642c..5ba00a7 100644 --- a/src/game/g_weapons.pas +++ b/src/game/g_weapons.pas @@ -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 diff --git a/src/mapdef/mapdef.txt b/src/mapdef/mapdef.txt index afa8722..ab27f7f 100644 --- a/src/mapdef/mapdef.txt +++ b/src/mapdef/mapdef.txt @@ -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 diff --git a/src/shared/exoma.pas b/src/shared/exoma.pas index 8e8cc3f..8616b7b 100644 --- a/src/shared/exoma.pas +++ b/src/shared/exoma.pas @@ -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; diff --git a/src/shared/mapdef.inc b/src/shared/mapdef.inc index 1fe1c03..f65ba0d 100644 --- a/src/shared/mapdef.inc +++ b/src/shared/mapdef.inc @@ -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+ diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas index 53bda03..c992997 100644 --- a/src/shared/xdynrec.pas +++ b/src/shared/xdynrec.pas @@ -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;