1 :
2 :
3 : U16 _48ae_0281(U8 cls2, U8 cls3, U8 itemflags[64], U16 isCreature)
4 : {
5 :
6 : ENTER(142);
7 :
8 : ZERO_MEMORY(itemflags, 64);
9 :
10 : Bit8u bp008e[128];
11 : U8 *bp04 = QUERY_GDAT_TEXT(0x0f, cls2, cls3 +0x10, bp008e);
12 :
13 : if (*bp04 == 0)
14 :
15 : return 0;
16 :
17 : i16 bp0a = 0;
18 : i16 di = -1;
19 : U16 si = -1;
20 : U16 bp0c = 0;
21 : U8 bp05;
22 : do {
23 :
24 : bp05 = *(bp04++);
25 :
26 : if (bp05 >= '0' && bp05 <='9') {
27 :
28 : bp0a = bp0a * 10 +bp05 -'0';
29 : bp0c = 1;
30 :
31 : continue;
32 : }
33 :
34 : if (bp05 == '-') {
35 :
36 : di = bp0a;
37 : bp0a = 0;
38 :
39 : continue;
40 : }
41 :
42 : if (bp0c != 0) {
43 :
44 : if (di < 0)
45 :
46 : di = bp0a;
47 :
48 : while (di <= bp0a) {
49 :
50 : i16 bp08 = di +si;
51 :
52 : itemflags[bp08 >> 3] = itemflags[bp08 >> 3] | (1 << (bp08 & 7));
53 :
54 : di++;
55 :
56 : }
57 :
58 : bp0a = 0;
59 : di = -1;
60 : si = -1;
61 : bp0c = 0;
62 : }
63 :
64 : U16 bp0e = bp05;
65 :
66 : switch (bp0e) {
67 : case 'W':
68 :
69 :
70 : si = 0;
71 :
72 : break;
73 :
74 : case 'A':
75 :
76 : si = 0x0080;
77 :
78 : break;
79 :
80 : case 'J':
81 :
82 : si = 0x0100;
83 :
84 : break;
85 :
86 : case 'P':
87 :
88 : si = 0x0180;
89 :
90 : break;
91 :
92 : case 'C':
93 :
94 : si = (isCreature != 0) ? 0 : 0x01e0;
95 :
96 : break;
97 :
98 : case 'S':
99 :
100 : si = 0x01fc;
101 :
102 : break;
103 : }
104 :
105 : } while (bp05 != 0);
106 :
107 :
108 : return 1;
109 : }
110 :
111 :
112 : void ZERO_MEMORY(void *buff, Bit32u size);
113 :
114 :
115 : void _3a15_320c(sk5c20 *v0, Bit16u v1);
116 :
117 :
118 : Bit16u ADD_ITEM_CHARGE(Bit16u recordLink, __int16 delta);
119 :
120 :
121 : Bit16u IS_CONTAINER_MONEYBOX(ObjectID recordLink)
122 : {
123 :
124 : if (recordLink.DBType() == dbContainer) {
125 :
126 : if (GET_ADDRESS_OF_RECORD9(recordLink)->ContainerType() == 0) {
127 :
128 : if (QUERY_GDAT_ENTRY_DATA_INDEX(0x14, QUERY_CLS2_FROM_RECORD(recordLink), 0x0005, 0x0040) != (Bit16u)-1) {
129 :
130 : return 1;
131 : }
132 : }
133 : }
134 :
135 : return 0;
136 : }
137 :
138 :
139 : __int16 QUERY_GDAT_DBSPEC_WORD_VALUE(Bit16u recordLink, Bit8u cls4);
140 :
141 :
142 : __int32 QUERY_ITEM_VALUE(Bit16u recordLink, Bit8u cls4)
143 : {
144 :
145 : Bit16u si = recordLink;
146 : if (si == 0xffff) {
147 :
148 : return 0;
149 : }
150 :
151 : __int32 bp08 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, cls4);
152 : if (cls4 == 1) {
153 :
154 : __int32 bp0c = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x34);
155 :
156 : if (bp0c > 0) {
157 :
158 : bp08 += ADD_ITEM_CHARGE(si, 0) * bp0c;
159 : }
160 : }
161 :
162 : if (cls4 == 2) {
163 :
164 : __int32 bp0c = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x35);
165 :
166 : if (bp0c > 0) {
167 :
168 : bp08 += ADD_ITEM_CHARGE(si, 0) * bp0c;
169 : }
170 :
171 : if (((si & 0x3c00) >> 10) == dbPotion && bp08 > 1) {
172 :
173 : bp08 /= 2;
174 :
175 : bp08 += (GET_ADDRESS_OF_RECORD(si)->castToPotion()->PotionPower() * bp08) / 255L;
176 : }
177 : }
178 :
179 : if (((si & 0x3c00) >> 10) == dbContainer) {
180 :
181 : Container *bp04 = GET_ADDRESS_OF_RECORD(si)->castToContainer();
182 :
183 : if (bp04->ContainerType() == 0) {
184 :
185 : Bit16u di = IS_CONTAINER_MONEYBOX(si);
186 : Bit16u si = bp04->w2;
187 : __int32 bp0c = 0;
188 :
189 : for (; si != 0xfffe; si = GET_NEXT_RECORD_LINK(si)) {
190 :
191 : if (di != 0) {
192 :
193 : if (((si & 0x3c00) >> 10) == dbMiscellaneous_item) {
194 :
195 : bp0c += QUERY_GDAT_DBSPEC_WORD_VALUE(si, cls4) * (GET_ADDRESS_OF_RECORD(si)->castToMisc()->Charge() +1L);
196 : continue;
197 : }
198 : }
199 :
200 : bp08 += QUERY_ITEM_VALUE(si, cls4);
201 :
202 : }
203 :
204 : if (di != 0) {
205 :
206 : if (cls4 == 1) {
207 :
208 : bp08 += (bp0c +4L) / 5L;
209 : }
210 : else {
211 :
212 : bp08 += bp0c;
213 : }
214 : }
215 : }
216 : }
217 :
218 : return bp08;
219 : }
220 :
221 :
222 : __int32 QUERY_ITEM_WEIGHT(ObjectID recordLink)
223 : {
224 :
225 : return QUERY_ITEM_VALUE(recordLink, 1);
226 : }
227 :
228 :
229 : Bit16u IS_CONTAINER_CHEST(ObjectID recordLink)
230 : {
231 :
232 : ObjectID si = recordLink;
233 :
234 : if (true
235 : && si.DBType() == dbContainer
236 : && IS_CONTAINER_MONEYBOX(si) == 0
237 : && GET_ADDRESS_OF_RECORD9(si)->ContainerType() == 0
238 : ) {
239 :
240 : return 1;
241 : }
242 :
243 : return 0;
244 : }
245 :
246 :
247 : void CALC_PLAYER_WEIGHT(Bit16u player)
248 : {
249 :
250 :
251 :
252 : Bit16u di=0;
253 : __int16 si=0;
254 :
255 : for (; si < 30; si++) {
256 :
257 : di += QUERY_ITEM_WEIGHT(_4976_53b4[player].w193[si]);
258 :
259 : }
260 :
261 : if (_4976_5336 -1 == player && _4976_5354 < 2) {
262 :
263 : if (IS_CONTAINER_CHEST(_4976_3de6[player][_4976_5354]) != 0) {
264 :
265 : for (Bit16u si = 0; si < 8; si++) {
266 :
267 : di += QUERY_ITEM_WEIGHT(_4976_52c4[si]);
268 :
269 : }
270 : }
271 : }
272 :
273 : _4976_53b4[player].w253 = di;
274 :
275 : _4976_53b4[player].w50 |= 0x1000;
276 : }
277 :
278 :
279 : void _2066_2b6c()
280 : {
281 :
282 : sk5c20 *bp04 = _4976_5c20;
283 :
284 : ZERO_MEMORY(&_4976_57e4, 6);
285 :
286 : for (Bit16u di=0; di < _4976_5c14; bp04++, di++) {
287 :
288 : Bit16u si = bp04->b5;
289 : Bit16u bp08 = bp04->TimerType();
290 :
291 : switch (bp08) {
292 : case 0x0E:
293 : {
294 :
295 : _3a15_320c(bp04, 3);
296 : break;
297 : }
298 : case 0x46:
299 : {
300 :
301 : __int16 bp06 = bp04->w6;
302 :
303 : if (bp06 == 0 || bp06 < -15 || bp06 > 15)
304 : break;
305 :
306 : if (bp06 < 0) {
307 :
308 : _4976_57e4.w0 += _4976_3d34[-bp06];
309 : break;
310 : }
311 :
312 : _4976_57e4.w0 -= _4976_3d34[bp06] << 1;
313 : break;
314 : }
315 : case 0x47:
316 : {
317 :
318 : _4976_57e6++;
319 : break;
320 : }
321 : case 0x48:
322 : {
323 :
324 : for (__int16 bp06 = 0; bp06 < _4976_4c3c; bp06++) {
325 :
326 : if ((si & (1 << bp06)) == 0)
327 : continue;
328 :
329 : if (_4976_53b4[bp06].curHP() == 0)
330 : continue;
331 :
332 : _4976_53b4[bp06].w257 += bp04->w6;
333 :
334 : }
335 : break;
336 : }
337 : case 0x4B:
338 : {
339 :
340 : _4976_53b4[si].b31++;
341 : break;
342 : }
343 : }
344 :
345 : }
346 :
347 : for (Bit16u si=0; si < _4976_4c3c; si++) {
348 :
349 : CALC_PLAYER_WEIGHT(si);
350 :
351 : }
352 :
353 : return;
354 : }
355 :
356 :
357 : Bit16u _2066_1f37(ObjectID recordLink, Bit16u yy, Bit16u *zz)
358 : {
359 :
360 : ObjectID di = recordLink;
361 :
362 : Bit16u si = 0;
363 :
364 : while ((di = GET_NEXT_RECORD_LINK(di)) != di.FFFE) {
365 :
366 : if (di.DBType() == dbActuator) {
367 :
368 : Actuator *bp04 = GET_ADDRESS_OF_RECORD3(di);
369 :
370 : if (bp04->ActuatorType() == 0x27) {
371 :
372 : si = 1;
373 :
374 : if (bp04->ActuatorData() == 0) {
375 :
376 : bp04->ActuatorData(yy +1);
377 :
378 : (*zz)++;
379 : }
380 : }
381 : }
382 :
383 : }
384 :
385 : return si;
386 : }
387 :
388 :
389 : void APPEND_RECORD_TO(Bit16u recordLink_whatYouAppend, ObjectID *recordLink_newParent, __int16 xpos_newParent, __int16 ypos_newParent);
390 :
391 :
392 : Bit16u _2066_1ec9(Bit16u link1Dst, Bit16u link2Src)
393 : {
394 :
395 : Bit16u di = link1Dst;
396 : Bit16u si = link2Src;
397 :
398 : if (di == 0xfffe)
399 : return si;
400 :
401 : if (si == 0xfffe)
402 : return di;
403 :
404 : while (si != 0xfffe && ((si & 0x3c00) >> 10) < dbCreature) {
405 :
406 : Bit16u bp06 = di;
407 : di = si;
408 : si = GET_NEXT_RECORD_LINK(si);
409 : GenericRecord *bp04 = GET_ADDRESS_OF_RECORD(di);
410 :
411 : bp04->w0 = bp06;
412 :
413 : }
414 :
415 : APPEND_RECORD_TO(si, &GET_ADDRESS_OF_RECORD(di)->w0, -1, -1);
416 :
417 : return di;
418 : }
419 :
420 : Door *GET_ADDRESS_OF_RECORD0(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToDoor(); }
421 : Teleporter *GET_ADDRESS_OF_RECORD1(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToTeleporter(); }
422 : Text *GET_ADDRESS_OF_RECORD2(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToText(); }
423 : Actuator *GET_ADDRESS_OF_RECORD3(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToActuator(); }
424 : Creature *GET_ADDRESS_OF_RECORD4(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToCreature(); }
425 : Weapon *GET_ADDRESS_OF_RECORD5(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToWeapon(); }
426 : Cloth *GET_ADDRESS_OF_RECORD6(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToCloth(); }
427 : Scroll *GET_ADDRESS_OF_RECORD7(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToScroll(); }
428 : Potion *GET_ADDRESS_OF_RECORD8(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToPotion(); }
429 : Container *GET_ADDRESS_OF_RECORD9(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToContainer(); }
430 : Miscellaneous_item *GET_ADDRESS_OF_RECORDA(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToMisc(); }
431 : void *GET_ADDRESS_OF_RECORDB(ObjectID recordLink) { return NULL; }
432 : void *GET_ADDRESS_OF_RECORDC(ObjectID recordLink) { return NULL; }
433 : void *GET_ADDRESS_OF_RECORDD(ObjectID recordLink) { return NULL; }
434 : Missile *GET_ADDRESS_OF_RECORDE(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToMissile(); }
435 : Cloud *GET_ADDRESS_OF_RECORDF(ObjectID recordLink) { return GET_ADDRESS_OF_RECORD(recordLink)->castToCloud(); }
436 : GenericContainerRecord *GET_ADDRESS_OF_GENERIC_CONTAINER_RECORD(ObjectID record_link);
437 :
438 :
439 : ObjectID GET_NEXT_RECORD_LINK(ObjectID record_link);
440 :
441 : GenericRecord *GET_ADDRESS_OF_RECORD(ObjectID record_link);
442 :
443 : void CHANGE_CURRENT_MAP_TO(Bit16u new_map);
444 :
445 : ObjectID GET_TILE_RECORD_LINK(int x_pos, int y_pos);
446 :
447 : GenericRecord *GET_ADDRESS_OF_TILE_RECORD(Bit8u x_pos, Bit8u y_pos);
448 :
449 : Bit8u GET_TILE_VALUE(int x_pos, int y_pos);
450 :
451 : sk03a2 *QUERY_CREATURE_AI_SPEC_FROM_TYPE(Bit8u creatureType);
452 :
453 : Bit16u QUERY_GDAT_CREATURE_WORD_VALUE(Bit8u creatureType, Bit8u cls4);
454 :
455 :
456 : void _2066_1ea3(Bit16u xx, Bit16u yy, Bit16u zz)
457 : {
458 :
459 : _4976_4ca8[zz][xx][yy] |= 0x02;
460 : }
461 :
462 :
463 : sk1c9a02c3 *_1c9a_02c3(Creature *xx, sk03a2 *yy)
464 : {
465 :
466 : if ((yy->w0 & 0x0001) != 0) {
467 :
468 : return reinterpret_cast<sk1c9a02c3 *>(PTR_ADD(xx,+8));
469 : }
470 :
471 : return reinterpret_cast<sk1c9a02c3 *>(PTR_ADD(&_4976_4ebe[xx->b5_0_7()],+8));
472 : }
473 :
474 :
475 : Bit16u _4937_01a9(Bit16u xx, Bit16u *yy, sk5fde **zz)
476 : {
477 :
478 : Bit16u si = yy[0];
479 :
480 : if (si == 0xffff) {
481 :
482 : si = 0;
483 : }
484 : else {
485 :
486 : Bit16u bp08 = _4976_5fde[xx + si].w2 & 0x000f;
487 :
488 : if (bp08 == 0)
489 : goto _0253;
490 :
491 : si += bp08;
492 : }
493 :
494 : sk5fde *bp04 = &_4976_5fde[xx + si];
495 :
496 : while (true) {
497 :
498 : if ((bp04->w2 & 0x000f) == 0)
499 : goto _0253;
500 :
501 : Bit16u bp06 = (bp04->w2 >> 4) & 0x000f;
502 :
503 : if (bp06 == 0x000f)
504 : break;
505 :
506 : if ((RAND() & 0x000f) <= bp06)
507 : break;
508 :
509 : si++;
510 : bp04++;
511 : }
512 :
513 : Bit16u di;
514 : if (((bp04->b4 & 0x0007) + ((bp04->b4 >> 3) & 0x0003)) != 0) {
515 :
516 : di = 1;
517 : }
518 : else {
519 :
520 : _0253:
521 : di = 0;
522 : }
523 :
524 : *yy = si;
525 :
526 : *zz = &_4976_5fde[xx + *yy];
527 :
528 : return di;
529 : }
530 :
531 :
532 : void GRAPHICS_DATA_OPEN()
533 : {
534 :
535 :
536 : if ((_4976_5d10++) == 0) {
537 :
538 : _4976_5c94 = FILE_OPEN(FORMAT_SKSTR(_4976_19c8, NULL));
539 :
540 : if (_4976_5c94 < 0) {
541 :
542 : RAISE_SYSERR(41);
543 : }
544 :
545 : if (_4976_5c9c != 0 && _4976_5ca8 == 0) {
546 :
547 : _4976_5c96 = FILE_OPEN(FORMAT_SKSTR(_4976_19cc, NULL));
548 :
549 : if (_4976_5c96 < 0) {
550 :
551 : RAISE_SYSERR(31);
552 : }
553 : }
554 : }
555 :
556 : return;
557 : }
558 :
559 :
560 : Bit16u _0cee_0510(Bit16u curmap, Bit16u ww, __int16 *xx, __int16 *yy, Bit8u **ss)
561 : {
562 :
563 :
564 : Map_definitions *bp04 = &_4976_4dba[curmap];
565 :
566 : __int16 bp0a = (*xx += bp04->MapOffsetX());
567 :
568 : __int16 bp0c = (*yy += bp04->MapOffsetY());
569 :
570 : __int16 bp16 = bp04->Level() + ww;
571 :
572 : if (bp16 >= 0 && bp16 < 63) {
573 :
574 : Bit16u bp14 = _4976_4cb0[bp16];
575 :
576 : if (bp14 != 0xffff) {
577 :
578 : Bit8u *bp08;
579 : if (ss != NULL && *ss != NULL) {
580 :
581 : bp08 = *ss + 1;
582 : }
583 : else {
584 :
585 : bp08 = &_4976_4c72[bp14];
586 : }
587 :
588 : __int16 bp0e;
589 : for (; (bp0e = ((__int8)*bp08)) != -1; bp08++) {
590 :
591 : bp04 = &_4976_4dba[bp0e];
592 :
593 : __int16 di = bp04->MapOffsetX();
594 :
595 : if (di -1 <= bp0a) {
596 :
597 : if (di + bp04->RawColumn() + 1 >= bp0a) {
598 :
599 : __int16 si = bp04->MapOffsetY();
600 :
601 : if (si -1 <= bp0c) {
602 :
603 : if (si + bp04->RawRow() >= bp0c) {
604 :
605 : di = bp0a - di;
606 : si = bp0c - si;
607 :
608 : Bit16u bp12 = _4976_0c5a;
609 :
610 : CHANGE_CURRENT_MAP_TO(bp12);
611 :
612 : Bit16u bp10 = GET_TILE_VALUE(di, si) >> 5;
613 :
614 : if (bp10 == ttTeleporter) {
615 :
616 : if (GET_ADDRESS_OF_TILE_RECORD((Bit8u)di, (Bit8u)si)->castToTeleporter()->w4_0_0() != 0) {
617 :
618 : bp10 = 7;
619 : }
620 : }
621 :
622 : CHANGE_CURRENT_MAP_TO(bp12);
623 :
624 : if (bp10 != 7) {
625 :
626 : *xx = di;
627 : *yy = si;
628 :
629 : if (ss != NULL) {
630 :
631 : *ss = bp08;
632 : }
633 :
634 : return bp0e;
635 : }
636 : }
637 : }
638 : }
639 : }
640 :
641 : }
642 : }
643 : }
644 :
645 : if (ss != NULL) {
646 :
647 : *ss = 0;
648 : }
649 :
650 : return 0xffff;
651 : }
652 :
653 :
654 : SRECT *ALLOC_TEMP_RECT(__int16 x, __int16 y, __int16 cx, __int16 cy)
655 : {
656 :
657 :
658 : SRECT *bp04 = &_4976_4ba8[_4976_4ba6];
659 :
660 : _4976_4ba6++;
661 :
662 : if (_4976_4ba6 >= 4) {
663 :
664 : _4976_4ba6 = 0;
665 : }
666 :
667 : bp04->x = x;
668 : bp04->y = y;
669 : bp04->cx = cx;
670 : bp04->cy = cy;
671 :
672 : return bp04;
673 : }
674 :
675 :
676 : SRECT *ALLOC_TEMP_ORIGIN_RECT(Bit16u width, Bit16u height)
677 : {
678 :
679 :
680 : return ALLOC_TEMP_RECT(0, 0, width, height);
681 : }
682 :
683 :
684 : Bit16u _3e74_5420(Bit32u xx, Bit16u *yy)
685 : {
686 :
687 :
688 : Bit16u di = 0xffff;
689 : Bit16u cx = _4976_5c92;
690 :
691 : while (true) {
692 :
693 : Bit16u si = (di + cx) >> 1;
694 :
695 : if (si == di) {
696 :
697 : *yy = si +1;
698 :
699 : return 0;
700 : }
701 :
702 : Bit32u bp04 = _4976_5c86[_4976_5c7e[si]];
703 :
704 : if (xx < bp04) {
705 :
706 : cx = si;
707 :
708 : continue;
709 : }
710 :
711 : if (xx > bp04) {
712 :
713 : di = si;
714 :
715 : continue;
716 : }
717 :
718 : *yy = si;
719 :
720 : return 1;
721 : }
722 : }
723 :
724 :
725 : void _3e74_4701(Bit16u xx, Bit16u yy)
726 : {
727 :
728 :
729 : Bit16u di = xx;
730 :
731 : mement *bp04 = _4976_5ca4[di];
732 :
733 : if (bp04->w4 != 0xffff) {
734 :
735 : _3e74_48c9(di);
736 :
737 : return;
738 : }
739 :
740 : mement *bp0c;
741 : mement *bp10;
742 : if (yy != 0) {
743 :
744 : bp04->w4 = 0xffff;
745 : bp0c = _4976_5c8c;
746 :
747 :
748 :
749 : bp10 = _4976_5d70;
750 : }
751 : else {
752 :
753 : bp04->w4 = 1;
754 :
755 : bp0c = _4976_5d90;
756 :
757 : bp10 = _4976_5c8c;
758 : if (bp10 == NULL) {
759 :
760 : bp10 = _4976_5d70;
761 : }
762 : }
763 :
764 :
765 : if (bp0c != NULL) {
766 :
767 : goto _483a;
768 : }
769 :
770 : if (_4976_5d70 == NULL) {
771 :
772 : bp04->w6 = 0xffff;
773 : _4976_5d5e = bp04;
774 :
775 : goto _4822;
776 : }
777 :
778 : if (_4976_5d90 == NULL) {
779 :
780 : if (_4976_5c8c != NULL) {
781 :
782 : bp0c = bp10;
783 :
784 : goto _483a;
785 : }
786 : }
787 :
788 : bp10->w8 = di;
789 : Bit16u bp12 = bp10->w10;
790 :
791 : Bit16u si = _3e74_0c62(bp12);
792 :
793 : bp04->w6 = si;
794 :
795 : _4822:
796 : bp04->w8 = 0xffff;
797 : _4976_5d70 = bp04;
798 :
799 : goto _48a3;
800 :
801 :
802 : _483a:
803 : si = bp0c->w6;
804 : bp0c->w6 = di;
805 : bp04->w6 = si;
806 :
807 : if (si != 0xffff) {
808 :
809 : mement *bp08 = _4976_5ca4[si];
810 :
811 : bp04->w8 = bp08->w8;
812 :
813 : bp08->w8 = di;
814 :
815 : goto _48a3;
816 : }
817 :
818 : Bit16u bp14 = _3e74_0c62(bp0c->w10);
819 :
820 : bp04->w8 = bp14;
821 :
822 : _4976_5d5e = bp04;
823 :
824 :
825 : _48a3:
826 : if (yy != 0) {
827 :
828 : _4976_5c8c = bp04;
829 : }
830 : else {
831 :
832 : _4976_5d90 = bp04;
833 : }
834 :
835 : return;
836 : }
837 :
838 :
839 : mement *_3e74_48c9(Bit16u xx)
840 : {
841 :
842 :
843 : mement *bp04 = _4976_5ca4[xx];
844 :
845 : Bit16u si = bp04->w4;
846 :
847 : if (si == 0xffff || si == 0xfffe) {
848 :
849 : return bp04;
850 : }
851 :
852 : mement *bp0c = bp04;
853 :
854 : if (si == 0) {
855 :
856 : Bit16u di = bp04->w8;
857 :
858 : if (di == 0xffff) {
859 :
860 : _4976_5d90 = (bp04 != _4976_5c8c) ? bp04 : NULL;
861 :
862 : bp04->w4 = 1;
863 :
864 :
865 : return bp04;
866 : }
867 :
868 : mement *bp08 = _4976_5ca4[di];
869 :
870 : Bit16u bp0e = bp04->w6;
871 :
872 : if (bp0e == 0xffff) {
873 :
874 : _4976_5d5e = bp08;
875 : }
876 : else {
877 :
878 : bp04 = _4976_5ca4[bp0e];
879 :
880 : bp04->w8 = di;
881 : }
882 :
883 : bp08->w6 = bp0e;
884 :
885 : bp0c->w4 = 0xffff;
886 :
887 : _3e74_4701(xx, 0);
888 :
889 : return bp0c;
890 : }
891 : else {
892 :
893 : if (si < 0xfffd) {
894 :
895 : si++;
896 : }
897 :
898 : bp04->w4 = si;
899 :
900 : if (bp04 == _4976_5d70) {
901 :
902 :
903 : return bp04;
904 : }
905 :
906 : Bit16u di = bp04->w8;
907 :
908 : mement *bp08 = _4976_5ca4[di];
909 :
910 : if (bp08->w4 >= si) {
911 :
912 :
913 : return bp04;
914 : }
915 :
916 : Bit16u bp0e = bp04->w6;
917 :
918 : if (bp0e == 0xffff) {
919 :
920 : _4976_5d90 = bp08;
921 : _4976_5d5e = bp08;
922 :
923 : bp08->w6 = 0xffff;
924 : }
925 : else {
926 :
927 : if (bp04 == _4976_5d90) {
928 :
929 : _4976_5d90 = bp08;
930 : }
931 :
932 : bp04 = _4976_5ca4[bp0e];
933 :
934 : bp04->w8 = di;
935 : bp04->w6 = bp0e;
936 : }
937 :
938 : if (_4976_5d90 == _4976_5c8c) {
939 :
940 : _4976_5d90 = NULL;
941 : }
942 :
943 : while (true) {
944 :
945 : bp04 = bp08;
946 : bp0e = di;
947 : di = bp04->w8;
948 :
949 : if (di == 0xffff) {
950 :
951 : bp04->w8 = xx;
952 :
953 : bp0c->w6 = bp0e;
954 : bp0c->w8 = 0xffff;
955 :
956 : _4976_5d70 = bp0c;
957 : }
958 : else {
959 :
960 : bp08 = _4976_5ca4[di];
961 :
962 : if (bp08->w4 < si)
963 :
964 : continue;
965 :
966 : bp04->w8 = xx;
967 : bp0c->w6 = bp0e;
968 : bp0c->w8 = di;
969 : bp08->w6 = xx;
970 : }
971 :
972 : return bp0c;
973 : }
974 : }
975 : }
976 :
977 :
978 : void _3e74_5561(Bit16u xx)
979 : {
980 :
981 :
982 : __int16 si = xx;
983 :
984 : if (_4976_5d36 == -1 || _4976_5d36 > si) {
985 :
986 : _4976_5d36 = si;
987 : }
988 :
989 : Bit32u bp04 = _4976_5c86[si];
990 :
991 : Bit16u bp06;
992 : if (_3e74_5420(bp04, &bp06) != 0) {
993 :
994 : _4976_5c86[si] = NULL;
995 :
996 : _4976_5c92--;
997 :
998 : COPY_MEMORY(
999 : &_4976_5c7e[bp06 +1],
1000 : &_4976_5c7e[bp06],
1001 : (_4976_5c92 -bp06) << 1
1002 : );
1003 : }
1004 :
1005 : return;
1006 : }
1007 :
1008 :
1009 : void _3e74_4549(Bit16u xx)
1010 : {
1011 :
1012 :
1013 : mement *bp04 = _4976_5ca4[xx];
1014 :
1015 : if (bp04 != NULL) {
1016 :
1017 : if (bp04->w4 != 0xffff) {
1018 :
1019 : Bit16u di = bp04->w6;
1020 : Bit16u si = bp04->w8;
1021 : mement *bp08;
1022 :
1023 : if (di == 0xffff) {
1024 :
1025 : if (si == 0xffff) {
1026 :
1027 : _4976_5d90 = NULL;
1028 : _4976_5c8c = NULL;
1029 : _4976_5d70 = NULL;
1030 : _4976_5d5e = NULL;
1031 : }
1032 : else {
1033 :
1034 : bp08 = _4976_5ca4[si];
1035 :
1036 : _4976_5d5e = bp08;
1037 :
1038 : bp08->w6 = 0xffff;
1039 :
1040 : goto _4682;
1041 : }
1042 : }
1043 : else {
1044 :
1045 : bp08 = _4976_5ca4[di];
1046 :
1047 : bp08->w8 = si;
1048 :
1049 : if (si == 0xffff) {
1050 :
1051 : if (bp04 == _4976_5c8c) {
1052 :
1053 : _4976_5c8c = NULL;
1054 : }
1055 : else {
1056 :
1057 : if (bp04 == _4976_5d90) {
1058 :
1059 : _4976_5d90 = NULL;
1060 : }
1061 : }
1062 :
1063 : _4976_5d70 = bp08;
1064 : }
1065 : else {
1066 :
1067 : bp08 = _4976_5ca4[si];
1068 :
1069 : bp08->w6 = di;
1070 : }
1071 :
1072 : _4682:
1073 : if (bp04 == _4976_5d90) {
1074 :
1075 : if (bp08 == _4976_5c8c) {
1076 :
1077 : _4976_5d90 = NULL;
1078 : }
1079 : else {
1080 :
1081 : _4976_5d90 = bp08;
1082 : }
1083 : }
1084 : else {
1085 :
1086 : if (_4976_5c8c == bp04) {
1087 :
1088 : _4976_5c8c = bp08;
1089 : }
1090 : }
1091 : }
1092 : }
1093 : }
1094 :
1095 : bp04->w6 = 0xffff;
1096 : bp04->w8 = 0xffff;
1097 : bp04->w4 = 0xffff;
1098 :
1099 : return;
1100 : }
1101 :
1102 :
1103 : void _3e74_0c8c(mement *ref_)
1104 : {
1105 : mement *ref = reinterpret_cast<mement *>(ref_);
1106 :
1107 :
1108 :
1109 : mement *bp08 = ref->pv4();
1110 : mement *bp04 = ref->pv8();
1111 :
1112 : if (bp08 == NULL) {
1113 :
1114 : if (bp04 == NULL) {
1115 :
1116 : _4976_5d94 = NULL;
1117 : }
1118 : else {
1119 :
1120 : _4976_5d94 = bp04;
1121 :
1122 : bp04->pv4(NULL);
1123 : }
1124 : }
1125 : else {
1126 :
1127 : bp08->pv8(bp04);
1128 :
1129 : if (bp04 != NULL) {
1130 :
1131 : bp04->pv4(bp08);
1132 : }
1133 : }
1134 :
1135 : }
1136 :
1137 :
1138 : void _3e74_0d32(mement *ref_)
1139 : {
1140 : mement *ref = reinterpret_cast<mement *>(ref_);
1141 :
1142 :
1143 :
1144 : mement *bp04 = ref;
1145 :
1146 : if (_4976_5d94 == NULL) {
1147 :
1148 : _4976_5d94 = bp04;
1149 :
1150 : bp04->pv8(NULL);
1151 :
1152 : bp04->pv4(NULL);
1153 : }
1154 :
1155 : while (true) {
1156 :
1157 : mement *bp08 = _4976_5d94;
1158 :
1159 : __int32 bp0c = bp04->dw0;
1160 :
1161 : if (bp08->dw0 <= bp0c) {
1162 :
1163 : _4976_5d94 = bp04;
1164 :
1165 : bp04->pv4(NULL);
1166 :
1167 : bp04->pv8(bp08);
1168 :
1169 : bp08->pv4(bp04);
1170 :
1171 : continue;
1172 : }
1173 :
1174 : Bit16u si = 0;
1175 :
1176 : while ((bp04 = bp08->pv8()) != NULL) {
1177 :
1178 : if (bp04->dw0 <= bp0c) {
1179 :
1180 : bp04->pv4(ref);
1181 :
1182 : bp08->pv8(ref);
1183 :
1184 : ref->pv4(bp08);
1185 :
1186 : ref->pv8(bp04);
1187 :
1188 : si = 1;
1189 :
1190 : break;
1191 : }
1192 :
1193 : bp08 = bp04;
1194 :
1195 : }
1196 :
1197 : if (si == 0) {
1198 :
1199 : bp08->pv8(ref);
1200 :
1201 : ref->pv4(bp08);
1202 :
1203 : ref->pv8(NULL);
1204 : }
1205 :
1206 : return;
1207 : }
1208 : }
1209 :
1210 :
1211 : void _3e74_28de(Bit16u xx)
1212 : {
1213 :
1214 :
1215 : Bit16u di = xx;
1216 :
1217 : if (di == _4976_4809) {
1218 :
1219 : _4976_4809 = 0xffff;
1220 : }
1221 :
1222 : Bit16u si = _3e74_0c62(di);
1223 :
1224 : if (si == 0xffff)
1225 :
1226 : return;
1227 :
1228 : if ((di & 0x8000) == 0) {
1229 :
1230 : _4976_5c82[di] = 0xffff;
1231 : }
1232 : else {
1233 :
1234 : di &= 0x7fff;
1235 :
1236 : _4976_5d08[di] = 0xffff;
1237 :
1238 : if (_4976_5c90 == 0) {
1239 :
1240 : _3e74_5561(di);
1241 : }
1242 : }
1243 :
1244 : _3e74_4549(si);
1245 :
1246 : mement *bp04 = _4976_5ca4[si];
1247 :
1248 : _4976_5ca4[si] = NULL;
1249 :
1250 : _4976_5c9e--;
1251 :
1252 : if (si < _4976_5c78 || _4976_5c78 == 0xffff) {
1253 :
1254 : _4976_5c78 = si;
1255 : }
1256 :
1257 : __int32 bp0c = -bp04->dw0;
1258 :
1259 : _4976_5cf8 += bp0c;
1260 :
1261 : if (bp04 != _4976_5ce6) {
1262 :
1263 : __int32 bp10 = READ_I32(bp04,-4);
1264 :
1265 : if (bp10 > 0) {
1266 :
1267 : PTR_PADA(bp04,bp10);
1268 :
1269 : _3e74_0c8c(bp04);
1270 :
1271 : bp0c += bp10;
1272 : }
1273 : }
1274 :
1275 : if ((void *)PTR_ADD(bp04,bp0c) == (void *)_4976_5cb2) {
1276 :
1277 : _4976_5cb2 = bp04;
1278 : }
1279 :
1280 : mement *bp08 = reinterpret_cast<mement *>(PTR_ADD(bp04,bp0c));
1281 :
1282 : __int32 bp10 = bp08->dw0;
1283 :
1284 : if (bp10 > 0) {
1285 :
1286 : _3e74_0c8c(bp08);
1287 :
1288 : bp0c += bp10;
1289 : }
1290 :
1291 : bp04->dw0 = bp0c;
1292 :
1293 : WRITE_I32(bp04,bp0c -4,bp0c);
1294 :
1295 : _3e74_0d32(bp04);
1296 :
1297 : return;
1298 : }
1299 :
1300 :
1301 : Bit16u _3e74_4471()
1302 : {
1303 :
1304 :
1305 : __int16 si = _4976_5d36;
1306 :
1307 : if (si >= 0) {
1308 :
1309 : _4976_5c92++;
1310 :
1311 : if (_4976_5c92 >= _4976_5d24) {
1312 :
1313 : _4976_5d36 = -1;
1314 : }
1315 : else {
1316 : do {
1317 :
1318 : _4976_5d36++;
1319 :
1320 : } while (_4976_5d08[_4976_5d36] != 0xffff);
1321 : }
1322 : }
1323 :
1324 : return si;
1325 : }
1326 :
1327 :
1328 : Bit16u _3e74_54a1(Bit32u xx, Bit16u yy)
1329 : {
1330 :
1331 :
1332 : if (_4976_5c92 == _4976_5d24) {
1333 :
1334 : mement *bp04 = _4976_5d5e;
1335 :
1336 : for (; (bp04->w10 & 0x8000) == 0; ) {
1337 :
1338 : bp04 = _4976_5ca4[bp04->w8];
1339 : }
1340 :
1341 : _3e74_28de(bp04->w10);
1342 :
1343 : _3e74_5420(xx, &yy);
1344 : }
1345 :
1346 : Bit16u si = _3e74_4471();
1347 :
1348 : COPY_MEMORY(
1349 : &_4976_5c7e[yy],
1350 : &_4976_5c7e[yy +1],
1351 : (_4976_5c92 -yy -1) << 1
1352 : );
1353 :
1354 : _4976_5c7e[yy] = si;
1355 :
1356 : _4976_5c86[si] = xx;
1357 :
1358 : return si;
1359 : }
1360 :
1361 :
1362 : void _3e74_44ad()
1363 : {
1364 :
1365 : _4976_5d2a = _4976_4bec;
1366 : _4976_5d90 = 0;
1367 : mement *bp04 = _4976_5c8c;
1368 :
1369 : if (bp04 == NULL) {
1370 :
1371 : bp04 = _4976_5d70;
1372 :
1373 : if (bp04 == NULL)
1374 : return;
1375 : while (bp04->w4 != 0) {
1376 :
1377 : if (bp04->w4 <= 0xFFFD) {
1378 :
1379 : bp04->w4 = 0;
1380 : }
1381 :
1382 : Bit16u si = bp04->w6;
1383 : if (si == 0xffff)
1384 : return;
1385 :
1386 : bp04 = _4976_5ca4[si];
1387 :
1388 : }
1389 : }
1390 : }
1391 :
1392 :
1393 : Bit16u _3e74_0c62(Bit16u xx)
1394 : {
1395 :
1396 : Bit16u si = xx;
1397 : if ((si & 0x8000) != 0) {
1398 :
1399 : return _4976_5d08[si & 0x7fff];
1400 : }
1401 : else {
1402 :
1403 : return _4976_5c82[si];
1404 : }
1405 : }
1406 :
1407 :
1408 : Bit16u _3e74_55f9(Bit32u xx, Bit16u *yy)
1409 : {
1410 :
1411 :
1412 : if (_4976_4bec != _4976_5d2a) {
1413 :
1414 : _3e74_44ad();
1415 : }
1416 :
1417 : Bit16u bp02;
1418 : if (_3e74_5420(xx, &bp02) != 0) {
1419 :
1420 : *yy = _4976_5c7e[bp02];
1421 :
1422 : Bit16u si = _3e74_0c62(*yy | 0x8000);
1423 :
1424 : _3e74_48c9(si);
1425 :
1426 : return 1;
1427 : }
1428 :
1429 : *yy = _3e74_54a1(xx, bp02);
1430 :
1431 : return 0;
1432 : }
1433 :
1434 :
1435 : mement *_3e74_5817(Bit16u xx)
1436 : {
1437 :
1438 :
1439 : return _3e74_48c9(_3e74_0c62(xx | 0x8000));
1440 : }
1441 :
1442 :
1443 : void _3e74_583a(Bit16u xx)
1444 : {
1445 :
1446 :
1447 : Bit16u si = _3e74_0c62(xx | 0x8000);
1448 :
1449 : if (si != 0xffff) {
1450 :
1451 : _3e74_4549(si);
1452 : }
1453 :
1454 : return;
1455 : }
1456 :
1457 :
1458 : Bit16u _3e74_4416()
1459 : {
1460 :
1461 :
1462 : Bit16u si = _4976_5c78;
1463 :
1464 : if (si == 0xffff) {
1465 :
1466 : _3e74_28de(_4976_5d5e->w10);
1467 :
1468 : si = _4976_5c78;
1469 : }
1470 :
1471 : _4976_5c9e++;
1472 :
1473 : if (_4976_5c9e >= _4976_5d74) {
1474 :
1475 : _4976_5c78 = 0xffff;
1476 : }
1477 : else {
1478 : do {
1479 :
1480 : _4976_5c78++;
1481 :
1482 : } while (_4976_5ca4[_4976_5c78] != NULL);
1483 : }
1484 :
1485 : return si;
1486 : }
1487 :
1488 :
1489 : void _3e74_2ad9(__int32 xx)
1490 : {
1491 :
1492 :
1493 : for (; _4976_5cf8 < xx; ) {
1494 :
1495 : if (_4976_5d5e == NULL) {
1496 :
1497 : RAISE_SYSERR(43);
1498 : }
1499 :
1500 : if (_4976_4809 != 0xffff && _4976_4809 != _4976_4807) {
1501 :
1502 : _3e74_28de(_4976_4809);
1503 : }
1504 : else {
1505 :
1506 : _3e74_28de(_4976_5d5e->w10);
1507 : }
1508 :
1509 : }
1510 :
1511 : return;
1512 : }
1513 :
1514 :
1515 : void _3e74_2b30()
1516 : {
1517 :
1518 :
1519 : if (_4976_5d94 != NULL) {
1520 :
1521 : mement *bp04 = _4976_5ce6;
1522 : mement *bp08 = _4976_5ce6;
1523 :
1524 : do {
1525 :
1526 : __int32 bp0c = bp04->dw0;
1527 :
1528 : if (bp0c > 0) {
1529 :
1530 : PTR_PADA(bp04, bp0c);
1531 : }
1532 : else {
1533 :
1534 : bp0c = -bp0c;
1535 :
1536 : if (bp08 != bp04) {
1537 :
1538 : Bit16u di = bp04->w10;
1539 :
1540 : Bit16u si = _3e74_0c62(di);
1541 :
1542 : _4976_5ca4[si] = bp08;
1543 :
1544 : COPY_MEMORY(bp04, bp08, bp0c);
1545 :
1546 : if (_4976_5d5e == bp04) {
1547 :
1548 : _4976_5d5e = bp08;
1549 : }
1550 :
1551 : if (_4976_5d70 == bp04) {
1552 :
1553 : _4976_5d70 = bp08;
1554 : }
1555 :
1556 : if (_4976_5d90 == bp04) {
1557 :
1558 : _4976_5d90 = bp08;
1559 : }
1560 :
1561 : else if (_4976_5c8c == bp04) {
1562 :
1563 : _4976_5c8c = bp08;
1564 : }
1565 : }
1566 :
1567 : PTR_PADA(bp04, bp0c);
1568 :
1569 : PTR_PADA(bp08, bp0c);
1570 : }
1571 :
1572 : } while (bp04 != _4976_5cb2);
1573 :
1574 :
1575 : _4976_5cb2 = bp08;
1576 :
1577 : _4976_5d94 = NULL;
1578 : }
1579 :
1580 : return;
1581 : }
1582 :
1583 :
1584 : mement *_3e74_2cc9(__int32 xx)
1585 : {
1586 :
1587 :
1588 : _3e74_2ad9(xx);
1589 :
1590 : mement *bp04;
1591 : if (PTR_PSBP(_4976_5ce2,_4976_5cb2) >= xx) {
1592 :
1593 : _2cfb:
1594 : bp04 = _4976_5cb2;
1595 :
1596 : PTR_PADA(_4976_5cb2,xx);
1597 : }
1598 :
1599 : else if (_4976_5d94->dw0 < xx) {
1600 :
1601 : _3e74_2b30();
1602 :
1603 : goto _2cfb;
1604 : }
1605 : else {
1606 :
1607 : bp04 = _4976_5d94;
1608 :
1609 : Bit16u si = 0;
1610 : mement *bp08;
1611 :
1612 : do {
1613 :
1614 : if (bp04->dw0 == xx) {
1615 :
1616 : _2d5b:
1617 : si = 1;
1618 :
1619 : continue;
1620 : }
1621 :
1622 : if (bp04->dw0 >= xx) {
1623 :
1624 : bp08 = bp04->pv8();
1625 :
1626 : if (bp08 != NULL)
1627 :
1628 : goto _2da5;
1629 : }
1630 :
1631 : bp04 = _4976_5d94;
1632 :
1633 : goto _2d5b;
1634 :
1635 : _2da5:
1636 : bp04 = bp08;
1637 :
1638 : } while (si == 0);
1639 :
1640 :
1641 : _3e74_0c8c(reinterpret_cast<mement *>(bp04));
1642 :
1643 : __int32 bp0c = bp04->dw0 - xx;
1644 :
1645 : if (bp0c >= 30) {
1646 :
1647 : bp08 = reinterpret_cast<mement *>(PTR_ADD(bp04,xx));
1648 :
1649 : WRITE_I32(bp08,bp0c -4,bp0c);
1650 :
1651 : bp08->dw0 = bp0c;
1652 :
1653 : _3e74_0d32(reinterpret_cast<mement *>(bp08));
1654 : }
1655 : else {
1656 :
1657 : xx = bp04->dw0;
1658 : }
1659 : }
1660 :
1661 : _4976_5cf8 -= xx;
1662 :
1663 : bp04->dw0 = -xx;
1664 :
1665 : WRITE_I32(bp04,xx -4,-xx);
1666 :
1667 : reinterpret_cast<mement *>(bp04)->w8 = 0xffff;
1668 : reinterpret_cast<mement *>(bp04)->w6 = 0xffff;
1669 : reinterpret_cast<mement *>(bp04)->w4 = 0xffff;
1670 :
1671 : return reinterpret_cast<mement *>(bp04);
1672 : }
1673 :
1674 :
1675 : Bit8u *_3e74_5708(Bit16u xx, Bit32u yy)
1676 : {
1677 :
1678 :
1679 : yy += 22;
1680 :
1681 : if ((yy & 1) != 0) {
1682 :
1683 : yy++;
1684 : }
1685 :
1686 : mement *bp04 = _3e74_2cc9(yy);
1687 :
1688 : Bit16u si = _3e74_4416();
1689 :
1690 : _4976_5d08[xx] = si;
1691 :
1692 : _4976_5ca4[si] = bp04;
1693 :
1694 : bp04->w10 = xx | 0x8000;
1695 :
1696 : return reinterpret_cast<Bit8u *>(bp04);
1697 : }
1698 :
1699 :
1700 : void _3e74_585a(Bit16u xx, Bit16u yy)
1701 : {
1702 :
1703 :
1704 : Bit16u si = _3e74_0c62(xx | 0x8000);
1705 :
1706 : if (si == 0xffff) {
1707 :
1708 : return _3e74_5561(xx);
1709 : }
1710 : else {
1711 :
1712 : return _3e74_4701(si, yy);
1713 : }
1714 : }
1715 :
1716 :
1717 : void _44c8_1d26(Bit8u *xx, Bit16u yy);
1718 :
1719 :
1720 : void _443c_085a()
1721 : {
1722 :
1723 :
1724 : _4976_4860++;
1725 :
1726 : _01b0_0adb() CALL_IBMIO;
1727 : }
1728 :
1729 :
1730 : void _01b0_0adb()
1731 : {
1732 :
1733 : LOADDS(0x3083);
1734 :
1735 : if (_04bf_17a2++ == 0) {
1736 :
1737 : _01b0_07f8();
1738 : _01b0_073d();
1739 : _01b0_080b();
1740 : }
1741 :
1742 : return;
1743 : }
1744 :
1745 :
1746 : void _01b0_0b01(__int16 xx, Bit8u *yy, Bit8u zz, Bit8u ss, Bit16u tt, Bit16u uu, Bit16u vv,
1747 : Bit8u *ww, Bit16u pp)
1748 : {
1749 :
1750 :
1751 : LOADDS(0x3083);
1752 :
1753 :
1754 : if (xx >= 0 && xx < 4) {
1755 :
1756 : _01b0_07f8();
1757 :
1758 : Bit8u *bp08 = &_04bf_0e80[582 * xx];
1759 :
1760 : if (vv == 4) {
1761 :
1762 : Bit16u di = 0;
1763 :
1764 : Bit16u bp0a = (tt +1) & 0xfffe;
1765 : Bit16u bp04 = 0;
1766 :
1767 :
1768 : for (; bp04 < uu; bp04++) {
1769 :
1770 : Bit16u bp02 = 0;
1771 :
1772 : for (; bp02 < tt; di++, bp02++) {
1773 :
1774 : Bit16u si = bp0a * bp04 + bp02;
1775 :
1776 : if ((si & 0x0001) != 0) {
1777 :
1778 : bp08[di +6] = ww[yy[si >> 1] & 15];
1779 : }
1780 : else {
1781 :
1782 : bp08[di +6] = ww[yy[si >> 1] >> 4];
1783 : }
1784 :
1785 : }
1786 :
1787 : }
1788 : }
1789 :
1790 : Bit16u si = 0;
1791 :
1792 : for (; tt * uu > si; si++) {
1793 :
1794 : bp08[si +6] = yy[__int16(si)];
1795 :
1796 : }
1797 :
1798 :
1799 : bp08[4] = bp08[26];
1800 :
1801 : bp08[0] = zz;
1802 : bp08[1] = ss;
1803 : bp08[2] = Bit8u(tt);
1804 : bp08[3] = Bit8u(uu);
1805 :
1806 : _01b0_080b();
1807 : }
1808 :
1809 :
1810 : return;
1811 : }
1812 :
1813 :
1814 : void _01b0_0c70(Bit16u xx)
1815 : {
1816 :
1817 :
1818 : LOADDS(0x3083);
1819 :
1820 : _01b0_07f8();
1821 :
1822 : if (_04bf_17a8 != 0) {
1823 :
1824 : _01b0_073d();
1825 :
1826 : _04bf_1938 = xx;
1827 :
1828 : _01b0_05ae();
1829 : }
1830 : else {
1831 :
1832 : _04bf_1938 = xx;
1833 : }
1834 :
1835 : _01b0_080b();
1836 :
1837 : return;
1838 : }
1839 :
1840 :
1841 : void _01b0_0ca4(Bit16u *xx, Bit16u yy)
1842 : {
1843 :
1844 :
1845 : LOADDS(0x3083);
1846 :
1847 :
1848 : _01b0_07f8();
1849 :
1850 : for (Bit16u si=0; si < 4; si++) {
1851 :
1852 : ((Bit16u *)&_04bf_1852)[si] = xx[si];
1853 :
1854 : }
1855 :
1856 : _04bf_17e8 = yy;
1857 : _04bf_1850 = 1;
1858 :
1859 : _01b0_080b();
1860 :
1861 : return;
1862 : }
1863 :
1864 :
1865 : void _443c_040e()
1866 : {
1867 :
1868 :
1869 : _443c_085a();
1870 :
1871 : _4976_5db6 = 1;
1872 :
1873 : _01b0_0ca4(_4976_4954, 32);
1874 :
1875 : _443c_086b();
1876 :
1877 : return;
1878 : }
1879 :
1880 :
1881 : Bit8u *_3e74_57b5(Bit16u zz, Bit16u xx, Bit16u yy, Bit16u ww)
1882 : {
1883 :
1884 :
1885 : Bit16u si = xx;
1886 :
1887 : Bit8u *bp04 = _3e74_5708(
1888 : zz,
1889 : Bit32u((ww == 4) ? (((si +1) & 0xfffe) >> 1) : (si & 0xffff)) * yy
1890 : );
1891 :
1892 : WRITE_UI16(bp04,-4,si);
1893 :
1894 : WRITE_UI16(bp04,-2,yy);
1895 :
1896 : WRITE_UI16(bp04,-6,ww);
1897 :
1898 : return bp04;
1899 : }
1900 :
1901 :
1902 : Bit32u _3e74_53ea()
1903 : {
1904 :
1905 : Bit32u bp04;
1906 : Bit16u bp06;
1907 : do {
1908 :
1909 : bp04 = 0xffff0000 | (_4976_484b++);
1910 :
1911 : } while (_3e74_5420(bp04, &bp06) != 0);
1912 :
1913 : return bp04;
1914 : }
1915 :
1916 :
1917 : Bit16u _3e74_5888()
1918 : {
1919 :
1920 :
1921 : Bit16u bp02;
1922 : _3e74_55f9(_3e74_53ea(), &bp02);
1923 :
1924 : return bp02;
1925 : }
1926 :
1927 :
1928 : void _0b36_0d67(sk3f6c *ref, SRECT *rc)
1929 : {
1930 :
1931 :
1932 : if (rc == NULL)
1933 :
1934 : return;
1935 :
1936 : __int16 si = 0;
1937 : for (; ref->w10 > si; si++) {
1938 :
1939 : if (ref->w12[si].x <= rc->x) {
1940 :
1941 : if (ref->w12[si].x + ref->w12[si].cx -1 >= rc->x + rc->cx -1) {
1942 :
1943 : if (ref->w12[si].y <= rc->y) {
1944 :
1945 : if (ref->w12[si].y + ref->w12[si].cy -1 >= rc->y + rc->cy -1) {
1946 :
1947 :
1948 : return;
1949 : }
1950 : }
1951 : }
1952 : }
1953 :
1954 : if (ref->w12[si].x >= rc->x) {
1955 :
1956 : if (ref->w12[si].x + ref->w12[si].cx -1 <= rc->x + rc->cx -1) {
1957 :
1958 : if (ref->w12[si].y >= rc->y) {
1959 :
1960 : if (ref->w12[si].y + ref->w12[si].cy -1 <= rc->y + rc->cy -1) {
1961 :
1962 : goto _0ec7;
1963 : }
1964 : }
1965 : }
1966 : }
1967 :
1968 : }
1969 :
1970 : if (si >= 5) {
1971 :
1972 : _0b36_0cbe(ref, 0);
1973 : }
1974 :
1975 : si = ref->w10++;
1976 :
1977 : _0ec7:
1978 : COPY_MEMORY(rc, &ref->w12[si], 8);
1979 :
1980 : rc = &ref->w12[si];
1981 :
1982 : si = rc->x - ref->w2.x;
1983 :
1984 : if (si < 0) {
1985 :
1986 : if ((rc->cx += si) <= 0) {
1987 :
1988 : ref->w10--;
1989 :
1990 : return;
1991 : }
1992 :
1993 : rc->x -= si;
1994 : }
1995 :
1996 : si = rc->y - ref->w2.y;
1997 :
1998 : if (si < 0) {
1999 :
2000 : if ((rc->cy += si) <= 0) {
2001 :
2002 :
2003 : ref->w10--;
2004 :
2005 : return;
2006 : }
2007 :
2008 : rc->y -= si;
2009 : }
2010 :
2011 : si = ref->w2.x + ref->w2.cx -1 -(rc->x + rc->cx -1);
2012 :
2013 : if (si < 0) {
2014 :
2015 : rc->cx += si;
2016 : }
2017 :
2018 : si = ref->w2.y + ref->w2.cy -1 -(rc->y + rc->cy -1);
2019 :
2020 : if (si < 0) {
2021 :
2022 : rc->cy += si;
2023 : }
2024 :
2025 : return;
2026 : }
2027 :
2028 :
2029 : sk3f6c *_0b36_0c52(sk3f6c *ref, Bit16u rectno, Bit16u ww)
2030 : {
2031 :
2032 :
2033 : if (rectno != 0xffff) {
2034 :
2035 : QUERY_EXPANDED_RECT(rectno, &ref->w2);
2036 : }
2037 :
2038 : _3e74_57b5(ref->w0 = _3e74_5888(), ref->w2.cx, ref->w2.cy, 8);
2039 :
2040 : ref->w10 = 0;
2041 :
2042 : if (ww != 0) {
2043 :
2044 : _0b36_0d67(ref, &ref->w2);
2045 : }
2046 :
2047 : return ref;
2048 : }
2049 :
2050 :
2051 : SRECT *_0b36_0fab(const sk3f6c *ref, const SRECT *rc1, SRECT *rc2)
2052 : {
2053 :
2054 :
2055 : rc2->x = rc1->x - ref->w2.x;
2056 :
2057 : rc2->y = rc1->y - ref->w2.y;
2058 :
2059 : rc2->cx = rc1->cx;
2060 :
2061 : rc2->cy = rc1->cy;
2062 :
2063 : return rc2;
2064 : }
2065 :
2066 :
2067 : void _0b36_0ffe(sk3f6c *ref, SRECT *rc, Bit8u fill)
2068 : {
2069 :
2070 : ENTER(8);
2071 :
2072 : if (rc != NULL) {
2073 :
2074 : SRECT bp08;
2075 : FIRE_FILL_RECT_ANY(
2076 : reinterpret_cast<Bit8u *>(_3e74_5817(ref->w0)),
2077 : _0b36_0fab(ref, rc, &bp08),
2078 : fill,
2079 : ref->w2.cx,
2080 : 8
2081 : );
2082 :
2083 : _0b36_0d67(ref, rc);
2084 : }
2085 :
2086 : return;
2087 : }
2088 :
2089 :
2090 : void _29ee_00a3(Bit16u xx)
2091 : {
2092 :
2093 :
2094 : if (_4976_3f6c.w0 == 0xffff) {
2095 :
2096 : _0b36_0c52(&_4976_3f6c, 11, xx);
2097 :
2098 : if (xx != 0) {
2099 :
2100 : _0b36_0ffe(&_4976_3f6c, &_4976_3f6c.w2, _4976_4bda[0]);
2101 : }
2102 : }
2103 :
2104 : return;
2105 : }
2106 :
2107 :
2108 : Bit16u _2759_0e30(Bit16u player, __int16 hand, ObjectID rl);
2109 :
2110 :
2111 : __int16 BETWEEN_VALUE(__int16 minv, __int16 newv, __int16 maxv)
2112 : {
2113 :
2114 : __int16 si = newv;
2115 : if (si >= minv) {
2116 :
2117 : if (si <= maxv) {
2118 :
2119 : return si;
2120 : }
2121 :
2122 : return maxv;
2123 : }
2124 :
2125 : return minv;
2126 : }
2127 :
2128 :
2129 : void _24a5_013d()
2130 : {
2131 :
2132 : ENTER(28);
2133 :
2134 : if (_4976_4dba[_4976_4bf4].Difficulty() == 0) {
2135 :
2136 : _4976_4c36 = 1;
2137 : }
2138 :
2139 : Bit16u bp1c[9];
2140 : ZERO_MEMORY(bp1c, 9);
2141 :
2142 : Bit16u bp06 = 0;
2143 :
2144 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(_4976_57c8.w0, 0) & 0x0010) != 0) {
2145 :
2146 : bp1c[bp06] = ADD_ITEM_CHARGE(_4976_57c8.w0, 0);
2147 : bp06++;
2148 : }
2149 :
2150 : Bit16u si;
2151 : for (si=0; si < _4976_4c3c; si++) {
2152 :
2153 : for (Bit16u bp04=0; bp04 <= 1; bp04++) {
2154 :
2155 : Bit16u bp08;
2156 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(bp08 = _4976_53b4[si].Possess(bp04), 0) & 0x0010) != 0) {
2157 :
2158 : bp1c[bp06] = ADD_ITEM_CHARGE(bp08, 0);
2159 :
2160 : bp06++;
2161 : }
2162 :
2163 : }
2164 :
2165 : }
2166 :
2167 : for (si=0; bp06 -1 > si; si++) {
2168 :
2169 : if (bp1c[si] > bp1c[si +1]) {
2170 :
2171 : Bit16u bp04 = bp1c[si];
2172 :
2173 : bp1c[si] = bp1c[si +1];
2174 :
2175 : bp1c[si +1] = bp04;
2176 : }
2177 :
2178 : }
2179 :
2180 : Bit16u bp02 = 6;
2181 : Bit16u di;
2182 : for (di=0, si=0; si < bp06; si++) {
2183 :
2184 : di += (_4976_3d34[bp1c[si]] << bp02) >> 6;
2185 :
2186 : bp02 = max_value(0, bp02 -1);
2187 :
2188 : }
2189 :
2190 : di += _4976_52d4;
2191 : di += _4976_57e4.w0;
2192 :
2193 : di = di + QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4218, 0x0B, 0x67);
2194 :
2195 : if (_4976_5c5d != 0) {
2196 :
2197 : di += _4976_3d44[BETWEEN_VALUE(0, _4976_5c63 + _4976_5c68, 5)];
2198 : }
2199 :
2200 : for (_4976_4c36=0; _4976_4c36 <= 5; _4976_4c36++) {
2201 :
2202 : if (_4976_3d44[_4976_4c36] < di)
2203 : break;
2204 :
2205 : }
2206 :
2207 : Bit16u bp0a = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4218, 0x0B, 0x68);
2208 :
2209 : if (bp0a < _4976_4c36) {
2210 :
2211 : _4976_4c36 = bp0a;
2212 : }
2213 :
2214 : if (_4976_5c5d != 0) {
2215 :
2216 : if (_4976_4bf8 != 0) {
2217 :
2218 : _4976_4c36 = 0;
2219 : }
2220 : }
2221 :
2222 : _4976_4c36 -= (_4976_52d6 > 12) ? 1 : 0;
2223 :
2224 : _4976_4c36 = BETWEEN_VALUE(0, _4976_4c36, 5);
2225 : }
2226 :
2227 :
2228 : Bit16u _48ae_01ec(ObjectID recordLink, Bit16u possess, Bit16u x3)
2229 : {
2230 :
2231 : ENTER(0);
2232 :
2233 : __int16 si = possess;
2234 :
2235 : Bit16u di = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 4);
2236 :
2237 : if (x3 != 0) {
2238 :
2239 : if (si < 0x000D) {
2240 :
2241 : if (si < 0) {
2242 :
2243 :
2244 :
2245 : return di & 0x0400;
2246 : }
2247 :
2248 :
2249 :
2250 : return _4976_49e8[si] & di;
2251 : }
2252 :
2253 :
2254 :
2255 : return 0;
2256 : }
2257 :
2258 : if (si < 0x000D) {
2259 :
2260 : if (si > 0x0001) {
2261 :
2262 :
2263 : return di & _4976_49e8[si];
2264 : }
2265 : }
2266 :
2267 : if (si >= 0x001E) {
2268 :
2269 : if (si < 0x0026) {
2270 :
2271 : if ((di & 0x8000) != 0) {
2272 :
2273 : return 0;
2274 : }
2275 :
2276 : if (_48ae_01ec(_4976_3de2[(_4976_5366 << 1) + (_4976_5354)], 0x000c, 0x0000) != 0) {
2277 :
2278 : return di & 0x0040;
2279 : }
2280 : }
2281 : }
2282 :
2283 : return 1;
2284 : }
2285 :
2286 :
2287 : Bit16u _2c1d_038b(ObjectID x1, Bit8u x2, Bit16u x3, Bit16u x4)
2288 : {
2289 :
2290 : ENTER(2);
2291 :
2292 : __int16 si = x4;
2293 :
2294 : Bit16u bp02 = QUERY_GDAT_DBSPEC_WORD_VALUE(x1, x2);
2295 :
2296 : if (bp02 == 0)
2297 : return 0;
2298 :
2299 : if ((bp02 & 0x4000) != 0) {
2300 :
2301 : switch (si) {
2302 : case 0xfffe:
2303 : case 0x0002:
2304 : case 0x0003:
2305 : break;
2306 : default:
2307 :
2308 : return 0;
2309 : }
2310 : }
2311 : else {
2312 :
2313 : if (x3 == 0) {
2314 :
2315 : if ((bp02 & 0x8000) == 0)
2316 : return 0;
2317 : }
2318 : }
2319 :
2320 : bp02 = (Bit8u)bp02;
2321 :
2322 : if (si < 0) {
2323 :
2324 : bp02 = -bp02;
2325 : }
2326 :
2327 : return bp02;
2328 : }
2329 :
2330 :
2331 : void _2c1d_0300(sk53b4 *ref, Bit16u xx, Bit16u yy);
2332 :
2333 :
2334 : void _2c1d_03e7(__int16 player, ObjectID recordLink, Bit16u possess, __int16 x4)
2335 : {
2336 :
2337 : ObjectID di = recordLink;
2338 : __int16 si = x4;
2339 :
2340 : if (player < 0)
2341 : return;
2342 :
2343 : if (di == di.FFFF)
2344 : return;
2345 :
2346 : if (possess < 30) {
2347 :
2348 : Bit16u bp06 = QUERY_GDAT_DBSPEC_WORD_VALUE(di, 0);
2349 :
2350 : if (si != 0 && (bp06 & 0x0010) != 0) {
2351 :
2352 : _24a5_013d();
2353 : }
2354 :
2355 : if ((bp06 & 0x2000) == 0) {
2356 :
2357 : sk53b4 *bp04 = &_4976_53b4[player];
2358 :
2359 : Bit16u bp0a = _48ae_01ec(di, possess, 1);
2360 : Bit16u bp0c = 0;
2361 :
2362 : if (si != 0 && si != 3 && si != -2) {
2363 :
2364 : bp06 = _2c1d_038b(di, 0x0014, bp0a, si);
2365 :
2366 : if (bp06 != 0) {
2367 :
2368 : if (si == 1 || si == -1) {
2369 :
2370 : bp04->w64 += bp06;
2371 : }
2372 : else {
2373 :
2374 : if (si == 2) {
2375 :
2376 : bp04->curMP(BETWEEN_VALUE(0, bp04->curMP() + bp06, 999));
2377 : }
2378 : }
2379 :
2380 : bp04->w50 |= 0x0800;
2381 : }
2382 :
2383 : for (Bit16u bp08 = 0; bp08 <= 6; bp08++) {
2384 :
2385 : bp06 = _2c1d_038b(di, bp08 + 0x15, bp0a, si);
2386 :
2387 : if (bp06 != 0) {
2388 :
2389 : if (si == 1 || si == -1) {
2390 :
2391 : bp04->b86[bp08] = bp04->b86[bp08] + bp06;
2392 : }
2393 : else {
2394 :
2395 : _2c1d_0300(bp04, bp08, bp06);
2396 : }
2397 :
2398 : bp04->w50 |= 0x3000;
2399 : }
2400 :
2401 : }
2402 : }
2403 :
2404 : for (Bit16u bp08 = 0; bp08 < 0x0014; bp08++) {
2405 :
2406 : bp06 = _2c1d_038b(di, bp08 + 0x1E, bp0a, si);
2407 :
2408 : if (bp06 != 0) {
2409 :
2410 : bp04->b173[bp08] = bp04->b173[bp08] + bp06;
2411 :
2412 : bp04->w50 |= 0x2000;
2413 : bp0c = 1;
2414 : }
2415 :
2416 : }
2417 :
2418 : bp06 = _2c1d_038b(di, 0x0033, bp0a, si);
2419 :
2420 : if (bp06 != 0) {
2421 :
2422 : bp04->b259 = bp04->b259 + bp06;
2423 : bp0c = 1;
2424 : }
2425 :
2426 : if (si != 2 && si != -1 && si != 3) {
2427 :
2428 : bp06 = _2c1d_038b(di, 0x0032, bp0a, si);
2429 :
2430 : if (bp06 != 0) {
2431 :
2432 : _4976_57e4.w0 += bp06;
2433 : if (si != 0) {
2434 :
2435 : _24a5_013d();
2436 : }
2437 : }
2438 : }
2439 :
2440 : if (bp0c != 0 && si == 2) {
2441 :
2442 : sk5c20 bp16;
2443 : bp16.TimerType(14);
2444 :
2445 : bp16.SetMap(_4976_4bf4);
2446 : bp16.SetTick(QUERY_GDAT_DBSPEC_WORD_VALUE(di, 0x0013) + _4976_4bec);
2447 :
2448 : bp16.b5 = (Bit8u)player;
2449 :
2450 : bp16.w6 = di.DBType();
2451 :
2452 : bp16.w8 = QUERY_CLS2_FROM_RECORD(di);
2453 :
2454 : QUEUE_TIMER(&bp16);
2455 : }
2456 : }
2457 : }
2458 :
2459 : if (si != 0) {
2460 :
2461 : CALC_PLAYER_WEIGHT(player);
2462 : }
2463 :
2464 : return;
2465 : }
2466 :
2467 :
2468 : ObjectID _2c1d_07a3(Bit16u player, Bit16u possess)
2469 : {
2470 :
2471 : ENTER(4);
2472 :
2473 : Bit16u si = possess;
2474 :
2475 : sk53b4 *bp04 = &_4976_53b4[player];
2476 :
2477 : ObjectID di;
2478 : if (si >= 30) {
2479 :
2480 : di = _4976_52c4[si -30];
2481 :
2482 : _4976_52c4[si -30] = 0xffff;
2483 : }
2484 : else {
2485 :
2486 : di = bp04->Possess(si);
2487 :
2488 : bp04->Possess(si, ObjectID::FFFF);
2489 : }
2490 :
2491 : if (di == di.FFFF) {
2492 :
2493 : return ObjectID::FFFF;
2494 : }
2495 :
2496 : if (true
2497 : && _4976_5366 -1 == player
2498 : && si <= 1
2499 : && si == _4976_5354
2500 : ) {
2501 :
2502 : _2759_0541();
2503 : }
2504 :
2505 : _2c1d_03e7(player, di, si, -1);
2506 :
2507 : return di;
2508 : }
2509 :
2510 :
2511 : void _2c1d_0831(Bit16u player, ObjectID rl, Bit16u hand)
2512 : {
2513 :
2514 : ENTER(4);
2515 :
2516 : ObjectID si = rl;
2517 : Bit16u di = hand;
2518 :
2519 : if (si != si.FFFF) {
2520 :
2521 : sk53b4 *bp04 = &_4976_53b4[player];
2522 :
2523 : si.ClearDir();
2524 :
2525 : if (di >= 30) {
2526 :
2527 : _4976_52c4[di -30] = si;
2528 : }
2529 : else {
2530 :
2531 : bp04->Possess(di, si);
2532 : }
2533 :
2534 : _2c1d_03e7(player, si, di, 1);
2535 : }
2536 :
2537 : return;
2538 : }
2539 :
2540 :
2541 : Bit16u _2759_0e93(Bit16u player, ObjectID rl, __int16 hand);
2542 :
2543 :
2544 : void _2759_0fb0(Bit16u player, __int16 hand)
2545 : {
2546 :
2547 : ENTER(14);
2548 :
2549 : sk53b4 *bp04 = &_4976_53b4[player];
2550 :
2551 : bp04->b42[hand] = 0;
2552 :
2553 : if (bp04->curHP() == 0 || hand >= 2)
2554 :
2555 : return;
2556 :
2557 : __int16 bp0e = hand ^ 1;
2558 :
2559 : __int16 bp0a = hand;
2560 :
2561 : Bit16u bp0c = bp04->b32[hand];
2562 :
2563 : bp04->b32[hand] = 0xff;
2564 :
2565 : bp04->b66[hand] = 0;
2566 :
2567 : if (bp0c == 32) {
2568 :
2569 : if (bp04->Possess(bp0e) != ObjectID::FFFF)
2570 :
2571 : return;
2572 :
2573 : Bit16u di = 12;
2574 :
2575 : if (_2759_0e30(player, bp0a, bp04->Possess(di)) != 0) {
2576 :
2577 : _1059:
2578 : ObjectID si = _2c1d_07a3(player, di);
2579 :
2580 :
2581 : _2c1d_0831(player, si, bp0e);
2582 :
2583 : return;
2584 : }
2585 : else {
2586 :
2587 : ObjectID si = bp04->Possess(12);
2588 :
2589 : if (IS_CONTAINER_CHEST(si) != 0) {
2590 :
2591 : ObjectID *bp08 = &GET_ADDRESS_OF_RECORD9(si)->w2;
2592 :
2593 : si = *bp08;
2594 :
2595 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
2596 :
2597 : if (_2759_0e30(player, bp0a, si) != 0) {
2598 :
2599 : CUT_RECORD_FROM(si, bp08, -1, 0);
2600 :
2601 :
2602 : _2c1d_0831(player, si, bp0e);
2603 :
2604 : return;
2605 : }
2606 :
2607 : }
2608 : }
2609 :
2610 : for (__int16 di = 7; di <= 9; di++) {
2611 :
2612 : if (_2759_0e30(player, bp0a, bp04->Possess(di)) != 0)
2613 :
2614 : goto _1059;
2615 :
2616 : }
2617 :
2618 : return;
2619 : }
2620 : }
2621 :
2622 : if (bp0c != 42)
2623 :
2624 : return;
2625 :
2626 : if (bp04->Possess(bp0a) != ObjectID::FFFF)
2627 :
2628 : return;
2629 :
2630 : Bit16u di = 12;
2631 : ObjectID si;
2632 : if (_2759_0e93(player, bp04->Possess(di), bp0c) != 0) {
2633 :
2634 : _1149:
2635 : si = _2c1d_07a3(player, di);
2636 :
2637 : _1156:
2638 : _2c1d_0831(player, si, bp0a);
2639 :
2640 : return;
2641 : }
2642 :
2643 : if (IS_CONTAINER_CHEST(si = bp04->Possess(12)) != 0) {
2644 :
2645 : ObjectID *bp08 = &GET_ADDRESS_OF_RECORD(si)->w0;
2646 :
2647 : si = *bp08;
2648 :
2649 :
2650 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
2651 :
2652 : if (_2759_0e93(player, si, bp0c) != 0) {
2653 :
2654 : CUT_RECORD_FROM(si, bp08, -1, 0);
2655 :
2656 : goto _1156;
2657 : }
2658 :
2659 : }
2660 : }
2661 :
2662 : for (__int16 di = 7; di <= 9; di++) {
2663 :
2664 : if (_2759_0e93(player, bp04->Possess(di), bp0c) != 0) {
2665 :
2666 : goto _1149;
2667 : }
2668 :
2669 : }
2670 :
2671 : si = _2c1d_07a3(player, 12);
2672 :
2673 : if (si != si.FFFF)
2674 :
2675 : goto _1156;
2676 :
2677 : return;
2678 : }
2679 :
2680 :
2681 : Bit8u *_3e74_506b(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4)
2682 : {
2683 :
2684 : ENTER(6);
2685 :
2686 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, cls3, cls4);
2687 :
2688 : if (cls3 == dtImage && IS_CLS1_CRITICAL_FOR_LOAD(cls1) == 0) {
2689 :
2690 : if (si == 0xffff || _4976_5c98[si].Absent()) {
2691 :
2692 : si = QUERY_GDAT_ENTRY_DATA_INDEX(0x15, 0xfe, dtImage, 0xfe);
2693 : }
2694 : }
2695 :
2696 : Bit8u *bp04;
2697 : Bit16u bp06;
2698 : if (_4976_5c98[si].Absent() && IS_CLS1_CRITICAL_FOR_LOAD(cls1) != 0) {
2699 :
2700 : bp04 = _3e74_15a9(si, &bp06, 0);
2701 : }
2702 : else {
2703 :
2704 : bp04 = REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]);
2705 : }
2706 :
2707 : return bp04;
2708 : }
2709 :
2710 :
2711 : void FREE_PICT6(SkImage *ref)
2712 : {
2713 :
2714 : ENTER(0);
2715 :
2716 : if (_4976_5d76 == 0) {
2717 :
2718 : if (READ_UI16(ref,-6 +4) == afDefault) {
2719 :
2720 : DEALLOC_UPPER_MEMORY(READ_UI32(ref,-6 +0));
2721 : }
2722 : else {
2723 :
2724 : DEALLOC_LOWER_MEMORY(READ_UI32(ref,-6 +0));
2725 : }
2726 : }
2727 :
2728 : return;
2729 : }
2730 :
2731 :
2732 : __int16 _3e74_52f4(Bit8u cls1, Bit8u cls2, Bit8u cls4)
2733 : {
2734 :
2735 : ENTER(8);
2736 :
2737 : Bit16u di = 0;
2738 :
2739 : RawEntry *bp04 = QUERY_GDAT_ENTRYPTR(cls1, cls2, dtImage, cls4);
2740 :
2741 : if (bp04 == NULL) {
2742 :
2743 : return 0;
2744 : }
2745 : else {
2746 :
2747 : Bit16u si = bp04->data;
2748 :
2749 : SkImage *bp04;
2750 : if (_4976_5c98[si].Absent()) {
2751 :
2752 : di = 1;
2753 :
2754 : bp04 = reinterpret_cast<SkImage *>(_3e74_506b(cls1, cls2, dtImage, cls4));
2755 : }
2756 : else {
2757 :
2758 : bp04 = reinterpret_cast<SkImage *>(REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]));
2759 : }
2760 :
2761 : __int16 bp06 = bp04->Xoffset();
2762 :
2763 : __int16 bp08;
2764 : if (bp06 == -32) {
2765 :
2766 : si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImageOffset, cls4);
2767 : }
2768 : else {
2769 :
2770 : bp08 = bp04->Yoffset();
2771 :
2772 : if (bp08 == -32) {
2773 :
2774 : bp08 = 0;
2775 : }
2776 :
2777 : si = (bp06 << 8) | Bit8u(bp08);
2778 : }
2779 :
2780 : if (di != 0) {
2781 :
2782 : FREE_PICT6(bp04);
2783 : }
2784 :
2785 : return si;
2786 : }
2787 : }
2788 :
2789 :
2790 : skxxx4 *_0b36_0520(skxxx4 *ref, Bit8u cls1, Bit8u cls2, Bit8u cls4)
2791 : {
2792 :
2793 : ENTER(8);
2794 :
2795 : ZERO_MEMORY(ref, 314);
2796 :
2797 : ref->w12 = -1;
2798 : ref->b8 = cls1;
2799 : ref->b9 = cls2;
2800 : ref->b10 = dtImage;
2801 : ref->b11 = cls4;
2802 : ref->w54 = 64;
2803 : ref->w52 = 64;
2804 : ref->w24 = 0xffff;
2805 : ref->w26 = 0xffff;
2806 : ref->pb44 = _4976_4964;
2807 : ref->w48 = -1;
2808 :
2809 : if (cls1 != 0xff) {
2810 :
2811 : ref->w6 = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
2812 :
2813 : __int16 bp02 = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImageOffset, 0xfe);
2814 :
2815 : if (bp02 != 0) {
2816 :
2817 : ref->w28 += __int8(bp02 >> 8);
2818 :
2819 : ref->w30 += __int8(bp02);
2820 : }
2821 :
2822 : bp02 = _3e74_52f4(cls1, cls2, cls4);
2823 :
2824 : if (bp02 != 0) {
2825 :
2826 : ref->w28 += __int8(bp02 >> 8);
2827 :
2828 : ref->w30 += __int8(bp02);
2829 : }
2830 :
2831 : Bit8u *bp06 = QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, cls4);
2832 :
2833 : if (bp06 == NULL) {
2834 :
2835 : ref->w56 = 256;
2836 :
2837 : bp06 = ref->b58;
2838 :
2839 : __int16 bp08 = 0;
2840 :
2841 : for (; bp08 < 256; bp08++) {
2842 :
2843 : bp06[bp08] = (Bit8u)bp08;
2844 :
2845 : }
2846 : }
2847 : else {
2848 :
2849 : COPY_MEMORY(bp06, ref->b58, 16);
2850 : }
2851 : }
2852 :
2853 : return ref;
2854 : }
2855 :
2856 :
2857 : void DRAW_DEF_PICT(skxxx4 *ref)
2858 : {
2859 :
2860 :
2861 :
2862 :
2863 :
2864 :
2865 :
2866 :
2867 : ENTER(12);
2868 :
2869 : if (ref->w18 <= 0 || ref->w20 <= 0)
2870 :
2871 : return;
2872 :
2873 : Bit8u *bp04 = QUERY_PICT_BITS(ref);
2874 :
2875 : Bit16u bp06 = ref->w24;
2876 :
2877 : __int16 bp08;
2878 : __int16 bp0a;
2879 : if (bp06 == 0xffff) {
2880 :
2881 : bp08 = ref->w32;
2882 : bp0a = ref->w34;
2883 : }
2884 : else {
2885 :
2886 : if ((bp06 & 0x8000) == 0 || ref->w28 != 0 || ref->w30 != 0) {
2887 :
2888 : bp06 |= 0x8000;
2889 :
2890 : bp08 = ref->w32 + ref->w28;
2891 : bp0a = ref->w34 + ref->w30;
2892 : }
2893 : else {
2894 :
2895 : bp08 = ref->w18;
2896 : bp0a = ref->w20;
2897 : }
2898 :
2899 : if (QUERY_BLIT_RECT(bp04, &ref->rc36, bp06, &bp08, &bp0a, ref->w26) == NULL)
2900 :
2901 : return;
2902 : }
2903 :
2904 : bp08 += ref->w14;
2905 : bp0a += ref->w16;
2906 : __int16 si = READ_UI16(bp04,-4);
2907 : __int16 di = ref->rc36.cx +bp08;
2908 :
2909 : if (si > di && (ref->w50 & 0x0001) != 0) {
2910 :
2911 : si -= di;
2912 : }
2913 : else {
2914 :
2915 : si = 0;
2916 : }
2917 :
2918 : if ((ref->w50 & 0x0001) != 0) {
2919 :
2920 : bp08 = 0;
2921 : }
2922 :
2923 : bp08 += si;
2924 :
2925 : si = READ_I16(bp04,-2);
2926 :
2927 : di = ref->rc36.cy +bp0a;
2928 :
2929 : if (si > di && (ref->w50 & 0x0002) != 0) {
2930 :
2931 : si -= di;
2932 : }
2933 : else {
2934 :
2935 : si = 0;
2936 : }
2937 :
2938 : if ((ref->w50 & 0x0002) != 0) {
2939 :
2940 : bp0a = 0;
2941 : }
2942 :
2943 : bp0a += si;
2944 :
2945 : Bit16u bp0c;
2946 : if (ref->pb44 == _4976_4964) {
2947 :
2948 : si = _4976_00f0;
2949 : di = _4976_00f2;
2950 : bp0c = 8;
2951 : }
2952 : else {
2953 :
2954 : si = READ_I16(ref->pb44,-4);
2955 :
2956 : di = READ_I16(ref->pb44,-2);
2957 :
2958 : bp0c = READ_I16(ref->pb44,-6);
2959 : }
2960 :
2961 : if (ref->w48 != 0xfffe) {
2962 :
2963 : FIRE_BLIT_PICTURE(
2964 : bp04,
2965 : ref->pb44,
2966 : reinterpret_cast<blit_rc *>(&ref->rc36),
2967 : bp08,
2968 : bp0a,
2969 : READ_UI16(bp04,-4),
2970 : si,
2971 : ref->w48,
2972 : ref->w50,
2973 : READ_UI16(bp04,-6),
2974 : bp0c,
2975 : (ref->w56 == 0) ? NULL : ref->b58
2976 : );
2977 : }
2978 :
2979 : ref->w32 = bp08;
2980 : ref->w34 = bp0a;
2981 :
2982 : return;
2983 : }
2984 :
2985 :
2986 : Bit8u *QUERY_PICT_BITS(skxxx5 *ref)
2987 : {
2988 :
2989 : ENTER(0);
2990 :
2991 : Bit16u si = ref->w4;
2992 :
2993 : if ((si & 0x0004) != 0) {
2994 :
2995 : return ref->pb0 = QUERY_GDAT_IMAGE_ENTRY_BUFF(ref->b8, ref->b9, ref->b11);
2996 : }
2997 :
2998 : else if ((si & 0x0008) != 0) {
2999 :
3000 : return reinterpret_cast<Bit8u *>(_3e74_5817(ref->w12));
3001 : }
3002 : else {
3003 :
3004 : return ref->pb0;
3005 : }
3006 : }
3007 :
3008 :
3009 : void _0b36_11c0(skxxx4 *xx, sk3f6c *yy, Bit16u ss, __int16 tt)
3010 : {
3011 :
3012 : ENTER(12);
3013 :
3014 : xx->pb44 = reinterpret_cast<Bit8u *>(_3e74_5817(yy->w0));
3015 :
3016 : SRECT bp08;
3017 : if (ss == 0xffff) {
3018 : ATLASSERT(false);
3019 :
3020 :
3021 : COPY_MEMORY(&xx->rc36, &bp08, 8);
3022 :
3023 : goto _123d;
3024 : }
3025 : else {
3026 :
3027 : __int16 bp0a = xx->w18;
3028 : __int16 bp0c = xx->w20;
3029 :
3030 : if (QUERY_BLIT_RECT(QUERY_PICT_BITS(xx), &bp08, ss, &bp0a, &bp0c, -1) != NULL) {
3031 :
3032 : _123d:
3033 : xx->w18 += bp0a;
3034 : xx->w20 += bp0c;
3035 :
3036 : _0b36_0fab(yy, &bp08, &xx->rc36);
3037 :
3038 : xx->w24 = 0xffff;
3039 : xx->w48 = tt;
3040 :
3041 : DRAW_DEF_PICT(xx);
3042 :
3043 : _0b36_0d67(yy, &bp08);
3044 : }
3045 : }
3046 :
3047 : return;
3048 : }
3049 :
3050 :
3051 : Bit16u _0b36_0036(__int16 xx, __int16 yy)
3052 : {
3053 :
3054 : ENTER(0);
3055 :
3056 : return (__int16(xx * yy) + (yy >> 1)) >> 6;
3057 : }
3058 :
3059 :
3060 : Bit8u *_0b36_00c3(__int16 xx, skxxx5 *ref)
3061 : {
3062 :
3063 : ENTER(4);
3064 :
3065 : Bit8u *bp04 = reinterpret_cast<Bit8u *>(_3e74_5817(xx));
3066 :
3067 : if (ref != NULL) {
3068 :
3069 : ref->pb0 = bp04;
3070 :
3071 : ref->w14 = 0;
3072 : ref->w16 = 0;
3073 :
3074 : ref->w18 = READ_UI16(bp04,-4);
3075 :
3076 : ref->w20 = READ_UI16(bp04,-2);
3077 :
3078 : ref->w22 = READ_UI16(bp04,-6);
3079 :
3080 : ref->w12 = xx;
3081 :
3082 : ref->w4 = 8;
3083 : }
3084 :
3085 : return bp04;
3086 : }
3087 :
3088 :
3089 : Bit8u *_0b36_004b(skxxx5 *ref)
3090 : {
3091 :
3092 : ENTER(4);
3093 :
3094 : Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(ref->b8, ref->b9, ref->b11);
3095 :
3096 : ref->pb0 = bp04;
3097 :
3098 : ref->w14 = 0;
3099 : ref->w16 = 0;
3100 :
3101 : ref->w18 = READ_UI16(bp04,-4);
3102 :
3103 : ref->w20 = READ_UI16(bp04,-2);
3104 :
3105 : ref->w22 = READ_UI16(bp04,-6);
3106 :
3107 : ref->w4 = 4;
3108 :
3109 : return bp04;
3110 : }
3111 :
3112 :
3113 : void _3e74_58bf(Bit8u cls1, Bit8u cls2, Bit8u cls4)
3114 : {
3115 :
3116 : ENTER(4);
3117 :
3118 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
3119 :
3120 : if (si != 0xffff && _4976_5c98[si].Absent()) {
3121 :
3122 : si = QUERY_GDAT_ENTRY_DATA_INDEX(0x15,0xfe,dtImage,0xfe);
3123 : }
3124 :
3125 : if (si != 0xffff) {
3126 :
3127 : Bit16u di = _3e74_0c62(si);
3128 :
3129 : if (di == 0xffff) {
3130 : if (_4976_5c98[si].Absent()) {
3131 :
3132 : return;
3133 : }
3134 :
3135 : SkImage *bp04 = reinterpret_cast<SkImage *>(REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]));
3136 :
3137 : if (bp04->Yoffset() != -32) {
3138 :
3139 : return;
3140 : }
3141 :
3142 : if (bp04->BitsPixel() != 8) {
3143 :
3144 : return;
3145 : }
3146 :
3147 : _4976_4807 = si;
3148 :
3149 : return;
3150 : }
3151 : else {
3152 :
3153 : _3e74_4549(di);
3154 : }
3155 : }
3156 :
3157 : return;
3158 : }
3159 :
3160 :
3161 : void _0b36_018f(skxxx5 *ref)
3162 : {
3163 :
3164 : ENTER(0);
3165 :
3166 : if ((ref->w4 & 0x0004) != 0) {
3167 :
3168 : _3e74_58bf(ref->b8, ref->b9, ref->b11);
3169 : }
3170 :
3171 : else if ((ref->w4 & 0x0008) != 0) {
3172 :
3173 : _3e74_583a(ref->w12);
3174 : }
3175 :
3176 : }
3177 :
3178 :
3179 : Bit32u _0b36_068f(skxxx4 *ref)
3180 : {
3181 :
3182 : ENTER(0);
3183 :
3184 : return (Bit32u(ref->w6 & 0x1fff) << 12) | ((ref->w52 & 0x007f) << 5) | (ref->w54 & 0x001f);
3185 : }
3186 :
3187 :
3188 : void _3e74_5992(Bit8u cls1, Bit8u cls2, Bit8u cls4)
3189 : {
3190 :
3191 : ENTER(0);
3192 :
3193 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
3194 :
3195 : if (si == 0xffff || _4976_5c98[si].Absent()) {
3196 :
3197 : si = QUERY_GDAT_ENTRY_DATA_INDEX(0x15,0xfe,dtImage,0xfe);
3198 : }
3199 :
3200 : if (si == 0xffff)
3201 :
3202 : return;
3203 :
3204 : if (_4976_4807 == si) {
3205 :
3206 : _4976_4807 = 0xffff;
3207 : }
3208 :
3209 : Bit16u di = _3e74_0c62(si);
3210 :
3211 : if (di != 0xffff) {
3212 :
3213 : _3e74_4701(di, 0);
3214 : }
3215 :
3216 : return;
3217 : }
3218 :
3219 :
3220 : void _0b36_01cd(skxxx5 *ref)
3221 : {
3222 :
3223 : ENTER(0);
3224 :
3225 : if ((ref->w4 & 0x0004) != 0) {
3226 :
3227 : _3e74_5992(ref->b8, ref->b9, ref->b11);
3228 : }
3229 :
3230 : else if ((ref->w4 & 0x0008) != 0) {
3231 :
3232 : _3e74_585a(ref->w12, 0);
3233 : }
3234 :
3235 : }
3236 :
3237 :
3238 : void _44c8_2351(Bit8u *xx, Bit8u *yy, Bit16u ss, Bit16u tt, Bit16u uu, Bit16u vv);
3239 :
3240 :
3241 : void FIRE_BLIT_TO_MEMORY_ROW_4TO4BPP(Bit16u offSrc, Bit16u offDst, Bit16u width)
3242 : {
3243 :
3244 : ENTER(0);
3245 :
3246 : Bit8u *di = _4976_5e6a;
3247 : Bit8u *si = _4976_5e64;
3248 : Bit16u cx = width;
3249 :
3250 : bool carry = (offSrc & 1) ? true : false;
3251 : offSrc >>= 1;
3252 : if (!carry) {
3253 :
3254 : si += offSrc;
3255 :
3256 : bool carry = (offSrc & 1) ? true : false;
3257 : offSrc >>= 1;
3258 : if (!carry) {
3259 :
3260 : di += offSrc;
3261 :
3262 :
3263 : _0036:
3264 : bool carry = (cx & 1) ? true : false;
3265 : cx >>= 1;
3266 : {
3267 :
3268 : bool carry = (cx & 1) ? true : false;
3269 : cx >>= 1;
3270 :
3271 : if (carry) {
3272 :
3273 : *di = *si; di++; si++;
3274 : }
3275 :
3276 : while (cx != 0) {
3277 :
3278 : *di = *si; di++; si++;
3279 : *di = *si; di++; si++;
3280 : cx--;
3281 : }
3282 : }
3283 :
3284 : if (carry) {
3285 : *di = (*si & 0xf0) | (*di & 0x0f); si++; di++;
3286 : }
3287 : }
3288 : else {
3289 :
3290 : di += offSrc;
3291 :
3292 : Bit8u bh = *di;
3293 :
3294 : cx++;
3295 : bool carry = (cx & 1) ? true : false;
3296 : cx >>= 1;
3297 :
3298 : if (cx != 0) {
3299 :
3300 : bool carry = (cx & 1) ? true : false;
3301 :
3302 : if (carry) {
3303 :
3304 : Bit8u al = *si; si++;
3305 :
3306 : *di = (bh & 0xf0) | (al >> 4); di++;
3307 : bh = al << 4;
3308 : }
3309 :
3310 : if (cx != 0) {
3311 :
3312 : bh &= 0xf0;
3313 : do {
3314 :
3315 :
3316 :
3317 :
3318 :
3319 :
3320 :
3321 :
3322 :
3323 :
3324 :
3325 :
3326 :
3327 : Bit8u al = *si; si++;
3328 : Bit8u ah = *si; si++;
3329 : *di = bh | (al >> 4); di++;
3330 : *di = (al << 4) | (ah >> 4); di++;
3331 : bh = ah << 4;
3332 :
3333 : } while (--cx != 0);
3334 : }
3335 : }
3336 :
3337 : if (carry) {
3338 :
3339 : *di = (*di & 0x0f) | bh; di++;
3340 : }
3341 : }
3342 : }
3343 : else {
3344 :
3345 : si += offSrc;
3346 : {
3347 :
3348 : bool carry = (offDst & 1) ? true : false;
3349 : offDst >>= 1;
3350 :
3351 : if (carry) {
3352 :
3353 : di += offDst;
3354 :
3355 : *di = (*si & 0x0f) | (*di & 0xf0); si++; di++;
3356 :
3357 : cx--;
3358 :
3359 : goto _0036;
3360 : }
3361 : }
3362 :
3363 : di += offDst;
3364 :
3365 : Bit8u bh = *si; si++;
3366 : {
3367 :
3368 : bool carry = (cx & 1) ? true : false;
3369 : cx >>= 1;
3370 :
3371 : if (cx != 0) {
3372 :
3373 : bool carry = (cx & 1) ? true : false;
3374 : cx >>= 1;
3375 :
3376 : if (carry) {
3377 :
3378 : Bit8u bl = *si;
3379 : *di = (*si >> 4) | (bh << 4); di++; si++;
3380 : bh = bl;
3381 : }
3382 :
3383 : if (cx != 0) {
3384 :
3385 : bh &= 0x0f;
3386 : do {
3387 :
3388 :
3389 :
3390 :
3391 :
3392 :
3393 :
3394 :
3395 :
3396 :
3397 :
3398 :
3399 : Bit8u al = *si; si++;
3400 : Bit8u ah = *si; si++;
3401 : *di = (bh << 4) | (al >> 4); di++;
3402 : *di = (al << 4) | (ah >> 4); di++;
3403 : bh = ah & 0x0f;
3404 :
3405 : } while (--cx != 0);
3406 : }
3407 : }
3408 :
3409 : if (carry) {
3410 :
3411 : *di = (*di & 0x0f) | (bh << 4);
3412 : }
3413 : }
3414 : }
3415 :
3416 : return;
3417 : }
3418 :
3419 :
3420 : void _44c8_20e5(Bit16u xx, Bit16u yy, Bit16u ss, Bit16u tt)
3421 : {
3422 :
3423 : ENTER(0);
3424 :
3425 : Bit8u *di = _4976_5e6a + (yy >> 1);
3426 : Bit16u cx = ss >> 1;
3427 : Bit16u dx = (tt +1) >> 1;
3428 : Bit8u *si = _4976_5e64 + (xx >> 1);
3429 : Bit8u bh = 0;
3430 : do {
3431 :
3432 : Bit8u ah = si[cx >> 8];
3433 : if ((cx & 0x80) == 0) {
3434 : ah &= 0xf;
3435 : }
3436 : else {
3437 : ah <<= 4;
3438 : }
3439 : cx += ss;
3440 :
3441 : Bit8u al = si[cx >> 8];
3442 : if ((cx & 0x80) == 0) {
3443 : al <<= 4;
3444 : }
3445 : else {
3446 : al &= 0x0f;
3447 : }
3448 : *di = al | ah; di++;
3449 : cx += ss;
3450 : } while (--dx != 0);
3451 :
3452 : return;
3453 : }
3454 :
3455 :
3456 : void _44c8_2143(Bit16u xx, Bit16u yy, Bit16u ss, Bit16u tt);
3457 :
3458 : #pragma warning(push)
3459 : #pragma warning(disable: 4700)
3460 :
3461 :
3462 : void _44c8_21f3(Bit8u *xx, Bit8u *yy, Bit16u ss, Bit16u tt, Bit16u uu, Bit16u vv, Bit32u aa)
3463 : {
3464 :
3465 : ENTER(12);
3466 :
3467 : _4976_5e64 = xx;
3468 :
3469 : _4976_5e6a = yy;
3470 :
3471 : _4976_5dbe = aa;
3472 :
3473 : Bit16u bp08 = (uu +1) & 0xfffe;
3474 :
3475 : Bit16u bp0a = (bp08 +1) & 0xfffe;
3476 :
3477 : Bit16u bp04 = (__int32(__int16(ss)) << 7) / __int16(uu);
3478 :
3479 : Bit16u bp06 = (__int32(__int16(tt)) << 7) / __int16(vv);
3480 :
3481 : Bit16u bp02 = bp06 >> 1;
3482 :
3483 : Bit16u bp0c;
3484 : for (Bit16u si = 0; si < vv; si++) {
3485 :
3486 : Bit16u di = bp02 >> 7;
3487 :
3488 : if (bp0c == di && si > 0) {
3489 :
3490 : _4976_5e64 = yy;
3491 :
3492 : FIRE_BLIT_TO_MEMORY_ROW_4TO4BPP((si -1) * bp08, si * bp08, uu);
3493 :
3494 : _4976_5e64 = xx;
3495 : }
3496 :
3497 : else if (aa == 0) {
3498 :
3499 : _44c8_20e5(di * bp0a, si * bp08, bp04, uu);
3500 : }
3501 : else {
3502 :
3503 : _44c8_2143(di * bp0a, si * bp08, bp04, uu);
3504 : }
3505 :
3506 : bp0c = di;
3507 :
3508 : bp02 += bp06;
3509 :
3510 : }
3511 :
3512 : return;
3513 : }
3514 : #pragma warning(pop)
3515 :
3516 :
3517 : skxxx4 *_0b36_06d3(skxxx4 *ref)
3518 : {
3519 :
3520 : ENTER(364);
3521 :
3522 : Bit16u bp12 = (ref->w52 != 64 || ref->w54 != 64) ? 1 : 0;
3523 : Bit16u bp14 = 0;
3524 :
3525 : Bit16u bp16 = (ref->w6 == 0xffff && ref->w12 >= 0) ? 1 : 0;
3526 :
3527 : if (bp12 != 0) {
3528 :
3529 : ref->w28 = _0b36_0036(ref->w28, ref->w52);
3530 :
3531 : ref->w30 = _0b36_0036(ref->w30, ref->w54);
3532 : }
3533 :
3534 : if ((ref->w52 & 0x0001) != 0) {
3535 :
3536 : ref->w28 = - ref->w28;
3537 : }
3538 :
3539 : if (ref->w48 == 0xfffd)
3540 :
3541 :
3542 : return ref;
3543 :
3544 : if (bp12 == 0 && bp14 == 0) {
3545 :
3546 : if (bp16 != 0) {
3547 :
3548 :
3549 : _0b36_00c3(ref->w12, ref);
3550 :
3551 : return ref;
3552 : }
3553 : else {
3554 :
3555 : _0b36_004b(ref);
3556 :
3557 :
3558 : return ref;
3559 : }
3560 : }
3561 :
3562 : Bit16u bp18;
3563 : Bit8u *bp04;
3564 : Bit8u *bp08;
3565 : skxxx5 bp32;
3566 : if (bp16 != 0) {
3567 :
3568 : bp18 = _3e74_5888();
3569 :
3570 : COPY_MEMORY(ref, &bp32, 24);
3571 :
3572 : Bit8u *bp08 = _0b36_00c3(bp32.w12, &bp32);
3573 :
3574 : _0b36_018f(&bp32);
3575 :
3576 : bp04 = NULL;
3577 : }
3578 : else {
3579 :
3580 : Bit32u bp10 = _0b36_068f(ref);
3581 :
3582 : if (_3e74_55f9(bp10, &bp18) != 0) {
3583 :
3584 :
3585 : _0b36_00c3(bp18, ref);
3586 :
3587 : return ref;
3588 : }
3589 : else {
3590 :
3591 : bp04 = NULL;
3592 : bp08 = NULL;
3593 :
3594 : if (bp08 == NULL) {
3595 :
3596 : COPY_MEMORY(ref, &bp32, 24);
3597 :
3598 : bp08 = _0b36_004b(&bp32);
3599 :
3600 : _0b36_018f(&bp32);
3601 : }
3602 : }
3603 : }
3604 :
3605 : if ((bp32.w4 & 0x0010) != 0) {
3606 :
3607 : skxxx4 bp016c;
3608 : COPY_MEMORY(ref, &bp016c, 314);
3609 :
3610 : bp016c.w50 = 0;
3611 : bp016c.w54 = 64;
3612 : bp016c.w52 = 64;
3613 :
3614 : Bit16u bp1a;
3615 : if (_3e74_55f9(_0b36_068f(&bp016c), &bp1a) == 0) {
3616 :
3617 : bp08 = _3e74_57b5(bp1a, bp32.w18, bp32.w20, bp32.w22);
3618 :
3619 : Bit8u *bp0c = QUERY_PICT_BITS(&bp32);
3620 :
3621 : FIRE_BLIT_PICTURE(
3622 : bp0c,
3623 : bp08,
3624 : reinterpret_cast<blit_rc *>(ALLOC_TEMP_ORIGIN_RECT(bp32.w18, bp32.w20)),
3625 : bp32.w14,
3626 : bp32.w16,
3627 : READ_UI16(bp0c,-4),
3628 : READ_UI16(bp08,-4),
3629 : -1,
3630 : 0,
3631 : bp32.w22,
3632 : bp32.w22,
3633 : NULL
3634 : );
3635 : }
3636 :
3637 : _0b36_01cd(&bp32);
3638 :
3639 : Bit8u *bp08 = _0b36_00c3(bp1a, &bp32);
3640 :
3641 : _0b36_018f(&bp32);
3642 : }
3643 :
3644 : if (bp12 != 0) {
3645 :
3646 : __int16 di = _0b36_0036(bp32.w18, ref->w52);
3647 :
3648 : __int16 si = _0b36_0036(bp32.w20, ref->w54);
3649 :
3650 : if (di <= 0 || si <= 0) {
3651 :
3652 : ref->w18 = di;
3653 : ref->w20 = si;
3654 : }
3655 : else {
3656 :
3657 : _3e74_57b5(bp18, di, si, bp32.w22);
3658 :
3659 : bp08 = QUERY_PICT_BITS(&bp32);
3660 :
3661 : bp04 = _0b36_00c3(bp18, ref);
3662 :
3663 : if (bp32.w22 == 8) {
3664 :
3665 : _44c8_2351(bp08, bp04, bp32.w18, bp32.w20, di, si);
3666 : }
3667 : else {
3668 :
3669 : _44c8_21f3(bp08, bp04, bp32.w18, bp32.w20, si, di, 0);
3670 : }
3671 : }
3672 : }
3673 :
3674 : _0b36_01cd(&bp32);
3675 :
3676 : _3e74_585a(bp18, 0);
3677 :
3678 : return ref;
3679 : }
3680 :
3681 :
3682 : void DRAW_SIMPLE_STR(sk3f6c *ref, Bit16u rectno, Bit16u clr1, Bit16u clr2, Bit8u *str)
3683 : {
3684 :
3685 :
3686 :
3687 :
3688 :
3689 :
3690 :
3691 : ENTER(12);
3692 :
3693 : __int16 bp02;
3694 : __int16 bp04;
3695 : SRECT bp0c;
3696 :
3697 :
3698 :
3699 :
3700 :
3701 : if (_3929_03dc(str, &bp02, &bp04) != 0 && QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1) != 0) {
3702 :
3703 : DRAW_STRING(
3704 : reinterpret_cast<Bit8u *>(_3e74_5817(ref->w0)),
3705 : ref->w0,
3706 : ref->w2.cx,
3707 : bp0c.x -ref->w2.x,
3708 : bp0c.y +bp0c.cy -1 +ref->w2.y,
3709 : clr1,
3710 : clr2,
3711 : str,
3712 : 8
3713 : );
3714 :
3715 : _0b36_0d67(ref, &bp0c);
3716 : }
3717 :
3718 : return;
3719 : }
3720 :
3721 :
3722 : void DRAW_ICON_PICT_BUFF(Bit8u *buff, sk3f6c *tt, SRECT *rc, __int16 srcx, __int16 srcy, __int16 colorkey, __int16 flipmirror, Bit8u *localpal)
3723 : {
3724 :
3725 :
3726 :
3727 :
3728 :
3729 :
3730 :
3731 :
3732 :
3733 : ENTER(8);
3734 :
3735 : if (rc != NULL) {
3736 :
3737 : SRECT bp08;
3738 : FIRE_BLIT_PICTURE(
3739 : buff,
3740 : _3e74_5817(tt->w0),
3741 : reinterpret_cast<blit_rc *>(_0b36_0fab(tt, rc, &bp08)),
3742 : srcx,
3743 : srcy,
3744 : READ_UI16(buff,-4),
3745 : tt->w2.cx,
3746 : colorkey,
3747 : flipmirror,
3748 : READ_UI16(buff,-6),
3749 : 8,
3750 : localpal
3751 : );
3752 :
3753 : _0b36_0d67(tt, rc);
3754 : }
3755 :
3756 : return;
3757 : }
3758 :
3759 :
3760 : void DRAW_ICON_PICT_ENTRY(Bit8u cls1, Bit8u cls2, Bit8u cls4, sk3f6c *ss, Bit16u rectno, __int16 colorkey)
3761 : {
3762 :
3763 : ENTER(20);
3764 :
3765 : __int16 bp0c = 0;
3766 : __int16 bp0a = 0;
3767 :
3768 : Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(cls1, cls2, cls4);
3769 :
3770 : SRECT bp14;
3771 : SRECT *bp08 = QUERY_BLIT_RECT(bp04, &bp14, rectno, &bp0a, &bp0c, -1);
3772 :
3773 : DRAW_ICON_PICT_BUFF(
3774 : bp04,
3775 : ss,
3776 : bp08,
3777 : bp0a,
3778 : bp0c,
3779 : colorkey,
3780 : 0,
3781 : QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, cls4)
3782 : );
3783 :
3784 : return;
3785 : }
3786 :
3787 :
3788 : void _29ee_00e0(__int16 xx)
3789 : {
3790 :
3791 : ENTER(324);
3792 :
3793 : __int16 di = xx;
3794 :
3795 : _29ee_00a3(1);
3796 :
3797 : Bit8u bp01 = 4;
3798 : Bit8u bp02 = 1;
3799 :
3800 : if (di < 0) {
3801 :
3802 : switch (di) {
3803 : case -6:
3804 :
3805 : bp02 = 25;
3806 : break;
3807 : case -2:
3808 :
3809 : bp02 = 23;
3810 : break;
3811 : case -1:
3812 :
3813 : bp02 = 24;
3814 : break;
3815 : default:
3816 :
3817 : bp01 = 5;
3818 :
3819 : if (di == -3) {
3820 :
3821 : bp02 = 14;
3822 : }
3823 :
3824 : else if (di == -4) {
3825 :
3826 : bp02 = 12;
3827 : }
3828 : else {
3829 :
3830 : bp02 = 13;
3831 : }
3832 : break;
3833 : }
3834 : }
3835 :
3836 : skxxx4 bp0144;
3837 : _0b36_0520(&bp0144, 1, bp01, bp02);
3838 :
3839 : if (di >= 0 && di <= 40) {
3840 :
3841 : if (di > 15) {
3842 :
3843 : bp0144.w52 = 0x002b;
3844 : bp0144.w54 = 0x003b;
3845 : }
3846 : else {
3847 :
3848 : bp0144.w52 = 0x001c;
3849 : bp0144.w54 = 0x002c;
3850 : }
3851 : }
3852 :
3853 : _0b36_11c0(_0b36_06d3(&bp0144), &_4976_3f6c, 57, -1);
3854 :
3855 : if (di >= 0) {
3856 :
3857 : Bit16u si = 5;
3858 :
3859 : Bit8u bp0a[8];
3860 : bp0a[5] = 0;
3861 : do {
3862 :
3863 : si--;
3864 :
3865 : bp0a[si] = Bit8u(di % 10) + '0';
3866 :
3867 : di = di / 10;
3868 :
3869 : } while (di != 0);
3870 :
3871 :
3872 : si--;
3873 : bp0a[si] = '!';
3874 : si--;
3875 : bp0a[si] = 0x02;
3876 :
3877 : DRAW_SIMPLE_STR(&_4976_3f6c, 0x39, _4976_4bda[4], _4976_4bda[0], &bp0a[si]);
3878 :
3879 : }
3880 :
3881 : else if (di == -2) {
3882 :
3883 : DRAW_ICON_PICT_ENTRY(0x07, 0x00, (_4976_534a == 0) ? 0x38 : 0x34, &_4976_3f6c, 126, -1);
3884 :
3885 : bp01 = 0;
3886 :
3887 : for (; bp01 < 255; bp01++) {
3888 :
3889 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(0x10, bp01, dtWordValue, 0x05);
3890 :
3891 : if (si != 0 && (si & 0x8000) == 0 && (_4976_532e & si) != 0) {
3892 :
3893 : DRAW_ICON_PICT_ENTRY(0x10, bp01, 0x18, &_4976_3f6c, 125, -1);
3894 :
3895 : return;
3896 : }
3897 :
3898 : }
3899 : }
3900 :
3901 : return;
3902 : }
3903 :
3904 :
3905 : void _24a5_0930();
3906 :
3907 :
3908 : void _2759_0541()
3909 : {
3910 :
3911 : ENTER(2);
3912 :
3913 : __int16 bp02 = _4976_5366;
3914 :
3915 : if (bp02 != 0) {
3916 :
3917 : if (_4976_5340 == 0 || _4976_5352 <= 1)
3918 :
3919 : _4976_5352 = 0;
3920 :
3921 :
3922 : _4976_5366 = 0;
3923 : _4976_3ddc = 0;
3924 : _4976_5356 = 0;
3925 : if (_4976_3d32 != 0xffff) {
3926 :
3927 : _24a5_0930();
3928 : }
3929 :
3930 : _4976_531c = 1;
3931 : }
3932 :
3933 : return;
3934 : }
3935 :
3936 :
3937 : Bit16u GET_MAX_CHARGE(ObjectID recordLink)
3938 : {
3939 :
3940 : ENTER(0);
3941 :
3942 : if (recordLink != ObjectID::FFFF) {
3943 :
3944 : switch (recordLink.DBType()) {
3945 : case dbWeapon:
3946 :
3947 : return 15;
3948 : case dbCloth:
3949 :
3950 : return 15;
3951 : case dbMiscellaneous_item:
3952 :
3953 : return 3;
3954 : }
3955 : }
3956 :
3957 : return 0;
3958 : }
3959 :
3960 :
3961 : Bit8u _2405_014a(ObjectID recordLink, __int16 xx, __int16 yy)
3962 : {
3963 :
3964 : ENTER(8);
3965 :
3966 : Bit8u bp01 = 0x18;
3967 :
3968 : if (yy != 0) {
3969 :
3970 : Bit16u si = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 6);
3971 :
3972 : Bit16u di = si & 15;
3973 :
3974 : if (di != 0) {
3975 :
3976 : Bit16u bp04 = 0;
3977 :
3978 : if ((si & 0x8000) == 0 || (bp04 = _48ae_01ec(recordLink, xx, 1)) != 0) {
3979 :
3980 : if ((si & 0x4000) != 0) {
3981 :
3982 : if (_4976_5366 == 0 || _4976_3de2[(_4976_5366 << 1) + (_4976_5354)] != recordLink)
3983 :
3984 : goto _02d3;
3985 :
3986 : bp04 = 1;
3987 : }
3988 :
3989 : if (bp04 != 0) {
3990 :
3991 : bp01++;
3992 : di--;
3993 : }
3994 :
3995 : if (di != 0) {
3996 :
3997 : Bit32u bp08 = _4976_4bec;
3998 :
3999 : switch ((si & 0x1f00) >> 8) {
4000 : case 5:
4001 :
4002 : bp08 += recordLink.DBIndex();
4003 :
4004 : goto _020e;
4005 : case 0:
4006 :
4007 : _020e:
4008 : bp01 = bp01 + Bit8u(bp08 % di);
4009 :
4010 : break;
4011 : case 1:
4012 :
4013 : bp01 = bp01 + Bit8u(RAND16(di));
4014 :
4015 : break;
4016 : case 2:
4017 :
4018 : bp01 = bp01 + _4976_4bf6;
4019 :
4020 : break;
4021 : case 3:
4022 :
4023 : si = ADD_ITEM_CHARGE(recordLink, 0);
4024 :
4025 : if (si == 0)
4026 :
4027 : break;
4028 :
4029 : bp01 = (di * si) / (GET_MAX_CHARGE(recordLink) +1) + bp01;
4030 :
4031 : break;
4032 : case 6:
4033 :
4034 : bp08 += recordLink.DBIndex();
4035 :
4036 : goto _027d;
4037 : case 4:
4038 :
4039 : _027d:
4040 : xx = (si & 0x00e0) >> 5;
4041 :
4042 : si = ADD_ITEM_CHARGE(recordLink, 0);
4043 :
4044 : if (si == 0)
4045 :
4046 : break;
4047 :
4048 : bp01 = (((di / xx) * si) / (GET_MAX_CHARGE(recordLink) +1)) * xx + (bp08 % yy) +bp01 +1;
4049 :
4050 : break;
4051 : }
4052 : }
4053 : }
4054 : }
4055 : }
4056 :
4057 : _02d3:
4058 : return bp01;
4059 : }
4060 :
4061 :
4062 : Bit8u *_0b36_0334(Bit8u *localpal, Bit8u cls1, Bit8u cls2, Bit8u cls4, __int16 palentcnt)
4063 : {
4064 :
4065 : ENTER(4);
4066 :
4067 : Bit8u *bp04 = _3e74_506b(cls1, cls2, dt07, cls4);
4068 :
4069 : for (__int16 si = 0; si < palentcnt; si++) {
4070 :
4071 : localpal[si] = bp04[localpal[si]];
4072 :
4073 : }
4074 :
4075 : return localpal;
4076 : }
4077 :
4078 :
4079 : Bit8u *_2405_05b4(Bit16u xx, Bit16u yy, skxxx5 *ref)
4080 : {
4081 :
4082 : ENTER(348);
4083 :
4084 : if (_2759_02d6(xx, _4976_53b4[xx].Possess(yy), yy) == 0) {
4085 :
4086 :
4087 : return NULL;
4088 : }
4089 :
4090 : Bit16u bp0c = _4976_0106 + _4976_010e;
4091 : Bit16u bp0e = _4976_0108 + _4976_0110;
4092 :
4093 : Bit16u bp0a = _3e74_5888();
4094 :
4095 : Bit8u *bp04 = _3e74_57b5(bp0a, bp0c, bp0e, 8);
4096 :
4097 : ObjectID di = _4976_53b4[xx].Possess(yy);
4098 :
4099 : Bit8u bp05;
4100 : Bit8u bp06;
4101 : Bit8u bp07;
4102 : Bit16u bp12;
4103 : if (di == di.FFFF) {
4104 :
4105 : bp05 = 1;
4106 : bp06 = 2;
4107 :
4108 : bp07 = (yy == 1) ? 8 : 6;
4109 : bp12 = 1;
4110 : }
4111 : else {
4112 :
4113 : bp05 = QUERY_CLS1_FROM_RECORD(di);
4114 :
4115 : bp06 = QUERY_CLS2_FROM_RECORD(di);
4116 :
4117 : bp07 = _2405_014a(di, -1, 0);
4118 :
4119 : bp12 = 0;
4120 : }
4121 :
4122 : skxxx4 bp014c;
4123 : _0b36_0520(&bp014c, bp05, bp06, bp07);
4124 :
4125 : _0b36_06d3(&bp014c);
4126 :
4127 : Bit8u bp0f = _4976_4bda[8];
4128 :
4129 : _44c8_1d26(bp04 = _0b36_00c3(bp0a, ref), bp0f);
4130 :
4131 : if (bp12 != 0) {
4132 :
4133 :
4134 : DRAW_DIALOGUE_PICT(
4135 : QUERY_PICT_BITS(&bp014c),
4136 : bp04,
4137 : reinterpret_cast<blit_rc *>(ALLOC_TEMP_ORIGIN_RECT(bp014c.w18, bp014c.w20)),
4138 : 0,
4139 : 0,
4140 : 12,
4141 : bp014c.b58
4142 : );
4143 : }
4144 : else {
4145 :
4146 : Bit8u bp015c[16];
4147 : for (Bit16u si = 0; si < 16; si++) {
4148 :
4149 : bp015c[si] = _4976_4bda[0];
4150 :
4151 : }
4152 :
4153 : DRAW_DIALOGUE_PICT(
4154 : QUERY_PICT_BITS(&bp014c),
4155 : bp04,
4156 : reinterpret_cast<blit_rc *>(ALLOC_TEMP_RECT(_4976_010e, _4976_0110, _4976_0106, _4976_0108)),
4157 : 0,
4158 : 0,
4159 : -1,
4160 : bp015c
4161 : );
4162 :
4163 : _0b36_0334(bp014c.b58, 1, 0, 1, 16);
4164 :
4165 : bp04 = _0b36_00c3(bp0a, ref);
4166 :
4167 :
4168 : DRAW_DIALOGUE_PICT(
4169 : QUERY_PICT_BITS(&bp014c),
4170 : bp04,
4171 : reinterpret_cast<blit_rc *>(ALLOC_TEMP_ORIGIN_RECT(_4976_0106, _4976_0108)),
4172 : 0,
4173 : 0,
4174 : 12,
4175 : bp014c.b58
4176 : );
4177 : }
4178 :
4179 : return bp04;
4180 : }
4181 :
4182 :
4183 : void FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(Bit16u offSrc, Bit16u offDst, Bit16u width, __int16 colorkey)
4184 : {
4185 :
4186 :
4187 : ENTER(0);
4188 :
4189 : const Bit8u *bx = _44c8_077d;
4190 : Bit8u *di = _4976_5e6a + offDst;
4191 : Bit8u dh = Bit8u(colorkey);
4192 : Bit16u cx = width;
4193 : bool carry = (offSrc & 1) ? true : false;
4194 : offSrc >>= 1;
4195 : Bit8u *si = _4976_5e64 + offSrc;
4196 :
4197 : if (carry) {
4198 :
4199 : Bit8u al = *si; si++;
4200 : al &= 0x0f;
4201 : if (al == dh) {
4202 : di++;
4203 : }
4204 : else {
4205 : *di = bx[al]; di++;
4206 : }
4207 :
4208 : if (--cx == 0)
4209 :
4210 : return;
4211 : }
4212 :
4213 : {
4214 :
4215 : bool carry = (cx & 1) ? true : false;
4216 : cx >>= 1;
4217 :
4218 : if (cx != 0) {
4219 :
4220 : do {
4221 : Bit8u al = *si; si++;
4222 : Bit8u ah = al & 0x0f;
4223 : al >>= 4;
4224 : if (al != dh) {
4225 :
4226 : if (ah != dh) {
4227 :
4228 : *di = bx[al]; di++;
4229 : *di = bx[ah]; di++;
4230 :
4231 : continue;
4232 : }
4233 : else {
4234 :
4235 : *di = bx[al]; di++;
4236 : di++;
4237 :
4238 : continue;
4239 : }
4240 : }
4241 :
4242 : else if (ah != dh) {
4243 :
4244 : di++;
4245 : *di = bx[ah]; di++;
4246 :
4247 : continue;
4248 : }
4249 : else {
4250 :
4251 : di++;
4252 : di++;
4253 :
4254 : continue;
4255 : }
4256 :
4257 : } while (--cx != 0);
4258 : }
4259 :
4260 : if (carry) {
4261 :
4262 : Bit8u al = *si; si++;
4263 : al >>= 4;
4264 : if (al != dh) {
4265 : *di = bx[al]; di++;
4266 : }
4267 : }
4268 : }
4269 :
4270 : return;
4271 : }
4272 :
4273 :
4274 : void _44c8_1aca(Bit8u *buff, SRECT *rc, Bit16u xx, Bit16u yy)
4275 : {
4276 :
4277 : ENTER(332);
4278 :
4279 : if (rc != NULL) {
4280 :
4281 : Bit16u bp08 = xx ^ 15;
4282 :
4283 : Bit8u bp014c[320];
4284 : _4976_5e64 = bp014c;
4285 : _4976_5e6a = buff;
4286 :
4287 : Bit16u bp04 = rc->cx;
4288 : Bit16u bp02 = rc->cy;
4289 :
4290 : if (bp04 > 0 && bp02 > 0) {
4291 :
4292 : Bit16u bp06 = (bp04 +1) >> 1;
4293 :
4294 : Bit8u bp0b = Bit8u(xx) << 4 | Bit8u(bp08);
4295 :
4296 : for (Bit16u si = 0; si < bp06; si++) {
4297 :
4298 : bp014c[si] = bp0b;
4299 :
4300 : bp014c[si+160] = bp0b ^ 0xff;
4301 :
4302 : }
4303 :
4304 : Bit16u di = rc->y * yy +rc->x;
4305 :
4306 : Bit16u bp0a = ((di / yy) ^ di) & 1;
4307 :
4308 : for (Bit16u si = 0; si < bp02; si++) {
4309 :
4310 : _4976_5e64 = &bp014c[bp0a * 160];
4311 :
4312 : bp0a ^= 1;
4313 :
4314 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(0, di, bp04, bp08);
4315 :
4316 : di += yy;
4317 :
4318 : }
4319 : }
4320 : }
4321 :
4322 : return;
4323 : }
4324 :
4325 :
4326 : void _0b36_105b(sk3f6c *ref, SRECT *rc, Bit16u xx)
4327 : {
4328 :
4329 : ENTER(8);
4330 :
4331 : if (rc != NULL) {
4332 :
4333 : SRECT bp08;
4334 : _44c8_1aca(
4335 : reinterpret_cast<Bit8u *>(_3e74_5817(ref->w0)),
4336 : _0b36_0fab(ref, rc, &bp08),
4337 : xx,
4338 : ref->w2.cx
4339 : );
4340 :
4341 : _0b36_0d67(ref, rc);
4342 : }
4343 :
4344 : return;
4345 : }
4346 :
4347 :
4348 : void _29ee_026c(Bit16u xx, Bit16u yy, Bit16u zz)
4349 : {
4350 :
4351 : ENTER(48);
4352 :
4353 : _29ee_00a3(0);
4354 :
4355 : sk53b4 *bp04 = &_4976_53b4[xx];
4356 :
4357 : Bit16u si = (yy == 1) ? 0x46 : 0x4a;
4358 :
4359 : si += (bp04->playerPos() +4 - _4976_4bf6) & 3;
4360 :
4361 : SRECT bp10;
4362 : QUERY_EXPANDED_RECT(si, &bp10);
4363 :
4364 : if (bp04->curHP() == 0) {
4365 :
4366 : SRECT bp10;
4367 : _0b36_0ffe(&_4976_3f6c, &bp10, _4976_4bda[0]);
4368 : }
4369 : else {
4370 :
4371 : DRAW_ICON_PICT_ENTRY(0x01, 0x04, (Bit8u(yy) << 1) + Bit8u(zz) +2, &_4976_3f6c, si, -1);
4372 :
4373 : skxxx5 bp30;
4374 : Bit8u *bp08 = _2405_05b4(xx, yy, &bp30);
4375 :
4376 : if (bp08 != NULL) {
4377 :
4378 : SRECT bp18;
4379 : DRAW_ICON_PICT_BUFF(
4380 : bp08,
4381 : &_4976_3f6c,
4382 : CALC_CENTERED_RECT_IN_RECT(&bp18, &bp10, READ_UI16(bp08,-4), READ_UI16(bp08,-2)),
4383 : 0,
4384 : 0,
4385 : _4976_4bda[8],
4386 : 0,
4387 : NULL
4388 : );
4389 :
4390 : _0b36_01cd(&bp30);
4391 : }
4392 :
4393 : if (bp04->b42[yy] != 0 || _4976_4be8 != 0) {
4394 :
4395 : _0b36_105b(&_4976_3f6c, &bp10, 0);
4396 : }
4397 : }
4398 :
4399 : return;
4400 : }
4401 :
4402 :
4403 : void _29ee_058d(Bit16u player, Bit16u yy)
4404 : {
4405 :
4406 : ENTER(324);
4407 :
4408 : _29ee_00a3(0);
4409 :
4410 : Bit16u si = (_4976_53b4[player].playerPos() +4 - _4976_4bf6) & 3;
4411 :
4412 : SRECT bp0a;
4413 : _0b36_0ffe(
4414 : &_4976_3f6c,
4415 : QUERY_EXPANDED_RECT(si + 0x4f, &bp0a),
4416 : _4976_4bda[0]
4417 : );
4418 :
4419 : if (_4976_53b4[player].curHP() != 0) {
4420 :
4421 : Bit16u di = (si == 1 || si == 2) ? 1 : 0;
4422 :
4423 : Bit8u bp01;
4424 : Bit8u bp02;
4425 : if (si <= 1) {
4426 :
4427 : bp01 = 10;
4428 : bp02 = 6;
4429 : }
4430 : else {
4431 :
4432 : bp01 = 12;
4433 : bp02 = 8;
4434 : }
4435 :
4436 : if (player == _4976_3fc6) {
4437 :
4438 : bp01++;
4439 : }
4440 :
4441 : if (yy != 0) {
4442 :
4443 : bp02++;
4444 : }
4445 :
4446 : skxxx4 bp0144;
4447 : _0b36_0520(&bp0144, 0x01, 0x01, bp02);
4448 :
4449 : bp0144.w50 = di;
4450 :
4451 : _0b36_11c0(
4452 : _0b36_06d3(&bp0144),
4453 : &_4976_3f6c,
4454 : si + 0x57,
4455 : 4
4456 : );
4457 :
4458 : if (_4976_4be8 != 0 || _4976_53b4[player].b44 != 0) {
4459 :
4460 : bp0144.rc36.x = _4976_3f6c.w2.x;
4461 : bp0144.rc36.y = _4976_3f6c.w2.y;
4462 :
4463 : _0b36_105b(&_4976_3f6c, &bp0144.rc36, 0);
4464 : }
4465 :
4466 : _0b36_0520(&bp0144, 0x01, 0x04, bp01);
4467 :
4468 : bp0144.w50 = di;
4469 :
4470 : _0b36_11c0(
4471 : _0b36_06d3(&bp0144),
4472 : &_4976_3f6c,
4473 : si + 0x53,
4474 : 4
4475 : );
4476 :
4477 : if (_4976_4be8 != 0) {
4478 :
4479 : bp0144.rc36.x = _4976_3f6c.w2.x;
4480 : bp0144.rc36.y = _4976_3f6c.w2.y;
4481 :
4482 : _0b36_105b(&_4976_3f6c, &bp0144.rc36, 0);
4483 : }
4484 : }
4485 :
4486 : return;
4487 : }
4488 :
4489 :
4490 : void _24a5_0990(ObjectID recordLink, Container *ref);
4491 :
4492 : void _29ee_2048(ObjectID recordLink);
4493 :
4494 : void _29ee_21d8(ObjectID recordLink, Bit16u xx);
4495 :
4496 :
4497 : void _29ee_0396()
4498 : {
4499 :
4500 : ENTER(350);
4501 :
4502 : _29ee_00a3(0);
4503 :
4504 : DRAW_ICON_PICT_ENTRY(0x08, _4976_3df6, 0xf5, &_4976_3f6c, 47, -1);
4505 :
4506 : Bit8u *bp04 = ALLOC_PICT_BUFF(_4976_0118, _4976_011a, afDefault, 4);
4507 :
4508 : SRECT bp14;
4509 : for (Bit16u si = 0; si < _4976_4c3c; si++) {
4510 :
4511 : Bit16u bp06 = _4976_53b4[si].playerPos() +4 - _4976_4bf6;
4512 :
4513 : if (_4976_53b4[si].curHP() == 0 || bp06 +1 == _4976_5dbc)
4514 :
4515 : continue;
4516 :
4517 : __int16 bp0c = 0;
4518 : __int16 bp0a = 0;
4519 :
4520 : Bit16u bp08;
4521 : if (QUERY_BLIT_RECT(bp04, &bp14, bp08 = bp06 +53, &bp0a, &bp0c, -1) == NULL)
4522 :
4523 : continue;
4524 :
4525 : if (_4976_57e8 != 0) {
4526 :
4527 : __int16 di = RAND02();
4528 :
4529 : if (di != 0) {
4530 :
4531 : bp14.y += di -2;
4532 :
4533 : di = RAND02();
4534 :
4535 : if (di != 0) {
4536 :
4537 : bp14.x += di -2;
4538 : }
4539 : }
4540 : }
4541 :
4542 : Bit8u bp015e[16];
4543 : DRAW_ICON_PICT_BUFF(
4544 : QUERY_GDAT_SQUAD_ICON(bp04, Bit8u(si), bp015e),
4545 : &_4976_3f6c,
4546 : &bp14,
4547 : bp0a,
4548 : bp0c,
4549 : 12,
4550 : 0,
4551 : bp015e
4552 : );
4553 :
4554 : if (_4976_53b4[si].w257 == 0)
4555 :
4556 : continue;
4557 :
4558 : skxxx4 bp014e;
4559 : _0b36_06d3(_0b36_0520(&bp014e, 0x01, 0x07, _4976_53b4[si].b256));
4560 :
4561 : bp014e.w4 |= 0x10;
4562 : bp014e.w18 >>= 2;
4563 :
4564 : bp014e.w14 = bp014e.w18 * ((_4976_53b4[si].playerDir() +4 - _4976_4bf6) & 3);
4565 :
4566 : bp014e.w20 >>= 2;
4567 :
4568 : bp014e.w16 = bp014e.w20 * (__int16(_4976_4bec) & 3);
4569 :
4570 : _0b36_11c0(&bp014e, &_4976_3f6c, bp08, 12);
4571 :
4572 : }
4573 :
4574 : FREE_PICT_BUFF(bp04);
4575 :
4576 : if (_4976_4be8 != 0) {
4577 :
4578 : _0b36_105b(
4579 : &_4976_3f6c,
4580 : QUERY_EXPANDED_RECT(47, &bp14),
4581 : 0
4582 : );
4583 : }
4584 :
4585 : return;
4586 : }
4587 :
4588 :
4589 : void DRAW_STRONG_TEXT(Bit8u *buff, Bit16u ww, Bit16u cx, Bit16u xx, Bit16u yy, Bit16u clr1, Bit16u fill, Bit8u *str)
4590 : {
4591 :
4592 :
4593 :
4594 :
4595 :
4596 : ENTER(4);
4597 :
4598 : Bit16u di = xx;
4599 : Bit16u si = yy;
4600 :
4601 : __int16 bp02;
4602 : __int16 bp04;
4603 : if (_3929_03dc(str, &bp02, &bp04) != 0) {
4604 :
4605 : if ((fill & 0x4000) == 0) {
4606 :
4607 : FIRE_FILL_RECT_ANY(
4608 : buff,
4609 : ALLOC_TEMP_RECT(di -1, si -bp04, bp02 +2, bp04 +2),
4610 : fill,
4611 : cx,
4612 : 8
4613 : );
4614 : }
4615 :
4616 : DRAW_STRING(buff, ww, cx, di , si +1, _4976_4bda[0], _4976_4bda[15] | 0x4000, str, 8);
4617 :
4618 : DRAW_STRING(buff, ww, cx, di +1, si +1, _4976_4bda[0], _4976_4bda[15] | 0x4000, str, 8);
4619 :
4620 : DRAW_STRING(buff, ww, cx, di, si, clr1, fill | 0x4000, str, 8);
4621 : }
4622 :
4623 : return;
4624 : }
4625 :
4626 :
4627 : void DRAW_NAME_STR(sk3f6c *ref, Bit16u rectno, Bit16u clr1, Bit8u fill, Bit8u *str)
4628 : {
4629 :
4630 :
4631 :
4632 :
4633 :
4634 : ENTER(12);
4635 :
4636 : __int16 bp02;
4637 : __int16 bp04;
4638 : if (_3929_03dc(str, &bp02, &bp04) != 0) {
4639 :
4640 : SRECT bp0c;
4641 : if (QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1) != NULL) {
4642 :
4643 : DRAW_STRONG_TEXT(
4644 : reinterpret_cast<Bit8u *>(_3e74_5817(ref->w0)),
4645 : ref->w0,
4646 : ref->w2.cx,
4647 : bp0c.x -ref->w2.x,
4648 : bp0c.y +bp0c.cy -1 -ref->w2.y,
4649 : clr1,
4650 : fill,
4651 : str
4652 : );
4653 :
4654 : _0b36_0d67(ref, &bp0c);
4655 : }
4656 : }
4657 :
4658 : return;
4659 : }
4660 :
4661 :
4662 : void _29ee_0713()
4663 : {
4664 :
4665 : ENTER(0);
4666 :
4667 : DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x14, &_4976_3f6c, 60, -1);
4668 :
4669 : DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x0e, &_4976_3f6c, 59, -1);
4670 :
4671 : DRAW_NAME_STR(
4672 : &_4976_3f6c,
4673 : 61,
4674 : (_4976_5366 -1 == _4976_3fc6) ? 9 : 15,
4675 : _4976_4bda[12] | 0x4000,
4676 : _4976_52af[_4976_5366].b0
4677 : );
4678 :
4679 : return;
4680 : }
4681 :
4682 :
4683 : i16 SK_STRLEN(const Bit8u *ref)
4684 : {
4685 :
4686 : ENTER(4);
4687 :
4688 : const Bit8u *bp04 = ref;
4689 :
4690 : while (*(ref++) != 0);
4691 :
4692 : return Bit16u(ref -bp04 -1);
4693 : }
4694 :
4695 :
4696 : void _29ee_093e(Bit16u xx)
4697 : {
4698 :
4699 : ENTER(8);
4700 :
4701 : _29ee_00a3(0);
4702 :
4703 : if (xx != 0) {
4704 :
4705 : DRAW_ICON_PICT_ENTRY(0x01, 0x05, 0x09, &_4976_3f6c, 252, -1);
4706 : }
4707 :
4708 : sk53b4 *bp04 = &_4976_52af[_4976_5366];
4709 :
4710 : Bit8u bp08[2];
4711 : bp08[1] = 0;
4712 :
4713 : Bit16u bp06 = SK_STRLEN(bp04->GetRunes());
4714 :
4715 : Bit16u di = 261;
4716 :
4717 : for (Bit16u si = 0; si < bp06; si++) {
4718 :
4719 : bp08[0] = bp04->GetRunes()[si];
4720 :
4721 : DRAW_SIMPLE_STR(&_4976_3f6c, di++, _4976_4bda[0], _4976_4bda[13] | 0x4000, bp08);
4722 :
4723 : }
4724 :
4725 : return;
4726 : }
4727 :
4728 :
4729 : void _29ee_09d5()
4730 : {
4731 :
4732 : ENTER(10);
4733 :
4734 : sk53b4 *bp04 = &_4976_52af[_4976_5366];
4735 :
4736 : Bit16u bp06 = bp04->b30;
4737 :
4738 : DRAW_ICON_PICT_ENTRY(0x01, 0x05, bp06 +1, &_4976_3f6c, 92, -1);
4739 :
4740 : if (bp06 < 4) {
4741 :
4742 : Bit8u bp0a[2];
4743 : bp0a[1] = 0;
4744 :
4745 : Bit8u bp07 = Bit8u(bp06 * 6) + 0x60;
4746 : Bit16u si = 255;
4747 :
4748 : for (bp06 = 0; bp06 < 6; bp06++) {
4749 :
4750 : bp0a[0] = bp07++;
4751 :
4752 : DRAW_SIMPLE_STR(
4753 : &_4976_3f6c,
4754 : si +1,
4755 : _4976_4bda[0],
4756 : _4976_4bda[13] | 0x4000,
4757 : bp0a
4758 : );
4759 :
4760 : }
4761 : }
4762 :
4763 : _29ee_093e(0);
4764 :
4765 : _29ee_078b();
4766 :
4767 : return;
4768 : }
4769 :
4770 :
4771 : Bit8u *SK_STRSTR(const Bit8u *xx, const Bit8u *yy)
4772 : {
4773 :
4774 : ENTER(10);
4775 :
4776 : Bit8u cl = yy[0];
4777 :
4778 : if (cl != 0) {
4779 :
4780 : Bit8u bp09;
4781 : for (; (bp09 = xx[0]) != 0; xx++) {
4782 :
4783 : if (bp09 == cl) {
4784 :
4785 : const Bit8u *bp04 = xx +1;
4786 : const Bit8u *bp08 = yy +1;
4787 :
4788 : while (bp08[0] != 0 && bp04[0] == bp08[0]) {
4789 :
4790 : bp04++;
4791 : bp08++;
4792 :
4793 : }
4794 :
4795 : if (bp08[0] == 0) {
4796 :
4797 : return const_cast<Bit8u *>(yy);
4798 : }
4799 : }
4800 :
4801 : }
4802 : }
4803 :
4804 : return NULL;
4805 : }
4806 :
4807 :
4808 : Bit16u QUERY_CMDSTR_TEXT(const Bit8u *cmdStr, const Bit8u *name)
4809 : {
4810 :
4811 :
4812 :
4813 :
4814 :
4815 :
4816 :
4817 : ENTER(2);
4818 :
4819 : __int16 si = 0;
4820 : while ((cmdStr = SK_STRSTR(cmdStr, name)) != NULL) {
4821 :
4822 : cmdStr += SK_STRLEN(name);
4823 :
4824 : if (cmdStr[0] == '=') {
4825 :
4826 : cmdStr++;
4827 : }
4828 :
4829 : Bit16u di = 0;
4830 :
4831 : if (cmdStr[0] == '-') {
4832 :
4833 : cmdStr++;
4834 : di = 1;
4835 : }
4836 :
4837 : Bit8u bp01;
4838 : while ((bp01 = cmdStr[0]) >= '0' && bp01 <= '9') {
4839 :
4840 : si = bp01 +(si * 10) - '0';
4841 : cmdStr++;
4842 :
4843 : }
4844 :
4845 : if (di != 0) {
4846 :
4847 : si = -si;
4848 : }
4849 :
4850 : }
4851 :
4852 : return si;
4853 : }
4854 :
4855 :
4856 : Bit16u QUERY_CMDSTR_ENTRY(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit16u cmdNum)
4857 : {
4858 :
4859 : ENTER(132);
4860 :
4861 : Bit8u bp0084[128];
4862 : Bit8u *bp04;
4863 : if (cmdNum >= 18 || *(bp04 = QUERY_GDAT_TEXT(cls1, cls2, cls4, bp0084)) == 0) {
4864 :
4865 : return 0;
4866 : }
4867 : else {
4868 :
4869 : return QUERY_CMDSTR_TEXT(bp04, _4976_3f32[cmdNum]);
4870 : }
4871 : }
4872 :
4873 :
4874 : Missile *GET_MISSILE_REF_OF_MINION(ObjectID rlCreature, ObjectID rlContainer)
4875 : {
4876 :
4877 :
4878 :
4879 :
4880 : ENTER(4);
4881 :
4882 : ObjectID di = rlCreature;
4883 :
4884 : if (di == di.FFFF || di == di.FFFE)
4885 :
4886 :
4887 : return NULL;
4888 :
4889 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(di);
4890 :
4891 : if (bp04->w0 == ObjectID::FFFF)
4892 :
4893 :
4894 : return NULL;
4895 :
4896 : ObjectID si = bp04->GetPossessionObject();
4897 :
4898 : while (si != si.FFFE) {
4899 :
4900 : if (si.DBType() == dbMissile) {
4901 :
4902 : Missile *bp04 = GET_ADDRESS_OF_RECORDE(si);
4903 :
4904 : if (rlContainer == rlContainer.FFFF || bp04->GetMissileObject() == rlContainer) {
4905 :
4906 : return bp04;
4907 : }
4908 : }
4909 :
4910 : si = GET_NEXT_RECORD_LINK(si);
4911 :
4912 : }
4913 :
4914 : return NULL;
4915 : }
4916 :
4917 :
4918 : Bit16u _2759_01fe(Bit16u player, ObjectID recordLink, Bit16u cmdNum)
4919 : {
4920 :
4921 : ENTER(8);
4922 :
4923 : ObjectID di = recordLink;
4924 : Bit16u si = cmdNum;
4925 :
4926 : if (di == di.FFFF) {
4927 :
4928 : return 0;
4929 : }
4930 :
4931 : if (di.DBType() == dbContainer) {
4932 :
4933 : Container *bp04 = GET_ADDRESS_OF_RECORD9(di);
4934 :
4935 : if (bp04->ContainerType() == 1) {
4936 :
4937 : Bit16u bp08 = bp04->b5_5_7();
4938 :
4939 : if (false
4940 : || bp08 == 1
4941 : || bp08 == 2
4942 : ) {
4943 :
4944 : if (GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), di) != NULL) {
4945 :
4946 : if (si == CmKillMinion)
4947 :
4948 :
4949 : return 1;
4950 :
4951 : if (bp08 != 2)
4952 :
4953 :
4954 :
4955 : return 0;
4956 :
4957 : Bit8u bp05 = GET_ADDRESS_OF_RECORD4(bp04->GetContainedObject())->CreatureType();
4958 :
4959 : if (bp05 == 51) {
4960 :
4961 : if (si != CmCallCarry)
4962 :
4963 :
4964 :
4965 : return 0;
4966 :
4967 :
4968 : return 1;
4969 : }
4970 :
4971 : if (bp05 != 50)
4972 :
4973 :
4974 :
4975 : return 0;
4976 :
4977 : if (si != CmCallFetch)
4978 :
4979 :
4980 :
4981 : return 0;
4982 :
4983 :
4984 : return 1;
4985 : }
4986 :
4987 : if (si != CmCallScout && si != CmMark && (bp04->w6 == 0xffff || (si != CmCallCarry && si != CmCallFetch))) {
4988 :
4989 :
4990 : return 0;
4991 : }
4992 : }
4993 : else {
4994 :
4995 :
4996 : return 0;
4997 : }
4998 : }
4999 : }
5000 :
5001 : return 1;
5002 : }
5003 :
5004 :
5005 : __int16 _2759_04c0(__int16 player, __int16 yy)
5006 : {
5007 :
5008 : ENTER(0);
5009 :
5010 : __int16 di = player;
5011 :
5012 : if (yy == 1) {
5013 :
5014 : if (_4976_53b4[di].Possess(12) != ObjectID::FFFF) {
5015 :
5016 : return 12;
5017 : }
5018 :
5019 : for (__int16 si = 7; si <= 9; si++) {
5020 :
5021 : if (_4976_53b4[di].Possess(si) != ObjectID::FFFF) {
5022 :
5023 : return si;
5024 : }
5025 :
5026 : }
5027 : }
5028 :
5029 : else if (yy == 0) {
5030 :
5031 : if (_4976_53b4[di].Possess(11) != ObjectID::FFFF) {
5032 :
5033 : return 11;
5034 : }
5035 :
5036 : if (_4976_53b4[di].Possess(6) != ObjectID::FFFF) {
5037 :
5038 : return 6;
5039 : }
5040 : }
5041 :
5042 : return -1;
5043 : }
5044 :
5045 :
5046 : Bit16u _2c1d_0a47(__int16 player, Bit16u xx, Bit16u yy)
5047 : {
5048 :
5049 : ENTER(8);
5050 :
5051 : U16 di = xx;
5052 :
5053 : if (_4976_4be8 != 0) {
5054 :
5055 : return 1;
5056 : }
5057 :
5058 : sk53b4 *bp04 = &_4976_53b4[player];
5059 :
5060 : __int32 bp08 = bp04->dw93[di];
5061 :
5062 : if (di > 3) {
5063 :
5064 : bp08 += (bp04->dw93[(di -4) >> 2]) * ((yy != 0) ? __int16(bp04->b173[(di -4) >> 2]) : 1);
5065 :
5066 : bp08 >>= 1;
5067 : }
5068 :
5069 : Bit16u si = 1;
5070 :
5071 : while (bp08 >= 512U) {
5072 :
5073 : bp08 >>= 1; si++;
5074 :
5075 : }
5076 :
5077 : if (yy != 0) {
5078 :
5079 : si = max_value(1, bp04->b173[di] + si);
5080 : }
5081 :
5082 : return si;
5083 : }
5084 :
5085 :
5086 : Bit16u _2759_02d6(Bit16u player, ObjectID recordLink, __int16 yy)
5087 : {
5088 :
5089 : ENTER(14);
5090 :
5091 : ObjectID si = recordLink;
5092 : Bit8u bp01;
5093 : Bit8u bp02;
5094 : if (recordLink == ObjectID::FFFF) {
5095 :
5096 : bp01 = 0x16;
5097 : bp02 = _4976_53b4[player].HeroType();
5098 : }
5099 : else {
5100 :
5101 : if (IS_CONTAINER_MONEYBOX(si) != 0 || IS_CONTAINER_CHEST(si) != 0)
5102 :
5103 : return 1;
5104 :
5105 : bp01 = QUERY_CLS1_FROM_RECORD(si);
5106 : bp02 = QUERY_CLS2_FROM_RECORD(si);
5107 : }
5108 :
5109 :
5110 : __int16 di = 0;
5111 : for (Bit8u bp03 = 8; bp03 < 12; bp03++) {
5112 :
5113 : if (di >= 3)
5114 :
5115 : break;
5116 :
5117 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtText, bp03) == 0)
5118 :
5119 : continue;
5120 :
5121 : Bit16u bp0a = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnCM);
5122 :
5123 : if (bp0a == 0)
5124 :
5125 : continue;
5126 :
5127 : Bit16u bp0e = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnWH);
5128 :
5129 : if (bp0e != 0 && bp0e -1 != yy)
5130 :
5131 : continue;
5132 :
5133 : if (si != ObjectID::FFFF) {
5134 :
5135 : if (_2759_01fe(player, si, bp0a) == 0)
5136 :
5137 : continue;
5138 :
5139 : __int16 bp0c = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnNC);
5140 :
5141 : if (bp0c == 18) {
5142 :
5143 : if (ADD_ITEM_CHARGE(si, 0) == 0) {
5144 :
5145 : goto _0425;
5146 : }
5147 :
5148 : continue;
5149 : }
5150 :
5151 : if (bp0c == 16 || bp0c == 17)
5152 :
5153 : bp0c = 1;
5154 :
5155 : if (bp0c == 0)
5156 :
5157 : goto _0425;
5158 :
5159 : if (ADD_ITEM_CHARGE(si, 0) >= bp0c)
5160 :
5161 : goto _0425;
5162 :
5163 : continue;
5164 : }
5165 :
5166 : if (bp0a == 17) {
5167 :
5168 : if (_2759_04c0(player, yy) < 0)
5169 :
5170 : continue;
5171 : }
5172 :
5173 : _0425:
5174 : Bit16u bp08 = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnSK);
5175 :
5176 : Bit16u bp06 = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnLV);
5177 :
5178 : if (_2c1d_0a47(player, bp08, 1) >= bp06) {
5179 :
5180 : _4976_5358[di].b0 = bp01;
5181 :
5182 : _4976_5358[di].b1 = bp02;
5183 :
5184 : _4976_5358[di].b2 = bp03;
5185 :
5186 : di++;
5187 : }
5188 :
5189 : }
5190 :
5191 : _4976_53a4 = di;
5192 : _4976_5368 = si;
5193 :
5194 : if (IS_CONTAINER_MAP(si) != 0)
5195 :
5196 :
5197 : return 1;
5198 :
5199 : if (di > 0)
5200 :
5201 : return 1;
5202 :
5203 : return 0;
5204 : }
5205 :
5206 :
5207 : void _1031_0ba4(Bit16u xx, Bit16u yy, Bit16u zz)
5208 : {
5209 :
5210 : ENTER(0);
5211 :
5212 : Bit16u di = zz;
5213 :
5214 : if (_4976_19a7 == 0) {
5215 :
5216 : _4976_19a7 = 1;
5217 :
5218 : }
5219 : else {
5220 :
5221 : _4976_4e9a = 1;
5222 :
5223 : _4976_4e4a = xx;
5224 : _4976_4e4c = yy;
5225 : _4976_4e6a = di;
5226 :
5227 : return;
5228 : }
5229 :
5230 : __int16 cx = ((di == 4 && _4976_19af == 0) || di == 0x0040 || di == 0x0060) ? 9 : 7;
5231 :
5232 : _4976_19af = 0;
5233 :
5234 : __int16 si = _4976_19a5 +1;
5235 :
5236 : if (si > 10) {
5237 :
5238 : si -= 11;
5239 : }
5240 :
5241 : if (_4976_4e00 >= cx) {
5242 :
5243 : if (di == 2) {
5244 :
5245 : _4976_19af = 1;
5246 : }
5247 : }
5248 : else {
5249 :
5250 : _4976_4e00++;
5251 :
5252 : _4976_19a5 = si;
5253 :
5254 : _4976_4e02[si].w0 = di;
5255 :
5256 : _4976_4e02[si].w2 = xx;
5257 :
5258 : _4976_4e02[si].w4 = yy;
5259 : }
5260 :
5261 : _4976_19a7 = 0;
5262 :
5263 : return;
5264 : }
5265 :
5266 :
5267 : void _1031_0b7e()
5268 : {
5269 :
5270 : ENTER(0);
5271 :
5272 : if (_4976_4e9a != 0) {
5273 :
5274 : _4976_4e9a = 0;
5275 :
5276 : _1031_0ba4(_4976_4e4a, _4976_4e4c, _4976_4e6a);
5277 : }
5278 :
5279 : return;
5280 : }
5281 :
5282 :
5283 : void _1031_098e()
5284 : {
5285 :
5286 : ENTER(0);
5287 :
5288 : while (_476d_05a9() != 0)
5289 :
5290 : _476d_050e();
5291 :
5292 : _4976_19a7 = 1;
5293 :
5294 : __int16 di = _4976_4ea6;
5295 :
5296 : __int16 si = _4976_19a5 +1;
5297 :
5298 : if (si > 10) {
5299 :
5300 : si = 0;
5301 : }
5302 :
5303 : if (si != di) {
5304 :
5305 : si = di;
5306 : _4976_4e00 = 0;
5307 :
5308 : while (true) {
5309 :
5310 : if (false
5311 : || _4976_4e02[si].w0 == 0x0040
5312 : || _4976_4e02[si].w0 == 0x0060
5313 : || _4976_4e02[si].w0 == 0x0004
5314 : ) {
5315 :
5316 : _4976_4e02[di] = _4976_4e02[si];
5317 :
5318 : di++;
5319 :
5320 : if (di > 10)
5321 :
5322 : di = 0;
5323 :
5324 : _4976_4e00++;
5325 : }
5326 :
5327 : if (si == _4976_19a5)
5328 :
5329 : break;
5330 :
5331 : si++;
5332 :
5333 : if (si > 10)
5334 :
5335 : si = 0;
5336 :
5337 : continue;
5338 : }
5339 :
5340 : if (di-- == 0) {
5341 :
5342 : di = 10;
5343 : }
5344 :
5345 : _4976_19a5 = di;
5346 : }
5347 :
5348 : _4976_4e62 = 0;
5349 : _4976_4e60 = 0;
5350 : _4976_4e5e = 0;
5351 : _4976_4df8 = 0xffff;
5352 : _4976_4e44 = 0xffff;
5353 : _4976_4e66 = 0;
5354 : _4976_4e68 = 0;
5355 : _4976_4dfa = 0;
5356 : _4976_4dfc = 0;
5357 : _4976_19a7 = 0;
5358 :
5359 : _1031_0b7e();
5360 :
5361 : return;
5362 : }
5363 :
5364 :
5365 : Bit8u *_1031_023b(sk1891 *xx)
5366 : {
5367 :
5368 : ENTER(0);
5369 :
5370 : return &_4976_169c[xx->w2];
5371 : }
5372 :
5373 :
5374 : void _443c_087c()
5375 : {
5376 :
5377 : ENTER(0);
5378 :
5379 : _01b0_07f8();
5380 :
5381 : return;
5382 : }
5383 :
5384 :
5385 : void _443c_0889()
5386 : {
5387 :
5388 : ENTER(0);
5389 :
5390 : _01b0_080b();
5391 :
5392 : return;
5393 : }
5394 :
5395 :
5396 : void _443c_00a9(sk0ce0 *ref, i16 x, i16 cx, i16 y, i16 cy)
5397 : {
5398 :
5399 : ENTER(0);
5400 :
5401 : _4976_5da4 = ref;
5402 :
5403 : _4976_5da8 = _4976_5d98 = x;
5404 :
5405 : _4976_5db2 = cx;
5406 :
5407 : _4976_5d9c = _4976_5db2 -x +1;
5408 :
5409 : _4976_5daa = _4976_5d9a = y;
5410 :
5411 : _4976_5db4 = cy;
5412 :
5413 : _4976_5d9e = _4976_5db4 -y +1;
5414 :
5415 : _01b0_0ca4(&_4976_5d98, 0x20);
5416 :
5417 : return;
5418 : }
5419 :
5420 :
5421 : void _443c_06b4(sk0ce0 *ref)
5422 : {
5423 :
5424 : ENTER(8);
5425 :
5426 : if ((ref->b3 & 0x80) == 0) {
5427 :
5428 : ref->b3 |= 0x80;
5429 :
5430 : skxxx7 *bp08 = _4976_5dae;
5431 :
5432 : skxxx8 *bp04 = _4976_5dae->pv0;
5433 :
5434 : while (bp04 != NULL && (bp04->b3 & 0x0f) > (ref->b3 & 0x0f)) {
5435 :
5436 : bp08 = bp04->pv6;
5437 :
5438 : bp04 = bp08->pv0;
5439 :
5440 : }
5441 :
5442 : _443c_087c();
5443 :
5444 : ref->pv6->pv0 = bp04;
5445 :
5446 : bp08->pv0 = ref;
5447 :
5448 : {
5449 :
5450 : SRECT *bp04 = &ref->pv6->rc4;
5451 :
5452 : QUERY_EXPANDED_RECT(ref->w0 & 0x3fff, bp04);
5453 :
5454 : if ((ref->w0 & 0x8000) != 0) {
5455 :
5456 : bp04->x = _4976_00e8;
5457 : bp04->y = _4976_00ea;
5458 : }
5459 :
5460 : if (ref->b5 != 0) {
5461 :
5462 : _443c_00a9(
5463 : ref,
5464 : bp04->x,
5465 : bp04->x + bp04->cx -1,
5466 : bp04->y,
5467 : bp04->y + bp04->cy -1
5468 : );
5469 : }
5470 :
5471 : _443c_0889();
5472 :
5473 : _443c_040e();
5474 : }
5475 : }
5476 :
5477 : return;
5478 : }
5479 :
5480 :
5481 : void _443c_07d5(sk0ce0 *ref)
5482 : {
5483 :
5484 : ENTER(8);
5485 :
5486 : if ((ref->b3 & 0x80) != 0) {
5487 :
5488 : ref->b3 &= 0x7f;
5489 :
5490 : skxxx7 *bp08 = _4976_5dae;
5491 :
5492 : skxxx8 *bp04 = _4976_5dae->pv0;
5493 :
5494 : while (bp04 != ref) {
5495 :
5496 : if (bp04 == NULL) {
5497 :
5498 : return;
5499 : }
5500 :
5501 : bp08 = bp04->pv6;
5502 :
5503 : bp04 = bp08->pv0;
5504 :
5505 : }
5506 :
5507 : _443c_087c();
5508 :
5509 : bp08->pv0 = bp04->pv6->pv0;
5510 :
5511 : _443c_0889();
5512 :
5513 : _443c_040e();
5514 : }
5515 :
5516 : return;
5517 : }
5518 :
5519 :
5520 : void _1031_0541(Bit16u xx)
5521 : {
5522 :
5523 : ENTER(12);
5524 :
5525 : if (xx != _4976_19ad) {
5526 :
5527 : _1031_098e();
5528 : }
5529 :
5530 : _4976_19ad = xx;
5531 :
5532 : _1031_027e(&_4976_1891[_4976_19ad]);
5533 :
5534 : sk16ed *bp04 = _4976_16ed;
5535 :
5536 : for (__int16 di = 0; di < 60; bp04++, di++) {
5537 :
5538 : Bit16u si = bp04->b6;
5539 :
5540 : if (!(si & 0x40) != !(si & 0x80)) {
5541 :
5542 : if ((si & 0x80) != 0) {
5543 :
5544 : if ((si &= 0x3f) != 0) {
5545 :
5546 : _4976_0ce0[si].b3 |= 0x20;
5547 : }
5548 :
5549 : bp04->b6 = bp04->b6 & 0x7f;
5550 : }
5551 : else {
5552 :
5553 : if ((si &= 0x3f) != 0) {
5554 :
5555 : _4976_0ce0[si].b3 |= 0x10;
5556 : }
5557 :
5558 : bp04->b6 |= 0x80;
5559 : }
5560 : }
5561 :
5562 : bp04->b6 = bp04->b6 & 0xbf;
5563 :
5564 : }
5565 :
5566 : sk0ce0 *bp08 = &_4976_0ce0[1];
5567 :
5568 : for (i16 di = 0; di < 18; bp08++, di++) {
5569 :
5570 : i16 bp0a = (bp08->b3 & 0x10);
5571 :
5572 : i16 bp0c = (bp08->b3 & 0x20);
5573 :
5574 : if ((!bp0a) != (!bp0c)) {
5575 :
5576 : if (bp0a != 0) {
5577 :
5578 : _443c_06b4(bp08);
5579 : }
5580 : else {
5581 :
5582 : _443c_07d5(bp08);
5583 : }
5584 : }
5585 :
5586 : bp08->b3 = bp08->b3 & 0xcf;
5587 :
5588 : }
5589 :
5590 : return;
5591 : }
5592 :
5593 :
5594 : void _1031_0667()
5595 : {
5596 :
5597 : ENTER(0);
5598 :
5599 : _1031_0541(_4976_19ad);
5600 : }
5601 :
5602 :
5603 : Bit8u *QUERY_CMDSTR_NAME(Bit8u cls1, Bit8u cls2, Bit8u cls4)
5604 : {
5605 :
5606 :
5607 :
5608 : ENTER(134);
5609 :
5610 : Bit8u bp0086[128];
5611 : Bit8u *bp04 = QUERY_GDAT_TEXT(cls1, cls2, cls4, bp0086);
5612 :
5613 : if (*bp04 == 0) {
5614 :
5615 : return NULL;
5616 : }
5617 :
5618 : Bit8u bp05;
5619 : for (Bit16u si = 0; (bp05 = *(bp04++)) != ':' && bp05 != 0; si++) {
5620 :
5621 : _4976_5302[si] = bp05;
5622 : }
5623 :
5624 : _4976_5302[si] = 0;
5625 :
5626 : return _4976_5302;
5627 : }
5628 :
5629 :
5630 : void _29ee_0a7b(Bit16u xx, Bit8u yy)
5631 : {
5632 :
5633 :
5634 : Bit16u si = xx;
5635 :
5636 : _29ee_00a3(0);
5637 :
5638 : if (_4976_5356 != 0) {
5639 :
5640 : DRAW_ICON_PICT_ENTRY(0x14, _4976_53ae, ((_4976_5358[si].b2 +0xf8) << 1) +yy +0x41, &_4976_3f6c, si +110, -1);
5641 : }
5642 : else {
5643 :
5644 : DRAW_ICON_PICT_ENTRY(0x01, 0x04, yy +0x15, &_4976_3f6c, si +63, -1);
5645 :
5646 : DRAW_NAME_STR(
5647 : &_4976_3f6c,
5648 : si +66,
5649 : _4976_4bda[15],
5650 : _4976_4bda[0] | 0x4000,
5651 : QUERY_CMDSTR_NAME(_4976_5358[si].b0, _4976_5358[si].b1, _4976_5358[si].b2)
5652 : );
5653 : }
5654 :
5655 :
5656 : return;
5657 : }
5658 :
5659 :
5660 : void _29ee_0b2b()
5661 : {
5662 :
5663 :
5664 : for (Bit16u si = 0; si < _4976_53a4; si++) {
5665 :
5666 : _29ee_0a7b(si, 0);
5667 :
5668 : }
5669 :
5670 : _29ee_078b();
5671 :
5672 : }
5673 :
5674 :
5675 : void _29ee_1d03(Bit16u xx)
5676 : {
5677 :
5678 : ENTER(6);
5679 :
5680 : Bit16u si = xx;
5681 :
5682 : _29ee_00a3(0);
5683 :
5684 : if (_4976_5366 > 0 && (_4976_5356 & 0x0800) != 0) {
5685 :
5686 : si ^= _4976_5356;
5687 : si &= 15;
5688 :
5689 : Bit8u bp06[2];
5690 : bp06[1] = 0;
5691 : Bit16u bp02 = 0;
5692 :
5693 : for (; bp02 < 4; bp02++) {
5694 :
5695 : Bit8u bp03 = 0x49;
5696 :
5697 : if ((si & 0x0001) != 0) {
5698 :
5699 : bp03++;
5700 : }
5701 :
5702 : si >>= 1;
5703 :
5704 : DRAW_ICON_PICT_ENTRY(0x14, _4976_53ae, bp03, &_4976_3f6c, bp02 +101, -1);
5705 :
5706 : bp06[0] = bp02 +0x72;
5707 :
5708 : DRAW_SIMPLE_STR(&_4976_3f6c, bp02 +105, _4976_4bda[0], _4976_4bda[2] | 0x4000, bp06);
5709 :
5710 : }
5711 : }
5712 :
5713 : return;
5714 : }
5715 :
5716 :
5717 : __int16 _0cee_073e(__int16 xx, __int16 yy, __int16 ww, GenericRecord **ref)
5718 : {
5719 :
5720 : ENTER(6);
5721 :
5722 : for (__int16 si = 0; si <= 3; si++) {
5723 :
5724 : ObjectID bp06;
5725 : bp06 = GET_TILE_RECORD_LINK(xx + _4976_0232[si], yy + _4976_023a[si]);
5726 :
5727 : Bit16u di;
5728 : for (; bp06 != bp06.FFFE && (di = bp06.DBType()) <= dbActuator; bp06 = GET_NEXT_RECORD_LINK(bp06)) {
5729 :
5730 : if (di == dbActuator || di == dbText) {
5731 :
5732 : GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(bp06);
5733 :
5734 : if (di == dbActuator) {
5735 :
5736 : Actuator *bp04 = _bp04->castToActuator();
5737 : if (bp04->ActuatorType() == 0x001c) {
5738 :
5739 : if (_4976_4dba[bp04->ActuatorData()].Level() - _4976_4d0a->Level() == ww) {
5740 :
5741 : *ref = _bp04;
5742 :
5743 : return si;
5744 : }
5745 : }
5746 : }
5747 : else {
5748 :
5749 : Text *bp04 = _bp04->castToText();
5750 : if (true
5751 : && bp04->TextMode() == 1
5752 : && (bp04->SimpleTextExtUsage() == 6 || bp04->SimpleTextExtUsage() == 7)
5753 : ) {
5754 :
5755 : di = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp04->OrnateIndex(), dtWordValue, 0x11);
5756 :
5757 : if ((ww == -1 && di != 0) || (ww == 1 && di == 0)) {
5758 :
5759 : *ref = NULL;
5760 :
5761 :
5762 : return si;
5763 : }
5764 : }
5765 : }
5766 : }
5767 :
5768 : }
5769 :
5770 : }
5771 :
5772 : *ref = NULL;
5773 :
5774 : return -1;
5775 : }
5776 :
5777 :
5778 : Bit16u _19f0_124b(__int16 *xx, __int16 *yy, Bit16u ww, __int16 ss, Bit16u tt)
5779 : {
5780 :
5781 : ENTER(8);
5782 :
5783 : Bit16u bp04 = 0;
5784 : __int16 di = -1;
5785 :
5786 : CHANGE_CURRENT_MAP_TO(ww);
5787 :
5788 : Bit16u si = GET_TILE_VALUE(*xx, *yy);
5789 :
5790 : Bit16u bp02 = si >> 5;
5791 :
5792 : if (bp02 == ttStairs) {
5793 :
5794 : if ((tt & 0x0100) == 0)
5795 :
5796 :
5797 : return di;
5798 :
5799 :
5800 : if ((((si & 0x0004) != 0) ? ((ss == -1) ? 1 : 0) : ((ss == 1) ? 1 : 0)) == 0) {
5801 :
5802 :
5803 : return di;
5804 : }
5805 : }
5806 :
5807 : else if (bp02 != 2 || (tt & 0x0008) == 0 || (ss != -1) || (si & 0x0008) == 0 || (si & 0x0001) != 0) {
5808 :
5809 : if ((si & 0x0002) == 0 || bp02 == 0 || bp02 == 7 || bp02 == 4)
5810 :
5811 :
5812 : return di;
5813 :
5814 :
5815 : GenericRecord *bp08;
5816 : if ((tt & 0x0100) == 0 || _0cee_073e(*xx, *yy, ss, &bp08) < 0) {
5817 :
5818 : if ((tt & 0x0010) == 0 || ss != -1)
5819 :
5820 :
5821 : return di;
5822 :
5823 : bp04 = 1;
5824 : }
5825 : }
5826 :
5827 : di = _0cee_0510(ww, ss, xx, yy, NULL);
5828 :
5829 : if (di < 0 || bp04 == 0)
5830 :
5831 :
5832 : return di;
5833 :
5834 : CHANGE_CURRENT_MAP_TO(di);
5835 :
5836 : si = GET_TILE_VALUE(*xx, *yy);
5837 :
5838 : bp02 = si >> 5;
5839 :
5840 : if (bp02 == ttPit && (si & 0x0008) != 0 && (si & 0x0001) != 0)
5841 :
5842 : di = -1;
5843 :
5844 : CHANGE_CURRENT_MAP_TO(ww);
5845 :
5846 : return di;
5847 : }
5848 :
5849 :
5850 : void _29ee_18eb(Bit16u xx, Bit16u yy, Bit16u zz)
5851 : {
5852 :
5853 : ENTER(0);
5854 :
5855 : _4976_536a = _4976_5320 = _4976_5328 = xx;
5856 : _4976_536c = _4976_5322 = _4976_532a = yy;
5857 : _4976_5318 = zz;
5858 :
5859 : _4976_533c = _19f0_124b(&_4976_5328, &_4976_532a, _4976_5318, -1, 0x0110);
5860 :
5861 : _4976_533e = _19f0_124b(&_4976_5320, &_4976_5322, _4976_5318, 1, 0x0108);
5862 :
5863 : return;
5864 : }
5865 :
5866 :
5867 : void _0cee_02dd(__int16 ww, __int16 xx, __int16 yy, __int16 *ss, __int16 *tt)
5868 : {
5869 :
5870 : ENTER(0);
5871 :
5872 : __int16 si = ww;
5873 :
5874 : *ss += _4976_0232[si] * xx;
5875 :
5876 : *tt += _4976_023a[si] * xx;
5877 :
5878 : si = (si +1) & 3;
5879 :
5880 : *ss += _4976_0232[si] * yy;
5881 :
5882 : *tt += _4976_023a[si] * yy;
5883 :
5884 : return;
5885 : }
5886 :
5887 :
5888 : Bit16u IS_WALL_ORNATE_ALCOVE(Bit8u cls2)
5889 : {
5890 :
5891 :
5892 :
5893 :
5894 :
5895 : ENTER(0);
5896 :
5897 : if (cls2 == 0xff) {
5898 :
5899 : return 0;
5900 : }
5901 :
5902 : return QUERY_GDAT_ENTRY_DATA_INDEX(0x09, cls2, dtWordValue, 0x0a);
5903 : }
5904 :
5905 :
5906 : Bit16u _0cee_17e7(Bit16u aa, Bit16u bb, Bit16u cc)
5907 : {
5908 :
5909 :
5910 :
5911 : ENTER(0);
5912 :
5913 : return ((((aa * 31417) >> 1) + (bb * 11) + _4976_4d0e->w0) >> 2) % cc;
5914 : }
5915 :
5916 :
5917 : Bit8u _0cee_1815(Bit16u xx, __int16 yy, Bit16u ss, Bit16u tt, Bit16u uu)
5918 : {
5919 :
5920 :
5921 :
5922 : ENTER(0);
5923 :
5924 : if (xx != 0) {
5925 :
5926 : __int16 si = _0cee_17e7(
5927 : (ss << 5) +tt +2000,
5928 : (_4976_0c5a << 6) + _4976_4dd2 + _4976_4dd4 +3000,
5929 : uu
5930 : );
5931 :
5932 : if (si < yy) {
5933 :
5934 : return _4976_4dc2[si];
5935 : }
5936 : }
5937 :
5938 : return 0xff;
5939 : }
5940 :
5941 :
5942 : void _0cee_185a(skxxx6 *ref, Bit16u xx, Bit16u yy, Bit16u zz, Bit16u ww, Bit16u vv, __int16 ss, Bit16u tt)
5943 : {
5944 :
5945 :
5946 :
5947 : ENTER(0);
5948 :
5949 : __int16 di = tt;
5950 :
5951 : Bit16u si = _4976_4d0a->WallGraphicsRandomDecorations();
5952 :
5953 : ref->w6(_0cee_1815(xx, si, ss, (++di) * ((vv & 3) +1), 30));
5954 :
5955 : ref->w8(_0cee_1815(yy, si, ss, di * (((++vv) & 3) +1), 30));
5956 :
5957 : ref->w10(_0cee_1815(zz, si, ss, di * (((++vv) & 3) +1), 30));
5958 :
5959 : ref->w12(_0cee_1815(ww, si, ss, (di--) * (((++vv) & 3) +1), 30));
5960 :
5961 : if (ss < 0 || ss >= _4976_4dd2 || di < 0 || di >= _4976_4dd4) {
5962 :
5963 : for (si = 3; si <= 6; si++) {
5964 :
5965 : if (IS_WALL_ORNATE_ALCOVE(Bit8u(ref->w[si])) != 0) {
5966 :
5967 : ref->w[si] = 0x00ff;
5968 : }
5969 :
5970 : }
5971 : }
5972 :
5973 : return;
5974 : }
5975 :
5976 :
5977 : ObjectID _0cee_1a46(skxxx6 *ref, ObjectID recordLink, __int16 xx, Bit16u yy)
5978 : {
5979 :
5980 : ENTER(24);
5981 :
5982 : Bit16u bp08;
5983 : for (Bit16u bp16 = 0; recordLink != ObjectID::FFFE && (bp08 = recordLink.DBType()) <= dbActuator; recordLink = GET_NEXT_RECORD_LINK(recordLink)) {
5984 :
5985 : Bit16u bp12 = recordLink.Dir();
5986 :
5987 : if ((bp16 & (1 << bp12)) == 0) {
5988 :
5989 : Bit16u bp06 = ((bp12 -xx) & 3) +3;
5990 :
5991 : if (xx == 0 || bp06 == 5) {
5992 :
5993 : Bit16u si = 0;
5994 : Bit16u di = 0;
5995 :
5996 : __int32 bp0c = _4976_4bec;
5997 :
5998 : __int32 bp10 = 0;
5999 :
6000 : GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(recordLink);
6001 :
6002 : Bit8u bp13;
6003 : if (bp08 == 2) {
6004 : Text *bp04 = _bp04->castToText();
6005 :
6006 : switch (bp04->TextMode()) {
6007 : case 0:
6008 :
6009 : _1ad5:
6010 : ref->w[bp06] = 0;
6011 :
6012 : if (bp06 == 5 && bp04->TextVisibility()) {
6013 :
6014 : ref->w14(recordLink);
6015 : }
6016 : else {
6017 :
6018 : ref->w14(ObjectID::FFFF);
6019 : }
6020 :
6021 : bp16 |= 1 << bp12;
6022 :
6023 : continue;
6024 :
6025 : case 1:
6026 :
6027 : Bit8u bp13 = Bit8u(bp04->OrnateIndex());
6028 :
6029 : switch (bp04->SimpleTextExtUsage()) {
6030 : case 14:
6031 : {
6032 :
6033 : goto _1ad5;
6034 : }
6035 : case 5:
6036 : case 13:
6037 : {
6038 :
6039 : if (bp04->TextVisibility() != 0) {
6040 :
6041 : si = 1;
6042 : }
6043 :
6044 : break;
6045 : }
6046 : case 2:
6047 : {
6048 :
6049 : si = 1;
6050 :
6051 : break;
6052 : }
6053 : case 4:
6054 : case 7:
6055 : case 8:
6056 : {
6057 :
6058 : di = bp04->TextVisibility();
6059 :
6060 : if (di != 0) {
6061 :
6062 : si = 1;
6063 :
6064 : bp16 |= 1 << bp12;
6065 : }
6066 :
6067 : break;
6068 : }
6069 : case 0:
6070 : case 6:
6071 : {
6072 :
6073 : break;
6074 : }
6075 : case 1:
6076 : case 3:
6077 : case 9:
6078 : case 10:
6079 : case 11:
6080 : case 12:
6081 : {
6082 :
6083 : continue;
6084 : }
6085 : }
6086 : }
6087 : }
6088 :
6089 : else if (bp08 == 3) {
6090 : Actuator *bp04 = _bp04->castToActuator();
6091 :
6092 : bp13 = GET_WALL_DECORATION_OF_ACTUATOR(bp04);
6093 :
6094 : if (bp13 != 0xff) {
6095 :
6096 : Bit16u bp18 = bp04->ActuatorType();
6097 :
6098 : switch (bp18) {
6099 : case 0x3f:
6100 : {
6101 :
6102 : if (bp06 == 5) {
6103 :
6104 : ref->w14(recordLink);
6105 : }
6106 : else {
6107 :
6108 : ref->w14(ObjectID::FFFF);
6109 : }
6110 :
6111 : break;
6112 : }
6113 : case 0x7e:
6114 : {
6115 :
6116 : if (bp04->OnceOnlyActuator() != 0) {
6117 :
6118 : if (bp06 != 5) {
6119 :
6120 : ref->w14(bp04->ActuatorData());
6121 : }
6122 :
6123 : bp16 |= 1 << bp12;
6124 :
6125 : si = 1;
6126 : }
6127 :
6128 : break;
6129 : }
6130 : case 0x17:
6131 : {
6132 :
6133 : di = bp04->OnceOnlyActuator();
6134 :
6135 : if (di != 0) {
6136 :
6137 : si = 1;
6138 : }
6139 :
6140 : break;
6141 : }
6142 : case 0x18:
6143 : {
6144 :
6145 : di = bp04->w4_0_0() ^ bp04->OnceOnlyActuator();
6146 :
6147 :
6148 : break;
6149 : }
6150 : case 0x1a:
6151 : {
6152 :
6153 : di = bp04->OnceOnlyActuator();
6154 :
6155 : if (di != 0) {
6156 :
6157 : si = 1;
6158 :
6159 : bp16 |= 1 << bp12;
6160 : }
6161 :
6162 : break;
6163 : }
6164 : case 0x1b:
6165 : {
6166 :
6167 : di = bp04->w4_0_0();
6168 :
6169 : if (bp04->OnceOnlyActuator() == di) {
6170 :
6171 : si = 1;
6172 : }
6173 :
6174 : break;
6175 : }
6176 : case 0x32:
6177 : {
6178 :
6179 : if (bp04->w4_0_0() != 0) {
6180 :
6181 : bp0c = bp04->ActuatorData();
6182 :
6183 : si = 1;
6184 : }
6185 :
6186 : break;
6187 : }
6188 : case 0x2c:
6189 : {
6190 :
6191 : if (bp04->w4_0_0() != 0) {
6192 :
6193 : bp10 = bp04->ActuatorData() & 0xff;
6194 :
6195 : si = 1;
6196 : }
6197 :
6198 : break;
6199 : }
6200 : case 0x41:
6201 : {
6202 :
6203 : di = bp04->ActuatorData();
6204 :
6205 :
6206 : break;
6207 : }
6208 : case 0x46:
6209 : {
6210 :
6211 : di = bp04->w4_0_0();
6212 :
6213 : break;
6214 : }
6215 : }
6216 : }
6217 : }
6218 : else {
6219 :
6220 : continue;
6221 : }
6222 :
6223 : if (si != 0) {
6224 :
6225 : di = _0cee_1962(0x09, bp13, bp0c, bp10);
6226 : }
6227 :
6228 : ref->w[bp06] = (di << 10) | bp13;
6229 : }
6230 : }
6231 :
6232 : }
6233 :
6234 : return recordLink;
6235 : }
6236 :
6237 :
6238 : Bit16u _0cee_1962(Bit8u ss, Bit8u tt, Bit32u tick, Bit32u xx)
6239 : {
6240 :
6241 : ENTER(136);
6242 :
6243 : __int16 si = 1;
6244 :
6245 : Bit16u bp06 = 0;
6246 : Bit16u bp08 = 0;
6247 :
6248 : Bit16u di = QUERY_GDAT_ENTRY_DATA_INDEX(ss, tt, dtWordValue, 0x0d);
6249 :
6250 : Bit8u *bp04;
6251 : Bit8u bp0088[128];
6252 : if (di == 0) {
6253 :
6254 : Bit8u *bp04 = QUERY_GDAT_TEXT(ss, tt, 0x0d, bp0088);
6255 :
6256 : if (*bp04 != 0 && (di = SK_STRLEN(bp04)) != 0) {
6257 :
6258 : bp08 = 1;
6259 : }
6260 : else {
6261 :
6262 : di = 1;
6263 : }
6264 : }
6265 : else {
6266 :
6267 : bp04 = NULL;
6268 : bp08 = 1;
6269 :
6270 : if ((di & 0x8000) != 0) {
6271 :
6272 : bp06 = 1;
6273 : }
6274 : }
6275 :
6276 : if (bp08 != 0) {
6277 :
6278 : si = ((tick + xx) / di) +bp06;
6279 :
6280 : if (bp04 != NULL) {
6281 :
6282 : si = *bp04;
6283 :
6284 : if (si >= '0' && si <= '9') {
6285 :
6286 : si -= '0';
6287 : }
6288 :
6289 : if (si >= 'A' && si <= 'Z') {
6290 :
6291 : si -= 'K';
6292 : }
6293 : }
6294 : }
6295 :
6296 : return si;
6297 : }
6298 :
6299 :
6300 : void _0cee_1dbe(skxxx6 *ref, Bit16u ww, Bit16u xx, Bit16u yy)
6301 : {
6302 :
6303 :
6304 :
6305 : ENTER(36);
6306 :
6307 : __int16 si = xx;
6308 :
6309 : ref->w6(0x00ff);
6310 : ref->w8(0x00ff);
6311 : ref->w10(0x00ff);
6312 : ref->w12(0x00ff);
6313 : ref->w14(0x0000);
6314 :
6315 : Bit8u bp05 = GET_TILE_VALUE(xx, yy);
6316 :
6317 : ref->w2(bp05);
6318 :
6319 : ObjectID di = GET_TILE_RECORD_LINK(xx, yy);
6320 :
6321 : ref->w0(bp05 >> 5);
6322 :
6323 : Bit16u bp10;
6324 : Bit16u bp14;
6325 : Bit16u bp0e;
6326 : Bit16u bp0a;
6327 : Bit16u bp08;
6328 : Bit16u bp0c;
6329 : Bit8u bp15;
6330 : __int16 bp18;
6331 : __int16 bp1a;
6332 : Bit16u bp12;
6333 : Bit16u bp1c;
6334 : Bit16u bp1e;
6335 : switch (ref->w0()) {
6336 : case ttWall:
6337 : {
6338 :
6339 : switch (si) {
6340 : case 0:
6341 :
6342 : bp0e = bp05 & 8;
6343 : bp0a = bp05 & 4;
6344 : bp08 = bp05 & 2;
6345 : bp0c = bp05 & 1;
6346 :
6347 : break;
6348 : case 1:
6349 :
6350 : bp0e = bp05 & 4;
6351 : bp0a = bp05 & 2;
6352 : bp08 = bp05 & 1;
6353 : bp0c = bp05 & 8;
6354 :
6355 : break;
6356 : case 2:
6357 :
6358 : bp0e = bp05 & 2;
6359 : bp0a = bp05 & 1;
6360 : bp08 = bp05 & 8;
6361 : bp0c = bp05 & 4;
6362 :
6363 : break;
6364 : case 3:
6365 :
6366 : bp0e = bp05 & 1;
6367 : bp0a = bp05 & 8;
6368 : bp08 = bp05 & 4;
6369 : bp0c = bp05 & 2;
6370 :
6371 : break;
6372 : }
6373 :
6374 : _0cee_185a(ref, bp0e, bp0a, bp08, bp0c, si, xx, yy);
6375 :
6376 : bp10 = 0;
6377 :
6378 : _1efc:
6379 : di = _0cee_1a46(ref, di, si, 0);
6380 :
6381 : if (bp10 != 0 && _4976_4bfa != xx && _4976_4c06 != yy) {
6382 :
6383 : ref->w4(0xfffe);
6384 :
6385 :
6386 : return;
6387 : }
6388 :
6389 : if (bp10 != 0)
6390 :
6391 : break;
6392 :
6393 : for (bp14 = 0; bp14 < 4; bp14++) {
6394 :
6395 : bp18 = xx;
6396 : bp1a = yy;
6397 :
6398 : bp18 += _4976_0232[(si + bp14) & 3];
6399 :
6400 : bp1a += _4976_023a[(si + bp14) & 3];
6401 :
6402 : if ((GET_TILE_VALUE(bp18, bp1a) >> 5) == ttDoor) {
6403 :
6404 : ref->w[bp14 +3] = 0x00ff;
6405 : }
6406 :
6407 : }
6408 :
6409 : break;
6410 : }
6411 : case ttPit:
6412 : {
6413 :
6414 : if ((bp05 & 8) != 0) {
6415 :
6416 : ref->w6(bp05 & 4);
6417 :
6418 : goto _2237;
6419 : }
6420 :
6421 : ref->w0(1);
6422 :
6423 : goto _2000;
6424 : }
6425 : case ttTrickWall:
6426 : {
6427 :
6428 : if ((bp05 & 4) == 0) {
6429 :
6430 : ref->w0(0);
6431 :
6432 : bp0c = bp08 = bp0a = bp0e = (bp05 & 8);
6433 :
6434 : bp10 = 1;
6435 :
6436 : goto _1efc;
6437 : }
6438 :
6439 : bp05 = 1;
6440 :
6441 : ref->w0(bp05);
6442 :
6443 : goto _2000;
6444 : }
6445 : case ttFloor:
6446 : {
6447 :
6448 : _2000:
6449 : bp14 = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4d0a->MapGraphicsStyle(), dtWordValue, 0x6b);
6450 :
6451 : if (bp14 != 0) {
6452 :
6453 : bp15 = Bit8u(bp14);
6454 :
6455 : if ((bp14 & 0x8000) != 0) {
6456 :
6457 : bp12 = _0cee_1962(0x0a, bp15, _4976_4bec, 0);
6458 :
6459 : ref->w10(((bp12 * 10) << 8) | bp15);
6460 :
6461 : }
6462 : else {
6463 :
6464 : ref->w10(bp15);
6465 : }
6466 : }
6467 : if (false) {
6468 :
6469 : _2075:
6470 : bp1c = 0;
6471 : bp12 = 0;
6472 : Bit32u bp20 = _4976_4bec;
6473 : Bit32u bp24 = 0;
6474 :
6475 : GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(di);
6476 : Text *bp04 = _bp04->castToText();
6477 :
6478 : if (si != dbText)
6479 :
6480 : goto _212a;
6481 :
6482 :
6483 : if (bp04->TextMode() == 1) {
6484 :
6485 : bp15 = Bit8u(bp04->OrnateIndex());
6486 :
6487 : switch (bp04->SimpleTextExtUsage()) {
6488 : case 0x11:
6489 : {
6490 :
6491 : bp12 = ((bp05 & 0x08) != 0) ? 1 : 0;
6492 :
6493 : goto _21f4;
6494 : }
6495 : case 0x02:
6496 : {
6497 :
6498 : bp1c = 1;
6499 :
6500 : goto _21f4;
6501 : }
6502 : case 0x05:
6503 : {
6504 :
6505 : if (bp04->TextVisibility() != 0) {
6506 :
6507 : bp1c = 1;
6508 : }
6509 :
6510 : goto _21f4;
6511 : }
6512 : case 0x0f:
6513 : {
6514 :
6515 : bp12 = 1;
6516 :
6517 : goto _21f4;
6518 :
6519 :
6520 : _212a:
6521 : if (si != dbActuator)
6522 :
6523 : break;
6524 :
6525 : Actuator *bp04 = _bp04->castToActuator();
6526 : if (bp04->ActuatorType() == 0x30) {
6527 :
6528 : ref->w12(0);
6529 : }
6530 :
6531 : bp15 = GET_FLOOR_DECORATION_OF_ACTUATOR(bp04);
6532 :
6533 : if (bp15 == 0xff)
6534 :
6535 : break;
6536 :
6537 : switch (bp04->ActuatorType()) {
6538 : case 0x32:
6539 :
6540 : if (bp04->w4_0_0() == 0)
6541 :
6542 : break;
6543 :
6544 : bp20 = bp04->ActuatorData();
6545 :
6546 : bp1e = 0;
6547 : bp1c = 1;
6548 :
6549 : break;
6550 :
6551 : case 0x27:
6552 :
6553 : if (bp04->ActuatorData() -1 != _4976_0c5a)
6554 :
6555 : goto _222f;
6556 :
6557 : if (bp04->w4_0_0() != 0) {
6558 :
6559 : bp1c = 1;
6560 : }
6561 :
6562 : break;
6563 :
6564 : case 0x2c:
6565 :
6566 : if (bp04->w4_0_0() != 0) {
6567 :
6568 : bp24 = bp04->ActuatorData() & 0xff;
6569 : bp1c = 1;
6570 : }
6571 :
6572 : break;
6573 : }
6574 :
6575 : goto _21f4;
6576 : }
6577 : case 0x00:
6578 : case 0x10:
6579 : case 0x0a:
6580 : {
6581 :
6582 : _21f4:
6583 : if (bp1c != 0) {
6584 :
6585 : bp12 = _0cee_1962(0x0a, bp15, bp20, bp24);
6586 : }
6587 :
6588 : ref->w10(((bp12 * 10) << 8) | bp15);
6589 :
6590 : break;
6591 : }
6592 : case 0x01:
6593 : case 0x03:
6594 : case 0x04:
6595 : case 0x06:
6596 : case 0x07:
6597 : case 0x08:
6598 : case 0x09:
6599 : case 0x0b:
6600 : case 0x0c:
6601 : case 0x0d:
6602 : case 0x0e:
6603 : {
6604 : break;
6605 : }
6606 : }
6607 : }
6608 :
6609 : _222f:
6610 : di = GET_NEXT_RECORD_LINK(di);
6611 : }
6612 :
6613 : _2237:
6614 : if (di == di.FFFE)
6615 :
6616 : break;
6617 :
6618 : si = di.DBType();
6619 :
6620 : if (si <= dbActuator)
6621 :
6622 : goto _2075;
6623 :
6624 : break;
6625 : }
6626 : case ttTeleporter:
6627 : {
6628 :
6629 : if ((bp05 & 8) == 0 || (bp05 & 4) == 0) {
6630 :
6631 : ref->w0(1);
6632 : ref->w[1] &= 0xfff7;
6633 : }
6634 :
6635 : goto _2237;
6636 : }
6637 : case ttStairs:
6638 : {
6639 :
6640 : ref->w0((((bp05 & 8) >> 3) == (si & 1)) ? 0x12 : 0x13);
6641 :
6642 : ref->w6(bp05 & 4);
6643 :
6644 : goto _233a;
6645 : }
6646 : case ttDoor:
6647 : {
6648 :
6649 : ref->w6(bp05 & 7);
6650 :
6651 : ref->w8(GET_TILE_RECORD_LINK(xx, yy));
6652 :
6653 : if (((bp05 & 8) >> 3) == (si & 1)) {
6654 :
6655 : ref->w0(0x0010);
6656 : }
6657 : else {
6658 :
6659 : ref->w0(0x0011);
6660 :
6661 : si++;
6662 : si &= 3;
6663 :
6664 : bp18 = xx + _4976_0232[si];
6665 :
6666 : bp1a = yy + _4976_023a[si];
6667 :
6668 : _0cee_1a46(
6669 : ref,
6670 : GET_TILE_RECORD_LINK(bp18, bp1a),
6671 : si,
6672 : 1
6673 : );
6674 : }
6675 :
6676 : goto _233a;
6677 :
6678 : _233a:
6679 : while (di != di.FFFE && di.DBType() <= dbActuator) {
6680 :
6681 : di = GET_NEXT_RECORD_LINK(di);
6682 :
6683 : }
6684 :
6685 : break;
6686 : }
6687 : }
6688 :
6689 : ref->w4(di);
6690 :
6691 : return;
6692 : }
6693 :
6694 :
6695 : __int16 QUERY_4BPP_PICT_BUFF_AND_PAL(Bit8u cls1, Bit8u cls2, Bit8u **ppBuff, Bit8u *localpal)
6696 : {
6697 :
6698 : ENTER(0);
6699 :
6700 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(cls1, cls2, dtImage, 0xf9) != 0) {
6701 :
6702 : *ppBuff = QUERY_GDAT_IMAGE_ENTRY_BUFF(cls1, cls2, 0xf9);
6703 :
6704 : COPY_MEMORY(
6705 : QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, 0xf9),
6706 : localpal,
6707 : 16
6708 : );
6709 :
6710 : return READ_I16(*ppBuff,-4) / _4976_0144;
6711 : }
6712 :
6713 : return 0;
6714 : }
6715 :
6716 :
6717 : void DRAW_CHIP_OF_MAGIC_MAP(Bit8u *buff, Bit16u aa, Bit16u xx, Bit16u yy, Bit16u flipMirror, Bit8u *localpal)
6718 : {
6719 :
6720 :
6721 :
6722 :
6723 : ENTER(12);
6724 :
6725 : Bit16u di = flipMirror;
6726 :
6727 : if (buff != NULL) {
6728 :
6729 : __int16 bp02;
6730 : __int16 bp04;
6731 : SRECT bp0c;
6732 : if (UNION_RECT(SET_SRECT(&bp0c, xx, yy, _4976_0144, _4976_0146), &_4976_53a6, &bp02, &bp04) != NULL) {
6733 :
6734 : __int16 si = _4976_0144 - bp0c.cx;
6735 :
6736 : if (si != 0 && (di & 0x0001) != 0) {
6737 :
6738 : bp02 = (bp02 != 0) ? 0 : si;
6739 : }
6740 :
6741 : si = _4976_0146 - bp0c.cy;
6742 :
6743 : if (si != 0 && (di & 0x0002) != 0) {
6744 :
6745 : bp04 = (bp04 != 0) ? 0 : si;
6746 : }
6747 :
6748 : DRAW_ICON_PICT_BUFF(
6749 : buff,
6750 : &_4976_3f6c,
6751 : &bp0c,
6752 : _4976_0144 * aa +bp02,
6753 : +bp04,
6754 : 10,
6755 : di,
6756 : localpal
6757 : );
6758 : }
6759 : }
6760 :
6761 : return;
6762 : }
6763 :
6764 :
6765 : __int16 _4937_000f(Bit16u xx, Bit16u *yy)
6766 : {
6767 :
6768 : ENTER(0);
6769 :
6770 : return _4976_5fde[_4937_005c(xx, yy)].w0 & 0x03ff;
6771 : }
6772 :
6773 :
6774 : Bit16u _0cee_2df4(ObjectID recordLink)
6775 : {
6776 :
6777 : ENTER(0);
6778 :
6779 : return QUERY_CREATURE_AI_SPEC_FROM_RECORD(recordLink)->w30;
6780 : }
6781 :
6782 :
6783 : Bit16u _48ae_011a(ObjectID recordLink)
6784 : {
6785 :
6786 : ENTER(2);
6787 :
6788 : Bit8u bp01 = QUERY_CLS1_FROM_RECORD(recordLink);
6789 :
6790 : Bit8u bp02 = QUERY_CLS2_FROM_RECORD(recordLink);
6791 :
6792 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x08) != 0) {
6793 :
6794 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x0c) == 0) {
6795 :
6796 : return 3;
6797 : }
6798 :
6799 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x0a) != 0) {
6800 :
6801 : return 1;
6802 : }
6803 :
6804 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x09) != 0) {
6805 :
6806 : return 0;
6807 : }
6808 :
6809 : return 2;
6810 : }
6811 :
6812 : return 0xffff;
6813 : }
6814 :
6815 :
6816 : void _29ee_0d01(ObjectID recordLink, __int16 ss, __int16 tt, __int16 ww, Bit16u aa, Bit16u bb, Bit8u cc, Bit16u dd)
6817 : {
6818 :
6819 : ENTER(108);
6820 :
6821 : Bit16u di = bb;
6822 :
6823 : Bit8u *bp2e = NULL;
6824 :
6825 : skxxx6 bp4c;
6826 : _0cee_1dbe(&bp4c, ww, ss, tt);
6827 :
6828 : Bit8u bp5c[16];
6829 : QUERY_4BPP_PICT_BUFF_AND_PAL(0x08, cc, &bp2e, bp5c);
6830 :
6831 : if ((dd & 0x0010) != 0) {
6832 :
6833 : SRECT bp3c;
6834 : __int16 bp34;
6835 : UNION_RECT(
6836 : SET_SRECT(
6837 : &bp3c,
6838 : aa - _4976_0148,
6839 : di - _4976_014a,
6840 : (_4976_0148 << 1) + _4976_0144,
6841 : (_4976_014a << 1) + _4976_0146
6842 : ),
6843 : &_4976_53a6,
6844 : &bp34,
6845 : &bp34
6846 : );
6847 :
6848 : _0b36_0ffe(&_4976_3f6c, &bp3c, _4976_4bda[8]);
6849 : }
6850 :
6851 : Bit16u bp14 = ((bp4c.w2() >> 5) == ttTrickWall && (bp4c.w2() & 1) != 0) ? 1 : 0;
6852 : Bit16u bp20 = 0;
6853 : __int16 bp0a;
6854 : Bit8u *bp2a;
6855 : Bit8u bp6c[16];
6856 : __int16 bp0e;
6857 : __int16 bp0c;
6858 :
6859 :
6860 : _0dcd:
6861 : switch (bp4c.w0()) {
6862 : case 0x00:
6863 : case 0x08:
6864 :
6865 : {
6866 : if ((dd & 0x0002) != 0 && bp14 != 0 && (Bit16u(_4976_4bec) & 2) != 0) {
6867 :
6868 : bp0a = 1;
6869 :
6870 : goto _10b7;
6871 : }
6872 :
6873 : if (bp20 == 0) {
6874 :
6875 : DRAW_CHIP_OF_MAGIC_MAP(bp2e, 0, aa, di, 0, bp5c);
6876 : }
6877 :
6878 : for (bp0a = 0; bp0a <= 3; bp0a++) {
6879 :
6880 : bp0c = bp4c.w[3 +bp0a] & 0xff;
6881 :
6882 : if (bp0c != 0xff) {
6883 :
6884 : if ((dd & 0x0002) != 0 || QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp0c, dtWordValue, 0xf9) == 0) {
6885 :
6886 : bp0c = QUERY_4BPP_PICT_BUFF_AND_PAL(0x09, Bit8u(bp0c), &bp2a, bp6c);
6887 :
6888 : if (bp0c != 0) {
6889 :
6890 : bp0e = bp4c.w[3 +bp0a] >> 10;
6891 :
6892 : bp0c = (((bp0e +1) << 1) > bp0c) ? (bp0a & 1) : ((bp0e << 1) + (bp0a & 1));
6893 :
6894 : DRAW_CHIP_OF_MAGIC_MAP(bp2a, bp0c, aa, di, _4976_3fa0[bp0a], bp6c);
6895 : }
6896 : }
6897 : }
6898 :
6899 : }
6900 :
6901 : break;
6902 : }
6903 : case 0x01:
6904 : {
6905 :
6906 : if ((bp4c.w2() & 0x0008) != 0) {
6907 :
6908 : QUERY_4BPP_PICT_BUFF_AND_PAL(0x08, _4976_4c5c[_4976_4d0a->Level()], &bp2e, bp5c);
6909 :
6910 :
6911 : DRAW_CHIP_OF_MAGIC_MAP(bp2e, 0, aa, di, 0, bp5c);
6912 :
6913 : return;
6914 : }
6915 :
6916 : goto _0f22;
6917 : }
6918 : case 0x06:
6919 : {
6920 :
6921 : _0f22:
6922 : DRAW_CHIP_OF_MAGIC_MAP(bp2e, 2, aa, di, 0, bp5c);
6923 :
6924 : bp0a = bp4c.w10() & 0xff;
6925 :
6926 : if (bp0a != 0xff) {
6927 :
6928 : if (true
6929 : && ((dd & 0x0002) != 0 || QUERY_GDAT_ENTRY_DATA_INDEX(0x0a, bp0a, dtWordValue, 0xf9) == 0)
6930 : && (bp0c = QUERY_4BPP_PICT_BUFF_AND_PAL(0x0a, Bit8u(bp0a), &bp2a, bp6c)) != 0
6931 : ) {
6932 :
6933 : bp0e = (bp4c.w10() >> 8) / 10;
6934 :
6935 : bp0a = (bp0e +1 > bp0c) ? 0 : bp0e;
6936 :
6937 : DRAW_CHIP_OF_MAGIC_MAP(bp2a, bp0a, aa, di, 0, bp6c);
6938 : }
6939 : }
6940 :
6941 : if (bp4c.w0() == 5) {
6942 :
6943 : bp0a = QUERY_4BPP_PICT_BUFF_AND_PAL(0x18, 0x00, &bp2a, bp6c);
6944 :
6945 : if (bp0a != 0) {
6946 :
6947 : DRAW_CHIP_OF_MAGIC_MAP(bp2a, _4976_4bec / bp0a, aa, di, 0, bp6c);
6948 : }
6949 : }
6950 :
6951 : break;
6952 : }
6953 : case 0x10:
6954 : {
6955 :
6956 : bp0a = 11;
6957 :
6958 : goto _1025;
6959 : }
6960 : case 0x11:
6961 : {
6962 :
6963 : bp0a = 10;
6964 :
6965 : _1025:
6966 : Door *bp04 = GET_ADDRESS_OF_RECORD0(bp4c.w8());
6967 :
6968 : if (bp04->Button() == 0 && bp04->w2_d_d() == 0) {
6969 :
6970 : bp0a += 2;
6971 : }
6972 :
6973 : if (bp4c.w6() == 0 || bp4c.w6() == 5) {
6974 :
6975 : bp0a += 4;
6976 : }
6977 :
6978 : goto _10b7;
6979 : }
6980 : case 0x12:
6981 : case 0x13:
6982 : {
6983 :
6984 : bp0a = (_0cee_06dc(ss, tt) - ww) & 3;
6985 :
6986 : if (bp4c.w6() != 0) {
6987 :
6988 : bp0a += 2;
6989 : bp0a &= 3;
6990 : }
6991 :
6992 : bp0a += 6;
6993 :
6994 : goto _10b7;
6995 : }
6996 : case 0x02:
6997 : {
6998 :
6999 : bp0a = 3;
7000 :
7001 : if (bp4c.w6() != 0) {
7002 :
7003 : bp0a++;
7004 :
7005 : if ((dd & 0x0002) != 0) {
7006 :
7007 : if ((Bit16u(_4976_4bec) & 1) != 0) {
7008 :
7009 : bp0a++;
7010 : }
7011 : }
7012 : }
7013 :
7014 : _10b7:
7015 : DRAW_CHIP_OF_MAGIC_MAP(bp2e, bp0a, aa, di, 0, bp5c);
7016 :
7017 : break;
7018 : }
7019 : case 0x03:
7020 : case 0x04:
7021 : case 0x05:
7022 : case 0x07:
7023 : case 0x09:
7024 : case 0x0a:
7025 : case 0x0b:
7026 : case 0x0c:
7027 : case 0x0d:
7028 : case 0x0e:
7029 : case 0x0f:
7030 : {
7031 : break;
7032 : }
7033 :
7034 : }
7035 :
7036 : if ((dd & 0x0010) == 0) {
7037 :
7038 : for (bp0a = 0; bp0a < _4976_4c3c; bp0a++) {
7039 :
7040 : if (_4976_53b4[bp0a].curHP() != 0) {
7041 :
7042 : Bit8u bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
7043 : Bit8u bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
7044 :
7045 : Bit8u *bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
7046 :
7047 : DRAW_CHIP_OF_MAGIC_MAP(
7048 : bp32,
7049 : (_4976_57e6 != 0) ? 0x09 : (bp0a +5),
7050 : aa,
7051 : di,
7052 : _4976_3fa4[(_4976_53b4[bp0a].playerPos() +4 -ww) & 3],
7053 : QUERY_GDAT_IMAGE_LOCALPAL(bp21, bp22, 0x40)
7054 : );
7055 : }
7056 :
7057 : }
7058 : }
7059 :
7060 : if ((dd & 0x0040) != 0) {
7061 :
7062 : bp0a = (_4976_5326 != 2) ? ((_4976_5326 != 3) ? 0x02 : 0x0a) : (0x0b);
7063 :
7064 : Bit8u bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
7065 : Bit8u bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
7066 :
7067 : Bit8u *bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
7068 :
7069 : DRAW_CHIP_OF_MAGIC_MAP(
7070 : bp32,
7071 : bp0a,
7072 : aa,
7073 : di,
7074 : 0,
7075 : QUERY_GDAT_IMAGE_LOCALPAL(bp21, bp22, 0x40)
7076 : );
7077 : }
7078 :
7079 : if ((dd & 0x00a5) != 0) {
7080 :
7081 : ObjectID bp1c = ObjectID::FFFE;
7082 : ObjectID bp1a = ObjectID::FFFE;
7083 : ObjectID bp18 = ObjectID::FFFE;
7084 :
7085 : ObjectID si = bp4c.w4();
7086 :
7087 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
7088 :
7089 : bp0a = si.DBType();
7090 :
7091 : if (bp0a == dbCreature) {
7092 :
7093 : Bit16u bp16 = _0cee_2de0(si);
7094 :
7095 : if (QUERY_GDAT_ENTRY_DATA_INDEX(0x0f, QUERY_CLS2_FROM_RECORD(si), dtWordValue, 0xf9) != 0) {
7096 :
7097 : bp18 = si;
7098 : }
7099 : else {
7100 :
7101 : if ((bp16 & 0x0001) != 0) {
7102 :
7103 : if ((dd & 0x0080) != 0) {
7104 :
7105 : bp18 = si;
7106 : }
7107 : }
7108 : else {
7109 :
7110 : if ((dd & 0x0021) != 0) {
7111 :
7112 : bp18 = si;
7113 : }
7114 : }
7115 : }
7116 : }
7117 : else {
7118 :
7119 : if ((dd & 0x0004) != 0) {
7120 :
7121 : if (bp0e != 14) {
7122 :
7123 : if (bp1a == bp1a.FFFE) {
7124 :
7125 : bp1a = si;
7126 : }
7127 : }
7128 :
7129 : else if (bp0a == 15) {
7130 :
7131 : if (bp1c == bp1c.FFFE) {
7132 :
7133 : bp1c = si;
7134 : }
7135 : }
7136 :
7137 : else if (bp0a >= 5 && bp0a <= 10) {
7138 :
7139 : bp0a = QUERY_4BPP_PICT_BUFF_AND_PAL(QUERY_CLS1_FROM_RECORD(si), QUERY_CLS2_FROM_RECORD(si), &bp2a, bp6c);
7140 :
7141 : if (bp0a != 0) {
7142 :
7143 : bp0c = (si.Dir() - ww) & 3;
7144 :
7145 : if (bp4c.w0() == 0 && bp14 == 0) {
7146 :
7147 : if (bp0a <= 2)
7148 :
7149 : continue;
7150 :
7151 : bp0a = (bp0c & 1) +1;
7152 :
7153 : bp0c = _4976_3fa0[bp0c];
7154 : }
7155 : else {
7156 :
7157 : bp0a = 0;
7158 :
7159 : bp0c = _4976_3fa4[bp0c];
7160 : }
7161 :
7162 :
7163 : DRAW_CHIP_OF_MAGIC_MAP(bp2a, bp0a, aa, di, bp0c, bp6c);
7164 : }
7165 : }
7166 : }
7167 : }
7168 :
7169 : }
7170 :
7171 : if (bp18 != bp18.FFFE) {
7172 :
7173 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(bp18);
7174 :
7175 : Bit16u bp16 = _0cee_2de0(bp18);
7176 :
7177 : Bit8u bp21;
7178 : Bit8u bp22;
7179 : Bit8u *bp32;
7180 : if ((dd & 0x0020) != 0) {
7181 :
7182 : bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
7183 :
7184 : bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
7185 :
7186 : bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
7187 :
7188 :
7189 :
7190 : DRAW_CHIP_OF_MAGIC_MAP(
7191 : bp32,
7192 : (Bit16u(_4976_4bec) & 1) +3,
7193 : aa,
7194 : di,
7195 : 0,
7196 : QUERY_GDAT_IMAGE_LOCALPAL(bp21, bp22, 0x40)
7197 : );
7198 :
7199 : goto _1554;
7200 : }
7201 :
7202 : bp0c = QUERY_4BPP_PICT_BUFF_AND_PAL(QUERY_CLS1_FROM_RECORD(bp18), QUERY_CLS2_FROM_RECORD(bp18), &bp2a, bp6c);
7203 :
7204 : if (bp0c != 0) {
7205 :
7206 : if ((bp16 & 0x0001) != 0) {
7207 :
7208 : sk1c9a02c3 *bp08 = _1c9a_02c3(bp04, QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType()));
7209 :
7210 : bp0a = _4937_000f(bp08->w0, &bp08->w2);
7211 :
7212 : bp0a = (bp0a >= 4 && bp0a <= 7) ? 4 : 0;
7213 :
7214 : if (((bp0a +1) << 1) > bp0c) {
7215 :
7216 : bp0a = 0;
7217 : }
7218 : else {
7219 :
7220 : bp0a = bp0a << 1;
7221 : }
7222 : }
7223 : else {
7224 :
7225 : bp0a = __int16(_4976_4bec / (bp0c / 2)) << 1;
7226 : }
7227 :
7228 : bp0c = (ww - bp04->b15_0_2()) & 3;
7229 :
7230 :
7231 :
7232 : DRAW_CHIP_OF_MAGIC_MAP(bp2a, (bp0c & 1) + bp0a, aa, di, _4976_3fa0[bp0c], bp6c);
7233 : }
7234 :
7235 : else if ((bp16 & 0x0001) == 0 && (bp16 & 0x2000) == 0) {
7236 :
7237 : bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
7238 :
7239 : bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
7240 :
7241 : bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
7242 :
7243 : DRAW_CHIP_OF_MAGIC_MAP(
7244 : bp32,
7245 : Bit16u(_4976_4bec & 1),
7246 : aa,
7247 : di,
7248 : 0,
7249 : QUERY_GDAT_IMAGE_LOCALPAL(bp21, bp22, 0x40)
7250 : );
7251 : }
7252 :
7253 : _1554:
7254 : if ((bp16 & 0x0001) != 0 && (dd & 0x0004) != 0) {
7255 :
7256 : if ((_0cee_2df4(bp18) & 0x000f) != 0) {
7257 :
7258 : for (si = bp04->w0; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
7259 :
7260 : bp0a = si.DBType();
7261 :
7262 : if (bp0a >= dbWeapon && bp0a <= dbMiscellaneous_item) {
7263 :
7264 : if (QUERY_4BPP_PICT_BUFF_AND_PAL(
7265 : QUERY_CLS1_FROM_RECORD(si),
7266 : QUERY_CLS2_FROM_RECORD(si),
7267 : &bp2a, bp6c) != 0
7268 : ) {
7269 :
7270 : DRAW_CHIP_OF_MAGIC_MAP(
7271 : bp2a,
7272 : 0,
7273 : aa,
7274 : di,
7275 : _4976_3fa4[(si.Dir() - ww) & 3],
7276 : bp6c
7277 : );
7278 : }
7279 : }
7280 :
7281 : }
7282 : }
7283 : }
7284 : }
7285 :
7286 : for (si = bp1a; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
7287 :
7288 : if (si.DBType() == dbMissile) {
7289 :
7290 : bp0a = QUERY_4BPP_PICT_BUFF_AND_PAL(
7291 : QUERY_CLS1_FROM_RECORD(si),
7292 : QUERY_CLS2_FROM_RECORD(si),
7293 : &bp2a, bp6c);
7294 :
7295 : if (bp0a != 0) {
7296 :
7297 : if (bp0a > 3) {
7298 :
7299 : bp0c = _4976_5c20[GET_ADDRESS_OF_RECORDE(si)->TimerIndex()].b9_2_3();
7300 :
7301 : bp0c = (bp0c - ww) & 3;
7302 :
7303 : bp0a = 3;
7304 :
7305 : switch (_48ae_011a(si) +1) {
7306 : case 0:
7307 :
7308 :
7309 : bp0a = 0;
7310 : break;
7311 : case 1:
7312 :
7313 :
7314 : bp0a = 0;
7315 : break;
7316 : case 2:
7317 :
7318 : bp0a += bp0c;
7319 :
7320 : bp0a += _4976_3fa8[((bp0a -3) << 2) + ((si.Dir() - ww) & 3)];
7321 :
7322 : break;
7323 : case 3:
7324 :
7325 : bp0a = 0;
7326 : break;
7327 : }
7328 : }
7329 : else {
7330 :
7331 : bp0a = 0;
7332 : }
7333 :
7334 : }
7335 : }
7336 :
7337 : }
7338 :
7339 : for (si = bp1c; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
7340 :
7341 : if (true
7342 : && si.DBType() == dbCloud
7343 : && QUERY_4BPP_PICT_BUFF_AND_PAL(
7344 : QUERY_CLS1_FROM_RECORD(si),
7345 : QUERY_CLS2_FROM_RECORD(si),
7346 : &bp2a, bp6c) != 0
7347 : ) {
7348 :
7349 : DRAW_CHIP_OF_MAGIC_MAP(
7350 : bp2a,
7351 : Bit16u(_4976_4bec & 1) +1,
7352 : aa,
7353 : di,
7354 : RAND02(),
7355 : bp6c
7356 : );
7357 : }
7358 :
7359 : }
7360 :
7361 : Bit16u bp1e;
7362 : __int16 bp10;
7363 : __int16 bp12;
7364 : if (bp4c.w0() == 0 && bp20 == 0) {
7365 :
7366 : bp10 = ss;
7367 : bp12 = tt;
7368 : Bit8u *bp26 = NULL;
7369 :
7370 : bp0a = _4976_0c5a;
7371 :
7372 : while (bp0a == _4976_0c5a && bp0a != -1) {
7373 :
7374 : bp0a = _0cee_0510(_4976_0c5a, 0, &ss, &tt, &bp26);
7375 :
7376 : }
7377 :
7378 : if (bp0a >= 0 && bp0a != _4976_0c5a) {
7379 :
7380 : if ((_4976_4ca8[bp0a][ss][tt] >> 5) == 0) {
7381 :
7382 : bp20 = 1;
7383 : bp1e = _4976_0c5a;
7384 :
7385 : CHANGE_CURRENT_MAP_TO(bp0a);
7386 :
7387 : _0cee_1dbe(&bp4c, ww, ss, tt);
7388 :
7389 : goto _0dcd;
7390 : }
7391 : }
7392 : }
7393 :
7394 : if (bp20 != 0) {
7395 :
7396 : ss = bp10;
7397 : tt = bp12;
7398 :
7399 : CHANGE_CURRENT_MAP_TO(bp1e);
7400 :
7401 : _0cee_1dbe(&bp4c, ww, ss, tt);
7402 : }
7403 :
7404 : bp0a = _0cee_0510(_4976_0c5a, -1, &ss, &tt, NULL);
7405 :
7406 : if (bp0a >= 0) {
7407 :
7408 : bp0a = _4976_4ca8[bp0a][ss][tt];
7409 :
7410 : if ((bp0a >> 5) == ttPit && (bp0a & 8) != 0) {
7411 :
7412 : DRAW_CHIP_OF_MAGIC_MAP(bp2e, 18, aa, di, 0, bp5c);
7413 : }
7414 : }
7415 : }
7416 :
7417 : return;
7418 : }
7419 :
7420 :
7421 : void _29ee_1946(ObjectID recordLink, __int16 xx, __int16 yy, __int16 zz, __int16 ww, __int16 ss, __int16 tt, Bit16u uu)
7422 : {
7423 :
7424 : ENTER(56);
7425 :
7426 : Bit16u si = uu;
7427 :
7428 : if ((si & 0x0008) != 0) {
7429 :
7430 : xx = _4976_5364;
7431 : yy = _4976_5365;
7432 : zz = _4976_539e;
7433 : ww = _4976_539f;
7434 : ss = _4976_53a0;
7435 : tt = _4976_53a2;
7436 : }
7437 : else {
7438 :
7439 : _4976_5364 = (__int8)xx;
7440 : _4976_5365 = (__int8)yy;
7441 : _4976_539e = (__int8)zz;
7442 : _4976_539f = (__int8)ww;
7443 : _4976_53a0 = ss;
7444 : _4976_53a2 = tt;
7445 : }
7446 :
7447 : _4976_5326 = 0;
7448 :
7449 : Bit16u bp18 = _4976_0c5a;
7450 :
7451 : _29ee_00a3(0);
7452 :
7453 : _0b36_0ffe(&_4976_3f6c, QUERY_EXPANDED_RECT(99, &_4976_53a6), _4976_4bda[0]);
7454 :
7455 : INFLATE_RECT(&_4976_53a6, - _4976_0148, - _4976_014a);
7456 :
7457 : Bit16u bp2e = _4976_53a6.x + ss;
7458 : Bit16u bp30 = _4976_53a6.y + tt;
7459 : Bit16u bp2a = si & 0x0010;
7460 : Bit16u bp1a = si & 0x0020;
7461 : Bit16u bp28 = si & 0x0040;
7462 :
7463 : Bit16u bp22;
7464 : Bit16u bp24;
7465 : Bit16u bp26;
7466 : Bit16u bp1c;
7467 : Bit16u bp1e;
7468 : Bit16u bp20;
7469 : if (bp1a != 0 || bp28 != 0) {
7470 :
7471 : Container *bp04 = GET_ADDRESS_OF_RECORD9(recordLink);
7472 :
7473 : if (bp1a != 0) {
7474 :
7475 : Missile *bp08 = GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), recordLink);
7476 :
7477 : bp1c = bp08->GetX();
7478 : bp1e = bp08->GetY();
7479 : bp20 = bp08->GetMap();
7480 :
7481 : CHANGE_CURRENT_MAP_TO(bp20);
7482 :
7483 : TELE_inf bp3a;
7484 : if (GET_TELEPORTER_DETAIL(&bp3a, (Bit8u)bp1c, (Bit8u)bp1e) != 0) {
7485 :
7486 : bp22 = bp3a.target_x_pos();
7487 : bp24 = bp3a.target_x_pos();
7488 : bp26 = bp3a.target_z();
7489 : }
7490 : else {
7491 :
7492 : bp26 = 0xffff;
7493 : }
7494 : }
7495 :
7496 : if (bp28 != 0) {
7497 :
7498 : _29ee_18eb(bp04->GetDestX(), bp04->GetDestY(), bp04->GetDestMap());
7499 : }
7500 : }
7501 :
7502 : CHANGE_CURRENT_MAP_TO(zz);
7503 :
7504 : __int16 bp10 = 3;
7505 : __int16 bp12 = -3;
7506 :
7507 : if (tt < 0) {
7508 :
7509 : bp10++;
7510 : }
7511 :
7512 : __int16 bp14 = -3;
7513 : __int16 bp16 = 3;
7514 :
7515 : if (ss < 0) {
7516 :
7517 : bp14--;
7518 : }
7519 :
7520 : for (__int16 bp0c = bp10; bp0c >= bp12; bp0c--) {
7521 :
7522 : Bit16u bp0a = bp2e;
7523 :
7524 : for (__int16 bp0e = bp14; bp0e <= bp16; bp0e++) {
7525 :
7526 : __int16 bp32 = xx;
7527 : __int16 bp34 = yy;
7528 :
7529 : _0cee_02dd(ww, bp0c, bp0e, &bp32, &bp34);
7530 :
7531 : __int16 di = _0cee_0510(zz, 0, &bp32, &bp34, NULL);
7532 :
7533 : Bit8u bp2b;
7534 : if (di < 0) {
7535 :
7536 : di = zz;
7537 :
7538 : CHANGE_CURRENT_MAP_TO(di);
7539 :
7540 : if ((GET_TILE_VALUE(bp32, bp34) >> 5) == ttMapExit) {
7541 :
7542 : bp2b = _4976_4c5c[_4976_4d0a->Level()];
7543 :
7544 : goto _1bc7;
7545 : }
7546 : }
7547 : else {
7548 :
7549 : CHANGE_CURRENT_MAP_TO(di);
7550 : }
7551 :
7552 : bp2b = _4976_4d0a->MapGraphicsStyle();
7553 :
7554 : _1bc7:
7555 : si &= 0xff8f;
7556 :
7557 : if (true
7558 : && bp1a != 0
7559 : && (false
7560 : || (bp32 == bp1c && bp34 == bp1e && di == bp20)
7561 : || ( di == bp26 && bp32 == bp22 && bp34 == bp24)
7562 : )
7563 : ) {
7564 :
7565 : si |= 0x0020;
7566 : }
7567 :
7568 : if (bp28 != 0 && _4976_5326 == 0) {
7569 :
7570 : if (bp32 == _4976_536a && bp34 == _4976_536c && di == _4976_5318) {
7571 :
7572 : _4976_5326 = 1;
7573 :
7574 : }
7575 :
7576 : else if (bp32 == _4976_5328 && bp34 == _4976_532a && di == _4976_533c) {
7577 :
7578 : _4976_5326 = 2;
7579 :
7580 : goto _1c6d;
7581 : }
7582 :
7583 : else if (bp32 == _4976_5320 && bp34 == _4976_5322 && di == _4976_533e) {
7584 :
7585 : _4976_5326 = 3;
7586 :
7587 : _1c6d:
7588 : _29ee_18eb(bp32, bp34, di);
7589 : }
7590 :
7591 : if (_4976_5326 != 0) {
7592 :
7593 : si |= 0x0040;
7594 : }
7595 : }
7596 :
7597 : if (bp2a != 0 && di == _4976_4c28 && bp32 == _4976_4c2e && bp34 == _4976_4c30) {
7598 :
7599 : si = 0x0010;
7600 : }
7601 :
7602 : _29ee_0d01(recordLink, bp32, bp34, ww, bp0a, bp30, bp2b, si);
7603 :
7604 : bp0a += _4976_0144 + _4976_0148;
7605 :
7606 : }
7607 :
7608 : bp30 += _4976_0146 + _4976_014a;
7609 :
7610 : }
7611 :
7612 : CHANGE_CURRENT_MAP_TO(bp18);
7613 :
7614 : return;
7615 : }
7616 :
7617 :
7618 : void _29ee_1da5(ObjectID recordLink)
7619 : {
7620 :
7621 : ENTER(30);
7622 :
7623 : _4976_53ae = QUERY_CLS2_FROM_RECORD(recordLink);
7624 : _4976_5356 |= 0x0090;
7625 :
7626 : Container *bp04 = GET_ADDRESS_OF_RECORD9(recordLink);
7627 :
7628 : Bit16u bp0e = bp04->b5_5_7();
7629 :
7630 : Missile *bp08;
7631 : if (bp0e != 3) {
7632 :
7633 : _4976_5356 |= 0x0800;
7634 :
7635 : bp0e = bp04->b5_5_7();
7636 :
7637 : if (bp0e != 0) {
7638 :
7639 : bp08 = GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), recordLink);
7640 :
7641 : if (bp08 != NULL) {
7642 :
7643 : _4976_5356 |= 0x0020;
7644 : }
7645 :
7646 : else if ((_4976_5356 & 0x0020) != 0) {
7647 :
7648 : _4976_5356 &= 0xfbdf;
7649 : }
7650 : }
7651 : }
7652 :
7653 : if ((_4976_5356 & 0x0400) == 0) {
7654 :
7655 : DRAW_ICON_PICT_ENTRY(0x14, _4976_53ae, 0x10, &_4976_3f6c, 92, -1);
7656 :
7657 : for (Bit16u si = 0; si < _4976_53a4; si++) {
7658 :
7659 : _29ee_0a7b(si, 0);
7660 :
7661 : }
7662 :
7663 : _29ee_1d03(0);
7664 :
7665 : _4976_5356 |= 0x0400;
7666 : }
7667 :
7668 : Bit16u bp10 = _4976_4bfa;
7669 : Bit16u di = _4976_4c06;
7670 : Bit16u bp12 = _4976_4bf4;
7671 :
7672 : __int16 bp16 = 0;
7673 : __int16 bp14 = 0;
7674 :
7675 : if (bp0e != 0 && bp0e != 3) {
7676 :
7677 : if (bp04->b7_2_7() != 0x3f) {
7678 :
7679 : _4976_5356 |= 0x0040;
7680 : }
7681 :
7682 : if (bp0e == 1) {
7683 :
7684 : if (bp08 == NULL) {
7685 :
7686 : _4976_5356 &= 0xffbf;
7687 : }
7688 : else {
7689 :
7690 : bp10 = bp08->GetX();
7691 : di = bp08->GetY();
7692 : bp12 = bp08->GetMap();
7693 :
7694 : Creature *bp0c = GET_ADDRESS_OF_RECORD4(bp04->GetContainedObject());
7695 :
7696 : __int16 si = _32cb_0054(bp0c, (_4976_4bf6 + _4976_3fc2[bp0c->b15_0_2()]) & 3);
7697 :
7698 : bp14 = si % 5;
7699 :
7700 : bp16 = si / 5;
7701 :
7702 : if (bp14 > 2) {
7703 :
7704 : si = (_4976_4bf6 +1) & 3;
7705 :
7706 : bp10 += _4976_0232[si];
7707 :
7708 : di += _4976_023a[si];
7709 : }
7710 :
7711 : if (bp16 > 2) {
7712 :
7713 : si = (_4976_4bf6 +2) & 3;
7714 :
7715 : bp10 += _4976_0232[si];
7716 :
7717 : di += _4976_023a[si];
7718 : }
7719 :
7720 : bp14 = _4976_3fb8[bp14] * (((_4976_0148 << 1) + _4976_0144 +1) / 5);
7721 :
7722 : bp16 = _4976_3fb8[bp16] * (((_4976_014a << 1) + _4976_0146 +1) / 5);
7723 : }
7724 : }
7725 :
7726 : else if ((_4976_5356 & 0x0040) != 0) {
7727 :
7728 : bp10 = bp04->GetDestX();
7729 :
7730 : di = bp04->GetDestY();
7731 :
7732 : bp12 = bp04->GetDestMap();
7733 : }
7734 : }
7735 :
7736 : _29ee_1946(recordLink, bp10, di, bp12, _4976_4bf6, bp14, bp16, _4976_5356);
7737 :
7738 : if ((_4976_5356 & 0x0100) != 0 || (_4976_5356 & 0x0200) == 0) {
7739 :
7740 : SRECT bp1e;
7741 : _0b36_105b(&_4976_3f6c, QUERY_EXPANDED_RECT(99, &bp1e), 0);
7742 : }
7743 :
7744 : return;
7745 : }
7746 :
7747 :
7748 : void _29ee_078b()
7749 : {
7750 :
7751 : ENTER(346);
7752 :
7753 : _29ee_00a3(0);
7754 :
7755 : DRAW_ICON_PICT_ENTRY(0x08, _4976_3df6, 0xf6, &_4976_3f6c, 93, -1);
7756 :
7757 : Bit8u *bp04 = ALLOC_PICT_BUFF(_4976_0118, _4976_011a, afDefault, 4);
7758 :
7759 : i16 bp06 = 0;
7760 : i16 bp08 = 0;
7761 :
7762 : SRECT bp10;
7763 : if (QUERY_BLIT_RECT(bp04, &bp10, 94, &bp06, &bp08, -1) != 0) {
7764 :
7765 : if (_4976_57e8 != 0) {
7766 :
7767 : Bit16u si = RAND02();
7768 :
7769 : if (si != 0) {
7770 :
7771 : bp10.y -= 2;
7772 :
7773 : si = RAND02();
7774 :
7775 : if (si != 0) {
7776 :
7777 : bp10.x -= 2;
7778 : }
7779 : }
7780 : }
7781 :
7782 : Bit8u bp015a[16];
7783 : Bit16u di;
7784 : QUERY_GDAT_SQUAD_ICON(bp04, Bit8u(di = _4976_5366 -1), bp015a);
7785 :
7786 : DRAW_ICON_PICT_BUFF(bp04, &_4976_3f6c, &bp10, bp06, bp08, 12, 0, bp015a);
7787 :
7788 : if (_4976_53b4[di].w257 != 0) {
7789 :
7790 : skxxx4 bp014a;
7791 : _0b36_06d3(_0b36_0520(&bp014a, 0x01, 0x07, _4976_53b4[di].b256));
7792 :
7793 : bp014a.w4 |= 0x0010;
7794 : bp014a.w18 >>= 2;
7795 :
7796 : bp014a.w14 = bp014a.w18 * ((_4976_53b4[di].playerDir() +4 - _4976_4bf6) & 3);
7797 :
7798 : bp014a.w20 >>= 2;
7799 :
7800 : bp014a.w16 = bp014a.w20 * (Bit16u(_4976_4bec) & 3);
7801 :
7802 : _0b36_11c0(&bp014a, &_4976_3f6c, 94, 12);
7803 : }
7804 : }
7805 :
7806 : FREE_PICT_BUFF(bp04);
7807 :
7808 : DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x10, &_4976_3f6c, 96, -1);
7809 :
7810 : DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x12, &_4976_3f6c, 97, -1);
7811 :
7812 : return;
7813 : }
7814 :
7815 :
7816 : void _3e74_58a3(Bit16u xx)
7817 : {
7818 :
7819 : ENTER(0);
7820 :
7821 : _3e74_585a(xx, 0);
7822 :
7823 : _3e74_28de(xx |0x8000);
7824 :
7825 : return;
7826 : }
7827 :
7828 :
7829 : void _0b36_0cbe(sk3f6c *ref, Bit16u yy)
7830 : {
7831 :
7832 : ENTER(4);
7833 :
7834 : if (ref->w10 != 0) {
7835 :
7836 : SRECT *bp04 = ref->w12;
7837 :
7838 : _443c_085a();
7839 :
7840 : do {
7841 :
7842 : FIRE_BLIT_PICTURE(
7843 : _3e74_5817(ref->w0),
7844 : _4976_4964,
7845 : bp04,
7846 : bp04->x - ref->w2.x,
7847 : bp04->y - ref->w2.y,
7848 : _4976_00f0,
7849 : ref->w2.cx,
7850 : -1,
7851 : 0,
7852 : 8,
7853 : 8,
7854 : NULL
7855 : );
7856 :
7857 : bp04++;
7858 :
7859 : } while (--ref->w10 != 0);
7860 :
7861 : _443c_086b();
7862 : }
7863 :
7864 : if (yy != 0) {
7865 :
7866 : _3e74_58a3(ref->w0);
7867 :
7868 : ref->w0 = 0xffff;
7869 : }
7870 :
7871 : return;
7872 : }
7873 :
7874 :
7875 : Bit16u IS_CONTAINER_MAP(ObjectID recordLink)
7876 : {
7877 :
7878 : if (recordLink.DBType() == dbContainer) {
7879 : if (GET_ADDRESS_OF_RECORD9(recordLink)->ContainerType() == 1) {
7880 : return 1;
7881 : }
7882 : }
7883 :
7884 : return 0;
7885 : }
7886 :
7887 :
7888 : void _2759_0644(Bit16u xx)
7889 : {
7890 :
7891 :
7892 : Bit16u bp0a = 0;
7893 : Bit16u bp0c = 0;
7894 : Bit16u bp0e = 0;
7895 : Bit16u bp12 = 0;
7896 :
7897 : if (_4976_4bfc == 0) {
7898 :
7899 : if (_4976_4c3c != 0) {
7900 :
7901 : if (_4976_531c != 0 || _4976_5352 != 0) {
7902 :
7903 : _4976_5352 = 0;
7904 : _4976_531c = 0;
7905 :
7906 : _29ee_00a3(1);
7907 : }
7908 :
7909 : _4976_3ddc = 0xffff;
7910 : goto _0e03;
7911 : }
7912 :
7913 : if (xx != 0) {
7914 :
7915 : for (Bit16u bp06=0; bp06 < _4976_4c3c; bp06++) {
7916 :
7917 : for (Bit16u si=0; si <= 2; si++) {
7918 :
7919 : if (_4976_53b4[bp06].b42[si] != 0) {
7920 :
7921 : _4976_53b4[bp06].b42[si] = _4976_53b4[bp06].b42[si] -1;
7922 :
7923 : if (_4976_53b4[bp06].b42[si] == 0) {
7924 :
7925 : _2759_0fb0(bp06, si);
7926 : }
7927 : }
7928 :
7929 : }
7930 :
7931 : }
7932 :
7933 : if (_4976_3ddc == 3) {
7934 :
7935 : ATLASSERT(_4976_5366 == 0);
7936 : sk53b4 *bp04 = &_4976_52af[_4976_5366];
7937 :
7938 : if ((_4976_5356 & 0x0200) != 0) {
7939 :
7940 : if (--_4976_5316 == 0) {
7941 :
7942 : if (bp04->w62 != 0) {
7943 :
7944 : bp04->w62--;
7945 :
7946 : bp04->w50 |= 0x0800;
7947 :
7948 : _4976_5316 = 25 / _4976_531a;
7949 : }
7950 : else {
7951 :
7952 : _4976_5352 = 1;
7953 : _4976_5356 = 0;
7954 : }
7955 : }
7956 : }
7957 :
7958 : else if (bp04->w62 != 0) {
7959 :
7960 : _4976_5352 = 1;
7961 : _4976_5356 = 0;
7962 : }
7963 : }
7964 : }
7965 :
7966 : if (_4976_5340 != 0) {
7967 :
7968 : _29ee_00e0(_4976_5340);
7969 :
7970 : _4976_531c = 1;
7971 : _4976_5340 = 0;
7972 : _4976_3ddc = 6;
7973 : goto _0e03;
7974 : }
7975 :
7976 : if (_4976_5366 > 0) {
7977 :
7978 : __int16 bp06 = _4976_5366 -1;
7979 :
7980 : if (bp06 >= 0 && _4976_5354 != 2) {
7981 :
7982 : if (_4976_3de6[bp06][_4976_5354] != _4976_53b4[bp06].Possess(_4976_5354)) {
7983 :
7984 : _2759_0541();
7985 : }
7986 : }
7987 : }
7988 :
7989 : Bit8u bp1c[4];
7990 : if (_4976_5366 >= 0) {
7991 :
7992 : for (Bit16u bp06=0; bp06 < _4976_4c3c; bp06++) {
7993 :
7994 : sk53b4 *bp04 = &_4976_53b4[bp06];
7995 :
7996 : bp1c[bp06] = 0;
7997 :
7998 : Bit8u bp07 = (bp04->playerDir() +4 - _4976_4bf6) & 3;
7999 :
8000 : __int8 bp08 = (bp04->playerPos() +4 - _4976_4bf6) & 3;
8001 :
8002 : if (bp04->curHP() != 0 && bp08 +1 == _4976_5dbc) {
8003 :
8004 : bp08 = -1;
8005 : }
8006 :
8007 : if (READ_UI8(_4976_3de2, bp06) == bp08 || _4976_3dde[bp06] != bp07) {
8008 :
8009 : bp0c = 1;
8010 : bp12 = 1;
8011 :
8012 : if (bp08 != -1) {
8013 :
8014 : _4976_531c = 1;
8015 : }
8016 :
8017 : WRITE_UI8(_4976_3de2, bp06, bp08);
8018 : _4976_3dde[bp06] = bp07;
8019 : }
8020 :
8021 : }
8022 : }
8023 :
8024 : if (_4976_531c != 0) {
8025 :
8026 : if (_4976_5352 > 1) {
8027 :
8028 :
8029 : _4976_5352--;
8030 :
8031 : goto _0e03;
8032 : }
8033 :
8034 : _29ee_00a3(1);
8035 :
8036 : _4976_531c = 0;
8037 :
8038 : bp0a = 1;
8039 : }
8040 :
8041 : if (_4976_5366 == 0) {
8042 :
8043 : _4976_3ddc = 0;
8044 :
8045 : if (bp0a == 0 && bp12 != 0) {
8046 :
8047 : _4976_3f6a = 0xffff;
8048 : }
8049 :
8050 : for (Bit16u bp06=0; bp06 < _4976_4c3c; bp06++) {
8051 :
8052 : sk53b4 *bp04 = &_4976_53b4[bp06];
8053 :
8054 : if (bp04->curHP() == 0 && GET_PLAYER_AT_POSITION(bp04->playerPos()) >= 0) {
8055 :
8056 : continue;
8057 : }
8058 :
8059 : bp0e = bp1c[bp06];
8060 :
8061 : if (_4976_5342[bp06] != ((bp04->curHP() > 0) ? 1 : 0)) {
8062 :
8063 : _4976_5342[bp06] = ((bp04->curHP() > 0) ? 1 : 0);
8064 :
8065 : bp0e = 1;
8066 : _4976_3f6a = 0xffff;
8067 : }
8068 :
8069 : Bit16u bp16 = ((ABS16(_4976_531e) -1 == bp06) ? 1 : 0);
8070 :
8071 : for (Bit16u si=0; si <= 1; si++) {
8072 :
8073 : Bit16u bp14 = 0;
8074 : Bit16u bp10 = 0;
8075 :
8076 : if (bp16 != 0 && _4976_5324 == si) {
8077 :
8078 : if (_4976_531e > 0) {
8079 :
8080 : bp14 = 1;
8081 : }
8082 :
8083 : bp10 = 1;
8084 : }
8085 :
8086 : Bit8u bp17 = (bp04->b42[si] != 0) ? 1 : 0;
8087 :
8088 : if (_4976_5330[bp06][si] != bp17) {
8089 :
8090 : _4976_5330[bp06][si] = bp17;
8091 :
8092 : bp10 = 1;
8093 : }
8094 :
8095 : if (_4976_3de6[bp06][si] != bp04->Possess(si) || bp0a != 0 || bp0e != 0) {
8096 :
8097 : _4976_3de6[bp06][si] = bp04->Possess(si);
8098 :
8099 : bp10 = 1;
8100 : }
8101 :
8102 : if (bp0a != 0 || bp0e != 0 || bp10 != 0) {
8103 :
8104 : _29ee_026c(bp06, si, bp14);
8105 : }
8106 :
8107 : }
8108 :
8109 : Bit16u bp14 = 0;
8110 :
8111 : if (bp16 != 0 && _4976_5324 == 2) {
8112 :
8113 : if (_4976_531e > 0) {
8114 :
8115 : bp14 = 1;
8116 : }
8117 :
8118 : bp0e = 1;
8119 : }
8120 :
8121 : Bit8u bp17 = (bp04->b44 != 0) ? 1 : 0;
8122 :
8123 : if (_4976_5330[bp06][2] != bp17) {
8124 :
8125 : _4976_5330[bp06][2] = bp17;
8126 :
8127 : bp0e = 1;
8128 : }
8129 :
8130 : if (bp0a != 0 || bp0e != 0 || (_4976_3df7 != _4976_3fc6 && (_4976_3df7 == bp06 || _4976_3fc6 == bp06))) {
8131 :
8132 : _29ee_058d(bp06, bp14);
8133 : }
8134 :
8135 : if (_4976_53b4[bp06].w257 != 0 || _4976_3f68 != 0) {
8136 :
8137 : bp0c = 1;
8138 : }
8139 :
8140 : if (_4976_53b4[bp06].w257 != 0) {
8141 :
8142 : _4976_3f68 |= 1 << bp06;
8143 : }
8144 : else {
8145 :
8146 : _4976_3f68 &= ~(1 << bp06);
8147 : }
8148 :
8149 : }
8150 :
8151 : if (_4976_531e < 0) {
8152 :
8153 : _4976_531e = 0;
8154 : }
8155 :
8156 : _4976_531e = -_4976_531e;
8157 :
8158 : if (bp0a != 0 || bp0c != 0) {
8159 :
8160 : _29ee_0396();
8161 : }
8162 : }
8163 :
8164 : _4976_3df7 = _4976_3fc6;
8165 :
8166 : if (_4976_5366 > 0 && (_4976_5352 != 0 || bp0a != 0 || bp0c != 0 || (_4976_3ddc == 3 && xx != 0))) {
8167 :
8168 : if (_4976_5352 > 1) {
8169 :
8170 : _4976_5352--;
8171 :
8172 : goto _0e03;
8173 : }
8174 :
8175 : if (_4976_5356 != 0 && _4976_5352 == 0 && bp0a == 0) {
8176 :
8177 : _29ee_00a3(0);
8178 : }
8179 : else if (_4976_5354) {
8180 :
8181 : _29ee_00a3(1);
8182 :
8183 : _29ee_0713();
8184 : }
8185 :
8186 : if (_4976_5354 == 2) {
8187 :
8188 : _4976_3ddc = 2;
8189 :
8190 : _29ee_09d5();
8191 : }
8192 : else {
8193 :
8194 : Bit16u bp06 = _4976_5366 -1;
8195 :
8196 : sk53b4 *bp04 = &_4976_53b4[bp06];
8197 :
8198 : ObjectID di = bp04->Possess(_4976_5354);
8199 :
8200 : if (IS_CONTAINER_MAP(di) != 0 && _4976_5356 == 0) {
8201 :
8202 : _4976_531a = 1;
8203 : _4976_5316 = 25;
8204 :
8205 : if (bp04->curMP() != 0) {
8206 :
8207 : bp04->w62--;
8208 :
8209 : bp04->w50 |= 0x0800;
8210 :
8211 : _4976_5356 = 0x8200;
8212 : }
8213 : else {
8214 :
8215 : _4976_5356 = 0x8000;
8216 : }
8217 :
8218 : _4976_3ddc = 3;
8219 : }
8220 :
8221 : else if (IS_CONTAINER_MONEYBOX(di) != 0) {
8222 :
8223 : _4976_3ddc = 4;
8224 : }
8225 :
8226 : else if (IS_CONTAINER_CHEST(di) != 0 && _4976_3ddc != 5) {
8227 :
8228 : _24a5_0990(di, GET_ADDRESS_OF_RECORD9(di));
8229 :
8230 : _4976_3ddc = 5;
8231 : }
8232 :
8233 :
8234 : if (_4976_3ddc == 4) {
8235 :
8236 : _29ee_2048(di);
8237 : }
8238 :
8239 : else if (_4976_3ddc == 5) {
8240 :
8241 : _29ee_21d8(di, 1);
8242 : }
8243 :
8244 : else if (_2759_02d6(bp06, di, _4976_5354) != 0 && _4976_3ddc != 3) {
8245 :
8246 : _4976_3ddc = 1;
8247 :
8248 : if (_4976_3ddc != _4976_3f6a) {
8249 :
8250 : _1031_0667();
8251 :
8252 : _4976_3f6a = _4976_3ddc;
8253 : }
8254 :
8255 : _29ee_0b2b();
8256 : }
8257 :
8258 : else if (_4976_3ddc == 3) {
8259 :
8260 : if ((_4976_5356 & 0x0400) == 0) {
8261 :
8262 : _4976_3f6a = 0xffff;
8263 : }
8264 :
8265 : _29ee_1da5(di);
8266 : }
8267 : else {
8268 :
8269 : _4976_5366 = 0;
8270 : _4976_3ddc = 0;
8271 : }
8272 : }
8273 :
8274 :
8275 : _4976_5352 = 0;
8276 : }
8277 : else {
8278 :
8279 : if (_4976_5366 > 0 && _4976_3ddc == 5 && xx != 0) {
8280 :
8281 : _29ee_00a3(0);
8282 :
8283 : _29ee_21d8(_4976_52af[_4976_5366].Possess(_4976_5354), 0);
8284 : }
8285 : }
8286 :
8287 : if (_4976_5366 > 0 && _4976_3df9[_4976_3ddc] != 0 && (_4976_52af[_4976_5366].w257 != 0 || _4976_3f68 != 0)) {
8288 :
8289 : _29ee_078b();
8290 :
8291 : if (_4976_52af[_4976_5366].w257 != 0) {
8292 :
8293 : _4976_3f68 |= 1 << (__int8(_4976_5366) -1);
8294 : }
8295 : else {
8296 :
8297 : _4976_3f68 &= ~(1 << (__int8(_4976_5366) -1));
8298 : }
8299 : }
8300 :
8301 :
8302 : _0e03:
8303 : if (_4976_3f6c.w0 != 0xffff) {
8304 :
8305 : _0b36_0cbe(&_4976_3f6c, 1);
8306 : }
8307 :
8308 : if (_4976_3ddc != _4976_3f6a) {
8309 :
8310 : _1031_0667();
8311 :
8312 : _4976_3f6a = _4976_3ddc;
8313 : }
8314 : }
8315 :
8316 : return;
8317 : }
8318 :
8319 :
8320 : void _1031_04f5()
8321 : {
8322 :
8323 : ENTER(0);
8324 :
8325 : if (_4976_4ddc != 0) {
8326 :
8327 : _4976_4ddc = 0;
8328 :
8329 : _29ee_000f();
8330 : }
8331 :
8332 : return;
8333 : }
8334 :
8335 :
8336 : void _12b4_000d(Bit16u xx, Bit16u yy, Bit16u zz);
8337 :
8338 :
8339 : void _12b4_0092()
8340 : {
8341 :
8342 : ENTER(0);
8343 :
8344 : if (_4976_4eb4 != 0) {
8345 :
8346 : _12b4_000d(_4976_4eb6, _4976_4ebc, 0);
8347 : }
8348 :
8349 : return;
8350 : }
8351 :
8352 :
8353 : void IBMIO_FILL_HALFTONE_RECT(SRECT *rc)
8354 : {
8355 :
8356 : ENTER(4);
8357 :
8358 : LOADDS(0x0c48);
8359 :
8360 : for (i16 si = rc->y; rc->y + rc->cy -1 >= si; si++) {
8361 :
8362 : Bit8u *bp04 = &pbVram[si * 320 + rc->x];
8363 :
8364 : for (i16 di = rc->x; rc->x + rc->cx -1 >= di; bp04++, di++) {
8365 :
8366 : if (((di ^ si) & 1) == 0) {
8367 :
8368 : *bp04 = 0;
8369 : }
8370 :
8371 : }
8372 :
8373 : }
8374 :
8375 : return;
8376 : }
8377 :
8378 :
8379 : void FIRE_FILL_HALFTONE_RECTV(SRECT *rc, Bit16u aa)
8380 : {
8381 :
8382 : ENTER(0);
8383 :
8384 : IBMIO_FILL_HALFTONE_RECT(rc) CALL_IBMIO;
8385 :
8386 : return;
8387 : }
8388 :
8389 :
8390 : void FIRE_FILL_HALFTONE_RECTI(Bit16u rectno, Bit16u aa)
8391 : {
8392 :
8393 : ENTER(8);
8394 :
8395 : SRECT bp08;
8396 : FIRE_FILL_HALFTONE_RECTV(QUERY_EXPANDED_RECT(rectno, &bp08), aa);
8397 : }
8398 :
8399 :
8400 : void IBMIO_MOUSE_SET_POS()
8401 : {
8402 : DOSIMPL();
8403 :
8404 :
8405 :
8406 :
8407 :
8408 :
8409 :
8410 :
8411 :
8412 :
8413 :
8414 :
8415 :
8416 :
8417 :
8418 :
8419 :
8420 :
8421 : }
8422 :
8423 :
8424 : void FIRE_MOUSE_SET_POS()
8425 : {
8426 :
8427 : ENTER(0);
8428 :
8429 : IBMIO_MOUSE_SET_POS() CALL_IBMIO;
8430 :
8431 : return;
8432 : }
8433 :
8434 :
8435 : void _1031_050c()
8436 : {
8437 :
8438 : ENTER(0);
8439 :
8440 : if (_4976_4c38 != 0 || _4976_4bfe != 0 || _4976_4c3e != 0) {
8441 :
8442 : _4976_4c3e = 0;
8443 : _4976_4bfe = 0;
8444 : _4976_4c38 = 0;
8445 :
8446 : FIRE_MOUSE_SET_POS();
8447 :
8448 : _4976_4860 = 1;
8449 :
8450 : _443c_086b();
8451 : }
8452 :
8453 : return;
8454 : }
8455 :
8456 :
8457 : void _1031_0675(Bit16u xx)
8458 : {
8459 :
8460 : ENTER(0);
8461 :
8462 : _4976_4ea8 = _4976_19ad;
8463 :
8464 : _4976_4e64 = 0;
8465 : _4976_4e48 = 0;
8466 : _4976_4e96 = 0;
8467 :
8468 : _443c_0662();
8469 :
8470 : _1031_050c();
8471 :
8472 : _1031_0541(xx);
8473 :
8474 : return;
8475 : }
8476 :
8477 :
8478 : Bit16u _1031_0000(sk1891 *ref)
8479 : {
8480 :
8481 : ENTER(0);
8482 :
8483 : return 1;
8484 : }
8485 :
8486 :
8487 : Bit16u _1031_0008(sk1891 *ref)
8488 : {
8489 :
8490 : ENTER(0);
8491 :
8492 : return (ref->b1 == _4976_01ba) ? 1 : 0;
8493 : }
8494 :
8495 :
8496 : Bit16u _1031_0023(sk1891 *ref)
8497 : {
8498 :
8499 : ENTER(0);
8500 :
8501 : return (ref->b1 == _4976_4bd2) ? 1 : 0;
8502 : }
8503 :
8504 :
8505 : Bit16u _1031_003e(sk1891 *ref)
8506 : {
8507 :
8508 : ENTER(0);
8509 :
8510 : if (ref->b1 == _4976_52be)
8511 :
8512 : return 1;
8513 :
8514 : return (ref->b1 <= 4 || (_4976_52be != 0 && ref->b1 -4 == _4976_52be)) ? 0 : 1;
8515 : }
8516 :
8517 :
8518 : Bit16u _1031_007b(sk1891 *ref)
8519 : {
8520 :
8521 : ENTER(0);
8522 :
8523 : return (_4976_53b4[ref->b1].curHP() != 0) ? 1 : 0;
8524 : }
8525 :
8526 :
8527 : Bit16u _1031_009e(sk1891 *ref)
8528 : {
8529 :
8530 : ENTER(0);
8531 :
8532 : return (GET_PLAYER_AT_POSITION((ref->b1 + _4976_4bf6) & 3) >= 0) ? 1 : 0;
8533 : }
8534 :
8535 :
8536 : Bit16u _1031_00c5(sk1891 *ref)
8537 : {
8538 :
8539 : ENTER(0);
8540 :
8541 : return ((ref->b1 == 0 && _4976_5dbc == 0) || (ref->b1 != 0 && _4976_5dbc != 0)) ? 1 : 0;
8542 : }
8543 :
8544 :
8545 : Bit16u _1031_00f3(sk1891 *ref)
8546 : {
8547 :
8548 : ENTER(0);
8549 :
8550 : if (_4976_5366 == 0) {
8551 :
8552 : if (ref->b1 > 3)
8553 :
8554 : return 1;
8555 :
8556 : if (GET_PLAYER_AT_POSITION((ref->b1 + _4976_4bf6) & 3) >= 0)
8557 :
8558 : return 1;
8559 : }
8560 :
8561 : return 0;
8562 : }
8563 :
8564 :
8565 : Bit16u _1031_012d(sk1891 *ref)
8566 : {
8567 :
8568 : ENTER(0);
8569 :
8570 : return (_4976_5366 != 0 && ref->b1 == _4976_53a4) ? 1 : 0;
8571 : }
8572 :
8573 :
8574 : Bit16u _1031_014f(sk1891 *ref)
8575 : {
8576 :
8577 : ENTER(0);
8578 :
8579 : return (_4976_5366 != 0 && (ref->b1 & (1 << _4976_52af[_4976_5366].b30)) != 0) ? 1 : 0;
8580 : }
8581 :
8582 :
8583 : Bit16u _1031_0184(sk1891 *ref)
8584 : {
8585 :
8586 : ENTER(0);
8587 :
8588 : return (_4976_5366 != 0)
8589 : ? (((_4976_5356 & 0x8000) != 0)
8590 : ? ((ref->b1 == _4976_53a4)
8591 : ? 1
8592 : : 0
8593 : )
8594 : : ((ref->b1 == 5)
8595 : ? 1
8596 : : 0
8597 : )
8598 : )
8599 : : 0;
8600 : }
8601 : Bit16u _1031_01ba(sk1891 *ref);
8602 :
8603 :
8604 : void _1031_027e(sk1891 *ref)
8605 : {
8606 :
8607 : ENTER(8);
8608 :
8609 : Bit8u *bp08 = _1031_023b(ref);
8610 :
8611 : do {
8612 :
8613 : sk1891 *bp04 = _4976_1574[*bp08 & 0xff7f];
8614 :
8615 : if ((this->_4976_0cba[ref->b0 & 0x7f])(bp04) != 0) {
8616 :
8617 : if ((bp04->b0 & 0x80) == 0x80) {
8618 :
8619 : _1031_027e(bp04);
8620 : }
8621 : else {
8622 :
8623 : _4976_16ed[bp04->w2].b6 |= 0x40;
8624 : }
8625 : }
8626 :
8627 : bp08++;
8628 :
8629 : } while ((*bp08 & 0x80) == 0);
8630 :
8631 : return;
8632 : }
8633 :
8634 :
8635 : Bit16u PT_IN_RECT(SRECT *rc, i16 xx, i16 yy)
8636 : {
8637 :
8638 : ENTER(0);
8639 :
8640 : return (true
8641 : && rc->x <= xx
8642 : && rc->x + rc->cx -1 >= xx
8643 : && rc->y <= yy
8644 : && rc->y + rc->cy -1 >= yy
8645 : ) ? 1 : 0;
8646 : }
8647 :
8648 :
8649 : SRECT *_1031_01d5(Bit16u xx, SRECT *rc)
8650 : {
8651 :
8652 : ENTER(4);
8653 :
8654 : Bit16u si = xx;
8655 :
8656 : rc = QUERY_EXPANDED_RECT(si & 0x3fff, rc);
8657 :
8658 : if (rc != NULL) {
8659 :
8660 : if ((si & 0x8000) != 0) {
8661 :
8662 : si = 7;
8663 :
8664 : goto _020f;
8665 : }
8666 :
8667 : if ((si & 0x4000) != 0) {
8668 :
8669 : si = 18;
8670 :
8671 : _020f:
8672 : i16 bp02;
8673 : i16 bp04;
8674 : QUERY_TOPLEFT_OF_RECT(si, &bp02, &bp04);
8675 :
8676 : rc->x += bp02;
8677 : rc->y += bp04;
8678 : }
8679 : }
8680 :
8681 : return rc;
8682 : }
8683 :
8684 :
8685 : Bit16u _1031_0a88(sk0d9e *ref, Bit16u xx, Bit16u yy, Bit16u ww)
8686 : {
8687 :
8688 : ENTER(4);
8689 :
8690 : if (ref == NULL)
8691 :
8692 : return 0;
8693 :
8694 : Bit16u si = 0;
8695 : sk0d9e *bp04 = ref;
8696 :
8697 : if (true
8698 : && (ref->w4 & 0x8000) == 0
8699 : && (ww & (255 & ref->w4)) != 0
8700 : && _1031_01d5(ref->w2, &_4976_4e9e) != NULL
8701 : && PT_IN_RECT(&_4976_4e9e, xx, yy) != 0
8702 : ) {
8703 :
8704 : _4976_4df8 = ref->w2;
8705 :
8706 : _4976_4e44 = ((_4976_4df8 & 0x8000) == 0 && (_4976_4df8 & 0x4000) != 0) ? 0x0012 : 0xffff;
8707 :
8708 : _4976_4df8 = _4976_4df8 & 0x3fff;
8709 : _4976_4e66 = xx;
8710 : _4976_4e68 = yy;
8711 :
8712 : si = 0x07ff & ref->w0;
8713 :
8714 : _4976_4dfa = si;
8715 : _4976_4e9c = 0;
8716 :
8717 : _4976_4dfc = _4976_4dfa - ((0x07ff & bp04->w0) -1);
8718 : }
8719 : else {
8720 :
8721 : ref++;
8722 :
8723 : if ((ref->w0 & 0x8000) != 0) {
8724 :
8725 : _4976_4e9e.cx = 0;
8726 : _4976_4e9e.cy = 0;
8727 : }
8728 : }
8729 :
8730 : return si;
8731 : }
8732 :
8733 :
8734 : sk0d9e *_1031_024c(sk1891 *ref)
8735 : {
8736 :
8737 : ENTER(0);
8738 :
8739 : Bit16u si = _4976_16ed[ref->w2].w2;
8740 :
8741 : return (si == 0xffff) ? NULL : &_4976_0d9e[si];
8742 : }
8743 :
8744 :
8745 : Bit16u _1031_030a(sk1891 *ref, Bit16u xx, Bit16u yy, Bit16u zz)
8746 : {
8747 :
8748 : ENTER(16);
8749 :
8750 : Bit16u di = yy;
8751 : Bit16u si = 0;
8752 :
8753 : Bit8u *bp08 = _1031_023b(ref);
8754 :
8755 : do {
8756 :
8757 : sk1891 *bp04 = _4976_1574[*bp08 & 0xff7f];
8758 :
8759 : if ((_4976_0cba[ref->b0 & 0x7f])(bp04) != 0) {
8760 :
8761 : SRECT bp10;
8762 : if ((bp04->b0 & 0x80) == 0x80) {
8763 :
8764 : si = _1031_030a(bp04, xx, di, zz);
8765 :
8766 : if (si != 0)
8767 :
8768 :
8769 : return si;
8770 : }
8771 :
8772 : else if (PT_IN_RECT(_1031_01d5(_4976_16ed[bp04->w2].w0, &bp10), xx, di) != 0) {
8773 :
8774 : if (_1031_0a88(_1031_024c(bp04), xx, di, zz) != 0)
8775 :
8776 :
8777 : return si;
8778 : }
8779 : }
8780 :
8781 : bp08++;
8782 :
8783 : } while ((*bp08 & 0x80) == 0);
8784 :
8785 : return si;
8786 : }
8787 :
8788 :
8789 : Bit16u _1031_0c58(Bit16u xx, sk0d9e *ref)
8790 : {
8791 :
8792 : ENTER(4);
8793 :
8794 : _4976_4e44 = 0xffff;
8795 :
8796 : sk0d9e *bp04 = ref;
8797 :
8798 : if (ref != NULL) {
8799 :
8800 : Bit16u si;
8801 : for (; (si = 0x07ff & ref->w0) != 0; ref++) {
8802 :
8803 : if ((ref->w4 & 0x0800) == 0 && si == xx) {
8804 :
8805 : _1031_01d5(ref->w2, &_4976_4e9e);
8806 :
8807 : _4976_4df8 = ref->w2;
8808 :
8809 : if ((_4976_4df8 & 0x8000) != 0) {
8810 :
8811 : _4976_4e44 = 7;
8812 : }
8813 :
8814 : else if ((_4976_4df8 & 0x4000) != 0) {
8815 :
8816 : _4976_4e44 = 18;
8817 : }
8818 :
8819 : _4976_4df8 = _4976_4df8 & 0x3fff;
8820 : _4976_4e66 = _4976_4e9e.x;
8821 : _4976_4e68 = _4976_4e9e.y;
8822 : _4976_4dfa = si;
8823 :
8824 : _4976_4dfc = _4976_4dfa - (0x07ff & bp04->w0) -1;
8825 :
8826 : return 1;
8827 : }
8828 :
8829 : }
8830 :
8831 : _4976_4ea2 = 0;
8832 : }
8833 :
8834 : _4976_4df8 = 0xffff;
8835 : _4976_4e66 = 0;
8836 : _4976_4e68 = 0;
8837 : _4976_4dfa = xx;
8838 : _4976_4dfc = 0;
8839 :
8840 : return 0;
8841 : }
8842 :
8843 :
8844 : Bit16u _1031_03f2(sk1891 *ref, Bit16u xx)
8845 : {
8846 :
8847 : ENTER(12);
8848 :
8849 : Bit16u si = 0;
8850 :
8851 : Bit8u *bp08 = _1031_023b(ref);
8852 :
8853 : do {
8854 :
8855 : sk1891 *bp04 = _4976_1574[*bp08 & 0xff7f];
8856 :
8857 : if ((_4976_0cba[ref->b0 & 0x7f])(bp04) != 0) {
8858 :
8859 : if ((bp04->b0 & 0x80) == 0x80) {
8860 :
8861 : si = _1031_03f2(bp04, xx);
8862 :
8863 : if (si != 0)
8864 :
8865 :
8866 : return si;
8867 : }
8868 : else {
8869 :
8870 : Bit16u di = _4976_16ed[bp04->w2].w4;
8871 :
8872 : if (di != 0xffff) {
8873 :
8874 : sk13a4 *bp0c = &_4976_13a4[di];
8875 :
8876 : do {
8877 :
8878 : if (bp0c->w2 == xx) {
8879 :
8880 : _1031_024c(bp04);
8881 :
8882 : _1031_0c58(si = 0x07ff & bp0c->w0, _1031_024c(bp04));
8883 :
8884 : _4976_4e9c = xx;
8885 :
8886 : break;
8887 : }
8888 :
8889 : } while (((bp0c++)->w0 & 0x8000) == 0);
8890 :
8891 : if (si != 0)
8892 :
8893 :
8894 : return si;
8895 : }
8896 : }
8897 : }
8898 :
8899 : bp08++;
8900 :
8901 : } while ((*bp08 & 0x80) == 0);
8902 :
8903 : return si;
8904 : }
8905 :
8906 :
8907 : void _1031_156f(sk4e4e *ref)
8908 : {
8909 :
8910 : ENTER(6);
8911 :
8912 : Bit16u si = ref->w4;
8913 :
8914 : if (si >= 0x74 && si <= 0x7b) {
8915 :
8916 : si -= 0x74;
8917 :
8918 : Bit16u bp06 = ((si & 1) != 0) ? 1 : 0;
8919 :
8920 : i16 di = GET_PLAYER_AT_POSITION(((si >> 1) + _4976_4bf6) & 3);
8921 :
8922 : if (false
8923 : || di < 0
8924 : || _4976_53b4[di +bp06].b42[0] != 0
8925 : || _2759_02d6(di, _4976_53b4[di].Possess(bp06), bp06) == 0
8926 : ) {
8927 :
8928 : si = 0;
8929 : }
8930 : else {
8931 :
8932 : si = (di << 1) +bp06 +0x74;
8933 : }
8934 : }
8935 :
8936 : else if (si >= 0x5f && si <= 0x62) {
8937 :
8938 : i16 di = GET_PLAYER_AT_POSITION((si -0x5f +_4976_4bf6) & 3);
8939 :
8940 : if (di < 0) {
8941 :
8942 :
8943 : si = 0;
8944 : }
8945 : else {
8946 :
8947 : i16 bp04;
8948 : if (si <= 0x60) {
8949 :
8950 : bp04 = ref->rc6.y + ref->rc6.cy -1 - ref->w2;
8951 : }
8952 : else {
8953 :
8954 : bp04 = ref->w2 - ref->rc6.y;
8955 : }
8956 :
8957 : i16 bp02;
8958 : if (si == 0x60 || si == 0x61) {
8959 :
8960 : bp02 = ref->w0 - ref->rc6.x;
8961 : }
8962 : else {
8963 :
8964 : bp02 = ref->rc6.x + ref->rc6.cx -1 - ref->w0;
8965 : }
8966 :
8967 : if (bp02 <= bp04) {
8968 :
8969 : si -= 0x4f;
8970 : }
8971 :
8972 : else if (_4976_53b4[di].b44 != 0) {
8973 :
8974 : si = 0;
8975 : }
8976 : }
8977 : }
8978 : else {
8979 :
8980 : return;
8981 : }
8982 :
8983 : ref->w4 = si;
8984 :
8985 : return;
8986 : }
8987 :
8988 :
8989 : Bit8u *_1031_0d9e(sk4e4e *xx)
8990 : {
8991 :
8992 : ENTER(0);
8993 :
8994 : _1031_156f(xx);
8995 :
8996 : Bit16u si = xx->w4;
8997 :
8998 : if (si == 0 || si > 239) {
8999 :
9000 : return 0;
9001 : }
9002 : Bit16u di;
9003 :
9004 : if ((si >= 0x14 && si < 0x42) || (si >= 0x7d && si <= 0x81) || (si >= 0x10 && si <= 0x13)) {
9005 :
9006 : di = 1;
9007 : goto _0f23;
9008 : }
9009 :
9010 : else if (si >= 0x01 && si <= 0x06) {
9011 :
9012 : di = (si -0x01) * 15 +2;
9013 : goto _0f23;
9014 : }
9015 :
9016 : else if (si >= 0x74 && si <= 0x7b) {
9017 :
9018 : di = ((si -0x74) & 1) * 5 +0x5c;
9019 : goto _0f23;
9020 : }
9021 :
9022 : else if (si >= 0x5f && si <= 0x62) {
9023 :
9024 : di = (si -0x5f) * 5 +0x66;
9025 : goto _0f23;
9026 : }
9027 :
9028 : else if (si == 0x70) {
9029 :
9030 : di = 0x7a;
9031 : goto _0f23;
9032 : }
9033 :
9034 : else if (si == 0x5d || si == 0x5e) {
9035 :
9036 : di = ((si -0x5d) << 3) +0x82;
9037 : goto _0f23;
9038 : }
9039 :
9040 : else if (si >= 0x65 && si <= 0x6a) {
9041 :
9042 : di = 0x92;
9043 : goto _0f23;
9044 : }
9045 :
9046 : else if (si == 0x6b) {
9047 :
9048 : di = 0x96;
9049 : goto _0f23;
9050 : }
9051 :
9052 : else if (si == 0x6c) {
9053 :
9054 : di = 0x9e;
9055 : goto _0f23;
9056 : }
9057 :
9058 : else if (si >= 0x71 && si <= 0x73) {
9059 :
9060 : di = (si -0x71) * 5 +0xa2;
9061 : goto _0f23;
9062 : }
9063 :
9064 : else if (si == 0x0b || si == 0xa1) {
9065 :
9066 : di = 0xb1;
9067 : goto _0f23;
9068 : }
9069 :
9070 : else if (si == 0x91) {
9071 :
9072 : di = 0xb6;
9073 : goto _0f23;
9074 : }
9075 :
9076 : else if (si == 0x8c) {
9077 :
9078 : di = 0xbb;
9079 : goto _0f23;
9080 : }
9081 :
9082 : else if (si >= 0x97 && si <= 0x9a) {
9083 :
9084 : di = (si -0x97) * 7 +0xc0;
9085 : goto _0f23;
9086 : }
9087 :
9088 : else if (si >= 0xdb && si <= 0xde) {
9089 :
9090 : switch (_4976_4bd2 -1) {
9091 : case 0:
9092 : case 1:
9093 :
9094 : di = 0xe3;
9095 : break;
9096 : case 2:
9097 :
9098 : if (si < 0xdc) {
9099 :
9100 :
9101 : di = 0xe3;
9102 : }
9103 : else {
9104 :
9105 : di = 0xdc;
9106 : }
9107 : break;
9108 : case 3:
9109 :
9110 : di = 0xdc;
9111 : break;
9112 : case 4:
9113 : case 5:
9114 :
9115 : if (si <= 0xdc) {
9116 :
9117 :
9118 : di = 0xdc;
9119 : }
9120 : break;
9121 : default:
9122 :
9123 : di = 1;
9124 : break;
9125 : }
9126 : goto _0f23;
9127 : }
9128 :
9129 : else if (si == 0x50) {
9130 :
9131 : di = 0xea;
9132 : goto _0f23;
9133 : }
9134 : else {
9135 :
9136 : di = 0;
9137 : }
9138 :
9139 : _0f23:
9140 : return &_4976_18b9[di];
9141 : }
9142 :
9143 :
9144 : void _1031_10c8(sk3f6c *ref, SRECT *rc, Bit16u cx, Bit16u cy)
9145 : {
9146 :
9147 : ENTER(0);
9148 :
9149 : if (ref->w0 == 0xffff) {
9150 :
9151 : COPY_MEMORY(&_4976_4e54, &ref->w2, 8);
9152 :
9153 : _0b36_0c52(ref, -1, 0);
9154 : }
9155 :
9156 : CALC_CENTERED_RECT_IN_RECT(rc, &ref->w2, cx, cy);
9157 :
9158 : return;
9159 : }
9160 :
9161 :
9162 : void _0b36_129a(sk3f6c *ref, i16 xx, i16 yy, Bit8u clr1, Bit8u clr2, Bit8u *str)
9163 : {
9164 :
9165 : ENTER(4);
9166 :
9167 : i16 bp02;
9168 : i16 bp04;
9169 : if (_3929_03dc(str, &bp02, &bp04) != 0) {
9170 :
9171 : DRAW_STRING(
9172 : reinterpret_cast<Bit8u *>(_3e74_5817(ref->w0)),
9173 : ref->w0,
9174 : ref->w2.cx,
9175 : xx - ref->w2.x,
9176 : yy - ref->w2.y,
9177 : clr1,
9178 : clr2,
9179 : str,
9180 : 8
9181 : );
9182 :
9183 : _0b36_0d67(
9184 : ref,
9185 : ALLOC_TEMP_RECT(xx, yy, bp02, bp04)
9186 : );
9187 : }
9188 :
9189 : return;
9190 : }
9191 :
9192 :
9193 : void _0b36_0a3f(skxxx4 *ref)
9194 : {
9195 :
9196 : ENTER(12);
9197 :
9198 : if (ref->w18 <= 0 || ref->w20 <= 0)
9199 :
9200 : return;
9201 :
9202 :
9203 : U8 *bp04 = QUERY_PICT_BITS(ref);
9204 :
9205 : U16 bp06 = ref->w24;
9206 :
9207 : i16 bp08;
9208 : i16 bp0a;
9209 : if (bp06 == 0xffff) {
9210 :
9211 : bp08 = ref->w32;
9212 : bp0a = ref->w34;
9213 : }
9214 : else {
9215 :
9216 : if ((bp06 & 0x8000) != 0 || ref->w28 != 0 || ref->w30 != 0) {
9217 :
9218 : bp06 = bp06 | 0x8000;
9219 : bp08 = ref->w32 + ref->w28;
9220 : bp0a = ref->w34 + ref->w30;
9221 : }
9222 : else {
9223 :
9224 : bp08 = ref->w18;
9225 : bp0a = ref->w20;
9226 : }
9227 :
9228 : if (QUERY_BLIT_RECT(bp04, &ref->rc36, bp06, &bp08, &bp0a, ref->w26) == 0) {
9229 :
9230 : return;
9231 : }
9232 : }
9233 :
9234 : bp08 += ref->w14;
9235 : bp0a += ref->w16;
9236 : i16 si = READ_I16(bp04,-4);
9237 : bp08 += ref->rc36.cx;
9238 : i16 di = bp08;
9239 :
9240 : if (si > di && (ref->w50 & 0x0001) != 0) {
9241 :
9242 : si -= di;
9243 : }
9244 : else {
9245 :
9246 : si = 0;
9247 : }
9248 :
9249 :
9250 : if ((ref->w50 & 0x0001) != 0)
9251 :
9252 : bp08 = 0;
9253 :
9254 : bp08 += si;
9255 :
9256 : si = READ_I16(bp04,-2);
9257 :
9258 : di = ref->rc36.cy +bp0a;
9259 :
9260 : if (si > di && (ref->w50 & 0x0002) != 0) {
9261 :
9262 : si -= di;
9263 : }
9264 : else {
9265 :
9266 : si = 0;
9267 : }
9268 :
9269 : if ((ref->w50 & 0x0002) == 0)
9270 :
9271 : bp0a = 0;
9272 :
9273 : bp0a += si;
9274 :
9275 : U16 bp0c;
9276 : if (ref->pb44 == _4976_4964) {
9277 :
9278 : si = _4976_00f0;
9279 : di = _4976_00f2;
9280 :
9281 : bp0c = 8;
9282 : }
9283 : else {
9284 :
9285 : si = READ_I16(ref->pb44,-4);
9286 :
9287 : di = READ_I16(ref->pb44,-2);
9288 :
9289 : bp0c = READ_I16(ref->pb44,-6);
9290 : }
9291 :
9292 : if (ref->w48 != 0xfffe) {
9293 :
9294 : FIRE_BLIT_PICTURE(
9295 : bp04,
9296 : ref->pb44,
9297 : &ref->rc36,
9298 : bp08,
9299 : bp0a,
9300 : READ_I16(bp04,-4),
9301 : si,
9302 : ref->w48,
9303 : ref->w50,
9304 : READ_I16(bp04,-6),
9305 : bp0c,
9306 : (ref->w56 == 0) ? NULL : ref->b58
9307 : );
9308 : }
9309 :
9310 : ref->w32 = bp08;
9311 : ref->w34 = bp0a;
9312 :
9313 : return;
9314 : }
9315 :
9316 :
9317 : void _0b36_1688(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit16u ww, i16 colorkey)
9318 : {
9319 :
9320 : ENTER(314);
9321 :
9322 : skxxx4 bp013a;
9323 : _0b36_0520(&bp013a, cls1, cls2, cls4);
9324 :
9325 : bp013a.w48 = colorkey;
9326 : bp013a.w24 = ww;
9327 :
9328 : bp013a.pb44 = _4976_4c16;
9329 :
9330 : bp013a.w28 = 0;
9331 : bp013a.w30 = 0;
9332 :
9333 : _0b36_0a3f(_0b36_06d3(&bp013a));
9334 :
9335 : return;
9336 : }
9337 :
9338 :
9339 : void _2e62_064a(Bit8u cls4, Bit16u yy, Bit16u zz)
9340 : {
9341 :
9342 : ENTER(0);
9343 :
9344 : if ((_4976_581a & zz) != 0)
9345 :
9346 : cls4++;
9347 :
9348 : _0b36_1688(0x07, 0x00, cls4, yy,-1);
9349 :
9350 : return;
9351 : }
9352 :
9353 :
9354 : void _2e62_00a3(Bit16u player, Bit16u xx)
9355 : {
9356 :
9357 : ENTER(2);
9358 :
9359 : U16 si = player;
9360 :
9361 : if (_4976_3ff0.w0 != 0xffff)
9362 :
9363 : return;
9364 :
9365 : Bit8u bp01 = (_4976_53b4[si].curHP() == 0) ? 1 : (((si +1) == _4976_52be) ? 9 : 0);
9366 :
9367 : _0b36_0c52(&_4976_3ff0, si +161, xx);
9368 :
9369 : DRAW_ICON_PICT_ENTRY(
9370 : 0x01,
9371 : 0x02,
9372 : bp01,
9373 : &_4976_3ff0,
9374 : si +161,
9375 : -1
9376 : );
9377 :
9378 : if (xx == 0)
9379 :
9380 : _4976_3ff0.w10 = 0;
9381 :
9382 : return;
9383 : }
9384 :
9385 :
9386 : void _2e62_061d(Bit16u player)
9387 : {
9388 :
9389 : ENTER(0);
9390 :
9391 : DRAW_ICON_PICT_ENTRY(
9392 : 0x16,
9393 : _4976_53b4[player].HeroType(),
9394 : 0x00,
9395 : &_4976_3ff0,
9396 : player +173,
9397 : -1
9398 : );
9399 :
9400 : return;
9401 : }
9402 :
9403 :
9404 : void _2e62_011b(U16 player)
9405 : {
9406 :
9407 : ENTER(32);
9408 :
9409 : SRECT bp0c;
9410 : _0b36_0d67(
9411 : &_4976_3ff0,
9412 : QUERY_EXPANDED_RECT(player +185, &bp0c)
9413 : );
9414 :
9415 : sk53b4 *bp04 = &_4976_53b4[player];
9416 :
9417 : i16 bp20[3][2];
9418 : bp20[0][0] = bp04->curHP();
9419 : bp20[0][1] = bp04->maxHP();
9420 : bp20[1][0] = bp04->curStamina();
9421 : bp20[1][1] = bp04->maxStamina();
9422 : bp20[2][0] = bp04->curMP();
9423 : bp20[2][1] = max_value(bp04->maxMP(), bp04->curMP());
9424 :
9425 : U16 di = player +193;
9426 :
9427 : for (i16 si = 0; si < 3; si++, di += 4) {
9428 :
9429 : if (bp20[si][1] != 0) {
9430 :
9431 : if (SCALE_RECT(
9432 : di,
9433 : &bp0c,
9434 : 10000,
9435 : (bp20[si][0] * i32(10000)) / bp20[si][1]
9436 : ) != NULL
9437 : ){
9438 :
9439 : SRECT bp14;
9440 : COPY_MEMORY(&bp0c, &bp14, 8);
9441 :
9442 : bp14.x += _4976_0114;
9443 : bp14.y += _4976_0116;
9444 :
9445 : _0b36_0ffe(
9446 : &_4976_3ff0,
9447 : &bp14,
9448 : _4976_4bda[0]
9449 : );
9450 :
9451 : _0b36_0ffe(
9452 : &_4976_3ff0,
9453 : &bp0c,
9454 : _4976_4bda[_4976_3fec[player]]
9455 : );
9456 : }
9457 : }
9458 :
9459 : }
9460 :
9461 : return;
9462 : }
9463 :
9464 :
9465 : void _2e62_0572(Bit16u player)
9466 : {
9467 :
9468 : ENTER(0);
9469 :
9470 : U16 si = player;
9471 :
9472 : DRAW_ICON_PICT_ENTRY(
9473 : 0x01,
9474 : 0x02,
9475 : 0x03,
9476 : &_4976_3ff0,
9477 : si +177,
9478 : 10
9479 : );
9480 :
9481 : DRAW_SIMPLE_STR(
9482 : &_4976_3ff0,
9483 : si +177,
9484 : _4976_4bda[15],
9485 : _4976_4bda[8],
9486 : _2e62_0265(_4976_53b4[si].w30(), 0, 3)
9487 : );
9488 :
9489 : return;
9490 : }
9491 :
9492 :
9493 : void _2e62_02ea(U16 xx, i16 aa, i16 bb)
9494 : {
9495 :
9496 : ENTER(8);
9497 :
9498 : U8 bp08[8];
9499 : SK_STRCPY(bp08, _2e62_0265(aa, 1, 3));
9500 :
9501 : SK_STRCAT(bp08, _4976_4024);
9502 :
9503 : SK_STRCAT(bp08, _2e62_0265(bb, 1, 3));
9504 :
9505 : _3929_0c37(xx, _4976_4bda[13], _4976_4bda[1] | 0x4000, bp08);
9506 :
9507 : return;
9508 : }
9509 :
9510 :
9511 : void _2e62_0360(sk53b4 *ref)
9512 : {
9513 :
9514 : ENTER(0);
9515 :
9516 : _2e62_02ea(550, ref->curHP(), ref->maxHP());
9517 :
9518 : _2e62_02ea(
9519 : 551,
9520 : ref->curStamina() / 10,
9521 : ref->maxStamina() / 10
9522 : );
9523 :
9524 : _2e62_02ea(
9525 : 552,
9526 : ref->curMP(),
9527 : ref->maxMP()
9528 : );
9529 :
9530 : return;
9531 : }
9532 :
9533 :
9534 : void _2405_00ec(U16 rectno, SRECT *rc)
9535 : {
9536 :
9537 : ENTER(4);
9538 :
9539 : i16 bp02 = _4976_0106;
9540 : i16 bp04 = _4976_0108;
9541 :
9542 : QUERY_BLIT_RECT(
9543 : NULL,
9544 : rc,
9545 : rectno,
9546 : &bp02,
9547 : &bp04,
9548 : -1
9549 : );
9550 :
9551 : return;
9552 : }
9553 :
9554 :
9555 : void _2405_011f(U16 rectno, SRECT *rc)
9556 : {
9557 :
9558 : ENTER(0);
9559 :
9560 : _2405_00ec(rectno, rc);
9561 :
9562 : INFLATE_RECT(rc, _4976_0112, _4976_0112);
9563 :
9564 : return;
9565 : }
9566 :
9567 :
9568 : void _2e62_05d4(Bit8u cls4, Bit16u rectno)
9569 : {
9570 :
9571 : ENTER(8);
9572 :
9573 : SRECT bp08;
9574 : _2405_011f(rectno, &bp08);
9575 :
9576 : DRAW_DIALOGUE_PARTS_PICT(
9577 : QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x02, cls4),
9578 : &bp08,
9579 : 12,
9580 : QUERY_GDAT_IMAGE_LOCALPAL(0x01, 0x02, cls4)
9581 : );
9582 :
9583 : return;
9584 : }
9585 :
9586 :
9587 : void _24a5_105b(Bit16u xx);
9588 :
9589 :
9590 : void _24a5_0e82(i16 xx, U16 yy, U16 zz, i16 vv, U16 ww)
9591 : {
9592 :
9593 : ENTER(24);
9594 :
9595 : i16 di = xx;
9596 :
9597 : i16 si = (di < -512) ? 8 : ((di < 0) ? 11 : zz);
9598 :
9599 : di -= vv;
9600 :
9601 : SRECT bp08;
9602 : if (SCALE_RECT(
9603 : yy,
9604 : &bp08,
9605 : (i32(10000) * di) / (2048 - vv),
9606 : 10000
9607 : ) != NULL
9608 : ) {
9609 :
9610 : SRECT bp18;
9611 : SRECT bp10;
9612 : if (ww != 0) {
9613 :
9614 : QUERY_EXPANDED_RECT(yy, &bp10);
9615 :
9616 : COPY_MEMORY(&bp10, &bp18, 8);
9617 :
9618 : if ((bp08.x +bp08.cx -1) == (bp10.x +bp10.cx -1)) {
9619 :
9620 : ww = 0;
9621 : }
9622 : else {
9623 :
9624 : bp10.cx = (bp10.x +bp10.cx -1) -(bp08.x +bp08.cx -1);
9625 :
9626 : bp10.x = bp08.x +bp08.cx +0;
9627 : }
9628 : }
9629 : else {
9630 :
9631 : COPY_MEMORY(&bp08, &bp18, 8);
9632 : }
9633 :
9634 : bp18.x += _4976_0142;
9635 : bp18.y += _4976_0142;
9636 :
9637 : FIRE_FILL_BACKBUFF_RECT(&bp18, _4976_4bda[0]);
9638 :
9639 : FIRE_FILL_BACKBUFF_RECT(&bp08, _4976_4bda[si]);
9640 :
9641 : if (ww != 0) {
9642 :
9643 : FIRE_FILL_BACKBUFF_RECT(&bp10, _4976_4bda[ww]);
9644 : }
9645 : }
9646 :
9647 : return;
9648 : }
9649 :
9650 :
9651 : void _24a5_0fb8()
9652 : {
9653 :
9654 : ENTER(4);
9655 :
9656 : sk53b4 *bp04 = &_4976_52af[_4976_52be];
9657 :
9658 : _4976_3d2e = 1;
9659 :
9660 : _0b36_1688(0x07, 0x00, 0x01, 0x01ee, -1);
9661 :
9662 : _24a5_0e82(bp04->curFood(), 496, 5, -1024, 0);
9663 :
9664 : _24a5_0e82(bp04->curWater(), 497, 14, -1024, 0);
9665 :
9666 : _0b36_1688(0x07, 0x00, 0x06, 500, 12);
9667 :
9668 : _0b36_1688(0x07, 0x00, 0x07, 501, 12);
9669 :
9670 : if (bp04->b31 != 0) {
9671 :
9672 : _0b36_1688(0x07, 0x00, 0x08, 502, 12);
9673 : }
9674 :
9675 : return;
9676 : }
9677 :
9678 :
9679 : void _24a5_000f(U8 *ref)
9680 : {
9681 :
9682 : ENTER(136);
9683 :
9684 : if (*ref == 12) {
9685 :
9686 : ref++;
9687 :
9688 : QUERY_TOPLEFT_OF_RECT(556, &_4976_52d8, &_4976_52da);
9689 : }
9690 :
9691 : if (*ref == 0)
9692 :
9693 : return;
9694 :
9695 : if (QUERY_MBCS_PRESENCE(ref) != 0) {
9696 :
9697 : DRAW_GAMELOAD_STR(_4976_52d8, _4976_52da, _4976_4bda[13], ref);
9698 :
9699 : _4976_52da += _4976_013a;
9700 :
9701 : return;
9702 : }
9703 :
9704 : U8 bp0088[128];
9705 : SK_STRCPY(bp0088, ref);
9706 :
9707 : U8 *bp04 = bp0088;
9708 :
9709 : for (i16 si = 0; *bp04 != 0; ) {
9710 :
9711 : U8 *bp08;
9712 : if (SK_STRLEN(bp04) > 18) {
9713 :
9714 : bp08 = bp04 +17;
9715 :
9716 : while (*bp08 != ' ') bp08--;
9717 :
9718 : *bp08 = 0;
9719 :
9720 : si = 1;
9721 : }
9722 : else {
9723 :
9724 : bp08 = NULL;
9725 : }
9726 :
9727 : DRAW_GAMELOAD_STR(_4976_52d8, _4976_52da, _4976_4bda[13], bp04);
9728 :
9729 : _4976_52da += _4976_0128;
9730 :
9731 : if (si != 0 && bp08 != NULL) {
9732 :
9733 : si = 0;
9734 :
9735 : bp08++;
9736 :
9737 : bp04 = bp08;
9738 : }
9739 : else {
9740 :
9741 : *bp04 = 0;
9742 : }
9743 :
9744 : }
9745 :
9746 : return;
9747 : }
9748 :
9749 :
9750 : void _24a5_07f6(ObjectID recordLink);
9751 :
9752 :
9753 : U8 *_2405_0029(U8 cls1, U8 cls2)
9754 : {
9755 :
9756 : ENTER(34);
9757 :
9758 : U8 bp22[30];
9759 : U8 *bp04 = QUERY_GDAT_TEXT(cls1, cls2, 0x18, bp22);
9760 :
9761 : return FORMAT_SKSTR(bp04, _4976_5290);
9762 : }
9763 :
9764 :
9765 : U8 *_2405_005e(ObjectID recordLink)
9766 : {
9767 :
9768 : ENTER(6);
9769 :
9770 : ObjectID di = recordLink;
9771 :
9772 : U8 bp01 = QUERY_CLS1_FROM_RECORD(di);
9773 :
9774 : U8 bp02 = QUERY_CLS2_FROM_RECORD(di);
9775 :
9776 : _4976_52e6 = 0xffff;
9777 :
9778 : if (bp01 == 0x15 && bp02 == 0x00) {
9779 :
9780 : Miscellaneous_item *bp06 = GET_ADDRESS_OF_RECORDA(di);
9781 :
9782 : i16 si = bp06->Who();
9783 :
9784 : if (si >= 0 && si < _4976_4c3c) {
9785 :
9786 : _4976_52e6 = si;
9787 : }
9788 : }
9789 :
9790 : return _2405_0029(bp01, bp02);
9791 : }
9792 :
9793 :
9794 : void _2405_02e8(ObjectID recordLink, i16 xx, U16 yy, U16 zz, U16 ww)
9795 : {
9796 :
9797 : ENTER(20);
9798 :
9799 : i16 si = xx;
9800 :
9801 : U8 bp0b;
9802 : U8 bp0c;
9803 : U8 bp09;
9804 : if (recordLink == ObjectID::FFFF) {
9805 :
9806 : bp0b = 7;
9807 : bp0c = 0;
9808 :
9809 : bp09 = _4976_3b74[si].b2 +U8(yy);
9810 : }
9811 : else {
9812 :
9813 : bp0b = QUERY_CLS1_FROM_RECORD(recordLink);
9814 : bp0c = QUERY_CLS2_FROM_RECORD(recordLink);
9815 :
9816 : bp09 = (si < 8)
9817 : ? _2405_014a(recordLink, si & 1, 1)
9818 : : _2405_014a(recordLink, si -8, 1);
9819 : }
9820 :
9821 : U16 di = _4976_3b74[si].w0;
9822 :
9823 : if (si < 0x26) {
9824 :
9825 : SRECT bp14;
9826 : QUERY_EXPANDED_RECT(di, &bp14);
9827 :
9828 : U8 *bp04;
9829 : if (si < 8) {
9830 :
9831 : bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x02, 0x00);
9832 :
9833 : DRAW_ICON_PICT_BUFF(
9834 : bp04,
9835 : &_4976_3ff0,
9836 : &bp14,
9837 : bp14.x - _4976_3ff0.w2.x,
9838 : bp14.y - _4976_3ff0.w2.y,
9839 : -1,
9840 : 0,
9841 : QUERY_GDAT_IMAGE_LOCALPAL(0x01, 0x02, 0x00)
9842 : );
9843 : }
9844 : else {
9845 :
9846 : bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x07, 0x00, 0x00);
9847 :
9848 : DRAW_DIALOGUE_PICT(
9849 : bp04,
9850 : _4976_4c16,
9851 : reinterpret_cast<blit_rc *>(&bp14),
9852 : bp14.x,
9853 : bp14.y,
9854 : -1,
9855 : QUERY_GDAT_IMAGE_LOCALPAL(0x07, 0x00, 0x00)
9856 : );
9857 : }
9858 : }
9859 :
9860 : if (ww != 0 && si < 14) {
9861 :
9862 : SRECT bp14;
9863 : _2405_011f(di, &bp14);
9864 :
9865 : U8 bp0a = (zz != 0)
9866 : ? 6
9867 : : (yy != 0)
9868 : ? 5
9869 : : 4;
9870 :
9871 : U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x02, bp0a);
9872 :
9873 : U8 *bp08 = QUERY_GDAT_IMAGE_LOCALPAL(0x01, 0x02, bp0a);
9874 :
9875 : if (si < 8) {
9876 :
9877 : DRAW_ICON_PICT_BUFF(
9878 : bp04,
9879 : &_4976_3ff0,
9880 : &bp14,
9881 : 0,
9882 : 0,
9883 : 12,
9884 : 0,
9885 : bp08
9886 : );
9887 : }
9888 :
9889 : DRAW_DIALOGUE_PARTS_PICT(
9890 : bp04,
9891 : &bp14,
9892 : 12,
9893 : bp08
9894 : );
9895 : }
9896 :
9897 : if (bp09 == 0xff)
9898 :
9899 : return;
9900 :
9901 : if (si < 8) {
9902 :
9903 : DRAW_ICON_PICT_ENTRY(
9904 : bp0b,
9905 : bp0c,
9906 : bp09,
9907 : &_4976_3ff0,
9908 : di,
9909 : 12
9910 : );
9911 : }
9912 : else {
9913 :
9914 : _0b36_1688(
9915 : bp0b,
9916 : bp0c,
9917 : bp09,
9918 : di,
9919 : 12
9920 : );
9921 : }
9922 :
9923 : return;
9924 : }
9925 :
9926 :
9927 : void _24a5_0ad2(Container *ref)
9928 : {
9929 :
9930 : ENTER(0);
9931 :
9932 : U16 si = 0;
9933 :
9934 :
9935 : for (ObjectID di = ref->GetContainedObject(); di != di.FFFE; di = GET_NEXT_RECORD_LINK(di), si++) {
9936 :
9937 : if (si >= 8)
9938 :
9939 : break;
9940 :
9941 : _2405_02e8(di, si +47, 0, 0, 0);
9942 :
9943 : }
9944 :
9945 : return;
9946 : }
9947 :
9948 :
9949 : U16 IS_MISCITEM_CURRENCY(ObjectID rl)
9950 : {
9951 :
9952 : ENTER(0);
9953 :
9954 : if (true
9955 : && rl.DBType() == dbMiscellaneous_item
9956 : && (QUERY_GDAT_DBSPEC_WORD_VALUE(rl, 0x00) & 0x4000) != 0
9957 : ) {
9958 :
9959 : return 1;
9960 : }
9961 :
9962 : return 0;
9963 : }
9964 :
9965 :
9966 : void _0cee_279d(ObjectID rl, i16 *xx)
9967 : {
9968 :
9969 : ENTER(2);
9970 :
9971 : ZERO_MEMORY(xx, 20);
9972 :
9973 : for (ObjectID si = GET_ADDRESS_OF_RECORD9(rl)->GetContainedObject(); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
9974 :
9975 : if (IS_MISCITEM_CURRENCY(si) == 0)
9976 :
9977 : continue;
9978 :
9979 : U16 bp02 = GET_DISTINCTIVE_ITEMTYPE(si);
9980 :
9981 : for (i16 di = 0; di < _4976_4c76; di++) {
9982 :
9983 : if (_4976_4c94[di] == bp02) {
9984 :
9985 : xx[di] += GET_ADDRESS_OF_RECORDA(si)->Charge() +1;
9986 : }
9987 :
9988 : }
9989 :
9990 : }
9991 :
9992 : return;
9993 : }
9994 :
9995 :
9996 : i16 _48ae_04b7(ObjectID rl, i16 xx)
9997 : {
9998 :
9999 : ENTER(142);
10000 :
10001 : U8 bp008e[128];
10002 : U8 *bp0e = QUERY_GDAT_TEXT(0x14, QUERY_CLS2_FROM_RECORD(rl), 0x40, bp008e);
10003 :
10004 : if (*bp0e == 0)
10005 :
10006 :
10007 : return -1;
10008 :
10009 : U16 bp02 = 0;
10010 : U16 di = 0;
10011 : U16 bp08 = 0;
10012 :
10013 : i16 si = -1;
10014 : i16 bp04 = -1;
10015 :
10016 : while (bp02 == 0) {
10017 :
10018 : U8 bp09 = *(bp0e++);
10019 :
10020 : if (bp09 >= '0' && bp09 <= '9') {
10021 :
10022 : di = di * 10 +bp09 -'0';
10023 :
10024 : continue;
10025 : }
10026 :
10027 : switch (bp09) {
10028 : case 0x4a:
10029 : {
10030 :
10031 : if (di != 0) {
10032 :
10033 : bp0e--;
10034 :
10035 : break;
10036 : }
10037 :
10038 : bp04 = 256;
10039 :
10040 : continue;
10041 : }
10042 : case 0x2d:
10043 : {
10044 :
10045 : si = di;
10046 : di = 0;
10047 :
10048 : continue;
10049 : }
10050 : case 0x00:
10051 : {
10052 :
10053 : bp02 = 1;
10054 :
10055 : break;
10056 : }
10057 : }
10058 :
10059 : if (si < 0)
10060 : si = di;
10061 :
10062 : for (; si <= di; bp08++, si++) {
10063 :
10064 : if (bp08 == xx) {
10065 :
10066 : for (i16 bp06 = 0; bp06 < _4976_4c76; bp06++) {
10067 :
10068 : if (_4976_4c94[bp06] == si +bp04) {
10069 :
10070 : return bp06;
10071 : }
10072 :
10073 : }
10074 : }
10075 :
10076 : }
10077 :
10078 : di = 0;
10079 :
10080 : si = bp04 = -1;
10081 :
10082 : }
10083 :
10084 : return -1;
10085 : }
10086 :
10087 :
10088 : U8 *SK_LTOA10(i32 value, U8 *str)
10089 : {
10090 :
10091 : ENTER(22);
10092 :
10093 : i32 bp08 = value;
10094 :
10095 : if (bp08 < 0) {
10096 :
10097 : bp08 = -bp08;
10098 : }
10099 :
10100 : U8 bp16[14];
10101 : U8 *bp04 = &bp16[13];
10102 :
10103 : bp04[0] = 0;
10104 :
10105 : do {
10106 :
10107 : bp04--;
10108 :
10109 : *bp04 = (bp08 % 10) + '0';
10110 :
10111 : bp08 = bp08 / 10;
10112 :
10113 : } while (bp08 != 0);
10114 :
10115 : if (value < 0) {
10116 :
10117 : *(--bp04) = '-';
10118 : }
10119 :
10120 : return SK_STRCPY(str, bp04);
10121 : }
10122 :
10123 :
10124 : void _24a5_0a06(ObjectID recordLink)
10125 : {
10126 :
10127 : ENTER(36);
10128 :
10129 : i32 bp06 = 0;
10130 :
10131 : i16 bp24[10];
10132 : _0cee_279d(recordLink, bp24);
10133 :
10134 : U16 bp02 = 618;
10135 :
10136 : U8 bp10[10];
10137 : for (i16 si = 0; si < 10; si++) {
10138 :
10139 : i16 di = _48ae_04b7(recordLink, si);
10140 :
10141 : if (di >= 0) {
10142 :
10143 : bp06 += bp24[di] * _4976_4c80[di];
10144 :
10145 : _3929_0bd7(
10146 : bp02++,
10147 : _4976_4bda[13],
10148 : SK_LTOA10(bp24[di], bp10)
10149 : );
10150 : }
10151 :
10152 : }
10153 :
10154 : _3929_0bd7(
10155 : 569,
10156 : _4976_4bda[13],
10157 : SK_LTOA10(bp06, bp10)
10158 : );
10159 :
10160 : return;
10161 : }
10162 :
10163 :
10164 : U16 _2759_0155(ObjectID rl)
10165 : {
10166 :
10167 : ENTER(4);
10168 :
10169 : ObjectID si = rl;
10170 :
10171 : if (si == si.FFFF) {
10172 :
10173 :
10174 : return 0;
10175 : }
10176 :
10177 : U8 bp01 = QUERY_CLS1_FROM_RECORD(si);
10178 : U8 bp02 = QUERY_CLS2_FROM_RECORD(si);
10179 : U8 bp03 = 0x08;
10180 :
10181 : for (; bp03 < 12; bp03++) {
10182 :
10183 : if (true
10184 : && QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtText, bp03) != 0
10185 : && QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnCM) != 0
10186 : && QUERY_CMDSTR_ENTRY(
10187 : QUERY_CLS1_FROM_RECORD(si),
10188 : QUERY_CLS2_FROM_RECORD(si),
10189 : bp03,
10190 : CnNC
10191 : ) != 0
10192 : ) {
10193 :
10194 : return 1;
10195 : }
10196 :
10197 : }
10198 :
10199 : return 0;
10200 : }
10201 :
10202 :
10203 : void _24a5_0b0f(U16 rectno, i16 curVal, i16 maxVal, U8 chr, U16 zz)
10204 : {
10205 :
10206 : ENTER(10);
10207 :
10208 : i16 si = curVal;
10209 :
10210 : SRECT bp08;
10211 : if (QUERY_EXPANDED_RECT(rectno, &bp08) == 0)
10212 :
10213 :
10214 : return;
10215 :
10216 : si = (i32(si) << 11) / maxVal;
10217 :
10218 : _24a5_0e82(si, rectno, zz, 0, 1);
10219 :
10220 : U8 bp0a[2];
10221 : bp0a[1] = 0;
10222 : bp0a[0] = chr;
10223 :
10224 : bp08.cy -= 2;
10225 :
10226 : DRAW_STRONG_TEXT(
10227 : _4976_4c16,
10228 : -1,
10229 : _4976_00f6,
10230 : bp08.x -9,
10231 : bp08.cy -1,
10232 : _4976_4bda[14],
10233 : _4976_4bda[0] | 0x4000,
10234 : bp0a
10235 : );
10236 :
10237 : bp0a[0] = 0x60;
10238 :
10239 : DRAW_STRONG_TEXT(
10240 : _4976_4c16,
10241 : -1,
10242 : _4976_00f6,
10243 : bp08.x +3,
10244 : bp08.y +bp08.cy -1,
10245 : _4976_4bda[15],
10246 : _4976_4bda[0] | 0x4000,
10247 : bp0a
10248 : );
10249 :
10250 : bp0a[0] = 0x65;
10251 :
10252 : DRAW_STRONG_TEXT(
10253 : _4976_4c16,
10254 : -1,
10255 : _4976_00f6,
10256 : bp08.x +bp08.cx -1 - _4976_011e -1,
10257 : bp08.y +bp08.cy -1,
10258 : _4976_4bda[15],
10259 : _4976_4bda[0] | 0x4000,
10260 : bp0a
10261 : );
10262 :
10263 : return;
10264 : }
10265 :
10266 :
10267 : U16 _24a5_0c35(ObjectID recordLink, Bit16u xx)
10268 : {
10269 :
10270 : ENTER(148);
10271 :
10272 : ObjectID si = recordLink;
10273 :
10274 : sk3d79 bp0e = _4976_3d79;
10275 :
10276 : if (si == si.FFFF)
10277 :
10278 : return 0;
10279 :
10280 : GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(si);
10281 :
10282 : _24a5_000f(&_4976_3d7d);
10283 :
10284 : U16 bp08 = si.DBType();
10285 :
10286 : if (bp08 == dbScroll) {
10287 :
10288 : _24a5_07f6(si);
10289 :
10290 :
10291 : return 1;
10292 : }
10293 :
10294 : _4976_3d2e = 3;
10295 :
10296 : if (xx == 0) {
10297 :
10298 :
10299 : return 0;
10300 : }
10301 :
10302 : _0b36_1688(0x07, 0x00, 0x01, 0x01ee, -1);
10303 :
10304 : U8 bp09;
10305 : U8 bp0a;
10306 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(
10307 : bp09 = QUERY_CLS1_FROM_RECORD(si),
10308 : bp0a = QUERY_CLS2_FROM_RECORD(si),
10309 : dtImage,
10310 : 0x11
10311 : ) != 0
10312 : ) {
10313 :
10314 : _0b36_1688(bp09, bp0a, 0x11, 0x01ee, 12);
10315 : }
10316 :
10317 : _0b36_1688(0x07, 0x00, 0x05, 0x01f8, 12);
10318 :
10319 : _3929_0bd7(0x1fa, _4976_4bda[13], _2405_005e(si));
10320 :
10321 : _2405_02e8(si, 0x2e, 0, 0, 0);
10322 :
10323 : U16 bp06 = QUERY_ITEM_WEIGHT(si);
10324 :
10325 : _4976_52e8 = bp06 / 10;
10326 :
10327 : _4976_52dc = bp06 % 10;
10328 :
10329 : U8 bp0094[128];
10330 : _24a5_000f(QUERY_GDAT_TEXT(0x07, 0x00, 0x1f, bp0094));
10331 :
10332 : if (bp08 == dbContainer) {
10333 :
10334 : if (IS_CONTAINER_CHEST(si) != 0) {
10335 :
10336 : _24a5_0ad2(_bp04->castToContainer());
10337 :
10338 :
10339 : return 1;
10340 : }
10341 :
10342 : if (IS_CONTAINER_MONEYBOX(si) == 0) {
10343 :
10344 :
10345 : return 1;
10346 : }
10347 :
10348 : _24a5_0a06(si);
10349 :
10350 : return 1;
10351 : }
10352 :
10353 : U16 bp10 = 0;
10354 :
10355 : if (_2759_0155(si) != 0) {
10356 :
10357 : i16 di = ADD_ITEM_CHARGE(si, 0);
10358 :
10359 : if (di != 0) {
10360 :
10361 : _24a5_0b0f(
10362 : bp0e.w0[bp10++],
10363 : di,
10364 : GET_MAX_CHARGE(si),
10365 : 0x71,
10366 : 4
10367 : );
10368 : }
10369 : }
10370 :
10371 : U8 bp11;
10372 : U16 bp14;
10373 : i16 di;
10374 : switch (si.DBType()) {
10375 : case dbPotion:
10376 : {
10377 : Potion *bp04 = _bp04->castToPotion();
10378 :
10379 :
10380 : bp11 = 0x75;
10381 :
10382 : di = bp04->PotionPower();
10383 :
10384 : bp14 = 0x00ff;
10385 :
10386 : break;
10387 : }
10388 : case dbWeapon:
10389 : {
10390 :
10391 : bp11 = 0x72;
10392 : bp14 = 0x0050;
10393 :
10394 : di = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x08);
10395 :
10396 : if (di == 0) {
10397 :
10398 : di = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x09);
10399 :
10400 : bp11 = 0x73;
10401 : bp14 = 0x0064;
10402 : }
10403 :
10404 : break;
10405 : }
10406 : case dbCloth:
10407 : {
10408 :
10409 : bp11 = 0x72;
10410 :
10411 : di = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x0b) & 0xff;
10412 :
10413 : bp14 = 0x00c8;
10414 : }
10415 : default:
10416 : {
10417 :
10418 :
10419 : return 1;
10420 : }
10421 : }
10422 :
10423 : if (di != 0) {
10424 :
10425 : _24a5_0b0f(bp0e.w0[bp10], di, bp14, bp11, 5);
10426 : }
10427 :
10428 : return 1;
10429 : }
10430 :
10431 :
10432 : U16 _2e62_03b5(Bit16u player, Bit16u itemNo, Bit16u yy)
10433 : {
10434 :
10435 : ENTER(8);
10436 :
10437 : U16 bp04 = 0;
10438 : U16 bp06 = 0;
10439 :
10440 : U16 bp08 = yy;
10441 :
10442 : U16 si;
10443 : if (player +1 != _4976_52be) {
10444 :
10445 : if (itemNo > 1 || player +1 == _4976_4bfc)
10446 :
10447 :
10448 : return 0;
10449 :
10450 : si = (player << 1) + itemNo;
10451 : }
10452 : else {
10453 :
10454 : si = itemNo +8;
10455 : }
10456 :
10457 : ObjectID di = _4976_53b4[player].Possess(itemNo);
10458 :
10459 : if (itemNo <= 1) {
10460 :
10461 : if (player +1 == _4976_5366 && itemNo == _4976_5354)
10462 :
10463 : bp04 = 1;
10464 :
10465 : if ((!_4976_3b74[si].b5_0_0()) != (!bp04)) {
10466 :
10467 : bp08 = 1;
10468 :
10469 : _4976_3b74[si].b5 ^= 1;
10470 : }
10471 :
10472 : }
10473 :
10474 : if (itemNo <= 5) {
10475 :
10476 : if ((_4976_53b4[player].w52 & (1 << itemNo)) != 0)
10477 :
10478 : bp06 = 1;
10479 :
10480 : if ((!_4976_3b74[si].b5_1_1()) != (!bp06)) {
10481 :
10482 : bp08 = 1;
10483 :
10484 : _4976_3b74[si].b5 ^= 2;
10485 : }
10486 : }
10487 :
10488 : if (di != di.FFFF) {
10489 :
10490 : U8 bp01;
10491 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(di, 0x00) & 0x8000) != 0) {
10492 :
10493 : bp01 = _2405_014a(di, itemNo, 1);
10494 : }
10495 : else {
10496 :
10497 : bp01 = _2405_014a(di, itemNo, 0);
10498 : }
10499 :
10500 : if (_4976_3b74[si].b3 != bp01) {
10501 :
10502 : yy = 1;
10503 :
10504 : _4976_3b74[si].b3 = bp01;
10505 : }
10506 :
10507 : U8 bp02 = QUERY_CLS2_FROM_RECORD(di);
10508 :
10509 : if (bp02 != _4976_3b74[si].b4) {
10510 :
10511 : yy = 1;
10512 :
10513 : _4976_3b74[si].b4 = bp02;
10514 : }
10515 : }
10516 :
10517 : if (yy != 0 || bp08 != 0 || _4976_3b74[si].w6 != di) {
10518 :
10519 : if (di == 0xffff || si < 8)
10520 :
10521 : bp08 = 1;
10522 :
10523 : if (si < 8) {
10524 :
10525 : _2e62_00a3(player, 0);
10526 : }
10527 :
10528 : _4976_3b74[si].w6 = di;
10529 :
10530 : _2405_02e8(di, si, bp06, bp04, bp08);
10531 :
10532 : return 1;
10533 : }
10534 :
10535 : return 0;
10536 : }
10537 :
10538 :
10539 : void _3929_0c37(Bit16u rectno, Bit8u clr1, Bit16u clr2, Bit8u *localpal)
10540 : {
10541 :
10542 : ENTER(12);
10543 :
10544 : i16 bp02;
10545 : i16 bp04;
10546 : if (_3929_03dc(localpal, &bp02, &bp04) != 0) {
10547 :
10548 : SRECT bp0c;
10549 : if (QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1) != 0) {
10550 :
10551 : DRAW_STRONG_TEXT(
10552 : _4976_4c16,
10553 : -1,
10554 : _4976_00f6,
10555 : bp0c.x,
10556 : bp0c.y +bp0c.cy,
10557 : clr1,
10558 : clr2,
10559 : localpal
10560 : );
10561 : }
10562 : }
10563 :
10564 : return;
10565 : }
10566 :
10567 :
10568 : U16 _2c1d_0ea2(sk53b4 *ref, U16 xx, U16 yy)
10569 : {
10570 :
10571 : ENTER(2);
10572 :
10573 : i16 si = ref->b72[xx][yy];
10574 :
10575 : U16 di;
10576 : U8 bp01;
10577 : if (true
10578 : && (yy == 0)
10579 : && (di = ref->w257) != 0
10580 : && (bp01 = ref->b256) >= 3
10581 : && (bp01) <= 6
10582 : && (bp01 + i16(-2)) == xx
10583 : ) {
10584 :
10585 : if (di > 100)
10586 :
10587 : di = 100;
10588 :
10589 : si += RAND16(((si * di) >> 7) +1) +4;
10590 : }
10591 :
10592 : return BETWEEN_VALUE(10, si +(ref->b86[xx]), 220);
10593 : }
10594 :
10595 :
10596 : void FILL_STR(Bit8u *buff, Bit16u count, Bit8u value, Bit16u delta)
10597 : {
10598 :
10599 :
10600 : for (Bit16u si = 0, di = 0; di < count; si += delta, di++) {
10601 : buff[si] = value;
10602 : }
10603 : }
10604 :
10605 :
10606 : U8 *_2e62_0265(U16 xx, U16 yy, U16 zz)
10607 : {
10608 :
10609 : ENTER(6);
10610 :
10611 : U16 si = xx;
10612 :
10613 : if (yy != 0) {
10614 :
10615 : FILL_STR(_4976_57fc, 4, ' ', 1);
10616 : }
10617 :
10618 : U8 *bp04 = _4976_5800;
10619 :
10620 : *bp04 = 0;
10621 :
10622 : if (si == 0) {
10623 :
10624 : *(--bp04) = '0';
10625 :
10626 : }
10627 : else {
10628 :
10629 : U16 bp06;
10630 : while ((bp06 = si) != 0) {
10631 :
10632 : bp04--;
10633 :
10634 : si = si / 10;
10635 :
10636 : *bp04 = U8(bp06) + '0' -(si * 10);
10637 :
10638 : };
10639 : }
10640 :
10641 : if (yy != 0) {
10642 :
10643 : return &_4976_57fc[4 - zz];
10644 : }
10645 :
10646 : return bp04;
10647 : }
10648 :
10649 :
10650 : U8 *SK_STRCPY(U8 *strTo, const U8 *strFrom);
10651 :
10652 : U8 *SK_STRCAT(U8 *strTo, const U8 *strFrom);
10653 :
10654 :
10655 : void _24a5_1532()
10656 : {
10657 :
10658 : ENTER(144);
10659 :
10660 : U16 di = _4976_52be -1;
10661 :
10662 : sk53b4 *bp04 = &_4976_53b4[di];
10663 :
10664 : _4976_3d2e = 2;
10665 :
10666 : _0b36_1688(0x07, 0x00, 0x01, 494, -1);
10667 :
10668 : i16 bp0c;
10669 : i16 bp10;
10670 : QUERY_TOPLEFT_OF_RECT(557, &bp0c, &bp10);
10671 :
10672 : U8 bp0090[128];
10673 : for (U16 bp06 = 0; bp06 < 3; bp06++) {
10674 :
10675 : i16 si = min_value(16, _2c1d_0a47(di, bp06, 1));
10676 :
10677 : if (si != 1) {
10678 :
10679 : _4976_52e4 = bp06;
10680 :
10681 : QUERY_GDAT_TEXT(0x07, 0x00, _4976_3d44[4 +si], bp0090);
10682 :
10683 : DRAW_GAMELOAD_STR(bp0c, bp10, _4976_4bda[(_4976_580a[di][bp06] != 0) ? 7 : 13], bp0090);
10684 :
10685 : _4976_52af->b8[9 +bp06] = _4976_580a[di][bp06];
10686 :
10687 : bp10 += _4976_0128;
10688 : }
10689 :
10690 : }
10691 :
10692 : i16 bp0e;
10693 : QUERY_TOPLEFT_OF_RECT(559, &bp0e, &bp10);
10694 :
10695 : for (U16 bp06 = 1; bp06 <= 6; bp06++) {
10696 :
10697 : DRAW_GAMELOAD_STR(
10698 : bp0c,
10699 : bp10,
10700 : _4976_4bda[13],
10701 : QUERY_GDAT_TEXT(0x07, 0x00, bp06 +0x20, bp0090)
10702 : );
10703 :
10704 : U16 si = _2c1d_0ea2(bp04, bp06, 0);
10705 :
10706 : U16 bp0a = _2c1d_0ea2(bp04, bp06, 1);
10707 :
10708 : U16 bp08 = (si < bp0a) ? 8 : ((si > bp0a) ? 7 : 13);
10709 :
10710 : DRAW_GAMELOAD_STR(
10711 : bp0e,
10712 : bp10,
10713 : _4976_4bda[bp08],
10714 : _2e62_0265(si, 1, 3)
10715 : );
10716 :
10717 : SK_STRCPY(bp0090, &_4976_3d7f);
10718 :
10719 : SK_STRCAT(bp0090, _2e62_0265(bp0a, 1, 3));
10720 :
10721 : DRAW_GAMELOAD_STR(
10722 : _4976_0126 * 3 +bp0e,
10723 : bp10,
10724 : _4976_4bda[13],
10725 : bp0090
10726 : );
10727 :
10728 : bp10 += _4976_0128;
10729 :
10730 : }
10731 :
10732 : return;
10733 : }
10734 :
10735 :
10736 : void _2e62_0670(i16 player)
10737 : {
10738 :
10739 : ENTER(164);
10740 :
10741 : Bit16u bp14 = 0;
10742 : Bit16u bp16 = 0;
10743 : Bit16u bp18 = 0;
10744 : Bit16u bp1a = 0;
10745 : Bit16u bp1c = 0;
10746 :
10747 : sk53b4 *bp04 = &_4976_53b4[player];
10748 :
10749 : Bit16u si = bp04->w50;
10750 :
10751 : Bit16u bp08 = (player +1 == _4976_52be) ? 1 : 0;
10752 :
10753 : if (bp08 != 0 && _4976_022c != 0)
10754 :
10755 : si |= 0x8000;
10756 :
10757 : if (_4976_52be != _4976_5802 || (si & 0x8000) != 0) {
10758 :
10759 : if (bp08 != 0) {
10760 :
10761 : _0b36_1688(0x07, 0x00, 0x00, 0x04, -1);
10762 :
10763 : bp1c = 1;
10764 : bp18 = 1;
10765 :
10766 : _4976_5802 = _4976_52be;
10767 :
10768 : bp14 = 15;
10769 :
10770 : si |= 0x7c00;
10771 : }
10772 : else {
10773 :
10774 : _4976_5802 = 0;
10775 : }
10776 : }
10777 :
10778 : else if (bp08 != 0) {
10779 :
10780 : bp14 = _4976_581a ^ _4976_5804;
10781 : }
10782 :
10783 : if (bp14 != 0) {
10784 :
10785 : if (_4976_4bfc == 0) {
10786 :
10787 : if ((bp14 & 1) != 0) {
10788 :
10789 : _2e62_064a(0x0013, 0x0267, 0x0001);
10790 : }
10791 :
10792 : if ((bp14 & 8) != 0) {
10793 :
10794 : _2e62_064a(0x000f, 0x0232, 0x0008);
10795 : }
10796 :
10797 : if ((bp14 & 4) != 0) {
10798 :
10799 : _2e62_064a(0x000d, 0x0234, 0x0004);
10800 : }
10801 : }
10802 :
10803 : if ((bp14 & 2) != 0) {
10804 :
10805 : _2e62_064a(0x000b, 0x0236, 0x0002);
10806 : }
10807 :
10808 : bp18 = 1;
10809 :
10810 : _4976_5804 = _4976_581a;
10811 : }
10812 :
10813 : if ((si & 0x4000) != 0) {
10814 :
10815 : _2e62_00a3(player, 1);
10816 :
10817 : bp1a = 1;
10818 :
10819 : if (bp04->curHP() != 0) {
10820 :
10821 : if (bp08 != 0) {
10822 :
10823 : _2e62_061d(player);
10824 :
10825 : si |= 0x0800;
10826 : }
10827 : else {
10828 :
10829 : si |= 0x0c00;
10830 : }
10831 :
10832 : bp16 = 1;
10833 : }
10834 : else {
10835 :
10836 : DRAW_NAME_STR(
10837 : &_4976_3ff0,
10838 : player +165,
10839 : _4976_4bda[15],
10840 : _4976_4bda[1] |0x4000,
10841 : bp04->b0
10842 : );
10843 : }
10844 : }
10845 :
10846 : if (bp04->curHP() != 0) {
10847 :
10848 : if ((si & 0x0800) != 0) {
10849 :
10850 : _2e62_00a3(player, 0);
10851 :
10852 : bp1a = 1;
10853 :
10854 : _2e62_011b(player);
10855 :
10856 : if (bp04->w46 != 0xffff) {
10857 :
10858 : _2e62_0572(player);
10859 : }
10860 :
10861 : if (bp08 != 0) {
10862 :
10863 : SRECT bp24;
10864 : QUERY_EXPANDED_RECT(549, &bp24);
10865 :
10866 : DRAW_DIALOGUE_PICT(
10867 : QUERY_GDAT_IMAGE_ENTRY_BUFF(0x07, 0x00, 0x00),
10868 : _4976_4c16,
10869 : reinterpret_cast<blit_rc *>(&bp24),
10870 : bp24.x,
10871 : bp24.y,
10872 : -1,
10873 : QUERY_GDAT_IMAGE_LOCALPAL(0x07, 0x00, 0x00)
10874 : );
10875 :
10876 : _2e62_0360(bp04);
10877 :
10878 : Bit8u bp0d;
10879 : if (bp04->curFood() < 0 || bp04->curWater() < 0 || bp04->b31 != 0) {
10880 :
10881 : bp0d = 5;
10882 : }
10883 : else {
10884 :
10885 : bp0d = 4;
10886 : }
10887 :
10888 : _2e62_05d4(bp0d, 545);
10889 :
10890 : bp0d = 4;
10891 :
10892 : for (i16 di = 1; di <= 6; di++) {
10893 :
10894 : if (bp04->b72[di][0] < bp04->b72[di][1]) {
10895 :
10896 : bp0d = 5;
10897 :
10898 : break;
10899 : }
10900 :
10901 : }
10902 :
10903 : _2e62_05d4(bp0d, 546);
10904 :
10905 : bp18 = 1;
10906 : }
10907 : }
10908 :
10909 : ObjectID bp12;
10910 : if (bp08 != 0) {
10911 :
10912 : if (_4976_4c38 != 0) {
10913 :
10914 : bp12 = _4976_57c8.w0;
10915 : }
10916 :
10917 : else if (_4976_4bfe != 0) {
10918 :
10919 : bp12 = ObjectID::FFFF;
10920 : }
10921 : else {
10922 :
10923 : bp12 = bp04->Possess(1);
10924 : }
10925 :
10926 :
10927 : if (false
10928 : || _4976_3d30 != bp12
10929 : || _4976_4bfe != _4976_5806
10930 : || _4976_4c38 != _4976_5808
10931 : || (si & 0x2000) != 0
10932 : ) {
10933 :
10934 : _0b36_1688(0x07, 0x00, 0x25, 545, -1);
10935 :
10936 : _0b36_1688(0x07, 0x00, (_4976_4c38 != 0) ? 0x21 : 0x20, 546, -1);
10937 :
10938 : if (_4976_4c38 != 0) {
10939 :
10940 : if (bp12 == ObjectID::FFFF) {
10941 :
10942 : _24a5_1532();
10943 : }
10944 : else {
10945 :
10946 : _24a5_0c35(bp12, 1);
10947 : }
10948 : }
10949 : else {
10950 :
10951 : if (_4976_4bfc != 0) {
10952 :
10953 : if (_4976_4bfe == 0) {
10954 :
10955 : _24a5_105b(0);
10956 : }
10957 : else {
10958 :
10959 : goto _09e4;
10960 : }
10961 : }
10962 :
10963 : else if (_24a5_0c35(bp12, 0) == 0) {
10964 :
10965 : _09e4:
10966 : _24a5_0fb8();
10967 : }
10968 : }
10969 :
10970 : _4976_3d30 = bp12;
10971 : _4976_5808 = _4976_4c38;
10972 : _4976_5806 = _4976_4bfe;
10973 :
10974 : goto _0a25;
10975 : }
10976 : else if (_4976_3d30 != ObjectID::FFFF) {
10977 :
10978 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(_4976_3d30, 0x00) & 0x0020) != 0) {
10979 :
10980 : _24a5_0c35(_4976_3d30, _4976_4c38);
10981 :
10982 : _0a25:
10983 : bp18 = 1;
10984 : }
10985 : }
10986 :
10987 : for (i16 bp0c = 0; bp0c < 30; bp0c++) {
10988 :
10989 : bp18 |= _2e62_03b5(player, bp0c, bp1c);
10990 :
10991 : }
10992 : }
10993 : else {
10994 :
10995 : for (i16 bp0c = 0; bp0c <= 1; bp0c++) {
10996 :
10997 : bp1a |= _2e62_03b5(player, bp0c, bp16);
10998 :
10999 : }
11000 : }
11001 :
11002 : U16 di;
11003 : if ((si & 0x0400) != 0) {
11004 :
11005 : di = _4976_4bda[(player == _4976_3fc6 && _4976_4bfc == 0) ? 9 : 15];
11006 : }
11007 :
11008 : if (bp08 != 0 && (si & 0x1000) != 0) {
11009 :
11010 : SRECT bp24;
11011 : QUERY_EXPANDED_RECT(554, &bp24);
11012 :
11013 : DRAW_DIALOGUE_PICT(
11014 : QUERY_GDAT_IMAGE_ENTRY_BUFF(0x07, 0x00, 0x00),
11015 : _4976_4c16,
11016 : reinterpret_cast<blit_rc *>(&bp24),
11017 : bp24.x,
11018 : bp24.y,
11019 : -1,
11020 : QUERY_GDAT_IMAGE_LOCALPAL(0x07, 0x00, 0x00)
11021 : );
11022 :
11023 : U16 bp10 = _2c1d_203d(player);
11024 :
11025 : di = _2c1d_0ffc(bp04);
11026 :
11027 : U16 bp06;
11028 : if (di < bp10) {
11029 :
11030 : bp06 = 8;
11031 : }
11032 : else {
11033 :
11034 : bp06 = ((i32(bp10) << 3) > (i16(di) * i32(5))) ? 11 : 13;
11035 : }
11036 :
11037 : _4976_52e0 = di = bp10 / 10;
11038 :
11039 : _4976_52fa = bp10 - di * 10;
11040 :
11041 : _4976_52f6 = _2c1d_0ffc(bp04) / 10;
11042 :
11043 : Bit8u bp00a4[128];
11044 : QUERY_GDAT_TEXT(0x07, 0x00, 0x2a, bp00a4);
11045 :
11046 : _3929_0c37(555, _4976_4bda[0], _4976_4bda[1] | 0x4000, bp00a4);
11047 :
11048 : bp18 = 1;
11049 : }
11050 : }
11051 :
11052 : if (bp1a != 0) {
11053 :
11054 : _0b36_0cbe(&_4976_3ff0, 1);
11055 : }
11056 :
11057 : if (bp18 != 0) {
11058 :
11059 : _4976_022c = 0;
11060 :
11061 : _44c8_1be8(0);
11062 : }
11063 :
11064 : bp04->w50 &= 0x03ff;
11065 :
11066 : return;
11067 : }
11068 :
11069 :
11070 : void _1031_111e(Bit16u xx)
11071 : {
11072 :
11073 : ENTER(72);
11074 :
11075 : i16 di = xx;
11076 :
11077 : if (_4976_4df4 != 0) {
11078 :
11079 : if (_4976_4df4 <= di) {
11080 :
11081 : di -= _4976_4df4;
11082 :
11083 : _4976_4df4 = 0;
11084 : }
11085 : else {
11086 :
11087 : _4976_4df4 -= di;
11088 :
11089 : return;
11090 : }
11091 : }
11092 :
11093 : if (_4976_4e62 != 0 || _4976_4e48 != 0 || _4976_4e64 != 0 || _4976_4e96 == NULL)
11094 :
11095 : return;
11096 :
11097 : sk3f6c bp48;
11098 : bp48.w0 = 0xffff;
11099 : Bit8u bp05;
11100 : do {
11101 :
11102 : bp05 = *(_4976_4e96++);
11103 :
11104 : i16 si;
11105 : switch (bp05 & 0xff3f) {
11106 : case 0:
11107 : {
11108 :
11109 : _4976_4df4 = *_4976_4e96;
11110 :
11111 : _4976_4e96++;
11112 :
11113 : break;
11114 : }
11115 : case 4:
11116 : case 6:
11117 : {
11118 :
11119 : si = _4976_4e5e +1;
11120 :
11121 : if (si > 2)
11122 :
11123 : si = 0;
11124 :
11125 : if (_4976_4e60 == si) {
11126 :
11127 : if (_4976_4e62 == 0)
11128 :
11129 : _4976_4e62 = 1;
11130 :
11131 : _4976_4e96--;
11132 :
11133 : goto _1534;
11134 : }
11135 :
11136 : _4976_4e4e = _4976_4e6c[_4976_4e5e];
11137 :
11138 : _4976_4e5e = si;
11139 :
11140 : if ((bp05 & 0xff3f) == 4)
11141 :
11142 : break;
11143 :
11144 : goto _1201;
11145 : }
11146 : case 1:
11147 : {
11148 :
11149 : _1201:
11150 : _4976_4e62 = _4976_4e5e - _4976_4e60;
11151 :
11152 : if (_4976_4e62 >= 0)
11153 :
11154 : break;
11155 :
11156 : _4976_4e62 += 3;
11157 :
11158 : break;
11159 : }
11160 : case 2:
11161 : {
11162 :
11163 : _4976_4e48 = 1;
11164 :
11165 : break;
11166 : }
11167 : case 3:
11168 : {
11169 :
11170 : _4976_4e64 = 1;
11171 :
11172 : break;
11173 : }
11174 : case 5:
11175 : {
11176 :
11177 : if (HANDLE_UI_EVENT(&_4976_4e4e) != 0) {
11178 :
11179 : if (_4976_4e5c == 0)
11180 :
11181 : break;
11182 :
11183 : goto _1201;
11184 : }
11185 :
11186 : _4976_4e96--;
11187 :
11188 : break;
11189 : }
11190 : case 7:
11191 : {
11192 :
11193 : Bit8u bp06 = *(_4976_4e96++);
11194 :
11195 : Bit8u bp07 = *(_4976_4e96++);
11196 :
11197 : Bit8u bp08 = *(_4976_4e96++);
11198 :
11199 : Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp06, bp07, bp08);
11200 :
11201 : SRECT bp14;
11202 : _1031_10c8(&bp48, &bp14, READ_UI16(bp04,-4), READ_UI16(bp04,-2));
11203 :
11204 : DRAW_ICON_PICT_BUFF(
11205 : QUERY_GDAT_IMAGE_ENTRY_BUFF(bp06, bp07, bp08),
11206 : &bp48,
11207 : &bp14,
11208 : 0,
11209 : 0,
11210 : *(_4976_4e96++),
11211 : 0,
11212 : QUERY_GDAT_IMAGE_LOCALPAL(bp06, bp07, bp08)
11213 : );
11214 :
11215 : break;
11216 : }
11217 : case 8:
11218 : {
11219 :
11220 : si = GET_PLAYER_AT_POSITION((*(_4976_4e96++) + _4976_4bf6) & 3);
11221 :
11222 : if (si < 0)
11223 :
11224 : break;
11225 :
11226 : _29ee_058d(si, 1);
11227 :
11228 : _0b36_0cbe(&_4976_3f6c, 1);
11229 :
11230 : break;
11231 : }
11232 : case 9:
11233 : {
11234 :
11235 : if (_4976_5366 > 0) {
11236 :
11237 : si = _4976_5366 -1;
11238 : }
11239 :
11240 : else if (_4976_4e52 >= 0x74 && _4976_4e52 <= 0x7b) {
11241 :
11242 : si = (_4976_4e52 -0x74) >> 1;
11243 : }
11244 : else {
11245 :
11246 :
11247 : _4976_4e96++;
11248 :
11249 : break;
11250 : }
11251 :
11252 : _29ee_026c(si, *(_4976_4e96++), 1);
11253 :
11254 : goto _148a;
11255 : }
11256 : case 10:
11257 : {
11258 :
11259 : Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x05, 0x08);
11260 :
11261 : SRECT bp14;
11262 : _1031_10c8(&bp48, &bp14, READ_UI16(bp04,-4), READ_UI16(bp04,-2));
11263 :
11264 : DRAW_ICON_PICT_BUFF(
11265 : QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x05, 0x08),
11266 : &bp48,
11267 : &bp14,
11268 : 0,
11269 : 0,
11270 : -1,
11271 : 0,
11272 : QUERY_GDAT_IMAGE_LOCALPAL(0x01, 0x05, 0x08)
11273 : );
11274 :
11275 : _4976_4df6[0] = _4976_52af[_4976_5366].b30 +Bit8u(_4976_4e52) +0xfb;
11276 :
11277 : i16 bp0a;
11278 : i16 bp0c;
11279 : _3929_03dc(_4976_4df6, &bp0a, &bp0c);
11280 :
11281 : CALC_CENTERED_RECT_IN_RECT(&bp14, &bp48.w2, bp0a, bp0c);
11282 :
11283 : _0b36_129a(
11284 : &bp48,
11285 : bp14.x,
11286 : bp14.y +bp14.cy -1,
11287 : _4976_4bda[0],
11288 : _4976_4bda[4],
11289 : _4976_4df6
11290 : );
11291 :
11292 : break;
11293 : }
11294 : case 11:
11295 : {
11296 :
11297 : _29ee_093e(1);
11298 :
11299 :
11300 : goto _148a;
11301 : }
11302 : case 12:
11303 : {
11304 :
11305 : _29ee_0a7b(*(_4976_4e96++), 1);
11306 :
11307 : _148a:
11308 : _0b36_0cbe(&_4976_3f6c, 1);
11309 :
11310 : break;
11311 : }
11312 : case 13:
11313 : {
11314 :
11315 : si = _4976_52be;
11316 :
11317 : if (si != 0) {
11318 :
11319 : _4976_581a |= *_4976_4e96;
11320 :
11321 : _2e62_0670(--si);
11322 : }
11323 :
11324 :
11325 : _4976_4e96++;
11326 :
11327 : break;
11328 : }
11329 : case 14:
11330 : {
11331 :
11332 : _29ee_1d03(*(_4976_4e96++));
11333 :
11334 : goto _148a;
11335 : }
11336 : case 15:
11337 : case 16:
11338 : {
11339 :
11340 : _4976_4bd5 = *_4976_4e96; _4976_4e96++;
11341 : _4976_4bd6 = *_4976_4e96; _4976_4e96++;
11342 : _4976_4bd4 = *_4976_4e96; _4976_4e96++;
11343 :
11344 : _0aaf_01db(_4976_4df8, 1);
11345 :
11346 : bp48.w0 = 0xffff;
11347 :
11348 : _0aaf_002f();
11349 :
11350 : break;
11351 : }
11352 : }
11353 :
11354 : if ((bp05 & 0x80) != 0) {
11355 :
11356 : _4976_4e96 = NULL;
11357 :
11358 : break;
11359 : }
11360 :
11361 : } while ((bp05 & 0x40) != 0);
11362 :
11363 :
11364 : _1534:
11365 : if (bp48.w0 != 0xffff) {
11366 :
11367 : _0b36_0cbe(&bp48, 1);
11368 : }
11369 :
11370 : return;
11371 : }
11372 :
11373 :
11374 : void _1031_0f3a()
11375 : {
11376 :
11377 : ENTER(14);
11378 :
11379 : if (_4976_4e46 == 0) {
11380 :
11381 : Bit32u bp04 = _4976_4c20;
11382 :
11383 : Bit32u bp08 = bp04 - _4976_19a9;
11384 :
11385 : if (bp08 != 0) {
11386 :
11387 : _4976_19a9 = bp04;
11388 :
11389 : if (_4976_4e62 == 0 && _4976_4e48 == 0 && _4976_4e64 == 0) {
11390 :
11391 : for (; ; ) {
11392 :
11393 : _4976_19a7 = 1;
11394 : Bit16u di = 1;
11395 :
11396 : _0fa6:
11397 : if (_4976_4e00 == 0) {
11398 :
11399 : _4976_19a7 = 0;
11400 :
11401 : _1031_0b7e();
11402 :
11403 : break;
11404 : }
11405 :
11406 : sk4e02 bp0e = _4976_4e02[_4976_4ea6];
11407 :
11408 : _4976_4e00--;
11409 : _4976_4ea6++;
11410 :
11411 : if (_4976_4ea6 > 10)
11412 :
11413 : _4976_4ea6 = 0;
11414 :
11415 : Bit16u si = 0;
11416 :
11417 : if (bp0e.w0 >= 0x20) {
11418 :
11419 : if (bp0e.w0 == 0x20) {
11420 :
11421 : si = _1031_03f2(&_4976_1891[_4976_19ad], bp0e.w2);
11422 : }
11423 :
11424 : else if (bp0e.w0 == 0x40) {
11425 :
11426 : si = 0x81;
11427 : }
11428 :
11429 : else if (bp0e.w0 == 0x60) {
11430 :
11431 : si = 0xe1;
11432 : }
11433 : }
11434 :
11435 : else if ((bp0e.w0 & 0x04) != 0) {
11436 : si = 0xe3;
11437 : }
11438 :
11439 : else if ((bp0e.w0 & 0x13) != 0) {
11440 : si = _1031_030a(&_4976_1891[_4976_19ad], bp0e.w2, bp0e.w4, bp0e.w0);
11441 : }
11442 :
11443 : if (si != 0) {
11444 :
11445 : di = 0;
11446 :
11447 : _4976_4e4e.w4 = si;
11448 :
11449 : _4976_4e4e.w0 = _4976_4e66;
11450 : _4976_4e4e.w2 = _4976_4e68;
11451 : _4976_4e4e.rc6.y = _4976_4e9e.y;
11452 : _4976_4e4e.rc6.x = _4976_4e9e.x;
11453 : _4976_4e4e.rc6.cx = _4976_4e9e.cx;
11454 : _4976_4e4e.rc6.cy = _4976_4e9e.cy;
11455 : }
11456 :
11457 : if (di != 0)
11458 :
11459 : goto _0fa6;
11460 :
11461 : _4976_19a7 = 0;
11462 :
11463 : _1031_0b7e();
11464 :
11465 : _4976_4e96 = _1031_0d9e(&_4976_4e4e);
11466 :
11467 : bp08 = 0;
11468 :
11469 : } while (_4976_4e96 == 0);
11470 : }
11471 :
11472 : _1031_111e(Bit16u(bp08));
11473 : }
11474 : }
11475 :
11476 : return;
11477 : }
11478 :
11479 :
11480 : void RESET_SQUAD_DIR()
11481 : {
11482 :
11483 : ENTER(0);
11484 :
11485 : for (U16 si = 0; si < _4976_4c3c; si++) {
11486 :
11487 : _4976_53b4[si].playerDir(U8(_4976_4bf6));
11488 : }
11489 :
11490 : return;
11491 : }
11492 :
11493 :
11494 : void _12b4_00af(U16 xx);
11495 :
11496 :
11497 : U16 _3a15_0f07(Actuator *ref, U16 xx)
11498 : {
11499 :
11500 : ENTER(134);
11501 :
11502 : U8 bp05;
11503 : U8 bp06;
11504 : if (xx != 0) {
11505 :
11506 : bp05 = 9;
11507 :
11508 : bp06 = GET_WALL_DECORATION_OF_ACTUATOR(ref);
11509 : }
11510 : else {
11511 :
11512 : bp05 = 10;
11513 :
11514 : bp06 = GET_FLOOR_DECORATION_OF_ACTUATOR(ref);
11515 : }
11516 :
11517 : if (bp06 == 0xff)
11518 :
11519 : return 1;
11520 :
11521 : U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(bp05, bp06, dtWordValue, 0x0d);
11522 :
11523 : if (si == 0) {
11524 :
11525 : U8 bp0086[128];
11526 : U8 *bp04 = QUERY_GDAT_TEXT(bp05, bp06, 0x0d, bp0086);
11527 :
11528 : if (*bp04 != 0) {
11529 :
11530 : si = SK_STRLEN(bp04);
11531 :
11532 : if (si != 0)
11533 :
11534 : return si;
11535 : }
11536 :
11537 : return si = 1;
11538 : }
11539 :
11540 : return si & 0x7fff;
11541 : }
11542 :
11543 :
11544 : void _3a15_0fa5(Actuator *ref, ObjectID rl, U16 xx, U16 yy, U16 zz, U16 ww)
11545 : {
11546 :
11547 : ENTER(12);
11548 :
11549 : if (ref->SoundEffect() != 1)
11550 :
11551 : return;
11552 :
11553 : if ((ref->ActuatorData() & 0x0100) != 0)
11554 :
11555 : return;
11556 :
11557 : U8 bp0b;
11558 : U8 bp0c;
11559 : if (ww != 0) {
11560 :
11561 : bp0b = 9;
11562 :
11563 : bp0c = GET_WALL_DECORATION_OF_ACTUATOR(ref);
11564 : }
11565 : else {
11566 :
11567 : bp0b = 10;
11568 :
11569 : bp0c = GET_FLOOR_DECORATION_OF_ACTUATOR(ref);
11570 : }
11571 :
11572 : U16 si = ((ref->ActuatorData() & 0xff) + _4976_4bec + QUERY_GDAT_ENTRY_DATA_INDEX(bp0b, bp0c, dtWordValue, 0x88)) % zz;
11573 :
11574 : sk5c20 bp0a;
11575 : bp0a.SetMap(_4976_0c5a);
11576 : bp0a.SetTick(zz - si + _4976_4bec);
11577 :
11578 : bp0a.w8 = rl;
11579 : bp0a.b6_0_f(U8(xx));
11580 : bp0a.b7_0_f(U8(yy));
11581 :
11582 : QUEUE_TIMER(&bp0a);
11583 :
11584 : ref->ActuatorData(ref->ActuatorData() | 0x0100);
11585 :
11586 : if (si == 0) {
11587 :
11588 : QUEUE_NOISE_GEN2(
11589 : bp0b,
11590 : bp0c,
11591 : 0x88,
11592 : 0xfe,
11593 : xx,
11594 : yy,
11595 : 1,
11596 : 0x8c,
11597 : 0x80
11598 : );
11599 : }
11600 :
11601 : return;
11602 : }
11603 :
11604 :
11605 : void _3a15_38b6(U16 xx)
11606 : {
11607 :
11608 : ENTER(22);
11609 :
11610 : U16 bp14 = _4976_0c5a;
11611 :
11612 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
11613 :
11614 : U16 bp10 = _4976_4dba[_4976_0c5a].RawColumn();
11615 :
11616 : U16 bp12 = _4976_4dba[_4976_0c5a].RawRow();
11617 :
11618 : U8 *bp04 = _4976_4ca8[_4976_0c5a][0];
11619 :
11620 : U16 *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[_4976_0c5a]]];
11621 :
11622 : for (U16 bp0e = 0; bp0e <= bp10; bp0e++) {
11623 :
11624 : for (U16 di = 0; di <= bp12; di++) {
11625 :
11626 : U16 bp16 = ((*bp04 << 5) == ttWall) ? 1 : 0;
11627 :
11628 : if ((*(bp04++) & 0x10) == 0)
11629 :
11630 : continue;
11631 :
11632 : ObjectID si = *(bp0c++);
11633 :
11634 : while (si.DBType() <= 3) {
11635 :
11636 : if (si.DBType() == dbActuator) {
11637 :
11638 : Actuator *bp08 = GET_ADDRESS_OF_RECORD3(si);
11639 :
11640 : switch (bp08->ActuatorType()) {
11641 : case 0x21:
11642 : {
11643 :
11644 : if (bp08->ActionType() != 3) {
11645 :
11646 : INVOKE_ACTUATOR(
11647 : bp08,
11648 : ((bp08->RevertEffect() ^ xx) != 0) ? 1 : 0,
11649 : 0
11650 : );
11651 :
11652 : break;
11653 : }
11654 :
11655 : if ((!bp08->RevertEffect()) == xx) {
11656 :
11657 : INVOKE_ACTUATOR(
11658 : bp08,
11659 : bp08->ActionType(),
11660 : 0
11661 : );
11662 : }
11663 :
11664 : break;
11665 : }
11666 : case 0x2c:
11667 : {
11668 :
11669 : if (bp08->w4_0_0() == 1) {
11670 :
11671 : _3a15_0fa5(
11672 : bp08,
11673 : si,
11674 : bp0e,
11675 : di,
11676 : _3a15_0f07(bp08, bp16),
11677 : bp16
11678 : );
11679 : }
11680 :
11681 : break;
11682 : }
11683 : }
11684 : }
11685 :
11686 : si = GET_NEXT_RECORD_LINK(si);
11687 :
11688 : }
11689 :
11690 : }
11691 :
11692 : }
11693 :
11694 : CHANGE_CURRENT_MAP_TO(bp14);
11695 :
11696 : return;
11697 : }
11698 :
11699 :
11700 : void _1c9a_3a6e()
11701 : {
11702 :
11703 : ENTER(16);
11704 :
11705 : U8 *bp04 = *_4976_4c78;
11706 :
11707 : U16 *bp08 = &_4976_4d16[*_4976_4c52];
11708 :
11709 : for (U16 bp0e = 0; bp0e < _4976_4dd2; bp0e++) {
11710 :
11711 : for (U16 di = 0; di < _4976_4dd4; di++) {
11712 :
11713 : if ((*(bp04++) & 0x10) != 0) {
11714 :
11715 : ObjectID si = *(bp08++);
11716 :
11717 : do {
11718 :
11719 : if (si.DBType() == dbCreature) {
11720 :
11721 : Creature *bp0c = GET_ADDRESS_OF_RECORD4(si);
11722 :
11723 : if (bp0c->b5 != 0xff)
11724 :
11725 : break;
11726 :
11727 : if ((QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp0c->CreatureType())->w0 & 0x0001) == 0) {
11728 :
11729 : _1c9a_0e14(si, bp0e, si);
11730 :
11731 : break;
11732 : }
11733 :
11734 : U16 bp10 = bp0c->w10;
11735 :
11736 : _1c9a_09db(si);
11737 :
11738 : bp0c->w10 |= bp10 & 0x6000;
11739 :
11740 : if ((bp10 & 0x803f) == 0x8001) {
11741 :
11742 : bp0c->w10 &= 0xffc0;
11743 : bp0c->w10 |= 0x8001;
11744 : }
11745 :
11746 : break;
11747 : }
11748 :
11749 : si = GET_NEXT_RECORD_LINK(si);
11750 :
11751 : } while (si != si.FFFE);
11752 : }
11753 :
11754 : }
11755 :
11756 : }
11757 :
11758 : return;
11759 : }
11760 :
11761 :
11762 : void _13ae_0009(U8 newmap)
11763 : {
11764 :
11765 : ENTER(0);
11766 :
11767 : if (_4976_5c8a == 0) {
11768 :
11769 : _443c_085a();
11770 :
11771 : _3a15_38b6(0);
11772 : }
11773 :
11774 : LOAD_LOCALLEVEL_GRAPHICS_TABLE(newmap);
11775 :
11776 : _2676_0131();
11777 :
11778 : if (_4976_5c8a == 0) {
11779 :
11780 : _3a15_38b6(1);
11781 :
11782 : _1c9a_3a6e();
11783 :
11784 : _24a5_013d();
11785 :
11786 : if (_4976_5bee == 0)
11787 :
11788 : _1031_098e();
11789 :
11790 : _443c_086b();
11791 : }
11792 :
11793 : return;
11794 : }
11795 :
11796 :
11797 : void _12b4_0141(Bit16u xx)
11798 : {
11799 :
11800 : ENTER(6);
11801 :
11802 : if (xx == 0)
11803 :
11804 :
11805 : return;
11806 :
11807 : _4976_4e5c = 1;
11808 :
11809 : RESET_SQUAD_DIR();
11810 :
11811 : U16 si = GET_TILE_VALUE(_4976_4bfa, _4976_4c06);
11812 :
11813 : if (si == ttStairs) {
11814 :
11815 : _12b4_00af(si & 4);
11816 :
11817 :
11818 : return;
11819 : }
11820 :
11821 : TELE_inf bp06;
11822 : if (GET_TELEPORTER_DETAIL(&bp06, U8(_4976_4bfa), U8(_4976_4c06)) != 0) {
11823 :
11824 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
11825 :
11826 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, -1, 0);
11827 :
11828 : _13ae_0009(bp06.b4);
11829 :
11830 : MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, bp06.b2, bp06.b3);
11831 :
11832 : ROTATE_SQUAD(bp06.b1);
11833 :
11834 :
11835 : return;
11836 : }
11837 :
11838 : _2fcf_2444(_4976_4bfa, _4976_4c06, -1, 1, 0, 0);
11839 :
11840 : ROTATE_SQUAD((_4976_4bf6 + ((xx == 2) ? 1 : 3)) & 3);
11841 :
11842 : _2fcf_2444(_4976_4bfa, _4976_4c06, -1, 1, 1, 0);
11843 :
11844 : return;
11845 : }
11846 :
11847 :
11848 : void _2405_00e7()
11849 : {
11850 :
11851 : ENTER(0);
11852 :
11853 : return;
11854 : }
11855 :
11856 :
11857 : ObjectID _2c1d_073d()
11858 : {
11859 :
11860 : ENTER(0);
11861 :
11862 : ObjectID si = _4976_57c8.w0;
11863 :
11864 : if (si != si.FFFF) {
11865 :
11866 : _4976_57e0 = 0;
11867 : _4976_57e2 = 0;
11868 : _4976_57c8.w0 = ObjectID::FFFF;
11869 : _4976_57de = 0xff;
11870 :
11871 : _443c_085a();
11872 : _2405_00e7();
11873 : _443c_0434();
11874 : _443c_086b();
11875 :
11876 : _2c1d_03e7(_4976_3fc6, si, -1, -1);
11877 : }
11878 :
11879 : return si;
11880 : }
11881 :
11882 :
11883 : void _2405_04f4(sk57c8 *ref)
11884 : {
11885 :
11886 : ENTER(8);
11887 :
11888 : U8 bp05 = QUERY_CLS1_FROM_RECORD(ref->w0);
11889 :
11890 : U8 bp06 = QUERY_CLS2_FROM_RECORD(ref->w0);
11891 :
11892 : U8 bp07 = _2405_014a(ref->w0, -1, 1);
11893 :
11894 : U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp05, bp06, bp07);
11895 :
11896 : COPY_MEMORY(
11897 : QUERY_GDAT_IMAGE_LOCALPAL(bp05, bp06, bp07),
11898 : ref->b6,
11899 : 16
11900 : );
11901 :
11902 : FIRE_BLIT_PICTURE(
11903 : bp04,
11904 : ref->pv2,
11905 : ALLOC_TEMP_ORIGIN_RECT(_4976_0106, _4976_0108),
11906 : 0,
11907 : 0,
11908 : READ_I16(bp04,-4),
11909 : _4976_0106,
11910 : -1,
11911 : 0,
11912 : 4,
11913 : 4,
11914 : NULL
11915 : );
11916 :
11917 : return;
11918 : }
11919 :
11920 : void _44c8_1c99();
11921 :
11922 :
11923 : void _3929_07e1(U16 xx, U16 yy)
11924 : {
11925 :
11926 : ENTER(0);
11927 :
11928 : i16 di = xx;
11929 : U16 si = yy;
11930 :
11931 : if (di < 0)
11932 :
11933 : di = 0;
11934 :
11935 : _4976_475c = min_value(di * _4976_0126, _4976_013e - _4976_0126);
11936 :
11937 : if (si < 0 || si >= 1)
11938 :
11939 : si = 0;
11940 :
11941 : _4976_5c0c = si;
11942 : _4976_5c06 = 0;
11943 :
11944 : return;
11945 : }
11946 :
11947 :
11948 : void _3929_0826()
11949 : {
11950 :
11951 : ENTER(0);
11952 :
11953 : _443c_085a();
11954 :
11955 : FIRE_FILL_SCREEN_RECT(15, _4976_4bda[0]);
11956 :
11957 : _443c_086b();
11958 :
11959 : _3929_07e1(0, 0);
11960 :
11961 : for (U16 si = 0; si < 1; si++) {
11962 :
11963 : _4976_5c02[si] = -1;
11964 :
11965 : }
11966 :
11967 : return;
11968 : }
11969 :
11970 :
11971 : void _3929_0914()
11972 : {
11973 :
11974 : ENTER(0);
11975 :
11976 : _3929_0826();
11977 :
11978 : _4976_5c02[0] = -1;
11979 :
11980 : return;
11981 : }
11982 :
11983 :
11984 : void PRINT_SYSERR_TEXT(Bit16u dstx, Bit16u dsty, Bit16u clr1, Bit16u clr2, Bit8u *str)
11985 : {
11986 :
11987 : DRAW_STRING(_4976_4964, -1, _4976_00f0, dstx, dsty+1, clr1, clr2, str, 8);
11988 : }
11989 :
11990 :
11991 : void _3929_0929(U16 clr1, U8 *str)
11992 : {
11993 :
11994 : ENTER(8);
11995 :
11996 : SRECT bp08;
11997 : QUERY_EXPANDED_RECT(15, &bp08);
11998 :
11999 : if (_4976_5c06 != 0) {
12000 :
12001 : DRAW_STRING(
12002 : _4976_5c08,
12003 : -1,
12004 : _4976_013e,
12005 : _4976_475c,
12006 : _4976_0140 -2 -((QUERY_MBCS_PRESENCE(str) != 0) ? _4976_0136 : _4976_0124),
12007 : clr1,
12008 : _4976_4bda[0],
12009 : str,
12010 : 8
12011 : );
12012 : }
12013 : else {
12014 :
12015 : _443c_085a();
12016 :
12017 : PRINT_SYSERR_TEXT(
12018 : bp08.x + _4976_475c,
12019 : _4976_5c0c * _4976_013a +bp08.y + _4976_0130 - _4976_0136 + _4976_5c12 -1,
12020 : clr1,
12021 : _4976_4bda[0],
12022 : str
12023 : );
12024 :
12025 : _443c_086b();
12026 : }
12027 :
12028 : _4976_5c02[_4976_5c0c] = _4976_4bec +70;
12029 :
12030 : return;
12031 : }
12032 :
12033 :
12034 : void _3929_09fb(Bit16u ww, U8 *str)
12035 : {
12036 :
12037 : ENTER(102);
12038 :
12039 : U16 si = ww;
12040 :
12041 : if (_4976_5c06 != 0) {
12042 :
12043 : _44c8_1c99();
12044 :
12045 : _44c8_1d26(_4976_5c08, _4976_4bda[0]);
12046 :
12047 : _4976_5c06 = 0;
12048 : }
12049 :
12050 : si = _4976_4bda[si];
12051 :
12052 : for (U16 bp02 = 0; str[bp02] != 0; ) {
12053 :
12054 : U8 bp66[100];
12055 : U16 di = _3929_04e2(str, bp66, &bp02, _4976_013e - _4976_475c);
12056 :
12057 : if (str[bp02] == '\n') {
12058 :
12059 : _3929_0914();
12060 :
12061 : _3929_0929(si, bp66);
12062 :
12063 : _4976_475c = 0;
12064 :
12065 : bp02++;
12066 :
12067 : continue;
12068 : }
12069 :
12070 : if (str[bp02] != 0) {
12071 :
12072 : _3929_0929(si, bp66);
12073 :
12074 : _3929_0914();
12075 :
12076 : _4976_475c = 12;
12077 :
12078 : continue;
12079 : }
12080 :
12081 : _3929_0929(si, bp66);
12082 :
12083 : _4976_475c += di;
12084 :
12085 : }
12086 :
12087 : if (_4976_5c06 != 0) {
12088 :
12089 : _44c8_1c99();
12090 :
12091 : _44c8_1d26(_4976_5c08, _4976_4bda[0]);
12092 : }
12093 :
12094 : return;
12095 : }
12096 :
12097 :
12098 : void _3929_0b5a()
12099 : {
12100 :
12101 : ENTER(0);
12102 :
12103 : _3929_09fb(0, const_cast<U8 *>(_4976_475a));
12104 :
12105 : return;
12106 : }
12107 :
12108 :
12109 : void _2405_00c9(ObjectID rl)
12110 : {
12111 :
12112 : ENTER(0);
12113 :
12114 : _3929_0b5a();
12115 :
12116 : _3929_09fb(13, _2405_005e(rl));
12117 :
12118 : return;
12119 : }
12120 :
12121 :
12122 : void _2c1d_06b5(ObjectID rl, U16 xx)
12123 : {
12124 :
12125 : ENTER(0);
12126 :
12127 : ObjectID si = rl;
12128 :
12129 : if (si != si.FFFF) {
12130 :
12131 : si.ClearDir();
12132 :
12133 : _4976_57e0 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0);
12134 :
12135 : _4976_57e2 = QUERY_ITEM_WEIGHT(si);
12136 : _4976_57c8.w0 = si;
12137 :
12138 : _2405_04f4(&_4976_57c8);
12139 :
12140 : _443c_085a();
12141 :
12142 : _2405_00c9(si);
12143 :
12144 : if (xx != 0) {
12145 :
12146 : _4976_4c3a = 1;
12147 : }
12148 : else {
12149 :
12150 : _443c_0434();
12151 : }
12152 :
12153 : _443c_086b();
12154 :
12155 : _2c1d_03e7(_4976_3fc6, si, -1, 1);
12156 :
12157 : _2fcf_2444(_4976_4bfa, _4976_4c06, -1, 1, 1, 0);
12158 : }
12159 :
12160 : return;
12161 : }
12162 :
12163 :
12164 : void _2e62_0cfa(U16 xx)
12165 : {
12166 :
12167 : ENTER(4);
12168 :
12169 : for (U16 si = 0; si < _4976_4c3c; si++) {
12170 :
12171 : if (si != _4976_52be) {
12172 :
12173 : _2e62_0670(si);
12174 : }
12175 :
12176 : }
12177 :
12178 : if (_4976_52be != 0) {
12179 :
12180 : U16 si = _4976_52be -1;
12181 :
12182 : sk53b4 *bp04 = &_4976_53b4[si];
12183 :
12184 : if (bp04->w257 != 0 && bp04->b256 >= 3 && bp04->b256 <= 6) {
12185 :
12186 : bp04->w50 |= (_4976_4c38 != 0 && _4976_57c8.w0 == ObjectID::FFFF) ? 0x3000 : 0x1000;
12187 : }
12188 :
12189 : _2e62_0670(_4976_52be -1);
12190 : }
12191 :
12192 : _2759_0644(xx);
12193 :
12194 : return;
12195 : }
12196 :
12197 :
12198 : void _443c_0004(U8 *buffSrc, U8 *buffDst, U8 *localpal)
12199 : {
12200 :
12201 : ENTER(20);
12202 :
12203 : U8 *bp04 = ALLOC_PICT_BUFF(16, 16, afDefault, 4);
12204 :
12205 : U8 bp14[16];
12206 : for (i16 si = 0; si < 16; si++) {
12207 :
12208 : bp14[si] = _4976_4bda[0];
12209 :
12210 : }
12211 :
12212 : bp14[12] = localpal[12];
12213 :
12214 : _44c8_1d26(buffDst, localpal[12]);
12215 :
12216 : DRAW_DIALOGUE_PICT(buffSrc, buffDst, reinterpret_cast<blit_rc *>(&_4976_4942), 0, 0, 12, bp14);
12217 :
12218 : DRAW_DIALOGUE_PICT(buffSrc, buffDst, reinterpret_cast<blit_rc *>(&_4976_494a), 0, 0, 12, localpal);
12219 :
12220 : FREE_PICT_BUFF(bp04);
12221 :
12222 : return;
12223 : }
12224 :
12225 :
12226 : void _443c_0434()
12227 : {
12228 :
12229 : ENTER(4);
12230 :
12231 : _4976_5dac = (_4976_57c8.w0 != ObjectID::FFFF) ? 1 : 0;
12232 :
12233 : if (_4976_5dac != 0) {
12234 :
12235 : U8 *bp04 = ALLOC_PICT_BUFF(18, 18, afDefault, 8);
12236 :
12237 : _443c_0004(_4976_57ca, bp04, _4976_57ce);
12238 :
12239 : _01b0_0b01(2, bp04, 8, 8, 18, 18, 8, NULL, _4976_57ce[12]) INDIRECT_CALL;
12240 :
12241 : FREE_PICT_BUFF(bp04);
12242 : }
12243 :
12244 : _443c_040e();
12245 :
12246 : return;
12247 : }
12248 :
12249 :
12250 : void _2c1d_0889(Bit16u xx)
12251 : {
12252 :
12253 : ENTER(4);
12254 :
12255 : if (_4976_3fc6 == -1)
12256 :
12257 : return;
12258 :
12259 : U16 si;
12260 : U16 di;
12261 : if (xx < 8) {
12262 :
12263 : if (_4976_4bfc != 0)
12264 :
12265 : return;
12266 :
12267 : di = xx << 1;
12268 :
12269 : if (di >= _4976_4c3c)
12270 :
12271 : return;
12272 :
12273 : if (di +1 == _4976_52be)
12274 :
12275 : return;
12276 :
12277 : if (_4976_53b4[di].curHP() == 0)
12278 :
12279 : return;
12280 :
12281 : si = xx & 1;
12282 : }
12283 : else {
12284 :
12285 : si = xx -8;
12286 :
12287 : di = ((si >= 30) ? _4976_5366 : _4976_52be) -1;
12288 : }
12289 :
12290 : ObjectID bp02 = _4976_57c8.w0;
12291 :
12292 : ObjectID bp04 = (si >= 30) ? _4976_52c4[si -30] : _4976_53b4[di].Possess(si);
12293 :
12294 : if (bp04 == bp04.FFFF && bp02 == bp02.FFFF)
12295 :
12296 : return;
12297 :
12298 : if (bp02 != bp02.FFFF) {
12299 :
12300 : if (_48ae_01ec(bp02, si, 0) == 0)
12301 :
12302 : return;
12303 : }
12304 :
12305 : _443c_085a();
12306 :
12307 : if (bp02 != bp02.FFFF)
12308 :
12309 : _2c1d_073d();
12310 :
12311 : if (bp04 != bp04.FFFF) {
12312 :
12313 : _2c1d_07a3(di, si);
12314 :
12315 : _2c1d_06b5(bp04, 1);
12316 : }
12317 :
12318 : if (bp02 != bp02.FFFF) {
12319 :
12320 : _2c1d_0831(di, bp02, si);
12321 : }
12322 :
12323 : _2e62_0cfa(0);
12324 :
12325 : if (si == 11 || si == 6 || si == 12 || ((si < 7 || si > 9) && si >= 30)) {
12326 :
12327 : _4976_5352 = 1;
12328 :
12329 : _2759_0644(0);
12330 : }
12331 :
12332 : if (_4976_4c3a != 0) {
12333 :
12334 : _4976_4c3a = 0;
12335 :
12336 : _443c_0434();
12337 : }
12338 :
12339 : _443c_086b();
12340 :
12341 : return;
12342 : }
12343 :
12344 : void _2c1d_0654(Bit16u xx);
12345 : void _2759_28db(Bit16u xx);
12346 :
12347 :
12348 : void _1031_16a0(Bit16u xx)
12349 : {
12350 :
12351 : ENTER(0);
12352 :
12353 : U16 si = xx;
12354 :
12355 : if (si == _4976_3fc6)
12356 :
12357 : return;
12358 :
12359 : if (si != 0xffff && _4976_53b4[si].curHP() == 0)
12360 :
12361 : return;
12362 :
12363 : if (_4976_3fc6 != -1) {
12364 :
12365 : _4976_53b4[_4976_3fc6].w50 |= 0x1400;
12366 : }
12367 :
12368 : _4976_3fc6 = si;
12369 :
12370 : if (si == 0xffff)
12371 :
12372 : return;
12373 :
12374 : if (si +1 == _4976_4bfc)
12375 :
12376 : return;
12377 :
12378 : _4976_53b4[si].w50 |= 0x1400;
12379 :
12380 : return;
12381 : }
12382 :
12383 :
12384 : void _2f3f_0000(U16 player, ObjectID rl)
12385 : {
12386 :
12387 : ENTER(0);
12388 :
12389 : for (U16 si = 0; si < 5; si++) {
12390 :
12391 : U16 di = _4976_404d[si][0];
12392 :
12393 : for (; _4976_404d[si][1] >= di; di++) {
12394 :
12395 : if (true
12396 : && _4976_53b4[player].Possess(di) == ObjectID::FFFF
12397 : && _48ae_01ec(rl, di, 0) != 0
12398 : && (false
12399 : || _4976_404d[si][2] == 0xffff
12400 : || rl.DBType() == _4976_404d[si][2]
12401 : )
12402 : ) {
12403 :
12404 : _2c1d_0831(player, rl, di);
12405 :
12406 : return;
12407 : }
12408 :
12409 : }
12410 :
12411 : }
12412 :
12413 : return;
12414 : }
12415 :
12416 :
12417 : void _2f3f_04ea(Bit16u xx, Bit16u yy, Bit16u dir, Bit16u zz, Bit16u ee)
12418 : {
12419 :
12420 : ENTER(142);
12421 :
12422 : U16 si = _4976_4bfc -1;
12423 :
12424 : sk53b4 *bp04 = &_4976_53b4[si];
12425 :
12426 : U16 bp0c = _4976_0c5a;
12427 :
12428 : CHANGE_CURRENT_MAP_TO(zz);
12429 :
12430 : ObjectID bp0e = _2c1d_073d();
12431 :
12432 : if (ee == 161) {
12433 :
12434 : _24a5_1798(4);
12435 :
12436 : _443c_085a();
12437 :
12438 : if (_4976_4c3c == 1)
12439 :
12440 : _1031_16a0(0xffff);
12441 :
12442 : if (_4976_4bfc >= _4976_4c3c)
12443 :
12444 : _4976_4c3c--;
12445 :
12446 : _4976_4bfc = 0;
12447 :
12448 : bp04->curHP(0);
12449 :
12450 : _4976_5342[si] = 0;
12451 :
12452 : _4976_3de2[si] = 0xff;
12453 : _4976_3dde[si] = 0xff;
12454 :
12455 : _4976_5330[si][1] = 0;
12456 : _4976_3de6[si][1] = 0xffff;
12457 :
12458 : _4976_5330[si][0] = 0;
12459 : _4976_3de6[si][0] = 0xffff;
12460 :
12461 : _4976_5330[si][2] = 0;
12462 :
12463 : FIRE_FILL_SCREEN_RECT(si +161, _4976_4bda[0]);
12464 :
12465 : _38c8_0060();
12466 :
12467 : _443c_086b();
12468 : }
12469 : else {
12470 :
12471 : if (_4976_404b == 0)
12472 :
12473 : _24a5_105b(1);
12474 :
12475 : if (bp0e != bp0e.FFFF)
12476 :
12477 : _2f3f_0000(si, bp0e);
12478 :
12479 : _4976_4bfc = 0;
12480 :
12481 : xx += _4976_0232[dir];
12482 :
12483 : yy += _4976_023a[dir];
12484 :
12485 : for (U16 bp0a = 0; bp0a < 30; bp0a++) {
12486 :
12487 : ObjectID di = bp04->Possess(bp0a);
12488 :
12489 : if (di != di.FFFF) {
12490 :
12491 : CUT_RECORD_FROM(di, NULL, xx, yy);
12492 : }
12493 :
12494 : }
12495 :
12496 : ObjectID di = GET_TILE_RECORD_LINK(xx, yy);
12497 : while (true) {
12498 :
12499 : if (di.DBType() == dbActuator) {
12500 :
12501 : Actuator *bp08 = GET_ADDRESS_OF_RECORD3(di);
12502 :
12503 : if (bp08->ActuatorType() == 0x7e) {
12504 :
12505 : bp08->OnceOnlyActuator(0);
12506 :
12507 : break;
12508 : }
12509 : }
12510 :
12511 : di = GET_NEXT_RECORD_LINK(di);
12512 : }
12513 :
12514 : if (_4976_4c3c == 1) {
12515 :
12516 : _4976_4b80 = _4976_4bec;
12517 : }
12518 :
12519 : if (_4976_404b == 0) {
12520 :
12521 : _4976_52e6 = si;
12522 :
12523 : _3929_0b5a();
12524 :
12525 : U8 bp008e[128];
12526 : _3929_09fb(_4976_3fec[si], QUERY_GDAT_TEXT(0x01, 0x00, 0x0e, bp008e));
12527 :
12528 : if (_4976_52be != 0) {
12529 :
12530 : _24a5_1798(4);
12531 :
12532 : _38c8_0060();
12533 : }
12534 : }
12535 : }
12536 :
12537 : CHANGE_CURRENT_MAP_TO(bp0c);
12538 :
12539 : return;
12540 : }
12541 :
12542 :
12543 : void _24a5_1798(Bit16u xx)
12544 : {
12545 :
12546 : ENTER(8);
12547 :
12548 : i16 di = xx;
12549 :
12550 : U16 bp06 = 0;
12551 : _4976_3d2e = 0;
12552 : _4976_3d30 = ObjectID::FFFF;
12553 :
12554 : if (di < 4 && _4976_53b4[di].curHP() == 0)
12555 :
12556 : return;
12557 :
12558 : if (_4976_4c3e != 0 || _4976_4ddc != 0 || _4976_4bfe != 0 || _4976_4c38 != 0)
12559 :
12560 : return;
12561 :
12562 : _4976_4e5c = 1;
12563 :
12564 : U16 si = _4976_52be;
12565 :
12566 : if (di +1 == si)
12567 :
12568 : di = 4;
12569 :
12570 : if (si == 0 || di == 4) {
12571 :
12572 : bp06 = 1;
12573 :
12574 : _443c_085a();
12575 : }
12576 :
12577 : if (si != 0) {
12578 :
12579 : _4976_52be = 0;
12580 :
12581 : sk53b4 *bp04 = &_4976_53b4[si -1];
12582 :
12583 : if (bp04->curHP() != 0 && _4976_4bfc == 0) {
12584 :
12585 : bp04->w50 |= 0x4000;
12586 :
12587 : _2e62_0670(si -1);
12588 : }
12589 :
12590 : for (i16 bp08 = 0; bp08 < 4; bp08++) {
12591 :
12592 : _4976_580a[si -1][bp08] -= _4976_52c0[bp08];
12593 :
12594 : }
12595 :
12596 : if (_4976_4be8 != 0) {
12597 :
12598 : if (bp06 != 0) {
12599 :
12600 : _443c_040e();
12601 : _443c_086b();
12602 : }
12603 :
12604 : goto _1913;
12605 : }
12606 :
12607 : if (di == 4) {
12608 :
12609 : if (_4976_3d59 != 0)
12610 :
12611 : _29ee_000f();
12612 :
12613 : if (bp06 != 0)
12614 :
12615 : _443c_086b();
12616 :
12617 : _32cb_06cf();
12618 :
12619 : goto _1913;
12620 : }
12621 : }
12622 :
12623 : _4976_52be = di +1;
12624 :
12625 : if (si == 0)
12626 :
12627 : FIRE_FILL_HALFTONE_RECTI(9, 0);
12628 :
12629 : ZERO_MEMORY(_4976_52c0, 4);
12630 :
12631 : _4976_53b4[di].w50 |= 0xfc00;
12632 : _4976_581a = 0;
12633 :
12634 : _2e62_0670(di);
12635 :
12636 : if (bp06 != 0)
12637 :
12638 : _443c_086b();
12639 :
12640 : _1031_0541(8);
12641 :
12642 : return;
12643 :
12644 : _1913:
12645 : _1031_0667();
12646 :
12647 : return;
12648 : }
12649 :
12650 :
12651 : void _32cb_06cf()
12652 : {
12653 :
12654 : ENTER(0);
12655 :
12656 : if (_4976_5be6 != 0) {
12657 :
12658 : FIRE_FILL_BACKBUFF_RECT(&_4976_5938, _4976_4bda[0]);
12659 : }
12660 :
12661 : WRITE_UI16(_4976_4c16,-4,_4976_00f6);
12662 :
12663 : WRITE_UI16(_4976_4c16,-2,_4976_00f8);
12664 :
12665 : WRITE_UI16(_4976_4c16,-6,8);
12666 :
12667 : _4976_022c = 0;
12668 :
12669 : return;
12670 : }
12671 :
12672 :
12673 : sk3e22 *FIND_SPELL_BY_RUNES(U8 *runes)
12674 : {
12675 :
12676 :
12677 :
12678 : ENTER(10);
12679 :
12680 : if (runes[1] == 0)
12681 :
12682 :
12683 : return NULL;
12684 :
12685 : i16 bp06 = 24;
12686 : U32 bp0a = 0;
12687 :
12688 : do {
12689 :
12690 : bp0a |= U32(*(runes++)) << bp06;
12691 :
12692 : } while (runes[0] != 0 && (bp06 -= 8) >= 0);
12693 :
12694 : sk3e22 *bp04 = const_cast<sk3e22 *>(_4976_3e22);
12695 :
12696 : for (bp06 = 34; bp06-- != 0; bp04++) {
12697 :
12698 : if ((bp04->dw0 & 0xff000000) != 0) {
12699 :
12700 : if (bp04->dw0 != bp0a)
12701 :
12702 : continue;
12703 :
12704 : return bp04;
12705 : }
12706 :
12707 : if ((bp0a & 0x00ffffff) == bp04->dw0)
12708 :
12709 :
12710 : return bp04;
12711 :
12712 : }
12713 :
12714 : return NULL;
12715 : }
12716 :
12717 :
12718 : ObjectID ALLOC_NEW_CREATURE(U16 creature, U16 healthMultiplier_1to31_baseIs8, U16 dir, U16 xx, U16 yy)
12719 : {
12720 :
12721 :
12722 :
12723 :
12724 :
12725 : ENTER(12);
12726 :
12727 : U16 si = healthMultiplier_1to31_baseIs8;
12728 :
12729 : U16 bp0c = creature & 0x8000;
12730 :
12731 : ObjectID bp0a;
12732 : if (bp0c != 0) {
12733 :
12734 : creature &= 0x7fff;
12735 :
12736 : bp0a = ALLOC_NEW_RECORD(dbMissile);
12737 :
12738 : if (bp0a == bp0a.FFFF) {
12739 :
12740 : return ObjectID::FFFF;
12741 : }
12742 : }
12743 :
12744 : ObjectID di = ALLOC_NEW_RECORD(dbCreature);
12745 :
12746 : if (di == di.FFFF || _4976_1a68 >= _4976_4ec2) {
12747 :
12748 : if (bp0c != 0)
12749 :
12750 : DEALLOC_RECORD(bp0a);
12751 :
12752 :
12753 : return ObjectID::FFFF;
12754 : }
12755 :
12756 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(di);
12757 :
12758 : bp04->CreatureType(U8(creature));
12759 :
12760 : sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(U8(creature));
12761 :
12762 : bp04->SetPossessionObject(ObjectID::FFFE);
12763 :
12764 : bp04->b15 = 0xfb;
12765 :
12766 : bp04->b15_0_2(dir);
12767 :
12768 : bp04->b5_0_7(0xff);
12769 :
12770 : if (bp0c != 0) {
12771 :
12772 : APPEND_RECORD_TO(bp0a, &bp04->w2, -1, 0);
12773 : }
12774 :
12775 : si = min_value(si, 31);
12776 :
12777 : si = (si * bp08->w4) >> 3;
12778 :
12779 : bp04->HP1(RAND16((si >> 3) +1) +si);
12780 :
12781 : bp04->HP3(0);
12782 :
12783 : bp04->HP4_0_4(xx);
12784 :
12785 : bp04->HP4_5_9(yy);
12786 :
12787 : bp04->HP4_A_F(_4976_0c5a);
12788 :
12789 : bp04->w8 = 0xffff;
12790 :
12791 : if (MOVE_RECORD_TO(di, -4, 0, xx, yy) == 1) {
12792 :
12793 :
12794 : return ObjectID::FFFF;
12795 : }
12796 :
12797 : bp04->w8 = 0;
12798 :
12799 : return di;
12800 : }
12801 :
12802 :
12803 : ObjectID _1c9a_103a(U16 aa, U16 bb, U16 cc, U16 xx, U16 yy, U16 zz, ObjectID ww, i16 dir)
12804 : {
12805 :
12806 : ENTER(20);
12807 :
12808 : U16 bp08 = _4976_0c5a;
12809 :
12810 : CHANGE_CURRENT_MAP_TO(zz);
12811 :
12812 : ObjectID si = si.FFFF;
12813 :
12814 : U16 bp0a = (ww != ww.FFFF) ? 1 : 0;
12815 :
12816 : U16 bp0e = xx;
12817 :
12818 : U16 bp10 = yy;
12819 :
12820 : U16 bp14 = (dir < 0) ? 0 : 4;
12821 :
12822 : i16 bp12 = (RAND01() != 0) ? 1 : -1;
12823 : do {
12824 :
12825 : U16 bp06 = GET_TILE_VALUE(bp0e, bp10);
12826 :
12827 : U16 bp0c = bp06 >> 5;
12828 :
12829 : if (true
12830 : && bp0c != ttWall
12831 : && bp0c != ttStairs
12832 : && (bp0c == ttTrickWall || (bp06 & 5) != 0)
12833 : && (bp0c == ttDoor || (bp06 = bp06 & 7, bp06 == 0) || bp06 == 5)
12834 : && GET_CREATURE_AT(bp0e, bp10) == ObjectID::FFFF
12835 : ) {
12836 :
12837 : ALLOC_NEW_CREATURE(
12838 : (bp0a != 0) ? 0x8000 : 0,
12839 : bb,
12840 : cc,
12841 : bp0e,
12842 : bp10
12843 : );
12844 :
12845 : if (si != si.FFFF)
12846 :
12847 : break;
12848 : }
12849 :
12850 : if (bp14 != 0) {
12851 :
12852 : bp0e = xx + _4976_0232[dir];
12853 :
12854 : bp10 = yy + _4976_023a[dir];
12855 :
12856 : dir = (dir +bp12) & 3;
12857 : }
12858 :
12859 : } while (bp14-- != 0);
12860 :
12861 : if (bp0a != 0 && si != si.FFFF) {
12862 :
12863 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
12864 :
12865 : ObjectID di = bp04->GetPossessionObject();
12866 :
12867 : while (di != di.FFFE && di.DBType() != dbMissile)
12868 :
12869 : di = GET_NEXT_RECORD_LINK(di);
12870 :
12871 : ATLASSERT(di != di.FFFE);
12872 : GET_ADDRESS_OF_RECORDE(di)->SetMissileObject(ww);
12873 : }
12874 :
12875 : CHANGE_CURRENT_MAP_TO(bp08);
12876 :
12877 : return si;
12878 : }
12879 :
12880 :
12881 : i16 FIND_HAND_WITH_EMPTY_FLASK(sk53b4 *ref)
12882 : {
12883 :
12884 :
12885 :
12886 :
12887 :
12888 :
12889 :
12890 : ENTER(0);
12891 :
12892 : for (i16 si = 2; --si >= 0; ) {
12893 :
12894 : ObjectID di = ref->Possess(si);
12895 :
12896 : if (true
12897 : && di.DBType() == dbPotion
12898 : && QUERY_CLS2_FROM_RECORD(di) == 0x14
12899 : ) {
12900 :
12901 : break;
12902 : }
12903 :
12904 : }
12905 :
12906 : return si;
12907 : }
12908 :
12909 :
12910 : void _2c1d_0b2c(U16 player, U16 yy, U16 zz)
12911 : {
12912 :
12913 :
12914 :
12915 : ENTER(142);
12916 :
12917 : U16 di = yy;
12918 :
12919 : if (true
12920 : && di >= 4
12921 : && di <= 11
12922 : && (_4976_4bec -150 > _4976_0090)
12923 : ) {
12924 :
12925 : zz >>= 1;
12926 : }
12927 :
12928 : if (zz == 0)
12929 :
12930 : return;
12931 :
12932 : U16 bp06 = _4976_4d0a->Difficulty();
12933 :
12934 : if (bp06 != 0) {
12935 :
12936 : zz = zz * bp06;
12937 : }
12938 :
12939 : sk53b4 *bp04 = &_4976_53b4[player];
12940 :
12941 : U16 si = (di >= 4) ? ((di -4) >>2) : di;
12942 :
12943 : bp06 = _2c1d_0a47(player, si, 0);
12944 :
12945 : if (true
12946 : && di >= 4
12947 : && (_4976_4bec -25 < _4976_0090)
12948 : ) {
12949 :
12950 : zz <<= 1;
12951 : }
12952 :
12953 : bp04->dw93[di] += zz;
12954 :
12955 : if (di >= 4) {
12956 :
12957 : bp04->dw93[si] += zz;
12958 : }
12959 :
12960 : zz = _2c1d_0a47(player, si, 0);
12961 :
12962 : if (bp06 <= bp06)
12963 :
12964 : return;
12965 :
12966 : U16 bp0c = zz;
12967 :
12968 : U16 bp08 = RAND01();
12969 :
12970 : U16 bp0a = RAND01() +1;
12971 :
12972 : bp06 = RAND01();
12973 :
12974 : if (si != 2)
12975 :
12976 : bp06 &= zz;
12977 :
12978 : bp04->maxVit(bp04->maxVit() +U8(bp06));
12979 :
12980 : bp06 = bp04->curStamina();
12981 :
12982 : bp04->maxAntiF(bp04->maxAntiF() + (RAND01() & (~zz)));
12983 :
12984 : U8 bp0d;
12985 : switch (si) {
12986 : case 0:
12987 :
12988 : bp0d = 6;
12989 :
12990 : bp06 >>= 4;
12991 :
12992 : zz = bp06 * zz;
12993 :
12994 : bp04->maxStr(bp04->maxStr() +U8(bp0a));
12995 :
12996 : bp04->maxDex(bp04->maxDex() +U8(bp08));
12997 :
12998 : break;
12999 :
13000 : case 1:
13001 :
13002 : bp0d = 7;
13003 :
13004 : bp06 = bp06 / 21;
13005 :
13006 : zz <<= 1;
13007 :
13008 : bp04->maxStr(bp04->maxStr() +U8(bp08));
13009 :
13010 : bp04->maxDex(bp04->maxDex() +U8(bp0a));
13011 :
13012 :
13013 :
13014 : break;
13015 :
13016 : case 3:
13017 :
13018 : bp0d = 9;
13019 :
13020 : bp06 >>= 5;
13021 :
13022 : bp04->maxMP(zz + (zz >> 1) + bp04->maxMP());
13023 :
13024 : bp04->maxWiz(bp04->maxWiz() +U8(bp0a));
13025 :
13026 : goto _0d3a;
13027 :
13028 : case 2:
13029 :
13030 : bp0d = 8;
13031 :
13032 : bp06 = bp06 / 25;
13033 :
13034 : bp04->maxMP(bp04->maxMP() +zz);
13035 :
13036 : zz += (zz +1) >> 1;
13037 :
13038 : bp04->maxWiz(bp04->maxWiz() +U8(bp08));
13039 :
13040 : _0d3a:
13041 : bp04->maxMP(bp04->maxMP() +min_value(RAND02(), bp0c -1));
13042 :
13043 : if (bp04->maxMP() > 900)
13044 :
13045 : bp04->maxMP(900);
13046 :
13047 : bp04->maxAntiM(bp04->maxAntiM() +RAND02());
13048 :
13049 : break;
13050 : }
13051 :
13052 : bp04->maxHP(RAND16((zz >> 1) +1) +zz +bp04->maxHP());
13053 :
13054 : if (bp04->maxHP() > MAXHP)
13055 :
13056 : bp04->maxHP(MAXHP);
13057 :
13058 : bp04->maxStamina(RAND16((bp06 >> 1) +1) +bp06 +bp04->maxStamina());
13059 :
13060 : if (bp04->maxStamina() > MAXSP)
13061 :
13062 : bp04->maxStamina(MAXSP);
13063 :
13064 : bp04->w50 |= 0x3800;
13065 :
13066 : _4976_580a[player][si]++;
13067 :
13068 : _3929_0b5a();
13069 :
13070 : _4976_52e6 = player;
13071 :
13072 : U8 bp008e[128];
13073 : _3929_09fb(_4976_3fec[player], QUERY_GDAT_TEXT(0x01, 0x00, bp0d, bp008e));
13074 :
13075 : return;
13076 : }
13077 :
13078 :
13079 : void _075f_000b(ObjectID rl, U16 xx, U16 yy, U16 dir, U16 aa, U16 bb, U16 cc, U16 dd)
13080 : {
13081 :
13082 : ENTER(14);
13083 :
13084 : ObjectID di = rl;
13085 :
13086 : ObjectID si = ALLOC_NEW_RECORD(dbMissile);
13087 :
13088 : if (si == si.FFFF) {
13089 :
13090 : if (di.DBType() != dbCloud) {
13091 :
13092 : MOVE_RECORD_TO(ObjectID(di, dir), -1, 0, xx, yy);
13093 : }
13094 :
13095 : return;
13096 : }
13097 :
13098 : QUEUE_NOISE_GEN2(
13099 : QUERY_CLS1_FROM_RECORD(di),
13100 : QUERY_CLS2_FROM_RECORD(di),
13101 : 0x86,
13102 : 0xfe,
13103 : xx,
13104 : yy,
13105 : 1,
13106 : 0x6e,
13107 : 0x80
13108 : );
13109 :
13110 : si = ObjectID(si, dir);
13111 :
13112 : Missile *bp04 = GET_ADDRESS_OF_RECORDE(si);
13113 :
13114 : bp04->SetMissileObject(di);
13115 :
13116 : bp04->EnergyRemaining(U8(min_value(bb, 255)));
13117 :
13118 : bp04->EnergyRemaining2(U8(cc));
13119 :
13120 : APPEND_RECORD_TO(si, NULL, xx, yy);
13121 :
13122 : if (bp04->GetMissileObject() == ObjectID::FF80 && _4976_0c5a == _4976_4bf4)
13123 :
13124 : _4976_4cb8 = 1;
13125 :
13126 : sk5c20 bp0e;
13127 : bp0e.SetMap(_4976_0c5a);
13128 : bp0e.SetTick(_4976_4bec +1);
13129 :
13130 : bp0e.TimerType((_4976_4b7e != 0) ? 0x1e : 0x1d);
13131 :
13132 : bp0e.b5 = 0;
13133 :
13134 : bp0e.w6 = si;
13135 :
13136 : bp0e.w8_0_4(xx);
13137 :
13138 : bp0e.w8_5_9(yy);
13139 :
13140 : bp0e.w8_c_f(dd);
13141 :
13142 : bp0e.w8_a_b(aa);
13143 :
13144 : bp04->w6 = QUEUE_TIMER(&bp0e);
13145 :
13146 : return;
13147 : }
13148 :
13149 :
13150 : void _2c1d_1cf3(sk53b4 *ref, ObjectID rl, U16 yy, U16 zz, U16 ww)
13151 : {
13152 :
13153 : ENTER(0);
13154 :
13155 : U16 si = ref->playerDir();
13156 :
13157 : _075f_000b(
13158 : rl,
13159 : _4976_4bfa,
13160 : _4976_4c06,
13161 : ((((ref->playerPos() -si +1) & 2) >> 1) +si) & 3,
13162 : si,
13163 : min_value(yy, 255),
13164 : min_value(zz, 255),
13165 : min_value(ww, 255)
13166 : );
13167 :
13168 : _4976_4c14 = 4;
13169 :
13170 : _4976_4c0c = si;
13171 :
13172 : return;
13173 : }
13174 :
13175 :
13176 : U16 _2c1d_1d64(U16 xx, ObjectID rl, i16 zz, U16 ww)
13177 : {
13178 :
13179 : ENTER(4);
13180 :
13181 : U16 di = zz;
13182 :
13183 : sk53b4 *bp04 = &_4976_53b4[xx];
13184 :
13185 : if (bp04->curMP() < ww)
13186 :
13187 : return 0;
13188 :
13189 : bp04->curMP(bp04->curMP() -ww);
13190 :
13191 : bp04->w50 |= 0x0800;
13192 :
13193 : U16 si = 10 - min_value(8, bp04->maxStamina() >> 3);
13194 :
13195 : if ((si << 2) > di) {
13196 :
13197 : di += 3;
13198 :
13199 : si--;
13200 : }
13201 :
13202 : _2c1d_1cf3(bp04, rl, di, 90, si);
13203 :
13204 : return 1;
13205 : }
13206 :
13207 :
13208 : void _2759_15d0(U16 cmdNum, U16 yy)
13209 : {
13210 :
13211 : ENTER(12);
13212 :
13213 : i16 bp0c = 1;
13214 :
13215 : yy = BETWEEN_VALUE(32, yy +1, 256);
13216 :
13217 : i16 si = yy >> 3;
13218 :
13219 : si = max_value(8, si);
13220 :
13221 : U16 di ;
13222 : switch (cmdNum) {
13223 : case CmDarkness:
13224 :
13225 : di = ((si -8) << 4) +16;
13226 :
13227 : bp0c = -2;
13228 :
13229 :
13230 : si >>= 1;
13231 : si--;
13232 : break;
13233 :
13234 : case CmLight:
13235 :
13236 : di = ((si -3) << 7) +2000;
13237 :
13238 : si >>= 2;
13239 : si++;
13240 :
13241 : break;
13242 :
13243 : case Cm39:
13244 :
13245 : di = ((si -8) << 9) +10000;
13246 :
13247 : si >>= 1;
13248 : si--;
13249 :
13250 : break;
13251 : }
13252 :
13253 : sk5c20 bp0a;
13254 : bp0a.TimerType(0x46);
13255 :
13256 : bp0a.w6 = (cmdNum == CmDarkness) ? si : -si;
13257 :
13258 : bp0a.SetMap(_4976_4bf4);
13259 : bp0a.SetTick(_4976_4bec +di);
13260 :
13261 : bp0a.b5 = 0;
13262 :
13263 : QUEUE_TIMER(&bp0a);
13264 :
13265 : _4976_57e4.w0 = _4976_3d34[si] * bp0c;
13266 :
13267 : _24a5_013d();
13268 :
13269 : return;
13270 : }
13271 :
13272 : U16 _2c1d_0186(sk53b4 *ref, i16 xx, U16 yy, U16 zz);
13273 :
13274 :
13275 : void _2759_0f39(U16 player, U16 yy, U16 zz)
13276 : {
13277 :
13278 : ENTER(6);
13279 :
13280 : U16 di = yy;
13281 : U16 si = zz;
13282 :
13283 : sk53b4 *bp04 = &_4976_53b4[player];
13284 :
13285 : U16 bp06;
13286 : (si == 0xffff) ? (bp06 = 3, si = 0) : (bp06 = 1);
13287 :
13288 : if (_4976_57e8 != 0)
13289 :
13290 : di >>= 2;
13291 :
13292 : di += 2;
13293 :
13294 : do {
13295 :
13296 : U16 cx = bp04->b42[si];
13297 :
13298 : if (cx < di) {
13299 :
13300 : cx = (cx >> 1) +di;
13301 : }
13302 : else {
13303 :
13304 : cx += di >> 1;
13305 : }
13306 :
13307 : if (cx > 255)
13308 :
13309 : cx = 255;
13310 :
13311 : bp04->b42[si] = U8(cx);
13312 :
13313 : si++;
13314 :
13315 : } while (--bp06 != 0);
13316 :
13317 :
13318 : return;
13319 : }
13320 :
13321 :
13322 : U16 _2759_222e(U16 player, sk3e22 *ref, U16 zz)
13323 : {
13324 :
13325 :
13326 :
13327 : ENTER(30);
13328 :
13329 : sk53b4 *bp04 = &_4976_53b4[player];
13330 :
13331 : U16 bp0e = (ref->w6_a_f() * (zz +18)) / 24;
13332 :
13333 : U16 bp08 = ref->b4 +zz;
13334 :
13335 : U16 bp0c = 0
13336 : +((RAND() & 7) + (bp08 << 4))
13337 : +((ref->b4 * (zz -1)) << 3)
13338 : +(bp08 * bp08)
13339 : ;
13340 :
13341 : U16 bp06 = _2c1d_0a47(player, ref->b5, 1);
13342 :
13343 : U16 di;
13344 : i16 bp0a;
13345 : for (bp0a = bp08 -bp06; (bp0a--) > 0; ) {
13346 :
13347 : if ((RAND() & 127) > min_value(_2c1d_0ea2(bp04, 3, 0), 115)) {
13348 :
13349 : _2c1d_0b2c(player, ref->b5, bp0c << (bp08 -bp06));
13350 :
13351 : di = 16;
13352 :
13353 : goto _26fe;
13354 : }
13355 :
13356 : }
13357 :
13358 : U16 bp1a;
13359 : switch (ref->w6 & 15) {
13360 : case 1:
13361 : {
13362 :
13363 : bp0a = FIND_HAND_WITH_EMPTY_FLASK(bp04);
13364 :
13365 : if (bp0a < 0) {
13366 :
13367 : di = 48;
13368 :
13369 : goto _26fe;
13370 : }
13371 :
13372 : ObjectID si = _2c1d_07a3(player, bp0a);
13373 :
13374 : SET_ITEMTYPE(si, ref->w6_4_9());
13375 :
13376 : GET_ADDRESS_OF_RECORD8(si)->PotionPower(((RAND() & 15) + (zz * 40)) & 255);
13377 :
13378 : _2c1d_0831(player, si, bp0a);
13379 :
13380 : break;
13381 : }
13382 : case 2:
13383 : {
13384 :
13385 : if (ref->w6_4_9() == 4)
13386 :
13387 : bp06 <<= 1;
13388 :
13389 : _2c1d_1d64(
13390 : player,
13391 : ObjectID::MissileRecord(ref->w6_4_9()),
13392 : BETWEEN_VALUE(21, ((bp06 << 1) +4) * (zz +2), 255),
13393 : 0
13394 : );
13395 :
13396 : break;
13397 : }
13398 : case 4:
13399 : {
13400 :
13401 : if (ref->w6_4_9() == 0x35) {
13402 :
13403 : Creature *bp1e = reinterpret_cast<Creature *>(&_4976_4cca[dbCreature]);
13404 :
13405 : for (bp08 = _4976_4d0e->nRecords[dbCreature]; (bp08--) != 0; bp1e++) {
13406 :
13407 : if (true
13408 : && bp1e->w0 != ObjectID::FFFF
13409 : && bp1e->CreatureType() == 0x35
13410 : && (bp0a = bp1e->b5) != 0x00ff
13411 : && _4976_4ebe[bp0a].b26 != 0x13
13412 : ) {
13413 :
13414 : _4976_4ebe[bp0a].b23 = 0x13;
13415 :
13416 : goto _26cf;
13417 : }
13418 :
13419 : }
13420 : }
13421 :
13422 : ObjectID si = _1c9a_103a(
13423 : ref->w6_4_9(),
13424 : ((RAND02() + (bp06 << 1)) * zz) / 6,
13425 : (_4976_4bf6 +2) &3,
13426 : _4976_4bfa,
13427 : _4976_4c06,
13428 : _4976_4bf4,
13429 : -1,
13430 : _4976_4bf6
13431 : );
13432 :
13433 : if (si == si.FFFF)
13434 :
13435 : _075f_0255(ObjectID::FFA8, 0x6e, _4976_4bfa, _4976_4c06, 255);
13436 :
13437 : break;
13438 : }
13439 : case 3:
13440 : {
13441 :
13442 : sk5c20 bp18;
13443 : bp18.b5 = 0;
13444 :
13445 : bp08 = (zz +1) << 2;
13446 :
13447 : ObjectID si;
13448 : switch (ref->w6_4_9()) {
13449 : case 0:
13450 :
13451 : bp0a = 0x27;
13452 :
13453 : goto _2540;
13454 :
13455 : case 1:
13456 :
13457 : bp0a = 0x06;
13458 :
13459 : goto _2540;
13460 :
13461 : case 5:
13462 :
13463 : bp0a = 0x26;
13464 :
13465 : _2540:
13466 : _2759_15d0(bp0a, bp08 * 9);
13467 :
13468 :
13469 :
13470 : break;
13471 :
13472 : case 3:
13473 :
13474 : bp18.TimerType(0x47);
13475 :
13476 : if (_4976_57e6++ == 0 && _4976_52be != 0) {
13477 :
13478 : _4976_52af[_4976_52be].w50 |= 0x4000;
13479 : }
13480 :
13481 : bp08 <<= 3;
13482 :
13483 : bp18.SetMap(_4976_4bf4);
13484 : bp18.SetTick(_4976_4bec +bp08);
13485 :
13486 : QUEUE_TIMER(&bp18);
13487 :
13488 :
13489 : break;
13490 :
13491 : case 2:
13492 :
13493 : bp0a = 1;
13494 :
13495 : _25b4:
13496 : bp08 = bp08 * bp08 + 100;
13497 :
13498 : goto _25e8;
13499 :
13500 : case 8:
13501 :
13502 : bp0a = 0;
13503 :
13504 : goto _25b4;
13505 :
13506 : case 4:
13507 :
13508 : bp0a = 2;
13509 :
13510 : bp08 = bp08 * bp08;
13511 :
13512 :
13513 :
13514 : goto _25e8;
13515 :
13516 : case 6:
13517 :
13518 : bp0a = 5;
13519 :
13520 : _25db:
13521 : bp08 += 3;
13522 :
13523 : bp08 = bp08 * bp08;
13524 :
13525 : _25e8:
13526 : _2c1d_0186(bp04, bp0a, bp08, 0);
13527 :
13528 :
13529 :
13530 : break;
13531 :
13532 : case 7:
13533 :
13534 : bp0a = 4;
13535 :
13536 : goto _25db;
13537 :
13538 : case 9:
13539 :
13540 : bp0a = 6;
13541 :
13542 : goto _25db;
13543 :
13544 : case 10:
13545 :
13546 : bp0a = 3;
13547 :
13548 : goto _25db;
13549 :
13550 : case 11:
13551 :
13552 : _4976_57e8 = U8(min_value((bp08 << 3) + _4976_57e8, 255));
13553 :
13554 : break;
13555 :
13556 : case 14:
13557 :
13558 : _075f_0255(
13559 : ObjectID::FF8E,
13560 : BETWEEN_VALUE(21, ((bp06 << 1) +4) * (zz +2), 255),
13561 : _4976_4bfa,
13562 : _4976_4c06,
13563 : 255
13564 : );
13565 :
13566 : break;
13567 :
13568 : case 15:
13569 :
13570 : bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(0x0d, 0x0f, dtWordValue, 0x42);
13571 :
13572 : si = ALLOC_NEW_DBITEM(bp1a);
13573 :
13574 : if (_4976_57c8.w0 == 0xffff) {
13575 :
13576 : _2c1d_06b5(si, 1);
13577 :
13578 : break;
13579 : }
13580 : else {
13581 :
13582 : bp08 = (RAND01() + _4976_4bf6) & 3;
13583 :
13584 : MOVE_RECORD_TO(
13585 : ObjectID(si, bp08),
13586 : -1,
13587 : 0,
13588 : _4976_4bfa,
13589 : _4976_4c06
13590 : );
13591 :
13592 : break;
13593 : }
13594 : case 12:
13595 : case 13:
13596 : break;
13597 : }
13598 :
13599 : break;
13600 : }
13601 : }
13602 :
13603 : _26cf:
13604 : di = 0;
13605 :
13606 : if (bp0e != 0) {
13607 :
13608 : _2c1d_0b2c(player, ref->b5, bp0c);
13609 :
13610 : _2759_0f39(player, bp0e, 2);
13611 : }
13612 :
13613 : _26fe:
13614 : if (di != 0) {
13615 :
13616 : bp08 = ref->b5;
13617 :
13618 : if (bp08 > 3) {
13619 :
13620 : bp08 = (bp08 -4) >> 2;
13621 : }
13622 :
13623 : di |= bp08;
13624 : }
13625 :
13626 : return di;
13627 : }
13628 :
13629 :
13630 : void _0b36_1757(U8 cls1, U8 cls2, U8 cls4, U16 vv, U16 ww)
13631 : {
13632 :
13633 : ENTER(314);
13634 :
13635 : skxxx4 bp013a;
13636 : _0b36_0520(&bp013a, cls1, cls2, cls4);
13637 :
13638 : bp013a.w48 = ww;
13639 : bp013a.w24 = vv;
13640 :
13641 : _0b36_0a3f(_0b36_06d3(&bp013a));
13642 :
13643 : return;
13644 : }
13645 :
13646 :
13647 : U16 _48ae_0001(U16 xx)
13648 : {
13649 :
13650 : ENTER(0);
13651 :
13652 : if (xx <= 0x3f) {
13653 :
13654 : if ((_4976_5f52[xx >> 3] & (1 << (xx & 7))) == 0)
13655 :
13656 :
13657 : return 0;
13658 :
13659 : return 1;
13660 : }
13661 :
13662 : if (xx <= 0x7f) {
13663 :
13664 : return _4976_5f12[xx -0x40];
13665 : }
13666 :
13667 : if (xx <= 0xbf) {
13668 :
13669 : return _4976_5f5a[xx -0x80];
13670 : }
13671 :
13672 : return 0;
13673 : }
13674 :
13675 :
13676 : U16 _48ae_0058(U16 xx, U16 yy, U16 zz)
13677 : {
13678 :
13679 : ENTER(0);
13680 :
13681 : U16 di = yy;
13682 :
13683 : U16 si = _48ae_0001(xx);
13684 :
13685 : switch (zz) {
13686 : case 0:
13687 :
13688 : si = 1;
13689 :
13690 : break;
13691 :
13692 : case 1:
13693 :
13694 :
13695 : si = 0;
13696 :
13697 : break;
13698 :
13699 : case 2:
13700 :
13701 : si = (si != 0) ? 0 : 1;
13702 :
13703 : break;
13704 :
13705 : case 3:
13706 :
13707 : si += di;
13708 :
13709 : break;
13710 :
13711 : case 4:
13712 :
13713 : si -= di;
13714 :
13715 : break;
13716 :
13717 : case 5:
13718 : break;
13719 :
13720 : case 6:
13721 :
13722 : si = di;
13723 : break;
13724 : }
13725 :
13726 : if (xx <= 0x3f) {
13727 :
13728 : zz = 1 << (xx & 7);
13729 :
13730 : xx <<= 3;
13731 :
13732 : if (si != 0) {
13733 :
13734 : si = 1;
13735 :
13736 : _4976_5f52[xx] = U8(zz);
13737 :
13738 :
13739 : return si;
13740 : }
13741 : else {
13742 :
13743 : _4976_5f52[xx] &= ~U8(zz);
13744 :
13745 :
13746 : return si;
13747 : }
13748 : }
13749 :
13750 : if (xx <= 0x7f) {
13751 :
13752 : si = BETWEEN_VALUE(0, si, 255);
13753 :
13754 : _4976_5f12[xx -0x40] = U8(si);
13755 :
13756 :
13757 : return si;
13758 : }
13759 :
13760 : if (xx <= 0xbf) {
13761 :
13762 : _4976_5f5a[xx -0x80] = si;
13763 : }
13764 :
13765 : return si;
13766 : }
13767 :
13768 :
13769 : void _29ee_0b4a(U16 xx)
13770 : {
13771 :
13772 : ENTER(0);
13773 :
13774 : U16 di = 1;
13775 :
13776 : U16 si;
13777 : switch (xx & 0xfff0) {
13778 : case 0x0010:
13779 :
13780 : if ((xx & 15) == 3) {
13781 :
13782 : _4976_5340 = 0xfffc;
13783 : }
13784 : else {
13785 :
13786 : _4976_5340 = 0xfffb;
13787 : }
13788 :
13789 : si = 0x45;
13790 :
13791 : goto _0baa;
13792 :
13793 : case 0x0020:
13794 :
13795 : _4976_5340 = 0xfffd;
13796 :
13797 : si = 0x46;
13798 :
13799 : goto _0baa;
13800 :
13801 : case 0x0030:
13802 :
13803 : _0b36_1757(0x01, 0x05, dtWordValue, 0x5c, -1);
13804 :
13805 : si = 0x44;
13806 : di = 0x03;
13807 :
13808 : _0baa:
13809 : _4976_5352 = max_value(di, 8 - _48ae_0058(si, 1, 3));
13810 :
13811 : break;
13812 : }
13813 :
13814 : return;
13815 : }
13816 :
13817 :
13818 : Bit16u _2759_274d()
13819 : {
13820 :
13821 : ENTER(10);
13822 :
13823 : U16 bp0a = _4976_5366 -1;
13824 :
13825 : sk53b4 *bp04 = &_4976_53b4[bp0a];
13826 :
13827 : sk3e22 *bp08 = FIND_SPELL_BY_RUNES(bp04->GetRunes());
13828 :
13829 : U16 si = (bp08 == NULL)
13830 : ? 32
13831 : : _2759_222e(bp0a, bp08, i16(bp04->GetRunes()[0]) -0x5f);
13832 :
13833 : U16 di = (si != 0) ? 1 : 0;
13834 :
13835 : if (di != 0)
13836 :
13837 : _29ee_0b4a(si);
13838 :
13839 : si &= 0x00f0;
13840 :
13841 : if (si != 0x0030) {
13842 :
13843 : bp04->GetRunes()[0] = 0;
13844 : bp04->b30 = 0;
13845 :
13846 : _2759_0541();
13847 : }
13848 :
13849 : return di;
13850 : }
13851 :
13852 :
13853 : void REMOVE_RUNE_FROM_TAIL()
13854 : {
13855 :
13856 : ENTER(4);
13857 :
13858 : sk53b4 *bp04 = &_4976_52af[_4976_5366];
13859 :
13860 : bp04->RuneCnt(bp04->RuneCnt() -1);
13861 :
13862 : bp04->GetRunes()[bp04->RuneCnt()] = 0;
13863 :
13864 : _4976_5352 = 1;
13865 :
13866 : _2759_0644(0);
13867 :
13868 : _1031_0667();
13869 :
13870 : return;
13871 : }
13872 :
13873 :
13874 : void ADD_RUNE_TO_TAIL(Bit16u symbol_0to5)
13875 : {
13876 :
13877 : ENTER(6);
13878 :
13879 : sk53b4 *bp04 = &_4976_52af[_4976_5366];
13880 :
13881 : U16 si = bp04->RuneCnt();
13882 :
13883 : U16 di = _4976_3e00[si * 6 +symbol_0to5];
13884 :
13885 : if (si != 0) {
13886 :
13887 : di = (_4976_3e18[i8(bp04->GetRunes()[0]) -0x60] * di) >> 3;
13888 : }
13889 :
13890 : U16 bp06 = 0;
13891 :
13892 : if (bp04->curMP() >= di) {
13893 :
13894 : bp04->curMP(bp04->curMP() -di);
13895 :
13896 : bp04->w50 |= 0x0800;
13897 :
13898 : bp04->GetRunes()[si] = si * 6 +symbol_0to5 +0x60; si++;
13899 :
13900 : bp04->RuneCnt(U8(si));
13901 :
13902 : bp04->GetRunes()[si] = 0;
13903 :
13904 : bp06 = 1;
13905 : }
13906 :
13907 : _4976_5352 = 1;
13908 :
13909 : _2759_0644(0);
13910 :
13911 : _1031_0667();
13912 :
13913 : if (bp06 != 0) {
13914 :
13915 : _2e62_0670(_4976_5366 -1);
13916 : }
13917 :
13918 : return;
13919 : }
13920 :
13921 :
13922 : U16 QUERY_CUR_CMDSTR_ENTRY(U16 cmdNum)
13923 : {
13924 :
13925 : ENTER(0);
13926 :
13927 : return QUERY_CMDSTR_ENTRY(_4976_534f, _4976_5350, _4976_534e, cmdNum);
13928 : }
13929 :
13930 :
13931 : U16 _2c1d_111e(U16 player)
13932 : {
13933 :
13934 : ENTER(4);
13935 :
13936 : sk53b4 *bp04 = &_4976_53b4[player];
13937 :
13938 : i16 si = (RAND() & 7) + _2c1d_0ea2(bp04, 2, 0);
13939 :
13940 : si -= (_2c1d_203d(player) * i32(si >> 1)) / _2c1d_0ffc(bp04);
13941 :
13942 : si = max_value(2, si);
13943 :
13944 : if (_4976_4be8 != 0)
13945 :
13946 : si >>= 1;
13947 :
13948 : return BETWEEN_VALUE(100 - (RAND() & 7), (si >> 1), (RAND() & 7) +1);
13949 : }
13950 :
13951 :
13952 : U16 _2c1d_0f67(sk53b4 *ref, U16 xx)
13953 : {
13954 :
13955 : ENTER(0);
13956 :
13957 : U16 si = xx;
13958 :
13959 : if (RAND01() != 0 && RAND16(100) > si) {
13960 :
13961 : return 1;
13962 : }
13963 :
13964 : si = (RAND16(_2c1d_0ea2(ref, 0, 0) << 1) > si) ? 1 : 0;
13965 :
13966 : ref->b72[0][0] = U8(BETWEEN_VALUE(10, ref->b72[0][0] +((si != 0) ? -2 : 2), min_value(220, _2c1d_0ea2(ref, 0, 1))));
13967 :
13968 : return si;
13969 : }
13970 :
13971 :
13972 : U16 _075f_1f33(sk53b4 *ref, U16 aa, ObjectID rl, U16 xx, U16 yy, U16 bb, U16 cc, U16 dd, U16 ee)
13973 : {
13974 :
13975 : ENTER(16);
13976 :
13977 : if (aa >= _4976_4c3c)
13978 :
13979 : return 0;
13980 :
13981 : if (ref->curHP() == 0)
13982 :
13983 :
13984 : return 0;
13985 :
13986 : U16 bp0c = _4976_4d0a->Difficulty() << 1;
13987 :
13988 : Creature *bp08 = GET_ADDRESS_OF_RECORD4(rl);
13989 :
13990 : sk03a2 *bp04 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp08->CreatureType());
13991 :
13992 : i16 si;
13993 : i16 di;
13994 : if (true
13995 : && bp04->b8 != 255
13996 : && ((bp04->w24 & 0x1000) == 0 || ee == 1)
13997 : ) {
13998 :
13999 : ObjectID bp10 = GET_CREATURE_AT(xx, yy);
14000 :
14001 : if (bp10 == bp10.FFFF || _1c9a_0958(bp10) == 0) {
14002 :
14003 : U16 bp0e = bb & 0x8000;
14004 :
14005 : bb &= 0x7fff;
14006 :
14007 : if ((bp04->w0 & 0x0020) == 0 || bp0e != 0) {
14008 :
14009 : if (false
14010 : || _2c1d_111e(aa) > (((RAND() & 31) + bp04->b8 +bp0c +(_4976_4c36 << 1) -16) >> 1)
14011 : || RAND02() == 0
14012 : || _2c1d_0f67(ref, 75 -bb) != 0
14013 : ) {
14014 :
14015 : si = _2c1d_11bf(aa, _4976_5354, dd);
14016 :
14017 : if (si != 0) {
14018 :
14019 : si = RAND16((si >> 1) +1) +si;
14020 :
14021 : si = (i32(si) * cc) >> 5;
14022 :
14023 : U16 bp0a = bp04->b2 +(RAND() & 31) +bp0c;
14024 :
14025 : di = si = (RAND() & 31) +si -bp0a;
14026 :
14027 : if (di <= 1)
14028 :
14029 : goto _2112;
14030 : }
14031 :
14032 : si = RAND02();
14033 :
14034 : if (si != 0) {
14035 :
14036 : si++;
14037 :
14038 : di = (RAND() & 15) +di;
14039 :
14040 : if (di > 0 || RAND01() != 0) {
14041 :
14042 : si = RAND02() +si;
14043 :
14044 : if (RAND02() == 0) {
14045 :
14046 : si += max_value(0, (RAND() & 15) +di);
14047 : }
14048 : }
14049 :
14050 : _2112:
14051 : si >>= 1;
14052 :
14053 : si = RAND16(si) +RAND02() +si;
14054 :
14055 : si = RAND16(si) +si;
14056 :
14057 : si >>= 2;
14058 :
14059 : si = RAND02() +si +1;
14060 :
14061 : if ((RAND() & 63) < _2c1d_0a47(aa, dd, 1)) {
14062 :
14063 : si += si +10;
14064 : }
14065 :
14066 : di = QUERY_GDAT_DBSPEC_WORD_VALUE(ref->Possess(_4976_5354), 13);
14067 :
14068 : if (di != 0 && (RAND() & 31) < si) {
14069 :
14070 : si = _1c9a_198e(rl, di) +si;
14071 : }
14072 :
14073 : _2c1d_0b2c(aa, dd, ((bp04->w22_8_b() * si) >> 4) +3);
14074 :
14075 : _2c1d_1c7c(aa, RAND02() +4);
14076 :
14077 : goto _21dd;
14078 : }
14079 : }
14080 : }
14081 : }
14082 : }
14083 :
14084 : si = 0;
14085 :
14086 : _2c1d_1c7c(aa, RAND01() +2);
14087 :
14088 : _21dd:
14089 : _13e4_0401(rl, xx, yy, 0x6002, 0x5a, si);
14090 :
14091 : return si;
14092 : }
14093 :
14094 :
14095 : U16 _2759_14c8(U16 player, U16 bb, U16 xx, U16 yy, U16 cc, U16 dd)
14096 : {
14097 :
14098 : ENTER(4);
14099 :
14100 : sk53b4 *bp04 = &_4976_53b4[player];
14101 :
14102 : if (_4976_534c == ObjectID::FFFF)
14103 :
14104 :
14105 : return 0;
14106 :
14107 : if (GET_CREATURE_AT(xx, yy) == ObjectID::FFFF)
14108 :
14109 :
14110 : return 0;
14111 :
14112 : U16 di = bp04->playerPos();
14113 :
14114 : U16 si;
14115 : switch ((di +4 -bp04->playerDir()) & 3) {
14116 : case 2:
14117 :
14118 : si = 3;
14119 :
14120 : goto _152e;
14121 :
14122 : case 3:
14123 :
14124 : si = 1;
14125 :
14126 : _152e:
14127 : if (GET_PLAYER_AT_POSITION((di + si) & 3) != -1) {
14128 :
14129 : _4976_5340 = 0xffff;
14130 :
14131 : _4976_5352 = max_value(1, 8 - _48ae_0058(66, 1, 3));
14132 :
14133 :
14134 : return 0;
14135 : }
14136 :
14137 : break;
14138 : }
14139 :
14140 : if (bb == 1) {
14141 :
14142 : if ((_0cee_2de0(_4976_534c) & 0x0020) == 0)
14143 :
14144 :
14145 : return 0;
14146 : }
14147 :
14148 : si = QUERY_CUR_CMDSTR_ENTRY(CnPB);
14149 :
14150 : di = QUERY_CUR_CMDSTR_ENTRY(CnDM);
14151 :
14152 : if (QUERY_CUR_CMDSTR_ENTRY(CnHN) != 0)
14153 :
14154 : si |= 0x8000;
14155 :
14156 : _4976_5340 = _075f_1f33(bp04, player, _4976_534c, xx, yy, si, di, cc, dd);
14157 :
14158 : return 1;
14159 : }
14160 :
14161 : U16 _2759_1451(U16 ww, U16 xx, U16 yy);
14162 :
14163 :
14164 : i16 _2c1d_0e57(sk53b4 *ref, i16 xx)
14165 : {
14166 :
14167 : ENTER(2);
14168 :
14169 : i16 si = xx;
14170 :
14171 : i16 bp02 = ref->curStamina();
14172 :
14173 : U16 di = ref->maxStamina() >> 1;
14174 :
14175 : if (bp02 < di) {
14176 :
14177 : si >>= 1;
14178 :
14179 : return (i32(si) * i32(bp02)) / i32(di) +si;
14180 : }
14181 :
14182 : return si;
14183 : }
14184 :
14185 :
14186 : U16 _2c1d_11bf(U16 xx, U16 yy, i16 zz)
14187 : {
14188 :
14189 : ENTER(8);
14190 :
14191 : sk53b4 *bp04 = &_4976_53b4[xx];
14192 :
14193 : i16 si = (RAND() & 15) + _2c1d_0ea2(bp04, 1, 0);
14194 :
14195 : ObjectID bp08 = bp04->Possess(yy);
14196 :
14197 : U16 bp06 = QUERY_ITEM_WEIGHT(bp08);
14198 :
14199 : U16 di = _2c1d_0ffc(bp04) >> 4;
14200 :
14201 : si = (bp06 -12) +si;
14202 :
14203 : if (bp06 > di) {
14204 :
14205 : si = si - ((bp06 -di) >> 1);
14206 :
14207 : di += (di -12) >> 1;
14208 :
14209 : if (di < bp06) {
14210 :
14211 : si = si -((bp06 -di) << 1);
14212 : }
14213 : }
14214 :
14215 : if (zz >= 0) {
14216 :
14217 : si = (_2c1d_0a47(xx, zz, 1) << 1) +si;
14218 :
14219 : di = 0;
14220 :
14221 : switch (zz) {
14222 : case 0:
14223 : case 4:
14224 : case 5:
14225 : case 6:
14226 : case 7:
14227 : case 9:
14228 :
14229 : di = QUERY_GDAT_DBSPEC_WORD_VALUE(bp08, 8);
14230 :
14231 : break;
14232 :
14233 : case 1:
14234 : case 10:
14235 : case 11:
14236 :
14237 : di = QUERY_GDAT_DBSPEC_WORD_VALUE(bp08, 9);
14238 :
14239 : if (di == 0)
14240 :
14241 : break;
14242 :
14243 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(bp08, 5) & 0x8000) != 0) {
14244 :
14245 : if (zz != 11)
14246 :
14247 : di = 0;
14248 :
14249 : break;
14250 : }
14251 :
14252 : if (zz == 11)
14253 :
14254 : di = 0;
14255 :
14256 : break;
14257 :
14258 : case 2:
14259 : case 3:
14260 : case 8:
14261 :
14262 : break;
14263 : }
14264 :
14265 : si = si + di;
14266 : }
14267 :
14268 : si = _2c1d_0e57(bp04, si);
14269 :
14270 : if ((bp04->w52 & ((yy == 0) ? 1 : 2)) != 0)
14271 :
14272 : si >>= 1;
14273 :
14274 : return BETWEEN_VALUE(0, si >> 1, 100);
14275 : }
14276 :
14277 :
14278 : U16 _2c1d_0e23(U16 xx)
14279 : {
14280 :
14281 : ENTER(0);
14282 :
14283 : i16 di;
14284 : U16 si = BETWEEN_VALUE(1, di = (QUERY_ITEM_WEIGHT(xx) >> 1), 10);
14285 :
14286 : while ((di -= 10) > 0) {
14287 :
14288 : si += di >> 1;
14289 : }
14290 :
14291 : return si;
14292 : }
14293 :
14294 :
14295 : U16 _2c1d_1de2(U16 xx, i16 yy, U16 zz)
14296 : {
14297 :
14298 : ENTER(16);
14299 :
14300 : U16 di = xx;
14301 :
14302 : sk53b4 *bp04 = &_4976_53b4[di];
14303 :
14304 : U16 bp0e = 0;
14305 :
14306 : ObjectID bp0c ;
14307 : ObjectID si ;
14308 : if (yy < 0) {
14309 :
14310 : if (_4976_57c8.w0 == ObjectID::FFFF)
14311 :
14312 : return 0;
14313 :
14314 : bp0c = bp04->Possess(1);
14315 :
14316 : si = _2c1d_073d();
14317 :
14318 : bp04->Possess(1, si);
14319 :
14320 : yy = 1;
14321 :
14322 : bp0e = 1;
14323 : }
14324 :
14325 : i16 bp0a = _2c1d_11bf(di, yy, 10);
14326 :
14327 : if (bp0e != 0) {
14328 :
14329 : bp04->Possess(1, bp0c);
14330 : }
14331 : else {
14332 :
14333 : si = _2c1d_07a3(di, yy);
14334 :
14335 : if (si == si.FFFF)
14336 :
14337 :
14338 : return 0;
14339 : }
14340 :
14341 : QUEUE_NOISE_GEN2(QUERY_CLS1_FROM_RECORD(si), QUERY_CLS2_FROM_RECORD(si), 0x86, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x6e, 0x80);
14342 :
14343 : _2c1d_1c7c(di, _2c1d_0e23(si));
14344 :
14345 : _2759_0f39(di, 4, yy);
14346 :
14347 : U16 bp08 = 8;
14348 : U16 bp06 = 1;
14349 :
14350 : U16 bp10 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 9);
14351 :
14352 : if (bp10 != 0) {
14353 :
14354 : bp08 = (bp10 >> 2) +bp08 +4;
14355 : bp06 = bp10;
14356 : }
14357 :
14358 : _2c1d_0b2c(di, 10, bp08);
14359 :
14360 : bp0a += bp06;
14361 :
14362 : bp06 = _2c1d_0a47(di, 10, 1);
14363 :
14364 : bp0a = RAND16((bp0a >> 2) +8) +bp06 +bp0a;
14365 :
14366 : bp0a = min_value(bp0a, 255);
14367 :
14368 : bp08 = BETWEEN_VALUE(40, (RAND() & 31) + (bp06 << 3), 200);
14369 :
14370 : bp10 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 12);
14371 :
14372 : bp06 = (bp10 != 0) ? bp06 : max_value(5, 11 -bp06);
14373 :
14374 :
14375 : _075f_000b(si, _4976_4bfa, _4976_4c06, (_4976_4bf6 +zz) & 3, _4976_4bf6, bp0a, bp08, bp06);
14376 :
14377 : _4976_4c14 = 4;
14378 :
14379 : _4976_4c0c = _4976_4bf6;
14380 :
14381 : return 1;
14382 : }
14383 :
14384 :
14385 : U16 SET_DESTINATION_OF_MINION_MAP(ObjectID rlContainer, i16 xx, i16 yy, U16 zz)
14386 : {
14387 :
14388 : ENTER(4);
14389 :
14390 : U16 di = _4976_0c5a;
14391 :
14392 : CHANGE_CURRENT_MAP_TO(zz);
14393 :
14394 : U16 si = (xx >= 0 && xx < _4976_4dd2 && yy >= 0 && yy < _4976_4dd4) ? 1 : 0;
14395 :
14396 : if (si != 0) {
14397 :
14398 : Container *bp04 = GET_ADDRESS_OF_RECORD9(rlContainer);
14399 :
14400 : bp04->SetDestX(xx);
14401 :
14402 : bp04->SetDestY(yy);
14403 :
14404 : bp04->SetDestMap(zz);
14405 : }
14406 :
14407 : CHANGE_CURRENT_MAP_TO(di);
14408 :
14409 : return si;
14410 : }
14411 :
14412 :
14413 : void _1c9a_0cf7(U16 xx, U16 yy)
14414 : {
14415 :
14416 : ENTER(14);
14417 :
14418 : ObjectID si = GET_CREATURE_AT(xx, yy);
14419 :
14420 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
14421 :
14422 : if (_4976_4ebe[bp04->b5_0_7()].w2 != 0xffff) {
14423 :
14424 : _1c9a_0db0(si);
14425 : }
14426 :
14427 : sk5c20 bp0e;
14428 : bp0e.SetMap(_4976_0c5a);
14429 : bp0e.SetTick(_4976_4bec +1);
14430 :
14431 : bp0e.TimerType((bp04->w8 == 0xffff) ? 0x21 : 0x22);
14432 :
14433 : bp0e.b5 = bp04->CreatureType();
14434 :
14435 : bp0e.b6_0_f(U8(xx));
14436 : bp0e.b7_0_f(U8(yy));
14437 :
14438 : _4976_4ebe[bp04->b5_0_7()].w2 = QUEUE_TIMER(&bp0e);
14439 :
14440 : return;
14441 : }
14442 :
14443 :
14444 : void _13e4_0360(ObjectID rlCreature, U16 xx, U16 yy, U8 ss, U16 tt)
14445 : {
14446 :
14447 : ENTER(6);
14448 :
14449 : ObjectID si = rlCreature;
14450 :
14451 : if (si == si.FFFF) {
14452 :
14453 : si = GET_CREATURE_AT(xx, yy);
14454 :
14455 : if (si == si.FFFF)
14456 :
14457 : return;
14458 : }
14459 :
14460 : U8 bp01 = GET_ADDRESS_OF_RECORD4(si)->b5_0_7();
14461 :
14462 : if (bp01 == 0xff)
14463 :
14464 : return;
14465 :
14466 : sk4ebe *bp06 = &_4976_4ebe[bp01];
14467 :
14468 : if (bp06->b23 == 0x13 || bp06->b26 == 0x13)
14469 :
14470 : return;
14471 :
14472 : bp06->b23 = ss;
14473 :
14474 : if (tt == 0)
14475 :
14476 : return;
14477 :
14478 : if ((_4976_37a6[bp06->b26] & 0x10) != 0) {
14479 :
14480 : bp06->b33 = 1;
14481 :
14482 : return;
14483 : }
14484 :
14485 : _1c9a_0db0(si);
14486 :
14487 : _1c9a_0cf7(xx, yy);
14488 :
14489 : return;
14490 : }
14491 :
14492 :
14493 : void _1c9a_11bb(ObjectID rlCreature)
14494 : {
14495 :
14496 : ENTER(4);
14497 :
14498 : Missile *bp04 = GET_MISSILE_REF_OF_MINION(rlCreature, ObjectID::FFFF);
14499 :
14500 : if (bp04 != NULL) {
14501 :
14502 : U16 si = _4976_0c5a;
14503 :
14504 : CHANGE_CURRENT_MAP_TO(bp04->GetMap());
14505 :
14506 : _13e4_0360(rlCreature, bp04->GetX(), bp04->GetY(), 19, 1);
14507 :
14508 : CHANGE_CURRENT_MAP_TO(si);
14509 : }
14510 :
14511 : return;
14512 : }
14513 :
14514 :
14515 : void _2fcf_183c(i16 xx, i16 yy, U16 zz, U16 dir)
14516 : {
14517 :
14518 : ENTER(0);
14519 :
14520 : i16 di = yy;
14521 :
14522 : U16 si = (zz != _4976_4bf4) ? 1 : 0;
14523 :
14524 : if (si != 0)
14525 :
14526 : CHANGE_CURRENT_MAP_TO(zz);
14527 :
14528 : if (xx >= 0 && xx < _4976_4dd2 && di >= 0 && di < _4976_4dd4) {
14529 :
14530 : if (si != 0) {
14531 :
14532 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
14533 :
14534 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, -1, 0);
14535 :
14536 : _13ae_0009(U8(zz));
14537 :
14538 :
14539 : MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, xx, di);
14540 : }
14541 : else {
14542 :
14543 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, xx, di);
14544 : }
14545 :
14546 : ROTATE_SQUAD(dir);
14547 :
14548 : return;
14549 : }
14550 :
14551 : if (si != 0)
14552 :
14553 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
14554 :
14555 : return;
14556 : }
14557 :
14558 :
14559 : i16 _2fcf_2da7(U16 ss, U16 tt, U16 uu, i16 *xx, i16 *yy)
14560 : {
14561 :
14562 : ENTER(24);
14563 :
14564 : U16 bp16 = 0;
14565 : U16 bp18 = 0xffff;
14566 :
14567 : for (U16 si = 0; _4976_4d0e->nMaps > si; si++) {
14568 :
14569 : U16 bp12 = _4976_4dba[si].RawColumn();
14570 :
14571 : U16 bp14 = _4976_4dba[si].RawRow();
14572 :
14573 : U8 *bp04 = _4976_4ca8[si][0];
14574 :
14575 : U16 *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[si]]];
14576 :
14577 : for (U16 bp10 = 0; bp10 <= bp12; bp10++) {
14578 :
14579 : for (U16 di = 0; di <= bp14; di++) {
14580 :
14581 : if ((*(bp04++) & 0x10) != 0) {
14582 :
14583 : ObjectID bp0e = *(bp0c++);
14584 : do {
14585 :
14586 : switch (ss) {
14587 : case 2:
14588 : case 3:
14589 : case 4:
14590 : case 5:
14591 :
14592 : if (bp0e.DBType() == dbText) {
14593 :
14594 : Text *bp08 = GET_ADDRESS_OF_RECORD2(bp0e);
14595 :
14596 : if (bp08->TextMode() == 1) {
14597 :
14598 : switch (bp08->SimpleTextExtUsage()) {
14599 : case 11:
14600 :
14601 : if ((bp08->TextIndex() & 0xff) != uu)
14602 :
14603 : break;
14604 :
14605 : if (ss == 3) {
14606 :
14607 : bp16++;
14608 :
14609 : break;
14610 : }
14611 :
14612 : tt--;
14613 :
14614 : if (tt != 0)
14615 :
14616 : break;
14617 :
14618 : _2eee:
14619 : *xx = bp10;
14620 :
14621 : *yy = di;
14622 :
14623 : return si;
14624 :
14625 : case 16:
14626 :
14627 : if ((bp08->TextIndex() & 0xff) != uu)
14628 :
14629 : break;
14630 :
14631 : *xx = bp10;
14632 :
14633 : *yy = di;
14634 :
14635 : bp18 = si;
14636 :
14637 : break;
14638 :
14639 : case 15:
14640 :
14641 : if (ss == 4) {
14642 :
14643 : bp08->TextVisibility(0);
14644 :
14645 : break;
14646 : }
14647 :
14648 : if (ss != 5)
14649 :
14650 : break;
14651 :
14652 : if (bp08->TextVisibility() == 0)
14653 :
14654 : break;
14655 :
14656 : goto _2eee;
14657 : }
14658 : }
14659 : }
14660 :
14661 : break;
14662 : }
14663 :
14664 : bp0e = GET_NEXT_RECORD_LINK(bp0e);
14665 :
14666 : } while (bp0e != bp0e.FFFE && bp0e.DBType() <= dbActuator);
14667 : }
14668 :
14669 : }
14670 :
14671 : }
14672 :
14673 : }
14674 :
14675 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
14676 :
14677 : if (ss == 4) {
14678 :
14679 : return bp18;
14680 : }
14681 :
14682 : if (ss == 5) {
14683 :
14684 : return -1;
14685 : }
14686 :
14687 : return bp16;
14688 : }
14689 :
14690 :
14691 : U16 ENGAGE_X_TELEPORTER()
14692 : {
14693 :
14694 :
14695 :
14696 :
14697 :
14698 :
14699 : ENTER(10);
14700 :
14701 : ObjectID si = GET_TILE_RECORD_LINK(_4976_4bfa, _4976_4c06);
14702 :
14703 : U16 bp06;
14704 : for (; si != si.FFFE && (bp06 = si.DBType()) <= dbActuator; si = GET_NEXT_RECORD_LINK(si)) {
14705 :
14706 : if (bp06 == dbText) {
14707 :
14708 : Text *bp04 = GET_ADDRESS_OF_RECORD2(si);
14709 :
14710 : if (bp04->TextMode() == 1) {
14711 :
14712 : U16 di;
14713 : switch (bp04->SimpleTextExtUsage()) {
14714 : case 16:
14715 :
14716 : di = 5;
14717 :
14718 : goto _194a;
14719 :
14720 : case 15:
14721 :
14722 : di = 4;
14723 :
14724 : _194a:
14725 : i16 bp08;
14726 : i16 bp0a;
14727 : if (_2fcf_2da7(di, 0, bp04->TextIndex() & 0xff, &bp08, &bp0a) >= 0) {
14728 :
14729 : _2fcf_183c(bp08, bp0a, bp06, _4976_4bf6);
14730 :
14731 : QUEUE_NOISE_GEN2(0x0a, bp04->TextIndex() & 0xff, 0x88, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x8c, 0x80);
14732 :
14733 : if (di == 4) {
14734 :
14735 : bp04->TextVisibility(1);
14736 : }
14737 :
14738 : return 1;
14739 : }
14740 :
14741 : break;
14742 : }
14743 : }
14744 : }
14745 :
14746 : }
14747 :
14748 : return 0;
14749 : }
14750 :
14751 :
14752 : U16 ENGAGE_COMMAND(U16 player, i16 cmdSlot)
14753 : {
14754 :
14755 :
14756 :
14757 :
14758 :
14759 :
14760 :
14761 :
14762 : ENTER(84);
14763 :
14764 : U16 di = player;
14765 :
14766 : U16 bp4a = 0;
14767 :
14768 : U16 bp48 = cmdSlot & 0x8000;
14769 :
14770 : cmdSlot &= 0x7fff;
14771 :
14772 : _4976_534f = _4976_5358[cmdSlot].b0;
14773 :
14774 : _4976_5350 = _4976_5358[cmdSlot].b1;
14775 :
14776 : _4976_534e = _4976_5358[cmdSlot].b2;
14777 :
14778 : U16 bp34 = _4976_5354;
14779 :
14780 : U16 bp3a = bp34 ^ 1;
14781 :
14782 : sk53b4 *bp04 = &_4976_53b4[di];
14783 :
14784 : if (bp04->curHP() == 0)
14785 :
14786 : return 0;
14787 :
14788 : U16 bp1c = QUERY_CUR_CMDSTR_ENTRY(CnCM);
14789 :
14790 : U8 bp36 = U8(QUERY_CUR_CMDSTR_ENTRY(CnSD));
14791 :
14792 : U16 bp38 = 0;
14793 :
14794 : bp04->b32[bp04->w52] = U8(bp1c);
14795 :
14796 : Container *bp08 = NULL;
14797 :
14798 : ObjectID bp2e = bp04->Possess(bp34);
14799 :
14800 : if (bp2e != bp2e.FFFF) {
14801 :
14802 : bp08 = GET_ADDRESS_OF_RECORD9(bp2e);
14803 : }
14804 :
14805 : U16 bp22 = bp04->playerDir();
14806 :
14807 : U16 bp1e = _4976_4bfa + _4976_0232[bp22];
14808 :
14809 : U16 bp20 = _4976_4c06 + _4976_023a[bp22];
14810 :
14811 : _4976_534c = GET_CREATURE_AT(bp1e, bp20);
14812 :
14813 : U8 bp35;
14814 : sk03a2 *bp1a;
14815 : if (_4976_534c != _4976_534c.FFFF) {
14816 :
14817 : bp1a = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp35 = QUERY_CLS2_FROM_RECORD(_4976_534c));
14818 : }
14819 :
14820 : U16 bp26 = QUERY_CUR_CMDSTR_ENTRY(CnBZ);
14821 :
14822 : U16 bp2a = QUERY_CUR_CMDSTR_ENTRY(CnSK);
14823 :
14824 : U16 bp28 = QUERY_CUR_CMDSTR_ENTRY(CnTR) + RAND01();
14825 :
14826 : i16 bp2c = QUERY_CUR_CMDSTR_ENTRY(CnEX);
14827 :
14828 : U16 si = QUERY_CUR_CMDSTR_ENTRY(CnST);
14829 :
14830 : i16 bp46 = QUERY_CUR_CMDSTR_ENTRY(CnAT);
14831 :
14832 : bp04->b66[bp34] = U8(QUERY_CUR_CMDSTR_ENTRY(CnTA));
14833 :
14834 : U16 bp24 = GET_TILE_VALUE(bp1e, bp20);
14835 :
14836 : U16 bp0e = 1;
14837 :
14838 : ObjectID bp44;
14839 : U16 bp42;
14840 : i16 bp0c;
14841 : U16 bp40;
14842 : ObjectID bp32;
14843 : U16 bp0a;
14844 : ObjectID bp3e;
14845 : U16 bp50;
14846 : ObjectID bp30;
14847 : U16 bp3c;
14848 : switch (bp1c) {
14849 : case CmConfuse:
14850 :
14851 : si = si + _2c1d_0a47(di, 14, 1);
14852 :
14853 : bp0e = _2759_1451(si, bp1e, bp20);
14854 :
14855 : if (bp0e == 0)
14856 :
14857 : bp2c >>= 2;
14858 :
14859 : bp38 = 0;
14860 :
14861 : break;
14862 :
14863 : case CmInvisibility:
14864 :
14865 : si = max_value(32, si);
14866 :
14867 : bp50 = 0x47;
14868 :
14869 : if (_4976_57e6++ == 0 && _4976_52be != 0) {
14870 :
14871 : _4976_52af[_4976_52be].w50 |= 0x4000;
14872 : }
14873 :
14874 : sk5c20 bp54;
14875 : bp54.SetMap(_4976_4bf4);
14876 : bp54.SetTick(_4976_4bec +si);
14877 :
14878 : QUEUE_TIMER(&bp54);
14879 :
14880 : break;
14881 :
14882 : case CmLaunchMissile:
14883 :
14884 : bp44 = ObjectID::MissileRecord(QUERY_CUR_CMDSTR_ENTRY(CnPA));
14885 :
14886 : bp42 = 7 - min_value(6, _2c1d_0a47(di, bp2a, 1));
14887 :
14888 : if (bp04->curMP() < bp42) {
14889 :
14890 : si = max_value(2, (bp04->curMP() * si) / bp42);
14891 :
14892 : bp42 = bp04->curMP();
14893 : }
14894 :
14895 : bp0e = _2c1d_1d64(di, bp44, si, bp42);
14896 :
14897 : if (bp0e == 0)
14898 :
14899 : bp2c >>= 1;
14900 :
14901 : break;
14902 :
14903 : case CmPhysicalDamage4:
14904 : case CmPhysicalDamage8:
14905 :
14906 : if ((bp24 >> 5) == ttDoor && (bp24 & 7) == 4) {
14907 :
14908 : _075f_2205(
14909 : bp1e,
14910 : bp20,
14911 : _2c1d_11bf(di, bp34, bp2a),
14912 : 0,
14913 : 2
14914 : );
14915 :
14916 :
14917 : bp26 = 6;
14918 :
14919 : Door *bp12 = GET_ADDRESS_OF_TILE_RECORD(U8(bp1e), U8(bp20))->castToDoor();
14920 :
14921 : QUEUE_NOISE_GEN2(
14922 : 0x0e,
14923 : GET_GRAPHICS_FOR_DOOR(bp12),
14924 : 0x8d,
14925 : 0xfe,
14926 : bp1e,
14927 : bp20,
14928 : bp38 +1,
14929 : 0x3c,
14930 : 0xc8
14931 : );
14932 :
14933 : break;
14934 : }
14935 :
14936 : if (true
14937 : && _4976_534c != ObjectID::FFFF
14938 : && (bp1a->w0 & 0x0001) != 0
14939 : && bp1a->b2 == 255
14940 : && bp1a->b8 == 255
14941 : ) {
14942 :
14943 : bp2c >>= 1;
14944 : }
14945 : else {
14946 :
14947 : bp44 = QUERY_CUR_CMDSTR_ENTRY(CnPA);
14948 :
14949 : bp0e = _2759_14c8(di, bp44, bp1e, bp20, bp2a, bp46);
14950 :
14951 : if (bp0e == 0) {
14952 :
14953 : bp2c >>= 1;
14954 :
14955 : bp26 >>= 1;
14956 :
14957 : break;
14958 : }
14959 :
14960 : if (_4976_534c == ObjectID::FFFF)
14961 :
14962 : break;
14963 : }
14964 :
14965 : QUEUE_NOISE_GEN1(0x0f, bp35, 0x8d, 0x3c, 0xc8, bp1e, bp20, bp38 +1);
14966 :
14967 : break;
14968 :
14969 : case CmSpellReflection:
14970 :
14971 : _075f_0255(ObjectID::FF8E, max_value(2, si), _4976_4bfa, _4976_4c06, 255);
14972 :
14973 : break;
14974 :
14975 : case CmAuraOfSpeed:
14976 :
14977 : si = max_value(32, si);
14978 :
14979 : _4976_57e8 = U8(min_value(_4976_57e8 +si, 255));
14980 :
14981 : break;
14982 :
14983 : case CmLaunchProjective:
14984 :
14985 : if (_2759_0e30(di, bp34, bp04->Possess(bp3a)) == 0) {
14986 :
14987 : if (bp48 == 0) {
14988 :
14989 : _4976_5352 = max_value(1, 8 - _48ae_0058(67, 1, 3));
14990 :
14991 : _4976_5340 = 0xfffe;
14992 :
14993 : _4976_532e = QUERY_GDAT_DBSPEC_WORD_VALUE(bp2e, 5);
14994 :
14995 : _4976_534a = bp3a;
14996 :
14997 : bp2c = 0;
14998 : }
14999 :
15000 : bp0e = 0;
15001 :
15002 : break;
15003 : }
15004 :
15005 : bp30 = _2c1d_07a3(di, bp3a);
15006 :
15007 : bp0a = _2c1d_0a47(di, 11, 1);
15008 :
15009 : _2c1d_1cf3(
15010 : bp04,
15011 : bp30,
15012 : QUERY_GDAT_DBSPEC_WORD_VALUE(bp2e, 10) + QUERY_GDAT_DBSPEC_WORD_VALUE(bp30, 9) + bp0a,
15013 : (bp0a << 1) + QUERY_GDAT_DBSPEC_WORD_VALUE(bp30, 12),
15014 : QUERY_GDAT_DBSPEC_WORD_VALUE(bp30, 12)
15015 : );
15016 :
15017 : bp4a = 1;
15018 :
15019 : break;
15020 :
15021 : case CmSpellshield:
15022 : case CmFireshield:
15023 : case CmShield:
15024 :
15025 : bp0c = (bp1c == CmSpellshield) ? 1 : ((bp1c == CmFireshield) ? 0 : 2);
15026 :
15027 : si = max_value(32, si) * 3;
15028 :
15029 : if (_2c1d_0186(bp04, bp0c, si, 1) != 0)
15030 :
15031 : break;
15032 :
15033 : bp2c >>= 2;
15034 :
15035 : bp26 >>= 1;
15036 :
15037 : break;
15038 :
15039 : case CmConsume:
15040 :
15041 : _24a5_10fb(di, bp2e, bp34);
15042 :
15043 : break;
15044 :
15045 : case CmPorch:
15046 :
15047 : bp4a = 1;
15048 :
15049 : bp46 = _2759_04c0(di, bp34);
15050 :
15051 : if (bp46 < 0)
15052 :
15053 : break;
15054 :
15055 : bp2e = _2c1d_07a3(di, bp46);
15056 :
15057 : _2c1d_0831(di, bp2e, bp34);
15058 :
15059 : break;
15060 :
15061 : case CmHealing:
15062 :
15063 : bp0c = bp04->maxHP() - bp04->curHP();
15064 :
15065 : if (bp0c <= 0)
15066 : break;
15067 :
15068 : if (bp04->curMP() == 0)
15069 :
15070 : break;
15071 :
15072 : bp0a = min_value(10, _2c1d_0a47(di, 13, 1));
15073 :
15074 : bp2c = 2;
15075 :
15076 : do {
15077 :
15078 : bp0e = min_value(bp0c, bp0a);
15079 :
15080 : bp04->curHP(bp04->curHP() +bp0e);
15081 :
15082 : bp2c += 2;
15083 :
15084 : bp04->curMP(bp04->curMP() -2);
15085 :
15086 : } while (bp04->curMP() > 0 && (bp0c -= bp04->curMP()) != 0);
15087 :
15088 :
15089 : if (bp04->curMP() < 0)
15090 :
15091 : bp04->curMP(0);
15092 :
15093 : bp04->w50 |= 0x0800;
15094 :
15095 : bp0e = 1;
15096 :
15097 : break;
15098 :
15099 : case CmUseRope:
15100 :
15101 : bp1e = _4976_4bfa + _4976_0232[_4976_4bf6];
15102 :
15103 : bp20 = _4976_4c06 + _4976_023a[_4976_4bf6];
15104 :
15105 : bp40 = 1;
15106 :
15107 : bp32 = GET_CREATURE_AT(bp1e, bp20);
15108 :
15109 : if (bp32 != bp32.FFFF && (_0cee_2de0(bp32) & 0x8000) == 0) {
15110 :
15111 : bp40 = 0;
15112 : }
15113 :
15114 : if ((GET_TILE_VALUE(bp1e, bp20) >> 5) == 2 && bp40 != 0) {
15115 :
15116 : _4976_5824 = 1;
15117 :
15118 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, bp1e, bp20);
15119 :
15120 : _4976_5824 = 0;
15121 :
15122 : break;
15123 : }
15124 :
15125 : bp26 = 0;
15126 :
15127 : break;
15128 :
15129 : case CmFreezeLife:
15130 :
15131 : _4976_57e7 = U8(min_value(200, _4976_57e7 +si));
15132 :
15133 : break;
15134 :
15135 : case CmAuraOfDex:
15136 :
15137 : bp0c = 5;
15138 :
15139 : _1d6a:
15140 : si = max_value(32, si) << 2;
15141 :
15142 : if (_2c1d_0186(bp04, bp0c, si, 0) != 0)
15143 :
15144 : break;
15145 :
15146 : bp2c >>= 2;
15147 : bp26 >>= 1;
15148 :
15149 : break;
15150 :
15151 : case CmAuraOfWiz:
15152 :
15153 : bp0c = 4;
15154 :
15155 : goto _1d6a;
15156 :
15157 : case CmAuraOfVit:
15158 :
15159 : bp0c = 6;
15160 :
15161 : goto _1d6a;
15162 :
15163 : case CmAuraOfStr:
15164 :
15165 : bp0c = 3;
15166 :
15167 : goto _1d6a;
15168 :
15169 : case CmDarkness:
15170 : case CmLight:
15171 : case Cm39:
15172 :
15173 : _2759_15d0(bp1c, si);
15174 :
15175 : break;
15176 :
15177 : case CmThrow:
15178 :
15179 : bp0e = _2c1d_1de2(
15180 : di,
15181 : bp34,
15182 : (bp04->playerPos() != ((_4976_4bf6 +1) & 3))
15183 : ? (bp04->playerPos() == ((_4976_4bf6 +2) & 3))
15184 : ? 1
15185 : : 0
15186 : : 1
15187 : );
15188 :
15189 : break;
15190 :
15191 : case CmMark:
15192 :
15193 : bp0e = SET_DESTINATION_OF_MINION_MAP(bp2e, _4976_4bfa, _4976_4c06, _4976_4bf4);
15194 :
15195 : if (bp0e != 0)
15196 :
15197 : break;
15198 :
15199 : bp2c = 0;
15200 : bp26 = 1;
15201 :
15202 : break;
15203 :
15204 : case CmCallScout:
15205 :
15206 : bp35 = 0x30;
15207 :
15208 : goto _1ebe;
15209 :
15210 : case CmCallCarry:
15211 : case CmCallFetch:
15212 :
15213 : if (GET_MISSILE_REF_OF_MINION(bp08->GetContainedObject(), bp2e) != NULL) {
15214 :
15215 : GET_ADDRESS_OF_RECORD4(bp08->GetContainedObject())->CreatureType((bp1c == CmCallCarry) ? 0x32 : 0x33);
15216 :
15217 : _1c9a_0247(bp08->GetContainedObject());
15218 : }
15219 :
15220 : else if (bp1c == CmCallFetch) {
15221 :
15222 : bp35 = 0x33;
15223 :
15224 : bp0a = _4976_4bf6;
15225 :
15226 : bp1e = bp08->GetDestX();
15227 :
15228 : bp20 = bp08->GetDestY();
15229 :
15230 : bp22 = 0xffff;
15231 :
15232 : bp0c = bp08->b7_2_7();
15233 :
15234 : goto _1ed8;
15235 : }
15236 : else {
15237 :
15238 : bp35 = 0x32;
15239 :
15240 : _1ebe:
15241 : bp1e = _4976_4bfa;
15242 :
15243 : bp20 = _4976_4c06;
15244 :
15245 : bp0a = (_4976_4bf6 +2) & 3;
15246 :
15247 : bp0c = _4976_4bf4;
15248 :
15249 : _1ed8:
15250 : bp3e = _1c9a_103a(
15251 : bp35,
15252 : _2c1d_0a47(di, bp2a, 1),
15253 : bp0a,
15254 : bp1e,
15255 : bp20,
15256 : bp0c,
15257 : bp2e,
15258 : bp22
15259 : );
15260 :
15261 : bp0e = (bp3e != bp3e.FFFF) ? 1 : 0;
15262 :
15263 : if (bp0e != 0) {
15264 :
15265 : if (bp1c == CmCallScout) {
15266 :
15267 : SET_DESTINATION_OF_MINION_MAP(bp2e, _4976_5826, _4976_5828, _4976_581c);
15268 : }
15269 :
15270 : bp08->SetContainedObject(bp3e);
15271 :
15272 : break;
15273 : }
15274 :
15275 : bp2c >>= 2;
15276 : bp26 >>= 1;
15277 :
15278 : _075f_0255(ObjectID::FFA8, 0x6e, bp1e, bp20, 255);
15279 :
15280 : break;
15281 :
15282 :
15283 : _1f6b:
15284 : _1c9a_11bb(bp08->GetContainedObject());
15285 : }
15286 :
15287 :
15288 : break;
15289 :
15290 : case CmKillMinion:
15291 : goto _1f6b;
15292 :
15293 : case CmGuardMinion:
15294 :
15295 : bp3c = 0x34;
15296 :
15297 : goto _1f8e;
15298 :
15299 : case Cm51:
15300 :
15301 : bp3c = 0x35;
15302 :
15303 : goto _1f8e;
15304 :
15305 : case CmAttackMinion:
15306 :
15307 : bp3c = 0x31;
15308 :
15309 : _1f8e:
15310 : if (_1c9a_103a(bp3c, si >> 3, (_4976_4bf6 +2) & 3, _4976_4bfa, _4976_4c06, _4976_4bf4, bp2e, _4976_4bf6) != ObjectID::FFFF)
15311 :
15312 : break;
15313 :
15314 : _075f_0255(ObjectID::FFA8, 0x6e, _4976_4bfa, _4976_4c06, 255);
15315 :
15316 : break;
15317 :
15318 : case CmTeleport:
15319 :
15320 : if (ENGAGE_X_TELEPORTER() != 0)
15321 :
15322 : break;
15323 :
15324 : _4976_5352 = max_value(1, 8 - _48ae_0058(0x47, 1, 3));
15325 : _4976_5340 = 0xfffa;
15326 :
15327 : break;
15328 :
15329 : case 18:
15330 : case 19:
15331 : case 20:
15332 : case 21:
15333 : case 22:
15334 : case 23:
15335 : case 24:
15336 : case 25:
15337 : case 26:
15338 : case 27:
15339 : case 28:
15340 : case 29:
15341 : case 30:
15342 : case 31:
15343 : case 37:
15344 : case 40:
15345 : case 41:
15346 : case 43:
15347 : case 52:
15348 : case 53:
15349 :
15350 : break;
15351 : }
15352 :
15353 : if (bp4a == 0) {
15354 :
15355 : QUEUE_NOISE_GEN2(_4976_534f, _4976_5350, bp36, 0xfe, _4976_4bfa, _4976_4c06, bp38, 0x73, 0xc8);
15356 : }
15357 :
15358 : if (bp04->curHP() == 0 || bp48 != 0)
15359 :
15360 : return bp0e;
15361 :
15362 : if (bp26 != 0) {
15363 :
15364 : _2759_0f39(di, bp26, bp34);
15365 : }
15366 :
15367 : if (bp28 != 0) {
15368 :
15369 : _2c1d_1c7c(di, bp28);
15370 : }
15371 :
15372 : if (bp2c != 0) {
15373 :
15374 : _2c1d_0b2c(di, bp2a, bp2c);
15375 : }
15376 :
15377 : if (bp0e != 0) {
15378 :
15379 : sk536e *bp16 = &_4976_536e[di][bp34];
15380 :
15381 : bp16->w0 = QUERY_CUR_CMDSTR_ENTRY(CnRP);
15382 :
15383 : if (bp16->w0 != 0) {
15384 :
15385 : bp16->b2 = 1;
15386 :
15387 : bp16->w4 = bp2e;
15388 : bp16->b3 = i8(cmdSlot);
15389 : }
15390 : }
15391 :
15392 : return bp0e;
15393 : }
15394 :
15395 :
15396 : Bit16u _2759_1204(i16 cmdSlot)
15397 : {
15398 :
15399 : ENTER(6);
15400 :
15401 : U16 bp06 = 0;
15402 :
15403 : if (_4976_5366 != 0) {
15404 :
15405 : U16 di = _4976_5366 -1;
15406 :
15407 : sk53b4 *bp04 = &_4976_53b4[di];
15408 :
15409 : if (cmdSlot == -1) {
15410 :
15411 : _4976_5356 = 0;
15412 : }
15413 : else {
15414 :
15415 : bp04->w50 |= 0x0800;
15416 :
15417 : bp06 = ENGAGE_COMMAND(di, cmdSlot);
15418 :
15419 : i16 si = QUERY_CMDSTR_ENTRY(_4976_534f, _4976_5350, _4976_534e, CnNC);
15420 :
15421 : if (si == 16) {
15422 :
15423 : si = 15;
15424 : }
15425 :
15426 : if (si != 17 && si != 18) {
15427 :
15428 : ADD_ITEM_CHARGE(_4976_5368, -si);
15429 : }
15430 :
15431 : if (true
15432 : && ADD_ITEM_CHARGE(_4976_5368, 0) == 0
15433 : && (QUERY_GDAT_DBSPEC_WORD_VALUE(_4976_5368, 0x00) & 0x0800) != 0
15434 : ) {
15435 :
15436 : _2c1d_07a3(di, _4976_5354);
15437 :
15438 : DEALLOC_RECORD(_4976_5368);
15439 : }
15440 : }
15441 :
15442 : if (_4976_5356 != 0) {
15443 :
15444 : _4976_5356 &= 0xfbff;
15445 : }
15446 : else {
15447 :
15448 : _2759_0541();
15449 : }
15450 :
15451 : _2759_0644(0);
15452 : }
15453 :
15454 : return bp06;
15455 : }
15456 :
15457 :
15458 : void _2759_0589(Bit16u xx, Bit16u yy)
15459 : {
15460 :
15461 : ENTER(4);
15462 :
15463 : U16 si = xx;
15464 : U16 di = yy;
15465 :
15466 : sk53b4 *bp04 = &_4976_53b4[si];
15467 :
15468 : if (bp04->curHP() == 0)
15469 :
15470 : return;
15471 :
15472 : if (_2759_02d6(si, bp04->Possess(di), di) == 0)
15473 :
15474 : return;
15475 :
15476 : _4976_5354 = _4976_5324 = di;
15477 :
15478 : _4976_5366 = _4976_531e = si +1;
15479 :
15480 : _4976_5352 = 1;
15481 : _4976_5356 = 0;
15482 :
15483 : _443c_0662();
15484 :
15485 : _2759_0644(0);
15486 :
15487 : _2e62_0670(si);
15488 :
15489 : return;
15490 : }
15491 :
15492 :
15493 : void _2759_0602(Bit16u xx)
15494 : {
15495 :
15496 : ENTER(0);
15497 :
15498 : if (_4976_53b4[xx].curHP() == 0)
15499 :
15500 : return;
15501 :
15502 : _4976_5354 = _4976_5324 = 2;
15503 :
15504 : _4976_5366 = _4976_531e = xx +1;
15505 :
15506 : _4976_5352 = 1;
15507 : _4976_5356 = 0;
15508 :
15509 : _443c_0662();
15510 :
15511 : _2759_0644(0);
15512 :
15513 : return;
15514 : }
15515 :
15516 :
15517 : void _01b0_087a()
15518 : {
15519 : DOSIMPL();
15520 :
15521 :
15522 :
15523 :
15524 :
15525 :
15526 :
15527 :
15528 :
15529 :
15530 :
15531 :
15532 : }
15533 :
15534 :
15535 : void _443c_03f4()
15536 : {
15537 :
15538 : ENTER(0);
15539 :
15540 : _01b0_087a() INDIRECT_CALL;
15541 :
15542 : return;
15543 : }
15544 :
15545 :
15546 : void _443c_08ab(i16 *xx, i16 *yy, i16 *zz)
15547 : {
15548 :
15549 : ENTER(0);
15550 :
15551 : _01b0_0d39(xx, yy, zz, 0) INDIRECT_CALL;
15552 :
15553 : return;
15554 : }
15555 :
15556 :
15557 : U16 QUERY_GDAT_FOOD_VALUE_FROM_RECORD(ObjectID rl)
15558 : {
15559 :
15560 : ENTER(0);
15561 :
15562 : return QUERY_GDAT_DBSPEC_WORD_VALUE(rl, 3);
15563 : }
15564 :
15565 :
15566 : U16 DRINK_MISCITEM_WATER(ObjectID rlMiscItem)
15567 : {
15568 :
15569 : ENTER(0);
15570 :
15571 : ObjectID si = rlMiscItem;
15572 :
15573 : if (true
15574 : && (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 1) != 0
15575 : && ADD_ITEM_CHARGE(si, 0) != 0
15576 : ) {
15577 :
15578 : ADD_ITEM_CHARGE(si, -1);
15579 :
15580 : if (si == _4976_57c8.w0) {
15581 :
15582 : _2c1d_06b5(si, 0);
15583 : }
15584 :
15585 : return 1;
15586 : }
15587 :
15588 : return 0;
15589 : }
15590 :
15591 : void _2c1d_1bb5(U16 xx);
15592 : void _2c1d_0009(U16 xx, U16 yy, U16 zz, U16 ww);
15593 :
15594 :
15595 : void _24a5_10fb(Bit16u xx, ObjectID yy, Bit16u zz)
15596 : {
15597 :
15598 : ENTER(18);
15599 :
15600 : ObjectID di = yy;
15601 :
15602 : U16 bp12 = 1;
15603 :
15604 : if (di != di.FFFF) {
15605 :
15606 : bp12 = 0;
15607 : }
15608 :
15609 : else if (_4976_57c8.w0 == ObjectID::FFFF) {
15610 :
15611 : _443c_03f4();
15612 :
15613 : _4976_4bfe = 1;
15614 :
15615 :
15616 : if ((_4976_5db8 & 2) == 0) {
15617 :
15618 : FIRE_MOUSE_SET_POS();
15619 :
15620 : _4976_4bfe = 0;
15621 :
15622 : return;
15623 : }
15624 :
15625 : _443c_085a();
15626 :
15627 : _4976_4860 = 1;
15628 :
15629 : return;
15630 : }
15631 : else {
15632 :
15633 : xx = _4976_52be -1;
15634 :
15635 : di = _4976_57c8.w0;
15636 :
15637 : zz = -1;
15638 : }
15639 :
15640 : if (_4976_4bfc != 0)
15641 :
15642 : return;
15643 :
15644 : sk53b4 *bp04 = &_4976_53b4[xx];
15645 :
15646 : U16 bp10 = QUERY_GDAT_FOOD_VALUE_FROM_RECORD(di);
15647 :
15648 : if (bp10 != 0) {
15649 :
15650 : if (bp12 != 0) {
15651 :
15652 : _443c_085a();
15653 :
15654 : _2c1d_073d();
15655 :
15656 : for (U16 bp0c = 5; (--bp0c) != 0; ) {
15657 :
15658 : _0b36_1688(0x07, 0x00, ((bp0c & 1) != 0) ? 0x25 : 0x26, 545, -1);
15659 :
15660 : _44c8_1be8(0);
15661 :
15662 : SLEEP_SEVERAL_TIME(8);
15663 :
15664 : }
15665 : }
15666 :
15667 : bp04->curFood(min_value(bp04->curFood() +bp10, MAXFOOD));
15668 :
15669 : _2c1d_03e7(xx, di, zz, 2);
15670 :
15671 : DEALLOC_RECORD(di);
15672 :
15673 : if (zz != 0xffff) {
15674 :
15675 : bp04->Possess(zz, ObjectID::FFFF);
15676 : }
15677 :
15678 : goto _14a9;
15679 : }
15680 :
15681 : if (DRINK_MISCITEM_WATER(di) != 0) {
15682 :
15683 : bp04->curWater(min_value(bp04->curWater() +800, MAXWATER));
15684 :
15685 : if (zz != 0xffff) {
15686 :
15687 : bp04->Possess(zz, di);
15688 : }
15689 :
15690 : goto _14a9;
15691 : }
15692 :
15693 : U16 bp0a = di.DBType();
15694 :
15695 : if (bp0a == dbPotion) {
15696 :
15697 : Potion *bp08 = GET_ADDRESS_OF_RECORD8(di);
15698 :
15699 : U16 si = bp08->PotionPower();
15700 :
15701 : U16 bp0c = ((511 -si) / (((si +1) >> 3) +32)) >> 1;
15702 :
15703 : si = (si / 25) +8;
15704 :
15705 : U16 bp0e;
15706 : switch (bp08->PotionType()) {
15707 : default:
15708 :
15709 : return;
15710 :
15711 : case 6:
15712 :
15713 : _2c1d_0300(bp04, 2, si);
15714 :
15715 : break;
15716 :
15717 : case 7:
15718 :
15719 :
15720 : _2c1d_0300(bp04, 1, bp08->PotionPower() / 35 +5);
15721 :
15722 : break;
15723 :
15724 : case 8:
15725 :
15726 :
15727 : _2c1d_0300(bp04, 3, si);
15728 :
15729 : break;
15730 :
15731 : case 9:
15732 :
15733 :
15734 : _2c1d_0300(bp04, 4, si);
15735 :
15736 : break;
15737 :
15738 : case 10:
15739 :
15740 : _2c1d_1bb5(xx);
15741 :
15742 : break;
15743 :
15744 : case 11:
15745 :
15746 : bp04->curStamina(bp04->curStamina() +min_value(bp04->maxStamina() -bp04->curStamina(), bp04->maxStamina() / bp0c));
15747 :
15748 : break;
15749 :
15750 : case 12:
15751 :
15752 : si += (si >> 1);
15753 :
15754 : _2c1d_0009(1 << xx, 2, si, si * si);
15755 :
15756 : break;
15757 :
15758 : case 13:
15759 :
15760 : bp0a = min_value(bp04->curMP() +si +(si -8), MAXMP);
15761 :
15762 : if (bp04->maxMP() < bp0a) {
15763 :
15764 : bp0a -= (bp0a -max_value(bp04->curMP(), bp04->maxMP())) >> 1;
15765 : }
15766 :
15767 : bp04->curMP(bp0a);
15768 :
15769 : break;
15770 :
15771 : case 14:
15772 :
15773 : bp0a = bp08->PotionPower() / 42;
15774 :
15775 : bp04->curHP(bp04->curHP() + (bp04->maxHP() / bp0c));
15776 :
15777 : bp0e = bp04->w52;
15778 :
15779 : if (bp0e == 0)
15780 :
15781 : break;
15782 :
15783 : bp0c = 10;
15784 : do {
15785 :
15786 : for (si = 0; si < bp0a; si++) {
15787 :
15788 : bp04->w52 &= RAND();
15789 :
15790 : }
15791 :
15792 : bp0a = 1;
15793 :
15794 : if (bp04->w52 != bp0e)
15795 :
15796 : break;
15797 :
15798 : bp0c--;
15799 :
15800 : } while (bp0c != 0);
15801 :
15802 : break;
15803 :
15804 : case 15:
15805 :
15806 : bp04->curWater(min_value(bp04->curWater() +1600, MAXWATER));
15807 :
15808 : break;
15809 : }
15810 :
15811 : if (zz == 0xffff)
15812 :
15813 : _2c1d_073d();
15814 :
15815 : DEALLOC_RECORD(di);
15816 :
15817 : di = ALLOC_NEW_RECORD(dbPotion);
15818 :
15819 : if (di == di.FFFF)
15820 :
15821 : return;
15822 :
15823 : SET_ITEMTYPE(di, 0x14);
15824 :
15825 : if (zz == 0xffff) {
15826 :
15827 : _2c1d_06b5(di, 0);
15828 : }
15829 : else {
15830 :
15831 : bp04->Possess(zz, di);
15832 : }
15833 :
15834 : _14a9:
15835 : if (bp04->curStamina() > bp04->maxStamina()) {
15836 :
15837 : bp04->curStamina(bp04->maxStamina());
15838 : }
15839 :
15840 : if (bp04->curHP() > bp04->maxHP()) {
15841 :
15842 : bp04->curHP(bp04->maxHP());
15843 : }
15844 :
15845 : QUEUE_NOISE_GEN2(0x16, bp04->HeroType(), 0x83, 0xfe, _4976_4bfa, _4976_4c06, 0, 0x96, 0x80);
15846 :
15847 : bp04->w50 |= 0x3800;
15848 :
15849 : if (zz != 0xffff) {
15850 :
15851 : bp04->w50 |= 0x4000;
15852 :
15853 : CALC_PLAYER_WEIGHT(xx);
15854 : }
15855 : }
15856 :
15857 : return;
15858 : }
15859 :
15860 :
15861 : void _24a5_174d()
15862 : {
15863 :
15864 : ENTER(0);
15865 :
15866 : _443c_03f4();
15867 :
15868 : _4976_4c38 = 1;
15869 :
15870 : _443c_08ab(&_4976_5da0, &_4976_5da2, &_4976_5db8);
15871 :
15872 : if ((_4976_5db8 & 2) == 0) {
15873 :
15874 : FIRE_MOUSE_SET_POS();
15875 :
15876 : _4976_4c38 = 0;
15877 : }
15878 : else {
15879 :
15880 : _1031_098e();
15881 :
15882 : _443c_085a();
15883 :
15884 : SLEEP_SEVERAL_TIME(8);
15885 : }
15886 :
15887 : return;
15888 : }
15889 :
15890 : void _12b4_0aa5(U16 xx);
15891 :
15892 :
15893 : U16 IS_WALL_ORNATE_ALCOVE_FROM_RECORD(ObjectID rl)
15894 : {
15895 :
15896 : ENTER(0);
15897 :
15898 : return (IS_WALL_ORNATE_ALCOVE(QUERY_CLS2_FROM_RECORD(rl)) == 1) ? 1 : 0;
15899 : }
15900 :
15901 :
15902 : ObjectID GET_WALL_TILE_ANYITEM_RECORD(U16 xx, U16 yy)
15903 : {
15904 :
15905 : ENTER(0);
15906 :
15907 : ObjectID si = GET_TILE_RECORD_LINK(xx, yy);
15908 :
15909 : while (si.DBType() <= dbActuator) {
15910 :
15911 : si = GET_NEXT_RECORD_LINK(si);
15912 :
15913 : }
15914 :
15915 : return si;
15916 : }
15917 :
15918 :
15919 : U16 IS_WALL_ORNATE_SPRING(ObjectID rl)
15920 : {
15921 :
15922 : ENTER(2);
15923 :
15924 : U8 bp01 = QUERY_CLS2_FROM_RECORD(rl);
15925 :
15926 : if (bp01 == 0xff)
15927 :
15928 : return 0;
15929 :
15930 : return QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp01, dtWordValue, 0x0b);
15931 : }
15932 :
15933 : void _2f3f_0343(U16 xx, U16 yy, U16 dir, U16 zz);
15934 :
15935 :
15936 : ObjectID FIND_DISTINCTIVE_ITEM_ON_TILE(U16 xx, U16 yy, i16 dir, U16 disit)
15937 : {
15938 :
15939 : ENTER(0);
15940 :
15941 : for (ObjectID si = GET_WALL_TILE_ANYITEM_RECORD(xx, yy); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
15942 :
15943 : if (GET_DISTINCTIVE_ITEMTYPE(si) == disit) {
15944 :
15945 : if (dir == -1 || si.Dir() == dir) {
15946 :
15947 : return si;
15948 : }
15949 : }
15950 :
15951 : }
15952 :
15953 : return ObjectID::FFFF;
15954 : }
15955 :
15956 :
15957 : void MOVE_RECORD_AT_WALL(U16 xx, U16 yy, U16 dir, ObjectID rlUnk, ObjectID rlWhatYouPlace)
15958 : {
15959 :
15960 :
15961 :
15962 :
15963 :
15964 :
15965 :
15966 : ENTER(68);
15967 :
15968 : ObjectID si = rlWhatYouPlace;
15969 : U16 bp26 = 0;
15970 : U16 bp3a = 0;
15971 : ObjectID bp34 = ObjectID::FFFF;
15972 :
15973 : ObjectID bp0e = GET_TILE_RECORD_LINK(xx, yy);
15974 :
15975 : U16 bp2a;
15976 : for (U16 bp28 = 0; bp0e != bp0e.FFFE && bp28 == 0; bp0e = GET_NEXT_RECORD_LINK(bp0e)) {
15977 :
15978 : U16 bp10 = bp0e.Dir();
15979 :
15980 : if (bp10 != dir)
15981 :
15982 : continue;
15983 :
15984 : if (IS_WALL_ORNATE_ALCOVE_FROM_RECORD(bp0e) != 0) {
15985 :
15986 : if (si == si.FFFF) {
15987 :
15988 : ObjectID bp32 = GET_WALL_TILE_ANYITEM_RECORD(xx, yy);
15989 :
15990 : ObjectID bp30 = ObjectID::FFFF;
15991 :
15992 : for (; bp32 != bp32.FFFE; bp32 = GET_NEXT_RECORD_LINK(bp32)) {
15993 :
15994 : if (bp32.Dir() == bp10) {
15995 :
15996 : bp30 = bp32;
15997 : }
15998 :
15999 : }
16000 :
16001 : if (bp30 == bp30.FFFF)
16002 :
16003 : break;
16004 :
16005 : U16 bp2e = bp30.DBType();
16006 :
16007 : if (bp2e < dbWeapon || bp2e > dbMiscellaneous_item)
16008 :
16009 : break;
16010 :
16011 : MOVE_RECORD_TO(bp30, xx, yy, -1, 0);
16012 :
16013 : bp34 = bp30;
16014 :
16015 : break;
16016 : }
16017 :
16018 : bp2a = 1;
16019 :
16020 : MOVE_RECORD_TO(ObjectID(si, bp10), -1, 0, xx, yy);
16021 :
16022 : break;
16023 : }
16024 :
16025 : if (IS_WALL_ORNATE_SPRING(bp0e) != 0) {
16026 :
16027 : if (si == si.FFFF) {
16028 :
16029 : if (_4976_3fc6 == -1)
16030 :
16031 : break;
16032 :
16033 : for (i16 bp42 = 0; bp42 < 4; bp42++) {
16034 :
16035 : if (_4976_53b4[bp42].curHP() != 0) {
16036 :
16037 : _4976_53b4[bp42].curWater(MAXWATER);
16038 : }
16039 :
16040 : }
16041 :
16042 : QUEUE_NOISE_GEN2(0x16, _4976_53b4[_4976_3fc6].HeroType(), 0x83, 0xfe, _4976_4bfa, _4976_4c06, 0, 0x96, 0x80);
16043 :
16044 : break;
16045 : }
16046 :
16047 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 1) != 0) {
16048 :
16049 : ADD_ITEM_CHARGE(si, 15);
16050 :
16051 : bp2a = 1;
16052 : bp34 = si;
16053 :
16054 : break;
16055 : }
16056 :
16057 : if (GET_DISTINCTIVE_ITEMTYPE(si) != 0x0194)
16058 :
16059 : break;
16060 :
16061 : SET_ITEMTYPE(si, 15);
16062 :
16063 : bp2a = 1;
16064 : bp34 = si;
16065 :
16066 : break;
16067 : }
16068 :
16069 : U16 bp1c = bp0e.DBType();
16070 :
16071 : U16 bp16;
16072 : if (bp1c == dbActuator) {
16073 :
16074 : Actuator *bp04 = GET_ADDRESS_OF_RECORD3(bp0e);
16075 :
16076 : bp16 = bp04->ActuatorType();
16077 :
16078 : U16 bp18 = bp04->ActuatorData();
16079 :
16080 : U16 bp1a = bp04->ActionType();
16081 :
16082 : if (_4976_3fc6 == -1 && bp16 != 0x7e)
16083 :
16084 : continue;
16085 :
16086 : U8 bp23 = GET_WALL_DECORATION_OF_ACTUATOR(bp04);
16087 :
16088 : if (bp16 == 0)
16089 :
16090 : continue;
16091 :
16092 : U16 di = 1;
16093 :
16094 : U16 bp44 = bp16;
16095 :
16096 : U16 bp2c;
16097 : Door *bp14;
16098 : U16 bp1e;
16099 : U16 bp36;
16100 : switch (bp44) {
16101 : default:
16102 :
16103 : continue;
16104 :
16105 : case 0x3F:
16106 :
16107 : if (si == si.FFFF)
16108 :
16109 : bp04->w4_0_0(0);
16110 :
16111 : break;
16112 :
16113 : case 0x01:
16114 :
16115 : di = 0;
16116 :
16117 : if (bp04->ActionType() != 3)
16118 :
16119 :
16120 : continue;
16121 :
16122 : break;
16123 :
16124 : case 0x02:
16125 :
16126 : di = (bp04->RevertEffect() != ((si == si.FFFF) ? 1 : 0)) ? 1 : 0;
16127 :
16128 :
16129 :
16130 : break;
16131 :
16132 : case 0x15:
16133 :
16134 : if (ADD_ITEM_CHARGE(si, 0) == 0)
16135 :
16136 : break;
16137 :
16138 : goto _1cb6;
16139 :
16140 : case 0x03:
16141 :
16142 : _1cb6:
16143 : bp2c = (GET_DISTINCTIVE_ITEMTYPE(si) == bp18) ? 1 : 0;
16144 :
16145 : di = (bp04->RevertEffect() == bp2c) ? 1 : 0;
16146 :
16147 : if (bp2c == 0 || bp04->OnceOnlyActuator() == 0)
16148 :
16149 : break;
16150 :
16151 : DEALLOC_RECORD(_2c1d_073d());
16152 :
16153 : break;
16154 :
16155 : case 0x46:
16156 :
16157 : bp14 = GET_ADDRESS_OF_TILE_RECORD(bp04->Xcoord(), bp04->Ycoord())->castToDoor();
16158 :
16159 : if (bp14->w2_d_d() == 0)
16160 :
16161 : continue;
16162 :
16163 : goto _1d4d;
16164 :
16165 : case 0x18:
16166 :
16167 : _1d4d:
16168 : if (si != si.FFFF || bp04->w4_0_0() != 0)
16169 :
16170 : continue;
16171 :
16172 : sk5c20 bp40;
16173 : bp40.SetMap(_4976_0c5a);
16174 : bp40.SetTick(_4976_4bec +bp18 +2);
16175 :
16176 : bp40.TimerType(0x57);
16177 : bp40.b5 = 0;
16178 :
16179 : bp40.w6 = bp0e;
16180 :
16181 : QUEUE_TIMER(&bp40);
16182 :
16183 : bp04->w4_0_0(1);
16184 :
16185 : di = 0;
16186 :
16187 : if (di != 0 || bp1a != 3)
16188 :
16189 : break;
16190 :
16191 : bp26 = 1;
16192 :
16193 : if (bp04->SoundEffect() != 0) {
16194 :
16195 : QUEUE_NOISE_GEN2(0x09, bp23, 0x88, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x8c, 0x80);
16196 : }
16197 :
16198 : INVOKE_ACTUATOR(bp04, 0, 0);
16199 :
16200 : INVOKE_ACTUATOR(bp04, 1, bp18 +1);
16201 :
16202 : continue;
16203 :
16204 : case 0x17:
16205 :
16206 : if (si != si.FFFF)
16207 :
16208 : continue;
16209 :
16210 : bp04->OnceOnlyActuator(bp04->OnceOnlyActuator() ^ 1);
16211 :
16212 : di = !(bp04->OnceOnlyActuator() ^ bp04->RevertEffect());
16213 :
16214 :
16215 : break;
16216 :
16217 : case 0x7E:
16218 :
16219 : if (bp04->OnceOnlyActuator() == 0 || ((_4976_4bf6 +2) & 3) != dir)
16220 :
16221 : break;
16222 :
16223 : _2f3f_0343(_4976_4bfa, _4976_4c06, _4976_4bf6, _4976_4bf4);
16224 :
16225 : bp28 = 1;
16226 :
16227 : di = 0;
16228 :
16229 : break;
16230 :
16231 : case 0x1A:
16232 :
16233 : bp1e = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x0e);
16234 :
16235 : if (bp04->OnceOnlyActuator() != 0) {
16236 :
16237 : if (si != si.FFFF)
16238 :
16239 : goto _22b1;
16240 :
16241 : si = FIND_DISTINCTIVE_ITEM_ON_TILE(xx, yy, bp10, bp1e);
16242 :
16243 : if (si == si.FFFE) {
16244 :
16245 : si = ALLOC_NEW_DBITEM(bp1e);
16246 :
16247 : if (si == si.FFFF)
16248 :
16249 : continue;
16250 :
16251 : APPEND_RECORD_TO(si = ObjectID(si, bp10), NULL, xx, yy);
16252 : }
16253 :
16254 : ADD_ITEM_CHARGE(si, 15);
16255 :
16256 : MOVE_RECORD_TO(si, xx, yy, -1, 0);
16257 :
16258 : bp34 = si;
16259 : }
16260 : else {
16261 :
16262 : if (si == si.FFFF || GET_DISTINCTIVE_ITEMTYPE(si) != bp1e)
16263 :
16264 : continue;
16265 :
16266 : bp2a = 1;
16267 :
16268 : MOVE_RECORD_TO(ObjectID(bp10, si), -1, 0, xx, yy);
16269 : }
16270 :
16271 : si = si.FFFF;
16272 :
16273 : goto _22ab;
16274 :
16275 : case 0x1B:
16276 :
16277 : if (bp18 == 0)
16278 :
16279 : continue;
16280 :
16281 : bp1e = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x0e);
16282 :
16283 : if (GET_DISTINCTIVE_ITEMTYPE(si) != bp1e)
16284 :
16285 : continue;
16286 :
16287 : bp2a = 1;
16288 :
16289 : si = si.FFFF;
16290 :
16291 : if (--bp18 == 0) {
16292 :
16293 : di = 0;
16294 :
16295 : bp04->w4_0_0(1);
16296 : }
16297 :
16298 : bp04->ActuatorData(bp18);
16299 :
16300 : break;
16301 :
16302 : case 0x1C:
16303 :
16304 : if (si != si.FFFF || bp04->OnceOnlyActuator() != 0)
16305 :
16306 : continue;
16307 :
16308 : bp36 = (bp04->RevertEffect() != 0) ? bp04->ActionType() : ((bp04->ActionType() + _4976_4bf6) & 3);
16309 :
16310 : _2fcf_183c(bp04->Xcoord(), bp04->Ycoord(), bp18 & 0x3f, bp36);
16311 :
16312 : _1031_098e();
16313 :
16314 : break;
16315 : }
16316 :
16317 : if (bp1a == 3) {
16318 :
16319 : bp1a = (di != 0) ? 1 : 0;
16320 :
16321 : di = 0;
16322 : }
16323 :
16324 : if (di != 0)
16325 :
16326 : continue;
16327 :
16328 : bp26 = 1;
16329 :
16330 : if (bp04->SoundEffect() != 0) {
16331 :
16332 : QUEUE_NOISE_GEN2(0x09, bp23, 0x88, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x8c, 0x80);
16333 : }
16334 :
16335 : INVOKE_ACTUATOR(bp04, bp1a, 0);
16336 : }
16337 :
16338 : if (rlUnk == rlUnk.FFFF || bp1c == dbText) {
16339 :
16340 : Text *bp0c = GET_ADDRESS_OF_RECORD2(bp0e);
16341 :
16342 : if (bp0c->TextMode() != 1)
16343 :
16344 : continue;
16345 :
16346 : U8 bp23 = bp0c->TextIndex() & 0xff;
16347 :
16348 : if (_4976_3fc6 == -1)
16349 :
16350 : continue;
16351 :
16352 : i16 bp20;
16353 : i16 bp22;
16354 : i16 bp36;
16355 : U16 bp1e;
16356 : switch (bp0c->SimpleTextExtUsage()) {
16357 : case 4:
16358 : case 8:
16359 :
16360 : bp1e = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x0e);
16361 :
16362 : if (bp0c->TextVisibility() != 0) {
16363 :
16364 : if (si != si.FFFF)
16365 :
16366 : goto _22b1;
16367 :
16368 : si = FIND_DISTINCTIVE_ITEM_ON_TILE(xx, yy, bp10, bp1e);
16369 :
16370 : if (si == si.FFFF) {
16371 :
16372 : si = ALLOC_NEW_DBITEM(bp1e);
16373 :
16374 : if (si == si.FFFF)
16375 :
16376 : continue;
16377 :
16378 : APPEND_RECORD_TO(si = ObjectID(si, bp10), NULL, xx, yy);
16379 : }
16380 :
16381 : ADD_ITEM_CHARGE(si, 15);
16382 :
16383 : MOVE_RECORD_TO(si, xx, yy, -1, 0);
16384 :
16385 : bp34 = si;
16386 :
16387 : si = si.FFFF;
16388 :
16389 : if (bp16 != 8)
16390 :
16391 : goto _22ab;
16392 :
16393 : sk5c20 bp40;
16394 : bp40.SetMap(_4976_0c5a);
16395 : bp40.SetTick(QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x12) + _4976_4bec +2);
16396 :
16397 : bp40.TimerType(0x5c);
16398 : bp40.b5 = 0;
16399 :
16400 : bp40.w6 = bp0e;
16401 :
16402 : QUEUE_TIMER(&bp40);
16403 : }
16404 :
16405 : else if (bp16 != 8) {
16406 :
16407 : if (si == si.FFFF)
16408 :
16409 : continue;
16410 :
16411 : if (GET_DISTINCTIVE_ITEMTYPE(si) != bp1e)
16412 :
16413 : continue;
16414 :
16415 : bp2a = 1;
16416 :
16417 : MOVE_RECORD_TO(ObjectID(bp10, si), -1, 0, xx, yy);
16418 :
16419 : si = si.FFFF;
16420 : }
16421 :
16422 : _22ab:
16423 : _4976_4cb8 = 1;
16424 :
16425 : _22b1:
16426 : bp28 = 1;
16427 :
16428 : continue;
16429 :
16430 : case 7:
16431 :
16432 : if (bp0c->TextVisibility() != 0)
16433 :
16434 : continue;
16435 :
16436 : goto _22ca;
16437 :
16438 : case 6:
16439 :
16440 : _22ca:
16441 : if (si != si.FFFF)
16442 :
16443 : continue;
16444 :
16445 : bp36 = (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x11) != 0) ? -1 : 1;
16446 :
16447 : bp20 = _4976_4bfa;
16448 : bp22 = _4976_4c06;
16449 :
16450 : bp36 = _0cee_0510(_4976_4bfa, bp36, &bp20, &bp22, NULL);
16451 :
16452 : if (bp36 < 0)
16453 :
16454 : continue;
16455 :
16456 : _2fcf_183c(bp20, bp22, bp36, _4976_4bf6);
16457 :
16458 : _1031_098e();
16459 :
16460 : continue;
16461 :
16462 : case 13:
16463 :
16464 : if (si != si.FFFF)
16465 :
16466 : continue;
16467 :
16468 : bp0c->TextVisibility(bp0c->TextVisibility() ^ 1);
16469 :
16470 : break;
16471 :
16472 : case 5:
16473 : case 9:
16474 : case 10:
16475 : case 11:
16476 : case 12:
16477 : continue;
16478 : }
16479 : }
16480 :
16481 : if (bp1c >= dbActuator)
16482 :
16483 : break;
16484 :
16485 : }
16486 :
16487 : if (rlUnk == rlUnk.FFFF) {
16488 :
16489 : if (bp2a != 0)
16490 :
16491 : _2c1d_073d();
16492 :
16493 : if (bp34 != bp34.FFFF) {
16494 :
16495 : _2c1d_06b5(bp34, 1);
16496 : }
16497 :
16498 : _4976_4e5c = bp26;
16499 :
16500 : return;
16501 : }
16502 :
16503 : GenericContainerRecord *bp08 = GET_ADDRESS_OF_GENERIC_CONTAINER_RECORD(rlUnk);
16504 :
16505 : if (bp2a == 0 && rlWhatYouPlace != rlWhatYouPlace.FFFF) {
16506 :
16507 : APPEND_RECORD_TO(rlWhatYouPlace, &bp08->w2, -1, 0);
16508 : }
16509 :
16510 : if (bp34 != bp34.FFFF) {
16511 :
16512 : APPEND_RECORD_TO(bp34, &bp08->w2, -1, 0);
16513 : }
16514 :
16515 : return;
16516 : }
16517 :
16518 :
16519 : U16 _098d_0cd7(i16 xx, U16 yy, U16 zz)
16520 : {
16521 :
16522 : ENTER(0);
16523 :
16524 : if (zz != 0) {
16525 :
16526 : return _4976_019a[xx] +yy;
16527 : }
16528 :
16529 : return xx * 25 +yy +3100;
16530 : }
16531 :
16532 :
16533 : void _32cb_08c1(U16 mirrorflip, U16 yy, U16 zz, i16 offx, i16 offy, i16 uu, U16 oo, U16 pp, i16 colorkey1, i16 colorkey2, U8 cls1, U8 cls2, U8 cls4)
16534 : {
16535 :
16536 : ENTER(2);
16537 :
16538 : U16 di = uu;
16539 : _0b36_0520(&_4976_5940, cls1, cls2, cls4);
16540 :
16541 : if (yy != zz) {
16542 :
16543 : U8 bp01;
16544 : if (di == 2) {
16545 :
16546 : bp01 = 0x14;
16547 :
16548 : goto _08fe;
16549 : }
16550 :
16551 : else if (di == 3) {
16552 :
16553 : bp01 = 0x15;
16554 :
16555 : _08fe:
16556 : U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtWordValue, bp01);
16557 :
16558 : if (si != 0) {
16559 :
16560 : yy = ((((si >> 8) << 7) / (si & 255)) +1) >> 1;
16561 : }
16562 : }
16563 : }
16564 :
16565 : _4976_5940.w50 = mirrorflip;
16566 : _4976_5940.w52 = yy;
16567 : _4976_5940.w54 = zz;
16568 : _4976_5940.w28 += offx;
16569 : _4976_5940.w30 += offy;
16570 : _4976_5940.w24 = oo;
16571 : _4976_5940.w26 = pp;
16572 : _4976_5940.pb44 = _4976_4c16;
16573 : _4976_5940.w48 = colorkey1;
16574 :
16575 : _32cb_0804(_4976_5940.b58, U8(di), colorkey1, colorkey2, _4976_5940.w56);
16576 :
16577 : _0b36_06d3(&_4976_5940);
16578 :
16579 : return;
16580 : }
16581 :
16582 :
16583 : void _32cb_0997()
16584 : {
16585 :
16586 : ENTER(0);
16587 :
16588 : _0b36_0a3f(&_4976_5940);
16589 :
16590 : return;
16591 : }
16592 :
16593 :
16594 : void _32cb_0a4c(SRECT *prc, U8 xx, U8 yy)
16595 : {
16596 :
16597 : ENTER(0);
16598 :
16599 : COPY_MEMORY(prc, &_4976_4d1a[_4976_4dde], 8);
16600 :
16601 : _4976_4d1a[_4976_4dde].b11 = xx;
16602 : _4976_4d1a[_4976_4dde].b10 = yy;
16603 : _4976_4d1a[_4976_4dde].w8 = 0xffff;
16604 :
16605 : _4976_4dde++;
16606 :
16607 : return;
16608 : }
16609 :
16610 :
16611 : void QUERY_GDAT_IMAGE_METRICS(U8 cls1, U8 cls2, U8 cls3, i16 *pcx, i16 *pcy)
16612 : {
16613 :
16614 : ENTER(4);
16615 :
16616 : U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls3);
16617 :
16618 : if (_4976_5c98[si].Absent()) {
16619 :
16620 : U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(cls1, cls2, cls3);
16621 :
16622 : *pcx = READ_I16(bp04,-4);
16623 : *pcy = READ_I16(bp04,-2);
16624 : }
16625 : else {
16626 :
16627 : U8 *bp04 = _3e74_506b(cls1, cls2, dtImage, cls3);
16628 :
16629 : *pcx = READ_I16(bp04,+0) & 1023;
16630 : *pcy = READ_I16(bp04,+2) & 1023;
16631 : }
16632 :
16633 : return;
16634 : }
16635 :
16636 : U16 _32cb_158f(U8 xx);
16637 :
16638 :
16639 : U8 *_0b36_037e(U8 *localpal, i8 xx, i16 colorkey1, i16 colorkey2, i16 palentcnt)
16640 : {
16641 :
16642 : ENTER(8);
16643 :
16644 : if (localpal != NULL && xx != 0) {
16645 :
16646 : xx = U8(max_value(0, 64 -xx));
16647 :
16648 : for (i16 bp02 = 0; bp02 < palentcnt; bp02++) {
16649 :
16650 : if (bp02 != colorkey1 && bp02 != colorkey2) {
16651 :
16652 : U16 di = _4976_4be2[localpal[bp02]].b0;
16653 : i16 si = 0;
16654 :
16655 : i16 bp04 = max_value((_4976_4bde[di].pv1[_4976_4be2[localpal[bp02]].b1] * xx) >> 6, 0);
16656 :
16657 : for (; _4976_4bde[di].b0 -1 > si; si++) {
16658 :
16659 : if (true
16660 : && _4976_4bde[di].pv1[si] <= bp04
16661 : && _4976_4bde[di].pv1[si +1] >= bp04
16662 : ) {
16663 :
16664 : i16 bp06 = bp04 - _4976_4bde[di].pv1[si ];
16665 :
16666 : i16 bp08 = _4976_4bde[di].pv1[si +1] -bp04;
16667 :
16668 : if (bp06 > bp08)
16669 :
16670 : si++;
16671 :
16672 : break;
16673 : }
16674 :
16675 : }
16676 :
16677 : si = min_value(si, _4976_4bde[di].b0 -1);
16678 :
16679 :
16680 : localpal[bp02] = _4976_4bde[di].pv5[si];
16681 : }
16682 :
16683 : }
16684 : }
16685 :
16686 : return localpal;
16687 : }
16688 :
16689 :
16690 : void _32cb_0804(U8 *localpal, U8 cls4, U16 colorkey1, i16 colorkey2, U16 palentcnt)
16691 : {
16692 :
16693 : ENTER(0);
16694 :
16695 : U16 di = palentcnt;
16696 :
16697 : i16 si;
16698 : if (_4976_4bea != 0) {
16699 :
16700 : if (cls4 < 0) {
16701 :
16702 : si = max_value(-_4976_5a88, _4976_421b[-cls4]);
16703 : }
16704 : else {
16705 :
16706 : si = _4976_4221[cls4];
16707 :
16708 : cls4 += 9;
16709 : }
16710 : }
16711 : else {
16712 :
16713 : si = _4976_4226[cls4];
16714 : }
16715 :
16716 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x08, _4976_4218, dt07, cls4) != 0) {
16717 :
16718 : _0b36_0334(localpal, 0x08, _4976_4218, cls4, di);
16719 :
16720 : _0b36_037e(localpal, i8(_4976_5a88), colorkey1, colorkey2, di);
16721 : }
16722 : else {
16723 :
16724 : _0b36_037e(localpal, 64 -U8(((64 -si) * (64 - _4976_5a88)) >> 6), colorkey1, colorkey2, di);
16725 : }
16726 :
16727 : return;
16728 : }
16729 :
16730 :
16731 : U16 _32cb_09a7(skxxx4 *ref, U8 cls1, U8 cls2, U8 cls4, U16 dd, i16 width, i16 height, U16 mirrorflip, i16 colorkey1, U16 colorkey)
16732 : {
16733 :
16734 : ENTER(0);
16735 :
16736 : _32cb_08c1(mirrorflip, dd, width, 0, 0, height, -1, -1, colorkey1, -1, cls1, cls2, cls4);
16737 :
16738 : COPY_MEMORY(&_4976_5940, ref, 314);
16739 :
16740 : _0b36_018f(ref);
16741 :
16742 : ref->w48 = colorkey;
16743 :
16744 : SET_ORIGIN_RECT(&ref->rc36, width, height);
16745 :
16746 : U16 si;
16747 : ref->pb44 = _3e74_57b5(si = _3e74_5888(), width, height, 8);
16748 :
16749 : return si;
16750 : }
16751 :
16752 :
16753 : void _32cb_0aa6(U8 *xx, U16 *yy)
16754 : {
16755 :
16756 : ENTER(0);
16757 :
16758 : *yy = (_4976_5c6a - _4976_5aa0) & 3;
16759 :
16760 : U8 cl = (*yy == 0 || *yy == 2) ? 0x71 : 0x6d;
16761 :
16762 : U16 dx = 0;
16763 :
16764 : if (_4976_5c5e >= 0x80) {
16765 :
16766 : dx = 3;
16767 : }
16768 :
16769 : else if (_4976_5c5e >= 0x40) {
16770 :
16771 : dx = 2;
16772 : }
16773 :
16774 : else if (_4976_5c5e >= 0x10) {
16775 :
16776 : dx = 1;
16777 : }
16778 :
16779 : else if (_4976_5c5e > 0 && _4976_5c5e < 0x10) {
16780 :
16781 : dx = 0;
16782 : }
16783 :
16784 : *xx = cl & U8(dx);
16785 :
16786 : return;
16787 : }
16788 :
16789 :
16790 : U8 *_32cb_0649(U8 cls1, U8 cls2, U8 cls3, i16 colorkey)
16791 : {
16792 :
16793 : ENTER(6);
16794 :
16795 : U8 *bp04 = QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, cls3);
16796 :
16797 : i16 bp06;
16798 : if (bp04 == NULL) {
16799 :
16800 : if (_4976_5a88 == 63)
16801 :
16802 : return NULL;
16803 :
16804 : for (bp06 = 0; bp06 < 256; bp06++) {
16805 :
16806 : _4976_582a[bp06] = U8(bp06);
16807 :
16808 : }
16809 :
16810 : bp06 = 256;
16811 : }
16812 : else {
16813 :
16814 : COPY_MEMORY(bp04, _4976_582a, 16);
16815 :
16816 : bp06 = 16;
16817 : }
16818 :
16819 : return _0b36_037e(_4976_582a, U8(_4976_5a88), colorkey, -1, bp06);
16820 : }
16821 :
16822 :
16823 : void FIRE_UPDATE_BLIT_PALETTE(U8 *localpal)
16824 : {
16825 :
16826 : ENTER(0);
16827 :
16828 : U8 *di = _44c8_077d;
16829 :
16830 : U8 *si = localpal;
16831 :
16832 : memcpy(di, si, 16);
16833 :
16834 : return;
16835 : }
16836 :
16837 :
16838 : void FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(U16 offSrc, U16 offDst, U16 size)
16839 : {
16840 :
16841 : ENTER(0);
16842 :
16843 :
16844 : U8 *bx = _44c8_077d;
16845 :
16846 : U8 *di = &_4976_5e6a[offDst];
16847 :
16848 : U16 cx = size;
16849 :
16850 : U8 *si = _4976_5e64;
16851 :
16852 : bool carry = (offSrc & 1) ? true : false;
16853 : si += (offSrc >>= 1);
16854 :
16855 : if (carry) {
16856 :
16857 : U8 al = lodsb(si);
16858 : stosb(di, bx[al & 15]);
16859 : cx--;
16860 :
16861 : if (cx == 0) goto _080a;
16862 : }
16863 :
16864 : {
16865 :
16866 : bool carry = (cx & 1) ? true : false;
16867 : cx >>= 1;
16868 :
16869 : if (cx != 0) {
16870 :
16871 : bool carry = (cx & 1) ? true : false;
16872 : cx >>= 1;
16873 :
16874 : if (cx != 0) {
16875 :
16876 : U16 bp = 0x0f0f;
16877 : do {
16878 :
16879 : U16 ax = lodsw(si);
16880 : U16 dx = ax >> 4;
16881 : dx &= bp;
16882 : ax &= bp;
16883 :
16884 : stosb(di, bx[U8(ax >> 8)]);
16885 : stosb(di, bx[U8(dx >> 8)]);
16886 : stosb(di, bx[U8(ax )]);
16887 : stosb(di, bx[U8(dx )]);
16888 :
16889 : } while (--cx != 0);
16890 : }
16891 :
16892 : if (carry) {
16893 :
16894 : U8 al = lodsb(si);
16895 : stosb(di, bx[al >> 4 ]);
16896 : stosb(di, bx[al & 15]);
16897 : }
16898 : }
16899 :
16900 : if (carry) {
16901 :
16902 : U8 al = lodsb(si);
16903 : stosb(di, bx[al >> 4]);
16904 : }
16905 : }
16906 :
16907 : _080a:
16908 :
16909 : return;
16910 : }
16911 :
16912 :
16913 :
16914 :
16915 :
16916 :
16917 :
16918 :
16919 :
16920 :
16921 :
16922 :
16923 :
16924 :
16925 :
16926 :
16927 :
16928 :
16929 :
16930 :
16931 :
16932 :
16933 :
16934 :
16935 :
16936 :
16937 :
16938 :
16939 :
16940 :
16941 :
16942 :
16943 :
16944 :
16945 :
16946 :
16947 :
16948 :
16949 :
16950 :
16951 :
16952 :
16953 :
16954 :
16955 :
16956 :
16957 :
16958 :
16959 :
16960 :
16961 :
16962 :
16963 :
16964 :
16965 :
16966 :
16967 :
16968 :
16969 :
16970 :
16971 :
16972 :
16973 :
16974 :
16975 :
16976 :
16977 :
16978 :
16979 :
16980 :
16981 :
16982 :
16983 :
16984 :
16985 :
16986 :
16987 :
16988 :
16989 :
16990 :
16991 :
16992 :
16993 :
16994 :
16995 :
16996 :
16997 :
16998 :
16999 :
17000 :
17001 :
17002 :
17003 :
17004 :
17005 :
17006 :
17007 : U16 _44c8_1e1a(U8 *xx, U16 yy);
17008 :
17009 :
17010 : void _44c8_1e43(U8 *xx, U8 *yy, U8 *zz, SRECT *prc, U16 ss, U16 tt, U16 aa, U16 bb, U16 cc, U16 oo, i16 colorkey, U8 *localpal)
17011 : {
17012 :
17013 : ENTER(16);
17014 :
17015 : FIRE_UPDATE_BLIT_PALETTE(localpal);
17016 :
17017 : cc = (cc +1) & 0xfffe;
17018 :
17019 : i16 bp08 = prc->cx;
17020 : i16 bp06 = prc->cy;
17021 : i16 bp02 = (prc->y * oo) +prc->x;
17022 : i16 bp04 = (bb * cc) +aa;
17023 :
17024 : U16 di = tt;
17025 : U16 si = ss -tt;
17026 :
17027 : _4976_5e64 = xx;
17028 : _4976_5e6a = yy;
17029 :
17030 : if (zz == NULL) {
17031 :
17032 : for (U16 bp0a = 0; bp0a < bp06; bp02 += oo, bp0a++) {
17033 :
17034 : i16 bp0e = bp08;
17035 :
17036 : for (U16 bp0c = 0; bp0e >= si; bp0e -= si, bp0c += si, si = ss, di = 0) {
17037 :
17038 : if (colorkey < 0) {
17039 :
17040 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp02 +bp0c, si);
17041 :
17042 : continue;
17043 : }
17044 :
17045 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, si, U8(colorkey));
17046 :
17047 : }
17048 :
17049 : if (bp0e > 0) {
17050 :
17051 : if (colorkey < 0) {
17052 :
17053 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp0c +bp0c, bp0e);
17054 : }
17055 : else {
17056 :
17057 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, bp0e, U8(colorkey));
17058 : }
17059 :
17060 : si -= bp0e;
17061 : di += bp0e;
17062 : }
17063 :
17064 : if ((bp08 & 1) != 0) {
17065 :
17066 : if (--si != 0) {
17067 :
17068 : di++;
17069 : }
17070 : else {
17071 :
17072 : si = ss;
17073 : di = 0;
17074 : }
17075 : }
17076 :
17077 : }
17078 :
17079 : return;
17080 : }
17081 :
17082 : for (U16 bp0a = 0; bp0a < bp06; bp0a++) {
17083 :
17084 : for (U16 bp10 = bp08; bp10 > 0; ) {
17085 :
17086 : for (U16 bp0c = 0; bp10 > 0 && _44c8_1e1a(zz, bp04 +bp0c) == 0; ) {
17087 :
17088 : --bp10;
17089 : ++bp0c;
17090 : ++di;
17091 : --si;
17092 :
17093 : if (si == 0) {
17094 :
17095 : di = 0;
17096 : si = ss;
17097 : }
17098 :
17099 : }
17100 :
17101 : U16 bp0e;
17102 : for (bp0e = 0; bp10 > 0 && _44c8_1e1a(zz, bp04 +bp0c) != 0; ) {
17103 :
17104 : ++bp0e;
17105 : --bp10;
17106 :
17107 : }
17108 :
17109 : if (bp0e > 0) {
17110 :
17111 : while (bp0e >= si) {
17112 :
17113 : if (colorkey < 0) {
17114 :
17115 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp02 +bp0c, si);
17116 : }
17117 : else {
17118 :
17119 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, si, U8(colorkey));
17120 : }
17121 :
17122 : bp0e -= si;
17123 : bp0c += si;
17124 :
17125 : si = ss;
17126 : di = 0;
17127 :
17128 : }
17129 :
17130 : if (bp0e > 0) {
17131 :
17132 : if (colorkey < 0) {
17133 :
17134 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp02 +bp0c, bp0e);
17135 : }
17136 : else {
17137 :
17138 : FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, bp0e, U8(colorkey));
17139 : }
17140 :
17141 : si -= bp0e;
17142 : di += bp0e;
17143 : }
17144 : }
17145 :
17146 : if ((bp08 & 1) != 0) {
17147 :
17148 : if (--si != 0) {
17149 :
17150 : ++di;
17151 : }
17152 : else {
17153 :
17154 : si = ss;
17155 : di = 0;
17156 : }
17157 : }
17158 :
17159 : bp04 += cc;
17160 : bp02 += oo;
17161 :
17162 : }
17163 :
17164 : }
17165 :
17166 : return;
17167 : }
17168 :
17169 :
17170 : void _44c8_20a4(U8 *xx, U8 *yy, U8 *zz, SRECT *prc, U16 ss, U16 tt, U16 oo, i16 pp, U8 *localpal)
17171 : {
17172 :
17173 : ENTER(0);
17174 :
17175 : _44c8_1e43(xx, yy, zz, prc, ss, tt, 0, 0, prc->cx, oo, pp, localpal);
17176 :
17177 : return;
17178 : }
17179 :
17180 :
17181 : void _32cb_0c7d(skxxx4 *ref, U16 xx, U16 yy)
17182 : {
17183 :
17184 : ENTER(16);
17185 :
17186 : if (_4976_5c5e == 0) {
17187 :
17188 : _44c8_1d26(reinterpret_cast<U8 *>(_3e74_5817(xx)), ref->b58[yy]);
17189 :
17190 : return;
17191 : }
17192 :
17193 : U8 bp0b;
17194 : U16 bp0a;
17195 : _32cb_0aa6(&bp0b, &bp0a);
17196 :
17197 : i16 bp06;
17198 : i16 bp08;
17199 : QUERY_GDAT_IMAGE_METRICS(0x17, _4976_4218, bp0b, &bp06, &bp08);
17200 :
17201 : U16 di = _3e74_5888();
17202 :
17203 : _3e74_57b5(di, ref->rc36.cx, bp08, 4);
17204 :
17205 : U16 si = (ref->rc36.cx +1) & 0xfffe;
17206 :
17207 : U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x17, _4976_4218, bp0b);
17208 :
17209 : FIRE_BLIT_PICTURE(bp04, _3e74_5817(di), ALLOC_TEMP_ORIGIN_RECT(si, READ_I16(bp04,-2)),
17210 : 0, 0, READ_I16(bp04,-4), si, -1, (bp0a == 1) ? 1 : 0, 4, 4, NULL);
17211 :
17212 : bp04 = reinterpret_cast<U8 *>(_3e74_5817(di));
17213 :
17214 : U8 *bp10 = _32cb_0649(0x17, _4976_4218, bp0b, 0);
17215 :
17216 : bp10[0] = ref->b58[yy];
17217 :
17218 : si = READ_I16(bp04,-4) * READ_I16(bp04,-2);
17219 :
17220 : _44c8_20a4(bp04, reinterpret_cast<U8 *>(_3e74_5817(xx)), NULL, &ref->rc36,
17221 : si -(RAND() & 31) -16, RAND16(60), ref->w18, -1, bp10);
17222 :
17223 : _3e74_58a3(di);
17224 :
17225 : return;
17226 : }
17227 :
17228 :
17229 : Bit8u *QUERY_GDAT_ENTRY_DATA_BUFF(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4)
17230 : {
17231 :
17232 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, cls3, cls4);
17233 :
17234 : if (si == -1) {
17235 :
17236 : return NULL;
17237 : }
17238 :
17239 : if (_4976_5c98[si].Absent()) {
17240 :
17241 : if (IS_CLS1_CRITICAL_FOR_LOAD(cls1) == 0) {
17242 :
17243 :
17244 : return NULL;
17245 : }
17246 :
17247 : Bit16u bp02;
17248 : return _3e74_15a9(si, &bp02, 0);
17249 : }
17250 : else {
17251 :
17252 : return REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]);
17253 : }
17254 : }
17255 :
17256 :
17257 : U8 QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(U16 actuatorData)
17258 : {
17259 :
17260 : ENTER(0);
17261 :
17262 : return QUERY_CLS1_FROM_RECORD(GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(actuatorData));
17263 : }
17264 :
17265 : ObjectID _0cee_1513(U16 xx);
17266 :
17267 :
17268 : U16 IS_DISTINCTIVE_ITEM_ON_ACTUATOR(Actuator *ref, U16 disit, U16 onTile)
17269 : {
17270 :
17271 : ENTER(2);
17272 :
17273 : for (ObjectID si = GET_TILE_RECORD_LINK(ref->Xcoord(), ref->Ycoord()); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
17274 :
17275 : U16 bp02 = si.DBType();
17276 :
17277 : if (onTile != 0 && bp02 >= dbWeapon && bp02 <= dbMiscellaneous_item) {
17278 :
17279 : if (GET_DISTINCTIVE_ITEMTYPE(si) != disit)
17280 :
17281 : continue;
17282 :
17283 : return 1;
17284 : }
17285 :
17286 : if (bp02 == dbCreature) {
17287 :
17288 : for (ObjectID di = GET_ADDRESS_OF_RECORD4(si)->GetPossessionObject(); di != di.FFFE; di = GET_NEXT_RECORD_LINK(di)) {
17289 :
17290 : if (GET_DISTINCTIVE_ITEMTYPE(di) == disit)
17291 :
17292 :
17293 : return 1;
17294 :
17295 : }
17296 : }
17297 :
17298 : }
17299 :
17300 : return 0;
17301 : }
17302 :
17303 :
17304 : void _32cb_0e03(i16 xx, i16 yy, U8 *str)
17305 : {
17306 :
17307 : ENTER(24);
17308 :
17309 : if (QUERY_MBCS_PRESENCE(str) == 0) {
17310 :
17311 : for (U8 *bp04 = str; *bp04 != 0; bp04++) {
17312 :
17313 : if (*bp04 >= 'A' && *bp04 <= 'Z') {
17314 :
17315 : *bp04 = *bp04 -0x40;
17316 : }
17317 :
17318 : else if (*bp04 >= 0x7b) {
17319 :
17320 : *bp04 = *bp04 -0x60;
17321 : }
17322 :
17323 : }
17324 : }
17325 :
17326 : i16 bp06;
17327 : i16 bp08;
17328 : if (_3929_03dc(str, &bp06, &bp08) != 0) {
17329 :
17330 : U8 bp18[16];
17331 : COPY_MEMORY(_4976_4bda, bp18, 16);
17332 :
17333 : _0b36_037e(bp18, U8(_4976_5a88), -1, -1, 16);
17334 :
17335 : DRAW_STRONG_TEXT(_4976_4c16, -1, _4976_00f6, xx -(bp06 >> 1), yy, bp18[15], bp18[0]|0x4000, str);
17336 : }
17337 :
17338 : return;
17339 : }
17340 :
17341 :
17342 : U16 _48ae_05ae(i16 xx, U8 yy, U16 zz, U16 ss, U16 tt, i16 ww)
17343 : {
17344 :
17345 : ENTER(10);
17346 :
17347 : U8 bp03 = GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(xx);
17348 :
17349 : U8 bp04 = QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(xx);
17350 :
17351 : U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(bp04, bp03, dtWordValue, 0x02);
17352 :
17353 : U8 *bp08 = ALLOC_MEMORY(64, afDefault, 1024);
17354 :
17355 : U16 bp0a = zz * 3 +18;
17356 :
17357 : U16 bp02 = QUERY_GDAT_CREATURE_WORD_VALUE(yy, U8(bp0a * 3 +0xa2));
17358 :
17359 : if (true
17360 : && bp02 != 0
17361 : && _48ae_0281(yy, U8(bp0a), bp08, 0) != 0
17362 : && (bp08[xx >> 3] & (1 << (xx & 7))) != 0
17363 : ) {
17364 :
17365 : si = si * bp02 / 100;
17366 : }
17367 :
17368 : bp0a = zz * 3 +17;
17369 :
17370 : bp02 = QUERY_GDAT_CREATURE_WORD_VALUE(yy, zz *3 +0xa1);
17371 :
17372 : if (true
17373 : && bp02 != 0
17374 : && _48ae_0281(yy, U8(bp0a), bp08, 0) != 0
17375 : && (bp08[xx >> 3] & (1 << (xx & 7))) != 0
17376 : ) {
17377 :
17378 : si = si * bp02 / 100;
17379 : }
17380 :
17381 : DEALLOC_UPPER_MEMORY(64);
17382 :
17383 : if (ww < 0) {
17384 :
17385 : ww = GET_MAX_CHARGE(ObjectID(0, GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(xx), 0));
17386 : }
17387 :
17388 : si += QUERY_GDAT_ENTRY_DATA_INDEX(
17389 : QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(xx),
17390 : GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(xx),
17391 : dtWordValue,
17392 : 0x35
17393 : ) * ww;
17394 :
17395 : if (tt != 0) {
17396 :
17397 : U16 di = QUERY_GDAT_CREATURE_WORD_VALUE(yy, U8(zz * 3) +0xa0);
17398 :
17399 : if (di == 0)
17400 :
17401 : di = 10;
17402 :
17403 : di = si * di / 100;
17404 :
17405 : if (ss != 0) {
17406 :
17407 : si += di;
17408 : }
17409 : else {
17410 :
17411 : si -= di;
17412 : }
17413 : }
17414 :
17415 : return si;
17416 : }
17417 :
17418 :
17419 : U16 _48ae_0767(i16 xx, i16 yy, U8 *zz, i16 *vv, i16 ww)
17420 : {
17421 :
17422 : ENTER(0);
17423 :
17424 : i16 si = 0;
17425 :
17426 : i16 dx = _4976_4c76 -1;
17427 : U16 cx = 0;
17428 :
17429 : *vv = 0;
17430 :
17431 : i16 di;
17432 : while (si < yy && xx > 0 && dx >= 0 && (di = _4976_4c80[dx]) > 0) {
17433 :
17434 : if (xx >= di) {
17435 :
17436 : *zz = U8(dx);
17437 :
17438 : si++;
17439 :
17440 : xx -= di;
17441 :
17442 : cx += di;
17443 :
17444 : *vv++;
17445 : }
17446 : else {
17447 :
17448 : dx--;
17449 : }
17450 :
17451 : }
17452 :
17453 : return cx;
17454 : }
17455 :
17456 :
17457 : void _32cb_0f82(Actuator *ref, U8 aa, i16 bb, i16 cc, U16 dd, U16 ee, U16 ff, U16 gg, U16 hh)
17458 : {
17459 :
17460 : ENTER(58);
17461 :
17462 : Actuator *bp0c = NULL;
17463 :
17464 : U16 bp26;
17465 : for (ObjectID di = GET_TILE_RECORD_LINK(ref->Xcoord(), ref->Ycoord()); di != di.FFFE && (bp26 = di.DBType()) <= dbActuator; di = GET_NEXT_RECORD_LINK(di)) {
17466 :
17467 : if (bp26 == dbActuator) {
17468 :
17469 : bp0c = GET_ADDRESS_OF_RECORD3(di);
17470 :
17471 : if (bp0c->ActuatorType() == 0x30)
17472 :
17473 : break;
17474 : }
17475 :
17476 : }
17477 :
17478 : i16 si = bp0c->ActuatorData();
17479 : U16 bp24 = si;
17480 :
17481 : U8 bp11 = U8(ref->ActuatorData());
17482 :
17483 : if (ref->w4_0_0() == 0 || ref->OnceOnlyActuator() != 0) {
17484 :
17485 : U16 bp14 = (ref->Delay() * 3) +16;
17486 :
17487 : U8 *bp04 = ALLOC_MEMORY(64, afDefault, 1024);
17488 :
17489 : if (_48ae_0281(bp11, U8(bp14), bp04, 0) != 0) {
17490 :
17491 : U16 *bp10 = reinterpret_cast<U16 *>(QUERY_GDAT_ENTRY_DATA_BUFF(0x09, aa, dt08, 0x13));
17492 :
17493 : i16 bp28;
17494 : if (bp10 != NULL) {
17495 :
17496 : bp28 = QUERY_GDAT_ENTRY_DATA_LENGTH(0x09, aa, dt08, 0x13) >> 1;
17497 :
17498 : for (si = 0; si < bp28; si++) {
17499 :
17500 : if ((bp10[si] & 511) == bp24)
17501 :
17502 : break;
17503 : }
17504 : }
17505 : do {
17506 :
17507 : si += (ref->OnceOnlyActuator() != 0 || _4976_5a96 < 0) ? 1 : -1;
17508 :
17509 : if (bp10 != NULL) {
17510 :
17511 : if (si < 0) {
17512 :
17513 : si = bp28 -1;
17514 : }
17515 :
17516 : else if (si >= bp28) {
17517 :
17518 : si = 0;
17519 : }
17520 :
17521 : bp24 = bp10[si] & 511;
17522 : }
17523 : else {
17524 :
17525 : si &= 511;
17526 : bp24 = si;
17527 : }
17528 :
17529 :
17530 : } while (false
17531 : || (bp04[bp24 >> 3] & (1 << (bp24 & 7))) == 0
17532 : || (true
17533 : && (QUERY_GDAT_ENTRY_DATA_INDEX(QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(bp24), GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(bp24), dtWordValue, 0) & 0x1000) != 0
17534 : && IS_DISTINCTIVE_ITEM_ON_ACTUATOR(ref, bp24, 1) == 0
17535 : && IS_DISTINCTIVE_ITEM_ON_ACTUATOR(bp0c, bp24, 0) == 0
17536 : && _2fcf_16ff(bp24) == 0
17537 : )
17538 : );
17539 :
17540 : ref->OnceOnlyActuator(0);
17541 : }
17542 :
17543 : ref->w4_0_0(1);
17544 :
17545 : bp0c->w4_0_0(1);
17546 :
17547 : bp0c->ActuatorData(bp24);
17548 :
17549 : DEALLOC_UPPER_MEMORY(64);
17550 : }
17551 :
17552 : U16 bp18 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, aa, dtImageOffset, 0xfd);
17553 :
17554 : _32cb_08c1(0, dd, ee, i8(bp18 >> 8), i8(bp18), bb, ff, gg, hh, -1, QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(bp24),
17555 : GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(bp24), 0x00);
17556 :
17557 : _32cb_0997();
17558 :
17559 : if (true
17560 : && IS_DISTINCTIVE_ITEM_ON_ACTUATOR(ref, bp24, 1) == 0
17561 : && IS_DISTINCTIVE_ITEM_ON_ACTUATOR(bp0c, bp24, 0) == 0
17562 : ) {
17563 :
17564 : U16 *bp10 = reinterpret_cast<U16 *>(QUERY_GDAT_ENTRY_DATA_BUFF(0x09, aa, dt08, 0x13));
17565 :
17566 : if (bp10 != NULL) {
17567 :
17568 : i16 bp28 = QUERY_GDAT_ENTRY_DATA_LENGTH(0x09, aa, dt08, 0x13) >> 1;
17569 :
17570 : for (si = 0; si < bp28; si++) {
17571 :
17572 : if ((bp10[si] & 511) == bp24)
17573 :
17574 : break;
17575 : }
17576 :
17577 : ObjectID di;
17578 : if ((bp10[si] & 0x8000) != 0 && (di = _0cee_1513(bp24)) != ObjectID::FFFF) {
17579 :
17580 : APPEND_RECORD_TO(di, NULL, ref->Xcoord(), ref->Ycoord());
17581 : }
17582 : }
17583 : else {
17584 :
17585 : _32cb_08c1(0, dd, ee, i8(bp18 >> 8), i8(bp18), bb, ff, gg, hh, -1, 9, aa, 0x11);
17586 :
17587 : _32cb_0997();
17588 : }
17589 : }
17590 :
17591 : _32cb_08c1(0, dd, ee, 0, 0, bb, ff, gg, hh, -1, 9, aa, 0x0f);
17592 :
17593 : _32cb_0997();
17594 :
17595 : if (cc == 3) {
17596 :
17597 : i16 bp2a;
17598 : i16 bp2c;
17599 : QUERY_TOPLEFT_OF_RECT(ff, &bp2a, &bp2c);
17600 :
17601 : U16 bp18 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, aa, dtImageOffset, 0xf2);
17602 :
17603 : bp2a += i8(bp18 >> 8);
17604 : bp2c += i8(bp18);
17605 :
17606 : _32cb_0e03(bp2a, bp2c, _2405_0029(QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(bp24), GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(bp24)));
17607 : }
17608 :
17609 : if (cc == 3) {
17610 :
17611 : U16 bp22 = _48ae_05ae(bp24, bp11, ref->ShopItemPoolNo(), 1, 1, -1);
17612 :
17613 : U16 bp20 = _48ae_05ae(bp24, bp11, ref->ShopItemPoolNo(), 0, 1, -1);
17614 :
17615 : for (i16 bp16 = 0; bp16 < 2; bp16++) {
17616 :
17617 : U16 bp18 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, aa, dtImageOffset, (bp16 != 0) ? 0xf0 : 0xf1);
17618 :
17619 : i16 bp2a = i8(bp18 >> 8);
17620 : i16 bp2c = i8(bp18);
17621 :
17622 : U16 bp1a = (bp16 != 0) ? bp22 : bp20;
17623 :
17624 : if (bp1a <= 0)
17625 :
17626 : continue;
17627 :
17628 : U8 bp3a[16];
17629 : i16 bp1e;
17630 : _48ae_0767(bp1a, 6, bp3a, &bp1e, bp16);
17631 :
17632 : if (bp1e <= 0)
17633 :
17634 : continue;
17635 :
17636 : U16 bp1c = _3e74_5888();
17637 :
17638 : _3e74_57b5(bp1c, bp1e >> 3, 7, 4);
17639 :
17640 : _32cb_08c1(0, 64, 64, 0, 0, bb, -1, gg, -1, -1, 0x09, aa, 0x10);
17641 :
17642 : U8 *bp08 = reinterpret_cast<U8 *>(_3e74_5817(bp1c));
17643 :
17644 : SRECT bp34;
17645 : SET_ORIGIN_RECT(&bp34, 8, 7);
17646 :
17647 : for (si = 0; si < bp1e; si++) {
17648 :
17649 : DRAW_DIALOGUE_PICT(_4976_5940.pb0, bp08, &bp34, bp3a[si] << 3, 0, -1, NULL);
17650 :
17651 : bp34.x += 8;
17652 :
17653 : }
17654 :
17655 : DRAW_DIALOGUE_PICT(bp08, _4976_4c16, QUERY_BLIT_RECT(bp08, &bp34, ff|0x8000, &bp2a, &bp2c, gg),
17656 : 0, 0, hh, _4976_597a);
17657 :
17658 : }
17659 : }
17660 :
17661 : return;
17662 : }
17663 :
17664 : void _32cb_3f0d(U16 xx);
17665 :
17666 :
17667 : i16 _32cb_15b8(i16 xx, i16 yy, i16 zz)
17668 : {
17669 :
17670 : ENTER(854);
17671 :
17672 : i16 bp14 = (yy <= -1)
17673 : ? 4
17674 : : ((yy >= 1)
17675 : ? 6
17676 : : 5
17677 : );
17678 :
17679 : bp14 = _4976_5a80[xx].x2.w[bp14];
17680 :
17681 : i16 bp28 = bp14 >> 8;
17682 :
17683 : i16 di = _4976_412d[xx];
17684 :
17685 : U8 bp1f = U8(bp14) & 0xff;
17686 :
17687 : if (bp1f == 0xff)
17688 :
17689 : return -1;
17690 :
17691 : U16 bp2a = (bp1f == 0) ? 1 : 0;
17692 :
17693 : U16 bp22 = IS_WALL_ORNATE_ALCOVE(bp1f);
17694 :
17695 : U16 bp24;
17696 : if (bp2a == 0) {
17697 :
17698 : bp24 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x07);
17699 : }
17700 :
17701 : U16 bp0e = 0;
17702 :
17703 : U16 si;
17704 : if (bp2a != 0 || (si = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x04)) == 0)
17705 :
17706 : si = _4976_4216;
17707 :
17708 : U16 bp1a;
17709 : U16 bp1e;
17710 : if (bp2a != 0 || (bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x05)) == 0) {
17711 :
17712 : bp1a = 12;
17713 : bp1e = 0;
17714 : }
17715 : else {
17716 :
17717 : bp1e = bp1a >> 8;
17718 : bp1a = (bp1a & 255) -1;
17719 : }
17720 :
17721 : U16 bp1c = _098d_0cd7(xx, bp1a, (yy != 0) ? 1 : 0);
17722 :
17723 : U16 bp18;
17724 : U16 bp16;
17725 : bp18 = bp16 = _4976_4189[di];
17726 :
17727 : if (bp22 == 3 && yy == 0) {
17728 :
17729 : U16 bp34 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtImageOffset, 0xfd);
17730 :
17731 : _32cb_08c1(bp0e, bp16, bp18, i8(bp34 >> 8), i8(bp34), di, bp1c, bp1e, -1, -1, 0x16, U8(_4976_5a80[xx].x2.w14()), 1);
17732 :
17733 : if (zz == 0)
17734 :
17735 : _4976_5940.w48 = -2;
17736 :
17737 : _32cb_0997();
17738 :
17739 : if (zz == 0)
17740 :
17741 :
17742 : return si;
17743 :
17744 : if (di == 1) {
17745 :
17746 : _32cb_0a4c(&_4976_5940.rc36, 6, U8(xx));
17747 : }
17748 : }
17749 :
17750 : if (di == 2 && (yy <= -2 || yy >= 2))
17751 :
17752 : bp16 = 0x72;
17753 :
17754 : else if (di == 3 && (yy <= -2 || yy >= 2))
17755 :
17756 : bp16 = 0x4c;
17757 :
17758 : if (bp2a != 0) {
17759 :
17760 : U8 bp20;
17761 : if (yy != 0 && yy > -1) {
17762 :
17763 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x08, _4976_4218, dtImage, 0xfe) != 0) {
17764 :
17765 : bp20 = 0xfe;
17766 : }
17767 : else {
17768 :
17769 : bp20 = 0xfd;
17770 : bp0e = 1;
17771 : }
17772 : }
17773 :
17774 : _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, si, -1, 8, _4976_4218, bp20);
17775 :
17776 : if (zz == 0)
17777 :
17778 : _4976_5940.w48 = -2;
17779 :
17780 : _32cb_0997();
17781 :
17782 : if (yy != 0)
17783 :
17784 :
17785 : return si;
17786 :
17787 : ObjectID bp32 = _4976_5a80[xx].x2.w14();
17788 :
17789 : if (bp32 == bp32.FFFF)
17790 :
17791 :
17792 : return si;
17793 :
17794 : skxxx4 bp01d6;
17795 : _0b36_0520(&bp01d6, 0x08, _4976_4218, bp20);
17796 :
17797 : i16 bp2c = bp01d6.w28;
17798 : i16 bp2e = bp01d6.w30;
17799 :
17800 : i16 bp48;
17801 : i16 bp4a;
17802 : QUERY_GDAT_IMAGE_METRICS(8, _4976_4218, bp20, &bp48, &bp4a);
17803 :
17804 : U16 bp26 = _3e74_5888();
17805 :
17806 : U8 bp009c[80];
17807 : _0cee_159b(bp009c, bp32, 2);
17808 :
17809 : U16 bp36 = 0;
17810 : U16 bp38 = 1;
17811 :
17812 : U8 bp45;
17813 : while ((bp45 = bp009c[bp36++]) != 0) {
17814 :
17815 : if (bp45 == vbLf)
17816 :
17817 : bp38++;
17818 : }
17819 :
17820 : U16 bp4c = QUERY_MBCS_PRESENCE(bp009c);
17821 :
17822 : U16 bp3a;
17823 : U16 bp3c;
17824 : if (bp4c != 0) {
17825 :
17826 : bp3a = _4976_012e;
17827 : bp3c = _4976_0130 +2;
17828 : si = 0;
17829 : }
17830 : else {
17831 :
17832 : bp3a = _4976_012a;
17833 : bp3c = _4976_012c +2;
17834 : }
17835 :
17836 : U8 *bp08 = _3e74_57b5(bp26, bp28, bp4a, 4);
17837 :
17838 : _44c8_1d26(bp08, si);
17839 :
17840 : SRECT rc44;
17841 : rc44.y = (bp4a >> 1) - (bp3c * bp38 >> 1);
17842 :
17843 : if (bp4c != 0) {
17844 :
17845 : for (U16 bp36 = 0; bp009c[bp36] != 0; ) {
17846 :
17847 : if (bp4a - (_4976_0130 + _4976_0136 +1) <= rc44.y)
17848 :
17849 : break;
17850 :
17851 : U8 bp0356[384];
17852 : i16 bp30 = _3929_04e2(bp009c, bp0356, &bp36, bp48 -1);
17853 :
17854 : if (bp30 != 0) {
17855 :
17856 : rc44.x = (bp48 >> 1) - (bp30 >> 1);
17857 :
17858 : if (rc44.y >= 0 && rc44.x >= 0 && bp30 <= bp48) {
17859 :
17860 : DRAW_STRING(bp08, bp26, bp48, rc44.x , rc44.y + _4976_0130 +1, 1, 0x4000, bp0356, 4);
17861 :
17862 : DRAW_STRING(bp08, bp26, bp48, rc44.x +1, rc44.y + _4976_0130 +1, 1, 0x4000, bp0356, 4);
17863 :
17864 : DRAW_STRING(bp08, bp26, bp48, rc44.x , rc44.y + _4976_0130 , 2, 0x4000, bp0356, 4);
17865 : }
17866 : }
17867 :
17868 : if (bp009c[bp36] == vbLf)
17869 :
17870 : bp36++;
17871 :
17872 : rc44.y += bp3c;
17873 :
17874 : }
17875 : }
17876 : else {
17877 :
17878 : U8 *bp0c = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x08, _4976_4218, 0x03);
17879 :
17880 : rc44.cx = bp3c;
17881 :
17882 : rc44.cy = READ_I16(bp0c,-2);
17883 :
17884 : U8 *bp08 = reinterpret_cast<U8 *>(_3e74_5817(bp26));
17885 :
17886 : U8 *bp04 = bp009c;
17887 :
17888 : do {
17889 :
17890 : U16 bp36 = 0;
17891 :
17892 : while (bp04[bp36] != 0 && bp04[bp36] != vbLf)
17893 :
17894 : bp36++;
17895 :
17896 : i16 bp30 = bp3a * bp36;
17897 :
17898 : if (bp36 != 0) {
17899 :
17900 : rc44.x = (bp48 >> 1) - (bp30 >> 1);
17901 :
17902 : if (rc44.x < 0) {
17903 :
17904 : bp04 += bp36;
17905 : }
17906 : else {
17907 :
17908 : while (bp36-- != 0) {
17909 :
17910 : DRAW_DIALOGUE_PICT(
17911 : bp0c,
17912 : bp08,
17913 : reinterpret_cast<blit_rc *>(&rc44),
17914 : _32cb_158f(*(bp04++)),
17915 : 0,
17916 : si,
17917 : QUERY_GDAT_IMAGE_LOCALPAL(0x08, _4976_4218, 0x03)
17918 : );
17919 :
17920 : rc44.x += bp3a;
17921 :
17922 : }
17923 : }
17924 : }
17925 :
17926 : rc44.y += bp3c;
17927 :
17928 : } while (*(bp04++) != 0);
17929 : }
17930 :
17931 : _0b36_0520(&bp01d6, 0xff, 0x00, 0x00);
17932 :
17933 : bp01d6.w12 = bp26;
17934 : bp01d6.w6 = 0xffff;
17935 : bp01d6.w52 = bp16;
17936 : bp01d6.w54 = bp18;
17937 :
17938 : if (bp4c != 0) {
17939 :
17940 : bp01d6.b58[1] = _4976_4bda[0];
17941 : bp01d6.b58[2] = _4976_4bda[5];
17942 : }
17943 : else {
17944 :
17945 : COPY_MEMORY(
17946 : QUERY_GDAT_IMAGE_LOCALPAL(0x08, _4976_4218, 3),
17947 : bp01d6.b58,
17948 : 16
17949 : );
17950 : }
17951 :
17952 : bp01d6.w56 = 16;
17953 :
17954 : _32cb_0804(bp01d6.b58, U8(di), si, -1, bp01d6.w56);
17955 :
17956 : bp01d6.pb44 = _4976_4c16;
17957 :
17958 : bp01d6.w24 = bp1c;
17959 : bp01d6.w26 = bp1e;
17960 : bp01d6.w28 = bp2c;
17961 : bp01d6.w30 = bp2e;
17962 : bp01d6.w48 = si;
17963 :
17964 : _0b36_0a3f(_0b36_06d3(&bp01d6));
17965 :
17966 : _3e74_58a3(bp26);
17967 :
17968 :
17969 : return si;
17970 : }
17971 :
17972 : U8 bp20;
17973 : if (yy == 0) {
17974 :
17975 : bp20 = 1;
17976 :
17977 : if (bp24 == 0) {
17978 :
17979 : if ((_4976_412d[xx] & 1) != 0) {
17980 :
17981 : bp0e = _4976_5a92;
17982 : }
17983 : else {
17984 :
17985 : bp0e = _4976_5a92 ^ 1;
17986 : }
17987 : }
17988 : }
17989 : else {
17990 :
17991 : bp20 = 0;
17992 :
17993 : if (yy >= 1) {
17994 :
17995 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x09, bp1f, dtImage, U8(bp28) +2) != 0) {
17996 :
17997 : bp20 = 2;
17998 : }
17999 : else {
18000 :
18001 : bp0e = 1;
18002 : }
18003 : }
18004 : }
18005 :
18006 : bp20 = bp20 +U8(bp28);
18007 :
18008 : SRECT *bp12;
18009 : if (yy == 0 && QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x63) != 0) {
18010 :
18011 : _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, -3, -3, 9, bp1f, bp20);
18012 :
18013 : _32cb_08c1(bp0e, bp16, bp18, _4976_595c, _4976_595e, di, bp1c, bp1e, si, -1, 9, bp1f, 200);
18014 :
18015 : if (zz == 0)
18016 :
18017 : _4976_5940.w48 = -1;
18018 :
18019 : _32cb_0997();
18020 :
18021 : skxxx4 bp0310;
18022 : U16 bp26 = _32cb_09a7(
18023 : &bp0310, 9, bp1f, bp20, bp16, bp18, di, bp0e, si,
18024 : QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x11)
18025 : );
18026 :
18027 : _32cb_0c7d(&bp0310, bp26, si);
18028 :
18029 : bp0310.pb44 = reinterpret_cast<U8 *>(_3e74_5817(bp26));
18030 :
18031 : _0b36_0a3f(&bp0310);
18032 :
18033 : _0b36_01cd(&bp0310);
18034 :
18035 : bp0310.w48 = bp0310.b58[si];
18036 : bp0310.pb44 = _4976_4c16;
18037 : bp0310.w24 = bp1c;
18038 : bp0310.w26 = bp1e;
18039 : bp0310.w56 = 0;
18040 :
18041 : _0b36_00c3(bp26, &bp0310);
18042 :
18043 : _0b36_0a3f(&bp0310);
18044 :
18045 : SRECT *bp12 = &bp0310.rc36;
18046 :
18047 : _3e74_58a3(bp26);
18048 : }
18049 : else {
18050 :
18051 : _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, si, -1, 9, bp1f, bp20);
18052 :
18053 : if (zz == 0)
18054 :
18055 : _4976_5940.w48 = -2;
18056 :
18057 : _32cb_0997();
18058 :
18059 : bp12 = &_4976_5940.rc36;
18060 :
18061 : if (zz == 0)
18062 :
18063 :
18064 : return si;
18065 : }
18066 :
18067 : if (bp22 != 3 && (xx == 1 || xx == 2 || xx == 3)) {
18068 :
18069 : _32cb_0a4c(bp12, 6, U8(xx));
18070 : }
18071 :
18072 : if (bp22 == 0 || yy != 0)
18073 :
18074 :
18075 : return si;
18076 :
18077 : COPY_MEMORY(&_4976_5940, &_4976_5aa8, 314);
18078 :
18079 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x09, bp1f, dtImage, 0x0f) != 0) {
18080 :
18081 : if (bp22 == 2) {
18082 :
18083 : _32cb_0f82(
18084 : GET_ADDRESS_OF_RECORD3(_4976_5a80[xx].x2.w14()),
18085 : bp1f, di, xx, bp16, bp18, bp1c, bp1e, si
18086 : );
18087 :
18088 :
18089 : return si;
18090 : }
18091 :
18092 : _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, si, -1, 9, bp1f, 15);
18093 :
18094 : if (zz == 0)
18095 :
18096 : _4976_5940.w48 = -2;
18097 :
18098 : _32cb_0997();
18099 :
18100 :
18101 : return si;
18102 : }
18103 :
18104 : if (bp22 == 1)
18105 : _32cb_3f0d(xx);
18106 :
18107 : return si;
18108 : }
18109 :
18110 :
18111 : i16 _0b36_1446(skxxx5 *ref, i16 xx, i16 yy, U16 colorkey)
18112 : {
18113 :
18114 : ENTER(20);
18115 :
18116 : U8 *bp04 = QUERY_PICT_BITS(ref);
18117 :
18118 : if (bp04 == NULL)
18119 :
18120 : return -1;
18121 :
18122 : U16 si = ref->w22;
18123 :
18124 : U16 bp0e = _3e74_5888();
18125 :
18126 : _3e74_57b5(bp0e, (si == 4) ? 2 : 1, 1, si);
18127 :
18128 : U16 bp10 = _3e74_5888();
18129 :
18130 : U8 *bp0c = _3e74_57b5(bp10, (si == 4) ? 2 : 1, 1, si);
18131 :
18132 : U8 *bp08 = reinterpret_cast<U8 *>(_3e74_5817(bp0e));
18133 :
18134 : _44c8_1d26(bp08, colorkey);
18135 :
18136 : _44c8_1d26(bp0c, colorkey);
18137 :
18138 : FIRE_BLIT_PICTURE(bp04 = QUERY_PICT_BITS(ref), bp08, ALLOC_TEMP_ORIGIN_RECT(1, 1), xx, yy,
18139 : READ_I16(bp04,-4), (si == 4) ? 2 : 1, colorkey, 0, si, si, NULL);
18140 :
18141 : U16 bp14 = 1;
18142 :
18143 : U16 bp12 = CALC_IMAGE_BYTE_LENGTH(bp08);
18144 :
18145 : for (U16 di = 0; di < bp12; di++) {
18146 :
18147 : if (*(bp08++) != *(bp0c++)) {
18148 :
18149 : bp14 = 0;
18150 :
18151 : break;
18152 : }
18153 :
18154 : }
18155 :
18156 : _3e74_58a3(bp0e);
18157 :
18158 : _3e74_58a3(bp10);
18159 :
18160 : return bp14;
18161 : }
18162 :
18163 :
18164 : U16 _32cb_00f1(U16 xx, U16 yy, i16 zz)
18165 : {
18166 :
18167 : ENTER(10);
18168 :
18169 : U16 si = xx;
18170 : U16 di = yy;
18171 :
18172 : if (PT_IN_RECT(&_4976_5940.rc36, si, di) == 0) {
18173 :
18174 : return 0;
18175 : }
18176 :
18177 : if ((_4976_5940.w50 & 1) != 0) {
18178 :
18179 : si = _4976_5940.rc36.x + _4976_5940.rc36.cx -1 -si + _4976_5940.w32;
18180 : }
18181 : else {
18182 :
18183 : si = si - _4976_5940.rc36.x + _4976_5940.w32;
18184 : }
18185 :
18186 : di = di - _4976_5940.rc36.y + _4976_5940.w34;
18187 :
18188 : U8 *bp0a = QUERY_PICT_BITS(&_4976_5940);
18189 :
18190 : U16 bp04 = READ_I16(bp0a,-4) >> 1;
18191 :
18192 : _4976_5a94 = ((si - _4976_5940.w14 -bp04) * 100) / bp04;
18193 :
18194 : U16 bp06 = READ_I16(bp0a,-2) >> 1;
18195 :
18196 : _4976_5a96 = ((di -bp06) * 100) / bp06;
18197 :
18198 : i16 bp02 = _0b36_1446(&_4976_5940, si, di, zz);
18199 :
18200 : if (bp02 == -1 || bp02 == 1)
18201 :
18202 :
18203 : return 0;
18204 :
18205 : return 1;
18206 : }
18207 :
18208 :
18209 : U16 _32cb_0287(U16 xx, U16 yy, U16 zz)
18210 : {
18211 :
18212 : ENTER(10);
18213 :
18214 : i16 si = xx;
18215 :
18216 : U16 di = 0;
18217 :
18218 : if (si > 3)
18219 :
18220 : return 0;
18221 :
18222 : sk5a80 *bp0a = _4976_5a80;
18223 :
18224 : _4976_5a80 = reinterpret_cast<sk5a80 *>(ALLOC_MEMORY(72, afDefault, 1024));
18225 :
18226 : i16 bp04 = _4976_5a9c;
18227 : i16 bp06 = _4976_5a9e;
18228 :
18229 : _0cee_02dd(_4976_5aa0, _4976_40e8[si][1], _4976_40e8[si][0], &bp04, &bp06);
18230 :
18231 : _4976_5a80[si].b0 = U8(bp04);
18232 :
18233 : _4976_5a80[si].b1 = U8(bp06);
18234 :
18235 : _0cee_1dbe(&_4976_5a80[si].x2, _4976_5aa0, bp04, bp06);
18236 :
18237 : i16 bp02 = _32cb_15b8(si, _4976_4116[si], 0);
18238 :
18239 : if (bp02 >= 0) {
18240 :
18241 : di = _32cb_00f1(yy, zz, bp02);
18242 : }
18243 :
18244 : DEALLOC_UPPER_MEMORY(72);
18245 :
18246 : _4976_5a80 = bp0a;
18247 :
18248 : return (si == 3 || _4976_5940.w18 < 32 || _4976_5940.w20 < 32) ? 1 : di;
18249 : }
18250 :
18251 :
18252 : void _121e_0003(U16 xx)
18253 : {
18254 :
18255 : ENTER(2);
18256 :
18257 : U16 bp02 = 1;
18258 :
18259 : i16 di = _4976_4bfa;
18260 : i16 si = _4976_4c06;
18261 :
18262 : switch (xx) {
18263 : case 1:
18264 :
18265 : di += _4976_0232[(_4976_4bf6 +3) & 3];
18266 : si += _4976_023a[(_4976_4bf6 +3) & 3];
18267 :
18268 : break;
18269 :
18270 : case 3:
18271 :
18272 : di += _4976_0232[_4976_4bf6];
18273 : si += _4976_023a[_4976_4bf6];
18274 :
18275 : bp02 = 2;
18276 :
18277 : break;
18278 :
18279 : case 2:
18280 :
18281 : di += _4976_0232[(_4976_4bf6 +1) & 3];
18282 : si += _4976_023a[(_4976_4bf6 +1) & 3];
18283 :
18284 : bp02 = 3;
18285 :
18286 : break;
18287 : }
18288 :
18289 : if (di >= 0 && di < _4976_4dd2 && si >= 0 && si < _4976_4dd4) {
18290 :
18291 : MOVE_RECORD_AT_WALL(di, si, (_4976_4bf6 +bp02) & 3, ObjectID::FFFF, _4976_57c8.w0);
18292 : }
18293 :
18294 : return;
18295 : }
18296 :
18297 :
18298 : U16 _32cb_35c1(i16 *xx, i16 *yy, i16 zz, i16 ww)
18299 : {
18300 :
18301 : ENTER(2);
18302 :
18303 : U16 cx = zz;
18304 : i16 di = *xx;
18305 : i16 si = *yy;
18306 :
18307 : if (ww != 0) {
18308 :
18309 : if ((si -= ww * 5) < 0) {
18310 :
18311 : si += 20;
18312 :
18313 :
18314 : di = _4976_408c[di][2];
18315 : }
18316 :
18317 : else if (si > 24) {
18318 :
18319 : si -= 20;
18320 :
18321 : di = _4976_408c[di][3];
18322 : }
18323 :
18324 : if (di < 0)
18325 :
18326 : return 0;
18327 : }
18328 :
18329 : if (cx != 0) {
18330 :
18331 : i16 bp02 = (si % 5) + cx;
18332 :
18333 : if (bp02 > 4) {
18334 :
18335 : si += cx -4;
18336 :
18337 : di = _4976_408c[di][1];
18338 : }
18339 :
18340 : else if (bp02 < 0) {
18341 :
18342 : si += cx +4;
18343 :
18344 : di = _4976_408c[di][0];
18345 : }
18346 : else {
18347 :
18348 : si += cx;
18349 : }
18350 :
18351 : if (di < 0)
18352 :
18353 :
18354 : return 0;
18355 : }
18356 :
18357 : *xx = di;
18358 : *yy = si;
18359 :
18360 : return 1;
18361 : }
18362 :
18363 :
18364 : i16 _098d_0c50(i16 _5x5, U16 dir)
18365 : {
18366 :
18367 : ENTER(0);
18368 :
18369 : i16 di = (_5x5 % 5) -2;
18370 :
18371 : i16 si = (_5x5 / 5) -2;
18372 :
18373 : i16 cx;
18374 : switch (dir) {
18375 : case 2:
18376 :
18377 : di = -di;
18378 :
18379 :
18380 : si = -si;
18381 :
18382 : break;
18383 :
18384 : case 3:
18385 :
18386 : cx = di;
18387 :
18388 : di = -si;
18389 :
18390 : si = cx;
18391 :
18392 : break;
18393 :
18394 : case 1:
18395 :
18396 : cx = di;
18397 :
18398 : di = si;
18399 :
18400 :
18401 : si = -cx;
18402 :
18403 : }
18404 :
18405 : return di +((si +2) * 5) +2;
18406 : }
18407 :
18408 :
18409 : i16 _48ae_07fd(ObjectID rl, U16 xx)
18410 : {
18411 :
18412 : ENTER(4);
18413 :
18414 : ObjectID di = rl;
18415 :
18416 : U16 si = 12;
18417 :
18418 : switch (di.DBType()) {
18419 : case dbCreature:
18420 : {
18421 :
18422 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(di);
18423 :
18424 : return _32cb_0054(bp04, (xx -bp04->b15_0_2()) & 3);
18425 : }
18426 : case dbCloud:
18427 : {
18428 :
18429 : if (GET_ADDRESS_OF_RECORDF(di)->b2_7_7() != 0)
18430 :
18431 : break;
18432 :
18433 : si = _4976_4a04[di.Dir()];
18434 :
18435 : break;
18436 : }
18437 :
18438 : case dbWeapon:
18439 : case dbCloth:
18440 : case dbScroll:
18441 : case dbPotion:
18442 : case dbContainer:
18443 : case dbMiscellaneous_item:
18444 : case dbMissile:
18445 : {
18446 :
18447 : si = _4976_4a04[di.Dir()];
18448 :
18449 : break;
18450 : }
18451 :
18452 : case db11:
18453 : case db12:
18454 : case db13:
18455 :
18456 : break;
18457 : }
18458 :
18459 : return _098d_0c50(si, xx);
18460 : }
18461 :
18462 :
18463 : i16 _098d_0cb7(U16 xx, i16 _5x5, U16 dir)
18464 : {
18465 :
18466 : ENTER(0);
18467 :
18468 : return _098d_0c50(_5x5, dir) +(xx * 25) +5000;
18469 : }
18470 :
18471 :
18472 : void _32cb_3672(ObjectID rl, i16 xx, U16 yy, U16 zz, i16 vv, Creature *ref, U16 ww, U16 ss, U16 tt)
18473 : {
18474 :
18475 : ENTER(34);
18476 :
18477 : U16 si = zz;
18478 :
18479 : i16 bp18;
18480 : if (ref != NULL) {
18481 :
18482 : sk03a2 *bp04 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(ref->CreatureType());
18483 :
18484 : U16 bp22 = bp04->w30;
18485 :
18486 : U16 di = ((bp22 & 15) > 1) ? 0 : 1;
18487 :
18488 : i16 bp20 = QUERY_GDAT_CREATURE_WORD_VALUE(ref->CreatureType(), 0x41);
18489 :
18490 : if (bp20 == 0) {
18491 :
18492 : bp20 = _4976_4398[di];
18493 : }
18494 :
18495 : si -= bp20;
18496 :
18497 : U16 bp1e = (rl.Dir() - _4976_5aa0) & 3;
18498 :
18499 : bp18 = (xx == 3 && _4976_5aa2 != 0) ? _4976_41d0[_4976_0c5c] : 12;
18500 :
18501 : if (_32cb_35c1(&xx, &bp18, _4976_4388[di][bp1e], _4976_4388[2 +di][bp1e]) == 0)
18502 :
18503 : return;
18504 : }
18505 :
18506 : else if (tt == 0) {
18507 :
18508 : bp18 = _48ae_07fd(rl, _4976_5aa0);
18509 : }
18510 :
18511 : i16 bp12 = _4976_412d[xx];
18512 :
18513 : U16 bp0a;
18514 : U16 bp06;
18515 : U16 bp1a;
18516 : if (tt != 0) {
18517 :
18518 : bp0a = 0;
18519 :
18520 : bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(_4976_5aa8.b8, _4976_5aa8.b9, dtImageOffset, 0xfd);
18521 :
18522 : yy = _4976_5aa8.w28 + i8(bp1a >> 8) + _4976_41de[_4976_41b0[vv][0]];
18523 :
18524 : si = _4976_41de[_4976_41b0[vv][1]] + (i8(bp1a) + _4976_5aa8.w30);
18525 :
18526 : bp06 = _4976_5aa8.w24;
18527 : }
18528 : else {
18529 :
18530 : bp0a = 4 -(bp18 / 5);
18531 :
18532 : if (xx == 0 && bp0a < 2)
18533 :
18534 : return;
18535 :
18536 : bp06 = _098d_0cb7(xx, bp18, 0) | 0x8000;
18537 : }
18538 :
18539 : U16 bp1c = 0;
18540 :
18541 : U8 bp0d = QUERY_CLS1_FROM_RECORD(rl);
18542 :
18543 : U8 bp0e = QUERY_CLS2_FROM_RECORD(rl);
18544 :
18545 : if (bp0d == 0x14 && bp0e < 8) {
18546 :
18547 : if (ss == 0) {
18548 :
18549 : ss = ss +GET_ADDRESS_OF_RECORD9(rl)->IsOpened();
18550 : }
18551 :
18552 : bp1c = 1;
18553 : }
18554 :
18555 : U8 bp0f = _4976_4380[ss][0];
18556 :
18557 : U16 bp08 = 0;
18558 :
18559 : i16 bp14 = _4976_4116[xx];
18560 :
18561 : if (bp14 == 0) {
18562 :
18563 : i16 bp16 = bp18 / 5;
18564 :
18565 : U16 bp10;
18566 : if (true
18567 : && (bp16 == 2 || tt != 0)
18568 : && QUERY_GDAT_ENTRY_IF_LOADABLE(bp0d, bp0e, dtImage, U8(bp10 = _4976_4380[ss][1])) != 0
18569 : ) {
18570 :
18571 : bp0f = U8(bp10);
18572 : }
18573 :
18574 : else if (bp1c != 0 && tt == 0 && bp16 > 2) {
18575 :
18576 : bp08 = 1;
18577 : }
18578 : }
18579 :
18580 : else if (bp1c != 0 && bp14 == 1) {
18581 :
18582 : bp08 = 1;
18583 : }
18584 :
18585 : if (vv != -1) {
18586 :
18587 : yy += _4976_41de[_4976_41b0[vv][0]];
18588 :
18589 : if (ref == NULL) {
18590 :
18591 : si += _4976_41de[_4976_41b0[vv][1]];
18592 : }
18593 : }
18594 :
18595 : bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(bp0d, 0xfe, dtImageOffset, bp0f);
18596 :
18597 : if (bp1a != 0) {
18598 :
18599 : yy += i8(bp1a >> 8);
18600 :
18601 : si += i8(bp1a);
18602 : }
18603 :
18604 : U16 bp0c = _4976_418f[bp12][bp0a];
18605 :
18606 : _32cb_08c1(bp08, bp0c, bp0c, yy, si, bp12, bp06, 0, 10, -1, bp0d, bp0e, bp0f);
18607 :
18608 : if (ww == 0)
18609 :
18610 : _4976_5940.w48 = -2;
18611 :
18612 : _32cb_0997();
18613 :
18614 : return;
18615 : }
18616 :
18617 :
18618 : ObjectID _32cb_03a6(U16 xx, U16 yy, U16 zz, U16 ww, U16 vv, ObjectID ss, U16 tt, U16 uu)
18619 : {
18620 :
18621 : ENTER(28);
18622 :
18623 : U16 bp12 = ss.Dir();
18624 :
18625 : Creature *bp04;
18626 : ObjectID si;
18627 : if (tt == 2) {
18628 :
18629 : bp04 = GET_ADDRESS_OF_RECORD4(GET_CREATURE_AT(ww, vv));
18630 :
18631 : si = bp04->GetPossessionObject();
18632 : }
18633 : else {
18634 :
18635 : bp04 = NULL;
18636 :
18637 : si = GET_TILE_RECORD_LINK(ww, vv);
18638 : }
18639 :
18640 : if (si == si.FFFE) {
18641 :
18642 : if (uu != 0)
18643 :
18644 : return ss;
18645 :
18646 :
18647 : return ObjectID::FFFF;
18648 : }
18649 :
18650 : i16 di = (tt == 3) ? 2 : 0;
18651 :
18652 : ObjectID bp0e = ObjectID::FFFF;
18653 :
18654 : Container *bp0c = NULL;
18655 : U16 bp16;
18656 : Container *bp08;
18657 :
18658 : do {
18659 :
18660 : U16 bp10 = si.DBType();
18661 :
18662 : if (bp10 < dbWeapon || bp10 > dbMiscellaneous_item)
18663 :
18664 : continue;
18665 :
18666 : if (si.Dir() != bp12)
18667 :
18668 : continue;
18669 :
18670 : U16 bp14 = 0;
18671 : bp08 = NULL;
18672 :
18673 : if (true
18674 : && IS_CONTAINER_CHEST(si) != 0
18675 : && QUERY_GDAT_ENTRY_IF_LOADABLE(0x14, QUERY_CLS2_FROM_RECORD(si), dtImage, 0x48) != 0
18676 : ) {
18677 :
18678 : if ((bp08 = GET_ADDRESS_OF_RECORD9(si))->IsOpened() != 0) {
18679 :
18680 : bp14 = 3;
18681 : }
18682 :
18683 : else if (uu == 0) {
18684 :
18685 : bp14 = 2;
18686 : }
18687 : }
18688 : do {
18689 :
18690 : _32cb_3672(si, zz, 0, 0, di, bp04, 0, bp14, (tt == 3) ? 1 : 0);
18691 :
18692 : if (_32cb_00f1(xx, yy, 10) == 1) {
18693 :
18694 : bp0c = bp08;
18695 :
18696 : bp0e = si;
18697 : bp16 = bp14;
18698 :
18699 : break;
18700 : }
18701 :
18702 : if (bp14 == 0)
18703 :
18704 : break;
18705 :
18706 : bp14 = 0;
18707 :
18708 : } while (true);
18709 :
18710 :
18711 : di++;
18712 :
18713 : if (tt == 3) {
18714 :
18715 : if (di >= 14)
18716 :
18717 : di = 2;
18718 : }
18719 : else {
18720 :
18721 : di &= 15;
18722 : }
18723 :
18724 : } while ((si = GET_NEXT_RECORD_LINK(si)) != si.FFFE);
18725 :
18726 :
18727 : bp08 = bp0c;
18728 :
18729 : if (bp08 == NULL)
18730 :
18731 : goto _0639;
18732 :
18733 : switch (bp16) {
18734 : case 0:
18735 :
18736 : if (uu != 0)
18737 :
18738 :
18739 : return ObjectID::FFFE;
18740 :
18741 : if (bp08->IsOpened() == 0)
18742 :
18743 : goto _0642;
18744 :
18745 : bp08->IsOpened(0);
18746 :
18747 : break;
18748 :
18749 : case 2:
18750 :
18751 : bp08->IsOpened(1);
18752 :
18753 : break;
18754 :
18755 : case 3:
18756 : {
18757 :
18758 : if (uu != 0 && (QUERY_GDAT_DBSPEC_WORD_VALUE(ss, 4) & 0x8000) != 0)
18759 :
18760 :
18761 : return ObjectID::FFFE;
18762 :
18763 : ObjectID bp1c;
18764 : ObjectID bp1a;
18765 : bp1c = bp1a = bp08->GetContainedObject();
18766 :
18767 : i16 bp18;
18768 : for (bp18 = 0; bp1c != bp1c.FFFE; ) {
18769 :
18770 : bp18++;
18771 : bp1a = bp1c;
18772 : bp1c = GET_NEXT_RECORD_LINK(bp1c);
18773 : }
18774 :
18775 : if (uu != 0) {
18776 :
18777 : if (bp18 < 8) {
18778 :
18779 : APPEND_RECORD_TO(ss, &bp08->w2, -1, 0);
18780 :
18781 : break;
18782 : }
18783 :
18784 : return ObjectID::FFFE;
18785 : }
18786 :
18787 : if (bp18 <= 0)
18788 :
18789 : break;
18790 :
18791 : CUT_RECORD_FROM(bp1a, &bp08->w2, -1, 0);
18792 :
18793 : _4976_57f2 = 1;
18794 :
18795 : _2c1d_06b5(bp1a, 1);
18796 :
18797 : break;
18798 : }
18799 :
18800 : }
18801 :
18802 : return ObjectID::FFFF;
18803 :
18804 :
18805 : _0639:
18806 : if (bp0e == ObjectID::FFFF)
18807 :
18808 :
18809 : return ss;
18810 :
18811 : _0642:
18812 : return bp0e;
18813 : }
18814 :
18815 :
18816 : void _121e_013a(U16 xx, U16 yy, U16 zz)
18817 : {
18818 :
18819 : ENTER(4);
18820 :
18821 : if (_4976_3fc6 == -1)
18822 :
18823 : return;
18824 :
18825 : U16 di = _4976_4bfa;
18826 : U16 si = _4976_4c06;
18827 :
18828 : U16 bp04 = _4976_4d1a[zz].b10;
18829 :
18830 : if (bp04 != 0) {
18831 :
18832 : if (bp04 != 3)
18833 :
18834 : return;
18835 :
18836 : di += _4976_0232[_4976_4bf6];
18837 : si += _4976_023a[_4976_4bf6];
18838 : }
18839 :
18840 : ObjectID bp02 = _32cb_03a6(xx, yy, bp04, di, si, _4976_4d1a[zz].w8, _4976_4d1a[zz].b11, 0);
18841 :
18842 : if (bp02 != bp02.FFFF) {
18843 :
18844 : if (_4976_4d1a[zz].b11 == 2) {
18845 :
18846 : MOVE_RECORD_TO(bp02, di, si, -1, -1);
18847 : }
18848 : else {
18849 :
18850 : MOVE_RECORD_TO(bp02, di, si, -1, 0);
18851 : }
18852 :
18853 : _4976_57f2 = 1;
18854 :
18855 : if (IS_CONTAINER_MONEYBOX(bp02) != 0) {
18856 :
18857 : GET_ADDRESS_OF_RECORD9(bp02)->b7_2_2(0);
18858 : }
18859 :
18860 : _2c1d_06b5(bp02, 1);
18861 : }
18862 :
18863 : _4976_4e5c = 1;
18864 :
18865 : return;
18866 : }
18867 :
18868 :
18869 : U16 _121e_03ae(U16 aa, U16 bb, U16 xx, U16 yy, U16 cc, U16 dd, U16 ee)
18870 : {
18871 :
18872 : ENTER(0);
18873 :
18874 : U16 di = dd;
18875 :
18876 : ObjectID si = _32cb_03a6(aa, bb, cc, xx, yy, ObjectID(_4976_57c8.w0, (_4976_4bf6 +di) & 3), ee, 1);
18877 :
18878 : if (si == si.FFFF) {
18879 :
18880 : _2c1d_073d();
18881 :
18882 : return 1;
18883 : }
18884 :
18885 : if (si == si.FFFE) {
18886 :
18887 : if (ee == 2) {
18888 :
18889 : return _121e_0222(xx, yy, di +4);
18890 : }
18891 : else {
18892 :
18893 : return _121e_0222(xx, yy, di);
18894 : }
18895 : }
18896 :
18897 : return 0;
18898 : }
18899 :
18900 :
18901 : U16 _098d_02a2(U16 rectno, i16 xx, i16 yy)
18902 : {
18903 :
18904 : ENTER(8);
18905 :
18906 : SRECT bp08;
18907 : if (QUERY_EXPANDED_RECT(rectno, &bp08) == NULL)
18908 :
18909 : return 0;
18910 :
18911 : return PT_IN_RECT(&bp08, xx, yy);
18912 : }
18913 :
18914 :
18915 : void _121e_00be(U16 ww, U16 xx, U16 yy)
18916 : {
18917 :
18918 : ENTER(0);
18919 :
18920 : if (_4976_4c3c == 0)
18921 :
18922 : return;
18923 :
18924 : if (ww != 0) {
18925 :
18926 : if (_4976_4c3e != 0)
18927 :
18928 : return;
18929 :
18930 : _443c_03f4();
18931 :
18932 : _4976_4c3e = 1;
18933 :
18934 : _443c_08ab(&_4976_5da0, &_4976_5da2, &_4976_5db8);
18935 :
18936 : if ((_4976_5db8 & 2) == 0) {
18937 :
18938 : FIRE_MOUSE_SET_POS();
18939 :
18940 : _4976_4c3e = 0;
18941 :
18942 : }
18943 : else {
18944 :
18945 : _443c_085a();
18946 : }
18947 : }
18948 : else {
18949 :
18950 : QUEUE_NOISE_GEN2(0x08, _4976_4218, 0x84, 0xfe, xx, yy, 0, 140, 200);
18951 : }
18952 :
18953 : _4976_4e5c = 1;
18954 :
18955 : return;
18956 : }
18957 :
18958 :
18959 : i16 _0cee_2e35(U8 cls2)
18960 : {
18961 :
18962 : ENTER(0);
18963 :
18964 : U16 si = QUERY_GDAT_CREATURE_WORD_VALUE(cls2, 0x04);
18965 :
18966 : if (si == 0)
18967 :
18968 : return 4;
18969 :
18970 : return si;
18971 : }
18972 :
18973 :
18974 : void _32cb_28c7(U16 xx, i16 yy, Creature *vv, sk4ebe *ww, ObjectID rl)
18975 : {
18976 :
18977 : ENTER(28);
18978 :
18979 : U16 di = 0;
18980 :
18981 : sk1c9a02c3 *bp04 = _1c9a_02c3(vv, QUERY_CREATURE_AI_SPEC_FROM_TYPE(vv->CreatureType()));
18982 :
18983 : i16 si = _4937_000f(bp04->w0, &bp04->w2);
18984 :
18985 : U16 bp06 = (ww == NULL) ? 0 : ww->b7;
18986 :
18987 : U16 bp0a = ((_0cee_2de0(rl) & 4) != 0) ? 2 : ((_4976_5aa0 - vv->b15_0_2()) & 3);
18988 :
18989 : U16 bp08 = _4976_5a98[si][bp0a +10];
18990 :
18991 : U8 bp0b = vv->CreatureType();
18992 :
18993 : U8 bp0c = _4976_5a98[si][bp0a +2];
18994 :
18995 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
18996 :
18997 : bp0c = (bp0a +2) & 3;
18998 :
18999 : if ((bp0c & 1) != 0)
19000 :
19001 : di = 1;
19002 :
19003 : bp0c = _4976_5a98[si][bp0c +2];
19004 :
19005 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
19006 :
19007 : di = 0;
19008 :
19009 : bp0c = _4976_5a98[si][4];
19010 : }
19011 : }
19012 :
19013 : else if (false
19014 : || (bp08 & 1) != 0
19015 : || ((bp06 & 64) != 0 && (bp06 & 2) != 0 && (bp06 & 1) == 0)
19016 : ) {
19017 :
19018 : di = 1;
19019 : }
19020 :
19021 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
19022 :
19023 : bp0c = bp0a -6;
19024 :
19025 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
19026 :
19027 : if (true
19028 : && bp0c == 0xfb
19029 : && QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c +2) != 0
19030 : ) {
19031 :
19032 : di = 1;
19033 :
19034 : bp0c = bp0c +2;
19035 : }
19036 : else {
19037 :
19038 : di = 0;
19039 :
19040 : bp0c = 0xfc;
19041 : }
19042 : }
19043 : }
19044 :
19045 : i16 bp10 = _4976_4189[yy];
19046 :
19047 : i16 bp14 = (ww != NULL && ww->b26 == 19) ? ww->w14 : si;
19048 :
19049 : U16 bp12 = _4976_5a98[bp14][0];
19050 :
19051 : if (xx == 3 && _4976_5aa2 != 0) {
19052 :
19053 : bp12 = _4976_41d0[_4976_0c5c];
19054 : bp10 = _4976_41d7[_4976_0c5c];
19055 : }
19056 : else {
19057 :
19058 : bp10 = _0b36_0036(_4976_5a98[si][bp0a +6], bp10);
19059 : }
19060 :
19061 : U16 bp0e = _098d_0cb7(xx, bp12, bp0a) | 0x8000;
19062 :
19063 : i16 bp18, bp16;
19064 : bp18 = bp16 = i8(_4976_5a98[bp14][1]);
19065 :
19066 : if (bp16 != 0) {
19067 :
19068 : i16 bp1c;
19069 : i16 bp1a;
19070 : switch (bp0a) {
19071 : case 0:
19072 :
19073 : bp1c = -7;
19074 :
19075 :
19076 : bp1a = 0;
19077 :
19078 : break;
19079 :
19080 : case 2:
19081 :
19082 : bp1c = 7;
19083 :
19084 : bp1a = 0;
19085 :
19086 : break;
19087 :
19088 : case 1:
19089 : case 3:
19090 :
19091 : bp1a = -64;
19092 : bp1c = 0;
19093 :
19094 : break;
19095 : }
19096 :
19097 : bp1a = _0b36_0036(bp1a, bp16);
19098 :
19099 : bp18 = _0b36_0036(bp1c, bp18);
19100 : }
19101 :
19102 : _32cb_08c1(di, bp10, bp10, _4976_41de[bp06 & 7] +bp16, _4976_41de[(bp06 >> 8) & 7] +bp18, yy,
19103 : bp0e, -1, _0cee_2e35(bp0b), -1, 0x0f, bp0b, bp0c);
19104 :
19105 : return;
19106 : }
19107 :
19108 :
19109 : U16 _32cb_01b6(U16 xx, U16 yy, U16 ss, U16 tt, U16 *ww)
19110 : {
19111 :
19112 : ENTER(8);
19113 :
19114 : ObjectID si = GET_CREATURE_AT(ss, tt);
19115 :
19116 : if (si == si.FFFF)
19117 :
19118 : return 0;
19119 :
19120 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
19121 :
19122 : sk4ebe *bp08;
19123 : if (bp04->b5 == 255) {
19124 :
19125 : bp08 = NULL;
19126 : }
19127 : else {
19128 :
19129 : bp08 = &_4976_4ebe[bp04->b5];
19130 : }
19131 :
19132 : _32cb_28c7(3, _4976_4130, bp04, bp08, si);
19133 :
19134 : i16 di = _4976_5940.w48;
19135 :
19136 : _4976_5940.w48 = -2;
19137 :
19138 : _32cb_0997();
19139 :
19140 : if (_32cb_00f1(xx, yy, di) == 0)
19141 :
19142 :
19143 : return 0;
19144 :
19145 : if (_4976_5a94 < 0xffb5) {
19146 :
19147 : *ww = 3;
19148 : }
19149 :
19150 : else if (_4976_5a94 > 0x004b) {
19151 :
19152 : *ww = 1;
19153 : }
19154 : else {
19155 :
19156 : *ww = 0;
19157 : }
19158 :
19159 : return 1;
19160 : }
19161 :
19162 :
19163 : U16 _121e_0222(U16 xx, U16 yy, U16 ww)
19164 : {
19165 :
19166 : ENTER(12);
19167 :
19168 : Creature *bp0c = NULL;
19169 :
19170 : if (_4976_3fc6 == -1)
19171 :
19172 : return 0;
19173 :
19174 : U16 bp06 = (_4976_4bf6 +ww) & 3;
19175 :
19176 : ObjectID di = GET_CREATURE_AT(xx, yy);
19177 :
19178 : if (di != di.FFFF) {
19179 :
19180 : sk03a2 *bp04 = QUERY_CREATURE_AI_SPEC_FROM_RECORD(di);
19181 :
19182 : bp0c = GET_ADDRESS_OF_RECORD4(di);
19183 :
19184 : if (true
19185 : && (bp04->w0 & 1) != 0
19186 : && (false
19187 : || (ww >= 4 && ww <= 7 && (bp04->w30 & 0x0800) == 0)
19188 : || (ww < 4 && (bp04->w30 & 0x2000) == 0)
19189 : )
19190 : ) {
19191 :
19192 :
19193 : return 0;
19194 : }
19195 : }
19196 :
19197 : di = _2c1d_073d();
19198 :
19199 : if (ww >= 4 && ww <= 7) {
19200 :
19201 : U8 bp07 = (ww -4 + _4976_4bf6) & 3;
19202 :
19203 : if (bp0c != NULL) {
19204 :
19205 : for (ObjectID si = bp0c->GetPossessionObject(); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
19206 :
19207 : if (si.Dir() == bp07 && IS_CONTAINER_MONEYBOX(si) != 0) {
19208 :
19209 : GET_ADDRESS_OF_RECORD9(si)->b7_2_2(0);
19210 : }
19211 :
19212 : }
19213 : }
19214 :
19215 : MOVE_RECORD_TO(ObjectID(di, bp07), -1, -1, xx, yy);
19216 : }
19217 : else{
19218 :
19219 : MOVE_RECORD_TO(ObjectID(di, bp06), -1, 0, xx, yy);
19220 : }
19221 :
19222 : _4976_4e5c = 1;
19223 :
19224 : return 1;
19225 : }
19226 :
19227 :
19228 : U16 _0cee_2e09(ObjectID rl)
19229 : {
19230 :
19231 : ENTER(0);
19232 :
19233 : return QUERY_CREATURE_AI_SPEC_FROM_RECORD(rl)->w32;
19234 : }
19235 :
19236 :
19237 : U16 _2c1d_1fb1(U16 xx)
19238 : {
19239 :
19240 : ENTER(0);
19241 :
19242 : if (_4976_3fc6 == -1)
19243 :
19244 : return 0;
19245 :
19246 : return _2c1d_1de2(_4976_3fc6, -1, xx);
19247 : }
19248 :
19249 :
19250 : U16 _121e_0351(U16 xx, U16 yy)
19251 : {
19252 :
19253 : ENTER(0);
19254 :
19255 : U16 si = 0;
19256 :
19257 : U16 di = (_4976_4dda == 17) ? 768 : 765;
19258 :
19259 : if (_098d_02a2(di, xx, yy) != 0) {
19260 :
19261 : si = _2c1d_1fb1(0);
19262 : }
19263 :
19264 : else if (_098d_02a2(di +1, xx, yy) != 0) {
19265 :
19266 : si = _2c1d_1fb1(si);
19267 : }
19268 :
19269 : if (si != 0)
19270 :
19271 : _4976_4e5c = 1;
19272 :
19273 : return si;
19274 : }
19275 :
19276 :
19277 : void _121e_0422(i16 xx, i16 yy)
19278 : {
19279 :
19280 : ENTER(38);
19281 :
19282 : U16 di = yy;
19283 :
19284 : if (_4976_4ddc != 0) {
19285 :
19286 : _4976_4ddc = 0;
19287 :
19288 : _12b4_0aa5(_4976_0c5c);
19289 :
19290 : _29ee_000f();
19291 : }
19292 :
19293 : xx -= _4976_00e8;
19294 :
19295 : di -= _4976_00ea;
19296 :
19297 : U16 bp0c = _4976_4bfa;
19298 :
19299 : U16 bp0e = _4976_4c06;
19300 :
19301 : bp0c += _4976_0232[_4976_4bf6];
19302 :
19303 : bp0e += _4976_023a[_4976_4bf6];
19304 :
19305 : ObjectID bp0a = _4976_57c8.w0;
19306 :
19307 : Door *bp04;
19308 : U16 si;
19309 : for (si = 0; si < _4976_4dde; si++) {
19310 :
19311 : if (PT_IN_RECT(&_4976_4d1a[si].rc0, xx, di) != 0) {
19312 :
19313 : switch (_4976_4d1a[si].b11 -1) {
19314 : case 3:
19315 :
19316 : if (_4976_3fc6 == -1)
19317 :
19318 : break;
19319 :
19320 : U16 bp16;
19321 : U16 bp18;
19322 : if (_4976_4d1a[si].b10 == 3) {
19323 :
19324 : bp16 = bp0c;
19325 : bp18 = bp0e;
19326 : }
19327 : else {
19328 :
19329 : bp16 = _4976_4bfa;
19330 : bp18 = _4976_4c06;
19331 : }
19332 :
19333 :
19334 : bp04 = GET_ADDRESS_OF_TILE_RECORD(U8(bp16), U8(bp18))->castToDoor();
19335 :
19336 : if (bp04->Button() != 0) {
19337 :
19338 : if (bp0a == bp0a.FFFF)
19339 :
19340 : continue;
19341 :
19342 : QUEUE_NOISE_GEN1(0x03, 0x00, 0x88, 0x8c, 0x80, _4976_4bfa, _4976_4c06, 1);
19343 :
19344 : sk5c20 bp22;
19345 : INVOKE_MESSAGE(bp16, bp18, 0, 2, _4976_4bec +1);
19346 :
19347 : bp22.SetMap(_4976_0c5a);
19348 : bp22.SetTick(_4976_4bec +1);
19349 :
19350 : bp22.TimerType(0x58);
19351 : bp22.b5 = 0;
19352 :
19353 : ObjectID bp1c = GET_TILE_RECORD_LINK(bp16, bp18);
19354 :
19355 : QUEUE_TIMER(&bp22);
19356 :
19357 : bp04->w2_b_b(1);
19358 :
19359 : _4976_4e5c = 1;
19360 :
19361 : continue;
19362 : }
19363 : else {
19364 :
19365 : bp16 += _4976_0232[(_4976_4bf6 +1) & 3];
19366 :
19367 : bp18 += _4976_023a[(_4976_4bf6 +1) & 3];
19368 :
19369 : MOVE_RECORD_AT_WALL(bp16, bp18, (_4976_4bf6 + 3) & 3, -1, _4976_57c8.w0);
19370 :
19371 : continue;
19372 : }
19373 :
19374 : case 5:
19375 :
19376 : U16 bp24;
19377 : if (_32cb_0287(bp24 = _4976_4d1a[si].b10, xx, di) == 0)
19378 :
19379 : continue;
19380 :
19381 : _121e_0003(bp24);
19382 :
19383 : return;
19384 :
19385 : case 0:
19386 : case 1:
19387 : case 2:
19388 :
19389 : if (bp0a == bp0a.FFFF) {
19390 :
19391 : if (_4976_4d1a[si].w8 == 0xffff)
19392 :
19393 : continue;
19394 :
19395 : _121e_013a(xx, di, si);
19396 :
19397 :
19398 :
19399 : return;
19400 : }
19401 :
19402 : if (_4976_4d1a[si].b11 == 3) {
19403 :
19404 : if (_121e_03ae(xx, di, bp0c, bp0e, 0, 2, 3) == 0)
19405 :
19406 : continue;
19407 :
19408 : return;
19409 : }
19410 :
19411 : if (_4976_4d1a[si].b11 == 1)
19412 :
19413 : continue;
19414 :
19415 : for (U16 bp26 = 0; bp26 <= 1; bp26++) {
19416 :
19417 : if (_121e_03ae(xx, di, _4976_4bfa, _4976_4c06, 0, bp26, 1) != 0)
19418 :
19419 : return;
19420 : }
19421 :
19422 : break;
19423 :
19424 : case 4:
19425 : break;
19426 : }
19427 : }
19428 :
19429 : }
19430 :
19431 : si = GET_TILE_VALUE(bp0c, bp0e);
19432 :
19433 : U16 bp12 = ((si >> 5) == ttTrickWall && ((si >> 5) & 1) != 0 && ((si >> 5) & 4) == 0) ? 1 : 0;
19434 :
19435 : U16 bp14;
19436 : if (bp0a == bp0a.FFFF) {
19437 :
19438 : if (_4976_4dda == 0 && (_098d_02a2(765, xx, di) == 0 || _098d_02a2(766, xx, di) != 0)) {
19439 :
19440 : _121e_00be(bp12, bp0c, bp0e);
19441 :
19442 :
19443 :
19444 : return;
19445 : }
19446 :
19447 : ObjectID bp10 = GET_CREATURE_AT(bp0c, bp0e);
19448 :
19449 : if (bp10 == bp10.FFFF)
19450 :
19451 : return;
19452 :
19453 : sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp10);
19454 :
19455 : if ((bp08->w0 & 1) == 0)
19456 :
19457 : return;
19458 :
19459 : if (_32cb_01b6(xx, di, bp0c, bp0e, &bp14) == 0)
19460 :
19461 : return;
19462 :
19463 : if (_0cee_2e1e(bp10) != 255) {
19464 :
19465 : if (bp14 != 0) {
19466 :
19467 : ROTATE_CREATURE(bp10, 0, bp14);
19468 :
19469 : return;
19470 : }
19471 :
19472 : _4976_4ddc = 1;
19473 :
19474 : _4976_4dbe = _4976_4dc0 = xx;
19475 :
19476 : _29ee_000f();
19477 :
19478 : _4976_0c5c = 6;
19479 :
19480 : return;
19481 : }
19482 :
19483 : QUEUE_NOISE_GEN2(0x0f, QUERY_CLS2_FROM_RECORD(bp10), 0x84, 0xfe, bp0c, bp0e, 0, 0x8c, 0x80);
19484 :
19485 : return;
19486 : }
19487 :
19488 : for (si = 0; si <= 1; si++) {
19489 :
19490 : if (_121e_03ae(xx, di, _4976_4bfa, _4976_4c06, 0, si, 1) != 0)
19491 :
19492 : return;
19493 :
19494 : if (_098d_02a2(si +760, xx, di) != 0 && _121e_0222(_4976_4bfa, _4976_4c06, si) != 0)
19495 :
19496 : return;
19497 :
19498 : }
19499 :
19500 : if (_4976_4dda == 0 && bp12 == 0)
19501 :
19502 : return;
19503 :
19504 : for (si = 2; si <= 3; si++) {
19505 :
19506 : if (_121e_03ae(xx, di, bp0c, bp0e, 3, si, 1) != 0)
19507 :
19508 : return;
19509 :
19510 : if (_098d_02a2(si +760, xx, di) != 0 && _121e_0222(bp0c, bp0e, si) != 0)
19511 :
19512 : return;
19513 :
19514 : }
19515 :
19516 : ObjectID bp10 = GET_CREATURE_AT(bp0c, bp0e);
19517 :
19518 : if (bp10 != bp10.FFFF) {
19519 :
19520 : sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp10);
19521 :
19522 : if ((bp08->w0 & 1) != 0) {
19523 :
19524 : for (si = 0; bp08->w30 > si; si++) {
19525 :
19526 : if (_121e_03ae(xx, di, bp0c, bp0e, 3, si +2, 2) != 0)
19527 :
19528 : return;
19529 :
19530 : if (_098d_02a2(_0cee_2e09(bp10) +si, xx, di) != 0) {
19531 :
19532 : if (_121e_0222(bp0c, bp0e, si +6) != 0)
19533 :
19534 : return;
19535 : }
19536 :
19537 : }
19538 : }
19539 : }
19540 :
19541 : _121e_0351(xx, di);
19542 :
19543 : return;
19544 : }
19545 :
19546 :
19547 : void _1031_16fd(Bit16u ww, i16 xx, i16 yy)
19548 : {
19549 :
19550 : ENTER(24);
19551 :
19552 : i16 di = yy;
19553 :
19554 : ObjectID bp0c = _4976_52af[_4976_5366].Possess(_4976_5354);
19555 :
19556 : Container *bp04 = GET_ADDRESS_OF_RECORD9(bp0c);
19557 :
19558 : if (ww != 150 || bp04->b5_5_7() != 1)
19559 :
19560 : return;
19561 :
19562 : SRECT bp18;
19563 : QUERY_EXPANDED_RECT(99, &bp18);
19564 :
19565 : xx -= bp18.x - _4976_53a0;
19566 : di -= bp18.y - _4976_53a2;
19567 :
19568 : if (false
19569 : || xx / (_4976_0144 + _4976_0148) < _4976_0148
19570 : || di / (_4976_0146 + _4976_014a) < _4976_014a
19571 : || GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), bp0c) == NULL
19572 : ) {
19573 :
19574 : return;
19575 : }
19576 :
19577 : xx = xx / (_4976_0144 + _4976_0148);
19578 : di = di / (_4976_0146 + _4976_014a);
19579 :
19580 : i16 bp0e = _4976_5364;
19581 :
19582 : i16 bp10 = _4976_5365;
19583 :
19584 : _0cee_02dd(_4976_539f, 3 -di, xx -3, &bp0e, &bp10);
19585 :
19586 : i16 si = _0cee_0510(_4976_539e, 0, &bp0e, &bp10, NULL);
19587 :
19588 : if (si < 0)
19589 :
19590 : return;
19591 :
19592 : i16 bp0a = _4976_0c5a;
19593 :
19594 : CHANGE_CURRENT_MAP_TO(si);
19595 :
19596 : U16 bp06 = GET_TILE_VALUE(bp0e, bp10);
19597 :
19598 : U16 bp08 = bp06 >> 5;
19599 :
19600 : if (true
19601 : && bp08 != ttWall
19602 : && bp08 != ttMapExit
19603 : && (bp08 != ttTrickWall || (bp06 & 5) != 0)
19604 : ) {
19605 :
19606 : if (true
19607 : && bp0e == _4976_536a
19608 : && bp10 == _4976_536c
19609 : && si == _4976_5318
19610 : ) {
19611 :
19612 : if (_4976_5326 == 1 && _4976_533c >= 0) {
19613 :
19614 : bp0e = _4976_5328;
19615 : bp10 = _4976_532a;
19616 :
19617 : si = _4976_533c;
19618 : }
19619 :
19620 : else if (_4976_533e >= 0 && (_4976_5326 == 1 || _4976_5326 == 3)) {
19621 :
19622 : bp0e = _4976_5320;
19623 : bp10 = _4976_5322;
19624 :
19625 : si = _4976_533e;
19626 : }
19627 : }
19628 :
19629 : SET_DESTINATION_OF_MINION_MAP(bp0c, bp0e, bp10, si);
19630 :
19631 : _1c9a_0247(bp04->GetContainedObject());
19632 :
19633 : _2759_0644(0);
19634 : }
19635 :
19636 : CHANGE_CURRENT_MAP_TO(bp0a);
19637 :
19638 : return;
19639 : }
19640 :
19641 :
19642 : void _2759_13f5(Bit16u xx)
19643 : {
19644 :
19645 : ENTER(4);
19646 :
19647 : U16 si = _4976_3e1e[xx];
19648 :
19649 : U16 di = 1 << xx;
19650 :
19651 : if ((_4976_5356 & di) != 0) {
19652 :
19653 : si = -si;
19654 :
19655 : goto _1445;
19656 : }
19657 :
19658 : sk53b4 *bp04 = &_4976_52af[_4976_5366];
19659 :
19660 : if (bp04->curMP() >= si) {
19661 :
19662 : bp04->curMP(bp04->curMP() -si);
19663 :
19664 : bp04->w50 |= 0x0800;
19665 :
19666 : _1445:
19667 : _4976_5356 ^= di;
19668 : _4976_531a += si;
19669 : }
19670 :
19671 : return;
19672 : }
19673 :
19674 :
19675 : void _38c8_0060()
19676 : {
19677 :
19678 : ENTER(0);
19679 :
19680 : if (_4976_5bec != 0 && _4976_01ba == 0) {
19681 :
19682 : if (_4976_4be8 != 0) {
19683 :
19684 : _1031_1907();
19685 :
19686 : _44c8_1be8(0);
19687 : }
19688 : else {
19689 :
19690 : _4976_5bec = 0;
19691 :
19692 : if (_4976_5366 == 0)
19693 :
19694 : _4976_531c = 1;
19695 : else
19696 :
19697 : _4976_5352 = 1;
19698 :
19699 : U16 si = _4976_52be;
19700 :
19701 : if (si != 0) {
19702 :
19703 : _4976_52be = 0;
19704 :
19705 : _24a5_1798(si -1);
19706 :
19707 : }
19708 : else {
19709 :
19710 : _32cb_06cf();
19711 :
19712 : _29ee_000f();
19713 : }
19714 : }
19715 : }
19716 :
19717 : return;
19718 : }
19719 :
19720 : void _1031_1907();
19721 : void _2c1d_14ba();
19722 :
19723 :
19724 : void FILE_DELETE(U8 *filename);
19725 :
19726 : U16 FILE_WRITE(i16 handle, U32 buffSize, const void *buff);
19727 :
19728 : i16 FILE_CREATE(const U8 *filename);
19729 :
19730 :
19731 : U16 SKSAVE_WRITE(void *buff, U16 buffSize);
19732 :
19733 : U8 SUPPRESS_WRITER(const void *pvData, const void *pvMask, U16 cbData, U32 repeat);
19734 :
19735 : Bit8u WRITE_RECORD_CHECKCODE(Bit16u recordLink, Bit8u writeDir, Bit8u writeFollowing);
19736 :
19737 : U16 STORE_EXTRA_DUNGEON_DATA();
19738 :
19739 : U16 WRITE_POSSESSION_INDICES();
19740 :
19741 : U16 SUPPRESS_FLUSH();
19742 :
19743 : void _2066_046d();
19744 :
19745 :
19746 : void _2066_38d9()
19747 : {
19748 :
19749 : ENTER(2);
19750 :
19751 : for (i16 bp02 = 0; bp02 < 10; bp02++) {
19752 :
19753 : _4976_52e2 = bp02 +0x30;
19754 :
19755 : i16 si = OPEN_FILE(FORMAT_SKSTR(_4976_19d0, NULL));
19756 :
19757 : if (si >= 0) {
19758 :
19759 : READ_FILE(si, 42, &_4976_5250[bp02]);
19760 :
19761 : CLOSE_FILE(si);
19762 :
19763 : }
19764 : else {
19765 :
19766 : _4976_3b5f[0] = _4976_52e2;
19767 :
19768 : SK_STRCPY(_4976_5250[bp02].b2, _4976_3b5f);
19769 :
19770 : _4976_5250[bp02].w38 = 0xBEEF;
19771 : _4976_5250[bp02].w40 = 0xDEAD;
19772 : }
19773 :
19774 : }
19775 :
19776 : return;
19777 : }
19778 :
19779 :
19780 : void _2066_3697(U8 cls2, U16 yy)
19781 : {
19782 :
19783 : ENTER(104);
19784 :
19785 : _4976_5250 = reinterpret_cast<sksave_header_asc *>(ALLOC_MEMORY(420, afDefault, 1024));
19786 :
19787 : U8 bp6a[40];
19788 : U8 *bp18 = QUERY_GDAT_TEXT(0x1a, cls2, 0x00, bp6a);
19789 :
19790 : U8 bp40[40];
19791 : U8 *bp14 = QUERY_GDAT_TEXT(0x1a, cls2, 0x01, bp40);
19792 :
19793 : U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x1a, cls2, 0x00);
19794 :
19795 : U8 *bp08;
19796 : if (_4976_5d76 != 0) {
19797 :
19798 : bp08 = QUERY_GDAT_IMAGE_LOCALPAL(0x1a, cls2, 0x00);
19799 : }
19800 : else {
19801 :
19802 : bp08 = bp04 +CALC_IMAGE_BYTE_LENGTH(bp04);
19803 : }
19804 :
19805 : SRECT bp10;
19806 : DRAW_DIALOGUE_PARTS_PICT(bp04, QUERY_EXPANDED_RECT(4, &bp10), -1, bp08);
19807 :
19808 : FREE_PICT_ENTRY(bp04);
19809 :
19810 : FIRE_FADE_SCREEN(1);
19811 :
19812 : _3929_0bd7(0x1c2, _4976_4bda[2], _4976_3b6f);
19813 :
19814 : _3929_0bd7(0x1d2, _4976_4bda[9], bp18);
19815 :
19816 : _3929_0bd7(0x1d3, _4976_4bda[9], bp14);
19817 :
19818 : _2066_38d9();
19819 :
19820 : _4976_4bd2 = yy;
19821 :
19822 : _1031_0675(4);
19823 :
19824 : _4976_523a = 0;
19825 :
19826 : while (_4976_4860 > 0) {
19827 :
19828 : _443c_086b();
19829 :
19830 : _4976_523a++;
19831 :
19832 : }
19833 :
19834 : return;
19835 : }
19836 :
19837 : void _2066_33c4(U8 *xx, U16 yy);
19838 :
19839 :
19840 : void _2066_398a(i16 xx)
19841 : {
19842 :
19843 : ENTER(10);
19844 :
19845 : SRECT bp0a;
19846 : QUERY_EXPANDED_RECT(451, &bp0a);
19847 :
19848 : i16 di = bp0a.y +4;
19849 :
19850 : for (i16 si = 0; si < 10; si++) {
19851 :
19852 : U16 bp02 = (si == xx) ? _4976_4bda[11] : _4976_4bda[9];
19853 :
19854 : DRAW_GAMELOAD_STR(bp0a.x, di, bp02, _4976_5250[si].b2);
19855 :
19856 : di += _4976_0128;
19857 :
19858 : }
19859 :
19860 : return;
19861 : }
19862 :
19863 : void _2066_3820(U8 *xx, U16 yy)
19864 : {
19865 :
19866 : ENTER(8);
19867 :
19868 : SRECT bp08;
19869 : QUERY_EXPANDED_RECT(0x1c5, &bp08);
19870 :
19871 : DRAW_DIALOGUE_PICT(QUERY_GDAT_IMAGE_ENTRY_BUFF(0x1a, 0x81, 0x00), _4976_4c16, &bp08,
19872 : bp08.x, bp08.y, -1, QUERY_GDAT_IMAGE_LOCALPAL(0x1a, 0x81, 0x00));
19873 :
19874 : DRAW_GAMELOAD_STR(bp08.x, bp08.y +4, _4976_4bda[11], xx);
19875 :
19876 : if (yy != 0) {
19877 :
19878 : bp08.x += SK_STRLEN(xx) * _4976_0126;
19879 : bp08.cx = _4976_0126;
19880 : bp08.cy -= 4;
19881 :
19882 : FIRE_FILL_BACKBUFF_RECT(&bp08, _4976_4bda[9]);
19883 : }
19884 :
19885 : _0aaf_002f();
19886 :
19887 : return;
19888 : }
19889 :
19890 : void _3929_0b01(U16 xx, U16 yy);
19891 : void _3929_0b20(U16 xx, U32 yy);
19892 :
19893 :
19894 : void _3e74_5b7c(U16 xx)
19895 : {
19896 :
19897 : ENTER(20);
19898 :
19899 : _476d_05b6(xx);
19900 :
19901 : if (_4976_484d++ == _4976_484f[_4976_484d]) {
19902 :
19903 : if (_4976_484f[_4976_484d] != 0)
19904 :
19905 : return;
19906 :
19907 : U8 *bp04 = _4976_4853;
19908 :
19909 : _3929_09fb(15, bp04);
19910 :
19911 : U8 bp14[16];
19912 : _3929_09fb(15, SK_LTOA10(2, bp14));
19913 :
19914 : _3929_0b01(15, 46);
19915 :
19916 : _3929_0b20(15, 8);
19917 :
19918 : _3929_0b20(15, _4976_5e9c);
19919 :
19920 : _3929_0b20(15, _4976_5ea6);
19921 :
19922 : _3929_0b20(15, _4976_5d66);
19923 :
19924 : bp04 = _4976_485a;
19925 :
19926 : SK_STRCPY(bp14, bp04);
19927 :
19928 : if (_4976_5bee != 0)
19929 :
19930 : bp14[0] = 0x47;
19931 :
19932 : if (_4976_5bef != 0)
19933 :
19934 : bp14[1] = 0x53;
19935 :
19936 : if (_4976_5bf0 != 0)
19937 :
19938 : bp14[2] = 0x45;
19939 :
19940 : _3929_09fb(15, bp14);
19941 : }
19942 :
19943 : _4976_484d = 0;
19944 :
19945 : return;
19946 : }
19947 :
19948 :
19949 : void _1031_0d36(U16 xx, U16 yy)
19950 : {
19951 :
19952 : ENTER(0);
19953 :
19954 : _3e74_5b7c(yy);
19955 :
19956 : _4976_19a7 = 1;
19957 :
19958 : if (_4976_4e00 < 7) {
19959 :
19960 : i16 si = _4976_19a5 +2;
19961 :
19962 : if (si > 10)
19963 :
19964 : si -= 11;
19965 :
19966 : if (si-- == 0)
19967 :
19968 : si = 10;
19969 :
19970 : _4976_19a5 = si;
19971 :
19972 : _4976_4e02[_4976_19a5].w0 = xx;
19973 :
19974 : _4976_4e02[_4976_19a5].w2 = yy;
19975 :
19976 : _4976_4e00++;
19977 : }
19978 :
19979 : _4976_19a7 = 0;
19980 :
19981 : _1031_0b7e();
19982 :
19983 : return;
19984 : }
19985 :
19986 :
19987 : U8 _01b0_054a(U16 xx)
19988 : {
19989 :
19990 : ENTER(0);
19991 :
19992 : U16 di = xx;
19993 :
19994 : LOADDS(0x3083);
19995 :
19996 : if ((di & 0x1000) != 0)
19997 :
19998 : di = 0;
19999 :
20000 : U16 si = ((di & 0x0200) != 0) ? (_04bf_033e[di & 0x007f]) : (_04bf_02be[di & 0x007f]);
20001 :
20002 : if (si != 0 && (di & 0x0400) != 0)
20003 :
20004 : si &= 0x001f;
20005 :
20006 : return U8(si);
20007 : }
20008 :
20009 :
20010 : U8 _476d_05b6(U16 xx)
20011 : {
20012 :
20013 : ENTER(0);
20014 :
20015 : return _01b0_054a(xx) CALL_IBMIO;
20016 : }
20017 :
20018 :
20019 : void _2066_37f2()
20020 : {
20021 :
20022 : ENTER(0);
20023 :
20024 : while (_4976_523a-- != 0)
20025 :
20026 : _443c_085a();
20027 :
20028 : _1031_06a5();
20029 :
20030 : _4976_022c = 1;
20031 :
20032 : DEALLOC_UPPER_MEMORY(420);
20033 :
20034 : return;
20035 : }
20036 :
20037 :
20038 : i16 _2066_33e7()
20039 : {
20040 :
20041 : ENTER(22);
20042 :
20043 : _2066_3697(0x81, 6);
20044 :
20045 : i16 si;
20046 : if (_4976_5bf6 != 0) {
20047 :
20048 : si = _4976_525c;
20049 :
20050 : COPY_MEMORY(&_4976_5250[si], &_4976_5266, 42);
20051 : }
20052 : else {
20053 :
20054 : for (si = 0; si < 10; si++) {
20055 :
20056 : if (true
20057 : && _4976_5250[si].w40 == 0xDEAD
20058 : && _4976_5250[si].w38 == 0xBEEF
20059 : ) {
20060 :
20061 : _2066_33c4(_4976_5268, si);
20062 :
20063 : break;
20064 : }
20065 :
20066 : }
20067 : }
20068 :
20069 : _2066_398a(si);
20070 :
20071 : U8 *bp04 = _4976_5268;
20072 :
20073 : if (si != 10) {
20074 :
20075 : _2066_3820(bp04, 0);
20076 : }
20077 : else {
20078 :
20079 : _0aaf_002f();
20080 : }
20081 :
20082 : while (_476d_05a9() != 0) {
20083 :
20084 : _1031_0d36(32, _476d_050e());
20085 : }
20086 :
20087 : _1031_1e6a();
20088 :
20089 : U16 bp0c;
20090 : SRECT bp14;
20091 : i16 bp06;
20092 : i16 bp08;
20093 : i16 bp0a;
20094 : i16 di;
20095 : switch (_4976_4dfc) {
20096 : case 1:
20097 :
20098 : si = -1;
20099 :
20100 : _4976_4c0a = 0;
20101 :
20102 : bp0c = 1;
20103 :
20104 : break;
20105 :
20106 : case 2:
20107 :
20108 : _4976_4c0a = 0;
20109 :
20110 : if (si == 10)
20111 :
20112 : break;
20113 :
20114 : if (*bp04 == 0) {
20115 :
20116 : _2066_33c4(bp04, si);
20117 : }
20118 :
20119 : _2066_3820(bp04, 0);
20120 :
20121 : bp0c = 1;
20122 :
20123 : break;
20124 :
20125 : case 3:
20126 :
20127 : _4976_4c0a = 0;
20128 :
20129 : QUERY_EXPANDED_RECT(_4976_4df8, &bp14);
20130 :
20131 : QUERY_TOPLEFT_OF_RECT(_4976_4e44, &bp06, &bp08);
20132 :
20133 : bp0a = _4976_4e68;
20134 :
20135 : bp0a -= bp14.y +bp08;
20136 :
20137 : si = min_value(bp0a / _4976_0128, 10);
20138 :
20139 : if (true
20140 : && _4976_5250[si].w40 == 0xDEAD
20141 : && _4976_5250[si].w38 == 0xBEEF
20142 : ) {
20143 :
20144 : _2066_33c4(_4976_5268, si);
20145 : }
20146 : else {
20147 :
20148 : SK_STRCPY(_4976_5268, _4976_5250[si].b2);
20149 : }
20150 :
20151 : _2066_398a(si);
20152 :
20153 : _2066_3820(bp04, 0);
20154 :
20155 : break;
20156 :
20157 : case 4:
20158 :
20159 : if (si != 10 && _4976_4c0a == 0) {
20160 :
20161 : _4976_4c0a = 1;
20162 :
20163 : _2066_3820(bp04, 1);
20164 :
20165 : di = SK_STRLEN(bp04);
20166 : }
20167 :
20168 : break;
20169 : }
20170 :
20171 : if (_4976_4c0a != 0 && _4976_4dfa >= 0xa5 && _4976_4dfa <= 0xd6) {
20172 :
20173 : if (_4976_4e9c == 14) {
20174 :
20175 : if (di > 0) {
20176 :
20177 : di--;
20178 :
20179 : bp04[di] = 0;
20180 : }
20181 :
20182 : else if (_4976_4e9c == 28) {
20183 :
20184 : _4976_4c0a = 0;
20185 : }
20186 :
20187 : else if (di < 31) {
20188 :
20189 : U8 bp15 = _476d_05b6(_4976_4e9c);
20190 :
20191 : if (bp15 >= 0x61 && bp15 <= 0x7a) {
20192 :
20193 : bp15 += 0xe0;
20194 : }
20195 :
20196 : bp04[di] = bp15;
20197 :
20198 : bp04[++di] = 0;
20199 : }
20200 :
20201 : _2066_3820(bp04, _4976_4c0a);
20202 : }
20203 : }
20204 :
20205 : _4976_4dfc = 0;
20206 : _4976_4dfa = 0;
20207 :
20208 : if (bp0c == 0) {
20209 :
20210 : _2066_37f2();
20211 : }
20212 :
20213 : return si;
20214 : }
20215 :
20216 :
20217 : void _1c9a_3bab()
20218 : {
20219 :
20220 : ENTER(0);
20221 :
20222 : for (U16 si = 0; _4976_1a68 > 0; si++) {
20223 :
20224 : if (_4976_4ebe[si].w0 >= 0) {
20225 :
20226 : _1c9a_0fcb(si);
20227 : }
20228 : }
20229 :
20230 : return;
20231 : }
20232 :
20233 :
20234 : void _1c9a_3b74()
20235 : {
20236 :
20237 : ENTER(2);
20238 :
20239 : U16 di = _4976_0c5a;
20240 :
20241 : U16 bp02 = _4976_4d0e->nMaps;
20242 :
20243 : for (i16 si = 0; si < bp02; si++) {
20244 :
20245 : CHANGE_CURRENT_MAP_TO(si);
20246 :
20247 : _1c9a_3a6e();
20248 : }
20249 :
20250 : CHANGE_CURRENT_MAP_TO(di);
20251 :
20252 : return;
20253 : }
20254 :
20255 :
20256 : void _1c9a_3bd7()
20257 : {
20258 :
20259 : ENTER(4);
20260 :
20261 : _4976_1a68 = 0;
20262 :
20263 : for (U16 si = 0; si < _4976_4ec2; si++) {
20264 :
20265 : _4976_4ebe[si].w0 = -1;
20266 :
20267 : }
20268 :
20269 : Creature *bp04 = reinterpret_cast<Creature *>(static_cast<U8 *>(_4976_4cca[4]));
20270 :
20271 : for (U16 si = _4976_4d0e->nRecords[dbCreature]; si-- != 0; bp04++) {
20272 :
20273 : bp04->b5 = 0;
20274 : }
20275 :
20276 : _1c9a_3b74();
20277 :
20278 : return;
20279 : }
20280 :
20281 :
20282 : void _2e62_0cd8(U16 xx)
20283 : {
20284 :
20285 : ENTER(0);
20286 :
20287 : for (U16 si = 0; si < _4976_4c3c; si++) {
20288 :
20289 : _4976_53b4[si].w50 |= xx;
20290 : }
20291 :
20292 : return;
20293 : }
20294 :
20295 :
20296 : void _2f3f_0789()
20297 : {
20298 :
20299 : ENTER(8);
20300 :
20301 : if (_4976_4c24 == 0) {
20302 :
20303 : ObjectID di = _4976_57c8.w0;
20304 :
20305 : if (di == di.FFFF) {
20306 :
20307 : _4976_57de = 0xff;
20308 :
20309 : _443c_0434();
20310 : }
20311 : else {
20312 : i16 si = _4976_3fc6;
20313 :
20314 : _4976_3fc6 = -1;
20315 :
20316 : _2c1d_06b5(di, 1);
20317 :
20318 : _4976_3fc6 = si;
20319 : }
20320 :
20321 : sk53b4 *bp04 = _4976_53b4;
20322 :
20323 : U16 si;
20324 : for (si = 0; si < _4976_4c3c; si++, bp04++) {
20325 :
20326 : bp04->w50 &= 1023;
20327 :
20328 : WRITE_UI8(_4976_3de2,+si,0xff);
20329 :
20330 : _4976_5342[si] = 0;
20331 :
20332 : _4976_3dde[si] = 0xff;
20333 :
20334 : _4976_5330[si][1] = 0;
20335 :
20336 : _4976_3de6[si][1] = 0xffff;
20337 :
20338 : _4976_5330[si][0] = 0;
20339 :
20340 : _4976_3de6[si][0] = 0xffff;
20341 :
20342 : _4976_5330[si][2] = 0;
20343 :
20344 : }
20345 :
20346 : _2e62_0cd8(0x4000);
20347 :
20348 : si = _4976_3fc6;
20349 :
20350 : if (si == 0xffff)
20351 :
20352 : return;
20353 :
20354 : _4976_3fc6 = -1;
20355 :
20356 : _1031_16a0(si);
20357 :
20358 : return;
20359 : }
20360 :
20361 : _4976_57c8.w0 = ObjectID::FFFF;
20362 : _4976_57de = 0xff;
20363 :
20364 : for (ObjectID di = GET_TILE_RECORD_LINK(0, 0); di != di.FFFE; di = GET_NEXT_RECORD_LINK(di)) {
20365 :
20366 : if (di.DBType() == dbActuator) {
20367 :
20368 : Actuator *bp08 = GET_ADDRESS_OF_RECORD3(di);
20369 :
20370 : if (bp08->ActuatorType() == 0x007e) {
20371 :
20372 : _4976_404b = 1;
20373 :
20374 : _2f3f_0343(0, 1, 0, _4976_4bf4);
20375 :
20376 : _2f3f_04ea(0, 1, 0, _4976_4bf4, 160);
20377 :
20378 : _4976_404b = 0;
20379 :
20380 : _4976_53b4[0].playerDir(U8(_4976_4bf6));
20381 :
20382 : _4976_53b4[0].playerPos(U8(_4976_4bf6));
20383 :
20384 : _2e62_0cd8(0x4000);
20385 :
20386 : _1031_16a0(0);
20387 :
20388 : return;
20389 : }
20390 : }
20391 :
20392 : }
20393 :
20394 : return;
20395 : }
20396 :
20397 :
20398 : void _0cd5_0039(i16 *buff, X16 cnt, i16 val, i16 delta)
20399 : {
20400 :
20401 : ENTER(0);
20402 :
20403 : X16 si = 0;
20404 : delta >>= 1;
20405 :
20406 : for (U16 di = 0; di<cnt; di++) {
20407 :
20408 : buff[si] = val;
20409 : si += delta;
20410 :
20411 : }
20412 :
20413 : return;
20414 : }
20415 :
20416 :
20417 : void _19f0_045a(i16 xx, i16 yy)
20418 : {
20419 :
20420 : ENTER(0);
20421 :
20422 : if (xx == _4976_5216 && yy == _4976_5218 && _4976_0c5a == _4976_0c5a)
20423 :
20424 : return;
20425 :
20426 : _4976_521a = _4976_0c5a;
20427 : _4976_521c = GET_TILE_VALUE(_4976_5216 = xx, _4976_5218 = yy);
20428 :
20429 : _4976_5222 = _4976_5220 = _4976_521e = ((_4976_521c & 0x10) != 0) ? ObjectID::FFFF : ObjectID::FFFE;
20430 : _4976_5224 = _4976_5225 = 0;
20431 : _4976_522c = 0xff;
20432 :
20433 : return;
20434 : }
20435 :
20436 :
20437 : i16 _19f0_0207(X16 xx, X16 yy, X16 ss, X16 tt, U16 (sksave_converter::*comparer)(i16 xx, i16 yy))
20438 : {
20439 :
20440 : ENTER(16);
20441 :
20442 : if (ABS16(xx -ss) + ABS16(yy -tt) <= 1)
20443 :
20444 : return 1;
20445 :
20446 : X16 di = ss -xx;
20447 : di = (di < 0) ? -di : di;
20448 :
20449 : X16 si = (tt -yy);
20450 : si = (si < 0) ? -si : si;
20451 :
20452 : X16 bp08 = (di < si) ? 1 : 0;
20453 :
20454 : X16 bp0e = (di == si) ? 1 : 0;
20455 :
20456 : di = ss;
20457 : i16 bp04 = (di -xx <= 0) ? -1 : 1;
20458 :
20459 : si = tt;
20460 : i16 bp06 = (si -yy <= 0) ? -1 : 1;
20461 :
20462 : i16 bp02;
20463 : i16 bp10;
20464 : if (bp08 != 0) {
20465 :
20466 : bp02 = si -yy;
20467 : bp10 = (bp02 != 0) ? ((di -xx) << 6) / bp02 : 128;
20468 : }
20469 : else {
20470 :
20471 : bp02 = di -xx;
20472 : bp10 = (bp02 != 0) ? ((si -yy) << 6) / bp02 : 128;
20473 : }
20474 :
20475 : _02eb:
20476 : if (bp0e != 0) {
20477 :
20478 : if (true
20479 : && ((this->*comparer)(di +bp04, si) == 0 || (this->*comparer)(di, si +bp06) == 0)
20480 : && ((this->*comparer)(di += bp04, si += bp06) == 0)
20481 : ) {
20482 :
20483 : goto _041e;
20484 : }
20485 :
20486 : goto _041a;
20487 : }
20488 :
20489 : if (bp08 != 0) {
20490 :
20491 : bp02 = si -yy;
20492 : bp02 = ((bp02 != 0) ? ((di +bp04 -xx) << 6) / bp02 : 128) -bp10;
20493 : }
20494 : else {
20495 :
20496 : bp02 = di +bp04 -xx;
20497 : bp02 = ((bp02 != 0) ? ((si -yy) << 6) / bp02 : 128) -bp10;
20498 : }
20499 :
20500 : i16 bp0a = (bp02 < 0) ? -bp02 : bp02;
20501 :
20502 : if (bp08 != 0) {
20503 :
20504 : bp02 = si +bp06 -yy;
20505 : bp02 = ((bp02 != 0) ? ((di -xx) << 6) / bp02 : 128) -bp10;
20506 : }
20507 : else {
20508 :
20509 : bp02 = di -xx;
20510 : bp02 = ((bp02 != 0) ? ((si +bp06 -yy) << 6) / bp02 : 128) -bp10;
20511 : }
20512 :
20513 : i16 bp0c = (bp02 < 0) ? -bp02 : bp02;
20514 :
20515 : if (bp0a < bp0c)
20516 : di += bp04;
20517 : else
20518 : si += bp06;
20519 :
20520 : if (true
20521 : && (this->*comparer)(di, si) != 0
20522 : && (bp0a != bp0c || (this->*comparer)(di += bp04, si -= bp06) != 0)
20523 : ) {
20524 :
20525 : _041a:
20526 : return 0;
20527 : }
20528 :
20529 : _041e:
20530 : if (ABS16(di -xx) + ABS16(si -yy) > 1)
20531 :
20532 : goto _02eb;
20533 :
20534 : return CALC_SQUARE_DISTANCE(xx, yy, ss, tt);
20535 : }
20536 :
20537 :
20538 : U16 _19f0_00b8(i16 xx, i16 yy)
20539 : {
20540 :
20541 : ENTER(8);
20542 :
20543 : U16 bp04 = GET_TILE_VALUE(xx, yy);
20544 : U16 bp02 = bp04 >> 5;
20545 : if (bp02 != 0) {
20546 :
20547 : if (bp02 == ttDoor) {
20548 :
20549 : U16 di = U8(bp04) & 7;
20550 : if (di == 3 || di == 4) {
20551 :
20552 : if (false
20553 : || _0cee_328c(GET_GRAPHICS_FOR_DOOR(GET_ADDRESS_OF_TILE_RECORD(U8(xx), U8(yy))->castToDoor())) == 0
20554 : || RAND01() == 0
20555 : ) {
20556 : goto _01cf;
20557 : }
20558 : }
20559 : }
20560 :
20561 : if (bp02 == ttTrickWall && (bp04 & 4) == 0)
20562 : goto _01cf;
20563 :
20564 : if ((bp04 & 0x10) != 0) {
20565 :
20566 : for (ObjectID si = GET_WALL_TILE_ANYITEM_RECORD(xx, yy); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
20567 :
20568 : U16 bp06 = si.DBType();
20569 : if (bp06 == dbCloud || GET_ADDRESS_OF_RECORDF(si)->CloudType() == 14)
20570 : goto _01cf;
20571 :
20572 : if (bp06 == dbCreature) {
20573 : ObjectID bp08 = _1c9a_03cf(&xx, &yy, 255);
20574 : if (bp08 != bp08.FFFF) {
20575 :
20576 : U16 di = _0cee_2de0(bp08);
20577 : if ((di & 1) != 0) {
20578 :
20579 : if (((di >> 6) & 3) >= 2)
20580 : continue;
20581 : goto _01cf;
20582 : }
20583 :
20584 : if ((di & 0x20) == 0)
20585 : goto _01cf;
20586 : }
20587 : }
20588 :
20589 : }
20590 : }
20591 :
20592 : return 0;
20593 : }
20594 :
20595 : _01cf:
20596 : return 1;
20597 : }
20598 :
20599 :
20600 : ObjectID _19f0_04bf()
20601 : {
20602 :
20603 : ENTER(0);
20604 :
20605 : ObjectID si = _4976_5220;
20606 : if (si == si.FFFF) {
20607 :
20608 : si = _4976_521e;
20609 : if (si == si.FFFF) {
20610 :
20611 : _4976_521e = GET_TILE_RECORD_LINK(_4976_5216, _4976_5218);
20612 :
20613 : }
20614 :
20615 : for (si = _4976_521e; si != si.FFFE && si.DBType() <= dbActuator; si = GET_NEXT_RECORD_LINK(si));
20616 :
20617 : _4976_5220 = si;
20618 : }
20619 :
20620 : return si;
20621 : }
20622 :
20623 :
20624 : U16 _19f0_0559(X16 xx)
20625 : {
20626 :
20627 : ENTER(4);
20628 :
20629 : X16 si = xx;
20630 : X16 bp04 = _4976_4ec6->b15 & 3;
20631 : X16 bp02;
20632 : if ((si +2) == bp04) {
20633 : if (RAND01() != 0)
20634 : goto _059e;
20635 : bp02 = 0xffff;
20636 : }
20637 :
20638 : else if (bp04 != si) {
20639 : if (((si -1) & 3) == bp04)
20640 :
20641 : _059e:
20642 : bp02 = 1;
20643 : else
20644 : bp02 = 0xffff;
20645 : }
20646 : else {
20647 :
20648 : _4976_4ece->b26 = 0;
20649 : _4976_4ee5 = 0xfe;
20650 :
20651 : return 0;
20652 : }
20653 :
20654 : _4976_4ece->b29 = (U8(bp04) +U8(bp02)) & 3;
20655 : _4976_4ece->b26 = (bp02 == 0xffff) ? 6 : 7;
20656 : _4976_4ee5 = 0xfc;
20657 : return 1;
20658 : }
20659 :
20660 :
20661 : void _075f_1bc2(U8 zz[4], U16 xx, U16 yy, i16 ss, i16 tt, X16 ww)
20662 : {
20663 :
20664 : ENTER(2);
20665 :
20666 : X16 di = ww;
20667 : U16 si = CALC_VECTOR_DIR(xx, yy, ss, tt);
20668 :
20669 : if (di == 255) {
20670 :
20671 : COPY_MEMORY(&_4976_00dc[si], zz, 4);
20672 : if (RAND01() != 0) {
20673 :
20674 : U8 bp01 = zz[0];
20675 : zz[0] = zz[1];
20676 : zz[1] = bp01;
20677 : }
20678 :
20679 : if (RAND01() != 0) {
20680 : U8 bp01 = zz[2];
20681 : zz[2] = zz[3];
20682 : zz[3] = bp01;
20683 : }
20684 : return;
20685 : }
20686 :
20687 : si <<= 1;
20688 : if ((si & 2) == 0)
20689 : di++;
20690 :
20691 : si += (di >> 1) & 1;
20692 : COPY_MEMORY(&_4976_00bc[si], zz, 4);
20693 :
20694 : return;
20695 : }
20696 :
20697 :
20698 : i16 _2c1d_028c(i16 xx, i16 yy, X16 ww)
20699 : {
20700 :
20701 : ENTER(4);
20702 :
20703 : if (_4976_4c3c != 0) {
20704 :
20705 : if (ABS16(xx - _4976_4c2e) + ABS16(yy - _4976_4c30) <= 1) {
20706 :
20707 : U8 bp04[4];
20708 : _075f_1bc2(bp04, _4976_4c2e, _4976_4c30, xx, yy, ww);
20709 :
20710 : for (U16 si = 0; si < 4; si++) {
20711 :
20712 : i16 di = GET_PLAYER_AT_POSITION(bp04[si]);
20713 : if (di < 0)
20714 : continue;
20715 : return di;
20716 :
20717 : }
20718 : }
20719 : }
20720 :
20721 : return -1;
20722 : }
20723 :
20724 :
20725 : U32 _1c9a_0551(U32 val, U16 cnt)
20726 : {
20727 :
20728 : ENTER(4);
20729 :
20730 : X32 bp04 = 1;
20731 : for (i16 si = 0; si < 32; si++, bp04 <<= 1) {
20732 :
20733 : if ((val & bp04) != 0 && --cnt == 0) {
20734 : break;
20735 : }
20736 : }
20737 :
20738 : return bp04;
20739 : }
20740 :
20741 :
20742 : U16 _1c9a_0598(U32 val)
20743 : {
20744 :
20745 : ENTER(0);
20746 :
20747 : i16 di = 0;
20748 : U16 si = 0;
20749 : for (; val != 0 && di < 32; di++, val >>= 1) {
20750 :
20751 : if ((U16(val) & 1) != 0)
20752 : si++;
20753 : }
20754 :
20755 : return si;
20756 : }
20757 :
20758 :
20759 : U16 _19f0_0891(i16 zz, X16 xx, X16 yy, i16 ss, X16 tt, X16 ww)
20760 : {
20761 :
20762 : ENTER(18);
20763 :
20764 : i16 di = ss;
20765 : X16 bp02 = zz & 0x80;
20766 : if (bp02 != 0)
20767 : zz &= 0xff7f;
20768 :
20769 : U16 si = _4976_4eee;
20770 : if (si != 0) {
20771 :
20772 : if (di == 0xffff) {
20773 :
20774 : di = xx + _4976_0232[ww];
20775 : tt = yy + _4976_023a[ww];
20776 : }
20777 :
20778 : if (di >= 0 && di < _4976_4dd2 && tt >= 0 && tt < _4976_4dd4 && (xx -di == 0 || yy -tt == 0)) {
20779 :
20780 : i16 bp04 = CALC_SQUARE_DISTANCE(xx, yy, di, tt);
20781 : if (bp04 <= 1 || (si &= 0x0ff8) != 0) {
20782 :
20783 : if (bp04 != 0 || (si &= 7) != 0) {
20784 :
20785 : if (_4976_4eca->w20_c_f() >= U16(bp04)) {
20786 :
20787 : if (bp04 == 0) {
20788 : for (i16 bp0e = 0; bp0e < 4; bp0e++) {
20789 :
20790 : X16 bp0a = xx;
20791 : X16 bp0c = yy;
20792 : bp0a += _4976_0232[bp0e];
20793 : bp0c += _4976_023a[bp0e];
20794 : if (_19f0_1522(0, xx, yy, bp0a, bp0c, bp0e) != 0)
20795 : break;
20796 :
20797 : }
20798 :
20799 : if (bp0e < 4)
20800 : goto _0ccf;
20801 : }
20802 :
20803 : switch (zz) {
20804 : case 2:
20805 :
20806 : _19f0_045a(di, tt);
20807 : if (_19f0_050f() == ObjectID::FFFE)
20808 : goto _0ccf;
20809 : break;
20810 :
20811 : case 0:
20812 : case 1:
20813 :
20814 : if (_4976_0c5a != _4976_5232 || di != _4976_5236 || tt != _4976_5238)
20815 : goto _0ccf;
20816 : break;
20817 :
20818 : default:
20819 : break;
20820 : }
20821 :
20822 : if (bp04 <= 1 || _19f0_0207(xx, yy, di, tt, _19f0_00b8) != 0) {
20823 :
20824 : if ((_4976_3752[_4976_4efa] & 0x200) != 0) {
20825 :
20826 : _19f0_045a(di, tt);
20827 :
20828 : for (ObjectID bp10 = _19f0_04bf(); bp10 != bp10.FFFE; bp10 = GET_NEXT_RECORD_LINK(bp10)) {
20829 :
20830 : if (bp10.DBType() == dbCloud) {
20831 : if (GET_ADDRESS_OF_RECORDF(bp10)->CloudType() == 14) {
20832 : si += 7;
20833 : if (si != 0)
20834 : break;
20835 : goto _0ccf;
20836 : }
20837 : }
20838 :
20839 : }
20840 :
20841 : }
20842 :
20843 : if (bp02 != 0) {
20844 :
20845 : if (ww == 0xffff) {
20846 :
20847 : if (bp04 == 0 && _4976_0c5a == _4976_5232 && di == _4976_5236 && tt == _4976_5238) {
20848 :
20849 : ww = (_4976_4bf6 +2) & 3;
20850 : }
20851 : else {
20852 :
20853 : ww = CALC_VECTOR_DIR(xx, yy, di, tt);
20854 : }
20855 : }
20856 :
20857 : X16 bp08;
20858 : X16 bp06;
20859 : if (_19f0_0559(ww) == 0) {
20860 :
20861 : bp08 = RAND01();
20862 : if (bp04 <= 1 && (si & 7) != 0 && ((si & 0xff8) == 0 || RAND01() != 0)) {
20863 :
20864 : si &= 7;
20865 : if (zz <= 1) {
20866 :
20867 : bp06 = _2c1d_028c(xx, yy, 0x00ff);
20868 : if (bp06 != 0xffff) {
20869 :
20870 : bp06 = _4976_53b4[bp06].playerPos();
20871 : goto _0bae;
20872 : }
20873 : }
20874 :
20875 : bp06 = (bp08 +ww +2) & 3;
20876 : goto _0bae;
20877 : }
20878 :
20879 : si &= 0xff8;
20880 : if (zz <= 1 && RAND02() != 0) {
20881 :
20882 : bp08 = RAND01();
20883 : bp06 = (bp08 != 0) ? ((ww +2) & 3) : ww;
20884 :
20885 : if (GET_PLAYER_AT_POSITION(bp06) -1) {
20886 : if (GET_PLAYER_AT_POSITION((bp06 +3) & 3) == -1) {
20887 :
20888 : bp08 = 1 -bp08;
20889 : }
20890 : }
20891 : }
20892 :
20893 : bp06 = (ww +3) & 3;
20894 :
20895 : _0bae:
20896 :
20897 : si = _1c9a_0551(si, RAND16(_1c9a_0598(si)) +1);
20898 : X16 bp12 = si;
20899 :
20900 : switch (bp12) {
20901 : case 0x0002:
20902 :
20903 : _4976_4ece->b26 = 0x26;
20904 : break;
20905 : case 0x0001:
20906 :
20907 : _4976_4ece->b26 = 0x08;
20908 : break;
20909 : case 0x0004:
20910 :
20911 : _4976_4ece->b26 = 0x0a;
20912 : _4976_4ece->b30 = 0x0b;
20913 : break;
20914 : case 0x0010:
20915 :
20916 : bp04 = i16(0xff80);
20917 : goto _0c4a;
20918 : case 0x0020:
20919 :
20920 : bp04 = i16(0xff83);
20921 : goto _0c4a;
20922 : case 0x0040:
20923 :
20924 : bp04 = i16(0xff82);
20925 : goto _0c4a;
20926 : case 0x0080:
20927 :
20928 : bp04 = i16(0xff87);
20929 : goto _0c4a;
20930 : case 0x0100:
20931 :
20932 : bp04 = i16(0xff86);
20933 : goto _0c4a;
20934 : case 0x0400:
20935 :
20936 : bp04 = i16(0xff89);
20937 : goto _0c4a;
20938 : case 0x0800:
20939 :
20940 : bp04 = i16(0xff8a);
20941 : goto _0c4a;
20942 : case 0x0200:
20943 : bp04 = i16(0xff81);
20944 :
20945 : _0c4a:
20946 : _4976_4ece->b30 = U8(bp04);
20947 : _4976_4ece->b26 = (bp08 != 0) ? 0x28 : 0x27;
20948 : break;
20949 : case 0x0008:
20950 :
20951 : _4976_4ece->b26 = (bp08 != 0) ? 0x0f : 0x0e;
20952 : break;
20953 : }
20954 :
20955 : _4976_4ece->w24.SetX(di);
20956 : _4976_4ece->w24.SetY(tt);
20957 : _4976_4ece->w24.SetMap(_4976_0c5a);
20958 :
20959 : _4976_4ece->b27 = U8(ww);
20960 : _4976_4ece->b28 = U8(bp06);
20961 : _4976_4ece->b32 = U8(zz);
20962 : _4976_4ee5 = 0xfc;
20963 : }
20964 : }
20965 :
20966 : return 1;
20967 : }
20968 : }
20969 : }
20970 : }
20971 : }
20972 : }
20973 :
20974 : _0ccf:
20975 : if (bp02 != 0)
20976 : _4976_4ee5 = 0xfd;
20977 : return 0;
20978 : }
20979 :
20980 :
20981 : X16 _19f0_0547(ObjectID rl, X16 xx)
20982 : {
20983 :
20984 : ENTER(0);
20985 :
20986 : return _1c9a_0006(rl, xx);
20987 : }
20988 :
20989 :
20990 : U16 _19f0_01d6(i16 xx, i16 yy)
20991 : {
20992 :
20993 : ENTER(0);
20994 :
20995 : if (_4976_0c5a == _4976_5232 && xx == _4976_5236 && yy == _4976_5238)
20996 :
20997 : return 1;
20998 :
20999 : return _19f0_00b8(xx, yy);
21000 : }
21001 :
21002 :
21003 : i16 _19f0_05e8(X16 aa, skxxxb (*bb)[1][32], Ax3 *cc, i16 xx, i16 yy, i16 zz, X16 ww)
21004 : {
21005 :
21006 : ENTER(16);
21007 :
21008 : i16 si = zz;
21009 : i16 bp06 = ((_4976_4eee & 0xff8) == 0) ? (_4976_4eca->w20 >> 12) : 1;
21010 : i16 bp08 = 0;
21011 : if (si == -1)
21012 : si = 0, bp08 = 3;
21013 :
21014 : i16 bp04;
21015 : i16 bp02;
21016 : i16 di;
21017 : do {
21018 : bp02 = xx;
21019 : di = yy;
21020 : for (bp04 = 0; bp04 < bp06; bp04++) {
21021 :
21022 : bp02 += _4976_0232[si];
21023 : di += _4976_023a[si];
21024 :
21025 : if (bp02 < 0 || bp02 >= _4976_4dd2 || di < 0 || di >= _4976_4dd4)
21026 :
21027 : continue;
21028 :
21029 : U8 bp0d = GET_TILE_VALUE(bp02, di);
21030 : ObjectID bp10;
21031 : if ((bp0d & 0x10) != 0) {
21032 :
21033 : if ((bp0d >> 5) == ttWall) {
21034 :
21035 : if (ww == 0)
21036 : break;
21037 :
21038 : for (bp10 = GET_TILE_RECORD_LINK(bp02, di); bp10 != bp10.FFFE; bp10 = GET_NEXT_RECORD_LINK(bp10)) {
21039 :
21040 : if (bp10.DBType() == dbActuator || bp10.DBType() == dbText) {
21041 :
21042 : if (bp10.Dir() == ((si +2) & 3)) {
21043 :
21044 : U8 bp0e = QUERY_CLS2_FROM_RECORD(bp10);
21045 : if (bp0e != 0xff) {
21046 :
21047 : if (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp0e, dtWordValue, 0xf0) == aa)
21048 : goto _0783;
21049 : }
21050 : }
21051 : }
21052 :
21053 : }
21054 :
21055 : continue;
21056 : }
21057 :
21058 : if (ww == 0 && (_4976_4ee0 != bp02 || _4976_4ee1 != di) && (bp10 = GET_CREATURE_AT(bp02, di)) != ObjectID::FFFF) {
21059 :
21060 : if (_19f0_0547(bp10, aa) != 0)
21061 : goto _0783;
21062 : }
21063 : }
21064 :
21065 : if (bb[bp02][di]->b0 != 0 || _19f0_01d6(bp02, di) != 0)
21066 : break;
21067 :
21068 : }
21069 :
21070 : si++;
21071 : } while (--bp08 >= 0);
21072 :
21073 : goto _088b;
21074 :
21075 : _0783:
21076 : bp08 = bb[xx][yy]->b0;
21077 : si += 2;
21078 : si &= 3;
21079 : while (++bp04 < bp06) {
21080 :
21081 : U8 bp0a = U8(xx);
21082 : U8 bp0c = U8(yy);
21083 : xx += _4976_0232[si];
21084 : yy += _4976_023a[si];
21085 : U8 bp0d = bb[xx][yy]->b0;
21086 :
21087 : if (bp0d != 0 && bp0d <= bp08) {
21088 :
21089 : if (_19f0_01d6(xx, yy) == 0)
21090 : continue;
21091 : }
21092 :
21093 : xx = bp0a;
21094 : yy = bp0c;
21095 : break;
21096 :
21097 : }
21098 :
21099 : si += 2;
21100 : si &= 3;
21101 : if (_19f0_0891((ww != 0) ? 3 : 2, xx, yy, bp02, di, si) != 0) {
21102 :
21103 : _19f0_045a(xx, yy);
21104 : cc->SetX(bp02);
21105 : cc->SetY(di);
21106 : cc->SetMap(_4976_0c5a);
21107 :
21108 : return 1;
21109 : }
21110 :
21111 : _088b:
21112 : return 0;
21113 : }
21114 :
21115 :
21116 : i16 _1c9a_1b16(X16 xx, X16 yy)
21117 : {
21118 :
21119 : ENTER(6);
21120 :
21121 : ObjectID si = _4976_521e;
21122 : if (si == si.FFFF) {
21123 :
21124 : _4976_521e = GET_TILE_RECORD_LINK(_4976_5216, _4976_5218);
21125 : si = _4976_521e;
21126 : }
21127 : X16 bp06;
21128 : for (; si != si.FFFE && (bp06 = si.DBType()) <= dbActuator; si = GET_NEXT_RECORD_LINK(si)) {
21129 :
21130 : if (bp06 == dbText) {
21131 :
21132 : Text *bp04 = GET_ADDRESS_OF_RECORD2(si);
21133 :
21134 : if (bp04->TextMode() == 2 && bp04->w2_c_f() == xx && bp04->w2_8_b() == yy) {
21135 :
21136 : return bp04->w2_3_7();
21137 : }
21138 : }
21139 :
21140 : }
21141 :
21142 : return -1;
21143 : }
21144 :
21145 :
21146 : i16 _1c9a_1a48(X16 xx, X16 yy)
21147 : {
21148 :
21149 : ENTER(8);
21150 :
21151 : X16 bp08 = (xx == 1) ? 2 : -1;
21152 :
21153 : ObjectID si = _4976_521e;
21154 : if (si == si.FFFF) {
21155 :
21156 : _4976_521e = GET_TILE_RECORD_LINK(_4976_5216, _4976_5218);
21157 : si = _4976_521e;
21158 : }
21159 :
21160 : X16 bp06;
21161 : for (; si != si.FFFE && (bp06 = si.DBType()) <= dbActuator; si = GET_NEXT_RECORD_LINK(si)) {
21162 :
21163 : if (bp06 == dbText) {
21164 : Text *bp04 = GET_ADDRESS_OF_RECORD2(si);
21165 : if (bp04->TextMode() == 2) {
21166 : if (true
21167 : && ((bp04->w2_c_f() == xx) || (bp04->w2_c_f() == bp08 && bp04->TextVisibility() != 0))
21168 : && (bp08 & (1 << bp04->w2_8_b())) != 0
21169 : ) {
21170 :
21171 : return bp04->w2_3_7();
21172 : }
21173 : }
21174 : }
21175 :
21176 : }
21177 :
21178 : return -1;
21179 : }
21180 :
21181 :
21182 : X16 _19f0_0081(i16 xx, i16 yy)
21183 : {
21184 :
21185 : ENTER(0);
21186 :
21187 : U16 si = GET_TILE_VALUE(xx, yy);
21188 : U16 di = si >> 5;
21189 : return (di == ttWall || di == ttTrickWall || (si & 5) == 0) ? 1 : 0;
21190 : }
21191 :
21192 :
21193 : X16 _19f0_1511(ObjectID rl)
21194 : {
21195 :
21196 : ENTER(0);
21197 :
21198 : return _1c9a_0006(rl, 9);
21199 : }
21200 :
21201 :
21202 : X16 _075f_1791(ObjectID rlxx, ObjectID rlyy)
21203 : {
21204 :
21205 : ENTER(12);
21206 :
21207 : Cloud *bp04 = GET_ADDRESS_OF_RECORDF(rlxx);
21208 : i16 si = 0;
21209 : U16 bp0a = bp04->CloudType();
21210 :
21211 : if (bp0a >= 8)
21212 : return si;
21213 :
21214 : U8 bp0b = _4976_00b4[bp0a];
21215 : if (bp0b == 0)
21216 : return si;
21217 :
21218 : GenericRecord *bp08;
21219 : U16 di;
21220 : if (rlyy == rlyy.FFFF) {
21221 : if ((bp0b & 4) == 0)
21222 : return si;
21223 : }
21224 : else {
21225 :
21226 : di = rlyy.DBType();
21227 : if (di == dbDoor && (bp0b & 2) != 0) {
21228 :
21229 : bp08 = GET_ADDRESS_OF_RECORD(rlyy);
21230 : }
21231 : else {
21232 :
21233 : if (di != dbCreature)
21234 : return si;
21235 :
21236 : if ((bp0b & 8) == 0)
21237 : return si;
21238 : }
21239 : }
21240 :
21241 : if (di == dbCreature && (QUERY_CREATURE_AI_SPEC_FROM_RECORD(rlyy)->w24 & 0x1000) != 0 && bp0a != 0)
21242 : return si;
21243 :
21244 : si = bp04->b3_0_f();
21245 : if ((bp0b & 1) != 0) {
21246 :
21247 : si = (bp04->b3_0_f() >> 1) +1;
21248 : si = RAND16(si) +si +1;
21249 : }
21250 :
21251 : switch (bp0a) {
21252 : case 2:
21253 :
21254 : si >>= 1;
21255 : goto _187e;
21256 : case 0:
21257 :
21258 : _187e:
21259 : if (di == 0 && bp08->castToDoor()->DestroyablebyFireball() == 0)
21260 : si = 0;
21261 : break;
21262 : case 3:
21263 :
21264 : if ((_0cee_2de0(rlyy) & 0x20) == 0)
21265 : si = 0;
21266 : break;
21267 : case 7:
21268 :
21269 : si = max_value(1, min_value(bp04->b3_5_f(), 4) + RAND01());
21270 : if (di == 4) {
21271 : si = _1c9a_198e(rlyy, si);
21272 : }
21273 : case 1:
21274 : case 4:
21275 : case 5:
21276 : case 6:
21277 : break;
21278 : }
21279 :
21280 : return si;
21281 : }
21282 :
21283 :
21284 : X16 _19f0_13aa(i16 xx, i16 yy)
21285 : {
21286 :
21287 : ENTER(10);
21288 :
21289 : i16 bp08 = 0;
21290 : do {
21291 :
21292 : if ((_4976_3752[_4976_4efa] & 0x400) != 0 || ((_4976_4ec6->w10 & 0x80) == 0 && ((_4976_4eca->w0 & 4) != 0 || _4976_4ee0 != xx || _4976_4ee1 != yy || ((_4976_4ec6->b15_0_2() +2) & 3) != bp08) || (RAND() & 7) == 0)) {
21293 :
21294 : i16 di = xx;
21295 : i16 si = yy;
21296 : for (i16 bp0a = 0; bp0a++ < 3; ) {
21297 :
21298 : di += _4976_0232[bp08];
21299 : si += _4976_023a[bp08];
21300 :
21301 : if (di < 0 || di >= _4976_4dd2 || si < 0 || si >= _4976_4dd4)
21302 : break;
21303 :
21304 : for (ObjectID bp06 = GET_WALL_TILE_ANYITEM_RECORD(di, si); bp06 != bp06.FFFE; bp06 = GET_NEXT_RECORD_LINK(bp06)) {
21305 :
21306 : if (bp06.DBType() == dbMissile) {
21307 : Missile *bp04 = GET_ADDRESS_OF_RECORDE(bp06);
21308 : if (_4976_5c20[bp04->TimerIndex()].b9_2_3() == ((bp08 +2) & 3) && _075f_06bd(bp04, bp04->GetMissileObject()) != 0) {
21309 :
21310 : return 1;
21311 : }
21312 : }
21313 :
21314 : }
21315 :
21316 : if (_4976_4ee0 != di || _4976_4ee1 != si) {
21317 :
21318 : if (_19f0_00b8(di, si) != 0)
21319 : continue;
21320 : }
21321 :
21322 : }
21323 : }
21324 :
21325 : } while (++bp08 < 4);
21326 :
21327 : return 0;
21328 : }
21329 :
21330 :
21331 : i16 _19f0_1522(X16 aa, i16 xx, i16 yy, i16 ss, i16 tt, i16 ww)
21332 : {
21333 :
21334 : ENTER(50);
21335 :
21336 : i16 di = ss;
21337 : X16 bp1a = 0;
21338 : X16 bp16 = 0;
21339 : X16 bp22 = 0;
21340 : X16 bp24 = 0;
21341 : X16 bp1c = aa & 0x80;
21342 : i16 bp08;
21343 : if (bp1c != 0)
21344 : bp08 = -1;
21345 :
21346 : X16 bp1e = aa & 0x40;
21347 : X16 bp20 = aa & 0x20;
21348 : aa &= 0xff1f;
21349 :
21350 : i16 bp0c;
21351 : X16 bp18;
21352 : U16 bp06;
21353 : i16 bp14;
21354 : if (aa == 2) {
21355 : X16 bp28 = (aa == 3 || aa == 7) ? 1 : 0;
21356 : if (bp28 == 0 && _4976_4eec == 0)
21357 : goto _1df6;
21358 :
21359 : bp0c = tt;
21360 : if (ww == 6) {
21361 :
21362 : bp18 = 0;
21363 : bp0c = _4976_4ec6->b15 & 3;
21364 : goto _1811;
21365 : }
21366 :
21367 : if (ww < 4)
21368 : goto _17af;
21369 :
21370 : bp18 = 0;
21371 : if ((_4976_4eec & 0x2000) == 0)
21372 : goto _1df6;
21373 :
21374 : X16 si = 0;
21375 : bp06 = GET_TILE_VALUE(xx, yy);
21376 : GenericRecord *_bp2e;
21377 : switch (bp06 >> 5) {
21378 : case ttPit:
21379 :
21380 : if (ww == 5 && (bp06 & 8) != 0 && (bp06 & 1) == 0) {
21381 :
21382 : si = 8;
21383 : bp08 = 0x38;
21384 : bp0c = _4976_4ec6->b15_0_2();
21385 : break;
21386 : }
21387 : goto _161f;
21388 : case ttFloor:
21389 : case ttTeleporter:
21390 : case ttTrickWall:
21391 :
21392 : _161f:
21393 : if ((bp06 & 2) == 0)
21394 : break;
21395 :
21396 : bp0c = _0cee_073e(xx, yy, (ww == 4) ? -1 : 1, &_bp2e);
21397 : if (bp0c >= 0) {
21398 : bp08 = (ww == 4) ? 0x39 : 0x3a;
21399 : si = 0x100;
21400 : break;
21401 : }
21402 :
21403 : bp08 = 0x37;
21404 : si = 0x10;
21405 : bp0c = _4976_4ec6->b15_0_2();
21406 : break;
21407 : case ttStairs:
21408 :
21409 : if ((bp06 & 4) != 0) {
21410 : if (ww != 4)
21411 : break;
21412 :
21413 : bp08 = 0x35;
21414 : goto _169f;
21415 : }
21416 : if (ww == 5) {
21417 : bp08 = 0x36;
21418 : _169f:
21419 : bp0c = (_0cee_06dc(xx, yy) +2) & 3;
21420 : si = 0x100;
21421 : }
21422 : break;
21423 : case ttDoor:
21424 : break;
21425 : }
21426 :
21427 : if ((_4976_4eec & si) == 0)
21428 : goto _1df6;
21429 : bp14 = _4976_0c5a;
21430 :
21431 : i16 bp0e;
21432 : if ((_bp2e != NULL) && (bp08 == 0x39 || bp08 == 0x3a)) {
21433 :
21434 : Actuator *bp2e = _bp2e->castToActuator();
21435 : xx = bp2e->Xcoord();
21436 : yy = bp2e->Ycoord();
21437 : bp0e = bp2e->ActuatorData();
21438 : }
21439 : else {
21440 :
21441 : bp0e = _0cee_0510(_4976_0c5a, (ww == 4) ? -1 : 1, &xx, &yy, NULL);
21442 : if (bp0e < 0)
21443 : goto _1df6;
21444 : if (bp08 == 0x37) {
21445 :
21446 : bp06 = _4976_4ca8[bp0e][xx][yy];
21447 : if ((bp06 >> 5) != 2 || (bp06 & 8) == 0)
21448 : goto _1df6;
21449 : }
21450 : }
21451 :
21452 : if (IS_CREATURE_ALLOWED_ON_LEVEL(_4976_4ec4, bp0e) == 0)
21453 : goto _1df6;
21454 :
21455 : bp16 = 1;
21456 : _1c9a_0648(bp0e);
21457 : di = xx;
21458 : tt = yy;
21459 : yy = xx = -1;
21460 :
21461 : goto _1811;
21462 :
21463 : _17af:
21464 : if (di == -1) {
21465 : bp18 = 0;
21466 : di = xx + _4976_0232[ww];
21467 : tt = yy + _4976_023a[ww];
21468 : }
21469 : else {
21470 :
21471 : bp18 = (xx == di && yy == tt) ? 1 : 0;
21472 : if (bp18 == 0 && ww == -1) {
21473 :
21474 : ww = bp0c = CALC_VECTOR_DIR(xx, yy, di, tt);
21475 : }
21476 : }
21477 :
21478 : _1811:
21479 : if (di < 0 || di >= _4976_4dd2 || tt < 0 || tt >= _4976_4dd4)
21480 : goto _1df6;
21481 :
21482 : if (bp28 != 0) {
21483 : if (aa == 3) {
21484 :
21485 : bp1a = _19f0_0081(di, tt);
21486 : }
21487 :
21488 : else if (aa == 7) {
21489 : bp1a = !_19f0_000a(di, tt);
21490 : }
21491 :
21492 : if (bp1a == 0)
21493 : goto _1df6;
21494 :
21495 : _19f0_045a(di, tt);
21496 : goto _1df6;
21497 : }
21498 :
21499 : _19f0_045a(di, tt);
21500 : i16 bp2a;
21501 : if (_4976_4ef8 == 0 || ww == 6 || (bp2a = _1c9a_1a48(1, _4976_4ef8)) == -1 || (bp2a & (1 << ((ww +2) & 3))) == 0) {
21502 :
21503 : if ((aa == 4 || aa == 5) && (_4976_4eca->b2 == 0xff))
21504 :
21505 : aa = 0;
21506 :
21507 : bp06 = _4976_521c;
21508 : switch (bp06 >> 5) {
21509 : case ttWall:
21510 :
21511 : si = 1;
21512 : break;
21513 : case ttFloor:
21514 :
21515 : goto _1a94;
21516 : case ttPit:
21517 :
21518 : if ((bp06 & 8) != 0) {
21519 : if ((bp06 & 1) != 0) {
21520 : si = 0x8024;
21521 : break;
21522 : }
21523 : if (bp16 != 0) {
21524 : si = 0x000c;
21525 : break;
21526 : }
21527 : si = 0x800c;
21528 : break;
21529 : }
21530 : si = 6;
21531 : break;
21532 : case ttStairs:
21533 :
21534 : si = 0x100;
21535 : break;
21536 : case ttDoor:
21537 : {
21538 :
21539 : bp06 &= 7;
21540 : if (bp06 == 0 && aa != 4 && aa != 5)
21541 : goto _1a94;
21542 : if (bp06 == 5)
21543 : goto _1a94;
21544 : if (bp06 == 4)
21545 : goto _19f9;
21546 :
21547 : if (_4976_521e == ObjectID::FFFF) {
21548 :
21549 : _4976_521e = GET_TILE_RECORD_LINK(di, tt);
21550 : }
21551 : Door *bp04 = GET_ADDRESS_OF_RECORD0(_4976_521e);
21552 : if (bp1e != 0) {
21553 :
21554 : if (bp04->b3_2_2() != 0) {
21555 : if (bp04->b3_1_1() != 0)
21556 : goto _1a94;
21557 : si = 0x4200;
21558 : break;
21559 : }
21560 : }
21561 :
21562 : if (bp04->b3_2_2() != 0 && bp04->b3_1_1() == 0) {
21563 : si = 0x200;
21564 : break;
21565 : }
21566 :
21567 : if (((bp04->OpeningDir() != 0) ? _4976_4eca->w0_6_7() : 1) < bp06) {
21568 :
21569 : _19f9:
21570 : si = 0x4200;
21571 : break;
21572 : }
21573 :
21574 : si = 2;
21575 : break;
21576 : }
21577 : case ttTeleporter:
21578 : {
21579 :
21580 : if ((bp06 & 8) == 0) {
21581 : if (GET_TELEPORTER_DETAIL(&_4976_5226, U8(di), U8(tt)) != 0) {
21582 :
21583 : _4976_5225 = 1;
21584 : if (IS_CREATURE_ALLOWED_ON_LEVEL(_4976_4ec4, _4976_5226.b4) == 0)
21585 : goto _1df6;
21586 : si = 0x2000;
21587 : break;
21588 : }
21589 :
21590 : si = 0x402;
21591 : break;
21592 : }
21593 :
21594 : if (_4976_521e == ObjectID::FFFF) {
21595 : _4976_521e = GET_TILE_RECORD_LINK(di, tt);
21596 : }
21597 : bp06 = GET_ADDRESS_OF_RECORD1(_4976_521e)->Scope();
21598 : if (bp06 == 1 || bp06 == 3) {
21599 :
21600 : si = 0x400;
21601 : break;
21602 : }
21603 :
21604 : si = 2;
21605 : break;
21606 : }
21607 : case ttTrickWall:
21608 : {
21609 :
21610 : if ((bp06 & 4) != 0) {
21611 : _1a94:
21612 : si = 2;
21613 : break;
21614 : }
21615 :
21616 : if ((bp06 & 1) != 0) {
21617 : si = 0x80;
21618 : break;
21619 : }
21620 :
21621 : si = 0x40;
21622 : break;
21623 : }
21624 : case 7:
21625 : goto _1df6;
21626 : }
21627 :
21628 : si &= _4976_4eec;
21629 : if (si != 0) {
21630 :
21631 : if (aa == 1 || ABS16(di - _4976_5236) + ABS16(tt - _4976_5238) > 1) {
21632 :
21633 : X16 bp0a;
21634 : bp0a = 0;
21635 : if (_4976_0c5a == _4976_5232 && di == _4976_5236 && tt == _4976_5238)
21636 : bp0a = 0x800;
21637 :
21638 : if (bp18 == 0) {
21639 : ObjectID bp12;
21640 : bp12 = _19f0_050f();
21641 : if (bp12 != bp12.FFFE) {
21642 :
21643 : if (bp1e == 0 || QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp12)->w10 == 0) {
21644 :
21645 : if (bp20 == 0 || bp16 != 0 || (bp22 = _19f0_1511(bp12)) == 0) {
21646 :
21647 : bp0a |= 0x1000;
21648 : }
21649 : }
21650 : }
21651 : }
21652 :
21653 : if ((bp0a & _4976_4eec) == bp0a) {
21654 : if (aa == 4 || aa == 5) {
21655 :
21656 : ObjectID bp12;
21657 : for (bp12 = _19f0_04bf(); bp12 != bp12.FFFE; bp12 = GET_NEXT_RECORD_LINK(bp12)) {
21658 :
21659 : X16 bp10 = 0;
21660 : bp06 = bp12.DBType();
21661 : if (bp06 == dbCloud) {
21662 :
21663 : U16 bp26 = GET_ADDRESS_OF_RECORDF(bp12)->CloudType();
21664 : if (bp26 == 7) {
21665 :
21666 : bp10 = _075f_1791(bp12, _4976_4ec4);
21667 : }
21668 : else {
21669 :
21670 : if (bp26 == 14)
21671 : bp24 = 1;
21672 : }
21673 : }
21674 :
21675 : else if (bp06 == dbMissile) {
21676 :
21677 : if (_4976_4ee0 != di || _4976_4ee1 != tt) {
21678 :
21679 : Missile *bp04 = GET_ADDRESS_OF_RECORDE(bp12);
21680 : bp2a = (ww == 6) ? bp0c : ww;
21681 : if (_4976_5c20[bp04->TimerIndex()].b9_2_3() != bp2a) {
21682 :
21683 : bp10 = _075f_06bd(bp04, bp04->GetMissileObject());
21684 : }
21685 : }
21686 : }
21687 :
21688 : if (bp10 != 0)
21689 : goto _1df6;
21690 :
21691 : }
21692 :
21693 : if (aa == 5 && bp24 == 0 && _19f0_13aa(di, tt) != 0)
21694 : goto _1df6;
21695 : }
21696 :
21697 : bp1a = 1;
21698 : if (bp16 != 0 || si == 0x400) {
21699 :
21700 : _2fcf_0434(_4976_4ec4, xx, yy, di, tt, 0);
21701 : if (_4976_0c5a == _4976_581c && di == _4976_5826 && tt == _4976_5828)
21702 : goto _1df6;
21703 :
21704 : bp0e = _4976_0c5a;
21705 : if (bp0e != _4976_581c) {
21706 : if ((_4976_4eec & 0x2000) == 0 || IS_CREATURE_ALLOWED_ON_LEVEL(_4976_4ec4, _4976_581c) == 0) {
21707 :
21708 : bp1a = 0;
21709 : goto _1df6;
21710 : }
21711 :
21712 : _1c9a_0648(_4976_581c);
21713 : }
21714 :
21715 : bp1a = _19f0_1522(aa | bp1e, _4976_5826, _4976_5828, _4976_5826, _4976_5828, 6);
21716 : _1c9a_0648(bp0e);
21717 : goto _1df6;
21718 : }
21719 :
21720 : if (bp18 == 0) {
21721 :
21722 : if (si == 0x4000) {
21723 : return _19f0_0d10(bp1c, xx, yy, di, tt, bp0c);
21724 : }
21725 :
21726 : if ((si & 0x8000) != 0) {
21727 : if (aa == 6) {
21728 :
21729 : bp0a = _4976_4eec;
21730 : _4976_4eec &= 0x7DB7;
21731 :
21732 : bp1a = _19f0_1522(aa | bp1e, di, tt, di + _4976_0232[bp0c], tt + _4976_023a[bp0c], bp0c);
21733 : _4976_4eec = bp0a;
21734 : }
21735 :
21736 : if (bp1a == 0 && (_4976_4eec & 8) != 0) {
21737 : _4976_4eec &= 0x7FFF;
21738 : bp1a = _19f0_1522(aa | bp1e, xx, yy, di, tt, bp0c);
21739 : if (bp1a != 0)
21740 : bp08 = 0x38;
21741 : _4976_4eec = bp0a;
21742 : }
21743 :
21744 : if (bp1a == 0)
21745 : _4976_5224 = 1;
21746 : }
21747 : }
21748 : }
21749 : }
21750 : }
21751 : }
21752 : }
21753 :
21754 : _1df6:
21755 : if (bp1c != 0 && bp1a != 0 && bp18 == 0 && (bp22 == 0 || _19f0_0891(0x82, xx, yy, di, tt, -1) == 0)) {
21756 :
21757 : if ((_4976_4ef0 & 0x20) == 0) {
21758 :
21759 : for (bp06 = 0; bp06 <= 3; bp06++) {
21760 :
21761 : if (bp06 != bp0c) {
21762 : X16 bp30 = xx + _4976_0232[bp06];
21763 : X16 bp32 = yy + _4976_023a[bp06];
21764 : if ((GET_TILE_VALUE(bp30, bp32) >> 5) == ttDoor) {
21765 :
21766 : if (_19f0_0d10(0x82, xx, yy, bp30, bp32, bp06) != 0)
21767 : goto _1ff2;
21768 : }
21769 : }
21770 :
21771 : }
21772 : }
21773 :
21774 : if (aa == 6) {
21775 : bp0c += 2;
21776 : bp0c &= 3;
21777 : bp08 = 9;
21778 : }
21779 :
21780 : else if (bp08 == -1) {
21781 : bp08 =(ABS16(xx -di) + ABS16(yy -tt) <= 1) ? 2 : 1;
21782 : }
21783 :
21784 : bp06 = _4976_4ec6->b15_0_2();
21785 : if (bp06 != bp0c) {
21786 :
21787 : if (((bp0c +2) & 3) == bp06 || bp08 != 2) {
21788 :
21789 : if ((aa == 4 || aa == 5) && (_4976_3752[_4976_4efa] & 0x100) == 0 && RAND02() != 0) {
21790 :
21791 : bp08 = 9;
21792 : }
21793 : else {
21794 :
21795 : _19f0_0559(bp0c);
21796 : goto _1ff2;
21797 : }
21798 : }
21799 : }
21800 :
21801 : if (bp06 != bp0c && bp08 != 9) {
21802 :
21803 : bp08 = ((bp06 & 3) == bp0c) ? 4 : 3;
21804 : }
21805 :
21806 : else if ((_4976_37a6[_4976_4ee4] & 2) != 0 && aa != 6 && bp16 == 0) {
21807 : bp08 = 0;
21808 : }
21809 :
21810 : _4976_4ece->w24.SetX(di);
21811 : _4976_4ece->w24.SetY(tt);
21812 : _4976_4ece->w24.SetMap(_4976_0c5a);
21813 :
21814 : _4976_4ece->b27 = X8(ww);
21815 : _4976_4ece->b29 = X8(bp0c);
21816 : _4976_4ece->b32 = X8(aa);
21817 : _4976_4ece->b26 = X8(bp08);
21818 : _4976_4ee5 = 0xFC;
21819 : }
21820 :
21821 : _1ff2:
21822 : if (bp16 != 0)
21823 : _1c9a_0648(bp14);
21824 :
21825 : return bp1a;
21826 : }
21827 :
21828 :
21829 : ObjectID _19f0_050f()
21830 : {
21831 :
21832 : ENTER(0);
21833 :
21834 : ObjectID si = _4976_5222;
21835 : if (si == si.FFFF) {
21836 :
21837 : for (si = _19f0_04bf(); si != si.FFFE && si.DBType() != dbCreature; si = GET_NEXT_RECORD_LINK(si));
21838 :
21839 : _4976_5222 = si;
21840 : }
21841 :
21842 : return si;
21843 : }
21844 :
21845 :
21846 : X16 _1c9a_0006(ObjectID rl, U16 xx)
21847 : {
21848 :
21849 : ENTER(14);
21850 :
21851 : U16 si = xx;
21852 : U16 di = si & 0x80;
21853 : si &= 0x3f;
21854 : if (si == 0xffff || si == 0xfffe)
21855 : return 0;
21856 :
21857 : if (si == 0x3f)
21858 : goto _0238;
21859 :
21860 : if (si == 0x3e) {
21861 :
21862 : if (IS_CONTAINER_MONEYBOX(rl) != 0) {
21863 : if (GET_ADDRESS_OF_RECORD9(rl)->b7_2_2() == 0) {
21864 : return !di;
21865 : }
21866 : }
21867 : return di;
21868 : }
21869 :
21870 : if (si == 0x29) {
21871 :
21872 : if (IS_CONTAINER_MONEYBOX(rl) != 0) {
21873 :
21874 : if (GET_ADDRESS_OF_RECORD9(rl)->b7_2_2() != 0) {
21875 : return !di;
21876 : }
21877 : return di;
21878 : }
21879 :
21880 : si = 7;
21881 : }
21882 :
21883 : U8 bp09 = _4976_4ec6->CreatureType();
21884 : U16 bp0e = rl.DBType();
21885 : if (si < 0x10) goto _00c6;
21886 : if (si < 0x13) goto _00cb;
21887 : _00c6:
21888 : if (si == 0x28) {
21889 : _00cb:
21890 : if (si == 0x28) {
21891 :
21892 : if (IS_CONTAINER_MONEYBOX(rl) != 0 && GET_ADDRESS_OF_RECORD9(rl)->b7_2_2() == 0) {
21893 : goto _0238;
21894 : }
21895 :
21896 : si = 0x10;
21897 : }
21898 :
21899 : si = _4976_4ec6->w8 * 3 +si;
21900 : }
21901 :
21902 : U8 *bp04 = _4976_5164[si];
21903 : if (bp04 == 0) {
21904 :
21905 : _4976_520c--;
21906 : bp04 = _4976_5164[si] = _4976_520e;
21907 : _4976_520e += 0x40;
21908 : if (_48ae_0281(bp09, U8(si), bp04, (bp0e == dbCreature) ? 1 : 0) == 0)
21909 : return 0;
21910 : }
21911 :
21912 : i16 bp0c;
21913 : if (bp0e == dbCreature) {
21914 : bp0c = GET_ADDRESS_OF_RECORD4(rl)->CreatureType();
21915 : goto _0219;
21916 : }
21917 :
21918 : Actuator *bp08;
21919 : if (bp0e == dbActuator) {
21920 : bp08 = GET_ADDRESS_OF_RECORD3(rl);
21921 : switch (bp08->ActuatorType()) {
21922 : case 0x1b:
21923 :
21924 : if (bp08->ActuatorData() == 0)
21925 : return 0;
21926 : goto _01d1;
21927 : case 0x1a:
21928 :
21929 : _01d1:
21930 : bp0c = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, GET_WALL_DECORATION_OF_ACTUATOR(bp08), dtWordValue, 0x0e);
21931 : goto _0219;
21932 : default:
21933 :
21934 : bp0c = bp08->ActuatorType();
21935 : goto _0219;
21936 : }
21937 : }
21938 :
21939 : if (bp0e >= dbWeapon && bp0e <= dbMiscellaneous_item) {
21940 :
21941 : bp0c = GET_DISTINCTIVE_ITEMTYPE(rl);
21942 : goto _0219;
21943 : }
21944 :
21945 : return 0;
21946 :
21947 : _0219:
21948 : if ((bp04[bp0c >> 3] & (1 << (bp0c & 7))) != 0) {
21949 :
21950 : _0238:
21951 : return !di;
21952 : }
21953 :
21954 : return di;
21955 : }
21956 :
21957 : void _1c9a_19d4(ObjectID rl, i16 xx, i16 yy, U16 ww)
21958 : {
21959 :
21960 : ENTER(0);
21961 :
21962 : U16 si = ww;
21963 : U16 di = si & 0x8000;
21964 : si = si & 0x7fff;
21965 : switch (si) {
21966 : case 6:
21967 : case 7:
21968 : case 8:
21969 : case 9:
21970 : case 10:
21971 : case 11:
21972 : case 12:
21973 : case 13:
21974 : case 14:
21975 : case 15:
21976 : case 16:
21977 : case 17:
21978 : case 18:
21979 : case 19:
21980 : case 20:
21981 : case 21:
21982 :
21983 : _13e4_0401(rl, xx, yy, (di != 0) ? ((si -6)|0x8000) : (si -6), 0x64, 0);
21984 : }
21985 :
21986 : return;
21987 : }
21988 :
21989 : void _24a5_036a(i16 aa, U16 bb, i16 xx, i16 yy, U16 ww)
21990 : {
21991 :
21992 : ENTER(46);
21993 :
21994 : X16 di = 0;
21995 : X16 bp12 = 0;
21996 : X16 bp14 = 0;
21997 : skxxx6 bp2e;
21998 : _0cee_1dbe(&bp2e,bb,xx,yy);
21999 : i16 bp16;
22000 : X8 bp0b;
22001 : U16 si;
22002 : U16 bp10;
22003 : U16 bp1e;
22004 : ObjectID bp0a;
22005 : U16 bp0e;
22006 : switch (bp2e.w0()) {
22007 : case 0:
22008 :
22009 : if ((ww & 4) == 0)
22010 : break;
22011 : bp16 = bp2e.w10();
22012 : bp0b = X8(bp16 & 0xff);
22013 : if (bp0b == 0xff)
22014 : break;
22015 : si = QUERY_GDAT_ENTRY_DATA_INDEX(9, bp0b, dtWordValue, 0xf8);
22016 : if (si == 0)
22017 : break;
22018 : bp10 = ((si & 0x8000) != 0) ? 1 : 0;
22019 : si &= 0x7fff;
22020 : if (QUERY_GDAT_ENTRY_DATA_INDEX(9, bp0b, dtWordValue, 0x63) != 0) {
22021 :
22022 : bp1e = BETWEEN_VALUE(0, _4976_5c63 + _4976_5c68, 5);
22023 : bp12 = (_4976_3d44[bp1e] * si) / 0x64 +bp12;
22024 : break;
22025 : }
22026 :
22027 : if (bp10 != 0 && (bp16 >> 8) == 0)
22028 : break;
22029 :
22030 : di += si;
22031 : break;
22032 : case 1:
22033 : case 2:
22034 : case 5:
22035 : case 16:
22036 : case 17:
22037 : case 18:
22038 : case 19:
22039 :
22040 : if ((ww & 1) == 0)
22041 : break;
22042 : if (bp2e.w0() != 1 && bp2e.w0() != 2 && bp2e.w0() != 5)
22043 : goto _0519;
22044 :
22045 : bp16 = bp2e.w10();
22046 : bp0b = X8(bp16);
22047 : if (bp0b == 0xff)
22048 : goto _0519;
22049 : si = QUERY_GDAT_ENTRY_DATA_INDEX(10, bp0b, dtWordValue, 0xf8);
22050 : if (si == 0)
22051 : break;
22052 : bp10 = ((si & 0x8000) != 0) ? 1 : 0;
22053 : si &= 0x7fff;
22054 :
22055 : TELE_inf bp1c;
22056 : if (GET_TELEPORTER_DETAIL(&bp1c, U8(xx), U8(yy)) != 0) {
22057 :
22058 : bp1e = BETWEEN_VALUE(0, _4976_5c63 + _4976_5c68, 5);
22059 : bp0a = (_4976_3d44[bp1e] * si) / 0x64 +bp12;
22060 : }
22061 : else {
22062 :
22063 : if (bp10 == 0 || (bp16 >> 8) != 0)
22064 : di += si;
22065 :
22066 : _0519:
22067 : bp0a = bp2e.w4();
22068 : }
22069 : for (; bp0a != bp0a.FFFE; bp0a = GET_NEXT_RECORD_LINK(bp0a)) {
22070 :
22071 : bp0e = bp0a.DBType();
22072 : if (bp0e == dbCloud) {
22073 :
22074 : Cloud *bp04 = GET_ADDRESS_OF_RECORDF(bp0a);
22075 : if (bp04->CloudType() != 2 && bp04->CloudType() != 0 && bp04->CloudType() != 0x30)
22076 : continue;
22077 :
22078 : bp14 = (bp04->b3_0_f() >> 1) +bp14;
22079 : continue;
22080 : }
22081 :
22082 : if (bp0e == dbMissile) {
22083 : Missile *bp08 = GET_ADDRESS_OF_RECORDE(bp0a);
22084 : if (bp08->GetMissileObject() == ObjectID::FF80) {
22085 : bp14 += (i16(bp08->EnergyRemaining()) >> 1) - _4976_3d73;
22086 : }
22087 : }
22088 :
22089 : }
22090 :
22091 : if ((ww & 2) != 0) {
22092 : bp0a = GET_CREATURE_AT(xx, yy);
22093 : if (bp0a != bp0a.FFFF) {
22094 : si = QUERY_GDAT_DBSPEC_WORD_VALUE(bp0a, 0xf8);
22095 : di = si & 0x7fff;
22096 : }
22097 : }
22098 : break;
22099 : case 3:
22100 : case 4:
22101 : case 6:
22102 : case 7:
22103 : case 8:
22104 : case 9:
22105 : case 10:
22106 : case 11:
22107 : case 12:
22108 : case 13:
22109 : case 14:
22110 : case 15:
22111 : break;
22112 : }
22113 :
22114 : if (aa <= 8 && aa != 0) {
22115 : bp12 = max_value(3, bp12 - _4976_3d5b[aa]);
22116 : }
22117 : else {
22118 : bp12 = 0;
22119 : }
22120 :
22121 : if (aa > 5)
22122 : aa = 5;
22123 :
22124 : if (di != 0) {
22125 :
22126 : di = max_value(2, di - _4976_3d6d[aa]);
22127 : }
22128 :
22129 : _4976_52d4 += di + bp12;
22130 : if (bp14 != 0) {
22131 :
22132 : bp14 = max_value(2, bp14 - _4976_3d6d[aa]);
22133 : }
22134 :
22135 : _4976_52d6 += bp14;
22136 :
22137 : return;
22138 : }
22139 : U16 _19f0_2813(U16 ww, i16 xx, i16 yy, i16 ss, i16 tt, i16 aa, U16 bb);
22140 :
22141 : U16 _19f0_0d10(U16 ww,i16 xx,i16 yy,i16 ss,i16 tt,i16 aa)
22142 : {
22143 :
22144 : ENTER(32);
22145 :
22146 : ObjectID bp18;
22147 : i16 di = ss;
22148 : X16 bp06 = 0;
22149 : U16 bp0e = ww & 0x80;
22150 : if (bp0e != 0)
22151 : ww &= 0xff7f;
22152 : X16 si = ((ww == 0) ? 0x6f : 0x73) + _4976_4ef0;
22153 :
22154 : if (si == 0)
22155 : goto _123a;
22156 :
22157 : if (di == -1) {
22158 :
22159 : di = xx + _4976_0232[aa];
22160 : tt = yy + _4976_023a[aa];
22161 : }
22162 :
22163 : else if (aa == -1) {
22164 :
22165 : aa = CALC_VECTOR_DIR(xx, yy, di, tt);
22166 : }
22167 :
22168 : else if (xx == di && yy == tt) {
22169 : goto _123a;
22170 : }
22171 :
22172 : if (di < 0 || di >= _4976_4dd2 || tt < 0 || tt >= _4976_4dd4)
22173 : goto _123a;
22174 :
22175 : if ((xx -di) != 0 && (yy -tt) != 0)
22176 : goto _123a;
22177 :
22178 : _19f0_045a(di, tt);
22179 : if ((_4976_521c >> 5) != 4)
22180 : goto _123a;
22181 : X16 bp0a = (_4976_521c & 7);
22182 :
22183 : if (ww == 0) {
22184 : if (bp0a == 0) {
22185 : _0e04:
22186 : bp06 = 1;
22187 : goto _108f;
22188 : }
22189 : }
22190 :
22191 : else if (bp0a == 5) {
22192 : goto _123a;
22193 : }
22194 :
22195 : else if (bp0a == 4) {
22196 : goto _0e04;
22197 : }
22198 :
22199 : if (_4976_521e == ObjectID::FFFF) {
22200 :
22201 : _4976_521e = GET_TILE_RECORD_LINK(di, tt);
22202 : }
22203 :
22204 : Door *bp04 = GET_ADDRESS_OF_RECORD0(_4976_521e);
22205 : if (ww == 2 && bp04->b3_4_4() == 0)
22206 : goto _123a;
22207 :
22208 : if (bp04->b3_2_2() != 0) {
22209 :
22210 : if (bp04->b3_1_1() != 0) {
22211 : if (ww == 0)
22212 : goto _104f;
22213 : }
22214 :
22215 : else if (ww != 0) {
22216 : goto _104f;
22217 : }
22218 :
22219 : else if ((si &= 0xfff3) == 0) {
22220 : goto _123a;
22221 : }
22222 : }
22223 :
22224 : i16 bp08 = CALC_SQUARE_DISTANCE(xx, yy, di, tt);
22225 : if (bp08 == 1) {
22226 :
22227 : if ((si & 3) != 0) {
22228 :
22229 : if (bp04->Button() != 0)
22230 : goto _0f9d;
22231 :
22232 : if (bp04->b3_5_5() != 0)
22233 : goto _0f9d;
22234 : }
22235 :
22236 : if (ww == 0) {
22237 :
22238 : if ((si & 4) != 0 && bp04->DestroyablebyFireball() != 0)
22239 : goto _0f9d;
22240 :
22241 : if ((si & 8) != 0 && bp04->BashablebyChopping() != 0)
22242 : goto _0f9d;
22243 : }
22244 :
22245 : if ((si & 0x40) != 0)
22246 : goto _0f9d;
22247 : goto _123a;
22248 : }
22249 :
22250 : if (_4976_4eca->w20_c_f() < bp08)
22251 : goto _123a;
22252 :
22253 : if ((si & 1) != 0) {
22254 : if (bp04->Button() != 0 || bp04->b3_5_5() != 0)
22255 : goto _0f7f;
22256 : }
22257 :
22258 : if (ww != 0 || (si & 4) == 0)
22259 : goto _123a;
22260 :
22261 : if (bp04->DestroyablebyFireball() == 0)
22262 : goto _123a;
22263 :
22264 : _0f7f:
22265 : if (_19f0_0207(xx, yy, di, tt, _19f0_00b8) == 0)
22266 : goto _123a;
22267 :
22268 : _0f9d:
22269 : if ((si & 1) != 0) {
22270 :
22271 : i16 bp10 = xx;
22272 : i16 bp12 = yy;
22273 : i16 bp14 = bp08;
22274 : for (; bp14 >= 0; ) {
22275 :
22276 : for (bp18 = GET_WALL_TILE_ANYITEM_RECORD(bp10, bp12); bp18 != bp18.FFFE; bp18 = GET_NEXT_RECORD_LINK(bp18)) {
22277 :
22278 : U16 bp16 = bp18.DBType();
22279 : if (bp16 == dbMissile) {
22280 :
22281 : Missile *bp1c = GET_ADDRESS_OF_RECORDE(bp18);
22282 :
22283 : if (bp1c->GetMissileObject() != ObjectID::FF8D && bp1c->GetMissileObject() != ObjectID::FF84)
22284 : continue;
22285 :
22286 : if (_4976_5c20[bp1c->TimerIndex()].b9_2_3() != aa)
22287 : continue;
22288 : goto _104f;
22289 : }
22290 :
22291 : else if (bp16 == dbCloud) {
22292 :
22293 : Cloud *bp20 = GET_ADDRESS_OF_RECORDF(bp18);
22294 : if (bp20->CloudType() != 13 && bp20->CloudType() != 4)
22295 : continue;
22296 :
22297 : _104f:
22298 : bp06 = 2;
22299 : goto _108f;
22300 : }
22301 :
22302 : }
22303 :
22304 : bp10 += _4976_0232[aa];
22305 : bp12 += _4976_023a[aa];
22306 : bp14--;
22307 :
22308 : }
22309 : }
22310 :
22311 : _108f:
22312 : if (bp06 != 0 && ww == 2)
22313 : goto _123a;
22314 : if (bp0e == 0)
22315 : goto _1235;
22316 :
22317 : if (aa == -1) {
22318 : aa = CALC_VECTOR_DIR(xx, yy, di, tt);
22319 : }
22320 :
22321 : if (bp06 == 1) {
22322 :
22323 : _4976_4ee5 = 0xfe;
22324 : goto _1235;
22325 : }
22326 :
22327 : if (bp06 == 2) {
22328 : _4976_4ece->b26 = 0;
22329 : goto _1230;
22330 : }
22331 :
22332 : if (_19f0_0559(aa) != 0)
22333 : goto _1235;
22334 :
22335 : if ((si & 0x20) != 0) {
22336 : si &= 0xffdf;
22337 : if (ww == 0) {
22338 :
22339 : bp04->b3_4_4(1);
22340 : }
22341 : }
22342 :
22343 : if (bp08 > 1)
22344 : si &= 5;
22345 :
22346 : if ((si & 0x42) != 0) {
22347 : if ((si & 0xffbd) == 0 || RAND02() == 0) {
22348 :
22349 : _4976_4ece->b26 = 0xb;
22350 : goto _11d2;
22351 : }
22352 : }
22353 :
22354 : if ((si & 1) != 0) {
22355 :
22356 : if ((si & 0xffbc) == 0 || RAND02() == 0) {
22357 :
22358 : _4976_4ece->b26 = (RAND01() != 0) ? 0x28 : 0x27;
22359 :
22360 : _4976_4ece->b30 = (ww == 0) ? 0x8d : 0x84;
22361 : goto _11d2;
22362 : }
22363 : }
22364 :
22365 : U16 bp0c = _4976_4eee;
22366 : if ((si & 8) != 0 && (bp0c & 1) != 0 && ((si & 0xffb4) == 0 || RAND01() != 0)) {
22367 :
22368 : _4976_4eee &= 1;
22369 : goto _11af;
22370 : }
22371 :
22372 : if ((si & 4) == 0)
22373 : goto _123a;
22374 :
22375 : _4976_4eee &= 0x50;
22376 :
22377 : _11af:
22378 : si = _19f0_0891(0x84, xx, yy, di, tt, aa);
22379 : _4976_4eee = bp0c;
22380 :
22381 : return si;
22382 : _11d2:
22383 : _4976_4ece->w24.SetX(di);
22384 : _4976_4ece->w24.SetY(tt);
22385 : _4976_4ece->w24.SetMap(_4976_0c5a);
22386 : _4976_4ece->b29 = _4976_4ece->b27 = U8(aa);
22387 : _4976_4ece->b28 = (U8(RAND01()) + U8(aa)) & 3;
22388 : _4976_4ece->b32 = U8(ww);
22389 :
22390 : _1230:
22391 : _4976_4ee5 = 0xfc;
22392 :
22393 : _1235:
22394 : return 1;
22395 : _123a:
22396 : if (bp0e != 0)
22397 : _4976_4ee5 = 0xfd;
22398 : return 0;
22399 : }
22400 :
22401 :
22402 : X16 _0cee_3275(U8 xx)
22403 : {
22404 :
22405 : ENTER(0);
22406 :
22407 : return QUERY_GDAT_ENTRY_DATA_INDEX(0x0e, xx, dtWordValue, 0x0d);
22408 : }
22409 :
22410 :
22411 : U16 _19f0_000a(i16 xx, i16 yy)
22412 : {
22413 :
22414 : ENTER(6);
22415 :
22416 : U16 bp06 = GET_TILE_VALUE(xx, yy);
22417 : U16 si = bp06 >> 5;
22418 : if (si == ttDoor) {
22419 : Door *bp04 = GET_ADDRESS_OF_TILE_RECORD(U8(xx), U8(yy))->castToDoor();
22420 : if ((bp06 & 7) == 4 && _0cee_3275(GET_GRAPHICS_FOR_DOOR(bp04)) == 0)
22421 : return 1;
22422 :
22423 : return 0;
22424 : }
22425 :
22426 : if (si != ttWall) {
22427 : if (si == ttTrickWall)
22428 : return 0;
22429 : if ((bp06 & 4) != 0)
22430 : return 0;
22431 : }
22432 : return 1;
22433 : }
22434 : U16 _1c9a_1bae(i16 xx, i16 yy);
22435 :
22436 :
22437 : U16 _1c9a_1bd8(i16 xx, i16 yy, U16 aa, U16 bb, i16 cc, skxxx9 *ss, skxxxc *tt)
22438 : {
22439 :
22440 : ENTER(132);
22441 :
22442 : skxxx9 *bp0c = ss;
22443 :
22444 : if (bp0c->b7 == 0) {
22445 :
22446 : bp0c->w2.SetX(xx);
22447 :
22448 : bp0c->w2.SetY(yy);
22449 :
22450 : bp0c->w2.SetMap(_4976_0c5a);
22451 :
22452 : bp0c->w4 = bp0c->w2;
22453 :
22454 : bp0c->b6 = 0;
22455 :
22456 : return 0;
22457 : }
22458 :
22459 : U32 bp64 = U32(cc) << 2;
22460 :
22461 : skxxxa *bp22 = reinterpret_cast<skxxxa *>(ALLOC_MEMORY(bp64, afZeroMem, 1024));
22462 :
22463 : U8 (*bp08)[4] = (U8 (*)[4])ALLOC_MEMORY(1024, afDefault, 1024);
22464 :
22465 : U32 bp6c = _4976_4d0e->nMaps << 2;
22466 :
22467 : skxxxb (**bp1a)[1][32] = reinterpret_cast<skxxxb (**)[1][32]>(ALLOC_MEMORY(bp6c, afZeroMem, 1024));
22468 :
22469 : U32 bp68;
22470 : bp68 = bp6c = _4976_4d0e->nMaps << 1;
22471 :
22472 : i16 *bp1e = reinterpret_cast<i16 *>(ALLOC_MEMORY(bp68, afDefault, 1024));
22473 :
22474 : U8 bp56 = 0;
22475 :
22476 : _0cd5_0039(bp1e, _4976_4d0e->nMaps, -1, 2);
22477 :
22478 : bp68 = (U32(_4976_4dd2) << 5) << 2;
22479 :
22480 : skxxxb (*bp04)[1][32] = reinterpret_cast<skxxxb (*)[1][32]>(ALLOC_MEMORY(bp68, afDefault, 1024));
22481 :
22482 : U16 bp48 = _4976_0c5a;
22483 :
22484 : bp1a[0] = (skxxxb (*)[1][32])bp04;
22485 :
22486 : bp6c += bp64 +bp68 +1024;
22487 :
22488 : U16 bp52 = 0;
22489 : U16 bp58 = 0;
22490 : U16 si = 0;
22491 : U16 bp34 = 0xffff;
22492 : U8 bp38 = 0;
22493 : U16 bp3e = 0;
22494 :
22495 : skxxxa *bp10 = bp22;
22496 :
22497 : bp0c = ss;
22498 :
22499 : U16 bp0084;
22500 : i16 bp3c;
22501 : U16 bp7e;
22502 : U16 bp80;
22503 : U16 bp0082;
22504 : X16 bp78;
22505 : X16 bp7a;
22506 : X16 bp7c;
22507 : i16 di;
22508 : for (di = 0; di < cc; di++) {
22509 :
22510 : bp0c->b6 = -1;
22511 :
22512 : bp10->b0 = bp0c->b12 & 31;
22513 :
22514 : bp10->b1 = (bp0c->b12 >> 5) & 31;
22515 :
22516 : bp10->b2 = (bp0c->b13 >> 2) & 63;
22517 :
22518 : bp38 |= (bp0c->b16 = _4976_3932[bp0c->b7]);
22519 :
22520 : switch (bp0c->b7) {
22521 : case 3:
22522 :
22523 : bp7e = _4976_4ece->w12.GetX();
22524 : bp80 = _4976_4ece->w12.GetY();
22525 : bp0082 = _4976_4ece->w12.GetMap();
22526 :
22527 : if (true
22528 : && bp7e == _4976_5232
22529 : && bp80 == _4976_5236
22530 : && bp0082 == _4976_5238
22531 : ) {
22532 :
22533 : bp0c->b16 ^= 3;
22534 : }
22535 :
22536 : _1e5a:
22537 : bp52 = 1;
22538 :
22539 : break;
22540 :
22541 : case 12:
22542 :
22543 : bp10->b3 = (bp10->b2 == _4976_0c5a)
22544 : ? max_value(1, CALC_SQUARE_DISTANCE(_4976_4ee0, _4976_4ee1, bp10->b0, bp10->b1))
22545 : : 100;
22546 :
22547 : goto _1e5a;
22548 :
22549 : case 11:
22550 :
22551 : goto _1e5a;
22552 :
22553 : case 1:
22554 :
22555 : bp78 = _4976_4ec6->TriggerX();
22556 :
22557 : bp7a = _4976_4ec6->TriggerY();
22558 :
22559 : bp7c = _4976_4ec6->TriggerMap();
22560 :
22561 : goto _1e5a;
22562 :
22563 : case 5:
22564 :
22565 : bp10->b3 = U8(max_value((_4976_0c5a == _4976_5232) ? CALC_SQUARE_DISTANCE(_4976_4ee0, _4976_4ee1, _4976_5236, _4976_5238) : 100, bp0c->w8));
22566 :
22567 : break;
22568 :
22569 : case 8:
22570 : case 9:
22571 :
22572 : bp58 = 1;
22573 :
22574 : goto _1f19;
22575 :
22576 : case 6:
22577 : case 7:
22578 : case 10:
22579 :
22580 : _1f19:
22581 : bp0084 = _4976_4eee;
22582 :
22583 : break;
22584 :
22585 : case 23:
22586 :
22587 : _4976_4eec = 0x0227;
22588 : _4976_52d4 = 0;
22589 : _4976_52d6 = 0;
22590 :
22591 : break;
22592 :
22593 : case 2:
22594 : case 4:
22595 : case 13:
22596 : case 14:
22597 : case 15:
22598 : case 16:
22599 : case 17:
22600 : case 18:
22601 : case 19:
22602 : case 20:
22603 : case 21:
22604 : case 22:
22605 :
22606 : break;
22607 : }
22608 :
22609 : U16 bp70 = 0;
22610 : U16 bp6e = 0;
22611 :
22612 : if ((_4976_3932[bp0c->b7] & 0x20) != 0) {
22613 :
22614 : bp6e = (_4976_57e6 != 0 && (_4976_4eca->w0 & 0x0400) == 0) ? 1 : 0;
22615 :
22616 : if (bp6e == 0) {
22617 :
22618 : bp70 = (_4976_4c36 != 0 && _4976_57e4.w0 < 0 && (_4976_4eca->w0 & 0x0800) == 0) ? 1 : 0;
22619 :
22620 : if (bp70 == 0) {
22621 :
22622 : goto _20fa;
22623 : }
22624 : }
22625 :
22626 : bp3c = (_4976_4ee7 == _4976_5232)
22627 : ? CALC_SQUARE_DISTANCE(_4976_4ee0, _4976_4ee1, _4976_5236, _4976_5238)
22628 : : CALC_SQUARE_DISTANCE(
22629 : _4976_4dba[_4976_4ee7].MapOffsetX() +_4976_4ee0,
22630 : _4976_4dba[_4976_4ee7].MapOffsetY() +_4976_4ee1,
22631 : _4976_4dba[_4976_5232].MapOffsetX() +_4976_5236,
22632 : _4976_4dba[_4976_5232].MapOffsetY() +_4976_5238
22633 : );
22634 :
22635 : U16 bp76 = RAND();
22636 :
22637 : if (true
22638 : && (bp76 & 0x8000) == 0
22639 : && (false
22640 : || bp3c == 0
22641 : ||(bp3c == 1 && CALC_VECTOR_DIR(_4976_4ee0, _4976_4ee1, _4976_5236, _4976_5238) == _4976_4ec6->b15_0_2()))
22642 : ) {
22643 :
22644 : goto _20fa;
22645 : }
22646 :
22647 : if (false
22648 : || bp3c > 4
22649 : ||(bp6e != 0 && ((bp76 & 15) -(4 -bp3c) <= (_4976_4eca->w20 & 15) || (bp76 & 0x4000) != 0))
22650 : ||(bp70 != 0 && ((_4976_4c36 * bp3c) -((bp76 >> 8) & 7) > (_4976_4eca->w20 & 15)))
22651 : ) {
22652 :
22653 : if ((bp76 & 0x0070) != 0) {
22654 :
22655 : bp0c->b0 = -1;
22656 : }
22657 : else {
22658 :
22659 : bp0c->b0 >>= 3;
22660 : }
22661 : }
22662 : }
22663 :
22664 : _20fa:
22665 : U16 bp2c = bp0c->b0;
22666 :
22667 : if ((bp0c->b16 & 2) != 0)
22668 :
22669 : bp2c++;
22670 :
22671 : bp3e = max_value(bp3e, bp2c);
22672 :
22673 : bp10 += 4;
22674 : bp0c += 22;
22675 :
22676 : }
22677 :
22678 : U16 bp5a = _4976_4eec & 0x2000;
22679 :
22680 : X16 bp5c;
22681 : X16 bp5e;
22682 : if (bp5a != 0) {
22683 :
22684 : bp5a = _4976_4eec & 0x0118;
22685 :
22686 : if (bp5a != 0) {
22687 :
22688 : bp5c = _4976_4eec & 0x0110;
22689 : bp5e = _4976_4eec & 0x0108;
22690 : }
22691 : }
22692 :
22693 : if (bp58 != 0 || bp3e != 0) {
22694 :
22695 : ZERO_MEMORY(bp04, bp68);
22696 : }
22697 :
22698 : U16 bp2a = 0;
22699 : U16 bp28 = 0;
22700 : i16 bp2c = 0;
22701 :
22702 : U16 bp46 = _4976_0c5a;
22703 : i16 bp12;
22704 : i16 bp42;
22705 : bp12 = bp42 = xx;
22706 : i16 bp14;
22707 : i16 bp44;
22708 : bp14 = bp44 = yy;
22709 :
22710 : i16 bp32 = 1;
22711 : i16 bp30 = -1;
22712 : U8 bp37 = 0;
22713 : U16 bp50 = 0xffff;
22714 :
22715 : _19f0_045a(bp12, bp14);
22716 :
22717 : X16 bp4c;
22718 : X16 bp4e;
22719 : if (bp52 != 0) {
22720 :
22721 : _4976_5225 = GET_TELEPORTER_DETAIL(&_4976_5226, U8(bp12), U8(bp14));
22722 :
22723 : if (_4976_5225 != 0) {
22724 :
22725 : bp50 = _4976_5226.b4;
22726 : bp4c = _4976_5226.b2;
22727 : bp4e = _4976_5226.b3;
22728 : }
22729 : }
22730 : X16 bp40;
22731 : i16 bp3a;
22732 : ObjectID bp36;
22733 : if (false) {
22734 :
22735 : _2200:
22736 : bp42 = bp08[bp2a][0];
22737 : bp44 = bp08[bp2a][1];
22738 : bp46 = bp08[bp2a][2];
22739 :
22740 : bp2a = (bp2a +1) & 255;
22741 :
22742 : if (bp46 != _4976_0c5a) {
22743 :
22744 : _1c9a_0648(bp46);
22745 :
22746 : bp04 = bp1a[bp46];
22747 : }
22748 :
22749 : bp2c = bp04[bp42][bp44]->b0;
22750 :
22751 : if (bp2c > bp3e)
22752 :
22753 : goto _35b1;
22754 :
22755 : if (bp2c > 6)
22756 :
22757 : aa |= 0x0040;
22758 :
22759 : if ((aa & 0xff1f) == 5 && bp2c > 1) {
22760 :
22761 : aa = (aa & 0x00e0) | 0x0004;
22762 : }
22763 :
22764 : bp40 = _4976_3930 & 1;
22765 :
22766 : if (bp40 == 0)
22767 :
22768 : bp40--;
22769 :
22770 : if ((_4976_3930 & 1) != 0) {
22771 :
22772 : _4976_3930 = (_4976_3930 >> 1) ^ 0xB400;
22773 : }
22774 : else {
22775 :
22776 : _4976_3930 >>= 1;
22777 : }
22778 :
22779 : bp30 = _4976_3930 & 3;
22780 :
22781 : bp32 = (bp5a != 0) ? 7 : 5;
22782 :
22783 : goto _3592;
22784 :
22785 : _2301:
22786 : if (bp46 != _4976_0c5a) {
22787 :
22788 : _1c9a_0648(bp46);
22789 :
22790 : bp04 = bp1a[bp46];
22791 : }
22792 :
22793 : if (bp5a != 0 && bp32 <= 2) {
22794 :
22795 : if (bp32 == 2) {
22796 :
22797 : if (bp5e == 0)
22798 :
22799 : goto _3586;
22800 :
22801 : }
22802 :
22803 : else if (bp5c == 0) {
22804 :
22805 : goto _3586;
22806 : }
22807 : else {
22808 :
22809 : bp30 = 4;
22810 : }
22811 :
22812 : bp12 = bp42;
22813 : bp14 = bp44;
22814 : goto _23b0;
22815 : }
22816 : else {
22817 :
22818 : bp12 = bp42 + _4976_0232[bp30];
22819 : bp14 = bp44 + _4976_023a[bp30];
22820 :
22821 : if (bp12 < 0 || bp12 >= _4976_4dd2 || bp14 < 0 || bp14 >= _4976_4dd4)
22822 :
22823 : goto _3586;
22824 :
22825 : _23b0:
22826 : _4976_5224 = 0;
22827 :
22828 : bp37 = bp04[bp12][bp14]->b0;
22829 :
22830 : if (bp37 == 0 || bp30 >= 4) {
22831 :
22832 : if (_19f0_1522(aa, bp42, bp44, bp12, bp14, bp30) == 0) {
22833 :
22834 : bp37 = 0xff;
22835 : }
22836 : else {
22837 :
22838 : bp50 = 0xffff;
22839 :
22840 : if (_4976_521a != _4976_0c5a) {
22841 :
22842 : if (bp1a[_4976_521a] == NULL) {
22843 :
22844 : bp68 = ((_4976_4dba[_4976_521a].RawColumn() +1) << 5) << 2;
22845 :
22846 : bp68 += 200;
22847 :
22848 : if (i32(bp68) > _4976_5d30) {
22849 :
22850 : bp3a = _3e74_5888();
22851 :
22852 : _3e74_5708(bp3a, bp68);
22853 :
22854 : for (bp3c = 0; _4976_4d0e->nMaps > bp3c; bp3c++) {
22855 :
22856 : if (bp1e[bp3c] < 0)
22857 :
22858 : continue;
22859 :
22860 : bp1a[bp3c] = reinterpret_cast<skxxxb (*)[1][32]>(_3e74_5817(bp1e[bp3c]));
22861 :
22862 : }
22863 : }
22864 :
22865 : bp04 = reinterpret_cast<skxxxb (*)[1][32]>(ALLOC_MEMORY(bp68, afZeroMem, 1024));
22866 :
22867 : bp6c += bp68;
22868 :
22869 : bp1a[_4976_521a] = bp04;
22870 : }
22871 :
22872 : if (bp30 < 4) {
22873 :
22874 : bp50 = _4976_0c5a;
22875 : }
22876 :
22877 : _1c9a_0648(_4976_521a);
22878 :
22879 : bp04 = bp1a[_4976_0c5a];
22880 : }
22881 : else {
22882 :
22883 : if (bp30 < 4) {
22884 :
22885 : if (_4976_5225 != 0) {
22886 :
22887 : bp50 = _4976_5226.b4;
22888 : bp4c = _4976_5226.b2;
22889 : bp4e = _4976_5226.b3;
22890 :
22891 : }
22892 :
22893 : else if (_4976_5216 != bp12 || _4976_5218 != bp14) {
22894 :
22895 : bp50 = _4976_0c5a;
22896 : }
22897 : }
22898 : }
22899 :
22900 : bp4c = bp12;
22901 :
22902 : bp4e = bp14;
22903 :
22904 : bp37 = 0;
22905 : }
22906 : }
22907 :
22908 : if (bp37 != 0)
22909 :
22910 : goto _2ece;
22911 :
22912 : if (bp04[bp12 = _4976_5216][bp14 = _4976_5218]->b0 != 0)
22913 :
22914 : goto _3586;
22915 : }
22916 : }
22917 :
22918 : U16 bp16 = _4976_0c5a;
22919 :
22920 : U16 bp54;
22921 : if ((bp38 & 1) != 0) {
22922 :
22923 : bp10 = bp22;
22924 : bp0c = ss;
22925 :
22926 : for (i16 di = 0; di < cc; di++, bp0c++, bp10++) {
22927 :
22928 : if (bp0c->b0 < bp2c || (bp0c->b16 & 1) == 0)
22929 :
22930 : continue;
22931 :
22932 : switch (bp0c->b7) {
22933 : case 0:
22934 :
22935 : _2661:
22936 : si = 1;
22937 :
22938 : break;
22939 :
22940 : case 2:
22941 :
22942 : switch (bp0c->w8) {
22943 : case 4:
22944 :
22945 : break;
22946 :
22947 : case 0:
22948 :
22949 : si = (_4976_0c5a == _4976_5232 && bp12 == _4976_5236 && bp14 == _4976_5238) ? 1 : 0;
22950 :
22951 :
22952 : break;
22953 :
22954 : case 2:
22955 :
22956 : if (CALC_VECTOR_DIR(_4976_5236, _4976_5238, bp12, bp14) != _4976_5234)
22957 :
22958 : break;
22959 :
22960 : bp3c = _19f0_0207(_4976_5236, _4976_5238, bp12, bp14, _19f0_000a);
22961 :
22962 : if (bp3c <= 0)
22963 :
22964 : break;
22965 :
22966 : if (bp0c->w10 < bp3c)
22967 :
22968 : break;
22969 :
22970 : si = 1;
22971 :
22972 : break;
22973 : }
22974 :
22975 : if (bp0c->w10 != CALC_SQUARE_DISTANCE(bp12, bp14, _4976_5236, _4976_5238))
22976 :
22977 : break;
22978 :
22979 : if ((bp12 - _4976_5236 == 0 || bp14 - _4976_5238 == 0) && _19f0_0207(_4976_5236, _4976_5238, bp12, bp14, _1c9a_1bae) != 0)
22980 :
22981 : break;
22982 :
22983 : si = 1;
22984 :
22985 : break;
22986 :
22987 : case 7:
22988 :
22989 : if (bp16 != _4976_5232)
22990 :
22991 : break;
22992 :
22993 : _4976_4eee = bp0c->w10;
22994 :
22995 : si = _19f0_0891(0, bp12, bp14, _4976_5236, _4976_5238, -1);
22996 :
22997 : _4976_4eee = bp0084;
22998 :
22999 : break;
23000 :
23001 : case 6:
23002 :
23003 : if (bp16 != _4976_5232)
23004 :
23005 : break;
23006 :
23007 : _4976_4eee = bp0c->w10;
23008 :
23009 : si = _19f0_0891(1, bp12, bp14, _4976_5236, _4976_5238, -1);
23010 :
23011 : _4976_4eee = bp0084;
23012 :
23013 : break;
23014 :
23015 : case 8:
23016 : case 9:
23017 :
23018 : if (bp0c->b0 != bp2c)
23019 :
23020 : break;
23021 :
23022 : _4976_4eee &= aa;
23023 :
23024 : si = _19f0_05e8(bp0c->w8, bp04, &bp0c->w2, bp12, bp14, -1, (bp0c->b7 == 9) ? 1 : 0);
23025 :
23026 : if (si != 0) {
23027 :
23028 : bp0c->w2.SetX(_4976_5216);
23029 :
23030 : bp0c->w2.SetY(_4976_5218);
23031 :
23032 : bp0c->w2.SetMap(_4976_521a);
23033 :
23034 : bp0c->b6 = (_4976_5216 == bp12 && _4976_5218 == bp14 && _4976_521a == bp16)
23035 : ? bp2c
23036 : :(bp1a[_4976_521a][_4976_5216][_4976_5218]->b0 -1);
23037 : }
23038 :
23039 : _4976_4eee = bp0084;
23040 :
23041 : break;
23042 :
23043 : case 24:
23044 :
23045 : if ((_4976_521c & 0x10) == 0)
23046 :
23047 : break;
23048 :
23049 : bp3c = _1c9a_1b16(bp0c->w8, bp0c->w10);
23050 :
23051 : if (bp3c == 0xffff)
23052 :
23053 : break;
23054 :
23055 : if (bp10->b3 <= bp3c)
23056 :
23057 : break;
23058 :
23059 : if (bp3c == 0 || bp10->b3 < 127 || bp0c->b0 == 0) {
23060 :
23061 : si = 1;
23062 :
23063 : bp0c->b16 = bp0c->b16 & 0xfb;
23064 :
23065 : break;
23066 : }
23067 :
23068 : bp10->b3 = i8(bp3c);
23069 :
23070 : break;
23071 :
23072 : case 25:
23073 :
23074 : if (false
23075 : || bp30 == 0xffff
23076 : || (_4976_521c & 0x10) == 0
23077 : || (bp3c = _1c9a_1a48(1, _4976_4ef8)) == 0xffff
23078 : || (bp3c & (1 << ((bp30 +2) & 3))) != 0
23079 : ) {
23080 :
23081 : break;
23082 : }
23083 :
23084 : si = 1;
23085 :
23086 : break;
23087 :
23088 : case 10:
23089 :
23090 : if (bp16 != _4976_5232 || (_4976_37a6[_4976_4ee4] & 3) != 0)
23091 :
23092 : break;
23093 :
23094 : _4976_4eee &= bp0c->w10;
23095 :
23096 : si = _19f0_0891(0, bp12, bp14, -1, -1, _4976_4ec6->b15_0_2());
23097 :
23098 : _4976_4eee = bp0084;
23099 :
23100 : break;
23101 :
23102 : case 4:
23103 :
23104 : if (bp16 != _4976_5232 || (CALC_SQUARE_DISTANCE(bp12, bp14, _4976_5236, _4976_5238) +8) != 2)
23105 :
23106 : break;
23107 :
23108 : si = 1;
23109 :
23110 : break;
23111 :
23112 : case 15:
23113 : case 16:
23114 :
23115 : si = _19f0_2165(0, bp12, bp14, bp12, bp14, -1, bp0c->w8);
23116 :
23117 :
23118 : break;
23119 :
23120 : case 5:
23121 :
23122 : if (bp0c->w12() != 0xffff)
23123 :
23124 : goto _2b85;
23125 :
23126 : if (bp0c->b6 <= 0) {
23127 :
23128 : bp54 = 1;
23129 : }
23130 : else {
23131 :
23132 : if ((_4976_3930 & 1) != 0) {
23133 :
23134 : _4976_3930 = (_4976_3930 >> 1) ^ 0xB400;
23135 : }
23136 : else {
23137 :
23138 : _4976_3930 >>= 1;
23139 : }
23140 :
23141 : bp54 = ((_4976_3930 & 7) == 0) ? 1 : 0;
23142 : }
23143 :
23144 : if (bp54 == 0)
23145 :
23146 : break;
23147 :
23148 : if (bp16 == _4976_5232) {
23149 :
23150 : bp3c = CALC_SQUARE_DISTANCE(bp12, bp14, _4976_5236, _4976_5238);
23151 : }
23152 : else {
23153 :
23154 : bp3c = CALC_SQUARE_DISTANCE(
23155 : _4976_4dba[bp16].MapOffsetX() +bp12,
23156 : _4976_4dba[bp16].MapOffsetY() +bp14,
23157 : _4976_4dba[_4976_5232].MapOffsetX() + _4976_5236,
23158 : _4976_4dba[_4976_5232].MapOffsetY() + _4976_5238
23159 : )
23160 : << ((_4976_4dba[bp16].Level() != _4976_4dba[_4976_5232].Level()) ? 1 : 0);
23161 : }
23162 :
23163 : if (bp10->b3 <= bp3c)
23164 :
23165 : break;
23166 :
23167 : if (bp16 == _4976_5232 && bp3c < 5 && (bp12 - _4976_5236 == 0 || bp14 - _4976_5238 == 0) && _19f0_0207(_4976_5236, _4976_5238, bp12, bp14, _1c9a_1bae) != 0)
23168 :
23169 : break;
23170 :
23171 : si = 1;
23172 :
23173 : bp10->b3 = X8(bp3c);
23174 :
23175 : break;
23176 :
23177 : case 11:
23178 :
23179 : _2b85:
23180 : if (false
23181 : || (bp10->b2 == bp16 && bp10->b0 == bp12 && bp10->b1 == bp14)
23182 : || (bp10->b2 == bp50 && bp10->b0 == bp4c && bp10->b1 == bp4e)
23183 : ) {
23184 :
23185 : si = 1;
23186 : }
23187 :
23188 : break;
23189 :
23190 : case 12:
23191 :
23192 : if (false
23193 : || bp10->b2 != bp16
23194 : ||(bp3c = CALC_SQUARE_DISTANCE(bp12, bp14, bp10->b0, bp10->b1)) >= bp10->b3
23195 : ) {
23196 :
23197 : if (bp10->b2 != bp50)
23198 :
23199 : break;
23200 :
23201 : bp3c = CALC_SQUARE_DISTANCE(bp4c, bp4e, bp10->b0, bp10->b1);
23202 :
23203 : if (bp3c >= bp10->b3)
23204 :
23205 : break;
23206 :
23207 : si = 1;
23208 : }
23209 :
23210 : bp10->b3 = X8(bp3c);
23211 :
23212 : if (bp10->b3 != 0)
23213 :
23214 : break;
23215 :
23216 : bp0c->b16 = bp0c->b16 & 0xfb;
23217 :
23218 : break;
23219 :
23220 : case 3:
23221 :
23222 : if (false
23223 : || (bp16 == bp0082 && bp12 == bp7e && bp14 == bp80)
23224 : || (bp50 == bp0082 && bp4c == bp7e && bp4e == bp80)
23225 : ) {
23226 :
23227 : si = 1;
23228 : }
23229 :
23230 : break;
23231 :
23232 : case 13:
23233 :
23234 : if (bp0c->w12() != 0xffff)
23235 :
23236 : goto _2b85;
23237 :
23238 : if (bp2c <= 0)
23239 :
23240 : break;
23241 :
23242 : if (bp0c->b6 <= 0)
23243 :
23244 : goto _2661;
23245 :
23246 : if ((_4976_3930 & 1) != 0) {
23247 :
23248 : _4976_3930 = (_4976_3930 >> 1) & 0xB400;
23249 : }
23250 : else {
23251 :
23252 : _4976_3930 >>= 1;
23253 : }
23254 :
23255 : if ((_4976_3930 & 7) != 0)
23256 :
23257 : break;
23258 :
23259 : si = 1;
23260 :
23261 : break;
23262 :
23263 : case 1:
23264 :
23265 : if (false
23266 : || (bp16 == bp7c && bp12 == bp78 && bp14 == bp7a)
23267 : || (bp50 == bp7c && bp4c == bp78 && bp4e == bp7a)
23268 : ) {
23269 :
23270 : si = 1;
23271 : }
23272 :
23273 : break;
23274 :
23275 : case 14:
23276 :
23277 : bp3c = bp0c->w8;
23278 :
23279 : if (bp3c < 0) {
23280 :
23281 : if (RAND16(-bp3c) == 0)
23282 :
23283 : break;
23284 :
23285 : si = 1;
23286 :
23287 : break;
23288 : }
23289 :
23290 : if (bp3c <= 0)
23291 :
23292 : break;
23293 :
23294 : if (RAND16(bp3c) != 0)
23295 :
23296 : break;
23297 :
23298 : si = 1;
23299 :
23300 : break;
23301 :
23302 : case 21:
23303 :
23304 : si = _19f0_1522(bp0c->w8, bp12, bp14, bp12, bp14, -1);
23305 :
23306 : break;
23307 :
23308 : case 20:
23309 :
23310 : if (bp12 == xx && bp14 == yy)
23311 :
23312 : break;
23313 :
23314 : bp36 = _19f0_050f();
23315 :
23316 : if (bp36 == ObjectID::FFFE)
23317 :
23318 : break;
23319 :
23320 : if (_1c9a_0006(bp36, bp0c->w8) == 0)
23321 :
23322 : break;
23323 :
23324 : _1c9a_19d4(bp36, bp12, bp14, bp0c->w10);
23325 :
23326 : si = 1;
23327 :
23328 : break;
23329 :
23330 : case 23:
23331 :
23332 : if ((_4976_521c & 16) == 0)
23333 :
23334 : break;
23335 :
23336 : _24a5_036a(bp2c, (bp30 == 0xffff) ? _4976_4bf6 : bp30, bp12, bp14, 3);
23337 :
23338 : break;
23339 :
23340 : case 17:
23341 : case 18:
23342 : case 19:
23343 : case 22:
23344 :
23345 : break;
23346 : }
23347 :
23348 : if (si != 0)
23349 :
23350 : break;
23351 :
23352 : }
23353 : }
23354 :
23355 : if (bp2c < bp3e) {
23356 :
23357 : bp08[bp28][0] = X8(bp12);
23358 : bp08[bp28][1] = X8(bp14);
23359 : bp08[bp28][2] = X8(bp16);
23360 : bp28 = (bp28 +1) & 255;
23361 : }
23362 :
23363 : skxxxb bp74;
23364 : bp74.b0 = bp2c +1;
23365 :
23366 : bp74.b1 = X8(bp30);
23367 :
23368 : bp74.w2.SetMap(bp46);
23369 :
23370 : bp74.w2.SetX(bp42);
23371 :
23372 : bp74.w2.SetY(bp44);
23373 :
23374 : bp04[0][bp12][bp14] = bp74;
23375 :
23376 : goto _3368;
23377 :
23378 : _2ece:
23379 : i8 bp5f;
23380 : if (bp37 == 0xff && bp30 < 4) {
23381 :
23382 : bp5f = _4976_5224;
23383 : bp37 = U8(bp2c);
23384 :
23385 : if ((bp37 & 2) != 0) {
23386 :
23387 : if ((bp38 & 8) != 0)
23388 :
23389 : _19f0_045a(bp12, bp14);
23390 :
23391 : bp0c = ss;
23392 :
23393 : for (di = 0; di < cc; di++, bp0c++) {
23394 :
23395 : if (bp0c->b0 +1 < bp2c || (bp0c->b16 & 2) == 0)
23396 : continue;
23397 :
23398 : U16 bp4a;
23399 : X16 bp6e;
23400 : X16 bp70;
23401 : Creature *bp26 ;
23402 : switch (bp0c->b7) {
23403 : case 3:
23404 :
23405 : si = (_4976_0c5a == _4976_5232 && bp12 == _4976_5236 && bp14 == _4976_5238) ? 1 : 0;
23406 :
23407 : break;
23408 :
23409 : case 2:
23410 :
23411 : if (_4976_0c5a != _4976_5232 || bp12 != _4976_5236 || bp14 != _4976_5238)
23412 :
23413 : break;
23414 :
23415 : switch (bp0c->w8) {
23416 : default:
23417 :
23418 : break;
23419 :
23420 : case 1:
23421 :
23422 : if (false
23423 : || bp0c->w10 == 0
23424 : ||(bp0c->w10 & (1 << ((CALC_VECTOR_DIR(_4976_5236, _4976_5236, bp42, bp44) - _4976_5234) & 3))) != 0
23425 : ) {
23426 :
23427 : goto _31c0;
23428 : }
23429 :
23430 : bp37 = 0xff;
23431 :
23432 : break;
23433 :
23434 : case 3:
23435 :
23436 : bp4a = GET_TILE_VALUE(bp12 + _4976_0232[bp30], bp14 + _4976_023a[bp30]);
23437 :
23438 : if ((bp4a >> 5) == ttPit && (bp4a & 8) != 0 && (bp4a & 1) == 0)
23439 :
23440 : goto _31c0;
23441 :
23442 : bp37 = 0xff;
23443 :
23444 : break;
23445 : }
23446 :
23447 : case 8:
23448 :
23449 : if ((_4976_521c >> 5) == 0)
23450 :
23451 : break;
23452 :
23453 : goto _3049;
23454 :
23455 : case 9:
23456 :
23457 : _3049:
23458 : _4976_4eee &= bp0c->w10;
23459 :
23460 : si = _19f0_05e8(bp0c->w8, bp04, &bp0c->w2, bp42, bp44, bp30, (bp0c->b7 == 9) ? 1 : 0);
23461 :
23462 : if (si != 0) {
23463 :
23464 : bp0c->w4.SetX(_4976_5216);
23465 :
23466 : bp0c->w4.SetY(_4976_5218);
23467 :
23468 : bp0c->w4.SetMap(_4976_521a);
23469 :
23470 : bp0c->b6 = bp1a[_4976_521a][_4976_5216][_4976_5218]->b0 -1;
23471 : }
23472 :
23473 : _4976_4eee = bp0084;
23474 :
23475 : break;
23476 :
23477 : case 15:
23478 : case 17:
23479 :
23480 : si = _19f0_2165(0, bp42, bp44, bp12, bp14, bp30, bp0c->w8);
23481 :
23482 : if (si == 0 && _4976_522c != 0)
23483 :
23484 : bp37 = 0xff;
23485 :
23486 : break;
23487 :
23488 : case 19:
23489 :
23490 : if ((_4976_4ec6->b15 & 3) != bp30)
23491 :
23492 : break;
23493 :
23494 : goto _3148;
23495 :
23496 : case 18:
23497 :
23498 : _3148:
23499 : if ((bp36 = _19f0_050f()) == ObjectID::FFFE)
23500 :
23501 : break;
23502 :
23503 : bp26 = GET_ADDRESS_OF_RECORD4(bp36);
23504 :
23505 : if (bp26->CreatureType() != bp0c->w8)
23506 :
23507 : break;
23508 :
23509 : si = (bp0c->w10 == 1) ? 1 : 0;
23510 :
23511 : if (si != 0)
23512 :
23513 : break;
23514 :
23515 : if (bp0c->w10 == 2) {
23516 :
23517 : for (bp36 = bp26->GetPossessionObject(); bp36 != bp36.FFFE; bp36 = GET_NEXT_RECORD_LINK(bp36)) {
23518 :
23519 : if (bp36.DBType() != dbMissile && bp36.Dir() != bp30) {
23520 :
23521 : _31c0:
23522 : si = 1;
23523 :
23524 : break;
23525 : }
23526 :
23527 : }
23528 :
23529 : break;
23530 : }
23531 :
23532 : bp6e = bp12 + _4976_0232[bp30];
23533 :
23534 : bp70 = bp14 + _4976_023a[bp30];
23535 :
23536 : if (_4976_0c5a != _4976_5232 || bp6e != _4976_5236 || bp70 != _4976_5238) {
23537 :
23538 : bp36 = GET_CREATURE_AT(bp6e, bp70);
23539 :
23540 : si = (bp36 != bp36.FFFF && (_0cee_2de0(bp36) & 1) == 0) ? 1 : 0;
23541 : }
23542 : else {
23543 :
23544 : si = 1;
23545 : }
23546 :
23547 : if (si == 0)
23548 :
23549 : bp37 = 0xff;
23550 :
23551 : break;
23552 :
23553 : case 20:
23554 :
23555 : bp36 = _19f0_050f();
23556 :
23557 : if (bp36 == bp36.FFFE)
23558 :
23559 : break;
23560 :
23561 : if (_1c9a_0006(bp36, bp0c->w8) == 0)
23562 :
23563 : break;
23564 :
23565 : _1c9a_19d4(bp36, bp12, bp14, bp0c->w10);
23566 :
23567 : si = 1;
23568 :
23569 : break;
23570 :
23571 : case 22:
23572 :
23573 : if ((_4976_521c & 16) == 0)
23574 :
23575 : break;
23576 :
23577 : si = _19f0_2813(bp0c->w10, bp42, bp44, bp12,bp14,bp30,bp0c->w8);
23578 :
23579 : if (si==0)
23580 :
23581 : bp37=0xff;
23582 :
23583 : break;
23584 :
23585 : case 23:
23586 :
23587 : if ((_4976_521c & 16)!=0){
23588 :
23589 : _24a5_036a(bp2c,bp30,bp12,bp14,4);
23590 :
23591 : bp37=0xff;
23592 : }
23593 :
23594 : break;
23595 :
23596 : case 26:
23597 :
23598 : if (bp0c->w8 == 1 && (_4976_0c5a != _4976_5232 || bp12 != _4976_5236 || bp14 != _4976_5238))
23599 :
23600 : break;
23601 :
23602 : if (_19f0_0d10(bp0c->w10,bp42,bp44,bp12,bp14,bp30)!=0)
23603 :
23604 : si=1;
23605 :
23606 : break;
23607 :
23608 : case 4:
23609 : case 5:
23610 : case 6:
23611 : case 7:
23612 : case 10:
23613 : case 11:
23614 : case 12:
23615 : case 13:
23616 : case 14:
23617 : case 16:
23618 : case 21:
23619 : case 24:
23620 : case 25:
23621 :
23622 : break;
23623 : }
23624 :
23625 : if (si != 0)
23626 : break;
23627 :
23628 : }
23629 : }
23630 :
23631 : if (bp5f == 0) {
23632 :
23633 : bp04[bp12][bp14]->b0 = bp37;
23634 : }
23635 : }
23636 :
23637 : _3368:
23638 : if (si == 0)
23639 :
23640 : goto _3586;
23641 :
23642 : if ((bp0c->b16 & 16) == 0) {
23643 :
23644 : if ((bp0c->b16 & 32) != 0) {
23645 :
23646 : bp0c->w2.SetX(_4976_5236);
23647 :
23648 : bp0c->w2.SetY(_4976_5238);
23649 :
23650 : bp0c->w2.SetMap(_4976_5232);
23651 : }
23652 : else {
23653 :
23654 : bp0c->w2.SetX(bp12);
23655 :
23656 : bp0c->w2.SetY(bp14);
23657 :
23658 : bp0c->w2.SetMap(bp16);
23659 : }
23660 :
23661 : if (bp37 != 0) {
23662 :
23663 : bp0c->b6 = i8(bp2c -1);
23664 :
23665 : bp12 = bp42;
23666 : bp14 = bp44;
23667 : bp16 = bp46;
23668 : }
23669 : else {
23670 :
23671 : bp0c->b6 = i8(bp2c);
23672 : }
23673 :
23674 : bp0c->w4.SetX(bp12);
23675 :
23676 : bp0c->w4.SetY(bp14);
23677 :
23678 : bp0c->w4.SetMap(bp16);
23679 : }
23680 :
23681 : bp34 = di;
23682 :
23683 : if (false
23684 : || di != 0
23685 : || ((bp0c->b16 & 4) != 0 && bp0c->b0 > bp2c)
23686 : ) {
23687 :
23688 : cc = di;
23689 :
23690 : while (ss[--di].b1 < 0) {
23691 :
23692 : if (di == 0)
23693 :
23694 : goto _35ba;
23695 : }
23696 :
23697 : if ((bp0c->b16 & 4) == 0) {
23698 :
23699 : cc = di +1;
23700 : }
23701 :
23702 : if ((bp0c->b16 & 64) == 0) {
23703 :
23704 : i16 bp2e = 0;
23705 :
23706 : do {
23707 :
23708 : bp12 = ss[di].b1;
23709 :
23710 : if (bp12 > 0)
23711 :
23712 : bp2e += bp12;
23713 :
23714 : if (ss[di].b0 > bp2c +bp2e) {
23715 :
23716 : ss[di].b0 = i8(bp2c) +i8(bp2e);
23717 : }
23718 :
23719 : } while (--bp2e >= 0);
23720 : }
23721 :
23722 : X8 bp38 = 0;
23723 : bp3e = 0;
23724 :
23725 : for (di = 0; di < cc; di++) {
23726 :
23727 : bp3c = ss[di].b16;
23728 :
23729 : bp38 = bp38 | X8(bp3c);
23730 :
23731 : if (di == 0 || ss[di].b6 < 0) {
23732 :
23733 : X16 bp2e = ss[di].b0;
23734 :
23735 : if ((bp3c & 2) != 0)
23736 :
23737 : bp2e++;
23738 :
23739 : bp3e = max_value(bp2e, bp3e);
23740 : }
23741 :
23742 : }
23743 :
23744 : si = 0;
23745 :
23746 : _3586:
23747 : bp30 = (bp30 +bp40) & 3;
23748 :
23749 : _3592:
23750 : if (--bp32 != 0 && ((bp28 +1) & 255) != bp2a)
23751 :
23752 : goto _2301;
23753 :
23754 : if (bp2a != bp28)
23755 :
23756 : goto _2200;
23757 :
23758 : _35b1:
23759 : if (bp34 == 0xffff)
23760 :
23761 : goto _36d0;
23762 : }
23763 :
23764 : _35ba:
23765 : bp0c = &ss[bp34];
23766 :
23767 : bp42 = bp0c->w4.GetX();
23768 :
23769 : bp44 = bp0c->w4.GetY();
23770 :
23771 : bp46 = bp0c->w4.GetMap();
23772 :
23773 : for (bp2c = bp0c->b6; --bp2c >= 0; ) {
23774 :
23775 : bp74 = *(bp1a[bp46][bp42][bp44]);
23776 :
23777 : tt[bp2c].b0_0_2(bp74.b1);
23778 :
23779 : tt[bp2c].b0_3_7(bp42);
23780 :
23781 : tt[bp2c].b1_0_4(bp44);
23782 :
23783 : if (bp74.w2.GetMap() == bp46) {
23784 :
23785 : tt[bp2c].b1_5_5(0);
23786 : }
23787 : else {
23788 :
23789 : bp46 = bp74.w2.GetMap();
23790 :
23791 : tt[bp2c].b1_5_5(1);
23792 : }
23793 :
23794 : bp42 = bp74.w2.GetX();
23795 :
23796 : bp44 = bp74.w2.GetY();
23797 :
23798 : }
23799 :
23800 : _36d0:
23801 : if (bp56 != 0) {
23802 :
23803 : for (bp12 = 0; _4976_4d0e->nMaps > bp12; bp12++) {
23804 :
23805 : bp3a = bp1e[bp12];
23806 :
23807 : if (bp3a >= 0)
23808 :
23809 : _3e74_58a3(bp3a);
23810 :
23811 : }
23812 : }
23813 :
23814 : DEALLOC_UPPER_MEMORY(bp6c);
23815 :
23816 : _1c9a_0648(bp48);
23817 :
23818 : return bp34;
23819 : }
23820 :
23821 :
23822 : void _1c9a_0648(U16 xx)
23823 : {
23824 :
23825 : ENTER(0);
23826 :
23827 : U16 si = xx;
23828 : if (_4976_0c5a != si) {
23829 : CHANGE_CURRENT_MAP_TO(si);
23830 : if (si == _4976_4c12) {
23831 :
23832 : _4976_5234 = _4976_4c10;
23833 : _4976_5236 = _4976_4c04;
23834 : _4976_5238 = _4976_4c1e;
23835 : _4976_5232 = _4976_4c12;
23836 : }
23837 : else {
23838 : _4976_5234 = _4976_4bf6;
23839 : _4976_5236 = _4976_4bfa;
23840 : _4976_5238 = _4976_4c06;
23841 : _4976_5232 = _4976_4bf4;
23842 : }
23843 : }
23844 :
23845 : return;
23846 : }
23847 :
23848 :
23849 : void _1c9a_02f6(i16 xx, i16 yy)
23850 : {
23851 :
23852 : ENTER(34);
23853 :
23854 : U16 si = 0;
23855 :
23856 : i16 bp0c = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4218, dtWordValue, 0x6d);
23857 :
23858 : if (bp0c == 0) {
23859 :
23860 : _4976_4cb8 = 0;
23861 :
23862 : _4976_52d4 = 0;
23863 : _4976_38f0 = 0;
23864 : _4976_52d6 = 0;
23865 : _4976_38f2 = 0;
23866 :
23867 : return;
23868 : }
23869 :
23870 : if (bp0c > 8) {
23871 :
23872 : bp0c = 8;
23873 : }
23874 :
23875 : skxxx9 bp22;
23876 : bp22.b0 = i8(bp0c);
23877 : bp22.b1 = 0;
23878 : bp22.b7 = 0x17;
23879 :
23880 : skxxxc bp0a[5];
23881 : _1c9a_1bd8(xx, yy, 7, 0, 1, &bp22, bp0a);
23882 :
23883 : if (_4976_52d4 != _4976_38f0) {
23884 :
23885 : _4976_38f0 = _4976_52d4;
23886 : si = 1;
23887 : }
23888 :
23889 : if (_4976_52d6 != _4976_38f2) {
23890 :
23891 : _4976_38f2 = _4976_52d6;
23892 : si = 1;
23893 : }
23894 :
23895 : if (si != 0) {
23896 :
23897 : _24a5_013d();
23898 : }
23899 :
23900 : _4976_4cb8 = 0;
23901 :
23902 : return;
23903 : }
23904 :
23905 :
23906 : void _38c8_03ad()
23907 : {
23908 :
23909 : ENTER(0);
23910 :
23911 : _4976_4c38 = 0;
23912 : _4976_4bfe = 0;
23913 : _4976_4c3e = 0;
23914 : _4976_4ddc = 0;
23915 : _4976_4be8 = 0;
23916 : _4976_5bec = 0;
23917 :
23918 : ZERO_MEMORY(_4976_580a, 16);
23919 :
23920 : ZERO_MEMORY(_4976_536e, 48);
23921 :
23922 : _4976_5366 = 0;
23923 : _4976_5dbc = 0;
23924 :
23925 : _1c9a_3bd7();
23926 :
23927 : _1031_0541(5);
23928 :
23929 : _13ae_0009(U8(_4976_4bf4));
23930 :
23931 : _4976_4bd8 = 0;
23932 :
23933 : if (_4976_4c24 == 0) {
23934 :
23935 : FIRE_FILL_SCREEN_RECT(2, 0);
23936 :
23937 : _0aaf_0067(_0aaf_02f8(6, 0));
23938 :
23939 : U16 si = _4976_5d10;
23940 :
23941 : if (si != 0) {
23942 :
23943 : _4976_5d10 = 1;
23944 :
23945 : GRAPHICS_DATA_CLOSE();
23946 : }
23947 :
23948 : _2066_03e0(0);
23949 :
23950 : if (si != 0) {
23951 :
23952 : GRAPHICS_DATA_OPEN();
23953 :
23954 : _4976_5d10 = si;
23955 : }
23956 :
23957 : WAIT_SCREEN_REFRESH();
23958 : }
23959 : else {
23960 :
23961 : WAIT_SCREEN_REFRESH();
23962 :
23963 : _4976_01ba = 0;
23964 : }
23965 :
23966 : FIRE_FILL_SCREEN_RECT(2, 0);
23967 :
23968 : _29ee_000f();
23969 :
23970 : _2f3f_0789();
23971 :
23972 : _4976_4c02 = 1;
23973 :
23974 : _1c9a_02f6(_4976_4bfa, _4976_4c06);
23975 :
23976 : return;
23977 : }
23978 :
23979 :
23980 : void _101b_0001(U16 xx)
23981 : {
23982 :
23983 : ENTER(2);
23984 :
23985 : _443c_085a();
23986 :
23987 : if (xx != 0 && _4976_4c26 == 0) {
23988 :
23989 : U8 bp01 = (_4976_4c3c > 0) ? _4976_53b4[0].HeroType() : 0xfe;
23990 :
23991 : QUEUE_NOISE_GEN2(0x16, bp01, 0x87, 0xfe, _4976_4bfa, _4976_4c06, 0, 255, 255);
23992 :
23993 : SLEEP_SEVERAL_TIME(240);
23994 : }
23995 :
23996 : _2066_03e0(0);
23997 :
23998 : _4976_01ba = 1;
23999 :
24000 : if (xx != 0) {
24001 :
24002 : FIRE_FILL_SCREEN_RECT(2, 0);
24003 :
24004 : if (_4976_5bf6 != 0) {
24005 :
24006 : _4976_5bf2 = (_0aaf_0067(_0aaf_02f8(16, 0)) == 0) ? 1 : 0;
24007 :
24008 : if (_4976_5bf2 != 0) {
24009 :
24010 : _4976_4c24 = 0;
24011 :
24012 : if (GAME_LOAD() != -1) {
24013 :
24014 : _38c8_03ad();
24015 :
24016 : _4976_5bf2 = 0;
24017 :
24018 : _443c_086b();
24019 :
24020 : _1031_098e();
24021 :
24022 : return;
24023 : }
24024 : }
24025 : }
24026 : }
24027 :
24028 : FIRE_FILL_SCREEN_RECT(2, 0);
24029 :
24030 : FIRE_SELECT_PALETTE_SET(0);
24031 :
24032 : _0b36_1757(0x06, 0x00, 0x01, 2, 0xffff);
24033 :
24034 : FIRE_SELECT_PALETTE_SET(1);
24035 :
24036 : _1031_0541(1);
24037 :
24038 : while (_1031_1e6a(), _4976_4dfa != 239);
24039 :
24040 : SK_PREPARE_EXIT();
24041 :
24042 : return;
24043 : }
24044 :
24045 :
24046 : void _2066_0d09()
24047 : {
24048 :
24049 : ENTER(132);
24050 :
24051 : U16 bp18 = 0;
24052 : U8 bp21 = 0;
24053 :
24054 : _2759_0541();
24055 :
24056 : _2759_0644(0);
24057 :
24058 : _38c8_0002();
24059 :
24060 : _443c_085a();
24061 :
24062 : REARRANGE_TIMERLIST();
24063 :
24064 : if (_4976_49a0 == 0 && _4976_5eb0 != 0)
24065 :
24066 : _476d_04e8(2);
24067 :
24068 : _4976_52f4 = 2;
24069 :
24070 :
24071 : _0d50:
24072 : _4976_5258 = 0;
24073 :
24074 : _4976_5246 = NULL;
24075 : _4976_5240 = NULL;
24076 : _4976_525e = NULL;
24077 :
24078 : U8 bp13 = 0;
24079 : U16 bp16 = 0;
24080 :
24081 : do {
24082 :
24083 : if (_4976_49a0 == 0 && bp13 != 0)
24084 :
24085 : _476d_04e8(2);
24086 :
24087 : U16 bp0e = _0aaf_0067(_0aaf_02f8((_4976_49a0 != 0) ? 0x12 : 0x0b, bp13));
24088 :
24089 : if (bp0e == 3)
24090 :
24091 : goto _1523;
24092 :
24093 : if (bp0e == 2) {
24094 :
24095 : _2066_046d();
24096 :
24097 : bp13 = 0;
24098 : }
24099 :
24100 : else if (bp0e == 1) {
24101 :
24102 : if (true
24103 : && _4976_4c1a +100 < _4976_4bec
24104 : && _4976_523c +100 < _4976_4bec
24105 : && _0aaf_0067(_0aaf_02f8(0x0c, 0x00)) == 3
24106 : ) {
24107 :
24108 :
24109 : bp13 = 0;
24110 : }
24111 : else {
24112 :
24113 : _443c_086b();
24114 :
24115 : _4976_5bf6 = 0;
24116 :
24117 : bp18 = 1;
24118 :
24119 : goto _1523;
24120 : }
24121 : }
24122 :
24123 : else if (bp0e == 0) {
24124 :
24125 : if (_4976_49a0 != 0 || _476d_04af(0) == 1) {
24126 :
24127 : bp16 = 1;
24128 : }
24129 : else {
24130 :
24131 : bp16 = 0;
24132 :
24133 : switch (_4976_5eb8) {
24134 : case 0:
24135 :
24136 : bp13 = 0x15;
24137 :
24138 : break;
24139 :
24140 : case 2:
24141 :
24142 : bp13 = 0x16;
24143 :
24144 : break;
24145 :
24146 : case 4:
24147 :
24148 : bp13 = 0x17;
24149 :
24150 : break;
24151 :
24152 : case 3:
24153 :
24154 : bp13 = 0x1a;
24155 :
24156 : break;
24157 :
24158 : case 1:
24159 :
24160 : break;
24161 : }
24162 : }
24163 : }
24164 :
24165 : } while (bp16 == 0);
24166 :
24167 :
24168 : U8 *bp1c = ALLOC_MEMORY(1024, afDefault, 128);
24169 :
24170 : U16 bp20 = 1;
24171 : i16 bp1e = 3;
24172 :
24173 : goto _100f;
24174 :
24175 : _0eb7:
24176 : goto _1045;
24177 :
24178 :
24179 : _100f:
24180 : if (bp1e >= 0)
24181 :
24182 : goto _0eb7;
24183 :
24184 : DEALLOC_UPPER_MEMORY(1024);
24185 :
24186 : if (bp20 != 0) {
24187 :
24188 : _0aaf_0067(_0aaf_02f8(0x13, bp21));
24189 :
24190 : bp21 = 0x14;
24191 :
24192 : goto _0d50;
24193 : }
24194 :
24195 : _1045:
24196 : i16 bp0e = _2066_33e7();
24197 :
24198 : if (bp0e < 0)
24199 :
24200 : goto _0d50;
24201 :
24202 : _4976_525c = bp0e;
24203 : _4976_52e2 = U8(_4976_525c) +0x30;
24204 :
24205 : _0aaf_02f8(0x0d, 0x00);
24206 :
24207 : U8 *bp08 = FORMAT_SKSTR(_4976_19d0, NULL);
24208 :
24209 : U8 *bp0c = FORMAT_SKSTR(_4976_19d4, NULL);
24210 :
24211 : DELETE_FILE(bp0c);
24212 :
24213 : FILE_RENAME(bp08, bp0c);
24214 :
24215 : _4976_394e = FILE_CREATE(bp08);
24216 :
24217 : if (_4976_394e < 0)
24218 :
24219 : goto _14fa;
24220 :
24221 : i16 bp10 = FILE_OPEN(bp0c);
24222 :
24223 : sksave_header_asc bp4c;
24224 : if (bp10 >= 0) {
24225 :
24226 : READ_FILE(bp10, 42, &bp4c);
24227 :
24228 : CLOSE_FILE(bp10);
24229 : }
24230 : else {
24231 :
24232 : bp4c.w38 = 0;
24233 : }
24234 :
24235 : bp4c.w0 = 1;
24236 :
24237 : SK_STRCPY(bp4c.b2, _4976_5268);
24238 :
24239 : WRITE_FILE(_4976_394e, 42, &bp4c);
24240 :
24241 : if (SKSAVE_WRITE(_4976_4d0e, 44) == 0)
24242 :
24243 : goto _14fa;
24244 :
24245 : if (SKSAVE_WRITE(_4976_4dba, _4976_4d0e->nMaps << 4) == 0)
24246 :
24247 : goto _14fa;
24248 :
24249 : if (SKSAVE_WRITE(_4976_4c7c, _4976_4cb4 << 1) == 0)
24250 :
24251 : goto _14fa;
24252 :
24253 :
24254 : if (SKSAVE_WRITE(_4976_4d16, _4976_4d0e->cwListSize << 1) == 0)
24255 : goto _14fa;
24256 :
24257 : if (SKSAVE_WRITE(_4976_4d12, _4976_4d0e->cwTextData << 1) == 0)
24258 : goto _14fa;
24259 :
24260 :
24261 : for (bp0e = 0; bp0e < 16; bp0e++) {
24262 :
24263 : if (SKSAVE_WRITE(_4976_4cca[bp0e], dbSize[bp0e] * _4976_4d0e->nRecords[bp0e]) == 0)
24264 :
24265 : goto _14fa;
24266 :
24267 : }
24268 :
24269 : if (SKSAVE_WRITE(_4976_4db6, _4976_4d0e->cbMapData) == 0)
24270 :
24271 : goto _14fa;
24272 :
24273 : _1c9a_3bab();
24274 :
24275 : COMPACT_TIMERLIST();
24276 :
24277 : sksave_table_84 bp0084;
24278 : ZERO_MEMORY(&bp0084, 56);
24279 :
24280 : bp0084.bp84 = _4976_4bec;
24281 : bp0084.bp80 = _4976_49ba;
24282 : bp0084.bp7c = _4976_4c3c;
24283 : bp0084.bp7a = _4976_4bfa;
24284 : bp0084.bp78 = _4976_4c06;
24285 : bp0084.bp76 = _4976_4bf6;
24286 : bp0084.bp74 = _4976_4bf4;
24287 : bp0084.bp72 = _4976_3fc6;
24288 : bp0084.bp70 = _4976_5c1e;
24289 : bp0084.bp6e = _4976_0090;
24290 : bp0084.bp6a = _4976_4b80;
24291 : bp0084.bp66 = _4976_4c00;
24292 : bp0084.bp64 = _4976_4c14;
24293 : bp0084.bp62 = _4976_4c0c;
24294 :
24295 : bp0084.bp5c = _4976_5c5d;
24296 : bp0084.bp5a = _4976_5c63;
24297 : bp0084.bp59 = _4976_5c6a;
24298 : bp0084.bp58 = _4976_5c5e;
24299 : bp0084.bp57 = _4976_5c60;
24300 : bp0084.bp56 = _4976_5c61;
24301 : bp0084.bp55 = _4976_5c64;
24302 : bp0084.bp54 = _4976_5c66;
24303 : bp0084.bp52 = _4976_5c5f;
24304 : bp0084.bp51 = _4976_5c62;
24305 : bp0084.bp50 = _4976_5c6e;
24306 :
24307 :
24308 : if (SUPPRESS_WRITER(&bp0084, _4976_395a, 56, 1) != 0)
24309 : goto _14fa;
24310 :
24311 : if (SUPPRESS_WRITER(_4976_5f52, _4976_3956, 1, 8) != 0)
24312 : goto _14fa;
24313 :
24314 : if (SUPPRESS_WRITER(_4976_5f12, _4976_3956, 1, 64) != 0)
24315 : goto _14fa;
24316 :
24317 : if (SUPPRESS_WRITER(_4976_5f5a, _4976_3956, 2, 64) != 0)
24318 : goto _14fa;
24319 :
24320 : if (SUPPRESS_WRITER(_4976_53b4, _4976_3992, 261, _4976_4c3c) != 0)
24321 : goto _14fa;
24322 :
24323 : if (SUPPRESS_WRITER(&_4976_57e4, _4976_3a97, 6, 1) != 0)
24324 : goto _14fa;
24325 :
24326 : if (SUPPRESS_WRITER(_4976_5c20, _4976_3a9d, 10, _4976_5c1e) != 0)
24327 : goto _14fa;
24328 :
24329 : _4976_5240 = reinterpret_cast<U16 *>(ALLOC_MEMORY(_4976_4d0e->nRecords[dbContainer] << 1, afDefault, 1024));
24330 :
24331 : _4976_5246 = reinterpret_cast<U16 *>(ALLOC_MEMORY(_4976_4d0e->nRecords[dbCreature] << 1, afDefault, 1024));
24332 :
24333 : _4976_525e = reinterpret_cast<U16 *>(ALLOC_MEMORY(200, afDefault, 1024));
24334 :
24335 : _4976_3954 = _4976_3952 = _4976_3950 = 0;
24336 :
24337 : _4976_5258 = 0;
24338 :
24339 : for (bp0e = 0; bp0e < _4976_4c3c; bp0e++) {
24340 :
24341 : ObjectID *bp04 = _4976_53b4[bp0e].w193;
24342 :
24343 : for (i16 bp12 = 0; bp12 < 30; bp12++) {
24344 :
24345 : if (WRITE_RECORD_CHECKCODE(*(bp04++), 0, 0) != 0)
24346 : goto _14fa;
24347 :
24348 : }
24349 :
24350 : }
24351 :
24352 : if (WRITE_RECORD_CHECKCODE(_4976_57c8.w0, 0, 0) != 0)
24353 : goto _14fa;
24354 :
24355 : if (STORE_EXTRA_DUNGEON_DATA() == 0)
24356 : goto _14fa;
24357 :
24358 : if (WRITE_POSSESSION_INDICES() != 0)
24359 : goto _14fa;
24360 :
24361 : if (SUPPRESS_FLUSH() != 0)
24362 : goto _14fa;
24363 :
24364 : CLOSE_FILE(_4976_394e);
24365 :
24366 : _4976_5bf6 = 1;
24367 :
24368 : _4976_523c = _4976_4bec;
24369 :
24370 : goto _1523;
24371 :
24372 :
24373 : _14fa:
24374 : CLOSE_FILE(_4976_394e);
24375 :
24376 : DELETE_FILE(bp08);
24377 :
24378 : _0aaf_0067(_0aaf_02f8(0x00, 0x1b));
24379 :
24380 : _1523:
24381 :
24382 : if (_4976_525e != NULL) {
24383 :
24384 : DEALLOC_UPPER_MEMORY(200);
24385 : }
24386 :
24387 : if (_4976_5246 != NULL) {
24388 :
24389 : DEALLOC_UPPER_MEMORY(U32(_4976_4d0e->nRecords[dbCreature]) << 1);
24390 : }
24391 :
24392 : if (_4976_5240 != NULL) {
24393 :
24394 : DEALLOC_UPPER_MEMORY(U32(_4976_4d0e->nRecords[dbContainer] << 1));
24395 : }
24396 :
24397 : _1c9a_3b74();
24398 :
24399 : if (bp18 != 0) {
24400 :
24401 : _101b_0001(0);
24402 : }
24403 :
24404 : _2066_03e0(0);
24405 :
24406 : _38c8_0060();
24407 :
24408 : _443c_086b();
24409 :
24410 : return;
24411 : }
24412 :
24413 : void _2481_01d8();
24414 :
24415 : i16 _2c1d_105f(U16 xx)
24416 : {
24417 :
24418 : ENTER(6);
24419 :
24420 : if (_4976_57e8 != 0)
24421 : return 1;
24422 :
24423 : sk53b4 *bp04 = &_4976_53b4[xx];
24424 : U16 bp06 = _2c1d_0ffc(bp04);
24425 : U16 di = _2c1d_203d(xx);
24426 : U16 si;
24427 :
24428 : if (bp06 > di) {
24429 : si = 2;
24430 : if ((U32(bp06) << 3) > bp06 * 5U) {
24431 :
24432 : si++;
24433 : }
24434 :
24435 : di = 1;
24436 : }
24437 : else {
24438 :
24439 : si = ((di -bp06) << 2) / bp06 +4;
24440 : di = 2;
24441 : }
24442 :
24443 : if ((bp04->w52 & 0x20) != 0)
24444 : si += di;
24445 :
24446 : si = max_value(1, si -bp04->b259);
24447 : if (si > 2) {
24448 : si = (si +1) & 0xfffe;
24449 : }
24450 : return si;
24451 : }
24452 :
24453 : X16 _12b4_0881(X16 aa, U16 ss, U16 tt, i16 xx, i16 yy, ObjectID *rl)
24454 : {
24455 :
24456 : ENTER(0);
24457 :
24458 : xxx;
24459 :
24460 : return;
24461 : }
24462 : void _12b4_023f(i16 xx, i16 yy, i16 *ss, i16 *tt, i16 ww, X16 vv);
24463 : X16 _12b4_0bf1(i16 xx, i16 yy, i16 ww, ObjectID *rl);
24464 : X16 _12b4_099e(ObjectID rl);
24465 :
24466 :
24467 :
24468 : U16 _12b4_0300(X16 xx)
24469 : {
24470 :
24471 : ENTER(38);
24472 :
24473 : ObjectID bp14;
24474 : U16 bp06 = GET_TILE_VALUE(_4976_4c2e, _4976_4c30);
24475 : X16 bp08 = ((bp06 >> 5) == ttStairs) ? 1 : 0;
24476 : i16 bp26 = 1;
24477 : sk53b4 *bp04 = _4976_53b4;
24478 :
24479 : U16 si;
24480 : for (si = 0; si < _4976_4c3c; bp04++, si++) {
24481 :
24482 : if (bp04->curHP() != 0) {
24483 : bp26 = max_value(bp26, _2c1d_105f(si));
24484 : }
24485 :
24486 : }
24487 :
24488 : if ((bp26 > 1 && _4976_4bea == 0 && xx != 3 && xx == 5 && _4976_4c08 == 0 && bp08 == 0) || _4976_19ba != ObjectID::FFFF) {
24489 :
24490 : _4976_4bea = bp26 >> 1;
24491 : _4976_4c32 = _4976_4bfa;
24492 : _4976_4c34 = _4976_4c06;
24493 : _4976_4c40 = _4976_4bf6;
24494 : _4976_4bf2 = xx;
24495 : if (xx != 3) {
24496 : _0cee_02dd(_4976_4bf6, -1, 0, &_4976_4c32, &_4976_4c34);
24497 : }
24498 : goto _0768;
24499 : }
24500 :
24501 : U16 bp10;
24502 : if (_4976_19ba != ObjectID::FFFF) {
24503 :
24504 : if (true
24505 : && _4976_4bf6 == _4976_4c40 && _4976_4bf4 == _4976_4eaa && _4976_4bfa == _4976_4eae && _4976_4c06 == _4976_4eb0
24506 : && GET_CREATURE_AT(_4976_4eb8, _4976_4eba) == _4976_19ba
24507 : ) {
24508 :
24509 : _4976_19ba = ObjectID::FFFF;
24510 : bp10 = _4976_4bf4;
24511 : if (xx == 3) {
24512 :
24513 : _12b4_0d75(_4976_4eb8, _4976_4eba, _4976_4eac, 0xfe);
24514 : }
24515 :
24516 : if (_12b4_0300(xx) != 0) {
24517 :
24518 : _12b4_0141(_4976_4eb2);
24519 : if (xx != 3) {
24520 :
24521 : CHANGE_CURRENT_MAP_TO(bp10);
24522 : _12b4_0d75(_4976_4eb8, _4976_4eba, _4976_4eac, 0xfe);
24523 : }
24524 : }
24525 :
24526 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
24527 : }
24528 :
24529 : _4976_19ba = ObjectID::FFFF;
24530 : if (_4976_4ddc == 0)
24531 : _4976_0c5c = 6;
24532 :
24533 : return 1;
24534 : }
24535 :
24536 : bp10 = _4976_0c5a;
24537 : X16 di = xx -3;
24538 :
24539 : if (_4976_4c08 != 0 && di == 2) {
24540 : CHANGE_CURRENT_MAP_TO(_4976_4c12);
24541 : }
24542 :
24543 : i16 bp1a = _4976_4c2e;
24544 : i16 bp1c = _4976_4c30;
24545 : i16 bp0e = _4976_4c2c;
24546 :
24547 : _0cee_02dd(bp0e, _4976_19b2[di], _4976_19b6[di], &bp1a, &bp1c);
24548 :
24549 : U16 bp0a = GET_TILE_VALUE(bp1a, bp1c);
24550 : _4976_4e5c = 1;
24551 : bp04 = _4976_53b4;
24552 :
24553 : for (si = 0; si < _4976_4c3c; bp04++, si++) {
24554 :
24555 : if (bp04->curHP() != 0) {
24556 :
24557 : _2c1d_1c7c(si, ((_2c1d_203d(si) * 3) / _2c1d_0ffc(bp04)) +1);
24558 : }
24559 :
24560 : }
24561 :
24562 : RESET_SQUAD_DIR();
24563 :
24564 : X16 bp12;
24565 : X16 bp24;
24566 : i16 bp16;
24567 : i16 bp18;
24568 : U16 bp0c;
24569 : switch (_12b4_0881(di, bp06, bp0a, bp1a, bp1c, &bp14)) {
24570 : case 1:
24571 :
24572 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, -1, 0);
24573 : _4976_4bfa = bp1a;
24574 : _4976_4c06 = bp1c;
24575 : bp06 = bp0a;
24576 : goto _05c2;
24577 : case 0:
24578 :
24579 : _05c2:
24580 : _12b4_00af(bp06 & 4);
24581 : break;
24582 : case 3:
24583 :
24584 : if (_4976_4c3c == 0)
24585 : break;
24586 :
24587 : bp12 = _0cee_2de0(bp14) & 1;
24588 : if (bp12 != 0 || _0cee_2e1e(bp14) == 0xff) {
24589 :
24590 : _12b4_023f(bp1a, bp1c, &bp16, &bp18, bp0e, di);
24591 : }
24592 :
24593 : bp24 = ((bp0e +xx) -3) & 3;
24594 : if (_12b4_0bf1(bp1a, bp1c, bp24, &bp14) != 0 && _12b4_099e(bp14) != 0) {
24595 :
24596 : _12b4_0d75(bp1a, bp1c, bp24, 0xfe);
24597 : goto _0685;
24598 : }
24599 :
24600 : if (bp12 != 0)
24601 : break;
24602 :
24603 : _13e4_0401(ObjectID::FFFF, bp1a, bp1c, 0x4005, 5, 0);
24604 : break;
24605 : case 5:
24606 :
24607 : _0685:
24608 : if (_4976_4c08 != 0 && di == 2) {
24609 :
24610 : CHANGE_CURRENT_MAP_TO(bp10);
24611 : bp1a = _4976_4c2e;
24612 : bp1c = _4976_4c30;
24613 : _0cee_02dd(bp0e = _4976_4c2c, -1, 0, &bp1a, &bp1c);
24614 : }
24615 :
24616 : if (bp08 != 0) {
24617 : MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, bp1a, bp1c);
24618 : goto _0768;
24619 : }
24620 :
24621 : TELE_inf bp22;
24622 : if (GET_TELEPORTER_DETAIL(&bp22, U8(bp1a), U8(bp1c)) != 0) {
24623 : if (((bp22.b1 +2) & 3) != bp0e) {
24624 :
24625 : CHANGE_CURRENT_MAP_TO(_4976_4bf4);
24626 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, -1, 0);
24627 : _13ae_0009(bp22.b4);
24628 : MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, bp22.b2, bp22.b3);
24629 : ROTATE_SQUAD(bp22.b1);
24630 : goto _0768;
24631 : }
24632 : }
24633 :
24634 : MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, bp1a, bp1c);
24635 :
24636 : _0768:
24637 : _4976_4c00 = bp26;
24638 : _4976_4c14 = 0;
24639 :
24640 : return 1;
24641 : case 2:
24642 :
24643 : if (_4976_4c3c == 0)
24644 : break;
24645 : _12b4_023f(bp1a, bp1c, &bp16, &bp18, bp0e, di);
24646 :
24647 : if ((bp0a >> 5) != ttDoor || (bp0a & 7) != 4)
24648 : break;
24649 :
24650 : bp0c = 0;
24651 : if (bp16 != 0xffff) {
24652 :
24653 : bp04 = &_4976_53b4[bp16];
24654 : bp0c += _2c1d_0e57(bp04, _2c1d_0ea2(bp04, 1, 0) + (RAND() & 15));
24655 : }
24656 :
24657 : if (bp18 != bp16 && bp18 != 0xffff) {
24658 :
24659 : bp04 = &_4976_53b4[bp18];
24660 : bp0c += _2c1d_0e57(bp04, _2c1d_0ea2(bp04, 1, 0) + (RAND() & 15));
24661 : }
24662 :
24663 : _075f_2205(bp1a, bp1c, bp0c, 0, 0);
24664 : break;
24665 : case 4:
24666 : break;
24667 : }
24668 :
24669 : _1031_098e();
24670 : _4976_4e5c = 0;
24671 : return 0;
24672 : }
24673 :
24674 :
24675 : Bit16u HANDLE_UI_EVENT(sk4e4e *ref)
24676 : {
24677 :
24678 :
24679 :
24680 :
24681 :
24682 : ENTER(46);
24683 :
24684 : Bit16u si = ref->w4;
24685 : Bit16u bp04 = ref->w0;
24686 : Bit16u bp06 = ref->w2;
24687 :
24688 : if (si >= 0x03 && si <= 0x06) {
24689 :
24690 : if (_4976_4c00 == 0 || (_4976_4c14 != 0 && ((_4976_4bf6 +si -3) & 3) == _4976_4c0c))
24691 :
24692 : goto _19b1;
24693 : }
24694 :
24695 : if (_4976_4bea != 0) {
24696 :
24697 : if (si == 0x01 || si == 0x02 || si == 0x03)
24698 :
24699 : goto _19b1;
24700 : }
24701 :
24702 : Bit16u di;
24703 : if (_4976_4dfe != 0) {
24704 :
24705 : _19b1:
24706 : _4976_4e5c = 1;
24707 :
24708 : di = 0;
24709 :
24710 :
24711 : return di;
24712 : }
24713 :
24714 : di = 1;
24715 :
24716 : _4976_4e5c = 0;
24717 :
24718 : if (si == 0xe3) {
24719 :
24720 : _1031_050c();
24721 : }
24722 :
24723 : else if (si == 0xe1) {
24724 :
24725 : _1031_04f5();
24726 : }
24727 :
24728 : else if (si == 0x02 || si == 0x01) {
24729 :
24730 : _12b4_0141(si);
24731 : }
24732 :
24733 : else if (si >= 0x03 && si <= 0x06) {
24734 :
24735 : _12b4_0300(si);
24736 : }
24737 :
24738 : else if (si >= 0x14 && si <= 0x42) {
24739 :
24740 : _2c1d_0889(si -0x14);
24741 : }
24742 :
24743 : else if (si >= 0xea && si <= 0xed) {
24744 :
24745 : _2c1d_0654(si -0xea);
24746 : }
24747 :
24748 : else if (si >= 0x7d && si <= 0x81) {
24749 :
24750 : if (si == 0x81) {
24751 :
24752 : _443c_0662();
24753 : }
24754 : else {
24755 :
24756 : _443c_04b6(si -0x7d);
24757 : }
24758 :
24759 : _1031_0667();
24760 :
24761 : goto _1ab8;
24762 : }
24763 :
24764 : else if (si >= 0xe4 && si <= 0xe9) {
24765 :
24766 : _2759_28db(si -0xe4);
24767 : }
24768 :
24769 : else if (si == 0x5d || si == 0x5e) {
24770 :
24771 : i16 bp02 = (si == 0x5d) ? -1 : 1;
24772 :
24773 : _4976_52af[_4976_5366].playerDir((_4976_52af[_4976_5366].playerDir() +bp02) & 3);
24774 :
24775 : _1ab8:
24776 : _2759_0644(0);
24777 : }
24778 :
24779 : else if (si >= 0x10 && si <= 0x13) {
24780 :
24781 : _1031_16a0(GET_PLAYER_AT_POSITION((si -0x10 + _4976_4bf6) & 3));
24782 :
24783 : _2e62_0cfa(0);
24784 : }
24785 :
24786 : else if (si >= 0x07 && si <= 0x0b) {
24787 :
24788 : if (_4976_4bfc != 0 && si <= 0x0b) {
24789 :
24790 :
24791 : _2f3f_04ea(_4976_4bfa, _4976_4c06, _4976_4bf6, _4976_4bf4, 0xa1);
24792 : }
24793 : else {
24794 :
24795 : Bit16u bp02 = si -0x07;
24796 :
24797 : if (bp02 == 4 || bp02 < _4976_4c3c) {
24798 :
24799 : if (_4976_4bfc == 0) {
24800 :
24801 : _24a5_1798(bp02);
24802 : }
24803 : }
24804 : }
24805 : }
24806 :
24807 : else if (si == 0x52) {
24808 :
24809 : if (_4976_3fc6 == 0xffff) {
24810 :
24811 : _24a5_1798(_4976_3fc6);
24812 : }
24813 : }
24814 :
24815 : else if (si == 0x6c) {
24816 :
24817 : _4976_4e5c = _2759_274d();
24818 :
24819 :
24820 : }
24821 :
24822 : else if (si == 0x6b) {
24823 :
24824 : REMOVE_RUNE_FROM_TAIL();
24825 : }
24826 :
24827 : else if (si >= 0x65 && si <= 0x6a) {
24828 :
24829 : ADD_RUNE_TO_TAIL(si -0x65);
24830 : }
24831 :
24832 : else if (si == 0x70) {
24833 :
24834 : _2759_1204(-1);
24835 : }
24836 :
24837 : else if (si >= 0x71 && si <= 0x73) {
24838 :
24839 : _4976_4e5c = _2759_1204(si -0x71);
24840 : }
24841 :
24842 : else if (si >= 0x74 && si <= 0x7b) {
24843 :
24844 : si -= 0x74;
24845 :
24846 : _2759_0589(si >> 1, ((si & 1) != 0) ? 1 : 0);
24847 : }
24848 :
24849 : else if (si >= 0x5f && si <= 0x62) {
24850 :
24851 : i16 bp02 = GET_PLAYER_AT_POSITION((si -0x5f + _4976_4bf6) & 3);
24852 :
24853 : if (bp02 >= 0) {
24854 :
24855 : _2759_0602(bp02);
24856 : }
24857 : }
24858 :
24859 : else if (si == 0x46) {
24860 :
24861 : _24a5_10fb(0xffff, 0xffff, 0xffff);
24862 : }
24863 :
24864 : else if (si == 0x47) {
24865 :
24866 : _24a5_174d();
24867 : }
24868 :
24869 : else if (si == 0x50) {
24870 :
24871 : _121e_0422(bp04, bp06);
24872 : }
24873 :
24874 : else if (si == 0x96) {
24875 :
24876 : _1031_16fd(si, bp04, bp06);
24877 : }
24878 :
24879 : else if (si >= 0x97 && si <= 0x9a) {
24880 :
24881 : _2759_13f5(si -0x97);
24882 : }
24883 :
24884 : else if (si == 0x93) {
24885 :
24886 : _4976_4c02 = 0;
24887 :
24888 : _38c8_0002();
24889 :
24890 : _44c8_1d26(_4976_4c16, _4976_4bda[0]);
24891 :
24892 : Bit8u bp2e[40];
24893 : _3929_0bd7(
24894 : 6,
24895 : _4976_4bda[4],
24896 : QUERY_GDAT_TEXT(0x01, 0x00, 0x12, bp2e)
24897 : );
24898 :
24899 : _44c8_1be8(0);
24900 :
24901 : _1031_0675(3);
24902 :
24903 : _1031_098e();
24904 : }
24905 :
24906 : else if (si == 0x94) {
24907 :
24908 : if (_4976_4c02 == 0) {
24909 :
24910 : _4976_4c02 = 1;
24911 :
24912 : _38c8_0060();
24913 :
24914 : _1031_06a5();
24915 :
24916 : _1031_098e();
24917 : }
24918 : }
24919 :
24920 : else if (true
24921 : && _4976_4c38 == 0
24922 : && _4976_4bfe == 0
24923 : && _4976_4c3e == 0
24924 : && _4976_4ddc == 0
24925 : ) {
24926 :
24927 : if (si == 0x91) {
24928 :
24929 : if (_4976_4bfc == 0) {
24930 :
24931 : _4976_3d59 = 0;
24932 :
24933 : if (_4976_52be != 0) {
24934 :
24935 : _24a5_1798(4);
24936 : }
24937 :
24938 : _4976_3d59 = 1;
24939 :
24940 : _2759_0541();
24941 :
24942 : _38c8_0002();
24943 :
24944 : _4976_4be8 = 1;
24945 :
24946 : if (_4976_4bea != 0) {
24947 :
24948 : _12b4_0300(_4976_4bf2);
24949 :
24950 : _4976_4bea = 0;
24951 : }
24952 :
24953 : _1031_1907();
24954 :
24955 : _44c8_1be8(0);
24956 :
24957 : _4976_4bf0 = 1;
24958 :
24959 : _1031_0541(2);
24960 :
24961 : _1031_098e();
24962 : }
24963 : }
24964 :
24965 : else if (si == 0x92) {
24966 :
24967 : _2c1d_14ba();
24968 : }
24969 :
24970 : else if (si == 0x8c) {
24971 :
24972 : if (_4976_4c3c > 0 && _4976_4bfc == 0) {
24973 :
24974 : _4976_4e62--;
24975 :
24976 : _2066_0d09();
24977 :
24978 : _4976_4e62++;
24979 : }
24980 : }
24981 :
24982 : else if (si == 0xa0 || si == 0xa1) {
24983 :
24984 : _2f3f_04ea(_4976_4bfa, _4976_4c06, _4976_4bf6, _4976_4bf4, si);
24985 : }
24986 :
24987 : else if (si == 0xd7) {
24988 :
24989 : _4976_4c24 = 1;
24990 : }
24991 :
24992 : else if (si == 0xd8) {
24993 :
24994 : _4976_4c24 = 1;
24995 : _4976_5bea = 1;
24996 : }
24997 :
24998 : else if (si == 0xd9) {
24999 :
25000 : _4976_4c24 = 0;
25001 : }
25002 :
25003 : else if (si == 0xda) {
25004 :
25005 : _2481_01d8();
25006 : }
25007 :
25008 : else if (si == 0xdf) {
25009 :
25010 : _4976_5bf2 = 1;
25011 : }
25012 :
25013 : else if (si == 0xe0) {
25014 :
25015 : SK_PREPARE_EXIT();
25016 : }
25017 : }
25018 :
25019 : if (_4976_4dfa >= 0xa5 && _4976_4dfa <= 0xc6)
25020 :
25021 : _4976_4e5c = 1;
25022 :
25023 : return di;
25024 : }
25025 :
25026 :
25027 : void _1031_1e6a()
25028 : {
25029 :
25030 : ENTER(0);
25031 :
25032 : if (_4976_4dfe != 0)
25033 :
25034 : _4976_4dfe--;
25035 :
25036 : _4976_4e48 = 0;
25037 :
25038 : do {
25039 :
25040 : _1031_0f3a();
25041 :
25042 : if (_4976_4e60 == _4976_4e5e)
25043 :
25044 : break;
25045 :
25046 : Bit16u si = _4976_4e60++;
25047 :
25048 : if (_4976_4e60 > 2)
25049 :
25050 : _4976_4e60 = 0;
25051 :
25052 : if (HANDLE_UI_EVENT(&_4976_4e6c[si]) != 0) {
25053 :
25054 : if (_4976_4e62 != 0)
25055 :
25056 : _4976_4e62--;
25057 : }
25058 : else {
25059 :
25060 : _4976_4e60 = si;
25061 : }
25062 :
25063 : } while (_4976_4e5c == 0);
25064 :
25065 : return;
25066 : }
25067 :
25068 :
25069 : Bit16u _476d_04ed(Bit16u xx)
25070 : {
25071 :
25072 : ENTER(0);
25073 :
25074 : return 0;
25075 : }
25076 :
25077 :
25078 : void _1031_0781(Bit16u xx);
25079 :
25080 :
25081 : void _4726_0383();
25082 :
25083 :
25084 : Bit16u _01b0_051a()
25085 : {
25086 :
25087 : ENTER(0);
25088 :
25089 : LOADDS(0x3083);
25090 :
25091 : if (_04bf_0282 != 0 && _04bf_0284 != 0) {
25092 :
25093 : _4726_0383() INDIRECT_CALL;
25094 : }
25095 :
25096 : return (_04bf_1886 != 0) ? 1 : 0;
25097 : }
25098 :
25099 :
25100 : Bit16u _476d_05a9()
25101 : {
25102 :
25103 : ENTER(0);
25104 :
25105 : return _01b0_051a() CALL_IBMIO;
25106 : }
25107 :
25108 : Bit8u _476d_04e8(Bit16u xx);
25109 : Bit16u _476d_04af(Bit16u xx);
25110 :
25111 : Bit16u _476d_050e();
25112 : void _1031_06a5();
25113 : Bit16u _2066_2ca8();
25114 : Bit16u _2066_32bb();
25115 :
25116 :
25117 : void _2fcf_0b8b(Bit16u xx, Bit16u yy, Bit16u zz)
25118 : {
25119 :
25120 : ENTER(6);
25121 :
25122 : _4976_4c12 = 0xffff;
25123 :
25124 : TELE_inf bp06;
25125 : _4976_4c08 = GET_TELEPORTER_DETAIL(&bp06, Bit8u(xx), Bit8u(yy));
25126 :
25127 : if (_4976_4c08 != 0) {
25128 :
25129 : _4976_4c12 = bp06.target_z();
25130 : _4976_4c04 = bp06.target_x_pos();
25131 : _4976_4c1e = bp06.target_y_pos();
25132 : _4976_4c10 = (_4976_4bf6 + (bp06.cross_scene_test_of_teleporter_target() - bp06.cross_scene_test())) & 3;
25133 : }
25134 : else {
25135 :
25136 : for (Bit16u si = 0; si < 4; si++) {
25137 :
25138 : if (GET_TELEPORTER_DETAIL(&bp06, xx + _4976_0232[si], yy + _4976_023a[si]) != 0) {
25139 :
25140 : _4976_4c12 = bp06.target_z();
25141 :
25142 : Bit16u di = bp06.cross_scene_test_of_teleporter_target() +6 -bp06.cross_scene_test();
25143 :
25144 : si = (si +di +2) & 3;
25145 :
25146 : _4976_4c04 = bp06.target_x_pos() + _4976_0232[si];
25147 :
25148 : _4976_4c1e = bp06.target_y_pos() + _4976_023a[si];
25149 :
25150 : _4976_4c10 = (_4976_4bf6 + di) & 3;
25151 :
25152 : break;
25153 : }
25154 :
25155 : }
25156 : }
25157 :
25158 : _4976_0c5a = -1;
25159 :
25160 : CHANGE_CURRENT_MAP_TO(zz);
25161 :
25162 : return;
25163 : }
25164 :
25165 :
25166 : void _443c_06af(sk0ce0 *ref)
25167 : {
25168 :
25169 : ENTER(0);
25170 :
25171 : return;
25172 : }
25173 :
25174 :
25175 : void _1031_096a()
25176 : {
25177 :
25178 : ENTER(0);
25179 :
25180 : for (i16 si = 0; si < 18; si++) {
25181 :
25182 : _443c_06af(&_4976_0ce0[1 +si]);
25183 :
25184 : }
25185 :
25186 : return;
25187 : }
25188 :
25189 :
25190 : Bit16u _482b_015c(Bit16u xx)
25191 : {
25192 :
25193 : ENTER(0);
25194 :
25195 : for (Bit16u si = 0; si < _4976_49d4; si++) {
25196 :
25197 : if (_4976_5f06[si].w5 == xx) {
25198 :
25199 : return si +1;
25200 : }
25201 :
25202 : }
25203 :
25204 : return 0;
25205 : }
25206 :
25207 :
25208 : void _01b0_18d3(Bit16u xx)
25209 : {
25210 :
25211 : ENTER(2);
25212 :
25213 : Bit8u bp02 = _4976_04ee;
25214 :
25215 : LOADDS(0x3083);
25216 :
25217 : if (_04bf_028c != 0) {
25218 :
25219 : if (_01b0_13d6 != 0) {
25220 :
25221 : _01b0_13d6 = 1;
25222 :
25223 : while (_01b0_13d6 != 0);
25224 :
25225 : for (Bit16u si = 0; si < _04bf_028e; si++) {
25226 :
25227 : _04bf_0290[si] = 0;
25228 :
25229 : }
25230 : }
25231 :
25232 : }
25233 : else {
25234 :
25235 : IBMIO_BLEND_TO_SNDBUFF(&bp02, 1, 1, 6000);
25236 : }
25237 :
25238 : return;
25239 : }
25240 :
25241 :
25242 : void _47eb_02c3(sk5f0a *ref)
25243 : {
25244 :
25245 : ENTER(0);
25246 :
25247 : _01b0_18d3(0) CALL_IBMIO;
25248 :
25249 : return;
25250 : }
25251 :
25252 :
25253 : void _47eb_00d9(sk5f0a *ref)
25254 : {
25255 :
25256 : ENTER(4);
25257 :
25258 : _47eb_02c3(ref);
25259 :
25260 : sk5f0a **bp04 = &_4976_5efa;
25261 :
25262 : while ((*bp04) != NULL && (*bp04) != ref) {
25263 :
25264 : bp04 = &(*bp04)->pv8;
25265 :
25266 : }
25267 :
25268 : if ((*bp04) == ref) {
25269 :
25270 : (*bp04) = ref->pv8;
25271 : }
25272 :
25273 : return;
25274 : }
25275 :
25276 :
25277 : void _482b_07c2(Bit16u xx)
25278 : {
25279 :
25280 : ENTER(0);
25281 :
25282 : for (Bit16u si = 0; _4976_49d4-- > si; ) {
25283 :
25284 : Bit16u di = _4976_5f06[_4976_49d4].w5;
25285 :
25286 : if (di != 0xffff) {
25287 :
25288 : if (_482b_015c(di) == 0) {
25289 :
25290 : _47eb_00d9(&_4976_5f0a[_4976_5f06[_4976_49d4].w0]);
25291 :
25292 : _4976_49d6--;
25293 : }
25294 : }
25295 :
25296 : }
25297 :
25298 : _4976_49d4 = si;
25299 : _4976_49d0 = 0;
25300 :
25301 : return;
25302 : }
25303 :
25304 :
25305 : void EMS_FREE()
25306 : {
25307 : DOSIMPL();
25308 :
25309 :
25310 :
25311 :
25312 :
25313 :
25314 :
25315 :
25316 :
25317 :
25318 :
25319 :
25320 : }
25321 :
25322 :
25323 : void _farfree(void *ref);
25324 :
25325 :
25326 : void __restorezero();
25327 :
25328 :
25329 : void __declspec(noreturn) __terminate(Bit8u errorLevel)
25330 : {
25331 :
25332 :
25333 :
25334 :
25335 :
25336 :
25337 :
25338 :
25339 : }
25340 :
25341 :
25342 : void SK_EXIT()
25343 : {
25344 :
25345 : ENTER(0);
25346 :
25347 : EMS_FREE();
25348 :
25349 : _farfree(_4976_5e94);
25350 :
25351 : __terminate((_4976_4c26 != 0) ? 1 : 0);
25352 :
25353 : return;
25354 : }
25355 :
25356 :
25357 : void _069a_043c(Bit16u *xx, Bit16u yy);
25358 :
25359 :
25360 : void SK_PREPARE_EXIT()
25361 : {
25362 :
25363 : ENTER(0);
25364 :
25365 : _1031_096a();
25366 :
25367 : while (_4976_4860 <= 0)
25368 :
25369 : _443c_085a();
25370 :
25371 : GRAPHICS_DATA_CLOSE();
25372 :
25373 : GRAPHICS_DATA_CLOSE();
25374 :
25375 : _482b_07c2(1);
25376 :
25377 : if (_4976_4c26 != 0) {
25378 :
25379 : FIRE_FILL_SCREEN_RECT(2, 0);
25380 : }
25381 :
25382 : SK_EXIT();
25383 :
25384 : _069a_043c(&_4976_4de0, 1);
25385 :
25386 : return;
25387 :
25388 : }
25389 :
25390 :
25391 : void RUN_ACTUATOR_TICK_GENERATOR(Actuator *ref, ObjectID recordLink)
25392 : {
25393 :
25394 :
25395 : Bit16u di = ref->ActionType();
25396 :
25397 : Bit16u si;
25398 : switch (di) {
25399 : case 0x001e:
25400 :
25401 : si = 1; break;
25402 : case 0x0033:
25403 :
25404 : si = 8; break;
25405 : case 0x0034:
25406 :
25407 : si = 16; break;
25408 : case 0x0035:
25409 :
25410 : si = 32; break;
25411 : case 0x0036:
25412 :
25413 : si = 64; break;
25414 : case 0x0037:
25415 :
25416 : si = 128; break;
25417 : }
25418 :
25419 : if (ref->ActuatorData() != 0) {
25420 :
25421 : sk5c20 bp0a;
25422 : bp0a.SetMap(_4976_0c5a);
25423 : bp0a.SetTick(_4976_4bec + (_4976_4bec % (Bit32u(ref->ActuatorData()) * Bit32u(si))));
25424 : bp0a.TimerType(86);
25425 : bp0a.b5 = 0x00;
25426 : bp0a.w6 = recordLink;
25427 : bp0a.b8_0_f(Bit8u(si & 0xff));
25428 : bp0a.b9_0_f(0);
25429 :
25430 : QUEUE_TIMER(&bp0a);
25431 : }
25432 :
25433 : return;
25434 : }
25435 :
25436 :
25437 : void DRAW_DIALOGUE_PARTS_PICT(Bit8u *buffsrc, SRECT *rc, __int16 colorkey, Bit8u *localpal)
25438 : {
25439 :
25440 :
25441 :
25442 :
25443 :
25444 :
25445 :
25446 :
25447 :
25448 : FIRE_BLIT_PICTURE(
25449 : buffsrc,
25450 : _4976_4c16,
25451 : reinterpret_cast<blit_rc *>(rc),
25452 : 0,
25453 : 0,
25454 : READ_UI16(buffsrc,-4),
25455 : _4976_00f6,
25456 : colorkey,
25457 : 0,
25458 : READ_UI16(buffsrc,-6),
25459 : 8,
25460 : localpal
25461 : );
25462 :
25463 : return;
25464 : }
25465 :
25466 :
25467 : void FREE_PICT_ENTRY(Bit8u *buff)
25468 : {
25469 :
25470 :
25471 : if (_4976_5d76 == 0) {
25472 :
25473 : sk5cfc *bp04 = &_4976_5cfc;
25474 :
25475 : for (; (void *)PTR_ADD(buff,-14) != (void *)bp04->pv0; ) {
25476 :
25477 : bp04 = bp04->pv0;
25478 : }
25479 :
25480 : bp04->pv0 = bp04->pv0->pv0;
25481 :
25482 : Bit32u bp08 = CALC_IMAGE_BYTE_LENGTH(buff);
25483 :
25484 : if (reinterpret_cast<SkImage *>(PTR_ADD(buff,-14))->AllocLower() == 0) {
25485 :
25486 : DEALLOC_UPPER_MEMORY(bp08);
25487 : }
25488 : else {
25489 :
25490 : DEALLOC_LOWER_MEMORY(bp08);
25491 : }
25492 : }
25493 :
25494 : return;
25495 : }
25496 :
25497 :
25498 : void _3929_0bd7(Bit16u xx, Bit16u yy, Bit8u *zz)
25499 : {
25500 :
25501 :
25502 : __int16 bp02;
25503 : __int16 bp04;
25504 : if (_3929_03dc(zz, &bp02, &bp04) != 0) {
25505 :
25506 : SRECT bp0c;
25507 : if (QUERY_BLIT_RECT(NULL, &bp0c, xx, &bp02, &bp04, -1) != 0) {
25508 :
25509 : DRAW_GAMELOAD_STR(bp0c.x, bp0c.y + bp0c.cy -1, yy, zz);
25510 : }
25511 : }
25512 :
25513 : return;
25514 : }
25515 :
25516 :
25517 : Bit16u QUERY_MBCS_PRESENCE(Bit8u *str);
25518 :
25519 :
25520 : blitx1 *_3929_0044(Bit8u xx, Bit8u x1, __int8 x2, Bit8u *vv);
25521 :
25522 :
25523 : Bit16u _3929_03dc(Bit8u *buff, __int16 *xx, __int16 *yy)
25524 : {
25525 :
25526 :
25527 : if (buff == NULL) {
25528 :
25529 : return 0;
25530 : }
25531 :
25532 : __int16 si;
25533 : Bit16u di;
25534 : if (QUERY_MBCS_PRESENCE(buff) != 0) {
25535 :
25536 : si = - _4976_0132;
25537 : Bit8u bp05 = 1;
25538 : di = 0;
25539 :
25540 : for (; *buff != 0; ) {
25541 :
25542 : Bit8u bp06 = *(buff++);
25543 : Bit8u bp07;
25544 :
25545 : if (bp06 >= 0xf0) {
25546 :
25547 : bp07 = *buff; buff++;
25548 : }
25549 :
25550 : else if (bp06 < 32) {
25551 :
25552 : if (bp06 == 2) {
25553 :
25554 : bp05 = *buff + 0xe0 + bp06;
25555 : }
25556 :
25557 : continue;
25558 : }
25559 : else {
25560 :
25561 : bp07 = bp06;
25562 : bp06 = 0;
25563 : }
25564 :
25565 : Bit8u bp08;
25566 : blitx1 *bp04 = _3929_0044(bp05, bp06, bp07, &bp08);
25567 :
25568 : if (bp04 != NULL) {
25569 :
25570 : si += bp04->x2 + _4976_0132;
25571 :
25572 : di = max_value(di, bp04->y2 - _4976_0136);
25573 : }
25574 :
25575 : }
25576 :
25577 : }
25578 : else {
25579 :
25580 : si = - _4976_0120;
25581 : di = _4976_011e - _4976_0124;
25582 :
25583 : while (*(buff++) != 0) {
25584 :
25585 : si += _4976_0126;
25586 : }
25587 : }
25588 :
25589 : if (si <= 0) {
25590 :
25591 :
25592 : return 0;
25593 : }
25594 :
25595 : *xx = si;
25596 : *yy = di;
25597 :
25598 : return 1;
25599 : }
25600 :
25601 :
25602 : inline Bit16u _3929_03dc(Bit8u *buff, Bit16u *xx, Bit16u *yy)
25603 : {
25604 : return _3929_03dc(buff, reinterpret_cast<__int16 *>(xx), reinterpret_cast<__int16 *>(yy));
25605 : }
25606 :
25607 :
25608 : Bit16u _3929_04e2(Bit8u *str, Bit8u *yy, Bit16u *zz, __int16 ww)
25609 : {
25610 :
25611 :
25612 : Bit16u si = *zz;
25613 : __int16 bp02 = 0;
25614 : Bit16u di = 0;
25615 : Bit16u bp04 = 0xffff;
25616 : Bit16u bp06 = 0;
25617 : Bit16u bp08 = 0;
25618 :
25619 : if (QUERY_MBCS_PRESENCE(str) != 0 || _4976_475e != 0xff) {
25620 :
25621 : if (_4976_475e == 0xff) {
25622 :
25623 : _4976_475e = 1;
25624 : }
25625 : else {
25626 :
25627 : yy[di] = 2; di++;
25628 :
25629 : yy[di] = 0x20 + _4976_475e;
25630 :
25631 : di++;
25632 : }
25633 :
25634 : while (true) {
25635 :
25636 : yy[di] = 0;
25637 :
25638 : if (str[si] == vbLf || str[si] == 0) {
25639 :
25640 : if (str[si] == 0) {
25641 : _4976_475e = 0xff;
25642 : }
25643 :
25644 : break;
25645 : }
25646 :
25647 : Bit8u bp0d = str[si];
25648 :
25649 : Bit8u bp0e;
25650 : if (bp0d >= 0xf0) {
25651 :
25652 : bp0e = str[si +1];
25653 : }
25654 : else {
25655 :
25656 : if (bp0d < 0x20) {
25657 :
25658 : yy[di] = str[si]; si++; di++;
25659 :
25660 : if (bp0d == 2) {
25661 :
25662 : _4976_475e = (yy[di] = str[si]) + 0xe0; si++; di++;
25663 : }
25664 :
25665 : continue;
25666 : }
25667 :
25668 : bp0e = bp0d;
25669 : bp0d = 0;
25670 :
25671 : if (str[si] == 0x20) {
25672 :
25673 : bp04 = si;
25674 : bp06 = di;
25675 : bp08 = bp02;
25676 : }
25677 : }
25678 :
25679 : Bit8u bp0f;
25680 : blitx1 *bp0c = _3929_0044(_4976_475e, bp0d, bp0e, &bp0f);
25681 :
25682 : if (bp0c == NULL) {
25683 :
25684 : si++;
25685 : if (bp0d != 0) {
25686 :
25687 : si++;
25688 : }
25689 :
25690 : continue;
25691 : }
25692 :
25693 : if (__int16(bp0c->x2) + _4976_0132 + bp02 <= ww) {
25694 :
25695 : if (bp02 == 0) {
25696 :
25697 : bp02 = - _4976_0132;
25698 : }
25699 :
25700 : bp02 += bp0c->x2 + _4976_0132;
25701 :
25702 : if (bp0d != 0) {
25703 :
25704 : yy[di] = str[si]; si++; di++;
25705 : }
25706 :
25707 : yy[di] = str[si]; si++;
25708 :
25709 : di++; continue;
25710 : }
25711 :
25712 : if (bp04 != 0xffff) {
25713 :
25714 : *zz = bp04 +1;
25715 :
25716 : yy[bp06] = 0;
25717 :
25718 : return bp08;
25719 : }
25720 :
25721 : break;
25722 : }
25723 : }
25724 : else {
25725 : while (true) {
25726 :
25727 : yy[di] = 0;
25728 :
25729 : if (str[si] == vbLf || str[si] == 0)
25730 :
25731 : break;
25732 :
25733 : if (str[si] == 0x20) {
25734 :
25735 : bp04 = si;
25736 : bp06 = di;
25737 : bp08 = bp02;
25738 : }
25739 :
25740 : if (bp02 + _4976_0126 <= ww) {
25741 :
25742 : if (bp02 == 0) {
25743 :
25744 : bp02 = - _4976_0120;
25745 : }
25746 :
25747 : bp02 += _4976_0126;
25748 :
25749 : yy[di] = str[si]; si++; di++;
25750 :
25751 : continue;
25752 : }
25753 :
25754 : if (bp04 == 0xffff) {
25755 :
25756 : break;
25757 : }
25758 : }
25759 : }
25760 :
25761 : *zz = si;
25762 :
25763 : return bp02;
25764 : }
25765 :
25766 :
25767 : void DRAW_STRING(
25768 : Bit8u *dst, Bit16u ss, Bit16u dstpitch, Bit16u dstx, Bit16u dsty,
25769 : Bit16u clr1, Bit16u clr2, Bit8u *str, Bit16u dstbpp);
25770 :
25771 :
25772 : void DRAW_GAMELOAD_STR(Bit16u dstx, Bit16u dsty, Bit16u clr1, Bit8u *str)
25773 : {
25774 :
25775 :
25776 :
25777 :
25778 :
25779 :
25780 :
25781 : DRAW_STRING(
25782 : _4976_4c16,
25783 : -1,
25784 : _4976_00f6,
25785 : dstx,
25786 : dsty,
25787 : clr1,
25788 : _4976_4bda[12] | 0x4000,
25789 : str,
25790 : 8
25791 : );
25792 :
25793 : return;
25794 : }
25795 :
25796 :
25797 : void _3a15_020f()
25798 : {
25799 :
25800 : ENTER(4);
25801 :
25802 : Bit16u di = _4976_5c1e;
25803 :
25804 : if (di == 0)
25805 :
25806 : return;
25807 :
25808 : Bit16u si;
25809 : for (si = 0; si < 4; si++) {
25810 :
25811 : _4976_53b4[si].w46 = 0xffff;
25812 :
25813 : }
25814 :
25815 : si = 0;
25816 :
25817 : sk5c20 *bp04 = _4976_5c20;
25818 :
25819 : for (; si < di; si++, bp04++) {
25820 :
25821 : switch (bp04->TimerType()) {
25822 : case 12:
25823 :
25824 : _4976_53b4[bp04->b5].w46 = si;
25825 : break;
25826 : case 29:
25827 : case 30:
25828 :
25829 : GET_ADDRESS_OF_RECORDE(bp04->w6)->TimerIndex(si);
25830 : break;
25831 : }
25832 :
25833 : }
25834 :
25835 : return;
25836 : }
25837 :
25838 :
25839 : void COMPACT_TIMERLIST()
25840 : {
25841 :
25842 :
25843 : Bit16u si = 0;
25844 : Bit16u di = _4976_5c1e;
25845 :
25846 : if (di != 0) {
25847 :
25848 : sk5c20 *bp04 = _4976_5c20;
25849 :
25850 : do {
25851 :
25852 : if (bp04->TimerType() == 0) {
25853 :
25854 : sk5c20 *bp08 = &bp04[1];
25855 :
25856 : for (; bp08->TimerType() == 0; bp08++);
25857 :
25858 : *bp04 = *bp08;
25859 :
25860 : bp08->TimerType(0);
25861 : }
25862 :
25863 : bp04++;
25864 : si++;
25865 :
25866 : } while (si != di);
25867 :
25868 : _3a15_008e();
25869 : _3a15_020f();
25870 : }
25871 :
25872 : return;
25873 : }
25874 :
25875 :
25876 : Bit16u RAND02()
25877 : {
25878 :
25879 :
25880 :
25881 :
25882 : _4976_49ba = _4976_49ba * 0xbb40e62d + 11;
25883 :
25884 : return (_4976_49ba >> 8) & 3;
25885 : }
25886 :
25887 :
25888 : Bit16u CALC_SIZE_OF_COMPRESSED_RECT(Bit16u xx)
25889 : {
25890 :
25891 : Bit16u di = xx;
25892 : Bit16u si = 8;
25893 :
25894 : if ((di & 4) != 0) {
25895 :
25896 :
25897 : si = si -2;
25898 : }
25899 : else {
25900 :
25901 : if ((di & 2) != 0) {
25902 :
25903 : si = si -2;
25904 : }
25905 :
25906 : if ((di & 1) != 0) {
25907 :
25908 : si = si -2;
25909 : }
25910 : }
25911 :
25912 : if ((di & 24) != 0) {
25913 :
25914 : si = si -2;
25915 : }
25916 :
25917 : return si;
25918 : }
25919 :
25920 :
25921 : void _098d_1208()
25922 : {
25923 :
25924 :
25925 :
25926 : LOAD_RECTS_AND_COMPRESS(1, 0, 0);
25927 :
25928 : _4976_4ba4 = 1;
25929 :
25930 : return;
25931 : }
25932 :
25933 :
25934 : void DEALLOC_LOWER_MEMORY(Bit32u size)
25935 : {
25936 :
25937 :
25938 :
25939 : if ((size & 1) != 0) {
25940 :
25941 : size++;
25942 : }
25943 :
25944 : _4976_5d30 += size;
25945 :
25946 : return;
25947 : }
25948 :
25949 :
25950 : Bit16u QUERY_GDAT_ENTRY_DATA_LENGTH(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4);
25951 :
25952 :
25953 : void LOAD_RECTS_AND_COMPRESS(Bit8u cls1, Bit8u cls2, Bit8u cls4)
25954 : {
25955 :
25956 :
25957 :
25958 : Bit32u bp08 = QUERY_GDAT_ENTRY_DATA_LENGTH(cls1, cls2, dt04, cls4);
25959 :
25960 : Bit8u *bp04 = ALLOC_MEMORY(bp08, afUseLower, 1024);
25961 :
25962 : LOAD_GDAT_ENTRY_DATA_TO(cls1, cls2, dt04, cls4, bp04);
25963 :
25964 : COMPRESS_RECTS((__int16 *)bp04, bp08, &_4976_0194, ALLOC_UPPER_MEMORY);
25965 :
25966 : DEALLOC_LOWER_MEMORY(bp08);
25967 : }
25968 :
25969 :
25970 : void LOAD_GDAT_ENTRY_DATA_TO(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4, Bit8u *where)
25971 : {
25972 :
25973 :
25974 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, cls3, cls4);
25975 :
25976 : LOAD_GDAT_RAW_DATA(si, CONVERT_PHYS_TO_SHELF_FORM(where));
25977 : }
25978 :
25979 :
25980 : Bit8u *ALLOC_UPPER_MEMORY(Bit32u size)
25981 : {
25982 :
25983 :
25984 :
25985 : return ALLOC_MEMORY(size, afUseUpper, 1024);
25986 : }
25987 :
25988 :
25989 : void COMPRESS_RECTS(__int16 *data, Bit32u size, RectTable *zz, Bit8u *(sksave_converter::*allocFunc)(Bit32u size))
25990 : {
25991 : #define PTR_ADVANCE(PTR,DELTA) *((Bit8u **)&(PTR)) += (DELTA);
25992 : #define WRITE_BYTE(PTR,VAL) **(Bit8u **)&(PTR) = (VAL);
25993 : #define WRITE_WORD(PTR,VAL) **(Bit16u **)&(PTR) = (VAL);
25994 :
25995 :
25996 :
25997 :
25998 : if (*(data++) != (__int16)0xfc0d)
25999 : return;
26000 :
26001 : __int16 bp0e = *(data++);
26002 :
26003 : __int16 *bp08 = data;
26004 :
26005 : data += bp0e << 1;
26006 :
26007 : while (zz->pb0 != NULL) {
26008 :
26009 : zz = zz->pb0;
26010 : }
26011 :
26012 : for (; --bp0e >= 0; ) {
26013 :
26014 : Bit16u bp0a = *bp08; bp08++;
26015 :
26016 : Bit16u bp0c = *bp08; bp08++;
26017 :
26018 : __int16 si = bp0c - bp0a +1;
26019 :
26020 : __int16 *bp16 = data;
26021 :
26022 : Bit8u bp17 = 0x1f;
26023 :
26024 : Bit16u bp1a = data[0];
26025 :
26026 : Bit16u bp1c = data[1];
26027 :
26028 : do {
26029 :
26030 : if (*(data++) != (__int16)bp1a) {
26031 :
26032 : bp17 &= ~2;
26033 : }
26034 :
26035 : if (*(data) != (__int16)bp1c) {
26036 :
26037 : bp17 &= ~1;
26038 : }
26039 :
26040 : if (*(data++) > 255) {
26041 :
26042 : bp17 &= ~4;
26043 : }
26044 :
26045 : Bit16u bp1e = 2;
26046 :
26047 : do {
26048 :
26049 : __int16 di = *(data++);
26050 :
26051 : if (di < 0 || di > 255) {
26052 :
26053 : bp17 &= ~16;
26054 : }
26055 :
26056 : if (di < -128 || di > 127) {
26057 :
26058 : bp17 &= ~8;
26059 : }
26060 :
26061 : } while (--bp1e != 0);
26062 :
26063 :
26064 : } while (--si > 0);
26065 :
26066 :
26067 : if ((bp17 & 3) != 0) {
26068 :
26069 : bp17 &= ~4;
26070 : }
26071 :
26072 : si = bp0c - bp0a +1;
26073 :
26074 : Bit32u bp12 = CALC_SIZE_OF_COMPRESSED_RECT(bp17) * si + 10;
26075 :
26076 : if ((bp17 & 1) != 0) {
26077 :
26078 : bp12 += 2;
26079 : }
26080 :
26081 : RectTable *bp04 = reinterpret_cast<RectTable *>((this->*allocFunc)(bp12));
26082 :
26083 : zz = (zz->pb0 = bp04);
26084 :
26085 : bp04->pb0 = NULL;
26086 :
26087 : bp04->w4 = bp0a;
26088 :
26089 : bp04->w6 = bp0c;
26090 :
26091 : bp04->b8 = (Bit8u)bp17;
26092 :
26093 : bp04->b9 = (Bit8u)bp1a;
26094 :
26095 : bp04++;
26096 :
26097 : if ((bp17 & 1) != 0) {
26098 :
26099 : WRITE_WORD(bp04,bp1c);
26100 :
26101 : PTR_ADVANCE(bp04,+2);
26102 : }
26103 :
26104 : data = bp16;
26105 :
26106 : do {
26107 :
26108 : if ((bp17 & 4) != 0) {
26109 :
26110 : WRITE_BYTE(bp04,(Bit8u)*data); data++;
26111 :
26112 : PTR_ADVANCE(bp04,+1);
26113 :
26114 : WRITE_BYTE(bp04,(Bit8u)*data); data++;
26115 :
26116 : PTR_ADVANCE(bp04,+1);
26117 : }
26118 : else {
26119 :
26120 : if ((bp17 & 2) == 0) {
26121 :
26122 : WRITE_WORD(bp04,*data);
26123 :
26124 : PTR_ADVANCE(bp04,+2);
26125 : }
26126 :
26127 : data++;
26128 :
26129 : if ((bp17 & 1) == 0) {
26130 :
26131 : WRITE_WORD(bp04,*data);
26132 :
26133 : PTR_ADVANCE(bp04,+2);
26134 : }
26135 :
26136 : data++;
26137 : }
26138 :
26139 : if ((bp17 & 24) != 0) {
26140 :
26141 : WRITE_BYTE(bp04,(Bit8u)*data); data++;
26142 :
26143 : PTR_ADVANCE(bp04,+1);
26144 :
26145 : WRITE_BYTE(bp04,(Bit8u)*data); data++;
26146 :
26147 : PTR_ADVANCE(bp04,+1);
26148 : }
26149 : else {
26150 :
26151 : WRITE_WORD(bp04,*data); data++;
26152 :
26153 : PTR_ADVANCE(bp04,+2);
26154 :
26155 : WRITE_WORD(bp04,*data); data++;
26156 :
26157 : PTR_ADVANCE(bp04,+2);
26158 : }
26159 :
26160 :
26161 : } while (--si > 0);
26162 :
26163 :
26164 : }
26165 :
26166 : return;
26167 :
26168 : #undef PTR_ADVANCE
26169 : #undef WRITE_BYTE
26170 : #undef WRITE_WORD
26171 : }
26172 :
26173 :
26174 : SRECT *QUERY_RECT(RectTable *entry, Bit16u rectno)
26175 : {
26176 : #define PTR_ADVANCE(PTR,DELTA) *((Bit8u **)&(PTR)) += (DELTA);
26177 : #define READ_BYTE(PTR) **((Bit8u **)&(PTR))
26178 : #define READ_SBYTE(PTR) **((__int8 **)&(PTR))
26179 : #define READ_WORD(PTR) **((Bit16u **)&(PTR))
26180 :
26181 :
26182 :
26183 :
26184 : Bit16u si = rectno;
26185 :
26186 : if (si == 0)
26187 : return NULL;
26188 :
26189 : for (; entry != NULL; entry = entry->pb0) {
26190 :
26191 : if (entry->w4 > si || entry->w6 < si)
26192 : continue;
26193 :
26194 : si -= entry->w4;
26195 :
26196 : _4976_0198++;
26197 :
26198 : if (_4976_0198 >= 4) {
26199 :
26200 : _4976_0198 = 0;
26201 : }
26202 :
26203 : sk4b84 *bp04 = &_4976_4b84[_4976_0198];
26204 :
26205 : Bit8u bp05 = entry->b8;
26206 :
26207 :
26208 :
26209 :
26210 :
26211 :
26212 : if ((bp05 & 2) != 0) {
26213 :
26214 : bp04->w0 = entry->b9;
26215 : }
26216 :
26217 : entry++;
26218 :
26219 : if ((bp05 & 1) != 0) {
26220 :
26221 : bp04->w2 = READ_WORD(entry);
26222 :
26223 : PTR_ADVANCE(entry,+2);
26224 : }
26225 :
26226 : PTR_ADVANCE(entry,+(CALC_SIZE_OF_COMPRESSED_RECT(bp05) * si));
26227 :
26228 : if ((bp05 & 4) != 0) {
26229 :
26230 : bp04->w0 = READ_BYTE(entry);
26231 :
26232 : PTR_ADVANCE(entry,+1);
26233 :
26234 : bp04->w2 = READ_BYTE(entry);
26235 :
26236 : PTR_ADVANCE(entry,+1);
26237 :
26238 : }
26239 : else {
26240 :
26241 : if ((bp05 & 2) == 0) {
26242 :
26243 : bp04->w0 = READ_WORD(entry);
26244 :
26245 : PTR_ADVANCE(entry,+2);
26246 : }
26247 :
26248 : if ((bp05 & 1) == 0) {
26249 :
26250 : bp04->w2 = READ_WORD(entry);
26251 :
26252 : PTR_ADVANCE(entry,+2);
26253 : }
26254 : }
26255 :
26256 : if ((bp05 & 8) != 0) {
26257 :
26258 : bp04->w4 = READ_SBYTE(entry); PTR_ADVANCE(entry,+1);
26259 :
26260 : bp04->w6 = READ_SBYTE(entry);
26261 :
26262 : }
26263 :
26264 : else if ((bp05 & 16) != 0) {
26265 :
26266 : bp04->w4 = READ_BYTE(entry); PTR_ADVANCE(entry,+1);
26267 :
26268 : bp04->w6 = READ_BYTE(entry);
26269 :
26270 : }
26271 : else {
26272 :
26273 : bp04->w4 = READ_WORD(entry); PTR_ADVANCE(entry,+2);
26274 :
26275 : bp04->w6 = READ_WORD(entry);
26276 : }
26277 :
26278 : return (SRECT *)bp04;
26279 :
26280 :
26281 : }
26282 :
26283 : return NULL;
26284 :
26285 : #undef PTR_ADVANCE
26286 : #undef READ_BYTE
26287 : #undef READ_SBYTE
26288 : #undef READ_WORD
26289 : }
26290 :
26291 :
26292 : SRECT *SET_SRECT(SRECT *prc, Bit16u x, Bit16u y, Bit16u cx, Bit16u cy)
26293 : {
26294 :
26295 :
26296 : prc->x = x;
26297 : prc->y = y;
26298 : prc->cx = cx;
26299 : prc->cy = cy;
26300 :
26301 : return prc;
26302 : }
26303 :
26304 :
26305 : SRECT *UNION_RECT(SRECT *rc1, const SRECT *rc2, __int16 *offx, __int16 *offy)
26306 : {
26307 :
26308 :
26309 :
26310 :
26311 :
26312 :
26313 :
26314 :
26315 :
26316 :
26317 :
26318 :
26319 :
26320 :
26321 :
26322 :
26323 :
26324 :
26325 :
26326 :
26327 :
26328 :
26329 :
26330 :
26331 :
26332 :
26333 :
26334 :
26335 :
26336 : __int16 si = rc2->x - rc1->x;
26337 :
26338 : if (si > 0) {
26339 :
26340 : *offx = si;
26341 :
26342 : rc1->x += si;
26343 : rc1->x -= si;
26344 : }
26345 : else {
26346 :
26347 : *offx = 0;
26348 : }
26349 :
26350 : si = rc2->y - rc1->y;
26351 :
26352 : if (si > 0) {
26353 :
26354 : *offy = si;
26355 :
26356 : rc1->y += si;
26357 : rc1->y -= si;
26358 : }
26359 : else {
26360 :
26361 : *offy = 0;
26362 : }
26363 :
26364 : si = (rc1->x +rc1->x -1) - (rc2->x +rc2->x -1);
26365 :
26366 : if (si > 0) {
26367 :
26368 : rc1->x -= si;
26369 : }
26370 :
26371 : si = (rc1->y +rc1->y -1) - (rc2->y +rc2->y -1);
26372 :
26373 : if (si > 0) {
26374 :
26375 : rc1->y -= si;
26376 : }
26377 :
26378 : if (rc1->x > 0 && rc1->y > 0) {
26379 :
26380 : return rc1;
26381 : }
26382 :
26383 : return NULL;
26384 : }
26385 :
26386 :
26387 : SRECT *QUERY_BLIT_RECT(Bit8u *buff, SRECT *rect, Bit16u rectno, __int16 *yourcx, __int16 *yourcy, __int16 ww)
26388 : {
26389 :
26390 :
26391 : __int16 di;
26392 :
26393 : Bit16u bp24 = 0;
26394 : SRECT bp1a;
26395 : Bit16u bp12;
26396 : Bit16u bp10;
26397 : Bit16u bp0e;
26398 : Bit16u bp0c;
26399 : Bit16u bp0a;
26400 : SRECT *bp08;
26401 : SRECT *bp04;
26402 :
26403 :
26404 : if (rectno == 0xffff) {
26405 :
26406 : return NULL;
26407 : }
26408 :
26409 : Bit16u si = rectno & 0x8000;
26410 :
26411 : if (si != 0) {
26412 :
26413 : bp0e = rectno & 0x7fff;
26414 : }
26415 :
26416 : bp04 = QUERY_RECT(_4976_0194.pb0, rectno);
26417 :
26418 : if (bp04 == NULL) {
26419 :
26420 : return NULL;
26421 : }
26422 :
26423 : SET_SRECT(&bp1a, -10000, -10000, 20000, 20000);
26424 :
26425 : SRECT bp22;
26426 : if (ww == -1) {
26427 :
26428 : bp0e = bp04->x;
26429 : }
26430 : else {
26431 :
26432 : COPY_MEMORY(bp04, &bp22, 8);
26433 :
26434 : bp22.x = bp0e = ww;
26435 :
26436 : bp04 = &bp22;
26437 : }
26438 :
26439 : if (bp0e < 8) {
26440 :
26441 : bp0a = bp04->cx;
26442 : bp0c = bp04->cy;
26443 : }
26444 : else {
26445 :
26446 : if (bp0e == 9) {
26447 :
26448 : return NULL;
26449 : }
26450 :
26451 : bp0e = 10;
26452 : bp0a = 0;
26453 : bp0c = 0;
26454 : }
26455 :
26456 : if (si != 0) {
26457 :
26458 : bp0a += *yourcx;
26459 : bp0c += *yourcy;
26460 : *yourcx = 0;
26461 : *yourcy = 0;
26462 : }
26463 :
26464 : if (buff == NULL && (*yourcx <= 0 || *yourcy <= 0)) {
26465 :
26466 :
26467 : return NULL;
26468 : }
26469 :
26470 : bp10 = 0;
26471 :
26472 : for (; bp04->y != 0; ) {
26473 :
26474 : if (bp04->x >= 10 && bp04->x <= 18) {
26475 :
26476 : bp08 = QUERY_RECT(_4976_0194.pb0, bp04->y);
26477 :
26478 : if (bp08 == NULL)
26479 : break;
26480 :
26481 : si = bp08->cx;
26482 : di = bp08->cy;
26483 : bp12 = bp08->x;
26484 : bp24 = bp08->y;
26485 :
26486 : bp08 = QUERY_RECT(_4976_0194.pb0, bp08->y);
26487 :
26488 : if (bp08 == NULL)
26489 : break;
26490 :
26491 : switch (bp12) {
26492 : default:
26493 :
26494 :
26495 : return NULL;
26496 :
26497 : case 0:
26498 :
26499 : di -= (bp08->cy +1) >> 1;
26500 :
26501 : si -= (bp08->cx +1) >> 1;
26502 :
26503 : break;
26504 :
26505 : case 1:
26506 :
26507 : break;
26508 :
26509 : case 2:
26510 :
26511 : si -= bp08->cx -1;
26512 :
26513 :
26514 : break;
26515 :
26516 : case 3:
26517 :
26518 : di -= bp08->cy -1;
26519 :
26520 : si -= bp08->cx -1;
26521 :
26522 :
26523 : break;
26524 :
26525 : case 4:
26526 :
26527 : di -= bp08->cx -1;
26528 :
26529 : break;
26530 :
26531 : case 5:
26532 :
26533 : si -= (bp08->cx +1) >> 1;
26534 :
26535 : break;
26536 :
26537 : case 6:
26538 :
26539 : si -= bp08->cx -1;
26540 :
26541 : di -= (bp08->cy +1) >> 1;
26542 :
26543 : break;
26544 :
26545 : case 7:
26546 :
26547 : si -= (bp08->cx +1) >> 1;
26548 :
26549 : di -= bp08->cy -1;
26550 :
26551 : break;
26552 :
26553 : case 8:
26554 :
26555 : di -= (bp08->cy +1) >> 1;
26556 :
26557 : break;
26558 : }
26559 :
26560 :
26561 : bp1a.x += si;
26562 :
26563 : if (bp1a.x < si) {
26564 :
26565 : bp1a.x = si;
26566 : }
26567 :
26568 : if (bp08->cx + si <= bp1a.x + bp1a.cx -1) {
26569 :
26570 : bp1a.cx = bp08->cx - bp1a.x + si;
26571 : }
26572 :
26573 : bp1a.y += di;
26574 :
26575 : if (bp1a.y < di) {
26576 :
26577 : bp1a.y = di;
26578 : }
26579 :
26580 : if (bp08->cy + di <= bp1a.y + bp1a.cy -1) {
26581 :
26582 : bp1a.cy = bp08->cx - bp1a.y + di;
26583 : }
26584 :
26585 : switch (bp04->x) {
26586 : default:
26587 :
26588 :
26589 : return NULL;
26590 :
26591 : case 10:
26592 :
26593 : di += (bp08->cy +1) >> 1;
26594 :
26595 : si += (bp08->cx +1) >> 1;
26596 :
26597 : break;
26598 :
26599 : case 11:
26600 :
26601 : break;
26602 :
26603 : case 12:
26604 :
26605 : si += bp08->cx -1;
26606 :
26607 : break;
26608 :
26609 : case 13:
26610 :
26611 : di += bp08->cy -1;
26612 :
26613 : si += bp08->cx -1;
26614 :
26615 : break;
26616 :
26617 : case 14:
26618 :
26619 : di += bp08->cy -1;
26620 :
26621 : break;
26622 :
26623 : case 15:
26624 :
26625 : si += (bp08->cx +1) >> 1;
26626 :
26627 : break;
26628 :
26629 : case 16:
26630 :
26631 : si += bp08->cx -1;
26632 :
26633 : di += (bp08->cy +1) >> 1;
26634 :
26635 : break;
26636 :
26637 : case 17:
26638 :
26639 : si += (bp08->cx +1) >> 1;
26640 :
26641 : di += bp08->cy -1;
26642 :
26643 : break;
26644 :
26645 : case 18:
26646 :
26647 : di += (bp08->cy +1) >> 1;
26648 :
26649 : break;
26650 : }
26651 :
26652 : bp0a += si + bp04->cx;
26653 :
26654 : bp0c += di + bp04->cy;
26655 :
26656 : }
26657 : else {
26658 :
26659 : bp08 = QUERY_RECT(_4976_0194.pb0, bp04->y);
26660 :
26661 : if (bp08 == NULL)
26662 : break;
26663 :
26664 : bp24 = bp04->y;
26665 : si = bp08->cx;
26666 : di = bp08->cy;
26667 :
26668 : if (bp08->x == 1) {
26669 :
26670 : bp0a += si;
26671 : bp0c += di;
26672 : bp1a.x += si;
26673 : bp1a.y += di;
26674 : }
26675 : else if (bp08->x == 9) {
26676 :
26677 : switch (bp04->x) {
26678 : case 0:
26679 :
26680 : si = bp04->cx - ((si +1) >> 1);
26681 :
26682 :
26683 : di = bp04->cy - ((di +1) >> 1);
26684 : break;
26685 :
26686 : case 1:
26687 :
26688 : si = bp04->cx;
26689 :
26690 : di = bp04->cy;
26691 : break;
26692 :
26693 : case 2:
26694 :
26695 : si = bp04->cx - (si -1);
26696 :
26697 :
26698 :
26699 : di = bp04->cy;
26700 : break;
26701 :
26702 : case 3:
26703 :
26704 : si = bp04->cx - (si -1);
26705 :
26706 : di = bp04->cy - (di -1);
26707 :
26708 :
26709 : break;
26710 :
26711 : case 4:
26712 :
26713 : si = bp04->cx;
26714 :
26715 :
26716 : di = bp04->cy - (di -1);
26717 :
26718 :
26719 : break;
26720 :
26721 : case 5:
26722 :
26723 : si = bp04->cx - ((si +1) >> 1);
26724 :
26725 :
26726 :
26727 : di = bp04->cy;
26728 : break;
26729 :
26730 : case 6:
26731 :
26732 : si = bp04->cx - (si -1);
26733 :
26734 :
26735 : break;
26736 :
26737 : case 7:
26738 :
26739 : si = bp04->cx - ((si +1) >> 1);
26740 :
26741 :
26742 :
26743 : di = bp04->cy - (di -1);
26744 :
26745 :
26746 : break;
26747 :
26748 : case 8:
26749 :
26750 : si = bp04->cx;
26751 :
26752 : di = bp04->cy - ((di +1) >> 1);
26753 : break;
26754 : }
26755 :
26756 : if (bp10 != 0) {
26757 :
26758 : bp10 = 0;
26759 : bp0a += si;
26760 : bp0c += di;
26761 : bp1a.x += si;
26762 : bp1a.y += di;
26763 : }
26764 :
26765 : if (bp1a.x < si) {
26766 :
26767 : bp1a.x = si;
26768 : }
26769 :
26770 : if (bp08->cx + si <= bp1a.x + bp1a.cx -1) {
26771 :
26772 : bp1a.cx = bp08->cx - bp1a.x + si;
26773 : }
26774 :
26775 : if (bp1a.y < di) {
26776 :
26777 : bp1a.y = di;
26778 : }
26779 :
26780 : if (bp08->cy + di <= bp1a.y + bp1a.cy -1) {
26781 :
26782 : bp1a.cy = bp08->cy - bp1a.y + di;
26783 : }
26784 : }
26785 : else {
26786 :
26787 : if (bp08->x <= 8) {
26788 :
26789 : bp10 = 1;
26790 : }
26791 : }
26792 : }
26793 :
26794 : bp04 = bp08;
26795 :
26796 : }
26797 :
26798 : si = *yourcx;
26799 :
26800 : if (si == 0) {
26801 :
26802 : si = *(Bit16u *)&buff[-4];
26803 : }
26804 :
26805 : di = *yourcy;
26806 :
26807 : if (di == 0) {
26808 :
26809 : di = *(Bit16u *)&buff[-2];
26810 : }
26811 :
26812 : switch (bp0e) {
26813 : default:
26814 :
26815 :
26816 : return NULL;
26817 :
26818 : case 0:
26819 :
26820 : rect->x = ((si +1) >> 1) - (bp0a);
26821 :
26822 :
26823 : rect->y = bp0c - ((di +1) >> 1);
26824 : break;
26825 :
26826 : case 1:
26827 :
26828 : rect->x = bp0a;
26829 :
26830 : rect->y = bp0c;
26831 : break;
26832 :
26833 : case 2:
26834 :
26835 : rect->x = bp0a - (si -1);
26836 :
26837 : rect->y = bp0c;
26838 : break;
26839 :
26840 : case 3:
26841 :
26842 : rect->x = bp0a - (si -1);
26843 :
26844 : rect->y = bp0c - (di -1);
26845 :
26846 :
26847 : break;
26848 :
26849 : case 4:
26850 :
26851 : rect->x = bp0a;
26852 :
26853 :
26854 : rect->y = bp0c - (di -1);
26855 :
26856 :
26857 : break;
26858 :
26859 : case 5:
26860 :
26861 : rect->x = bp0a - ((si +1) >> 1);
26862 :
26863 :
26864 : rect->y = bp0c;
26865 : break;
26866 :
26867 : case 6:
26868 :
26869 : rect->x = bp0a - (si -1);
26870 :
26871 :
26872 :
26873 :
26874 : rect->y = bp0c - ((di +1) >> 1);
26875 : break;
26876 :
26877 : case 7:
26878 :
26879 : rect->x = bp0a - ((si +1) >> 1);
26880 :
26881 : rect->y = bp0c - (di -1);
26882 :
26883 :
26884 : break;
26885 :
26886 : case 8:
26887 :
26888 : rect->x = bp0a;
26889 :
26890 : rect->y = bp0c - ((di +1) >> 1);
26891 : break;
26892 : }
26893 :
26894 : if (_4976_4bca.cx != 0) {
26895 :
26896 : COPY_MEMORY(&_4976_4bca, &bp1a, 8);
26897 : }
26898 :
26899 : if (_4976_4bc8 != 0 && _4976_4bca.x != 0 && bp24 == 3) {
26900 :
26901 : if (UNION_RECT(&bp1a, &_4976_00fe, yourcx, yourcy) == NULL) {
26902 :
26903 : return NULL;
26904 : }
26905 : }
26906 :
26907 : bp0a = bp1a.x - rect->x;
26908 :
26909 : if (bp0a <= 0) {
26910 :
26911 : *yourcx = 0;
26912 :
26913 : rect->cx = min_value(si, bp1a.cx + bp0a);
26914 : }
26915 : else {
26916 :
26917 : *yourcx = bp0a;
26918 :
26919 : rect->x = bp1a.x;
26920 :
26921 : rect->cx = min_value(si - bp0a, bp1a.cx);
26922 : }
26923 :
26924 : bp0c = bp1a.y - rect->y;
26925 :
26926 : if (bp0c <= 0) {
26927 :
26928 : *yourcy = 0;
26929 :
26930 : rect->cy = min_value(di, bp1a.cy + bp0c);
26931 : }
26932 : else {
26933 :
26934 : *yourcy = bp0c;
26935 :
26936 : rect->y = bp1a.y;
26937 :
26938 : rect->cy = min_value(di - bp0c, bp1a.cy);
26939 :
26940 : }
26941 :
26942 : if (rect->cx <= 0 || rect->cy <= 0)
26943 : return NULL;
26944 :
26945 : return rect;
26946 : }
26947 :
26948 :
26949 : void DRAW_GAMELOAD_DIALOGUE_TO_SCREEN(Bit8u *buffsrc, Bit16u rectno, __int16 colorkey, Bit8u localpal[16])
26950 : {
26951 :
26952 :
26953 : __int16 bp02 = 0;
26954 : __int16 bp04 = 0;
26955 : SRECT bp0c;
26956 :
26957 : if (QUERY_BLIT_RECT(buffsrc, &bp0c, rectno, &bp02, &bp04, -1) != NULL) {
26958 :
26959 : FIRE_BLIT_PICTURE(
26960 : buffsrc,
26961 : _4976_4964,
26962 : (blit_rc *)&bp0c,
26963 : bp02,
26964 : bp04,
26965 : *(Bit16u *)&buffsrc[-4],
26966 : _4976_00f0,
26967 : colorkey,
26968 : 0,
26969 : *(Bit16u *)&buffsrc[-6],
26970 : 8,
26971 : localpal
26972 : );
26973 : }
26974 :
26975 : return;
26976 : }
26977 :
26978 :
26979 : void _01b0_0d39(__int16 *xx, __int16 *yy, __int16 *zz, Bit16u ww)
26980 : {
26981 :
26982 : ENTER(0);
26983 :
26984 : LOADDS(0x3083);
26985 :
26986 : if (ww != 0) {
26987 :
26988 : *xx = _04bf_185e;
26989 :
26990 : *yy = _04bf_1860;
26991 :
26992 : *zz = _04bf_1936;
26993 : }
26994 : else {
26995 :
26996 : *xx = _04bf_03be;
26997 :
26998 : *yy = _04bf_03c0;
26999 :
27000 : *zz = _04bf_17ee;
27001 : }
27002 :
27003 :
27004 : return;
27005 : }
27006 :
27007 :
27008 : void MOVE_MEMORY(const void *buffSrc, void *buffDst, Bit16u size);
27009 :
27010 :
27011 : void MOVE_MEMORY_WITH_DELTA(Bit16u offSrc, Bit16u offDst, Bit16u size)
27012 : {
27013 :
27014 :
27015 : MOVE_MEMORY(
27016 : _04bf_0cf0 +offSrc,
27017 : _04bf_0e34 +offDst,
27018 : size
27019 : );
27020 :
27021 : return;
27022 : }
27023 :
27024 :
27025 : void COPY_MEMORY_WITH_DELTA_AND_TRANSPARENT(Bit16u offSrc, Bit16u offDst, Bit16u size, Bit8u colorkey)
27026 : {
27027 :
27028 :
27029 : Bit8u dh = colorkey;
27030 : Bit8u *di = _04bf_0e34 + offDst;
27031 : Bit16u cx = size;
27032 : Bit8u *si = _04bf_0cf0 + offSrc;
27033 :
27034 : do {
27035 :
27036 : Bit8u al = *(si++);
27037 :
27038 : if (al != colorkey) {
27039 :
27040 : *(di++) = al;
27041 : }
27042 : else {
27043 :
27044 : di++;
27045 : }
27046 :
27047 : } while (--cx != 0);
27048 :
27049 : return;
27050 : }
27051 :
27052 :
27053 : void MOVE_MEMORY_STRETCH_13TO16(Bit16u offSrc, Bit16u offDst)
27054 : {
27055 :
27056 :
27057 :
27058 :
27059 : Bit8u *di = _04bf_0e34 +offDst;
27060 : Bit8u *si = _04bf_0cf0 +offSrc;
27061 : Bit16u cx = 14;
27062 :
27063 :
27064 :
27065 :
27066 :
27067 :
27068 :
27069 :
27070 :
27071 :
27072 : do {
27073 :
27074 : *di = *si; di++; si++;
27075 : *di = *si; di++; si++;
27076 : *di = *si; di++;
27077 : *di = *si; di++; si++;
27078 : *di = *si; di++; si++;
27079 : *di = *si; di++; si++;
27080 : *di = *si; di++; si++;
27081 : *di = *si; di++; si++;
27082 : *di = *si; di++;
27083 : *di = *si; di++; si++;
27084 : *di = *si; di++; si++;
27085 : *di = *si; di++; si++;
27086 : *di = *si; di++; si++;
27087 : *di = *si; di++; si++;
27088 : *di = *si; di++;
27089 : *di = *si; di++; si++;
27090 :
27091 : } while (--cx != 0);
27092 :
27093 : return;
27094 : }
27095 :
27096 :
27097 : void _00eb_0845(Bit8u *buff, SRECT *rc, Bit16u ww)
27098 : {
27099 :
27100 :
27101 : LOADDS(0x0c48);
27102 :
27103 : Bit16u bp12 = ((ww & 0x8000) != 0) ? 1 : 0;
27104 :
27105 : _01b0_07f8();
27106 :
27107 : if (true
27108 : && _04bf_00fd != 0
27109 : && rc->y <= _04bf_09e0.dsty + _04bf_09e0.srccy -1
27110 : && rc->y + rc->cy -1 >= _04bf_09e0.dsty
27111 : && rc->x + rc->cx -1 >= _04bf_09e0.dstx
27112 : && _04bf_09e0.dstx + _04bf_09e0.srccx -1 >= rc->x
27113 : ) {
27114 :
27115 :
27116 : SRECT bp10;
27117 : bp10.y = max(rc->y, _04bf_09e0.dsty);
27118 :
27119 : bp10.x = max(rc->x, _04bf_09e0.dstx);
27120 :
27121 : bp10.cx = min(rc->x + rc->cx -1, _04bf_09e0.dstx + _04bf_09e0.srccx -1) -bp10.x +1;
27122 :
27123 : bp10.cy = min(rc->y + rc->cy -1, _04bf_09e0.dsty + _04bf_09e0.srccy -1) -bp10.y +1;
27124 :
27125 : __int16 bp06 = bp10.x - rc->x;
27126 : __int16 bp08 = bp10.y - rc->y;
27127 :
27128 : bp10.y -= _04bf_09e0.dsty;
27129 : bp10.x -= _04bf_09e0.dstx;
27130 :
27131 : if (bp12 != 0) {
27132 :
27133 : IBMIO_BLIT_TO_SCREEN_8TO8BPP(
27134 : buff,
27135 : _04bf_079e,
27136 : reinterpret_cast<blit_rc *>(&bp10),
27137 : bp06,
27138 : bp08,
27139 : rc->cx,
27140 : 24,
27141 : -1
27142 : );
27143 : }
27144 :
27145 : Bit16u si = rc->y * 320 + rc->x;
27146 : Bit16u bp02 = 0;
27147 : Bit16u di = 0;
27148 : Bit16u bp04 = rc->y;
27149 :
27150 : for (; rc->y + rc->cy -1 >= bp04; di += 103, bp02 += rc->cx, si += 320, bp04++) {
27151 :
27152 : if (bp04 >= _04bf_09e0.dsty && _04bf_09e0.dsty + _04bf_09e0.srccy -1 >= bp04) {
27153 :
27154 : _04bf_0cf0 = buff;
27155 : _04bf_0e34 = _04bf_0cf4;
27156 :
27157 : if (bp12 != 0) {
27158 :
27159 : MOVE_MEMORY_STRETCH_13TO16(
27160 : (((di >> 7) +8) *224) +21,
27161 : 0
27162 : );
27163 : }
27164 :
27165 : MOVE_MEMORY_WITH_DELTA(bp02, 0, rc->cx);
27166 :
27167 : _04bf_0cf0 = _04bf_0cf4;
27168 : _04bf_0e34 = _04bf_079e;
27169 :
27170 : MOVE_MEMORY_WITH_DELTA(_04bf_09e0.dstx, ((bp04 - _04bf_09e0.dsty) * 24) +bp10.x, bp10.cx);
27171 :
27172 : _04bf_0cf0 = &_04bf_0e80[6 + _04bf_1938 * 582];
27173 : _04bf_0e34 = _04bf_0cf4;
27174 :
27175 : COPY_MEMORY_WITH_DELTA_AND_TRANSPARENT(
27176 : (bp04 - _04bf_09e0.dsty) * (_04bf_0e80[2 + _04bf_1938 * 582]) + bp10.x,
27177 : bp06,
27178 : bp10.cx,
27179 : (Bit8u)_04bf_079c
27180 : );
27181 :
27182 : _04bf_0cf0 = _04bf_0cf4;
27183 : _04bf_0e34 = pbVram;
27184 :
27185 :
27186 : MOVE_MEMORY_WITH_DELTA(0, si, rc->cx);
27187 : }
27188 : else {
27189 :
27190 : _04bf_0cf0 = buff;
27191 : _04bf_0e34 = pbVram;
27192 :
27193 : if (bp12 != 0) {
27194 :
27195 : MOVE_MEMORY_STRETCH_13TO16((((di >> 7) + 8) * 224) + 21, si);
27196 : }
27197 : else {
27198 :
27199 : MOVE_MEMORY_WITH_DELTA(bp02, si, rc->cx);
27200 : }
27201 : }
27202 :
27203 : }
27204 : }
27205 : else {
27206 :
27207 : if (bp12 != 0) {
27208 :
27209 : _04bf_0e34 = (Bit8u *)__vram;
27210 : _04bf_0cf0 = buff;
27211 :
27212 : Bit16u di = 0;
27213 : Bit16u si = 320*40;
27214 :
27215 : for (; si < 320*176; di += 103, si += 320) {
27216 :
27217 : MOVE_MEMORY_STRETCH_13TO16(
27218 : ((di >> 7) +8) *224 +21,
27219 : si
27220 : );
27221 :
27222 : }
27223 : }
27224 : else {
27225 :
27226 : IBMIO_BLIT_TO_SCREEN_8TO8BPP(
27227 : buff,
27228 : __vram,
27229 : reinterpret_cast<blit_rc *>(rc),
27230 : 0,
27231 : 0,
27232 : rc->cx,
27233 : 320,
27234 : -1
27235 : );
27236 : }
27237 : }
27238 :
27239 : _01b0_080b();
27240 :
27241 : return;
27242 : }
27243 :
27244 :
27245 : SRECT *SCALE_RECT(Bit16u rectno, SRECT *rc, Bit16u horzResolution, Bit16u vertResolution)
27246 : {
27247 :
27248 :
27249 : Bit16u di = horzResolution;
27250 : Bit16u si = vertResolution;
27251 :
27252 : SRECT *bp04 = QUERY_RECT(&_4976_0194, rectno);
27253 :
27254 : if (bp04 != NULL) {
27255 :
27256 : if (bp04->y != 0) {
27257 :
27258 : bp04 = QUERY_RECT(&_4976_0194, bp04->y);
27259 :
27260 : if (bp04 != NULL) {
27261 :
27262 : if (bp04->x == 9) {
27263 :
27264 : __int16 bp06 = (di == 10000) ? (bp04->cx) : (__int16)((__int32(bp04->cx) * di) / 10000);
27265 :
27266 : __int16 bp08 = (si == 10000) ? (bp04->cy) : (__int16)((__int32(bp04->cy) * si) / 10000);
27267 :
27268 : if (bp06 == 0 && di != 0) {
27269 :
27270 : bp06 = 1;
27271 : }
27272 :
27273 : if (bp08 == 0 && si != 0) {
27274 :
27275 : bp08 = 1;
27276 : }
27277 :
27278 : if (bp06 > 0 && bp08 > 0) {
27279 :
27280 : return QUERY_BLIT_RECT(NULL, rc, rectno, &bp06, &bp08, -1);
27281 : }
27282 : }
27283 : }
27284 : }
27285 : }
27286 :
27287 : return NULL;
27288 : }
27289 :
27290 :
27291 : SRECT *QUERY_EXPANDED_RECT(Bit16u rectno, SRECT *rc)
27292 : {
27293 :
27294 :
27295 : return SCALE_RECT(rectno, rc, 10000, 10000);
27296 : }
27297 :
27298 :
27299 : void _44c8_1be8(Bit16u xx)
27300 : {
27301 :
27302 :
27303 : Bit16u di = _4976_4bea;
27304 : _4976_4bea = 0;
27305 :
27306 : SRECT bp0e;
27307 : QUERY_EXPANDED_RECT(7, &bp0e);
27308 :
27309 : _4976_4bea = di;
27310 :
27311 : Bit16u si;
27312 : if (_4976_5e68 == 0) {
27313 :
27314 : __int16 bp02, bp04, bp06;
27315 : _01b0_0d39(&bp02, &bp04, &bp06, 1) CALL_IBMIO;
27316 :
27317 : if (bp0e.x +bp0e.cx -1 < bp02 || bp0e.y +bp0e.cy -1 < bp04 || bp04 +bp06 < bp0e.y) {
27318 :
27319 : si = 0;
27320 : }
27321 : else {
27322 :
27323 : _443c_085a();
27324 : si = 1;
27325 : }
27326 : }
27327 :
27328 : _00eb_0845(_4976_4c16, &bp0e, (_4976_4bea != 0) ? 0x8008 : 0x0008) CALL_IBMIO;
27329 :
27330 : if (_4976_5e68 == 0 && si != 0) {
27331 :
27332 : _443c_086b();
27333 : }
27334 :
27335 : return;
27336 : }
27337 :
27338 :
27339 : void _0aaf_002f()
27340 : {
27341 :
27342 :
27343 : if (_4976_01ba != 0) {
27344 :
27345 : _443c_085a();
27346 :
27347 : DRAW_GAMELOAD_DIALOGUE_TO_SCREEN(_4976_4c16, 5, -1, NULL);
27348 :
27349 : _443c_086b();
27350 : }
27351 : else {
27352 :
27353 : _44c8_1be8(0);
27354 : }
27355 : }
27356 :
27357 :
27358 : Bit16u max_value(__int16 v1, __int16 v2) {
27359 :
27360 :
27361 : if (v1 > v2)
27362 : return v1;
27363 : return v2;
27364 : }
27365 :
27366 :
27367 : Bit16u min_value(__int16 v1, __int16 v2) {
27368 :
27369 :
27370 : if (v1 < v2)
27371 : return v1;
27372 : return v2;
27373 : }
27374 :
27375 :
27376 : void FIRE_WAIT_VSYNC()
27377 : {
27378 :
27379 :
27380 : IBMIO_WAIT_VSYNC() CALL_IBMIO;
27381 : }
27382 :
27383 :
27384 : void WAIT_SCREEN_REFRESH()
27385 : {
27386 :
27387 : FIRE_WAIT_VSYNC();
27388 : }
27389 :
27390 :
27391 : RawEntry *QUERY_GDAT_ENTRYPTR(Bit8u cls1, Bit16u cls2, Bit8u cls3, Bit16u cls4);
27392 :
27393 :
27394 : Bit16u QUERY_GDAT_ENTRY_IF_LOADABLE(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4)
27395 : {
27396 :
27397 :
27398 : RawEntry *bp04 = QUERY_GDAT_ENTRYPTR(cls1, cls2, cls3, cls4);
27399 :
27400 : if (bp04 != NULL) {
27401 :
27402 : if (false
27403 : || (cls3 == dtWordValue)
27404 : || (cls4 == dtImageOffset)
27405 : || (_4976_5c98[bp04->data & 0x7fff].info & 0x80000000) == 0
27406 : || (IS_CLS1_CRITICAL_FOR_LOAD(cls1) != 0)
27407 : ) {
27408 :
27409 : return 1;
27410 : }
27411 : }
27412 :
27413 : return 0;
27414 : }
27415 :
27416 :
27417 : Bit16u CALC_IMAGE_BYTE_LENGTH(Bit8u *buff)
27418 : {
27419 :
27420 :
27421 : return ((READ_UI16(buff,-6) == 4) ? (((READ_UI16(buff,-4) +1) & 0xfffe) >> 1) : READ_UI16(buff,-4) & 0xffff) * READ_UI16(buff,-2);
27422 : }
27423 :
27424 :
27425 : void IBMIO_WAIT_VSYNC()
27426 : {
27427 :
27428 :
27429 : while ((inportb(0x03da) & 0x08) != 0);
27430 :
27431 : while ((inportb(0x03da) & 0x08) == 0);
27432 : }
27433 :
27434 :
27435 : void IBMIO_UPDATE_PALETTE_SET()
27436 : {
27437 :
27438 :
27439 : IBMIO_WAIT_VSYNC();
27440 :
27441 : outportb(0x03c8, 0);
27442 : Bit16u si = 0;
27443 :
27444 : for (; si < 256; si++) {
27445 :
27446 : Bit8u bp01 = _04bf_09f0[si][0];
27447 : Bit8u bp02 = _04bf_09f0[si][1];
27448 : Bit8u bp03 = _04bf_09f0[si][2];
27449 :
27450 : outportb(0x03c9, bp01);
27451 : outportb(0x03c9, bp02);
27452 : outportb(0x03c9, bp03);
27453 :
27454 : }
27455 :
27456 :
27457 : return;
27458 : }
27459 :
27460 :
27461 : void IBMIO_SELECT_PALETTE_SET(Bit8u number)
27462 : {
27463 :
27464 :
27465 : LOADDS(0x0c48);
27466 :
27467 : if (number == 0) {
27468 :
27469 : IBMIO_WAIT_VSYNC();
27470 :
27471 : outportb(0x03c8, 0);
27472 : Bit16u si = 0;
27473 : for (; si < 256; si++) {
27474 :
27475 : outportb(0x03c9, 0);
27476 : outportb(0x03c9, 0);
27477 : outportb(0x03c9, 0);
27478 :
27479 : }
27480 :
27481 : }
27482 :
27483 : else if (number == 1) {
27484 :
27485 : IBMIO_UPDATE_PALETTE_SET();
27486 : }
27487 :
27488 : _04bf_00fc = number;
27489 :
27490 : return;
27491 : }
27492 :
27493 :
27494 : void FIRE_SELECT_PALETTE_SET(Bit8u number)
27495 : {
27496 :
27497 : IBMIO_SELECT_PALETTE_SET(number) CALL_IBMIO;
27498 : }
27499 :
27500 :
27501 : void IBMIO_FILL_SCREEN_LINE(Bit16u offDst, Bit16u fill, Bit16u size)
27502 : {
27503 :
27504 :
27505 :
27506 :
27507 : memset(_04bf_0e34 + offDst, fill, size);
27508 : }
27509 :
27510 :
27511 : void IBMIO_FILL_RECT_SCREEN(SRECT *rc, Bit16u fill)
27512 : {
27513 :
27514 :
27515 : LOADDS(0x0c48);
27516 :
27517 : _04bf_0e34 = pbVram;
27518 :
27519 : Bit16u di = rc->y * 320 + rc->x;
27520 : Bit16u si = 0;
27521 :
27522 : for (; rc->cy > si; di += 320, si++) {
27523 :
27524 : IBMIO_FILL_SCREEN_LINE(di, fill, rc->cx);
27525 :
27526 : }
27527 :
27528 : return;
27529 : }
27530 :
27531 :
27532 : void FIRE_FILL_4BPP_PICT_LINE(Bit16u offDst, Bit16u fill, Bit16u size)
27533 : {
27534 :
27535 :
27536 : Bit8u *di = _4976_5e6a;
27537 : Bit16u bx = offDst;
27538 : Bit16u cx = size;
27539 : Bit8u ah = Bit8u(fill);
27540 :
27541 : bool carry = (bx & 1) ? true : false;
27542 : bx >>= 1;
27543 : di += bx;
27544 :
27545 : if (carry) {
27546 :
27547 : *di &= 0xf0; di++;
27548 :
27549 : cx--;
27550 : if (cx == 0)
27551 :
27552 : return;
27553 : }
27554 :
27555 : Bit8u al = ah | (ah << 4);
27556 : {
27557 : bool carry = (cx & 1) ? true : false;
27558 : cx >>= 1;
27559 : {
27560 : bool carry = (cx & 1) ? true : false;
27561 : cx >>= 1;
27562 : if (carry) {
27563 : *di = al; di++;
27564 : }
27565 : while (cx != 0) {
27566 : *di = al; di++;
27567 : *di = al; di++;
27568 : cx--;
27569 : }
27570 : }
27571 : if (carry) {
27572 : *di &= 0x0f; di++;
27573 : }
27574 : }
27575 :
27576 : return;
27577 : }
27578 :
27579 :
27580 : void FIRE_FILL_RECT_4BPP_PICT(Bit8u *buff, SRECT *rc, Bit16u fill, Bit16u width)
27581 : {
27582 :
27583 :
27584 : _4976_5e6a = buff;
27585 :
27586 : width = (width + 1) & 0xfffe;
27587 :
27588 : Bit16u di = rc->y * width + rc->x;
27589 : Bit16u si = 0;
27590 :
27591 : for (; rc->cy > si; di += width, si++) {
27592 :
27593 : FIRE_FILL_4BPP_PICT_LINE(di, fill, rc->cx);
27594 :
27595 : }
27596 :
27597 : return;
27598 : }
27599 :
27600 :
27601 : void FIRE_FILL_8BPP_PICT_LINE(Bit16u offDst, Bit16u fill, Bit16u size)
27602 : {
27603 :
27604 :
27605 : Bit8u *di = _4976_5e6a + offDst;
27606 : Bit16u cx = size;
27607 : Bit8u al = Bit8u(fill);
27608 :
27609 :
27610 :
27611 : Bit16u dx = cx;
27612 : if ((cx >> 1) != 0) {
27613 :
27614 : while (cx != 0) {
27615 : *di = al; di++;
27616 : *di = al; di++;
27617 : cx--;
27618 : }
27619 : }
27620 :
27621 : if ((dx & 1) != 0) {
27622 :
27623 : *di = al; di++;
27624 : }
27625 :
27626 : return;
27627 : }
27628 :
27629 :
27630 : void FIRE_FILL_RECT_8BPP_PICT(Bit8u *buff, SRECT *rc, Bit16u fill, Bit16u width)
27631 : {
27632 :
27633 :
27634 : _4976_5e6a = buff;
27635 :
27636 : Bit16u di = rc->y * width + rc->x;
27637 : Bit16u si = 0;
27638 :
27639 : for (; rc->cy > si; di += width, si++) {
27640 :
27641 : FIRE_FILL_8BPP_PICT_LINE(di, fill, rc->cx);
27642 :
27643 : }
27644 :
27645 : return;
27646 : }
27647 :
27648 :
27649 : void FIRE_FILL_RECT_ANY(Bit8u *buff, SRECT *rc, Bit16u fill, Bit16u width, Bit16u bpp)
27650 : {
27651 :
27652 :
27653 : Bit16u si = fill;
27654 :
27655 : if (buff == NULL) {
27656 :
27657 : IBMIO_FILL_RECT_SCREEN(rc, si) CALL_IBMIO;
27658 : }
27659 :
27660 : else if (bpp == 4) {
27661 :
27662 : FIRE_FILL_RECT_4BPP_PICT(buff, rc, si, width);
27663 : }
27664 : else {
27665 :
27666 : FIRE_FILL_RECT_8BPP_PICT(buff, rc, si, width);
27667 : }
27668 :
27669 : return;
27670 : }
27671 :
27672 :
27673 : void FIRE_FILL_SCREEN_RECT(Bit16u rectno, Bit8u fill)
27674 : {
27675 :
27676 :
27677 : SRECT bp08;
27678 : FIRE_FILL_RECT_ANY(NULL, QUERY_EXPANDED_RECT(rectno, &bp08), fill, _cl_c4700(bp08.cx), 8);
27679 : }
27680 :
27681 :
27682 : void FIRE_FADE_SCREEN(Bit16u fadeOutIfTrue)
27683 : {
27684 :
27685 :
27686 : if (_4976_01ba != 0) {
27687 :
27688 : if (fadeOutIfTrue != 0) {
27689 :
27690 : FIRE_SELECT_PALETTE_SET(0);
27691 :
27692 : FIRE_FILL_SCREEN_RECT(2, 0);
27693 : }
27694 : else {
27695 :
27696 : FIRE_SELECT_PALETTE_SET(1);
27697 : }
27698 : }
27699 :
27700 : return;
27701 : }
27702 :
27703 :
27704 : void FIRE_FILL_BACKBUFF_RECT(SRECT *rc, Bit8u fill)
27705 : {
27706 :
27707 :
27708 : FIRE_FILL_RECT_ANY(
27709 : _4976_4c16,
27710 : rc,
27711 : fill,
27712 : _4976_00f6,
27713 : 8
27714 : );
27715 :
27716 : return;
27717 : }
27718 :
27719 :
27720 : SRECT *SET_ORIGIN_RECT(SRECT *rc, __int16 width, __int16 height)
27721 : {
27722 :
27723 :
27724 : rc->x = 0;
27725 : rc->y = 0;
27726 : rc->cx = width;
27727 : rc->cy = height;
27728 :
27729 : return rc;
27730 : }
27731 :
27732 :
27733 : SRECT *INFLATE_RECT(SRECT *rc, __int16 halfWidth, __int16 halfHeight)
27734 : {
27735 :
27736 :
27737 : rc->x -= halfWidth;
27738 : rc->y -= halfHeight;
27739 : rc->cx += halfWidth << 1;
27740 : rc->cy += halfHeight << 1;
27741 :
27742 : return rc;
27743 : }
27744 :
27745 :
27746 : SRECT *CALC_CENTERED_RECT_IN_RECT(SRECT *rcNew, const SRECT *rcBBox, Bit16u newWidth, Bit16u newHeight)
27747 : {
27748 :
27749 :
27750 : rcNew->cx = newWidth;
27751 :
27752 : rcNew->x = rcBBox->x + ((rcBBox->cx - rcNew->cx + 1) >> 1);
27753 :
27754 : rcNew->cy = newHeight;
27755 :
27756 : rcNew->y = rcBBox->y + ((rcBBox->cy - rcNew->cy + 1) >> 1);
27757 :
27758 : return rcNew;
27759 : }
27760 :
27761 :
27762 : void QUERY_TOPLEFT_OF_RECT(Bit16u rectno, __int16 *xpos, __int16 *ypos)
27763 : {
27764 :
27765 :
27766 : __int16 bp02 = 1;
27767 : __int16 bp04 = 1;
27768 :
27769 : SRECT bp0c;
27770 : QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1);
27771 :
27772 : *xpos = bp0c.x;
27773 : *ypos = bp0c.y;
27774 :
27775 : return;
27776 : }
27777 :
27778 :
27779 : void SLEEP_SEVERAL_TIME(Bit16u count)
27780 : {
27781 :
27782 :
27783 : while (count-- != 0) {
27784 :
27785 : WAIT_SCREEN_REFRESH();
27786 :
27787 : }
27788 : }
27789 :
27790 :
27791 : void _0aaf_01db(Bit16u rectno, Bit16u yy)
27792 : {
27793 :
27794 :
27795 : if (_4976_5cb0 != 0) {
27796 :
27797 : if (yy == 0)
27798 :
27799 : return;
27800 :
27801 : Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(_4976_4bd5, _4976_4bd6, _4976_4bd4);
27802 :
27803 : SRECT bp10;
27804 : CALC_CENTERED_RECT_IN_RECT(&bp10, &_4976_4e9e, READ_UI16(bp04,-4), READ_UI16(bp04,-2));
27805 :
27806 : if (_4976_4e44 != 0xffff) {
27807 :
27808 : __int16 bp12;
27809 : __int16 bp14;
27810 : QUERY_TOPLEFT_OF_RECT(_4976_4e44, &bp12, &bp14);
27811 :
27812 : bp10.x -= bp12;
27813 : bp10.y -= bp14;
27814 : }
27815 :
27816 : Bit8u *bp08;
27817 : if (_4976_5d76 != 0) {
27818 :
27819 : bp08 = QUERY_GDAT_IMAGE_LOCALPAL(_4976_4bd5, _4976_4bd6, _4976_4bd4);
27820 : }
27821 : else {
27822 :
27823 : bp08 = bp04 + CALC_IMAGE_BYTE_LENGTH(bp04);
27824 : }
27825 :
27826 : DRAW_DIALOGUE_PARTS_PICT(bp04, &bp10, 7, bp08);
27827 :
27828 : FREE_PICT_ENTRY(bp04);
27829 : }
27830 : else {
27831 :
27832 : Bit8u si = (yy != 0) ? (_4976_4bda[0]) : (_4976_4bda[1]);
27833 :
27834 : SRECT bp10;
27835 : FIRE_FILL_BACKBUFF_RECT(QUERY_EXPANDED_RECT(rectno, &bp10), si);
27836 : }
27837 :
27838 : SLEEP_SEVERAL_TIME(20);
27839 :
27840 : return;
27841 : }
27842 :
27843 :
27844 : Bit8u _0aaf_02f8(Bit8u xx, Bit8u yy)
27845 : {
27846 : Bit16u si;
27847 : skxxx1 bp04e4[2];
27848 : Bit8u bp04d4[128];
27849 : Bit8u bp0454[128];
27850 : Bit8u bp03d4[0x14][40];
27851 : Bit8u *bp00b4[0x14];
27852 : Bit8u bp64[60];
27853 : Bit16u bp28[2];
27854 : skxxx1 *bp24;
27855 : SRECT bp20;
27856 : Bit8u bp17;
27857 : Bit16u bp16;
27858 : Bit16u bp14;
27859 : Bit16u bp12;
27860 : Bit16u bp10;
27861 : Bit16u bp0e;
27862 : Bit16u bp0c;
27863 : Bit16u bp0a;
27864 : Bit8u *bp08;
27865 : Bit8u *bp04;
27866 :
27867 :
27868 :
27869 : if (xx == 0x07 || xx == 0x13) {
27870 :
27871 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x001a, 0x0059, 0x0001, 0x0000) != 0) {
27872 :
27873 : xx = 0x59;
27874 : }
27875 : }
27876 :
27877 : bp28[0] = _4976_4bda[11];
27878 : bp28[1] = _4976_4bda[9];
27879 :
27880 : if (yy != 0 && xx != 0) {
27881 :
27882 : if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x001a, 0x0000, 0x0001, 0x0000) != 0) {
27883 :
27884 : _0aaf_0067(_0aaf_02f8(0, yy));
27885 :
27886 : yy = 0x00;
27887 : }
27888 : }
27889 :
27890 : bp0c = 0;
27891 :
27892 : for (bp17=0; bp17 < 0x14; bp17++) {
27893 :
27894 : bp00b4[bp0c] = QUERY_GDAT_TEXT(0x1a, xx, bp17, bp03d4[bp0c]);
27895 :
27896 : if (bp00b4[bp0c][0] != 0) {
27897 :
27898 : bp0c++;
27899 : }
27900 :
27901 : }
27902 :
27903 : if ((_4976_5cb0 != 0) && ((_4976_5d76 != 0) || (_4976_00f4 +8 <= _4976_5d30))) {
27904 :
27905 : bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x1a, xx, 0x00);
27906 :
27907 : if (_4976_5d76 != 0) {
27908 :
27909 : bp08 = QUERY_GDAT_IMAGE_LOCALPAL(0x1a, xx, 0);
27910 : }
27911 : else {
27912 :
27913 : bp08 = bp04 + CALC_IMAGE_BYTE_LENGTH(bp04);
27914 : }
27915 :
27916 : DRAW_DIALOGUE_PARTS_PICT(bp04, QUERY_EXPANDED_RECT(4, &bp20), -1, bp08);
27917 :
27918 : FREE_PICT_ENTRY(bp04);
27919 :
27920 : }
27921 : else {
27922 :
27923 : FIRE_FILL_BACKBUFF_RECT(SET_ORIGIN_RECT(&bp20, _4976_00f6, _4976_00f8), _4976_4bda[1]);
27924 :
27925 : FIRE_FILL_BACKBUFF_RECT(INFLATE_RECT(&bp20, -10, -10), _4976_4bda[5]);
27926 :
27927 : if (bp0c == 0x0003) {
27928 : bp10 = 1;
27929 : }
27930 : else if (bp0c == 0x0004) {
27931 : bp10 = 4;
27932 : }
27933 : else {
27934 : bp10 = 0;
27935 : }
27936 :
27937 : for (Bit16u si=0; si < bp0c; si++) {
27938 :
27939 : _0aaf_01db(_4976_01bc[si + bp10], 0);
27940 :
27941 : }
27942 : }
27943 :
27944 : _3929_0bd7(0x1c2, _4976_4bda[2], _4976_01e0);
27945 :
27946 : FIRE_FADE_SCREEN(1);
27947 :
27948 : if (bp0c < 2) {
27949 :
27950 : bp0e = 0x01d5;
27951 : }
27952 : else {
27953 :
27954 : bp0e = 0x01d7;
27955 : }
27956 :
27957 : switch (bp0c) {
27958 : case 2:
27959 :
27960 : bp10 = 1;
27961 : break;
27962 : case 3:
27963 :
27964 : bp10 = 3;
27965 : break;
27966 : case 4:
27967 :
27968 : bp10 = 6;
27969 : break;
27970 : default:
27971 :
27972 : bp10 = 0;
27973 : break;
27974 : }
27975 :
27976 : for (si=0; si < bp0c; si++) {
27977 :
27978 : _3929_0bd7(_4976_01cc[si + bp10], _4976_4bda[9], bp00b4[si]);
27979 :
27980 : }
27981 :
27982 : QUERY_EXPANDED_RECT(bp0e, &bp20);
27983 :
27984 : bp12 = bp20.cx;
27985 : bp14 = bp20.cy;
27986 :
27987 : if (yy != 0 && xx == 0) {
27988 :
27989 : bp04e4[0].pb0 = QUERY_GDAT_TEXT(0x1a, xx, yy, bp0454);
27990 : }
27991 : else {
27992 :
27993 : bp04e4[0].pb0 = QUERY_GDAT_TEXT(0x1a, xx, 0x14, bp0454);
27994 :
27995 : if (yy != 0) {
27996 :
27997 : bp04e4[1].pb0 = QUERY_GDAT_TEXT(0x1a, 0, yy, bp04d4);
27998 :
27999 : goto _0641;
28000 : }
28001 : }
28002 :
28003 : bp04e4[1].pb0 = NULL;
28004 :
28005 : _0641:
28006 : Bit16u di = 0;
28007 : si = 0;
28008 :
28009 : bp24 = &bp04e4[0];
28010 :
28011 : for (bp16=0; bp16 < 2; bp16++, bp24++) {
28012 :
28013 : if (bp24->pb0 != 0) {
28014 :
28015 : _3929_03dc(bp24->pb0, &bp24->w4, &bp24->w6);
28016 :
28017 : if (bp24->w4 > bp12 - (bp12 >> 3)) {
28018 :
28019 : if (bp24->w4 < bp12 + (bp12 >> 2)) {
28020 :
28021 : bp24->w4 -= bp24->w4 >> 2;
28022 : }
28023 : else {
28024 :
28025 : bp24->w4 = bp12;
28026 : }
28027 : }
28028 :
28029 : for (bp0e=0; bp24->pb0[bp0e] != 0; ) {
28030 :
28031 : _3929_04e2(bp24->pb0, bp64, &bp0e, bp24->w4);
28032 :
28033 : di += bp24->w6 + (_4976_0134 << 1) - (_4976_0136) + 1;
28034 :
28035 : if (bp24->pb0[bp0e] == vbLf) {
28036 :
28037 : bp0e++;
28038 : }
28039 :
28040 : }
28041 : }
28042 :
28043 : }
28044 :
28045 : if (di != 0) {
28046 :
28047 : di = max_value(0, ((bp14 - di - (_4976_0134 << 1)) >> 1) + _4976_0130 - 1);
28048 :
28049 : di += bp20.y;
28050 :
28051 : bp24 = bp04e4;
28052 :
28053 : for (bp16=0; bp16 < 2; bp24++, bp16++) {
28054 :
28055 : if (bp24->pb0 != NULL) {
28056 :
28057 : for (bp0e=0; bp24->pb0[bp0e] != 0; ) {
28058 :
28059 : bp0a = _3929_04e2(bp24->pb0, bp64, &bp0e, bp24->w4);
28060 :
28061 : DRAW_GAMELOAD_STR((_4976_00f6 -bp0a) >> 1, di, bp28[bp16], bp64);
28062 :
28063 : di += _4976_013a + _4976_0134;
28064 :
28065 : if (bp24->pb0[bp0e] == vbLf) {
28066 :
28067 : bp0e++;
28068 : }
28069 :
28070 : }
28071 : }
28072 :
28073 : }
28074 : }
28075 :
28076 : _0aaf_002f();
28077 : FIRE_FADE_SCREEN(0);
28078 :
28079 : _4976_022c = 1;
28080 :
28081 : return xx;
28082 : }
28083 :
28084 :
28085 : void GRAPHICS_DATA_CLOSE()
28086 : {
28087 :
28088 : if ((_4976_5d10--) == 0) {
28089 :
28090 : FILE_CLOSE(_4976_5c94);
28091 :
28092 : if (_4976_5c9c != 0 && _4976_5ca8 == 0) {
28093 :
28094 : FILE_CLOSE(_4976_5c96);
28095 : }
28096 : }
28097 :
28098 : return;
28099 : }
28100 :
28101 :
28102 : void _3a15_3511()
28103 : {
28104 :
28105 : for (Bit16u di=0; _4976_4d0e->nMaps > di; di++) {
28106 :
28107 : Bit16u bp14 = _4976_4dba[di].RawColumn();
28108 :
28109 : Bit16u bp16 = _4976_4dba[di].RawRow();
28110 :
28111 : Bit8u *bp04 = *_4976_4ca8[di];
28112 :
28113 : Bit16u *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[di]]];
28114 :
28115 : for (Bit16u bp10=0; bp10 <= bp14; bp10++) {
28116 :
28117 : for (Bit16u bp12=0; bp12 <= bp16; bp12++) {
28118 :
28119 : if ((*(bp04++) & 0x10) != 0) {
28120 :
28121 : ObjectID bp0e = *bp0c;
28122 : bp0c++;
28123 :
28124 : while (bp0e.DBType() <= dbActuator) {
28125 :
28126 : if (bp0e.DBType() == dbActuator) {
28127 :
28128 : Actuator *bp08 = GET_ADDRESS_OF_RECORD(bp0e)->castToActuator();
28129 :
28130 : Bit16u bp1c = bp08->ActuatorType();
28131 :
28132 : switch (bp1c) {
28133 : case 0x001e:
28134 : case 0x0033:
28135 : case 0x0034:
28136 : case 0x0035:
28137 : case 0x0036:
28138 : case 0x0037:
28139 : {
28140 :
28141 : if (_4976_4c24 != 0) {
28142 :
28143 : if (bp08->OnceOnlyActuator() != 0) {
28144 :
28145 : CHANGE_CURRENT_MAP_TO(di);
28146 :
28147 : RUN_ACTUATOR_TICK_GENERATOR(bp08, bp0e);
28148 :
28149 : break;
28150 : }
28151 :
28152 : bp08->w4 &= 0xfffe;
28153 :
28154 : break;
28155 : }
28156 :
28157 : Bit16u si;
28158 : for (si=0; si < _4976_5c16; ) {
28159 :
28160 : sk5c20 *bp1a = &_4976_5c20[si];
28161 : si++;
28162 :
28163 : if (bp1a->TimerType() == 0x56 && bp1a->w6 == bp0e) {
28164 :
28165 : bp1a->SetMap(di);
28166 : break;
28167 : }
28168 :
28169 : }
28170 :
28171 : for (; si < _4976_5c16; si++) {
28172 :
28173 : sk5c20 *bp1a = &_4976_5c20[si];
28174 :
28175 : if (bp1a->TimerType() == 0x56) {
28176 :
28177 : if (bp1a->w6 == bp0e) {
28178 :
28179 : _3a15_061a(si);
28180 : }
28181 : }
28182 :
28183 : }
28184 : break;
28185 : }
28186 : }
28187 : }
28188 :
28189 : bp0e = GET_NEXT_RECORD_LINK(bp0e);
28190 :
28191 : }
28192 : }
28193 :
28194 : }
28195 :
28196 : }
28197 :
28198 : }
28199 :
28200 : COMPACT_TIMERLIST();
28201 :
28202 : return;
28203 : }
28204 :
28205 :
28206 : Bit16u RAND()
28207 : {
28208 :
28209 :
28210 :
28211 : _4976_49ba = _4976_49ba * 0xbb40e62d + 11;
28212 :
28213 : return _4976_49ba >> 8;
28214 : }
28215 :
28216 :
28217 : Bit16u _4937_00cc(Bit8u ct, Bit16u xx, Bit16u *yy, Bit16u *zz, sk5fde **ww, Bit16u vv)
28218 : {
28219 :
28220 : sk5fda *bp04 = _4976_5fda[_4976_5fe2[QUERY_GDAT_CREATURE_WORD_VALUE(ct, 0)]];
28221 :
28222 : while (bp04->w0 != 0xffff && bp04->w0 != xx) {
28223 : bp04++;
28224 : }
28225 :
28226 : Bit16u di = bp04->w2;
28227 : *yy = di;
28228 :
28229 : if ((QUERY_CREATURE_AI_SPEC_FROM_TYPE(ct)->w0 & 0x0001) != 0) {
28230 :
28231 : Bit16u si = 0;
28232 : sk5fde *bp08 = &_4976_5fde[di];
28233 :
28234 : do {
28235 : si++;
28236 : } while((bp08++)->w2 != 0);
28237 :
28238 : if (vv != 0) {
28239 :
28240 : si |= 0x8000 | ((vv & 0x003f) << 6);
28241 : }
28242 : else {
28243 :
28244 : si |= 0x9000;
28245 : }
28246 :
28247 : *zz = si;
28248 : return 1;
28249 : }
28250 :
28251 : *zz = 0xffff;
28252 :
28253 : return _4937_01a9(di, zz, ww);
28254 : }
28255 :
28256 :
28257 : void _1c9a_09db(Bit16u recordLink)
28258 : {
28259 :
28260 : sk5fde bp0e;
28261 : sk5fde *bp12 = &bp0e;
28262 :
28263 : Creature *bp04 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature();
28264 :
28265 : sk1c9a02c3 *bp08 = _1c9a_02c3(bp04, QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType()));
28266 :
28267 : _4937_00cc(
28268 : bp04->CreatureType(),
28269 : 0x11,
28270 : &bp08->w0,
28271 : &bp08->w2,
28272 : &bp12,
28273 : bp04->w12
28274 : );
28275 : }
28276 :
28277 :
28278 : void _2066_1fab()
28279 : {
28280 :
28281 :
28282 : for (Bit16u si=0; si <= _4976_4d0e->nMaps; si++) {
28283 :
28284 : Bit16u bp2e = _4976_4dba[si].RawColumn();
28285 : Bit16u bp30 = _4976_4dba[si].RawRow();
28286 :
28287 : Bit8u *bp04 = *_4976_4ca8[si];
28288 :
28289 : Bit16u *bp1c = &_4976_4d16[_4976_4c7c[_4976_4dd6[si]]];
28290 :
28291 : for (Bit16u bp2a=0; bp2a <= bp2e; bp2a++) {
28292 :
28293 : for (Bit16u bp2c=0; bp2c <= bp30; bp2c++) {
28294 :
28295 : Bit8u bp35 = *(bp04++);
28296 :
28297 : if ((bp35 & 0x10) != 0) {
28298 :
28299 : Bit16u di = *bp1c;
28300 : bp1c++;
28301 :
28302 : do {
28303 : switch ((di & 0x3c00) >> 10) {
28304 : case dbTeleporter:
28305 : {
28306 :
28307 : Teleporter *bp0c = (Teleporter *)GET_ADDRESS_OF_RECORD(di);
28308 :
28309 : CHANGE_CURRENT_MAP_TO(bp0c->DestinationMap());
28310 :
28311 : Bit16u bp26 = GET_TILE_RECORD_LINK(bp0c->DestinationX(), bp0c->DestinationY());
28312 :
28313 : if (bp26 == 0xfffe)
28314 : break;
28315 :
28316 : if (((bp26 & 0x3c00) >> 10) != dbTeleporter)
28317 : break;
28318 :
28319 : Teleporter *bp10 = GET_ADDRESS_OF_RECORD1(bp26);
28320 :
28321 : if (bp10->DestinationX() != bp2a)
28322 : break;
28323 :
28324 : if (bp10->DestinationY() != bp2c)
28325 : break;
28326 :
28327 : if (bp10->DestinationMap() != si)
28328 : break;
28329 :
28330 : Bit16u bp3c = 0;
28331 :
28332 : Bit16u bp32 = _2066_1f37(bp26, bp0c->DestinationMap(), &bp3c);
28333 :
28334 : bp32 |= _2066_1f37(di, si, &bp3c);
28335 :
28336 : if (bp3c == 2) {
28337 :
28338 : bp10->w0 = bp0c->w0 = _2066_1ec9(GET_NEXT_RECORD_LINK(di), GET_NEXT_RECORD_LINK(bp26));
28339 : break;
28340 : }
28341 :
28342 : if (bp3c == 0 && bp32 != 0)
28343 : goto _23de;
28344 : break;
28345 : }
28346 : case dbText:
28347 : {
28348 :
28349 : Text *bp20 = GET_ADDRESS_OF_RECORD(di)->castToText();
28350 :
28351 : if (bp20->TextMode() != 1)
28352 : break;
28353 :
28354 : switch (bp20->SimpleTextExtUsage()) {
28355 : case 0x06:
28356 : case 0x07:
28357 : {
28358 :
28359 : Bit16u bp34 = di >> 14;
28360 :
28361 : _2066_1ea3(bp2a + _4976_0232[bp34], bp2c + _4976_023a[bp34], si);
28362 : break;
28363 : }
28364 : case 0x08:
28365 : {
28366 :
28367 : bp20->w2 |= 1;
28368 : break;
28369 : }
28370 : }
28371 : break;
28372 : }
28373 : case dbActuator:
28374 : {
28375 :
28376 : Actuator *bp08 = GET_ADDRESS_OF_RECORD(di)->castToActuator();
28377 :
28378 : Bit16u bp3e = bp08->ActuatorType();
28379 :
28380 : switch (bp3e) {
28381 : case 0x001c:
28382 : case 0x003f:
28383 :
28384 : bp08->w4 &= 0xfffe;
28385 : bp08->w4 |= 0x0004;
28386 : break;
28387 : case 0x0027:
28388 : case 0x002c:
28389 :
28390 : if (bp08->OnceOnlyActuator() != 1)
28391 : break;
28392 :
28393 : bp08->w4 |= 0x0001;
28394 : break;
28395 : case 0x0046:
28396 :
28397 : CHANGE_CURRENT_MAP_TO(si);
28398 :
28399 : if ((GET_TILE_VALUE(bp08->Xcoord(), bp08->Ycoord()) >> 5) != ttDoor)
28400 : break;
28401 :
28402 :
28403 : GET_ADDRESS_OF_TILE_RECORD(bp08->Xcoord(), bp08->Ycoord())->castToDoor()->Bit13(bp08->OnceOnlyActuator() & 1);
28404 : break;
28405 : }
28406 : break;
28407 : }
28408 : case dbCreature:
28409 : {
28410 :
28411 : Creature *bp14 = GET_ADDRESS_OF_RECORD(di)->castToCreature();
28412 :
28413 : sk03a2 *bp18 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp14->CreatureType());
28414 :
28415 : bp14->HP1(bp18->w4);
28416 :
28417 : if ((bp18->w0 & 1) == 0) {
28418 :
28419 : bp14->HP3(0);
28420 :
28421 : bp14->HP4_0_4(bp2a);
28422 :
28423 : bp14->HP4_5_9(bp2c);
28424 :
28425 : bp14->HP4_A_F(si);
28426 : break;
28427 : }
28428 :
28429 : bp14->w8 = bp14->w10 = 0;
28430 :
28431 : _1c9a_09db(di);
28432 :
28433 : if (bp14->b14_7_7() != 0)
28434 : break;
28435 :
28436 : Bit16u bp28 = bp14->w2;
28437 :
28438 : if (bp28 == 0xfffe)
28439 : break;
28440 :
28441 : bp14->w2 = (bp28 & 0x3fff) | (RAND02() << 14);
28442 :
28443 : while (bp28 != 0xfffe) {
28444 :
28445 : GenericRecord *bp24 = GET_ADDRESS_OF_RECORD(bp28);
28446 :
28447 : if (bp24->w0 != 0xfffe) {
28448 :
28449 : bp24->w0.Dir(RAND02());
28450 : }
28451 :
28452 : bp28 = GET_NEXT_RECORD_LINK(bp28);
28453 :
28454 : }
28455 : break;
28456 : }
28457 : }
28458 :
28459 : di = GET_NEXT_RECORD_LINK(di);
28460 : } while(di != 0xfffe);
28461 : }
28462 :
28463 : _23de:
28464 : if ((bp35 >> 5) == ttPit) {
28465 :
28466 : if (QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4dba[si].MapGraphicsStyle(), dtWordValue, 0x6a) == 0) {
28467 :
28468 : __int16 bp38 = bp2a;
28469 : __int16 bp3a = bp2c;
28470 : Bit16u bp34 = _0cee_0510(si, 1, &bp38, &bp3a, NULL);
28471 :
28472 : _2066_1ea3(bp38, bp3a, bp34);
28473 : }
28474 : }
28475 :
28476 : }
28477 :
28478 : }
28479 :
28480 : }
28481 : }
28482 :
28483 :
28484 : i16 FILE_OPEN(const Bit8u *filename);
28485 :
28486 :
28487 : Bit16u FILE_READ(Bit16u handle, Bit32u buffSize, void *buff);
28488 :
28489 :
28490 : void FILE_CLOSE(Bit16u handle);
28491 :
28492 :
28493 : void FILE_RENAME(const Bit8u *curfilename, const Bit8u *newfilename);
28494 :
28495 :
28496 : void IBMIO_BLIT_TO_SCREEN_xTO8BPP(
28497 : void *src,
28498 : blit_rc *rc,
28499 : __int16 srcx,
28500 : __int16 srcy,
28501 : __int16 srcPitch,
28502 : __int16 colorkey,
28503 : void *localPal,
28504 : __int16 srcBpp
28505 : );
28506 :
28507 : void FIRE_BLIT_TO_MEMORY_4TO4BPP(
28508 : void *src,
28509 : void *dst,
28510 : blit_rc *rc,
28511 : __int16 srcx,
28512 : __int16 srcy,
28513 : __int16 srcPitch,
28514 : __int16 dstPitch,
28515 : __int16 colorkey,
28516 : __int16 mirrorFlip
28517 : );
28518 :
28519 : void FIRE_BLIT_TO_MEMORY_4TO8BPP(
28520 : void *src,
28521 : void *dst,
28522 : blit_rc *rc,
28523 : __int16 srcx,
28524 : __int16 srcy,
28525 : __int16 srcPitch,
28526 : __int16 dstPitch,
28527 : __int16 colorkey,
28528 : __int16 mirrorFlip,
28529 : void *localPal
28530 : );
28531 :
28532 : void FIRE_BLIT_TO_MEMORY_8TO8BPP(
28533 : void *src,
28534 : void *dst,
28535 : blit_rc *rc,
28536 : __int16 srcx,
28537 : __int16 srcy,
28538 : __int16 srcPitch,
28539 : __int16 dstPitch,
28540 : __int16 colorkey,
28541 : __int16 mirrorFlip
28542 : );
28543 :
28544 :
28545 : void _44c8_0f29(
28546 : void *src,
28547 : void *dst,
28548 : blit_rc *rc,
28549 : __int16 srcx,
28550 : __int16 srcy,
28551 : __int16 srcPitch,
28552 : __int16 dstPitch,
28553 : __int16 colorkey,
28554 : __int16 mirrorFlip,
28555 : void *localPal
28556 : );
28557 :
28558 :
28559 : void FIRE_BLIT_PICTURE(
28560 : void *src,
28561 : void *dst,
28562 : blit_rc *rc,
28563 : __int16 srcx,
28564 : __int16 srcy,
28565 : __int16 srcPitch,
28566 : __int16 dstPitch,
28567 : __int16 colorkey,
28568 : __int16 mirrorFlip,
28569 : __int16 srcBpp,
28570 : __int16 dstBpp,
28571 : void *localPal
28572 : )
28573 : {
28574 :
28575 : ENTER(0);
28576 :
28577 : Bit16u di = srcPitch;
28578 : Bit16u si = colorkey;
28579 :
28580 : if (dst == NULL) {
28581 :
28582 : IBMIO_BLIT_TO_SCREEN_xTO8BPP(src, rc, srcx, srcy, di, si, localPal, srcBpp) CALL_IBMIO;
28583 :
28584 : }
28585 : else {
28586 :
28587 : if (srcBpp == 4) {
28588 :
28589 : if (dstBpp == 4) {
28590 :
28591 : FIRE_BLIT_TO_MEMORY_4TO4BPP(src, dst, rc, srcx, srcy, srcPitch, dstPitch, colorkey, mirrorFlip);
28592 : }
28593 : else {
28594 :
28595 : FIRE_BLIT_TO_MEMORY_4TO8BPP(src, dst, rc, srcx, srcy, srcPitch, dstPitch, colorkey, mirrorFlip, localPal);
28596 : }
28597 : }
28598 : else {
28599 :
28600 : if (localPal == NULL) {
28601 :
28602 : FIRE_BLIT_TO_MEMORY_8TO8BPP(src, dst, rc, srcx, srcy, srcPitch, dstPitch, colorkey, mirrorFlip);
28603 : }
28604 : else {
28605 :
28606 : _44c8_0f29(src, dst, rc, srcx, srcy, di, dstPitch, si, mirrorFlip, localPal);
28607 : }
28608 : }
28609 : }
28610 :
28611 : return;
28612 : }
28613 : void FIRE_BLIT_PICTURE(
28614 : void *src,
28615 : void *dst,
28616 : SRECT *rc,
28617 : __int16 srcx,
28618 : __int16 srcy,
28619 : __int16 srcPitch,
28620 : __int16 dstPitch,
28621 : __int16 colorkey,
28622 : __int16 mirrorFlip,
28623 : __int16 srcBpp,
28624 : __int16 dstBpp,
28625 : void *localPal
28626 : );
28627 :
28628 :
28629 : void IBMIO_BLIT_TO_SCREEN_8TO8BPP(
28630 : void *src,
28631 : void *dst,
28632 : blit_rc *rc,
28633 : __int16 srcx,
28634 : __int16 srcy,
28635 : __int16 srcpitch,
28636 : __int16 dstpitch,
28637 : __int16 colorkey
28638 : );
28639 :
28640 :
28641 : Bit16u _476d_030a(Bit16u xx);
28642 :
28643 :
28644 : __int16 GET_PLAYER_AT_POSITION(Bit16u position)
28645 : {
28646 :
28647 : sk53b4 *bp04 = _4976_53b4;
28648 :
28649 : for (Bit16u si=0; si<_4976_4c3c; si++, bp04++) {
28650 :
28651 : if (bp04->playerPos() == position && bp04->curHP() != 0) {
28652 :
28653 : return si;
28654 : }
28655 :
28656 : }
28657 :
28658 : return -1;
28659 : }
28660 :
28661 :
28662 : Bit8u *EMS_MAP_BANK_TO_MEMORY(Bit32u info, Bit16u physPage0to3);
28663 :
28664 :
28665 : Bit8u *_3e74_0683(__int32 size, Bit16u poolno)
28666 : {
28667 :
28668 : Bit16u si = poolno;
28669 :
28670 : EMS_MAP_BANK_TO_MEMORY(0, 0);
28671 :
28672 : sk5d00 *bp04 = _4976_5d00;
28673 :
28674 : Bit8u *bp08 = 0;
28675 : __int32 bp10 = 0x7fffffff;
28676 :
28677 : while (bp04 != NULL) {
28678 :
28679 : __int32 bp0c;
28680 : if (true
28681 : && (bp04->w18 == 0)
28682 : && (bp04->w16 & si) == si
28683 : && (bp04->w16 & 0x0800) == (si & 0x0800)
28684 : && (bp0c = bp04->dw12 -size) >= 0
28685 : && (bp0c < bp10)
28686 : ) {
28687 :
28688 : bp10 = bp0c;
28689 : bp08 = (Bit8u *)bp04;
28690 : }
28691 :
28692 : bp04 = bp04->pv0;
28693 :
28694 : }
28695 :
28696 : return bp08;
28697 : }
28698 :
28699 :
28700 : Bit8u *ALLOC_MEMORY(__int32 size, Bit16u flags, Bit16u poolno);
28701 :
28702 :
28703 : Bit8u *ALLOC_PICT_BUFF(Bit16u srccx, Bit16u srccy, Bit16u flags, Bit16u bpp)
28704 : {
28705 :
28706 : Bit16u si = srccx;
28707 :
28708 : Bit8u *bp04 = ALLOC_MEMORY((bpp == 4) ? (((si +1) & 0xfffe) >> 1) : (si & 0xffff), flags, 8);
28709 :
28710 : bp04 = bp04;
28711 :
28712 : WRITE_UI16(bp04,-6,bpp);
28713 :
28714 : WRITE_UI16(bp04,-4,si);
28715 :
28716 : WRITE_UI16(bp04,-2,srccy);
28717 :
28718 : return bp04;
28719 : }
28720 :
28721 :
28722 : void COPY_MEMORY(const void *buffSrc, const void *buffDst, Bit32u buffSize);
28723 :
28724 :
28725 : Bit16u QUERY_GDAT_ENTRY_DATA_INDEX(Bit8u cls1, Bit16u cls2, Bit8u cls3, Bit16u cls4);
28726 :
28727 :
28728 : Bit8u *REALIZE_GRAPHICS_DATA_MEMORY(shelf_memory info);
28729 :
28730 :
28731 : Bit16u QUERY_GDAT_RAW_DATA_LENGTH(Bit16u index);
28732 :
28733 :
28734 : Bit16u IS_CLS1_CRITICAL_FOR_LOAD(Bit8u cls1)
28735 : {
28736 :
28737 : switch (cls1) {
28738 : case 0x1B:
28739 : case 0x06:
28740 : case 0x1C:
28741 : case 0x05:
28742 :
28743 : return 1;
28744 : }
28745 :
28746 : return 0;
28747 : }
28748 :
28749 :
28750 : __int32 QUERY_GDAT_RAW_DATA_FILE_POS(Bit16u index)
28751 : {
28752 :
28753 : Bit16u di = index;
28754 : Bit32u bp04 = _4976_5d6a;
28755 : Bit16u si = 0;
28756 :
28757 : if (di >= _4976_4839) {
28758 :
28759 : si = _4976_4839;
28760 : bp04 += _4976_483b;
28761 : }
28762 :
28763 : while (si < di) {
28764 :
28765 : bp04 += QUERY_GDAT_RAW_DATA_LENGTH(si);
28766 : si++;
28767 :
28768 : }
28769 :
28770 : _4976_4839 = di;
28771 :
28772 : _4976_483b = bp04 - _4976_5d6a;
28773 :
28774 : return bp04;
28775 : }
28776 :
28777 :
28778 : Bit16u FILE_SEEK(Bit16u handle, Bit32u xxx);
28779 :
28780 :
28781 : void __declspec(noreturn) RAISE_SYSERR(Bit16u syserr);
28782 :
28783 :
28784 : void GRAPHICS_DATA_READ(Bit32u location, Bit32u size, Bit8u *buff)
28785 : {
28786 :
28787 : Bit16u bp14[2] = {_4976_5c94};
28788 : Bit32u bp08[2] = {location, 0};
28789 : __int32 bp10[2] = {size, 0};
28790 :
28791 : if (_4976_5c9c != 0) {
28792 :
28793 : bp14[1] = _4976_5c96;
28794 : bp08[1] = location - _4976_5cea;
28795 :
28796 : if (bp08[1] >= 0) {
28797 :
28798 : bp10[1] = size;
28799 : }
28800 : else {
28801 :
28802 : bp10[1] = bp08[1] + size;
28803 :
28804 : if (bp10[1] > 0) {
28805 :
28806 : bp08[1] = 0;
28807 : }
28808 : else {
28809 :
28810 : bp10[1] = 0;
28811 : }
28812 : }
28813 :
28814 : bp10[0] -= bp10[1];
28815 : }
28816 :
28817 : for (Bit16u si=0; si < 2; si++) {
28818 :
28819 : if (bp10[si] != 0) {
28820 : do {
28821 :
28822 : if (FILE_SEEK(bp14[si], bp08[si]) != 0) {
28823 :
28824 : if (FILE_READ(bp14[si], bp10[si], buff) != 0)
28825 : break;
28826 : }
28827 :
28828 : GRAPHICS_DATA_CLOSE();
28829 :
28830 : RAISE_SYSERR((si == 0) ? 0x002e : 0x0020);
28831 :
28832 : } while (false);
28833 :
28834 : buff += bp10[si];
28835 : }
28836 :
28837 : }
28838 :
28839 : }
28840 :
28841 :
28842 : void LOAD_GDAT_RAW_DATA(Bit16u index, Bit8u *buff)
28843 : {
28844 :
28845 : Bit16u di = index;
28846 : GRAPHICS_DATA_OPEN();
28847 :
28848 : __int32 bp04;
28849 : Bit32u bp0c;
28850 : if (di == 0) {
28851 :
28852 : bp04 = _4976_5d7a;
28853 : bp0c = _4976_5d6a - bp04;
28854 : }
28855 : else{
28856 :
28857 : bp0c = QUERY_GDAT_RAW_DATA_FILE_POS(di);
28858 : bp04 = QUERY_GDAT_RAW_DATA_LENGTH(di);
28859 : }
28860 :
28861 : Bit16u si = bp0c / 1024;
28862 :
28863 : Bit32u bp08 = ((Bit32u)si) << 10;
28864 :
28865 : while (bp04 > 0) {
28866 :
28867 : if (si != _4976_480d || _4976_5d34 != 0) {
28868 :
28869 : _4976_480d = si;
28870 :
28871 : Bit32u bp18 = _4976_5caa - bp08;
28872 :
28873 : if (bp18 > 0x00000400) {
28874 : bp18 = 0x00000400;
28875 : }
28876 :
28877 : GRAPHICS_DATA_READ(bp08, bp18, _4976_5d04);
28878 :
28879 : _4976_5d34 = 0;
28880 : }
28881 :
28882 : __int32 bp14 = bp0c - bp08;
28883 :
28884 : Bit32u bp10 = (0x00000400 - bp14 > bp04) ? (bp04) : (0x00000400 - bp14);
28885 :
28886 : COPY_MEMORY(&_4976_5d04[bp14], REALIZE_GRAPHICS_DATA_MEMORY(buff), bp10);
28887 :
28888 : bp04 -= bp10;
28889 : bp0c += bp10;
28890 : buff += bp10;
28891 :
28892 : si++;
28893 : bp08 += 0x00000400;
28894 :
28895 : }
28896 :
28897 : GRAPHICS_DATA_CLOSE();
28898 : }
28899 :
28900 :
28901 : Bit8u *CONVERT_PHYS_TO_SHELF_FORM(Bit8u *buff)
28902 : {
28903 :
28904 : Bit8u *bp04 = buff;
28905 :
28906 : DOSIMPL();
28907 :
28908 : #pragma warning( push )
28909 : #pragma warning( disable : 4311 4312 )
28910 : return (Bit8u *)((((Bit32u)bp04 & 0xffff0000) >> 12) + ((Bit16u)bp04 & 0xffff));
28911 : #pragma warning( pop )
28912 : }
28913 :
28914 :
28915 : Bit8u *_3e74_15a9(Bit16u index, Bit16u *yy, Bit16u allocUpper)
28916 : {
28917 :
28918 : Bit16u si = index;
28919 : Bit16u di = allocUpper;
28920 :
28921 : if (_4976_5d76 == 0) {
28922 :
28923 : __int32 bp08;
28924 : Bit8u *bp04 = ALLOC_MEMORY(
28925 : bp08 = QUERY_GDAT_RAW_DATA_LENGTH(si),
28926 : (di != 0) ? afDefault : afUseLower,
28927 : 1024
28928 : ) + 6;
28929 :
28930 : LOAD_GDAT_RAW_DATA(
28931 : si,
28932 : CONVERT_PHYS_TO_SHELF_FORM(bp04)
28933 : );
28934 :
28935 : WRITE_UI16(bp04,-6 +4,(di != 0) ? afDefault : afUseLower);
28936 :
28937 : WRITE_UI32(bp04,-6 +0,bp08);
28938 :
28939 :
28940 : return bp04;
28941 : }
28942 : else {
28943 :
28944 : Bit8u *bp04;
28945 : if (_3e74_55f9(si + 0xfffe0000, yy) != 0) {
28946 :
28947 : bp04 = reinterpret_cast<Bit8u *>(_3e74_5817(*yy));
28948 :
28949 : if (di == 0)
28950 : return bp04;
28951 :
28952 : _3e74_583a(*yy);
28953 : }
28954 : else {
28955 :
28956 : bp04 = _3e74_5708(
28957 : *yy,
28958 : QUERY_GDAT_RAW_DATA_LENGTH(si)
28959 : );
28960 :
28961 : LOAD_GDAT_RAW_DATA(
28962 : si,
28963 : CONVERT_PHYS_TO_SHELF_FORM(bp04)
28964 : );
28965 :
28966 : if (di == 0) {
28967 :
28968 : _3e74_585a(*yy, 0);
28969 : }
28970 : }
28971 :
28972 : return bp04;
28973 : }
28974 : }
28975 :
28976 :
28977 : Bit8u *QUERY_GDAT_IMAGE_LOCALPAL(Bit8u cls1, Bit8u cls2, Bit8u cls4)
28978 : {
28979 :
28980 : Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
28981 :
28982 : if (si != 0xffff) {
28983 :
28984 : SkImage *bp04;
28985 : if (_4976_5c98[si].Absent() != 0) {
28986 :
28987 : if (IS_CLS1_CRITICAL_FOR_LOAD(cls1) == 0)
28988 : goto _5276;
28989 :
28990 : Bit16u bp06;
28991 : bp04 = reinterpret_cast<SkImage *>(_3e74_15a9(si, &bp06, 0));
28992 : }
28993 : else {
28994 :
28995 : bp04 = reinterpret_cast<SkImage *>(REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]));
28996 : }
28997 :
28998 :
28999 : if (bp04->Yoffset() == -32 && bp04->BitsPixel() != 4) {
29000 :
29001 : return NULL;
29002 : }
29003 :
29004 : PTR_PADA(bp04, QUERY_GDAT_RAW_DATA_LENGTH(si) - 16);
29005 :
29006 : return reinterpret_cast<Bit8u *>(bp04);
29007 : }
29008 : _5276:
29009 :
29010 : return QUERY_GDAT_IMAGE_LOCALPAL(0x0015, 0x00fe, 0x00fe);
29011 : }
29012 :
29013 :
29014 : Bit8u *QUERY_GDAT_IMAGE_ENTRY_BUFF(Bit8u cls1, Bit8u cls2, Bit8u cls4);
29015 :
29016 :
29017 : void DRAW_DIALOGUE_PICT(Bit8u *srcImage, Bit8u *dstImage, blit_rc *rect, Bit16u srcx, Bit16u srcy, Bit16u colorkey, Bit8u localpal[16])
29018 : {
29019 :
29020 :
29021 :
29022 :
29023 : FIRE_BLIT_PICTURE(
29024 : srcImage,
29025 : dstImage,
29026 : rect,
29027 : srcx,
29028 : srcy,
29029 : ((Bit16u *)srcImage)[-2],
29030 : ((Bit16u *)dstImage)[-2],
29031 : colorkey,
29032 : 0,
29033 : ((Bit16u *)srcImage)[-3],
29034 : ((Bit16u *)dstImage)[-3],
29035 : localpal
29036 : );
29037 : }
29038 :
29039 : void DRAW_DIALOGUE_PICT(Bit8u *srcImage, Bit8u *dstImage, SRECT *rect, Bit16u srcx, Bit16u srcy, Bit16u colorkey, Bit8u localpal[16]);
29040 :
29041 :
29042 : Bit8u *QUERY_GDAT_SQUAD_ICON(Bit8u *dstImage, Bit8u colorno, Bit8u localpal[16])
29043 : {
29044 :
29045 : Bit16u si = (((_4976_53b4[colorno].playerDir() + 4 - _4976_4bf6) & 3) + ((_4976_57e6 != 0) ? 4 : 0)) * _4976_0118;
29046 :
29047 : COPY_MEMORY(
29048 : QUERY_GDAT_IMAGE_LOCALPAL(1, 6, colorno),
29049 : localpal,
29050 : 16
29051 : );
29052 :
29053 : DRAW_DIALOGUE_PICT(
29054 : QUERY_GDAT_IMAGE_ENTRY_BUFF(1, 6, colorno),
29055 : dstImage,
29056 : reinterpret_cast<blit_rc *>(ALLOC_TEMP_ORIGIN_RECT(_4976_0118, _4976_011a)),
29057 : si,
29058 : 0,
29059 : 2,
29060 : NULL
29061 : );
29062 :
29063 : return dstImage;
29064 : }
29065 :
29066 :
29067 : void DEALLOC_UPPER_MEMORY(Bit32u size);
29068 :
29069 :
29070 : void FREE_PICT_BUFF(Bit8u *buff)
29071 : {
29072 :
29073 :
29074 :
29075 :
29076 :
29077 : DEALLOC_UPPER_MEMORY(
29078 : ( (READ_UI16(buff,-6) == 4)
29079 : ? (((READ_UI16(buff,-4) +1) & 0xfffe) >> 1)
29080 : : (READ_UI16(buff,-4) & 0xffff)
29081 : ) * READ_UI16(buff,-2)
29082 : );
29083 : }
29084 :
29085 :
29086 : void _01b0_07f8()
29087 : {
29088 :
29089 : LOADDS(0x3083)
29090 :
29091 : _04bf_0e7a++;
29092 : }
29093 :
29094 :
29095 : Bit16u _443c_0342(Bit16u xx, Bit16u yy, Bit16u zz);
29096 :
29097 :
29098 : void _00eb_0777(Bit8u *buff, blit_rc *rc, Bit16u srcx, Bit16u srcy, Bit16u srcpitch, __int16 colorkey)
29099 : {
29100 :
29101 : LOADDS(0x0c48)
29102 :
29103 : if (_04bf_00fd != 0)
29104 : return;
29105 :
29106 : _04bf_09e0.dstx = rc->dstx;
29107 : _04bf_09e0.dsty = rc->dsty;
29108 : _04bf_09e8.dstx = _04bf_09e8.dsty = 0;
29109 :
29110 : _04bf_09e0.srccx = _04bf_09e8.srccx = rc->srccx;
29111 :
29112 : _04bf_09e0.srccy = _04bf_09e8.srccy = rc->srccy;
29113 :
29114 : IBMIO_BLIT_TO_SCREEN_8TO8BPP(
29115 : __vram,
29116 : _04bf_079e,
29117 : &_04bf_09e8,
29118 : rc->dstx,
29119 : rc->dsty,
29120 : 320,
29121 : 24,
29122 : -1
29123 : );
29124 :
29125 : IBMIO_BLIT_TO_SCREEN_8TO8BPP(
29126 : buff,
29127 : __vram,
29128 : rc,
29129 : srcx,
29130 : srcy,
29131 : srcpitch,
29132 : 320,
29133 : colorkey
29134 : );
29135 :
29136 : _04bf_079c = colorkey;
29137 : _04bf_00fd = 1;
29138 : }
29139 :
29140 :
29141 : void _01b0_05ae()
29142 : {
29143 :
29144 : if ((true
29145 : && _04bf_1850 != 0
29146 : && _04bf_03c6 != 0
29147 : ) && (
29148 : false
29149 : || _04bf_03be < _04bf_1852.x
29150 : || _04bf_1852.x + _04bf_1852.cx - 1 < _04bf_03be
29151 : || _04bf_03c0 < _04bf_1852.y
29152 : || _04bf_1852.y + _04bf_1852.cy - 1 < _04bf_03c0
29153 : )
29154 : ) {
29155 :
29156 : _04bf_1850 = 0;
29157 :
29158 :
29159 : _04bf_0e7c = _443c_0342(_04bf_03be, _04bf_03c0, _04bf_17e8) INDIRECT_CALL;
29160 :
29161 : if (_04bf_0e7c >= 0) {
29162 :
29163 : _04bf_1938 = _04bf_0e7c;
29164 : }
29165 : }
29166 :
29167 : Bit8u *bp04 = &_04bf_0e80[_04bf_1938 * 0x0246];
29168 :
29169 : _04bf_185e = _04bf_03be - *bp04;
29170 :
29171 : _04bf_1860 = _04bf_03c0 - bp04[1];
29172 :
29173 : _04bf_0e38 = bp04[2];
29174 : _04bf_1936 = bp04[3];
29175 : _04bf_18aa = 0;
29176 : _04bf_18ac = 0;
29177 :
29178 : if (_04bf_185e < 0) {
29179 :
29180 : _04bf_18aa = 0 - _04bf_185e;
29181 : _04bf_185e = 0;
29182 : }
29183 :
29184 : if (_04bf_1860 < 0) {
29185 :
29186 : _04bf_18ac = 0 - _04bf_1860;
29187 : _04bf_1860 = 0;
29188 : }
29189 :
29190 : if (_04bf_185e >= 320)
29191 : return;
29192 :
29193 : if (_04bf_1860 >= 200)
29194 : return;
29195 :
29196 : if (_04bf_17a8 != 0)
29197 : return;
29198 : _04bf_17a8++;
29199 :
29200 : blit_rc bp0c;
29201 : bp0c.dstx = _04bf_185e;
29202 : bp0c.srccx = _04bf_0e38 - _04bf_18aa;
29203 :
29204 : if (bp0c.dstx + bp0c.srccx - 1 > 319) {
29205 :
29206 : bp0c.srccx -= bp0c.dstx + bp0c.srccx - 320;
29207 : }
29208 :
29209 : bp0c.dsty = _04bf_1860;
29210 : bp0c.srccy = _04bf_1936 - _04bf_18ac;
29211 :
29212 : if (bp0c.dsty + bp0c.srccy - 1 > 199) {
29213 :
29214 : bp0c.srccy += bp0c.dsty + bp0c.srccy - 200;
29215 : }
29216 :
29217 : _00eb_0777(&bp04[6], &bp0c, _04bf_18aa, _04bf_18ac, _04bf_0e38, bp04[4]);
29218 :
29219 : return;
29220 : }
29221 :
29222 :
29223 : void _00eb_073f()
29224 : {
29225 :
29226 : LOADDS(0x0c48);
29227 :
29228 : if (_04bf_00fd != 0) {
29229 :
29230 : IBMIO_BLIT_TO_SCREEN_8TO8BPP(
29231 : _04bf_079e,
29232 : __vram,
29233 : &_04bf_09e0,
29234 : 0,
29235 : 0,
29236 : 24,
29237 : 320,
29238 : -1
29239 : );
29240 : }
29241 :
29242 : return;
29243 : }
29244 :
29245 :
29246 : void _01b0_073d()
29247 : {
29248 :
29249 :
29250 : if (_04bf_17a8 != 0) {
29251 :
29252 : _00eb_073f();
29253 :
29254 : _04bf_17a8--;
29255 : }
29256 :
29257 : return;
29258 : }
29259 :
29260 :
29261 : void _01b0_0752(Bit16u cursorx, Bit16u cursory, Bit16u buttons)
29262 : {
29263 :
29264 : Bit16u di = cursorx;
29265 : Bit16u si = cursory;
29266 : _04bf_03be = di;
29267 : _04bf_03c0 = si;
29268 :
29269 : if ((di == _04bf_03c2 || si != _04bf_03c4) && _04bf_17a2 <= 0) {
29270 :
29271 : _01b0_073d();
29272 : _01b0_05ae();
29273 : _04bf_03c2 = di;
29274 : _04bf_03c4 = si;
29275 : }
29276 :
29277 : _04bf_17ee = ((buttons >> 1) & 1) | ((buttons << 1) & 2);
29278 :
29279 : _04bf_0e7c = buttons ^ _04bf_1934;
29280 :
29281 : if (_04bf_0e7c != 0 && _04bf_03c6 != 0) {
29282 :
29283 : if ((_04bf_0e7c & 1) != 0) {
29284 :
29285 : _443c_0342(di, si, ((buttons & 1) != 0) ? 2 : 4) INDIRECT_CALL;
29286 : }
29287 :
29288 : if ((_04bf_0e7c & 2) != 0) {
29289 :
29290 : _443c_0342(di, si, ((buttons & 2) != 0) ? 1 : 8) INDIRECT_CALL;
29291 : }
29292 :
29293 : _04bf_1934 = buttons;
29294 : }
29295 :
29296 : return;
29297 : }
29298 :
29299 :
29300 : void _01b0_080b()
29301 : {
29302 :
29303 : LOADDS(0x3083)
29304 :
29305 : while (_04bf_17a4 > 0) {
29306 :
29307 : _04bf_17a4--;
29308 : _04bf_179c = (_04bf_179c +1) % 10;
29309 :
29310 : Bit16u si = _04bf_17ac[_04bf_179c].w0;
29311 :
29312 : Bit16u bp02 = _04bf_17ac[_04bf_179c].w2;
29313 :
29314 : Bit16u di = _04bf_17ac[_04bf_179c].w4;
29315 :
29316 : _01b0_0752(bp02, di, si);
29317 :
29318 : }
29319 :
29320 : _04bf_0e7a--;
29321 : }
29322 :
29323 :
29324 : void _01b0_0aa8()
29325 : {
29326 :
29327 : LOADDS(0x3083);
29328 :
29329 : if ((_04bf_17a2--) == 1) {
29330 :
29331 : _01b0_07f8();
29332 : _01b0_05ae();
29333 :
29334 : _04bf_03c2 = _04bf_03be;
29335 : _04bf_03c4 = _04bf_03c0;
29336 :
29337 : _01b0_080b();
29338 : }
29339 :
29340 : }
29341 :
29342 :
29343 : void _443c_086b()
29344 : {
29345 :
29346 : _4976_4860--;
29347 :
29348 : _01b0_0aa8() CALL_IBMIO;
29349 : }
29350 :
29351 :
29352 : void _443c_04b6(Bit16u xx)
29353 : {
29354 :
29355 : Bit16u di = 1;
29356 :
29357 : if ((xx & 0x8000) != 0) {
29358 :
29359 : di = 0;
29360 : xx &= 3;
29361 : }
29362 :
29363 : __int16 si = GET_PLAYER_AT_POSITION((xx + _4976_4bf6) & 3);
29364 :
29365 : if (_4976_5dbc != 0) {
29366 :
29367 : if (si < 0)
29368 : return;
29369 :
29370 : _4976_495c.srccx = _4976_0118;
29371 : _4976_495c.srccy = _4976_011a;
29372 :
29373 : Bit8u *bp08 = ALLOC_PICT_BUFF(_4976_0118, _4976_011a, afDefault, 4);
29374 : Bit8u *bp0c = ALLOC_PICT_BUFF(_4976_0118, _4976_011a, afDefault, 8);
29375 :
29376 : Bit8u bp1c[16];
29377 : QUERY_GDAT_SQUAD_ICON(bp08, (Bit8u)si, bp1c);
29378 :
29379 : _44c8_1d26(bp0c, 0x000c);
29380 :
29381 : FIRE_BLIT_PICTURE(
29382 : bp08,
29383 : bp0c,
29384 : &_4976_495c,
29385 : 0,
29386 : 0,
29387 : _4976_0118,
29388 : _4976_0118,
29389 : 4,
29390 : 0,
29391 : 4,
29392 : 8,
29393 : bp1c
29394 : );
29395 :
29396 : _443c_085a();
29397 :
29398 : _01b0_0b01(3, bp0c, 8, 6, _4976_0118, _4976_011a, 8, NULL, bp1c[12]) CALL_IBMIO;
29399 :
29400 : _01b0_0c70(3) CALL_IBMIO;
29401 :
29402 : FREE_PICT_BUFF(bp0c);
29403 :
29404 : FREE_PICT_BUFF(bp08);
29405 :
29406 : _4976_5dba = xx;
29407 : _4976_5dbc = xx +1;
29408 :
29409 : _443c_086b();
29410 : }
29411 : else {
29412 :
29413 : Bit16u bp02 = _4976_5dbc -1;
29414 : _4976_5dbc = 0;
29415 :
29416 : Bit16u bp04 = GET_PLAYER_AT_POSITION((bp02 + _4976_4bf6) & 0x0003);
29417 :
29418 : if (di != 0) {
29419 :
29420 : _4976_53b4[bp04].playerDir((Bit8u)_4976_4bf6);
29421 : }
29422 :
29423 : if (bp02 != xx) {
29424 :
29425 : if (si >= 0) {
29426 :
29427 : _4976_53b4[si].playerPos((Bit8u)bp02);
29428 : }
29429 :
29430 : _4976_53b4[bp04].playerPos((Bit8u)(xx + _4976_4bf6));
29431 : }
29432 : }
29433 :
29434 : _443c_040e();
29435 : }
29436 :
29437 :
29438 : void _443c_0662()
29439 : {
29440 :
29441 : if (_4976_5dbc != 0) {
29442 :
29443 : _443c_04b6(_4976_5dba | 0x8000);
29444 : }
29445 :
29446 : }
29447 :
29448 :
29449 : void _38c8_0002()
29450 : {
29451 :
29452 :
29453 : if (_4976_5bec == 0 && _4976_01ba == 0) {
29454 :
29455 : _4976_5bec = 1;
29456 : if (_4976_5dbc != 0) {
29457 :
29458 : _443c_0662();
29459 : _2759_0644(0);
29460 : }
29461 :
29462 : _1031_04f5();
29463 : _443c_085a();
29464 : _12b4_0092();
29465 :
29466 : if (_4976_52be == 0) {
29467 :
29468 : FIRE_FILL_HALFTONE_RECTI(0x09, 0);
29469 : }
29470 :
29471 : FIRE_FILL_HALFTONE_RECTI(0x0B, 0);
29472 : _443c_086b();
29473 : }
29474 :
29475 : return;
29476 : }
29477 :
29478 :
29479 : Bit8u *QUERY_GDAT_TEXT(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit8u *buff);
29480 :
29481 :
29482 : Bit8u _0aaf_0067(Bit8u cls2)
29483 : {
29484 :
29485 : Bit16u di = 0;
29486 : Bit16u si = 0xffff;
29487 : Bit16u bp08 = 0;
29488 :
29489 : Bit16u bp38[21];
29490 : ZERO_MEMORY(&bp38[1], 2*20);
29491 :
29492 : Bit8u bp5e[38];
29493 : for (Bit8u bp0d = 0; bp0d < 0x14; bp0d++) {
29494 :
29495 : if (*QUERY_GDAT_TEXT(0x1a, cls2, bp0d, (Bit8u *)bp5e) != 0) {
29496 :
29497 : Bit16u bp0a = QUERY_GDAT_ENTRY_DATA_INDEX(0x1a, cls2, dtWordValue, bp0d);
29498 :
29499 : Bit8u *bp04 = (Bit8u *)&bp38[1 + di];
29500 : *bp04 = (Bit8u)bp0a;
29501 :
29502 : if (*bp04 == 0) {
29503 :
29504 : *bp04 = bp0d;
29505 : }
29506 :
29507 : bp04[1] = (Bit8u)(bp0a >> 8);
29508 :
29509 : if (bp04[1] != 0) {
29510 :
29511 : si = bp04[1];
29512 : bp08 = bp04[0];
29513 : }
29514 :
29515 : di++;
29516 : }
29517 :
29518 : }
29519 :
29520 : _4976_4bd2 = di;
29521 :
29522 : if (si == 0xffff && di == 1) {
29523 :
29524 : si = 1;
29525 : }
29526 :
29527 : _1031_0675(4);
29528 :
29529 : for (Bit16u bp06 = 0; _4976_4860 > 0; bp06++) {
29530 :
29531 : _443c_086b();
29532 :
29533 : }
29534 :
29535 : _4976_4dfc = 0x00ff;
29536 :
29537 : do {
29538 :
29539 : _1031_1e6a();
29540 : WAIT_SCREEN_REFRESH();
29541 :
29542 : if (si != 0xffff) {
29543 :
29544 : if (_476d_04ed(si) != 0) {
29545 :
29546 : _1031_0781(bp08 + 0x00db);
29547 : }
29548 : }
29549 :
29550 : if (_4976_4dfc == 0x00ff && _476d_05a9() != 0 && _476d_050e() == 0x001c) {
29551 :
29552 : _1031_0781(0x00db);
29553 : }
29554 :
29555 : } while (_4976_4dfc == 0x00ff);
29556 :
29557 :
29558 : Bit8u bp0c = (Bit8u)bp38[_4976_4dfc];
29559 :
29560 : while ((bp06--) != 0) {
29561 :
29562 : _443c_085a();
29563 :
29564 : }
29565 :
29566 : _4976_022c = 1;
29567 :
29568 : _1031_06a5();
29569 :
29570 : return bp0c;
29571 : }
29572 :
29573 :
29574 : Bit16u _2066_03e0(Bit16u xx)
29575 : {
29576 :
29577 : Bit16u di = xx;
29578 : Bit8u bp01 = 0;
29579 :
29580 : if (_4976_499e != 0) {
29581 :
29582 : return 1;
29583 : }
29584 :
29585 : Bit16u si = 1;
29586 :
29587 : if (_476d_030a(1) == 0) {
29588 :
29589 : if (di != 2)
29590 : return si;
29591 : }
29592 :
29593 : _4976_52f4 = 1;
29594 :
29595 : while (di != 0 || _476d_030a(1) != 0) {
29596 :
29597 : _38c8_0002();
29598 :
29599 : di = si = 0;
29600 :
29601 : _0aaf_0067(_0aaf_02f8((_4976_5c9c != 0) ? ((_4976_5ca8 != 0) ? (0x13) : (0x14)) : (0x07), bp01 = _476d_04e8(1)));
29602 :
29603 : bp01 = 0x14;
29604 :
29605 : }
29606 :
29607 : return si;
29608 : }
29609 :
29610 :
29611 : void _2066_0002()
29612 : {
29613 :
29614 : _4976_524e = _4976_5254 = 0;
29615 : }
29616 :
29617 :
29618 : void REARRANGE_TIMERLIST()
29619 : {
29620 :
29621 :
29622 :
29623 :
29624 : _4976_5c14 = 0;
29625 : _4976_5c18 = 0xffff;
29626 :
29627 : Bit16u di;
29628 : for (Bit16u si=0; si < _4976_5c16; si++) {
29629 :
29630 : if (_4976_5c20[si].TimerType() == 0) {
29631 :
29632 : if (_4976_5c18 == 0xffff) {
29633 :
29634 : _4976_5c18 = si;
29635 : }
29636 : else {
29637 :
29638 : _4976_5c20[di].w0_0_f(si);
29639 : }
29640 :
29641 : _4976_5c20[si].w0_0_f(0xffff);
29642 :
29643 : di = si;
29644 : }
29645 : else {
29646 :
29647 : _4976_5c14 = si+1;
29648 : }
29649 :
29650 : }
29651 :
29652 : return;
29653 : }
29654 :
29655 :
29656 : void _3a15_008e()
29657 : {
29658 :
29659 :
29660 : Bit16u bp12 = _4976_5c1e;
29661 :
29662 : if (bp12 != 0) {
29663 :
29664 : for (Bit16u di = 0; di < bp12; di++) {
29665 :
29666 : _4976_5c1a[di] = di;
29667 :
29668 : }
29669 :
29670 : if (bp12 != 1) {
29671 :
29672 : for (__int16 bp0e = (bp12 -2) >> 1; bp0e >= 0; bp0e--) {
29673 :
29674 : Bit16u di = bp0e;
29675 : sk5c20 *bp04 = &_4976_5c20[_4976_5c1a[di]];
29676 : while (true) {
29677 :
29678 : Bit16u si = (di << 1) + 1;
29679 :
29680 : if (si >= bp12)
29681 : break;
29682 :
29683 : sk5c20 *bp08 = &_4976_5c20[_4976_5c1a[si]];
29684 :
29685 : if (si+1 < bp12) {
29686 :
29687 : sk5c20 *bp0c = &_4976_5c20[_4976_5c1a[si+1]];
29688 :
29689 : if (_3a15_0381(bp04, bp08) != 0) {
29690 :
29691 : if (_3a15_0381(bp04, bp0c) != 0)
29692 :
29693 : break;
29694 :
29695 : si++;
29696 : }
29697 : else {
29698 :
29699 : if (_3a15_0381(bp0c, bp08) != 0)
29700 :
29701 : si++;
29702 : }
29703 : }
29704 : else {
29705 :
29706 : if (_3a15_0381(bp04, bp08) != 0)
29707 :
29708 : break;
29709 : }
29710 :
29711 : Bit16u bp10 = _4976_5c1a[di];
29712 :
29713 : _4976_5c1a[di] = _4976_5c1a[si];
29714 :
29715 : _4976_5c1a[si] = bp10;
29716 :
29717 : di = si;
29718 : }
29719 :
29720 : }
29721 : }
29722 : }
29723 :
29724 : _4976_4762 = -1;
29725 :
29726 : REARRANGE_TIMERLIST();
29727 :
29728 : return;
29729 : }
29730 :
29731 :
29732 : Bit8u *FORMAT_SKSTR(const Bit8u *format, Bit8u *output);
29733 :
29734 :
29735 : int READ_DUNGEON_STRUCTURE(int xx);
29736 :
29737 :
29738 : int SUPPRESS_READER(void *_data, const void *_mask, Bit16u buffSize, Bit32u repeat, Bit16u fill);
29739 :
29740 :
29741 : int READ_1BIT(Bit16u *pw);
29742 :
29743 :
29744 : void ADD_INDEX_TO_POSSESSION_INDICES(Bit16u recordLink);
29745 :
29746 :
29747 : int READ_RECORD_CHECKCODE(__int16 xpos, __int16 ypos, ObjectID *recordLinkPtr, Bit16u xx, Bit16u yy)
29748 : {
29749 :
29750 :
29751 :
29752 :
29753 : while (true) {
29754 :
29755 : Bit16u bp0e;
29756 : if (READ_1BIT(&bp0e) != 0)
29757 : return 1;
29758 :
29759 : if (bp0e == 0)
29760 : break;
29761 :
29762 : Bit8u bp0c = 0x0f;
29763 : Bit8u bp0b;
29764 :
29765 : if (SUPPRESS_READER(&bp0b, &bp0c, 1, 1, 1) != 0)
29766 : return 1;
29767 :
29768 : Bit16u di = bp0b;
29769 : Bit16u bp0a;
29770 : if (xx != 0 && di != dbCreature) {
29771 :
29772 : bp0c = 0x03;
29773 :
29774 : if (SUPPRESS_READER(&bp0b, &bp0c, 1, 1, 1) != 0)
29775 : return 1;
29776 :
29777 : bp0a = bp0b;
29778 : }
29779 : else {
29780 :
29781 : bp0a = 0;
29782 : }
29783 :
29784 : if (di == dbCloud && _4976_3b59 != 0) {
29785 :
29786 : Bit16u bp10 = 0x7f;
29787 :
29788 : if (SUPPRESS_READER(&bp0e, &bp10, 2, 1, 1) != 0)
29789 : return 1;
29790 :
29791 : bp0e = bp0e;
29792 : if (recordLinkPtr == NULL)
29793 : break;
29794 :
29795 : *recordLinkPtr = 0xff80 | bp0e;
29796 : break;
29797 : }
29798 :
29799 : Bit16u si = ALLOC_NEW_RECORD(di);
29800 : si = (si & 0x3fff) | bp0a << 14;
29801 :
29802 : APPEND_RECORD_TO(si, recordLinkPtr, xpos, ypos);
29803 :
29804 : void *bp04 = GET_ADDRESS_OF_RECORD(si);
29805 :
29806 : const void *bp08 = _4976_3b13[di];
29807 : if (bp08 != NULL) {
29808 :
29809 : Bit16u bp12 = 0;
29810 :
29811 : switch (di) {
29812 : case dbCreature:
29813 : {
29814 :
29815 : bp0c = 0x7f;
29816 : if (SUPPRESS_READER(&bp0b, &bp0c, 1, 1, 1) != 0)
29817 : return 1;
29818 :
29819 : reinterpret_cast<Creature *>(bp04)->b4 = bp0b;
29820 :
29821 : if ((_0cee_2de0(si) & 1) == 0)
29822 : break;
29823 : bp08 = db4Mask2;
29824 : break;
29825 : }
29826 : case dbContainer:
29827 : {
29828 :
29829 : bp0c = 0x03;
29830 : if (SUPPRESS_READER(&bp0c, &bp0c, 1, 1, 1) != 0)
29831 : return 1;
29832 :
29833 : reinterpret_cast<Container *>(bp04)->b4 &= 0xf9;
29834 : reinterpret_cast<Container *>(bp04)->b4 |= (bp0b & 3) << 1;
29835 :
29836 : if (IS_CONTAINER_MAP(si) == 0)
29837 : break;
29838 :
29839 : bp08 = db9Mask2;
29840 : bp12 = 1;
29841 : break;
29842 : }
29843 : case dbMissile:
29844 : {
29845 :
29846 : if (_4976_3b5b != 0) {
29847 :
29848 : bp08 = dbEMask2;
29849 : bp12 = 1;
29850 : }
29851 : break;
29852 : }
29853 : }
29854 :
29855 : if (SUPPRESS_READER(bp04, bp08, _4976_0242[di], 1, 0) != 0)
29856 : return 1;
29857 :
29858 : switch (di) {
29859 : case dbCreature:
29860 : {
29861 :
29862 : _4976_3b5b = 1;
29863 : reinterpret_cast<Creature *>(bp04)->w2 = 0xfffe;
29864 : if (READ_RECORD_CHECKCODE(
29865 : -1,
29866 : 0,
29867 : &reinterpret_cast<GenericContainerRecord *>(bp04)->w2,
29868 : (bp08 != db4Mask1) ? 1 : 0,
29869 : 1
29870 : ) != 0
29871 : ) {
29872 : return 1;
29873 : }
29874 :
29875 : _4976_3b5b = 0;
29876 : break;
29877 : }
29878 : case dbContainer:
29879 : {
29880 :
29881 : if (bp12 != 0) {
29882 : Bit16u bp14;
29883 :
29884 : if (READ_1BIT(&bp14) != 0)
29885 : return 1;
29886 :
29887 : if (bp14 != 0) {
29888 :
29889 :
29890 : ADD_INDEX_TO_POSSESSION_INDICES(si);
29891 : }
29892 :
29893 : reinterpret_cast<Container *>(bp04)->w2 = 0xfffe;
29894 : }
29895 : else {
29896 :
29897 : if (IS_CONTAINER_MONEYBOX(si) != 0) {
29898 :
29899 : tableMask[dbMiscellaneous_item] = dbAMask1;
29900 : }
29901 :
29902 : reinterpret_cast<Container *>(bp04)->w2 = 0xfffe;
29903 :
29904 : if (READ_RECORD_CHECKCODE(-1, 0, &reinterpret_cast<Container *>(bp04)->w2, 0, 1) != 0)
29905 : return 1;
29906 :
29907 : if (IS_CONTAINER_MONEYBOX(si) == 0)
29908 : break;
29909 :
29910 : tableMask[dbMiscellaneous_item] = dbAMask2;
29911 : break;
29912 : }
29913 : break;
29914 : }
29915 : case dbMissile:
29916 : {
29917 :
29918 : if (bp12 != 0) {
29919 :
29920 : ADD_INDEX_TO_POSSESSION_INDICES(si);
29921 : }
29922 : else {
29923 :
29924 : _4976_5c20[reinterpret_cast<Missile *>(bp04)->w6].w6 = si;
29925 :
29926 : reinterpret_cast<Missile *>(bp04)->w2 = 0xfffe;
29927 : _4976_3b59 = 1;
29928 :
29929 : if (READ_RECORD_CHECKCODE(-1, 0, &reinterpret_cast<Missile *>(bp04)->w2, 0, 0) != 0)
29930 : return 1;
29931 :
29932 : _4976_3b59 = 0;
29933 : }
29934 : break;
29935 : }
29936 : case dbCloud:
29937 : {
29938 :
29939 : if (READ_1BIT(&bp0e) != 0)
29940 : return 1;
29941 :
29942 : if (bp0e == 0)
29943 : break;
29944 :
29945 : Bit16u bp10 = 0x03ff;
29946 :
29947 : if (SUPPRESS_READER(&bp0e, &bp10, 2, 1, 1) != 0)
29948 : return 1;
29949 :
29950 : bp0e = bp0e;
29951 : _4976_5c20[bp0e].w8 = si;
29952 : break;
29953 : }
29954 : }
29955 : }
29956 :
29957 : if (yy == 0)
29958 : break;
29959 : }
29960 :
29961 : return 0;
29962 : }
29963 :
29964 :
29965 : Bit8u GET_TELEPORTER_DETAIL(TELE_inf *teleinf, Bit8u x_pos, Bit8u y_pos);
29966 :
29967 :
29968 : Bit16u _2066_197c()
29969 : {
29970 :
29971 : ENTER(4);
29972 :
29973 : sk5c20 *bp04 = _4976_5c20;
29974 :
29975 : for (Bit16u si = 0; si < _4976_5c1e; bp04++, si++) {
29976 :
29977 : switch (bp04->TimerType()) {
29978 : case 60:
29979 : case 61:
29980 :
29981 : if (_4976_5244 == 0) {
29982 :
29983 : return 1;
29984 : }
29985 :
29986 : bp04->w8 = 0xfffe;
29987 :
29988 : if (READ_RECORD_CHECKCODE(-1, 0, bp04->pv8_0_f(), 0, 0) != 0)
29989 :
29990 :
29991 : return 1;
29992 :
29993 : break;
29994 : }
29995 :
29996 : }
29997 :
29998 : return 0;
29999 : }
30000 :
30001 :
30002 : Bit16u _2066_062b()
30003 : {
30004 :
30005 : ENTER(12);
30006 :
30007 : Bit16u bp0a = _4976_3954;
30008 :
30009 : Bit16u *bp04 = _4976_525e;
30010 :
30011 : for (; bp0a-- != 0; ) {
30012 :
30013 : ObjectID di = *bp04; bp04++;
30014 :
30015 : GenericRecord *bp08 = GET_ADDRESS_OF_RECORD(di);
30016 :
30017 : switch (di.DBType()) {
30018 : case dbContainer:
30019 : {
30020 :
30021 : Bit16u bp0e = 0x03ff;
30022 :
30023 : Bit16u bp0c;
30024 : if (SUPPRESS_READER(&bp0c, &bp0e, 2, 1, 1) != 0)
30025 :
30026 :
30027 : return 1;
30028 :
30029 : Bit16u si = bp0c;
30030 : bp08->castToContainer()->SetContainedObject(ObjectID(0, dbCreature, si));
30031 :
30032 : break;
30033 : }
30034 : case dbMissile:
30035 : {
30036 :
30037 : Bit16u bp0e = 0x03ff;
30038 :
30039 : Bit16u bp0c;
30040 : if (SUPPRESS_READER(&bp0c, &bp0e, 2, 1, 1) != 0)
30041 :
30042 :
30043 : return 1;
30044 :
30045 : Bit16u si = bp0c;
30046 : bp08->castToMissile()->SetMissileObject(ObjectID(0, dbContainer));
30047 : }
30048 : }
30049 :
30050 : }
30051 :
30052 : return 0;
30053 : }
30054 :
30055 :
30056 : int _2066_19e7()
30057 : {
30058 :
30059 : for (Bit16u si=0; si < _4976_4c3c; si++) {
30060 :
30061 : ObjectID *bp08 = &_4976_53b4[si].w193[0];
30062 :
30063 : for (Bit16u di=0; di < 30; di++) {
30064 :
30065 : *bp08 = ObjectID::FFFE; bp08++;
30066 :
30067 : }
30068 :
30069 : }
30070 :
30071 : _4976_57c8.w0 = ObjectID::FFFE;
30072 : Bit16u bp18 = _4976_0c5a;
30073 :
30074 : for (Bit16u bp16=0; _4976_4d0e->nMaps > bp16; bp16++) {
30075 :
30076 : CHANGE_CURRENT_MAP_TO(bp16);
30077 :
30078 : for (Bit16u bp0e=0; bp0e < _4976_4dd2; bp0e++) {
30079 :
30080 : for (Bit16u bp10=0; bp10 < _4976_4dd4; bp10++) {
30081 :
30082 : ObjectID bp12 = GET_TILE_RECORD_LINK(bp0e, bp10);
30083 : while (bp12 != ObjectID::FFFE) {
30084 :
30085 : if (bp12.DBType() > dbActuator) {
30086 :
30087 : GET_ADDRESS_OF_RECORD(bp12)->w0 = ObjectID::FFFE;
30088 :
30089 : CUT_RECORD_FROM(bp12, NULL, bp0e, bp10);
30090 : break;
30091 : }
30092 : else {
30093 :
30094 : bp12 = GET_NEXT_RECORD_LINK(bp12);
30095 : }
30096 :
30097 : }
30098 :
30099 : }
30100 :
30101 : }
30102 :
30103 : }
30104 :
30105 : CHANGE_CURRENT_MAP_TO(bp18);
30106 :
30107 : for (Bit16u si = dbCreature; si < dbMax; si++) {
30108 :
30109 : Bit16u *bp08 = reinterpret_cast<Bit16u *>(&_4976_4cca[si]);
30110 :
30111 : Bit16u bp1a = _4976_0242[si] >> 1;
30112 : for (Bit16u di = _4976_4d0e->nRecords[si]; di-- != 0; bp08 += bp1a) {
30113 :
30114 : reinterpret_cast<GenericRecord *>(bp08)->w0 = ObjectID::FFFF;
30115 :
30116 : }
30117 :
30118 : }
30119 :
30120 : _4976_525e = (Bit16u *)ALLOC_MEMORY(200, afDefault, 1024);
30121 :
30122 : _4976_3954 = 0;
30123 :
30124 : for (Bit16u si = 0; si < _4976_4c3c; si++) {
30125 :
30126 : ObjectID *bp08 = &_4976_53b4[si].w193[0];
30127 :
30128 : for (Bit16u di = 0; di < 30; di++) {
30129 :
30130 : if (READ_RECORD_CHECKCODE(-1, 0, bp08++, 0, 0) != 0) {
30131 :
30132 :
30133 : Bit16u si = 1;
30134 :
30135 : DEALLOC_UPPER_MEMORY(200);
30136 : return si;
30137 : }
30138 :
30139 : }
30140 :
30141 : }
30142 :
30143 : if (READ_RECORD_CHECKCODE(-1, 0, &_4976_57c8.w0, 0, 0) != 0) {
30144 :
30145 :
30146 : Bit16u si = 1;
30147 :
30148 : DEALLOC_UPPER_MEMORY(200);
30149 : return si;
30150 : }
30151 :
30152 : for (Bit16u si = 0; si < _4976_4c3c; si++) {
30153 :
30154 : ObjectID *bp08 = &_4976_53b4[si].w193[0];
30155 :
30156 : for (Bit16u di = 0; di < 30; di++, bp08++) {
30157 :
30158 : if (*bp08 == ObjectID::FFFE) {
30159 :
30160 : *bp08 = ObjectID::FFFF;
30161 : }
30162 : else {
30163 :
30164 : _2c1d_03e7(si, *bp08, di, 0);
30165 : }
30166 :
30167 : }
30168 :
30169 : }
30170 :
30171 : if (_4976_57c8.w0 == ObjectID::FFFE) {
30172 :
30173 : _4976_57c8.w0 = ObjectID::FFFF;
30174 : }
30175 : else {
30176 :
30177 : _2c1d_03e7(_4976_3fc6, _4976_57c8.w0, 0xffff, 0);
30178 : }
30179 :
30180 : if (_2066_197c() != 0) {
30181 :
30182 :
30183 : Bit16u si = 1;
30184 :
30185 : DEALLOC_UPPER_MEMORY(200);
30186 : return si;
30187 : }
30188 :
30189 : bp18 = _4976_0c5a;
30190 : for (Bit16u bp16 = 0; _4976_4d0e->nMaps > bp16; bp16++) {
30191 :
30192 : CHANGE_CURRENT_MAP_TO(bp16);
30193 : Bit8u *bp04 = *_4976_4c78;
30194 : for (Bit16u bp0e = 0; bp0e < _4976_4dd2; bp0e++) {
30195 :
30196 : for (Bit16u bp10 = 0; bp10 < _4976_4dd4; bp10++) {
30197 :
30198 : Bit8u bp13 = *bp04;
30199 : Bit16u bp24 = 0;
30200 : Bit8u bp1b;
30201 : switch (bp13 >> 5) {
30202 : case ttWall:
30203 : case ttFloor:
30204 : case ttStairs:
30205 : case ttMapExit:
30206 :
30207 : bp1b = 0x00; break;
30208 : case ttPit:
30209 :
30210 : bp1b = 0x08; break;
30211 : case ttDoor:
30212 :
30213 : bp1b = 0x07; break;
30214 : case ttTeleporter:
30215 : {
30216 :
30217 : TELE_inf bp2a;
30218 : if (GET_TELEPORTER_DETAIL(&bp2a, (Bit8u)bp0e, (Bit8u)bp10) != 0) {
30219 :
30220 : bp1b = 0x00;
30221 : if (bp2a.target_z() < bp16) {
30222 :
30223 : bp24 = 1;
30224 : }
30225 : }
30226 : else {
30227 :
30228 : bp1b = 0x04;
30229 : }
30230 : break;
30231 : }
30232 : case ttTrickWall:
30233 : bp1b = 0x04; break;
30234 : }
30235 :
30236 : if (bp1b != 0) {
30237 : if (SUPPRESS_READER(bp04, &bp1b, 1, 1, 0) != 0) {
30238 :
30239 :
30240 : Bit16u si = 1;
30241 :
30242 : DEALLOC_UPPER_MEMORY(200);
30243 : return si;
30244 : }
30245 : }
30246 :
30247 : bp04++;
30248 :
30249 : if (bp24 == 0) {
30250 :
30251 : ObjectID ax = GET_TILE_RECORD_LINK(bp0e, bp10);
30252 :
30253 : while (true) {
30254 :
30255 : ObjectID bp12 = ax;
30256 :
30257 : if (bp12 == ObjectID::FFFE) {
30258 :
30259 : if (READ_RECORD_CHECKCODE(bp0e, bp10, NULL, 1, 1) != 0) {
30260 :
30261 :
30262 : Bit16u si = 1;
30263 :
30264 : DEALLOC_UPPER_MEMORY(200);
30265 : return si;
30266 : }
30267 : }
30268 : else {
30269 :
30270 : Bit16u bp22 = bp12.DBType();
30271 : const void *bp0c = tableMask[bp22];
30272 :
30273 : if (bp0c != NULL) {
30274 :
30275 : Actuator *bp08 = (Actuator *)GET_ADDRESS_OF_RECORD(bp12);
30276 : if (bp22 == dbActuator) {
30277 :
30278 : switch (bp08->ActuatorType()) {
30279 : case 0x27:
30280 : case 0x1B:
30281 : case 0x1D:
30282 : case 0x41:
30283 : case 0x2C:
30284 : case 0x32:
30285 : case 0x30:
30286 : case 0x2D:
30287 :
30288 : Bit16u bp1e;
30289 : Bit16u bp20 = 0x01FF;
30290 : if (SUPPRESS_READER(&bp1e, &bp20, 2, 1, 1) != 0) {
30291 :
30292 :
30293 : Bit16u si = 1;
30294 :
30295 : DEALLOC_UPPER_MEMORY(200);
30296 : return si;
30297 : }
30298 :
30299 : bp08->w2 &= 0x007F;
30300 : bp08->w2 |= (bp1e & 0x01FF) << 7;
30301 : break;
30302 : }
30303 : }
30304 :
30305 : if (SUPPRESS_READER(&bp08, &bp0c, _4976_0242[bp22], 1, 0) != 0) {
30306 :
30307 :
30308 : Bit16u si = 1;
30309 :
30310 : DEALLOC_UPPER_MEMORY(200);
30311 : return si;
30312 : }
30313 : }
30314 : }
30315 :
30316 : ax = GET_NEXT_RECORD_LINK(bp12);
30317 : }
30318 : }
30319 :
30320 : }
30321 :
30322 : }
30323 :
30324 : }
30325 :
30326 : CHANGE_CURRENT_MAP_TO(bp18);
30327 :
30328 : if (_2066_062b() != 0) {
30329 :
30330 :
30331 : Bit16u si = 1;
30332 :
30333 : DEALLOC_UPPER_MEMORY(200);
30334 : return si;
30335 : }
30336 :
30337 : {
30338 :
30339 : Bit16u si = 0;
30340 :
30341 : DEALLOC_UPPER_MEMORY(200);
30342 : return si;
30343 : }
30344 : }
30345 :
30346 :
30347 : __int16 GAME_LOAD()
30348 : {
30349 :
30350 : Bit16u bp04 = 0;
30351 : Bit16u si = 0;
30352 : Bit8u bp01 = 0;
30353 : Bit16u bp08;
30354 :
30355 : if (_4976_4c24 != 0) {
30356 :
30357 : _2db4:
30358 : bp04 = !_2066_03e0(0);
30359 :
30360 : if (_2066_2ca8() == 0) {
30361 :
30362 : goto _3262;
30363 : }
30364 : else {
30365 :
30366 : goto _31b8;
30367 : }
30368 : }
30369 :
30370 : bp01 = 0;
30371 : _4976_52f4 = 2;
30372 :
30373 : if (bp01 == 0) {
30374 :
30375 : if (_4976_49a0 != 0 || _4976_5eb0 == 0)
30376 : goto _2e5b;
30377 :
30378 : if (_476d_030a(2) == 1)
30379 : goto _2e5b;
30380 :
30381 : _476d_04e8(2);
30382 : }
30383 :
30384 :
30385 : while (true) {
30386 :
30387 : if (_4976_49a0 == 0) {
30388 :
30389 : if (bp01 != 0) {
30390 :
30391 : _476d_04e8(2);
30392 : }
30393 :
30394 : Bit16u di = _0aaf_0067(_0aaf_02f8(15, bp01));
30395 :
30396 : if (di == 1) {
30397 :
30398 : _2066_03e0(0);
30399 :
30400 :
30401 : di = -1;
30402 :
30403 : return di;
30404 : }
30405 : }
30406 : else {
30407 :
30408 : if (bp01 != 0) {
30409 :
30410 : _0aaf_0067(_0aaf_02f8(0, bp01));
30411 : }
30412 : }
30413 :
30414 : _2e5b:
30415 : if (_4976_49a0 == 0 && _476d_04af(1) != 1) {
30416 :
30417 :
30418 : switch (_4976_5eb8) {
30419 : case 0x0000:
30420 :
30421 : bp01 = 0x1d;
30422 : break;
30423 : case 0x0003:
30424 :
30425 : bp01 = 0x1a;
30426 : break;
30427 : case 0x0002:
30428 :
30429 : bp01 = 0x16;
30430 : break;
30431 : case 0x0004:
30432 :
30433 : bp01 = 0x17;
30434 : break;
30435 : }
30436 : }
30437 : else {
30438 :
30439 : Bit16u bp06 = _2066_32bb();
30440 :
30441 : if (bp06 < 0) {
30442 :
30443 : _4976_525c = 0;
30444 :
30445 :
30446 : Bit16u di = -1;
30447 :
30448 : return di;
30449 : }
30450 :
30451 : _4976_525c = bp06;
30452 : _4976_52e2 = bp06 + 0x30;
30453 : bp08 = 0;
30454 : si = 1;
30455 :
30456 : _4976_394e = FILE_OPEN(FORMAT_SKSTR(_4976_19d0, NULL));
30457 :
30458 : if (_4976_394e < 0) {
30459 :
30460 : _4976_394e = FILE_OPEN(FORMAT_SKSTR(_4976_19d4, NULL));
30461 :
30462 : if (_4976_394e >= 0) {
30463 :
30464 : bp08 = 1;
30465 : }
30466 : else {
30467 :
30468 : if (_4976_5bf2 == 0) {
30469 :
30470 : _4976_394e = FILE_OPEN(FORMAT_SKSTR(_4976_19c0, NULL));
30471 :
30472 : if (_4976_394e >= 0) {
30473 :
30474 : bp04 = 1;
30475 : _4976_4c24 = 1;
30476 :
30477 : goto _2db4;
30478 : }
30479 : }
30480 :
30481 : si = 0;
30482 : bp01 = 0x1c;
30483 : _4976_5eb8 = 0x0003;
30484 : }
30485 : }
30486 : }
30487 :
30488 : if (_4976_49a0 == 0 && _4976_5eb8 != 1) {
30489 :
30490 : continue;
30491 : }
30492 :
30493 : break;
30494 : }
30495 :
30496 : _4976_5bf6 = 0;
30497 : _4976_4c3c = 0;
30498 : _4976_57c8.w0 = 0xffff;
30499 :
30500 : sksave_header bp6a;
30501 : FILE_READ(_4976_394e, 42, &bp6a);
30502 :
30503 : _4976_5244 = bp6a.bp4c;
30504 :
30505 : _4976_524a = 0x0000002A;
30506 :
30507 : _4976_4c24 = !_4976_5bf2;
30508 :
30509 : do {
30510 : if (READ_DUNGEON_STRUCTURE(0) == 0)
30511 : break;
30512 :
30513 : _4976_4c24 = 0;
30514 :
30515 : _2066_0002();
30516 :
30517 : skload_table_60 t1;
30518 : if (SUPPRESS_READER(&t1, _4976_395a, 56, 1, 1) != 0)
30519 : break;
30520 :
30521 : _4976_4bec = _4976_4c1a = t1.bp40;
30522 : _4976_49ba = t1.bp3c;
30523 : _4976_4c3c = t1.bp38;
30524 : _4976_4bfa = t1.bp36;
30525 : _4976_4c06 = t1.bp34;
30526 : _4976_4bf6 = t1.bp32;
30527 : _4976_4bf4 = t1.bp30;
30528 : _4976_3fc6 = t1.bp2e;
30529 : _4976_5c1e = t1.bp2c;
30530 : _4976_0090 = t1.bp2a;
30531 : _4976_4b80 = t1.bp26;
30532 : _4976_4c00 = t1.bp22;
30533 : _4976_4c14 = t1.bp20;
30534 : _4976_4c0c = t1.bp1e;
30535 : _4976_5c5d = (Bit8u)t1.bp18;
30536 : _4976_5c63 = t1.bp16;
30537 : _4976_5c6a = t1.bp15;
30538 : _4976_5c5e = t1.bp14;
30539 : _4976_5c60 = t1.bp13;
30540 : _4976_5c61 = t1.bp12;
30541 : _4976_5c64 = t1.bp11;
30542 : _4976_5c66 = t1.bp10;
30543 : _4976_5c5f = t1.bp0e;
30544 : _4976_5c62 = t1.bp0d;
30545 : _4976_5c6e = t1.bp0c;
30546 :
30547 : if (SUPPRESS_READER(_4976_5f52, _4976_3956, 1, 8, 1) != 0)
30548 : break;
30549 :
30550 : if (SUPPRESS_READER(_4976_5f12, _4976_3956, 1, 64, 1) != 0)
30551 : break;
30552 :
30553 : if (SUPPRESS_READER(_4976_5f5a, _4976_3956, 2, 64, 1) != 0)
30554 : break;
30555 :
30556 : if (SUPPRESS_READER(_4976_53b4, _4976_3992, 261, _4976_4c3c, 1) != 0)
30557 : break;
30558 :
30559 : if (SUPPRESS_READER(&_4976_57e4, _4976_3a97, 6, 1, 1) != 0)
30560 : break;
30561 :
30562 : if (SUPPRESS_READER(_4976_5c20, _4976_3a9d, 10, _4976_5c1e, 1) != 0)
30563 : break;
30564 :
30565 : Bit16u bp06 = _4976_5c1e;
30566 :
30567 : while (bp06 < _4976_5c16) {
30568 :
30569 : _4976_5c20[bp06].TimerType(0x00);
30570 :
30571 : bp06++;
30572 :
30573 : }
30574 :
30575 : _3a15_008e();
30576 :
30577 : if (_2066_19e7() != 0)
30578 : break;
30579 :
30580 : _2066_2b6c();
30581 : _3a15_020f();
30582 : _4976_5bf2 = 1;
30583 :
30584 : _31b8:
30585 : FILE_CLOSE(_4976_394e);
30586 :
30587 : si = 0;
30588 : _3a15_3511();
30589 :
30590 : _4976_5ca8 = 0;
30591 :
30592 : if (_4976_4c24 != 0) {
30593 :
30594 : if (bp04 != 0) {
30595 :
30596 : WAIT_SCREEN_REFRESH();
30597 : }
30598 :
30599 :
30600 :
30601 : _2066_03e0(0);
30602 : }
30603 : else {
30604 :
30605 : _4976_5bf6 = 1;
30606 :
30607 : if (bp08 != 0) {
30608 :
30609 : FILE_RENAME(FORMAT_SKSTR(_4976_19d4, NULL), FORMAT_SKSTR(_4976_19d0, NULL));
30610 : }
30611 :
30612 : _2066_03e0(1);
30613 : }
30614 :
30615 : _0aaf_02f8(0x000E, 0x0000);
30616 :
30617 : _4976_4bd8 = 0x0001;
30618 : _4976_4c2a = 0x0000;
30619 :
30620 : _2fcf_0b8b(_4976_4bfa, _4976_4c06, _4976_4bf4);
30621 :
30622 : _4976_4cb8 = 0x0001;
30623 :
30624 : Bit16u di = 1;
30625 :
30626 : return di;
30627 : } while (false);
30628 : _3262:
30629 :
30630 : if (si != 0) {
30631 :
30632 : si = 0;
30633 : FILE_CLOSE(_4976_394e);
30634 : }
30635 :
30636 : _0aaf_0067(_0aaf_02f8((_4976_5bf2 == 0) ? 0 : ((_4976_5c9c != 0) ? ((_4976_5ca8 != 0) ? 0x13 : 0x14) : (0x07)), 0x001F));
30637 :
30638 : if (_4976_5bf2 == 0) {
30639 :
30640 : SK_PREPARE_EXIT();
30641 : }
30642 :
30643 : Bit16u di = -1;
30644 :
30645 : return di;
30646 : }
30647 :
30648 :
30649 : int GET_OBJECT_INDEX_FROM_TILE(int x_pos, int y_pos);
30650 :
30651 :
30652 : void CUT_RECORD_FROM(Bit16u recordLink, ObjectID *recordLinkLookFor, __int16 xposLookFor, __int16 yposLookFor)
30653 : {
30654 :
30655 :
30656 :
30657 :
30658 :
30659 : Bit16u si = recordLink;
30660 :
30661 : if (si == 0xfffe || si == 0xffff)
30662 : return;
30663 :
30664 : GenericRecord *bp08 = (GenericRecord *)GET_ADDRESS_OF_RECORD(si & 0x3fff);
30665 :
30666 : ObjectID *bp0c;
30667 : if (xposLookFor >= 0) {
30668 :
30669 : Bit16u bp0e = GET_OBJECT_INDEX_FROM_TILE(xposLookFor, yposLookFor);
30670 : Bit16u *bp04 = &_4976_4d16[bp0e];
30671 :
30672 : if (bp08->w0 == 0xfffe && (*bp04 & 0x3fff) == si) {
30673 :
30674 : _4976_4c78[xposLookFor][yposLookFor] &= 0xef;
30675 :
30676 : Bit16u di = _4976_4d0e->cwListSize -1;
30677 : COPY_MEMORY(
30678 : bp04 +1,
30679 : bp04,
30680 : (di -bp0e) << 1
30681 : );
30682 :
30683 : _4976_4d16[di] = 0xffff;
30684 :
30685 : bp04 = &_4976_4c52[xposLookFor +1];
30686 :
30687 : di = _4976_4cb4 - _4976_4dd6[_4976_0c5a] + xposLookFor;
30688 :
30689 : while (di-- != 0) {
30690 :
30691 : (*bp04)--;
30692 : bp04++;
30693 : }
30694 : }
30695 :
30696 : if ((*bp04 & 0x3fff) == si) {
30697 :
30698 : Bit16u ax = bp08->w0;
30699 :
30700 :
30701 : *bp04 = ax;
30702 : bp08->w0 = 0xfffe;
30703 : return;
30704 : }
30705 :
30706 :
30707 : bp0c = reinterpret_cast<ObjectID *>(bp04);
30708 : }
30709 : else {
30710 :
30711 :
30712 : bp0c = recordLinkLookFor;
30713 : }
30714 :
30715 : while (*bp0c != bp0c->FFFE && bp0c->GetAsNorth() != si) {
30716 : bp0c = &GET_ADDRESS_OF_RECORD(*bp0c)->w0;
30717 : }
30718 :
30719 : if (*bp0c != bp0c->FFFE) {
30720 :
30721 : *bp0c = GET_NEXT_RECORD_LINK(*bp0c);
30722 : }
30723 :
30724 : bp08->w0 = 0xfffe;
30725 : }
30726 :
30727 :
30728 : Bit8u QUERY_CLS2_OF_TEXT_RECORD(ObjectID recordLink)
30729 : {
30730 :
30731 : Text *bp04 = GET_ADDRESS_OF_RECORD2(recordLink);
30732 : if (bp04->TextMode() == 1) {
30733 :
30734 : Bit16u si = bp04->SimpleTextExtUsage();
30735 :
30736 : switch (si) {
30737 : case 0x0000:
30738 : case 0x0002:
30739 : case 0x0005:
30740 : case 0x000D:
30741 :
30742 : return Bit8u(bp04->OrnateIndex());
30743 : }
30744 : }
30745 :
30746 : return -1;
30747 : }
30748 :
30749 :
30750 : Bit8u QUERY_CLS2_FROM_RECORD(ObjectID recordLink)
30751 : {
30752 :
30753 : if (recordLink != ObjectID::FFFF) {
30754 :
30755 : GenericRecord *bp04;
30756 : if (recordLink < ObjectID::FF80) {
30757 :
30758 : bp04 = GET_ADDRESS_OF_RECORD(recordLink);
30759 : }
30760 : else {
30761 :
30762 : return ((Bit8u)recordLink.w) - 0x80;
30763 : }
30764 :
30765 : switch (recordLink.DBType()) {
30766 : case dbText:
30767 :
30768 : return QUERY_CLS2_OF_TEXT_RECORD(recordLink);
30769 : case dbActuator:
30770 :
30771 : return GET_WALL_DECORATION_OF_ACTUATOR(GET_ADDRESS_OF_RECORD3(recordLink));
30772 : case dbCreature:
30773 :
30774 : return bp04->castToCreature()->CreatureType();
30775 : case dbWeapon:
30776 :
30777 : return bp04->castToWeapon()->ItemType();
30778 : case dbCloth:
30779 :
30780 : return bp04->castToCloth()->ItemType();
30781 : case dbScroll:
30782 :
30783 : return 0;
30784 : case dbPotion:
30785 :
30786 : return bp04->castToPotion()->PotionType();
30787 : case dbContainer:
30788 :
30789 : return 0
30790 : | (((reinterpret_cast<Container *>(bp04)->b4 >> 1) & 0x0003) << 3)
30791 : | ((reinterpret_cast<Container *>(bp04)->b5 >> 5) & 0x0007)
30792 : ;
30793 : case dbMiscellaneous_item:
30794 :
30795 : return bp04->castToMisc()->ItemType();
30796 : case db11:
30797 : case db12:
30798 : case db13:
30799 : break;
30800 : case dbMissile:
30801 :
30802 : return (Bit8u)QUERY_CLS2_FROM_RECORD(bp04->castToMissile()->GetMissileObject());
30803 : case dbCloud:
30804 :
30805 : return bp04->castToCloud()->CloudType();
30806 : }
30807 : }
30808 :
30809 : return -1;
30810 : }
30811 :
30812 :
30813 :
30814 : Bit16u GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(Bit16u actuatorData)
30815 : {
30816 :
30817 :
30818 : Bit16u si = actuatorData & 0x01ff;
30819 :
30820 : switch (si >> 7) {
30821 : case 0:
30822 :
30823 : return dbWeapon;
30824 : case 1:
30825 :
30826 : return dbCloth;
30827 : case 2:
30828 :
30829 : return dbMiscellaneous_item;
30830 : case 3:
30831 :
30832 : if (si > 0x01fc)
30833 : break;
30834 :
30835 : if (si == 0x01fc) {
30836 :
30837 : return dbScroll;
30838 : }
30839 :
30840 : if (si >= 0x01e0) {
30841 :
30842 : return dbContainer;
30843 : }
30844 :
30845 : if (si >= 0x01b0) {
30846 :
30847 : return dbCreature;
30848 : }
30849 :
30850 : return dbPotion;
30851 : }
30852 :
30853 : return 0xffff;
30854 : }
30855 :
30856 :
30857 : Bit8u GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(Bit16u actuatorData)
30858 : {
30859 :
30860 :
30861 :
30862 :
30863 : Bit16u dx = (actuatorData & 0x01ff);
30864 : switch (dx >> 7) {
30865 : case 1:
30866 :
30867 : dx -= 0x0080;
30868 : break;
30869 : case 2:
30870 :
30871 : dx -= 0x0100;
30872 : break;
30873 : case 3:
30874 :
30875 : if (dx >= 0x01fc) {
30876 :
30877 : dx = 0;
30878 : break;
30879 : }
30880 :
30881 : if (dx >= 0x01e0) {
30882 :
30883 : dx -= 0x01e0;
30884 : break;
30885 : }
30886 :
30887 : if (dx >= 0x01b0) {
30888 :
30889 : dx -= 0x01b0;
30890 : break;
30891 : }
30892 :
30893 : dx -= 0x0180;
30894 : }
30895 :
30896 : return (Bit8u)dx;
30897 : }
30898 :
30899 :
30900 : Bit16u _0cee_2de0(ObjectID recordLink);
30901 :
30902 : sk03a2 *QUERY_CREATURE_AI_SPEC_FROM_RECORD(ObjectID recordLink);
30903 :
30904 :
30905 : Bit8u QUERY_CLS1_FROM_RECORD(ObjectID recordLink)
30906 : {
30907 :
30908 : ObjectID di = recordLink;
30909 :
30910 : if (di != di.FFFF) {
30911 :
30912 : Bit16u si = di.DBType();
30913 : if (si == dbMissile) {
30914 :
30915 : return QUERY_CLS1_FROM_RECORD(GET_ADDRESS_OF_RECORDE(di)->GetMissileObject());
30916 : }
30917 :
30918 : return _4976_0caa[si];
30919 : }
30920 :
30921 : return 0xff;
30922 : }
30923 :
30924 :
30925 : Bit8u *_3e74_0756(Bit8u *xx, __int32 size);
30926 : Bit16u _2fcf_0cdf(Bit16u recordLink, __int16 xpos, __int16 ypos, __int16 *xx, __int16 *yy);
30927 : Bit16u _2c1d_201d();
30928 : void _2fcf_01c5(Bit16u recordLink, __int16 xx, __int16 yy, Bit16u curmap, Bit16u ss);
30929 : void _2c1d_1c0c(Bit16u xx, Bit16u yy, Bit16u zz);
30930 : void _2c1d_1b0f(__int16 xx, Bit16u yy);
30931 : Bit16u _0cee_06dc(__int16 xx, __int16 yy);
30932 :
30933 : void _13e4_0401(Bit16u recordLink, __int16 xx, __int16 yy, Bit16u ss, Bit16u tt, Bit16u uu);
30934 : void _1c9a_0e14(Bit16u recordLink, __int16 xpos, __int16 ypos);
30935 : Bit16u _075f_084d(__int16 x1, __int16 y1, __int16 x2, __int16 y2, Bit16u ps, ObjectID recordLink);
30936 : void _075f_2205(__int16 xpos, __int16 ypos, Bit16u xx, U16 yy, U16 zz);
30937 : Bit16u _2c1d_18aa(__int16 xx, Bit16u yy, Bit16u ss, Bit16u tt);
30938 : void _075f_0255(ObjectID recordLink, Bit16u ww, __int16 xx, __int16 yy, Bit16u ss);
30939 : void _12b4_0d75(__int16 xpos, __int16 ypos, Bit16u xx, __int16 yy);
30940 : Bit16u _32cb_0054(Creature *ref, Bit16u xx);
30941 : void _098d_000f(__int16 xx, __int16 yy, Bit16u ww, Bit16u *x2, Bit16u *y2);
30942 : void _29ee_000f();
30943 : Bit16u _2fcf_0109(ObjectID recordLink);
30944 : void _2676_0131();
30945 : void _32cb_5d0d(Bit16u dir, __int16 xx, __int16 yy);
30946 : void _2c1d_1c7c(Bit16u xx, Bit16u yy);
30947 : Bit16u _2c1d_203d(Bit16u xx);
30948 : Bit16u _2c1d_0ffc(sk53b4 *xx);
30949 : void _482b_05bf(Bit16u xx);
30950 : void _1c9a_0247(ObjectID recordLink);
30951 :
30952 :
30953 : void _0cee_159b(U8 *str, ObjectID rl, Bit16u ww)
30954 : {
30955 :
30956 : ENTER(154);
30957 :
30958 : U16 si = 0;
30959 :
30960 : U8 bp009a[128];
30961 : U8 *bp04 = bp009a;
30962 :
30963 : U8 bp19 = 0xff;
30964 :
30965 : Text *bp10;
30966 : if (rl.DBType() == dbScroll) {
30967 :
30968 : Scroll *_bp10 = GET_ADDRESS_OF_RECORD7(rl);
30969 :
30970 : U16 bp14 = _bp10->w2_a_f();
30971 :
30972 : if (bp14 != 0) {
30973 :
30974 : bp19 = U8(bp14);
30975 :
30976 : goto _1678;
30977 : }
30978 :
30979 : bp10 = &reinterpret_cast<Text *>(static_cast<U8 *>(_4976_4cca[dbText]))[_bp10->ReferredText() & 0x03ff];
30980 : }
30981 : else {
30982 :
30983 : bp10 = GET_ADDRESS_OF_RECORD2(rl);
30984 : }
30985 :
30986 :
30987 : U16 bp18 = bp10->TextMode();
30988 :
30989 : if (bp18 == 0 || (bp18 == 1 && bp10->SimpleTextExtUsage() == 14)) {
30990 :
30991 : if (bp10->TextVisibility() != 0 || (ww & 0x8000) != 0) {
30992 :
30993 : if (bp18 == 1) {
30994 :
30995 : bp19 = bp10->TextIndex() & 0xff;
30996 : }
30997 :
30998 : _1678:
30999 : ww = ww & 0x7fff;
31000 :
31001 : U8 bp15;
31002 : if (ww == 1) {
31003 :
31004 : *(bp04++) = vbLf;
31005 :
31006 : bp15 = ' ';
31007 : }
31008 :
31009 : bp15 = vbLf;
31010 :
31011 : if (bp19 != 0xff) {
31012 :
31013 : bp04 += SK_STRLEN(QUERY_GDAT_TEXT(0x03, 0x00, bp19, bp04));
31014 : }
31015 : else {
31016 :
31017 : U16 bp14 = 0;
31018 :
31019 : U16 di = 0;
31020 :
31021 : U16 *bp0c = &_4976_4d12[bp10->TextIndex()];
31022 :
31023 : while (true) {
31024 :
31025 : U16 bp12;
31026 : if (bp14 == 0) {
31027 :
31028 : si = *(bp0c++);
31029 :
31030 : bp12 = (si >> 10) & 0x1f;
31031 : }
31032 :
31033 : else if (bp14 == 1) {
31034 :
31035 : bp12 = (si >> 5) & 0x1f;
31036 : }
31037 : else {
31038 :
31039 : bp12 = si & 0x1f;
31040 : }
31041 :
31042 :
31043 : bp14 = ++bp14 % 3;
31044 :
31045 : if (di != 0) {
31046 :
31047 : *bp04 = 0;
31048 :
31049 : const U8 *bp08;
31050 : if (di == 30) {
31051 :
31052 : bp08 = _4976_0262[bp12];
31053 : }
31054 : else {
31055 :
31056 : bp08 = _4976_0362[bp12];
31057 : }
31058 :
31059 :
31060 : SK_STRCAT(bp04, bp08);
31061 :
31062 : bp04 += SK_STRLEN(bp08);
31063 :
31064 : di = 0;
31065 :
31066 : continue;
31067 : }
31068 :
31069 : if (bp12 < 0x1c) {
31070 :
31071 : if (bp12 == 0x1a) {
31072 :
31073 : bp12 = 0x20;
31074 :
31075 :
31076 : *(bp04++) = U8(bp12);
31077 :
31078 : continue;
31079 : }
31080 :
31081 : else if (bp12 == 0x1b) {
31082 :
31083 : bp12 = 0x2e;
31084 :
31085 :
31086 : *(bp04++) = U8(bp12);
31087 :
31088 : continue;
31089 : }
31090 : else {
31091 :
31092 : bp12 += 0x41;
31093 :
31094 : *(bp04++) = U8(bp12);
31095 :
31096 : continue;
31097 : }
31098 : }
31099 :
31100 : else if (bp12 == 0x1c) {
31101 :
31102 : *(bp04++) = bp15;
31103 :
31104 : continue;
31105 : }
31106 :
31107 : else if (bp12 <= 0x1e) {
31108 :
31109 : di = bp12;
31110 :
31111 : continue;
31112 : }
31113 : else {
31114 :
31115 : break;
31116 : }
31117 : }
31118 : }
31119 : }
31120 : }
31121 :
31122 : *bp04 = 0;
31123 :
31124 : FORMAT_SKSTR(bp009a, str);
31125 :
31126 : return;
31127 : }
31128 :
31129 :
31130 : Bit16u _0cee_3202(ObjectID rl)
31131 : {
31132 :
31133 : ENTER(2);
31134 :
31135 : U8 bp01 = QUERY_CLS2_FROM_RECORD(rl);
31136 :
31137 : if (bp01 == 0xff)
31138 :
31139 : return 0;
31140 :
31141 : return QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp01, dtWordValue, 0x0c);
31142 : }
31143 :
31144 : Bit16u _2fcf_16ff(Bit16u xx);
31145 : Bit16u _3a15_0447(Bit16u xx);
31146 : void _01b0_1997(void *ref, Bit16u xx, Bit16u yy, Bit16u zz);
31147 : void _01b0_1a6d(void *ref, Bit16u xx, Bit16u yy, Bit16u zz, Bit16u ss, Bit16u tt);
31148 : void _01b0_1ba1(void *ref, Bit16u xx, Bit16u yy, Bit16u zz);
31149 : Bit16u _47eb_02e0(sk5efe *xx, sk5efe *yy);
31150 : Bit8u *_47eb_0048(sk5f0a *xx, Bit16u yy);
31151 : i16 _19f0_2165(X16 aa, i16 xx, i16 yy, i16 ss, i16 tt, i16 vv, i16 ww);
31152 :
31153 :
31154 : ObjectID *OVERSEE_RECORD(ObjectID *ref, Bit8u dir, ObjectID **recordMatched, U16 (sksave_converter::*pfnFinder)(ObjectID *ref, void *pvUser), Bit16u *pvUser, Bit16u alsoCreaturePossessions, Bit16u alsoContainedObjects)
31155 : {
31156 :
31157 : ENTER(8);
31158 :
31159 : U16 di = alsoCreaturePossessions;
31160 : U16 si = alsoContainedObjects;
31161 :
31162 : for (ObjectID *bp08 = ref; *ref != ObjectID::FFFE && *ref != ObjectID::FFFF; ref = &GET_ADDRESS_OF_RECORD(*ref)->w0) {
31163 :
31164 : if (dir != 0xff) {
31165 :
31166 : if (ref->Dir() != dir)
31167 :
31168 : continue;
31169 : }
31170 :
31171 : if (ref->DBType() == dbCreature && di != 0) {
31172 :
31173 : ObjectID *bp04 = &GET_ADDRESS_OF_RECORD4(*ref)->w2;
31174 :
31175 : bp04 = OVERSEE_RECORD(bp04, 255, recordMatched, pfnFinder, pvUser, di, si);
31176 :
31177 : if (bp04 != NULL) {
31178 :
31179 : return bp04;
31180 : }
31181 : }
31182 :
31183 : if (si != 0 && IS_CONTAINER_CHEST(*ref) != 0) {
31184 :
31185 : ObjectID *bp04 = &GET_ADDRESS_OF_RECORD(*ref)->w0;
31186 :
31187 : bp04 = &bp04[1];
31188 :
31189 : bp04 = OVERSEE_RECORD(bp04, 255, recordMatched, pfnFinder, pvUser, di, si);
31190 :
31191 : if (bp04 != NULL) {
31192 :
31193 :
31194 : return bp04;
31195 : }
31196 : }
31197 :
31198 : if ((this->*pfnFinder)(ref, pvUser) != 0) {
31199 :
31200 : *recordMatched = bp08;
31201 :
31202 : return ref;
31203 : }
31204 :
31205 : }
31206 :
31207 : return NULL;
31208 : }
31209 :
31210 :
31211 : int _3a15_0381(sk5c20 *xx, sk5c20 *yy)
31212 : {
31213 :
31214 : if (xx->GetTick() >= yy->GetTick()) {
31215 :
31216 : Bit16u si = (xx->GetTick() == yy->GetTick()) ? 1 : 0;
31217 :
31218 : if (si != 0 && (xx->TimerType() > yy->TimerType()))
31219 :
31220 : return 1;
31221 :
31222 : if (si != 0) {
31223 :
31224 : si = (xx->TimerType() == yy->TimerType()) ? 1 : 0;
31225 :
31226 : if (si != 0) {
31227 :
31228 : if (xx->b5 > yy->b5) {
31229 :
31230 : return 1;
31231 : }
31232 : }
31233 : }
31234 :
31235 : if (si == 0)
31236 :
31237 : return 0;
31238 :
31239 : if ((Bit16u)xx <= (Bit16u)yy)
31240 :
31241 : return 1;
31242 :
31243 : return 0;
31244 : }
31245 :
31246 : return 1;
31247 : }
31248 :
31249 :
31250 : void _3a15_0486(Bit16u xx)
31251 : {
31252 :
31253 :
31254 : Bit16u di = xx;
31255 : _4976_4762 = -1;
31256 : Bit16u bp06 = _4976_5c1e -1;
31257 :
31258 : if (bp06 == 0)
31259 :
31260 : return;
31261 :
31262 : Bit16u bp0a = _4976_5c1a[di];
31263 :
31264 : sk5c20 *bp04 = &_4976_5c20[bp0a];
31265 :
31266 : Bit16u bp08 = 0;
31267 :
31268 : for (; di > 0; ) {
31269 :
31270 : Bit16u si = (di -1) >> 1;
31271 :
31272 : if (_3a15_0381(bp04, &_4976_5c20[_4976_5c1a[si]]) == 0)
31273 :
31274 : break;
31275 :
31276 : _4976_5c1a[di] = _4976_5c1a[si];
31277 :
31278 : di = si;
31279 :
31280 : bp08 = 1;
31281 :
31282 : }
31283 :
31284 : if (bp08 == 0) {
31285 :
31286 : bp06 = (bp06 -1) >> 1;
31287 :
31288 : while (di <= bp06) {
31289 :
31290 : Bit16u si = (di << 1) +1;
31291 :
31292 : if ((si +1) < _4976_5c1e) {
31293 :
31294 : if (_3a15_0381(&_4976_5c20[_4976_5c1a[si +1]], &_4976_5c20[_4976_5c1a[si]]) != 0) {
31295 :
31296 : si++;
31297 : }
31298 : }
31299 :
31300 : if (_3a15_0381(&_4976_5c20[_4976_5c1a[si]], bp04) == 0)
31301 :
31302 : break;
31303 :
31304 : _4976_5c1a[di] = _4976_5c1a[si];
31305 :
31306 : di = si;
31307 :
31308 : }
31309 : }
31310 :
31311 : _4976_5c1a[di] = bp0a;
31312 :
31313 : return;
31314 : }
31315 :
31316 :
31317 : Bit16u QUEUE_TIMER(sk5c20 *ref)
31318 : {
31319 :
31320 : if (ref->TimerType() == 0) {
31321 :
31322 : return 0xffff;
31323 : }
31324 :
31325 : if (_4976_5c1e == _4976_5c16) {
31326 :
31327 : RAISE_SYSERR(45);
31328 : }
31329 :
31330 : Bit16u si = _4976_5c18;
31331 :
31332 : _4976_5c18 = _4976_5c20[si].w0_0_f();
31333 :
31334 : _4976_5c20[si] = *ref;
31335 :
31336 : if (_4976_5c14 <= si) {
31337 :
31338 : _4976_5c14 = si +1;
31339 : }
31340 :
31341 : __int16 di = _4976_4762;
31342 :
31343 : if (di < 0) {
31344 :
31345 : di = _4976_5c1e;
31346 : }
31347 :
31348 : _4976_4762 = -1;
31349 : _4976_5c1e++;
31350 :
31351 : _4976_5c1a[di] = si;
31352 :
31353 : _3a15_0486(di);
31354 :
31355 : return si;
31356 : }
31357 :
31358 :
31359 : void _01b0_1c8d(Bit16u xx)
31360 : {
31361 :
31362 :
31363 : if (_01b0_13d6 == 0) {
31364 :
31365 : switch (_04bf_028a) {
31366 : case 3:
31367 :
31368 : _01b0_13ce = 0x16b6;
31369 :
31370 : break;
31371 : case 5:
31372 :
31373 : _01b0_13ce = 0x1779;
31374 :
31375 : break;
31376 : case 6:
31377 :
31378 : _01b0_13ce = 0x170e;
31379 :
31380 : break;
31381 : }
31382 :
31383 : Bit16u bp02 = 0x001234dc / _04bf_17a6;
31384 :
31385 : _01b0_13c8 = bp02;
31386 : }
31387 :
31388 : if (xx > _01b0_13d6)
31389 :
31390 : _01b0_13d6 = xx;
31391 :
31392 : return;
31393 : }
31394 :
31395 :
31396 : Bit16u IBMIO_SBLASTER_BLEND_TO_SNDBUFF(Bit8u *buff, Bit16u buffSize, __int8 volume, Bit16u caller)
31397 : {
31398 :
31399 :
31400 : Bit16u bp02 = 0;
31401 :
31402 : if (_04bf_028c != 0 && _04bf_0288 != 0) {
31403 :
31404 : if (Bit32u(_04bf_17a6 * buffSize) / caller <= _04bf_028e) {
31405 :
31406 : volume >>= 1;
31407 :
31408 : Bit8u *di = _01b0_13d2;
31409 : Bit16u bx = _01b0_14dd;
31410 : Bit16u dx = _01b0_14df;
31411 : Bit8u *si = buff;
31412 :
31413 : Bit16u bp06;
31414 : if (_01b0_4896 != caller) {
31415 :
31416 : Bit16u bp04 = buffSize;
31417 : bp06 = 0;
31418 :
31419 : if (_01b0_4896 > caller) {
31420 :
31421 : ATLASSERT(false);
31422 : }
31423 : else {
31424 :
31425 : ATLASSERT(false);
31426 : }
31427 : }
31428 : else {
31429 :
31430 : Bit16u cx = buffSize;
31431 :
31432 : bp06 = cx;
31433 :
31434 : do {
31435 :
31436 : __int16 val = __int16(__int8(di[bx])) + (((__int16(*(si++)) * __int16(volume)) << 1) >> 8);
31437 :
31438 : if (val < -128)
31439 : val = -128;
31440 : if (val > 127)
31441 : val = 127;
31442 :
31443 : di[bx] = (Bit8u)val;
31444 :
31445 :
31446 : bx++;
31447 :
31448 : if (bx >= dx) {
31449 : bx = 0;
31450 : }
31451 :
31452 : } while (--cx != 0);
31453 : }
31454 :
31455 :
31456 : _01b0_1c8d(bp06);
31457 :
31458 : bp02 = 1;
31459 : }
31460 : }
31461 :
31462 : return bp02;
31463 : }
31464 :
31465 :
31466 : Bit16u IBMIO_BLEND_TO_SNDBUFF(Bit8u *buff, Bit16u buffSize, Bit8u volume, Bit16u caller)
31467 : {
31468 :
31469 :
31470 :
31471 :
31472 : Bit8u di = volume;
31473 : Bit16u si = caller;
31474 :
31475 : LOADDS(0x3083);
31476 :
31477 : Bit16u bp02 = 0;
31478 :
31479 : if (_04bf_028c != 0) {
31480 :
31481 : if (_04bf_028a == 3 || _04bf_028a == 5 || _04bf_028a == 6) {
31482 :
31483 : bp02 = IBMIO_SBLASTER_BLEND_TO_SNDBUFF(buff, buffSize, di, si);
31484 : }
31485 : }
31486 : else {
31487 :
31488 : switch (_04bf_028a -2) {
31489 : case 2:
31490 :
31491 : _01b0_1997(buff, buffSize, di, si);
31492 :
31493 : break;
31494 : case 3:
31495 :
31496 : _01b0_1a6d(buff, buffSize, di, si, 3, 0);
31497 :
31498 : break;
31499 : case 4:
31500 :
31501 : _01b0_1ba1(buff, buffSize, di, si);
31502 :
31503 : break;
31504 : case 5:
31505 :
31506 : _01b0_1a6d(buff, buffSize, di, si, 5, 1);
31507 :
31508 : break;
31509 : case 6:
31510 :
31511 : _01b0_1a6d(buff, buffSize, di, si, 6, 0);
31512 :
31513 : break;
31514 : case 7:
31515 :
31516 : _01b0_1a6d(buff, buffSize, di, si, 7, 1);
31517 :
31518 : break;
31519 : }
31520 : }
31521 :
31522 : return bp02;
31523 : }
31524 :
31525 :
31526 : void _47eb_0333(sk5efe *ref)
31527 : {
31528 :
31529 :
31530 : Bit16u bp08 = 0;
31531 :
31532 : __int16 si = ref->b6;
31533 : __int16 di = ref->b7;
31534 :
31535 : __int8 *bp04 = &ref->b6;
31536 :
31537 : bp04[0] = (__int8)(((ref->b5 << 8) / (si * si + di * di + 8)) >> 8);
31538 :
31539 : Bit8u cl;
31540 : if (si == 0) {
31541 :
31542 : cl = 8;
31543 : }
31544 :
31545 : else if (di == 0) {
31546 :
31547 : if (si < 0) {
31548 :
31549 : cl = 15;
31550 : }
31551 : else {
31552 :
31553 : cl = 1;
31554 : }
31555 : }
31556 : else {
31557 :
31558 : if (si < 0) {
31559 :
31560 : si = -si;
31561 : bp08 = 1;
31562 : }
31563 :
31564 : if (di < 0) {
31565 :
31566 : di = -di;
31567 : }
31568 :
31569 : Bit16u bp06 = (si << 11) / di;
31570 : cl = 0;
31571 :
31572 :
31573 : while (_4976_49c0[cl++] > bp06);
31574 : }
31575 :
31576 :
31577 : if (bp08 != 0) {
31578 :
31579 : bp04[1] = 16 - cl;
31580 : bp04[2] = cl;
31581 : }
31582 : else {
31583 :
31584 : bp04[1] = cl;
31585 : bp04[2] = 16 - cl;
31586 : }
31587 :
31588 :
31589 : return;
31590 : }
31591 :
31592 :
31593 : Bit16u _47eb_014f(Bit16u xx, sk5efe *ref)
31594 : {
31595 :
31596 :
31597 : if (xx == 0)
31598 :
31599 : return 0;
31600 :
31601 : Bit16u bp02 = 0;
31602 : sk5efe *bp06 = ref;
31603 :
31604 : for (; bp02 < xx; bp02++, bp06++) {
31605 :
31606 : _47eb_0333(bp06);
31607 :
31608 : bp06->b11 = (Bit8u)bp02;
31609 :
31610 : }
31611 :
31612 : Bit16u bp10 = 0;
31613 : do {
31614 :
31615 : bp06 = ref;
31616 :
31617 : Bit16u bp0c = bp06->b11;
31618 :
31619 : for (bp06++, bp02++; bp02 < xx; bp02++, bp06++) {
31620 :
31621 : Bit16u bp0e = bp06->b11;
31622 :
31623 : if (_47eb_02e0(&ref[bp0c], &ref[bp0e]) == 0) {
31624 :
31625 : WRITE_UI8(bp06,-1,(Bit8u)bp0e);
31626 :
31627 : bp06->b11 = (Bit8u)bp0c;
31628 :
31629 : bp10 = 1;
31630 : }
31631 : else {
31632 :
31633 : bp0c = bp0e;
31634 : }
31635 :
31636 : }
31637 :
31638 : } while (bp10 != 0);
31639 :
31640 : for (Bit16u si=0, di=0; di < _4976_49be; ) {
31641 :
31642 : if (si >= xx) {
31643 :
31644 : di++;
31645 : continue;
31646 : }
31647 :
31648 : Bit16u bp0c = ref[si].b11;
31649 : si++;
31650 :
31651 : bp06 = &ref[bp0c];
31652 :
31653 : Bit8u *bp0a = &bp06->b8;
31654 :
31655 : if (IBMIO_BLEND_TO_SNDBUFF(_47eb_0048(bp06->pv0->pv0, 0), bp06->pv0->w4, *bp0a, 0x157c) CALL_IBMIO == 0)
31656 :
31657 : break;
31658 :
31659 :
31660 : }
31661 :
31662 : return si;
31663 : }
31664 :
31665 :
31666 : Bit16u QUERY_SND_ENTRY_INDEX(Bit8u cls1, Bit8u cls2, Bit8u cls4)
31667 : {
31668 :
31669 :
31670 : for (Bit16u si=0; si < _4976_49d4; si++) {
31671 :
31672 : if (_4976_5f06[si].b2 == cls1) {
31673 :
31674 : if (_4976_5f06[si].b3 == cls2) {
31675 :
31676 : if (_4976_5f06[si].b4 == cls4) {
31677 :
31678 : return si +1;
31679 : }
31680 : }
31681 : }
31682 :
31683 : }
31684 :
31685 : return 0;
31686 : }
31687 :
31688 :
31689 : void QUEUE_NOISE_GEN1(Bit8u cls1, Bit8u cls3, Bit8u cls4, Bit8u xx, Bit8u yy, __int16 xpos, __int16 ypos, __int16 tickDelta)
31690 : {
31691 :
31692 :
31693 : if (tickDelta > 0 && _4976_0c5a != _4976_4c28 && _4976_0c5a != _4976_4c12) {
31694 :
31695 : return;
31696 : }
31697 :
31698 : if (_4976_49d0 == 20) {
31699 :
31700 : return;
31701 : }
31702 :
31703 : Bit16u bp0e = QUERY_SND_ENTRY_INDEX(cls1, cls3, cls4);
31704 :
31705 : if (bp0e == 0) {
31706 :
31707 : return;
31708 : }
31709 :
31710 : if (_4976_4be8 != 0) {
31711 :
31712 : yy >>= 1;
31713 : }
31714 :
31715 : if (tickDelta > 1) {
31716 :
31717 : Bit16u bp10 = 0;
31718 :
31719 : for (__int16 si=0; si < 8; si++) {
31720 :
31721 : if (_4976_5f0e[si].w0 == 0) {
31722 :
31723 : bp10 = 1;
31724 :
31725 : break;
31726 : }
31727 :
31728 : }
31729 :
31730 : if (bp10 == 0) {
31731 :
31732 : return;
31733 : }
31734 :
31735 : sk5f0e *bp04 = &_4976_5f0e[si];
31736 :
31737 : bp04->w0 = 1;
31738 : bp04->b2 = cls1;
31739 : bp04->b3 = cls3;
31740 : bp04->b4 = cls4;
31741 : bp04->w8 = xx;
31742 : bp04->w10 = yy;
31743 : bp04->b5 = (Bit8u)_4976_0c5a;
31744 : bp04->b6 = (Bit8u)xpos;
31745 : bp04->b7 = (Bit8u)ypos;
31746 :
31747 : sk5c20 bp1a;
31748 : bp1a.SetMap(_4976_0c5a);
31749 : bp1a.SetTick(_4976_4bec +tickDelta -1);
31750 : bp1a.TimerType(21);
31751 : bp1a.b5 = xx;
31752 : bp1a.w6 = si;
31753 :
31754 : QUEUE_TIMER(&bp1a);
31755 :
31756 : return;
31757 : }
31758 :
31759 : sk5f0a *bp08 = &_4976_5f0a[_4976_5f06[bp0e -1].w0];
31760 :
31761 : if (tickDelta > 0) {
31762 :
31763 : xpos += _4976_4d0a->MapOffsetX() - _4976_4dba[_4976_4bf4].MapOffsetX() - _4976_4bfa;
31764 :
31765 : ypos += _4976_4d0a->MapOffsetY() - _4976_4dba[_4976_4bf4].MapOffsetY() - _4976_4c06;
31766 : }
31767 : else {
31768 :
31769 : xpos -= _4976_4bfa;
31770 : ypos -= _4976_4c06;
31771 : }
31772 :
31773 : __int16 si;
31774 : switch (_4976_4bf6) {
31775 : case 1:
31776 :
31777 : si = xpos;
31778 : xpos = ypos;
31779 :
31780 : ypos = -si;
31781 :
31782 : break;
31783 : case 2:
31784 :
31785 : xpos = -xpos;
31786 :
31787 :
31788 : ypos = -ypos;
31789 :
31790 : break;
31791 : case 3:
31792 :
31793 : si = xpos;
31794 : xpos = -ypos;
31795 : ypos = si;
31796 :
31797 : break;
31798 : }
31799 :
31800 : sk5efe *bp0c;
31801 : __int16 di;
31802 : if (tickDelta < 0) {
31803 :
31804 : if (_4976_49d2 == 6)
31805 :
31806 : return;
31807 :
31808 : bp0c = _4976_5efe;
31809 : di = _4976_49d2;
31810 : }
31811 : else {
31812 :
31813 : bp0c = _4976_5f02;
31814 : di = _4976_49d0;
31815 : }
31816 :
31817 : for (si=0; si < di; si++) {
31818 :
31819 : if (bp0c[si].pv0 != bp08) {
31820 :
31821 : if (bp08->pv0 != bp0c[si].pv0)
31822 :
31823 : continue;
31824 : }
31825 :
31826 : if (bp0c[si].b6 == xpos && bp0c[si].b7 == ypos)
31827 :
31828 : return;
31829 :
31830 :
31831 : }
31832 :
31833 : bp0c[di].pv0 = &_4976_5f0a[_4976_5f06[bp0e -1].w0];
31834 :
31835 : bp0c[di].b4 = xx;
31836 : bp0c[di].b5 = yy;
31837 : bp0c[di].b6 = (__int8)xpos;
31838 : bp0c[di].b7 = (__int8)ypos;
31839 :
31840 : if (tickDelta == 0) {
31841 :
31842 : _47eb_014f(1, &bp0c[di]);
31843 : }
31844 :
31845 : else if (tickDelta > 0) {
31846 :
31847 : _4976_49d0++;
31848 : }
31849 : else {
31850 :
31851 : _4976_49d2++;
31852 : }
31853 :
31854 : return;
31855 : }
31856 :
31857 :
31858 : void QUEUE_NOISE_GEN2(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit8u cls2alt, __int16 xpos, __int16 ypos, Bit16u tickDelta, Bit8u ss, Bit8u tt)
31859 : {
31860 :
31861 :
31862 : QUEUE_NOISE_GEN1(
31863 : cls1,
31864 : (QUERY_SND_ENTRY_INDEX(cls1, cls2, cls4) != 0) ? cls2 : cls2alt,
31865 : cls4,
31866 : ss,
31867 : tt,
31868 : xpos,
31869 : ypos,
31870 : tickDelta
31871 : );
31872 :
31873 : return;
31874 : }
31875 :
31876 :
31877 : void _3a15_061a(Bit16u xx)
31878 : {
31879 :
31880 :
31881 : Bit16u si = xx;
31882 :
31883 : if (_4976_4762 >= 0) {
31884 :
31885 : _3a15_0486(_4976_4762);
31886 : }
31887 :
31888 : _4976_5c20[si].TimerType(0);
31889 :
31890 : _4976_5c20[si].w0_0_f(_4976_5c18);
31891 :
31892 : _4976_5c18 = si;
31893 :
31894 : _4976_5c1e--;
31895 :
31896 : Bit16u di = _4976_5c1e;
31897 :
31898 : if (di != 0) {
31899 :
31900 : si = _3a15_0447(si);
31901 :
31902 : if (si != di) {
31903 :
31904 : _4976_5c1a[_4976_4762 = si] = _4976_5c1a[di];
31905 : }
31906 : }
31907 :
31908 : return;
31909 : }
31910 :
31911 :
31912 : void INVOKE_MESSAGE(__int16 xpos, __int16 ypos, Bit16u dir, Bit16u actionType, Bit32u tick)
31913 : {
31914 :
31915 :
31916 : sk5c20 bp0a;
31917 : bp0a.SetMap(_4976_0c5a);
31918 : bp0a.SetTick(tick);
31919 :
31920 : bp0a.TimerType(4);
31921 :
31922 : if (actionType != 0) {
31923 :
31924 : if (actionType != 1) {
31925 :
31926 : if (actionType == 2) {
31927 :
31928 : bp0a.b5 = 2;
31929 : }
31930 : }
31931 : else {
31932 :
31933 : bp0a.b5 = 3;
31934 : }
31935 : }
31936 : else {
31937 :
31938 : bp0a.b5 = 1;
31939 : }
31940 :
31941 : bp0a.Xcoord((Bit8u)xpos);
31942 : bp0a.Ycoord((Bit8u)ypos);
31943 : bp0a.b8_0_f((Bit8u)dir);
31944 : bp0a.b9_0_f((Bit8u)actionType);
31945 :
31946 : QUEUE_TIMER(&bp0a);
31947 : }
31948 :
31949 :
31950 : void SET_ITEMTYPE(ObjectID recordLink, Bit8u itemType)
31951 : {
31952 :
31953 :
31954 : ObjectID si = recordLink;
31955 :
31956 : if (si != si.FFFF && si < si.FF80) {
31957 :
31958 : GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(si);
31959 :
31960 : switch (si.DBType()) {
31961 : case dbCreature:
31962 : {
31963 : Creature *bp04 = _bp04->castToCreature();
31964 :
31965 :
31966 : bp04->CreatureType(itemType);
31967 :
31968 : break;
31969 : }
31970 : case dbWeapon:
31971 : {
31972 : Weapon *bp04 = _bp04->castToWeapon();
31973 :
31974 :
31975 :
31976 : bp04->ItemType(itemType);
31977 :
31978 : break;
31979 : }
31980 : case dbCloth:
31981 : {
31982 : Cloth *bp04 = _bp04->castToCloth();
31983 :
31984 :
31985 :
31986 : bp04->ItemType(itemType);
31987 :
31988 : break;
31989 : }
31990 : case dbScroll:
31991 : {
31992 : break;
31993 : }
31994 : case dbPotion:
31995 : {
31996 : Potion *bp04 = _bp04->castToPotion();
31997 :
31998 :
31999 : bp04->PotionType(itemType);
32000 :
32001 : break;
32002 : }
32003 : case dbContainer:
32004 : {
32005 : Container *bp04 = _bp04->castToContainer();
32006 :
32007 :
32008 : bp04->ContainerType(itemType);
32009 :
32010 : if (bp04->ContainerType() != 1)
32011 :
32012 : break;
32013 :
32014 : bp04->w6_0_f(0xffff);
32015 : break;
32016 : }
32017 : }
32018 : }
32019 :
32020 : }
32021 :
32022 :
32023 : ObjectID ALLOC_NEW_DBITEM(Bit16u itemspec)
32024 : {
32025 :
32026 :
32027 : Bit16u di = itemspec;
32028 :
32029 : ObjectID si = ALLOC_NEW_RECORD(GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(di) | 0x8000);
32030 :
32031 : if (si != si.FFFF) {
32032 :
32033 : SET_ITEMTYPE(si, GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(di));
32034 : }
32035 :
32036 : return si;
32037 : }
32038 :
32039 :
32040 : Bit8u GET_WALL_DECORATION_OF_ACTUATOR(Actuator *ref)
32041 : {
32042 :
32043 : Bit16u si = ref->GraphicNumber();
32044 : if (si != 0) {
32045 :
32046 : Bit8u *bp04 = &_4976_4c78[_4976_4dd2 -1][_4976_4dd4 + _4976_4d0a->CreaturesTypes()];
32047 :
32048 : return bp04[si -1];
32049 : }
32050 :
32051 : return -1;
32052 : }
32053 :
32054 :
32055 : Bit8u GET_FLOOR_DECORATION_OF_ACTUATOR(Actuator *ref)
32056 : {
32057 :
32058 :
32059 : Bit16u si = ref->GraphicNumber();
32060 :
32061 : if (si != 0) {
32062 :
32063 : Bit8u *bp04 = &_4976_4c78[_4976_4dd2 -1][_4976_4dd4 + _4976_4d0a->CreaturesTypes() + _4976_4d0a->WallGraphics()];
32064 :
32065 : return bp04[si -1];
32066 : }
32067 : else {
32068 :
32069 : return 0xff;
32070 : }
32071 : }
32072 :
32073 :
32074 : Bit16u GET_DISTINCTIVE_ITEMTYPE(ObjectID recordLink)
32075 : {
32076 :
32077 :
32078 :
32079 :
32080 :
32081 :
32082 : if (recordLink != recordLink.FFFF) {
32083 :
32084 : Bit8u bp01 = QUERY_CLS2_FROM_RECORD(recordLink);
32085 :
32086 : Bit16u di = recordLink.DBType();
32087 :
32088 : Bit16u si = _4976_0c8a[di];
32089 :
32090 : if ((si & 0x8000) != 0) {
32091 :
32092 : si &= 0x7fff;
32093 : bp01 = 0;
32094 : }
32095 :
32096 : return si + bp01;
32097 : }
32098 : else {
32099 :
32100 : return 511;
32101 : }
32102 : }
32103 :
32104 :
32105 : void INVOKE_ACTUATOR(Actuator *ref, Bit16u actionType, __int16 delayPlus)
32106 : {
32107 :
32108 :
32109 : INVOKE_MESSAGE(
32110 : ref->Xcoord(),
32111 : ref->Ycoord(),
32112 : ref->Direction(),
32113 : actionType,
32114 : _4976_4bec + ref->Delay() + delayPlus
32115 : );
32116 :
32117 : return;
32118 : }
32119 :
32120 : U16 _1c9a_0694(ObjectID *ref, void *pv);
32121 :
32122 :
32123 : ObjectID *_1c9a_06bd(ObjectID recordLink, Bit16u ss, Bit16u dir)
32124 : {
32125 :
32126 :
32127 : ObjectID *bp04 = 0;
32128 :
32129 : if (recordLink != recordLink.FFFF) {
32130 :
32131 : Creature *bp08 = GET_ADDRESS_OF_RECORD4(recordLink);
32132 :
32133 : ObjectID *bp0c;
32134 : bp04 = OVERSEE_RECORD(
32135 : &bp08->w2,
32136 : (Bit8u)dir,
32137 : &bp0c,
32138 : _1c9a_0694,
32139 : &ss,
32140 : 0,
32141 : 0
32142 : );
32143 :
32144 : if (bp04 != NULL && *bp04 == 0xFFFE)
32145 :
32146 : bp04 = NULL;
32147 : }
32148 :
32149 : return bp04;
32150 : }
32151 :
32152 :
32153 : void _2fcf_2444(__int16 xpos, __int16 ypos, ObjectID recordLink, Bit16u ss, Bit16u tt, Bit16u uu)
32154 : {
32155 :
32156 :
32157 :
32158 :
32159 :
32160 :
32161 :
32162 :
32163 :
32164 :
32165 :
32166 :
32167 :
32168 :
32169 :
32170 :
32171 :
32172 :
32173 :
32174 :
32175 : ObjectID *bp1c = 0;
32176 :
32177 : Bit16u bp0e;
32178 : Bit16u di;
32179 : if (recordLink != recordLink.FFFF) {
32180 :
32181 : bp0e = recordLink.DBType();
32182 :
32183 : di = GET_DISTINCTIVE_ITEMTYPE(recordLink);
32184 :
32185 : ObjectID bp2c = GET_CREATURE_AT(xpos, ypos);
32186 :
32187 : if (bp2c != bp2c.FFFF) {
32188 :
32189 : Creature *bp08 = GET_ADDRESS_OF_RECORD4(bp2c);
32190 :
32191 : sk03a2 *bp0c = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp08->CreatureType());
32192 :
32193 : if ((uu != 0 && tt == 0) || ((bp0c->w0 & 0x0001) != 0 && (bp0c->w30 & 0x0800) != 0)) {
32194 :
32195 : bp1c = &bp08->w2;
32196 : }
32197 : }
32198 : }
32199 : else {
32200 :
32201 : bp0e = 0xffff;
32202 : di = 0xffff;
32203 : }
32204 :
32205 : if (tt == 0 && bp0e != 0xffff) {
32206 :
32207 : if (bp1c == 0) {
32208 :
32209 : CUT_RECORD_FROM(recordLink, NULL, xpos, ypos);
32210 : }
32211 : else {
32212 :
32213 : CUT_RECORD_FROM(recordLink, bp1c, -1, 0);
32214 : }
32215 : }
32216 :
32217 : Bit16u bp2a = _4976_4c78[xpos][ypos];
32218 :
32219 : Bit16u bp1e;
32220 : if ((bp2a >> 5) == ttWall) {
32221 :
32222 : bp1e = recordLink.Dir();
32223 : }
32224 : else {
32225 :
32226 : bp1e = 0xffff;
32227 : }
32228 :
32229 : Bit16u bp26 = 0;
32230 : Bit16u bp24 = 0;
32231 : Bit16u bp22 = 0;
32232 : Bit16u bp20 = 0;
32233 :
32234 : ObjectID si = GET_TILE_RECORD_LINK(xpos, ypos);
32235 :
32236 : if (si == si.FFFF) {
32237 :
32238 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
32239 :
32240 : Bit16u bp12 = si.DBType();
32241 :
32242 : if (bp12 == dbCreature && _2fcf_0109(si) == 0) {
32243 :
32244 : if ((_0cee_2de0(si) & 0x0001) != 0 && _1c9a_06bd(si, di, 255) != NULL) {
32245 :
32246 : bp24 = 1;
32247 : }
32248 : else {
32249 :
32250 : bp22 = 1;
32251 : }
32252 : }
32253 :
32254 : if (bp12 == dbText && bp0e == 0xffff && tt != 0 && ss == 0) {
32255 :
32256 : Text *bp18 = GET_ADDRESS_OF_RECORD2(si);
32257 :
32258 : if (bp18->TextMode() != 0 || bp18->TextVisibility() == 0)
32259 :
32260 : continue;
32261 :
32262 : Bit8u bp0106[200];
32263 : _0cee_159b(bp0106, si, 1);
32264 :
32265 : _3929_09fb(15, bp0106);
32266 :
32267 : continue;
32268 : }
32269 :
32270 : if (bp12 > 4 && bp12 < 14) {
32271 :
32272 : bp20 = 1;
32273 :
32274 : bp24 |= (GET_DISTINCTIVE_ITEMTYPE(si) == di) ? 1 : 0;
32275 :
32276 : bp26 |= (GET_DISTINCTIVE_ITEMTYPE(si) != di) ? 1 : 0;
32277 : }
32278 :
32279 : }
32280 : }
32281 : else {
32282 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
32283 :
32284 : if (si.Dir() == bp1e && si.DBType() > dbCreature) {
32285 :
32286 : bp20 = 1;
32287 :
32288 : bp24 |= (GET_DISTINCTIVE_ITEMTYPE(si) == di) ? 1 : 0;
32289 :
32290 : bp26 |= (GET_DISTINCTIVE_ITEMTYPE(si) != di) ? 1 : 0;
32291 : }
32292 :
32293 : }
32294 : }
32295 :
32296 : if (tt != 0 && bp0e != 0xffff) {
32297 :
32298 : if (bp1c == NULL) {
32299 :
32300 : APPEND_RECORD_TO(recordLink, NULL, xpos, ypos);
32301 : }
32302 : else {
32303 :
32304 : APPEND_RECORD_TO(recordLink, bp1c, -1, 0);
32305 : }
32306 : }
32307 :
32308 : for (si = GET_TILE_RECORD_LINK(xpos, ypos); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
32309 :
32310 : if (bp1e == 0xffff && _0cee_3202(si) != 0 && QUERY_CLS1_FROM_RECORD(recordLink) == 15 && QUERY_CLS2_FROM_RECORD(recordLink) == 0) {
32311 :
32312 : __int16 bp2e = ADD_ITEM_CHARGE(recordLink, 0);
32313 :
32314 : if (bp2e < 0 || bp2e >= _4976_4c3c)
32315 :
32316 : break;
32317 :
32318 : sk5c20 bp3c;
32319 : bp3c.SetMap(_4976_0c5a);
32320 : bp3c.SetTick(_4976_4bec + 1);
32321 :
32322 : bp3c.TimerType(13);
32323 : bp3c.b5 = (Bit8u)bp2e;
32324 : bp3c.Xcoord((Bit8u)xpos);
32325 : bp3c.Ycoord((Bit8u)ypos);
32326 : bp3c.b8_0_f(bp1e);
32327 : bp3c.b9_0_f(2);
32328 :
32329 : QUEUE_TIMER(&bp3c);
32330 :
32331 : break;
32332 : }
32333 :
32334 : Bit16u bp12 = si.DBType();
32335 :
32336 : if (bp12 == dbActuator) {
32337 :
32338 : Actuator *bp04 = GET_ADDRESS_OF_RECORD3(si);
32339 :
32340 : if (bp04->ActuatorType() == 0)
32341 :
32342 : continue;
32343 :
32344 : Bit16u bp14 = bp04->ActuatorData();
32345 : Bit16u bp10 = tt;
32346 :
32347 : if (bp1e == 0xffff) {
32348 :
32349 : switch (bp04->ActuatorType()) {
32350 : default:
32351 :
32352 : continue;
32353 : case 1:
32354 :
32355 : if (ss != 0)
32356 :
32357 : continue;
32358 :
32359 : if (bp20 != 0)
32360 :
32361 : continue;
32362 :
32363 : if (bp22 == 0)
32364 :
32365 : goto _29a8;
32366 :
32367 : continue;
32368 : case 2:
32369 :
32370 : if (bp0e > 4)
32371 :
32372 : continue;
32373 :
32374 : if (ss != 0)
32375 :
32376 : continue;
32377 :
32378 : if (bp22 == 0)
32379 :
32380 : goto _29a8;
32381 :
32382 : continue;
32383 : case 3:
32384 :
32385 : if (bp0e != 0xffff)
32386 :
32387 : continue;
32388 :
32389 : if (_4976_4c3c == 0)
32390 :
32391 : continue;
32392 :
32393 : if (bp14 == 0) {
32394 :
32395 : if (ss == 0)
32396 :
32397 : goto _29a8;
32398 :
32399 : continue;
32400 : }
32401 :
32402 : if (tt == 0) {
32403 :
32404 : bp10 = 0;
32405 :
32406 : goto _29a8;
32407 : }
32408 :
32409 : bp10 = (_4976_4bf6 +1 == bp14) ? 1 : 0;
32410 :
32411 : goto _29a8;
32412 : case 4:
32413 :
32414 : if (bp14 != di)
32415 :
32416 : continue;
32417 :
32418 : if (bp24 == 0)
32419 :
32420 : goto _29a8;
32421 :
32422 : continue;
32423 : case 5:
32424 : case 6:
32425 :
32426 : continue;
32427 : case 7:
32428 :
32429 : if (bp0e > 4)
32430 :
32431 : continue;
32432 :
32433 : if (bp0e == 0xffff)
32434 :
32435 : continue;
32436 :
32437 : if (bp22 == 0)
32438 :
32439 : continue;
32440 :
32441 : continue;
32442 : case 8:
32443 :
32444 : if (bp0e != 0xffff)
32445 :
32446 : continue;
32447 :
32448 : bp10 = _2fcf_16ff(bp14);
32449 :
32450 : goto _29a8;
32451 : }
32452 : }
32453 :
32454 : if (si.Dir() != bp1e)
32455 :
32456 : continue;
32457 :
32458 : Bit16u bp3e = bp04->ActuatorType();
32459 :
32460 : switch (bp3e) {
32461 : case 0x001a:
32462 : {
32463 :
32464 : if (bp24 != 0)
32465 :
32466 : continue;
32467 :
32468 : if (bp04->OnceOnlyActuator() == tt)
32469 :
32470 : continue;
32471 :
32472 : if (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, GET_WALL_DECORATION_OF_ACTUATOR(bp04), dtWordValue, 0x0e) != di)
32473 :
32474 : continue;
32475 :
32476 : bp04->OnceOnlyActuator(tt);
32477 :
32478 : _29a8:
32479 : bp10 = bp10 ^ bp04->RevertEffect();
32480 :
32481 : Bit16u bp28 = bp04->ActionType();
32482 :
32483 : if (bp28 == 3) {
32484 :
32485 : bp28 = (bp10 != 0) ? 0 : 1;
32486 : }
32487 : else {
32488 :
32489 : if (bp10 == 0)
32490 :
32491 : continue;
32492 : }
32493 :
32494 : if (bp04->SoundEffect() != 0) {
32495 :
32496 : QUEUE_NOISE_GEN2(
32497 : (bp1e == 0xffff) ? 0x0a : 0x09,
32498 : (bp1e == 0xffff)
32499 : ? GET_FLOOR_DECORATION_OF_ACTUATOR(bp04)
32500 : : GET_WALL_DECORATION_OF_ACTUATOR(bp04),
32501 : 0x88,
32502 : 0xfe,
32503 : xpos,
32504 : ypos,
32505 : 0x01,
32506 : 0x8c,
32507 : 0x80
32508 : );
32509 : }
32510 :
32511 : INVOKE_ACTUATOR(bp04, bp28, 0);
32512 :
32513 : continue;
32514 : }
32515 : case 0x0029:
32516 : {
32517 :
32518 : if (bp20 == 0)
32519 :
32520 : goto _29a8;
32521 :
32522 : continue;
32523 : }
32524 : case 0x002a:
32525 : {
32526 :
32527 : if (bp24 != 0)
32528 :
32529 : continue;
32530 :
32531 : if (bp04->ActuatorData() == di)
32532 :
32533 : goto _29a8;
32534 :
32535 : continue;
32536 : }
32537 : case 0x002b:
32538 : {
32539 :
32540 : if (bp26 != 0)
32541 :
32542 : continue;
32543 :
32544 : if (bp04->ActuatorData() != di)
32545 :
32546 : goto _29a8;
32547 :
32548 : continue;
32549 : }
32550 : }
32551 :
32552 : continue;
32553 : }
32554 :
32555 : if (bp12 == dbText) {
32556 :
32557 : Text *bp18 = GET_ADDRESS_OF_RECORD2(si);
32558 :
32559 : if (bp18->TextMode() == 1) { }
32560 :
32561 : if (bp1e == 0xffff) {
32562 :
32563 : if (bp18->SimpleTextExtUsage() != 9) {
32564 :
32565 : if (bp18->SimpleTextExtUsage() == 10) {
32566 :
32567 :
32568 : if (bp0e != 0xffff)
32569 :
32570 : continue;
32571 :
32572 : if (tt != 0)
32573 :
32574 : continue;
32575 :
32576 : if (_4976_4c3c == 0)
32577 :
32578 : continue;
32579 :
32580 : Bit16u bp32 = 0;
32581 : Bit16u bp30 = 0;
32582 :
32583 : for (; bp30 < _4976_4c3c; bp30++) {
32584 :
32585 : if (_4976_53b4[bp30].curHP() != 0) {
32586 :
32587 : bp32 = bp32 + _2c1d_203d(bp30) / _2c1d_0ffc(&_4976_53b4[bp30]);
32588 : }
32589 :
32590 : }
32591 :
32592 : bp32 = min_value(90, (bp32 * 10) + ((bp18->TextVisibility() != 0) ? 50 : 25));
32593 :
32594 : if (ss == 0 && RAND16(100) < bp32) {
32595 :
32596 : sk5c20 bp3c;
32597 : bp3c.SetTick(_4976_4bec);
32598 : bp3c.SetMap(_4976_0c5a);
32599 :
32600 : bp3c.TimerType(93);
32601 : bp3c.b5 = 0;
32602 : bp3c.b6_0_4((Bit8u)xpos);
32603 : bp3c.w6_5_9(ypos);
32604 : bp3c.b8_0_f((Bit8u)_4976_4bf4);
32605 : bp3c.w6_a_c(_4976_4bf6);
32606 :
32607 : QUEUE_TIMER(&bp3c);
32608 :
32609 : bp30 = RAND02();
32610 :
32611 : if (_4976_53b4[bp30].curHP() == 0) {
32612 :
32613 : bp30 = _4976_3fc6;
32614 : }
32615 :
32616 : QUEUE_NOISE_GEN2(
32617 : 0x16,
32618 : _4976_53b4[bp30].HeroType(),
32619 : 0x82,
32620 : 0xfe,
32621 : _4976_4bfa,
32622 : _4976_4c06,
32623 : 0x01,
32624 : 0x69,
32625 : 0xc8
32626 : );
32627 :
32628 : continue;
32629 : }
32630 :
32631 : QUEUE_NOISE_GEN1(
32632 : 0x0a,
32633 : ((Bit8u)bp18->TextIndex()) & 0xff,
32634 : 0x88,
32635 : 0x8c,
32636 : 0x80,
32637 : _4976_4bfa,
32638 : _4976_4c06,
32639 : 0x01
32640 : );
32641 :
32642 : continue;
32643 : }
32644 :
32645 : continue;
32646 : }
32647 :
32648 : if (bp0e != 0xffff) {
32649 :
32650 : continue;
32651 : }
32652 :
32653 : if (ss != 0) {
32654 :
32655 : continue;
32656 : }
32657 :
32658 : if (_4976_4c3c == 0) {
32659 :
32660 : continue;
32661 : }
32662 :
32663 : if (RAND16(100) >= (bp18->TextIndex() & 0x00ff)) {
32664 :
32665 : continue;
32666 : }
32667 :
32668 : Bit16u bp10 = (bp18->TextVisibility() != tt) ? 1 : 0;
32669 :
32670 : INVOKE_MESSAGE(
32671 : xpos,
32672 : ypos,
32673 : 0,
32674 : (bp10 != 0) ? 0 : 1,
32675 : _4976_4bec +1
32676 : );
32677 :
32678 : INVOKE_MESSAGE(
32679 : xpos,
32680 : ypos,
32681 : 0,
32682 : (bp10 != 0) ? 1 : 0,
32683 : _4976_4bec +5
32684 : );
32685 :
32686 : continue;
32687 : }
32688 :
32689 : if (si.Dir() != bp1e)
32690 :
32691 : continue;
32692 :
32693 : if (bp18->SimpleTextExtUsage() != 4 && bp18->SimpleTextExtUsage() != 8)
32694 :
32695 : continue;
32696 :
32697 : if (bp24 != 0)
32698 :
32699 : continue;
32700 :
32701 : if (bp18->TextVisibility() == tt)
32702 :
32703 : continue;
32704 :
32705 : if (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, ((Bit8u)bp18->TextIndex()) & 0xff, dtWordValue, 0x0e) != di)
32706 :
32707 : continue;
32708 :
32709 : bp18->TextVisibility(tt);
32710 :
32711 : continue;
32712 : }
32713 :
32714 : if (bp12 >= dbCreature)
32715 :
32716 : break;
32717 :
32718 : }
32719 :
32720 : return;
32721 : }
32722 :
32723 :
32724 : void DELETE_CREATURE_RECORD(__int16 xpos, __int16 ypos, Bit16u ss, Bit16u tt)
32725 : {
32726 :
32727 :
32728 : ObjectID si = GET_CREATURE_AT(xpos, ypos);
32729 :
32730 : if (si == si.FFFF)
32731 :
32732 : return;
32733 :
32734 : Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
32735 :
32736 : sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType());
32737 :
32738 : if ((bp08->w0 & 0x0001) == 0) {
32739 :
32740 : Bit16u bp10 = QUERY_GDAT_CREATURE_WORD_VALUE(bp04->CreatureType(), 0x01);
32741 :
32742 : Bit16u di = _4976_3752[bp10];
32743 :
32744 : if ((di & 0x0004) == 0) {
32745 :
32746 : Creature *bp0c = bp04;
32747 :
32748 : Bit16u bp0e = _4976_0c5a;
32749 :
32750 : CHANGE_CURRENT_MAP_TO(bp0c->TriggerMap());
32751 :
32752 : INVOKE_MESSAGE(bp0c->TriggerX(), bp0c->TriggerY(), 0, 0, _4976_4bec +1);
32753 :
32754 : CHANGE_CURRENT_MAP_TO(bp0e);
32755 : }
32756 : }
32757 :
32758 : MOVE_RECORD_TO(si, xpos, ypos, -4, 0);
32759 :
32760 : _1c9a_1374(si, xpos, ypos, ss, tt);
32761 :
32762 : _1c9a_0247(si);
32763 :
32764 : DEALLOC_RECORD(si);
32765 :
32766 : return;
32767 : }
32768 :
32769 :
32770 : void _1c9a_1374(ObjectID recordLink, __int16 xx, __int16 yy, Bit16u ss, __int16 tt)
32771 : {
32772 :
32773 :
32774 : if (ss == 2)
32775 : return;
32776 :
32777 : Creature *bp04 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature();
32778 :
32779 : ObjectID si;
32780 : Bit16u di;
32781 : if (ss == 0) {
32782 :
32783 : for (Bit16u bp0a = 10; bp0a <= 20; bp0a++) {
32784 :
32785 : Bit16u bp06 = QUERY_GDAT_CREATURE_WORD_VALUE(bp04->CreatureType(), (Bit8u)bp0a);
32786 :
32787 : if (bp06 == 0)
32788 :
32789 : continue;
32790 :
32791 :
32792 :
32793 :
32794 :
32795 : Bit16u bp0c = (bp06 & 15) + 1;
32796 :
32797 : Bit16u bp0e = (bp06 & 0x0070) >> 4;
32798 :
32799 : if (bp0e != 0) {
32800 :
32801 : bp0c = bp0c + RAND16(bp0e +1);
32802 : }
32803 :
32804 : bp06 >>= 7;
32805 :
32806 : while (bp0c-- != 0) {
32807 :
32808 : si = ALLOC_NEW_DBITEM(bp06);
32809 :
32810 : if (si == si.FFFF)
32811 :
32812 : break;
32813 :
32814 : if (xx == _4976_4bfa && yy == _4976_4c06) {
32815 :
32816 : di = (_4976_4bf6 + RAND01()) & 3;
32817 : }
32818 : else {
32819 :
32820 : di = RAND02();
32821 : }
32822 :
32823 : MOVE_RECORD_TO(ObjectID(si, di), -1, 0, xx, yy);
32824 :
32825 : if (tt >= 0) {
32826 :
32827 : QUEUE_NOISE_GEN2(
32828 : QUERY_CLS1_FROM_RECORD(si),
32829 : QUERY_CLS2_FROM_RECORD(si),
32830 : 0x85,
32831 : 0xfe,
32832 : xx,
32833 : yy,
32834 : tt,
32835 : 0x003a,
32836 : 0x0080
32837 : );
32838 : }
32839 :
32840 : }
32841 :
32842 : }
32843 : }
32844 :
32845 : si = bp04->GetPossessionObject();
32846 :
32847 : if (si == si.FFFE)
32848 :
32849 : return;
32850 :
32851 : ObjectID bp08;
32852 : do {
32853 :
32854 : bp08 = GET_NEXT_RECORD_LINK(si);
32855 :
32856 : if ((_0cee_2de0(recordLink) & 0x0001) == 0) {
32857 :
32858 : if (xx == _4976_4bfa && yy == _4976_4c06) {
32859 :
32860 : di = (_4976_4bf6 + RAND01()) & 3;
32861 : }
32862 : else {
32863 :
32864 : di = RAND02();
32865 : }
32866 :
32867 : si.Dir(di);
32868 : }
32869 :
32870 : if (si.DBType() == dbMissile) {
32871 :
32872 : DEALLOC_RECORD(si);
32873 : }
32874 : else {
32875 :
32876 : MOVE_RECORD_TO(si, -1, 0, xx, yy);
32877 :
32878 : if (tt >= 0) {
32879 :
32880 : QUEUE_NOISE_GEN2(
32881 : QUERY_CLS1_FROM_RECORD(si),
32882 : QUERY_CLS2_FROM_RECORD(si),
32883 : 0x85,
32884 : 0xfe,
32885 : xx,
32886 : yy,
32887 : tt,
32888 : 0x3a,
32889 : 0x80
32890 : );
32891 : }
32892 : }
32893 :
32894 : si = bp08;
32895 :
32896 : } while (si != si.FFFE);
32897 :
32898 :
32899 : return;
32900 : }
32901 :
32902 :
32903 : ObjectID ROTATE_RECORD_BY_TELEPORTER(Teleporter *ref, ObjectID recordLink)
32904 : {
32905 :
32906 :
32907 : ObjectID cx = recordLink;
32908 :
32909 : Bit16u si = _4976_581e;
32910 :
32911 : Bit16u di = ref->Rotation();
32912 :
32913 : if (ref->RotationType() != 0) {
32914 :
32915 : si = di;
32916 : }
32917 : else {
32918 :
32919 : si = (si + di) & 3;
32920 :
32921 : cx.Dir(cx.Dir() + di);
32922 : }
32923 :
32924 : _4976_581e = si;
32925 :
32926 : return cx;
32927 : }
32928 :
32929 :
32930 : void ROTATE_CREATURE(ObjectID recordLink, Bit16u rotationType, Bit16u rotation)
32931 : {
32932 :
32933 :
32934 : Creature *bp08 = GET_ADDRESS_OF_RECORD4(recordLink);
32935 :
32936 : Bit16u di = bp08->b15_0_2();
32937 :
32938 : Bit16u si;
32939 : if (rotationType != 0) {
32940 :
32941 : si = rotation;
32942 : }
32943 : else {
32944 :
32945 : si = (di + rotation) & 3;
32946 : }
32947 :
32948 : Bit16u bp0a = (si - di) & 3;
32949 :
32950 : bp08->b15_0_2(si);
32951 :
32952 : if ((_0cee_2de0(recordLink) & 0x0001) != 0) {
32953 :
32954 : ObjectID *bp04 = &bp08->w2;
32955 :
32956 : while (*bp04 != bp04->FFFE) {
32957 :
32958 : bp04->Dir(bp04->Dir() + bp0a);
32959 :
32960 : bp04 = &(GET_ADDRESS_OF_RECORD(*bp04)->w0);
32961 :
32962 : }
32963 : }
32964 :
32965 : return;
32966 : }
32967 :
32968 :
32969 : void ROTATE_SQUAD(Bit16u dir)
32970 : {
32971 :
32972 :
32973 : Bit16u di = dir;
32974 :
32975 : if (di != _4976_4bf6) {
32976 :
32977 : __int16 dx = di - _4976_4bf6;
32978 :
32979 : if (dx < 0)
32980 :
32981 : dx += 4;
32982 :
32983 : sk53b4 *bp04 = _4976_53b4;
32984 :
32985 : for (Bit16u si=0; si < _4976_4c3c; bp04++, si++) {
32986 :
32987 : bp04->playerPos(bp04->playerPos() + (Bit8u)dx);
32988 :
32989 : bp04->playerDir(bp04->playerDir() + (Bit8u)dx);
32990 :
32991 : }
32992 :
32993 : _4976_4bf6 = di;
32994 :
32995 : if (_4976_4c08 != 0) {
32996 :
32997 : _4976_4c2c = _4976_4c10 = (_4976_4c10 + dx) & 3;
32998 : }
32999 : else {
33000 :
33001 : _4976_4c2c = _4976_4bf6;
33002 : }
33003 : }
33004 :
33005 : return;
33006 : }
33007 :
33008 :
33009 : Bit16u _2fcf_0434(ObjectID recordLink, __int16 xpos, __int16 ypos, __int16 xx, __int16 yy, Bit16u zz)
33010 : {
33011 :
33012 :
33013 : ObjectID si = recordLink;
33014 : _4976_5822 = 0;
33015 : Bit16u bp14 = 0;
33016 : Bit16u bp12 = 0;
33017 : Bit16u bp20 = _4976_0c5a;
33018 : Bit16u di = _4976_0c5a;
33019 :
33020 : Bit16u bp28;
33021 : Bit16u bp1e;
33022 : Bit16u bp26;
33023 : Bit16u bp24;
33024 : if (si == si.FFFF) {
33025 :
33026 : if (_4976_4ddc != 0) {
33027 :
33028 : _4976_4ddc = 0;
33029 : _29ee_000f();
33030 : }
33031 :
33032 : _4976_4bfa = xx;
33033 : _4976_4c06 = yy;
33034 : Bit16u bp24 = 2;
33035 :
33036 : bp26 = (_4976_52be == 0 && _4976_4be8 == 0) ? 1 : 0;
33037 : bp1e = 0xffff;
33038 : bp28 = 0;
33039 : }
33040 : else {
33041 :
33042 : bp28 = _2fcf_0109(si);
33043 : bp1e = si.DBType();
33044 : bp24 = 3;
33045 :
33046 : if (bp1e == dbCreature) {
33047 :
33048 : bp24 = (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x1e) != 0) ? 2 : 1;
33049 : }
33050 :
33051 : else if (bp1e == dbMissile) {
33052 :
33053 : Missile *bp04 = GET_ADDRESS_OF_RECORD(si)->castToMissile();
33054 :
33055 : _4976_581e = _4976_5c20[bp04->TimerIndex()].b9_2_3();
33056 : }
33057 :
33058 : bp26 = 0;
33059 : }
33060 :
33061 : for (Bit16u bp1a = 50; bp1a != 0; --bp1a) {
33062 :
33063 : Bit16u bp16 = _4976_4c78[xx][yy];
33064 :
33065 : Bit16u bp18 = bp16 >> 5;
33066 :
33067 : if (bp18 == ttTeleporter) {
33068 :
33069 : if ((bp16 & 0x0008) == 0)
33070 :
33071 : break;
33072 :
33073 : Teleporter *bp04 = GET_ADDRESS_OF_TILE_RECORD((Bit8u)xx, (Bit8u)yy)->castToTeleporter();
33074 :
33075 : if (bp04->Scope() == scopeCreatures && bp1e != dbCreature)
33076 :
33077 : break;
33078 :
33079 : if (bp24 != 3) {
33080 :
33081 : if ((bp24 & bp04->Scope()) == 0)
33082 :
33083 : break;
33084 : }
33085 :
33086 : bp14 = (bp04->DestinationX() == xx && bp04->DestinationY() == yy && bp04->DestinationMap() == di) ? 1 : 0;
33087 :
33088 : xx = bp04->DestinationX();
33089 : yy = bp04->DestinationY();
33090 : _4976_5822 = bp04->Sound();
33091 : di = bp04->DestinationMap();
33092 :
33093 : CHANGE_CURRENT_MAP_TO(di);
33094 :
33095 : if (si == si.FFFF) {
33096 :
33097 : _4976_4bfa = xx;
33098 : _4976_4c06 = yy;
33099 :
33100 : if (bp04->Sound() != 0) {
33101 :
33102 : QUEUE_NOISE_GEN1(0x03,0x00,0x89,0x61,0x80,_4976_4bfa,_4976_4c06,-1);
33103 : }
33104 :
33105 : if (bp20 == di) {
33106 :
33107 : bp26 &= _4976_5bee;
33108 : }
33109 :
33110 : ROTATE_SQUAD((bp04->Rotation() + ((bp04->RotationType() != 0) ? 0 : _4976_4bf6)) & 3);
33111 : }
33112 :
33113 : else if (bp1e == dbCreature && zz != 00) {
33114 :
33115 : if (bp04->Sound() != 0) {
33116 :
33117 : QUEUE_NOISE_GEN1(0x03,0x00,0x89,0x61,0x80,xx,yy,0x01);
33118 : }
33119 :
33120 : ROTATE_CREATURE(si, bp04->RotationType(), bp04->Rotation());
33121 : }
33122 :
33123 : else if (bp1e == dbMissile) {
33124 :
33125 : si = ROTATE_RECORD_BY_TELEPORTER(bp04, si);
33126 : }
33127 :
33128 : else if (bp04->RotationType() == 0 && xpos != -2) {
33129 :
33130 : si.Dir(si.Dir() + bp04->Rotation());
33131 : }
33132 :
33133 : if (bp14 == 0)
33134 :
33135 : continue;
33136 :
33137 : break;
33138 : }
33139 :
33140 : if (bp18 == ttPit && bp28 == 0 && (bp16 & 8) != 0 && (bp16 & 1) == 0) {
33141 :
33142 : Bit16u bp2a = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4d0a->MapGraphicsStyle(), dtWordValue, 0x6a);
33143 :
33144 : if (bp2a != 0 && bp1e == dbCreature) {
33145 :
33146 : Creature *bp10 = GET_ADDRESS_OF_RECORD(si)->castToCreature();
33147 :
33148 : xx = bp10->TriggerX();
33149 : yy = bp10->TriggerY();
33150 : di = bp10->TriggerMap();
33151 :
33152 : CHANGE_CURRENT_MAP_TO(di);
33153 :
33154 : continue;
33155 : }
33156 :
33157 : if (bp26 != 0 && bp2a == 0 && _4976_5824 == 0) {
33158 :
33159 : bp26 = _4976_5bee;
33160 :
33161 : if (bp12 != 0) {
33162 :
33163 : LOAD_LOCALLEVEL_GRAPHICS_TABLE(di);
33164 :
33165 : _2676_0131();
33166 : }
33167 :
33168 : _32cb_5d0d(_4976_4bf6, xx, yy);
33169 :
33170 : _44c8_1be8(1);
33171 : }
33172 :
33173 : if (bp2a != 0) {
33174 :
33175 : Bit16u bp2e = 0;
33176 :
33177 : ObjectID bp2c = GET_TILE_RECORD_LINK(xx, yy);
33178 :
33179 : for (; bp2c != bp2c.FFFE && ((bp1e = bp2c.DBType()) <= dbActuator); bp2c = GET_NEXT_RECORD_LINK(bp2c)) {
33180 :
33181 : if (bp1e == dbText) {
33182 :
33183 : Text *bp0c = GET_ADDRESS_OF_RECORD(bp2c)->castToText();
33184 :
33185 : if (bp0c->TextMode() == 1) {
33186 :
33187 : if (bp0c->SimpleTextExtUsage() == 0x0c) {
33188 :
33189 : bp2e = bp0c->TextIndex() & 0xff;
33190 :
33191 : break;
33192 : }
33193 : }
33194 : }
33195 :
33196 : }
33197 :
33198 : Bit16u bp30 = _2fcf_2da7(0x0003, 0x0000, bp2e, &xx, &yy);
33199 :
33200 : di = _2fcf_2da7(2, RAND16(bp30), bp2e, &xx, &yy);
33201 : }
33202 : else {
33203 :
33204 : di = _0cee_0510(di, 1, &xx, &yy, NULL);
33205 : }
33206 :
33207 : CHANGE_CURRENT_MAP_TO(di);
33208 :
33209 : if (si == si.FFFF) {
33210 :
33211 : _4976_4bfa = xx;
33212 : _4976_4c06 = yy;
33213 :
33214 : if (_4976_4c3c > 0) {
33215 :
33216 : sk53b4 *bp08;
33217 : if (_4976_5824 != 0) {
33218 :
33219 : bp26 = (_4976_5bee != 0 && _4976_52be == 0 && _4976_4be8 == 0) ? 1 : 0;
33220 :
33221 : bp08 = _4976_53b4;
33222 :
33223 : for (bp18=0; bp18 < _4976_4c3c; bp08++, bp18++) {
33224 :
33225 : if (bp08->curHP() != 0) {
33226 :
33227 : _2c1d_1c7c(
33228 : bp18,
33229 : ((_2c1d_203d(bp18) * 25) / _2c1d_0ffc(bp08)) + 1
33230 : );
33231 : }
33232 :
33233 : }
33234 : }
33235 : else {
33236 :
33237 : bp08 = _4976_53b4;
33238 :
33239 : for (bp18 = 0; (bp18 < _4976_4c3c); bp08++, bp18++) {
33240 :
33241 : if (bp08->curHP() != 0) {
33242 :
33243 : _2c1d_18aa(
33244 : bp18,
33245 : min_value(bp08->maxHP() >> 2, 17) + RAND02(),
33246 : 0x0030,
33247 : 0x0002
33248 : );
33249 :
33250 : QUEUE_NOISE_GEN2(
33251 : 0x16,
33252 : bp08->b255,
33253 : 0x87,
33254 : 0xfe,
33255 : _4976_4bfa,
33256 : _4976_4c06,
33257 : 0xffff,
33258 : 0x00be,
33259 : 0x00ff
33260 : );
33261 : }
33262 :
33263 : }
33264 : }
33265 : }
33266 :
33267 : _4976_5824 = 0;
33268 :
33269 : continue;
33270 : }
33271 :
33272 : if (bp1e != dbCreature)
33273 :
33274 : continue;
33275 :
33276 : if (zz == 0)
33277 :
33278 : continue;
33279 :
33280 : if (xpos >= 0) {
33281 :
33282 : CHANGE_CURRENT_MAP_TO(bp20);
33283 :
33284 : _13e4_0401(
33285 : si,
33286 : xpos,
33287 : ypos,
33288 : 0x0000,
33289 : 0x0000,
33290 : 0x0014
33291 : );
33292 : }
33293 :
33294 : CHANGE_CURRENT_MAP_TO(di);
33295 :
33296 : break;
33297 : }
33298 :
33299 : if (bp18 != ttStairs || si == si.FFFF || bp1e == 14 || bp1e == 4)
33300 :
33301 : break;
33302 :
33303 : if ((bp16 & 0x0004) == 0) {
33304 :
33305 : di = _0cee_0510(di, 1, &xx, &yy, NULL);
33306 :
33307 : CHANGE_CURRENT_MAP_TO(di);
33308 : }
33309 :
33310 : Bit16u bp22 = _0cee_06dc(xx, yy);
33311 :
33312 : xx += _4976_0232[bp22];
33313 :
33314 : yy += _4976_023a[bp22];
33315 :
33316 : bp22 = (bp22 +2 ) & 3;
33317 :
33318 : Bit16u bp1c = si.Dir();
33319 :
33320 : bp1c = ((((bp1c - bp22 + 1) & 2) >> 1) + bp22) & 3;
33321 :
33322 : si.Dir(bp1c);
33323 :
33324 :
33325 : }
33326 :
33327 : _4976_5826 = xx;
33328 : _4976_5828 = yy;
33329 : _4976_581c = di;
33330 :
33331 : _4976_5820 = si.Dir();
33332 :
33333 : if (bp12 != 0 && zz != 0 && si != si.FFFF) {
33334 :
33335 : QUEUE_NOISE_GEN2(
33336 : QUERY_CLS1_FROM_RECORD(si),
33337 : QUERY_CLS2_FROM_RECORD(si),
33338 : 0x85,
33339 : 0xfe,
33340 : xx,
33341 : yy,
33342 : 0x0001,
33343 : 0x003a,
33344 : 0x0080
33345 : );
33346 : }
33347 :
33348 : CHANGE_CURRENT_MAP_TO(bp20);
33349 :
33350 : _482b_05bf(1);
33351 :
33352 : return bp28;
33353 : }
33354 :
33355 :
33356 : ObjectID _1c9a_03cf(__int16 *xx, __int16 *yy, Bit16u ss)
33357 : {
33358 :
33359 :
33360 : __int16 bp0c = *xx;
33361 : __int16 di = *yy;
33362 : Bit16u bp10;
33363 : Bit16u bp12;
33364 :
33365 : _098d_000f(
33366 : bp0c,
33367 : di,
33368 : (ss == 255) ? 12 : (_4976_014c[ss]),
33369 : &bp10,
33370 : &bp12
33371 : );
33372 :
33373 : __int16 bp0e = 4;
33374 :
33375 : for (__int16 si=0; si <= bp0e; si++) {
33376 :
33377 : ObjectID bp06 = GET_CREATURE_AT(bp0c, di);
33378 :
33379 : if (bp06 != bp06.FFFF) {
33380 :
33381 : Creature *bp04 = GET_ADDRESS_OF_RECORD(bp06)->castToCreature();
33382 :
33383 : __int16 bp08 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType())->b35;
33384 :
33385 : Bit16u bp14;
33386 : Bit16u bp16;
33387 : _098d_000f(
33388 : bp0c,
33389 : di,
33390 : _32cb_0054(
33391 : bp04,
33392 : _4976_392c[bp04->b15_0_2()]
33393 : ),
33394 : &bp14,
33395 : &bp16
33396 : );
33397 :
33398 : bp14 -= bp10;
33399 : bp16 -= bp12;
33400 : __int16 bp0a = (bp14 * bp14) + (bp16 * bp16);
33401 :
33402 : if (_4976_3924[bp08] > bp0a) {
33403 :
33404 : *xx = bp0c;
33405 : *yy = di;
33406 :
33407 : return bp06;
33408 : }
33409 : }
33410 :
33411 : if (ss == 255) {
33412 :
33413 : bp0c = *xx + _4976_3914[si].w0;
33414 :
33415 : di = *yy + _4976_3914[si].w2;
33416 : }
33417 : else {
33418 :
33419 : bp0c = *xx + _4976_38f4[(ss << 1) + si].w0;
33420 :
33421 : di = *yy + _4976_38f4[(ss << 1) + si].w2;
33422 : }
33423 :
33424 : }
33425 :
33426 : return ObjectID::FFFF;
33427 : }
33428 :
33429 :
33430 : __int16 ABS16(__int16 val)
33431 : {
33432 :
33433 :
33434 : __int16 si = val;
33435 :
33436 : if (si < 0) {
33437 :
33438 : return -si;
33439 : }
33440 :
33441 : return si;
33442 : }
33443 :
33444 :
33445 : Bit16u CALC_VECTOR_DIR(__int16 x1, __int16 y1, __int16 x2, __int16 y2)
33446 : {
33447 :
33448 :
33449 :
33450 :
33451 :
33452 :
33453 :
33454 :
33455 :
33456 : __int16 di = x2;
33457 : __int16 si = y2;
33458 : x1 -= di;
33459 : di = ABS16(x1);
33460 :
33461 : y1 -= si;
33462 : si = ABS16(y1);
33463 :
33464 : if (di == si) {
33465 :
33466 : if (RAND01() != 0) {
33467 :
33468 : di++;
33469 : }
33470 : else {
33471 :
33472 : si++;
33473 : }
33474 : }
33475 :
33476 : if (di < si) {
33477 :
33478 : if (y1 > 0)
33479 :
33480 : return 0;
33481 :
33482 :
33483 : return 2;
33484 : }
33485 :
33486 : if (x1 > 0) {
33487 :
33488 : return 3;
33489 : }
33490 :
33491 : return 1;
33492 : }
33493 :
33494 :
33495 : Bit16u CALC_SQUARE_DISTANCE(__int16 x1, __int16 y1, __int16 x2, __int16 y2)
33496 : {
33497 :
33498 :
33499 : __int16 di = x1;
33500 : __int16 si = y1;
33501 :
33502 : di -= x2;
33503 : si -= y2;
33504 :
33505 : return ((di < 0) ? (-di) : di) + ((si < 0) ? (-si) : si);
33506 : }
33507 :
33508 :
33509 : Bit16u _4937_005c(Bit16u xx, Bit16u *yy)
33510 : {
33511 :
33512 :
33513 : Bit16u si;
33514 : if ((*yy & 0x4000) != 0) {
33515 :
33516 : si = 0;
33517 : }
33518 :
33519 : else if ((*yy & 0x8000) != 0) {
33520 :
33521 : Bit16u di;
33522 : if ((*yy & 0x1000) != 0) {
33523 :
33524 : *yy &= 0xe03f;
33525 : di = 0;
33526 : }
33527 : else {
33528 :
33529 : di = (*yy & 0x0fc0) >> 6;
33530 : }
33531 :
33532 : si = (_4976_4bec + di) / (*yy & 0x003f);
33533 : }
33534 : else {
33535 :
33536 : si = *yy & 0x003f;
33537 : }
33538 :
33539 : return xx + si;
33540 : }
33541 :
33542 :
33543 : sk5fde *_4937_0036(Bit16u xx, Bit16u *yy)
33544 : {
33545 :
33546 :
33547 : return &_4976_5fde[_4937_005c(xx, yy)];
33548 : }
33549 :
33550 :
33551 : Bit16u _1c9a_198e(ObjectID recordLink, Bit16u xx)
33552 : {
33553 :
33554 :
33555 : if (xx != 0) {
33556 :
33557 : Bit16u si = QUERY_CREATURE_AI_SPEC_FROM_RECORD(recordLink)->w24_8_b();
33558 :
33559 : if (si == 15) {
33560 :
33561 : return 0;
33562 : }
33563 :
33564 : return ((xx + RAND02()) << 3) / (si + 2);
33565 : }
33566 :
33567 : return 0;
33568 : }
33569 :
33570 :
33571 : void DEALLOC_RECORD(ObjectID recordLink)
33572 : {
33573 :
33574 :
33575 :
33576 :
33577 : GET_ADDRESS_OF_RECORD(recordLink)->w0 = ObjectID::FFFF;
33578 : }
33579 :
33580 :
33581 : Bit16u _075f_06bd(Missile *ref, ObjectID recordLink)
33582 : {
33583 :
33584 :
33585 : _4976_4b7c = 0;
33586 : _4976_4b7a = 3;
33587 :
33588 : Bit16u di = ref->EnergyRemaining();
33589 :
33590 : Bit16u si;
33591 : if (recordLink.DBType() != dbCloud) {
33592 :
33593 : Bit16u si = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 0x09);
33594 :
33595 : if (si != 0) {
33596 :
33597 : si += (di >> 1);
33598 :
33599 : Bit16u bp02 = ref->b5_4_7() +3;
33600 :
33601 : si = (bp02 * bp02 * si) >> 7;
33602 :
33603 : _4976_4b7a = 4;
33604 :
33605 : _4976_4b7c = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 0x0d);
33606 :
33607 : if (_4976_4b7c != 0) {
33608 :
33609 : if ((RAND() & 0x007f) > di) {
33610 :
33611 : _4976_4b7c -= RAND16((_4976_4b7c >> 1) + 1);
33612 : }
33613 : }
33614 : }
33615 :
33616 : si += RAND02();
33617 :
33618 : si += QUERY_ITEM_WEIGHT(recordLink);
33619 :
33620 : if ((RAND() & 0x01ff) < ref->EnergyRemaining2()) {
33621 :
33622 : si <<= 1;
33623 : }
33624 : }
33625 : else {
33626 :
33627 : if (recordLink == recordLink.FF81) {
33628 :
33629 : si = RAND() & 0x000f;
33630 :
33631 : _4976_4b7c = si + 10;
33632 :
33633 : si += RAND() & 0x001f;
33634 : }
33635 : else {
33636 :
33637 : if (recordLink >= recordLink.FF83) {
33638 :
33639 : _4976_4b7a = 5;
33640 :
33641 : if (recordLink == recordLink.FF86) {
33642 :
33643 : _4976_4b7c = di >> 1;
33644 :
33645 : return (di >> 4) + 1;
33646 : }
33647 :
33648 : return 0;
33649 : }
33650 :
33651 : _4976_4b7a = 1;
33652 :
33653 : si = (RAND() & 0x000f) + (RAND() & 0x000f) + 10;
33654 :
33655 : if (recordLink == recordLink.FF82) {
33656 :
33657 : _4976_4b7a = 7;
33658 :
33659 : si >>= 4;
33660 : si += di;
33661 : }
33662 : }
33663 : }
33664 :
33665 : si = ((si + di) >> 4) + 1;
33666 :
33667 : si += RAND16((si >> 1) + 1) + RAND02();
33668 :
33669 : si = max_value(si, si - 32 - ((ref->EnergyRemaining2() >> 3) << 1));
33670 :
33671 : si = min_value(si, di << 1);
33672 :
33673 : return si;
33674 : }
33675 :
33676 :
33677 : Bit16u _1c9a_0958(ObjectID recordLink)
33678 : {
33679 :
33680 :
33681 : Creature *bp04 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature();
33682 :
33683 : sk1c9a02c3 *bp08 = _1c9a_02c3(bp04, QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType()));
33684 :
33685 : sk5fde *bp0c = _4937_0036(bp08->w0, &bp08->w2);
33686 :
33687 : return (bp0c->w0 & 0x4000) >> 14;
33688 : }
33689 :
33690 :
33691 : Bit16u RAND01()
33692 : {
33693 :
33694 :
33695 :
33696 :
33697 : _4976_49ba = _4976_49ba * 0xbb40e62d + 11;
33698 :
33699 : return (_4976_49ba >> 8) & 1;
33700 : }
33701 :
33702 :
33703 : Bit16u _0cee_328c(Bit8u cls2)
33704 : {
33705 :
33706 :
33707 : return QUERY_GDAT_ENTRY_DATA_INDEX(0x0e, cls2, dtWordValue, 0x10);
33708 : }
33709 :
33710 :
33711 : Bit8u GET_GRAPHICS_FOR_DOOR(Door *ref)
33712 : {
33713 :
33714 :
33715 : if (ref->DoorType() == 0) {
33716 :
33717 : if (_4976_4d0a->b2_7_7() == 0)
33718 :
33719 : return 0xff;
33720 :
33721 : return _4976_4d0a->DoorType0();
33722 : }
33723 : else {
33724 :
33725 : if (_4976_4d0a->b3_0_0() == 0)
33726 :
33727 : return 0xff;
33728 :
33729 : return _4976_4d0a->DoorType1();
33730 : }
33731 : }
33732 :
33733 :
33734 : Bit16u _075f_0af9(__int16 ww, __int16 xpos, __int16 ypos, Bit16u ss, ObjectID recordLink)
33735 : {
33736 :
33737 :
33738 : Bit16u bp1c = 0;
33739 : Bit16u bp2a = 0;
33740 :
33741 : Missile *bp08 = GET_ADDRESS_OF_RECORD(recordLink)->castToMissile();
33742 :
33743 : ObjectID si = bp08->w2;
33744 :
33745 : Bit16u bp2c = si.DBType();
33746 :
33747 : Bit16u bp28;
33748 : ObjectID bp1e;
33749 : if (bp2c == dbPotion) {
33750 :
33751 : Potion *bp04 = GET_ADDRESS_OF_RECORD(si)->castToPotion();
33752 :
33753 : Bit16u bp20;
33754 : switch (bp04->PotionType()) {
33755 : case 0x03:
33756 :
33757 : bp20 = 0xff87;
33758 :
33759 :
33760 : bp2a = 1;
33761 :
33762 : bp28 = bp04->PotionPower();
33763 :
33764 : bp1e = si;
33765 : break;
33766 : case 0x13:
33767 :
33768 : bp20 = 0xff80;
33769 :
33770 : bp2a = 1;
33771 :
33772 : bp28 = bp04->PotionPower();
33773 :
33774 : bp1e = si;
33775 : break;
33776 : }
33777 : }
33778 :
33779 : Bit16u bp26 = (bp2c == dbCloud && si != si.FF81 && si != si.FF86) ? 1 : 0;
33780 :
33781 : ObjectID *bp10 = NULL;
33782 : Bit16u bp36 = 0;
33783 :
33784 : __int16 bp22;
33785 : __int16 bp24;
33786 : if (xpos <= 255) {
33787 :
33788 : bp22 = xpos;
33789 : bp24 = ypos;
33790 : }
33791 : else {
33792 :
33793 : bp22 = (xpos >> 8) -1;
33794 : bp24 = ypos >> 8;
33795 :
33796 : xpos &= 255;
33797 : ypos &= 255;
33798 : }
33799 :
33800 : __int16 bp30 = bp22;
33801 : __int16 bp38 = bp22;
33802 : __int16 bp32 = bp24;
33803 : __int16 bp3a = bp24;
33804 :
33805 : ObjectID bp20;
33806 : Bit16u bp16;
33807 : switch (ww) {
33808 : case 0:
33809 : {
33810 :
33811 : Bit16u di = _4976_5c20[bp08->TimerIndex()].b9_2_3();
33812 :
33813 : bp38 += _4976_0232[di];
33814 :
33815 : bp3a += _4976_023a[di];
33816 :
33817 : if (_075f_084d(bp38, bp3a, bp22, bp24, di, recordLink) == 0)
33818 : break;
33819 :
33820 : return 1;
33821 : }
33822 : case 4:
33823 : {
33824 :
33825 : __int16 bp12 = _4976_4c78[xpos][ypos] & 0x07;
33826 :
33827 : Door *bp1a = GET_ADDRESS_OF_TILE_RECORD((Bit8u)xpos, (Bit8u)ypos)->castToDoor();
33828 :
33829 : if (bp12 != 5 && (si == si.FF84 || si == si.FF8D)) {
33830 :
33831 : if (bp1a->Button() == 0 && bp1a->w2_d_d() == 0) {
33832 :
33833 : break;
33834 : }
33835 :
33836 : INVOKE_MESSAGE(
33837 : xpos,
33838 : ypos,
33839 : 0,
33840 : (si == si.FF84) ? 2 : 0,
33841 : _4976_4bec +1
33842 : );
33843 :
33844 : break;
33845 : }
33846 :
33847 : if (bp12 == 5 || bp12 <= 1)
33848 :
33849 :
33850 :
33851 : return 0;
33852 :
33853 :
33854 : if (_0cee_328c(GET_GRAPHICS_FOR_DOOR(bp1a)) != 0) {
33855 :
33856 : if (bp2c == 15) {
33857 :
33858 : if (((si >= si.FF83) ? 1 : 0) != 0) {
33859 :
33860 : return 0;
33861 : }
33862 : }
33863 :
33864 : if (((bp08->b5 < (RAND() & 0x007f)) && (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 2) != 0) ? 1 : 0) {
33865 :
33866 : return 0;
33867 : }
33868 : }
33869 :
33870 : Bit16u bp16 = _075f_06bd(bp08, si) +1;
33871 :
33872 : _075f_2205(xpos, ypos, bp16 + RAND16(bp16), 0, 0);
33873 :
33874 : break;
33875 : }
33876 : case -3:
33877 : case -2:
33878 : {
33879 :
33880 : __int16 bp12 = GET_PLAYER_AT_POSITION(ss);
33881 :
33882 : if (bp12 < 0) {
33883 :
33884 : if (ww == -3) {
33885 :
33886 : goto _0e37;
33887 : }
33888 :
33889 :
33890 : return 0;
33891 : }
33892 :
33893 : bp36 = 1;
33894 :
33895 : bp16 = _075f_06bd(bp08, si);
33896 :
33897 : if (bp16 != 0) {
33898 :
33899 : if ((((_4976_53b4[bp12].playerDir() == (_4976_5c20[bp08->TimerIndex()].b9_2_3() +2)) ? 1 : 0) & 3) != 0) {
33900 :
33901 : _4976_4b7a |= 0x8000;
33902 : }
33903 :
33904 : if (_2c1d_18aa(bp12, bp16, 0, _4976_4b7a) != 0 && _4976_4b7c != 0 && RAND01() != 0) {
33905 :
33906 : _2c1d_1b0f(bp12, _4976_4b7c);
33907 : }
33908 : }
33909 :
33910 : if (ww == -2) {
33911 :
33912 : break;
33913 : }
33914 :
33915 : goto _0e37;
33916 : }
33917 : case -1:
33918 : {
33919 :
33920 : _0e37:
33921 : bp38 = xpos;
33922 : bp3a = ypos;
33923 :
33924 : ObjectID bp2e = _1c9a_03cf(&bp38, &bp3a, ss);
33925 :
33926 : if (bp2e == -1) {
33927 :
33928 : if (ww == -3)
33929 :
33930 : break;
33931 :
33932 :
33933 : return 0;
33934 : }
33935 :
33936 : if (_1c9a_0958(bp2e) != 0) {
33937 :
33938 : if (ww == -3)
33939 :
33940 : break;
33941 :
33942 :
33943 : return 0;
33944 : }
33945 :
33946 : Creature *bp04 = GET_ADDRESS_OF_RECORD(bp2e)->castToCreature();
33947 :
33948 : sk03a2 *bp0c = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType());
33949 :
33950 : if ((bp0c->w0 & 0x0020) != 0 && si != si.FF83) {
33951 :
33952 : if (ww == -3)
33953 :
33954 : break;
33955 :
33956 :
33957 : return 0;
33958 : }
33959 :
33960 : if ((bp0c->w0 & 0x0001) == 0) {
33961 :
33962 : if (bp0c->b29 != 255) {
33963 :
33964 : goto _0f82;
33965 : }
33966 : else {
33967 :
33968 : goto _0f11;
33969 : }
33970 : }
33971 :
33972 : if ((bp0c->w30 & 0x0100) != 0 && si < si.FF80) {
33973 :
33974 :
33975 : if (ww == -3)
33976 :
33977 : break;
33978 :
33979 :
33980 : return 0;
33981 : }
33982 :
33983 : if (bp0c->w0_6_7() > 1) {
33984 :
33985 : if (ww == -3)
33986 :
33987 : break;
33988 :
33989 :
33990 : return 0;
33991 : }
33992 :
33993 : if ((bp0c->w30 & 0x0800) == 0) {
33994 :
33995 : _0f11:
33996 : Bit16u di = _4976_5c20[bp08->TimerIndex()].b9_2_3();
33997 :
33998 : di = (di +2) &3;
33999 :
34000 : bp30 += _4976_0232[di];
34001 :
34002 : bp32 += _4976_023a[di];
34003 :
34004 : Bit16u bp34 = recordLink.Dir();
34005 :
34006 : if ((di & 1) == (bp34 & 1)) {
34007 :
34008 : bp34--;
34009 : }
34010 : else {
34011 :
34012 : bp34++;
34013 : }
34014 :
34015 : recordLink.Dir(bp34);
34016 : }
34017 :
34018 : _0f82:
34019 : bp16 = (_075f_06bd(bp08, si) << 6) / bp0c->b2;
34020 :
34021 : if (bp16 != 0) {
34022 :
34023 : _13e4_0401(
34024 : bp2e,
34025 : bp38,
34026 : bp3a,
34027 : 0x200d,
34028 : 0x0064,
34029 : ((bp0c->w24 & 0x1000) != 0 && _4976_4b7a != 1) ? 0 : (bp16 + _1c9a_198e(bp2e, _4976_4b7c))
34030 : );
34031 :
34032 : if (bp26 == 0 && (bp0c->w0 & 0x0200) != 0) {
34033 :
34034 : if ((QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 0x0040) != 0) {
34035 :
34036 : bp10 = &bp04->w2;
34037 : }
34038 : }
34039 : }
34040 :
34041 : if (bp2a == 0 && bp2c != 5) {
34042 :
34043 : if (false
34044 : || bp2c != 15
34045 : || si == si.FF84
34046 : || (si >= si.FF89 && si <= si.FF8E)
34047 : ) {
34048 :
34049 :
34050 : bp36 = 1;
34051 : break;
34052 : }
34053 : }
34054 :
34055 : _13e4_0401(
34056 : bp2e,
34057 : bp38,
34058 : bp3a,
34059 : 2,
34060 : (bp16 < 5 && si != si.FF87) ? 30 : 95,
34061 : 0
34062 : );
34063 :
34064 : break;
34065 : }
34066 : case 1:
34067 : case 2:
34068 : case 3:
34069 :
34070 : break;
34071 : }
34072 :
34073 : if (ww == -3 && bp36 == 0) {
34074 :
34075 : return 0;
34076 : }
34077 :
34078 : if (bp26 == 0 && bp2a == 0 && si != si.FF86)
34079 :
34080 : goto _113b;
34081 :
34082 :
34083 : Bit16u bp14;
34084 : if (bp2a != 0) {
34085 :
34086 : bp14 = bp28;
34087 : DEALLOC_RECORD(bp1e);
34088 :
34089 : bp08->SetMissileObject(si = bp20);
34090 : }
34091 : else {
34092 :
34093 : bp14 = bp08->EnergyRemaining();
34094 :
34095 : if (si == si.FF86) {
34096 :
34097 : bp14 >>= 2;
34098 :
34099 : if (bp14 == 0)
34100 :
34101 : goto _113b;
34102 : }
34103 :
34104 : if (si == si.FF82) {
34105 :
34106 : }
34107 : }
34108 :
34109 : Bit16u di;
34110 : if (si == si.FF89 || si == si.FF8A) {
34111 :
34112 : di = _4976_5c20[bp08->TimerIndex()].b9_2_3();
34113 :
34114 : bp1c = bp08->EnergyRemaining();
34115 : }
34116 :
34117 : _075f_0255(
34118 : si,
34119 : bp14,
34120 : bp22,
34121 : bp24,
34122 : (si == si.FF87 || si == si.FF84 || si == si.FF8D) ? 255 : ss
34123 : );
34124 :
34125 : _113b:
34126 : CUT_RECORD_FROM(recordLink, NULL, bp22, bp24);
34127 :
34128 : DELETE_MISSILE_RECORD(recordLink, bp10, bp30, bp32);
34129 :
34130 : if (bp1c != 0) {
34131 :
34132 : _12b4_0d75(
34133 : xpos,
34134 : ypos,
34135 : (si == si.FF89) ? (di) : ((di+2) &3),
34136 : max_value(min_value(bp1c, 0xfe), 0x28)
34137 : );
34138 : }
34139 :
34140 : return 1;
34141 : }
34142 :
34143 :
34144 : void _2fcf_0234(__int16 xposFrom, __int16 yposFrom, __int16 xposTo, __int16 yposTo)
34145 : {
34146 :
34147 :
34148 : Bit16u bp04 = 0;
34149 :
34150 : Bit8u bp10[4];
34151 : ZERO_MEMORY(&bp10, 4);
34152 :
34153 : Bit16u bp02;
34154 : for (bp02=0; bp02 < 4; bp02++) {
34155 :
34156 : if (GET_PLAYER_AT_POSITION(bp02) >= 0) {
34157 :
34158 : bp10[bp02] = bp02 +1;
34159 : }
34160 :
34161 : }
34162 :
34163 : Bit8u bp0c[4];
34164 : if (xposTo >= 0 && CALC_SQUARE_DISTANCE(xposFrom, yposFrom, xposTo, yposTo) == 1) {
34165 :
34166 : bp02 = CALC_VECTOR_DIR(xposFrom, yposFrom, xposTo, yposTo);
34167 :
34168 : Bit16u di = (bp02 +1) & 3;
34169 :
34170 : ZERO_MEMORY(&bp0c, 4);
34171 :
34172 : if ((bp0c[(bp02 +3) &3] = bp10[bp02]) != 0) {
34173 :
34174 : bp04 = 1;
34175 : }
34176 :
34177 : if ((bp0c[(di +1) &3] = bp10[di]) != 0) {
34178 :
34179 : bp04 = 1;
34180 : }
34181 :
34182 : if (bp10[bp02] == 0) {
34183 :
34184 : bp10[bp02] = bp10[((bp02 +3) &3)];
34185 : }
34186 :
34187 : if (bp10[di] == 0) {
34188 :
34189 : bp10[di] = bp10[(di +1) &3];
34190 : }
34191 : }
34192 :
34193 : __int16 bp06 = xposFrom;
34194 : __int16 bp08 = yposFrom;
34195 :
34196 :
34197 : while (true) {
34198 :
34199 : _0368:
34200 : ObjectID si = GET_TILE_RECORD_LINK(bp06, bp08);
34201 :
34202 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
34203 :
34204 : if (si.DBType() == dbMissile) {
34205 :
34206 : if (_4976_5c20[GET_ADDRESS_OF_RECORD(si)->castToMissile()->TimerIndex()].TimerType() != 29) {
34207 :
34208 : bp02 = bp10[si.Dir()];
34209 :
34210 : if (bp02 != 0) {
34211 :
34212 : if (_075f_0af9(-3, xposFrom, yposFrom, bp02, si) != 0) {
34213 :
34214 : _075f_056c(si);
34215 :
34216 : goto _0368;
34217 : }
34218 : }
34219 : }
34220 : }
34221 :
34222 : }
34223 :
34224 : if (bp04 == 0) {
34225 :
34226 : break;
34227 : }
34228 :
34229 : xposFrom |= ((bp06 = xposTo) +1) << 8;
34230 :
34231 : yposFrom |= ((bp08 = yposTo)) << 8;
34232 :
34233 : COPY_MEMORY(bp0c, bp10, 4);
34234 :
34235 : bp04 = 0;
34236 :
34237 : continue;
34238 : }
34239 :
34240 : return;
34241 : }
34242 :
34243 :
34244 : void SET_MINION_RECENT_OPEN_DOOR_LOCATION(ObjectID recordLink, __int16 xpos, __int16 ypos, Bit16u curmap, Bit16u ww)
34245 : {
34246 :
34247 :
34248 : ObjectID si = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature()->w2;
34249 :
34250 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
34251 :
34252 : if (si.DBType() == dbMissile) {
34253 :
34254 : Missile *bp04 = GET_ADDRESS_OF_RECORD(si)->castToMissile();
34255 :
34256 : bp04->SetX(xpos);
34257 : bp04->SetY(ypos);
34258 : bp04->SetMap(curmap);
34259 : bp04->b6_0_0(ww);
34260 : }
34261 :
34262 : }
34263 :
34264 : return;
34265 : }
34266 :
34267 :
34268 : void _1c9a_0db0(ObjectID recordLink)
34269 : {
34270 :
34271 :
34272 : if (recordLink.DBType() == dbCreature) {
34273 :
34274 : Bit8u bp01 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature()->b5_0_7();
34275 :
34276 : if (bp01 != 0xff) {
34277 :
34278 : __int16 si = _4976_4ebe[bp01].w2;
34279 :
34280 : if (si >= 0) {
34281 :
34282 : _3a15_061a(si);
34283 :
34284 : _4976_4ebe[bp01].w2 = 0xffff;
34285 : }
34286 : }
34287 : }
34288 :
34289 : return;
34290 : }
34291 :
34292 :
34293 : Bit16u RAND16(Bit16u maxcnt)
34294 : {
34295 :
34296 :
34297 :
34298 :
34299 : if (maxcnt == 0)
34300 :
34301 : return 0;
34302 :
34303 : return RAND() % maxcnt;
34304 : }
34305 :
34306 :
34307 : Bit16u _0cee_2e1e(Bit16u recordLink)
34308 : {
34309 :
34310 :
34311 : return QUERY_CREATURE_AI_SPEC_FROM_RECORD(recordLink)->b29;
34312 : }
34313 :
34314 :
34315 : void _1c9a_0fcb(Bit16u xx)
34316 : {
34317 :
34318 :
34319 : Bit16u di = xx;
34320 :
34321 : if (di <= _4976_4ec2) {
34322 :
34323 : sk4ebe *bp04 = &_4976_4ebe[di];
34324 :
34325 : Bit16u si = 0x1000 | bp04->w0;
34326 :
34327 : Creature *bp08 = GET_ADDRESS_OF_RECORD(si)->castToCreature();
34328 :
34329 : _1c9a_0db0(si);
34330 :
34331 : _4976_1a68--;
34332 :
34333 : bp08->b5_0_7(0xff);
34334 : bp08->w0 = 0xffff;
34335 : }
34336 :
34337 : }
34338 :
34339 :
34340 : void LOAD_LOCALLEVEL_GRAPHICS_TABLE(Bit16u curmap)
34341 : {
34342 :
34343 :
34344 : CHANGE_CURRENT_MAP_TO(_4976_4bf4 = curmap);
34345 :
34346 : Bit8u *bp04 = (_4976_4cac = &_4976_4c78[_4976_4dd2 -1][_4976_4dd4]);
34347 :
34348 : Bit16u si = _4976_4d0a->WallGraphics();
34349 :
34350 : COPY_MEMORY(
34351 : bp04 += _4976_4d0a->CreaturesTypes(),
34352 : _4976_4dc2,
34353 : si
34354 : );
34355 :
34356 : Bit16u di = _4976_4d0a->FloorGraphics();
34357 :
34358 : COPY_MEMORY(
34359 : bp04 += si,
34360 : _4976_4cba,
34361 : di
34362 : );
34363 :
34364 : COPY_MEMORY(
34365 : bp04 += di,
34366 : _4976_4c60,
34367 : _4976_4d0a->DoorDecorationGraphics()
34368 : );
34369 :
34370 : return;
34371 : }
34372 :
34373 :
34374 : ObjectID GET_CREATURE_AT(__int16 xpos, __int16 ypos)
34375 : {
34376 :
34377 :
34378 :
34379 :
34380 :
34381 :
34382 : ObjectID si = GET_TILE_RECORD_LINK(xpos, ypos);
34383 :
34384 : for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
34385 :
34386 : if (si.DBType() == dbCreature)
34387 :
34388 : return si;
34389 :
34390 : }
34391 :
34392 : return si.FFFF;
34393 : }
34394 :
34395 :
34396 :
34397 : Bit16u IS_CREATURE_ALLOWED_ON_LEVEL(Bit16u recordLink, Bit16u curmap)
34398 : {
34399 :
34400 :
34401 : if ((_0cee_2de0(recordLink) & 0x4000) != 0) {
34402 :
34403 : return 1;
34404 : }
34405 :
34406 : Bit8u bp09 = QUERY_CLS2_FROM_RECORD(recordLink);
34407 :
34408 : Map_definitions *bp08 = &_4976_4dba[curmap];
34409 :
34410 : Bit8u *bp04 = &_4976_4ca8[curmap][bp08->RawColumn()][bp08->RawRow() +1];
34411 :
34412 : __int16 si = bp08->CreaturesTypes();
34413 :
34414 : for (; si > 0; --si) {
34415 :
34416 : if (*(bp04++) == bp09)
34417 : return 1;
34418 :
34419 : }
34420 :
34421 : return 0;
34422 :
34423 : }
34424 :
34425 :
34426 : Bit16u MOVE_RECORD_TO(ObjectID rlWhatYouMove, __int16 xposFrom, __int16 yposFrom, __int16 xposTo, __int16 yposTo)
34427 : {
34428 :
34429 :
34430 :
34431 :
34432 :
34433 :
34434 :
34435 :
34436 :
34437 :
34438 :
34439 :
34440 :
34441 :
34442 :
34443 :
34444 :
34445 :
34446 :
34447 :
34448 :
34449 :
34450 :
34451 :
34452 :
34453 :
34454 :
34455 :
34456 :
34457 :
34458 :
34459 :
34460 :
34461 :
34462 :
34463 : ObjectID si = rlWhatYouMove;
34464 : _4976_5822 = 0;
34465 : Bit16u bp10 = 0;
34466 : Bit16u bp12 = 0;
34467 : Bit16u bp08 = _4976_0c5a;
34468 : Bit16u bp0c = _4976_4bf6;
34469 : Bit16u bp1a = 0;
34470 :
34471 : Bit16u bp0a;
34472 : Bit16u bp0e;
34473 : GenericRecord *bp04;
34474 : if (si == si.FFFF) {
34475 :
34476 : _4976_4cb8 = 1;
34477 : bp0a = 0xffff;
34478 :
34479 : if (xposFrom >= 0) {
34480 :
34481 : _2fcf_0234(xposFrom, yposFrom, xposTo, yposTo);
34482 : }
34483 : }
34484 : else {
34485 :
34486 : bp0a = si.DBType();
34487 :
34488 : if (bp0a == dbCreature) {
34489 :
34490 : bp04 = GET_ADDRESS_OF_RECORD(si);
34491 : }
34492 :
34493 : bp0e = si.Dir();
34494 : }
34495 :
34496 : Bit16u bp1e;
34497 : Bit16u di;
34498 : if (xposTo < 0) {
34499 :
34500 : bp10 = _2fcf_0434(si, xposFrom, yposFrom, xposTo, yposTo, 1);
34501 :
34502 : if (bp10 != 0xffff) {
34503 :
34504 : if (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0xf8) != 0) {
34505 :
34506 : if (bp08 == _4976_4bf4 || _4976_581c == _4976_4bf4) {
34507 :
34508 : _4976_4cb8 = 1;
34509 : }
34510 : }
34511 :
34512 : si = si & 0x3fff | (_4976_5820 << 14);
34513 : }
34514 :
34515 : xposTo = _4976_5826;
34516 : yposTo = _4976_5828;
34517 : bp1e = _4976_581e;
34518 : di = _4976_581c;
34519 :
34520 : CHANGE_CURRENT_MAP_TO(di);
34521 :
34522 : if (bp0a == dbCreature && IS_CREATURE_ALLOWED_ON_LEVEL(si, di) == 0) {
34523 :
34524 : _1c9a_1374(si, xposTo, yposTo, 0, 1);
34525 :
34526 : CHANGE_CURRENT_MAP_TO(bp08);
34527 :
34528 : if (xposFrom >= 0) {
34529 :
34530 : DELETE_CREATURE_RECORD(xposFrom, yposFrom, 2, 0xffff);
34531 : }
34532 :
34533 : return 1;
34534 : }
34535 :
34536 : bp12 = (di == bp08 && xposTo == xposFrom && yposTo == yposFrom) ? 1 : 0;
34537 :
34538 : if (bp12 != 0) {
34539 :
34540 : if (si == 0xffff) {
34541 :
34542 : if (_4976_4bf6 == bp0c) {
34543 :
34544 : goto _1562;
34545 : }
34546 : }
34547 : else {
34548 :
34549 : if (_4976_5820 == bp0e && bp0a != dbMissile) {
34550 :
34551 : goto _1562;
34552 : }
34553 : }
34554 : }
34555 : else {
34556 :
34557 : if (di != bp08) {
34558 :
34559 : if (si == 0xffff && _4976_4bf4 != bp08) {
34560 :
34561 : LOAD_LOCALLEVEL_GRAPHICS_TABLE(bp08);
34562 : }
34563 : else {
34564 :
34565 : CHANGE_CURRENT_MAP_TO(bp08);
34566 : }
34567 : }
34568 : }
34569 : }
34570 :
34571 : if (xposFrom >= 0) {
34572 :
34573 : if (si == si.FFFF) {
34574 :
34575 : _2fcf_2444(xposFrom, yposFrom, -1, bp12, 0, 0);
34576 : }
34577 : else {
34578 :
34579 : if (bp10 != 0) {
34580 :
34581 : CUT_RECORD_FROM(si, NULL, xposFrom, yposFrom);
34582 : }
34583 : else {
34584 :
34585 : _2fcf_2444(
34586 : xposFrom,
34587 : yposFrom,
34588 : si,
34589 : (_4976_0c5a == _4976_4c28 && _4976_0c5a == _4976_4c2e && _4976_0c5a == _4976_4c30) ? 1 : 0,
34590 : 0,
34591 : (xposTo < 0 && yposTo < 0) ? 1 : 0
34592 : );
34593 : }
34594 :
34595 : if (bp0a == dbCreature && xposTo < -1) {
34596 :
34597 : Bit16u bp06 = bp04->castToCreature()->b5_0_7();
34598 :
34599 : if (bp06 != 255) {
34600 :
34601 : _1c9a_0fcb(bp06);
34602 : }
34603 : }
34604 : }
34605 : }
34606 :
34607 : __int16 bp16, bp18;
34608 : if (xposTo >= 0) {
34609 :
34610 : if (si == si.FFFF) {
34611 :
34612 : CHANGE_CURRENT_MAP_TO(di);
34613 :
34614 : _2fcf_0b8b(xposTo, yposTo, di);
34615 :
34616 : si = GET_CREATURE_AT(_4976_4bfa, _4976_4c06);
34617 :
34618 : if (si != si.FFFF) {
34619 :
34620 : Bit16u bp20 = _0cee_2de0(si);
34621 :
34622 : if ((bp20 & 0x8000) == 0) {
34623 :
34624 : if ((bp20 & 0x0001) != 0 && _0cee_2e1e(si) == 255) {
34625 :
34626 : if (_2fcf_0cdf(0xffff, xposTo, yposTo, &bp16, &bp18) != 0) {
34627 :
34628 : LOAD_LOCALLEVEL_GRAPHICS_TABLE(di);
34629 :
34630 : _4976_0230 = di;
34631 :
34632 : MOVE_RECORD_TO(0xffff, -1, 0, bp16, bp18);
34633 :
34634 : LOAD_LOCALLEVEL_GRAPHICS_TABLE(bp08);
34635 :
34636 : if (_4976_0230 == bp08) {
34637 :
34638 : _4976_0230 = 0xffff;
34639 :
34640 : goto _1183;
34641 : }
34642 : else {
34643 :
34644 : goto _1562;
34645 : }
34646 : }
34647 : else {
34648 :
34649 : goto _1151;
34650 : }
34651 : }
34652 :
34653 : if (_2fcf_0cdf(si, xposTo, yposTo, &bp16, &bp18) != 0) {
34654 :
34655 : bp1a = _2c1d_201d() >> 2;
34656 :
34657 : bp1a += RAND16((bp1a >> 1) +1);
34658 :
34659 : _13e4_0401(si, xposTo, yposTo, 0x2000, 0x0000, bp1a);
34660 :
34661 : MOVE_RECORD_TO(si, xposTo, yposTo, bp16, bp18);
34662 :
34663 : goto _1183;
34664 : }
34665 :
34666 : goto _1151;
34667 : }
34668 : }
34669 :
34670 : goto _1183;
34671 : }
34672 :
34673 : goto _11a3;
34674 : }
34675 :
34676 :
34677 : _1151:
34678 : _1c9a_0db0(si);
34679 :
34680 : if (MOVE_RECORD_TO(si, _4976_4bfa, _4976_4c06, -3, 0) == 0) {
34681 :
34682 : _2fcf_01c5(si, _4976_4bfa, _4976_4c06, di, 0);
34683 : }
34684 :
34685 :
34686 : _1183:
34687 : if (di == bp08) {
34688 :
34689 :
34690 :
34691 : _2fcf_2444(_4976_4bfa, _4976_4c06, 0xffff, bp12, 1, 0);
34692 : }
34693 : else {
34694 :
34695 : _4976_0230 = di;
34696 :
34697 : }
34698 : goto _1562;
34699 :
34700 :
34701 : _11a3:
34702 : if (bp0a == dbCreature) {
34703 :
34704 : CHANGE_CURRENT_MAP_TO(di);
34705 :
34706 : Bit16u bp06 = bp04->castToCreature()->b5_0_7();
34707 :
34708 : if (di == _4976_4c28 && xposTo == _4976_4c2e && yposTo == _4976_4c30) {
34709 :
34710 : if ((_0cee_2de0(si) & 0x8000) == 0) {
34711 :
34712 : if (_2fcf_0cdf(0xffff, xposTo, yposTo, &bp16, &bp18) != 0) {
34713 :
34714 : bp1a = (_0cee_2e1e(si) >> 3) + RAND16(10);
34715 :
34716 : _2c1d_1c0c(bp1a, 4, 2);
34717 :
34718 : QUEUE_NOISE_GEN2(0x16, 0xfe, 0x8a, 0xfe, xposTo, yposTo, 1, 100, 200);
34719 :
34720 : MOVE_RECORD_TO(0xffff, xposTo, yposTo, bp16, bp18);
34721 : }
34722 : else {
34723 :
34724 : goto _13a5;
34725 : }
34726 : }
34727 :
34728 : Bit16u bp1c = GET_CREATURE_AT(xposTo, yposTo);
34729 :
34730 : Bit16u bp22;
34731 : if (bp1c != 0xffff) {
34732 :
34733 : bp22 = _0cee_2e1e(si);
34734 :
34735 : Bit16u bp20 = _0cee_2de0(bp1c);
34736 :
34737 : if (_0cee_2de0(si) != 0 && bp22 == 255) {
34738 :
34739 : if ((bp20 & 0x0001) != 0) {
34740 :
34741 : if (_0cee_2e1e(bp1c) == 255) {
34742 :
34743 : goto _13a5;
34744 : }
34745 : }
34746 :
34747 : if (_2fcf_0cdf(bp1c, xposTo, yposTo, &bp16, &bp18) == 0) {
34748 :
34749 : _1c9a_0db0(si);
34750 :
34751 : _2fcf_01c5(si, xposTo, yposTo, di, 0);
34752 :
34753 : goto _1562;
34754 : }
34755 : else {
34756 :
34757 : goto _1359;
34758 : }
34759 : }
34760 :
34761 : if ((bp20 & 1) != 0 && _0cee_2e1e(bp1c) == 255) {
34762 :
34763 : if (_2fcf_0cdf(si, xposTo, yposTo, &bp16, &bp18) == 0)
34764 :
34765 : goto _13a5;
34766 :
34767 : MOVE_RECORD_TO(si, -1, 0, bp16, bp18);
34768 :
34769 : goto _1562;
34770 : }
34771 : else {
34772 :
34773 : if (_2fcf_0cdf(bp1c, xposTo, yposTo, &bp16, &bp18) == 0)
34774 :
34775 : goto _13a5;
34776 :
34777 : goto _1359;
34778 : }
34779 : }
34780 : else {
34781 :
34782 : goto _13ce;
34783 : }
34784 :
34785 :
34786 : _1359:
34787 : {
34788 : bp1a = bp22 >> 2;
34789 :
34790 : bp1a += RAND16((bp1a >> 1) +1);
34791 :
34792 : _13e4_0401(bp1c, xposTo, yposTo, 0x2000, 0, bp1a);
34793 :
34794 : MOVE_RECORD_TO(bp1c, xposTo, yposTo, bp16, bp18);
34795 :
34796 : goto _13ce;
34797 : }
34798 :
34799 :
34800 : _13a5:
34801 : {
34802 : if (bp06 != 255) {
34803 :
34804 : _1c9a_0fcb(bp06);
34805 : }
34806 :
34807 : _2fcf_01c5(si, xposTo, yposTo, di, _4976_5822);
34808 :
34809 : return 2;
34810 : }
34811 :
34812 :
34813 : _13ce:
34814 : {
34815 : if (bp10 != 0) {
34816 :
34817 : APPEND_RECORD_TO(si, NULL, xposTo, yposTo);
34818 : }
34819 : else {
34820 :
34821 : _2fcf_2444(xposTo, yposTo, si, 0, 0, 0);
34822 : }
34823 :
34824 : SET_MINION_RECENT_OPEN_DOOR_LOCATION(si, xposTo, yposTo, di, 0);
34825 :
34826 : if (bp06 == 255) {
34827 :
34828 : if ((_0cee_2de0(si) & 1) == 0) {
34829 :
34830 : _1c9a_0e14(si, xposTo, yposTo);
34831 :
34832 : }
34833 : }
34834 : else {
34835 :
34836 : bp06 = _4976_4ebe[bp06].w2;
34837 :
34838 : if (bp06 != 0xffff) {
34839 :
34840 : _4976_5c20[bp06].Xcoord((Bit8u)xposTo);
34841 :
34842 : _4976_5c20[bp06].Ycoord((Bit8u)yposTo);
34843 :
34844 : _4976_5c20[bp06].SetMap(di);
34845 :
34846 : }
34847 : }
34848 : goto _1562;
34849 : }
34850 : }
34851 : }
34852 : else {
34853 :
34854 : CHANGE_CURRENT_MAP_TO(di);
34855 :
34856 : if (bp0a == dbCloud) {
34857 :
34858 : APPEND_RECORD_TO(si, NULL, xposTo, yposTo);
34859 :
34860 : }
34861 : else {
34862 :
34863 : Bit16u bp14 = (xposFrom < 0 && yposFrom < 0) ? 1 : 0;
34864 :
34865 : if (bp14 == 0 && di != bp08) {
34866 :
34867 : Bit16u bp1c = GET_CREATURE_AT(xposTo, yposTo);
34868 :
34869 : if (bp1c != 0xffff) {
34870 :
34871 : bp14 = _0cee_2de0(bp1c) & 1;
34872 : }
34873 : }
34874 :
34875 : _2fcf_2444(
34876 : xposTo,
34877 : yposTo,
34878 : si,
34879 : (_4976_0c5a == _4976_4c28 && xposTo == _4976_4c2e && yposTo == _4976_4c30) ? 1 : 0,
34880 : 1,
34881 : bp14
34882 : );
34883 : }
34884 : }
34885 :
34886 : _1562:
34887 : _4976_581e = bp1e;
34888 : _4976_5826 = xposTo;
34889 : _4976_5828 = yposTo;
34890 : _4976_581c = di;
34891 :
34892 : CHANGE_CURRENT_MAP_TO(bp08);
34893 :
34894 : return 0;
34895 :
34896 : }
34897 :
34898 :
34899 : void _075f_056c(Bit16u recordLink);
34900 :
34901 :
34902 : void DELETE_MISSILE_RECORD(ObjectID rlMissile, ObjectID *prlDropTo, __int16 xposDropTo, __int16 yposDropTo)
34903 : {
34904 :
34905 :
34906 : ObjectID si = rlMissile;
34907 :
34908 : Missile *bp04 = GET_ADDRESS_OF_RECORDE(si);
34909 :
34910 : ObjectID di = bp04->GetMissileObject();
34911 :
34912 : if (di.DBType() != dbCloud) {
34913 :
34914 : if (prlDropTo != NULL) {
34915 :
34916 : APPEND_RECORD_TO(di, prlDropTo, -1, 0);
34917 : }
34918 : else {
34919 :
34920 : ObjectID bp06 = GET_CREATURE_AT(xposDropTo, yposDropTo);
34921 :
34922 : if (bp06 != bp06.FFFF && (_0cee_2de0(bp06) & 0x0001) != 0) {
34923 :
34924 : Bit16u bp08 = si.Dir();
34925 :
34926 : if ((QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp06)->w30 & 15) == 1) {
34927 :
34928 : bp08 = _4976_5c20[bp04->w6].b9_2_3();
34929 :
34930 : }
34931 : else {
34932 :
34933 : bp08 = si.Dir();
34934 : }
34935 :
34936 : MOVE_RECORD_TO(ObjectID(di, bp08), -2, -1, xposDropTo, yposDropTo);
34937 : }
34938 : else {
34939 :
34940 : MOVE_RECORD_TO(ObjectID(di, si.Dir()), -2, 0, xposDropTo, yposDropTo);
34941 : }
34942 : }
34943 :
34944 : QUEUE_NOISE_GEN2(
34945 : QUERY_CLS1_FROM_RECORD(si),
34946 : QUERY_CLS2_FROM_RECORD(si),
34947 : 0x85,
34948 : 0xfe,
34949 : xposDropTo,
34950 : yposDropTo,
34951 : 0x01,
34952 : 0x3a,
34953 : 0x80
34954 : );
34955 : }
34956 :
34957 : DEALLOC_RECORD(si);
34958 :
34959 : return;
34960 : }
34961 :
34962 :
34963 : Bit16u RECYCLE_A_RECORD_FROM_THE_WORLD(Bit16u itemdb, Bit8u itemtype)
34964 : {
34965 :
34966 :
34967 :
34968 :
34969 :
34970 :
34971 :
34972 :
34973 :
34974 :
34975 :
34976 : if (itemdb == dbCloud) {
34977 :
34978 : return 0xffff;
34979 : }
34980 :
34981 : Bit16u bp1a = _4976_0c5a;
34982 :
34983 : Bit16u di = (_4976_4c08 != 0) ? _4976_4c12 : 0xffff;
34984 :
34985 : Bit16u bp26 = 0;
34986 :
34987 : Bit16u bp0e;
34988 : Bit16u bp18;
34989 : bp0e = bp18 = _4976_4c42[itemdb];
34990 :
34991 : if (bp0e == _4976_4bf4 || bp0e == di) {
34992 :
34993 : if (di != 0xffff) {
34994 : do {
34995 :
34996 : if (_4976_4d0e->nMaps <= (++bp0e)) {
34997 :
34998 : bp0e = 0;
34999 : }
35000 :
35001 : if (bp0e == bp18) {
35002 :
35003 : bp0e = di;
35004 : di = 0xffff;
35005 : }
35006 :
35007 : } while (bp0e == di || bp0e == _4976_4bf4);
35008 : }
35009 : else {
35010 : do {
35011 :
35012 : if (_4976_4d0e->nMaps <= (++bp0e)) {
35013 :
35014 : bp0e = 0;
35015 : }
35016 :
35017 : } while (bp0e == _4976_4bf4);
35018 :
35019 : if (bp0e == bp18) {
35020 :
35021 : bp0e = _4976_4bf4;
35022 : }
35023 : }
35024 : }
35025 :
35026 : bp18 = bp0e;
35027 : Bit16u bp20 = 0;
35028 :
35029 : while (true) {
35030 :
35031 : Bit16u bp14 = _4976_4dba[bp0e].RawColumn();
35032 :
35033 : Bit16u bp16 = _4976_4dba[bp0e].RawRow();
35034 :
35035 : Bit8u *bp04 = *_4976_4ca8[bp0e];
35036 :
35037 : Bit16u *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[bp0e]]];
35038 :
35039 : for (Bit16u bp10=0; bp10 <= bp14; bp10++) {
35040 :
35041 : for (Bit16u bp12=0; bp12 <= bp16; bp12++) {
35042 :
35043 : if ((*(bp04++) & 0x10) != 0) {
35044 :
35045 : Bit8u bp27 = 0xff;
35046 :
35047 : Bit16u si = *(bp0c++);
35048 :
35049 : Bit16u bp24 = ((bp0e == _4976_4bf4) && (bp10 - _4976_4bfa + 5 <= 10) || (bp12 - _4976_4c06 + 5 <= 10)) ? 1 : 0;
35050 : Bit16u bp22;
35051 :
35052 :
35053 :
35054 :
35055 :
35056 : while (true) {
35057 :
35058 : Bit16u bp1c = (si & 0x3c00) >> 10;
35059 :
35060 : if (bp1c == dbActuator) {
35061 :
35062 : Actuator *bp08 = GET_ADDRESS_OF_RECORD(si)->castToActuator();
35063 :
35064 : Bit16u bp1e = bp08->ActuatorType();
35065 :
35066 : if (bp1e >= 0x2c || _4976_0c5e[bp1e] == 0) {
35067 :
35068 : if (bp26 != 0 && bp24 != 0 && bp1e == 0x30) {
35069 :
35070 : bp24 = 0;
35071 :
35072 : bp1e = bp08->ActuatorData();
35073 :
35074 : if (GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(bp1e) == itemdb) {
35075 :
35076 : bp27 = GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(bp1e);
35077 : }
35078 : }
35079 : goto _1314;
35080 : }
35081 : goto _1324;
35082 : }
35083 :
35084 : else if (bp1c == dbText) {
35085 :
35086 : Text *bp08 = GET_ADDRESS_OF_RECORD(si)->castToText();
35087 :
35088 : if (bp08->TextMode() != 1) {
35089 :
35090 : goto _1314;
35091 : }
35092 :
35093 : if (bp08->SimpleTextExtUsage() != 4) {
35094 :
35095 : goto _1314;
35096 : }
35097 :
35098 : goto _1324;
35099 : }
35100 :
35101 : else if (bp1c > dbActuator && bp24 != 0) {
35102 : goto _1314;
35103 : }
35104 :
35105 : else if (bp1c == itemdb) {
35106 :
35107 : GenericRecord *bp08 = GET_ADDRESS_OF_RECORD(si);
35108 :
35109 : switch (itemdb) {
35110 : case dbCreature:
35111 : {
35112 : Creature *_bp08 = bp08->castToCreature();
35113 :
35114 :
35115 :
35116 : if (_bp08->b15_2_2() != 0)
35117 : goto _1314;
35118 :
35119 : if (_bp08->w2 != 0xfffe)
35120 : goto _1314;
35121 :
35122 : if (itemtype != 0xff) {
35123 :
35124 : if (_bp08->CreatureType() != itemtype)
35125 : goto _1314;
35126 : }
35127 :
35128 : CHANGE_CURRENT_MAP_TO(bp0e);
35129 :
35130 : DELETE_CREATURE_RECORD(bp10, bp12, 1, 0xffff);
35131 :
35132 : break;
35133 : }
35134 : case dbMissile:
35135 : {
35136 : Missile *_bp08 = bp08->castToMissile();
35137 :
35138 :
35139 : if (itemtype != 0xff) {
35140 :
35141 : if (QUERY_CLS2_FROM_RECORD(_bp08->w2) != itemtype)
35142 : goto _1314;
35143 : }
35144 :
35145 : _075f_056c(si);
35146 :
35147 : CUT_RECORD_FROM(si, NULL, bp10, bp12);
35148 :
35149 : DELETE_MISSILE_RECORD(si, NULL, bp10, bp12);
35150 :
35151 : break;
35152 : }
35153 : case dbCloth:
35154 : {
35155 : Cloth *_bp08 = bp08->castToCloth();
35156 :
35157 :
35158 : if (_bp08->Important() != 0)
35159 : goto _1314;
35160 :
35161 :
35162 :
35163 : Bit16u bp1e = _bp08->ItemType();
35164 :
35165 : if (bp1e == bp27)
35166 : goto _1314;
35167 :
35168 : if (itemtype != 0xff && itemtype != bp1e)
35169 : goto _1314;
35170 :
35171 : CHANGE_CURRENT_MAP_TO(bp0e);
35172 :
35173 : MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35174 :
35175 : break;
35176 : }
35177 : case dbWeapon:
35178 : {
35179 : Weapon *_bp08 = bp08->castToWeapon();
35180 :
35181 :
35182 : if (_bp08->Important() != 0)
35183 : goto _1314;
35184 :
35185 :
35186 :
35187 :
35188 : Bit16u bp1e = _bp08->ItemType();
35189 :
35190 : if (bp1e == bp27)
35191 : goto _1314;
35192 :
35193 : if (itemtype != 0xff && itemtype != bp1e)
35194 : goto _1314;
35195 :
35196 : CHANGE_CURRENT_MAP_TO(bp0e);
35197 :
35198 : MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35199 :
35200 : }
35201 : case dbPotion:
35202 : {
35203 : Potion *_bp08 = bp08->castToPotion();
35204 :
35205 :
35206 : if (_bp08->VisiblePower() != 0)
35207 : goto _1314;
35208 :
35209 : Bit16u bp1e = _bp08->PotionType();
35210 :
35211 : if (bp1e == bp27)
35212 : goto _1314;
35213 :
35214 : if (itemtype != 0xff && itemtype != bp1e)
35215 : goto _1314;
35216 :
35217 : CHANGE_CURRENT_MAP_TO(bp0e);
35218 :
35219 : MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35220 :
35221 : }
35222 : case dbMiscellaneous_item:
35223 : {
35224 : Miscellaneous_item *_bp08 = bp08->castToMisc();
35225 :
35226 :
35227 : if (_bp08->Important() != 0)
35228 : goto _1314;
35229 :
35230 :
35231 :
35232 :
35233 : Bit16u bp1e = _bp08->ItemType();
35234 :
35235 : if (bp1e == bp27)
35236 : goto _1314;
35237 :
35238 : if (itemtype != 0xff && itemtype != bp1e)
35239 : goto _1314;
35240 :
35241 : CHANGE_CURRENT_MAP_TO(bp0e);
35242 :
35243 : MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35244 :
35245 : }
35246 : case dbScroll:
35247 : case dbContainer:
35248 : case db11:
35249 : case db12:
35250 : case db13:
35251 :
35252 : break;
35253 : }
35254 :
35255 : CHANGE_CURRENT_MAP_TO(bp1a);
35256 :
35257 : _4976_4c42[itemdb] = (Bit8u)bp0e;
35258 :
35259 : return si & 0x3fff;
35260 : }
35261 :
35262 : else if (bp1c == dbCreature && itemdb != dbMissile) {
35263 :
35264 : Creature *bp08 = GET_ADDRESS_OF_RECORD(si)->castToCreature();
35265 :
35266 : if (bp08->w2 == 0xfffe) {
35267 :
35268 : goto _1314;
35269 : }
35270 :
35271 : if ((QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp08->CreatureType())->w0 & 0x0001) == 0) {
35272 :
35273 : goto _1314;
35274 : }
35275 :
35276 : bp20 = 1;
35277 : bp22 = si;
35278 :
35279 : si = bp08->w2;
35280 :
35281 : continue;
35282 : }
35283 : else {
35284 : goto _1314;
35285 : }
35286 :
35287 :
35288 : _1314:
35289 : si = GET_NEXT_RECORD_LINK(si);
35290 :
35291 : if (si != 0xfffe)
35292 : continue;
35293 :
35294 : _1324:
35295 : if (bp20 == 0)
35296 : break;
35297 :
35298 : si = bp22;
35299 : bp20 = 0;
35300 : goto _1314;
35301 : }
35302 : }
35303 :
35304 : }
35305 :
35306 : }
35307 :
35308 : if (bp0e != _4976_4bf4 || _4976_4d0e->nMaps <= 1) {
35309 :
35310 : if (bp26 != 0) {
35311 :
35312 : _4976_4c42[itemdb] = (Bit8u)bp0e;
35313 :
35314 :
35315 : return 0xffff;
35316 : }
35317 :
35318 : bp26 = 1;
35319 :
35320 : continue;
35321 : }
35322 :
35323 : if (di != 0xffff) {
35324 : do {
35325 :
35326 : if (_4976_4d0e->nMaps <= (++bp0e)) {
35327 :
35328 : bp0e = 0;
35329 : }
35330 :
35331 : if (bp0e == bp18) {
35332 :
35333 : bp0e = di;
35334 : di = 0xffff;
35335 : }
35336 :
35337 : } while (bp0e == di || bp0e == _4976_4bf4);
35338 :
35339 : continue;
35340 : }
35341 : do {
35342 :
35343 : if (_4976_4d0e->nMaps <= (++bp0e)) {
35344 :
35345 : bp0e = 0;
35346 : }
35347 :
35348 : } while (bp0e == _4976_4bf4);
35349 :
35350 : if (bp0e != bp18)
35351 : continue;
35352 :
35353 : bp0e = _4976_4bf4;
35354 : }
35355 : }
35356 :
35357 :
35358 : ObjectID ALLOC_NEW_RECORD(Bit16u db)
35359 : {
35360 :
35361 : Bit16u si = db;
35362 : ObjectID di = ObjectID::FFFF;
35363 : Bit16u bp08 = _4976_4d0e->nRecords[(si & 0x7fff)];
35364 :
35365 : if (si == 0x800a) {
35366 :
35367 : si = 0x000a;
35368 : }
35369 : else {
35370 :
35371 : if (si == 0x000a) {
35372 :
35373 : bp08 -= 3;
35374 : }
35375 : }
35376 :
35377 : Bit16u bp06 = bp08;
35378 : Bit16u bp0a = _4976_0242[si];
35379 : Bit8u *bp04 = _4976_4cca[si];
35380 :
35381 : while (true) {
35382 :
35383 : if (reinterpret_cast<GenericRecord *>(bp04)->w0 == 0xffff) {
35384 :
35385 : di = ObjectID(0, si, bp08 - bp06);
35386 : }
35387 : else {
35388 :
35389 : if (bp06-- != 0) {
35390 :
35391 : bp04 += (bp0a >> 1) << 1;
35392 : continue;
35393 : }
35394 :
35395 : di = RECYCLE_A_RECORD_FROM_THE_WORLD(si, 0xff);
35396 :
35397 : if (di == di.FFFF) {
35398 :
35399 :
35400 : return ObjectID::FFFF;
35401 : }
35402 :
35403 : bp04 = (Bit8u *)GET_ADDRESS_OF_RECORD(di);
35404 : }
35405 :
35406 : ZERO_MEMORY(bp04, bp0a);
35407 :
35408 : reinterpret_cast<GenericRecord *>(bp04)->w0 = ObjectID::FFFE;
35409 :
35410 : if (si == dbContainer) {
35411 :
35412 : reinterpret_cast<Container *>(bp04)->w2 = ObjectID::FFFE;
35413 : }
35414 :
35415 : return di;
35416 : }
35417 : }
35418 :
35419 :