1 | "use strict";
|
2 |
|
3 | const utilities = require("extra-utilities");
|
4 | const TileAttributes = require("./tile-attributes.js");
|
5 |
|
6 | class TileAttribute {
|
7 | constructor(name, staticAttributeName, attributeName, size, signed, offset) {
|
8 | let self = this;
|
9 |
|
10 | let _properties = { };
|
11 |
|
12 | Object.defineProperty(self, "name", {
|
13 | enumerable: true,
|
14 | get() {
|
15 | return _properties.name;
|
16 | },
|
17 | set(value) {
|
18 | _properties.name = utilities.trimString(value);
|
19 | }
|
20 | });
|
21 |
|
22 | Object.defineProperty(self, "staticAttributeName", {
|
23 | enumerable: true,
|
24 | get() {
|
25 | return _properties.staticAttributeName;
|
26 | },
|
27 | set(value) {
|
28 | _properties.staticAttributeName = utilities.trimString(value);
|
29 | }
|
30 | });
|
31 |
|
32 | Object.defineProperty(self, "attributeName", {
|
33 | enumerable: true,
|
34 | get() {
|
35 | return _properties.attributeName;
|
36 | },
|
37 | set(value) {
|
38 | _properties.attributeName = utilities.trimString(value);
|
39 | }
|
40 | });
|
41 |
|
42 | Object.defineProperty(self, "size", {
|
43 | enumerable: true,
|
44 | get() {
|
45 | return _properties.size;
|
46 | },
|
47 | set(value) {
|
48 | const newSize = utilities.parseInteger(value);
|
49 |
|
50 | if(isNaN(newSize)) {
|
51 | throw new Error("Invalid size value: " + value + ", expected valid integer.");
|
52 | }
|
53 |
|
54 | if(newSize < 1 || newSize > 32) {
|
55 | throw new Error("Size value: " + newSize + " is out of range, expected integer value between 1 and 32, inclusively.");
|
56 | }
|
57 |
|
58 | _properties.size = newSize;
|
59 | }
|
60 | });
|
61 |
|
62 | Object.defineProperty(self, "signed", {
|
63 | enumerable: true,
|
64 | get() {
|
65 | return _properties.signed;
|
66 | },
|
67 | set(value) {
|
68 | _properties.signed = utilities.parseBoolean(value, false);
|
69 | }
|
70 | });
|
71 |
|
72 | Object.defineProperty(self, "offset", {
|
73 | enumerable: true,
|
74 | get() {
|
75 | return _properties.offset;
|
76 | },
|
77 | set(value) {
|
78 | const newOffset = utilities.parseInteger(value);
|
79 |
|
80 | if(isNaN(newOffset)) {
|
81 | throw new Error("Invalid offset value: " + value + ", expected valid integer.");
|
82 | }
|
83 |
|
84 | if(newOffset < 0 || newOffset > 31) {
|
85 | throw new Error("Offset value: " + newOffset + " is out of range, expected integer value between 1 and 31, inclusively.");
|
86 | }
|
87 |
|
88 | _properties.offset = newOffset;
|
89 | }
|
90 | });
|
91 |
|
92 | Object.defineProperty(self, "min", {
|
93 | enumerable: true,
|
94 | get() {
|
95 | if(_properties.signed) {
|
96 | return -utilities.leftShift(1, _properties.size - 1);
|
97 | }
|
98 | else {
|
99 | return 0;
|
100 | }
|
101 | }
|
102 | });
|
103 |
|
104 | Object.defineProperty(self, "max", {
|
105 | enumerable: true,
|
106 | get() {
|
107 | if(_properties.signed) {
|
108 | return utilities.leftShift(1, _properties.size - 1) - 1;
|
109 | }
|
110 | else {
|
111 | return utilities.leftShift(1, _properties.size) - 1;
|
112 | }
|
113 | }
|
114 | });
|
115 |
|
116 | Object.defineProperty(self, "mask", {
|
117 | enumerable: true,
|
118 | get() {
|
119 | return utilities.leftShift(1, _properties.size) - 1;
|
120 | }
|
121 | });
|
122 |
|
123 | Object.defineProperty(self, "offsetMask", {
|
124 | enumerable: true,
|
125 | get() {
|
126 | return utilities.leftShift(utilities.leftShift(1, _properties.size) - 1, _properties.offset);
|
127 | }
|
128 | });
|
129 |
|
130 | Object.defineProperty(self, "signBitMask", {
|
131 | enumerable: true,
|
132 | get() {
|
133 | return utilities.leftShift(1, _properties.size - 1);
|
134 | }
|
135 | });
|
136 |
|
137 | self.name = name;
|
138 | self.staticAttributeName = staticAttributeName;
|
139 | self.attributeName = attributeName;
|
140 | self.size = size;
|
141 | self.signed = signed;
|
142 | self.offset = offset;
|
143 | }
|
144 |
|
145 | static getTileAttribute(value) {
|
146 | if(TileAttribute.isTileAttribute(value)) {
|
147 | for(let i = 0; i < TileAttribute.Attributes.length; i++) {
|
148 | if(TileAttribute.Attributes[i] === value) {
|
149 | return TileAttribute.Attributes[i];
|
150 | }
|
151 |
|
152 | return null;
|
153 | }
|
154 | }
|
155 | else if(typeof value === "string") {
|
156 | const formattedValue = utilities.trimString(value);
|
157 |
|
158 | for(let i = 0; i < TileAttribute.Attributes.length; i++) {
|
159 | const attribute = TileAttribute.Attributes[i];
|
160 |
|
161 | if(utilities.stringEqualsIgnoreCase(attribute.name, formattedValue) ||
|
162 | utilities.stringEqualsIgnoreCase(attribute.staticAttributeName, formattedValue) ||
|
163 | utilities.stringEqualsIgnoreCase(attribute.attributeName, formattedValue)) {
|
164 | return attribute;
|
165 | }
|
166 | }
|
167 |
|
168 | return null;
|
169 | }
|
170 |
|
171 | return null;
|
172 | }
|
173 |
|
174 | equals(value) {
|
175 | let self = this;
|
176 |
|
177 | return utilities.stringEqualsIgnoreCase(self.name, value.name) &&
|
178 | self.staticAttributeName === value.staticAttributeName &&
|
179 | self.attributeName === value.attributeName &&
|
180 | self.size === value.size &&
|
181 | self.signed === value.signed &&
|
182 | self.offset === value.offset;
|
183 | }
|
184 |
|
185 | toString() {
|
186 | let self = this;
|
187 |
|
188 | return self.name + " Tile Attribute (Size: " + self.size + ", Signed: " + self.signed + ", Offset: " + self.offset + ")";
|
189 | }
|
190 |
|
191 | static isTileAttribute(value) {
|
192 | return value instanceof TileAttribute;
|
193 | }
|
194 | }
|
195 |
|
196 | Object.defineProperty(TileAttribute, "XOffset", {
|
197 | value: new TileAttribute("X Offset", "XOffset", "xOffset", 8, true, 12),
|
198 | enumerable: true
|
199 | });
|
200 |
|
201 | Object.defineProperty(TileAttribute, "YOffset", {
|
202 | value: new TileAttribute("Y Offset", "YOffset", "yOffset", 8, true, 20),
|
203 | enumerable: true
|
204 | });
|
205 |
|
206 | Object.defineProperty(TileAttribute, "NumberOfFrames", {
|
207 | value: new TileAttribute("Number of Frames", "NumberOfFrames", "numberOfFrames", 6, false, 4),
|
208 | enumerable: true
|
209 | });
|
210 |
|
211 | Object.defineProperty(TileAttribute, "AnimationType", {
|
212 | value: new TileAttribute("Animation Type", "AnimationType", "animationType", 2, false, 10),
|
213 | enumerable: true
|
214 | });
|
215 |
|
216 | Object.defineProperty(TileAttribute, "AnimationSpeed", {
|
217 | value: new TileAttribute("Animation Speed", "AnimationSpeed", "animationSpeed", 4, false, 28),
|
218 | enumerable: true
|
219 | });
|
220 |
|
221 | Object.defineProperty(TileAttribute, "Extra", {
|
222 | value: new TileAttribute("Extra", "Extra", "extra", 4, false, 0),
|
223 | enumerable: true
|
224 | });
|
225 |
|
226 | Object.defineProperty(TileAttribute, "Attributes", {
|
227 | value: [
|
228 | TileAttribute.XOffset,
|
229 | TileAttribute.YOffset,
|
230 | TileAttribute.NumberOfFrames,
|
231 | TileAttribute.AnimationType,
|
232 | TileAttribute.AnimationSpeed,
|
233 | TileAttribute.Extra
|
234 | ],
|
235 | enumerable: true
|
236 | });
|
237 |
|
238 | module.exports = TileAttribute;
|