This repository has been archived by the owner on Aug 21, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathlogical_building_condition.pas
122 lines (94 loc) · 3.16 KB
/
logical_building_condition.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
{ This file is a part of Map editor for VCMI project
Copyright (C) 2016-2017 Alexander Shishkin alexvins@users.sourceforge.net
This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later
version.
This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
A copy of the GNU General Public License is available on the World Wide Web at
<http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing to the Free Software Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
unit logical_building_condition;
{$I compilersetup.inc}
interface
uses
Classes, SysUtils, fpjson, logical_expression, vcmi_json;
type
{ TBuildingConditionItem }
TBuildingConditionItem = class(TLogicalExpressionItem, ISerializeSpecial)
private
FBuilding: AnsiString;
public
constructor Create(ACollection: TCollection); override;
destructor Destroy; override;
public
//ISerializeSpecial
function Serialize(AHandler: TVCMIJSONStreamer): TJSONData;
procedure Deserialize(AHandler: TVCMIJSONDestreamer; ASrc: TJSONData);
public
property Building: AnsiString read FBuilding write FBuilding;
end;
TBuildingCondition = class(TLogicalExpression)
end;
implementation
uses
typinfo;
{ TBuildingConditionItem }
constructor TBuildingConditionItem.Create(ACollection: TCollection);
begin
inherited Create(ACollection);
end;
destructor TBuildingConditionItem.Destroy;
begin
inherited Destroy;
end;
function TBuildingConditionItem.Serialize(AHandler: TVCMIJSONStreamer): TJSONData;
var
item: TCollectionItem;
begin
Result := CreateJSONArray([]);
if SubExpressions.Count > 0 then
begin
TJSONArray(Result).Add(GetEnumName( TypeInfo(TLogicalOperator), Integer(LogicalOperator)));
for item in SubExpressions do
begin
TJSONArray(Result).Add((item as TBuildingConditionItem).Serialize(AHandler));
end;
end
else
begin
TJSONArray(Result).Add(Building);
end;
end;
procedure TBuildingConditionItem.Deserialize(AHandler: TVCMIJSONDestreamer; ASrc: TJSONData);
var
ASrcArray: TJSONArray;
instruction_name: TJSONStringType;
raw_instruction: Integer;
i: Integer;
SubExpression: TBuildingConditionItem;
begin
if ASrc.JSONType <> jtArray then
begin
raise Exception.Create('invalid format for building condition, array required');
end;
ASrcArray := TJSONArray(ASrc);
instruction_name := ASrcArray.Strings[0];
raw_instruction := GetEnumValue(TypeInfo(TLogicalOperator), instruction_name);
if raw_instruction >=0 then
begin
LogicalOperator:=TLogicalOperator(raw_instruction);
for i := 1 to ASrcArray.Count - 1 do
begin
SubExpression := TBuildingConditionItem(SubExpressions.Add);
SubExpression.Deserialize(AHandler, ASrcArray.Items[i]);
end;
end
else
begin
Building:=instruction_name;
end;
end;
end.