UNPKG

5.87 kBJavaScriptView Raw
1"use strict";
2
3const utilities = require("extra-utilities");
4const TileAttributes = require("./tile-attributes.js");
5
6class 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
196Object.defineProperty(TileAttribute, "XOffset", {
197 value: new TileAttribute("X Offset", "XOffset", "xOffset", 8, true, 12),
198 enumerable: true
199});
200
201Object.defineProperty(TileAttribute, "YOffset", {
202 value: new TileAttribute("Y Offset", "YOffset", "yOffset", 8, true, 20),
203 enumerable: true
204});
205
206Object.defineProperty(TileAttribute, "NumberOfFrames", {
207 value: new TileAttribute("Number of Frames", "NumberOfFrames", "numberOfFrames", 6, false, 4),
208 enumerable: true
209});
210
211Object.defineProperty(TileAttribute, "AnimationType", {
212 value: new TileAttribute("Animation Type", "AnimationType", "animationType", 2, false, 10),
213 enumerable: true
214});
215
216Object.defineProperty(TileAttribute, "AnimationSpeed", {
217 value: new TileAttribute("Animation Speed", "AnimationSpeed", "animationSpeed", 4, false, 28),
218 enumerable: true
219});
220
221Object.defineProperty(TileAttribute, "Extra", {
222 value: new TileAttribute("Extra", "Extra", "extra", 4, false, 0),
223 enumerable: true
224});
225
226Object.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
238module.exports = TileAttribute;