74 LOGGER.info(
"Loading object definitions.");
76 ByteBuffer dat = archive.
getData(
"loc.dat");
77 ByteBuffer idx = archive.getData(
"loc.idx");
79 int count = idx.getShort() & 0xFFFF;
87 for (
int index = 0; index < count; index++) {
90 pos += idx.getShort() & 0xFFFF;
93 LOGGER.info(
"Loaded " + loaded +
" object definitions.");
103 private static void decode(
int id, ByteBuffer buffer) {
104 String name =
"null";
105 String desc =
"null";
108 boolean solid =
true;
109 boolean impenetrable =
true;
110 boolean hasActions =
false;
111 boolean interactive =
false;
112 boolean wall =
false;
113 boolean decoration =
false;
114 boolean removeClipping =
false;
115 boolean models =
false;
121 int opcode = buffer.get() & 0xff;
127 int len = buffer.get();
128 if (len > 0 && !models) {
129 for (
int idx = 0; idx < len; idx++) {
130 buffer.position(buffer.position() + Short.BYTES);
131 if (buffer.get() != 10 && idx == 0) {
136 buffer.position(buffer.position() + len * (Byte.BYTES + Short.BYTES));
138 }
else if (opcode == 2) {
139 name = ByteBufferUtil.readStringCp1252NullTerminated(buffer);
140 }
else if (opcode == 3) {
142 }
else if (opcode == 5) {
143 int len = buffer.get();
146 buffer.position(buffer.position() + len * Short.BYTES);
148 }
else if (opcode == 14) {
149 width = buffer.get();
150 }
else if (opcode == 15) {
151 length = buffer.get();
152 }
else if (opcode == 17) {
154 impenetrable =
false;
155 }
else if (opcode == 18) {
156 impenetrable =
false;
157 }
else if (opcode == 19) {
158 hasActions = (buffer.get() == 1);
159 }
else if (opcode == 21) {
161 }
else if (opcode == 22) {
163 }
else if (opcode == 23) {
165 }
else if (opcode == 24) {
167 }
else if (opcode == 27) {
169 }
else if (opcode == 28) {
171 }
else if (opcode == 29) {
173 }
else if (opcode == 39) {
175 }
else if (opcode >= 30 && opcode < 35) {
176 ByteBufferUtil.readStringCp1252NullTerminated(buffer);
178 }
else if (opcode == 40) {
179 int len = buffer.get();
180 for (
int i = 0; i < len; i++) {
184 }
else if (opcode == 41) {
185 int len = buffer.get();
186 for (
int i = 0; i < len; i++) {
190 }
else if (opcode == 61) {
192 }
else if (opcode == 62) {
194 }
else if (opcode == 64) {
196 }
else if (opcode == 65) {
198 }
else if (opcode == 66) {
200 }
else if (opcode == 67) {
202 }
else if (opcode == 68) {
204 }
else if (opcode == 69) {
205 walkingFlag = buffer.get();
206 }
else if (opcode == 70) {
208 }
else if (opcode == 71) {
210 }
else if (opcode == 72) {
212 }
else if (opcode == 73) {
214 }
else if (opcode == 74) {
215 removeClipping =
true;
216 }
else if (opcode == 75) {
218 }
else if (opcode == 77) {
222 int len = buffer.get() & 0xFF;
223 for (
int i = 0; i <= len; ++i) {
226 }
else if (opcode == 78) {
229 }
else if (opcode == 79) {
234 int len = buffer.get() & 0xFF;
235 for (
int i = 0; i < len; ++i) {
238 }
else if (opcode == 81) {
240 }
else if (opcode == 82) {
242 }
else if (opcode == 89) {
244 }
else if (opcode == 92) {
249 int len = buffer.get() & 0xFF;
250 for (
int i = 0; i <= len; ++i) {
253 }
else if (opcode == 249) {
254 int len = buffer.get();
255 for (
int i = 0; i < len; i++) {
256 boolean isString = buffer.get() == 1;
257 ByteBufferUtil.getMedium(buffer);
259 ByteBufferUtil.readStringCp1252NullTerminated(buffer);
265 throw new RuntimeException(
"unknown object opcode: " + opcode +
", last="+lastOpcode);
270 if (!name.equals(
"null")) {
271 hasActions = models && is10;
277 if (removeClipping) {
279 impenetrable =
false;
289 name =
"Donator Box";
293 GameObjectDefinition.addDefinition(
new GameObjectDefinition(
id, name, desc, width, length, distance, solid, impenetrable, hasActions, wall, decoration, walkingFlag));