1 : 
    2 :   //^48AE:0281
    3 :   U16 _48ae_0281(U8 cls2, U8 cls3, U8 itemflags[64], U16 isCreature)
    4 :   {
    5 :     //^48AE:0281
    6 :     ENTER(142);
    7 :     //^48AE:0287
    8 :     ZERO_MEMORY(itemflags, 64);
    9 :     //^48AE:0299
   10 :     Bit8u bp008e[128];
   11 :     U8 *bp04 = QUERY_GDAT_TEXT(0x0f, cls2, cls3 +0x10, bp008e);
   12 :     //^48AE:02BB
   13 :     if (*bp04 == 0)
   14 :       //^48AE:02C3
   15 :       return 0;
   16 :     //^48AE:02C8
   17 :     i16 bp0a = 0;
   18 :     i16 di = -1;
   19 :     U16 si = -1;
   20 :     U16 bp0c = 0;
   21 :     U8 bp05;
   22 :     do {
   23 :       //^48AE:02D9
   24 :       bp05 = *(bp04++);
   25 :       //^48AE:02E5
   26 :       if (bp05 >= '0' && bp05 <='9') {
   27 :         //^48AE:02F1
   28 :         bp0a = bp0a * 10 +bp05 -'0';
   29 :         bp0c = 1;
   30 :         //^48AE:030B
   31 :         continue;
   32 :       }
   33 :       //^48AE:030E
   34 :       if (bp05 == '-') {
   35 :         //^48AE:0314
   36 :         di = bp0a;
   37 :         bp0a = 0;
   38 :         //^48AE:031C
   39 :         continue;
   40 :       }
   41 :       //^48AE:031F
   42 :       if (bp0c != 0) {
   43 :         //^48AE:0325
   44 :         if (di < 0)
   45 :           //^48AE:0329
   46 :           di = bp0a;
   47 : 
   48 :                 while (di <= bp0a) {
   49 :           //^48AE:032E
   50 :           i16 bp08 = di +si;
   51 :           //^48AE:0335
   52 :           itemflags[bp08 >> 3] = itemflags[bp08 >> 3] | (1 << (bp08 & 7));
   53 :           //^48AE:035A
   54 :           di++;
   55 :           //^48AE:035B
   56 :         }
   57 :         //^48AE:0360
   58 :         bp0a = 0;
   59 :         di = -1;
   60 :         si = -1;
   61 :         bp0c = 0;
   62 :       }
   63 :       //^48AE:0371
   64 :       U16 bp0e = bp05;
   65 :       //^48AE:0379
   66 :       switch (bp0e) {
   67 :         case 'W':
   68 :           //^48AE:0393
   69 :           //^48AE:03AA
   70 :           si = 0;
   71 :           //^48AE:03AC
   72 :           break;
   73 : 
   74 :         case 'A':
   75 :           //^48AE:0395
   76 :           si = 0x0080;
   77 :           //^48AE:0398
   78 :           break;
   79 : 
   80 :         case 'J':
   81 :           //^48AE:039A
   82 :           si = 0x0100;
   83 :           //^48AE:039D
   84 :           break;
   85 : 
   86 :         case 'P':
   87 :           //^48AE:039F
   88 :           si = 0x0180;
   89 :           //^48AE:03A2
   90 :           break;
   91 : 
   92 :         case 'C':
   93 :           //^48AE:03A4
   94 :           si = (isCreature != 0) ? 0 : 0x01e0;
   95 :           //^48AE:03B1
   96 :           break;
   97 : 
   98 :         case 'S':
   99 :           //^48AE:03B3
  100 :           si = 0x01fc;
  101 : 
  102 :           break;
  103 :       }
  104 :       //^48AE:03B6
  105 :     } while (bp05 != 0);
  106 : 
  107 :     //^48AE:03BF
  108 :     return 1;
  109 :   }
  110 : 
  111 :   //^47E1:0089
  112 :   void ZERO_MEMORY(void *buff, Bit32u size);
  113 : 
  114 :   //^3A15:320C
  115 :   void _3a15_320c(sk5c20 *v0, Bit16u v1); // TODO: Undefined
  116 : 
  117 :   //^0CEE:29EC
  118 :   Bit16u ADD_ITEM_CHARGE(Bit16u recordLink, __int16 delta);
  119 : 
  120 :   //^0CEE:26E5
  121 :   Bit16u IS_CONTAINER_MONEYBOX(ObjectID recordLink)
  122 :   {
  123 :     //^0CEE:26E5
  124 :     if (recordLink.DBType() == dbContainer) {
  125 :       //^0CEE:26F9
  126 :       if (GET_ADDRESS_OF_RECORD9(recordLink)->ContainerType() == 0) {
  127 :         //^0CEE:2710
  128 :         if (QUERY_GDAT_ENTRY_DATA_INDEX(0x14, QUERY_CLS2_FROM_RECORD(recordLink), 0x0005, 0x0040) != (Bit16u)-1) {
  129 :           // Exists possible item list? (e.g. "J26-28 J8 J56 J6<00>")
  130 :           return 1;
  131 :         }
  132 :       }
  133 :     }
  134 :     //^0CEE:272F
  135 :     return 0;
  136 :   }
  137 : 
  138 :   //^0CEE:25E5
  139 :   __int16 QUERY_GDAT_DBSPEC_WORD_VALUE(Bit16u recordLink, Bit8u cls4);
  140 : 
  141 :   //^0CEE:2ACC
  142 :   __int32 QUERY_ITEM_VALUE(Bit16u recordLink, Bit8u cls4)
  143 :   {
  144 :     //^0CEE:2ACC
  145 :     Bit16u si = recordLink;
  146 :     if (si == 0xffff) {
  147 :       //^0CEE:2ADA
  148 :       return 0;
  149 :     }
  150 :     //^0CEE:2AE1
  151 :     __int32 bp08 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, cls4);
  152 :     if (cls4 == 1) { // 0x01 -> Weight in Kg (x10)
  153 :       //^0CEE:2AFA
  154 :       __int32 bp0c = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x34); // 0x34 -> Max charge count
  155 :       //^0CEE:2B0B
  156 :       if (bp0c > 0) {
  157 :         //^0CEE:2B15
  158 :         bp08 += ADD_ITEM_CHARGE(si, 0) * bp0c;
  159 :       }
  160 :     }
  161 :     //^0CEE:2B34
  162 :     if (cls4 == 2) { // 0x02 -> Money value
  163 :       //^0CEE:2B3D
  164 :       __int32 bp0c = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x35); // 0x35 -> Additional money value per charge??
  165 :       //^0CEE:2B4E
  166 :       if (bp0c > 0) {
  167 :         //^0CEE:2B58
  168 :         bp08 += ADD_ITEM_CHARGE(si, 0) * bp0c;
  169 :       }
  170 :       //^0CEE:2B77
  171 :       if (((si & 0x3c00) >> 10) == dbPotion && bp08 > 1) {
  172 :         //^0CEE:2B92
  173 :         bp08 /= 2;
  174 :         //^0CEE:2BA2
  175 :         bp08 += (GET_ADDRESS_OF_RECORD(si)->castToPotion()->PotionPower() * bp08) / 255L;
  176 :       }
  177 :     }
  178 :     //^0CEE:2BD3
  179 :     if (((si & 0x3c00) >> 10) == dbContainer) {
  180 :       //^0CEE:2BE3
  181 :       Container *bp04 = GET_ADDRESS_OF_RECORD(si)->castToContainer();
  182 :       //^0CEE:2BEF
  183 :       if (bp04->ContainerType() == 0) {
  184 :         //^0CEE:2C02
  185 :         Bit16u di = IS_CONTAINER_MONEYBOX(si);
  186 :         Bit16u si = bp04->w2;
  187 :         __int32 bp0c = 0;
  188 :         //^0CEE:2C1B
  189 :         for (; si != 0xfffe; si = GET_NEXT_RECORD_LINK(si)) {
  190 :           //^0CEE:2C1D
  191 :           if (di != 0) {
  192 :             //^0CEE:2C21
  193 :             if (((si & 0x3c00) >> 10) == dbMiscellaneous_item) {
  194 :               //^0CEE:2C2E
  195 :               bp0c += QUERY_GDAT_DBSPEC_WORD_VALUE(si, cls4) * (GET_ADDRESS_OF_RECORD(si)->castToMisc()->Charge() +1L);
  196 :               continue;
  197 :             }
  198 :           }
  199 :           //^0CEE:2C65
  200 :           bp08 += QUERY_ITEM_VALUE(si, cls4);
  201 :           //^0CEE:2C76
  202 :         }
  203 :         //^0CEE:2C83
  204 :         if (di != 0) {
  205 :           //^0CEE:2C87
  206 :           if (cls4 == 1) {
  207 :             //^0CEE:2C8D
  208 :             bp08 += (bp0c +4L) / 5L;
  209 :           }
  210 :           else {
  211 :             //^0CEE:2CAC
  212 :             bp08 += bp0c;
  213 :           }
  214 :         }
  215 :       }
  216 :     }
  217 :     //^0CEE:2CB8
  218 :     return bp08;
  219 :   }
  220 : 
  221 :   //^0CEE:2CC2
  222 :   __int32 QUERY_ITEM_WEIGHT(ObjectID recordLink)
  223 :   {
  224 :     //^0CEE:2CC2
  225 :     return QUERY_ITEM_VALUE(recordLink, 1);
  226 :   }
  227 : 
  228 :   //^0CEE:2734
  229 :   Bit16u IS_CONTAINER_CHEST(ObjectID recordLink)
  230 :   {
  231 :     //^0CEE:2734
  232 :     ObjectID si = recordLink;
  233 :     //^0CEE:273B
  234 :     if (true
  235 :       && si.DBType() == dbContainer
  236 :       && IS_CONTAINER_MONEYBOX(si) == 0
  237 :       && GET_ADDRESS_OF_RECORD9(si)->ContainerType() == 0
  238 :     ) {
  239 :       //^0CEE:2769
  240 :       return 1;
  241 :     }
  242 :     //^0CEE:276E
  243 :     return 0;
  244 :   }
  245 : 
  246 :   //^2C1D:2076
  247 :   void CALC_PLAYER_WEIGHT(Bit16u player)
  248 :   {
  249 :     // updates player's weight. w253 doesn't contain weight of leader's hand possession.
  250 : 
  251 :     //^2C1D:2076
  252 :     Bit16u di=0;
  253 :     __int16 si=0;
  254 :     //^2C1D:207F
  255 :     for (; si < 30; si++) {
  256 :       //^2C1D:2081
  257 :       di += QUERY_ITEM_WEIGHT(_4976_53b4[player].w193[si]);
  258 :       //^2C1D:209D
  259 :     }
  260 :     //^2C1D:20A3
  261 :     if (_4976_5336 -1 == player && _4976_5354 < 2) {
  262 :       //^2C1D:20B3
  263 :       if (IS_CONTAINER_CHEST(_4976_3de6[player][_4976_5354]) != 0) {
  264 :         //^2C1D:20E3
  265 :         for (Bit16u si = 0; si < 8; si++) {
  266 :           //^2C1D:20D2
  267 :           di += QUERY_ITEM_WEIGHT(_4976_52c4[si]);
  268 :           //^2C1D:20E2
  269 :         }
  270 :       }
  271 :     }
  272 :     //^2C1D:20E8
  273 :     _4976_53b4[player].w253 = di;
  274 :     //^2C1D:20F6
  275 :     _4976_53b4[player].w50 |= 0x1000;
  276 :   }
  277 : 
  278 :   //^2066:2B6C
  279 :   void _2066_2b6c()
  280 :   {
  281 :     //^2066:2B6C
  282 :     sk5c20 *bp04 = _4976_5c20;
  283 :     //^2066:2B7F
  284 :     ZERO_MEMORY(&_4976_57e4, 6);
  285 :     //^2066:2B8F
  286 :     for (Bit16u di=0; di < _4976_5c14; bp04++, di++) {
  287 :       //^2066:2B94
  288 :       Bit16u si = bp04->b5;
  289 :       Bit16u bp08 = bp04->TimerType();
  290 :       //^2066:2BA8
  291 :       switch (bp08) {
  292 :         case 0x0E:
  293 :           {
  294 :             //^2066:2C60
  295 :             _3a15_320c(bp04, 3);
  296 :             break;
  297 :           }
  298 :         case 0x46:
  299 :           {
  300 :             //^2066:2C1A
  301 :             __int16 bp06 = bp04->w6;
  302 :             //^2066:2C24
  303 :             if (bp06 == 0 || bp06 < -15 || bp06 > 15)
  304 :               break;
  305 :             //^2066:2C34
  306 :             if (bp06 < 0) {
  307 :               //^2066:2C3A
  308 :               _4976_57e4.w0 += _4976_3d34[-bp06];
  309 :               break;
  310 :             }
  311 :             //^2066:2C4A
  312 :             _4976_57e4.w0 -= _4976_3d34[bp06] << 1;
  313 :             break;
  314 :           }
  315 :         case 0x47:
  316 :           {
  317 :             //^2066:2C5A
  318 :             _4976_57e6++;
  319 :             break;
  320 :           }
  321 :         case 0x48:
  322 :           {
  323 :             //^2066:2BD1
  324 :             for (__int16 bp06 = 0; bp06 < _4976_4c3c; bp06++) {
  325 :               //^2066:2BD8
  326 :               if ((si & (1 << bp06)) == 0)
  327 :                 continue;
  328 :               //^2066:2BE4
  329 :               if (_4976_53b4[bp06].curHP() == 0)
  330 :                 continue;
  331 :               //^2066:2BF5
  332 :               _4976_53b4[bp06].w257 += bp04->w6;
  333 :               //^2066:2C0C
  334 :             }
  335 :             break;
  336 :           }
  337 :         case 0x4B:
  338 :           {
  339 :             //^2066:2BC1
  340 :             _4976_53b4[si].b31++;
  341 :             break;
  342 :           }
  343 :       }
  344 :       //^2066:2C70
  345 :     }
  346 :     //^2066:2C7E
  347 :     for (Bit16u si=0; si < _4976_4c3c; si++) {
  348 :       //^2066:2C82
  349 :       CALC_PLAYER_WEIGHT(si);
  350 :       //^2066:2C89
  351 :     }
  352 :     //^2066:2C90
  353 :     return;
  354 :   }
  355 : 
  356 :   //^2066:1F37
  357 :   Bit16u _2066_1f37(ObjectID recordLink, Bit16u yy, Bit16u *zz)
  358 :   {
  359 :     //^2066:1F37
  360 :     ObjectID di = recordLink;
  361 :     //^2066:1F40
  362 :     Bit16u si = 0;
  363 :     //^2066:1F42
  364 :     while ((di = GET_NEXT_RECORD_LINK(di)) != di.FFFE) {
  365 :       //^2066:1F44
  366 :       if (di.DBType() == dbActuator) {
  367 :         //^2066:1F51
  368 :         Actuator *bp04 = GET_ADDRESS_OF_RECORD3(di);
  369 :         //^2066:1F5E
  370 :         if (bp04->ActuatorType() == 0x27) { // 0x27 -> Cross scene
  371 :           //^2066:1F6D
  372 :           si = 1;
  373 :           //^2066:1F70
  374 :           if (bp04->ActuatorData() == 0) {
  375 :             //^2066:1F7E
  376 :             bp04->ActuatorData(yy +1);
  377 :             //^2066:1F91
  378 :             (*zz)++;
  379 :           }
  380 :         }
  381 :       }
  382 :       //^2066:1F97
  383 :     }
  384 :     //^2066:1FA5
  385 :     return si;
  386 :   }
  387 : 
  388 :   //^0CEE:0B0D
  389 :   void APPEND_RECORD_TO(Bit16u recordLink_whatYouAppend, ObjectID *recordLink_newParent, __int16 xpos_newParent, __int16 ypos_newParent);
  390 : 
  391 :   //^2066:1EC9
  392 :   Bit16u _2066_1ec9(Bit16u link1Dst, Bit16u link2Src)
  393 :   {
  394 :     //^2066:1EC9
  395 :     Bit16u di = link1Dst;
  396 :     Bit16u si = link2Src;
  397 :     //^2066:1ED5
  398 :     if (di == 0xfffe)
  399 :       return si;
  400 :     //^2066:1EDE
  401 :     if (si == 0xfffe)
  402 :       return di;
  403 :     //^2066:1F09
  404 :     while (si != 0xfffe && ((si & 0x3c00) >> 10) < dbCreature) {
  405 :       //^2066:1EE5
  406 :       Bit16u bp06 = di;
  407 :       di = si;
  408 :       si = GET_NEXT_RECORD_LINK(si);
  409 :       GenericRecord *bp04 = GET_ADDRESS_OF_RECORD(di);
  410 :       //^2066:1F00
  411 :       bp04->w0 = bp06;
  412 :       //^2066:1F09
  413 :     }
  414 :     //^2066:1F1B
  415 :     APPEND_RECORD_TO(si, &GET_ADDRESS_OF_RECORD(di)->w0, -1, -1);
  416 :     //^2066:1F31
  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 :   //^0CEE:0A2F
  439 :   ObjectID GET_NEXT_RECORD_LINK(ObjectID record_link);
  440 :   //^0CEE:09DB
  441 :   GenericRecord *GET_ADDRESS_OF_RECORD(ObjectID record_link);
  442 :   //^0CEE:0002
  443 :   void CHANGE_CURRENT_MAP_TO(Bit16u new_map);
  444 :   //^0CEE:0AB5
  445 :   ObjectID GET_TILE_RECORD_LINK(int x_pos, int y_pos);
  446 :   //^0CEE:0A17
  447 :   GenericRecord *GET_ADDRESS_OF_TILE_RECORD(Bit8u x_pos, Bit8u y_pos);
  448 :   //^0CEE:0388
  449 :   Bit8u GET_TILE_VALUE(int x_pos, int y_pos);
  450 :   //^0CEE:2CFF
  451 :   sk03a2 *QUERY_CREATURE_AI_SPEC_FROM_TYPE(Bit8u creatureType);
  452 :   //^0CEE:2D36
  453 :   Bit16u QUERY_GDAT_CREATURE_WORD_VALUE(Bit8u creatureType, Bit8u cls4);
  454 : 
  455 :   //^2066:1EA3
  456 :   void _2066_1ea3(Bit16u xx, Bit16u yy, Bit16u zz)
  457 :   {
  458 :     //^2066:1EA3
  459 :     _4976_4ca8[zz][xx][yy] |= 0x02;
  460 :   }
  461 : 
  462 :   //^1C9A:02C3
  463 :   sk1c9a02c3 *_1c9a_02c3(Creature *xx, sk03a2 *yy)
  464 :   {
  465 :     //^1C9A:02C3
  466 :     if ((yy->w0 & 0x0001) != 0) {
  467 :       //^1C9A:02D0
  468 :       return reinterpret_cast<sk1c9a02c3 *>(PTR_ADD(xx,+8));
  469 :     }
  470 :     //^1C9A:02D8
  471 :     return reinterpret_cast<sk1c9a02c3 *>(PTR_ADD(&_4976_4ebe[xx->b5_0_7()],+8));
  472 :   }
  473 : 
  474 :   //^4937:01A9
  475 :   Bit16u _4937_01a9(Bit16u xx, Bit16u *yy, sk5fde **zz)
  476 :   {
  477 :     //^4937:01A9
  478 :     Bit16u si = yy[0];
  479 :     //^4937:01B7
  480 :     if (si == 0xffff) {
  481 :       //^4937:01BC
  482 :       si = 0;
  483 :     }
  484 :     else {
  485 :       //^4937:01C0
  486 :       Bit16u bp08 = _4976_5fde[xx + si].w2 & 0x000f;
  487 :       //^4937:01DA
  488 :       if (bp08 == 0)
  489 :         goto _0253;
  490 :       //^4937:01DE
  491 :       si += bp08;
  492 :     }
  493 :     //^4937:01E1
  494 :     sk5fde *bp04 = &_4976_5fde[xx + si];
  495 : 
  496 :     while (true) {
  497 :       //^4937:01FB
  498 :       if ((bp04->w2 & 0x000f) == 0)
  499 :         goto _0253;
  500 :       //^4937:0206
  501 :       Bit16u bp06 = (bp04->w2 >> 4) & 0x000f;
  502 :       //^4937:0216
  503 :       if (bp06 == 0x000f)
  504 :         break;
  505 :       //^4937:021B
  506 :       if ((RAND() & 0x000f) <= bp06)
  507 :         break;
  508 :       //^4937:0228
  509 :       si++;
  510 :       bp04++;
  511 :     }
  512 :     //^4937:022F
  513 :     Bit16u di;
  514 :     if (((bp04->b4 & 0x0007) + ((bp04->b4 >> 3) & 0x0003)) != 0) {
  515 :       //^4937:024E
  516 :       di = 1;
  517 :     }
  518 :     else {
  519 :       //^4937:0253
  520 : _0253:
  521 :       di = 0;
  522 :     }
  523 :     //^4937:0255
  524 :     *yy = si;
  525 :     //^4937:025D
  526 :     *zz = &_4976_5fde[xx + *yy];
  527 :     //^4937:0284
  528 :     return di;
  529 :   }
  530 : 
  531 :   //^3E74:2598
  532 :   void GRAPHICS_DATA_OPEN()
  533 :   {
  534 :     //^3E74:2598
  535 :     //^3E74:259B
  536 :     if ((_4976_5d10++) == 0) {
  537 :       //^3E74:25A6
  538 :       _4976_5c94 = FILE_OPEN(FORMAT_SKSTR(_4976_19c8, NULL));
  539 :       //^3E74:25C6
  540 :       if (_4976_5c94 < 0) {
  541 :         //^3E74:25CD
  542 :         RAISE_SYSERR(41);
  543 :       }
  544 :       //^3E74:25D5
  545 :       if (_4976_5c9c != 0 && _4976_5ca8 == 0) {
  546 :         //^3E74:25E3
  547 :         _4976_5c96 = FILE_OPEN(FORMAT_SKSTR(_4976_19cc, NULL));
  548 :         //^3E74:2603
  549 :         if (_4976_5c96 < 0) {
  550 :           //^3E74:260A
  551 :           RAISE_SYSERR(31);
  552 :         }
  553 :       }
  554 :     }
  555 :     //^3E74:2612
  556 :     return;
  557 :   }
  558 : 
  559 :   //^0CEE:0510
  560 :   Bit16u _0cee_0510(Bit16u curmap, Bit16u ww, __int16 *xx, __int16 *yy, Bit8u **ss)
  561 :   {
  562 :     //^0CEE:0510
  563 :     //^0CEE:0516
  564 :     Map_definitions *bp04 = &_4976_4dba[curmap];
  565 :     //^0CEE:052C
  566 :     __int16 bp0a = (*xx += bp04->MapOffsetX());
  567 :     //^0CEE:053E
  568 :     __int16 bp0c = (*yy += bp04->MapOffsetY());
  569 :     //^0CEE:0550
  570 :     __int16 bp16 = bp04->Level() + ww;
  571 :     //^0CEE:0560
  572 :     if (bp16 >= 0 && bp16 < 63) {
  573 :       //^0CEE:0572
  574 :       Bit16u bp14 = _4976_4cb0[bp16];
  575 :       //^0CEE:0581
  576 :       if (bp14 != 0xffff) {
  577 :         //^0CEE:0589
  578 :         Bit8u *bp08;
  579 :         if (ss != NULL && *ss != NULL) {
  580 :           //^0CEE:059D
  581 :           bp08 = *ss + 1;
  582 :         }
  583 :         else {
  584 :           //^0CEE:05AE
  585 :           bp08 = &_4976_4c72[bp14];
  586 :         }
  587 : 
  588 :         __int16 bp0e;
  589 :         for (; (bp0e = ((__int8)*bp08)) != -1; bp08++) {
  590 :           //^0CEE:05BA
  591 :           bp04 = &_4976_4dba[bp0e];
  592 :           //^0CEE:05D0
  593 :           __int16 di = bp04->MapOffsetX();
  594 :           //^0CEE:05DB
  595 :           if (di -1 <= bp0a) {
  596 :             //^0CEE:05E4
  597 :             if (di + bp04->RawColumn() + 1 >= bp0a) {
  598 :               //^0CEE:05FB
  599 :               __int16 si = bp04->MapOffsetY();
  600 :               //^0CEE:0603
  601 :               if (si -1 <= bp0c) {
  602 :                 //^0CEE:060C
  603 :                 if (si + bp04->RawRow() >= bp0c) {
  604 :                   //^0CEE:0623
  605 :                   di = bp0a - di;
  606 :                   si = bp0c - si;
  607 :                   //^0CEE:0631
  608 :                   Bit16u bp12 = _4976_0c5a;
  609 :                   //^0CEE:0637
  610 :                   CHANGE_CURRENT_MAP_TO(bp12);
  611 :                   //^0CEE:063F
  612 :                   Bit16u bp10 = GET_TILE_VALUE(di, si) >> 5;
  613 :                   //^0CEE:0651
  614 :                   if (bp10 == ttTeleporter) {
  615 :                     //^0CEE:0656
  616 :                     if (GET_ADDRESS_OF_TILE_RECORD((Bit8u)di, (Bit8u)si)->castToTeleporter()->w4_0_0() != 0) {
  617 :                       //^0CEE:066E
  618 :                       bp10 = 7;
  619 :                     }
  620 :                   }
  621 :                   //^0CEE:0673
  622 :                   CHANGE_CURRENT_MAP_TO(bp12);
  623 :                   //^0CEE:067B
  624 :                   if (bp10 != 7) {
  625 :                     //^0CEE:0681
  626 :                     *xx = di;
  627 :                     *yy = si;
  628 :                     //^0CEE:068D
  629 :                     if (ss != NULL) {
  630 :                       //^0CEE:0695
  631 :                       *ss = bp08;
  632 :                     }
  633 :                     //^0CEE:06A5
  634 :                     return bp0e;
  635 :                   }
  636 :                 }
  637 :               }
  638 :             }
  639 :           }
  640 :           //^0CEE:06AA
  641 :         }
  642 :       }
  643 :     }
  644 :     //^0CEE:06BF
  645 :     if (ss != NULL) {
  646 :       //^0CEE:06C7
  647 :       *ss = 0;
  648 :     }
  649 :     //^0CEE:06D5
  650 :     return 0xffff;
  651 :   }
  652 : 
  653 :   //^098D:0098
  654 :   SRECT *ALLOC_TEMP_RECT(__int16 x, __int16 y, __int16 cx, __int16 cy)
  655 :   {
  656 :     //^098D:0098
  657 :     //^098D:009C
  658 :     SRECT *bp04 = &_4976_4ba8[_4976_4ba6];
  659 :     //^098D:00AB
  660 :     _4976_4ba6++;
  661 :     //^098D:00B2
  662 :     if (_4976_4ba6 >= 4) {
  663 :       //^098D:00B7
  664 :       _4976_4ba6 = 0;
  665 :     }
  666 :     //^098D:00BD
  667 :     bp04->x = x;
  668 :     bp04->y = y;
  669 :     bp04->cx = cx;
  670 :     bp04->cy = cy;
  671 :     //^098D:00DB
  672 :     return bp04;
  673 :   }
  674 : 
  675 :   //^098D:00E3
  676 :   SRECT *ALLOC_TEMP_ORIGIN_RECT(Bit16u width, Bit16u height)
  677 :   {
  678 :     //^098D:00E3
  679 :     //^098D:00E6
  680 :     return ALLOC_TEMP_RECT(0, 0, width, height);
  681 :   }
  682 : 
  683 :   //^3E74:5420
  684 :   Bit16u _3e74_5420(Bit32u xx, Bit16u *yy)
  685 :   {
  686 :     //^3E74:5420
  687 :     //^3E74:5426
  688 :     Bit16u di = 0xffff;
  689 :     Bit16u cx = _4976_5c92;
  690 : 
  691 :     while (true) {
  692 :       //^3E74:542E
  693 :       Bit16u si = (di + cx) >> 1;
  694 :       //^3E74:5436
  695 :       if (si == di) {
  696 :         //^3E74:543A
  697 :         *yy = si +1;
  698 :         //^3E74:5441
  699 :         return 0;
  700 :       }
  701 :       //^3E74:5445
  702 :       Bit32u bp04 = _4976_5c86[_4976_5c7e[si]];
  703 :       //^3E74:5468
  704 :       if (xx < bp04) {
  705 :         //^3E74:547A
  706 :         cx = si;
  707 :         //^3E74:5478
  708 :         continue;
  709 :       }
  710 :       //^3E74:547E
  711 :       if (xx > bp04) {
  712 :         //^3E74:5490
  713 :         di = si;
  714 :         //^3E74:5492
  715 :         continue;
  716 :       }
  717 :       //^3E74:5494
  718 :       *yy = si;
  719 :       //^3E74:549A
  720 :       return 1;
  721 :     }
  722 :   }
  723 : 
  724 :   //^3E74:4701
  725 :   void _3e74_4701(Bit16u xx, Bit16u yy)
  726 :   {
  727 :     //^3E74:4701
  728 :     //^3E74:4707
  729 :     Bit16u di = xx;
  730 :     //^3E74:470C
  731 :     mement *bp04 = _4976_5ca4[di];
  732 :     //^3E74:4722
  733 :     if (bp04->w4 != 0xffff) {
  734 :       //^3E74:472C
  735 :       _3e74_48c9(di);
  736 :       //^3E74:4733
  737 :       return;
  738 :     }
  739 :     //^3E74:4736
  740 :     mement *bp0c;
  741 :     mement *bp10;
  742 :     if (yy != 0) {
  743 :       //^3E74:473C
  744 :       bp04->w4 = 0xffff;
  745 :       bp0c = _4976_5c8c;
  746 : 
  747 :       //^3E74:4752
  748 :       //^3E74:4786
  749 :       bp10 = _4976_5d70;
  750 :     }
  751 :     else {
  752 :       //^3E74:4754
  753 :       bp04->w4 = 1;
  754 :       //^3E74:475D
  755 :       bp0c = _4976_5d90;
  756 :       //^3E74:476A
  757 :       bp10 = _4976_5c8c;
  758 :       if (bp10 == NULL) {
  759 :         //^3E74:4786
  760 :         bp10 = _4976_5d70;
  761 :       }
  762 :     }
  763 : 
  764 :     //^3E74:4793
  765 :     if (bp0c != NULL) {
  766 :       //^3E74:47A4
  767 :       goto _483a;
  768 :     }
  769 :     //^3E74:47A7
  770 :     if (_4976_5d70 == NULL) {
  771 :       //^3E74:47B9
  772 :       bp04->w6 = 0xffff;
  773 :       _4976_5d5e = bp04;
  774 :       //^3E74:47CF
  775 :       goto _4822;
  776 :     }
  777 :     //^3E74:47D1
  778 :     if (_4976_5d90 == NULL) {
  779 :       //^3E74:47E3
  780 :       if (_4976_5c8c != NULL) {
  781 :         //^3E74:47F5
  782 :         bp0c = bp10;
  783 :         //^3E74:4801
  784 :         goto _483a;
  785 :       }
  786 :     }
  787 :     //^3E74:4803
  788 :     bp10->w8 = di;
  789 :     Bit16u bp12 = bp10->w10;
  790 :     //^3E74:4811
  791 :     Bit16u si = _3e74_0c62(bp12);
  792 :     //^3E74:481B
  793 :     bp04->w6 = si;
  794 :     //^3E74:4822
  795 : _4822:
  796 :     bp04->w8 = 0xffff;
  797 :     _4976_5d70 = bp04;
  798 :     //^3E74:4838
  799 :     goto _48a3;
  800 : 
  801 :     //^3E74:483A
  802 : _483a:
  803 :     si = bp0c->w6;
  804 :     bp0c->w6 = di;
  805 :     bp04->w6 = si;
  806 :     //^3E74:484C
  807 :     if (si != 0xffff) {
  808 :       //^3E74:4851
  809 :       mement *bp08 = _4976_5ca4[si];
  810 :       //^3E74:4869
  811 :       bp04->w8 = bp08->w8;
  812 :       //^3E74:4877
  813 :       bp08->w8 = di;
  814 :       //^3E74:487E
  815 :       goto _48a3;
  816 :     }
  817 :     //^3E74:4880
  818 :     Bit16u bp14 = _3e74_0c62(bp0c->w10);
  819 :     //^3E74:488F
  820 :     bp04->w8 = bp14;
  821 :     //^3E74:4896
  822 :     _4976_5d5e = bp04;
  823 : 
  824 :     //^3E74:48A3
  825 : _48a3:
  826 :     if (yy != 0) {
  827 :       //^3E74:48A9
  828 :       _4976_5c8c = bp04;
  829 :     }
  830 :     else {
  831 :       //^3E74:48B8
  832 :       _4976_5d90 = bp04;
  833 :     }
  834 :     //^3E74:48C5
  835 :     return;
  836 :   }
  837 : 
  838 :   //^3E74:48C9
  839 :   mement *_3e74_48c9(Bit16u xx)
  840 :   {
  841 :     //^3E74:48C9
  842 :     //^3E74:48CF
  843 :     mement *bp04 = _4976_5ca4[xx];
  844 :     //^3E74:48E8
  845 :     Bit16u si = bp04->w4;
  846 :     //^3E74:48EF
  847 :     if (si == 0xffff || si == 0xfffe) {
  848 :       //^3E74:48F9
  849 :       return bp04;
  850 :     }
  851 :     //^3E74:4902
  852 :     mement *bp0c = bp04;
  853 :     //^3E74:490E
  854 :     if (si == 0) {
  855 :       //^3E74:4915
  856 :       Bit16u di = bp04->w8;
  857 :       //^3E74:491E
  858 :       if (di == 0xffff) {
  859 :         //^3E74:4923
  860 :         _4976_5d90 = (bp04 != _4976_5c8c) ? bp04 : NULL;
  861 :         //^3E74:494B
  862 :         bp04->w4 = 1;
  863 :         //^3E74:4954
  864 :         //^3E74:48F9
  865 :         return bp04;
  866 :       }
  867 :       //^3E74:4956
  868 :       mement *bp08 = _4976_5ca4[di];
  869 :       //^3E74:496E
  870 :       Bit16u bp0e = bp04->w6;
  871 :       //^3E74:4978
  872 :       if (bp0e == 0xffff) {
  873 :         //^3E74:497D
  874 :         _4976_5d5e = bp08;
  875 :       }
  876 :       else {
  877 :         //^3E74:498C
  878 :         bp04 = _4976_5ca4[bp0e];
  879 :         //^3E74:49A5
  880 :         bp04->w8 = di;
  881 :       }
  882 :       //^3E74:49AC
  883 :       bp08->w6 = bp0e;
  884 :       //^3E74:49B6
  885 :       bp0c->w4 = 0xffff;
  886 :       //^3E74:49BF
  887 :       _3e74_4701(xx, 0);
  888 :       //^3E74:49CA
  889 :       return bp0c;
  890 :     }
  891 :     else {
  892 :       //^3E74:49CD
  893 :       if (si < 0xfffd) {
  894 :         //^3E74:49D2
  895 :         si++;
  896 :       }
  897 :       //^3E74:49D3
  898 :       bp04->w4 = si;
  899 :       //^3E74:49DA
  900 :       if (bp04 == _4976_5d70) {
  901 :         //^3E74:49EF
  902 :         //^3E74:48F9
  903 :         return bp04;
  904 :       }
  905 :       //^3E74:49F2
  906 :       Bit16u di = bp04->w8;
  907 :       //^3E74:49FB
  908 :       mement *bp08 = _4976_5ca4[di];
  909 :       //^3E74:4A11
  910 :       if (bp08->w4 >= si) {
  911 :         //^3E74:4A1A
  912 :         //^3E74:48F9
  913 :         return bp04;
  914 :       }
  915 :       //^3E74:4A1D
  916 :       Bit16u bp0e = bp04->w6;
  917 :       //^3E74:4A27
  918 :       if (bp0e == 0xffff) {
  919 :         //^3E74:4A2C
  920 :         _4976_5d90 = bp08;
  921 :         _4976_5d5e = bp08;
  922 :         //^3E74:4A40
  923 :         bp08->w6 = 0xffff;
  924 :       }
  925 :       else {
  926 :         //^3E74:4A4B
  927 :         if (bp04 == _4976_5d90) {
  928 :           //^3E74:4A5F
  929 :           _4976_5d90 = bp08;
  930 :         }
  931 :         //^3E74:4A6C
  932 :         bp04 = _4976_5ca4[bp0e];
  933 :         //^3E74:4A85
  934 :         bp04->w8 = di;
  935 :         bp04->w6 = bp0e;
  936 :       }
  937 :       //^3E74:4A96
  938 :       if (_4976_5d90 == _4976_5c8c) {
  939 :         //^3E74:4AAC
  940 :         _4976_5d90 = NULL;
  941 :       }
  942 : 
  943 :       while (true) {
  944 :         //^3E74:4AB8
  945 :         bp04 = bp08;
  946 :         bp0e = di;
  947 :         di = bp04->w8;
  948 :         //^3E74:4AD0
  949 :         if (di == 0xffff) {
  950 :           //^3E74:4AD5
  951 :           bp04->w8 = xx;
  952 :           //^3E74:4ADC
  953 :           bp0c->w6 = bp0e;
  954 :           bp0c->w8 = 0xffff;
  955 :           //^3E74:4AEC
  956 :           _4976_5d70 = bp0c;
  957 :         }
  958 :         else {
  959 :           //^3E74:4AFB
  960 :           bp08 = _4976_5ca4[di];
  961 :           //^3E74:4B13
  962 :           if (bp08->w4 < si)
  963 :             //^3E74:4B1A
  964 :             continue;
  965 :           //^3E74:4B1C
  966 :           bp04->w8 = xx;
  967 :           bp0c->w6 = bp0e;
  968 :           bp0c->w8 = di;
  969 :           bp08->w6 = xx;
  970 :         }
  971 :         //^3E74:4B3E
  972 :         return bp0c;
  973 :       }
  974 :     }
  975 :   }
  976 : 
  977 :   //^3E74:5561
  978 :   void _3e74_5561(Bit16u xx)
  979 :   {
  980 :     //^3E74:5561
  981 :     //^3E74:5566
  982 :         __int16 si = xx;
  983 :     //^3E74:5569
  984 :     if (_4976_5d36 == -1 || _4976_5d36 > si) {
  985 :       //^3E74:5576
  986 :       _4976_5d36 = si;
  987 :     }
  988 :     //^3E74:557A
  989 :     Bit32u bp04 = _4976_5c86[si];
  990 :     //^3E74:5592
  991 :     Bit16u bp06;
  992 :     if (_3e74_5420(bp04, &bp06) != 0) {
  993 :       //^3E74:55A8
  994 :       _4976_5c86[si] = NULL;
  995 :       //^3E74:55BE
  996 :       _4976_5c92--;
  997 :       //^3E74:55C2
  998 :       COPY_MEMORY(
  999 :         &_4976_5c7e[bp06 +1],
 1000 :         &_4976_5c7e[bp06],
 1001 :         (_4976_5c92 -bp06) << 1
 1002 :         );
 1003 :     }
 1004 :     //^3E74:55F6
 1005 :     return;
 1006 :   }
 1007 : 
 1008 :   //^3E74:4549
 1009 :   void _3e74_4549(Bit16u xx)
 1010 :   {
 1011 :     //^3E74:4549
 1012 :     //^3E74:454F
 1013 :     mement *bp04 = _4976_5ca4[xx];
 1014 :     //^3E74:4568
 1015 :     if (bp04 != NULL) {
 1016 :       //^3E74:457C
 1017 :       if (bp04->w4 != 0xffff) {
 1018 :         //^3E74:4589
 1019 :         Bit16u di = bp04->w6;
 1020 :         Bit16u si = bp04->w8;
 1021 :         mement *bp08;
 1022 :         //^3E74:4594
 1023 :         if (di == 0xffff) {
 1024 :           //^3E74:4599
 1025 :           if (si == 0xffff) {
 1026 :             //^3E74:459E
 1027 :             _4976_5d90 = NULL;
 1028 :             _4976_5c8c = NULL;
 1029 :             _4976_5d70 = NULL;
 1030 :             _4976_5d5e = NULL;
 1031 :           }
 1032 :           else {
 1033 :             //^3E74:45C1
 1034 :             bp08 = _4976_5ca4[si];
 1035 :             //^3E74:45D9
 1036 :             _4976_5d5e = bp08;
 1037 :             //^3E74:45E0
 1038 :             bp08->w6 = 0xffff;
 1039 :             //^3E74:45E9
 1040 :             goto _4682;
 1041 :           }
 1042 :         }
 1043 :         else {
 1044 :           //^3E74:45EC
 1045 :           bp08 = _4976_5ca4[di];
 1046 :           //^3E74:4604
 1047 :           bp08->w8 = si;
 1048 :           //^3E74:460B
 1049 :           if (si == 0xffff) {
 1050 :             //^3E74:4610
 1051 :             if (bp04 == _4976_5c8c) {
 1052 :               //^3E74:4625
 1053 :               _4976_5c8c = NULL;
 1054 :             }
 1055 :             else {
 1056 :               //^3E74:4633
 1057 :               if (bp04 == _4976_5d90) {
 1058 :                 //^3E74:4648
 1059 :                 _4976_5d90 = NULL;
 1060 :               }
 1061 :             }
 1062 :             //^3E74:4654
 1063 :             _4976_5d70 = bp08;
 1064 :           }
 1065 :           else {
 1066 :             //^3E74:4663
 1067 :             bp08 = _4976_5ca4[si];
 1068 :             //^3E74:467B
 1069 :             bp08->w6 = di;
 1070 :           }
 1071 :           //^3E74:4682
 1072 : _4682:
 1073 :           if (bp04 == _4976_5d90) {
 1074 :             //^3E74:4696
 1075 :             if (bp08 == _4976_5c8c) {
 1076 :               //^3E74:46AB
 1077 :               _4976_5d90 = NULL;
 1078 :             }
 1079 :             else {
 1080 :               //^3E74:46B9
 1081 :               _4976_5d90 = bp08;
 1082 :             }
 1083 :           }
 1084 :           else {
 1085 :             //^3E74:46C8
 1086 :             if (_4976_5c8c == bp04) {
 1087 :               //^3E74:46DC
 1088 :               _4976_5c8c = bp08;
 1089 :             }
 1090 :           }
 1091 :         }
 1092 :       }
 1093 :     }
 1094 :     //^3E74:46E9
 1095 :     bp04->w6 = 0xffff;
 1096 :     bp04->w8 = 0xffff;
 1097 :     bp04->w4 = 0xffff;
 1098 :     //^3E74:46FD
 1099 :     return;
 1100 :   }
 1101 : 
 1102 :   //^3E74:0C8C
 1103 :   void _3e74_0c8c(mement *ref_)
 1104 :   {
 1105 :     mement *ref = reinterpret_cast<mement *>(ref_);
 1106 : 
 1107 :     //^3E74:0C8C
 1108 :     //^3E74:0C90
 1109 :     mement *bp08 = ref->pv4();
 1110 :     mement *bp04 = ref->pv8();
 1111 :     //^3E74:0CAF
 1112 :     if (bp08 == NULL) {
 1113 :       //^3E74:0CC0
 1114 :       if (bp04 == NULL) {
 1115 :         //^3E74:0CD1
 1116 :         _4976_5d94 = NULL;
 1117 :       }
 1118 :       else {
 1119 :         //^3E74:0CDF
 1120 :         _4976_5d94 = bp04;
 1121 :         //^3E74:0CEC
 1122 :         bp04->pv4(NULL);
 1123 :       }
 1124 :     }
 1125 :     else {
 1126 :       //^3E74:0CFD
 1127 :       bp08->pv8(bp04);
 1128 :       //^3E74:0D0E
 1129 :       if (bp04 != NULL) {
 1130 :         //^3E74:0D1F
 1131 :         bp04->pv4(bp08);
 1132 :       }
 1133 :     }
 1134 :     //^3E74:0D30
 1135 :   }
 1136 : 
 1137 :   //^3E74:0D32
 1138 :   void _3e74_0d32(mement *ref_)
 1139 :   {
 1140 :     mement *ref = reinterpret_cast<mement *>(ref_);
 1141 : 
 1142 :     //^3E74:0D32
 1143 :     //^3E74:0D37
 1144 :     mement *bp04 = ref;
 1145 :     //^3E74:0D43
 1146 :     if (_4976_5d94 == NULL) {
 1147 :       //^3E74:0D55
 1148 :       _4976_5d94 = bp04;
 1149 :       //^3E74:0D62
 1150 :       bp04->pv8(NULL);
 1151 :       //^3E74:0D71
 1152 :       bp04->pv4(NULL);
 1153 :     }
 1154 : 
 1155 :     while (true) {
 1156 :       //^3E74:0D7C
 1157 :       mement *bp08 = _4976_5d94;
 1158 :       //^3E74:0D89
 1159 :       __int32 bp0c = bp04->dw0;
 1160 :       //^3E74:0D99
 1161 :       if (bp08->dw0 <= bp0c) {
 1162 :         //^3E74:0DAF
 1163 :         _4976_5d94 = bp04;
 1164 :         //^3E74:0DBC
 1165 :         bp04->pv4(NULL);
 1166 :         //^3E74:0DCB
 1167 :         bp04->pv8(bp08);
 1168 :         //^3E74:0DD9
 1169 :         bp08->pv4(bp04);
 1170 :         //^3E74:0DE2
 1171 :         continue;
 1172 :       }
 1173 :       //^3E74:0DE4
 1174 :       Bit16u si = 0;
 1175 : 
 1176 :       while ((bp04 = bp08->pv8()) != NULL) {
 1177 :         //^3E74:0DE8
 1178 :         if (bp04->dw0 <= bp0c) {
 1179 :           //^3E74:0DFE
 1180 :           bp04->pv4(ref);
 1181 :           //^3E74:0E0F
 1182 :           bp08->pv8(ref);
 1183 :           //^3E74:0E1A
 1184 :           ref->pv4(bp08);
 1185 :           //^3E74:0E2B
 1186 :           ref->pv8(bp04);
 1187 :           //^3E74:0E39
 1188 :           si = 1;
 1189 :           //^3E74:0E3C
 1190 :           break;
 1191 :         }
 1192 :         //^3E74:0E3E
 1193 :         bp08 = bp04;
 1194 :         //^3E74:0E4A
 1195 :       }
 1196 :       //^3E74:0E6D
 1197 :       if (si == 0) {
 1198 :         //^3E74:0E71
 1199 :         bp08->pv8(ref);
 1200 :         //^3E74:0E82
 1201 :         ref->pv4(bp08);
 1202 :         //^3E74:0E93
 1203 :         ref->pv8(NULL);
 1204 :       }
 1205 :       //^3E74:0E9F
 1206 :       return;
 1207 :     }
 1208 :   }
 1209 : 
 1210 :   //^3E74:28DE
 1211 :   void _3e74_28de(Bit16u xx)
 1212 :   {
 1213 :     //^3E74:28DE
 1214 :     //^3E74:28E4
 1215 :     Bit16u di = xx;
 1216 :     //^3E74:28E7
 1217 :     if (di == _4976_4809) {
 1218 :       //^3E74:28ED
 1219 :       _4976_4809 = 0xffff;
 1220 :     }
 1221 :     //^3E74:28F3
 1222 :     Bit16u si = _3e74_0c62(di);
 1223 :     //^3E74:28FB
 1224 :     if (si == 0xffff)
 1225 :       //^3E74:2900
 1226 :       return;
 1227 :     //^3E74:2903
 1228 :     if ((di & 0x8000) == 0) {
 1229 :       //^3E74:2909
 1230 :       _4976_5c82[di] = 0xffff;
 1231 :     }
 1232 :     else {
 1233 :       //^3E74:291A
 1234 :       di &= 0x7fff;
 1235 :       //^3E74:291E
 1236 :       _4976_5d08[di] = 0xffff;
 1237 :       //^3E74:292D
 1238 :       if (_4976_5c90 == 0) {
 1239 :         //^3E74:2934
 1240 :         _3e74_5561(di);
 1241 :       }
 1242 :     }
 1243 :     //^3E74:293B
 1244 :     _3e74_4549(si);
 1245 :     //^3E74:2942
 1246 :     mement *bp04 = _4976_5ca4[si];
 1247 :     //^3E74:295A
 1248 :     _4976_5ca4[si] = NULL;
 1249 :     //^3E74:2970
 1250 :     _4976_5c9e--;
 1251 :     //^3E74:2974
 1252 :     if (si < _4976_5c78 || _4976_5c78 == 0xffff) {
 1253 :       //^3E74:2981
 1254 :       _4976_5c78 = si;
 1255 :     }
 1256 :     //^3E74:2985
 1257 :     __int32 bp0c = -bp04->dw0;
 1258 :     //^3E74:299C
 1259 :     _4976_5cf8 += bp0c;
 1260 :     //^3E74:29A7
 1261 :     if (bp04 != _4976_5ce6) {
 1262 :       //^3E74:29BC
 1263 :       __int32 bp10 = READ_I32(bp04,-4);
 1264 :       //^3E74:29DE
 1265 :       if (bp10 > 0) {
 1266 :         //^3E74:29E8
 1267 :         PTR_PADA(bp04,bp10);
 1268 :         //^3E74:29F8
 1269 :         _3e74_0c8c(bp04);
 1270 :         //^3E74:2A04
 1271 :         bp0c += bp10;
 1272 :       }
 1273 :     }
 1274 :     //^3E74:2A10
 1275 :     if ((void *)PTR_ADD(bp04,bp0c) == (void *)_4976_5cb2) {
 1276 :       //^3E74:2A30
 1277 :       _4976_5cb2 = bp04;
 1278 :     }
 1279 :     //^3E74:2A40
 1280 :     mement *bp08 = reinterpret_cast<mement *>(PTR_ADD(bp04,bp0c));
 1281 :     //^3E74:2A59
 1282 :     __int32 bp10 = bp08->dw0;
 1283 :     //^3E74:2A68
 1284 :     if (bp10 > 0) {
 1285 :       //^3E74:2A72
 1286 :       _3e74_0c8c(bp08);
 1287 :       //^3E74:2A7E
 1288 :       bp0c += bp10;
 1289 :     }
 1290 :     //^3E74:2A8A
 1291 :     bp04->dw0 = bp0c;
 1292 :     //^3E74:2A9A
 1293 :     WRITE_I32(bp04,bp0c -4,bp0c);
 1294 :     //^3E74:2AC9
 1295 :     _3e74_0d32(bp04);
 1296 :     //^3E74:2AD5
 1297 :     return;
 1298 :   }
 1299 : 
 1300 :   //^3E74:4471
 1301 :   Bit16u _3e74_4471()
 1302 :   {
 1303 :     //^3E74:4471
 1304 :     //^3E74:4475
 1305 :     __int16 si = _4976_5d36;
 1306 :     //^3E74:447A
 1307 :     if (si >= 0) {
 1308 :       //^3E74:447E
 1309 :       _4976_5c92++;
 1310 :       //^3E74:4482
 1311 :       if (_4976_5c92 >= _4976_5d24) {
 1312 :         //^3E74:448B
 1313 :         _4976_5d36 = -1;
 1314 :       }
 1315 :       else {
 1316 :         do {
 1317 :           //^3E74:4493
 1318 :           _4976_5d36++;
 1319 :           //^3E74:4497
 1320 :         } while (_4976_5d08[_4976_5d36] != 0xffff);
 1321 :       }
 1322 :     }
 1323 :     //^3E74:44A8
 1324 :     return si;
 1325 :   }
 1326 : 
 1327 :   //^3E74:54A1
 1328 :   Bit16u _3e74_54a1(Bit32u xx, Bit16u yy)
 1329 :   {
 1330 :     //^3E74:54A1
 1331 :     //^3E74:54A6
 1332 :     if (_4976_5c92 == _4976_5d24) {
 1333 :       //^3E74:54AF
 1334 :       mement *bp04 = _4976_5d5e;
 1335 :       //^3E74:54B6
 1336 :       for (; (bp04->w10 & 0x8000) == 0; ) {
 1337 :         //^3E74:54B8
 1338 :         bp04 = _4976_5ca4[bp04->w8];
 1339 :       }
 1340 :       //^3E74:54E0
 1341 :       _3e74_28de(bp04->w10);
 1342 :       //^3E74:54E9
 1343 :       _3e74_5420(xx, &yy);
 1344 :     }
 1345 :     //^3E74:54FB
 1346 :     Bit16u si = _3e74_4471();
 1347 :     //^3E74:5501
 1348 :     COPY_MEMORY(
 1349 :       &_4976_5c7e[yy],
 1350 :       &_4976_5c7e[yy +1],
 1351 :       (_4976_5c92 -yy -1) << 1
 1352 :       );
 1353 :     //^3E74:5536
 1354 :     _4976_5c7e[yy] = si;
 1355 :     //^3E74:5544
 1356 :     _4976_5c86[si] = xx;
 1357 :     //^3E74:555C
 1358 :     return si;
 1359 :   }
 1360 : 
 1361 :   //^3E74:44AD
 1362 :   void _3e74_44ad()
 1363 :   {
 1364 :     //^3E74:44AD
 1365 :     _4976_5d2a = _4976_4bec;
 1366 :     _4976_5d90 = 0;
 1367 :     mement *bp04 = _4976_5c8c;
 1368 :     //^3E74:44E6
 1369 :     if (bp04 == NULL) {
 1370 :       //^3E74:44E8
 1371 :       bp04 = _4976_5d70;
 1372 :       //^3E74:4502
 1373 :       if (bp04 == NULL)
 1374 :         return;
 1375 :       while (bp04->w4 != 0) {
 1376 :         //^3E74:4506
 1377 :         if (bp04->w4 <= 0xFFFD) {
 1378 :           //^3E74:4510
 1379 :           bp04->w4 = 0;
 1380 :         }
 1381 :         //^3E74:4516
 1382 :         Bit16u si = bp04->w6;
 1383 :         if (si == 0xffff)
 1384 :           return;
 1385 :         //^3E74:4524
 1386 :         bp04 = _4976_5ca4[si];
 1387 :         //^3E74:453C
 1388 :       }
 1389 :     }
 1390 :   }
 1391 : 
 1392 :   //^3E74:0C62
 1393 :   Bit16u _3e74_0c62(Bit16u xx)
 1394 :   {
 1395 :     //^3E74:0C62
 1396 :     Bit16u si = xx;
 1397 :     if ((si & 0x8000) != 0) {
 1398 :       //^3E74:0C6F
 1399 :       return _4976_5d08[si & 0x7fff];
 1400 :     }
 1401 :     else {
 1402 :       //^3E74:0C7C
 1403 :       return _4976_5c82[si];
 1404 :     }
 1405 :   }
 1406 : 
 1407 :   //^3E74:55F9
 1408 :   Bit16u _3e74_55f9(Bit32u xx, Bit16u *yy)
 1409 :   {
 1410 :     //^3E74:55F9
 1411 :     //^3E74:55FE
 1412 :     if (_4976_4bec != _4976_5d2a) {
 1413 :       //^3E74:5611
 1414 :       _3e74_44ad();
 1415 :     }
 1416 :     //^3E74:5615
 1417 :     Bit16u bp02;
 1418 :     if (_3e74_5420(xx, &bp02) != 0) {
 1419 :       //^3E74:562B
 1420 :       *yy = _4976_5c7e[bp02];
 1421 :       //^3E74:563F
 1422 :       Bit16u si = _3e74_0c62(*yy | 0x8000);
 1423 :       //^3E74:564D
 1424 :       _3e74_48c9(si);
 1425 :       //^3E74:5653
 1426 :       return 1;
 1427 :     }
 1428 :     //^3E74:5658
 1429 :     *yy = _3e74_54a1(xx, bp02);
 1430 :     //^3E74:566E
 1431 :     return 0;
 1432 :   }
 1433 : 
 1434 :   //^3E74:1679
 1435 :   mement *_3e74_5817(Bit16u xx)
 1436 :   {
 1437 :     //^3E74:1679
 1438 :     //^3E74:581A
 1439 :         return _3e74_48c9(_3e74_0c62(xx | 0x8000));
 1440 :   }
 1441 : 
 1442 :   //^3E74:583A
 1443 :   void _3e74_583a(Bit16u xx)
 1444 :   {
 1445 :     //^3E74:583A
 1446 :     //^3E74:583E
 1447 :     Bit16u si = _3e74_0c62(xx | 0x8000);
 1448 :     //^3E74:584C
 1449 :     if (si != 0xffff) {
 1450 :       //^3E74:5851
 1451 :       _3e74_4549(si);
 1452 :     }
 1453 :     //^3E74:5857
 1454 :     return;
 1455 :   }
 1456 : 
 1457 :   //^3E74:4416
 1458 :   Bit16u _3e74_4416()
 1459 :   {
 1460 :     //^3E74:4416
 1461 :     //^3E74:441A
 1462 :     Bit16u si = _4976_5c78;
 1463 :     //^3E74:441F
 1464 :     if (si == 0xffff) {
 1465 :       //^3E74:4424
 1466 :       _3e74_28de(_4976_5d5e->w10);
 1467 :       //^3E74:4431
 1468 :       si = _4976_5c78;
 1469 :     }
 1470 :     //^3E74:4435
 1471 :     _4976_5c9e++;
 1472 :     //^3E74:4439
 1473 :     if (_4976_5c9e >= _4976_5d74) {
 1474 :       //^3E74:4442
 1475 :       _4976_5c78 = 0xffff;
 1476 :     }
 1477 :     else {
 1478 :       do {
 1479 :         //^3E74:444A
 1480 :         _4976_5c78++;
 1481 :         //^3E74:444E
 1482 :       } while (_4976_5ca4[_4976_5c78] != NULL);
 1483 :     }
 1484 :     //^3E74:446C
 1485 :     return si;
 1486 :   }
 1487 : 
 1488 :   //^3E74:2AD9
 1489 :   void _3e74_2ad9(__int32 xx)
 1490 :   {
 1491 :     //^3E74:2AD9
 1492 :     //^3E74:2ADC
 1493 :     for (; _4976_5cf8 < xx; ) {
 1494 :       //^3E74:2ADE
 1495 :       if (_4976_5d5e == NULL) {
 1496 :         //^3E74:2AF0
 1497 :         RAISE_SYSERR(43);
 1498 :       }
 1499 :       //^3E74:2AF8
 1500 :       if (_4976_4809 != 0xffff && _4976_4809 != _4976_4807) {
 1501 :         //^3E74:2B08
 1502 :         _3e74_28de(_4976_4809);
 1503 :       }
 1504 :       else {
 1505 :         //^3E74:2B0E
 1506 :         _3e74_28de(_4976_5d5e->w10);
 1507 :       }
 1508 :       //^3E74:2B1B
 1509 :     }
 1510 :     //^3E74:2B2E
 1511 :     return;
 1512 :   }
 1513 : 
 1514 :   //^3E74:2B30
 1515 :   void _3e74_2b30()
 1516 :   {
 1517 :     //^3E74:2B30
 1518 :     //^3E74:2B36
 1519 :     if (_4976_5d94 != NULL) {
 1520 :       //^3E74:2B4B
 1521 :       mement *bp04 = _4976_5ce6;
 1522 :       mement *bp08 = _4976_5ce6;
 1523 : 
 1524 :       do {
 1525 :         //^3E74:2B5E
 1526 :         __int32 bp0c = bp04->dw0;
 1527 :         //^3E74:2B6E
 1528 :         if (bp0c > 0) {
 1529 :           //^3E74:2B78
 1530 :           PTR_PADA(bp04, bp0c);
 1531 :         }
 1532 :         else {
 1533 :           //^3E74:2B86
 1534 :           bp0c = -bp0c;
 1535 :           //^3E74:2B99
 1536 :           if (bp08 != bp04) {
 1537 :             //^3E74:2BAF
 1538 :             Bit16u di = bp04->w10;
 1539 :             //^3E74:2BB6
 1540 :             Bit16u si = _3e74_0c62(di);
 1541 :             //^3E74:2BBE
 1542 :             _4976_5ca4[si] = bp08;
 1543 :             //^3E74:2BD4
 1544 :             COPY_MEMORY(bp04, bp08, bp0c);
 1545 :             //^3E74:2BEE
 1546 :             if (_4976_5d5e == bp04) {
 1547 :               //^3E74:2C02
 1548 :               _4976_5d5e = bp08;
 1549 :             }
 1550 :             //^3E74:2C0F
 1551 :             if (_4976_5d70 == bp04) {
 1552 :               //^3E74:2C23
 1553 :               _4976_5d70 = bp08;
 1554 :             }
 1555 :             //^3E74:2C30
 1556 :             if (_4976_5d90 == bp04) {
 1557 :               //^3E74:2C44
 1558 :               _4976_5d90 = bp08;
 1559 :             }
 1560 :             //^3E74:2C53
 1561 :             else if (_4976_5c8c == bp04) {
 1562 :               //^3E74:2C67
 1563 :               _4976_5c8c = bp08;
 1564 :             }
 1565 :           }
 1566 :           //^3E74:2C74
 1567 :           PTR_PADA(bp04, bp0c);
 1568 :           //^3E74:2C84
 1569 :           PTR_PADA(bp08, bp0c);
 1570 :         }
 1571 :         //^3E74:2C94
 1572 :       } while (bp04 != _4976_5cb2);
 1573 : 
 1574 :       //^3E74:2CAC
 1575 :       _4976_5cb2 = bp08;
 1576 :       //^3E74:2CB9
 1577 :       _4976_5d94 = NULL;
 1578 :     }
 1579 :     //^3E74:2CC5
 1580 :     return;
 1581 :   }
 1582 : 
 1583 :   //^3E74:2CC9
 1584 :   mement *_3e74_2cc9(__int32 xx)
 1585 :   {
 1586 :     //^3E74:2CC9
 1587 :     //^3E74:2CCF
 1588 :     _3e74_2ad9(xx);
 1589 :     //^3E74:2CDB
 1590 :     mement *bp04;
 1591 :     if (PTR_PSBP(_4976_5ce2,_4976_5cb2) >= xx) {
 1592 :       //^3E74:2CFB
 1593 : _2cfb:
 1594 :       bp04 = _4976_5cb2;
 1595 :       //^3E74:2D08
 1596 :       PTR_PADA(_4976_5cb2,xx);
 1597 :     }
 1598 :     //^3E74:2D1B
 1599 :     else if (_4976_5d94->dw0 < xx) {
 1600 :       //^3E74:2D32
 1601 :       _3e74_2b30();
 1602 :       //^3E74:2D36
 1603 :       goto _2cfb;
 1604 :     }
 1605 :     else {
 1606 :       //^3E74:2D38
 1607 :       bp04 = _4976_5d94;
 1608 :       //^3E74:2D45
 1609 :       Bit16u si = 0;
 1610 :       mement *bp08;
 1611 : 
 1612 :       do {
 1613 :         //^3E74:2D47
 1614 :         if (bp04->dw0 == xx) {
 1615 :           //^3E74:2D5B
 1616 : _2d5b:
 1617 :           si = 1;
 1618 :           //^3E74:2D5E
 1619 :           continue;
 1620 :         }
 1621 :         //^3E74:2D60
 1622 :         if (bp04->dw0 >= xx) {
 1623 :           //^3E74:2D76
 1624 :           bp08 = bp04->pv8();
 1625 :           //^3E74:2D8B
 1626 :           if (bp08 != NULL)
 1627 :             //^3E74:2D94
 1628 :             goto _2da5;
 1629 :         }
 1630 :         //^3E74:2D96
 1631 :         bp04 = _4976_5d94;
 1632 :         //^3E74:2DA3
 1633 :         goto _2d5b;
 1634 :         //^3E74:2DA5
 1635 : _2da5:
 1636 :         bp04 = bp08;
 1637 :         //^3E74:2DB1
 1638 :       } while (si == 0);
 1639 : 
 1640 :       //^3E74:2DB5
 1641 :       _3e74_0c8c(reinterpret_cast<mement *>(bp04));
 1642 :       //^3E74:2DC1
 1643 :       __int32 bp0c = bp04->dw0 - xx;
 1644 :       //^3E74:2DD7
 1645 :       if (bp0c >= 30) {
 1646 :         //^3E74:2DE5
 1647 :         bp08 = reinterpret_cast<mement *>(PTR_ADD(bp04,xx));
 1648 :         //^3E74:2DFC
 1649 :         WRITE_I32(bp08,bp0c -4,bp0c);
 1650 :         //^3E74:2E2A
 1651 :         bp08->dw0 = bp0c;
 1652 :         //^3E74:2E3A
 1653 :         _3e74_0d32(reinterpret_cast<mement *>(bp08));
 1654 :       }
 1655 :       else {
 1656 :         //^3E74:2E42
 1657 :         xx = bp04->dw0;
 1658 :       }
 1659 :     }
 1660 :     //^3E74:2E52
 1661 :     _4976_5cf8 -= xx;
 1662 :     //^3E74:2E60
 1663 :     bp04->dw0 = -xx;
 1664 :     //^3E74:2E71
 1665 :     WRITE_I32(bp04,xx -4,-xx);
 1666 :     //^3E74:2EA9
 1667 :     reinterpret_cast<mement *>(bp04)->w8 = 0xffff;
 1668 :     reinterpret_cast<mement *>(bp04)->w6 = 0xffff;
 1669 :     reinterpret_cast<mement *>(bp04)->w4 = 0xffff;
 1670 :     //^3E74:2EBD
 1671 :     return reinterpret_cast<mement *>(bp04);
 1672 :   }
 1673 : 
 1674 :   //^3E74:5708
 1675 :   Bit8u *_3e74_5708(Bit16u xx, Bit32u yy)
 1676 :   {
 1677 :     //^3E74:5708
 1678 :     //^3E74:570D
 1679 :     yy += 22;
 1680 :     //^3E74:5715
 1681 :     if ((yy & 1) != 0) {
 1682 :       //^3E74:5720
 1683 :       yy++;
 1684 :     }
 1685 :     //^3E74:5728
 1686 :     mement *bp04 = _3e74_2cc9(yy);
 1687 :     //^3E74:573B
 1688 :     Bit16u si = _3e74_4416();
 1689 :     //^3E74:5740
 1690 :     _4976_5d08[xx] = si;
 1691 :     //^3E74:574E
 1692 :     _4976_5ca4[si] = bp04;
 1693 :     //^3E74:5766
 1694 :     bp04->w10 = xx | 0x8000;
 1695 :     //^3E74:5773
 1696 :     return reinterpret_cast<Bit8u *>(bp04);
 1697 :   }
 1698 : 
 1699 :   //^3E74:585A
 1700 :   void _3e74_585a(Bit16u xx, Bit16u yy)
 1701 :   {
 1702 :     //^3E74:585A
 1703 :     //^3E74:585E
 1704 :     Bit16u si = _3e74_0c62(xx | 0x8000);
 1705 :     //^3E74:586C
 1706 :     if (si == 0xffff) {
 1707 :       //^3E74:5871
 1708 :       return _3e74_5561(xx);
 1709 :     }
 1710 :     else {
 1711 :       //^3E74:587B
 1712 :       return _3e74_4701(si, yy);
 1713 :     }
 1714 :   }
 1715 : 
 1716 :   //^44C8:1D26
 1717 :   void _44c8_1d26(Bit8u *xx, Bit16u yy); // TODO: Unreachable
 1718 : 
 1719 :   //^443C:085A
 1720 :   void _443c_085a()
 1721 :   {
 1722 :     //^443C:085A
 1723 :     //^443C:085D
 1724 :     _4976_4860++;
 1725 :     //^443C:0861
 1726 :     _01b0_0adb() CALL_IBMIO;
 1727 :   }
 1728 : 
 1729 :   //^01B0:0ADB
 1730 :   void _01b0_0adb() //#DS=04BF
 1731 :   {
 1732 :     //^01B0:0ADB
 1733 :     LOADDS(0x3083);
 1734 :     //^01B0:0AE4
 1735 :     if (_04bf_17a2++ == 0) {
 1736 :       //^01B0:0AF1
 1737 :       _01b0_07f8();
 1738 :       _01b0_073d();
 1739 :       _01b0_080b();
 1740 :     }
 1741 :     //^01B0:0AFD
 1742 :     return;
 1743 :   }
 1744 : 
 1745 :   //^01B0:0B01
 1746 :   void _01b0_0b01(__int16 xx, Bit8u *yy, Bit8u zz, Bit8u ss, Bit16u tt, Bit16u uu, Bit16u vv, 
 1747 :     Bit8u *ww, Bit16u pp) //#DS=04BF
 1748 :   {
 1749 :     //^01B0:0B01
 1750 :     //^01B0:0B07
 1751 :     LOADDS(0x3083);
 1752 :     //^01B0:0B0D
 1753 :     //^01B0:0B0F
 1754 :     if (xx >= 0 && xx < 4) {
 1755 :       //^01B0:0B25
 1756 :       _01b0_07f8();
 1757 :       //^01B0:0B29
 1758 :       Bit8u *bp08 = &_04bf_0e80[582 * xx];
 1759 :       //^01B0:0B3A
 1760 :       if (vv == 4) {
 1761 :         //^01B0:0B45
 1762 :         Bit16u di = 0;
 1763 :         //^01B0:0B47
 1764 :         Bit16u bp0a = (tt +1) & 0xfffe;
 1765 :         Bit16u bp04 = 0;
 1766 : 
 1767 :         //^01B0:0B56
 1768 :         for (; bp04 < uu; bp04++) {
 1769 :           //^01B0:0B59
 1770 :           Bit16u bp02 = 0;
 1771 :           //^01B0:0B5E
 1772 :           for (; bp02 < tt; di++, bp02++) {
 1773 :             //^01B0:0B60
 1774 :             Bit16u si = bp0a * bp04 + bp02;
 1775 :             //^01B0:0B6B
 1776 :             if ((si & 0x0001) != 0) {
 1777 :               //^01B0:0B71
 1778 :               bp08[di +6] = ww[yy[si >> 1] & 15];
 1779 :             }
 1780 :             else {
 1781 :               //^01B0:0B91
 1782 :               bp08[di +6] = ww[yy[si >> 1] >> 4];
 1783 :             }
 1784 :             //^01B0:0BCF
 1785 :           }
 1786 :           //^01B0:0BDF
 1787 :         }
 1788 :       }
 1789 :       //^01B0:0C0F
 1790 :       Bit16u si = 0;
 1791 :       //^01B0:0C11
 1792 :       for (; tt * uu > si; si++) {
 1793 :         //^01B0:0C13
 1794 :         bp08[si +6] = yy[__int16(si)];
 1795 :         //^01B0:0C33
 1796 :       }
 1797 :       //^01B0:0C3E
 1798 :       //^01B0:0C44
 1799 :       bp08[4] = bp08[26];
 1800 :       //^01B0:0C48
 1801 :       bp08[0] = zz;
 1802 :       bp08[1] = ss;
 1803 :       bp08[2] = Bit8u(tt);
 1804 :       bp08[3] = Bit8u(uu);
 1805 :       //^01B0:0C66
 1806 :       _01b0_080b();
 1807 :     }
 1808 :     //^01B0:0C6A
 1809 :     //^01B0:0C6B
 1810 :     return;
 1811 :   }
 1812 : 
 1813 :   //^01B0:0C70
 1814 :   void _01b0_0c70(Bit16u xx) //#DS=04BF
 1815 :   {
 1816 :     //^01B0:0C70
 1817 :     //^01B0:0C73
 1818 :     LOADDS(0x3083);
 1819 :     //^01B0:0C79
 1820 :     _01b0_07f8();
 1821 :     //^01B0:0C7F
 1822 :     if (_04bf_17a8 != 0) {
 1823 :       //^01B0:0C86
 1824 :       _01b0_073d();
 1825 :       //^01B0:0C8A
 1826 :       _04bf_1938 = xx;
 1827 :       //^01B0:0C90
 1828 :       _01b0_05ae();
 1829 :     }
 1830 :     else {
 1831 :       //^01B0:0C96
 1832 :       _04bf_1938 = xx;
 1833 :     }
 1834 :     //^01B0:0C9C
 1835 :     _01b0_080b();
 1836 :     //^01B0:0CA1
 1837 :     return;
 1838 :   }
 1839 : 
 1840 :   //^01B0:0CA4
 1841 :   void _01b0_0ca4(Bit16u *xx, Bit16u yy)
 1842 :   {
 1843 :     //^01B0:0CA4
 1844 :     //^01B0:0CA8
 1845 :     LOADDS(0x3083);
 1846 :     //^01B0:0CAE
 1847 :     //^01B0:0CB0
 1848 :     _01b0_07f8();
 1849 :     //^01B0:0CBA
 1850 :     for (Bit16u si=0; si < 4; si++) {
 1851 :       //^01B0:0CBE
 1852 :       ((Bit16u *)&_04bf_1852)[si] = xx[si];
 1853 :       //^01B0:0CD2
 1854 :     }
 1855 :     //^01B0:0CD8
 1856 :     _04bf_17e8 = yy;
 1857 :     _04bf_1850 = 1;
 1858 :     //^01B0:0CE4
 1859 :     _01b0_080b();
 1860 :     //^01B0:0CE9
 1861 :     return;
 1862 :   }
 1863 : 
 1864 :   //^443C:040E
 1865 :   void _443c_040e()
 1866 :   {
 1867 :     //^443C:040E
 1868 :     //^443C:0411
 1869 :     _443c_085a();
 1870 :     //^443C:0416
 1871 :     _4976_5db6 = 1;
 1872 :     //^443C:041C
 1873 :     _01b0_0ca4(_4976_4954, 32);
 1874 :     //^443C:042D
 1875 :     _443c_086b();
 1876 :     //^443C:0432
 1877 :     return;
 1878 :   }
 1879 : 
 1880 :   //^3E74:57B5
 1881 :   Bit8u *_3e74_57b5(Bit16u zz, Bit16u xx, Bit16u yy, Bit16u ww)
 1882 :   {
 1883 :     //^3E74:57B5
 1884 :     //^3E74:57BA
 1885 :     Bit16u si = xx;
 1886 :     //^3E74:57BD
 1887 :     Bit8u *bp04 = _3e74_5708(
 1888 :       zz,
 1889 :       Bit32u((ww == 4) ? (((si +1) & 0xfffe) >> 1) : (si & 0xffff)) * yy
 1890 :       );
 1891 :     //^3E74:57E8
 1892 :     WRITE_UI16(bp04,-4,si);
 1893 :     //^3E74:57EF
 1894 :     WRITE_UI16(bp04,-2,yy);
 1895 :     //^3E74:57F9
 1896 :     WRITE_UI16(bp04,-6,ww);
 1897 :     //^3E74:580E
 1898 :     return bp04;
 1899 :   }
 1900 : 
 1901 :   //^3E74:53EA
 1902 :   Bit32u _3e74_53ea()
 1903 :   {
 1904 :     //^3E74:53EA
 1905 :     Bit32u bp04;
 1906 :     Bit16u bp06;
 1907 :     do {
 1908 :       //^3E74:53EE
 1909 :       bp04 = 0xffff0000 | (_4976_484b++);
 1910 :       //^3E74:5401
 1911 :     } while (_3e74_5420(bp04, &bp06) != 0);
 1912 :     //^3E74:5418
 1913 :     return bp04;
 1914 :   }
 1915 : 
 1916 :   //^3E74:5888
 1917 :   Bit16u _3e74_5888()
 1918 :   {
 1919 :     //^3E74:5888
 1920 :     //^3E74:588C
 1921 :     Bit16u bp02;
 1922 :     _3e74_55f9(_3e74_53ea(), &bp02);
 1923 :     //^3E74:589E
 1924 :     return bp02;
 1925 :   }
 1926 : 
 1927 :   //^0B36:0D67
 1928 :   void _0b36_0d67(sk3f6c *ref, SRECT *rc)
 1929 :   {
 1930 :     //^0B36:0D67
 1931 :     //^0B36:0D6C
 1932 :     if (rc == NULL)
 1933 :       //^0B36:0D74
 1934 :       return;
 1935 :     //^0B36:0D77
 1936 :     __int16 si = 0;
 1937 :     for (; ref->w10 > si; si++) {
 1938 :       //^0B36:0D7C
 1939 :       if (ref->w12[si].x <= rc->x) {
 1940 :         //^0B36:0D92
 1941 :         if (ref->w12[si].x + ref->w12[si].cx -1 >= rc->x + rc->cx -1) {
 1942 :           //^0B36:0DC5
 1943 :           if (ref->w12[si].y <= rc->y) {
 1944 :             //^0B36:0DDC
 1945 :             if (ref->w12[si].y + ref->w12[si].cy -1 >= rc->y + rc->cy -1) {
 1946 :               //^0B36:0E09
 1947 :               //^0B36:0FA7
 1948 :               return;
 1949 :             }
 1950 :           }
 1951 :         }
 1952 :       }
 1953 :       //^0B36:0E0C
 1954 :       if (ref->w12[si].x >= rc->x) {
 1955 :         //^0B36:0E22
 1956 :         if (ref->w12[si].x + ref->w12[si].cx -1 <= rc->x + rc->cx -1) {
 1957 :           //^0B36:0E55
 1958 :           if (ref->w12[si].y >= rc->y) {
 1959 :             //^0B36:0E6C
 1960 :             if (ref->w12[si].y + ref->w12[si].cy -1 <= rc->y + rc->cy -1) {
 1961 :               //^0B36:0E97
 1962 :               goto _0ec7;
 1963 :             }
 1964 :           }
 1965 :         }
 1966 :       }
 1967 :       //^0B36:0E99
 1968 :     }
 1969 :     //^0B36:0EA6
 1970 :     if (si >= 5) {
 1971 :       //^0B36:0EAB
 1972 :       _0b36_0cbe(ref, 0);
 1973 :     }
 1974 :     //^0B36:0EBA
 1975 :     si = ref->w10++;
 1976 :     //^0B36:0EC7
 1977 : _0ec7:
 1978 :     COPY_MEMORY(rc, &ref->w12[si], 8);
 1979 :     //^0B36:0EEA
 1980 :     rc = &ref->w12[si];
 1981 :     //^0B36:0F00
 1982 :     si = rc->x - ref->w2.x;
 1983 :     //^0B36:0F11
 1984 :     if (si < 0) {
 1985 :       //^0B36:0F15
 1986 :       if ((rc->cx += si) <= 0) {
 1987 :         //^0B36:0F1E
 1988 :         ref->w10--;
 1989 :         //^0B36:0F25
 1990 :         return;
 1991 :       }
 1992 :       //^0B36:0F28
 1993 :       rc->x -= si;
 1994 :     }
 1995 :     //^0B36:0F2E
 1996 :     si = rc->y - ref->w2.y;
 1997 :     //^0B36:0F3E
 1998 :     if (si < 0) {
 1999 :       //^0B36:0F42
 2000 :       if ((rc->cy += si) <= 0) {
 2001 :         //^0B36:0F4B
 2002 :         //^0B36:0F1E
 2003 :         ref->w10--;
 2004 :         //^0B36:0F25
 2005 :         return;
 2006 :       }
 2007 :       //^0B36:0F4D
 2008 :       rc->y -= si;
 2009 :     }
 2010 :     //^0B36:0F54
 2011 :     si = ref->w2.x + ref->w2.cx -1 -(rc->x + rc->cx -1);
 2012 :     //^0B36:0F76
 2013 :     if (si < 0) {
 2014 :       //^0B36:0F7C
 2015 :       rc->cx += si;
 2016 :     }
 2017 :     //^0B36:0F83
 2018 :     si = ref->w2.y + ref->w2.cy -1 -(rc->y + rc->cy -1);
 2019 :     //^0B36:0F9F
 2020 :     if (si < 0) {
 2021 :       //^0B36:0FA3
 2022 :       rc->cy += si;
 2023 :     }
 2024 :     //^0B36:0FA7
 2025 :     return;
 2026 :   }
 2027 : 
 2028 :   //^0B36:0C52
 2029 :   sk3f6c *_0b36_0c52(sk3f6c *ref, Bit16u rectno, Bit16u ww)
 2030 :   {
 2031 :     //^0B36:0C52
 2032 :     //^0B36:0C55
 2033 :     if (rectno != 0xffff) {
 2034 :       //^0B36:0C5B
 2035 :       QUERY_EXPANDED_RECT(rectno, &ref->w2);
 2036 :     }
 2037 :     //^0B36:0C6F
 2038 :     _3e74_57b5(ref->w0 = _3e74_5888(), ref->w2.cx, ref->w2.cy, 8);
 2039 :     //^0B36:0C90
 2040 :     ref->w10 = 0;
 2041 :     //^0B36:0C99
 2042 :     if (ww != 0) {
 2043 :       //^0B36:0C9F
 2044 :       _0b36_0d67(ref, &ref->w2);
 2045 :     }
 2046 :     //^0B36:0CB6
 2047 :     return ref;
 2048 :   }
 2049 : 
 2050 :   //^0B36:0FAB
 2051 :   SRECT *_0b36_0fab(const sk3f6c *ref, const SRECT *rc1, SRECT *rc2)
 2052 :   {
 2053 :     //^0B36:0FAB
 2054 :     //^0B36:0FAF
 2055 :     rc2->x = rc1->x - ref->w2.x;
 2056 :     //^0B36:0FC4
 2057 :     rc2->y = rc1->y - ref->w2.y;
 2058 :     //^0B36:0FD9
 2059 :     rc2->cx = rc1->cx;
 2060 :     //^0B36:0FE7
 2061 :     rc2->cy = rc1->cy;
 2062 :     //^0B36:0FF5
 2063 :     return rc2;
 2064 :   }
 2065 : 
 2066 :   //^0B36:0FFE
 2067 :   void _0b36_0ffe(sk3f6c *ref, SRECT *rc, Bit8u fill)
 2068 :   {
 2069 :     //^0B36:0FFE
 2070 :     ENTER(8);
 2071 :     //^0B36:1002
 2072 :     if (rc != NULL) {
 2073 :       //^0B36:100A
 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 :       //^0B36:1046
 2083 :       _0b36_0d67(ref, rc);
 2084 :     }
 2085 :     //^0B36:1059
 2086 :     return;
 2087 :   }
 2088 : 
 2089 :   //^29EE:00A3
 2090 :   void _29ee_00a3(Bit16u xx)
 2091 :   {
 2092 :     //^29EE:00A3
 2093 :     //^29EE:00A6
 2094 :     if (_4976_3f6c.w0 == 0xffff) {
 2095 :       //^29EE:00AD
 2096 :       _0b36_0c52(&_4976_3f6c, 11, xx);
 2097 :       //^29EE:00BE
 2098 :       if (xx != 0) {
 2099 :         //^29EE:00C4
 2100 :         _0b36_0ffe(&_4976_3f6c, &_4976_3f6c.w2, _4976_4bda[0]);
 2101 :       }
 2102 :     }
 2103 :     //^29EE:00DE
 2104 :     return;
 2105 :   }
 2106 : 
 2107 :   //^
 2108 :   Bit16u _2759_0e30(Bit16u player, __int16 hand, ObjectID rl); // TODO: Unreachable
 2109 : 
 2110 :   //^0CD5:00B2
 2111 :   __int16 BETWEEN_VALUE(__int16 minv, __int16 newv, __int16 maxv)
 2112 :   {
 2113 :     //^0CD5:00B2
 2114 :     __int16 si = newv;
 2115 :     if (si >= minv) {
 2116 :       //^0CD5:00C3
 2117 :       if (si <= maxv) {
 2118 :         //^0CD5:00CD
 2119 :         return si;
 2120 :       }
 2121 :       //^0CD5:00C8
 2122 :       return maxv;
 2123 :     }
 2124 :     //^0CD5:00BE
 2125 :     return minv;
 2126 :   }
 2127 : 
 2128 :   //^24A5:013D
 2129 :   void _24a5_013d()
 2130 :   {
 2131 :     //^24A5:013D
 2132 :     ENTER(28);
 2133 :     //^24A5:0143
 2134 :     if (_4976_4dba[_4976_4bf4].Difficulty() == 0) {
 2135 :       //^24A5:015D
 2136 :       _4976_4c36 = 1;
 2137 :     }
 2138 :     //^24A5:0166
 2139 :     Bit16u bp1c[9];
 2140 :     ZERO_MEMORY(bp1c, 9);
 2141 :     //^24A5:0177
 2142 :     Bit16u bp06 = 0;
 2143 :         //^24A5:017C
 2144 :     if ((QUERY_GDAT_DBSPEC_WORD_VALUE(_4976_57c8.w0, 0) & 0x0010) != 0) {
 2145 :       //^24A5:018E
 2146 :       bp1c[bp06] = ADD_ITEM_CHARGE(_4976_57c8.w0, 0);
 2147 :       bp06++;
 2148 :     }
 2149 :     //^24A5:01AB
 2150 :     Bit16u si;
 2151 :     for (si=0; si < _4976_4c3c; si++) {
 2152 :       //^24A5:01AF
 2153 :       for (Bit16u bp04=0; bp04 <= 1; bp04++) {
 2154 :         //^24A5:01B6
 2155 :         Bit16u bp08;
 2156 :         if ((QUERY_GDAT_DBSPEC_WORD_VALUE(bp08 = _4976_53b4[si].Possess(bp04), 0) & 0x0010) != 0) {
 2157 :           //^24A5:01DC
 2158 :           bp1c[bp06] = ADD_ITEM_CHARGE(bp08, 0);
 2159 :           //^24A5:01F5
 2160 :           bp06++;
 2161 :         }
 2162 :         //^24A5:01F8
 2163 :       }
 2164 :       //^24A5:0201
 2165 :     }
 2166 :     //^24A5:0208
 2167 :     for (si=0; bp06 -1 > si; si++) {
 2168 :       //^24A5:020C
 2169 :       if (bp1c[si] > bp1c[si +1]) {
 2170 :         //^24A5:0226
 2171 :         Bit16u bp04 = bp1c[si];
 2172 :         //^24A5:0235
 2173 :         bp1c[si] = bp1c[si +1];
 2174 :         //^24A5:024D
 2175 :         bp1c[si +1] = bp04;
 2176 :       }
 2177 :       //^24A5:025C
 2178 :     }
 2179 :     //^24A5:0265
 2180 :     Bit16u bp02 = 6;
 2181 :     Bit16u di;
 2182 :     for (di=0, si=0; si < bp06; si++) {
 2183 :       //^24A5:0270
 2184 :       di += (_4976_3d34[bp1c[si]] << bp02) >> 6;
 2185 :       //^24A5:028B
 2186 :       bp02 = max_value(0, bp02 -1);
 2187 :       //^24A5:029C
 2188 :     }
 2189 :     //^24A5:02A2
 2190 :     di += _4976_52d4;
 2191 :     di += _4976_57e4.w0;
 2192 :     //^24A5:02AA
 2193 :     di = di + QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4218, 0x0B, 0x67);
 2194 :     //^24A5:02C2
 2195 :     if (_4976_5c5d != 0) {
 2196 :       //^24A5:02C9
 2197 :       di += _4976_3d44[BETWEEN_VALUE(0, _4976_5c63 + _4976_5c68, 5)];
 2198 :     }
 2199 :     //^24A5:02EA
 2200 :     for (_4976_4c36=0; _4976_4c36 <= 5; _4976_4c36++) {
 2201 :       //^24A5:02F2
 2202 :       if (_4976_3d44[_4976_4c36] < di)
 2203 :         break;
 2204 :       //^24A5:02FF
 2205 :     }
 2206 :     //^24A5:030A
 2207 :     Bit16u bp0a = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4218, 0x0B, 0x68);
 2208 :     //^24A5:031F
 2209 :     if (bp0a < _4976_4c36) {
 2210 :       //^24A5:0327
 2211 :       _4976_4c36 = bp0a;
 2212 :     }
 2213 :     //^24A5:032D
 2214 :     if (_4976_5c5d != 0) {
 2215 :       //^24A5:0334
 2216 :       if (_4976_4bf8 != 0) {
 2217 :         //^24A5:033B
 2218 :         _4976_4c36 = 0;
 2219 :       }
 2220 :     }
 2221 :     //^24A5:0341
 2222 :     _4976_4c36 -= (_4976_52d6 > 12) ? 1 : 0;
 2223 :     //^24A5:0353
 2224 :     _4976_4c36 = BETWEEN_VALUE(0, _4976_4c36, 5);
 2225 :   }
 2226 : 
 2227 :   //^48AE:01EC
 2228 :   Bit16u _48ae_01ec(ObjectID recordLink, Bit16u possess, Bit16u x3)
 2229 :   {
 2230 :     //^48AE:01EC
 2231 :     ENTER(0);
 2232 :     //^48AE:01F1
 2233 :     __int16 si = possess;
 2234 :     //^48AE:01F4
 2235 :     Bit16u di = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 4);
 2236 :     //^48AE:0202
 2237 :     if (x3 != 0) {
 2238 :       //^48AE:0208
 2239 :       if (si < 0x000D) {
 2240 :         //^48AE:020D
 2241 :         if (si < 0) {
 2242 :           //^48AE:0211
 2243 :           //^48AE:021E
 2244 :           //^48AE:0224
 2245 :           return di & 0x0400;
 2246 :         }
 2247 :         //^48AE:0216
 2248 :         //^48AE:021E
 2249 :         //^48AE:0224
 2250 :         return _4976_49e8[si] & di;
 2251 :       }
 2252 :       //^48AE:0226
 2253 :       //^48AE:024E
 2254 :       //^48AE:0250
 2255 :       return 0;
 2256 :     }
 2257 :     //^48AE:0228
 2258 :     if (si < 0x000D) {
 2259 :       //^48AE:022D
 2260 :       if (si > 0x0001) {
 2261 :         //^48AE:0232
 2262 :         //^48AE:023C
 2263 :         return di & _4976_49e8[si];
 2264 :       }
 2265 :     }
 2266 :     //^_023e
 2267 :     if (si >= 0x001E) {
 2268 :       //^48AE:0243
 2269 :       if (si < 0x0026) {
 2270 :         //^48AE:0248
 2271 :         if ((di & 0x8000) != 0) {
 2272 :           //^48AE:024E
 2273 :           return 0;
 2274 :         }
 2275 :         //^48AE:0252
 2276 :         if (_48ae_01ec(_4976_3de2[(_4976_5366 << 1) + (_4976_5354)], 0x000c, 0x0000) != 0) {
 2277 :           //^48AE:0273
 2278 :           return di & 0x0040;
 2279 :         }
 2280 :       }
 2281 :     }
 2282 :     //^48AE:027A
 2283 :     return 1;
 2284 :   }
 2285 : 
 2286 :   //^2C1D:038B
 2287 :   Bit16u _2c1d_038b(ObjectID x1, Bit8u x2, Bit16u x3, Bit16u x4)
 2288 :   {
 2289 :     //^2C1D:038B
 2290 :     ENTER(2);
 2291 :     //^2C1D:0390
 2292 :     __int16 si = x4;
 2293 :     //^2C1D:0393
 2294 :     Bit16u bp02 = QUERY_GDAT_DBSPEC_WORD_VALUE(x1, x2);
 2295 :     //^2C1D:03A4
 2296 :     if (bp02 == 0)
 2297 :       return 0;
 2298 :     //^2C1D:03A8
 2299 :     if ((bp02 & 0x4000) != 0) {
 2300 :       //^2C1D:03AF
 2301 :       switch (si) {
 2302 :         case 0xfffe:
 2303 :         case 0x0002:
 2304 :         case 0x0003:
 2305 :           break;
 2306 :         default:
 2307 :           //^2C1D:03E2
 2308 :           return 0;
 2309 :       }
 2310 :     }
 2311 :     else {
 2312 :       //^2C1D:03C0
 2313 :       if (x3 == 0) {
 2314 :         //^2C1D:03C6
 2315 :         if ((bp02 & 0x8000) == 0)
 2316 :           return 0;
 2317 :       }
 2318 :     }
 2319 :     //^2C1D:03CD
 2320 :     bp02 = (Bit8u)bp02;
 2321 :     //^2C1D:03D4
 2322 :     if (si < 0) {
 2323 :       //^2C1D:03D8
 2324 :       bp02 = -bp02;
 2325 :     }
 2326 :     //^2C1D:03DD
 2327 :     return bp02;
 2328 :   }
 2329 : 
 2330 :   //^
 2331 :   void _2c1d_0300(sk53b4 *ref, Bit16u xx, Bit16u yy); // TODO: Unreachable
 2332 : 
 2333 :   //^2C1D:03E7
 2334 :   void _2c1d_03e7(__int16 player, ObjectID recordLink, Bit16u possess, __int16 x4)
 2335 :   {
 2336 :     //^2C1D:03E7
 2337 :     ObjectID di = recordLink;
 2338 :     __int16 si = x4;
 2339 :     //^2C1D:03F3
 2340 :     if (player < 0)
 2341 :       return;
 2342 :     //^2C1D:03FC
 2343 :     if (di == di.FFFF)
 2344 :       return;
 2345 :     //^2C1D:0404
 2346 :     if (possess < 30) {
 2347 :       //^2C1D:040D
 2348 :       Bit16u bp06 = QUERY_GDAT_DBSPEC_WORD_VALUE(di, 0);
 2349 :       //^2C1D:041A
 2350 :       if (si != 0 && (bp06 & 0x0010) != 0) {
 2351 :         //^2C1D:0425
 2352 :         _24a5_013d();
 2353 :       }
 2354 :       //^2C1D:042A
 2355 :       if ((bp06 & 0x2000) == 0) {
 2356 :         //^2C1D:0434
 2357 :         sk53b4 *bp04 = &_4976_53b4[player];
 2358 :         //^2C1D:0445
 2359 :         Bit16u bp0a = _48ae_01ec(di, possess, 1);
 2360 :         Bit16u bp0c = 0;
 2361 :         //^2C1D:045B
 2362 :         if (si != 0 && si != 3 && si != -2) {
 2363 :           //^2C1D:0472
 2364 :           bp06 = _2c1d_038b(di, 0x0014, bp0a, si);
 2365 :           //^2C1D:0483
 2366 :           if (bp06 != 0) {
 2367 :             //^2C1D:0487
 2368 :             if (si == 1 || si == -1) {
 2369 :               //^2C1D:0491
 2370 :               bp04->w64 += bp06;
 2371 :             }
 2372 :             else {
 2373 :               //^2C1D:049D
 2374 :               if (si == 2) {
 2375 :                 //^2C1D:04A2
 2376 :                 bp04->curMP(BETWEEN_VALUE(0, bp04->curMP() + bp06, 999));
 2377 :               }
 2378 :             }
 2379 :             //^2C1D:04C1
 2380 :             bp04->w50 |= 0x0800;
 2381 :           }
 2382 :           //^2C1D:04CA
 2383 :           for (Bit16u bp08 = 0; bp08 <= 6; bp08++) {
 2384 :             //^2C1D:04D1
 2385 :             bp06 = _2c1d_038b(di, bp08 + 0x15, bp0a, si);
 2386 :             //^2C1D:04E6
 2387 :             if (bp06 != 0) {
 2388 :               //^2C1D:04EA
 2389 :               if (si == 1 || si == -1) {
 2390 :                 //^2C1D:04F4
 2391 :                 bp04->b86[bp08] = bp04->b86[bp08] + bp06;
 2392 :               }
 2393 :               else {
 2394 :                 //^2C1D:050D
 2395 :                 _2c1d_0300(bp04, bp08, bp06);
 2396 :               }
 2397 :               //^2C1D:0520
 2398 :               bp04->w50 |= 0x3000;
 2399 :             }
 2400 :             //^2C1D:0529
 2401 :           }
 2402 :         }
 2403 :         //^2C1D:0532
 2404 :         for (Bit16u bp08 = 0; bp08 < 0x0014; bp08++) {
 2405 :           //^2C1D:0539
 2406 :           bp06 = _2c1d_038b(di, bp08 + 0x1E, bp0a, si);
 2407 :           //^2C1D:054E
 2408 :           if (bp06 != 0) {
 2409 :             //^2C1D:0552
 2410 :             bp04->b173[bp08] = bp04->b173[bp08] + bp06;
 2411 :             //^2C1D:056B
 2412 :             bp04->w50 |= 0x2000;
 2413 :             bp0c = 1;
 2414 :           }
 2415 :           //^2C1D:0579
 2416 :         }
 2417 :         //^2C1D:0582
 2418 :         bp06 = _2c1d_038b(di, 0x0033, bp0a, si);
 2419 :         //^2C1D:0593
 2420 :         if (bp06 != 0) {
 2421 :           //^2C1D:0597
 2422 :           bp04->b259 = bp04->b259 + bp06;
 2423 :           bp0c = 1;
 2424 :         }
 2425 :         //^2C1D:05AC
 2426 :         if (si != 2 && si != -1 && si != 3) {
 2427 :           //^2C1D:05BB
 2428 :           bp06 = _2c1d_038b(di, 0x0032, bp0a, si);
 2429 :           //^2C1D:05CC
 2430 :           if (bp06 != 0) {
 2431 :             //^2C1D:05D0
 2432 :             _4976_57e4.w0 += bp06;
 2433 :             if (si != 0) {
 2434 :               //^2C1D:05D8
 2435 :               _24a5_013d();
 2436 :             }
 2437 :           }
 2438 :         }
 2439 :         //^2C1D:05DD
 2440 :         if (bp0c != 0 && si == 2) {
 2441 :           //^2C1D:05E8
 2442 :           sk5c20 bp16;
 2443 :           bp16.TimerType(14);
 2444 :           //^2C1D:05EC
 2445 :           bp16.SetMap(_4976_4bf4);
 2446 :           bp16.SetTick(QUERY_GDAT_DBSPEC_WORD_VALUE(di, 0x0013) + _4976_4bec);
 2447 :           //^2C1D:061C
 2448 :           bp16.b5 = (Bit8u)player;
 2449 :           //^2C1D:0622
 2450 :           bp16.w6 = di.DBType();
 2451 :           //^2C1D:062D
 2452 :           bp16.w8 = QUERY_CLS2_FROM_RECORD(di);
 2453 :           //^2C1D:0637
 2454 :           QUEUE_TIMER(&bp16);
 2455 :         }
 2456 :       }
 2457 :     }
 2458 :     //^2C1D:0643
 2459 :     if (si != 0) {
 2460 :       //^2C1D:0647
 2461 :       CALC_PLAYER_WEIGHT(player);
 2462 :     }
 2463 :     //^2C1D:0650
 2464 :     return;
 2465 :   }
 2466 : 
 2467 :   //^2C1D:07A3
 2468 :   ObjectID _2c1d_07a3(Bit16u player, Bit16u possess)
 2469 :   {
 2470 :     //^2C1D:07A3
 2471 :     ENTER(4);
 2472 :     //^2C1D:07A9
 2473 :     Bit16u si = possess;
 2474 :     //^2C1D:07AC
 2475 :     sk53b4 *bp04 = &_4976_53b4[player];
 2476 :     //^2C1D:07BD
 2477 :     ObjectID di;
 2478 :     if (si >= 30) {
 2479 :       //^2C1D:07C2
 2480 :       di = _4976_52c4[si -30];
 2481 :       //^2C1D:07CD
 2482 :       _4976_52c4[si -30] = 0xffff;
 2483 :     }
 2484 :     else {
 2485 :       //^2C1D:07DC
 2486 :       di = bp04->Possess(si);
 2487 :       //^2C1D:07EA
 2488 :       bp04->Possess(si, ObjectID::FFFF);
 2489 :     }
 2490 :     //^2C1D:07FA
 2491 :     if (di == di.FFFF) {
 2492 :       //^2C1D:07FF
 2493 :       return ObjectID::FFFF;
 2494 :     }
 2495 :     //^2C1D:0804
 2496 :     if (true
 2497 :       && _4976_5366 -1 == player
 2498 :       && si <= 1
 2499 :       && si == _4976_5354
 2500 :     ) {
 2501 :       //^2C1D:0818
 2502 :       _2759_0541();
 2503 :     }
 2504 :     //^2C1D:081D
 2505 :     _2c1d_03e7(player, di, si, -1);
 2506 :     //^2C1D:082B
 2507 :     return di;
 2508 :   }
 2509 : 
 2510 :   //^2C1D:0831
 2511 :   void _2c1d_0831(Bit16u player, ObjectID rl, Bit16u hand)
 2512 :   {
 2513 :     //^2C1D:0831
 2514 :     ENTER(4);
 2515 :     //^2C1D:0837
 2516 :     ObjectID si = rl;
 2517 :     Bit16u di = hand;
 2518 :     //^2C1D:083D
 2519 :     if (si != si.FFFF) {
 2520 :       //^2C1D:0842
 2521 :       sk53b4 *bp04 = &_4976_53b4[player];
 2522 :       //^2C1D:0853
 2523 :       si.ClearDir();
 2524 :       //^2C1D:0857
 2525 :       if (di >= 30) {
 2526 :         //^2C1D:085C
 2527 :         _4976_52c4[di -30] = si;
 2528 :       }
 2529 :       else {
 2530 :         //^2C1D:0869
 2531 :         bp04->Possess(di, si);
 2532 :       }
 2533 :       //^2C1D:0877
 2534 :       _2c1d_03e7(player, si, di, 1);
 2535 :     }
 2536 :     //^2C1D:0885
 2537 :     return;
 2538 :   }
 2539 : 
 2540 :   //^
 2541 :   Bit16u _2759_0e93(Bit16u player, ObjectID rl, __int16 hand); // TODO: Unreachable
 2542 : 
 2543 :   //^2759:0FB0
 2544 :   void _2759_0fb0(Bit16u player, __int16 hand)
 2545 :   {
 2546 :     //^2759:0FB0
 2547 :     ENTER(14);
 2548 :     //^2759:0FB6
 2549 :     sk53b4 *bp04 = &_4976_53b4[player];
 2550 :     //^2759:0FC7
 2551 :         bp04->b42[hand] = 0;
 2552 :     //^2759:0FD2
 2553 :     if (bp04->curHP() == 0 || hand >= 2)
 2554 :       //^2759:0FE5
 2555 :       return;
 2556 :     //^2759:0FE8
 2557 :     __int16 bp0e = hand ^ 1;
 2558 :     //^2759:0FF1
 2559 :     __int16 bp0a = hand;
 2560 :     //^2759:0FF7
 2561 :     Bit16u bp0c = bp04->b32[hand];
 2562 :     //^2759:1003
 2563 :     bp04->b32[hand] = 0xff;
 2564 :     //^2759:100E
 2565 :     bp04->b66[hand] = 0;
 2566 :     //^2759:1019
 2567 :     if (bp0c == 32) {
 2568 :       //^2759:1022
 2569 :       if (bp04->Possess(bp0e) != ObjectID::FFFF)
 2570 :         //^2759:1034
 2571 :         return;
 2572 :       //^2759:1037
 2573 :       Bit16u di = 12;
 2574 :       //^2759:103C
 2575 :       if (_2759_0e30(player, bp0a, bp04->Possess(di)) != 0) {
 2576 :         //^2759:1059
 2577 : _1059:
 2578 :         ObjectID si = _2c1d_07a3(player, di);
 2579 : 
 2580 :         //^2759:1066
 2581 :         _2c1d_0831(player, si, bp0e);
 2582 :         //^2759:1075
 2583 :         return;
 2584 :       }
 2585 :       else {
 2586 :         //^2759:1078
 2587 :         ObjectID si = bp04->Possess(12);
 2588 :         //^2759:1082
 2589 :         if (IS_CONTAINER_CHEST(si) != 0) {
 2590 :           //^2759:108D
 2591 :           ObjectID *bp08 = &GET_ADDRESS_OF_RECORD9(si)->w2;
 2592 :           //^2759:109C
 2593 :           si = *bp08;
 2594 :           //^2759:10A2
 2595 :           for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 2596 :             //^2759:10A4
 2597 :             if (_2759_0e30(player, bp0a, si) != 0) {
 2598 :               //^2759:10B6
 2599 :               CUT_RECORD_FROM(si, bp08, -1, 0);
 2600 :               //^2759:10C9
 2601 :               //^2759:1066
 2602 :               _2c1d_0831(player, si, bp0e);
 2603 :               //^2759:1075
 2604 :               return;
 2605 :             }
 2606 :             //^2759:10CB
 2607 :           }
 2608 :         }
 2609 :         //^2759:10D9
 2610 :         for (__int16 di = 7; di <= 9; di++) {
 2611 :           //^2759:10DE
 2612 :           if (_2759_0e30(player, bp0a, bp04->Possess(di)) != 0)
 2613 :             //^2759:10FD
 2614 :             goto _1059;
 2615 :           //^2759:1100
 2616 :         }
 2617 :         //^2759:1106
 2618 :         return;
 2619 :       }
 2620 :     }
 2621 :     //^2759:1109
 2622 :     if (bp0c != 42)
 2623 :       //^2759:110F
 2624 :       return;
 2625 :     //^2759:1112
 2626 :     if (bp04->Possess(bp0a) != ObjectID::FFFF)
 2627 :       //^2759:1124
 2628 :       return;
 2629 :     //^2759:1127
 2630 :     Bit16u di = 12;
 2631 :     ObjectID si;
 2632 :     if (_2759_0e93(player, bp04->Possess(di), bp0c) != 0) {
 2633 :       //^2759:1149
 2634 : _1149:
 2635 :       si = _2c1d_07a3(player, di);
 2636 :       //^2759:1156
 2637 : _1156:
 2638 :       _2c1d_0831(player, si, bp0a);
 2639 :       //^2759:1075
 2640 :       return;
 2641 :     }
 2642 :     //^2759:115C
 2643 :     if (IS_CONTAINER_CHEST(si = bp04->Possess(12)) != 0) {
 2644 :       //^2759:1171
 2645 :       ObjectID *bp08 = &GET_ADDRESS_OF_RECORD(si)->w0;
 2646 :       //^2759:1180
 2647 :       si = *bp08;
 2648 : 
 2649 :       //^2759:1186
 2650 :       for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 2651 :         //^2759:1188
 2652 :         if (_2759_0e93(player, si, bp0c) != 0) {
 2653 :           //^2759:119A
 2654 :           CUT_RECORD_FROM(si, bp08, -1, 0);
 2655 :           //^2759:11AD
 2656 :           goto _1156;
 2657 :         }
 2658 :         //^2759:11AF
 2659 :       }
 2660 :     }
 2661 :     //^2759:11BD
 2662 :     for (__int16 di = 7; di <= 9; di++) {
 2663 :       //^2759:11C2
 2664 :       if (_2759_0e93(player, bp04->Possess(di), bp0c) != 0) {
 2665 :         //^2759:11E1
 2666 :         goto _1149;
 2667 :       }
 2668 :       //^2759:11E4
 2669 :     }
 2670 :     //^2759:11EA
 2671 :     si = _2c1d_07a3(player, 12);
 2672 :     //^2759:11F8
 2673 :     if (si != si.FFFF)
 2674 :       //^2759:11FD
 2675 :       goto _1156;
 2676 :     //^2759:1200
 2677 :     return;
 2678 :   }
 2679 : 
 2680 :   //^3E74:506B
 2681 :   Bit8u *_3e74_506b(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4)
 2682 :   {
 2683 :     //^3E74:506B
 2684 :     ENTER(6);
 2685 :     //^3E74:5070
 2686 :     Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, cls3, cls4);
 2687 :     //^3E74:5089
 2688 :     if (cls3 == dtImage && IS_CLS1_CRITICAL_FOR_LOAD(cls1) == 0) {
 2689 :       //^3E74:509C
 2690 :       if (si == 0xffff || _4976_5c98[si].Absent()) {
 2691 :         //^3E74:50BE
 2692 :         si = QUERY_GDAT_ENTRY_DATA_INDEX(0x15, 0xfe, dtImage, 0xfe);
 2693 :       }
 2694 :     }
 2695 :     //^3E74:50D1
 2696 :     Bit8u *bp04;
 2697 :     Bit16u bp06;
 2698 :     if (_4976_5c98[si].Absent() && IS_CLS1_CRITICAL_FOR_LOAD(cls1) != 0) {
 2699 :       //^3E74:50FB
 2700 :       bp04 = _3e74_15a9(si, &bp06, 0);
 2701 :     }
 2702 :     else {
 2703 :       //^3E74:510C
 2704 :       bp04 = REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]);
 2705 :     }
 2706 :     //^3E74:5124
 2707 :     return bp04;
 2708 :   }
 2709 : 
 2710 :   //^3E74:0A77
 2711 :   void FREE_PICT6(SkImage *ref)
 2712 :   {
 2713 :     //^3E74:0A77
 2714 :     ENTER(0);
 2715 :     //^3E74:0A7A
 2716 :     if (_4976_5d76 == 0) {
 2717 :       //^3E74:0A81
 2718 :       if (READ_UI16(ref,-6 +4) == afDefault) {
 2719 :         //^3E74:0A9D
 2720 :         DEALLOC_UPPER_MEMORY(READ_UI32(ref,-6 +0));
 2721 :       }
 2722 :       else {
 2723 :         //^3E74:0ABF
 2724 :         DEALLOC_LOWER_MEMORY(READ_UI32(ref,-6 +0));
 2725 :       }
 2726 :     }
 2727 :     //^3E74:0AE1
 2728 :     return;
 2729 :   }
 2730 : 
 2731 :   //^3E74:52F4
 2732 :   __int16 _3e74_52f4(Bit8u cls1, Bit8u cls2, Bit8u cls4)
 2733 :   {
 2734 :     //^3E74:52F4
 2735 :     ENTER(8);
 2736 :     //^3E74:52FA
 2737 :     Bit16u di = 0;
 2738 :     //^3E74:52FC
 2739 :     RawEntry *bp04 = QUERY_GDAT_ENTRYPTR(cls1, cls2, dtImage, cls4);
 2740 :     //^3E74:5317
 2741 :     if (bp04 == NULL) {
 2742 :       //^3E74:5325
 2743 :       return 0;
 2744 :     }
 2745 :     else {
 2746 :       //^3E74:532A
 2747 :       Bit16u si = bp04->data;
 2748 :       //^3E74:5331
 2749 :       SkImage *bp04;
 2750 :       if (_4976_5c98[si].Absent()) {
 2751 :         //^3E74:534E
 2752 :         di = 1;
 2753 :         //^3E74:5351
 2754 :         bp04 = reinterpret_cast<SkImage *>(_3e74_506b(cls1, cls2, dtImage, cls4));
 2755 :       }
 2756 :       else {
 2757 :         //^3E74:5368
 2758 :         bp04 = reinterpret_cast<SkImage *>(REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]));
 2759 :       }
 2760 :       //^3E74:5386
 2761 :       __int16 bp06 = bp04->Xoffset();
 2762 :       //^3E74:5392
 2763 :       __int16 bp08;
 2764 :       if (bp06 == -32) {
 2765 :         //^3E74:5397
 2766 :         si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImageOffset, cls4);
 2767 :       }
 2768 :       else {
 2769 :         //^3E74:53AE
 2770 :         bp08 = bp04->Yoffset();
 2771 :         //^3E74:53BB
 2772 :         if (bp08 == -32) {
 2773 :           //^3E74:53C0
 2774 :           bp08 = 0;
 2775 :         }
 2776 :         //^3E74:53C5
 2777 :         si = (bp06 << 8) | Bit8u(bp08);
 2778 :       }
 2779 :       //^3E74:53D2
 2780 :       if (di != 0) {
 2781 :         //^3E74:53D8
 2782 :         FREE_PICT6(bp04);
 2783 :       }
 2784 :       //^3E74:53E4
 2785 :       return si;
 2786 :     }
 2787 :   }
 2788 : 
 2789 :   //^0B36:0520
 2790 :   skxxx4 *_0b36_0520(skxxx4 *ref, Bit8u cls1, Bit8u cls2, Bit8u cls4)
 2791 :   {
 2792 :     //^0B36:0520
 2793 :     ENTER(8);
 2794 :         //^0B36:0524
 2795 :     ZERO_MEMORY(ref, 314);
 2796 :     //^0B36:0537
 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 :     //^0B36:0586
 2809 :     if (cls1 != 0xff) {
 2810 :       //^0B36:058F
 2811 :       ref->w6 = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
 2812 :       //^0B36:05AC
 2813 :       __int16 bp02 = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImageOffset, 0xfe);
 2814 :       //^0B36:05C4
 2815 :       if (bp02 != 0) {
 2816 :         //^0B36:05C8
 2817 :         ref->w28 += __int8(bp02 >> 8);
 2818 :         //^0B36:05D3
 2819 :         ref->w30 += __int8(bp02);
 2820 :       }
 2821 :       //^0B36:05DB
 2822 :       bp02 = _3e74_52f4(cls1, cls2, cls4);
 2823 :       //^0B36:05F2
 2824 :       if (bp02 != 0) {
 2825 :         //^0B36:05F6
 2826 :         ref->w28 += __int8(bp02 >> 8);
 2827 :         //^0B36:0601
 2828 :         ref->w30 += __int8(bp02);
 2829 :       }
 2830 :       //^0B36:0609
 2831 :       Bit8u *bp06 = QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, cls4);
 2832 :       //^0B36:0623
 2833 :       if (bp06 == NULL) {
 2834 :         //^0B36:062B
 2835 :         ref->w56 = 256;
 2836 :         //^0B36:0634
 2837 :         bp06 = ref->b58;
 2838 :         //^0B36:0643
 2839 :         __int16 bp08 = 0;
 2840 :         //^0B36:0648
 2841 :         for (; bp08 < 256; bp08++) {
 2842 :           //^0B36:064A
 2843 :           bp06[bp08] = (Bit8u)bp08;
 2844 :           //^0B36:0656
 2845 :         }
 2846 :       }
 2847 :       else {
 2848 :         //^0B36:0662
 2849 :         COPY_MEMORY(bp06, ref->b58, 16);
 2850 :       }
 2851 :     }
 2852 :     //^0B36:0687
 2853 :     return ref;
 2854 :   }
 2855 : 
 2856 :   //^0B36:0A3F
 2857 :   void DRAW_DEF_PICT(skxxx4 *ref)
 2858 :   {
 2859 :     // draw almost all pictures:
 2860 :     // a) dungeon viewport: wallset/scene graphics, ornate graphics, spell graphics,
 2861 :     //    flying items (passing/coming/crossing/placing)
 2862 :     // b) inventory screen: wall paper, zzz button, X button, "water" text, "food" text, 
 2863 :     //    resurrection lever, disk button, and so on
 2864 :     // c) inventory icons: eye, mouth, item icons
 2865 : 
 2866 :     //^0B36:0A3F
 2867 :     ENTER(12);
 2868 :     //^0B36:0A45
 2869 :     if (ref->w18 <= 0 || ref->w20 <= 0)
 2870 :       //^0B36:0A59
 2871 :       return;
 2872 :     //^0B36:0A5C
 2873 :     Bit8u *bp04 = QUERY_PICT_BITS(ref);
 2874 :     //^0B36:0A6E
 2875 :     Bit16u bp06 = ref->w24;
 2876 :     //^0B36:0A78
 2877 :     __int16 bp08;
 2878 :     __int16 bp0a;
 2879 :     if (bp06 == 0xffff) {
 2880 :       //^0B36:0A7D
 2881 :       bp08 = ref->w32;
 2882 :       bp0a = ref->w34;
 2883 :     }
 2884 :     else {
 2885 :       //^0B36:0A8D
 2886 :       if ((bp06 & 0x8000) == 0 || ref->w28 != 0 || ref->w30 != 0) {
 2887 :         //^0B36:0AA5
 2888 :         bp06 |= 0x8000;
 2889 :         //^0B36:0AAE
 2890 :         bp08 = ref->w32 + ref->w28;
 2891 :         bp0a = ref->w34 + ref->w30;
 2892 :       }
 2893 :       else {
 2894 :         //^0B36:0AC6
 2895 :         bp08 = ref->w18;
 2896 :         bp0a = ref->w20;
 2897 :       }
 2898 :       //^0B36:0AD4
 2899 :       if (QUERY_BLIT_RECT(bp04, &ref->rc36, bp06, &bp08, &bp0a, ref->w26) == NULL)
 2900 :         //^0B36:0B07
 2901 :         return;
 2902 :     }
 2903 :     //^0B36:0B0A
 2904 :     bp08 += ref->w14;
 2905 :     bp0a += ref->w16;
 2906 :     __int16 si = READ_UI16(bp04,-4);
 2907 :     __int16 di = ref->rc36.cx +bp08;
 2908 :     //^0B36:0B2E
 2909 :     if (si > di && (ref->w50 & 0x0001) != 0) {
 2910 :       //^0B36:0B3A
 2911 :       si -= di;
 2912 :     }
 2913 :     else {
 2914 :       //^0B36:0B3E
 2915 :       si = 0;
 2916 :     }
 2917 :     //^0B36:0B40
 2918 :     if ((ref->w50 & 0x0001) != 0) {
 2919 :       //^0B36:0B4B
 2920 :       bp08 = 0;
 2921 :     }
 2922 :     //^0B36:0B50
 2923 :     bp08 += si;
 2924 :     //^0B36:0B53
 2925 :     si = READ_I16(bp04,-2);
 2926 :     //^0B36:0B5A
 2927 :     di = ref->rc36.cy +bp0a;
 2928 :     //^0B36:0B66
 2929 :     if (si > di && (ref->w50 & 0x0002) != 0) {
 2930 :       //^0B36:0B72
 2931 :       si -= di;
 2932 :     }
 2933 :     else {
 2934 :       //^0B36:0B76
 2935 :       si = 0;
 2936 :     }
 2937 :     //^0B36:0B78
 2938 :     if ((ref->w50 & 0x0002) != 0) {
 2939 :       //^0B36:0B83
 2940 :       bp0a = 0;
 2941 :     }
 2942 :     //^0B36:0B88
 2943 :     bp0a += si;
 2944 :     //^0B36:0B8B
 2945 :     Bit16u bp0c;
 2946 :     if (ref->pb44 == _4976_4964) {
 2947 :       //^0B36:0BA2
 2948 :       si = _4976_00f0;
 2949 :       di = _4976_00f2;
 2950 :       bp0c = 8;
 2951 :     }
 2952 :     else {
 2953 :       //^0B36:0BB1
 2954 :       si = READ_I16(ref->pb44,-4);
 2955 :       //^0B36:0BBC
 2956 :       di = READ_I16(ref->pb44,-2);
 2957 :       //^0B36:0BC7
 2958 :       bp0c = READ_I16(ref->pb44,-6);
 2959 :     }
 2960 :     //^0B36:0BD5
 2961 :     if (ref->w48 != 0xfffe) {
 2962 :       //^0B36:0BDF
 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 :     //^0B36:0C3D
 2979 :     ref->w32 = bp08;
 2980 :     ref->w34 = bp0a;
 2981 :     //^0B36:0C4E
 2982 :     return;
 2983 :   }
 2984 : 
 2985 :   //^0B36:0139
 2986 :   Bit8u *QUERY_PICT_BITS(skxxx5 *ref)
 2987 :   {
 2988 :     //^0B36:0139
 2989 :     ENTER(0);
 2990 :     //^0B36:013D
 2991 :     Bit16u si = ref->w4;
 2992 :     //^0B36:0144
 2993 :     if ((si & 0x0004) != 0) {
 2994 :       //^0B36:014A
 2995 :       return ref->pb0 = QUERY_GDAT_IMAGE_ENTRY_BUFF(ref->b8, ref->b9, ref->b11);
 2996 :     }
 2997 :     //^0B36:016D
 2998 :     else if ((si & 0x0008) != 0) {
 2999 :       //^0B36:0173
 3000 :       return reinterpret_cast<Bit8u *>(_3e74_5817(ref->w12));
 3001 :     }
 3002 :     else {
 3003 :       //^0B36:0182
 3004 :       return ref->pb0;
 3005 :     }
 3006 :   }
 3007 : 
 3008 :   //^0B36:11C0
 3009 :   void _0b36_11c0(skxxx4 *xx, sk3f6c *yy, Bit16u ss, __int16 tt)
 3010 :   {
 3011 :     //^0B36:11C0
 3012 :         ENTER(12);
 3013 :     //^0B36:11C4
 3014 :     xx->pb44 = reinterpret_cast<Bit8u *>(_3e74_5817(yy->w0));
 3015 :     //^0B36:11DB
 3016 :     SRECT bp08;
 3017 :     if (ss == 0xffff) {
 3018 :       ATLASSERT(false); // FTL's miss logic?
 3019 : 
 3020 :       //^0B36:11E1
 3021 :       COPY_MEMORY(&xx->rc36, &bp08, 8);
 3022 :       //^0B36:11FC
 3023 :       goto _123d;
 3024 :     }
 3025 :     else {
 3026 :       //^0B36:11FE
 3027 :       __int16 bp0a = xx->w18;
 3028 :       __int16 bp0c = xx->w20;
 3029 :       //^0B36:120F
 3030 :       if (QUERY_BLIT_RECT(QUERY_PICT_BITS(xx), &bp08, ss, &bp0a, &bp0c, -1) != NULL) {
 3031 :         //^0B36:123D
 3032 : _123d:
 3033 :         xx->w18 += bp0a;
 3034 :         xx->w20 += bp0c;
 3035 :         //^0B36:124E
 3036 :         _0b36_0fab(yy, &bp08, &xx->rc36);
 3037 :         //^0B36:126A
 3038 :         xx->w24 = 0xffff;
 3039 :         xx->w48 = tt;
 3040 :         //^0B36:127A
 3041 :         DRAW_DEF_PICT(xx);
 3042 :         //^0B36:1286
 3043 :         _0b36_0d67(yy, &bp08);
 3044 :       }
 3045 :     }
 3046 :     //^0B36:1298
 3047 :     return;
 3048 :   }
 3049 : 
 3050 :   //^0B36:0036
 3051 :   Bit16u _0b36_0036(__int16 xx, __int16 yy)
 3052 :   {
 3053 :     //^0B36:0036
 3054 :     ENTER(0);
 3055 :     //^0B36:0039
 3056 :     return (__int16(xx * yy) + (yy >> 1)) >> 6;
 3057 :   }
 3058 : 
 3059 :   //^0B36:00C3
 3060 :   Bit8u *_0b36_00c3(__int16 xx, skxxx5 *ref)
 3061 :   {
 3062 :     //^0B36:00C3
 3063 :     ENTER(4);
 3064 :     //^0B36:00C7
 3065 :     Bit8u *bp04 = reinterpret_cast<Bit8u *>(_3e74_5817(xx));
 3066 :     //^0B36:00D6
 3067 :     if (ref != NULL) {
 3068 :       //^0B36:00DE
 3069 :       ref->pb0 = bp04;
 3070 :       //^0B36:00EE
 3071 :       ref->w14 = 0;
 3072 :       ref->w16 = 0;
 3073 :       //^0B36:00FA
 3074 :       ref->w18 = READ_UI16(bp04,-4);
 3075 :       //^0B36:0108
 3076 :       ref->w20 = READ_UI16(bp04,-2);
 3077 :       //^0B36:0116
 3078 :       ref->w22 = READ_UI16(bp04,-6);
 3079 :       //^0B36:0124
 3080 :             ref->w12 = xx;
 3081 :       //^0B36:012B
 3082 :       ref->w4 = 8;
 3083 :     }
 3084 :     //^0B36:0131
 3085 :     return bp04;
 3086 :   }
 3087 : 
 3088 :   //^0B36:004B
 3089 :   Bit8u *_0b36_004b(skxxx5 *ref)
 3090 :   {
 3091 :     //^0B36:004B
 3092 :     ENTER(4);
 3093 :     //^0B36:004F
 3094 :     Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(ref->b8, ref->b9, ref->b11);
 3095 :     //^0B36:006F
 3096 :     ref->pb0 = bp04;
 3097 :     //^0B36:007F
 3098 :     ref->w14 = 0;
 3099 :     ref->w16 = 0;
 3100 :     //^0B36:008B
 3101 :     ref->w18 = READ_UI16(bp04,-4);
 3102 :     //^0B36:0099
 3103 :     ref->w20 = READ_UI16(bp04,-2);
 3104 :     //^0B36:00A7
 3105 :     ref->w22 = READ_UI16(bp04,-6);
 3106 :     //^0B36:00B5
 3107 :     ref->w4 = 4;
 3108 :     //^0B36:00BB
 3109 :     return bp04;
 3110 :   }
 3111 : 
 3112 :   //^3E74:58BF
 3113 :   void _3e74_58bf(Bit8u cls1, Bit8u cls2, Bit8u cls4)
 3114 :   {
 3115 :     //^3E74:58BF
 3116 :     ENTER(4);
 3117 :     //^3E74:58C5
 3118 :     Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
 3119 :     //^3E74:58DC
 3120 :     if (si != 0xffff && _4976_5c98[si].Absent()) {
 3121 :       //^3E74:58FC
 3122 :       si = QUERY_GDAT_ENTRY_DATA_INDEX(0x15,0xfe,dtImage,0xfe);      
 3123 :     }
 3124 :     //^3E74:590F
 3125 :     if (si != 0xffff) {
 3126 :       //^3E74:5914
 3127 :       Bit16u di = _3e74_0c62(si);
 3128 :       //^3E74:591C
 3129 :       if (di == 0xffff) {
 3130 :         if (_4976_5c98[si].Absent()) {
 3131 :           //^3E74:593C
 3132 :           return;
 3133 :         }
 3134 :         //^3E74:593E
 3135 :         SkImage *bp04 = reinterpret_cast<SkImage *>(REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]));
 3136 :         //^3E74:595C
 3137 :         if (bp04->Yoffset() != -32) {
 3138 :           //^3E74:5969
 3139 :           return;
 3140 :         }
 3141 :         //^3E74:596B
 3142 :         if (bp04->BitsPixel() != 8) {
 3143 :           //^3E74:5980
 3144 :           return;
 3145 :         }
 3146 :         //^3E74:5982
 3147 :         _4976_4807 = si;
 3148 :         //^3E74:5986
 3149 :         return;
 3150 :       }
 3151 :       else {
 3152 :         //^3E74:5988
 3153 :         _3e74_4549(di);
 3154 :       }
 3155 :     }
 3156 :     //^3E74:598E
 3157 :     return;
 3158 :   }
 3159 : 
 3160 :   //^0B36:018F
 3161 :   void _0b36_018f(skxxx5 *ref)
 3162 :   {
 3163 :     //^0B36:018F
 3164 :     ENTER(0);
 3165 :     //^0B36:0192
 3166 :     if ((ref->w4 & 0x0004) != 0) {
 3167 :       //^0B36:019D
 3168 :       _3e74_58bf(ref->b8, ref->b9, ref->b11);
 3169 :     }
 3170 :     //^0B36:01B6
 3171 :     else if ((ref->w4 & 0x0008) != 0) {
 3172 :       //^0B36:01C1
 3173 :       _3e74_583a(ref->w12);
 3174 :     }
 3175 : 
 3176 :   }
 3177 : 
 3178 :   //^0B36:068F
 3179 :   Bit32u _0b36_068f(skxxx4 *ref)
 3180 :   {
 3181 :     //^0B36:068F
 3182 :     ENTER(0);
 3183 :     //^0B36:0692
 3184 :     return (Bit32u(ref->w6 & 0x1fff) << 12) | ((ref->w52 & 0x007f) << 5) | (ref->w54 & 0x001f);
 3185 :   }
 3186 : 
 3187 :   //^3E74:5992
 3188 :   void _3e74_5992(Bit8u cls1, Bit8u cls2, Bit8u cls4)
 3189 :   {
 3190 :     //^3E74:5992
 3191 :     ENTER(0);
 3192 :     //^3E74:5997
 3193 :     Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
 3194 :     //^3E74:59AE
 3195 :     if (si == 0xffff || _4976_5c98[si].Absent()) {
 3196 :       //^3E74:59CE
 3197 :       si = QUERY_GDAT_ENTRY_DATA_INDEX(0x15,0xfe,dtImage,0xfe);
 3198 :     }
 3199 :     //^3E74:59E1
 3200 :     if (si == 0xffff)
 3201 :       //^3E74:59E4
 3202 :       return;
 3203 :     //^3E74:59E6
 3204 :     if (_4976_4807 == si) {
 3205 :       //^3E74:59EC
 3206 :       _4976_4807 = 0xffff;
 3207 :     }
 3208 :     //^3E74:59F2
 3209 :     Bit16u di = _3e74_0c62(si);
 3210 :     //^3E74:59FA
 3211 :     if (di != 0xffff) {
 3212 :       //^3E74:59FF
 3213 :       _3e74_4701(di, 0);
 3214 :     }
 3215 :     //^3E74:5A08
 3216 :     return;
 3217 :   }
 3218 : 
 3219 :   //^0B36:01CD
 3220 :   void _0b36_01cd(skxxx5 *ref)
 3221 :   {
 3222 :     //^0B36:01CD
 3223 :     ENTER(0);
 3224 :     //^0B36:01D0
 3225 :     if ((ref->w4 & 0x0004) != 0) {
 3226 :       //^0B36:01DB
 3227 :       _3e74_5992(ref->b8, ref->b9, ref->b11);
 3228 :     }
 3229 :     //^0B36:01F4
 3230 :     else if ((ref->w4 & 0x0008) != 0) {
 3231 :       //^0B36:01FF
 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); // TODO: Unreachable
 3239 : 
 3240 :   //^44C8:000F
 3241 :   void FIRE_BLIT_TO_MEMORY_ROW_4TO4BPP(Bit16u offSrc, Bit16u offDst, Bit16u width)
 3242 :   {
 3243 :     //^44C8:000F
 3244 :     ENTER(0);
 3245 :     //^44C8:0015
 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 :       //^44C8:0028
 3254 :       si += offSrc;
 3255 :       //^44C8:002D
 3256 :       bool carry = (offSrc & 1) ? true : false;
 3257 :       offSrc >>= 1;
 3258 :       if (!carry) {
 3259 :         //^44C8:0034
 3260 :         di += offSrc;
 3261 : 
 3262 :         //^44C8:0036
 3263 : _0036:
 3264 :         bool carry = (cx & 1) ? true : false;
 3265 :         cx >>= 1;
 3266 :         {
 3267 :           //^44C8:0039
 3268 :           bool carry = (cx & 1) ? true : false;
 3269 :           cx >>= 1;
 3270 :           //^44C8:003B
 3271 :           if (carry) {
 3272 :             //^44C8:003D
 3273 :             *di = *si; di++; si++;
 3274 :           }
 3275 :           //^44C8:003E
 3276 :           while (cx != 0) {
 3277 :             //^44C8:0043
 3278 :             *di = *si; di++; si++;
 3279 :             *di = *si; di++; si++;
 3280 :             cx--;
 3281 :           }
 3282 :         }
 3283 :         //^44C8:0049
 3284 :         if (carry) {
 3285 :           *di = (*si & 0xf0) | (*di & 0x0f); si++; di++;
 3286 :         }
 3287 :       }
 3288 :       else {
 3289 :         //^44C8:00B5
 3290 :         di += offSrc;
 3291 :         //^44C8:00B7
 3292 :         Bit8u bh = *di;
 3293 :         //^44C8:00BA
 3294 :         cx++;
 3295 :         bool carry = (cx & 1) ? true : false;
 3296 :         cx >>= 1;
 3297 :         //^44C8:00BE
 3298 :         if (cx != 0) {
 3299 :           //^44C8:00C0
 3300 :           bool carry = (cx & 1) ? true : false;
 3301 :           //^44C8:00C2
 3302 :           if (carry) {
 3303 :             //^44C8:00C4
 3304 :             Bit8u al = *si; si++;
 3305 :             //^44C8:00C6
 3306 :             *di = (bh & 0xf0) | (al >> 4); di++;
 3307 :             bh = al << 4;
 3308 :           }
 3309 :           //^44C8:00D6
 3310 :           if (cx != 0) {
 3311 :             //^44C8:00D8
 3312 :             bh &= 0xf0;
 3313 :             do {
 3314 :               // AL   AH   BL   BH
 3315 :               // m34  m56       m12
 3316 :               //                m10
 3317 :               // m63  m45
 3318 :               //           m63
 3319 :               // m10            m63
 3320 :               //           m60  m03
 3321 :               // m13
 3322 :               //                m60
 3323 :               // ------------------
 3324 :               // m13  m45       m60
 3325 : 
 3326 :               //^44C8:00DB
 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 :               //^44C8:00EC
 3333 :             } while (--cx != 0);
 3334 :           }
 3335 :         }
 3336 :         //^44C8:00EE
 3337 :         if (carry) {
 3338 :           //^44C8:00F1
 3339 :           *di = (*di & 0x0f) | bh; di++;
 3340 :         }
 3341 :       }
 3342 :     }
 3343 :     else {
 3344 :       //^44C8:0068
 3345 :             si += offSrc;
 3346 :       {
 3347 :         //^44C8:006A
 3348 :         bool carry = (offDst & 1) ? true : false;
 3349 :         offDst >>= 1;
 3350 :         //^44C8:006F
 3351 :         if (carry) {
 3352 :           //^44C8:0059
 3353 :           di += offDst;
 3354 :           //^44C8:005B
 3355 :           *di = (*si & 0x0f) | (*di & 0xf0); si++; di++;
 3356 :           //^44C8:0065
 3357 :           cx--;
 3358 :           //^44C8:0066
 3359 :           goto _0036;
 3360 :         }
 3361 :       }
 3362 :       //^44C8:0071
 3363 :       di += offDst;
 3364 :       //^44C8:0073
 3365 :       Bit8u bh = *si; si++;
 3366 :       {
 3367 :         //^44C8:0076
 3368 :         bool carry = (cx & 1) ? true : false;
 3369 :         cx >>= 1;
 3370 :         //^44C8:0079
 3371 :         if (cx != 0) {
 3372 :           //^44C8:007B
 3373 :           bool carry = (cx & 1) ? true : false;
 3374 :           cx >>= 1;
 3375 :           //^44C8:007D
 3376 :           if (carry) {
 3377 :             //^44C8:007F
 3378 :             Bit8u bl = *si;
 3379 :             *di = (*si >> 4) | (bh << 4); di++; si++;
 3380 :             bh = bl;
 3381 :           }
 3382 :           //^44C8:008C
 3383 :           if (cx != 0) {
 3384 :             //^44C8:008E
 3385 :             bh &= 0x0f;
 3386 :             do {
 3387 :               // AL   AH   BL   BH
 3388 :               // m23  m45  ?    m01
 3389 :               //           m45
 3390 :               //      m01       m45
 3391 :               //           m05  m40
 3392 :               //      m41
 3393 :               //                m05
 3394 :               // m12  m34
 3395 :               // ------------------
 3396 :               // m12  m34       m05
 3397 : 
 3398 :               //^44C8:0091
 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 :               //^44C8:00A2
 3405 :             } while (--cx != 0);
 3406 :           }
 3407 :         }
 3408 :         //^44C8:00A4
 3409 :         if (carry) {
 3410 :           //^44C8:00A7
 3411 :           *di = (*di & 0x0f) | (bh << 4);
 3412 :         }
 3413 :       }
 3414 :     }
 3415 :     //^44C8:00F9
 3416 :     return;
 3417 :   }
 3418 : 
 3419 :   //^44C8:20E5
 3420 :   void _44c8_20e5(Bit16u xx, Bit16u yy, Bit16u ss, Bit16u tt)
 3421 :   {
 3422 :     //^44C8:20E5
 3423 :     ENTER(0);
 3424 :     //^44C8:20EA
 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 :       //^44C8:2111
 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 :     //^44C8:213E
 3452 :     return;
 3453 :   }
 3454 : 
 3455 :   //^
 3456 :   void _44c8_2143(Bit16u xx, Bit16u yy, Bit16u ss, Bit16u tt); // TODO: Unreachable
 3457 : 
 3458 : #pragma warning(push)
 3459 : #pragma warning(disable: 4700)
 3460 : 
 3461 :   //^44C8:21F3
 3462 :   void _44c8_21f3(Bit8u *xx, Bit8u *yy, Bit16u ss, Bit16u tt, Bit16u uu, Bit16u vv, Bit32u aa)
 3463 :   {
 3464 :     //^44C8:21F3
 3465 :     ENTER(12);
 3466 :     //^44C8:21F9
 3467 :     _4976_5e64 = xx;
 3468 :     //^44C8:2206
 3469 :     _4976_5e6a = yy;
 3470 :     //^44C8:2213
 3471 :     _4976_5dbe = aa;
 3472 :     //^44C8:2220
 3473 :     Bit16u bp08 = (uu +1) & 0xfffe;
 3474 :     //^44C8:222D
 3475 :     Bit16u bp0a = (bp08 +1) & 0xfffe;
 3476 :     //^44C8:2234
 3477 :     Bit16u bp04 = (__int32(__int16(ss)) << 7) / __int16(uu);
 3478 :     //^44C8:224F
 3479 :     Bit16u bp06 = (__int32(__int16(tt)) << 7) / __int16(vv);
 3480 :     //^44C8:226A
 3481 :     Bit16u bp02 = bp06 >> 1;
 3482 :     //^44C8:226F
 3483 :     Bit16u bp0c;
 3484 :     for (Bit16u si = 0; si < vv; si++) {
 3485 :       //^44C8:2274
 3486 :       Bit16u di = bp02 >> 7;
 3487 :       //^44C8:227C
 3488 :       if (bp0c == di && si > 0) {
 3489 :         //^44C8:2285
 3490 :         _4976_5e64 = yy;
 3491 :         //^44C8:2292
 3492 :         FIRE_BLIT_TO_MEMORY_ROW_4TO4BPP((si -1) * bp08, si * bp08, uu);
 3493 :         //^44C8:22A9
 3494 :         _4976_5e64 = xx;
 3495 :       }
 3496 :       //^44C8:22B8
 3497 :       else if (aa == 0) {
 3498 :         //^44C8:22C0
 3499 :         _44c8_20e5(di * bp0a, si * bp08, bp04, uu);
 3500 :       }
 3501 :       else {
 3502 :         //^44C8:22D8
 3503 :         _44c8_2143(di * bp0a, si * bp08, bp04, uu);
 3504 :       }
 3505 :       //^44C8:22F1
 3506 :       bp0c = di;
 3507 :       //^44C8:22F4
 3508 :       bp02 += bp06;
 3509 :       //^44C8:22FA
 3510 :     }
 3511 :     //^44C8:2303
 3512 :     return;
 3513 :   }
 3514 : #pragma warning(pop)
 3515 : 
 3516 :   //^0B36:06D3
 3517 :   skxxx4 *_0b36_06d3(skxxx4 *ref)
 3518 :   {
 3519 :     //^0B36:06D3
 3520 :     ENTER(364);
 3521 :     //^0B36:06D9
 3522 :     Bit16u bp12 = (ref->w52 != 64 || ref->w54 != 64) ? 1 : 0;
 3523 :     Bit16u bp14 = 0;
 3524 :     //^0B36:06F9
 3525 :     Bit16u bp16 = (ref->w6 == 0xffff && ref->w12 >= 0) ? 1 : 0;
 3526 :     //^0B36:0714
 3527 :     if (bp12 != 0) {
 3528 :       //^0B36:071A
 3529 :       ref->w28 = _0b36_0036(ref->w28, ref->w52);
 3530 :       //^0B36:0732
 3531 :       ref->w30 = _0b36_0036(ref->w30, ref->w54);
 3532 :     }
 3533 :     //^0B36:0747
 3534 :     if ((ref->w52 & 0x0001) != 0) {
 3535 :       //^0B36:0752
 3536 :       ref->w28 = - ref->w28;
 3537 :     }
 3538 :     //^0B36:075C
 3539 :     if (ref->w48 == 0xfffd)
 3540 :       //^0B36:0766
 3541 :       //^0B36:0A35
 3542 :       return ref;
 3543 :     //^0B36:0769
 3544 :     if (bp12 == 0 && bp14 == 0) {
 3545 :       //^0B36:0775
 3546 :       if (bp16 != 0) {
 3547 :         //^0B36:077B
 3548 :         //^0B36:0788
 3549 :         _0b36_00c3(ref->w12, ref);
 3550 :         //^0B36:0A35
 3551 :         return ref;
 3552 :       }
 3553 :       else {
 3554 :         //^0B36:0792
 3555 :         _0b36_004b(ref);
 3556 :         //^0B36:079E
 3557 :         //^0B36:0A35
 3558 :         return ref;
 3559 :       }
 3560 :     }
 3561 :     //^0B36:07A1
 3562 :     Bit16u bp18;
 3563 :     Bit8u *bp04;
 3564 :     Bit8u *bp08;
 3565 :     skxxx5 bp32;
 3566 :     if (bp16 != 0) {
 3567 :       //^0B36:07A7
 3568 :       bp18 = _3e74_5888();
 3569 :       //^0B36:07AF
 3570 :       COPY_MEMORY(ref, &bp32, 24);
 3571 :       //^0B36:07C6
 3572 :       Bit8u *bp08 = _0b36_00c3(bp32.w12, &bp32);
 3573 :       //^0B36:07DB
 3574 :       _0b36_018f(&bp32);
 3575 :       //^0B36:07E6
 3576 :       bp04 = NULL;
 3577 :     }
 3578 :     else {
 3579 :       //^0B36:07F3
 3580 :       Bit32u bp10 = _0b36_068f(ref);
 3581 :       //^0B36:0805
 3582 :       if (_3e74_55f9(bp10, &bp18) != 0) {
 3583 :         //^0B36:081C
 3584 :         //^0B36:0788
 3585 :         _0b36_00c3(bp18, ref);
 3586 :         //^0B36:0A35
 3587 :         return ref;
 3588 :       }
 3589 :       else {
 3590 :         //^0B36:0828
 3591 :         bp04 = NULL;
 3592 :         bp08 = NULL;
 3593 :         //^0B36:0838
 3594 :         if (bp08 == NULL) {
 3595 :           //^0B36:0840
 3596 :           COPY_MEMORY(ref, &bp32, 24);
 3597 :           //^0B36:0857
 3598 :           bp08 = _0b36_004b(&bp32);
 3599 :           //^0B36:0868
 3600 :           _0b36_018f(&bp32);
 3601 :         }
 3602 :       }
 3603 :     }
 3604 :     //^0B36:0873
 3605 :     if ((bp32.w4 & 0x0010) != 0) {
 3606 :       //^0B36:087D
 3607 :       skxxx4 bp016c;
 3608 :       COPY_MEMORY(ref, &bp016c, 314);
 3609 :       //^0B36:0896
 3610 :       bp016c.w50 = 0;
 3611 :       bp016c.w54 = 64;
 3612 :       bp016c.w52 = 64;
 3613 :       //^0B36:08A7
 3614 :       Bit16u bp1a;
 3615 :       if (_3e74_55f9(_0b36_068f(&bp016c), &bp1a) == 0) {
 3616 :         //^0B36:08C6
 3617 :         bp08 = _3e74_57b5(bp1a, bp32.w18, bp32.w20, bp32.w22);
 3618 :         //^0B36:08E0
 3619 :         Bit8u *bp0c = QUERY_PICT_BITS(&bp32);
 3620 :         //^0B36:08F1
 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 :       //^0B36:0936
 3637 :       _0b36_01cd(&bp32);
 3638 :       //^0B36:0941
 3639 :       Bit8u *bp08 = _0b36_00c3(bp1a, &bp32);
 3640 :       //^0B36:0956
 3641 :       _0b36_018f(&bp32);
 3642 :     }
 3643 :     //^0B36:0961
 3644 :     if (bp12 != 0) {
 3645 :       //^0B36:096A
 3646 :       __int16 di = _0b36_0036(bp32.w18, ref->w52);
 3647 :       //^0B36:097C
 3648 :       __int16 si = _0b36_0036(bp32.w20, ref->w54);
 3649 :       //^0B36:098E
 3650 :       if (di <= 0 || si <= 0) {
 3651 :         //^0B36:0996
 3652 :         ref->w18 = di;
 3653 :         ref->w20 = si;
 3654 :       }
 3655 :       else {
 3656 :         //^0B36:09A3
 3657 :         _3e74_57b5(bp18, di, si, bp32.w22);
 3658 :         //^0B36:09B3
 3659 :         bp08 = QUERY_PICT_BITS(&bp32);
 3660 :         //^0B36:09C4
 3661 :         bp04 = _0b36_00c3(bp18, ref);
 3662 :         //^0B36:09DA
 3663 :         if (bp32.w22 == 8) {
 3664 :           //^0B36:09E0
 3665 :           _44c8_2351(bp08, bp04, bp32.w18, bp32.w20, di, si);
 3666 :         }
 3667 :         else {
 3668 :           //^0B36:09FE
 3669 :           _44c8_21f3(bp08, bp04, bp32.w18, bp32.w20, si, di, 0);
 3670 :         }
 3671 :       }
 3672 :     }
 3673 :     //^0B36:0A1E
 3674 :     _0b36_01cd(&bp32);
 3675 :     //^0B36:0A29
 3676 :     _3e74_585a(bp18, 0);
 3677 :     //^0B36:0A35
 3678 :     return ref;
 3679 :   }
 3680 : 
 3681 :   //^0B36:131A
 3682 :   void DRAW_SIMPLE_STR(sk3f6c *ref, Bit16u rectno, Bit16u clr1, Bit16u clr2, Bit8u *str)
 3683 :   {
 3684 :     // you can draw:
 3685 :     // e.g. spell symbols, represented as "<<"," ","","ž",")-","‡™".
 3686 :     // e.g. damage amount like "80"
 3687 : 
 3688 :     // their drawStr is regurally scheduled. e.g. you can print damage "80" at portrait/status panel. no another position/text pattern.
 3689 : 
 3690 :     //^0B36:131A
 3691 :     ENTER(12);
 3692 :     //^0B36:131E
 3693 :     __int16 bp02;
 3694 :     __int16 bp04;
 3695 :     SRECT bp0c;
 3696 :     // bp0c -> bp0c.x
 3697 :     // bp0a -> bp0c.y
 3698 :     // bp08 -> bp0c.cx
 3699 :     // bp06 -> bp0c.cy
 3700 : 
 3701 :     if (_3929_03dc(str, &bp02, &bp04) != 0 && QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1) != 0) {
 3702 :       //^0B36:135E
 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 :       //^0B36:139D
 3715 :       _0b36_0d67(ref, &bp0c);
 3716 :     }
 3717 :     //^0B36:13AF
 3718 :     return;
 3719 :   }
 3720 : 
 3721 :   //^0B36:10B6
 3722 :   void DRAW_ICON_PICT_BUFF(Bit8u *buff, sk3f6c *tt, SRECT *rc, __int16 srcx, __int16 srcy, __int16 colorkey, __int16 flipmirror, Bit8u *localpal)
 3723 :   {
 3724 :     // draw icon image such as:
 3725 :     // a) right part of panel (commander part)
 3726 :     //    directional/curved arrow, 2x2 floor status panel, command buttons, X button, spell board,
 3727 :     // b) upper part of panel (status part)
 3728 :     //    player plate, hand icon, portrait icon
 3729 :     // c) upper and/or right part of panel
 3730 :     //    item icon (such as dagger, etc), colored player icon
 3731 : 
 3732 :     //^0B36:10B6
 3733 :     ENTER(8);
 3734 :     //^0B36:10BA
 3735 :     if (rc != NULL) {
 3736 :       //^0B36:10C2
 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 :       //^0B36:1121
 3753 :       _0b36_0d67(tt, rc);
 3754 :     }
 3755 :     //^0B36:1134
 3756 :     return;
 3757 :   }
 3758 : 
 3759 :   //^0B36:1136
 3760 :   void DRAW_ICON_PICT_ENTRY(Bit8u cls1, Bit8u cls2, Bit8u cls4, sk3f6c *ss, Bit16u rectno, __int16 colorkey)
 3761 :   {
 3762 :     //^0B36:1136
 3763 :     ENTER(20);
 3764 :     //^0B36:113A
 3765 :     __int16 bp0c = 0;
 3766 :     __int16 bp0a = 0;
 3767 :     //^0B36:1142
 3768 :     Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(cls1, cls2, cls4);
 3769 :     //^0B36:115C
 3770 :     SRECT bp14;
 3771 :     SRECT *bp08 = QUERY_BLIT_RECT(bp04, &bp14, rectno, &bp0a, &bp0c, -1);
 3772 :     //^0B36:1184
 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 :     //^0B36:11BE
 3784 :     return;
 3785 :   }
 3786 : 
 3787 :   //^29EE:00E0
 3788 :   void _29ee_00e0(__int16 xx)
 3789 :   {
 3790 :     //^29EE:00E0
 3791 :     ENTER(324);
 3792 :     //^29EE:00E6
 3793 :     __int16 di = xx;
 3794 :     //^29EE:00E9
 3795 :     _29ee_00a3(1);
 3796 :     //^29EE:00F0
 3797 :     Bit8u bp01 = 4;
 3798 :     Bit8u bp02 = 1;
 3799 :     //^29EE:00F8
 3800 :     if (di < 0) {
 3801 :       //^29EE:00FC
 3802 :       switch (di) {
 3803 :         case -6:
 3804 :           //^29EE:010F
 3805 :           bp02 = 25;
 3806 :           break;
 3807 :         case -2:
 3808 :           //^29EE:011B
 3809 :           bp02 = 23;
 3810 :           break;
 3811 :         case -1:
 3812 :           //^29EE:0115
 3813 :           bp02 = 24;
 3814 :           break;
 3815 :         default:
 3816 :           //^29EE:0121
 3817 :           bp01 = 5;
 3818 :           //^29EE:0125
 3819 :           if (di == -3) {
 3820 :             //^29EE:012A
 3821 :             bp02 = 14;
 3822 :           }
 3823 :           //^29EE:0130
 3824 :           else if (di == -4) {
 3825 :             //^29EE:0135
 3826 :             bp02 = 12;
 3827 :           }
 3828 :           else {
 3829 :             //^29EE:013B
 3830 :             bp02 = 13;
 3831 :           }
 3832 :           break;
 3833 :       }
 3834 :     }
 3835 :     //^29EE:013F
 3836 :     skxxx4 bp0144;
 3837 :     _0b36_0520(&bp0144, 1, bp01, bp02);
 3838 :     //^29EE:0157
 3839 :     if (di >= 0 && di <= 40) {
 3840 :       //^29EE:0160
 3841 :       if (di > 15) {
 3842 :         //^29EE:0165
 3843 :         bp0144.w52 = 0x002b;
 3844 :         bp0144.w54 = 0x003b;
 3845 :       }
 3846 :       else {
 3847 :         //^29EE:0173
 3848 :         bp0144.w52 = 0x001c;
 3849 :         bp0144.w54 = 0x002c;
 3850 :       }
 3851 :     }
 3852 :     //^29EE:017F
 3853 :     _0b36_11c0(_0b36_06d3(&bp0144), &_4976_3f6c, 57, -1);
 3854 :     //^29EE:019E
 3855 :     if (di >= 0) {
 3856 :       //^29EE:01A2
 3857 :       Bit16u si = 5;
 3858 :       //^29EE:01A5
 3859 :       Bit8u bp0a[8];
 3860 :       bp0a[5] = 0;
 3861 :       do {
 3862 :         //^29EE:01A9
 3863 :         si--;
 3864 :         //^29EE:01AA
 3865 :         bp0a[si] = Bit8u(di % 10) + '0';
 3866 :         //^29EE:01B8
 3867 :         di = di / 10;
 3868 :         //^29EE:01BF
 3869 :       } while (di != 0);
 3870 : 
 3871 :       //^29EE:01C3
 3872 :       si--;
 3873 :       bp0a[si] = '!';
 3874 :       si--;
 3875 :       bp0a[si] = 0x02;
 3876 :       //^29EE:01CD
 3877 :       DRAW_SIMPLE_STR(&_4976_3f6c, 0x39, _4976_4bda[4], _4976_4bda[0], &bp0a[si]);
 3878 :       //^29EE:01F5
 3879 :     }
 3880 :     //^29EE:01F7
 3881 :     else if (di == -2) {
 3882 :       //^29EE:01FC
 3883 :       DRAW_ICON_PICT_ENTRY(0x07, 0x00, (_4976_534a == 0) ? 0x38 : 0x34, &_4976_3f6c, 126, -1);
 3884 :       //^29EE:021E
 3885 :       bp01 = 0;
 3886 :       //^29EE:0222
 3887 :       for (; bp01 < 255; bp01++) {
 3888 :         //^29EE:0224
 3889 :         Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(0x10, bp01, dtWordValue, 0x05);
 3890 :         //^29EE:0238
 3891 :         if (si != 0 && (si & 0x8000) == 0 && (_4976_532e & si) != 0) {
 3892 :           //^29EE:0248
 3893 :           DRAW_ICON_PICT_ENTRY(0x10, bp01, 0x18, &_4976_3f6c, 125, -1);
 3894 :           //^29EE:025D
 3895 :           return;
 3896 :         }
 3897 :         //^29EE:025F
 3898 :       }
 3899 :     }
 3900 :     //^29EE:0268
 3901 :     return;
 3902 :   }
 3903 : 
 3904 :   //^
 3905 :   void _24a5_0930(); // TODO: Unreachable
 3906 : 
 3907 :   //^2759:0541
 3908 :   void _2759_0541()
 3909 :   {
 3910 :     //^2759:0541
 3911 :     ENTER(2);
 3912 :     //^2759:0545
 3913 :     __int16 bp02 = _4976_5366;
 3914 :     //^2759:054B
 3915 :     if (bp02 != 0) {
 3916 :       //^2759:054F
 3917 :       if (_4976_5340 == 0 || _4976_5352 <= 1)
 3918 :         //^2759:055D
 3919 :         _4976_5352 = 0;
 3920 : 
 3921 :       //^2759:0563
 3922 :       _4976_5366 = 0;
 3923 :       _4976_3ddc = 0;
 3924 :       _4976_5356 = 0;
 3925 :       if (_4976_3d32 != 0xffff) {
 3926 :         //^2759:057C
 3927 :         _24a5_0930();
 3928 :       }
 3929 :       //^2759:0581
 3930 :       _4976_531c = 1;
 3931 :     }
 3932 :     //^2759:0587
 3933 :     return;
 3934 :   }
 3935 : 
 3936 :   //^0CEE:29B9
 3937 :   Bit16u GET_MAX_CHARGE(ObjectID recordLink)
 3938 :   {
 3939 :     //^0CEE:29B9
 3940 :     ENTER(0);
 3941 :     //^0CEE:29BC
 3942 :     if (recordLink != ObjectID::FFFF) {
 3943 :       //^0CEE:29C2
 3944 :       switch (recordLink.DBType()) {
 3945 :         case dbWeapon:
 3946 :           //^0CEE:29DC
 3947 :           return 15;
 3948 :         case dbCloth:
 3949 :           //^0CEE:29E1
 3950 :           return 15;
 3951 :         case dbMiscellaneous_item:
 3952 :           //^0CEE:29E3
 3953 :           return 3;
 3954 :       }
 3955 :     }
 3956 :     //^0CEE:29C0
 3957 :     return 0;
 3958 :   }
 3959 : 
 3960 :   //^2405:014A
 3961 :   Bit8u _2405_014a(ObjectID recordLink, __int16 xx, __int16 yy)
 3962 :   {
 3963 :     //^2405:014A
 3964 :     ENTER(8);
 3965 :     //^2405:0150
 3966 :     Bit8u bp01 = 0x18;
 3967 :     //^2405:0154
 3968 :     if (yy != 0) {
 3969 :       //^2405:015D
 3970 :       Bit16u si = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 6);
 3971 :       //^2405:016B
 3972 :       Bit16u di = si & 15;
 3973 :       //^2405:0170
 3974 :       if (di != 0) {
 3975 :         //^2405:0177
 3976 :         Bit16u bp04 = 0;
 3977 :         //^2405:017C
 3978 :         if ((si & 0x8000) == 0 || (bp04 = _48ae_01ec(recordLink, xx, 1)) != 0) {
 3979 :           //^2405:019C
 3980 :           if ((si & 0x4000) != 0) {
 3981 :             //^2405:01A2
 3982 :             if (_4976_5366 == 0 || _4976_3de2[(_4976_5366 << 1) + (_4976_5354)] != recordLink)
 3983 :               //^2405:01C3
 3984 :               goto _02d3;
 3985 :             //^2405:01C6
 3986 :                         bp04 = 1;            
 3987 :           }
 3988 :           //^2405:01CB
 3989 :           if (bp04 != 0) {
 3990 :             //^2405:01D1
 3991 :             bp01++;
 3992 :             di--;
 3993 :           }
 3994 :           //^2405:01D5
 3995 :           if (di != 0) {
 3996 :             //^2405:01DC
 3997 :             Bit32u bp08 = _4976_4bec;
 3998 :             //^2405:01E9
 3999 :             switch ((si & 0x1f00) >> 8) {
 4000 :               case 5:
 4001 :                 //^2405:0201
 4002 :                 bp08 += recordLink.DBIndex();
 4003 : 
 4004 :                 goto _020e;
 4005 :               case 0:
 4006 :                 //^2405:020E
 4007 : _020e:
 4008 :                 bp01 = bp01 + Bit8u(bp08 % di);
 4009 :                 //^2405:0224
 4010 :                 break;
 4011 :               case 1:
 4012 :                 //^2405:0227
 4013 :                 bp01 = bp01 + Bit8u(RAND16(di));
 4014 :                 //^2405:0224
 4015 :                 break;
 4016 :               case 2:
 4017 :                 //^2405:0230
 4018 :                 bp01 = bp01 + _4976_4bf6;
 4019 :                 //^2405:023A
 4020 :                 break;
 4021 :               case 3:
 4022 :                 //^2405:023D
 4023 :                 si = ADD_ITEM_CHARGE(recordLink, 0);
 4024 :                 //^2405:0249
 4025 :                 if (si == 0)
 4026 :                   //^2405:024F
 4027 :                   break;
 4028 :                 //^2405:0252
 4029 :                 bp01 = (di * si) / (GET_MAX_CHARGE(recordLink) +1) + bp01;
 4030 :                 //^2405:026E
 4031 :                 break;
 4032 :               case 6:
 4033 :                 //^2405:0270
 4034 :                 bp08 += recordLink.DBIndex();
 4035 : 
 4036 :                 goto _027d;
 4037 :               case 4:
 4038 :                 //^2405:027D
 4039 : _027d:
 4040 :                 xx = (si & 0x00e0) >> 5;
 4041 :                 //^2405:0288
 4042 :                 si = ADD_ITEM_CHARGE(recordLink, 0);
 4043 :                 //^2405:0296
 4044 :                 if (si == 0)
 4045 :                   //^2405:0298
 4046 :                   break;
 4047 :                 //^2405:029A
 4048 :                 bp01 = (((di / xx) * si) / (GET_MAX_CHARGE(recordLink) +1)) * xx + (bp08 % yy) +bp01 +1;
 4049 : 
 4050 :                 break;
 4051 :             }
 4052 :           }
 4053 :         }
 4054 :       }
 4055 :     }
 4056 :     //^2405:02D3
 4057 : _02d3:
 4058 :     return bp01;
 4059 :   }
 4060 : 
 4061 :   //^0B36:0334
 4062 :   Bit8u *_0b36_0334(Bit8u *localpal, Bit8u cls1, Bit8u cls2, Bit8u cls4, __int16 palentcnt)
 4063 :   {
 4064 :     //^0B36:0334
 4065 :     ENTER(4);
 4066 :     //^0B36:0339
 4067 :     Bit8u *bp04 = _3e74_506b(cls1, cls2, dt07, cls4);
 4068 :     //^0B36:0355
 4069 :     for (__int16 si = 0; si < palentcnt; si++) {
 4070 :       //^0B36:0359
 4071 :       localpal[si] = bp04[localpal[si]];
 4072 :       //^0B36:036F
 4073 :     }
 4074 :     //^0B36:0375
 4075 :     return localpal;
 4076 :   }
 4077 : 
 4078 :   //^2405:05B4
 4079 :   Bit8u *_2405_05b4(Bit16u xx, Bit16u yy, skxxx5 *ref)
 4080 :   {
 4081 :     //^2405:05B4
 4082 :     ENTER(348);
 4083 :     //^2405:05BA
 4084 :     if (_2759_02d6(xx, _4976_53b4[xx].Possess(yy), yy) == 0) {
 4085 :       //^2405:05E1
 4086 :       //^2405:07BE
 4087 :       return NULL;
 4088 :     }
 4089 :     //^2405:05E8
 4090 :     Bit16u bp0c = _4976_0106 + _4976_010e;
 4091 :     Bit16u bp0e = _4976_0108 + _4976_0110;
 4092 :     //^2405:05FC
 4093 :     Bit16u bp0a = _3e74_5888();
 4094 :     //^2405:0604
 4095 :         Bit8u *bp04 = _3e74_57b5(bp0a, bp0c, bp0e, 8);
 4096 :     //^2405:061D
 4097 :     ObjectID di = _4976_53b4[xx].Possess(yy);
 4098 :     //^2405:0634
 4099 :     Bit8u bp05;
 4100 :     Bit8u bp06;
 4101 :     Bit8u bp07;
 4102 :     Bit16u bp12;
 4103 :     if (di == di.FFFF) {
 4104 :       //^2405:0639
 4105 :       bp05 = 1;
 4106 :       bp06 = 2;
 4107 :       //^2405:0641
 4108 :       bp07 = (yy == 1) ? 8 : 6;
 4109 :       bp12 = 1;
 4110 :     }
 4111 :     else {
 4112 :       //^2405:0657
 4113 :       bp05 = QUERY_CLS1_FROM_RECORD(di);
 4114 :       //^2405:0661
 4115 :       bp06 = QUERY_CLS2_FROM_RECORD(di);
 4116 :       //^2405:066B
 4117 :       bp07 = _2405_014a(di, -1, 0);
 4118 :       //^2405:067A
 4119 :       bp12 = 0;
 4120 :     }
 4121 :     //^2405:067F
 4122 :     skxxx4 bp014c;
 4123 :     _0b36_0520(&bp014c, bp05, bp06, bp07);
 4124 :     //^2405:0699
 4125 :     _0b36_06d3(&bp014c);
 4126 :     //^2405:06A6
 4127 :     Bit8u bp0f = _4976_4bda[8];
 4128 :     //^2405:06B1
 4129 :     _44c8_1d26(bp04 = _0b36_00c3(bp0a, ref), bp0f);
 4130 :     //^2405:06D5
 4131 :     if (bp12 != 0) {
 4132 :       //^2405:06DB
 4133 :       //^2405:0792
 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 :       //^2405:06F2
 4146 :       Bit8u bp015c[16];
 4147 :       for (Bit16u si = 0; si < 16; si++) {
 4148 :         //^2405:06F6
 4149 :         bp015c[si] = _4976_4bda[0];
 4150 :         //^2405:0701
 4151 :       }
 4152 :       //^2405:0707
 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 :       //^2405:0751
 4163 :       _0b36_0334(bp014c.b58, 1, 0, 1, 16);
 4164 :       //^2405:0767
 4165 :       bp04 = _0b36_00c3(bp0a, ref);
 4166 :       //^2405:077E
 4167 :       //^2405:0792
 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 :     //^2405:07B8
 4179 :     return bp04;
 4180 :   }
 4181 : 
 4182 :   //^44C8:08AE
 4183 :   void FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(Bit16u offSrc, Bit16u offDst, Bit16u width, __int16 colorkey)
 4184 :   {
 4185 :     // TODO: “¯ˆê”Ÿ”‚̈ÚA–â‘è
 4186 :     //^44C8:08AE
 4187 :     ENTER(0);
 4188 :     //^44C8:08B3
 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 :     //^44C8:08D4
 4197 :     if (carry) {
 4198 :       //^44C8:08D6
 4199 :       Bit8u al = *si; si++;
 4200 :       al &= 0x0f;
 4201 :       if (al == dh) {
 4202 :         di++;
 4203 :       }
 4204 :       else {
 4205 :         *di = bx[al]; di++;
 4206 :       }
 4207 :       //^44C8:08E3
 4208 :       if (--cx == 0)
 4209 :         //^44C8:08E4
 4210 :                 return;
 4211 :     }
 4212 : 
 4213 :     {
 4214 :       //^44C8:08E6
 4215 :       bool carry = (cx & 1) ? true : false;
 4216 :       cx >>= 1;
 4217 :       //^44C8:08E9
 4218 :       if (cx != 0) {
 4219 :         //^44C8:08EB
 4220 :         do {
 4221 :           Bit8u al = *si; si++;
 4222 :           Bit8u ah = al & 0x0f;
 4223 :           al >>= 4;
 4224 :           if (al != dh) {
 4225 :             //^44C8:08F8
 4226 :             if (ah != dh) {
 4227 :               //^44C8:08FC
 4228 :               *di = bx[al]; di++;
 4229 :               *di = bx[ah]; di++;
 4230 :               //^44C8:0904
 4231 :               continue;
 4232 :             }
 4233 :             else {
 4234 :               //^44C8:091D
 4235 :               *di = bx[al]; di++;
 4236 :               di++;
 4237 :               //^44C8:0921
 4238 :               continue;
 4239 :             }
 4240 :           }
 4241 :           //^44C8:0908
 4242 :           else if (ah != dh) {
 4243 :             //^44C8:090C
 4244 :             di++;
 4245 :             *di = bx[ah]; di++;
 4246 :             //^44C8:0912
 4247 :             continue;
 4248 :           }
 4249 :           else {
 4250 :             //^44C8:0916
 4251 :             di++;
 4252 :             di++;
 4253 :             //^44C8:0918
 4254 :             continue;
 4255 :           }
 4256 :           //^44C8:0918
 4257 :         } while (--cx != 0);
 4258 :       }
 4259 :       //^44C8:0923
 4260 :       if (carry) {
 4261 :         //^44C8:0926
 4262 :         Bit8u al = *si; si++;
 4263 :         al >>= 4;
 4264 :         if (al != dh) {
 4265 :           *di = bx[al]; di++;
 4266 :         }
 4267 :       }
 4268 :     }
 4269 :     //^44C8:0931
 4270 :     return;
 4271 :   }
 4272 : 
 4273 :   //^44C8:1ACA
 4274 :   void _44c8_1aca(Bit8u *buff, SRECT *rc, Bit16u xx, Bit16u yy)
 4275 :   {
 4276 :     //^44C8:1ACA
 4277 :     ENTER(332);
 4278 :     //^44C8:1AD0
 4279 :     if (rc != NULL) {
 4280 :       //^44C8:1ADB
 4281 :       Bit16u bp08 = xx ^ 15;
 4282 :       //^44C8:1AE4
 4283 :       Bit8u bp014c[320];
 4284 :       _4976_5e64 = bp014c;
 4285 :       _4976_5e6a = buff;
 4286 :       //^44C8:1AFC
 4287 :       Bit16u bp04 = rc->cx;
 4288 :       Bit16u bp02 = rc->cy;
 4289 :       //^44C8:1B0D
 4290 :       if (bp04 > 0 && bp02 > 0) {
 4291 :         //^44C8:1B1F
 4292 :         Bit16u bp06 = (bp04 +1) >> 1;
 4293 :         //^44C8:1B28
 4294 :         Bit8u bp0b = Bit8u(xx) << 4 | Bit8u(bp08);
 4295 :         //^44C8:1B34
 4296 :         for (Bit16u si = 0; si < bp06; si++) {
 4297 :           //^44C8:1B38
 4298 :           bp014c[si] = bp0b;
 4299 :           //^44C8:1B3F
 4300 :           bp014c[si+160] = bp0b ^ 0xff;
 4301 :           //^44C8:1B45
 4302 :         }
 4303 :         //^44C8:1B4B
 4304 :         Bit16u di = rc->y * yy +rc->x;
 4305 :         //^44C8:1B5A
 4306 :         Bit16u bp0a = ((di / yy) ^ di) & 1;
 4307 :         //^44C8:1B67
 4308 :         for (Bit16u si = 0; si < bp02; si++) {
 4309 :           //^44C8:1B6B
 4310 :           _4976_5e64 = &bp014c[bp0a * 160];
 4311 :           //^44C8:1B80
 4312 :           bp0a ^= 1;
 4313 :           //^44C8:1B84
 4314 :           FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(0, di, bp04, bp08);
 4315 :           //^44C8:1B95
 4316 :           di += yy;
 4317 :           //^44C8:1B98
 4318 :         }
 4319 :       }
 4320 :     }
 4321 :     //^44C8:1B9E
 4322 :     return;
 4323 :   }
 4324 : 
 4325 :   //^0B36:105B
 4326 :   void _0b36_105b(sk3f6c *ref, SRECT *rc, Bit16u xx)
 4327 :   {
 4328 :     //^0B36:105B
 4329 :     ENTER(8);
 4330 :     //^0B36:105F
 4331 :     if (rc != NULL) {
 4332 :       //^0B36:1067
 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 :       //^0B36:10A1
 4341 :       _0b36_0d67(ref, rc);
 4342 :     }
 4343 :     //^0B36:10B4
 4344 :     return;
 4345 :   }
 4346 : 
 4347 :   //^29EE:026C
 4348 :   void _29ee_026c(Bit16u xx, Bit16u yy, Bit16u zz)
 4349 :   {
 4350 :     //^29EE:026C
 4351 :     ENTER(48);
 4352 :     //^29EE:0271
 4353 :     _29ee_00a3(0);
 4354 :     //^29EE:0278
 4355 :     sk53b4 *bp04 = &_4976_53b4[xx];
 4356 :     //^29EE:0289
 4357 :     Bit16u si = (yy == 1) ? 0x46 : 0x4a;
 4358 :     //^29EE:0297
 4359 :     si += (bp04->playerPos() +4 - _4976_4bf6) & 3;
 4360 :     //^29EE:02AC
 4361 :     SRECT bp10;
 4362 :     QUERY_EXPANDED_RECT(si, &bp10);
 4363 :     //^29EE:02BA
 4364 :     if (bp04->curHP() == 0) {
 4365 :       //^29EE:02C4
 4366 :       SRECT bp10;
 4367 :       _0b36_0ffe(&_4976_3f6c, &bp10, _4976_4bda[0]);
 4368 :     }
 4369 :     else {
 4370 :       //^29EE:02DF
 4371 :       DRAW_ICON_PICT_ENTRY(0x01, 0x04, (Bit8u(yy) << 1) + Bit8u(zz) +2, &_4976_3f6c, si, -1);
 4372 :       //^29EE:02FD
 4373 :       skxxx5 bp30;
 4374 :       Bit8u *bp08 = _2405_05b4(xx, yy, &bp30);
 4375 :       //^29EE:0316
 4376 :       if (bp08 != NULL) {
 4377 :         //^29EE:031A
 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 :         //^29EE:0360
 4390 :         _0b36_01cd(&bp30);
 4391 :       }
 4392 :       //^29EE:036C
 4393 :       if (bp04->b42[yy] != 0 || _4976_4be8 != 0) {
 4394 :         //^29EE:0380
 4395 :         _0b36_105b(&_4976_3f6c, &bp10, 0);
 4396 :       }
 4397 :     }
 4398 :     //^29EE:0393
 4399 :     return;
 4400 :   }
 4401 : 
 4402 :   //^29EE:058D
 4403 :   void _29ee_058d(Bit16u player, Bit16u yy)
 4404 :   {
 4405 :     //^29EE:058D
 4406 :         ENTER(324);
 4407 :     //^29EE:0593
 4408 :     _29ee_00a3(0);
 4409 :     //^29EE:059A
 4410 :     Bit16u si = (_4976_53b4[player].playerPos() +4 - _4976_4bf6) & 3;
 4411 :     //^29EE:05B6
 4412 :     SRECT bp0a;
 4413 :     _0b36_0ffe(
 4414 :       &_4976_3f6c,
 4415 :       QUERY_EXPANDED_RECT(si + 0x4f, &bp0a),
 4416 :       _4976_4bda[0]
 4417 :       );
 4418 :     //^29EE:05E1
 4419 :     if (_4976_53b4[player].curHP() != 0) {
 4420 :       //^29EE:05F5
 4421 :       Bit16u di = (si == 1 || si == 2) ? 1 : 0;
 4422 :       //^29EE:0606
 4423 :       Bit8u bp01;
 4424 :       Bit8u bp02;
 4425 :       if (si <= 1) {
 4426 :         //^29EE:060B
 4427 :         bp01 = 10;
 4428 :         bp02 = 6;
 4429 :       }
 4430 :       else {
 4431 :         //^29EE:0615
 4432 :         bp01 = 12;
 4433 :         bp02 = 8;
 4434 :       }
 4435 :       //^29EE:061D
 4436 :       if (player == _4976_3fc6) {
 4437 :         //^29EE:0626
 4438 :         bp01++;
 4439 :       }
 4440 :       //^29EE:0629
 4441 :       if (yy != 0) {
 4442 :         //^29EE:062F
 4443 :         bp02++;
 4444 :       }
 4445 :       //^29EE:0632
 4446 :       skxxx4 bp0144;
 4447 :       _0b36_0520(&bp0144, 0x01, 0x01, bp02);
 4448 :       //^29EE:0648
 4449 :       bp0144.w50 = di;
 4450 :       //^29EE:064C
 4451 :       _0b36_11c0(
 4452 :         _0b36_06d3(&bp0144),
 4453 :         &_4976_3f6c,
 4454 :         si + 0x57,
 4455 :         4
 4456 :         );
 4457 :       //^29EE:066F
 4458 :       if (_4976_4be8 != 0 || _4976_53b4[player].b44 != 0) {
 4459 :         //^29EE:0687
 4460 :         bp0144.rc36.x = _4976_3f6c.w2.x;
 4461 :         bp0144.rc36.y = _4976_3f6c.w2.y;
 4462 :         //^29EE:0695
 4463 :         _0b36_105b(&_4976_3f6c, &bp0144.rc36, 0);
 4464 :       }
 4465 :       //^29EE:06A9
 4466 :       _0b36_0520(&bp0144, 0x01, 0x04, bp01);
 4467 :       //^29EE:06BF
 4468 :       bp0144.w50 = di;
 4469 :       //^29EE:06C3
 4470 :       _0b36_11c0(
 4471 :         _0b36_06d3(&bp0144),
 4472 :         &_4976_3f6c,
 4473 :         si + 0x53,
 4474 :         4
 4475 :         );
 4476 :       //^29EE:06E6
 4477 :       if (_4976_4be8 != 0) {
 4478 :         //^29EE:06ED
 4479 :         bp0144.rc36.x = _4976_3f6c.w2.x;
 4480 :         bp0144.rc36.y = _4976_3f6c.w2.y;
 4481 :         //^29EE:06FB
 4482 :         _0b36_105b(&_4976_3f6c, &bp0144.rc36, 0);
 4483 :       }
 4484 :     }
 4485 :     //^29EE:070F
 4486 :     return;
 4487 :   }
 4488 : 
 4489 :   //^
 4490 :   void _24a5_0990(ObjectID recordLink, Container *ref); // TODO: Unreachable
 4491 :   //^
 4492 :   void _29ee_2048(ObjectID recordLink); // TODO: Unreachable
 4493 :   //^
 4494 :   void _29ee_21d8(ObjectID recordLink, Bit16u xx); // TODO: Unreachable
 4495 : 
 4496 :   //^29EE:0396
 4497 :   void _29ee_0396()
 4498 :   {
 4499 :     //^29EE:0396
 4500 :     ENTER(350);
 4501 :     //^29EE:039C
 4502 :     _29ee_00a3(0);
 4503 :     //^29EE:03A3
 4504 :     DRAW_ICON_PICT_ENTRY(0x08, _4976_3df6, 0xf5, &_4976_3f6c, 47, -1);
 4505 :     //^29EE:03BC
 4506 :     Bit8u *bp04 = ALLOC_PICT_BUFF(_4976_0118, _4976_011a, afDefault, 4);
 4507 :     //^29EE:03D6
 4508 :     SRECT bp14;
 4509 :     for (Bit16u si = 0; si < _4976_4c3c; si++) {
 4510 :       //^29EE:03DB
 4511 :       Bit16u bp06 = _4976_53b4[si].playerPos() +4 - _4976_4bf6;
 4512 :       //^29EE:03F7
 4513 :       if (_4976_53b4[si].curHP() == 0 || bp06 +1 == _4976_5dbc)
 4514 :         //^29EE:0414
 4515 :         continue;
 4516 :       //^29EE:0417
 4517 :       __int16 bp0c = 0;
 4518 :       __int16 bp0a = 0;
 4519 :       //^29EE:041F
 4520 :       Bit16u bp08;
 4521 :       if (QUERY_BLIT_RECT(bp04, &bp14, bp08 = bp06 +53, &bp0a, &bp0c, -1) == NULL)
 4522 :         //^29EE:044C
 4523 :         continue;
 4524 :       //^29EE:044F
 4525 :       if (_4976_57e8 != 0) {
 4526 :         //^29EE:0456
 4527 :         __int16 di = RAND02();
 4528 :         //^29EE:045D
 4529 :         if (di != 0) {
 4530 :           //^29EE:0461
 4531 :           bp14.y += di -2;
 4532 :           //^29EE:0467
 4533 :           di = RAND02();
 4534 :           //^29EE:046E
 4535 :           if (di != 0) {
 4536 :             //^29EE:0472
 4537 :             bp14.x += di -2;
 4538 :           }
 4539 :         }
 4540 :       }
 4541 :       //^29EE:0478
 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 :       //^29EE:04B0
 4554 :       if (_4976_53b4[si].w257 == 0)
 4555 :         //^29EE:04C0
 4556 :         continue;
 4557 :       //^29EE:04C3
 4558 :       skxxx4 bp014e;
 4559 :       _0b36_06d3(_0b36_0520(&bp014e, 0x01, 0x07, _4976_53b4[si].b256));
 4560 :       //^29EE:04EC
 4561 :       bp014e.w4 |= 0x10;
 4562 :       bp014e.w18 >>= 2;
 4563 :       //^29EE:04F7
 4564 :       bp014e.w14 = bp014e.w18 * ((_4976_53b4[si].playerDir() +4 - _4976_4bf6) & 3);
 4565 :       //^29EE:051E
 4566 :       bp014e.w20 >>= 2;
 4567 :       //^29EE:0523
 4568 :       bp014e.w16 = bp014e.w20 * (__int16(_4976_4bec) & 3);
 4569 :       //^29EE:0535
 4570 :       _0b36_11c0(&bp014e, &_4976_3f6c, bp08, 12);
 4571 :       //^29EE:054C
 4572 :     }
 4573 :     //^29EE:0556
 4574 :     FREE_PICT_BUFF(bp04);
 4575 :     //^29EE:0563
 4576 :     if (_4976_4be8 != 0) {
 4577 :       //^29EE:056A
 4578 :       _0b36_105b(
 4579 :         &_4976_3f6c, 
 4580 :         QUERY_EXPANDED_RECT(47, &bp14),
 4581 :         0
 4582 :         );
 4583 :     }
 4584 :     //^29EE:0589
 4585 :     return;
 4586 :   }
 4587 : 
 4588 :   //^3929:06E1
 4589 :   void DRAW_STRONG_TEXT(Bit8u *buff, Bit16u ww, Bit16u cx, Bit16u xx, Bit16u yy, Bit16u clr1, Bit16u fill, Bit8u *str)
 4590 :   {
 4591 :     // draw bold with shadow single-byte-character-set text such as,
 4592 :     // a) name "TORHAM"
 4593 :     // b) HP "651/651", MP "446/446", stamina "228/228", weight "25.0/62.0 KG"
 4594 : 
 4595 :     //^3929:06E1
 4596 :     ENTER(4);
 4597 :     //^3929:06E7
 4598 :     Bit16u di = xx;
 4599 :     Bit16u si = yy;
 4600 :     //^3929:06ED
 4601 :     __int16 bp02;
 4602 :     __int16 bp04;
 4603 :     if (_3929_03dc(str, &bp02, &bp04) != 0) {
 4604 :       //^3929:070B
 4605 :       if ((fill & 0x4000) == 0) {
 4606 :         //^3929:0712
 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 :       //^3929:0748
 4616 :       DRAW_STRING(buff, ww, cx, di   , si +1, _4976_4bda[0], _4976_4bda[15] | 0x4000, str, 8);
 4617 :       //^3929:077D
 4618 :       DRAW_STRING(buff, ww, cx, di +1, si +1, _4976_4bda[0], _4976_4bda[15] | 0x4000, str, 8);
 4619 :       //^3929:07B5
 4620 :       DRAW_STRING(buff, ww, cx, di,    si,    clr1,          fill           | 0x4000, str, 8);
 4621 :     }
 4622 :     //^3929:07DD
 4623 :     return;
 4624 :   }
 4625 : 
 4626 :   //^0B36:13B1
 4627 :   void DRAW_NAME_STR(sk3f6c *ref, Bit16u rectno, Bit16u clr1, Bit8u fill, Bit8u *str)
 4628 :   {
 4629 :     // draw text:
 4630 :     // a) player's name "TORHAM", "SAROS" at upper-panel and command bar
 4631 :     // b) command name "Ža‚é", "Ža‚è—ô‚­", "’f‚¿Ø‚é", "<02>!{UM} {ZO} {BRO} {ROS}"
 4632 : 
 4633 :     //^0B36:13B1
 4634 :     ENTER(12);
 4635 :     //^0B36:13B6
 4636 :     __int16 bp02;
 4637 :     __int16 bp04;
 4638 :     if (_3929_03dc(str, &bp02, &bp04) != 0) {
 4639 :       //^0B36:13D1
 4640 :       SRECT bp0c;
 4641 :       if (QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1) != NULL) {
 4642 :         //^0B36:13F5
 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 :                 //^0B36:1432
 4654 :         _0b36_0d67(ref, &bp0c);
 4655 :       }
 4656 :     }
 4657 :     //^0B36:1444
 4658 :     return;
 4659 :   }
 4660 : 
 4661 :   //^29EE:0713
 4662 :   void _29ee_0713()
 4663 :   {
 4664 :     //^29EE:0713
 4665 :     ENTER(0);
 4666 :     //^29EE:0716
 4667 :     DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x14, &_4976_3f6c, 60, -1);
 4668 :     //^29EE:072C
 4669 :     DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x0e, &_4976_3f6c, 59, -1);
 4670 :     //^29EE:0742
 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 :     //^29EE:0789
 4679 :     return;
 4680 :   }
 4681 : 
 4682 :   //^0CAF:0008
 4683 :   i16 SK_STRLEN(const Bit8u *ref)
 4684 :   {
 4685 :     //^0CAF:0008
 4686 :     ENTER(4);
 4687 :     //^0CAF:000C
 4688 :     const Bit8u *bp04 = ref;
 4689 :     //^0CAF:0018
 4690 :     while (*(ref++) != 0);
 4691 :     //^0CAF:0024
 4692 :     return Bit16u(ref -bp04 -1);
 4693 :   }
 4694 : 
 4695 :   //^29EE:093E
 4696 :   void _29ee_093e(Bit16u xx)
 4697 :   {
 4698 :     //^29EE:093E
 4699 :     ENTER(8);
 4700 :     //^29EE:0944
 4701 :     _29ee_00a3(0);
 4702 :     //^29EE:094B
 4703 :     if (xx != 0) {
 4704 :       //^29EE:0951
 4705 :       DRAW_ICON_PICT_ENTRY(0x01, 0x05, 0x09, &_4976_3f6c, 252, -1);
 4706 :     }
 4707 :     //^29EE:0968
 4708 :     sk53b4 *bp04 = &_4976_52af[_4976_5366];
 4709 :     //^29EE:0979
 4710 :     Bit8u bp08[2];
 4711 :         bp08[1] = 0;
 4712 :     //^29EE:097D
 4713 :     Bit16u bp06 = SK_STRLEN(bp04->GetRunes());
 4714 :     //^29EE:0991
 4715 :     Bit16u di = 261;
 4716 :     //^29EE:0994
 4717 :     for (Bit16u si = 0; si < bp06; si++) {
 4718 :       //^29EE:0998
 4719 :       bp08[0] = bp04->GetRunes()[si];
 4720 :       //^29EE:09A2
 4721 :       DRAW_SIMPLE_STR(&_4976_3f6c, di++, _4976_4bda[0], _4976_4bda[13] | 0x4000, bp08);
 4722 :       //^29EE:09CB
 4723 :     }
 4724 :     //^29EE:09D1
 4725 :     return;
 4726 :   }
 4727 : 
 4728 :   //^29EE:09D5
 4729 :   void _29ee_09d5()
 4730 :   {
 4731 :     //^29EE:09D5
 4732 :     ENTER(10);
 4733 :     //^29EE:09DA
 4734 :     sk53b4 *bp04 = &_4976_52af[_4976_5366];
 4735 :     //^29EE:09EB
 4736 :     Bit16u bp06 = bp04->b30;
 4737 :     //^29EE:09F7
 4738 :     DRAW_ICON_PICT_ENTRY(0x01, 0x05, bp06 +1, &_4976_3f6c, 92, -1);
 4739 :     //^29EE:0A11
 4740 :     if (bp06 < 4) {
 4741 :       //^29EE:0A17
 4742 :       Bit8u bp0a[2];
 4743 :       bp0a[1] = 0;
 4744 :       //^29EE:0A1B
 4745 :       Bit8u bp07 = Bit8u(bp06 * 6) + 0x60;
 4746 :       Bit16u si = 255;
 4747 :       //^29EE:0A2B
 4748 :       for (bp06 = 0; bp06 < 6; bp06++) {
 4749 :         //^29EE:0A32
 4750 :         bp0a[0] = bp07++;
 4751 :         //^29EE:0A3B
 4752 :         DRAW_SIMPLE_STR(
 4753 :           &_4976_3f6c, 
 4754 :           si +1, 
 4755 :           _4976_4bda[0],
 4756 :           _4976_4bda[13] | 0x4000,
 4757 :           bp0a
 4758 :           );
 4759 :         //^29EE:0A64
 4760 :       }
 4761 :     }
 4762 :     //^29EE:0A6D
 4763 :     _29ee_093e(0);
 4764 :     //^29EE:0A74
 4765 :     _29ee_078b();
 4766 :     //^29EE:0A78
 4767 :     return;
 4768 :   }
 4769 : 
 4770 :   //^0CAF:00D2
 4771 :   Bit8u *SK_STRSTR(const Bit8u *xx, const Bit8u *yy)
 4772 :   {
 4773 :     //^0CAF:00D2
 4774 :     ENTER(10);
 4775 :     //^0CAF:00D6
 4776 :     Bit8u cl = yy[0];
 4777 :     //^0CAF:00DE
 4778 :     if (cl != 0) {
 4779 :       //^0CAF:00E2
 4780 :       Bit8u bp09;
 4781 :       for (; (bp09 = xx[0]) != 0; xx++) {
 4782 :         //^0CAF:00E4
 4783 :         if (bp09 == cl) {
 4784 :           //^0CAF:00EB
 4785 :           const Bit8u *bp04 = xx +1;
 4786 :           const Bit8u *bp08 = yy +1;
 4787 :           //^0CAF:0105
 4788 :           while (bp08[0] != 0 && bp04[0] == bp08[0]) {
 4789 :             //^0CAF:0107
 4790 :             bp04++;
 4791 :             bp08++;
 4792 :             //^0CAF:010D
 4793 :           }
 4794 :           //^0CAF:0124
 4795 :           if (bp08[0] == 0) {
 4796 :             //^0CAF:012F
 4797 :             return const_cast<Bit8u *>(yy);
 4798 :           }
 4799 :         }
 4800 :         //^0CAF:0137
 4801 :       }
 4802 :     }
 4803 :     //^0CAF:0147
 4804 :     return NULL;
 4805 :   }
 4806 : 
 4807 :   //^2759:006D
 4808 :   Bit16u QUERY_CMDSTR_TEXT(const Bit8u *cmdStr, const Bit8u *name)
 4809 :   {
 4810 :     // returns value of name in cmdstr.
 4811 :     // for example, returns 0 if you query "WH" for "ÚÉ:CM4SK4BZ2TR3TA-2EX5PB38DM40".
 4812 : 
 4813 :     // cmdStr: e.g. "ÚÉ:CM4SK4BZ2TR3TA-2EX5PB38DM40".
 4814 :     // name: e.g. "WH"
 4815 : 
 4816 :     //^2759:006D
 4817 :     ENTER(2);
 4818 :     //^2759:0073
 4819 :     __int16 si = 0;
 4820 :     while ((cmdStr = SK_STRSTR(cmdStr, name)) != NULL) {
 4821 :       //^2759:0077
 4822 :       cmdStr += SK_STRLEN(name);
 4823 :       //^2759:0087
 4824 :       if (cmdStr[0] == '=') {
 4825 :         //^2759:0090
 4826 :         cmdStr++;
 4827 :       }
 4828 :       //^2759:0093
 4829 :       Bit16u di = 0;
 4830 :       //^2759:0095
 4831 :       if (cmdStr[0] == '-') {
 4832 :         //^2759:009E
 4833 :         cmdStr++;
 4834 :         di = 1;
 4835 :       }
 4836 : 
 4837 :       Bit8u bp01;
 4838 :       while ((bp01 = cmdStr[0]) >= '0' && bp01 <= '9') {
 4839 :         //^2759:00A6
 4840 :         si = bp01 +(si * 10) - '0';
 4841 :         cmdStr++;
 4842 :         //^2759:00BD
 4843 :       }
 4844 :       //^2759:00D0
 4845 :       if (di != 0) {
 4846 :         //^2759:00D4
 4847 :         si = -si;
 4848 :       }
 4849 :       //^2759:00DA
 4850 :     }
 4851 :     //^2759:00FB
 4852 :     return si;
 4853 :   }
 4854 : 
 4855 :   //^2759:0101
 4856 :   Bit16u QUERY_CMDSTR_ENTRY(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit16u cmdNum)
 4857 :   {
 4858 :     //^2759:0101
 4859 :     ENTER(132);
 4860 :     //^2759:0105
 4861 :     Bit8u bp0084[128];
 4862 :     Bit8u *bp04;
 4863 :     if (cmdNum >= 18 || *(bp04 = QUERY_GDAT_TEXT(cls1, cls2, cls4, bp0084)) == 0) {
 4864 :       //^2759:0135
 4865 :       return 0;
 4866 :     }
 4867 :     else {
 4868 :       //^2759:0139
 4869 :       return QUERY_CMDSTR_TEXT(bp04, _4976_3f32[cmdNum]);
 4870 :     }
 4871 :   }
 4872 : 
 4873 :   //^0CEE:2FBD
 4874 :   Missile *GET_MISSILE_REF_OF_MINION(ObjectID rlCreature, ObjectID rlContainer)
 4875 :   {
 4876 :     // returns a invisible missile record. it is assoc with minion map's minion.
 4877 :     // the missile record has (MAP,X,Y) position of recent open door.
 4878 : 
 4879 :     //^0CEE:2FBD
 4880 :     ENTER(4);
 4881 :     //^0CEE:2FC3
 4882 :     ObjectID di = rlCreature;
 4883 :     //^0CEE:2FC6
 4884 :     if (di == di.FFFF || di == di.FFFE)
 4885 :       //^0CEE:2FD0
 4886 :       //^0CEE:302D
 4887 :       return NULL;
 4888 :     //^0CEE:2FD2
 4889 :     Creature *bp04 = GET_ADDRESS_OF_RECORD4(di);
 4890 :     //^0CEE:2FDE
 4891 :     if (bp04->w0 == ObjectID::FFFF)
 4892 :       //^0CEE:2FE5
 4893 :       //^0CEE:302D
 4894 :       return NULL;
 4895 :     //^0CEE:2FE7
 4896 :     ObjectID si = bp04->GetPossessionObject();
 4897 :     //^0CEE:2FEB
 4898 :     while (si != si.FFFE) {
 4899 :       //^0CEE:2FED
 4900 :       if (si.DBType() == dbMissile) {
 4901 :         //^0CEE:2FFA
 4902 :         Missile *bp04 = GET_ADDRESS_OF_RECORDE(si);
 4903 :         //^0CEE:3006
 4904 :         if (rlContainer == rlContainer.FFFF || bp04->GetMissileObject() == rlContainer) {
 4905 :           //^0CEE:3018
 4906 :           return bp04;
 4907 :         }
 4908 :       }
 4909 :       //^0CEE:3020
 4910 :       si = GET_NEXT_RECORD_LINK(si);
 4911 :       //^0CEE:3028
 4912 :     }
 4913 :     //^0CEE:302D
 4914 :     return NULL;
 4915 :   }
 4916 : 
 4917 :   //^2759:01FE
 4918 :   Bit16u _2759_01fe(Bit16u player, ObjectID recordLink, Bit16u cmdNum)
 4919 :   {
 4920 :     //^2759:01FE
 4921 :         ENTER(8);
 4922 :     //^2759:0204
 4923 :     ObjectID di = recordLink;
 4924 :     Bit16u si = cmdNum;
 4925 :     //^2759:020A
 4926 :     if (di == di.FFFF) {
 4927 :       //^2759:020F
 4928 :       return 0;
 4929 :     }
 4930 :     //^2759:0214
 4931 :     if (di.DBType() == dbContainer) {
 4932 :       //^2759:0224
 4933 :       Container *bp04 = GET_ADDRESS_OF_RECORD9(di);
 4934 :       //^2759:0231
 4935 :       if (bp04->ContainerType() == 1) {
 4936 :         //^2759:0245
 4937 :         Bit16u bp08 = bp04->b5_5_7();
 4938 :         //^2759:0252
 4939 :         if (false
 4940 :           || bp08 == 1 // 1 - SCOUT MAP?
 4941 :           || bp08 == 2 // 2 - MINION MAP?
 4942 :         ) {
 4943 :           //^2759:025E
 4944 :           if (GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), di) != NULL) {
 4945 :             //^2759:0271
 4946 :             if (si == CmKillMinion)
 4947 :               //^2759:0274
 4948 :               //^2759:02CF
 4949 :               return 1;
 4950 :             //^2759:0276
 4951 :             if (bp08 != 2)
 4952 :               //^2759:027A
 4953 :               //^2759:02CC
 4954 :               //^2759:020F
 4955 :               return 0;
 4956 :             //^2759:027C
 4957 :             Bit8u bp05 = GET_ADDRESS_OF_RECORD4(bp04->GetContainedObject())->CreatureType();
 4958 :             //^2759:0294
 4959 :             if (bp05 == 51) { // 51 - FETCH MINION
 4960 :               //^2759:029A
 4961 :               if (si != CmCallCarry)
 4962 :                 //^2759:029D
 4963 :                 //^2759:02CC
 4964 :                 //^2759:020F
 4965 :                 return 0;
 4966 :               //^2759:029F
 4967 :               //^2759:02CF
 4968 :               return 1;
 4969 :             }
 4970 :             //^2759:02A1
 4971 :             if (bp05 != 50) // 50 - CARRY MINION
 4972 :               //^2759:02A5
 4973 :               //^2759:02CC
 4974 :               //^2759:020F
 4975 :               return 0;
 4976 :             //^2759:02A7
 4977 :             if (si != CmCallFetch)
 4978 :               //^2759:02AA
 4979 :               //^2759:02CC
 4980 :               //^2759:020F
 4981 :               return 0;
 4982 :             //^2759:02AC
 4983 :             //^2759:02CF
 4984 :             return 1;
 4985 :           }
 4986 :           //^2759:02AE
 4987 :           if (si != CmCallScout && si != CmMark && (bp04->w6 == 0xffff || (si != CmCallCarry && si != CmCallFetch))) {
 4988 :             //^2759:02CC
 4989 :             //^2759:020F
 4990 :             return 0;
 4991 :           }
 4992 :         }
 4993 :         else {
 4994 :           //^2759:02CC
 4995 :           //^2759:020F
 4996 :           return 0;
 4997 :         }
 4998 :       }
 4999 :     }
 5000 :     //^2759:02CF
 5001 :     return 1;
 5002 :   }
 5003 : 
 5004 :   //^2759:04C0
 5005 :   __int16 _2759_04c0(__int16 player, __int16 yy)
 5006 :   {
 5007 :     //^2759:04C0
 5008 :     ENTER(0);
 5009 :     //^2759:04C5
 5010 :     __int16 di = player;
 5011 :     //^2759:04C8
 5012 :     if (yy == 1) {
 5013 :       //^2759:04CE
 5014 :       if (_4976_53b4[di].Possess(12) != ObjectID::FFFF) {
 5015 :         //^2759:04DE
 5016 :         return 12;
 5017 :       }
 5018 :       //^2759:04E3
 5019 :       for (__int16 si = 7; si <= 9; si++) {
 5020 :         //^2759:04E8
 5021 :         if (_4976_53b4[di].Possess(si) != ObjectID::FFFF) {
 5022 :           //^2759:04FE
 5023 :           return si;
 5024 :         }
 5025 :         //^2759:0502
 5026 :       }
 5027 :     }
 5028 :     //^2759:050A
 5029 :     else if (yy == 0) {
 5030 :       //^2759:0510
 5031 :       if (_4976_53b4[di].Possess(11) != ObjectID::FFFF) {
 5032 :         //^2759:0520
 5033 :         return 11;
 5034 :       }
 5035 :       //^2759:0525
 5036 :       if (_4976_53b4[di].Possess(6) != ObjectID::FFFF) {
 5037 :         //^2759:0535
 5038 :         return 6;
 5039 :       }
 5040 :     }
 5041 :     //^2759:053A
 5042 :     return -1;
 5043 :   }
 5044 : 
 5045 :   //^2C1D:0A47
 5046 :   Bit16u _2c1d_0a47(__int16 player, Bit16u xx, Bit16u yy)
 5047 :   {
 5048 :     //^2C1D:0A47
 5049 :     ENTER(8);
 5050 :     //^2C1D:0A4D
 5051 :     U16 di = xx;
 5052 :     //^2C1D:0A50
 5053 :     if (_4976_4be8 != 0) {
 5054 :       //^2C1D:0A57
 5055 :       return 1;
 5056 :     }
 5057 :     //^2C1D:0A5D
 5058 :     sk53b4 *bp04 = &_4976_53b4[player];
 5059 :     //^2C1D:0A6E
 5060 :     __int32 bp08 = bp04->dw93[di];
 5061 :     //^2C1D:0A86
 5062 :     if (di > 3) {
 5063 :       //^2C1D:0A8B
 5064 :       bp08 += (bp04->dw93[(di -4) >> 2]) * ((yy != 0) ? __int16(bp04->b173[(di -4) >> 2]) : 1);
 5065 :       //^2C1D:0AD2
 5066 :       bp08 >>= 1;
 5067 :     }
 5068 :     //^2C1D:0AE2
 5069 :     Bit16u si = 1;
 5070 :     //^2C1D:0AE5
 5071 :     while (bp08 >= 512U) {
 5072 :       //^2C1D:0AE7
 5073 :       bp08 >>= 1; si++;
 5074 :       //^2C1D:0AF8
 5075 :     }
 5076 :     //^2C1D:0B07
 5077 :     if (yy != 0) {
 5078 :       //^2C1D:0B0D
 5079 :       si = max_value(1, bp04->b173[di] + si);
 5080 :     }
 5081 :     //^2C1D:0B26
 5082 :     return si;
 5083 :   }
 5084 : 
 5085 :   //^2759:02D6
 5086 :   Bit16u _2759_02d6(Bit16u player, ObjectID recordLink, __int16 yy)
 5087 :   {
 5088 :     //^2759:02D6
 5089 :     ENTER(14);
 5090 :     //^2759:02DC
 5091 :     ObjectID si = recordLink;
 5092 :     Bit8u bp01;
 5093 :     Bit8u bp02;
 5094 :     if (recordLink == ObjectID::FFFF) {
 5095 :       //^2759:02E4
 5096 :       bp01 = 0x16;
 5097 :             bp02 = _4976_53b4[player].HeroType();
 5098 :     }
 5099 :     else {
 5100 :       //^2759:02F8
 5101 :       if (IS_CONTAINER_MONEYBOX(si) != 0 || IS_CONTAINER_CHEST(si) != 0)
 5102 :         //^2759:030E
 5103 :         return 1;
 5104 :       //^2759:0314
 5105 :       bp01 = QUERY_CLS1_FROM_RECORD(si);
 5106 :       bp02 = QUERY_CLS2_FROM_RECORD(si);
 5107 :     }
 5108 :     //^2759:0325
 5109 :     //^2759:0328
 5110 :     __int16 di = 0;
 5111 :     for (Bit8u bp03 = 8; bp03 < 12; bp03++) {
 5112 :       //^2759:0331
 5113 :       if (di >= 3)
 5114 :         //^2759:0336
 5115 :         break;
 5116 :       //^2759:0339
 5117 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtText, bp03) == 0)
 5118 :         //^2759:0353
 5119 :         continue;
 5120 :       //^2759:0356
 5121 :       Bit16u bp0a = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnCM);
 5122 :       //^2759:036E
 5123 :       if (bp0a == 0)
 5124 :         //^2759:0372
 5125 :         continue;
 5126 :       //^2759:0375
 5127 :       Bit16u bp0e = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnWH);
 5128 :       //^2759:038D
 5129 :       if (bp0e != 0 && bp0e -1 != yy)
 5130 :         //^2759:0399
 5131 :         continue;
 5132 :       //^2759:039C
 5133 :       if (si != ObjectID::FFFF) {
 5134 :         //^2759:03A1
 5135 :         if (_2759_01fe(player, si, bp0a) == 0)
 5136 :           //^2759:03B3
 5137 :           continue;
 5138 :         //^2759:03B6
 5139 :         __int16 bp0c = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnNC);
 5140 :         //^2759:03CE
 5141 :         if (bp0c == 18) {
 5142 :           //^2759:03D4
 5143 :           if (ADD_ITEM_CHARGE(si, 0) == 0) {
 5144 :             //^2759:03E0
 5145 :             goto _0425;
 5146 :           }
 5147 :           //^2759:03E2
 5148 :           continue;
 5149 :         }
 5150 :         //^2759:03E5
 5151 :         if (bp0c == 16 || bp0c == 17)
 5152 :           //^2759:03F1
 5153 :           bp0c = 1;
 5154 :         //^2759:03F6
 5155 :         if (bp0c == 0)
 5156 :           //^2759:03FA
 5157 :           goto _0425;
 5158 :         //^2759:03FC
 5159 :         if (ADD_ITEM_CHARGE(si, 0) >= bp0c)
 5160 :           //^2759:0409
 5161 :           goto _0425;
 5162 :         //^2759:040B
 5163 :         continue;
 5164 :       }
 5165 :       //^2759:040E
 5166 :       if (bp0a == 17) {
 5167 :         //^2759:0414
 5168 :         if (_2759_04c0(player, yy) < 0)
 5169 :           //^2759:0423
 5170 :           continue;
 5171 :       }
 5172 :       //^2759:0425
 5173 : _0425:
 5174 :       Bit16u bp08 = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnSK);
 5175 :       //^2759:043D
 5176 :       Bit16u bp06 = QUERY_CMDSTR_ENTRY(bp01, bp02, bp03, CnLV);
 5177 :       //^2759:0455
 5178 :       if (_2c1d_0a47(player, bp08, 1) >= bp06) {
 5179 :         //^2759:046A
 5180 :         _4976_5358[di].b0 = bp01;
 5181 :         //^2759:0476
 5182 :         _4976_5358[di].b1 = bp02;
 5183 :         //^2759:0482
 5184 :         _4976_5358[di].b2 = bp03;
 5185 :         //^2759:048E
 5186 :         di++;
 5187 :       }
 5188 :       //^2759:048F
 5189 :     }
 5190 :     //^2759:049B
 5191 :     _4976_53a4 = di;
 5192 :     _4976_5368 = si;
 5193 :     //^2759:04A3
 5194 :     if (IS_CONTAINER_MAP(si) != 0)
 5195 :       //^2759:04AE
 5196 :       //^2759:030E
 5197 :       return 1;
 5198 :     //^2759:04B1
 5199 :     if (di > 0)
 5200 :       //^2759:04B5
 5201 :       return 1;
 5202 :     //^2759:04BA
 5203 :     return 0;
 5204 :   }
 5205 : 
 5206 :   //^1031:0BA4
 5207 :   void _1031_0ba4(Bit16u xx, Bit16u yy, Bit16u zz)
 5208 :   {
 5209 :     //^1031:0BA4
 5210 :     ENTER(0);
 5211 :     //^1031:0BA9
 5212 :     Bit16u di = zz;
 5213 :     //^1031:0BAC
 5214 :     if (_4976_19a7 == 0) {
 5215 :       //^1031:0BB3
 5216 :       _4976_19a7 = 1;
 5217 :       //^1031:0BB9
 5218 :     }
 5219 :     else {
 5220 :       //^1031:0BBB
 5221 :       _4976_4e9a = 1;
 5222 :       //^1031:0BC1
 5223 :       _4976_4e4a = xx;
 5224 :       _4976_4e4c = yy;
 5225 :       _4976_4e6a = di;
 5226 :       //^1031:0BD1
 5227 :       return;
 5228 :     }
 5229 :     //^1031:0BD4
 5230 :     __int16 cx = ((di == 4 && _4976_19af == 0) || di == 0x0040 || di == 0x0060) ? 9 : 7;
 5231 :     //^1031:0BF2
 5232 :     _4976_19af = 0;
 5233 :     //^1031:0BF8
 5234 :     __int16 si = _4976_19a5 +1;
 5235 :     //^1031:0BFE
 5236 :     if (si > 10) {
 5237 :       //^1031:0C03
 5238 :       si -= 11;
 5239 :     }
 5240 :     //^1031:0C06
 5241 :     if (_4976_4e00 >= cx) {
 5242 :       //^1031:0C0D
 5243 :       if (di == 2) {
 5244 :         //^1031:0C12
 5245 :         _4976_19af = 1;
 5246 :       }
 5247 :     }
 5248 :     else {
 5249 :       //^1031:0C1A
 5250 :       _4976_4e00++;
 5251 :       //^1031:0C1E
 5252 :       _4976_19a5 = si;
 5253 :       //^1031:0C23
 5254 :       _4976_4e02[si].w0 = di;
 5255 :       //^1031:0C2E
 5256 :       _4976_4e02[si].w2 = xx;
 5257 :       //^1031:0C3E
 5258 :       _4976_4e02[si].w4 = yy;
 5259 :     }
 5260 :     //^1031:0C4E
 5261 :     _4976_19a7 = 0;
 5262 :     //^1031:0C54
 5263 :     return;
 5264 :   }
 5265 : 
 5266 :   //^1031:0B7E
 5267 :   void _1031_0b7e() //#DS=4976
 5268 :   {
 5269 :     //^1031:0B7E
 5270 :     ENTER(0);
 5271 :     //^1031:0B81
 5272 :     if (_4976_4e9a != 0) {
 5273 :       //^1031:0B88
 5274 :       _4976_4e9a = 0;
 5275 :       //^1031:0B8E
 5276 :       _1031_0ba4(_4976_4e4a, _4976_4e4c, _4976_4e6a);
 5277 :     }
 5278 :     //^1031:0BA2
 5279 :     return;
 5280 :   }
 5281 : 
 5282 :   //^1031:098E
 5283 :   void _1031_098e() //#DS=4976
 5284 :   {
 5285 :     //^1031:098E
 5286 :     ENTER(0);
 5287 :     //^1031:0993
 5288 :     while (_476d_05a9() != 0)
 5289 :       //^1031:0995
 5290 :       _476d_050e();
 5291 :     //^1031:09A3
 5292 :     _4976_19a7 = 1;
 5293 :     //^1031:09A9
 5294 :     __int16 di = _4976_4ea6;
 5295 :     //^1031:09AD
 5296 :     __int16 si = _4976_19a5 +1;
 5297 :     //^1031:09B3
 5298 :     if (si > 10) {
 5299 :       //^1031:09B8
 5300 :       si = 0;
 5301 :     }
 5302 :     //^1031:09BA
 5303 :     if (si != di) {
 5304 :       //^1031:09C1
 5305 :       si = di;
 5306 :       _4976_4e00 = 0;
 5307 : 
 5308 :       while (true) {
 5309 :         //^1031:09C9
 5310 :         if (false
 5311 :           || _4976_4e02[si].w0 == 0x0040
 5312 :           || _4976_4e02[si].w0 == 0x0060
 5313 :           || _4976_4e02[si].w0 == 0x0004
 5314 :         ) {
 5315 :           //^1031:09F9
 5316 :           _4976_4e02[di] = _4976_4e02[si];
 5317 :           //^1031:0A19
 5318 :           di++;
 5319 :           //^1031:0A1C
 5320 :           if (di > 10)
 5321 :             //^1031:0A21
 5322 :             di = 0;
 5323 :           //^1031:0A23
 5324 :           _4976_4e00++;
 5325 :         }
 5326 :         //^1031:0A27
 5327 :         if (si == _4976_19a5)
 5328 :           //^1031:0A2B
 5329 :           break;
 5330 :         //^1031:0A2D
 5331 :         si++;
 5332 :         //^1031:0A2E
 5333 :         if (si > 10)
 5334 :           //^1031:0A35
 5335 :           si = 0;
 5336 :         //^1031:0A37
 5337 :         continue;
 5338 :       }
 5339 :       //^1031:0A39
 5340 :       if (di-- == 0) {
 5341 :         //^1031:0A40
 5342 :         di = 10;
 5343 :       }
 5344 :       //^1031:0A43
 5345 :       _4976_19a5 = di;
 5346 :     }
 5347 :     //^1031:0A47
 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 :     //^1031:0A7F
 5359 :     _1031_0b7e();
 5360 :     //^1031:0A84
 5361 :     return;
 5362 :   }
 5363 : 
 5364 :   //^1031:023B
 5365 :   Bit8u *_1031_023b(sk1891 *xx)
 5366 :   {
 5367 :     //^1031:023B
 5368 :     ENTER(0);
 5369 :     //^1031:023E
 5370 :         return &_4976_169c[xx->w2];
 5371 :   }  
 5372 : 
 5373 :   //^443C:087C
 5374 :   void _443c_087c()
 5375 :   {
 5376 :     //^443C:087C
 5377 :     ENTER(0);
 5378 :     //^443C:087F
 5379 :     _01b0_07f8();
 5380 :     //^443C:0888
 5381 :     return;
 5382 :   }
 5383 : 
 5384 :   //^443C:0889
 5385 :   void _443c_0889()
 5386 :   {
 5387 :     //^443C:0889
 5388 :     ENTER(0);
 5389 :     //^443C:088C
 5390 :     _01b0_080b();
 5391 :     //^443C:0895
 5392 :     return;
 5393 :   }
 5394 : 
 5395 :   //^443C:00A9
 5396 :   void _443c_00a9(sk0ce0 *ref, i16 x, i16 cx, i16 y, i16 cy)
 5397 :   {
 5398 :     //^443C:00A9
 5399 :     ENTER(0);
 5400 :     //^443C:00AC
 5401 :     _4976_5da4 = ref;
 5402 :     //^443C:00B9
 5403 :     _4976_5da8 = _4976_5d98 = x;
 5404 :     //^443C:00C2
 5405 :     _4976_5db2 = cx;
 5406 :     //^443C:00C8
 5407 :     _4976_5d9c = _4976_5db2 -x +1;
 5408 :     //^443C:00CF
 5409 :     _4976_5daa = _4976_5d9a = y;
 5410 :     //^443C:00D8
 5411 :     _4976_5db4 = cy;
 5412 :     //^443C:00DE
 5413 :     _4976_5d9e = _4976_5db4 -y +1;
 5414 :     //^443C:00E5
 5415 :     _01b0_0ca4(&_4976_5d98, 0x20);
 5416 :     //^443C:00F6
 5417 :     return;
 5418 :   }
 5419 : 
 5420 :   //^443C:06B4
 5421 :   void _443c_06b4(sk0ce0 *ref)
 5422 :   {
 5423 :     //^443C:06B4
 5424 :     ENTER(8);
 5425 :     //^443C:06B9
 5426 :     if ((ref->b3 & 0x80) == 0) {
 5427 :       //^443C:06CB
 5428 :       ref->b3 |= 0x80;
 5429 :       //^443C:06D0
 5430 :       skxxx7 *bp08 = _4976_5dae;
 5431 :       //^443C:06D8
 5432 :       skxxx8 *bp04 = _4976_5dae->pv0;
 5433 :       //^443C:06DF
 5434 :       while (bp04 != NULL && (bp04->b3 & 0x0f) > (ref->b3 & 0x0f)) {
 5435 :         //^443C:06E1
 5436 :         bp08 = bp04->pv6;
 5437 :         //^443C:06F2
 5438 :         bp04 = bp08->pv0;
 5439 :         //^443C:06FC
 5440 :       }
 5441 :       //^443C:0721
 5442 :       _443c_087c();
 5443 :       //^443C:0726
 5444 :       ref->pv6->pv0 = bp04;
 5445 :       //^443C:073A
 5446 :       bp08->pv0 = ref;
 5447 : 
 5448 :       {
 5449 :         //^443C:074A
 5450 :         SRECT *bp04 = &ref->pv6->rc4;
 5451 :         //^443C:075E
 5452 :         QUERY_EXPANDED_RECT(ref->w0 & 0x3fff, bp04);
 5453 :         //^443C:0773
 5454 :         if ((ref->w0 & 0x8000) != 0) {
 5455 :           //^443C:077D
 5456 :           bp04->x = _4976_00e8;
 5457 :           bp04->y = _4976_00ea;
 5458 :         }
 5459 :         //^443C:078D
 5460 :         if (ref->b5 != 0) {
 5461 :           //^443C:0797
 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 :         //^443C:07C9
 5471 :         _443c_0889();
 5472 :         //^443C:07CE
 5473 :         _443c_040e();
 5474 :       }
 5475 :     }
 5476 :     //^443C:07D2
 5477 :     return;
 5478 :   }
 5479 : 
 5480 :   //^443C:07D5
 5481 :   void _443c_07d5(sk0ce0 *ref)
 5482 :   {
 5483 :     //^443C:07D5
 5484 :         ENTER(8);
 5485 :     //^443C:07D9
 5486 :     if ((ref->b3 & 0x80) != 0) {
 5487 :       //^443C:07E3
 5488 :       ref->b3 &= 0x7f;
 5489 :       //^443C:07E8
 5490 :       skxxx7 *bp08 = _4976_5dae;
 5491 :       //^443C:07F0
 5492 :       skxxx8 *bp04 = _4976_5dae->pv0;
 5493 :       //^443C:07F7
 5494 :       while (bp04 != ref) {
 5495 :         //^443C:07F9
 5496 :         if (bp04 == NULL) {
 5497 :           //^443C:07FF
 5498 :           return;
 5499 :         }
 5500 :         //^443C:0801
 5501 :         bp08 = bp04->pv6;
 5502 :         //^443C:0812
 5503 :         bp04 = bp08->pv0;
 5504 :         //^443C:081C
 5505 :       }
 5506 :       //^443C:0832
 5507 :       _443c_087c();
 5508 :       //^443C:0837
 5509 :       bp08->pv0 = bp04->pv6->pv0;
 5510 :       //^443C:084F
 5511 :       _443c_0889();
 5512 :       //^443C:0854
 5513 :       _443c_040e();
 5514 :     }
 5515 :     //^443C:0858
 5516 :     return;
 5517 :   }
 5518 : 
 5519 :   //^1031:0541
 5520 :   void _1031_0541(Bit16u xx) //#DS=4976
 5521 :   {
 5522 :     //^1031:0541
 5523 :     ENTER(12);
 5524 :     //^1031:0547
 5525 :     if (xx != _4976_19ad) {
 5526 :       //^1031:0550
 5527 :       _1031_098e();
 5528 :     }
 5529 :     //^1031:0555
 5530 :     _4976_19ad = xx;
 5531 :     //^1031:055B
 5532 :     _1031_027e(&_4976_1891[_4976_19ad]);
 5533 :     //^1031:0569
 5534 :     sk16ed *bp04 = _4976_16ed;
 5535 :     //^1031:0571
 5536 :     for (__int16 di = 0; di < 60; bp04++, di++) {
 5537 :       //^1031:0575
 5538 :       Bit16u si = bp04->b6;
 5539 :       //^1031:0580
 5540 :       if (!(si & 0x40) != !(si & 0x80)) {
 5541 :         //^1031:0597
 5542 :         if ((si & 0x80) != 0) {
 5543 :           //^1031:059D
 5544 :           if ((si &= 0x3f) != 0) {
 5545 :             //^1031:05A3
 5546 :             _4976_0ce0[si].b3 |= 0x20;
 5547 :           }
 5548 :           //^1031:05B1
 5549 :           bp04->b6 = bp04->b6 & 0x7f;
 5550 :         }
 5551 :         else {
 5552 :           //^1031:05C0
 5553 :           if ((si &= 0x3f) != 0) {
 5554 :             //^1031:05C6
 5555 :             _4976_0ce0[si].b3 |= 0x10;
 5556 :           }
 5557 :           //^1031:05D4
 5558 :           bp04->b6 |= 0x80;
 5559 :         }
 5560 :       }
 5561 :       //^1031:05DC
 5562 :       bp04->b6 = bp04->b6 & 0xbf;
 5563 :       //^1031:05E9
 5564 :     }
 5565 :     //^1031:05F3
 5566 :     sk0ce0 *bp08 = &_4976_0ce0[1];
 5567 :     //^1031:05FB
 5568 :     for (i16 di = 0; di < 18; bp08++, di++) {
 5569 :       //^1031:05FF
 5570 :       i16 bp0a = (bp08->b3 & 0x10);
 5571 :       //^1031:060D
 5572 :       i16 bp0c = (bp08->b3 & 0x20);
 5573 :       //^1031:0618
 5574 :       if ((!bp0a) != (!bp0c)) {
 5575 :         //^1031:062C
 5576 :         if (bp0a != 0) {
 5577 :           //^1031:0632
 5578 :           _443c_06b4(bp08);
 5579 :         }
 5580 :         else {
 5581 :           //^1031:063F
 5582 :           _443c_07d5(bp08);
 5583 :         }
 5584 :       }
 5585 :       //^1031:064C
 5586 :       bp08->b3 = bp08->b3 & 0xcf;
 5587 :       //^1031:065D
 5588 :     }
 5589 :     //^1031:0659
 5590 :     return;
 5591 :   }
 5592 : 
 5593 :   //^1031:0667
 5594 :   void _1031_0667() //#DS=4976
 5595 :   {
 5596 :     //^1031:0667
 5597 :     ENTER(0);
 5598 :     //^1031:066A
 5599 :     _1031_0541(_4976_19ad);
 5600 :   }
 5601 : 
 5602 :   //^2759:0009
 5603 :   Bit8u *QUERY_CMDSTR_NAME(Bit8u cls1, Bit8u cls2, Bit8u cls4)
 5604 :   {
 5605 :     // returns cmdStr name such as "CHOP", "THRUST", "MELEE", and so on.
 5606 : 
 5607 :     //^2759:0009
 5608 :     ENTER(134);
 5609 :     //^2759:000E
 5610 :     Bit8u bp0086[128];
 5611 :     Bit8u *bp04 = QUERY_GDAT_TEXT(cls1, cls2, cls4, bp0086);
 5612 :     //^2759:0032
 5613 :     if (*bp04 == 0) {
 5614 :       //^2759:0038
 5615 :       return NULL;
 5616 :     }
 5617 :     //^2759:003E
 5618 :     Bit8u bp05;
 5619 :     for (Bit16u si = 0; (bp05 = *(bp04++)) != ':' && bp05 != 0; si++) {
 5620 :       //^2759:0042
 5621 :       _4976_5302[si] = bp05;
 5622 :     }
 5623 :     //^2759:0060
 5624 :         _4976_5302[si] = 0;
 5625 :     //^2759:0065
 5626 :     return _4976_5302;
 5627 :   }
 5628 : 
 5629 :   //^29EE:0A7B
 5630 :   void _29ee_0a7b(Bit16u xx, Bit8u yy)
 5631 :   {
 5632 :     //^29EE:0A7B
 5633 :     //^29EE:0A7F
 5634 :     Bit16u si = xx;
 5635 :     //^29EE:0A82
 5636 :     _29ee_00a3(0);
 5637 :     //^29EE:0A89
 5638 :     if (_4976_5356 != 0) {
 5639 :       //^29EE:0A90
 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 :       //^29EE:0ABC
 5644 :       DRAW_ICON_PICT_ENTRY(0x01, 0x04, yy +0x15, &_4976_3f6c, si +63, -1);
 5645 :       //^29EE:0ADA
 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 :     //^29EE:0B25
 5655 :     //^29EE:0B28
 5656 :     return;
 5657 :   }
 5658 : 
 5659 :   //^29EE:0B2B
 5660 :   void _29ee_0b2b()
 5661 :   {
 5662 :     //^29EE:0B2B
 5663 :     //^29EE:0B2F
 5664 :     for (Bit16u si = 0; si < _4976_53a4; si++) {
 5665 :       //^29EE:0B33
 5666 :       _29ee_0a7b(si, 0);
 5667 :       //^29EE:0B3C
 5668 :     }
 5669 :     //^29EE:0B43
 5670 :     _29ee_078b();
 5671 :     //^29EE:0B47
 5672 :   }
 5673 : 
 5674 :   //^29EE:1D03
 5675 :   void _29ee_1d03(Bit16u xx)
 5676 :   {
 5677 :     //^29EE:1D03
 5678 :     ENTER(6);
 5679 :     //^29EE:1D08
 5680 :     Bit16u si = xx;
 5681 :     //^29EE:1D0B
 5682 :     _29ee_00a3(0);
 5683 :     //^29EE:1D12
 5684 :     if (_4976_5366 > 0 && (_4976_5356 & 0x0800) != 0) {
 5685 :       //^29EE:1D24
 5686 :       si ^= _4976_5356;
 5687 :       si &= 15;
 5688 :       //^29EE:1D2C
 5689 :       Bit8u bp06[2];
 5690 :       bp06[1] = 0;
 5691 :       Bit16u bp02 = 0;
 5692 :       //^29EE:1D35
 5693 :       for (; bp02 < 4; bp02++) {
 5694 :         //^29EE:1D37
 5695 :         Bit8u bp03 = 0x49;
 5696 :         //^29EE:1D3B
 5697 :         if ((si & 0x0001) != 0) {
 5698 :           //^29EE:1D41
 5699 :           bp03++;
 5700 :         }
 5701 :         //^29EE:1D44
 5702 :         si >>= 1;
 5703 :         //^29EE:1D46
 5704 :         DRAW_ICON_PICT_ENTRY(0x14, _4976_53ae, bp03, &_4976_3f6c, bp02 +101, -1);
 5705 :         //^29EE:1D65
 5706 :         bp06[0] = bp02 +0x72;
 5707 :         //^29EE:1D6D
 5708 :         DRAW_SIMPLE_STR(&_4976_3f6c, bp02 +105, _4976_4bda[0], _4976_4bda[2] | 0x4000, bp06);
 5709 :         //^29EE:1D99
 5710 :       }
 5711 :     }
 5712 :     //^29EE:1DA2
 5713 :     return;
 5714 :   }
 5715 : 
 5716 :   //^0CEE:073E
 5717 :   __int16 _0cee_073e(__int16 xx, __int16 yy, __int16 ww, GenericRecord **ref)
 5718 :   {
 5719 :     //^0CEE:073E
 5720 :     ENTER(6);
 5721 :     //^0CEE:0744
 5722 :     for (__int16 si = 0; si <= 3; si++) {
 5723 :       //^0CEE:0749
 5724 :       ObjectID bp06;
 5725 :       bp06 = GET_TILE_RECORD_LINK(xx + _4976_0232[si], yy + _4976_023a[si]);
 5726 :       //^0CEE:0768
 5727 :       Bit16u di;
 5728 :       for (; bp06 != bp06.FFFE && (di = bp06.DBType()) <= dbActuator; bp06 = GET_NEXT_RECORD_LINK(bp06)) {
 5729 :         //^0CEE:076B
 5730 :         if (di == dbActuator || di == dbText) {
 5731 :           //^0CEE:0778
 5732 :           GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(bp06);
 5733 :           //^0CEE:0787
 5734 :           if (di == dbActuator) {
 5735 :             //^0CEE:078C
 5736 :             Actuator *bp04 = _bp04->castToActuator();
 5737 :             if (bp04->ActuatorType() == 0x001c) {
 5738 :               //^0CEE:079E
 5739 :               if (_4976_4dba[bp04->ActuatorData()].Level() - _4976_4d0a->Level() == ww) {
 5740 :                 //^0CEE:07CE
 5741 :                 *ref = _bp04;
 5742 :                 //^0CEE:07DE
 5743 :                 return si;
 5744 :               }
 5745 :             }
 5746 :           }
 5747 :           else {
 5748 :             //^0CEE:07E3
 5749 :             Text *bp04 = _bp04->castToText();
 5750 :             if (true
 5751 :               && bp04->TextMode() == 1
 5752 :               && (bp04->SimpleTextExtUsage() == 6 || bp04->SimpleTextExtUsage() == 7)
 5753 :             ) {
 5754 :               //^0CEE:0810
 5755 :               di = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp04->OrnateIndex(), dtWordValue, 0x11);
 5756 :               //^0CEE:0830
 5757 :               if ((ww == -1 && di != 0) || (ww == 1 && di == 0)) {
 5758 :                 //^0CEE:0844
 5759 :                 *ref = NULL;
 5760 :                 //^0CEE:0852
 5761 :                 //^0CEE:07DE
 5762 :                 return si;
 5763 :               }
 5764 :             }
 5765 :           }
 5766 :         }
 5767 :         //^0CEE:0854
 5768 :       }
 5769 :       //^0CEE:0879
 5770 :     }
 5771 :     //^0CEE:0882
 5772 :     *ref = NULL;
 5773 :     //^0CEE:0890
 5774 :     return -1;
 5775 :   }
 5776 : 
 5777 :   //^19F0:124B
 5778 :   Bit16u _19f0_124b(__int16 *xx, __int16 *yy, Bit16u ww, __int16 ss, Bit16u tt)
 5779 :   {
 5780 :     //^19F0:124B
 5781 :     ENTER(8);
 5782 :     //^19F0:1251
 5783 :     Bit16u bp04 = 0;
 5784 :     __int16 di = -1;
 5785 :     //^19F0:1259
 5786 :     CHANGE_CURRENT_MAP_TO(ww);
 5787 :     //^19F0:1262
 5788 :     Bit16u si = GET_TILE_VALUE(*xx, *yy);
 5789 :     //^19F0:1279
 5790 :     Bit16u bp02 = si >> 5;
 5791 :     //^19F0:1281
 5792 :     if (bp02 == ttStairs) {
 5793 :       //^19F0:1286
 5794 :       if ((tt & 0x0100) == 0)
 5795 :         //^19F0:128D
 5796 :         //^19F0:13A4
 5797 :         return di;
 5798 : 
 5799 :       //^19F0:1290
 5800 :       if ((((si & 0x0004) != 0) ? ((ss == -1) ? 1 : 0) : ((ss == 1) ? 1 : 0)) == 0) {
 5801 :         //^19F0:12B6
 5802 :         //^19F0:13A4
 5803 :         return di;
 5804 :       }
 5805 :     }
 5806 :     //^19F0:12BB
 5807 :     else if (bp02 != 2 || (tt & 0x0008) == 0 || (ss != -1) || (si & 0x0008) == 0 || (si & 0x0001) != 0) {
 5808 :       //^19F0:12DA
 5809 :       if ((si & 0x0002) == 0 || bp02 == 0 || bp02 == 7 || bp02 == 4)
 5810 :         //^19F0:12FB
 5811 :         //^19F0:13A4
 5812 :         return di;
 5813 : 
 5814 :       //^19F0:12FE
 5815 :       GenericRecord *bp08;
 5816 :       if ((tt & 0x0100) == 0 || _0cee_073e(*xx, *yy, ss, &bp08) < 0) {
 5817 :         //^19F0:1325
 5818 :         if ((tt & 0x0010) == 0 || ss != -1)
 5819 :           //^19F0:1330
 5820 :           //^19F0:13A4
 5821 :           return di;
 5822 :         //^19F0:1332
 5823 :         bp04 = 1;
 5824 :       }
 5825 :     }
 5826 :     //^19F0:1337
 5827 :     di = _0cee_0510(ww, ss, xx, yy, NULL);
 5828 :     //^19F0:1357
 5829 :     if (di < 0 || bp04 == 0)
 5830 :       //^19F0:135F
 5831 :       //^19F0:13A4
 5832 :       return di;
 5833 :     //^19F0:1361
 5834 :     CHANGE_CURRENT_MAP_TO(di);
 5835 :     //^19F0:1368
 5836 :     si = GET_TILE_VALUE(*xx, *yy);
 5837 :     //^19F0:137F
 5838 :     bp02 = si >> 5;
 5839 :     //^19F0:1387
 5840 :     if (bp02 == ttPit && (si & 0x0008) != 0 && (si & 0x0001) != 0)
 5841 :       //^19F0:1398
 5842 :       di = -1;
 5843 :     //^19F0:139B
 5844 :     CHANGE_CURRENT_MAP_TO(ww);
 5845 :     //^19F0:13A4
 5846 :     return di;
 5847 :   }
 5848 : 
 5849 :   //^29EE:18EB
 5850 :   void _29ee_18eb(Bit16u xx, Bit16u yy, Bit16u zz)
 5851 :   {
 5852 :     //^29EE:18EB
 5853 :     ENTER(0);
 5854 :     //^29EE:18EE
 5855 :     _4976_536a = _4976_5320 = _4976_5328 = xx;
 5856 :     _4976_536c = _4976_5322 = _4976_532a = yy;
 5857 :     _4976_5318 = zz;
 5858 :     //^29EE:190C
 5859 :     _4976_533c = _19f0_124b(&_4976_5328, &_4976_532a, _4976_5318, -1, 0x0110);
 5860 :     //^29EE:1928
 5861 :     _4976_533e = _19f0_124b(&_4976_5320, &_4976_5322, _4976_5318,  1, 0x0108);
 5862 :     //^29EE:1944
 5863 :     return;
 5864 :   }
 5865 : 
 5866 :   //^0CEE:02DD
 5867 :   void _0cee_02dd(__int16 ww, __int16 xx, __int16 yy, __int16 *ss, __int16 *tt)
 5868 :   {
 5869 :     //^0CEE:02DD
 5870 :     ENTER(0);
 5871 :     //^0CEE:02E1
 5872 :         __int16 si = ww;
 5873 :     //^0CEE:02E4
 5874 :     *ss += _4976_0232[si] * xx;
 5875 :     //^0CEE:02F5
 5876 :     *tt += _4976_023a[si] * xx;
 5877 :     //^0CEE:0306
 5878 :     si = (si +1) & 3;
 5879 :     //^0CEE:030B
 5880 :     *ss += _4976_0232[si] * yy;
 5881 :     //^0CEE:031C
 5882 :     *tt += _4976_023a[si] * yy;
 5883 :     //^0CEE:032D
 5884 :         return;
 5885 :   }
 5886 : 
 5887 :   //^0CEE:315E
 5888 :   Bit16u IS_WALL_ORNATE_ALCOVE(Bit8u cls2)
 5889 :   {
 5890 :     // return 0 if non-alcove.
 5891 :     // return 1 if an alcove.
 5892 :     // return 3 if an active sleep device.
 5893 : 
 5894 :     //^0CEE:315E
 5895 :     ENTER(0);
 5896 :     //^0CEE:3161
 5897 :     if (cls2 == 0xff) {
 5898 :       //^0CEE:3167
 5899 :       return 0;
 5900 :     }
 5901 :     //^0CEE:316B
 5902 :     return QUERY_GDAT_ENTRY_DATA_INDEX(0x09, cls2, dtWordValue, 0x0a);
 5903 :   }
 5904 : 
 5905 :   //^0CEE:17E7
 5906 :   Bit16u _0cee_17e7(Bit16u aa, Bit16u bb, Bit16u cc)
 5907 :   {
 5908 :     // CSBwinSimilarity: TAG00a41c,Hash
 5909 : 
 5910 :     //^0CEE:17E7
 5911 :     ENTER(0);
 5912 :     //^0CEE:17EA
 5913 :     return ((((aa * 31417) >> 1) + (bb * 11) + _4976_4d0e->w0) >> 2) % cc;
 5914 :   }
 5915 : 
 5916 :   //^0CEE:1815
 5917 :   Bit8u _0cee_1815(Bit16u xx, __int16 yy, Bit16u ss, Bit16u tt, Bit16u uu)
 5918 :   {
 5919 :     // CSBwinSimilarity: TAG00a44c,RandomWallDecoration
 5920 : 
 5921 :     //^0CEE:1815
 5922 :     ENTER(0);
 5923 :     //^0CEE:1819
 5924 :     if (xx != 0) {
 5925 :       //^0CEE:181F
 5926 :       __int16 si = _0cee_17e7(
 5927 :         (ss << 5) +tt +2000,
 5928 :         (_4976_0c5a << 6) + _4976_4dd2 + _4976_4dd4 +3000,
 5929 :         uu
 5930 :         );
 5931 :       //^0CEE:184A
 5932 :       if (si < yy) {
 5933 :         //^0CEE:184F
 5934 :         return _4976_4dc2[si];
 5935 :       }
 5936 :     }
 5937 :     //^0CEE:1855
 5938 :         return 0xff;
 5939 :   }
 5940 : 
 5941 :   //^0CEE:185A
 5942 :   void _0cee_185a(skxxx6 *ref, Bit16u xx, Bit16u yy, Bit16u zz, Bit16u ww, Bit16u vv, __int16 ss, Bit16u tt)
 5943 :   {
 5944 :     // CSBwinSimilarity: TAG00a4a2
 5945 : 
 5946 :     //^0CEE:185A
 5947 :     ENTER(0);
 5948 :     //^0CEE:185F
 5949 :     __int16 di = tt;
 5950 :     //^0CEE:1862
 5951 :     Bit16u si = _4976_4d0a->WallGraphicsRandomDecorations();
 5952 :     //^0CEE:1872
 5953 :     ref->w6(_0cee_1815(xx, si, ss, (++di) * ((vv & 3) +1), 30));
 5954 :     //^0CEE:1899
 5955 :     ref->w8(_0cee_1815(yy, si, ss, di * (((++vv) & 3) +1), 30));
 5956 :     //^0CEE:18C2
 5957 :     ref->w10(_0cee_1815(zz, si, ss, di * (((++vv) & 3) +1), 30));
 5958 :     //^0CEE:18EB
 5959 :     ref->w12(_0cee_1815(ww, si, ss, (di--) * (((++vv) & 3) +1), 30));
 5960 :     //^0CEE:1915
 5961 :     if (ss < 0 || ss >= _4976_4dd2 || di < 0 || di >= _4976_4dd4) {
 5962 :       //^0CEE:192E
 5963 :       for (si = 3; si <= 6; si++) {
 5964 :         //^0CEE:1933
 5965 :         if (IS_WALL_ORNATE_ALCOVE(Bit8u(ref->w[si])) != 0) {
 5966 :           //^0CEE:194A
 5967 :           ref->w[si] = 0x00ff;
 5968 :         }
 5969 :         //^0CEE:1958
 5970 :       }
 5971 :     }
 5972 :     //^0CEE:195E
 5973 :     return;
 5974 :   }
 5975 : 
 5976 :   //^0CEE:1A46
 5977 :   ObjectID _0cee_1a46(skxxx6 *ref, ObjectID recordLink, __int16 xx, Bit16u yy)
 5978 :   {
 5979 :     //^0CEE:1A46
 5980 :     ENTER(24);
 5981 :     //^0CEE:1A4C
 5982 :     Bit16u bp08;
 5983 :     for (Bit16u bp16 = 0; recordLink != ObjectID::FFFE && (bp08 = recordLink.DBType()) <= dbActuator; recordLink = GET_NEXT_RECORD_LINK(recordLink)) {
 5984 :       //^0CEE:1A54
 5985 :       Bit16u bp12 = recordLink.Dir();
 5986 :       //^0CEE:1A5D
 5987 :       if ((bp16 & (1 << bp12)) == 0) {
 5988 :         //^0CEE:1A6D
 5989 :         Bit16u bp06 = ((bp12 -xx) & 3) +3;
 5990 :         //^0CEE:1A7C
 5991 :         if (xx == 0 || bp06 == 5) {
 5992 :           //^0CEE:1A8B
 5993 :           Bit16u si = 0;
 5994 :           Bit16u di = 0;
 5995 :           //^0CEE:1A8F
 5996 :           __int32 bp0c = _4976_4bec;
 5997 :           //^0CEE:1A9C
 5998 :           __int32 bp10 = 0;
 5999 :           //^0CEE:1AA6
 6000 :           GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(recordLink);
 6001 :           //^0CEE:1AB4
 6002 :           Bit8u bp13;
 6003 :           if (bp08 == 2) {
 6004 :             Text *bp04 = _bp04->castToText();
 6005 :             //^0CEE:1ABD
 6006 :             switch (bp04->TextMode()) {
 6007 :               case 0:
 6008 :                 //^0CEE:1AD5
 6009 : _1ad5:
 6010 :                 ref->w[bp06] = 0;
 6011 :                 //^0CEE:1AE4
 6012 :                 if (bp06 == 5 && bp04->TextVisibility()) {
 6013 :                   //^0CEE:1AF8
 6014 :                   ref->w14(recordLink);
 6015 :                 }
 6016 :                 else {
 6017 :                   //^0CEE:1B04
 6018 :                   ref->w14(ObjectID::FFFF);
 6019 :                 }
 6020 :                 //^0CEE:1B0D
 6021 :                 bp16 |= 1 << bp12;
 6022 :                 //^0CEE:1B18
 6023 :                 continue;
 6024 : 
 6025 :               case 1:
 6026 :                 //^0CEE:1B1B
 6027 :                 Bit8u bp13 = Bit8u(bp04->OrnateIndex());
 6028 :                 //^0CEE:1B2D
 6029 :                 switch (bp04->SimpleTextExtUsage()) {
 6030 :                   case 14:
 6031 :                     {
 6032 :                       //^0CEE:1B49
 6033 :                       goto _1ad5;
 6034 :                     }
 6035 :                   case 5:
 6036 :                   case 13:
 6037 :                     {
 6038 :                       //^0CEE:1B4E
 6039 :                       if (bp04->TextVisibility() != 0) {
 6040 :                         //^0CEE:1B5F
 6041 :                         si = 1;
 6042 :                       }
 6043 :                       //^0CEE:1B62
 6044 :                       break;
 6045 :                     }
 6046 :                   case 2:
 6047 :                     {
 6048 :                       //^0CEE:1B65
 6049 :                       si = 1;
 6050 :                       //^0CEE:1B68
 6051 :                       break;
 6052 :                     }
 6053 :                   case 4:
 6054 :                   case 7:
 6055 :                   case 8:
 6056 :                     {
 6057 :                       //^0CEE:1B6B
 6058 :                       di = bp04->TextVisibility();
 6059 :                       //^0CEE:1B77
 6060 :                       if (di != 0) {
 6061 :                         //^0CEE:1B7E
 6062 :                         si = 1;
 6063 :                         //^0CEE:1B81
 6064 :                         bp16 |= 1 << bp12;
 6065 :                       }
 6066 :                       //^0CEE:1B8C
 6067 :                       break;
 6068 :                     }
 6069 :                   case 0:
 6070 :                   case 6:
 6071 :                     {
 6072 :                       //^0CEE:1B49
 6073 :                       break;
 6074 :                     }
 6075 :                   case 1:
 6076 :                   case 3:
 6077 :                   case 9:
 6078 :                   case 10:
 6079 :                   case 11:
 6080 :                   case 12:
 6081 :                     {
 6082 :                       //^0CEE:1B49
 6083 :                       continue;
 6084 :                     }
 6085 :                 }
 6086 :             }
 6087 :           }
 6088 :           //^0CEE:1B8F
 6089 :           else if (bp08 == 3) {
 6090 :             Actuator *bp04 = _bp04->castToActuator();
 6091 :             //^0CEE:1B98
 6092 :             bp13 = GET_WALL_DECORATION_OF_ACTUATOR(bp04);
 6093 :             //^0CEE:1BA8
 6094 :             if (bp13 != 0xff) {
 6095 :               //^0CEE:1BAF
 6096 :               Bit16u bp18 = bp04->ActuatorType();
 6097 :               //^0CEE:1BBC
 6098 :               switch (bp18) {
 6099 :                 case 0x3f:
 6100 :                   {
 6101 :                     //^0CEE:1BD5
 6102 :                     if (bp06 == 5) {
 6103 :                       //^0CEE:1BDB
 6104 :                       ref->w14(recordLink);
 6105 :                     }
 6106 :                     else {
 6107 :                       //^0CEE:1BE8
 6108 :                       ref->w14(ObjectID::FFFF);
 6109 :                     }
 6110 :                     //^0CEE:1BF1
 6111 :                     break;
 6112 :                   }
 6113 :                 case 0x7e:
 6114 :                   {
 6115 :                     //^0CEE:1BF4
 6116 :                     if (bp04->OnceOnlyActuator() != 0) {
 6117 :                       //^0CEE:1C08
 6118 :                       if (bp06 != 5) {
 6119 :                         //^0CEE:1C0E
 6120 :                         ref->w14(bp04->ActuatorData());
 6121 :                       }
 6122 :                       //^0CEE:1C1F
 6123 :                       bp16 |= 1 << bp12;
 6124 :                       //^0CEE:1C2A
 6125 :                       si = 1;
 6126 :                     }
 6127 :                     //^0CEE:1C2D
 6128 :                     break;
 6129 :                   }
 6130 :                 case 0x17:
 6131 :                   {
 6132 :                     //^0CEE:1C30
 6133 :                     di = bp04->OnceOnlyActuator();
 6134 :                     //^0CEE:1C3F
 6135 :                     if (di != 0) {
 6136 :                       //^0CEE:1C46
 6137 :                       si = 1;
 6138 :                     }
 6139 :                     //^0CEE:1C49
 6140 :                     break;
 6141 :                   }
 6142 :                 case 0x18:
 6143 :                   {
 6144 :                     //^0CEE:1C4C
 6145 :                     di = bp04->w4_0_0() ^ bp04->OnceOnlyActuator();
 6146 :                     //^0CEE:1C63
 6147 :                     //^0CEE:1D12
 6148 :                     break;
 6149 :                   }
 6150 :                 case 0x1a:
 6151 :                   {
 6152 :                     //^0CEE:1C66
 6153 :                     di = bp04->OnceOnlyActuator();
 6154 :                     //^0CEE:1C75
 6155 :                     if (di != 0) {
 6156 :                       //^0CEE:1C7C
 6157 :                       si = 1;
 6158 :                       //^0CEE:1C7F
 6159 :                       bp16 |= 1 << bp12;
 6160 :                     }
 6161 :                     //^0CEE:1C8A
 6162 :                     break;
 6163 :                   }
 6164 :                 case 0x1b:
 6165 :                   {
 6166 :                     //^0CEE:1C8D
 6167 :                     di = bp04->w4_0_0();
 6168 :                     //^0CEE:1C99
 6169 :                     if (bp04->OnceOnlyActuator() == di) {
 6170 :                       //^0CEE:1CA7
 6171 :                       si = 1;
 6172 :                     }
 6173 :                     //^0CEE:1CAA
 6174 :                     break;
 6175 :                   }
 6176 :                 case 0x32:
 6177 :                   {
 6178 :                     //^0CEE:1CAC
 6179 :                     if (bp04->w4_0_0() != 0) {
 6180 :                       //^0CEE:1CBA
 6181 :                       bp0c = bp04->ActuatorData();
 6182 :                       //^0CEE:1CCC
 6183 :                       si = 1;
 6184 :                     }
 6185 :                     //^0CEE:1CCF
 6186 :                     break;
 6187 :                   }
 6188 :                 case 0x2c:
 6189 :                   {
 6190 :                     //^0CEE:1CD1
 6191 :                     if (bp04->w4_0_0() != 0) {
 6192 :                       //^0CEE:1CDF
 6193 :                       bp10 = bp04->ActuatorData() & 0xff;
 6194 :                       //^0CEE:1CF4
 6195 :                                             si = 1;                      
 6196 :                     }
 6197 :                     //^0CEE:1CF7
 6198 :                     break;
 6199 :                   }
 6200 :                 case 0x41:
 6201 :                   {
 6202 :                     //^0CEE:1CF9
 6203 :                     di = bp04->ActuatorData();
 6204 :                     //^0CEE:1D06
 6205 :                     //^0CEE:1D12
 6206 :                     break;
 6207 :                   }
 6208 :                 case 0x46:
 6209 :                   {
 6210 :                     //^0CEE:1D08
 6211 :                     di = bp04->w4_0_0();
 6212 : 
 6213 :                     break;
 6214 :                   }
 6215 :               }
 6216 :             }
 6217 :           }
 6218 :           else {
 6219 :             //^0CEE:1B95
 6220 :                         continue;
 6221 :           }
 6222 :           //^0CEE:1D14
 6223 :           if (si != 0) {
 6224 :             //^0CEE:1D18
 6225 :             di = _0cee_1962(0x09, bp13, bp0c, bp10);
 6226 :           }
 6227 :           //^0CEE:1D33
 6228 :           ref->w[bp06] = (di << 10) | bp13;
 6229 :         }
 6230 :       }
 6231 :       //^0CEE:1D4C
 6232 :     }
 6233 :     //^0CEE:1D71
 6234 :     return recordLink;
 6235 :   }
 6236 : 
 6237 :   //^0CEE:1962
 6238 :   Bit16u _0cee_1962(Bit8u ss, Bit8u tt, Bit32u tick, Bit32u xx)
 6239 :   {
 6240 :     //0CEE:1962
 6241 :     ENTER(136);
 6242 :     //^0CEE:1968
 6243 :     __int16 si = 1;
 6244 :     //^0CEE:196B
 6245 :     Bit16u bp06 = 0;
 6246 :     Bit16u bp08 = 0;
 6247 :     //^0CEE:1973
 6248 :     Bit16u di = QUERY_GDAT_ENTRY_DATA_INDEX(ss, tt, dtWordValue, 0x0d);
 6249 :     //^0CEE:1989
 6250 :     Bit8u *bp04;
 6251 :     Bit8u bp0088[128];
 6252 :     if (di == 0) {
 6253 :       //^0CEE:198D
 6254 :       Bit8u *bp04 = QUERY_GDAT_TEXT(ss, tt, 0x0d, bp0088);
 6255 :       //^0CEE:19AF
 6256 :       if (*bp04 != 0 && (di = SK_STRLEN(bp04)) != 0) {
 6257 :         //^0CEE:19C8
 6258 :         bp08 = 1;
 6259 :       }
 6260 :       else {
 6261 :         //^0CEE:19CF
 6262 :         di = 1;
 6263 :       }
 6264 :     }
 6265 :     else {
 6266 :       //^0CEE:19D4
 6267 :       bp04 = NULL;
 6268 :       bp08 = 1;
 6269 :       //^0CEE:19E3
 6270 :       if ((di & 0x8000) != 0) {
 6271 :         //^0CEE:19E9
 6272 :         bp06 = 1;
 6273 :       }
 6274 :     }
 6275 :     //^0CEE:19F2
 6276 :     if (bp08 != 0) {
 6277 :       //^0CEE:19F8
 6278 :       si = ((tick + xx) / di) +bp06;
 6279 :       //^0CEE:1A13
 6280 :       if (bp04 != NULL) {
 6281 :         //^0CEE:1A1B
 6282 :         si = *bp04;
 6283 :         //^0CEE:1A24
 6284 :         if (si >= '0' && si <= '9') {
 6285 :           //^0CEE:1A2E
 6286 :           si -= '0';
 6287 :         }
 6288 :         //^0CEE:1A33
 6289 :         if (si >= 'A' && si <= 'Z') {
 6290 :           //^0CEE:1A3D
 6291 :           si -= 'K';
 6292 :         }
 6293 :       }
 6294 :     }
 6295 :     //^0CEE:1A40
 6296 :     return si;
 6297 :   }
 6298 : 
 6299 :   //^0CEE:1DBE
 6300 :   void _0cee_1dbe(skxxx6 *ref, Bit16u ww, Bit16u xx, Bit16u yy)
 6301 :   {
 6302 :     // CSBwinSimilarity: SummarizeStoneRoom
 6303 : 
 6304 :     //^0CEE:1DBE
 6305 :     ENTER(36);
 6306 :     //^0CEE:1DC4
 6307 :     __int16 si = xx;
 6308 :     //^0CEE:1DC7
 6309 :     ref->w6(0x00ff);
 6310 :     ref->w8(0x00ff);
 6311 :     ref->w10(0x00ff);
 6312 :     ref->w12(0x00ff);
 6313 :     ref->w14(0x0000);
 6314 :     //^0CEE:1DE8
 6315 :     Bit8u bp05 = GET_TILE_VALUE(xx, yy);
 6316 :     //^0CEE:1DF7
 6317 :     ref->w2(bp05);
 6318 :     //^0CEE:1E00
 6319 :     ObjectID di = GET_TILE_RECORD_LINK(xx, yy);
 6320 :     //^0CEE:1E0E
 6321 :     ref->w0(bp05 >> 5);
 6322 :     //^0CEE:1E1E
 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:  // 0
 6337 :         {
 6338 :           //^0CEE:1E2F
 6339 :           switch (si) {
 6340 :             case 0:
 6341 :               //^0CEE:1E40
 6342 :               bp0e = bp05 & 8;
 6343 :               bp0a = bp05 & 4;
 6344 :               bp08 = bp05 & 2;
 6345 :               bp0c = bp05 & 1;
 6346 :               //^0CEE:1E63
 6347 :               break;
 6348 :             case 1:
 6349 :               //^0CEE:1E65
 6350 :               bp0e = bp05 & 4;
 6351 :               bp0a = bp05 & 2;
 6352 :               bp08 = bp05 & 1;
 6353 :               bp0c = bp05 & 8;
 6354 :               //^0CEE:1E88
 6355 :               break;
 6356 :             case 2:
 6357 :               //^0CEE:1E8A
 6358 :               bp0e = bp05 & 2;
 6359 :               bp0a = bp05 & 1;
 6360 :               bp08 = bp05 & 8;
 6361 :               bp0c = bp05 & 4;
 6362 :               //^0CEE:1EAD
 6363 :               break;
 6364 :             case 3:
 6365 :               //^0CEE:1EAF
 6366 :               bp0e = bp05 & 1;
 6367 :               bp0a = bp05 & 8;
 6368 :               bp08 = bp05 & 4;
 6369 :               bp0c = bp05 & 2;
 6370 : 
 6371 :               break;
 6372 :           }
 6373 :           //^0CEE:1ED7
 6374 :           _0cee_185a(ref, bp0e, bp0a, bp08, bp0c, si, xx, yy);
 6375 :           //^0CEE:1EF7
 6376 :           bp10 = 0;
 6377 :           //^0CEE:1EFC
 6378 : _1efc:
 6379 :           di = _0cee_1a46(ref, di, si, 0);
 6380 :           //^0CEE:1F0F
 6381 :           if (bp10 != 0 && _4976_4bfa != xx && _4976_4c06 != yy) {
 6382 :             //^0CEE:1F25
 6383 :             ref->w4(0xfffe);
 6384 :             //^0CEE:1F2E
 6385 :             //^0CEE:2353
 6386 :             return;
 6387 :           }
 6388 :           //^0CEE:1F31
 6389 :           if (bp10 != 0)
 6390 :             //^0CEE:1F37
 6391 :             break;
 6392 :           //^0CEE:1F3A
 6393 :           for (bp14 = 0; bp14 < 4; bp14++) {
 6394 :             //^0CEE:1F41
 6395 :             bp18 = xx;
 6396 :             bp1a = yy;
 6397 :             //^0CEE:1F4D
 6398 :             bp18 += _4976_0232[(si + bp14) & 3];
 6399 :             //^0CEE:1F5F
 6400 :             bp1a += _4976_023a[(si + bp14) & 3];
 6401 :             //^0CEE:1F71
 6402 :             if ((GET_TILE_VALUE(bp18, bp1a) >> 5) == ttDoor) {
 6403 :               //^0CEE:1F86
 6404 :               ref->w[bp14 +3] = 0x00ff;
 6405 :             }
 6406 :             //^0CEE:1F98
 6407 :           }
 6408 :           //^0CEE:1FA1
 6409 :           break;
 6410 :         }
 6411 :       case ttPit:    // 2
 6412 :         {
 6413 :           //^0CEE:1FA4
 6414 :           if ((bp05 & 8) != 0) {
 6415 :             //^0CEE:1FAA
 6416 :             ref->w6(bp05 & 4);
 6417 :             //^0CEE:1FB8
 6418 :             goto _2237;
 6419 :           }
 6420 :           //^0CEE:1FBB
 6421 :           ref->w0(1);
 6422 :           //^0CEE:1FC3
 6423 :           goto _2000;
 6424 :         }
 6425 :       case ttTrickWall:  // 6
 6426 :         {
 6427 :           //^0CEE:1FC5
 6428 :           if ((bp05 & 4) == 0) {
 6429 :             //^0CEE:1FD0
 6430 :             ref->w0(0);
 6431 :             //^0CEE:1FD8
 6432 :             bp0c = bp08 = bp0a = bp0e = (bp05 & 8);
 6433 :             //^0CEE:1FEB
 6434 :             bp10 = 1;
 6435 :             //^0CEE:1FF0
 6436 :             goto _1efc;
 6437 :           }
 6438 :           //^0CEE:1FF3
 6439 :           bp05 = 1;
 6440 :           //^0CEE:1FF8
 6441 :           ref->w0(bp05);
 6442 : 
 6443 :           goto _2000;
 6444 :         }
 6445 :       case ttFloor:  // 1
 6446 :         {
 6447 :           //^0CEE:2000
 6448 : _2000:
 6449 :           bp14 = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4d0a->MapGraphicsStyle(), dtWordValue, 0x6b);
 6450 :           //^0CEE:2020
 6451 :           if (bp14 != 0) {
 6452 :             //^0CEE:2027
 6453 :             bp15 = Bit8u(bp14);
 6454 :             //^0CEE:202D
 6455 :             if ((bp14 & 0x8000) != 0) {
 6456 :               //^0CEE:2034
 6457 :               bp12 = _0cee_1962(0x0a, bp15, _4976_4bec, 0);
 6458 :               //^0CEE:204D
 6459 :               ref->w10(((bp12 * 10) << 8) | bp15);
 6460 :               //^0CEE:2063
 6461 :             }
 6462 :             else {
 6463 :               //^0CEE:2066
 6464 :               ref->w10(bp15);
 6465 :             }
 6466 :           }
 6467 :           if (false) {
 6468 :             //^0CEE:2075
 6469 : _2075:
 6470 :             bp1c = 0;
 6471 :             bp12 = 0;
 6472 :             Bit32u bp20 = _4976_4bec;
 6473 :             Bit32u bp24 = 0;
 6474 :             //^0CEE:2096
 6475 :             GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(di);
 6476 :             Text *bp04 = _bp04->castToText();
 6477 :             //^0CEE:20A2
 6478 :             if (si != dbText)
 6479 :               //^0CEE:20A7
 6480 :               goto _212a;
 6481 : 
 6482 :             //^0CEE:20AA
 6483 :             if (bp04->TextMode() == 1) {
 6484 :               //^0CEE:20BE
 6485 :               bp15 = Bit8u(bp04->OrnateIndex());
 6486 :               //^0CEE:20CD
 6487 :               switch (bp04->SimpleTextExtUsage()) {
 6488 :                 case 0x11: // 0x11 - ?
 6489 :                   {
 6490 :                     //^0CEE:20EE
 6491 :                     bp12 = ((bp05 & 0x08) != 0) ? 1 : 0;
 6492 :                     //^0CEE:20FE
 6493 :                     goto _21f4;
 6494 :                   }
 6495 :                 case 0x02: // 0x02 - Animate image (e.g. Water basen)
 6496 :                   {
 6497 :                     //^0CEE:2101
 6498 :                     bp1c = 1;
 6499 :                     //^0CEE:2106
 6500 :                     goto _21f4;
 6501 :                   }
 6502 :                 case 0x05: // 0x05 - ?
 6503 :                   {
 6504 :                     //^0CEE:2109
 6505 :                     if (bp04->TextVisibility() != 0) {
 6506 :                       //^0CEE:211A
 6507 :                       bp1c = 1;
 6508 :                     }
 6509 :                     //^0CEE:211F
 6510 :                     goto _21f4;
 6511 :                   }
 6512 :                 case 0x0f: // 0x0f - ?
 6513 :                   {
 6514 :                     //^0CEE:2122
 6515 :                     bp12 = 1;
 6516 :                     //^0CEE:2127
 6517 :                     goto _21f4;
 6518 : 
 6519 :                     //^0CEE:212A
 6520 : _212a:
 6521 :                     if (si != dbActuator)
 6522 :                       //^0CEE:212F
 6523 :                       break;
 6524 :                     //^0CEE:2132
 6525 :                     Actuator *bp04 = _bp04->castToActuator();
 6526 :                     if (bp04->ActuatorType() == 0x30) { // 0x30 - Shop exhibition
 6527 :                       //^0CEE:2141
 6528 :                       ref->w12(0);
 6529 :                     }
 6530 :                     //^0CEE:214A
 6531 :                     bp15 = GET_FLOOR_DECORATION_OF_ACTUATOR(bp04);
 6532 :                     //^0CEE:215A
 6533 :                     if (bp15 == 0xff)
 6534 :                       //^0CEE:215E
 6535 :                       break;
 6536 :                     //^0CEE:2161
 6537 :                     switch (bp04->ActuatorType()) {
 6538 :                       case 0x32: // 0x32 - Activator, ornate animator
 6539 :                         //^0CEE:217C
 6540 :                         if (bp04->w4_0_0() == 0)
 6541 :                           //^0CEE:2188
 6542 :                           break;
 6543 :                         //^0CEE:218A
 6544 :                         bp20 = bp04->ActuatorData();
 6545 :                         //^0CEE:2197
 6546 :                         bp1e = 0;
 6547 :                         bp1c = 1;
 6548 :                         //^0CEE:21A1
 6549 :                         break;
 6550 : 
 6551 :                       case 0x27: // 0x27 - Cross scene
 6552 :                         //^0CEE:21A3
 6553 :                         if (bp04->ActuatorData() -1 != _4976_0c5a)
 6554 :                           //^0CEE:21B5
 6555 :                           goto _222f;
 6556 :                         //^0CEE:21B7
 6557 :                         if (bp04->w4_0_0() != 0) {
 6558 :                           //^0CEE:21C5
 6559 :                           bp1c = 1;
 6560 :                         }
 6561 :                         //^0CEE:21CA
 6562 :                         break;
 6563 : 
 6564 :                       case 0x2c: // 0x2c - Continuous ornate animator
 6565 :                         //^0CEE:21CC
 6566 :                         if (bp04->w4_0_0() != 0) {
 6567 :                           //^0CEE:21DA
 6568 :                           bp24 = bp04->ActuatorData() & 0xff;
 6569 :                           bp1c = 1;
 6570 :                         }
 6571 : 
 6572 :                         break;
 6573 :                     }
 6574 :                     //^0CEE:217A
 6575 :                     goto _21f4;
 6576 :                   }
 6577 :                 case 0x00: // 0x00 - Still image (e.g. An alcove)
 6578 :                 case 0x10: // 0x10 - ?
 6579 :                 case 0x0a: // 0x0a - Bush
 6580 :                   {
 6581 :                     //^0CEE:21F4
 6582 : _21f4:
 6583 :                     if (bp1c != 0) {
 6584 :                       //^0CEE:21FA
 6585 :                       bp12 = _0cee_1962(0x0a, bp15, bp20, bp24);
 6586 :                     }
 6587 :                     //^0CEE:2216
 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 :             //^0CEE:222F
 6609 : _222f:
 6610 :             di = GET_NEXT_RECORD_LINK(di);
 6611 :           }
 6612 :           //^0CEE:2237
 6613 : _2237:
 6614 :           if (di == di.FFFE)
 6615 :             //^0CEE:223C
 6616 :             break;
 6617 :           //^0CEE:223F
 6618 :           si = di.DBType();
 6619 :           //^0CEE:2249
 6620 :           if (si <= dbActuator)
 6621 :             //^0CEE:224E
 6622 :             goto _2075;
 6623 :           //^0CEE:2251
 6624 :           break;
 6625 :         }
 6626 :       case ttTeleporter:  // 5
 6627 :         {
 6628 :           //^0CEE:2254
 6629 :           if ((bp05 & 8) == 0 || (bp05 & 4) == 0) {
 6630 :             //^0CEE:226A
 6631 :             ref->w0(1);
 6632 :             ref->w[1] &= 0xfff7;
 6633 :           }
 6634 :           //^0CEE:2278
 6635 :           goto _2237;
 6636 :         }
 6637 :       case ttStairs:  // 3
 6638 :         {
 6639 :           //^0CEE:227A
 6640 :           ref->w0((((bp05 & 8) >> 3) == (si & 1)) ? 0x12 : 0x13);
 6641 :           //^0CEE:229E
 6642 :           ref->w6(bp05 & 4);
 6643 :           //^0CEE:22A9
 6644 :           goto _233a;
 6645 :         }
 6646 :       case ttDoor:  // 4
 6647 :         {
 6648 :           //^0CEE:22AC
 6649 :           ref->w6(bp05 & 7);
 6650 :           //^0CEE:22BA
 6651 :           ref->w8(GET_TILE_RECORD_LINK(xx, yy));
 6652 :           //^0CEE:22CD
 6653 :           if (((bp05 & 8) >> 3) == (si & 1)) {
 6654 :             //^0CEE:22E3
 6655 :             ref->w0(0x0010);
 6656 :           }
 6657 :           else {
 6658 :             //^0CEE:22EA
 6659 :             ref->w0(0x0011);
 6660 :             //^0CEE:22F2
 6661 :             si++;
 6662 :             si &= 3;
 6663 :             //^0CEE:22F7
 6664 :             bp18 = xx + _4976_0232[si];
 6665 :             //^0CEE:2305
 6666 :             bp1a = yy + _4976_023a[si];
 6667 :             //^0CEE:2313
 6668 :             _0cee_1a46(
 6669 :               ref,
 6670 :               GET_TILE_RECORD_LINK(bp18, bp1a),
 6671 :               si,
 6672 :               1
 6673 :               );
 6674 :           }
 6675 :           //^0CEE:2330
 6676 :           goto _233a;
 6677 : 
 6678 : _233a:
 6679 :           while (di != di.FFFE && di.DBType() <= dbActuator) {
 6680 :             //^0CEE:2332
 6681 :             di = GET_NEXT_RECORD_LINK(di);
 6682 :             //^0CEE:233A
 6683 :           }
 6684 : 
 6685 :           break;
 6686 :         }
 6687 :     }
 6688 :     //^0CEE:234C
 6689 :     ref->w4(di);
 6690 :     //^0CEE:2353
 6691 :     return;    
 6692 :   }
 6693 : 
 6694 :   //^29EE:0BCC
 6695 :   __int16 QUERY_4BPP_PICT_BUFF_AND_PAL(Bit8u cls1, Bit8u cls2, Bit8u **ppBuff, Bit8u *localpal)
 6696 :   {
 6697 :     //^29EE:0BCC
 6698 :     ENTER(0);
 6699 :     //^29EE:0BCF
 6700 :     if (QUERY_GDAT_ENTRY_IF_LOADABLE(cls1, cls2, dtImage, 0xf9) != 0) {
 6701 :       //^29EE:0BE8
 6702 :       *ppBuff = QUERY_GDAT_IMAGE_ENTRY_BUFF(cls1, cls2, 0xf9);
 6703 :       //^29EE:0C05
 6704 :       COPY_MEMORY(
 6705 :         QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, 0xf9),
 6706 :         localpal,
 6707 :         16
 6708 :         );
 6709 :       //^29EE:0C2C
 6710 :       return READ_I16(*ppBuff,-4) / _4976_0144;
 6711 :     }
 6712 :     //^29EE:0C3D
 6713 :     return 0;
 6714 :   }
 6715 : 
 6716 :   //^29EE:0C41
 6717 :   void DRAW_CHIP_OF_MAGIC_MAP(Bit8u *buff, Bit16u aa, Bit16u xx, Bit16u yy, Bit16u flipMirror, Bit8u *localpal)
 6718 :   {
 6719 :     // draws:
 6720 :     // a) parts of minion map's 7x7 atlas view.
 6721 : 
 6722 :     //^29EE:0C41
 6723 :     ENTER(12);
 6724 :     //^29EE:0C47
 6725 :     Bit16u di = flipMirror;
 6726 :     //^29EE:0C4A
 6727 :     if (buff != NULL) {
 6728 :       //^29EE:0C55
 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 :         //^29EE:0C8C
 6734 :         __int16 si = _4976_0144 - bp0c.cx;
 6735 :         //^29EE:0C94
 6736 :         if (si != 0 && (di & 0x0001) != 0) {
 6737 :           //^29EE:0C9E
 6738 :           bp02 = (bp02 != 0) ? 0 : si;
 6739 :         }
 6740 :         //^29EE:0CAE
 6741 :         si = _4976_0146 - bp0c.cy;
 6742 :         //^29EE:0CB6
 6743 :         if (si != 0 && (di & 0x0002) != 0) {
 6744 :           //^29EE:0CC0
 6745 :           bp04 = (bp04 != 0) ? 0 : si;
 6746 :         }
 6747 :         //^29EE:0CD0
 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 :     //^29EE:0CFD
 6761 :     return;
 6762 :   }
 6763 : 
 6764 :   //^4937:000F
 6765 :   __int16 _4937_000f(Bit16u xx, Bit16u *yy)
 6766 :   {
 6767 :     //^4937:000F
 6768 :     ENTER(0);
 6769 :     //^4937:0012
 6770 :     return _4976_5fde[_4937_005c(xx, yy)].w0 & 0x03ff;
 6771 :   }
 6772 : 
 6773 :   //^0CEE:2DF4
 6774 :   Bit16u _0cee_2df4(ObjectID recordLink)
 6775 :   {
 6776 :     //^0CEE:2DF4
 6777 :     ENTER(0);
 6778 :     //^0CEE:2DF7
 6779 :     return QUERY_CREATURE_AI_SPEC_FROM_RECORD(recordLink)->w30;
 6780 :   }
 6781 : 
 6782 :   //^48AE:011A
 6783 :   Bit16u _48ae_011a(ObjectID recordLink)
 6784 :   {
 6785 :     //^48AE:011A
 6786 :     ENTER(2);
 6787 :     //^48AE:011F
 6788 :     Bit8u bp01 = QUERY_CLS1_FROM_RECORD(recordLink);
 6789 :     //^48AE:012B
 6790 :     Bit8u bp02 = QUERY_CLS2_FROM_RECORD(recordLink);
 6791 :     //^48AE:0137
 6792 :     if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x08) != 0) {
 6793 :       //^48AE:014C
 6794 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x0c) == 0) {
 6795 :         //^48AE:0164
 6796 :         return 3;
 6797 :       }
 6798 :       //^48AE:0169
 6799 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x0a) != 0) {
 6800 :         //^48AE:0181
 6801 :         return 1;
 6802 :       }
 6803 :       //^48AE:0186
 6804 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(bp01, bp02, dtImage, 0x09) != 0) {
 6805 :         //^48AE:019E
 6806 :         return 0;
 6807 :       }
 6808 :       //^48AE:01A2
 6809 :       return 2;
 6810 :     }
 6811 :     //^48AE:01A7
 6812 :     return 0xffff;
 6813 :   }
 6814 : 
 6815 :   //^29EE:0D01
 6816 :   void _29ee_0d01(ObjectID recordLink, __int16 ss, __int16 tt, __int16 ww, Bit16u aa, Bit16u bb, Bit8u cc, Bit16u dd)
 6817 :   {
 6818 :     //^29EE:0D01
 6819 :     ENTER(108);
 6820 :     //^29EE:0D07
 6821 :     Bit16u di = bb;
 6822 :     //^29EE:0D0A
 6823 :     Bit8u *bp2e = NULL;
 6824 :     //^29EE:0D14
 6825 :     skxxx6 bp4c;
 6826 :     _0cee_1dbe(&bp4c, ww, ss, tt);
 6827 :     //^29EE:0D2A
 6828 :     Bit8u bp5c[16];
 6829 :     QUERY_4BPP_PICT_BUFF_AND_PAL(0x08, cc, &bp2e, bp5c);
 6830 :     //^29EE:0D41
 6831 :     if ((dd & 0x0010) != 0) {
 6832 :       //^29EE:0D48
 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 :       //^29EE:0D91
 6848 :       _0b36_0ffe(&_4976_3f6c, &bp3c, _4976_4bda[8]);
 6849 :     }
 6850 :     //^29EE:0DAD
 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 :     //^29EE:0DCD
 6860 : _0dcd:
 6861 :     switch (bp4c.w0()) {
 6862 :       case 0x00:
 6863 :       case 0x08:
 6864 :         //^29EE:0DDF
 6865 :         {
 6866 :           if ((dd & 0x0002) != 0 && bp14 != 0 && (Bit16u(_4976_4bec) & 2) != 0) {
 6867 :             //^29EE:0DF7
 6868 :             bp0a = 1;
 6869 :             //^29EE:0DFC
 6870 :             goto _10b7;
 6871 :           }
 6872 :           //^29EE:0DFF
 6873 :           if (bp20 == 0) {
 6874 :             //^29EE:0E05
 6875 :             DRAW_CHIP_OF_MAGIC_MAP(bp2e, 0, aa, di, 0, bp5c);
 6876 :           }
 6877 :           //^29EE:0E1F
 6878 :           for (bp0a = 0; bp0a <= 3; bp0a++) {
 6879 :             //^29EE:0E27
 6880 :             bp0c = bp4c.w[3 +bp0a] & 0xff;
 6881 :             //^29EE:0E3A
 6882 :             if (bp0c != 0xff) {
 6883 :               //^29EE:0E41
 6884 :               if ((dd & 0x0002) != 0 || QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp0c, dtWordValue, 0xf9) == 0) {
 6885 :                 //^29EE:0E5F
 6886 :                 bp0c = QUERY_4BPP_PICT_BUFF_AND_PAL(0x09, Bit8u(bp0c), &bp2a, bp6c);
 6887 :                 //^29EE:0E79
 6888 :                 if (bp0c != 0) {
 6889 :                   //^29EE:0E7D
 6890 :                   bp0e = bp4c.w[3 +bp0a] >> 10;
 6891 :                   //^29EE:0E90
 6892 :                   bp0c = (((bp0e +1) << 1) > bp0c) ? (bp0a & 1) : ((bp0e << 1) + (bp0a & 1));
 6893 :                   //^29EE:0EB1
 6894 :                   DRAW_CHIP_OF_MAGIC_MAP(bp2a, bp0c, aa, di, _4976_3fa0[bp0a], bp6c);
 6895 :                 }
 6896 :               }
 6897 :             }
 6898 :             //^29EE:0ED4
 6899 :           }
 6900 :           //^29EE:0EE0
 6901 :           break;
 6902 :         }
 6903 :       case 0x01:
 6904 :         {
 6905 :           //^29EE:0EE3
 6906 :           if ((bp4c.w2() & 0x0008) != 0) {
 6907 :             //^29EE:0EEA
 6908 :             QUERY_4BPP_PICT_BUFF_AND_PAL(0x08, _4976_4c5c[_4976_4d0a->Level()], &bp2e, bp5c);
 6909 :             //^29EE:0F12
 6910 :             //^29EE:18AA
 6911 :             DRAW_CHIP_OF_MAGIC_MAP(bp2e, 0, aa, di, 0, bp5c);
 6912 :             //^29EE:18B7
 6913 :             return;
 6914 :           }
 6915 : 
 6916 :           goto _0f22;
 6917 :         }
 6918 :       case 0x06:
 6919 :         {
 6920 :           //^29EE:0F22
 6921 : _0f22:
 6922 :           DRAW_CHIP_OF_MAGIC_MAP(bp2e, 2, aa, di, 0, bp5c);
 6923 :           //^29EE:0F3C
 6924 :           bp0a = bp4c.w10() & 0xff;
 6925 :           //^29EE:0F45
 6926 :           if (bp0a != 0xff) {
 6927 :             //^29EE:0F49
 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 :               //^29EE:0F85
 6933 :               bp0e = (bp4c.w10() >> 8) / 10;
 6934 :               //^29EE:0F94
 6935 :               bp0a = (bp0e +1 > bp0c) ? 0 : bp0e;
 6936 :               //^29EE:0FA7
 6937 :               DRAW_CHIP_OF_MAGIC_MAP(bp2a, bp0a, aa, di, 0, bp6c);
 6938 :             }
 6939 :           }
 6940 :           //^29EE:0FC2
 6941 :           if (bp4c.w0() == 5) {
 6942 :             //^29EE:0FCB
 6943 :             bp0a = QUERY_4BPP_PICT_BUFF_AND_PAL(0x18, 0x00, &bp2a, bp6c);
 6944 :             //^29EE:0FE3
 6945 :             if (bp0a != 0) {
 6946 :               //^29EE:0FEA
 6947 :               DRAW_CHIP_OF_MAGIC_MAP(bp2a, _4976_4bec / bp0a, aa, di, 0, bp6c);
 6948 :             }
 6949 :           }  
 6950 :           //^29EE:1016
 6951 :           break;
 6952 :         }
 6953 :       case 0x10:
 6954 :         {
 6955 :           //^29EE:1019
 6956 :           bp0a = 11;
 6957 :           //^29EE:101E
 6958 :           goto _1025;
 6959 :         }
 6960 :       case 0x11:
 6961 :         {
 6962 :           //^29EE:1020
 6963 :           bp0a = 10;
 6964 :           //^29EE:1025
 6965 : _1025:
 6966 :           Door *bp04 = GET_ADDRESS_OF_RECORD0(bp4c.w8());
 6967 :           //^29EE:1034
 6968 :           if (bp04->Button() == 0 && bp04->w2_d_d() == 0) {
 6969 :             //^29EE:1053
 6970 :             bp0a += 2;
 6971 :           }
 6972 :           //^29EE:1057
 6973 :           if (bp4c.w6() == 0 || bp4c.w6() == 5) {
 6974 :             //^29EE:1063
 6975 :             bp0a += 4;
 6976 :           }
 6977 :           //^29EE:1067
 6978 :           goto _10b7;
 6979 :         }
 6980 :       case 0x12:
 6981 :       case 0x13:
 6982 :         {
 6983 :           //^29EE:1069
 6984 :           bp0a = (_0cee_06dc(ss, tt) - ww) & 3;
 6985 :           //^29EE:107F
 6986 :           if (bp4c.w6() != 0) {
 6987 :             //^29EE:1085
 6988 :             bp0a += 2;
 6989 :             bp0a &= 3;
 6990 :           }
 6991 :           //^29EE:108E
 6992 :           bp0a += 6;
 6993 :           //^29EE:1092
 6994 :           goto _10b7;
 6995 :         }
 6996 :       case 0x02:
 6997 :         {
 6998 :           //^29EE:1094
 6999 :           bp0a = 3;
 7000 :           //^29EE:1099
 7001 :           if (bp4c.w6() != 0) {
 7002 :             //^29EE:109F
 7003 :             bp0a++;
 7004 :             //^29EE:10A2
 7005 :             if ((dd & 0x0002) != 0) {
 7006 :               //^29EE:10A9
 7007 :               if ((Bit16u(_4976_4bec) & 1) != 0) {
 7008 :                 //^29EE:10B4
 7009 :                 bp0a++;
 7010 :               }
 7011 :             }
 7012 :           }
 7013 :           //^29EE:10B7
 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 :     //^29EE:10D2
 7036 :     if ((dd & 0x0010) == 0) {
 7037 :       //^29EE:10DC
 7038 :       for (bp0a = 0; bp0a < _4976_4c3c; bp0a++) {
 7039 :         //^29EE:10E4
 7040 :         if (_4976_53b4[bp0a].curHP() != 0) {
 7041 :           //^29EE:10F8
 7042 :           Bit8u bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
 7043 :           Bit8u bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
 7044 :           //^29EE:1110
 7045 :           Bit8u *bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
 7046 :           //^29EE:1125
 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 :         //^29EE:117F
 7057 :       }
 7058 :     }
 7059 :     //^29EE:118E
 7060 :     if ((dd & 0x0040) != 0) {
 7061 :       //^29EE:1195
 7062 :       bp0a = (_4976_5326 != 2) ? ((_4976_5326 != 3) ? 0x02 : 0x0a) : (0x0b);
 7063 :       //^29EE:11B7
 7064 :       Bit8u bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
 7065 :       Bit8u bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
 7066 :       //^29EE:11CF
 7067 :       Bit8u *bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
 7068 :       //^29EE:11E4
 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 :     //^29EE:120E
 7079 :     if ((dd & 0x00a5) != 0) {
 7080 :       //^29EE:1218
 7081 :       ObjectID bp1c = ObjectID::FFFE;
 7082 :       ObjectID bp1a = ObjectID::FFFE;
 7083 :       ObjectID bp18 = ObjectID::FFFE;
 7084 :       //^29EE:1224
 7085 :       ObjectID si = bp4c.w4();
 7086 :       //^29EE:1227
 7087 :       for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 7088 :         //^29EE:122A
 7089 :         bp0a = si.DBType();
 7090 :         //^29EE:1235
 7091 :         if (bp0a == dbCreature) {
 7092 :           //^29EE:123A
 7093 :           Bit16u bp16 = _0cee_2de0(si);
 7094 :           //^29EE:1244
 7095 :           if (QUERY_GDAT_ENTRY_DATA_INDEX(0x0f, QUERY_CLS2_FROM_RECORD(si), dtWordValue, 0xf9) != 0) {
 7096 :             //^29EE:125F
 7097 :             bp18 = si;
 7098 :           }
 7099 :           else {
 7100 :             //^29EE:1265
 7101 :             if ((bp16 & 0x0001)  != 0) {
 7102 :               //^29EE:126C
 7103 :               if ((dd & 0x0080) != 0) {
 7104 :                 //^29EE:1276
 7105 :                 bp18 = si;
 7106 :               }
 7107 :             }
 7108 :             else {
 7109 :               //^29EE:127C
 7110 :               if ((dd & 0x0021) != 0) {
 7111 :                 //^29EE:1286
 7112 :                 bp18 = si;
 7113 :               }
 7114 :             }
 7115 :           }
 7116 :         }
 7117 :         else {
 7118 :           //^29EE:128C
 7119 :           if ((dd & 0x0004) != 0) {
 7120 :             //^29EE:1296
 7121 :             if (bp0e != 14) {
 7122 :               //^29EE:129C
 7123 :               if (bp1a == bp1a.FFFE) {
 7124 :                 //^29EE:12A5
 7125 :                 bp1a = si;
 7126 :               }
 7127 :             }
 7128 :             //^29EE:12AB
 7129 :             else if (bp0a == 15) {
 7130 :               //^29EE:12B1
 7131 :               if (bp1c == bp1c.FFFE) {
 7132 :                 //^29EE:12BA
 7133 :                 bp1c = si;
 7134 :               }
 7135 :             }
 7136 :             //^29EE:12C0
 7137 :             else if (bp0a >= 5 && bp0a <= 10) {
 7138 :               //^29EE:12D2
 7139 :               bp0a = QUERY_4BPP_PICT_BUFF_AND_PAL(QUERY_CLS1_FROM_RECORD(si), QUERY_CLS2_FROM_RECORD(si), &bp2a, bp6c);
 7140 :               //^29EE:12F6
 7141 :               if (bp0a != 0) {
 7142 :                 //^29EE:12FA
 7143 :                 bp0c = (si.Dir() - ww) & 3;
 7144 :                 //^29EE:1308
 7145 :                 if (bp4c.w0() == 0 && bp14 == 0) {
 7146 :                   //^29EE:1314
 7147 :                   if (bp0a <= 2)
 7148 :                     //^29EE:1318
 7149 :                     continue;
 7150 :                   //^29EE:131A
 7151 :                   bp0a = (bp0c & 1) +1;
 7152 :                   //^29EE:1324
 7153 :                   bp0c = _4976_3fa0[bp0c];
 7154 :                 }
 7155 :                 else {
 7156 :                   //^29EE:132D
 7157 :                   bp0a = 0;
 7158 :                   //^29EE:1332
 7159 :                   bp0c = _4976_3fa4[bp0c];
 7160 :                 }
 7161 :                 //^29EE:1339
 7162 :                 //^29EE:133E
 7163 :                 DRAW_CHIP_OF_MAGIC_MAP(bp2a, bp0a, aa, di, bp0c, bp6c);
 7164 :               }
 7165 :             }
 7166 :           }
 7167 :         }
 7168 :         //^29EE:135A
 7169 :       }
 7170 :       //^29EE:136B
 7171 :       if (bp18 != bp18.FFFE) {
 7172 :         //^29EE:1374
 7173 :         Creature *bp04 = GET_ADDRESS_OF_RECORD4(bp18);
 7174 :         //^29EE:1383
 7175 :         Bit16u bp16 = _0cee_2de0(bp18);
 7176 :         //^29EE:138F
 7177 :         Bit8u bp21;
 7178 :         Bit8u bp22;
 7179 :         Bit8u *bp32;
 7180 :         if ((dd & 0x0020) != 0) {
 7181 :           //^29EE:1396
 7182 :           bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
 7183 :           //^29EE:13A2
 7184 :           bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
 7185 :           //^29EE:13AE
 7186 :           bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
 7187 :           //^29EE:13C3
 7188 :           //^29EE:13E6
 7189 :           //^29EE:1546
 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 :         //^29EE:13E9
 7202 :         bp0c = QUERY_4BPP_PICT_BUFF_AND_PAL(QUERY_CLS1_FROM_RECORD(bp18), QUERY_CLS2_FROM_RECORD(bp18), &bp2a, bp6c);
 7203 :         //^29EE:1411
 7204 :         if (bp0c != 0) {
 7205 :           //^29EE:1418
 7206 :           if ((bp16 & 0x0001) != 0) {
 7207 :             //^29EE:141F
 7208 :             sk1c9a02c3 *bp08 = _1c9a_02c3(bp04, QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType()));
 7209 :             //^29EE:1443
 7210 :             bp0a = _4937_000f(bp08->w0, &bp08->w2);
 7211 :             //^29EE:145D
 7212 :             bp0a = (bp0a >= 4 && bp0a <= 7) ? 4 : 0;
 7213 :             //^29EE:1474
 7214 :             if (((bp0a +1) << 1) > bp0c) {
 7215 :               //^29EE:147F
 7216 :               bp0a = 0;
 7217 :             }
 7218 :             else {
 7219 :               //^29EE:1486
 7220 :               bp0a = bp0a << 1;
 7221 :             }
 7222 :           }
 7223 :           else {
 7224 :             //^29EE:1490
 7225 :             bp0a = __int16(_4976_4bec / (bp0c / 2)) << 1;
 7226 :           }
 7227 :           //^29EE:14AE
 7228 :           bp0c = (ww - bp04->b15_0_2()) & 3;
 7229 :           //^29EE:14C4
 7230 :           //^29EE:14E9
 7231 :           //^29EE:154D
 7232 :           DRAW_CHIP_OF_MAGIC_MAP(bp2a, (bp0c & 1) + bp0a, aa, di, _4976_3fa0[bp0c], bp6c);
 7233 :         }
 7234 :         //^29EE:14EB
 7235 :         else if ((bp16 & 0x0001) == 0 && (bp16 & 0x2000) == 0) {
 7236 :           //^29EE:14F9
 7237 :           bp21 = QUERY_CLS1_FROM_RECORD(recordLink);
 7238 :           //^29EE:1505
 7239 :           bp22 = QUERY_CLS2_FROM_RECORD(recordLink);
 7240 :           //^29EE:1511
 7241 :           bp32 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp21, bp22, 0x40);
 7242 :           //^29EE:1526
 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 :         //^29EE:1554
 7253 : _1554:
 7254 :         if ((bp16 & 0x0001) != 0 && (dd & 0x0004) != 0) {
 7255 :           //^29EE:1568
 7256 :           if ((_0cee_2df4(bp18) & 0x000f) != 0) {
 7257 :             //^29EE:1576
 7258 :             for (si = bp04->w0; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 7259 :               //^29EE:157E
 7260 :               bp0a = si.DBType();
 7261 :               //^29EE:1589
 7262 :               if (bp0a >= dbWeapon && bp0a <= dbMiscellaneous_item) {
 7263 :                 //^29EE:1594
 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 :                   //^29EE:15B9
 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 :               //^29EE:15E4
 7281 :             }
 7282 :           }
 7283 :         }
 7284 :       }
 7285 :       //^29EE:15F2
 7286 :       for (si = bp1a; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 7287 :         //^29EE:15F8
 7288 :         if (si.DBType() == dbMissile) {
 7289 :           //^29EE:1608
 7290 :           bp0a = QUERY_4BPP_PICT_BUFF_AND_PAL(
 7291 :                 QUERY_CLS1_FROM_RECORD(si), 
 7292 :                 QUERY_CLS2_FROM_RECORD(si), 
 7293 :                 &bp2a, bp6c);
 7294 :           //^29EE:162C
 7295 :           if (bp0a != 0) {
 7296 :             //^29EE:1633
 7297 :             if (bp0a > 3) {
 7298 :               //^29EE:163B
 7299 :               bp0c = _4976_5c20[GET_ADDRESS_OF_RECORDE(si)->TimerIndex()].b9_2_3();
 7300 :               //^29EE:1662
 7301 :               bp0c = (bp0c - ww) & 3;
 7302 :               //^29EE:166B
 7303 :               bp0a = 3;
 7304 :               //^29EE:1670
 7305 :               switch (_48ae_011a(si) +1) {
 7306 :                 case 0:
 7307 :                   //^29EE:1686
 7308 :                   //^29EE:16B0
 7309 :                   bp0a = 0;
 7310 :                   break;
 7311 :                 case 1:
 7312 :                   //^29EE:16AE
 7313 :                   //^29EE:16B0
 7314 :                   bp0a = 0;
 7315 :                   break;
 7316 :                 case 2:
 7317 :                   //^29EE:1688
 7318 :                   bp0a += bp0c;
 7319 :                   //^29EE:168E
 7320 :                   bp0a += _4976_3fa8[((bp0a -3) << 2) + ((si.Dir() - ww) & 3)];
 7321 :                   //^29EE:16AC
 7322 :                   break;
 7323 :                 case 3:
 7324 :                   //^29EE:16B0
 7325 :                   bp0a = 0;
 7326 :                   break;
 7327 :               }
 7328 :             }
 7329 :             else {
 7330 :               //^29EE:16B0
 7331 :               bp0a = 0;
 7332 :             }
 7333 :             //^29EE:16B5
 7334 :           }
 7335 :         }
 7336 :         //^29EE:16E1
 7337 :       }
 7338 :       //^29EE:16F2
 7339 :       for (si = bp1c; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 7340 :         //^29EE:16F7
 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 :           //^29EE:1729
 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 :         //^29EE:174D
 7359 :       }
 7360 :       //^29EE:175B
 7361 :       Bit16u bp1e;
 7362 :       __int16 bp10;
 7363 :       __int16 bp12;
 7364 :       if (bp4c.w0() == 0 && bp20 == 0) {
 7365 :         //^29EE:176D
 7366 :         bp10 = ss;
 7367 :         bp12 = tt;
 7368 :         Bit8u *bp26 = NULL;
 7369 :         //^29EE:1783
 7370 :         bp0a = _4976_0c5a;
 7371 :         //^29EE:1786
 7372 :         while (bp0a == _4976_0c5a && bp0a != -1) {
 7373 :           //^29EE:1788
 7374 :           bp0a = _0cee_0510(_4976_0c5a, 0, &ss, &tt, &bp26);
 7375 :           //^29EE:17A5
 7376 :         }
 7377 :         //^29EE:17B7
 7378 :         if (bp0a >= 0 && bp0a != _4976_0c5a) {
 7379 :           //^29EE:17C6
 7380 :           if ((_4976_4ca8[bp0a][ss][tt] >> 5) == 0) {
 7381 :             //^29EE:17EC
 7382 :             bp20 = 1;
 7383 :             bp1e = _4976_0c5a;
 7384 :             //^29EE:17F7
 7385 :             CHANGE_CURRENT_MAP_TO(bp0a);
 7386 :             //^29EE:1800
 7387 :             _0cee_1dbe(&bp4c, ww, ss, tt);
 7388 :             //^29EE:1816
 7389 :             goto _0dcd;
 7390 :           }
 7391 :         }
 7392 :       }
 7393 :       //^29EE:1819
 7394 :       if (bp20 != 0) {
 7395 :         //^29EE:181F
 7396 :         ss = bp10;
 7397 :         tt = bp12;
 7398 :         //^29EE:182B
 7399 :         CHANGE_CURRENT_MAP_TO(bp1e);
 7400 :         //^29EE:1834
 7401 :         _0cee_1dbe(&bp4c, ww, ss, tt);
 7402 :       }
 7403 :       //^29EE:184A
 7404 :       bp0a = _0cee_0510(_4976_0c5a, -1, &ss, &tt, NULL);
 7405 :       //^29EE:1869
 7406 :       if (bp0a >= 0) {
 7407 :         //^29EE:186D
 7408 :         bp0a = _4976_4ca8[bp0a][ss][tt];
 7409 :         //^29EE:188F
 7410 :         if ((bp0a >> 5) == ttPit && (bp0a & 8) != 0) {
 7411 :           //^29EE:189D
 7412 :           DRAW_CHIP_OF_MAGIC_MAP(bp2e, 18, aa, di, 0, bp5c);
 7413 :         }
 7414 :       }
 7415 :     }
 7416 :     //^29EE:18B7
 7417 :     return;
 7418 :   }
 7419 : 
 7420 :   //^29EE:1946
 7421 :   void _29ee_1946(ObjectID recordLink, __int16 xx, __int16 yy, __int16 zz, __int16 ww, __int16 ss, __int16 tt, Bit16u uu)
 7422 :   {
 7423 :     //^29EE:1946
 7424 :         ENTER(56);
 7425 :     //^29EE:194C
 7426 :     Bit16u si = uu;
 7427 :     //^29EE:194F
 7428 :     if ((si & 0x0008) != 0) {
 7429 :       //^29EE:1955
 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 :       //^29EE:197F
 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 :     //^29EE:19A3
 7447 :     _4976_5326 = 0;
 7448 :     //^29EE:19A9
 7449 :     Bit16u bp18 = _4976_0c5a;
 7450 :     //^29EE:19AF
 7451 :     _29ee_00a3(0);
 7452 :     //^29EE:19B6
 7453 :     _0b36_0ffe(&_4976_3f6c, QUERY_EXPANDED_RECT(99, &_4976_53a6), _4976_4bda[0]);
 7454 :     //^29EE:19DC
 7455 :     INFLATE_RECT(&_4976_53a6, - _4976_0148, - _4976_014a);
 7456 :     //^29EE:19F4
 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 :     //^29EE:1A1E
 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 :       //^29EE:1A2D
 7471 :       Container *bp04 = GET_ADDRESS_OF_RECORD9(recordLink);
 7472 :       //^29EE:1A3C
 7473 :       if (bp1a != 0) {
 7474 :         //^29EE:1A42
 7475 :         Missile *bp08 = GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), recordLink);
 7476 :         //^29EE:1A59
 7477 :         bp1c = bp08->GetX();
 7478 :         bp1e = bp08->GetY();
 7479 :         bp20 = bp08->GetMap();
 7480 :         //^29EE:1A80
 7481 :         CHANGE_CURRENT_MAP_TO(bp20);
 7482 :         //^29EE:1A87
 7483 :         TELE_inf bp3a;
 7484 :         if (GET_TELEPORTER_DETAIL(&bp3a, (Bit8u)bp1c, (Bit8u)bp1e) != 0) {
 7485 :           //^29EE:1A9E
 7486 :           bp22 = bp3a.target_x_pos();
 7487 :           bp24 = bp3a.target_x_pos();
 7488 :           bp26 = bp3a.target_z();
 7489 :         }
 7490 :         else {
 7491 :           //^29EE:1AB8
 7492 :           bp26 = 0xffff;
 7493 :         }
 7494 :       }
 7495 :       //^29EE:1ABD
 7496 :       if (bp28 != 0) {
 7497 :         //^29EE:1AC3
 7498 :         _29ee_18eb(bp04->GetDestX(), bp04->GetDestY(), bp04->GetDestMap());
 7499 :       }
 7500 :     }
 7501 :     //^29EE:1AEB
 7502 :     CHANGE_CURRENT_MAP_TO(zz);
 7503 :     //^29EE:1AF4
 7504 :     __int16 bp10 = 3;
 7505 :     __int16 bp12 = -3;
 7506 :     //^29EE:1AFE
 7507 :     if (tt < 0) {
 7508 :       //^29EE:1B04
 7509 :       bp10++;
 7510 :     }
 7511 :     //^29EE:1B07
 7512 :     __int16 bp14 = -3;
 7513 :     __int16 bp16 = 3;
 7514 :     //^29EE:1B11
 7515 :     if (ss < 0) {
 7516 :       //^29EE:1B11
 7517 :       bp14--;
 7518 :     }
 7519 :     //^29EE:1B1A
 7520 :     for (__int16 bp0c = bp10; bp0c >= bp12; bp0c--) {
 7521 :       //^29EE:1B23
 7522 :       Bit16u bp0a = bp2e;
 7523 :       //^29EE:1B29
 7524 :       for (__int16 bp0e = bp14; bp0e <= bp16; bp0e++) {
 7525 :         //^29EE:1B32
 7526 :         __int16 bp32 = xx;
 7527 :         __int16 bp34 = yy;
 7528 :         //^29EE:1B3E
 7529 :         _0cee_02dd(ww, bp0c, bp0e, &bp32, &bp34);
 7530 :         //^29EE:1B59
 7531 :         __int16 di = _0cee_0510(zz, 0, &bp32, &bp34, NULL);
 7532 :         //^29EE:1B76
 7533 :         Bit8u bp2b;
 7534 :         if (di < 0) {
 7535 :           //^29EE:1B7A
 7536 :           di = zz;
 7537 :           //^29EE:1B7F
 7538 :           CHANGE_CURRENT_MAP_TO(di);
 7539 :           //^29EE:1B86
 7540 :           if ((GET_TILE_VALUE(bp32, bp34) >> 5) == ttMapExit) {
 7541 :             //^29EE:1B9C
 7542 :             bp2b = _4976_4c5c[_4976_4d0a->Level()];
 7543 :             //^29EE:1BB0
 7544 :             goto _1bc7;
 7545 :           }
 7546 :         }
 7547 :         else {
 7548 :           //^29EE:1BB2
 7549 :           CHANGE_CURRENT_MAP_TO(di);
 7550 :         }
 7551 :         //^29EE:1BB9
 7552 :         bp2b = _4976_4d0a->MapGraphicsStyle();
 7553 :         //^29EE:1BC7
 7554 : _1bc7:
 7555 :         si &= 0xff8f;
 7556 :         //^29EE:1BCE
 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 :           //^29EE:1BFE
 7565 :           si |= 0x0020;
 7566 :         }
 7567 :         //^29EE:1C02
 7568 :         if (bp28 != 0 && _4976_5326 == 0) {
 7569 :           //^29EE:1C0F
 7570 :           if (bp32 == _4976_536a && bp34 == _4976_536c && di == _4976_5318) {
 7571 :             //^29EE:1C27
 7572 :             _4976_5326 = 1;
 7573 :             //^29EE:1C2D
 7574 :           }
 7575 :           //^29EE:1C2F
 7576 :           else if (bp32 == _4976_5328 && bp34 == _4976_532a && di == _4976_533c) {
 7577 :             //^29EE:1C47
 7578 :             _4976_5326 = 2;
 7579 :             //^29EE:1C4D
 7580 :             goto _1c6d;
 7581 :           }
 7582 :           //^29EE:1C4F
 7583 :           else if (bp32 == _4976_5320 && bp34 == _4976_5322 && di == _4976_533e) {
 7584 :             //^29EE:1C67
 7585 :             _4976_5326 = 3;
 7586 :             //^29EE:1C6D
 7587 : _1c6d:
 7588 :             _29ee_18eb(bp32, bp34, di);
 7589 :           }
 7590 :           //^29EE:1C7B
 7591 :           if (_4976_5326 != 0) {
 7592 :             //^29EE:1C82
 7593 :             si |= 0x0040;
 7594 :           }
 7595 :         }
 7596 :         //^29EE:1C86
 7597 :         if (bp2a != 0 && di == _4976_4c28 && bp32 == _4976_4c2e && bp34 == _4976_4c30) {
 7598 :           //^29EE:1CA4
 7599 :           si = 0x0010;
 7600 :         }
 7601 :         //^29EE:1CA8
 7602 :         _29ee_0d01(recordLink, bp32, bp34, ww, bp0a, bp30, bp2b, si);
 7603 :         //^29EE:1CC6
 7604 :         bp0a += _4976_0144 + _4976_0148;
 7605 :         //^29EE:1CD0
 7606 :       }
 7607 :       //^29EE:1CDE
 7608 :       bp30 += _4976_0146 + _4976_014a;
 7609 :       //^29EE:1CE8
 7610 :     }
 7611 :     //^29EE:1CF6
 7612 :     CHANGE_CURRENT_MAP_TO(bp18);
 7613 :     //^29EE:1CFF
 7614 :     return;
 7615 :   }
 7616 : 
 7617 :   //^29EE:1DA5
 7618 :   void _29ee_1da5(ObjectID recordLink)
 7619 :   {
 7620 :     //^29EE:1DA5
 7621 :     ENTER(30);
 7622 :     //^29EE:1DAB
 7623 :     _4976_53ae = QUERY_CLS2_FROM_RECORD(recordLink);
 7624 :     _4976_5356 |= 0x0090;
 7625 :     //^29EE:1DBD
 7626 :     Container *bp04 = GET_ADDRESS_OF_RECORD9(recordLink);
 7627 :     //^29EE:1DCC
 7628 :     Bit16u bp0e = bp04->b5_5_7();
 7629 :     //^29EE:1DDC
 7630 :     Missile *bp08;
 7631 :     if (bp0e != 3) {
 7632 :       //^29EE:1DE1
 7633 :       _4976_5356 |= 0x0800;
 7634 :       //^29EE:1DE7
 7635 :       bp0e = bp04->b5_5_7();
 7636 :       //^29EE:1DF4
 7637 :       if (bp0e != 0) {
 7638 :         //^29EE:1DF8
 7639 :         bp08 = GET_MISSILE_REF_OF_MINION(bp04->GetContainedObject(), recordLink);
 7640 :         //^29EE:1E0C
 7641 :         if (bp08 != NULL) {
 7642 :           //^29EE:1E10
 7643 :           _4976_5356 |= 0x0020;
 7644 :         }
 7645 :         //^29EE:1E18
 7646 :         else if ((_4976_5356 & 0x0020) != 0) {
 7647 :           //^29EE:1E20
 7648 :           _4976_5356 &= 0xfbdf;
 7649 :         }
 7650 :       }
 7651 :     }
 7652 :     //^29EE:1E26
 7653 :     if ((_4976_5356 & 0x0400) == 0) {
 7654 :       //^29EE:1E2E
 7655 :       DRAW_ICON_PICT_ENTRY(0x14, _4976_53ae, 0x10, &_4976_3f6c, 92, -1);
 7656 :       //^29EE:1E46
 7657 :       for (Bit16u si = 0; si < _4976_53a4; si++) {
 7658 :         //^29EE:1E4A
 7659 :         _29ee_0a7b(si, 0);
 7660 :         //^29EE:1E53
 7661 :       }
 7662 :       //^29EE:1E5A
 7663 :       _29ee_1d03(0);
 7664 :       //^29EE:1E61
 7665 :       _4976_5356 |= 0x0400;
 7666 :     }
 7667 :     //^29EE:1E67
 7668 :     Bit16u bp10 = _4976_4bfa;
 7669 :     Bit16u di = _4976_4c06;
 7670 :     Bit16u bp12 = _4976_4bf4;
 7671 :     //^29EE:1E77
 7672 :     __int16 bp16 = 0;
 7673 :     __int16 bp14 = 0;
 7674 :     //^29EE:1E7F
 7675 :     if (bp0e != 0 && bp0e != 3) {
 7676 :       //^29EE:1E91
 7677 :       if (bp04->b7_2_7() != 0x3f) {
 7678 :         //^29EE:1EA3
 7679 :         _4976_5356 |= 0x0040;
 7680 :       }
 7681 :       //^29EE:1EA9
 7682 :       if (bp0e == 1) {
 7683 :         //^29EE:1EB2
 7684 :         if (bp08 == NULL) {
 7685 :           //^29EE:1EBA
 7686 :           _4976_5356 &= 0xffbf;
 7687 :         }
 7688 :         else {
 7689 :           //^29EE:1EC3
 7690 :           bp10 = bp08->GetX();
 7691 :           di = bp08->GetY();
 7692 :           bp12 = bp08->GetMap();
 7693 :           //^29EE:1EE9
 7694 :           Creature *bp0c = GET_ADDRESS_OF_RECORD4(bp04->GetContainedObject());
 7695 :           //^29EE:1EFC
 7696 :             __int16 si = _32cb_0054(bp0c, (_4976_4bf6 + _4976_3fc2[bp0c->b15_0_2()]) & 3);
 7697 :           //^29EE:1F28
 7698 :           bp14 = si % 5;
 7699 :           //^29EE:1F31
 7700 :           bp16 = si / 5;
 7701 :           //^29EE:1F39
 7702 :           if (bp14 > 2) {
 7703 :             //^29EE:1F3F
 7704 :             si = (_4976_4bf6 +1) & 3;
 7705 :             //^29EE:1F48
 7706 :             bp10 += _4976_0232[si];
 7707 :             //^29EE:1F53
 7708 :             di += _4976_023a[si];
 7709 :           }
 7710 :           //^29EE:1F5B
 7711 :           if (bp16 > 2) {
 7712 :             //^29EE:1F61
 7713 :             si = (_4976_4bf6 +2) & 3;
 7714 :             //^29EE:1F6B
 7715 :             bp10 += _4976_0232[si];
 7716 :             //^29EE:1F76
 7717 :             di += _4976_023a[si];
 7718 :           }
 7719 :           //^29EE:1F7E
 7720 :           bp14 = _4976_3fb8[bp14] * (((_4976_0148 << 1) + _4976_0144 +1) / 5);
 7721 :           //^29EE:1FA2
 7722 :           bp16 = _4976_3fb8[bp16] * (((_4976_014a << 1) + _4976_0146 +1) / 5);
 7723 :         }
 7724 :       }
 7725 :       //^29EE:1FC8
 7726 :       else if ((_4976_5356 & 0x0040) != 0) {
 7727 :         //^29EE:1FD0
 7728 :         bp10 = bp04->GetDestX();
 7729 :         //^29EE:1FDD
 7730 :         di = bp04->GetDestY();
 7731 :         //^29EE:1FE9
 7732 :         bp12 = bp04->GetDestMap();
 7733 :       }
 7734 :     }
 7735 :     //^29EE:1FF6
 7736 :     _29ee_1946(recordLink, bp10, di, bp12, _4976_4bf6, bp14, bp16, _4976_5356);
 7737 :     //^29EE:2015
 7738 :     if ((_4976_5356 & 0x0100) != 0 || (_4976_5356 & 0x0200) == 0) {
 7739 :       //^29EE:2025
 7740 :       SRECT bp1e;
 7741 :       _0b36_105b(&_4976_3f6c, QUERY_EXPANDED_RECT(99, &bp1e), 0);
 7742 :     }
 7743 :     //^29EE:2044
 7744 :     return;
 7745 :   }
 7746 : 
 7747 :   //^29EE:078B
 7748 :   void _29ee_078b()
 7749 :   {
 7750 :     //^29EE:078B
 7751 :     ENTER(346);
 7752 :     //^29EE:0791
 7753 :     _29ee_00a3(0);
 7754 :     //^29EE:0798
 7755 :     DRAW_ICON_PICT_ENTRY(0x08, _4976_3df6, 0xf6, &_4976_3f6c, 93, -1);
 7756 :     //^29EE:07B1
 7757 :     Bit8u *bp04 = ALLOC_PICT_BUFF(_4976_0118, _4976_011a, afDefault, 4);
 7758 :     //^29EE:07CD
 7759 :     i16 bp06 = 0;
 7760 :     i16 bp08 = 0;
 7761 :     //^29EE:07D3
 7762 :     SRECT bp10;
 7763 :     if (QUERY_BLIT_RECT(bp04, &bp10, 94, &bp06, &bp08, -1) != 0) {
 7764 :       //^29EE:07FB
 7765 :       if (_4976_57e8 != 0) {
 7766 :         //^29EE:0802
 7767 :         Bit16u si = RAND02();
 7768 :         //^29EE:0809
 7769 :         if (si != 0) {
 7770 :           //^29EE:080D
 7771 :           bp10.y -= 2;
 7772 :           //^29EE:0813
 7773 :           si = RAND02();
 7774 :           //^29EE:081A
 7775 :           if (si != 0) {
 7776 :             //^29EE:081E
 7777 :             bp10.x -= 2;
 7778 :           }
 7779 :         }
 7780 :       }
 7781 :       //^29EE:0824
 7782 :       Bit8u bp015a[16];
 7783 :       Bit16u di;
 7784 :       QUERY_GDAT_SQUAD_ICON(bp04, Bit8u(di = _4976_5366 -1), bp015a);
 7785 :       //^29EE:083F
 7786 :       DRAW_ICON_PICT_BUFF(bp04, &_4976_3f6c, &bp10, bp06, bp08, 12, 0, bp015a);
 7787 :       //^29EE:0866
 7788 :       if (_4976_53b4[di].w257 != 0) {
 7789 :         //^29EE:0879
 7790 :         skxxx4 bp014a;
 7791 :         _0b36_06d3(_0b36_0520(&bp014a, 0x01, 0x07, _4976_53b4[di].b256));
 7792 :         //^29EE:08A2
 7793 :         bp014a.w4 |= 0x0010;
 7794 :         bp014a.w18 >>= 2;
 7795 :         //^29EE:08AD
 7796 :         bp014a.w14 = bp014a.w18 * ((_4976_53b4[di].playerDir() +4 - _4976_4bf6) & 3);
 7797 :         //^29EE:08D4
 7798 :         bp014a.w20 >>= 2;
 7799 :         //^29EE:08D9
 7800 :         bp014a.w16 = bp014a.w20 * (Bit16u(_4976_4bec) & 3);
 7801 :         //^29EE:08EB
 7802 :         _0b36_11c0(&bp014a, &_4976_3f6c, 94, 12);
 7803 :       }
 7804 :     }
 7805 :     //^29EE:0901
 7806 :     FREE_PICT_BUFF(bp04);
 7807 :     //^29EE:090E
 7808 :     DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x10, &_4976_3f6c, 96, -1);
 7809 :     //^29EE:0924
 7810 :     DRAW_ICON_PICT_ENTRY(0x01, 0x04, 0x12, &_4976_3f6c, 97, -1);
 7811 :     //^29EE:093A
 7812 :     return;
 7813 :   }
 7814 : 
 7815 :   //^3E74:58A3
 7816 :   void _3e74_58a3(Bit16u xx)
 7817 :   {
 7818 :     //^3E74:58A3
 7819 :     ENTER(0);
 7820 :     //^3E74:58A6
 7821 :     _3e74_585a(xx, 0);
 7822 :     //^3E74:58B1
 7823 :     _3e74_28de(xx |0x8000);
 7824 :     //^3E74:58BD
 7825 :     return;
 7826 :   }
 7827 : 
 7828 :   //^0B36:0CBE
 7829 :   void _0b36_0cbe(sk3f6c *ref, Bit16u yy)
 7830 :   {
 7831 :     //^0B36:0CBE
 7832 :     ENTER(4);
 7833 :     //^0B36:0CC3
 7834 :     if (ref->w10 != 0) {
 7835 :       //^  0B36:0CCD
 7836 :       SRECT *bp04 = ref->w12;
 7837 :       //^0B36:0CDC
 7838 :       _443c_085a();
 7839 : 
 7840 :       do {
 7841 :         //^0B36:0CE1
 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 :         //^0B36:0D38
 7857 :         bp04++;
 7858 :         //^0B36:0D3C
 7859 :       } while (--ref->w10 != 0);
 7860 :       //^0B36:0D45
 7861 :       _443c_086b();
 7862 :     }
 7863 :     //^0B36:0D4A
 7864 :     if (yy != 0) {
 7865 :       //^0B36:0D50
 7866 :       _3e74_58a3(ref->w0);
 7867 :       //^0B36:0D5C
 7868 :       ref->w0 = 0xffff;
 7869 :     }
 7870 :     //^0B36:0D64
 7871 :     return;
 7872 :   }
 7873 : 
 7874 :   //^0CEE:2EFB
 7875 :   Bit16u IS_CONTAINER_MAP(ObjectID recordLink)
 7876 :   {
 7877 :     //^0CEE:2EFB
 7878 :     if (recordLink.DBType() == dbContainer) {
 7879 :       if (GET_ADDRESS_OF_RECORD9(recordLink)->ContainerType() == 1) {
 7880 :         return 1;
 7881 :       }
 7882 :     }
 7883 :     //^0CEE:2F2B
 7884 :     return 0;
 7885 :   }
 7886 : 
 7887 :   //^2759:0644
 7888 :   void _2759_0644(Bit16u xx)
 7889 :   {
 7890 :     //^2759:0644
 7891 :     //^2759:064A
 7892 :     Bit16u bp0a = 0;
 7893 :     Bit16u bp0c = 0;
 7894 :     Bit16u bp0e = 0;
 7895 :     Bit16u bp12 = 0;
 7896 :     //^2759:065E
 7897 :     if (_4976_4bfc == 0) {
 7898 :       //^2759:0668
 7899 :       if (_4976_4c3c != 0) {
 7900 :         //^2759:066F
 7901 :         if (_4976_531c != 0 || _4976_5352 != 0) {
 7902 :           //^2759:067D
 7903 :           _4976_5352 = 0;
 7904 :           _4976_531c = 0;
 7905 :           //^2759:0685
 7906 :           _29ee_00a3(1);
 7907 :         }
 7908 :         //^2759:068D
 7909 :         _4976_3ddc = 0xffff;
 7910 :         goto _0e03;
 7911 :       }
 7912 :       //^2759:0696
 7913 :       if (xx != 0) {
 7914 :         //^2759:069F
 7915 :         for (Bit16u bp06=0; bp06 < _4976_4c3c; bp06++) {
 7916 :           //^2759:06A6
 7917 :           for (Bit16u si=0; si <= 2; si++) {
 7918 :             //^2759:06AA
 7919 :             if (_4976_53b4[bp06].b42[si] != 0) {
 7920 :               //^2759:06BB
 7921 :               _4976_53b4[bp06].b42[si] = _4976_53b4[bp06].b42[si] -1;
 7922 :               //^2759:06DB
 7923 :               if (_4976_53b4[bp06].b42[si] == 0) {
 7924 :                 //^2759:06DF
 7925 :                 _2759_0fb0(bp06, si);
 7926 :               }
 7927 :             }
 7928 :             //^2759:06EA
 7929 :           }
 7930 :           //^2759:06F0
 7931 :         }
 7932 :         //^2759:06FC
 7933 :         if (_4976_3ddc == 3) {
 7934 :           //^2759:0703
 7935 :           ATLASSERT(_4976_5366 == 0);
 7936 :           sk53b4 *bp04 = &_4976_52af[_4976_5366];
 7937 :           //^2759:0714
 7938 :           if ((_4976_5356 & 0x0200) != 0) {
 7939 :             //^2759:071C
 7940 :             if (--_4976_5316 == 0) {
 7941 :               //^2759:0722
 7942 :               if (bp04->w62 != 0) {
 7943 :                 //^2759:072C
 7944 :                 bp04->w62--;
 7945 :                 //^2759:0730
 7946 :                 bp04->w50 |= 0x0800;
 7947 :                 //^2759:0736
 7948 :                 _4976_5316 = 25 / _4976_531a;
 7949 :               }
 7950 :               else {
 7951 :                 //^2759:0743
 7952 :                 _4976_5352 = 1;
 7953 :                 _4976_5356 = 0;
 7954 :               }
 7955 :             }
 7956 :           }
 7957 :           //^2759:0751
 7958 :           else if (bp04->w62 != 0) {
 7959 :             //^2759:075B
 7960 :             _4976_5352 = 1;
 7961 :             _4976_5356 = 0;
 7962 :           }
 7963 :         }
 7964 :       }
 7965 :       //^2759:0767
 7966 :       if (_4976_5340 != 0) {
 7967 :         //^2759:076E
 7968 :         _29ee_00e0(_4976_5340);
 7969 :         //^2759:0778
 7970 :         _4976_531c = 1;
 7971 :         _4976_5340 = 0;
 7972 :         _4976_3ddc = 6;
 7973 :         goto _0e03;
 7974 :       }
 7975 :       //^2759:078D
 7976 :       if (_4976_5366 > 0) {
 7977 :         //^2759:0794
 7978 :         __int16 bp06 = _4976_5366 -1;
 7979 :         //^2759:079B
 7980 :         if (bp06 >= 0 && _4976_5354 != 2) {
 7981 :           //^2759:07A9
 7982 :           if (_4976_3de6[bp06][_4976_5354] != _4976_53b4[bp06].Possess(_4976_5354)) {
 7983 :             //^2759:07D4
 7984 :             _2759_0541();
 7985 :           }
 7986 :         }
 7987 :       }
 7988 :       //^2759:07D8
 7989 :       Bit8u bp1c[4];
 7990 :       if (_4976_5366 >= 0) {
 7991 :         //^2759:07E2
 7992 :         for (Bit16u bp06=0; bp06 < _4976_4c3c; bp06++) {
 7993 :           //^2759:07EA
 7994 :           sk53b4 *bp04 = &_4976_53b4[bp06];
 7995 :           //^2759:07FB
 7996 :           bp1c[bp06] = 0;
 7997 :           //^2759:0807
 7998 :           Bit8u bp07 = (bp04->playerDir() +4 - _4976_4bf6) & 3;
 7999 :           //^2759:0819
 8000 :           __int8 bp08 = (bp04->playerPos() +4 - _4976_4bf6) & 3;
 8001 :           //^2759:0828
 8002 :           if (bp04->curHP() != 0 && bp08 +1 == _4976_5dbc) {
 8003 :             //^2759:0837
 8004 :             bp08 = -1;
 8005 :           }
 8006 :           //^2759:083B
 8007 :           if (READ_UI8(_4976_3de2, bp06) == bp08 || _4976_3dde[bp06] != bp07) {
 8008 :             //^2759:0850
 8009 :             bp0c = 1;
 8010 :             bp12 = 1;
 8011 :             //^2759:0859
 8012 :             if (bp08 != -1) {
 8013 :               //^2759:085F
 8014 :               _4976_531c = 1;
 8015 :             }
 8016 :             //^2759:0865
 8017 :             WRITE_UI8(_4976_3de2, bp06, bp08);
 8018 :             _4976_3dde[bp06] = bp07;
 8019 :           }
 8020 :           //^2759:0876
 8021 :         }
 8022 :       }
 8023 :       //^2759:08C8
 8024 :       if (_4976_531c != 0) {
 8025 :         //^2759:08CF
 8026 :         if (_4976_5352 > 1) {
 8027 :           //^2759:08D6
 8028 :           //^2759:0BE2
 8029 :           _4976_5352--;
 8030 :           //^2759:0BE6
 8031 :           goto _0e03;
 8032 :         }
 8033 :         //^2759:08D9
 8034 :         _29ee_00a3(1);
 8035 :         //^2759:08E1
 8036 :         _4976_531c = 0;
 8037 :         //^2759:08E7
 8038 :         bp0a = 1;
 8039 :       }
 8040 :       //^2759:08EC
 8041 :       if (_4976_5366 == 0) {
 8042 :         //^2759:08F6
 8043 :         _4976_3ddc = 0;
 8044 :         //^2759:08FC
 8045 :         if (bp0a == 0 && bp12 != 0) {
 8046 :           //^2759:0908
 8047 :           _4976_3f6a = 0xffff;
 8048 :         }
 8049 :         //^2759:090E
 8050 :         for (Bit16u bp06=0; bp06 < _4976_4c3c; bp06++) {
 8051 :           //^2759:0916
 8052 :           sk53b4 *bp04 = &_4976_53b4[bp06];
 8053 :           //^2759:0927
 8054 :           if (bp04->curHP() == 0 && GET_PLAYER_AT_POSITION(bp04->playerPos()) >= 0) {
 8055 :             //^2759:0942
 8056 :             continue;
 8057 :           }
 8058 :           //^2759:0945
 8059 :           bp0e = bp1c[bp06];
 8060 :           //^2759:0955
 8061 :           if (_4976_5342[bp06] != ((bp04->curHP() > 0) ? 1 : 0)) {
 8062 :             //^2759:0973
 8063 :             _4976_5342[bp06] = ((bp04->curHP() > 0) ? 1 : 0);
 8064 :             //^2759:098D
 8065 :             bp0e = 1;
 8066 :             _4976_3f6a = 0xffff;
 8067 :           }
 8068 :           //^2759:0998
 8069 :           Bit16u bp16 = ((ABS16(_4976_531e) -1 == bp06) ? 1 : 0);
 8070 :           //^2759:09B2
 8071 :           for (Bit16u si=0; si <= 1; si++) {
 8072 :             //^2759:09B7
 8073 :             Bit16u bp14 = 0;
 8074 :             Bit16u bp10 = 0;
 8075 :             //^2759:09BF
 8076 :             if (bp16 != 0 && _4976_5324 == si) {
 8077 :               //^2759:09CB
 8078 :               if (_4976_531e > 0) {
 8079 :                 //^2759:09D2
 8080 :                 bp14 = 1;
 8081 :               }
 8082 :               //^2759:09D7
 8083 :               bp10 = 1;
 8084 :             }
 8085 :             //^2759:09DC
 8086 :             Bit8u bp17 = (bp04->b42[si] != 0) ? 1 : 0;
 8087 :             //^2759:09F0
 8088 :             if (_4976_5330[bp06][si] != bp17) {
 8089 :               //^2759:0A03
 8090 :               _4976_5330[bp06][si] = bp17;
 8091 :               //^2759:0A14
 8092 :               bp10 = 1;
 8093 :             }
 8094 :             //^2759:0A19
 8095 :             if (_4976_3de6[bp06][si] != bp04->Possess(si) || bp0a != 0 || bp0e != 0) {
 8096 :               //^2759:0A45
 8097 :               _4976_3de6[bp06][si] = bp04->Possess(si);
 8098 :               //^2759:0A68
 8099 :               bp10 = 1;
 8100 :             }
 8101 :             //^2759:0A6D
 8102 :             if (bp0a != 0 || bp0e != 0 || bp10 != 0) {
 8103 :               //^2759:0A7F
 8104 :               _29ee_026c(bp06, si, bp14);
 8105 :             }
 8106 :             //^2759:0A8E
 8107 :           }
 8108 :           //^2759:0A97
 8109 :           Bit16u bp14 = 0;
 8110 :           //^2759:0A9C
 8111 :           if (bp16 != 0 && _4976_5324 == 2) {
 8112 :             //^2759:0AA9
 8113 :             if (_4976_531e > 0) {
 8114 :               //^2759:0AB0
 8115 :               bp14 = 1;
 8116 :             }
 8117 :             //^2759:0AB5
 8118 :             bp0e = 1;
 8119 :           }
 8120 :           //^2759:0ABA
 8121 :           Bit8u bp17 = (bp04->b44 != 0) ? 1 : 0;
 8122 :           //^2759:0ACE
 8123 :           if (_4976_5330[bp06][2] != bp17) {
 8124 :             //^2759:0AE1
 8125 :             _4976_5330[bp06][2] = bp17;
 8126 :             //^2759:0AF2
 8127 :             bp0e = 1;
 8128 :           }
 8129 :           //^2759:0AF7
 8130 :           if (bp0a != 0 || bp0e != 0 || (_4976_3df7 != _4976_3fc6 && (_4976_3df7 == bp06 || _4976_3fc6 == bp06))) {
 8131 :             //^2759:0B19
 8132 :             _29ee_058d(bp06, bp14);
 8133 :           }
 8134 :           //^2759:0B26
 8135 :           if (_4976_53b4[bp06].w257 != 0 || _4976_3f68 != 0) {
 8136 :             //^2759:0B3E
 8137 :             bp0c = 1;
 8138 :           }
 8139 :           //^2759:0B43
 8140 :           if (_4976_53b4[bp06].w257 != 0) {
 8141 :             //^2759:0B54
 8142 :             _4976_3f68 |= 1 << bp06;
 8143 :           }
 8144 :           else {
 8145 :             //^2759:0B62
 8146 :             _4976_3f68 &= ~(1 << bp06);
 8147 :           }
 8148 :           //^2759:0B70
 8149 :         }
 8150 :         //^2759:0B7F
 8151 :         if (_4976_531e < 0) {
 8152 :           //^2759:0B86
 8153 :           _4976_531e = 0;
 8154 :         }
 8155 :         //^2759:0B8C
 8156 :         _4976_531e = -_4976_531e;
 8157 :         //^2759:0B94
 8158 :         if (bp0a != 0 || bp0c != 0) {
 8159 :           //^2759:0BA0
 8160 :           _29ee_0396();
 8161 :         }
 8162 :       }
 8163 :       //^2759:0BA5
 8164 :       _4976_3df7 = _4976_3fc6;
 8165 :       //^2759:0BB0
 8166 :       if (_4976_5366 > 0 && (_4976_5352 != 0 || bp0a != 0 || bp0c != 0 || (_4976_3ddc == 3 && xx != 0))) {
 8167 :         //^2759:0BDB
 8168 :         if (_4976_5352 > 1) {
 8169 :           //^2759:0BE2
 8170 :           _4976_5352--;
 8171 :           //^2759:0BE6
 8172 :           goto _0e03;
 8173 :         }
 8174 :         //^2759:0BE9
 8175 :         if (_4976_5356 != 0 && _4976_5352 == 0 && bp0a == 0) {
 8176 :           //^2759:0BFD
 8177 :           _29ee_00a3(0);
 8178 :         }
 8179 :         else if (_4976_5354) {
 8180 :           //^2759:0C07
 8181 :           _29ee_00a3(1);
 8182 :           //^2759:0C0F
 8183 :           _29ee_0713();
 8184 :         }
 8185 :         //^2759:0C1A
 8186 :         if (_4976_5354 == 2) {
 8187 :           //^2759:0C21
 8188 :           _4976_3ddc = 2;
 8189 :           //^2759:0C27
 8190 :           _29ee_09d5();
 8191 :         }
 8192 :         else {
 8193 :           //^2759:0C2F
 8194 :           Bit16u bp06 = _4976_5366 -1;
 8195 :           //^2759:0C36
 8196 :           sk53b4 *bp04 = &_4976_53b4[bp06];
 8197 :           //^2759:0C44
 8198 :           ObjectID di = bp04->Possess(_4976_5354);
 8199 :           //^2759:0C53
 8200 :           if (IS_CONTAINER_MAP(di) != 0 && _4976_5356 == 0) {
 8201 :             //^2759:0C65
 8202 :             _4976_531a = 1;
 8203 :             _4976_5316 = 25;
 8204 :             //^2759:0C71
 8205 :             if (bp04->curMP() != 0) {
 8206 :               //^2759:0C7B
 8207 :               bp04->w62--;
 8208 :               //^2759:0C7F
 8209 :               bp04->w50 |= 0x0800;
 8210 :               //^2759:0C85
 8211 :               _4976_5356 = 0x8200;
 8212 :             }
 8213 :             else {
 8214 :               //^2759:0C8D
 8215 :               _4976_5356 = 0x8000;
 8216 :             }
 8217 :             //^2759:0C93
 8218 :             _4976_3ddc = 3;
 8219 :           }
 8220 :           //^2759:0C9B
 8221 :           else if (IS_CONTAINER_MONEYBOX(di) != 0) {
 8222 :             //^2759:0CA6
 8223 :             _4976_3ddc = 4;
 8224 :           }
 8225 :           //^2759:0CAE
 8226 :           else if (IS_CONTAINER_CHEST(di) != 0 && _4976_3ddc != 5) {
 8227 :             //^2759:0CB9
 8228 :             _24a5_0990(di, GET_ADDRESS_OF_RECORD9(di));
 8229 :             //^2759:0CD2
 8230 :             _4976_3ddc = 5;
 8231 :           }
 8232 : 
 8233 :           //^2759:0CD8
 8234 :           if (_4976_3ddc == 4) {
 8235 :             //^2759:0CDF
 8236 :             _29ee_2048(di);
 8237 :           }
 8238 :           //^2759:0CE7
 8239 :           else if (_4976_3ddc == 5) {
 8240 :             //^2759:0CEE
 8241 :             _29ee_21d8(di, 1);
 8242 :           }
 8243 :           //^2759:0CFA
 8244 :           else if (_2759_02d6(bp06, di, _4976_5354) != 0 && _4976_3ddc != 3) {
 8245 :             //^2759:0D14
 8246 :             _4976_3ddc = 1;
 8247 :             //^2759:0D1A
 8248 :             if (_4976_3ddc != _4976_3f6a) {
 8249 :               //^2759:0D20
 8250 :               _1031_0667();
 8251 :               //^2759:0D25
 8252 :               _4976_3f6a = _4976_3ddc;
 8253 :             }
 8254 :             //^2759:0D2B
 8255 :             _29ee_0b2b();
 8256 :           }
 8257 :           //^2759:0D32
 8258 :           else if (_4976_3ddc == 3) {
 8259 :             //^2759:0D39
 8260 :             if ((_4976_5356 & 0x0400) == 0) {
 8261 :               //^2759:0D41
 8262 :               _4976_3f6a = 0xffff;
 8263 :             }
 8264 :             //^2759:0D47
 8265 :             _29ee_1da5(di);
 8266 :           }
 8267 :           else {
 8268 :             //^2759:0D50
 8269 :             _4976_5366 = 0;
 8270 :             _4976_3ddc = 0;
 8271 :           }
 8272 :         }
 8273 : 
 8274 :         //^2759:0D5C
 8275 :         _4976_5352 = 0;
 8276 :       }
 8277 :       else {
 8278 :         //^2759:0D64
 8279 :         if (_4976_5366 > 0 && _4976_3ddc == 5 && xx != 0) {
 8280 :           //^2759:0D78
 8281 :           _29ee_00a3(0);
 8282 :           //^2759:0D80
 8283 :           _29ee_21d8(_4976_52af[_4976_5366].Possess(_4976_5354), 0);
 8284 :         }
 8285 :       }
 8286 :       //^2759:0D9F
 8287 :       if (_4976_5366 > 0 && _4976_3df9[_4976_3ddc] != 0 && (_4976_52af[_4976_5366].w257 != 0 || _4976_3f68 != 0)) {
 8288 :         //^2759:0DC9
 8289 :         _29ee_078b();
 8290 :         //^2759:0DCE
 8291 :         if (_4976_52af[_4976_5366].w257 != 0) {
 8292 :           //^2759:0DDF
 8293 :           _4976_3f68 |=   1 << (__int8(_4976_5366) -1);
 8294 :         }
 8295 :         else {
 8296 :           //^2759:0DF1
 8297 :           _4976_3f68 &= ~(1 << (__int8(_4976_5366) -1));
 8298 :         }  
 8299 :       }
 8300 : 
 8301 :       //^2759:0E03
 8302 : _0e03:
 8303 :       if (_4976_3f6c.w0 != 0xffff) {
 8304 :         //^2759:0E0A
 8305 :         _0b36_0cbe(&_4976_3f6c, 1);
 8306 :       }
 8307 :       //^2759:0E18
 8308 :       if (_4976_3ddc != _4976_3f6a) {
 8309 :         //^2759:0E21
 8310 :         _1031_0667();
 8311 :         //^2759:0E26
 8312 :         _4976_3f6a = _4976_3ddc;
 8313 :       }
 8314 :     }
 8315 :     //^2759:0E2C
 8316 :     return;
 8317 :   }
 8318 : 
 8319 :   //^1031:04F5
 8320 :   void _1031_04f5()
 8321 :   {
 8322 :     //^1031:04F5
 8323 :     ENTER(0);
 8324 :     //^1031:04F8
 8325 :     if (_4976_4ddc != 0) {
 8326 :       //^1031:04FF
 8327 :       _4976_4ddc = 0;
 8328 :       //^1031:0505
 8329 :       _29ee_000f();
 8330 :     }
 8331 :     //^1031:050A
 8332 :     return;
 8333 :   }
 8334 : 
 8335 :   //^
 8336 :   void _12b4_000d(Bit16u xx, Bit16u yy, Bit16u zz); // TODO: Unreachable
 8337 : 
 8338 :   //^12B4:0092
 8339 :   void _12b4_0092()
 8340 :   {
 8341 :     //^12B4:0092
 8342 :     ENTER(0);
 8343 :     //^12B4:0095
 8344 :     if (_4976_4eb4 != 0) {
 8345 :       //^12B4:009C
 8346 :       _12b4_000d(_4976_4eb6, _4976_4ebc, 0);
 8347 :     }
 8348 :     //^12B4:00AD
 8349 :     return;
 8350 :   }
 8351 : 
 8352 :   //^00EB:03E7
 8353 :   void IBMIO_FILL_HALFTONE_RECT(SRECT *rc) //#DS=04BF
 8354 :   {
 8355 :     //^00EB:03E7
 8356 :     ENTER(4);
 8357 :     //^00EB:03ED
 8358 :     LOADDS(0x0c48);
 8359 :     //^00EB:03F3
 8360 :     for (i16 si = rc->y; rc->y + rc->cy -1 >= si; si++) {
 8361 :       //^00EB:03FC
 8362 :       Bit8u *bp04 = &pbVram[si * 320 + rc->x];
 8363 :       //^00EB:0416
 8364 :       for (i16 di = rc->x; rc->x + rc->cx -1 >= di; bp04++, di++) {
 8365 :         //^00EB:041E
 8366 :         if (((di ^ si) & 1) == 0) {
 8367 :           //^00EB:0429
 8368 :           *bp04 = 0;
 8369 :         }
 8370 :         //^00EB:0430
 8371 :       }
 8372 :       //^00EB:0447
 8373 :     }
 8374 :     //^00EB:0458
 8375 :     return;
 8376 :   }
 8377 : 
 8378 :   //^44C8:1D11
 8379 :   void FIRE_FILL_HALFTONE_RECTV(SRECT *rc, Bit16u aa)
 8380 :   {
 8381 :     //^44C8:1D11
 8382 :     ENTER(0);
 8383 :     //^44C8:1D14
 8384 :     IBMIO_FILL_HALFTONE_RECT(rc) CALL_IBMIO;
 8385 :     //^44C8:1D24
 8386 :         return;
 8387 :   }
 8388 : 
 8389 :   //^44C8:1DDA
 8390 :   void FIRE_FILL_HALFTONE_RECTI(Bit16u rectno, Bit16u aa)
 8391 :   {
 8392 :     //^44C8:1DDA
 8393 :     ENTER(8);
 8394 :     //^44C8:1DDE
 8395 :     SRECT bp08;
 8396 :     FIRE_FILL_HALFTONE_RECTV(QUERY_EXPANDED_RECT(rectno, &bp08), aa);
 8397 :   }
 8398 : 
 8399 :   //^01B0:088D
 8400 :   void IBMIO_MOUSE_SET_POS() //#DS=04BF
 8401 :   {
 8402 :     DOSIMPL();
 8403 : 
 8404 : //    //^01B0:088D
 8405 : //    ENTER(0);
 8406 : //    //^01B0:0890
 8407 : //    LOADDS(0x3083);
 8408 : //    //^01B0:0896
 8409 : //    if (_04bf_18b2 == 1) {
 8410 : //      //^01B0:089F
 8411 : //      __asm mov cx,[_04bf_03be]
 8412 : //      __asm shl cx,1
 8413 : //      __asm mov dx,[_04bf_03c0]
 8414 : //      __asm mov ax,0x0004
 8415 : //      __asm int 0x33
 8416 : //    }
 8417 : //    //^01B0:08AE
 8418 : //    _04bf_0e52--;
 8419 : //    //^01B0:08B2
 8420 : //    return;
 8421 :   }
 8422 : 
 8423 :   //^443C:0401
 8424 :   void FIRE_MOUSE_SET_POS()
 8425 :   {
 8426 :     //^443C:0401
 8427 :     ENTER(0);
 8428 :     //^443C:0404
 8429 :     IBMIO_MOUSE_SET_POS() CALL_IBMIO;
 8430 :     //^443C:040C
 8431 :     return;
 8432 :   }
 8433 : 
 8434 :   //^1031:050C
 8435 :   void _1031_050c()
 8436 :   {
 8437 :     //^1031:050C
 8438 :     ENTER(0);
 8439 :     //^1031:050F
 8440 :     if (_4976_4c38 != 0 || _4976_4bfe != 0 || _4976_4c3e != 0) {
 8441 :       //^1031:0524
 8442 :       _4976_4c3e = 0;
 8443 :       _4976_4bfe = 0;
 8444 :       _4976_4c38 = 0;
 8445 :       //^1031:052F
 8446 :       FIRE_MOUSE_SET_POS();
 8447 :       //^1031:0534
 8448 :       _4976_4860 = 1;
 8449 :       //^1031:053A
 8450 :       _443c_086b();
 8451 :     }
 8452 :     //^1031:053F
 8453 :     return;
 8454 :   }
 8455 : 
 8456 :   //^1031:0675
 8457 :   void _1031_0675(Bit16u xx)
 8458 :   {
 8459 :     //^1031:0675
 8460 :     ENTER(0);
 8461 :     //^1031:0678
 8462 :     _4976_4ea8 = _4976_19ad;
 8463 :     //^1031:067E
 8464 :     _4976_4e64 = 0;
 8465 :     _4976_4e48 = 0;
 8466 :     _4976_4e96 = 0;
 8467 :     //^1031:0692
 8468 :     _443c_0662();
 8469 :     //^1031:0698
 8470 :     _1031_050c();
 8471 :     //^1031:069B
 8472 :     _1031_0541(xx);
 8473 :     //^1031:06A3
 8474 :     return;
 8475 :   }
 8476 : 
 8477 :   //^1031:0000
 8478 :   Bit16u _1031_0000(sk1891 *ref)
 8479 :   {
 8480 :     //^1031:0000
 8481 :     ENTER(0);
 8482 :     //^1031:0003
 8483 :     return 1;
 8484 :   }
 8485 : 
 8486 :   //^1031:0008
 8487 :   Bit16u _1031_0008(sk1891 *ref)
 8488 :   {
 8489 :     //^1031:0008
 8490 :     ENTER(0);
 8491 :     //^1031:000B
 8492 :     return (ref->b1 == _4976_01ba) ? 1 : 0;
 8493 :   }
 8494 : 
 8495 :   //^1031:0023
 8496 :   Bit16u _1031_0023(sk1891 *ref)
 8497 :   {
 8498 :     //^1031:0023
 8499 :     ENTER(0);
 8500 :     //^1031:0026
 8501 :     return (ref->b1 == _4976_4bd2) ? 1 : 0;
 8502 :   }
 8503 : 
 8504 :   //^1031:003E
 8505 :   Bit16u _1031_003e(sk1891 *ref)
 8506 :   {
 8507 :     //^1031:003E
 8508 :     ENTER(0);
 8509 :     //^1031:0041
 8510 :     if (ref->b1 == _4976_52be)
 8511 :       //^1031:0050
 8512 :       return 1;
 8513 :     //^1031:0055
 8514 :     return (ref->b1 <= 4 || (_4976_52be != 0 && ref->b1 -4 == _4976_52be)) ? 0 : 1;
 8515 :   }
 8516 : 
 8517 :   //^1031:007B
 8518 :   Bit16u _1031_007b(sk1891 *ref)
 8519 :   {
 8520 :     //^1031:007B
 8521 :     ENTER(0);
 8522 :     //^1031:007E
 8523 :     return (_4976_53b4[ref->b1].curHP() != 0) ? 1 : 0;
 8524 :   }
 8525 : 
 8526 :   //^1031:009E
 8527 :   Bit16u _1031_009e(sk1891 *ref)
 8528 :   {
 8529 :     //^1031:009E
 8530 :     ENTER(0);
 8531 :     //^1031:00A1
 8532 :     return (GET_PLAYER_AT_POSITION((ref->b1 + _4976_4bf6) & 3) >= 0) ? 1 : 0;
 8533 :   }
 8534 : 
 8535 :   //^1031:00C5
 8536 :   Bit16u _1031_00c5(sk1891 *ref)
 8537 :   {
 8538 :     //^1031:00C5
 8539 :     ENTER(0);
 8540 :     //^1031:00C8
 8541 :     return ((ref->b1 == 0 && _4976_5dbc == 0) || (ref->b1 != 0 && _4976_5dbc != 0)) ? 1 : 0;
 8542 :   }
 8543 : 
 8544 :   //^1031:00F3
 8545 :   Bit16u _1031_00f3(sk1891 *ref)
 8546 :   {
 8547 :     //^1031:00F3
 8548 :     ENTER(0);
 8549 :     //^1031:00F6
 8550 :     if (_4976_5366 == 0) {
 8551 :       //^1031:00FD
 8552 :       if (ref->b1 > 3)
 8553 :         //^1031:0107
 8554 :         return 1;
 8555 :       //^1031:010C
 8556 :       if (GET_PLAYER_AT_POSITION((ref->b1 + _4976_4bf6) & 3) >= 0)
 8557 :         //^1031:0127
 8558 :         return 1;
 8559 :     }
 8560 :     //^1031:0129
 8561 :     return 0;
 8562 :   }
 8563 : 
 8564 :   //^1031:012D
 8565 :   Bit16u _1031_012d(sk1891 *ref)
 8566 :   {
 8567 :     //^1031:012D
 8568 :     ENTER(0);
 8569 :     //^1031:0130
 8570 :     return (_4976_5366 != 0 && ref->b1 == _4976_53a4) ? 1 : 0;
 8571 :   }
 8572 : 
 8573 :   //^1031:014F
 8574 :   Bit16u _1031_014f(sk1891 *ref)
 8575 :   {
 8576 :     //^1031:014F
 8577 :     ENTER(0);
 8578 :     //^1031:0152
 8579 :     return (_4976_5366 != 0 && (ref->b1 & (1 << _4976_52af[_4976_5366].b30)) != 0) ? 1 : 0;
 8580 :   }
 8581 : 
 8582 :   //^1031:0184
 8583 :   Bit16u _1031_0184(sk1891 *ref)
 8584 :   {
 8585 :     //^1031:0184
 8586 :     ENTER(0);
 8587 :     //^1031:0187
 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 :   //^1031:027E
 8604 :   void _1031_027e(sk1891 *ref)
 8605 :   {
 8606 :     //^1031:027E
 8607 :     ENTER(8);
 8608 :     //^1031:0282
 8609 :     Bit8u *bp08 = _1031_023b(ref);
 8610 : 
 8611 :     do {
 8612 :       //^1031:0294
 8613 :       sk1891 *bp04 = _4976_1574[*bp08 & 0xff7f];
 8614 :       //^1031:02AB
 8615 :       if ((this->_4976_0cba[ref->b0 & 0x7f])(bp04) != 0) {
 8616 :         //^1031:02CA
 8617 :         if ((bp04->b0 & 0x80) == 0x80) {
 8618 :           //^1031:02D6
 8619 :           _1031_027e(bp04);
 8620 :         }
 8621 :         else {
 8622 :           //^1031:02E4
 8623 :           _4976_16ed[bp04->w2].b6 |= 0x40;
 8624 :         }
 8625 :       }
 8626 :       //^1031:02F7
 8627 :       bp08++;
 8628 :       //^1031:02FA
 8629 :     } while ((*bp08 & 0x80) == 0);
 8630 :     //^1031:0308
 8631 :     return;
 8632 :   }
 8633 : 
 8634 :   //^098D:025D
 8635 :   Bit16u PT_IN_RECT(SRECT *rc, i16 xx, i16 yy)
 8636 :   {
 8637 :     //^098D:025D
 8638 :     ENTER(0);
 8639 :     //^098D:0261
 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 :   //^1031:01D5
 8649 :   SRECT *_1031_01d5(Bit16u xx, SRECT *rc)
 8650 :   {
 8651 :     //^1031:01D5
 8652 :     ENTER(4);
 8653 :     //^1031:01DA
 8654 :     Bit16u si = xx;
 8655 :     //^1031:01DD
 8656 :     rc = QUERY_EXPANDED_RECT(si & 0x3fff, rc);
 8657 :     //^1031:01F7
 8658 :     if (rc != NULL) {
 8659 :       //^1031:01FB
 8660 :       if ((si & 0x8000) != 0) {
 8661 :         //^1031:0201
 8662 :         si = 7;
 8663 :         //^1031:0204
 8664 :         goto _020f;
 8665 :       }
 8666 :       //^1031:0206
 8667 :       if ((si & 0x4000) != 0) {
 8668 :         //^1031:020C
 8669 :         si = 18;
 8670 :         //^1031:020F
 8671 : _020f:
 8672 :         i16 bp02;
 8673 :         i16 bp04;
 8674 :         QUERY_TOPLEFT_OF_RECT(si, &bp02, &bp04);
 8675 :         //^1031:0222
 8676 :         rc->x += bp02;
 8677 :         rc->y += bp04;
 8678 :       }
 8679 :     }
 8680 :     //^1031:0232
 8681 :     return rc;
 8682 :   }
 8683 : 
 8684 :   //^1031:0A88
 8685 :   Bit16u _1031_0a88(sk0d9e *ref, Bit16u xx, Bit16u yy, Bit16u ww)
 8686 :   {
 8687 :     //^1031:0A88
 8688 :     ENTER(4);
 8689 :     //^1031:0A8D
 8690 :     if (ref == NULL)
 8691 :       //^1031:0A95
 8692 :       return 0;
 8693 :     //^1031:0A9A
 8694 :     Bit16u si = 0;
 8695 :     sk0d9e *bp04 = ref;
 8696 :     //^1031:0AA8
 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 :       //^1031:0AF1
 8704 :       _4976_4df8 = ref->w2;
 8705 :       //^1031:0AFB
 8706 :       _4976_4e44 = ((_4976_4df8 & 0x8000) == 0 && (_4976_4df8 & 0x4000) != 0) ? 0x0012 : 0xffff;
 8707 :             //^1031:0B21
 8708 :       _4976_4df8 = _4976_4df8 & 0x3fff;
 8709 :       _4976_4e66 = xx;
 8710 :       _4976_4e68 = yy;
 8711 :       //^1031:0B36
 8712 :       si = 0x07ff & ref->w0;
 8713 :       //^1031:0B41
 8714 :       _4976_4dfa = si;
 8715 :       _4976_4e9c = 0;
 8716 :       //^1031:0B4A
 8717 :       _4976_4dfc = _4976_4dfa - ((0x07ff & bp04->w0) -1);
 8718 :     }
 8719 :     else {
 8720 :       //^1031:0B60
 8721 :       ref++;
 8722 :       //^1031:0B64
 8723 :       if ((ref->w0 & 0x8000) != 0) {
 8724 :         //^1031:0B71
 8725 :         _4976_4e9e.cx = 0;
 8726 :         _4976_4e9e.cy = 0;
 8727 :       }
 8728 :     }
 8729 :     //^1031:0B79
 8730 :     return si;
 8731 :   }
 8732 : 
 8733 :   //^1031:024C
 8734 :   sk0d9e *_1031_024c(sk1891 *ref)
 8735 :   {
 8736 :     //^1031:024C
 8737 :     ENTER(0);
 8738 :     //^1031:0250
 8739 :     Bit16u si = _4976_16ed[ref->w2].w2;
 8740 :     //^1031:0264
 8741 :     return (si == 0xffff) ? NULL : &_4976_0d9e[si];
 8742 :   }
 8743 : 
 8744 :   //^1031:030A
 8745 :   Bit16u _1031_030a(sk1891 *ref, Bit16u xx, Bit16u yy, Bit16u zz)
 8746 :   {
 8747 :     //^1031:030A
 8748 :     ENTER(16);
 8749 :     //^1031:0310
 8750 :     Bit16u di = yy;
 8751 :     Bit16u si = 0;
 8752 :     //^1031:0315
 8753 :     Bit8u *bp08 = _1031_023b(ref);
 8754 : 
 8755 :     do {
 8756 :       //^1031:0327
 8757 :       sk1891 *bp04 = _4976_1574[*bp08 & 0xff7f];
 8758 :       //^1031:033E
 8759 :       if ((_4976_0cba[ref->b0 & 0x7f])(bp04) != 0) {
 8760 :         //^1031:035D
 8761 :         SRECT bp10;
 8762 :         if ((bp04->b0 & 0x80) == 0x80) {
 8763 :           //^1031:0369
 8764 :           si = _1031_030a(bp04, xx, di, zz);
 8765 :           //^1031:037F
 8766 :           if (si != 0)
 8767 :             //^1031:0383
 8768 :             //^1031:03EC
 8769 :             return si;
 8770 :         }
 8771 :         //^1031:0385
 8772 :         else if (PT_IN_RECT(_1031_01d5(_4976_16ed[bp04->w2].w0, &bp10), xx, di) != 0) {
 8773 :           //^1031:03B5
 8774 :           if (_1031_0a88(_1031_024c(bp04), xx, di, zz) != 0)
 8775 :             //^1031:03D6
 8776 :             //^1031:03EC
 8777 :             return si;
 8778 :         }
 8779 :       }
 8780 :       //^1031:03D8
 8781 :       bp08++;
 8782 :       //^1031:03DB
 8783 :     } while ((*bp08 & 0x80) == 0);
 8784 :     //^1031:03EC
 8785 :     return si;
 8786 :   }
 8787 : 
 8788 :   //^1031:0C58
 8789 :   Bit16u _1031_0c58(Bit16u xx, sk0d9e *ref)
 8790 :   {
 8791 :     //^1031:0C58
 8792 :     ENTER(4);
 8793 :     //^1031:0C5D
 8794 :     _4976_4e44 = 0xffff;
 8795 :     //^1031:0C63
 8796 :     sk0d9e *bp04 = ref;
 8797 :     //^1031:0C6F
 8798 :     if (ref != NULL) {
 8799 :       //^1031:0C7A
 8800 :       Bit16u si;
 8801 :       for (; (si = 0x07ff & ref->w0) != 0; ref++) {
 8802 :         //^1031:0C7C
 8803 :         if ((ref->w4 & 0x0800) == 0 && si == xx) {
 8804 :           //^1031:0C8C
 8805 :           _1031_01d5(ref->w2, &_4976_4e9e);
 8806 :           //^1031:0C9B
 8807 :           _4976_4df8 = ref->w2;
 8808 :           //^1031:0CA5
 8809 :           if ((_4976_4df8 & 0x8000) != 0) {
 8810 :             //^1031:0CAD
 8811 :             _4976_4e44 = 7;
 8812 :           }
 8813 :           //^1031:0CB5
 8814 :           else if ((_4976_4df8 & 0x4000) != 0) {
 8815 :             //^1031:0CBD
 8816 :             _4976_4e44 = 18;
 8817 :           }
 8818 :           //^1031:0CC3
 8819 :           _4976_4df8 = _4976_4df8 & 0x3fff;
 8820 :           _4976_4e66 = _4976_4e9e.x;
 8821 :           _4976_4e68 = _4976_4e9e.y;
 8822 :           _4976_4dfa = si;
 8823 :           //^1031:0CDC
 8824 :           _4976_4dfc = _4976_4dfa - (0x07ff & bp04->w0) -1;
 8825 :           //^1031:0CF0
 8826 :           return 1;
 8827 :         }
 8828 :         //^1031:0CF5
 8829 :       }
 8830 :       //^1031:0D0B
 8831 :       _4976_4ea2 = 0;
 8832 :     }
 8833 :     //^1031:0D13
 8834 :     _4976_4df8 = 0xffff;
 8835 :     _4976_4e66 = 0;
 8836 :     _4976_4e68 = 0;
 8837 :     _4976_4dfa = xx;
 8838 :     _4976_4dfc = 0;
 8839 :     //^1031:0D31
 8840 :     return 0;
 8841 :   }
 8842 : 
 8843 :   //^1031:03F2
 8844 :   Bit16u _1031_03f2(sk1891 *ref, Bit16u xx)
 8845 :   {
 8846 :     //^1031:03F2
 8847 :     ENTER(12);
 8848 :     //^1031:03F8
 8849 :     Bit16u si = 0;
 8850 :     //^1031:03FA
 8851 :     Bit8u *bp08 = _1031_023b(ref);
 8852 : 
 8853 :     do {
 8854 :       //^1031:040C
 8855 :       sk1891 *bp04 = _4976_1574[*bp08 & 0xff7f];
 8856 :       //^1031:0423
 8857 :       if ((_4976_0cba[ref->b0 & 0x7f])(bp04) != 0) {
 8858 :         //^1031:0445
 8859 :         if ((bp04->b0 & 0x80) == 0x80) {
 8860 :           //^1031:0451
 8861 :           si = _1031_03f2(bp04, xx);
 8862 :           //^1031:0463
 8863 :           if (si != 0)
 8864 :             //^1031:0467
 8865 :             //^1031:04EF
 8866 :             return si;
 8867 :         }
 8868 :         else {
 8869 :           //^1031:046A
 8870 :           Bit16u di = _4976_16ed[bp04->w2].w4;
 8871 :           //^1031:047E
 8872 :           if (di != 0xffff) {
 8873 :             //^1031:0483
 8874 :             sk13a4 *bp0c = &_4976_13a4[di];
 8875 : 
 8876 :             do {
 8877 :               //^1031:0491
 8878 :               if (bp0c->w2 == xx) {
 8879 :                 //^1031:049D
 8880 :                 _1031_024c(bp04);
 8881 :                 //^1031:04A9
 8882 :                 _1031_0c58(si = 0x07ff & bp0c->w0, _1031_024c(bp04));
 8883 :                 //^1031:04BF
 8884 :                 _4976_4e9c = xx;
 8885 :                 //^1031:04C5
 8886 :                 break;
 8887 :               }
 8888 :               //^1031:04C7
 8889 :             } while (((bp0c++)->w0 & 0x8000) == 0);
 8890 :             //^1031:04D5
 8891 :             if (si != 0)
 8892 :               //^1031:04D9
 8893 :               //^1031:04EF
 8894 :               return si;
 8895 :           }
 8896 :         }
 8897 :       }
 8898 :       //^1031:04DB
 8899 :       bp08++;
 8900 :       //^1031:04DE
 8901 :     } while ((*bp08 & 0x80) == 0);
 8902 :     //^1031:04EF
 8903 :     return si;
 8904 :   }
 8905 : 
 8906 :   //^1031:156F
 8907 :   void _1031_156f(sk4e4e *ref)
 8908 :   {
 8909 :     //^1031:156F
 8910 :     ENTER(6);
 8911 :     //^1031:1575
 8912 :     Bit16u si = ref->w4;
 8913 :     //^1031:157C
 8914 :     if (si >= 0x74 && si <= 0x7b) {
 8915 :       //^1031:1586
 8916 :       si -= 0x74;
 8917 :       //^1031:1589
 8918 :       Bit16u bp06 = ((si & 1) != 0) ? 1 : 0;
 8919 :       //^1031:1599
 8920 :       i16 di = GET_PLAYER_AT_POSITION(((si >> 1) + _4976_4bf6) & 3);
 8921 :       //^1031:15AD
 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 :         //^1031:15E6
 8928 :         si = 0;
 8929 :       }
 8930 :       else {
 8931 :         //^1031:15EB
 8932 :         si = (di << 1) +bp06 +0x74;
 8933 :       }
 8934 :     }
 8935 :     //^1031:15FA
 8936 :     else if (si >= 0x5f && si <= 0x62) {
 8937 :       //^1031:160A
 8938 :       i16 di = GET_PLAYER_AT_POSITION((si -0x5f +_4976_4bf6) & 3);
 8939 :       //^1031:161F
 8940 :       if (di < 0) {
 8941 :         //^1031:1623
 8942 :         //^1031:15E6
 8943 :         si = 0;
 8944 :       }
 8945 :       else {
 8946 :         //^1031:1625
 8947 :         i16 bp04;
 8948 :         if (si <= 0x60) {
 8949 :           //^1031:162A
 8950 :           bp04 = ref->rc6.y + ref->rc6.cy -1 - ref->w2;
 8951 :         }
 8952 :         else {
 8953 :           //^1031:163C
 8954 :           bp04 = ref->w2 - ref->rc6.y;
 8955 :         }
 8956 :         //^1031:164A
 8957 :         i16 bp02;
 8958 :         if (si == 0x60 || si == 0x61) {
 8959 :           //^1031:1654
 8960 :           bp02 = ref->w0 - ref->rc6.x;
 8961 :         }
 8962 :         else {
 8963 :           //^1031:1664
 8964 :           bp02 = ref->rc6.x + ref->rc6.cx -1 - ref->w0;
 8965 :         }
 8966 :         //^1031:1676
 8967 :         if (bp02 <= bp04) {
 8968 :           //^1031:167E
 8969 :           si -= 0x4f;
 8970 :         }
 8971 :         //^1031:1683
 8972 :         else if (_4976_53b4[di].b44 != 0) {
 8973 :           //^1031:1693
 8974 :           si = 0;
 8975 :         }
 8976 :       }
 8977 :     }
 8978 :     else {
 8979 :       //^1031:1607
 8980 :       return;
 8981 :     }
 8982 :     //^1031:1695
 8983 :     ref->w4 = si;
 8984 :     //^1031:169C
 8985 :     return;
 8986 :   }
 8987 : 
 8988 :   //^1031:0D9E
 8989 :   Bit8u *_1031_0d9e(sk4e4e *xx)
 8990 :   {
 8991 :     //^1031:0D9E
 8992 :     ENTER(0);
 8993 :     //^1031:0DA3
 8994 :     _1031_156f(xx);
 8995 :     //^1031:0DB0
 8996 :     Bit16u si = xx->w4;
 8997 :     //^1031:0DB7
 8998 :     if (si == 0 || si > 239) {
 8999 :       //^1031:0DC1
 9000 :       return 0;
 9001 :     }
 9002 :     Bit16u di;
 9003 :     //^1031:0DC8
 9004 :     if ((si >= 0x14 && si < 0x42) || (si >= 0x7d && si <= 0x81) || (si >= 0x10 && si <= 0x13)) {
 9005 :       //^1031:0DE7
 9006 :       di = 1;
 9007 :       goto _0f23;
 9008 :     }
 9009 :     //^1031:0DED
 9010 :     else if (si >= 0x01 && si <= 0x06) {
 9011 :       //^1031:0DF7
 9012 :       di = (si -0x01) * 15 +2;
 9013 :       goto _0f23;
 9014 :     }
 9015 :     //^1031:0E04
 9016 :     else if (si >= 0x74 && si <= 0x7b) {
 9017 :       //^1031:0E0E
 9018 :       di = ((si -0x74) & 1) * 5 +0x5c;
 9019 :       goto _0f23;
 9020 :     }
 9021 :     //^1031:0E21
 9022 :     else if (si >= 0x5f && si <= 0x62) {
 9023 :       //^1031:0E2B
 9024 :       di = (si -0x5f) * 5 +0x66;
 9025 :       goto _0f23;
 9026 :     }
 9027 :     //^1031:0E3B
 9028 :     else if (si == 0x70) {
 9029 :       //^1031:0E40
 9030 :       di = 0x7a;
 9031 :       goto _0f23;
 9032 :     }
 9033 :     //^1031:0E46
 9034 :     else if (si == 0x5d || si == 0x5e) {
 9035 :       //^1031:0E50
 9036 :       di = ((si -0x5d) << 3) +0x82;
 9037 :       goto _0f23;
 9038 :     }
 9039 :     //^1031:0E5D
 9040 :     else if (si >= 0x65 && si <= 0x6a) {
 9041 :       //^1031:0E67
 9042 :       di = 0x92;
 9043 :       goto _0f23;
 9044 :     }
 9045 :     //^1031:0E6D
 9046 :     else if (si == 0x6b) {
 9047 :       //^1031:0E72
 9048 :       di = 0x96;
 9049 :       goto _0f23;
 9050 :     }
 9051 :     //^1031:0E78
 9052 :     else if (si == 0x6c) {
 9053 :       //^1031:0E7D
 9054 :       di = 0x9e;
 9055 :       goto _0f23;
 9056 :     }
 9057 :     //^1031:0E83
 9058 :     else if (si >= 0x71 && si <= 0x73) {
 9059 :       //^1031:0E8D
 9060 :       di = (si -0x71) * 5 +0xa2;
 9061 :       goto _0f23;
 9062 :     }
 9063 :     //^1031:0E9C
 9064 :     else if (si == 0x0b || si == 0xa1) {
 9065 :       //^1031:0EA7
 9066 :       di = 0xb1;
 9067 :       goto _0f23;
 9068 :     }
 9069 :     //^1031:0EAC
 9070 :     else if (si == 0x91) {
 9071 :       //^1031:
 9072 :       di = 0xb6;
 9073 :       goto _0f23;
 9074 :     }
 9075 :     //^1031:0EB7
 9076 :     else if (si == 0x8c) {
 9077 :       //^1031:0EBD
 9078 :       di = 0xbb;
 9079 :       goto _0f23;
 9080 :     }
 9081 :     //^1031:0EC2
 9082 :     else if (si >= 0x97 && si <= 0x9a) {
 9083 :       //^1031:0ECE
 9084 :       di = (si -0x97) * 7 +0xc0;
 9085 :       goto _0f23;
 9086 :     }
 9087 :     //^1031:0EDF
 9088 :     else if (si >= 0xdb && si <= 0xde) {
 9089 :       //^1031:0EEB
 9090 :       switch (_4976_4bd2 -1) {
 9091 :         case 0:
 9092 :         case 1:
 9093 :           //^1031:0EFC
 9094 :           di = 0xe3;
 9095 :           break;
 9096 :         case 2:
 9097 :           //^1031:0F01
 9098 :           if (si < 0xdc) {
 9099 :             //^1031:0F05
 9100 :             //^1031:0EFC
 9101 :             di = 0xe3;
 9102 :           }
 9103 :           else {
 9104 :             //^1031:0F07
 9105 :             di = 0xdc;
 9106 :           }
 9107 :           break;
 9108 :         case 3:
 9109 :           //^1031:0F07
 9110 :           di = 0xdc;
 9111 :           break;
 9112 :         case 4:
 9113 :         case 5:
 9114 :           //^1031:0F0C
 9115 :           if (si <= 0xdc) {
 9116 :             //^1031:0F10
 9117 :             //^1031:0F07
 9118 :             di = 0xdc;
 9119 :           }
 9120 :           break;
 9121 :         default:
 9122 :           //^1031:0F12
 9123 :           di = 1;
 9124 :           break;
 9125 :       }
 9126 :       goto _0f23;
 9127 :     }
 9128 :     //^1031:0F17
 9129 :     else if (si == 0x50) {
 9130 :       //^1031:0F1C
 9131 :       di = 0xea;
 9132 :       goto _0f23;
 9133 :     }
 9134 :     else {
 9135 :       //^1031:0F21
 9136 :       di = 0;
 9137 :     }
 9138 :     //^1031:0F23
 9139 : _0f23:
 9140 :     return &_4976_18b9[di];
 9141 :   }
 9142 : 
 9143 :   //^1031:10C8
 9144 :   void _1031_10c8(sk3f6c *ref, SRECT *rc, Bit16u cx, Bit16u cy)
 9145 :   {
 9146 :     //^1031:10C8
 9147 :     ENTER(0);
 9148 :     //^1031:10CB
 9149 :     if (ref->w0 == 0xffff) {
 9150 :       //^1031:10D4
 9151 :       COPY_MEMORY(&_4976_4e54, &ref->w2, 8);
 9152 :       //^1031:10ED
 9153 :       _0b36_0c52(ref, -1, 0);
 9154 :     }
 9155 :     //^1031:10FF
 9156 :     CALC_CENTERED_RECT_IN_RECT(rc, &ref->w2, cx, cy);
 9157 :     //^1031:111C
 9158 :     return;
 9159 :   }
 9160 : 
 9161 :   //^0B36:129A
 9162 :   void _0b36_129a(sk3f6c *ref, i16 xx, i16 yy, Bit8u clr1, Bit8u clr2, Bit8u *str)
 9163 :   {
 9164 :     //^0B36:129A
 9165 :     ENTER(4);
 9166 :     //^0B36:129E
 9167 :     i16 bp02;
 9168 :     i16 bp04;
 9169 :     if (_3929_03dc(str, &bp02, &bp04) != 0) {
 9170 :       //^0B36:12BA
 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 :       //^0B36:12F5
 9183 :       _0b36_0d67(
 9184 :         ref, 
 9185 :         ALLOC_TEMP_RECT(xx, yy, bp02, bp04)
 9186 :         );
 9187 :     }
 9188 :     //^0B36:1318
 9189 :     return;
 9190 :   }
 9191 : 
 9192 :   //^0B36:0A3F
 9193 :   void _0b36_0a3f(skxxx4 *ref)
 9194 :   {
 9195 :     //^0B36:0A3F
 9196 :     ENTER(12);
 9197 :     //^0B36:0A45
 9198 :     if (ref->w18 <= 0 || ref->w20 <= 0)
 9199 :       //^0B36:0A59
 9200 :       return;
 9201 : 
 9202 :     //^0B36:0A5C
 9203 :     U8 *bp04 = QUERY_PICT_BITS(ref);
 9204 :     //^0B36:0A6E
 9205 :     U16 bp06 = ref->w24;
 9206 :     //^0B36:0A78
 9207 :     i16 bp08;
 9208 :     i16 bp0a;
 9209 :     if (bp06 == 0xffff) {
 9210 :       //^0B36:0A7D
 9211 :       bp08 = ref->w32;
 9212 :       bp0a = ref->w34;
 9213 :     }
 9214 :     else {
 9215 :       //^0B36:0A8D
 9216 :       if ((bp06 & 0x8000) != 0 || ref->w28 != 0 || ref->w30 != 0) {
 9217 :         //^0B36:0AA5
 9218 :         bp06 = bp06 | 0x8000;
 9219 :         bp08 = ref->w32 + ref->w28;
 9220 :         bp0a = ref->w34 + ref->w30;
 9221 :       }
 9222 :       else {
 9223 :         //^0B36:0AC6
 9224 :         bp08 = ref->w18;
 9225 :         bp0a = ref->w20;
 9226 :       }
 9227 :       //^0B36:0AD4
 9228 :       if (QUERY_BLIT_RECT(bp04, &ref->rc36, bp06, &bp08, &bp0a, ref->w26) == 0) {
 9229 :         //^0B36:0B07
 9230 :         return;
 9231 :       }
 9232 :     }
 9233 :     //^0B36:0B0A
 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 :     //^0B36:0B2E
 9240 :     if (si > di && (ref->w50 & 0x0001) != 0) {
 9241 :       //^0B36:0B3A
 9242 :       si -= di;  
 9243 :     }
 9244 :     else {
 9245 :       //^0B36:0B3E
 9246 :       si = 0;
 9247 :     }
 9248 :     //^0B36:0B40
 9249 : 
 9250 :     if ((ref->w50 & 0x0001) != 0)
 9251 :       //^0B36:0B4B
 9252 :       bp08 = 0;
 9253 :     //^0B36:0B50
 9254 :     bp08 += si;
 9255 :     //^0B36:0B53
 9256 :     si = READ_I16(bp04,-2);
 9257 :     //^0B36:0B5A
 9258 :     di = ref->rc36.cy +bp0a;
 9259 :     //^0B36:0B66
 9260 :     if (si > di && (ref->w50 & 0x0002) != 0) {
 9261 :       //^0B36:0B72
 9262 :       si -= di;
 9263 :     }
 9264 :     else {
 9265 :       //^0B36:0B76
 9266 :       si = 0;
 9267 :     }
 9268 :     //^0B36:0B78
 9269 :     if ((ref->w50 & 0x0002) == 0)
 9270 :       //^0B36:0B83
 9271 :       bp0a = 0;
 9272 :     //^0B36:0B88
 9273 :     bp0a += si;
 9274 :     //^0B36:0B8B
 9275 :     U16 bp0c;
 9276 :     if (ref->pb44 == _4976_4964) {
 9277 :       //^0B36:0BA2
 9278 :       si = _4976_00f0;
 9279 :       di = _4976_00f2;
 9280 :       //^0B36:0BAA
 9281 :       bp0c = 8;
 9282 :     }
 9283 :     else {
 9284 :       //^0B36:0BB1
 9285 :       si = READ_I16(ref->pb44,-4);
 9286 :       //^0B36:0BBC
 9287 :       di = READ_I16(ref->pb44,-2);
 9288 :       //^0B36:0BC7
 9289 :       bp0c = READ_I16(ref->pb44,-6);
 9290 :     }
 9291 :     //^0B36:0BD5
 9292 :     if (ref->w48 != 0xfffe) {
 9293 :       //^0B36:0BDF
 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 :     //^0B36:0C3D
 9310 :     ref->w32 = bp08;
 9311 :     ref->w34 = bp0a;
 9312 :     //^0B36:0C4E
 9313 :     return;
 9314 :   }
 9315 : 
 9316 :   //^0B36:1688
 9317 :   void _0b36_1688(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit16u ww, i16 colorkey)
 9318 :   {
 9319 :     //^0B36:1688
 9320 :     ENTER(314);
 9321 :     //^0B36:168C
 9322 :     skxxx4 bp013a;
 9323 :     _0b36_0520(&bp013a, cls1, cls2, cls4);
 9324 :     //^0B36:16A5
 9325 :     bp013a.w48 = colorkey;
 9326 :     bp013a.w24 = ww;
 9327 :     //^0B36:16B3
 9328 :     bp013a.pb44 = _4976_4c16;
 9329 :     //^0B36:16C2
 9330 :     bp013a.w28 = 0;
 9331 :     bp013a.w30 = 0;
 9332 :     //^0B36:16CE
 9333 :     _0b36_0a3f(_0b36_06d3(&bp013a));
 9334 :     //^0B36:16E2
 9335 :     return;
 9336 :   }
 9337 : 
 9338 :   //^2E62:064A
 9339 :   void _2e62_064a(Bit8u cls4, Bit16u yy, Bit16u zz)
 9340 :   {
 9341 :     //^2E62:064A
 9342 :     ENTER(0);
 9343 :     //^2E62:064D
 9344 :     if ((_4976_581a & zz) != 0)
 9345 :       //^2E62:0656
 9346 :       cls4++;
 9347 :     //^2E62:0659
 9348 :     _0b36_1688(0x07, 0x00, cls4, yy,-1);
 9349 :     //^2E62:066E
 9350 :     return;
 9351 :   }
 9352 : 
 9353 :   //^2E62:00A3
 9354 :   void _2e62_00a3(Bit16u player, Bit16u xx)
 9355 :   {
 9356 :     //^2E62:00A3
 9357 :     ENTER(2);
 9358 :     //^2E62:00A8
 9359 :     U16 si = player;
 9360 :     //^2E62:00AB
 9361 :     if (_4976_3ff0.w0 != 0xffff)
 9362 :       //^2E62:00B0
 9363 :       return;
 9364 :     //^2E62:00B2
 9365 :     Bit8u bp01 = (_4976_53b4[si].curHP() == 0) ? 1 : (((si +1) == _4976_52be) ? 9 : 0);
 9366 :     //^2E62:00DB
 9367 :     _0b36_0c52(&_4976_3ff0, si +161, xx);
 9368 :     //^2E62:00F0
 9369 :     DRAW_ICON_PICT_ENTRY(
 9370 :       0x01,
 9371 :       0x02,
 9372 :       bp01,
 9373 :       &_4976_3ff0,
 9374 :       si +161,
 9375 :       -1
 9376 :       );
 9377 :     //^2E62:010C
 9378 :     if (xx == 0)
 9379 :       //^2E62:0112
 9380 :       _4976_3ff0.w10 = 0;
 9381 :     //^2E62:0118
 9382 :     return;
 9383 :   }
 9384 : 
 9385 :   //^2E62:061D
 9386 :   void _2e62_061d(Bit16u player)
 9387 :   {
 9388 :     //^2E62:061D
 9389 :     ENTER(0);
 9390 :     //^2E62:0620
 9391 :     DRAW_ICON_PICT_ENTRY(
 9392 :       0x16,
 9393 :       _4976_53b4[player].HeroType(),
 9394 :       0x00,
 9395 :             &_4976_3ff0,
 9396 :       player +173,
 9397 :       -1
 9398 :       );
 9399 :     //^2E62:0648
 9400 :     return;
 9401 :   }
 9402 : 
 9403 :   //^2E62:011B
 9404 :   void _2e62_011b(U16 player)
 9405 :   {
 9406 :     //^2E62:011B
 9407 :     ENTER(32);
 9408 :     //^2E62:0121
 9409 :     SRECT bp0c;
 9410 :     _0b36_0d67(
 9411 :       &_4976_3ff0,
 9412 :       QUERY_EXPANDED_RECT(player +185, &bp0c)
 9413 :       );
 9414 :     //^2E62:0143
 9415 :     sk53b4 *bp04 = &_4976_53b4[player];
 9416 :     //^2E62:0154
 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 :     //^2E62:018C
 9425 :     U16 di = player +193;
 9426 :     //^2E62:0194
 9427 :     for (i16 si = 0; si < 3; si++, di += 4) {
 9428 :       //^2E62:0199
 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 :           //^2E62:01F2
 9439 :           SRECT bp14;
 9440 :           COPY_MEMORY(&bp0c, &bp14, 8);
 9441 :           //^2E62:0208
 9442 :           bp14.x += _4976_0114;
 9443 :           bp14.y += _4976_0116;
 9444 :           //^2E62:0214
 9445 :           _0b36_0ffe(
 9446 :             &_4976_3ff0,
 9447 :             &bp14,
 9448 :             _4976_4bda[0]
 9449 :           );
 9450 :           //^2E62:022F
 9451 :           _0b36_0ffe(
 9452 :             &_4976_3ff0,
 9453 :             &bp0c,
 9454 :             _4976_4bda[_4976_3fec[player]]
 9455 :             );
 9456 :         }
 9457 :       }
 9458 :       //^2E62:0255
 9459 :     }
 9460 :     //^2E62:0261
 9461 :     return;
 9462 :   }
 9463 : 
 9464 :   //^2E62:0572
 9465 :   void _2e62_0572(Bit16u player)
 9466 :   {
 9467 :     //^2E62:0572
 9468 :     ENTER(0);
 9469 :     //^2E62:0576
 9470 :     U16 si = player;
 9471 :     //^2E62:0579
 9472 :     DRAW_ICON_PICT_ENTRY(
 9473 :       0x01,
 9474 :       0x02,
 9475 :       0x03,
 9476 :       &_4976_3ff0,
 9477 :       si +177,
 9478 :       10
 9479 :       );
 9480 :     //^2E62:0593
 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 :     //^2E62:05D1
 9489 :     return;
 9490 :   }
 9491 : 
 9492 :   //^2E62:02EA
 9493 :   void _2e62_02ea(U16 xx, i16 aa, i16 bb)
 9494 :   {
 9495 :     //^2E62:02EA
 9496 :     ENTER(8);
 9497 :     //^2E62:02EE
 9498 :     U8 bp08[8];
 9499 :     SK_STRCPY(bp08, _2e62_0265(aa, 1, 3));
 9500 :     //^2E62:030B
 9501 :     SK_STRCAT(bp08, _4976_4024);
 9502 :     //^2E62:031C
 9503 :     SK_STRCAT(bp08, _2e62_0265(bb, 1, 3));
 9504 :     //^2E62:0339
 9505 :     _3929_0c37(xx, _4976_4bda[13], _4976_4bda[1] | 0x4000, bp08);
 9506 :     //^2E62:035E
 9507 :     return;
 9508 :   }
 9509 : 
 9510 :   //^2E62:0360
 9511 :   void _2e62_0360(sk53b4 *ref)
 9512 :   {
 9513 :     //^2E62:0360
 9514 :     ENTER(0);
 9515 :     //^2E62:0363
 9516 :     _2e62_02ea(550, ref->curHP(), ref->maxHP());
 9517 :     //^2E62:0378
 9518 :     _2e62_02ea(
 9519 :       551,
 9520 :       ref->curStamina() / 10,
 9521 :       ref->maxStamina() / 10
 9522 :       );
 9523 :     //^2E62:039E
 9524 :     _2e62_02ea(
 9525 :       552,
 9526 :       ref->curMP(),
 9527 :       ref->maxMP()
 9528 :       );
 9529 :     //^2E62:03B3
 9530 :     return;
 9531 :   }
 9532 : 
 9533 :   //^2405:00EC
 9534 :   void _2405_00ec(U16 rectno, SRECT *rc)
 9535 :   {
 9536 :     //^2405:00EC
 9537 :     ENTER(4);
 9538 :     //^2405:00F0
 9539 :     i16 bp02 = _4976_0106;
 9540 :     i16 bp04 = _4976_0108;
 9541 :     //^2405:00FC
 9542 :     QUERY_BLIT_RECT(
 9543 :       NULL,
 9544 :       rc,
 9545 :       rectno,
 9546 :       &bp02,
 9547 :       &bp04,
 9548 :       -1
 9549 :       );
 9550 :     //^2405:011D
 9551 :     return;
 9552 :   }
 9553 : 
 9554 :   //^2405:011F
 9555 :   void _2405_011f(U16 rectno, SRECT *rc)
 9556 :   {
 9557 :     //^2405:011F
 9558 :     ENTER(0);
 9559 :     //^2405:0122
 9560 :     _2405_00ec(rectno, rc);
 9561 :     //^2405:0132
 9562 :     INFLATE_RECT(rc, _4976_0112, _4976_0112);
 9563 :     //^2405:0148
 9564 :     return;
 9565 :   }
 9566 : 
 9567 :   //^2E62:05D4
 9568 :   void _2e62_05d4(Bit8u cls4, Bit16u rectno)
 9569 :   {
 9570 :     //^2E62:05D4
 9571 :     ENTER(8);
 9572 :     //^2E62:05D8
 9573 :     SRECT bp08;
 9574 :     _2405_011f(rectno, &bp08);
 9575 :     //^2E62:05E8
 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 :     //^2E62:061B
 9583 :     return;
 9584 :   }
 9585 : 
 9586 :   //^
 9587 :   void _24a5_105b(Bit16u xx); // TODO: Unreachable
 9588 : 
 9589 :   //^24A5:0E82
 9590 :   void _24a5_0e82(i16 xx, U16 yy, U16 zz, i16 vv, U16 ww)
 9591 :   {
 9592 :     //^24A5:0E82
 9593 :     ENTER(24);
 9594 :     //^24A5:0E88
 9595 :     i16 di = xx;
 9596 :     //^24A5:0E8B
 9597 :     i16 si = (di < -512) ? 8 : ((di < 0) ? 11 : zz);
 9598 :     //^24A5:0EA2
 9599 :     di -= vv;
 9600 :     //^24A5:0EA5
 9601 :     SRECT bp08;
 9602 :     if (SCALE_RECT(
 9603 :       yy,
 9604 :       &bp08,
 9605 :       (i32(10000) * di) / (2048 - vv),
 9606 :       10000
 9607 :       ) != NULL
 9608 :     ) {
 9609 :       //^24A5:0EE1
 9610 :       SRECT bp18;
 9611 :       SRECT bp10;
 9612 :       if (ww != 0) {
 9613 :         //^24A5:0EE7
 9614 :         QUERY_EXPANDED_RECT(yy, &bp10);
 9615 :         //^24A5:0EF7
 9616 :         COPY_MEMORY(&bp10, &bp18, 8);
 9617 :         //^24A5:0F0D
 9618 :         if ((bp08.x +bp08.cx -1) == (bp10.x +bp10.cx -1)) {
 9619 :           //^24A5:0F1F
 9620 :           ww = 0;
 9621 :         }
 9622 :         else {
 9623 :           //^24A5:0F26
 9624 :           bp10.cx = (bp10.x +bp10.cx -1) -(bp08.x +bp08.cx -1);
 9625 :           //^24A5:0F39
 9626 :           bp10.x = bp08.x +bp08.cx +0;
 9627 :         }
 9628 :       }
 9629 :       else {
 9630 :         //^24A5:0F47
 9631 :         COPY_MEMORY(&bp08, &bp18, 8);
 9632 :       }
 9633 :       //^24A5:0F5D
 9634 :       bp18.x += _4976_0142;
 9635 :       bp18.y += _4976_0142;
 9636 :       //^24A5:0F66
 9637 :       FIRE_FILL_BACKBUFF_RECT(&bp18, _4976_4bda[0]);
 9638 :       //^24A5:0F7D
 9639 :       FIRE_FILL_BACKBUFF_RECT(&bp08, _4976_4bda[si]);
 9640 :       //^24A5:0F94
 9641 :       if (ww != 0) {
 9642 :         //^24A5:0F9A
 9643 :         FIRE_FILL_BACKBUFF_RECT(&bp10, _4976_4bda[ww]);
 9644 :       }
 9645 :     }
 9646 :     //^24A5:0FB4
 9647 :     return;
 9648 :   }
 9649 : 
 9650 :   //^24A5:0FB8
 9651 :   void _24a5_0fb8()
 9652 :   {
 9653 :     //^24A5:0FB8
 9654 :     ENTER(4);
 9655 :     //^24A5:0FBC
 9656 :     sk53b4 *bp04 = &_4976_52af[_4976_52be];
 9657 :     //^24A5:0FCD
 9658 :     _4976_3d2e = 1;
 9659 :     //^24A5:0FD3
 9660 :     _0b36_1688(0x07, 0x00, 0x01, 0x01ee, -1);
 9661 :     //^24A5:0FE6
 9662 :     _24a5_0e82(bp04->curFood(), 496, 5, -1024, 0);
 9663 :     //^24A5:0FFE
 9664 :     _24a5_0e82(bp04->curWater(), 497, 14, -1024, 0);
 9665 :     //^24A5:1016
 9666 :     _0b36_1688(0x07, 0x00, 0x06, 500, 12);
 9667 :     //^24A5:1029
 9668 :     _0b36_1688(0x07, 0x00, 0x07, 501, 12);
 9669 :     //^24A5:103C
 9670 :     if (bp04->b31 != 0) {
 9671 :       //^24A5:1046
 9672 :       _0b36_1688(0x07, 0x00, 0x08, 502, 12);
 9673 :     }
 9674 :     //^24A5:1059
 9675 :     return;
 9676 :   }
 9677 : 
 9678 :   //^24A5:000F
 9679 :   void _24a5_000f(U8 *ref)
 9680 :   {
 9681 :     //^24A5:000F
 9682 :     ENTER(136);
 9683 :     //^24A5:0014
 9684 :     if (*ref == 12) {
 9685 :       //^24A5:001D
 9686 :       ref++;
 9687 :       //^24A5:0020
 9688 :       QUERY_TOPLEFT_OF_RECT(556, &_4976_52d8, &_4976_52da);
 9689 :     }
 9690 :     //^24A5:0033
 9691 :     if (*ref == 0)
 9692 :       //^24A5:003C
 9693 :       return;
 9694 :     //^24A5:003F
 9695 :     if (QUERY_MBCS_PRESENCE(ref) != 0) {
 9696 :       //^24A5:0050
 9697 :       DRAW_GAMELOAD_STR(_4976_52d8, _4976_52da, _4976_4bda[13], ref);
 9698 :       //^24A5:0071
 9699 :       _4976_52da += _4976_013a;
 9700 :       //^24A5:0078
 9701 :       return;
 9702 :     }
 9703 :     //^24A5:007B
 9704 :     U8 bp0088[128];
 9705 :     SK_STRCPY(bp0088, ref);
 9706 :     //^24A5:008F
 9707 :     U8 *bp04 = bp0088;
 9708 :     //^24A5:0099
 9709 :     for (i16 si = 0; *bp04 != 0; ) {
 9710 :       //^24A5:009E
 9711 :       U8 *bp08;
 9712 :       if (SK_STRLEN(bp04) > 18) {
 9713 :         //^24A5:00B0
 9714 :         bp08 = bp04 +17;
 9715 :         //^24A5:00BF
 9716 :         while (*bp08 != ' ') bp08--;
 9717 :         //^24A5:00CD
 9718 :         *bp08 = 0;
 9719 :         //^24A5:00D1
 9720 :         si = 1;
 9721 :       }
 9722 :       else {
 9723 :         //^24A5:00D6
 9724 :         bp08 = NULL;
 9725 :       }
 9726 :       //^24A5:00E0
 9727 :       DRAW_GAMELOAD_STR(_4976_52d8, _4976_52da, _4976_4bda[13], bp04);
 9728 :       //^24A5:0101
 9729 :       _4976_52da += _4976_0128;
 9730 :       //^24A5:0108
 9731 :       if (si != 0 && bp08 != NULL) {
 9732 :         //^24A5:0114
 9733 :         si = 0;
 9734 :         //^24A5:0116
 9735 :         bp08++;
 9736 :         //^24A5:0119
 9737 :         bp04 = bp08;
 9738 :       }
 9739 :       else {
 9740 :         //^24A5:0127
 9741 :         *bp04 = 0;
 9742 :       }
 9743 :       //^24A5:012E
 9744 :     }
 9745 :     //^24A5:013A
 9746 :     return;
 9747 :   }
 9748 : 
 9749 :   //^
 9750 :   void _24a5_07f6(ObjectID recordLink); // TODO: Unreachable
 9751 : 
 9752 :   //^2405:0029
 9753 :   U8 *_2405_0029(U8 cls1, U8 cls2)
 9754 :   {
 9755 :     //^2405:0029
 9756 :     ENTER(34);
 9757 :     //^2405:002D
 9758 :     U8 bp22[30];
 9759 :     U8 *bp04 = QUERY_GDAT_TEXT(cls1, cls2, 0x18, bp22);
 9760 :     //^2405:004A
 9761 :     return FORMAT_SKSTR(bp04, _4976_5290);
 9762 :   }
 9763 : 
 9764 :   //^2405:005E
 9765 :   U8 *_2405_005e(ObjectID recordLink)
 9766 :   {
 9767 :     //^2405:005E
 9768 :     ENTER(6);
 9769 :     //^2405:0064
 9770 :     ObjectID di = recordLink;
 9771 :     //^2405:0067
 9772 :     U8 bp01 = QUERY_CLS1_FROM_RECORD(di);
 9773 :     //^2405:0071
 9774 :     U8 bp02 = QUERY_CLS2_FROM_RECORD(di);
 9775 :     //^2405:007B
 9776 :     _4976_52e6 = 0xffff;
 9777 :     //^2405:0081
 9778 :     if (bp01 == 0x15 && bp02 == 0x00) {
 9779 :       //^2405:008D
 9780 :       Miscellaneous_item *bp06 = GET_ADDRESS_OF_RECORDA(di);
 9781 :       //^2405:009A
 9782 :       i16 si = bp06->Who();
 9783 :       //^2405:00A9
 9784 :       if (si >= 0 && si < _4976_4c3c) {
 9785 :         //^2405:00B3
 9786 :         _4976_52e6 = si;
 9787 :       }
 9788 :     }
 9789 :     //^2405:00B7
 9790 :     return _2405_0029(bp01, bp02);
 9791 :   }
 9792 : 
 9793 :   //^2405:02E8
 9794 :   void _2405_02e8(ObjectID recordLink, i16 xx, U16 yy, U16 zz, U16 ww)
 9795 :   {
 9796 :     //^2405:02E8
 9797 :     ENTER(20);
 9798 :     //^2405:02EE
 9799 :     i16 si = xx;
 9800 :     //^2405:02F1
 9801 :     U8 bp0b;
 9802 :     U8 bp0c;
 9803 :     U8 bp09;
 9804 :     if (recordLink == ObjectID::FFFF) {
 9805 :       //^2405:02F7
 9806 :       bp0b = 7;
 9807 :       bp0c = 0;
 9808 :       //^2405:02FF
 9809 :       bp09 = _4976_3b74[si].b2 +U8(yy);
 9810 :     }
 9811 :     else {
 9812 :       //^2405:030D
 9813 :       bp0b = QUERY_CLS1_FROM_RECORD(recordLink);
 9814 :       bp0c = QUERY_CLS2_FROM_RECORD(recordLink);
 9815 :       //^2405:0325
 9816 :       bp09 = (si < 8)
 9817 :         ? _2405_014a(recordLink, si & 1, 1)
 9818 :         : _2405_014a(recordLink, si -8, 1);
 9819 :     }
 9820 :     //^2405:0348
 9821 :     U16 di = _4976_3b74[si].w0;
 9822 :     //^2405:0351
 9823 :     if (si < 0x26) {
 9824 :       //^2405:0359
 9825 :       SRECT bp14;
 9826 :       QUERY_EXPANDED_RECT(di, &bp14);
 9827 :       //^2405:0367
 9828 :       U8 *bp04;
 9829 :       if (si < 8) {
 9830 :         //^2405:036C
 9831 :         bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x02, 0x00);
 9832 :         //^2405:0380
 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 :         //^2405:03BD
 9846 :         bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x07, 0x00, 0x00);
 9847 :         //^2405:03D1
 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 :     //^2405:0404
 9860 :     if (ww != 0 && si < 14) {
 9861 :       //^2405:0415
 9862 :       SRECT bp14;
 9863 :       _2405_011f(di, &bp14);
 9864 :       //^2405:0422
 9865 :       U8 bp0a = (zz != 0)
 9866 :         ? 6
 9867 :         : (yy != 0)
 9868 :           ? 5
 9869 :           : 4;
 9870 :       //^2405:043E
 9871 :       U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x02, bp0a);
 9872 :       //^2405:0454
 9873 :       U8 *bp08 = QUERY_GDAT_IMAGE_LOCALPAL(0x01, 0x02, bp0a);
 9874 :       //^2405:046A
 9875 :       if (si < 8) {
 9876 :         //^2405:046F
 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 :       //^2405:0496
 9889 :       DRAW_DIALOGUE_PARTS_PICT(
 9890 :         bp04,
 9891 :         &bp14,
 9892 :         12,
 9893 :         bp08
 9894 :         );
 9895 :     }
 9896 :     //^2405:04B1
 9897 :     if (bp09 == 0xff)
 9898 :       //^2405:04B5
 9899 :       return;
 9900 :     //^2405:04B7
 9901 :     if (si < 8) {
 9902 :       //^2405:04BC
 9903 :       DRAW_ICON_PICT_ENTRY(
 9904 :         bp0b,
 9905 :         bp0c,
 9906 :         bp09,
 9907 :         &_4976_3ff0,
 9908 :         di,
 9909 :         12
 9910 :         );
 9911 :     }
 9912 :     else {
 9913 :       //^2405:04D9
 9914 :       _0b36_1688(
 9915 :         bp0b,
 9916 :         bp0c,
 9917 :         bp09,
 9918 :         di,
 9919 :         12
 9920 :         );
 9921 :     }
 9922 :     //^2405:04F0
 9923 :     return;
 9924 :   }
 9925 : 
 9926 :   //^24A5:0AD2
 9927 :   void _24a5_0ad2(Container *ref)
 9928 :   {
 9929 :     //^24A5:0AD2
 9930 :     ENTER(0);
 9931 :     //^24A5:0AD7
 9932 :     U16 si = 0;
 9933 :     //^24A5:0AD9
 9934 :     //^24A5:0AE0
 9935 :     for (ObjectID di = ref->GetContainedObject(); di != di.FFFE; di = GET_NEXT_RECORD_LINK(di), si++) {
 9936 :       //^24A5:0AE2
 9937 :       if (si >= 8)
 9938 :         //^24A5:0AE5
 9939 :         break;
 9940 :       //^24A5:0AE7
 9941 :       _2405_02e8(di, si +47, 0, 0, 0);
 9942 :       //^24A5:0AFC
 9943 :     }
 9944 :     //^24A5:0B0B
 9945 :     return;
 9946 :   }
 9947 : 
 9948 :   //^0CEE:2773
 9949 :   U16 IS_MISCITEM_CURRENCY(ObjectID rl)
 9950 :   {
 9951 :     //^0CEE:2773
 9952 :     ENTER(0);
 9953 :     //^0CEE:2776
 9954 :     if (true
 9955 :       && rl.DBType() == dbMiscellaneous_item
 9956 :       && (QUERY_GDAT_DBSPEC_WORD_VALUE(rl, 0x00) & 0x4000) != 0
 9957 :     ) {
 9958 :       //^0CEE:2794
 9959 :       return 1;
 9960 :     }
 9961 :     //^0CEE:2799
 9962 :     return 0;
 9963 :   }
 9964 : 
 9965 :   //^0CEE:279D
 9966 :   void _0cee_279d(ObjectID rl, i16 *xx)
 9967 :   {
 9968 :     //^0CEE:279D
 9969 :     ENTER(2);
 9970 :     //^0CEE:27A3
 9971 :     ZERO_MEMORY(xx, 20);
 9972 :     //^0CEE:27B5
 9973 :     for (ObjectID si = GET_ADDRESS_OF_RECORD9(rl)->GetContainedObject(); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
 9974 :       //^0CEE:27C7
 9975 :       if (IS_MISCITEM_CURRENCY(si) == 0)
 9976 :         //^0CEE:27CF
 9977 :         continue;
 9978 :       //^0CEE:27D1
 9979 :       U16 bp02 = GET_DISTINCTIVE_ITEMTYPE(si);
 9980 :       //^0CEE:27DA
 9981 :       for (i16 di = 0; di < _4976_4c76; di++) {
 9982 :         //^0CEE:27DE
 9983 :         if (_4976_4c94[di] == bp02) {
 9984 :           //^0CEE:27EB
 9985 :           xx[di] += GET_ADDRESS_OF_RECORDA(si)->Charge() +1;
 9986 :         }
 9987 :         //^0CEE:2809
 9988 :       }
 9989 :       //^0CEE:2810
 9990 :     }
 9991 :     //^0CEE:281D
 9992 :     return;
 9993 :   }
 9994 : 
 9995 :   //^48AE:04B7
 9996 :   i16 _48ae_04b7(ObjectID rl, i16 xx)
 9997 :   {
 9998 :     //^48AE:04B7
 9999 :     ENTER(142);
10000 :     //^48AE:04BD
10001 :     U8 bp008e[128];
10002 :     U8 *bp0e = QUERY_GDAT_TEXT(0x14, QUERY_CLS2_FROM_RECORD(rl), 0x40, bp008e);
10003 :         //^48AE:04E3
10004 :     if (*bp0e == 0)
10005 :       //^48AE:04E9
10006 :       //^48AE:05A7
10007 :       return -1;
10008 :     //^48AE:04EC
10009 :     U16 bp02 = 0;
10010 :     U16 di = 0;
10011 :     U16 bp08 = 0;
10012 :     //^48AE:04F6
10013 :     i16 si = -1;
10014 :     i16 bp04 = -1;
10015 : 
10016 :     while (bp02 == 0) {
10017 :       //^48AE:04F9
10018 :       U8 bp09 = *(bp0e++);
10019 :       //^48AE:0505
10020 :       if (bp09 >= '0' && bp09 <= '9') {
10021 :         //^48AE:050F
10022 :         di = di * 10 +bp09 -'0';
10023 :         //^48AE:0522
10024 :         continue;
10025 :       }
10026 :       //^48AE:0524
10027 :       switch (bp09) {
10028 :         case 0x4a:
10029 :           {
10030 :             //^48AE:0539
10031 :             if (di != 0) {
10032 :               //^48AE:053D
10033 :               bp0e--;
10034 :               //^48AE:0540
10035 :               break;
10036 :             }
10037 :                         //^48AE:0542
10038 :             bp04 = 256;
10039 :             //^48AE:0547
10040 :             continue;
10041 :           }
10042 :         case 0x2d:
10043 :           {
10044 :             //^48AE:0549
10045 :             si = di;
10046 :             di = 0;
10047 :             //^48AE:054D
10048 :             continue;
10049 :           }
10050 :         case 0x00:
10051 :           {
10052 :             //^48AE:054F
10053 :             bp02 = 1;
10054 : 
10055 :             break;
10056 :           }
10057 :       }
10058 :       //^48AE:0554
10059 :       if (si < 0)
10060 :         si = di;
10061 :       //^48AE:055A
10062 :       for (; si <= di; bp08++, si++) {
10063 :         //^48AE:055C
10064 :         if (bp08 == xx) {
10065 :           //^48AE:0564
10066 :           for (i16 bp06 = 0; bp06 < _4976_4c76; bp06++) {
10067 :             //^48AE:056B
10068 :             if (_4976_4c94[bp06] == si +bp04) {
10069 :               //^48AE:057B
10070 :               return bp06;
10071 :             }
10072 :             //^48AE:0580
10073 :           }
10074 :         }
10075 :         //^48AE:058C
10076 :       }
10077 :       //^48AE:0594
10078 :       di = 0;
10079 :       //^48AE:0596
10080 :       si = bp04 = -1;
10081 :       //^48AE:059E
10082 :     }
10083 :     //^48AE:05A7
10084 :     return -1;
10085 :   }
10086 : 
10087 :   //^0CAF:014D
10088 :   U8 *SK_LTOA10(i32 value, U8 *str)
10089 :   {
10090 :     //^0CAF:014D
10091 :     ENTER(22);
10092 :     //^0CAF:0151
10093 :     i32 bp08 = value;
10094 :     //^0CAF:015D
10095 :     if (bp08 < 0) {
10096 :       //^0CAF:0167
10097 :       bp08 = -bp08;
10098 :     }
10099 :     //^0CAF:017A
10100 :     U8 bp16[14];
10101 :     U8 *bp04 = &bp16[13];
10102 :     //^0CAF:0183
10103 :     bp04[0] = 0;
10104 : 
10105 :     do {
10106 :       //^0CAF:018A
10107 :       bp04--;
10108 :       //^0CAF:018D
10109 :       *bp04 = (bp08 % 10) + '0';
10110 :       //^0CAF:01A4
10111 :       bp08 = bp08 / 10;
10112 :       //^0CAF:01B9
10113 :     } while (bp08 != 0);
10114 :     //^0CAF:01BD
10115 :     if (value < 0) {
10116 :       //^0CAF:01CB
10117 :       *(--bp04) = '-';
10118 :     }
10119 :     //^0CAF:01D5
10120 :     return SK_STRCPY(str, bp04);
10121 :   }
10122 : 
10123 :   //^24A5:0A06
10124 :   void _24a5_0a06(ObjectID recordLink)
10125 :   {
10126 :     //^24A5:0A06
10127 :     ENTER(36);
10128 :     //^24A5:0A0C
10129 :     i32 bp06 = 0;
10130 :     //^24A5:0A16
10131 :     i16 bp24[10];
10132 :     _0cee_279d(recordLink, bp24);
10133 :     //^24A5:0A26
10134 :     U16 bp02 = 618;
10135 :     //^24A5:0A2B
10136 :     U8 bp10[10];
10137 :     for (i16 si = 0; si < 10; si++) {
10138 :       //^24A5:0A2F
10139 :       i16 di = _48ae_04b7(recordLink, si);
10140 :       //^24A5:0A3C
10141 :       if (di >= 0) {
10142 :         //^24A5:0A40
10143 :         bp06 += bp24[di] * _4976_4c80[di];
10144 :         //^24A5:0A65
10145 :         _3929_0bd7(
10146 :           bp02++,
10147 :           _4976_4bda[13],
10148 :           SK_LTOA10(bp24[di], bp10)
10149 :           );
10150 :       }
10151 :       //^24A5:0A9D
10152 :     }
10153 :     //^24A5:0AA3
10154 :     _3929_0bd7(
10155 :       569,
10156 :       _4976_4bda[13],
10157 :       SK_LTOA10(bp06, bp10)
10158 :       );
10159 :     //^24A5:0ACE
10160 :     return;
10161 :   }
10162 : 
10163 :   //^2759:0155
10164 :   U16 _2759_0155(ObjectID rl)
10165 :   {
10166 :     //^2759:0155
10167 :     ENTER(4);
10168 :     //^2759:015A
10169 :     ObjectID si = rl;
10170 :     //^2759:015D
10171 :     if (si == si.FFFF) {
10172 :       //^2759:0160
10173 :       //^2759:01DE
10174 :       return 0;
10175 :     }
10176 :     //^2759:0162
10177 :     U8 bp01 = QUERY_CLS1_FROM_RECORD(si);
10178 :     U8 bp02 = QUERY_CLS2_FROM_RECORD(si);
10179 :     U8 bp03 = 0x08;
10180 :     //^2759:017A
10181 :     for (; bp03 < 12; bp03++) {
10182 :       //^2759:017C
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 :         //^2759:01D0
10194 :         return 1;
10195 :       }
10196 :       //^2759:01D5
10197 :     }
10198 :     //^2759:01DE
10199 :     return 0;
10200 :   }
10201 : 
10202 :   //^24A5:0B0F
10203 :   void _24a5_0b0f(U16 rectno, i16 curVal, i16 maxVal, U8 chr, U16 zz)
10204 :   {
10205 :     //^24A5:0B0F
10206 :     ENTER(10);
10207 :     //^24A5:0B14
10208 :     i16 si = curVal;
10209 :     //^24A5:0B17
10210 :     SRECT bp08;
10211 :     if (QUERY_EXPANDED_RECT(rectno, &bp08) == 0)
10212 :       //^24A5:0B2B
10213 :       //^24A5:0C32
10214 :       return;
10215 :     //^24A5:0B2E
10216 :     si = (i32(si) << 11) / maxVal;
10217 :     //^24A5:0B47
10218 :     _24a5_0e82(si, rectno, zz, 0, 1);
10219 :     //^24A5:0B5A
10220 :     U8 bp0a[2];
10221 :     bp0a[1] = 0;
10222 :     bp0a[0] = chr;
10223 :     //^24A5:0B64
10224 :     bp08.cy -= 2;
10225 :     //^24A5:0B68
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 :     //^24A5:0BA8
10237 :     bp0a[0] = 0x60;
10238 :     //^24A5:0BAC
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 :     //^24A5:0BEA
10250 :     bp0a[0] = 0x65;
10251 :     //^24A5:0BEE
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 :     //^24A5:0C32
10263 :     return;
10264 :   }
10265 : 
10266 :   //^24A5:0C35
10267 :   U16 _24a5_0c35(ObjectID recordLink, Bit16u xx)
10268 :   {
10269 :     //^24A5:0C35
10270 :     ENTER(148);
10271 :     //^24A5:0C3B
10272 :     ObjectID si = recordLink;
10273 :     //^24A5:0C3E
10274 :     sk3d79 bp0e = _4976_3d79;
10275 :     //^24A5:0C4F
10276 :     if (si == si.FFFF)
10277 :       //^24A5:0C54
10278 :       return 0;
10279 :     //^24A5:0C59
10280 :     GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(si);
10281 :     //^24A5:0C66
10282 :     _24a5_000f(&_4976_3d7d);
10283 :     //^24A5:0C70
10284 :     U16 bp08 = si.DBType();
10285 :     //^24A5:0C7B
10286 :     if (bp08 == dbScroll) {
10287 :       //^24A5:0C80
10288 :       _24a5_07f6(si);
10289 :       //^24A5:0C86
10290 :       //^24A5:0E7B
10291 :       return 1;
10292 :     }
10293 :     //^24A5:0C89
10294 :     _4976_3d2e = 3;
10295 :     //^24A5:0C8F
10296 :     if (xx == 0) {
10297 :       //^24A5:0C95
10298 :       //^24A5:0C54
10299 :       return 0;
10300 :     }
10301 :     //^24A5:0C97
10302 :     _0b36_1688(0x07, 0x00, 0x01, 0x01ee, -1);
10303 :     //^24A5:0CAA
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 :       //^24A5:0CD0
10314 :       _0b36_1688(bp09, bp0a, 0x11, 0x01ee, 12);
10315 :     }
10316 :     //^24A5:0CE7
10317 :     _0b36_1688(0x07, 0x00, 0x05, 0x01f8, 12);
10318 :     //^24A5:0CFA
10319 :     _3929_0bd7(0x1fa, _4976_4bda[13], _2405_005e(si));
10320 :     //^24A5:0D19
10321 :     _2405_02e8(si, 0x2e, 0, 0, 0);
10322 :     //^24A5:0D2A
10323 :     U16 bp06 = QUERY_ITEM_WEIGHT(si);
10324 :     //^24A5:0D34
10325 :     _4976_52e8 = bp06 / 10;
10326 :     //^24A5:0D3E
10327 :     _4976_52dc = bp06 % 10;
10328 :     //^24A5:0D49
10329 :     U8 bp0094[128];
10330 :         _24a5_000f(QUERY_GDAT_TEXT(0x07, 0x00, 0x1f, bp0094));      
10331 :     //^24A5:0D65
10332 :     if (bp08 == dbContainer) {
10333 :       //^24A5:0D6B
10334 :       if (IS_CONTAINER_CHEST(si) != 0) {
10335 :         //^24A5:0D76
10336 :         _24a5_0ad2(_bp04->castToContainer());
10337 :         //^24A5:0D82
10338 :         //^24A5:0E7B
10339 :         return 1;
10340 :       }
10341 :       //^24A5:0D85
10342 :       if (IS_CONTAINER_MONEYBOX(si) == 0) {
10343 :         //^24A5:0D90
10344 :         //^24A5:0E7B
10345 :         return 1;
10346 :       }
10347 :       //^24A5:0D93
10348 :       _24a5_0a06(si);
10349 :       //^24A5:0D99
10350 :       return 1;
10351 :     }
10352 :     //^24A5:0D9C
10353 :     U16 bp10 = 0;
10354 :     //^24A5:0DA1
10355 :     if (_2759_0155(si) != 0) {
10356 :       //^24A5:0DAC
10357 :       i16 di = ADD_ITEM_CHARGE(si, 0);
10358 :       //^24A5:0DB8
10359 :       if (di != 0) {
10360 :         //^24A5:0DBC
10361 :         _24a5_0b0f(
10362 :           bp0e.w0[bp10++],
10363 :           di,
10364 :           GET_MAX_CHARGE(si),
10365 :           0x71,
10366 :           4
10367 :           );
10368 :       }
10369 :     }
10370 :     //^24A5:0DE0
10371 :     U8 bp11;
10372 :     U16 bp14;
10373 :     i16 di;
10374 :     switch (si.DBType()) {
10375 :       case dbPotion: // 8
10376 :         {
10377 :           Potion *bp04 = _bp04->castToPotion();
10378 : 
10379 :           //^24A5:0DFA
10380 :           bp11 = 0x75;
10381 :           //^24A5:0DFE
10382 :           di = bp04->PotionPower();
10383 :           //^24A5:0E0A
10384 :           bp14 = 0x00ff;
10385 :           //^24A5:0E0F
10386 :           break;
10387 :         }
10388 :       case dbWeapon: // 5
10389 :         {
10390 :           //^24A5:0E11
10391 :           bp11 = 0x72;
10392 :           bp14 = 0x0050;
10393 :           //^24A5:0E1A
10394 :           di = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x08);
10395 :           //^24A5:0E26
10396 :           if (di == 0) {
10397 :             //^24A5:0E2A
10398 :             di = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x09);
10399 :             //^24A5:0E36
10400 :             bp11 = 0x73;
10401 :             bp14 = 0x0064;
10402 :           }
10403 :           //^24A5:0E3F
10404 :           break;
10405 :         }
10406 :       case dbCloth: // 6
10407 :         {
10408 :           //^24A5:0E41
10409 :           bp11 = 0x72;
10410 :           //^24A5:0E45
10411 :           di = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x0b) & 0xff;
10412 :           //^24A5:0E54
10413 :           bp14 = 0x00c8;
10414 :         }
10415 :       default:
10416 :         {
10417 :           //^24A5:0DF7
10418 :           //^24A5:0E7B
10419 :           return 1;
10420 :         }
10421 :     }
10422 :     //^24A5:0E59
10423 :     if (di != 0) {
10424 :       //^24A5:0E5D
10425 :       _24a5_0b0f(bp0e.w0[bp10], di, bp14, bp11, 5);
10426 :     }
10427 :     //^24A5:0E7B
10428 :     return 1;
10429 :   }
10430 : 
10431 :   //^2E62:03B5
10432 :   U16 _2e62_03b5(Bit16u player, Bit16u itemNo, Bit16u yy)
10433 :   {
10434 :     //^2E62:03B5
10435 :     ENTER(8);
10436 :     //^2E62:03BB
10437 :     U16 bp04 = 0;
10438 :     U16 bp06 = 0;
10439 :     //^2E62:03C5
10440 :     U16 bp08 = yy;
10441 :     //^2E62:03CB
10442 :     U16 si;
10443 :     if (player +1 != _4976_52be) {
10444 :       //^2E62:03D5
10445 :       if (itemNo > 1 || player +1 == _4976_4bfc)
10446 :         //^2E62:03E5
10447 :         //^2E62:056C
10448 :         return 0;
10449 :       //^2E62:03E8
10450 :       si = (player << 1) + itemNo;
10451 :     }
10452 :     else {
10453 :       //^2E62:03F2
10454 :       si = itemNo +8;
10455 :     }
10456 :     //^2E62:03FA
10457 :     ObjectID di = _4976_53b4[player].Possess(itemNo);
10458 :     //^2E62:040F
10459 :     if (itemNo <= 1) {
10460 :       //^2E62:0415
10461 :       if (player +1 == _4976_5366 && itemNo == _4976_5354)
10462 :         //^2E62:0428
10463 :         bp04 = 1;
10464 :       //^2E62:042D
10465 :       if ((!_4976_3b74[si].b5_0_0()) != (!bp04)) {
10466 :         //^2E62:044B
10467 :         bp08 = 1;
10468 :         //^2E62:0450
10469 :         _4976_3b74[si].b5 ^= 1;
10470 :       }
10471 : 
10472 :     }
10473 :     //^2E62:045A
10474 :     if (itemNo <= 5) {
10475 :       //^2E62:0460
10476 :       if ((_4976_53b4[player].w52 & (1 << itemNo)) != 0)
10477 :         //^2E62:0478
10478 :         bp06 = 1;
10479 :       //^2E62:047D
10480 :       if ((!_4976_3b74[si].b5_1_1()) != (!bp06)) {
10481 :         //^2E62:049B
10482 :         bp08 = 1;
10483 :         //^2E62:04A0
10484 :         _4976_3b74[si].b5 ^= 2;
10485 :       }
10486 :     }
10487 :     //^2E62:04AA
10488 :     if (di != di.FFFF) {
10489 :       //^2E62:04AF
10490 :       U8 bp01;
10491 :       if ((QUERY_GDAT_DBSPEC_WORD_VALUE(di, 0x00) & 0x8000) != 0) {
10492 :         //^2E62:04BE
10493 :         bp01 = _2405_014a(di, itemNo, 1);
10494 :       }
10495 :       else {
10496 :         //^2E62:04C2
10497 :         bp01 = _2405_014a(di, itemNo, 0);
10498 :       }
10499 :             //^2E62:04D3
10500 :       if (_4976_3b74[si].b3 != bp01) {
10501 :         //^2E62:04E1
10502 :         yy = 1;
10503 :         //^2E62:04E6
10504 :         _4976_3b74[si].b3 = bp01;
10505 :       }
10506 :       //^2E62:04F2
10507 :       U8 bp02 = QUERY_CLS2_FROM_RECORD(di);
10508 :       //^2E62:04FC
10509 :       if (bp02 != _4976_3b74[si].b4) {
10510 :         //^2E62:0507
10511 :         yy = 1;
10512 :         //^2E62:050C
10513 :         _4976_3b74[si].b4 = bp02;
10514 :       }
10515 :     }
10516 :     //^2E62:0515
10517 :     if (yy != 0 || bp08 != 0 || _4976_3b74[si].w6 != di) {
10518 :       //^2E62:052C
10519 :       if (di == 0xffff || si < 8)
10520 :         //^2E62:0536
10521 :         bp08 = 1;
10522 :       //^2E62:053B
10523 :       if (si < 8) {
10524 :         //^2E62:0540
10525 :         _2e62_00a3(player, 0);
10526 :       }
10527 :       //^2E62:054B
10528 :       _4976_3b74[si].w6 = di;
10529 :       //^2E62:0554
10530 :       _2405_02e8(di, si, bp06, bp04, bp08);
10531 :       //^2E62:0567
10532 :       return 1;
10533 :     }
10534 :     //^2E62:056C
10535 :     return 0;
10536 :   }
10537 : 
10538 :   //^3929:0C37
10539 :   void _3929_0c37(Bit16u rectno, Bit8u clr1, Bit16u clr2, Bit8u *localpal)
10540 :   {
10541 :     //^3929:0C37
10542 :     ENTER(12);
10543 :     //^3929:0C3B
10544 :     i16 bp02;
10545 :     i16 bp04;
10546 :     if (_3929_03dc(localpal, &bp02, &bp04) != 0) {
10547 :       //^3929:0C56
10548 :       SRECT bp0c;
10549 :       if (QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1) != 0) {
10550 :         //^3929:0C7A
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 :     //^3929:0CA6
10564 :     return;
10565 :   }
10566 : 
10567 :   //^2C1D:0EA2
10568 :   U16 _2c1d_0ea2(sk53b4 *ref, U16 xx, U16 yy)
10569 :   {
10570 :     //^2C1D:0EA2
10571 :     ENTER(2);
10572 :     //^2C1D:0EA8
10573 :     i16 si = ref->b72[xx][yy];
10574 :     //^2C1D:0EBD
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 :       //^2C1D:0EED
10585 :       if (di > 100)
10586 :         //^2C1D:0EF2
10587 :         di = 100;
10588 :       //^2C1D:0EF5
10589 :       si += RAND16(((si * di) >> 7) +1) +4;
10590 :     }
10591 :     //^2C1D:0F09
10592 :     return BETWEEN_VALUE(10, si +(ref->b86[xx]), 220);
10593 :   }
10594 : 
10595 :   //^0CD5:0018
10596 :   void FILL_STR(Bit8u *buff, Bit16u count, Bit8u value, Bit16u delta)
10597 :   {
10598 :     //^0CD5:0018
10599 :     //^0CD5:0021
10600 :     for (Bit16u si = 0, di = 0; di < count; si += delta, di++) {
10601 :       buff[si] = value;
10602 :     }
10603 :   }
10604 : 
10605 :   //^2E62:0265
10606 :   U8 *_2e62_0265(U16 xx, U16 yy, U16 zz)
10607 :   {
10608 :     //^2E62:0265
10609 :     ENTER(6);
10610 :     //^2E62:026A
10611 :     U16 si = xx;
10612 :     //^2E62:026D
10613 :     if (yy != 0) {
10614 :       //^2E62:0273
10615 :       FILL_STR(_4976_57fc, 4, ' ', 1);
10616 :     }
10617 :     //^2E62:0285
10618 :     U8 *bp04 = _4976_5800;
10619 :     //^2E62:028D
10620 :     *bp04 = 0;
10621 :     //^2E62:0294
10622 :     if (si == 0) {
10623 :       //^2E62:0298
10624 :       *(--bp04) = '0';
10625 :       //^2E62:02A2
10626 :     }
10627 :     else {
10628 :       //^2E62:02C5
10629 :       U16 bp06;
10630 :       while ((bp06 = si) != 0) {
10631 :         //^2E62:02A4
10632 :         bp04--;
10633 :         //^2E62:02A7
10634 :         si = si / 10;
10635 :         //^2E62:02B2
10636 :         *bp04 = U8(bp06) + '0' -(si * 10);
10637 :         //^2E62:02C5
10638 :       };
10639 :     }
10640 :     //^2E62:02CE
10641 :     if (yy != 0) {
10642 :       //^2E62:02D4
10643 :       return &_4976_57fc[4 - zz];
10644 :     }
10645 :     //^2E62:02E1
10646 :     return bp04;
10647 :   }
10648 : 
10649 :   //^0CAF:00A4
10650 :   U8 *SK_STRCPY(U8 *strTo, const U8 *strFrom);
10651 :   //^0CAF:0032
10652 :   U8 *SK_STRCAT(U8 *strTo, const U8 *strFrom);
10653 : 
10654 :   //^24A5:1532
10655 :   void _24a5_1532()
10656 :   {
10657 :     //^24A5:1532
10658 :     ENTER(144);
10659 :     //^24A5:1538
10660 :     U16 di = _4976_52be -1;
10661 :     //^24A5:153E
10662 :     sk53b4 *bp04 = &_4976_53b4[di];
10663 :     //^24A5:154C
10664 :     _4976_3d2e = 2;
10665 :     //^24A5:1552
10666 :     _0b36_1688(0x07, 0x00, 0x01, 494, -1);
10667 :     //^24A5:1565
10668 :     i16 bp0c;
10669 :     i16 bp10;
10670 :     QUERY_TOPLEFT_OF_RECT(557, &bp0c, &bp10);
10671 :     //^24A5:157A
10672 :     U8 bp0090[128];
10673 :     for (U16 bp06 = 0; bp06 < 3; bp06++) {
10674 :       //^24A5:1582
10675 :       i16 si = min_value(16, _2c1d_0a47(di, bp06, 1));
10676 :       //^24A5:159C
10677 :       if (si != 1) {
10678 :         //^24A5:15A1
10679 :         _4976_52e4 = bp06;
10680 :         //^24A5:15A7
10681 :         QUERY_GDAT_TEXT(0x07, 0x00, _4976_3d44[4 +si], bp0090);
10682 :         //^24A5:15BE
10683 :         DRAW_GAMELOAD_STR(bp0c, bp10, _4976_4bda[(_4976_580a[di][bp06] != 0) ? 7 : 13], bp0090);
10684 :         //^24A5:15F5
10685 :         _4976_52af->b8[9 +bp06] = _4976_580a[di][bp06];
10686 :         //^24A5:1608
10687 :         bp10 += _4976_0128;
10688 :       }
10689 :       //^24A5:160E
10690 :     }
10691 :     //^24A5:161A
10692 :     i16 bp0e;
10693 :     QUERY_TOPLEFT_OF_RECT(559, &bp0e, &bp10);
10694 :     //^24A5:162F
10695 :     for (U16 bp06 = 1; bp06 <= 6; bp06++) {
10696 :       //^24A5:1637
10697 :       DRAW_GAMELOAD_STR(
10698 :         bp0c,
10699 :         bp10,
10700 :         _4976_4bda[13],
10701 :         QUERY_GDAT_TEXT(0x07, 0x00, bp06 +0x20, bp0090)
10702 :         );
10703 :       //^24A5:166A
10704 :       U16 si = _2c1d_0ea2(bp04, bp06, 0);
10705 :       //^24A5:167F
10706 :       U16 bp0a = _2c1d_0ea2(bp04, bp06, 1);
10707 :       //^24A5:1695
10708 :       U16 bp08 = (si < bp0a) ? 8 : ((si > bp0a) ? 7 : 13);
10709 :       //^24A5:16B2
10710 :       DRAW_GAMELOAD_STR(
10711 :         bp0e,
10712 :         bp10,
10713 :         _4976_4bda[bp08],
10714 :         _2e62_0265(si, 1, 3)
10715 :         );
10716 :       //^24A5:16DC
10717 :       SK_STRCPY(bp0090, &_4976_3d7f);
10718 :       //^24A5:16EE
10719 :       SK_STRCAT(bp0090, _2e62_0265(bp0a, 1, 3));
10720 :       //^24A5:170D
10721 :             DRAW_GAMELOAD_STR(
10722 :         _4976_0126 * 3 +bp0e,
10723 :         bp10,
10724 :         _4976_4bda[13],
10725 :         bp0090
10726 :         );
10727 :       //^24A5:1737
10728 :       bp10 += _4976_0128;
10729 :       //^24A5:173D
10730 :     }
10731 :     //^24A5:1749
10732 :     return;
10733 :   }
10734 : 
10735 :   //^2E62:0670
10736 :   void _2e62_0670(i16 player)
10737 :   {
10738 :     //^2E62:0670
10739 :     ENTER(164);
10740 :     //^2E62:0676
10741 :     Bit16u bp14 = 0;
10742 :     Bit16u bp16 = 0;
10743 :     Bit16u bp18 = 0;
10744 :     Bit16u bp1a = 0;
10745 :     Bit16u bp1c = 0;
10746 :     //^2E62:068F
10747 :     sk53b4 *bp04 = &_4976_53b4[player];
10748 :     //^2E62:06A0
10749 :     Bit16u si = bp04->w50;
10750 :     //^2E62:06A7
10751 :     Bit16u bp08 = (player +1 == _4976_52be) ? 1 : 0;
10752 :     //^2E62:06BB
10753 :     if (bp08 != 0 && _4976_022c != 0)
10754 :       //^2E62:06C6
10755 :       si |= 0x8000;
10756 :     //^2E62:06CA
10757 :     if (_4976_52be != _4976_5802 || (si & 0x8000) != 0) {
10758 :       //^2E62:06D9
10759 :       if (bp08 != 0) {
10760 :         //^2E62:06DF
10761 :         _0b36_1688(0x07, 0x00, 0x00, 0x04, -1);
10762 :         //^2E62:06F1
10763 :         bp1c = 1;
10764 :         bp18 = 1;
10765 :         //^2E62:06FB
10766 :         _4976_5802 = _4976_52be;
10767 :         //^2E62:0701
10768 :         bp14 = 15;
10769 :         //^2E62:0706
10770 :         si |= 0x7c00;
10771 :       }
10772 :       else {
10773 :         //^2E62:070C
10774 :         _4976_5802 = 0;
10775 :       }
10776 :     }
10777 :     //^2E62:0714
10778 :     else if (bp08 != 0) {
10779 :       //^2E62:071A
10780 :       bp14 = _4976_581a ^ _4976_5804;
10781 :     }
10782 :     //^2E62:0724
10783 :     if (bp14 != 0) {
10784 :       //^2E62:072A
10785 :       if (_4976_4bfc == 0) {
10786 :         //^2E62:0731
10787 :         if ((bp14 & 1) != 0) {
10788 :           //^2E62:0738
10789 :           _2e62_064a(0x0013, 0x0267, 0x0001);
10790 :         }
10791 :         //^2E62:074A
10792 :         if ((bp14 & 8) != 0) {
10793 :           //^2E62:0751
10794 :           _2e62_064a(0x000f, 0x0232, 0x0008);
10795 :         }
10796 :         //^2E62:075F
10797 :         if ((bp14 & 4) != 0) {
10798 :           //^2E62:0766
10799 :           _2e62_064a(0x000d, 0x0234, 0x0004);
10800 :         }
10801 :       }
10802 :       //^2E62:0774
10803 :       if ((bp14 & 2) != 0) {
10804 :         //^2E62:077B
10805 :         _2e62_064a(0x000b, 0x0236, 0x0002);
10806 :       }
10807 :       //^2E62:0789
10808 :       bp18 = 1;
10809 :       //^2E62:078E
10810 :       _4976_5804 = _4976_581a;
10811 :     }
10812 :     //^2E62:0794
10813 :     if ((si & 0x4000) != 0) {
10814 :       //^2E62:079A
10815 :       _2e62_00a3(player, 1);
10816 :       //^2E62:07A5
10817 :       bp1a = 1;
10818 :       //^2E62:07AA
10819 :       if (bp04->curHP() != 0) {
10820 :         //^2E62:07B4
10821 :         if (bp08 != 0) {
10822 :           //^2E62:07BA
10823 :           _2e62_061d(player);
10824 :           //^2E62:07C2
10825 :           si |= 0x0800;
10826 :         }
10827 :         else {
10828 :           //^2E62:07C8
10829 :           si |= 0x0c00;
10830 :         }
10831 :         //^2E62:07CC
10832 :         bp16 = 1;
10833 :       }
10834 :       else {
10835 :         //^2E62:07D3
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 :     //^2E62:0801
10846 :     if (bp04->curHP() != 0) {
10847 :       //^2E62:080E
10848 :       if ((si & 0x0800) != 0) {
10849 :         //^2E62:0817
10850 :         _2e62_00a3(player, 0);
10851 :         //^2E62:0822
10852 :         bp1a = 1;
10853 :         //^2E62:0827
10854 :         _2e62_011b(player);
10855 :         //^2E62:082F
10856 :         if (bp04->w46 != 0xffff) {
10857 :           //^2E62:0839
10858 :           _2e62_0572(player);
10859 :         }
10860 :         //^2E62:0841
10861 :         if (bp08 != 0) {
10862 :           //^2E62:084A
10863 :           SRECT bp24;
10864 :           QUERY_EXPANDED_RECT(549, &bp24);
10865 :           //^2E62:085A
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 :           //^2E62:0897
10876 :           _2e62_0360(bp04);
10877 :           //^2E62:08A3
10878 :           Bit8u bp0d;
10879 :           if (bp04->curFood() < 0 || bp04->curWater() < 0 || bp04->b31 != 0) {
10880 :             //^2E62:08BB
10881 :             bp0d = 5;
10882 :           }
10883 :           else {
10884 :             //^2E62:08C1
10885 :             bp0d = 4;
10886 :           }
10887 :           //^2E62:08C5
10888 :           _2e62_05d4(bp0d, 545);
10889 :           //^2E62:08D2
10890 :           bp0d = 4;
10891 :           //^2E62:08D6
10892 :           for (i16 di = 1; di <= 6; di++) {
10893 :             //^2E62:08DB
10894 :             if (bp04->b72[di][0] < bp04->b72[di][1]) {
10895 :               //^2E62:08F7
10896 :               bp0d = 5;
10897 :               //^2E62:08FB
10898 :               break;
10899 :             }
10900 :             //^2E62:08FD
10901 :           }
10902 :           //^2E62:0903
10903 :           _2e62_05d4(bp0d, 546);
10904 :           //^2E62:0910
10905 :           bp18 = 1;
10906 :         }
10907 :       }
10908 :       //^2E62:0915
10909 :       ObjectID bp12;
10910 :       if (bp08 != 0) {
10911 :         //^2E62:091E
10912 :         if (_4976_4c38 != 0) {
10913 :           //^2E62:0925
10914 :           bp12 = _4976_57c8.w0;
10915 :         }
10916 :         //^2E62:092A
10917 :         else if (_4976_4bfe != 0) {
10918 :           //^2E62:0931
10919 :           bp12 = ObjectID::FFFF;
10920 :         }
10921 :         else {
10922 :           //^2E62:0938
10923 :           bp12 = bp04->Possess(1);
10924 :         }
10925 :         //^2E62:0940
10926 :         //^2E62:0943
10927 :         if (false
10928 :           || _4976_3d30 != bp12 
10929 :           || _4976_4bfe != _4976_5806 
10930 :           || _4976_4c38 != _4976_5808
10931 :           || (si & 0x2000) != 0
10932 :         ) {
10933 :           //^2E62:0966
10934 :           _0b36_1688(0x07, 0x00, 0x25, 545, -1);
10935 :           //^2E62:0979
10936 :           _0b36_1688(0x07, 0x00, (_4976_4c38 != 0) ? 0x21 : 0x20, 546, -1);
10937 :           //^2E62:0998
10938 :           if (_4976_4c38 != 0) {
10939 :             //^2E62:099F
10940 :             if (bp12 == ObjectID::FFFF) {
10941 :               //^2E62:09A5
10942 :               _24a5_1532();
10943 :             }
10944 :             else {
10945 :               //^2E62:09AC
10946 :               _24a5_0c35(bp12, 1);
10947 :             }
10948 :           }
10949 :           else {
10950 :             //^2E62:09BA
10951 :             if (_4976_4bfc != 0) {
10952 :               //^2E62:09C1
10953 :               if (_4976_4bfe == 0) {
10954 :                 //^2E62:09CA
10955 :                 _24a5_105b(0);
10956 :               }
10957 :               else {
10958 :                 //^2E62:09C8
10959 :                 goto _09e4;
10960 :               }
10961 :             }
10962 :             //^2E62:09D4
10963 :             else if (_24a5_0c35(bp12, 0) == 0) {
10964 :               //^2E62:09E4
10965 : _09e4:
10966 :               _24a5_0fb8();
10967 :             }
10968 :           }
10969 :           //^2E62:09E9
10970 :           _4976_3d30 = bp12;
10971 :           _4976_5808 = _4976_4c38;
10972 :           _4976_5806 = _4976_4bfe;
10973 :           //^2E62:09FB
10974 :           goto _0a25;
10975 :         }
10976 :         else if (_4976_3d30 != ObjectID::FFFF) {
10977 :           //^2E62:0A04
10978 :           if ((QUERY_GDAT_DBSPEC_WORD_VALUE(_4976_3d30, 0x00) & 0x0020) != 0) {
10979 :             //^2E62:0A16
10980 :             _24a5_0c35(_4976_3d30, _4976_4c38);
10981 :             //^2E62:0A25
10982 : _0a25:
10983 :             bp18 = 1;
10984 :           }
10985 :         }
10986 :         //^2E62:0A2A
10987 :         for (i16 bp0c = 0; bp0c < 30; bp0c++) {
10988 :           //^2E62:0A31
10989 :           bp18 |= _2e62_03b5(player, bp0c, bp1c);
10990 :           //^2E62:0A44
10991 :         }
10992 :       }
10993 :       else {
10994 :         //^2E62:0A4F
10995 :         for (i16 bp0c = 0; bp0c <= 1; bp0c++) {
10996 :           //^2E62:0A56
10997 :           bp1a |= _2e62_03b5(player, bp0c, bp16);
10998 :           //^2E62:0A69
10999 :         }
11000 :       }
11001 :       //^2E62:0A72
11002 :       U16 di;
11003 :       if ((si & 0x0400) != 0) {
11004 :         //^2E62:0A7B
11005 :         di = _4976_4bda[(player == _4976_3fc6 && _4976_4bfc == 0) ? 9 : 15];
11006 :       }
11007 :       //^2E62:0B6F
11008 :       if (bp08 != 0 && (si & 0x1000) != 0) {
11009 :         //^2E62:0B81
11010 :         SRECT bp24;
11011 :         QUERY_EXPANDED_RECT(554, &bp24);
11012 :         //^2E62:0B91
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 :         //^2E62:0BCE
11023 :         U16 bp10 = _2c1d_203d(player);
11024 :         //^2E62:0BDA
11025 :         di = _2c1d_0ffc(bp04);
11026 :         //^2E62:0BE9
11027 :         U16 bp06;
11028 :         if (di < bp10) {
11029 :           //^2E62:0BEE
11030 :           bp06 = 8;
11031 :         }
11032 :         else {
11033 :           //^2E62:0BF5
11034 :           bp06 = ((i32(bp10) << 3) > (i16(di) * i32(5))) ? 11 : 13;
11035 :         }
11036 :         //^2E62:0C2C
11037 :         _4976_52e0 = di = bp10 / 10;
11038 :         //^2E62:0C3B
11039 :         _4976_52fa = bp10 - di * 10;
11040 :         //^2E62:0C4B
11041 :         _4976_52f6 = _2c1d_0ffc(bp04) / 10;
11042 :         //^2E62:0C62
11043 :         Bit8u bp00a4[128];
11044 :                 QUERY_GDAT_TEXT(0x07, 0x00, 0x2a, bp00a4);
11045 :         //^2E62:0C76
11046 :         _3929_0c37(555, _4976_4bda[0], _4976_4bda[1] | 0x4000, bp00a4);
11047 :         //^2E62:0C9E
11048 :         bp18 = 1;
11049 :       }
11050 :     }
11051 :     //^2E62:0CA3
11052 :     if (bp1a != 0) {
11053 :       //^2E62:0CA9
11054 :       _0b36_0cbe(&_4976_3ff0, 1);
11055 :     }
11056 :     //^2E62:0CB7
11057 :     if (bp18 != 0) {
11058 :       //^2E62:0CBD
11059 :       _4976_022c = 0;
11060 :       //^2E62:0CC3
11061 :       _44c8_1be8(0);
11062 :     }
11063 :     //^2E62:0CCB
11064 :     bp04->w50 &= 0x03ff;
11065 :     //^2E62:0CD4
11066 :     return;
11067 :   }
11068 : 
11069 :   //^1031:111E
11070 :   void _1031_111e(Bit16u xx)
11071 :   {
11072 :     //^1031:111E
11073 :     ENTER(72);
11074 :     //^1031:1124
11075 :     i16 di = xx;
11076 :     //^1031:1127
11077 :     if (_4976_4df4 != 0) {
11078 :       //^1031:112E
11079 :       if (_4976_4df4 <= di) {
11080 :         //^1031:1134
11081 :         di -= _4976_4df4;
11082 :         //^1031:1138
11083 :         _4976_4df4 = 0;
11084 :       }
11085 :       else {
11086 :         //^1031:1140
11087 :         _4976_4df4 -= di;
11088 :         //^1031:113E
11089 :         return;
11090 :       }
11091 :     }
11092 :     //^1031:1147
11093 :     if (_4976_4e62 != 0 || _4976_4e48 != 0 || _4976_4e64 != 0 || _4976_4e96 == NULL)
11094 :       //^1031:116E
11095 :       return;
11096 :     //^1031:1171
11097 :     sk3f6c bp48;
11098 :     bp48.w0 = 0xffff;
11099 :     Bit8u bp05;
11100 :     do {
11101 :       //^1031:1176
11102 :       bp05 = *(_4976_4e96++);
11103 :       //^1031:1184
11104 :       i16 si;
11105 :       switch (bp05 & 0xff3f) {
11106 :         case 0:
11107 :           {
11108 :             //^1031:119A
11109 :             _4976_4df4 = *_4976_4e96;
11110 :             //^1031:11A6
11111 :             _4976_4e96++;
11112 :             //^1031:11AA
11113 :             break;
11114 :           }
11115 :         case 4:
11116 :         case 6:
11117 :           {
11118 :             //^1031:11AD
11119 :             si = _4976_4e5e +1;
11120 :             //^1031:11B3
11121 :             if (si > 2)
11122 :               //^1031:11B8
11123 :               si = 0;
11124 :             //^1031:11BA
11125 :             if (_4976_4e60 == si) {
11126 :               //^1031:11C0
11127 :               if (_4976_4e62 == 0)
11128 :                 //^1031:11C7
11129 :                 _4976_4e62 = 1;
11130 :               //^1031:11CD
11131 :               _4976_4e96--;
11132 :               //^1031:11D1
11133 :               goto _1534;
11134 :             }
11135 :             //^1031:11D4
11136 :             _4976_4e4e = _4976_4e6c[_4976_4e5e];
11137 :             //^1031:11ED
11138 :             _4976_4e5e = si;
11139 :             //^1031:11F1
11140 :             if ((bp05 & 0xff3f) == 4)
11141 :               //^1031:11FE
11142 :               break;
11143 : 
11144 :             goto _1201;
11145 :           }
11146 :         case 1:
11147 :           {
11148 :             //^1031:1201
11149 :   _1201:
11150 :             _4976_4e62 = _4976_4e5e - _4976_4e60;
11151 :             //^1031:120B
11152 :             if (_4976_4e62 >= 0)
11153 :               //^1031:120F
11154 :               break;
11155 :             //^1031:1212
11156 :             _4976_4e62 += 3;
11157 :             //^1031:1217
11158 :             break;
11159 :           }
11160 :         case 2:
11161 :           {
11162 :             //^1031:121A
11163 :             _4976_4e48 = 1;
11164 :             //^1031:1220
11165 :             break;
11166 :           }
11167 :         case 3:
11168 :           {
11169 :             //^1031:1223
11170 :             _4976_4e64 = 1;
11171 :             //^1031:1229
11172 :             break;
11173 :           }
11174 :         case 5:
11175 :           {
11176 :             //^1031:122C
11177 :             if (HANDLE_UI_EVENT(&_4976_4e4e) != 0) {
11178 :               //^1031:123B
11179 :               if (_4976_4e5c == 0)
11180 :                 //^1031:1242
11181 :                 break;
11182 :               //^1031:1245
11183 :               goto _1201;
11184 :             }
11185 :             //^1031:1247
11186 :             _4976_4e96--;
11187 :             //^1031:124B
11188 :             break;
11189 :           }
11190 :         case 7:
11191 :           {
11192 :             //^1031:124E
11193 :             Bit8u bp06 = *(_4976_4e96++);
11194 :             //^1031:125C
11195 :             Bit8u bp07 = *(_4976_4e96++);
11196 :             //^1031:126A
11197 :             Bit8u bp08 = *(_4976_4e96++);
11198 :             //^1031:1278
11199 :             Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp06, bp07, bp08);
11200 :             //^1031:128F
11201 :             SRECT bp14;
11202 :             _1031_10c8(&bp48, &bp14, READ_UI16(bp04,-4), READ_UI16(bp04,-2));
11203 :             //^1031:12AB
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 :             //^1031:12FC
11215 :             break;
11216 :           }
11217 :         case 8:
11218 :           {
11219 :             //^1031:12FF
11220 :             si = GET_PLAYER_AT_POSITION((*(_4976_4e96++) + _4976_4bf6) & 3);
11221 :             //^1031:131C
11222 :             if (si < 0)
11223 :               //^1031:1320
11224 :               break;
11225 :             //^1031:1323
11226 :             _29ee_058d(si, 1);
11227 :             //^1031:132D
11228 :             _0b36_0cbe(&_4976_3f6c, 1);
11229 :             //^1031:133B
11230 :             break;
11231 :           }
11232 :         case 9:
11233 :           {
11234 :             //^1031:133E
11235 :             if (_4976_5366 > 0) {
11236 :               //^1031:1345
11237 :               si = _4976_5366 -1;
11238 :             }
11239 :             //^1031:134D
11240 :             else if (_4976_4e52 >= 0x74 && _4976_4e52 <= 0x7b) {
11241 :               //^1031:135B
11242 :               si = (_4976_4e52 -0x74) >> 1;
11243 :             }
11244 :             else {
11245 :               //^1031:1365
11246 :               //^1031:11A6
11247 :               _4976_4e96++;
11248 :               //^1031:11AA
11249 :               break;
11250 :             }
11251 :             //^1031:1368
11252 :             _29ee_026c(si, *(_4976_4e96++), 1);
11253 :             //^1031:1381
11254 :             goto _148a;
11255 :           }
11256 :         case 10:
11257 :           {
11258 :             //^1031:1384
11259 :             Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x01, 0x05, 0x08);
11260 :             //^1031:1398
11261 :             SRECT bp14;
11262 :             _1031_10c8(&bp48, &bp14, READ_UI16(bp04,-4), READ_UI16(bp04,-2));
11263 :             //^1031:13B4
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 :             //^1031:13EE
11275 :             _4976_4df6[0] = _4976_52af[_4976_5366].b30 +Bit8u(_4976_4e52) +0xfb;
11276 :             //^1031:140C
11277 :             i16 bp0a;
11278 :             i16 bp0c;
11279 :             _3929_03dc(_4976_4df6, &bp0a, &bp0c);
11280 :             //^1031:1422
11281 :             CALC_CENTERED_RECT_IN_RECT(&bp14, &bp48.w2, bp0a, bp0c);
11282 :             //^1031:143A
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 :             //^1031:1467
11292 :             break;
11293 :           }
11294 :         case 11:
11295 :           {
11296 :             //^1031:146A
11297 :             _29ee_093e(1);
11298 :             //^1031:1471
11299 :             //^1031:14D4
11300 :             goto _148a;
11301 :           }
11302 :         case 12:
11303 :           {
11304 :             //^1031:1473
11305 :             _29ee_0a7b(*(_4976_4e96++), 1);
11306 :             //^1031:148A
11307 :   _148a:
11308 :             _0b36_0cbe(&_4976_3f6c, 1);
11309 :             //^1031:1498
11310 :             break;
11311 :           }
11312 :         case 13:
11313 :           {
11314 :             //^1031:149A
11315 :             si = _4976_52be;
11316 :             //^1031:149F
11317 :             if (si != 0) {
11318 :               //^1031:14A3
11319 :               _4976_581a |= *_4976_4e96;
11320 :               //^1031:14B0
11321 :               _2e62_0670(--si);
11322 :             }
11323 :             //^1031:14BD
11324 :             //^1031:11A6
11325 :             _4976_4e96++;
11326 :             //^1031:11AA
11327 :             break;
11328 :           }
11329 :         case 14:
11330 :           {
11331 :             //^1031:14C0
11332 :             _29ee_1d03(*(_4976_4e96++));
11333 :             //^1031:14D4
11334 :             goto _148a;
11335 :           }
11336 :         case 15:
11337 :         case 16:
11338 :           {
11339 :             //^1031:14D6
11340 :             _4976_4bd5 = *_4976_4e96; _4976_4e96++;
11341 :             _4976_4bd6 = *_4976_4e96; _4976_4e96++;
11342 :             _4976_4bd4 = *_4976_4e96; _4976_4e96++;
11343 :             //^1031:1500
11344 :             _0aaf_01db(_4976_4df8, 1);
11345 :             //^1031:150D
11346 :             bp48.w0 = 0xffff;
11347 :             //^1031:1512
11348 :             _0aaf_002f();
11349 : 
11350 :             break;
11351 :           }
11352 :       }
11353 :       //^1031:1517
11354 :       if ((bp05 & 0x80) != 0) {
11355 :         //^1031:151D
11356 :         _4976_4e96 = NULL;
11357 :         //^1031:1529
11358 :         break;
11359 :       }
11360 :       //^1031:152B
11361 :     } while ((bp05 & 0x40) != 0);
11362 : 
11363 :     //^1031:1534
11364 : _1534:
11365 :     if (bp48.w0 != 0xffff) {
11366 :       //^1031:153A
11367 :       _0b36_0cbe(&bp48, 1);
11368 :     }
11369 :     //^1031:1549
11370 :     return;
11371 :   }
11372 : 
11373 :   //^1031:0F3A
11374 :   void _1031_0f3a() //#DS=4976
11375 :   {
11376 :     //^1031:0F3A
11377 :     ENTER(14);
11378 :     //^1031:0F40
11379 :     if (_4976_4e46 == 0) {
11380 :       //^1031:0F4A
11381 :       Bit32u bp04 = _4976_4c20;
11382 :       //^1031:0F57
11383 :       Bit32u bp08 = bp04 - _4976_19a9;
11384 :       //^1031:0F68
11385 :       if (bp08 != 0) {
11386 :         //^1031:0F6F
11387 :         _4976_19a9 = bp04;
11388 :         //^1031:0F7C
11389 :         if (_4976_4e62 == 0 && _4976_4e48 == 0 && _4976_4e64 == 0) {
11390 :           //^1031:0F97
11391 :           for (; ; ) {
11392 :             //^1031:0F9D
11393 :             _4976_19a7 = 1;
11394 :             Bit16u di = 1;
11395 :             //^1031:0FA6
11396 : _0fa6:
11397 :             if (_4976_4e00 == 0) {
11398 :               //^1031:0FAD
11399 :               _4976_19a7 = 0;
11400 :               //^1031:0FB3
11401 :               _1031_0b7e();
11402 :               //^1031:0FB7
11403 :               break;
11404 :             }
11405 :             //^1031:0FBA
11406 :             sk4e02 bp0e = _4976_4e02[_4976_4ea6];
11407 :             //^1031:0FD4
11408 :             _4976_4e00--;
11409 :             _4976_4ea6++;
11410 :             //^1031:0FDC
11411 :             if (_4976_4ea6 > 10)
11412 :               //^1031:0FE4
11413 :               _4976_4ea6 = 0;
11414 :             //^1031:0FEA
11415 :             Bit16u si = 0;
11416 :             //^1031:0FEC
11417 :             if (bp0e.w0 >= 0x20) {
11418 :               //^1031:0FF2
11419 :               if (bp0e.w0 == 0x20) {
11420 :                 //^1031:0FF8
11421 :                 si = _1031_03f2(&_4976_1891[_4976_19ad], bp0e.w2);
11422 :               }
11423 :               //^1031:100F
11424 :               else if (bp0e.w0 == 0x40) {
11425 :                 //^1031:1015
11426 :                 si = 0x81;
11427 :               }
11428 :               //^1031:101A
11429 :               else if (bp0e.w0 == 0x60) {
11430 :                 //^1031:1020
11431 :                 si = 0xe1;
11432 :               }
11433 :             }
11434 :             //^1031:1025
11435 :             else if ((bp0e.w0 & 0x04) != 0) {
11436 :               si = 0xe3;
11437 :             }
11438 :             //^1031:1031
11439 :             else if ((bp0e.w0 & 0x13) != 0) {
11440 :               si = _1031_030a(&_4976_1891[_4976_19ad], bp0e.w2, bp0e.w4, bp0e.w0);
11441 :             }
11442 :             //^1031:1055
11443 :             if (si != 0) {
11444 :               //^1031:1059
11445 :               di = 0;
11446 :               //^1031:105B
11447 :               _4976_4e4e.w4 = si;
11448 :               //^1031:105F
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 :             //^1031:1083
11457 :             if (di != 0)
11458 :               //^1031:1087
11459 :               goto _0fa6;
11460 :             //^1031:108A
11461 :             _4976_19a7 = 0;
11462 :             //^1031:1090
11463 :             _1031_0b7e();
11464 :             //^1031:1094
11465 :             _4976_4e96 = _1031_0d9e(&_4976_4e4e);
11466 :             //^1031:10A5
11467 :             bp08 = 0;
11468 :             //^1031:10AF
11469 :           } while (_4976_4e96 == 0);
11470 :         }
11471 :         //^1031:10BB
11472 :         _1031_111e(Bit16u(bp08));
11473 :       }
11474 :     }
11475 :     //^1031:10C4
11476 :     return;
11477 :   }
11478 : 
11479 :   //^12B4:011E
11480 :   void RESET_SQUAD_DIR()
11481 :   {
11482 :     //^12B4:011E
11483 :     ENTER(0);
11484 :     //^12B4:0122
11485 :     for (U16 si = 0; si < _4976_4c3c; si++) {
11486 :       //^12B4:0126
11487 :       _4976_53b4[si].playerDir(U8(_4976_4bf6));
11488 :     }
11489 :     //^12B4:013E
11490 :     return;
11491 :   }
11492 : 
11493 :   //^
11494 :   void _12b4_00af(U16 xx); // TODO: Unreachable
11495 : 
11496 :   //^3A15:0F07
11497 :   U16 _3a15_0f07(Actuator *ref, U16 xx)
11498 :   {
11499 :     //^3A15:0F07
11500 :     ENTER(134);
11501 :     //^3A15:0F0C
11502 :     U8 bp05;
11503 :     U8 bp06;
11504 :     if (xx != 0) {
11505 :       //^3A15:0F12
11506 :       bp05 = 9;
11507 :       //^3A15:0F16
11508 :       bp06 = GET_WALL_DECORATION_OF_ACTUATOR(ref);
11509 :     }
11510 :     else {
11511 :       //^3A15:0F23
11512 :       bp05 = 10;
11513 :       //^3A15:0F27
11514 :       bp06 = GET_FLOOR_DECORATION_OF_ACTUATOR(ref);
11515 :     }
11516 :     //^3A15:0F37
11517 :     if (bp06 == 0xff)
11518 :       //^3A15:0F3D
11519 :       return 1;
11520 :     //^3A15:0F42
11521 :         U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(bp05, bp06, dtWordValue, 0x0d);
11522 :     //^3A15:0F58
11523 :     if (si == 0) {
11524 :       //^3A15:0F5C
11525 :       U8 bp0086[128];
11526 :       U8 *bp04 = QUERY_GDAT_TEXT(bp05, bp06, 0x0d, bp0086);
11527 :       //^3A15:0F7E
11528 :       if (*bp04 != 0) {
11529 :         //^3A15:0F84
11530 :         si = SK_STRLEN(bp04);
11531 :         //^3A15:0F93
11532 :         if (si != 0)
11533 :           //^3A15:0F95
11534 :           return si;
11535 :       }
11536 :       //^3A15:0F97
11537 :       return si = 1;
11538 :     }
11539 :     //^3A15:0F9C
11540 :     return si & 0x7fff;
11541 :   }
11542 : 
11543 :   //^3A15:0FA5
11544 :   void _3a15_0fa5(Actuator *ref, ObjectID rl, U16 xx, U16 yy, U16 zz, U16 ww)
11545 :   {
11546 :     //^3A15:0FA5
11547 :     ENTER(12);
11548 :     //^3A15:0FAB
11549 :     if (ref->SoundEffect() != 1)
11550 :       //^3A15:0FBD
11551 :       return;
11552 :     //^3A15:0FC0
11553 :     if ((ref->ActuatorData() & 0x0100) != 0)
11554 :       //^3A15:0FCF
11555 :       return;
11556 :     //^3A15:0FD2
11557 :     U8 bp0b;
11558 :     U8 bp0c;
11559 :     if (ww != 0) {
11560 :       //^3A15:0FD8
11561 :       bp0b = 9;
11562 :       //^3A15:0FDC
11563 :       bp0c = GET_WALL_DECORATION_OF_ACTUATOR(ref);
11564 :     }
11565 :     else {
11566 :       //^3A15:0FE9
11567 :       bp0b = 10;
11568 :       //^3A15:0FED
11569 :       bp0c = GET_FLOOR_DECORATION_OF_ACTUATOR(ref);
11570 :     }
11571 :     //^3A15:0FFD
11572 :     U16 si = ((ref->ActuatorData() & 0xff) + _4976_4bec + QUERY_GDAT_ENTRY_DATA_INDEX(bp0b, bp0c, dtWordValue, 0x88)) % zz;
11573 :     //^3A15:1044
11574 :     sk5c20 bp0a;
11575 :     bp0a.SetMap(_4976_0c5a);
11576 :     bp0a.SetTick(zz - si + _4976_4bec);
11577 :     //^3A15:1073
11578 :     bp0a.w8 = rl;
11579 :     bp0a.b6_0_f(U8(xx));
11580 :     bp0a.b7_0_f(U8(yy));
11581 :     //^3A15:1085
11582 :     QUEUE_TIMER(&bp0a);
11583 :     //^3A15:1090
11584 :     ref->ActuatorData(ref->ActuatorData() | 0x0100);
11585 :     //^3A15:10B0
11586 :     if (si == 0) {
11587 :       //^3A15:10B4
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 :     //^3A15:10D8
11601 :     return;
11602 :   }
11603 : 
11604 :   //^3A15:38B6
11605 :   void _3a15_38b6(U16 xx)
11606 :   {
11607 :     //^3A15:38B6
11608 :     ENTER(22);
11609 :     //^3A15:38BC
11610 :     U16 bp14 = _4976_0c5a;
11611 :     //^3A15:38C2
11612 :     CHANGE_CURRENT_MAP_TO(_4976_4bf4);
11613 :     //^3A15:38CC
11614 :     U16 bp10 = _4976_4dba[_4976_0c5a].RawColumn();
11615 :     //^3A15:38E5
11616 :     U16 bp12 = _4976_4dba[_4976_0c5a].RawRow();
11617 :     //^3A15:38FE
11618 :     U8 *bp04 = _4976_4ca8[_4976_0c5a][0];
11619 :     //^3A15:391A
11620 :     U16 *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[_4976_0c5a]]];
11621 :     //^3A15:3945
11622 :     for (U16 bp0e = 0; bp0e <= bp10; bp0e++) {
11623 :       //^3A15:394D
11624 :       for (U16 di = 0; di <= bp12; di++) {
11625 :         //^3A15:3952
11626 :         U16 bp16 = ((*bp04 << 5) == ttWall) ? 1 : 0;
11627 :         //^3A15:396B
11628 :         if ((*(bp04++) & 0x10) == 0)
11629 :           //^3A15:3977
11630 :           continue;
11631 :         //^3A15:397A
11632 :         ObjectID si = *(bp0c++);
11633 :         //^3A15:3984
11634 :         while (si.DBType() <= 3) {
11635 :           //^3A15:3987
11636 :           if (si.DBType() == dbActuator) {
11637 :             //^3A15:3997
11638 :             Actuator *bp08 = GET_ADDRESS_OF_RECORD3(si);
11639 :             //^3A15:39A4
11640 :             switch (bp08->ActuatorType()) {
11641 :               case 0x21: // 0x21 -> 'Activator, arrival & departure'
11642 :                 {
11643 :                   //^3A15:39BB
11644 :                   if (bp08->ActionType() != 3) {
11645 :                     //^3A15:39CD
11646 :                     INVOKE_ACTUATOR(
11647 :                       bp08,
11648 :                       ((bp08->RevertEffect() ^ xx) != 0) ? 1 : 0,
11649 :                       0
11650 :                       );
11651 :                     //^3A15:39F6
11652 :                     break;
11653 :                   }
11654 :                   //^3A15:39F8
11655 :                   if ((!bp08->RevertEffect()) == xx) {
11656 :                     //^3A15:3A0F
11657 :                     INVOKE_ACTUATOR(
11658 :                       bp08,
11659 :                       bp08->ActionType(),
11660 :                       0
11661 :                       );
11662 :                   }
11663 :                   //^3A15:3A2A
11664 :                   break;
11665 :                 }
11666 :               case 0x2c: // 0x2c -> 'Continuous ornate animator'
11667 :                 {
11668 :                   //^3A15:3A2C
11669 :                   if (bp08->w4_0_0() == 1) {
11670 :                     //^3A15:3A3B
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 :           //^3A15:3A61
11686 :           si = GET_NEXT_RECORD_LINK(si);
11687 :           //^3A15:3A6A
11688 :         }
11689 :         //^3A15:3A7A
11690 :       }
11691 :       //^3A15:3A83
11692 :     }
11693 :     //^3A15:3A91
11694 :     CHANGE_CURRENT_MAP_TO(bp14);
11695 :     //^3A15:3A9A
11696 :     return;
11697 :   }
11698 : 
11699 :   //^1C9A:3A6E
11700 :   void _1c9a_3a6e()
11701 :   {
11702 :     //^1C9A:3A6E
11703 :     ENTER(16);
11704 :     //^1C9A:3A74
11705 :     U8 *bp04 = *_4976_4c78;
11706 :     //^1C9A:3A85
11707 :     U16 *bp08 = &_4976_4d16[*_4976_4c52];
11708 :     //^1C9A:3A9E
11709 :     for (U16 bp0e = 0; bp0e < _4976_4dd2; bp0e++) {
11710 :       //^1C9A:3AA6
11711 :       for (U16 di = 0; di < _4976_4dd4; di++) {
11712 :         //^1C9A:3AAB
11713 :         if ((*(bp04++) & 0x10) != 0) {
11714 :           //^1C9A:3ABA
11715 :           ObjectID si = *(bp08++);
11716 :           
11717 :           do {
11718 :             //^1C9A:3AC4
11719 :             if (si.DBType() == dbCreature) {
11720 :               //^1C9A:3AD1
11721 :               Creature *bp0c = GET_ADDRESS_OF_RECORD4(si);
11722 :               //^1C9A:3AE2
11723 :               if (bp0c->b5 != 0xff)
11724 :                 //^1C9A:3AE7
11725 :                 break;
11726 :               //^1C9A:3AE9
11727 :               if ((QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp0c->CreatureType())->w0 & 0x0001) == 0) {
11728 :                 //^1C9A:3B02
11729 :                 _1c9a_0e14(si, bp0e, si);
11730 :                 //^1C9A:3B0E
11731 :                 break;
11732 :               }
11733 :               //^1C9A:3B10
11734 :               U16 bp10 = bp0c->w10;
11735 :               //^1C9A:3B1A
11736 :               _1c9a_09db(si);
11737 :               //^1C9A:3B20
11738 :               bp0c->w10 |= bp10 & 0x6000;
11739 :               //^1C9A:3B2D
11740 :               if ((bp10 & 0x803f) == 0x8001) {
11741 :                 //^1C9A:3B38
11742 :                 bp0c->w10 &= 0xffc0;
11743 :                 bp0c->w10 |= 0x8001;
11744 :               }
11745 :               //^1C9A:3B44
11746 :               break;
11747 :             }
11748 :             //^1C9A:3B46
11749 :             si = GET_NEXT_RECORD_LINK(si);
11750 :             //^1C9A:3B4F
11751 :           } while (si != si.FFFE);
11752 :         }
11753 :         //^1C9A:3B57
11754 :       }
11755 :       //^1C9A:3B61
11756 :     }
11757 :     //^1C9A:3B70
11758 :     return;
11759 :   }
11760 : 
11761 :   //^13AE:0009
11762 :   void _13ae_0009(U8 newmap)
11763 :   {
11764 :     //^13AE:0009
11765 :     ENTER(0);
11766 :     //^13AE:000C
11767 :     if (_4976_5c8a == 0) {
11768 :       //^13AE:0013
11769 :       _443c_085a();
11770 :       //^13AE:0018
11771 :       _3a15_38b6(0);
11772 :     }
11773 :     //^13AE:0020
11774 :     LOAD_LOCALLEVEL_GRAPHICS_TABLE(newmap);
11775 :     //^13AE:0029
11776 :     _2676_0131();
11777 :     //^13AE:002E
11778 :     if (_4976_5c8a == 0) {
11779 :       //^13AE:0035
11780 :       _3a15_38b6(1);
11781 :       //^13AE:003D
11782 :       _1c9a_3a6e();
11783 :       //^13AE:0042
11784 :       _24a5_013d();
11785 :       //^13AE:0047
11786 :       if (_4976_5bee == 0)
11787 :         //^13AE:0050
11788 :         _1031_098e();
11789 :       //^13AE:0055
11790 :       _443c_086b();
11791 :     }
11792 :     //^13AE:005A
11793 :     return;
11794 :   }
11795 : 
11796 :   //^12B4:0141
11797 :   void _12b4_0141(Bit16u xx)
11798 :   {
11799 :     //^12B4:0141
11800 :     ENTER(6);
11801 :     //^12B4:0146
11802 :     if (xx == 0)
11803 :       //^12B4:014C
11804 :       //^12B4:023C
11805 :       return;
11806 :     //^12B4:014F
11807 :     _4976_4e5c = 1;
11808 :     //^12B4:0155
11809 :     RESET_SQUAD_DIR();
11810 :     //^12B4:0159
11811 :     U16 si = GET_TILE_VALUE(_4976_4bfa, _4976_4c06);
11812 :     //^12B4:016C
11813 :     if (si == ttStairs) {
11814 :       //^12B4:0173
11815 :       _12b4_00af(si & 4);
11816 :       //^12B4:017E
11817 :       //^12B4:023C
11818 :       return;
11819 :     }
11820 :     //^12B4:0181
11821 :     TELE_inf bp06;
11822 :     if (GET_TELEPORTER_DETAIL(&bp06, U8(_4976_4bfa), U8(_4976_4c06)) != 0) {
11823 :       //^12B4:019A
11824 :       CHANGE_CURRENT_MAP_TO(_4976_4bf4);
11825 :       //^12B4:01A4
11826 :       MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, -1, 0);
11827 :       //^12B4:01BA
11828 :       _13ae_0009(bp06.b4);
11829 :       //^12B4:01C6
11830 :       MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, bp06.b2, bp06.b3);
11831 :       //^12B4:01E0
11832 :       ROTATE_SQUAD(bp06.b1);
11833 :       //^12B4:01EB
11834 :       //^12B4:023C
11835 :       return;
11836 :     }
11837 :     //^12B4:01ED
11838 :     _2fcf_2444(_4976_4bfa, _4976_4c06, -1, 1, 0, 0);
11839 :     //^12B4:0205
11840 :     ROTATE_SQUAD((_4976_4bf6 + ((xx == 2) ? 1 : 3)) & 3);
11841 :     //^12B4:0224
11842 :     _2fcf_2444(_4976_4bfa, _4976_4c06, -1, 1, 1, 0);
11843 :     //^12B4:023C
11844 :     return;
11845 :   }
11846 : 
11847 :   //^2405:00E7
11848 :   void _2405_00e7()
11849 :   {
11850 :     //^2405:00E7
11851 :     ENTER(0);
11852 :     //^2405:00EA
11853 :     return;
11854 :   }
11855 : 
11856 :   //^2C1D:073D
11857 :   ObjectID _2c1d_073d()
11858 :   {
11859 :     //^2C1D:073D
11860 :     ENTER(0);
11861 :     //^2C1D:0741
11862 :     ObjectID si = _4976_57c8.w0;
11863 :     //^2C1D:0746
11864 :     if (si != si.FFFF) {
11865 :       //^2C1D:074B
11866 :       _4976_57e0 = 0;
11867 :       _4976_57e2 = 0;
11868 :       _4976_57c8.w0 = ObjectID::FFFF;
11869 :       _4976_57de = 0xff;
11870 :       //^2C1D:0762
11871 :       _443c_085a();
11872 :       _2405_00e7();
11873 :       _443c_0434();
11874 :       _443c_086b();
11875 :       //^2C1D:0776
11876 :       _2c1d_03e7(_4976_3fc6, si, -1, -1);
11877 :     }
11878 :     //^2C1D:079E
11879 :     return si;
11880 :   }
11881 : 
11882 :   //^2405:04F4
11883 :   void _2405_04f4(sk57c8 *ref)
11884 :   {
11885 :     //^2405:04F4
11886 :     ENTER(8);
11887 :     //^2405:04F8
11888 :     U8 bp05 = QUERY_CLS1_FROM_RECORD(ref->w0);
11889 :     //^2405:0507
11890 :     U8 bp06 = QUERY_CLS2_FROM_RECORD(ref->w0);
11891 :     //^2405:0516
11892 :     U8 bp07 = _2405_014a(ref->w0, -1, 1);
11893 :     //^2405:052A
11894 :     U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(bp05, bp06, bp07);
11895 :     //^2405:0541
11896 :     COPY_MEMORY(
11897 :       QUERY_GDAT_IMAGE_LOCALPAL(bp05, bp06, bp07),
11898 :       ref->b6,
11899 :       16
11900 :       );
11901 :     //^2405:056D
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 :     //^2405:05B2
11917 :     return;
11918 :   }
11919 : 
11920 :   void _44c8_1c99(); // TODO: Unreachable
11921 : 
11922 :   //^3929:07E1
11923 :   void _3929_07e1(U16 xx, U16 yy)
11924 :   {
11925 :     //^3929:07E1
11926 :     ENTER(0);
11927 :     //^3929:07E6
11928 :     i16 di = xx;
11929 :     U16 si = yy;
11930 :     //^3929:07EC
11931 :     if (di < 0)
11932 :       //^3929:07F0
11933 :       di = 0;
11934 :     //^3929:07F2
11935 :     _4976_475c = min_value(di * _4976_0126, _4976_013e - _4976_0126);
11936 :     //^3929:080B
11937 :     if (si < 0 || si >= 1)
11938 :       //^3929:0816
11939 :       si = 0;
11940 :     //^3929:0818
11941 :     _4976_5c0c = si;
11942 :     _4976_5c06 = 0;
11943 :     //^3929:0822
11944 :     return;
11945 :   }
11946 : 
11947 :   //^3929:0826
11948 :   void _3929_0826()
11949 :   {
11950 :     //^3929:0826
11951 :     ENTER(0);
11952 :     //^3929:082A
11953 :     _443c_085a();
11954 :     //^3929:082F
11955 :     FIRE_FILL_SCREEN_RECT(15, _4976_4bda[0]);
11956 :     //^3929:0842
11957 :     _443c_086b();
11958 :     //^3929:0847
11959 :     _3929_07e1(0, 0);
11960 :     //^3929:0851
11961 :     for (U16 si = 0; si < 1; si++) {
11962 :       //^3929:0855
11963 :       _4976_5c02[si] = -1;
11964 :       //^3929:0866
11965 :     }
11966 :     //^3929:086C
11967 :     return;
11968 :   }
11969 : 
11970 :   //^3929:0914
11971 :   void _3929_0914()
11972 :   {
11973 :     //^3929:0914
11974 :     ENTER(0);
11975 :     //^3929:0917
11976 :     _3929_0826();
11977 :     //^3929:091B
11978 :     _4976_5c02[0] = -1;
11979 :     //^3929:0927
11980 :     return;
11981 :   }
11982 : 
11983 :   //^3929:0BA6
11984 :   void PRINT_SYSERR_TEXT(Bit16u dstx, Bit16u dsty, Bit16u clr1, Bit16u clr2, Bit8u *str)
11985 :   {
11986 :     //^3929:0BA6
11987 :     DRAW_STRING(_4976_4964, -1, _4976_00f0, dstx, dsty+1, clr1, clr2, str, 8);
11988 :   }
11989 : 
11990 :   //^3929:0929
11991 :   void _3929_0929(U16 clr1, U8 *str)
11992 :   {
11993 :     //^3929:0929
11994 :     ENTER(8);
11995 :     //^3929:092D
11996 :     SRECT bp08;
11997 :     QUERY_EXPANDED_RECT(15, &bp08);
11998 :     //^3929:093C
11999 :     if (_4976_5c06 != 0) {
12000 :       //^3929:0943
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 :       //^3929:0996
12015 :       _443c_085a();
12016 :       //^3929:099B
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 :       //^3929:09D8
12025 :       _443c_086b();
12026 :     }
12027 :     //^3929:09DD
12028 :     _4976_5c02[_4976_5c0c] = _4976_4bec +70;
12029 :     //^3929:09F9
12030 :     return;
12031 :   }
12032 :   
12033 :   //^3929:09FB
12034 :   void _3929_09fb(Bit16u ww, U8 *str) //#DS=4976
12035 :   {
12036 :     //^3929:09FB
12037 :     ENTER(102);
12038 :     //^3929:0A01
12039 :     U16 si = ww;
12040 :     //^3929:0A04
12041 :     if (_4976_5c06 != 0) {
12042 :       //^3929:0A0B
12043 :       _44c8_1c99();
12044 :       //^3929:0A10
12045 :       _44c8_1d26(_4976_5c08, _4976_4bda[0]);
12046 :       //^3929:0A2A
12047 :       _4976_5c06 = 0;
12048 :     }
12049 :     //^3929:0A30
12050 :     si = _4976_4bda[si];
12051 :     //^3929:0A3B
12052 :     for (U16 bp02 = 0; str[bp02] != 0; ) {
12053 :       //^3929:0A43
12054 :       U8 bp66[100];
12055 :       U16 di = _3929_04e2(str, bp66, &bp02, _4976_013e - _4976_475c);
12056 :       //^3929:0A64
12057 :       if (str[bp02] == '\n') {
12058 :         //^3929:0A70
12059 :         _3929_0914();
12060 :         //^3929:0A74
12061 :         _3929_0929(si, bp66);
12062 :         //^3929:0A81
12063 :         _4976_475c = 0;
12064 :         //^3929:0A87
12065 :         bp02++;
12066 :         //^3929:0A8A
12067 :         continue;
12068 :       }
12069 :       //^3929:0A8C
12070 :       if (str[bp02] != 0) {
12071 :         //^3929:0A98
12072 :         _3929_0929(si, bp66);
12073 :         //^3929:0AA5
12074 :         _3929_0914();
12075 :         //^3929:0AA9
12076 :         _4976_475c = 12;
12077 :         //^3929:0AAF
12078 :         continue;
12079 :       }
12080 :       //^3929:0AB1
12081 :       _3929_0929(si, bp66);
12082 :       //^3929:0ABE
12083 :       _4976_475c += di;
12084 :       //^3929:0AC2
12085 :     }
12086 :     //^3929:0AD1
12087 :     if (_4976_5c06 != 0) {
12088 :       //^3929:0AD8
12089 :       _44c8_1c99();
12090 :       //^3929:0ADD
12091 :       _44c8_1d26(_4976_5c08, _4976_4bda[0]);
12092 :     }
12093 :     //^3929:0AFD
12094 :     return;
12095 :   }
12096 : 
12097 :   //^3929:0B5A
12098 :   void _3929_0b5a()
12099 :   {
12100 :     //^3929:0B5A
12101 :     ENTER(0);
12102 :     //^3929:0B5D
12103 :     _3929_09fb(0, const_cast<U8 *>(_4976_475a));
12104 :     //^3929:0B6A
12105 :     return;
12106 :   }
12107 : 
12108 :   //^2405:00C9
12109 :   void _2405_00c9(ObjectID rl)
12110 :   {
12111 :     //^2405:00C9
12112 :     ENTER(0);
12113 :     //^2405:00CC
12114 :     _3929_0b5a();
12115 :     //^2405:00D1
12116 :     _3929_09fb(13, _2405_005e(rl));
12117 :     //^2405:00E5
12118 :     return;
12119 :   }
12120 : 
12121 :   //^2C1D:06B5
12122 :   void _2c1d_06b5(ObjectID rl, U16 xx)
12123 :   {
12124 :     //^2C1D:06B5
12125 :     ENTER(0);
12126 :     //^2C1D:06B9
12127 :     ObjectID si = rl;
12128 :     //^2C1D:06BC
12129 :     if (si != si.FFFF) {
12130 :       //^2C1D:06C1
12131 :       si.ClearDir();
12132 :       //^2C1D:06C8
12133 :       _4976_57e0 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0);
12134 :       //^2C1D:06D5
12135 :       _4976_57e2 = QUERY_ITEM_WEIGHT(si);
12136 :       _4976_57c8.w0 = si;
12137 :       //^2C1D:06E3
12138 :       _2405_04f4(&_4976_57c8);
12139 :       //^2C1D:06EE
12140 :       _443c_085a();
12141 :       //^2C1D:06F3
12142 :       _2405_00c9(si);
12143 :       //^2C1D:06FA
12144 :       if (xx != 0) {
12145 :         //^2C1D:0700
12146 :         _4976_4c3a = 1;
12147 :       }
12148 :       else {
12149 :         //^2C1D:0708
12150 :         _443c_0434();
12151 :       }
12152 :       //^2C1D:070D
12153 :       _443c_086b();
12154 :       //^2C1D:0712
12155 :       _2c1d_03e7(_4976_3fc6, si, -1, 1);
12156 :       //^2C1D:0722
12157 :       _2fcf_2444(_4976_4bfa, _4976_4c06, -1, 1, 1, 0);
12158 :     }
12159 :     //^2C1D:073A
12160 :     return;
12161 :   }
12162 : 
12163 :   //^2E62:0CFA
12164 :   void _2e62_0cfa(U16 xx)
12165 :   {
12166 :     //^2E62:0CFA
12167 :     ENTER(4);
12168 :     //^2E62:0CFF
12169 :     for (U16 si = 0; si < _4976_4c3c; si++) {
12170 :       //^2E62:0D03
12171 :       if (si != _4976_52be) {
12172 :         //^2E62:0D0C
12173 :         _2e62_0670(si);
12174 :       }
12175 :       //^2E62:0D12
12176 :     }
12177 :     //^2E62:0D19
12178 :     if (_4976_52be != 0) {
12179 :       //^2E62:0D20
12180 :       U16 si = _4976_52be -1;
12181 :       //^2E62:0D26
12182 :       sk53b4 *bp04 = &_4976_53b4[si];
12183 :       //^2E62:0D34
12184 :       if (bp04->w257 != 0 && bp04->b256 >= 3 && bp04->b256 <= 6) {
12185 :         //^2E62:0D4F
12186 :         bp04->w50 |= (_4976_4c38 != 0 && _4976_57c8.w0 == ObjectID::FFFF) ? 0x3000 : 0x1000;
12187 :       }
12188 :       //^2E62:0D6C
12189 :       _2e62_0670(_4976_52be -1);
12190 :     }
12191 :     //^2E62:0D76
12192 :     _2759_0644(xx);
12193 :     //^2E62:0D7F
12194 :     return;
12195 :   }
12196 : 
12197 :   //^443C:0004
12198 :   void _443c_0004(U8 *buffSrc, U8 *buffDst, U8 *localpal)
12199 :   {
12200 :     //^443C:0004
12201 :     ENTER(20);
12202 :     //^443C:0009
12203 :     U8 *bp04 = ALLOC_PICT_BUFF(16, 16, afDefault, 4);
12204 :     //^443C:001F
12205 :     U8 bp14[16];
12206 :     for (i16 si = 0; si < 16; si++) {
12207 :       //^443C:0023
12208 :       bp14[si] = _4976_4bda[0];
12209 :       //^443C:002D
12210 :     }
12211 :     //^443C:0033
12212 :     bp14[12] = localpal[12];
12213 :     //^443C:003D
12214 :     _44c8_1d26(buffDst, localpal[12]);
12215 :     //^443C:0052
12216 :     DRAW_DIALOGUE_PICT(buffSrc, buffDst, reinterpret_cast<blit_rc *>(&_4976_4942), 0, 0, 12, bp14);
12217 :     //^443C:0075
12218 :     DRAW_DIALOGUE_PICT(buffSrc, buffDst, reinterpret_cast<blit_rc *>(&_4976_494a), 0, 0, 12, localpal);
12219 :     //^443C:0099
12220 :     FREE_PICT_BUFF(bp04);
12221 :     //^443C:00A6
12222 :     return;
12223 :   }
12224 : 
12225 :   //^443C:0434
12226 :   void _443c_0434()
12227 :   {
12228 :     //^443C:0434
12229 :     ENTER(4);
12230 :     //^443C:0438
12231 :     _4976_5dac = (_4976_57c8.w0 != ObjectID::FFFF) ? 1 : 0;
12232 :     //^443C:0449
12233 :     if (_4976_5dac != 0) {
12234 :       //^443C:044D
12235 :       U8 *bp04 = ALLOC_PICT_BUFF(18, 18, afDefault, 8);
12236 :       //^443C:0463
12237 :       _443c_0004(_4976_57ca, bp04, _4976_57ce);
12238 :       //^443C:047C
12239 :       _01b0_0b01(2, bp04, 8, 8, 18, 18, 8, NULL, _4976_57ce[12]) INDIRECT_CALL;
12240 :       //^443C:04A3
12241 :       FREE_PICT_BUFF(bp04);
12242 :     }
12243 :     //^443C:04B0
12244 :     _443c_040e();
12245 :     //^443C:04B4
12246 :     return;
12247 :   }
12248 : 
12249 :   //^2C1D:0889
12250 :   void _2c1d_0889(Bit16u xx)
12251 :   {
12252 :     //^2C1D:0889
12253 :     ENTER(4);
12254 :     //^2C1D:088F
12255 :     if (_4976_3fc6 == -1)
12256 :       //^2C1D:0896
12257 :       return;
12258 :     //^2C1D:0899
12259 :     U16 si;
12260 :     U16 di;
12261 :     if (xx < 8) {
12262 :       //^2C1D:089F
12263 :       if (_4976_4bfc != 0)
12264 :         //^2C1D:08A6
12265 :         return;
12266 :       //^2C1D:08A9
12267 :       di = xx << 1;
12268 :       //^2C1D:08B0
12269 :       if (di >= _4976_4c3c)
12270 :         //^2C1D:08B6
12271 :         return;
12272 :       //^2C1D:08B9
12273 :       if (di +1 == _4976_52be)
12274 :         //^2C1D:08C0
12275 :         return;
12276 :       //^2C1D:08C3
12277 :       if (_4976_53b4[di].curHP() == 0)
12278 :         //^2C1D:08D3
12279 :         return;
12280 :       //^2C1D:08D6
12281 :       si = xx & 1;
12282 :     }
12283 :     else {
12284 :       //^2C1D:08E0
12285 :       si = xx -8;
12286 :       //^2C1D:08E8
12287 :       di = ((si >= 30) ? _4976_5366 : _4976_52be) -1;
12288 :     }
12289 :     //^2C1D:08F8
12290 :     ObjectID bp02 = _4976_57c8.w0;
12291 :     //^2C1D:08FE
12292 :     ObjectID bp04 = (si >= 30) ? _4976_52c4[si -30] : _4976_53b4[di].Possess(si);
12293 :     //^2C1D:0926
12294 :     if (bp04 == bp04.FFFF && bp02 == bp02.FFFF)
12295 :       //^2C1D:0932
12296 :       return;
12297 :     //^2C1D:0935
12298 :     if (bp02 != bp02.FFFF) {
12299 :       //^2C1D:093B
12300 :       if (_48ae_01ec(bp02, si, 0) == 0)
12301 :         //^2C1D:094D
12302 :         return;
12303 :     }
12304 :     //^2C1D:0950
12305 :     _443c_085a();
12306 :     //^2C1D:0955
12307 :     if (bp02 != bp02.FFFF)
12308 :       //^2C1D:095B
12309 :       _2c1d_073d();
12310 :     //^2C1D:095F
12311 :     if (bp04 != bp04.FFFF) {
12312 :       //^2C1D:0965
12313 :       _2c1d_07a3(di, si);
12314 :       //^2C1D:096D
12315 :       _2c1d_06b5(bp04, 1);
12316 :     }
12317 :     //^2C1D:0978
12318 :     if (bp02 != bp02.FFFF) {
12319 :       //^2C1D:097E
12320 :       _2c1d_0831(di, bp02, si);
12321 :     }
12322 :     //^2C1D:098A
12323 :     _2e62_0cfa(0);
12324 :     //^2C1D:0992
12325 :     if (si == 11 || si == 6 || si == 12 || ((si < 7 || si > 9) && si >= 30)) {
12326 :       //^2C1D:09B0
12327 :       _4976_5352 = 1;
12328 :       //^2C1D:09B6
12329 :       _2759_0644(0);
12330 :     }
12331 :     //^2C1D:09BE
12332 :     if (_4976_4c3a != 0) {
12333 :       //^2C1D:09C5
12334 :       _4976_4c3a = 0;
12335 :       //^2C1D:09CB
12336 :       _443c_0434();
12337 :     }
12338 :     //^2C1D:09D0
12339 :     _443c_086b();
12340 :     //^2C1D:09D5
12341 :     return;
12342 :   }
12343 : 
12344 :   void _2c1d_0654(Bit16u xx); // TODO: Unreachable
12345 :   void _2759_28db(Bit16u xx); // TODO: Unreachable
12346 : 
12347 :   //^1031:16A0
12348 :   void _1031_16a0(Bit16u xx)
12349 :   {
12350 :     //^1031:16A0
12351 :     ENTER(0);
12352 :     //^1031:16A4
12353 :     U16 si = xx;
12354 :     //^1031:16A7
12355 :     if (si == _4976_3fc6)
12356 :       //^1031:16A7
12357 :       return;
12358 :     //^1031:16AD
12359 :     if (si != 0xffff && _4976_53b4[si].curHP() == 0)
12360 :       //^1031:16C0
12361 :       return;
12362 :     //^1031:16C2
12363 :     if (_4976_3fc6 != -1) {
12364 :       //^1031:16C9
12365 :       _4976_53b4[_4976_3fc6].w50 |= 0x1400;
12366 :     }
12367 :     //^1031:16D9
12368 :     _4976_3fc6 = si;
12369 :     //^1031:16DD
12370 :     if (si == 0xffff)
12371 :       //^1031:16E0
12372 :       return;
12373 :     //^1031:16E2
12374 :     if (si +1 == _4976_4bfc)
12375 :       //^1031:16E9
12376 :       return;
12377 :     //^1031:16EB
12378 :     _4976_53b4[si].w50 |= 0x1400;
12379 :     //^1031:16FA
12380 :     return;
12381 :   }
12382 : 
12383 :   //^2F3F:0000
12384 :   void _2f3f_0000(U16 player, ObjectID rl)
12385 :   {
12386 :     //^2F3F:0000
12387 :     ENTER(0);
12388 :     //^2F3F:0005
12389 :     for (U16 si = 0; si < 5; si++) {
12390 :       //^2F3F:000A
12391 :       U16 di = _4976_404d[si][0];
12392 :       //^2F3F:0017
12393 :       for (; _4976_404d[si][1] >= di; di++) {
12394 :         //^2F3F:0019
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 :           //^2F3F:006C
12404 :           _2c1d_0831(player, rl, di);
12405 :           //^2F3F:007B
12406 :           return;
12407 :         }
12408 :         //^2F3F:007D
12409 :       }
12410 :       //^2F3F:008D
12411 :     }
12412 :     //^2F3F:0096
12413 :     return;
12414 :   }
12415 : 
12416 :   //^2F3F:04EA
12417 :   void _2f3f_04ea(Bit16u xx, Bit16u yy, Bit16u dir, Bit16u zz, Bit16u ee)
12418 :   {
12419 :     //^2F3F:04EA
12420 :     ENTER(142);
12421 :     //^2F3F:04F0
12422 :     U16 si = _4976_4bfc -1;
12423 :     //^2F3F:04F6
12424 :     sk53b4 *bp04 = &_4976_53b4[si];
12425 :     //^2F3F:0504
12426 :     U16 bp0c = _4976_0c5a;
12427 :     //^2F3F:050A
12428 :     CHANGE_CURRENT_MAP_TO(zz);
12429 :     //^2F3F:0513
12430 :     ObjectID bp0e = _2c1d_073d();
12431 :     //^2F3F:051B
12432 :     if (ee == 161) {
12433 :       //^2F3F:0525
12434 :       _24a5_1798(4);
12435 :       //^2F3F:052D
12436 :       _443c_085a();
12437 :       //^2F3F:0532
12438 :             if (_4976_4c3c == 1)
12439 :         //^2F3F:0539
12440 :         _1031_16a0(0xffff);
12441 :       //^2F3F:0541
12442 :       if (_4976_4bfc >= _4976_4c3c)
12443 :         //^2F3F:054A
12444 :         _4976_4c3c--;
12445 :       //^2F3F:054E
12446 :       _4976_4bfc = 0;
12447 :       //^2F3F:0554
12448 :       bp04->curHP(0);
12449 :       //^2F3F:055D
12450 :       _4976_5342[si] = 0;
12451 :       //^2F3F:0567
12452 :       _4976_3de2[si] = 0xff;
12453 :       _4976_3dde[si] = 0xff;
12454 :       //^2F3F:0571
12455 :       _4976_5330[si][1] = 0;
12456 :       _4976_3de6[si][1] = 0xffff;
12457 :       //^2F3F:058A
12458 :       _4976_5330[si][0] = 0;
12459 :       _4976_3de6[si][0] = 0xffff;
12460 :       //^2F3F:05A3
12461 :       _4976_5330[si][2] = 0;
12462 :       //^2F3F:05B1
12463 :       FIRE_FILL_SCREEN_RECT(si +161, _4976_4bda[0]);
12464 :       //^2F3F:05C8
12465 :       _38c8_0060();
12466 :       //^2F3F:05CD
12467 :       _443c_086b();
12468 :     }
12469 :     else {
12470 :       //^2F3F:05D5
12471 :       if (_4976_404b == 0)
12472 :         //^2F3F:05DC
12473 :         _24a5_105b(1);
12474 :       //^2F3F:05E4
12475 :       if (bp0e != bp0e.FFFF)
12476 :         //^2F3F:05EA
12477 :         _2f3f_0000(si, bp0e);
12478 :       //^2F3F:05F4
12479 :       _4976_4bfc = 0;
12480 :       //^2F3F:05FA
12481 :       xx += _4976_0232[dir];
12482 :       //^2F3F:0606
12483 :       yy += _4976_023a[dir];
12484 :       //^2F3F:0612
12485 :       for (U16 bp0a = 0; bp0a < 30; bp0a++) {
12486 :         //^2F3F:0619
12487 :         ObjectID di = bp04->Possess(bp0a);
12488 :         //^2F3F:062A
12489 :         if (di != di.FFFF) {
12490 :           //^2F3F:062F
12491 :           CUT_RECORD_FROM(di, NULL, xx, yy);
12492 :         }
12493 :         //^2F3F:0642
12494 :       }
12495 :       //^2F3F:064B
12496 :       ObjectID di = GET_TILE_RECORD_LINK(xx, yy);
12497 :       while (true) {
12498 :         //^2F3F:0658
12499 :         if (di.DBType() == dbActuator) {
12500 :           //^2F3F:0667
12501 :           Actuator *bp08 = GET_ADDRESS_OF_RECORD3(di);
12502 :           //^2F3F:0674
12503 :           if (bp08->ActuatorType() == 0x7e) {
12504 :             //^2F3F:0683
12505 :             bp08->OnceOnlyActuator(0);
12506 :             //^2F3F:0688
12507 :             break;
12508 :           }
12509 :         }
12510 :         //^2F3F:068A
12511 :         di = GET_NEXT_RECORD_LINK(di);
12512 :       }
12513 :       //^2F3F:0693
12514 :       if (_4976_4c3c == 1) {
12515 :         //^2F3F:069A
12516 :         _4976_4b80 = _4976_4bec;
12517 :       }
12518 :       //^2F3F:06A8
12519 :       if (_4976_404b == 0) {
12520 :         //^2F3F:06AF
12521 :         _4976_52e6 = si;
12522 :         //^2F3F:06B3
12523 :         _3929_0b5a();
12524 :         //^2F3F:06B8
12525 :         U8 bp008e[128];
12526 :         _3929_09fb(_4976_3fec[si], QUERY_GDAT_TEXT(0x01, 0x00, 0x0e, bp008e));
12527 :         //^2F3F:06DD
12528 :         if (_4976_52be != 0) {
12529 :           //^2F3F:06E4
12530 :           _24a5_1798(4);
12531 :           //^2F3F:06EC
12532 :           _38c8_0060();
12533 :         }
12534 :       }
12535 :     }
12536 :     //^2F3F:06F1
12537 :     CHANGE_CURRENT_MAP_TO(bp0c);
12538 :     //^2F3F:06FA
12539 :     return;
12540 :   }
12541 : 
12542 :   //^24A5:1798
12543 :   void _24a5_1798(Bit16u xx)
12544 :   {
12545 :     //^24A5:1798
12546 :     ENTER(8);
12547 :     //^24A5:179E
12548 :     i16 di = xx;
12549 :     //^24A5:17A1
12550 :     U16 bp06 = 0;
12551 :     _4976_3d2e = 0;
12552 :     _4976_3d30 = ObjectID::FFFF;
12553 :     //^24A5:17B2
12554 :     if (di < 4 && _4976_53b4[di].curHP() == 0)
12555 :       //^24A5:17C7
12556 :       return;
12557 :     //^24A5:17CA
12558 :     if (_4976_4c3e != 0 || _4976_4ddc != 0 || _4976_4bfe != 0 || _4976_4c38 != 0)
12559 :       //^24A5:17EF
12560 :       return;
12561 :     //^24A5:17F2
12562 :     _4976_4e5c = 1;
12563 :     //^24A5:17F8
12564 :     U16 si = _4976_52be;
12565 :     //^24A5:17FC
12566 :     if (di +1 == si)
12567 :       //^24A5:1803
12568 :       di = 4;
12569 :     //^24A5:1806
12570 :     if (si == 0 || di == 4) {
12571 :       //^24A5:180F
12572 :       bp06 = 1;
12573 :       //^24A5:1814
12574 :       _443c_085a();
12575 :     }
12576 :     //^24A5:1819
12577 :     if (si != 0) {
12578 :       //^24A5:1820
12579 :       _4976_52be = 0;
12580 :       //^24A5:1826
12581 :       sk53b4 *bp04 = &_4976_53b4[si -1];
12582 :       //^24A5:1837
12583 :       if (bp04->curHP() != 0 && _4976_4bfc == 0) {
12584 :         //^24A5:1848
12585 :         bp04->w50 |= 0x4000;
12586 :         //^24A5:184E
12587 :         _2e62_0670(si -1);
12588 :       }
12589 :       //^24A5:1858
12590 :       for (i16 bp08 = 0; bp08 < 4; bp08++) {
12591 :         //^24A5:185F
12592 :         _4976_580a[si -1][bp08] -= _4976_52c0[bp08];
12593 :         //^24A5:1875
12594 :       }
12595 :       //^24A5:187E
12596 :       if (_4976_4be8 != 0) {
12597 :         //^24A5:1885
12598 :         if (bp06 != 0) {
12599 :           //^24A5:188E
12600 :           _443c_040e();
12601 :           _443c_086b();
12602 :         }
12603 :         //^24A5:1898
12604 :         goto _1913;
12605 :       }
12606 :       //^24A5:189A
12607 :       if (di == 4) {
12608 :         //^24A5:189F
12609 :         if (_4976_3d59 != 0)
12610 :           //^24A5:18A6
12611 :           _29ee_000f();
12612 :         //^24A5:18AB
12613 :         if (bp06 != 0)
12614 :           //^24A5:18B1
12615 :           _443c_086b();
12616 :         //^24A5:18B6
12617 :         _32cb_06cf();
12618 :         //^24A5:18BB
12619 :         goto _1913;
12620 :       }
12621 :     }
12622 :     //^24A5:18BD
12623 :     _4976_52be = di +1;
12624 :     //^24A5:18C3
12625 :     if (si == 0)
12626 :       //^24A5:18C7
12627 :       FIRE_FILL_HALFTONE_RECTI(9, 0);
12628 :     //^24A5:18D2
12629 :     ZERO_MEMORY(_4976_52c0, 4);
12630 :     //^24A5:18E2
12631 :     _4976_53b4[di].w50 |= 0xfc00;
12632 :     _4976_581a = 0;
12633 :     //^24A5:18F7
12634 :     _2e62_0670(di);
12635 :     //^24A5:18FE
12636 :     if (bp06 != 0)
12637 :       //^24A5:1904
12638 :       _443c_086b();
12639 :     //^24A5:1909
12640 :     _1031_0541(8);
12641 :     //^24A5:1911
12642 :     return;
12643 :     //^24A5:1913
12644 : _1913:
12645 :     _1031_0667();
12646 :     //^24A5:1918
12647 :     return;
12648 :   }
12649 : 
12650 :   //^32CB:06CF
12651 :   void _32cb_06cf()
12652 :   {
12653 :     //^32CB:06CF
12654 :     ENTER(0);
12655 :     //^32CB:06D2
12656 :     if (_4976_5be6 != 0) {
12657 :       //^32CB:06D9
12658 :       FIRE_FILL_BACKBUFF_RECT(&_4976_5938, _4976_4bda[0]);
12659 :     }
12660 :     //^32CB:06EF
12661 :     WRITE_UI16(_4976_4c16,-4,_4976_00f6); // width
12662 :     //^32CB:06FA
12663 :     WRITE_UI16(_4976_4c16,-2,_4976_00f8); // height
12664 :     //^32CB:0701
12665 :     WRITE_UI16(_4976_4c16,-6,8); // bpp
12666 :     //^32CB:0707
12667 :     _4976_022c = 0;
12668 :     //^32CB:070D
12669 :     return;
12670 :   }
12671 : 
12672 :   //^2759:213D
12673 :   sk3e22 *FIND_SPELL_BY_RUNES(U8 *runes)
12674 :   {
12675 :     // CSBwinSimilarity: TAG01c88e,Incantation2Spell
12676 : 
12677 :     //^2759:213D
12678 :     ENTER(10);
12679 :     //^2759:2141
12680 :     if (runes[1] == 0)
12681 :       //^2759:214B
12682 :       //^2759:21EF
12683 :       return NULL;
12684 :     //^2759:214E
12685 :     i16 bp06 = 24;
12686 :     U32 bp0a = 0;
12687 : 
12688 :     do {
12689 :       //^2759:215D
12690 :       bp0a |= U32(*(runes++)) << bp06;
12691 :       //^2759:2178
12692 :     } while (runes[0] != 0 && (bp06 -= 8) >= 0);
12693 :     //^2759:2187
12694 :     sk3e22 *bp04 = const_cast<sk3e22 *>(_4976_3e22);
12695 :     //^2759:218F
12696 :     for (bp06 = 34; bp06-- != 0; bp04++) {
12697 :       //^2759:2196
12698 :       if ((bp04->dw0 & 0xff000000) != 0) {
12699 :         //^2759:21AB
12700 :         if (bp04->dw0 != bp0a)
12701 :           //^2759:21BA
12702 :           continue;
12703 :         //^2759:21BC
12704 :         return bp04;
12705 :       }
12706 :       //^2759:21C4
12707 :             if ((bp0a & 0x00ffffff) == bp04->dw0)
12708 :         //^2759:21DF
12709 :         //^2759:21BC
12710 :         return bp04;
12711 :       //^2759:21E1
12712 :     }
12713 :     //^2759:21EF
12714 :     return NULL;
12715 :   }
12716 : 
12717 :   //^1C9A:121D
12718 :   ObjectID ALLOC_NEW_CREATURE(U16 creature, U16 healthMultiplier_1to31_baseIs8, U16 dir, U16 xx, U16 yy)
12719 :   {
12720 :     // arrange for a new creature record.
12721 : 
12722 :     // (creature += 0x8000) if you wanna create minion map's minion creature. then new missile record is attached to the minion creature.
12723 : 
12724 :     //^1C9A:121D
12725 :     ENTER(12);
12726 :     //^1C9A:1223
12727 :     U16 si = healthMultiplier_1to31_baseIs8;
12728 :     //^1C9A:1226
12729 :     U16 bp0c = creature & 0x8000;
12730 :     //^1C9A:122F
12731 :     ObjectID bp0a;
12732 :     if (bp0c != 0) {
12733 :       //^1C9A:1233
12734 :       creature &= 0x7fff;
12735 :       //^1C9A:1238
12736 :       bp0a = ALLOC_NEW_RECORD(dbMissile);
12737 :       //^1C9A:1243
12738 :       if (bp0a == bp0a.FFFF) {
12739 :         //^1C9A:1248
12740 :         return ObjectID::FFFF;
12741 :       }
12742 :     }
12743 :     //^1C9A:124E
12744 :     ObjectID di = ALLOC_NEW_RECORD(dbCreature);
12745 :     //^1C9A:1258
12746 :     if (di == di.FFFF || _4976_1a68 >= _4976_4ec2) {
12747 :       //^1C9A:1266
12748 :       if (bp0c != 0)
12749 :         //^1C9A:126C
12750 :         DEALLOC_RECORD(bp0a);
12751 :       //^1C9A:1275
12752 :       //^1C9A:1248
12753 :       return ObjectID::FFFF;
12754 :     }
12755 :     //^1C9A:1277
12756 :     Creature *bp04 = GET_ADDRESS_OF_RECORD4(di);
12757 :     //^1C9A:1284
12758 :     bp04->CreatureType(U8(creature));
12759 :     //^1C9A:128E
12760 :     sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(U8(creature));
12761 :     //^1C9A:129B
12762 :     bp04->SetPossessionObject(ObjectID::FFFE);
12763 :     //^1C9A:12A4
12764 :     bp04->b15 = 0xfb;
12765 :     //^1C9A:12A9
12766 :     bp04->b15_0_2(dir);
12767 :     //^1C9A:12B8
12768 :     bp04->b5_0_7(0xff);
12769 :     //^1C9A:12BD
12770 :     if (bp0c != 0) {
12771 :       //^1C9A:12C3
12772 :       APPEND_RECORD_TO(bp0a, &bp04->w2, -1, 0);
12773 :     }
12774 :     //^1C9A:12DB
12775 :     si = min_value(si, 31);
12776 :     //^1C9A:12E8
12777 :     si = (si * bp08->w4) >> 3;
12778 :     //^1C9A:12F4
12779 :     bp04->HP1(RAND16((si >> 3) +1) +si);
12780 :     //^1C9A:130A
12781 :     bp04->HP3(0);
12782 :     //^1C9A:1310
12783 :     bp04->HP4_0_4(xx);
12784 :     //^1C9A:131F
12785 :     bp04->HP4_5_9(yy);
12786 :     //^1C9A:1332
12787 :     bp04->HP4_A_F(_4976_0c5a);
12788 :     //^1C9A:1344
12789 :     bp04->w8 = 0xffff;
12790 :     //^1C9A:134A
12791 :     if (MOVE_RECORD_TO(di, -4, 0, xx, yy) == 1) {
12792 :       //^1C9A:1362
12793 :       //^1C9A:1248
12794 :       return ObjectID::FFFF;
12795 :     }
12796 :     //^1C9A:1365
12797 :     bp04->w8 = 0;
12798 :     //^1C9A:136E
12799 :     return di;
12800 :   }
12801 : 
12802 :   //^1C9A:103A
12803 :   ObjectID _1c9a_103a(U16 aa, U16 bb, U16 cc, U16 xx, U16 yy, U16 zz, ObjectID ww, i16 dir)
12804 :   {
12805 :     //^1C9A:103A
12806 :     ENTER(20);
12807 :     //^1C9A:1040
12808 :     U16 bp08 = _4976_0c5a;
12809 :     //^1C9A:1046
12810 :     CHANGE_CURRENT_MAP_TO(zz);
12811 :     //^1C9A:104F
12812 :     ObjectID si = si.FFFF;
12813 :     //^1C9A:1052
12814 :     U16 bp0a = (ww != ww.FFFF) ? 1 : 0;
12815 :     //^1C9A:1062
12816 :     U16 bp0e = xx;
12817 :     //^1C9A:1068
12818 :     U16 bp10 = yy;
12819 :     //^1C9A:106E
12820 :     U16 bp14 = (dir < 0) ? 0 : 4;
12821 :     //^1C9A:107E
12822 :     i16 bp12 = (RAND01() != 0) ? 1 : -1;
12823 :     do {
12824 :       //^1C9A:1092
12825 :       U16 bp06 = GET_TILE_VALUE(bp0e, bp10);
12826 :       //^1C9A:10A4
12827 :       U16 bp0c = bp06 >> 5;
12828 :       //^1C9A:10AC
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 :         //^1C9A:10EE
12837 :         ALLOC_NEW_CREATURE(
12838 :           (bp0a != 0) ? 0x8000 : 0,
12839 :           bb,
12840 :           cc,
12841 :           bp0e,
12842 :           bp10
12843 :           );
12844 :         //^1C9A:1117
12845 :         if (si != si.FFFF)
12846 :           //^1C9A:111A
12847 :           break;
12848 :       }
12849 :       //^1C9A:111C
12850 :       if (bp14 != 0) {
12851 :         //^1C9A:1122
12852 :         bp0e = xx + _4976_0232[dir];
12853 :         //^1C9A:1134
12854 :         bp10 = yy + _4976_023a[dir];
12855 :         //^1C9A:1146
12856 :         dir = (dir +bp12) & 3;
12857 :       }
12858 :       //^1C9A:1151
12859 :     } while (bp14-- != 0);
12860 :     //^1C9A:115E
12861 :     if (bp0a != 0 && si != si.FFFF) {
12862 :       //^1C9A:1169
12863 :       Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
12864 :       //^1C9A:1176
12865 :       ObjectID di = bp04->GetPossessionObject();
12866 :       //^1C9A:117D
12867 :       while (di != di.FFFE && di.DBType() != dbMissile)
12868 :         //^1C9A:117F
12869 :         di = GET_NEXT_RECORD_LINK(di);
12870 :       //^1C9A:119A
12871 :       ATLASSERT(di != di.FFFE);
12872 :       GET_ADDRESS_OF_RECORDE(di)->SetMissileObject(ww);
12873 :     }
12874 :     //^1C9A:11AC
12875 :     CHANGE_CURRENT_MAP_TO(bp08);
12876 :     //^1C9A:11B5
12877 :     return si;
12878 :   }
12879 : 
12880 :   //^2759:21F5
12881 :   i16 FIND_HAND_WITH_EMPTY_FLASK(sk53b4 *ref)
12882 :   {
12883 :     // CSBwinSimilarity: TAG01c9b2,GetFlaskInHand
12884 : 
12885 :     // return -1 if you've not.
12886 :     // return 0 if you've at right hand.
12887 :     // return 1 if you've at left hand.
12888 : 
12889 :     //^2759:21F5
12890 :     ENTER(0);
12891 :     //^2759:21FA
12892 :     for (i16 si = 2; --si >= 0; ) {
12893 :       //^2759:21FF
12894 :       ObjectID di = ref->Possess(si);
12895 :       //^2759:220F
12896 :       if (true
12897 :         && di.DBType() == dbPotion
12898 :         && QUERY_CLS2_FROM_RECORD(di) == 0x14
12899 :       ) {
12900 :         //^2759:2223
12901 :         break;
12902 :       }
12903 :       //^2759:2225
12904 :     }
12905 :     //^2759:2228
12906 :     return si;
12907 :   }
12908 : 
12909 :   //^2C1D:0B2C
12910 :   void _2c1d_0b2c(U16 player, U16 yy, U16 zz)
12911 :   {
12912 :     // CSBwinSimilarity: TAG01605a,AdjustSkills
12913 : 
12914 :     //^2C1D:0B2C
12915 :     ENTER(142);
12916 :     //^2C1D:0B32
12917 :     U16 di = yy;
12918 :     //^2C1D:0B35
12919 :     if (true
12920 :       && di >= 4 
12921 :       && di <= 11
12922 :       && (_4976_4bec -150 > _4976_0090)
12923 :     ) {
12924 :       //^2C1D:0B5B
12925 :       zz >>= 1;
12926 :     }
12927 :     //^2C1D:0B5E
12928 :     if (zz == 0)
12929 :       //^2C1D:0B64
12930 :       return;
12931 :     //^2C1D:0B67
12932 :     U16 bp06 = _4976_4d0a->Difficulty();
12933 :     //^2C1D:0B78
12934 :     if (bp06 != 0) {
12935 :       //^2C1D:0B7C
12936 :       zz = zz * bp06;
12937 :     }
12938 :     //^2C1D:0B85
12939 :     sk53b4 *bp04 = &_4976_53b4[player];
12940 :     //^2C1D:0B96
12941 :     U16 si = (di >= 4) ? ((di -4) >>2) : di;
12942 :     //^2C1D:0BA9
12943 :     bp06 = _2c1d_0a47(player, si, 0);
12944 :     //^2C1D:0BB9
12945 :     if (true
12946 :       && di >= 4
12947 :       && (_4976_4bec -25 < _4976_0090)
12948 :     ) {
12949 :       //^2C1D:0BD9
12950 :       zz <<= 1;
12951 :     }
12952 :     //^2C1D:0BDC
12953 :     bp04->dw93[di] += zz;
12954 :     //^2C1D:0BF2
12955 :     if (di >= 4) {
12956 :       //^2C1D:0BF7
12957 :       bp04->dw93[si] += zz;
12958 :     }
12959 :     //^2C1D:0C0A
12960 :     zz = _2c1d_0a47(player, si, 0);
12961 :     //^2C1D:0C1A
12962 :     if (bp06 <= bp06)
12963 :       //^2C1D:0C1F
12964 :       return;
12965 :     //^2C1D:0C22
12966 :     U16 bp0c = zz;
12967 :     //^2C1D:0C25
12968 :     U16 bp08 = RAND01();
12969 :     //^2C1D:0C2D
12970 :     U16 bp0a = RAND01() +1;
12971 :     //^2C1D:0C36
12972 :     bp06 = RAND01();
12973 :     //^2C1D:0C3E
12974 :     if (si != 2)
12975 :       //^2C1D:0C43
12976 :       bp06 &= zz;
12977 :     //^2C1D:0C49
12978 :     bp04->maxVit(bp04->maxVit() +U8(bp06));
12979 :     //^2C1D:0C57
12980 :     bp06 = bp04->curStamina();
12981 :     //^2C1D:0C5E
12982 :     bp04->maxAntiF(bp04->maxAntiF() + (RAND01() & (~zz)));
12983 :     //^2C1D:0C77
12984 :     U8 bp0d;
12985 :     switch (si) {
12986 :       case 0:
12987 :         //^2C1D:0C88
12988 :         bp0d = 6;    // 0x06 -> "<01>' JUST GAINED A FIGHTER LEVEL.<00>"
12989 :         //^2C1D:0C8C
12990 :         bp06 >>= 4;
12991 :         //^2C1D:0C90
12992 :         zz = bp06 * zz;
12993 :         //^2C1D:0C9B
12994 :         bp04->maxStr(bp04->maxStr() +U8(bp0a));
12995 :         //^2C1D:0CA9
12996 :         bp04->maxDex(bp04->maxDex() +U8(bp08));
12997 :         //^2C1D:0CB7
12998 :         break;
12999 : 
13000 :       case 1:
13001 :         //^2C1D:0CBA
13002 :         bp0d = 7;    // 0x07 -> "<01>' JUST GAINED A NINJA LEVEL.<00>"
13003 :         //^2C1D:0CBE
13004 :         bp06 = bp06 / 21;
13005 :         //^2C1D:0CCB
13006 :         zz <<= 1;
13007 :         //^2C1D:0CCE
13008 :         bp04->maxStr(bp04->maxStr() +U8(bp08));
13009 :         //^2C1D:0CDC
13010 :         bp04->maxDex(bp04->maxDex() +U8(bp0a));
13011 :         //^2C1D:0CE3
13012 :         //^2C1D:0CB0
13013 :         //^2C1D:0CB7
13014 :         break;
13015 : 
13016 :       case 3:
13017 :         //^2C1D:0CE5
13018 :         bp0d = 9;    // 0x09 -> "<01>' JUST GAINED A WIZARD LEVEL.<00>"
13019 :         //^2C1D:0CE9
13020 :         bp06 >>= 5;
13021 :         //^2C1D:0CED
13022 :         bp04->maxMP(zz + (zz >> 1) + bp04->maxMP());
13023 :         //^2C1D:0D02
13024 :         bp04->maxWiz(bp04->maxWiz() +U8(bp0a));
13025 :         //^2C1D:0D09
13026 :         goto _0d3a;
13027 : 
13028 :       case 2:
13029 :         //^2C1D:0D0B
13030 :         bp0d = 8;    // 0x08 -> "<01>' JUST GAINED A PRIEST LEVEL.<00>"
13031 :         //^2C1D:0D0F
13032 :         bp06 = bp06 / 25;
13033 :         //^2C1D:0D1C
13034 :         bp04->maxMP(bp04->maxMP() +zz);
13035 :         //^2C1D:0D2A
13036 :         zz += (zz +1) >> 1;
13037 :         //^2C1D:0D33
13038 :         bp04->maxWiz(bp04->maxWiz() +U8(bp08));
13039 :         //^2C1D:0D41
13040 : _0d3a:
13041 :         bp04->maxMP(bp04->maxMP() +min_value(RAND02(), bp0c -1));
13042 :         //^2C1D:0D5E
13043 :         if (bp04->maxMP() > 900)
13044 :           //^2C1D:0D63
13045 :           bp04->maxMP(900);
13046 :         //^2C1D:0D69
13047 :         bp04->maxAntiM(bp04->maxAntiM() +RAND02());
13048 : 
13049 :         break;
13050 :     }
13051 :     //^2C1D:0D7B
13052 :     bp04->maxHP(RAND16((zz >> 1) +1) +zz +bp04->maxHP());
13053 :     //^2C1D:0D98
13054 :     if (bp04->maxHP() > MAXHP)
13055 :       //^2C1D:0D9F
13056 :       bp04->maxHP(MAXHP);
13057 :     //^2C1D:0DA5
13058 :     bp04->maxStamina(RAND16((bp06 >> 1) +1) +bp06 +bp04->maxStamina());
13059 :     //^2C1D:0DC2
13060 :     if (bp04->maxStamina() > MAXSP)
13061 :       //^2C1D:0DC9
13062 :       bp04->maxStamina(MAXSP);
13063 :     //^2C1D:0DCF
13064 :     bp04->w50 |= 0x3800;
13065 :     //^2C1D:0DD8
13066 :     _4976_580a[player][si]++;
13067 :     //^2C1D:0DE2
13068 :     _3929_0b5a();
13069 :     //^2C1D:0DE7
13070 :     _4976_52e6 = player;
13071 :     //^2C1D:0DED
13072 :     U8 bp008e[128];
13073 :     _3929_09fb(_4976_3fec[player], QUERY_GDAT_TEXT(0x01, 0x00, bp0d, bp008e));
13074 :     //^2C1D:0E17
13075 :     return;
13076 :   }
13077 : 
13078 :   //^075F:000B
13079 :   void _075f_000b(ObjectID rl, U16 xx, U16 yy, U16 dir, U16 aa, U16 bb, U16 cc, U16 dd)
13080 :   {
13081 :     //^075F:000B
13082 :     ENTER(14);
13083 :     //^075F:0011
13084 :     ObjectID di = rl;
13085 :     //^075F:0014
13086 :     ObjectID si = ALLOC_NEW_RECORD(dbMissile);
13087 :     //^075F:001E
13088 :     if (si == si.FFFF) {
13089 :       //^075F:0023
13090 :       if (di.DBType() != dbCloud) {
13091 :         //^075F:0033
13092 :         MOVE_RECORD_TO(ObjectID(di, dir), -1, 0, xx, yy);
13093 :       }
13094 :       //^075F:0054
13095 :       return;
13096 :     }
13097 :     //^075F:0057
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 :     //^075F:0082
13110 :     si = ObjectID(si, dir);
13111 :     //^075F:0092
13112 :     Missile *bp04 = GET_ADDRESS_OF_RECORDE(si);
13113 :     //^075F:009F
13114 :     bp04->SetMissileObject(di);
13115 :     //^075F:00A6
13116 :     bp04->EnergyRemaining(U8(min_value(bb, 255)));
13117 :     //^075F:00BD
13118 :     bp04->EnergyRemaining2(U8(cc));
13119 :     //^075F:00C4
13120 :     APPEND_RECORD_TO(si, NULL, xx, yy);
13121 :     //^075F:00D7
13122 :     if (bp04->GetMissileObject() == ObjectID::FF80 && _4976_0c5a == _4976_4bf4)
13123 :       //^075F:00EA
13124 :       _4976_4cb8 = 1;
13125 :     //^075F:00F0
13126 :     sk5c20 bp0e;
13127 :     bp0e.SetMap(_4976_0c5a);
13128 :     bp0e.SetTick(_4976_4bec +1);
13129 :     //^075F:0113
13130 :     bp0e.TimerType((_4976_4b7e != 0) ? 0x1e : 0x1d);
13131 :     //^075F:0124
13132 :     bp0e.b5 = 0;
13133 :     //^075F:0128
13134 :     bp0e.w6 = si;
13135 :     //^075F:012B
13136 :     bp0e.w8_0_4(xx);
13137 :     //^075F:0138
13138 :     bp0e.w8_5_9(yy);
13139 :     //^075F:0149
13140 :     bp0e.w8_c_f(dd);
13141 :     //^075F:015B
13142 :     bp0e.w8_a_b(aa);
13143 :     //^075F:016B
13144 :     bp04->w6 = QUEUE_TIMER(&bp0e);
13145 :     //^075F:017E
13146 :     return;
13147 :   }
13148 : 
13149 :   //^2C1D:1CF3
13150 :   void _2c1d_1cf3(sk53b4 *ref, ObjectID rl, U16 yy, U16 zz, U16 ww)
13151 :   {
13152 :     //^2C1D:1CF3
13153 :     ENTER(0);
13154 :     //^2C1D:1CF7
13155 :     U16 si = ref->playerDir();
13156 :     //^2C1D:1D02
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 :     //^2C1D:1D57
13168 :     _4976_4c14 = 4;
13169 :     //^2C1D:1D5D
13170 :     _4976_4c0c = si;
13171 :     //^2C1D:1D61
13172 :     return;
13173 :   }
13174 : 
13175 :   //^2C1D:1D64
13176 :   U16 _2c1d_1d64(U16 xx, ObjectID rl, i16 zz, U16 ww)
13177 :   {
13178 :     //^2C1D:1D64
13179 :     ENTER(4);
13180 :     //^2C1D:1D6A
13181 :     U16 di = zz;
13182 :     //^2C1D:1D6D
13183 :     sk53b4 *bp04 = &_4976_53b4[xx];
13184 :     //^2C1D:1D7E
13185 :     if (bp04->curMP() < ww)
13186 :       //^2C1D:1D8A
13187 :       return 0;
13188 :     //^2C1D:1D8E
13189 :     bp04->curMP(bp04->curMP() -ww);
13190 :     //^2C1D:1D9C
13191 :     bp04->w50 |= 0x0800;
13192 :     //^2C1D:1DA2
13193 :     U16 si = 10 - min_value(8, bp04->maxStamina() >> 3);
13194 :     //^2C1D:1DBA
13195 :     if ((si << 2) > di) {
13196 :       //^2C1D:1DC3
13197 :       di += 3;
13198 :       //^2C1D:1DC6
13199 :       si--;
13200 :     }
13201 :     //^2C1D:1DC7
13202 :     _2c1d_1cf3(bp04, rl, di, 90, si);
13203 :     //^2C1D:1DDB
13204 :     return 1;
13205 :   }
13206 : 
13207 :   //^2759:15D0
13208 :   void _2759_15d0(U16 cmdNum, U16 yy)
13209 :   {
13210 :     //^2759:15D0
13211 :     ENTER(12);
13212 :     //^2759:15D6
13213 :     i16 bp0c = 1;
13214 :     //^2759:15DB
13215 :     yy = BETWEEN_VALUE(32, yy +1, 256);
13216 :     //^2759:15F0
13217 :     i16 si = yy >> 3;
13218 :     //^2759:15F5
13219 :     si = max_value(8, si);
13220 :     //^2759:1601
13221 :     U16 di ;
13222 :     switch (cmdNum) {
13223 :       case CmDarkness: // 6
13224 :         //^2759:1615
13225 :         di = ((si -8) << 4) +16;
13226 :         //^2759:1622
13227 :         bp0c = -2;
13228 :         //^2759:1627
13229 :         //^2759:1649
13230 :         si >>= 1;
13231 :         si--;
13232 :         break;
13233 : 
13234 :       case CmLight: // 38
13235 :         //^2759:1629
13236 :         di = ((si -3) << 7) +2000;
13237 :         //^2759:1636
13238 :         si >>= 2;
13239 :         si++;
13240 :         //^2759:163A
13241 :         break;
13242 : 
13243 :       case Cm39: // 39
13244 :         //^2759:163C
13245 :         di = ((si -8) << 9) +10000;
13246 :         //^2759:1649
13247 :         si >>= 1;
13248 :         si--;
13249 : 
13250 :         break;
13251 :     }
13252 :     //^2759:164C
13253 :     sk5c20 bp0a;
13254 :     bp0a.TimerType(0x46);
13255 :     //^2759:1650
13256 :     bp0a.w6 = (cmdNum == CmDarkness) ? si : -si;
13257 :     //^2759:1661
13258 :     bp0a.SetMap(_4976_4bf4);
13259 :     bp0a.SetTick(_4976_4bec +di);
13260 :     //^2759:1683
13261 :     bp0a.b5 = 0;
13262 :     //^2759:1687    
13263 :     QUEUE_TIMER(&bp0a);
13264 :     //^2759:1693
13265 :     _4976_57e4.w0 = _4976_3d34[si] * bp0c;
13266 :     //^2759:16A3
13267 :     _24a5_013d();
13268 :     //^2759:16A8
13269 :     return;
13270 :   }
13271 : 
13272 :   U16 _2c1d_0186(sk53b4 *ref, i16 xx, U16 yy, U16 zz); // TODO: Unreachable
13273 : 
13274 :   //^2759:0F39
13275 :   void _2759_0f39(U16 player, U16 yy, U16 zz)
13276 :   {
13277 :     //^2759:0F39
13278 :     ENTER(6);
13279 :     //^2759:0F3F
13280 :     U16 di = yy;
13281 :     U16 si = zz;
13282 :     //^2759:0F45
13283 :     sk53b4 *bp04 = &_4976_53b4[player];
13284 :     //^2759:0F56
13285 :     U16 bp06;
13286 :     (si == 0xffff) ? (bp06 = 3, si = 0) : (bp06 = 1);
13287 :     //^2759:0F69
13288 :     if (_4976_57e8 != 0)
13289 :       //^2759:0F70
13290 :       di >>= 2;
13291 :     //^2759:0F73
13292 :     di += 2;
13293 : 
13294 :     do {
13295 :       //^2759:0F75
13296 :       U16 cx = bp04->b42[si];
13297 :       //^2759:0F80
13298 :       if (cx < di) {
13299 :         //^2759:0F84
13300 :         cx = (cx >> 1) +di;
13301 :       }
13302 :       else {
13303 :         //^2759:0F8E
13304 :         cx += di >> 1;
13305 :       }
13306 :       //^2759:0F94
13307 :       if (cx > 255)
13308 :         //^2759:0F9A
13309 :         cx = 255;
13310 :       //^2759:0F9D
13311 :       bp04->b42[si] = U8(cx);
13312 :       //^2759:0FA6
13313 :       si++;
13314 :       //^2759:0FA7
13315 :     } while (--bp06 != 0);
13316 : 
13317 :     //^2759:0FAC
13318 :     return;
13319 :   }
13320 : 
13321 :   //^2759:222E
13322 :   U16 _2759_222e(U16 player, sk3e22 *ref, U16 zz)
13323 :   {
13324 :     // CSBwinSimilarity: TAG01ca0c,CastSpell
13325 : 
13326 :     //^2759:222E
13327 :     ENTER(30);
13328 :     //^2759:2234
13329 :     sk53b4 *bp04 = &_4976_53b4[player];
13330 :     //^2759:2245
13331 :     U16 bp0e = (ref->w6_a_f() * (zz +18)) / 24;
13332 :     //^2759:2264
13333 :     U16 bp08 = ref->b4 +zz;
13334 :     //^2759:2273
13335 :     U16 bp0c = 0
13336 :       +((RAND() & 7) + (bp08 << 4))
13337 :       +((ref->b4 * (zz -1)) << 3)
13338 :       +(bp08 * bp08)
13339 :       ;
13340 :     //^2759:22A6
13341 :     U16 bp06 = _2c1d_0a47(player, ref->b5, 1);
13342 :     //^2759:22BD
13343 :     U16 di;
13344 :     i16 bp0a;
13345 :     for (bp0a = bp08 -bp06; (bp0a--) > 0; ) {
13346 :       //^2759:22C8
13347 :       if ((RAND() & 127) > min_value(_2c1d_0ea2(bp04, 3, 0), 115)) {
13348 :         //^2759:22F5
13349 :         _2c1d_0b2c(player, ref->b5, bp0c << (bp08 -bp06));
13350 :         //^2759:2316
13351 :         di = 16;
13352 :         //^2759:2319
13353 :         goto _26fe;
13354 :       }
13355 :       //^2759:231C
13356 :     }
13357 :     //^2759:2326
13358 :     U16 bp1a;
13359 :     switch (ref->w6 & 15) {
13360 :       case 1: // transform flask to potion
13361 :         {
13362 :           //^2759:2341
13363 :           bp0a = FIND_HAND_WITH_EMPTY_FLASK(bp04);
13364 :           //^2759:2350
13365 :           if (bp0a < 0) {
13366 :             //^2759:2354
13367 :             di = 48;
13368 :             //^2759:2357
13369 :             goto _26fe;
13370 :           }
13371 :           //^2759:235A
13372 :           ObjectID si = _2c1d_07a3(player, bp0a);
13373 :           //^2759:2369
13374 :           SET_ITEMTYPE(si, ref->w6_4_9());
13375 :           //^2759:237E
13376 :           GET_ADDRESS_OF_RECORD8(si)->PotionPower(((RAND() & 15) + (zz * 40)) & 255);
13377 :           //^2759:23AC
13378 :           _2c1d_0831(player, si, bp0a);
13379 :           //^2759:23BB
13380 :           break;
13381 :         }
13382 :       case 2: // shoot spell?
13383 :         {
13384 :           //^2759:23BE
13385 :           if (ref->w6_4_9() == 4)
13386 :             //^2759:23D0
13387 :             bp06 <<= 1;
13388 :           //^2759:23D3
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 :           //^2759:2411
13396 :           break;
13397 :         }
13398 :       case 4: // minion?
13399 :         {
13400 :           //^2759:2414
13401 :           if (ref->w6_4_9() == 0x35) {
13402 :             //^2759:2426
13403 :             Creature *bp1e = reinterpret_cast<Creature *>(&_4976_4cca[dbCreature]);
13404 :             //^2759:2433
13405 :             for (bp08 = _4976_4d0e->nRecords[dbCreature]; (bp08--) != 0; bp1e++) {
13406 :               //^2759:2440
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 :                 //^2759:2470
13414 :                 _4976_4ebe[bp0a].b23 = 0x13;
13415 :                 //^2759:2483
13416 :                 goto _26cf;
13417 :               }
13418 :               //^2759:2486
13419 :             }
13420 :           }
13421 :           //^2759:2494
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 :           //^2759:24E0
13433 :           if (si == si.FFFF)
13434 :             //^2759:24E8
13435 :             _075f_0255(ObjectID::FFA8, 0x6e, _4976_4bfa, _4976_4c06, 255);
13436 :           //^2759:24FF
13437 :           break;
13438 :         }
13439 :       case 3: // field?
13440 :         {
13441 :           //^2759:2502
13442 :           sk5c20 bp18;
13443 :           bp18.b5 = 0;
13444 :           //^2759:2506
13445 :           bp08 = (zz +1) << 2;
13446 :           //^2759:2513
13447 :           ObjectID si;
13448 :           switch (ref->w6_4_9()) {
13449 :           case  0:
13450 :             //^2759:252D
13451 :             bp0a = 0x27;
13452 :             //^2759:2532
13453 :             goto _2540;
13454 : 
13455 :           case  1:
13456 :             //^2759:2534
13457 :             bp0a = 0x06;
13458 :             //^2759:2539
13459 :             goto _2540;
13460 : 
13461 :           case  5:
13462 :             //^2759:253B
13463 :             bp0a = 0x26;
13464 :             //^2759:2540
13465 : _2540:
13466 :             _2759_15d0(bp0a, bp08 * 9);
13467 :             //^2759:2550
13468 :             //^2759:25AC
13469 :             //^2759:2696
13470 :             break;
13471 : 
13472 :           case  3:
13473 :             //^2759:2553
13474 :             bp18.TimerType(0x47);
13475 :             //^2759:2557
13476 :             if (_4976_57e6++ == 0 && _4976_52be != 0) {
13477 :               //^2759:256B
13478 :               _4976_52af[_4976_52be].w50 |= 0x4000;
13479 :             }
13480 :             //^2759:257B
13481 :             bp08 <<= 3;
13482 :             //^2759:257F
13483 :             bp18.SetMap(_4976_4bf4);
13484 :             bp18.SetTick(_4976_4bec +bp08);
13485 :             //^2759:25A2
13486 :             QUEUE_TIMER(&bp18);
13487 :             //^2759:25AC
13488 :             //^2759:2696
13489 :             break;
13490 : 
13491 :           case  2:
13492 :             //^2759:25AF
13493 :             bp0a = 1;
13494 :             //^2759:25B4
13495 : _25b4:
13496 :             bp08 = bp08 * bp08 + 100;
13497 :             //^2759:25C0
13498 :             goto _25e8;
13499 : 
13500 :           case  8:
13501 :             //^2759:25C2
13502 :             bp0a = 0;
13503 :             //^2759:25C7
13504 :             goto _25b4;
13505 : 
13506 :           case  4:
13507 :             //^2759:25C9
13508 :             bp0a = 2;
13509 :             //^2759:25CE
13510 :             bp08 = bp08 * bp08;
13511 :             //^2759:25D4
13512 :             //^2759:25BD
13513 :             //^2759:25C0
13514 :             goto _25e8;
13515 : 
13516 :           case  6:
13517 :             //^2759:25D6
13518 :             bp0a = 5;
13519 :             //^2759:25DB
13520 : _25db:
13521 :             bp08 += 3;
13522 :             //^2759:25DF
13523 :             bp08 = bp08 * bp08;
13524 :             //^2759:25E8
13525 : _25e8:
13526 :             _2c1d_0186(bp04, bp0a, bp08, 0);
13527 :             //^2759:25FC
13528 :             //^2759:2664
13529 :             //^2759:2667
13530 :             break;
13531 : 
13532 :           case  7:
13533 :             //^2759:25FE
13534 :             bp0a = 4;
13535 :             //^2759:2603
13536 :             goto _25db;
13537 : 
13538 :           case  9:
13539 :             //^2759:2605
13540 :             bp0a = 6;
13541 :             //^2759:260A
13542 :             goto _25db;
13543 : 
13544 :           case 10:
13545 :             //^2759:260C
13546 :             bp0a = 3;
13547 :             //^2759:2611
13548 :             goto _25db;
13549 : 
13550 :           case 11:
13551 :             //^2759:2613
13552 :             _4976_57e8 = U8(min_value((bp08 << 3) + _4976_57e8, 255));
13553 :             //^2759:262F
13554 :             break;
13555 : 
13556 :           case 14:
13557 :             //^2759:2632
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 :             //^2759:2667
13566 :             break;
13567 : 
13568 :           case 15:
13569 :             //^2759:2669
13570 :             bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(0x0d, 0x0f, dtWordValue, 0x42);
13571 :             //^2759:267C
13572 :             si = ALLOC_NEW_DBITEM(bp1a);
13573 :             //^2759:2687
13574 :             if (_4976_57c8.w0 == 0xffff) {
13575 :               //^2759:268E
13576 :               _2c1d_06b5(si, 1);
13577 :               //^2759:2698
13578 :               break;
13579 :             }
13580 :             else {
13581 :               //^2759:269A
13582 :               bp08 = (RAND01() + _4976_4bf6) & 3;
13583 :               //^2759:26AC
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 :     //^2759:26CF
13603 : _26cf:
13604 :     di = 0;
13605 :     //^2759:26D1
13606 :     if (bp0e != 0) {
13607 :       //^2759:26D7
13608 :       _2c1d_0b2c(player, ref->b5, bp0c);
13609 :       //^2759:26EF
13610 :       _2759_0f39(player, bp0e, 2);
13611 :     }
13612 :     //^2759:26FE
13613 : _26fe:
13614 :     if (di != 0) {
13615 :       //^2759:2702
13616 :       bp08 = ref->b5;
13617 :       //^2759:270E
13618 :       if (bp08 > 3) {
13619 :         //^2759:2713
13620 :         bp08 = (bp08 -4) >> 2;
13621 :       }
13622 :       //^2759:271C
13623 :       di |= bp08;
13624 :     }
13625 :     //^2759:271F
13626 :     return di;
13627 :   }
13628 : 
13629 :   //^0B36:1757
13630 :   void _0b36_1757(U8 cls1, U8 cls2, U8 cls4, U16 vv, U16 ww)
13631 :   {
13632 :     //^0B36:1757
13633 :     ENTER(314);
13634 :     //^0B36:175B
13635 :     skxxx4 bp013a;
13636 :     _0b36_0520(&bp013a, cls1, cls2, cls4);
13637 :     //^0B36:1774
13638 :     bp013a.w48 = ww;
13639 :     bp013a.w24 = vv;
13640 :     //^0B36:1782
13641 :     _0b36_0a3f(_0b36_06d3(&bp013a));
13642 :     //^0B36:1796
13643 :     return;
13644 :   }
13645 : 
13646 :   //^48AE:0001
13647 :   U16 _48ae_0001(U16 xx)
13648 :   {
13649 :     //^48AE:0001
13650 :     ENTER(0);
13651 :     //^48AE:0004
13652 :     if (xx <= 0x3f) {
13653 :       //^48AE:000A
13654 :       if ((_4976_5f52[xx >> 3] & (1 << (xx & 7))) == 0)
13655 :         //^48AE:0023
13656 :         //^48AE:0054
13657 :         return 0;
13658 :       //^48AE:0025
13659 :       return 1;
13660 :     }
13661 :     //^48AE:002A
13662 :     if (xx <= 0x7f) {
13663 :       //^48AE:0030
13664 :       return _4976_5f12[xx -0x40];
13665 :     }
13666 :     //^48AE:003E
13667 :     if (xx <= 0xbf) {
13668 :       //^48AE:0045
13669 :       return _4976_5f5a[xx -0x80];
13670 :     }
13671 :     //^48AE:0054
13672 :     return 0;
13673 :   }
13674 : 
13675 :   //^48AE:0058
13676 :   U16 _48ae_0058(U16 xx, U16 yy, U16 zz)
13677 :   {
13678 :     //^48AE:0058
13679 :     ENTER(0);
13680 :     //^48AE:005D
13681 :     U16 di = yy;
13682 :     //^48AE:0060
13683 :     U16 si = _48ae_0001(xx);
13684 :     //^48AE:006A
13685 :     switch (zz) {
13686 :       case 0:
13687 :         //^48AE:0079
13688 :         si = 1;
13689 :         //^48AE:007C
13690 :         break;
13691 : 
13692 :       case 1:
13693 :         //^48AE:007E
13694 :         //^48AE:0084
13695 :         si = 0;
13696 :         //^48AE:0086
13697 :         break;
13698 : 
13699 :       case 2:
13700 :         //^48AE:0080
13701 :         si = (si != 0) ? 0 : 1;
13702 :         //^48AE:008B
13703 :         break;
13704 : 
13705 :       case 3:
13706 :         //^48AE:008D
13707 :         si += di;
13708 :         //^48AE:008F
13709 :         break;
13710 : 
13711 :       case 4:
13712 :         //^48AE:0091
13713 :         si -= di;
13714 :         //^48AE:0093
13715 :         break;
13716 : 
13717 :       case 5:
13718 :         break;
13719 : 
13720 :       case 6:
13721 :         //^48AE:0095
13722 :         si = di;
13723 :         break;
13724 :     }
13725 :     //^48AE:0097
13726 :     if (xx <= 0x3f) {
13727 :       //^48AE:009D
13728 :       zz = 1 << (xx & 7);
13729 :       //^48AE:00AB
13730 :       xx <<= 3;
13731 :       //^48AE:00AF
13732 :       if (si != 0) {
13733 :         //^48AE:00B3
13734 :         si = 1;
13735 :         //^48AE:00B6
13736 :         _4976_5f52[xx] = U8(zz);
13737 :         //^48AE:00C0
13738 :         //^48AE:0106
13739 :         return si;
13740 :       }
13741 :       else {
13742 :         //^48AE:00C2
13743 :         _4976_5f52[xx] &= ~U8(zz);
13744 :         //^48AE:00CE
13745 :         //^48AE:0106
13746 :         return si;
13747 :       }
13748 :     }
13749 :     //^48AE:00D0
13750 :     if (xx <= 0x7f) {
13751 :       //^48AE:00D6
13752 :       si = BETWEEN_VALUE(0, si, 255);
13753 :       //^48AE:00E6
13754 :       _4976_5f12[xx -0x40] = U8(si);
13755 :       //^48AE:00F0
13756 :       //^48AE:0106
13757 :       return si;
13758 :     }
13759 :     //^48AE:00F2
13760 :     if (xx <= 0xbf) {
13761 :       //^48AE:00F9
13762 :       _4976_5f5a[xx -0x80] = si;
13763 :     }
13764 :     //^48AE:0106
13765 :     return si;
13766 :   }
13767 : 
13768 :   //^29EE:0B4A
13769 :   void _29ee_0b4a(U16 xx)
13770 :   {
13771 :     //^29EE:0B4A
13772 :     ENTER(0);
13773 :     //^29EE:0B4F
13774 :     U16 di = 1;
13775 :     //^29EE:0B52
13776 :     U16 si;
13777 :     switch (xx & 0xfff0) {
13778 :       case 0x0010:
13779 :         //^29EE:0B69
13780 :         if ((xx & 15) == 3) {
13781 :           //^29EE:0B74
13782 :           _4976_5340 = 0xfffc;
13783 :         }
13784 :         else {
13785 :           //^29EE:0B7C
13786 :           _4976_5340 = 0xfffb;
13787 :         }
13788 :         //^29EE:0B82
13789 :         si = 0x45;
13790 :         //^29EE:0B85
13791 :         goto _0baa;
13792 : 
13793 :       case 0x0020:
13794 :         //^29EE:0B87
13795 :         _4976_5340 = 0xfffd;
13796 :         //^29EE:0B8D
13797 :         si = 0x46;
13798 :         //^29EE:0B90
13799 :         goto _0baa;
13800 : 
13801 :       case 0x0030:
13802 :         //^29EE:0B92
13803 :         _0b36_1757(0x01, 0x05, dtWordValue, 0x5c, -1);
13804 :         //^29EE:0BA4
13805 :         si = 0x44;
13806 :         di = 0x03;
13807 :         //^29EE:0BAA
13808 : _0baa:
13809 :         _4976_5352 = max_value(di, 8 - _48ae_0058(si, 1, 3));
13810 : 
13811 :         break;
13812 :     }
13813 :     //^29EE:0BC8
13814 :     return;
13815 :   }
13816 : 
13817 :   //^2759:274D
13818 :   Bit16u _2759_274d()
13819 :   {
13820 :     //^2759:274D
13821 :     ENTER(10);
13822 :     //^2759:2753
13823 :     U16 bp0a = _4976_5366 -1;
13824 :     //^2759:275A
13825 :     sk53b4 *bp04 = &_4976_53b4[bp0a];
13826 :     //^2759:2768
13827 :     sk3e22 *bp08 = FIND_SPELL_BY_RUNES(bp04->GetRunes());
13828 :     //^2759:277E
13829 :     U16 si = (bp08 == NULL) 
13830 :       ? 32
13831 :       : _2759_222e(bp0a, bp08, i16(bp04->GetRunes()[0]) -0x5f);
13832 :     //^2759:27A5
13833 :     U16 di = (si != 0) ? 1 : 0;
13834 :     //^2759:27B2
13835 :     if (di != 0)
13836 :       //^2759:27B6
13837 :       _29ee_0b4a(si);
13838 :     //^2759:27BD
13839 :     si &= 0x00f0;
13840 :     //^2759:27C1
13841 :     if (si != 0x0030) {
13842 :       //^2759:27C8
13843 :       bp04->GetRunes()[0] = 0;
13844 :       bp04->b30 = 0;
13845 :       //^2759:27D5
13846 :       _2759_0541();
13847 :     }
13848 :     //^2759:27D9
13849 :     return di;
13850 :   }
13851 : 
13852 :   //^2759:289C
13853 :   void REMOVE_RUNE_FROM_TAIL()
13854 :   {
13855 :     //^2759:289C
13856 :     ENTER(4);
13857 :     //^2759:28A0
13858 :     sk53b4 *bp04 = &_4976_52af[_4976_5366];
13859 :     //^2759:28B1
13860 :     bp04->RuneCnt(bp04->RuneCnt() -1);
13861 :     //^2759:28BE
13862 :     bp04->GetRunes()[bp04->RuneCnt()] = 0;
13863 :     //^2759:28C7
13864 :     _4976_5352 = 1;
13865 :     //^2759:28CD
13866 :     _2759_0644(0);
13867 :     //^2759:28D4
13868 :     _1031_0667();
13869 :     //^2759:28D9
13870 :     return;
13871 :   }
13872 : 
13873 :   //^2759:27DF
13874 :   void ADD_RUNE_TO_TAIL(Bit16u symbol_0to5)
13875 :   {
13876 :     //^2759:27DF
13877 :     ENTER(6);
13878 :     //^2759:27E5
13879 :     sk53b4 *bp04 = &_4976_52af[_4976_5366];
13880 :     //^2759:27F6
13881 :     U16 si = bp04->RuneCnt();
13882 :     //^2759:2801
13883 :     U16 di = _4976_3e00[si * 6 +symbol_0to5];
13884 :     //^2759:2813
13885 :     if (si != 0) {
13886 :       //^2759:2817
13887 :       di = (_4976_3e18[i8(bp04->GetRunes()[0]) -0x60] * di) >> 3;
13888 :     }
13889 :     //^2759:2832
13890 :     U16 bp06 = 0;
13891 :     //^2759:2837
13892 :     if (bp04->curMP() >= di) {
13893 :       //^2759:2840
13894 :       bp04->curMP(bp04->curMP() -di);
13895 :       //^2759:284A
13896 :       bp04->w50 |= 0x0800;
13897 :       //^2759:2850
13898 :       bp04->GetRunes()[si] = si * 6 +symbol_0to5 +0x60; si++;
13899 :       //^2759:2861
13900 :       bp04->RuneCnt(U8(si));
13901 :       //^2759:2867
13902 :       bp04->GetRunes()[si] = 0;
13903 :       //^2759:2870
13904 :       bp06 = 1;
13905 :     }
13906 :     //^2759:2875
13907 :     _4976_5352 = 1;
13908 :     //^2759:287B
13909 :     _2759_0644(0);
13910 :     //^2759:2882
13911 :     _1031_0667();
13912 :     //^2759:2887
13913 :     if (bp06 != 0) {
13914 :       //^2759:288D
13915 :       _2e62_0670(_4976_5366 -1);
13916 :     }
13917 :     //^2759:2898
13918 :     return;
13919 :   }
13920 : 
13921 :   //^2759:01E3
13922 :   U16 QUERY_CUR_CMDSTR_ENTRY(U16 cmdNum)
13923 :   {
13924 :     //^2759:01E3
13925 :     ENTER(0);
13926 :     //^2759:01E6
13927 :     return QUERY_CMDSTR_ENTRY(_4976_534f, _4976_5350, _4976_534e, cmdNum);
13928 :   }
13929 : 
13930 :   //^2C1D:111E
13931 :   U16 _2c1d_111e(U16 player)
13932 :   {
13933 :     //^2C1D:111E
13934 :     ENTER(4);
13935 :     //^2C1D:1123
13936 :     sk53b4 *bp04 = &_4976_53b4[player];
13937 :     //^2C1D:1134
13938 :     i16 si = (RAND() & 7) + _2c1d_0ea2(bp04, 2, 0);
13939 :     //^2C1D:1153
13940 :     si -= (_2c1d_203d(player) * i32(si >> 1)) / _2c1d_0ffc(bp04);
13941 :     //^2C1D:1182
13942 :     si = max_value(2, si);
13943 :     //^2C1D:118E
13944 :     if (_4976_4be8 != 0)
13945 :       //^2C1D:1195
13946 :       si >>= 1;
13947 :     //^2C1D:1197
13948 :     return BETWEEN_VALUE(100 - (RAND() & 7), (si >> 1), (RAND() & 7) +1);
13949 :   }
13950 : 
13951 :   //^2C1D:0F67
13952 :   U16 _2c1d_0f67(sk53b4 *ref, U16 xx)
13953 :   {
13954 :     //^2C1D:0F67
13955 :     ENTER(0);
13956 :     //^2C1D:0F6B
13957 :     U16 si = xx;
13958 :     //^2C1D:0F6E
13959 :     if (RAND01() != 0 && RAND16(100) > si) {
13960 :       //^2C1D:0F83
13961 :       return 1;
13962 :     }
13963 :     //^2C1D:0F88
13964 :     si = (RAND16(_2c1d_0ea2(ref, 0, 0) << 1) > si) ? 1 : 0;
13965 :     //^2C1D:0FAF
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 :     //^2C1D:0FF9
13968 :     return si;
13969 :   }
13970 : 
13971 :   //^075F:1F33
13972 :   U16 _075f_1f33(sk53b4 *ref, U16 aa, ObjectID rl, U16 xx, U16 yy, U16 bb, U16 cc, U16 dd, U16 ee)
13973 :   {
13974 :     //^075F:1F33
13975 :     ENTER(16);
13976 :     //^075F:1F39
13977 :     if (aa >= _4976_4c3c)
13978 :       //^075F:1F42
13979 :       return 0;
13980 :     //^075F:1F47
13981 :     if (ref->curHP() == 0)
13982 :       //^075F:1F51
13983 :       //^075F:1F42
13984 :       return 0;
13985 :     //^075F:1F53
13986 :     U16 bp0c = _4976_4d0a->Difficulty() << 1;
13987 :     //^075F:1F66
13988 :     Creature *bp08 = GET_ADDRESS_OF_RECORD4(rl);
13989 :     //^075F:1F75
13990 :     sk03a2 *bp04 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp08->CreatureType());
13991 :     //^075F:1F89
13992 :     i16 si;
13993 :     i16 di;
13994 :     if (true
13995 :       && bp04->b8 != 255
13996 :       && ((bp04->w24 & 0x1000) == 0 || ee == 1)
13997 :     ) {
13998 :       //^075F:1FAA
13999 :       ObjectID bp10 = GET_CREATURE_AT(xx, yy);
14000 :       //^075F:1FBA
14001 :       if (bp10 == bp10.FFFF || _1c9a_0958(bp10) == 0) {
14002 :         //^075F:1FCF
14003 :         U16 bp0e = bb & 0x8000;
14004 :         //^075F:1FD8
14005 :         bb &= 0x7fff;
14006 :         //^075F:1FDD
14007 :         if ((bp04->w0 & 0x0020) == 0 || bp0e != 0) {
14008 :           //^075F:1FF0
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 :             //^075F:2047
14015 :             si = _2c1d_11bf(aa, _4976_5354, dd);
14016 :             //^075F:205B
14017 :             if (si != 0) {
14018 :               //^075F:205F
14019 :               si = RAND16((si >> 1) +1) +si;
14020 :               //^075F:2071
14021 :               si = (i32(si) * cc) >> 5;
14022 :               //^075F:208B
14023 :               U16 bp0a = bp04->b2 +(RAND() & 31) +bp0c;
14024 :               //^075F:20A4
14025 :               di = si = (RAND() & 31) +si -bp0a;
14026 :               //^075F:20B5
14027 :               if (di <= 1)
14028 :                 //^075F:20B8
14029 :                 goto _2112;
14030 :             }
14031 :             //^075F:20BA
14032 :             si = RAND02();
14033 :             //^075F:20C1
14034 :             if (si != 0) {
14035 :               //^075F:20C8
14036 :               si++;
14037 :               //^075F:20C9
14038 :               di = (RAND() & 15) +di;
14039 :               //^075F:20D7
14040 :               if (di > 0 || RAND01() != 0) {
14041 :                 //^075F:20E6
14042 :                 si = RAND02() +si;
14043 :                 //^075F:20F1
14044 :                 if (RAND02() == 0) {
14045 :                   //^075F:20FA
14046 :                   si += max_value(0, (RAND() & 15) +di);
14047 :                 }
14048 :               }
14049 :               //^075F:2112
14050 : _2112:
14051 :               si >>= 1;
14052 :               //^075F:2114
14053 :               si = RAND16(si) +RAND02() +si;
14054 :               //^075F:2128
14055 :               si = RAND16(si) +si;
14056 :               //^075F:2135
14057 :               si >>= 2;
14058 :               //^075F:2138
14059 :               si = RAND02() +si +1;
14060 :               //^075F:2142
14061 :               if ((RAND() & 63) < _2c1d_0a47(aa, dd, 1)) {
14062 :                 //^075F:2160
14063 :                 si += si +10;
14064 :               }
14065 :               //^075F:2167
14066 :               di = QUERY_GDAT_DBSPEC_WORD_VALUE(ref->Possess(_4976_5354), 13);
14067 :               //^075F:2181
14068 :               if (di != 0 && (RAND() & 31) < si) {
14069 :                 //^075F:2191
14070 :                 si = _1c9a_198e(rl, di) +si;
14071 :               }
14072 :               //^075F:21A2
14073 :               _2c1d_0b2c(aa, dd, ((bp04->w22_8_b() * si) >> 4) +3);
14074 :               //^075F:21CA
14075 :               _2c1d_1c7c(aa, RAND02() +4);
14076 :               //^075F:21D2
14077 :               goto _21dd;
14078 :             }
14079 :           }
14080 :         }
14081 :       }
14082 :     }
14083 :     //^075F:21D4
14084 :     si = 0;
14085 :     //^075F:21D6
14086 :     _2c1d_1c7c(aa, RAND01() +2);
14087 :     //^075F:21E8
14088 : _21dd:
14089 :     _13e4_0401(rl, xx, yy, 0x6002, 0x5a, si);
14090 :     //^075F:21FF
14091 :     return si;
14092 :   }
14093 : 
14094 :   //^2759:14C8
14095 :   U16 _2759_14c8(U16 player, U16 bb, U16 xx, U16 yy, U16 cc, U16 dd)
14096 :   {
14097 :     //^2759:14C8
14098 :     ENTER(4);
14099 :     //^2759:14CE
14100 :     sk53b4 *bp04 = &_4976_53b4[player];
14101 :     //^2759:14DF
14102 :     if (_4976_534c == ObjectID::FFFF)
14103 :       //^2759:14E6
14104 :       //^2759:15CA
14105 :       return 0;
14106 :     //^2759:14E9
14107 :     if (GET_CREATURE_AT(xx, yy) == ObjectID::FFFF)
14108 :       //^2759:14FB
14109 :       //^2759:15CA
14110 :       return 0;
14111 :     //^2759:14FE
14112 :     U16 di = bp04->playerPos();
14113 :     //^2759:1509
14114 :     U16 si;
14115 :     switch ((di +4 -bp04->playerDir()) & 3) {
14116 :       case 2:
14117 :         //^2759:1526
14118 :         si = 3;
14119 :         //^2759:1529
14120 :         goto _152e;
14121 : 
14122 :       case 3:
14123 :         //^2759:152B
14124 :         si = 1;
14125 :         //^2759:152E
14126 : _152e:
14127 :         if (GET_PLAYER_AT_POSITION((di + si) & 3) != -1) {
14128 :           //^2759:1541
14129 :           _4976_5340 = 0xffff;
14130 :           //^2759:1547
14131 :           _4976_5352 = max_value(1, 8 - _48ae_0058(66, 1, 3));
14132 :           //^2759:1567
14133 :           //^2759:15CA
14134 :           return 0;
14135 :         }
14136 : 
14137 :         break;
14138 :     }
14139 :     //^2759:1569
14140 :     if (bb == 1) {
14141 :       //^2759:156F
14142 :       if ((_0cee_2de0(_4976_534c) & 0x0020) == 0)
14143 :         //^2759:157C
14144 :         //^2759:15CA
14145 :         return 0;
14146 :     }
14147 :     //^2759:157E
14148 :     si = QUERY_CUR_CMDSTR_ENTRY(CnPB);
14149 :     //^2759:1587
14150 :     di = QUERY_CUR_CMDSTR_ENTRY(CnDM);
14151 :     //^2759:1590
14152 :     if (QUERY_CUR_CMDSTR_ENTRY(CnHN) != 0)
14153 :       //^2759:159B
14154 :       si |= 0x8000;
14155 :     //^2759:159F
14156 :     _4976_5340 = _075f_1f33(bp04, player, _4976_534c, xx, yy, si, di, cc, dd);
14157 :     //^2759:15C5
14158 :     return 1;
14159 :   }
14160 : 
14161 :     U16 _2759_1451(U16 ww, U16 xx, U16 yy); // TODO: Unreachable
14162 : 
14163 :   //^2C1D:0E57
14164 :   i16 _2c1d_0e57(sk53b4 *ref, i16 xx)
14165 :   {
14166 :     //^2C1D:0E57
14167 :     ENTER(2);
14168 :     //^2C1D:0E5D
14169 :     i16 si = xx;
14170 :     //^2C1D:0E60
14171 :     i16 bp02 = ref->curStamina();
14172 :     //^2C1D:0E6A
14173 :     U16 di = ref->maxStamina() >> 1;
14174 :     //^2C1D:0E72
14175 :     if (bp02 < di) {
14176 :       //^2C1D:0E76
14177 :       si >>= 1;
14178 :       //^2C1D:0E78
14179 :       return (i32(si) * i32(bp02)) / i32(di) +si;
14180 :     }
14181 :     //^2C1D:0E9C
14182 :     return si;
14183 :   }
14184 : 
14185 :   //^2C1D:11BF
14186 :   U16 _2c1d_11bf(U16 xx, U16 yy, i16 zz)
14187 :   {
14188 :     //^2C1D:11BF
14189 :     ENTER(8);
14190 :     //^2C1D:11C5
14191 :     sk53b4 *bp04 = &_4976_53b4[xx];
14192 :     //^2C1D:11D6
14193 :     i16 si = (RAND() & 15) + _2c1d_0ea2(bp04, 1, 0);
14194 :     //^2C1D:11F5
14195 :     ObjectID bp08 = bp04->Possess(yy);
14196 :     //^2C1D:1207
14197 :     U16 bp06 = QUERY_ITEM_WEIGHT(bp08);
14198 :     //^2C1D:1211
14199 :     U16 di = _2c1d_0ffc(bp04) >> 4;
14200 :     //^2C1D:1222
14201 :     si = (bp06 -12) +si;
14202 :     //^2C1D:122E
14203 :     if (bp06 > di) {
14204 :       //^2C1D:1233
14205 :       si = si - ((bp06 -di) >> 1);
14206 :       //^2C1D:123E
14207 :       di += (di -12) >> 1;
14208 :       //^2C1D:1249
14209 :       if (di < bp06) {
14210 :         //^2C1D:124E
14211 :         si = si -((bp06 -di) << 1);
14212 :       }
14213 :     }
14214 :     //^2C1D:1259
14215 :     if (zz >= 0) {
14216 :       //^2C1D:125F
14217 :       si = (_2c1d_0a47(xx, zz, 1) << 1) +si;
14218 :       //^2C1D:1276
14219 :       di = 0;
14220 :       //^2C1D:1278
14221 :       switch (zz) {
14222 :         case  0:
14223 :         case  4:
14224 :         case  5:
14225 :         case  6:
14226 :         case  7:
14227 :         case  9:
14228 :           //^2C1D:1287
14229 :           di = QUERY_GDAT_DBSPEC_WORD_VALUE(bp08, 8);
14230 :           //^2C1D:1295
14231 :           break;
14232 : 
14233 :         case  1:
14234 :         case 10:
14235 :         case 11:
14236 :           //^2C1D:1297
14237 :           di = QUERY_GDAT_DBSPEC_WORD_VALUE(bp08, 9);
14238 :           //^2C1D:12A5
14239 :           if (di == 0)
14240 :             //^2C1D:12A7
14241 :             break;
14242 :           //^2C1D:12A9
14243 :           if ((QUERY_GDAT_DBSPEC_WORD_VALUE(bp08, 5) & 0x8000) != 0) {
14244 :             //^2C1D:12BA
14245 :             if (zz != 11)
14246 :               //^2C1D:12C0
14247 :               di = 0;
14248 :             //^2C1D:12C2
14249 :             break;
14250 :           }
14251 :           //^2C1D:12C4
14252 :           if (zz == 11)
14253 :             //^2C1D:12CA
14254 :             di = 0;
14255 : 
14256 :           break;
14257 : 
14258 :         case  2:
14259 :         case  3:
14260 :         case  8:
14261 : 
14262 :           break;
14263 :       }
14264 :       //^2C1D:12CC
14265 :       si = si + di;
14266 :     }
14267 :     //^2C1D:12D2
14268 :     si = _2c1d_0e57(bp04, si);
14269 :     //^2C1D:12E2
14270 :     if ((bp04->w52 & ((yy == 0) ? 1 : 2)) != 0)
14271 :       //^2C1D:12FD
14272 :       si >>= 1;
14273 :     //^2C1D:12FF
14274 :     return BETWEEN_VALUE(0, si >> 1, 100);
14275 :   }
14276 : 
14277 :   //^2C1D:0E23
14278 :   U16 _2c1d_0e23(U16 xx)
14279 :   {
14280 :     //^2C1D:0E23
14281 :     ENTER(0);
14282 :     //^2C1D:0E28
14283 :     i16 di;
14284 :     U16 si = BETWEEN_VALUE(1, di = (QUERY_ITEM_WEIGHT(xx) >> 1), 10);
14285 :     //^2C1D:0E44
14286 :     while ((di -= 10) > 0) {
14287 :       //^2C1D:0E46
14288 :       si += di >> 1;
14289 :     }
14290 :     //^2C1D:0E51
14291 :     return si;
14292 :   }
14293 : 
14294 :   //^2C1D:1DE2
14295 :   U16 _2c1d_1de2(U16 xx, i16 yy, U16 zz)
14296 :   {
14297 :     //^2C1D:1DE2
14298 :     ENTER(16);
14299 :     //^2C1D:1DE8
14300 :     U16 di = xx;
14301 :     //^2C1D:1DEB
14302 :     sk53b4 *bp04 = &_4976_53b4[di];
14303 :     //^2C1D:1DFB
14304 :     U16 bp0e = 0;
14305 :     //^2C1D:1E00
14306 :     ObjectID bp0c ;
14307 :     ObjectID si ;
14308 :     if (yy < 0) {
14309 :       //^2C1D:1E06
14310 :       if (_4976_57c8.w0 == ObjectID::FFFF)
14311 :         //^2C1D:1E0D
14312 :         return 0;
14313 :       //^2C1D:1E12
14314 :             bp0c = bp04->Possess(1);
14315 :       //^2C1D:1E1D
14316 :       si = _2c1d_073d();
14317 :       //^2C1D:1E23
14318 :       bp04->Possess(1, si);
14319 :       //^2C1D:1E2B
14320 :       yy = 1;
14321 :       //^2C1D:1E30
14322 :       bp0e = 1;
14323 :     }
14324 :     //^2C1D:1E35
14325 :     i16 bp0a = _2c1d_11bf(di, yy, 10);
14326 :     //^2C1D:1E45
14327 :     if (bp0e != 0) {
14328 :       //^2C1D:1E4B
14329 :       bp04->Possess(1, bp0c);
14330 :     }
14331 :     else {
14332 :       //^2C1D:1E58
14333 :       si = _2c1d_07a3(di, yy);
14334 :       //^2C1D:1E64
14335 :       if (si == si.FFFF)
14336 :         //^2C1D:1E69
14337 :         //^2C1D:1E0D
14338 :         return 0;
14339 :     }
14340 :     //^2C1D:1E6B
14341 :     QUEUE_NOISE_GEN2(QUERY_CLS1_FROM_RECORD(si), QUERY_CLS2_FROM_RECORD(si), 0x86, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x6e, 0x80);
14342 :     //^2C1D:1E98
14343 :     _2c1d_1c7c(di, _2c1d_0e23(si));
14344 :     //^2C1D:1EA6
14345 :     _2759_0f39(di, 4, yy);
14346 :     //^2C1D:1EB4
14347 :     U16 bp08 = 8;
14348 :     U16 bp06 = 1;
14349 :     //^2C1D:1EBE
14350 :     U16 bp10 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 9);
14351 :     //^2C1D:1ECB
14352 :     if (bp10 != 0) {
14353 :       //^2C1D:1ECF
14354 :       bp08 = (bp10 >> 2) +bp08 +4;
14355 :       bp06 = bp10;
14356 :     }
14357 :     //^2C1D:1EE1
14358 :     _2c1d_0b2c(di, 10, bp08);
14359 :     //^2C1D:1EEE
14360 :     bp0a += bp06;
14361 :     //^2C1D:1EF4
14362 :     bp06 = _2c1d_0a47(di, 10, 1);
14363 :     //^2C1D:1F03
14364 :     bp0a = RAND16((bp0a >> 2) +8) +bp06 +bp0a;
14365 :     //^2C1D:1F1C
14366 :     bp0a = min_value(bp0a, 255);
14367 :     //^2C1D:1F2C
14368 :     bp08 = BETWEEN_VALUE(40, (RAND() & 31) + (bp06 << 3), 200);
14369 :     //^2C1D:1F4D
14370 :     bp10 = QUERY_GDAT_DBSPEC_WORD_VALUE(si, 12);
14371 :     //^2C1D:1F5A
14372 :     bp06 = (bp10 != 0) ? bp06 : max_value(5, 11 -bp06);
14373 :     //^2C1D:1F70
14374 :     //^2C1D:1F73
14375 :     _075f_000b(si, _4976_4bfa, _4976_4c06, (_4976_4bf6 +zz) & 3, _4976_4bf6, bp0a, bp08, bp06);
14376 :     //^2C1D:1F9E
14377 :     _4976_4c14 = 4;
14378 :     //^2C1D:1FA4
14379 :     _4976_4c0c = _4976_4bf6;
14380 :     //^2C1D:1FAA
14381 :     return 1;
14382 :   }
14383 : 
14384 :   //^0CEE:2F2F
14385 :   U16 SET_DESTINATION_OF_MINION_MAP(ObjectID rlContainer, i16 xx, i16 yy, U16 zz)
14386 :   {
14387 :     //^0CEE:2F2F
14388 :     ENTER(4);
14389 :     //^0CEE:2F35
14390 :     U16 di = _4976_0c5a;
14391 :     //^0CEE:2F39
14392 :     CHANGE_CURRENT_MAP_TO(zz);
14393 :     //^0CEE:2F41
14394 :     U16 si = (xx >= 0 && xx < _4976_4dd2 && yy >= 0 && yy < _4976_4dd4) ? 1 : 0;
14395 :     //^0CEE:2F66
14396 :     if (si != 0) {
14397 :       //^0CEE:2F6C
14398 :       Container *bp04 = GET_ADDRESS_OF_RECORD9(rlContainer);
14399 :       //^0CEE:2F7A
14400 :       bp04->SetDestX(xx);
14401 :       //^0CEE:2F8C
14402 :       bp04->SetDestY(yy);
14403 :       //^0CEE:2F9F
14404 :       bp04->SetDestMap(zz);
14405 :     }
14406 :     //^0CEE:2FB1
14407 :     CHANGE_CURRENT_MAP_TO(di);
14408 :     //^0CEE:2FB7
14409 :     return si;
14410 :   }
14411 : 
14412 :   //^1C9A:0CF7
14413 :   void _1c9a_0cf7(U16 xx, U16 yy)
14414 :   {
14415 :     //^1C9A:0CF7
14416 :     ENTER(14);
14417 :     //^1C9A:0CFC
14418 :     ObjectID si = GET_CREATURE_AT(xx, yy);
14419 :     //^1C9A:0D0A
14420 :     Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
14421 :     //^1C9A:0D17
14422 :     if (_4976_4ebe[bp04->b5_0_7()].w2 != 0xffff) {
14423 :       //^1C9A:0D32
14424 :       _1c9a_0db0(si);
14425 :     }
14426 :     //^1C9A:0D39
14427 :     sk5c20 bp0e;
14428 :     bp0e.SetMap(_4976_0c5a);
14429 :     bp0e.SetTick(_4976_4bec +1);
14430 :     //^1C9A:0D5C
14431 :     bp0e.TimerType((bp04->w8 == 0xffff) ? 0x21 : 0x22);
14432 :     //^1C9A:0D6F
14433 :     bp0e.b5 = bp04->CreatureType();
14434 :     //^1C9A:0D7C
14435 :     bp0e.b6_0_f(U8(xx));
14436 :     bp0e.b7_0_f(U8(yy));
14437 :     //^1C9A:0D85
14438 :     _4976_4ebe[bp04->b5_0_7()].w2 = QUEUE_TIMER(&bp0e);
14439 :     //^1C9A:0DAD
14440 :     return;
14441 :   }
14442 : 
14443 :   //^13E4:0360
14444 :   void _13e4_0360(ObjectID rlCreature, U16 xx, U16 yy, U8 ss, U16 tt)
14445 :   {
14446 :     //^13E4:0360
14447 :     ENTER(6);
14448 :     //^13E4:0365
14449 :     ObjectID si = rlCreature;
14450 :     //^13E4:0368
14451 :     if (si == si.FFFF) {
14452 :       //^13E4:036D
14453 :       si = GET_CREATURE_AT(xx, yy);
14454 :       //^13E4:037C
14455 :       if (si == si.FFFF)
14456 :         //^13E4:037F
14457 :         return;
14458 :     }
14459 :     //^13E4:0381
14460 :     U8 bp01 = GET_ADDRESS_OF_RECORD4(si)->b5_0_7();
14461 :     //^13E4:0393
14462 :     if (bp01 == 0xff)
14463 :       //^13E4:0395
14464 :       return;
14465 :     //^13E4:0397
14466 :     sk4ebe *bp06 = &_4976_4ebe[bp01];
14467 :     //^13E4:03B1
14468 :     if (bp06->b23 == 0x13 || bp06->b26 == 0x13)
14469 :       //^13E4:03C0
14470 :       return;
14471 :     //^13E4:03C2
14472 :     bp06->b23 = ss;
14473 :     //^13E4:03CC
14474 :     if (tt == 0)
14475 :       //^13E4:03D0
14476 :       return;
14477 :     //^13E4:03D2
14478 :     if ((_4976_37a6[bp06->b26] & 0x10) != 0) {
14479 :       //^13E4:03E0
14480 :       bp06->b33 = 1;
14481 :       //^13E4:03E8
14482 :       return;
14483 :     }
14484 :     //^13E4:03EA
14485 :     _1c9a_0db0(si);
14486 :     //^13E4:03F1
14487 :     _1c9a_0cf7(xx, yy);
14488 :     //^13E4:03FE
14489 :     return;
14490 :   }
14491 : 
14492 :   //^1C9A:11BB
14493 :   void _1c9a_11bb(ObjectID rlCreature)
14494 :   {
14495 :     //^1C9A:11BB
14496 :     ENTER(4);
14497 :     //^1C9A:11C0
14498 :     Missile *bp04 = GET_MISSILE_REF_OF_MINION(rlCreature, ObjectID::FFFF);
14499 :     //^1C9A:11D2
14500 :     if (bp04 != NULL) {
14501 :       //^1C9A:11D6
14502 :       U16 si = _4976_0c5a;
14503 :       //^1C9A:11DA
14504 :       CHANGE_CURRENT_MAP_TO(bp04->GetMap());
14505 :       //^1C9A:11EE
14506 :       _13e4_0360(rlCreature, bp04->GetX(), bp04->GetY(), 19, 1);
14507 :       //^1C9A:1213
14508 :       CHANGE_CURRENT_MAP_TO(si);
14509 :     }
14510 :     //^1C9A:121A
14511 :     return;
14512 :   }
14513 : 
14514 :   //^2FCF:183C
14515 :   void _2fcf_183c(i16 xx, i16 yy, U16 zz, U16 dir)
14516 :   {
14517 :     //^2FCF:183C
14518 :     ENTER(0);
14519 :     //^2FCF:1841
14520 :     i16 di = yy;
14521 :     //^2FCF:1844
14522 :     U16 si = (zz != _4976_4bf4) ? 1 : 0;
14523 :     //^2FCF:1856
14524 :     if (si != 0)
14525 :       //^2FCF:185A
14526 :       CHANGE_CURRENT_MAP_TO(zz);
14527 :     //^2FCF:1863
14528 :     if (xx >= 0 && xx < _4976_4dd2 && di >= 0 && di < _4976_4dd4) {
14529 :       //^2FCF:187C
14530 :       if (si != 0) {
14531 :         //^2FCF:1880
14532 :         CHANGE_CURRENT_MAP_TO(_4976_4bf4);
14533 :         //^2FCF:188A
14534 :         MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, -1, 0);
14535 :         //^2FCF:189F
14536 :         _13ae_0009(U8(zz));
14537 :         //^2FCF:18A8
14538 :         //^2FCF:18BE
14539 :         MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, xx, di);
14540 :       }
14541 :       else {
14542 :         //^2FCF:18B2
14543 :         MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, xx, di);
14544 :       }
14545 :       //^2FCF:18C7
14546 :       ROTATE_SQUAD(dir);
14547 :       //^2FCF:18CF
14548 :       return;
14549 :     }
14550 :     //^2FCF:18D1
14551 :     if (si != 0)
14552 :       //^2FCF:18D5
14553 :       CHANGE_CURRENT_MAP_TO(_4976_4bf4);
14554 :     //^2FCF:18DF
14555 :     return;
14556 :   }
14557 : 
14558 :   //^2FCF:2DA7
14559 :   i16 _2fcf_2da7(U16 ss, U16 tt, U16 uu, i16 *xx, i16 *yy)
14560 :   {
14561 :     //^2FCF:2DA7
14562 :     ENTER(24);
14563 :     //^2FCF:2DAD
14564 :     U16 bp16 = 0;
14565 :     U16 bp18 = 0xffff;
14566 :     //^2FCF:2DB7
14567 :     for (U16 si = 0; _4976_4d0e->nMaps > si; si++) {
14568 :       //^2FCF:2DBC
14569 :       U16 bp12 = _4976_4dba[si].RawColumn();
14570 :       //^2FCF:2DD4
14571 :       U16 bp14 = _4976_4dba[si].RawRow();
14572 :       //^2FCF:2DEC
14573 :       U8 *bp04 = _4976_4ca8[si][0];
14574 :       //^2FCF:2E07
14575 :       U16 *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[si]]];
14576 :       //^2FCF:2E31
14577 :       for (U16 bp10 = 0; bp10 <= bp12; bp10++) {
14578 :         //^2FCF:2E39
14579 :         for (U16 di = 0; di <= bp14; di++) {
14580 :           //^2FCF:2E3E
14581 :           if ((*(bp04++) & 0x10) != 0) {
14582 :             //^2FCF:2E4D
14583 :             ObjectID bp0e = *(bp0c++);
14584 :             do {
14585 :               //^2FCF:2E5A
14586 :               switch (ss) {
14587 :                 case 2:
14588 :                 case 3:
14589 :                 case 4:
14590 :                 case 5:
14591 :                   //^2FCF:2E6E
14592 :                   if (bp0e.DBType() == dbText) {
14593 :                     //^2FCF:2E7F
14594 :                     Text *bp08 = GET_ADDRESS_OF_RECORD2(bp0e);
14595 :                     //^2FCF:2E8E
14596 :                     if (bp08->TextMode() == 1) {
14597 :                       //^2FCF:2EA2
14598 :                       switch (bp08->SimpleTextExtUsage()) {
14599 :                         case 11:
14600 :                           //^2FCF:2EC4
14601 :                           if ((bp08->TextIndex() & 0xff) != uu)
14602 :                             //^2FCF:2ED7
14603 :                             break;
14604 :                           //^2FCF:2ED9
14605 :                           if (ss == 3) {
14606 :                             //^2FCF:2EDF
14607 :                             bp16++;
14608 :                             //^2FCF:2EE2
14609 :                             break;
14610 :                           }
14611 :                           //^2FCF:2EE4
14612 :                           tt--;
14613 :                           //^2FCF:2EE7
14614 :                           if (tt != 0)
14615 :                             //^2FCF:2EEC
14616 :                             break;
14617 :                           //^2FCF:2EEE
14618 : _2eee:
14619 :                           *xx = bp10;
14620 :                           //^2FCF:2EF7
14621 :                           *yy = di;
14622 :                           //^2FCF:2EFD
14623 :                           return si;
14624 : 
14625 :                         case 16:
14626 :                           //^2FCF:2F02
14627 :                           if ((bp08->TextIndex() & 0xff) != uu)
14628 :                             //^2FCF:2F15
14629 :                             break;
14630 :                           //^2FCF:2F17
14631 :                           *xx = bp10;
14632 :                           //^2FCF:2F20
14633 :                           *yy = di;
14634 :                           //^2FCF:2F26
14635 :                           bp18 = si;
14636 :                           //^2FCF:2F29
14637 :                           break;
14638 : 
14639 :                         case 15:
14640 :                           //^2FCF:2F2B
14641 :                           if (ss == 4) {
14642 :                             //^2FCF:2F31
14643 :                             bp08->TextVisibility(0);
14644 :                             //^2FCF:2F39
14645 :                             break;
14646 :                           }
14647 :                           //^2FCF:2F3B
14648 :                           if (ss != 5)
14649 :                             //^2FCF:2F3F
14650 :                             break;
14651 :                           //^2FCF:2F41
14652 :                           if (bp08->TextVisibility() == 0)
14653 :                             //^2FCF:2F4D
14654 :                             break;
14655 :                           //^2FCF:2F4F
14656 :                           goto _2eee;
14657 :                       }
14658 :                     }
14659 :                   }
14660 : 
14661 :                   break;
14662 :               }
14663 :               //^2FCF:2F51
14664 :               bp0e = GET_NEXT_RECORD_LINK(bp0e);
14665 :               //^2FCF:2F5D
14666 :             } while (bp0e != bp0e.FFFE && bp0e.DBType() <= dbActuator);
14667 :           }
14668 :           //^2FCF:2F70
14669 :         }
14670 :         //^2FCF:2F79
14671 :       }
14672 :       //^2FCF:2F87
14673 :     }
14674 :     //^2FCF:2F99
14675 :     CHANGE_CURRENT_MAP_TO(_4976_4bf4);
14676 :     //^2FCF:2FA3
14677 :     if (ss == 4) {
14678 :       //^2FCF:2FA9
14679 :       return bp18;
14680 :     }
14681 :     //^2FCF:2FAE
14682 :     if (ss == 5) {
14683 :       //^2FCF:2FB4
14684 :       return -1;
14685 :     }
14686 :     //^2FCF:2FB9
14687 :     return bp16;
14688 :   }
14689 : 
14690 :   //^2FCF:18E3
14691 :   U16 ENGAGE_X_TELEPORTER()
14692 :   {
14693 :     // activates the X mark floor teleporter at squad's position.
14694 : 
14695 :     // return 0 if failed.
14696 :     // return 1 if succeeded.
14697 : 
14698 :     //^2FCF:18E3
14699 :     ENTER(10);
14700 :     //^2FCF:18E9
14701 :     ObjectID si = GET_TILE_RECORD_LINK(_4976_4bfa, _4976_4c06);
14702 :     //^2FCF:18F8
14703 :     U16 bp06;
14704 :     for (; si != si.FFFE && (bp06 = si.DBType()) <= dbActuator; si = GET_NEXT_RECORD_LINK(si)) {
14705 :       //^2FCF:18FB
14706 :       if (bp06 == dbText) {
14707 :         //^2FCF:1904
14708 :         Text *bp04 = GET_ADDRESS_OF_RECORD2(si);
14709 :         //^2FCF:1911
14710 :         if (bp04->TextMode() == 1) {
14711 :           //^2FCF:1925
14712 :           U16 di;
14713 :           switch (bp04->SimpleTextExtUsage()) {
14714 :             case 16: // 16 -> Teleporter with flag
14715 :               //^2FCF:1942
14716 :               di = 5;
14717 :               //^2FCF:1945
14718 :               goto _194a;
14719 : 
14720 :             case 15: // 15 -> Teleporter
14721 :               //^2FCF:1947
14722 :               di = 4;
14723 :               //^2FCF:194A
14724 : _194a:
14725 :               i16 bp08;
14726 :               i16 bp0a;
14727 :               if (_2fcf_2da7(di, 0, bp04->TextIndex() & 0xff, &bp08, &bp0a) >= 0) {
14728 :                 //^2FCF:1977
14729 :                 _2fcf_183c(bp08, bp0a, bp06, _4976_4bf6);
14730 :                 //^2FCF:198B
14731 :                 QUEUE_NOISE_GEN2(0x0a, bp04->TextIndex() & 0xff, 0x88, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x8c, 0x80);
14732 :                 //^2FCF:19BB
14733 :                 if (di == 4) {
14734 :                   //^2FCF:19C0
14735 :                   bp04->TextVisibility(1);
14736 :                 }
14737 :                 //^2FCF:19C8
14738 :                 return 1;
14739 :               }
14740 : 
14741 :               break;
14742 :           }
14743 :         }
14744 :       }
14745 :       //^2FCF:19CD
14746 :     }
14747 :     //^2FCF:19EE
14748 :     return 0;
14749 :   }
14750 : 
14751 :   //^2759:16AC
14752 :   U16 ENGAGE_COMMAND(U16 player, i16 cmdSlot)
14753 :   {
14754 :     // CSBwinSimilarity: TAG01bf9a,_Attack
14755 : 
14756 :     // cmdSlot
14757 :     // is 0 if 1st command is selected on right command panel.
14758 :     // is 1 if 2nd command is selected on right command panel.
14759 :     // is 2 if 3rd command is selected on right command panel.
14760 : 
14761 :     //^2759:16AC
14762 :     ENTER(84);
14763 :     //^2759:16B2
14764 :     U16 di = player;
14765 :     //^2759:16B5
14766 :     U16 bp4a = 0;
14767 :     //^2759:16BA
14768 :     U16 bp48 = cmdSlot & 0x8000;
14769 :     //^2759:16C3
14770 :     cmdSlot &= 0x7fff;
14771 :     //^2759:16C8
14772 :     _4976_534f = _4976_5358[cmdSlot].b0;
14773 :     //^2759:16D5
14774 :     _4976_5350 = _4976_5358[cmdSlot].b1;
14775 :     //^2759:16E2
14776 :     _4976_534e = _4976_5358[cmdSlot].b2;
14777 :     //^2759:16EF
14778 :     U16 bp34 = _4976_5354;
14779 :     //^2759:16F5
14780 :     U16 bp3a = bp34 ^ 1;
14781 :     //^2759:16FB
14782 :     sk53b4 *bp04 = &_4976_53b4[di];
14783 :     //^2759:170B
14784 :     if (bp04->curHP() == 0)
14785 :       //^2759:1715
14786 :       return 0;
14787 :     //^2759:171A
14788 :     U16 bp1c = QUERY_CUR_CMDSTR_ENTRY(CnCM);
14789 :     //^2759:1724
14790 :     U8 bp36 = U8(QUERY_CUR_CMDSTR_ENTRY(CnSD));
14791 :     //^2759:172E
14792 :     U16 bp38 = 0;
14793 :     //^2759:1733
14794 :     bp04->b32[bp04->w52] = U8(bp1c);
14795 :     //^2759:1740
14796 :     Container *bp08 = NULL;
14797 :     //^2759:174A
14798 :     ObjectID bp2e = bp04->Possess(bp34);
14799 :     //^2759:175C
14800 :     if (bp2e != bp2e.FFFF) {
14801 :       //^2759:1761
14802 :       bp08 = GET_ADDRESS_OF_RECORD9(bp2e);
14803 :     }
14804 :     //^2759:1770
14805 :     U16 bp22 = bp04->playerDir();
14806 :     //^2759:177C
14807 :     U16 bp1e = _4976_4bfa + _4976_0232[bp22];
14808 :     //^2759:178A
14809 :     U16 bp20 = _4976_4c06 + _4976_023a[bp22];
14810 :     //^2759:1799
14811 :     _4976_534c = GET_CREATURE_AT(bp1e, bp20);
14812 :     //^2759:17A9
14813 :     U8 bp35;
14814 :     sk03a2 *bp1a;
14815 :     if (_4976_534c != _4976_534c.FFFF) {
14816 :       //^2759:17AE
14817 :       bp1a = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp35 = QUERY_CLS2_FROM_RECORD(_4976_534c));
14818 :     }
14819 :     //^2759:17C8
14820 :     U16 bp26 = QUERY_CUR_CMDSTR_ENTRY(CnBZ);
14821 :     //^2759:17D2
14822 :     U16 bp2a = QUERY_CUR_CMDSTR_ENTRY(CnSK);
14823 :     //^2759:17DC
14824 :     U16 bp28 = QUERY_CUR_CMDSTR_ENTRY(CnTR) + RAND01();
14825 :     //^2759:17EF
14826 :     i16 bp2c = QUERY_CUR_CMDSTR_ENTRY(CnEX);
14827 :         //^2759:17F9
14828 :     U16 si = QUERY_CUR_CMDSTR_ENTRY(CnST);
14829 :     //^2759:1802
14830 :     i16 bp46 = QUERY_CUR_CMDSTR_ENTRY(CnAT);
14831 :     //^2759:180C
14832 :     bp04->b66[bp34] = U8(QUERY_CUR_CMDSTR_ENTRY(CnTA));
14833 :     //^2759:181D
14834 :     U16 bp24 = GET_TILE_VALUE(bp1e, bp20);
14835 :     //^2759:182F
14836 :     U16 bp0e = 1;
14837 :     //^2759:1834
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: // 5
14850 :         //^2759:1848
14851 :         si = si + _2c1d_0a47(di, 14, 1);
14852 :         //^2759:185B
14853 :         bp0e = _2759_1451(si, bp1e, bp20);
14854 :         //^2759:186C
14855 :         if (bp0e == 0)
14856 :           //^2759:1870
14857 :           bp2c >>= 2;
14858 :         //^2759:1874
14859 :         bp38 = 0;
14860 :         //^2759:1879
14861 :         break;
14862 : 
14863 :       case CmInvisibility: // 2
14864 :         //^2759:187C
14865 :         si = max_value(32, si);
14866 :         //^2759:1888
14867 :         bp50 = 0x47;
14868 :         //^2759:188C
14869 :         if (_4976_57e6++ == 0 && _4976_52be != 0) {
14870 :           //^2759:18A0
14871 :           _4976_52af[_4976_52be].w50 |= 0x4000;
14872 :         }
14873 :         //^2759:18B0
14874 :         sk5c20 bp54;
14875 :         bp54.SetMap(_4976_4bf4);
14876 :         bp54.SetTick(_4976_4bec +si);
14877 :         //^2759:18D8
14878 :         QUEUE_TIMER(&bp54);
14879 :         //^2759:18E4
14880 :         break;
14881 : 
14882 :       case CmLaunchMissile: // 3
14883 :         //^2759:18E7
14884 :         bp44 = ObjectID::MissileRecord(QUERY_CUR_CMDSTR_ENTRY(CnPA));
14885 :         //^2759:18F4
14886 :         bp42 = 7 - min_value(6, _2c1d_0a47(di, bp2a, 1));
14887 :         //^2759:1914
14888 :         if (bp04->curMP() < bp42) {
14889 :           //^2759:1920
14890 :           si = max_value(2, (bp04->curMP() * si) / bp42);
14891 :           //^2759:1936
14892 :           bp42 = bp04->curMP();
14893 :         }
14894 :         //^2759:1940
14895 :         bp0e = _2c1d_1d64(di, bp44, si, bp42);
14896 :         //^2759:1953
14897 :         if (bp0e == 0)
14898 :           //^2759:195A
14899 :           bp2c >>= 1;
14900 :         //^2759:195D
14901 :         break;
14902 : 
14903 :       case CmPhysicalDamage4: // 4
14904 :       case CmPhysicalDamage8: // 8
14905 :         //^2759:1960
14906 :         if ((bp24 >> 5) == ttDoor && (bp24 & 7) == 4) {
14907 :           //^2759:1973
14908 :           _075f_2205(
14909 :             bp1e,
14910 :             bp20,
14911 :             _2c1d_11bf(di, bp34, bp2a), 
14912 :             0, 
14913 :             2
14914 :             );
14915 : 
14916 :           //^2759:1995
14917 :           bp26 = 6;
14918 :           //^2759:199A
14919 :           Door *bp12 = GET_ADDRESS_OF_TILE_RECORD(U8(bp1e), U8(bp20))->castToDoor();
14920 :           //^2759:19AD
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 :           //^2759:19DB
14933 :           break;
14934 :         }
14935 :         //^2759:19DE
14936 :         if (true
14937 :           && _4976_534c != ObjectID::FFFF 
14938 :           && (bp1a->w0 & 0x0001) != 0 
14939 :           && bp1a->b2 == 255 
14940 :           && bp1a->b8 == 255
14941 :         ) {
14942 :           //^2759:19FD
14943 :           bp2c >>= 1;
14944 :         }
14945 :         else {
14946 :           //^2759:1A02
14947 :           bp44 = QUERY_CUR_CMDSTR_ENTRY(CnPA);
14948 :           //^2759:1A0C
14949 :           bp0e = _2759_14c8(di, bp44, bp1e, bp20, bp2a, bp46);
14950 :           //^2759:1A26
14951 :           if (bp0e == 0) {
14952 :             //^2759:1A2A
14953 :             bp2c >>= 1;
14954 :             //^2759:1A2D
14955 :             bp26 >>= 1;
14956 :             //^2759:1A30
14957 :             break;
14958 :           }
14959 :           //^2759:1A33
14960 :           if (_4976_534c == ObjectID::FFFF)
14961 :             //^2759:1A3A
14962 :             break;
14963 :         }
14964 :         //^2759:1A3D
14965 :         QUEUE_NOISE_GEN1(0x0f, bp35, 0x8d, 0x3c, 0xc8, bp1e, bp20, bp38 +1);
14966 :         //^2759:1A5E
14967 :         break;
14968 : 
14969 :       case CmSpellReflection: // 7
14970 :         //^2759:1A61
14971 :         _075f_0255(ObjectID::FF8E, max_value(2, si), _4976_4bfa, _4976_4c06, 255);
14972 :         //^2759:1A81
14973 :         break;
14974 : 
14975 :       case CmAuraOfSpeed: // 9
14976 :         //^2759:1A84
14977 :         si = max_value(32, si);
14978 :         //^2759:1A90
14979 :         _4976_57e8 = U8(min_value(_4976_57e8 +si, 255));
14980 :         //^2759:1AA5
14981 :         break;
14982 : 
14983 :       case CmLaunchProjective: // 32
14984 :         //^2759:1AA8
14985 :         if (_2759_0e30(di, bp34, bp04->Possess(bp3a)) == 0) {
14986 :           //^2759:1AC6
14987 :           if (bp48 == 0) {
14988 :             //^2759:1ACC
14989 :             _4976_5352 = max_value(1, 8 - _48ae_0058(67, 1, 3));
14990 :             //^2759:1AEC
14991 :             _4976_5340 = 0xfffe;
14992 :             //^2759:1AF2
14993 :             _4976_532e = QUERY_GDAT_DBSPEC_WORD_VALUE(bp2e, 5);
14994 :             //^2759:1B01
14995 :             _4976_534a = bp3a;
14996 :             //^2759:1B07
14997 :             bp2c = 0;
14998 :           }
14999 :           //^2759:1B0C
15000 :           bp0e = 0;
15001 :           //^2759:1B11
15002 :           break;
15003 :         }
15004 :         //^2759:1B14
15005 :         bp30 = _2c1d_07a3(di, bp3a);
15006 :         //^2759:1B22
15007 :         bp0a = _2c1d_0a47(di, 11, 1);
15008 :         //^2759:1B32
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 :         //^2759:1B84
15017 :         bp4a = 1;
15018 :         //^2759:1B89
15019 :         break;
15020 : 
15021 :       case CmSpellshield: // 33
15022 :       case CmFireshield: // 34
15023 :       case CmShield: // 35
15024 :         //^2759:1B8C
15025 :         bp0c = (bp1c == CmSpellshield) ? 1 : ((bp1c == CmFireshield) ? 0 : 2);
15026 :         //^2759:1BAB
15027 :         si = max_value(32, si) * 3;
15028 :         //^2759:1BBC
15029 :         if (_2c1d_0186(bp04, bp0c, si, 1) != 0)
15030 :           //^2759:1BD5
15031 :           break;
15032 :         //^2759:1BD8
15033 :         bp2c >>= 2;
15034 :         //^2759:1BDC
15035 :         bp26 >>= 1;
15036 :         //^2759:1BDF
15037 :         break;
15038 : 
15039 :       case CmConsume: // 16
15040 :         //^2759:1BE2
15041 :         _24a5_10fb(di, bp2e, bp34);
15042 :         //^2759:1BF1
15043 :         break;
15044 : 
15045 :       case CmPorch: // 17
15046 :         //^2759:1BF4
15047 :         bp4a = 1;
15048 :         //^2759:1BF9
15049 :         bp46 = _2759_04c0(di, bp34);
15050 :         //^2759:1C06
15051 :         if (bp46 < 0)
15052 :           //^2759:1C0C
15053 :           break;
15054 :         //^2759:1C0F
15055 :         bp2e = _2c1d_07a3(di, bp46);
15056 :         //^2759:1C1D
15057 :         _2c1d_0831(di, bp2e, bp34);
15058 :         //^2759:1C2C
15059 :         break;
15060 : 
15061 :       case CmHealing: // 36
15062 :         //^2759:1C2F
15063 :         bp0c = bp04->maxHP() - bp04->curHP();
15064 :         //^2759:1C3D
15065 :         if (bp0c <= 0)
15066 :           break;
15067 :         //^2759:1C44
15068 :         if (bp04->curMP() == 0)
15069 :           //^2759:1C4B
15070 :           break;
15071 :         //^2759:1C4E
15072 :         bp0a = min_value(10, _2c1d_0a47(di, 13, 1));
15073 :         //^2759:1C68
15074 :         bp2c = 2;
15075 : 
15076 :         do {
15077 :           //^2759:1C6D
15078 :           bp0e = min_value(bp0c, bp0a);
15079 :           //^2759:1C7D
15080 :           bp04->curHP(bp04->curHP() +bp0e);
15081 :           //^2759:1C84
15082 :           bp2c += 2;
15083 :           //^2759:1C88
15084 :           bp04->curMP(bp04->curMP() -2);
15085 :           //^2759:1C8D
15086 :         } while (bp04->curMP() > 0 && (bp0c -= bp04->curMP()) != 0);
15087 : 
15088 :         //^2759:1C94
15089 :         if (bp04->curMP() < 0)
15090 :           //^2759:1C9E
15091 :           bp04->curMP(0);
15092 :         //^2759:1CA4
15093 :         bp04->w50 |= 0x0800;
15094 :         //^2759:1CAD
15095 :         bp0e = 1;
15096 :         //^2759:1CB2
15097 :         break;
15098 : 
15099 :       case CmUseRope: // 10
15100 :         //^2759:1CB5
15101 :         bp1e = _4976_4bfa + _4976_0232[_4976_4bf6];
15102 :         //^2759:1CC5
15103 :         bp20 = _4976_4c06 + _4976_023a[_4976_4bf6];
15104 :         //^2759:1CD5
15105 :         bp40 = 1;
15106 :         //^2759:1CDA
15107 :         bp32 = GET_CREATURE_AT(bp1e, bp20);
15108 :         //^2759:1CEA
15109 :         if (bp32 != bp32.FFFF && (_0cee_2de0(bp32) & 0x8000) == 0) {
15110 :           //^2759:1CFD
15111 :           bp40 = 0;
15112 :         }
15113 :         //^2759:1D02
15114 :         if ((GET_TILE_VALUE(bp1e, bp20) >> 5) == 2 && bp40 != 0) {
15115 :           //^2759:1D1E
15116 :           _4976_5824 = 1;
15117 :           //^2759:1D24
15118 :           MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, bp1e, bp20);
15119 :           //^2759:1D3C
15120 :           _4976_5824 = 0;
15121 :           //^2759:1D42
15122 :           break;
15123 :         }
15124 :         //^2759:1D45
15125 :         bp26 = 0;
15126 :         //^2759:1D4A
15127 :         break;
15128 : 
15129 :       case CmFreezeLife: // 11
15130 :         //^2759:1D4D
15131 :         _4976_57e7 = U8(min_value(200, _4976_57e7 +si));
15132 :         //^2759:1D62
15133 :         break;
15134 : 
15135 :       case CmAuraOfDex: // 12
15136 :         //^2759:1D65
15137 :         bp0c = 5;
15138 :         //^2759:1D6A
15139 : _1d6a:
15140 :         si = max_value(32, si) << 2;
15141 :         //^2759:1D79
15142 :         if (_2c1d_0186(bp04, bp0c, si, 0) != 0)
15143 :           //^2759:1D92
15144 :           break;
15145 :         //^2759:1D95
15146 :         bp2c >>= 2;
15147 :         bp26 >>= 1;
15148 :         //^2759:1D9C
15149 :         break;
15150 : 
15151 :       case CmAuraOfWiz: // 13
15152 :         //^2759:1D9F
15153 :         bp0c = 4;
15154 :         //^2759:1DA4
15155 :         goto _1d6a;
15156 : 
15157 :       case CmAuraOfVit: // 14
15158 :         //^2759:1DA6
15159 :         bp0c = 6;
15160 :         //^2759:1DAB
15161 :         goto _1d6a;
15162 : 
15163 :       case CmAuraOfStr: // 15
15164 :         //^2759:1DAD
15165 :         bp0c = 3;
15166 :         //^2759:1DB2
15167 :         goto _1d6a;
15168 : 
15169 :       case CmDarkness: // 6
15170 :       case CmLight: // 38
15171 :       case Cm39: // 39
15172 :         //^2759:1DB4
15173 :         _2759_15d0(bp1c, si);
15174 :         //^2759:1DBE
15175 :         break;
15176 : 
15177 :       case CmThrow: // 42
15178 :         //^2759:1DC1
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 :         //^2759:1E02
15189 :         break;
15190 : 
15191 :       case CmMark: // 44
15192 :         //^2759:1E05
15193 :         bp0e = SET_DESTINATION_OF_MINION_MAP(bp2e, _4976_4bfa, _4976_4c06, _4976_4bf4);
15194 :         //^2759:1E1F
15195 :         if (bp0e != 0)
15196 :           //^2759:1E23
15197 :           break;
15198 :         //^2759:1E26
15199 :         bp2c = 0;
15200 :         bp26 = 1;
15201 :         //^2759:1E30
15202 :         break;
15203 : 
15204 :       case CmCallScout: // 47
15205 :         //^2759:1E33
15206 :         bp35 = 0x30;
15207 :         //^2759:1E37
15208 :         goto _1ebe;
15209 : 
15210 :       case CmCallCarry: // 45
15211 :       case CmCallFetch: // 46
15212 :         //^2759:1E3A
15213 :         if (GET_MISSILE_REF_OF_MINION(bp08->GetContainedObject(), bp2e) != NULL) {
15214 :           //^2759:1E4F
15215 :           GET_ADDRESS_OF_RECORD4(bp08->GetContainedObject())->CreatureType((bp1c == CmCallCarry) ? 0x32 : 0x33);
15216 :           //^2759:1E70
15217 :           _1c9a_0247(bp08->GetContainedObject());
15218 :         }
15219 :         //^2759:1E7F
15220 :         else if (bp1c == CmCallFetch) {
15221 :           //^2759:1E85
15222 :           bp35 = 0x33;
15223 :           //^2759:1E89
15224 :           bp0a = _4976_4bf6;
15225 :           //^2759:1E8F
15226 :           bp1e = bp08->GetDestX();
15227 :           //^2759:1E9C
15228 :           bp20 = bp08->GetDestY();
15229 :           //^2759:1EA9
15230 :           bp22 = 0xffff;
15231 :           //^2759:1EAE
15232 :           bp0c = bp08->b7_2_7();
15233 :           //^2759:1EB8
15234 :           goto _1ed8;
15235 :         }
15236 :         else {
15237 :           //^2759:1EBA
15238 :           bp35 = 0x32;
15239 :           //^2759:1EBE
15240 : _1ebe:
15241 :           bp1e = _4976_4bfa;
15242 :           //^2759:1EC4
15243 :           bp20 = _4976_4c06;
15244 :           //^2759:1ECA
15245 :           bp0a = (_4976_4bf6 +2) & 3;
15246 :           //^2759:1ED5
15247 :           bp0c = _4976_4bf4;
15248 :           //^2759:1EDB
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 :           //^2759:1F0E
15261 :           bp0e = (bp3e != bp3e.FFFF) ? 1 : 0;
15262 :           //^2759:1F1E
15263 :           if (bp0e != 0) {
15264 :             //^2759:1F22
15265 :             if (bp1c == CmCallScout) {
15266 :               //^2759:1F28
15267 :               SET_DESTINATION_OF_MINION_MAP(bp2e, _4976_5826, _4976_5828, _4976_581c);
15268 :             }
15269 :             //^2759:1F3F
15270 :             bp08->SetContainedObject(bp3e);
15271 :             //^2759:1F49
15272 :             break;
15273 :           }
15274 :           //^2759:1F4C
15275 :           bp2c >>= 2;
15276 :           bp26 >>= 1;
15277 :           //^2759:1F53
15278 :           _075f_0255(ObjectID::FFA8, 0x6e, bp1e, bp20, 255);
15279 :           //^2759:1F68
15280 :           break;
15281 : 
15282 :           //^2759:1F6B
15283 : _1f6b:
15284 :           _1c9a_11bb(bp08->GetContainedObject());
15285 :         }
15286 :         //^2759:1F77
15287 :         //^2759:1F78
15288 :         break;
15289 : 
15290 :       case CmKillMinion: // 48
15291 :         goto _1f6b;
15292 : 
15293 :       case CmGuardMinion: // 50
15294 :         //^2759:1F7B
15295 :         bp3c = 0x34;
15296 :         //^2759:1F80
15297 :         goto _1f8e;
15298 : 
15299 :       case Cm51: // 51
15300 :         //^2759:1F82
15301 :         bp3c = 0x35;
15302 :         //^2759:1F87
15303 :         goto _1f8e;
15304 : 
15305 :       case CmAttackMinion: // 49
15306 :         //^2759:1F89
15307 :         bp3c = 0x31;
15308 :         //^2759:1F8E
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 :           //^2759:1FBE
15312 :           break;
15313 :         //^2759:1FC0
15314 :         _075f_0255(ObjectID::FFA8, 0x6e, _4976_4bfa, _4976_4c06, 255);
15315 :         //^2759:1FD7
15316 :         break;
15317 : 
15318 :       case CmTeleport: // 54
15319 :         //^2759:1FD9
15320 :         if (ENGAGE_X_TELEPORTER() != 0)
15321 :           //^2759:1FE0
15322 :           break;
15323 :         //^2759:1FE2
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 :     //^2759:2008
15353 :     if (bp4a == 0) {
15354 :       //^2759:200E
15355 :       QUEUE_NOISE_GEN2(_4976_534f, _4976_5350, bp36, 0xfe, _4976_4bfa, _4976_4c06, bp38, 0x73, 0xc8);
15356 :     }
15357 :     //^2759:2035
15358 :     if (bp04->curHP() == 0 || bp48 != 0)
15359 :       //^2759:2048
15360 :       return bp0e;
15361 :     //^2759:204B
15362 :     if (bp26 != 0) {
15363 :       //^2759:2051
15364 :       _2759_0f39(di, bp26, bp34);
15365 :     }
15366 :     //^2759:205F
15367 :     if (bp28 != 0) {
15368 :       //^2759:2065
15369 :       _2c1d_1c7c(di, bp28);
15370 :     }
15371 :     //^2759:2070
15372 :     if (bp2c != 0) {
15373 :       //^2759:2076
15374 :       _2c1d_0b2c(di, bp2a, bp2c);
15375 :     }
15376 :     //^2759:2085
15377 :     if (bp0e != 0) {
15378 :       //^2759:208B
15379 :       sk536e *bp16 = &_4976_536e[di][bp34];
15380 :       //^2759:20A8
15381 :       bp16->w0 = QUERY_CUR_CMDSTR_ENTRY(CnRP);
15382 :       //^2759:20B5
15383 :       if (bp16->w0 != 0) {
15384 :         //^2759:20B9
15385 :         bp16->b2 = 1;
15386 :         //^2759:20BE
15387 :         bp16->w4 = bp2e;
15388 :         bp16->b3 = i8(cmdSlot);
15389 :       }
15390 :     }
15391 :     //^2759:20CC
15392 :     return bp0e;
15393 :   }
15394 : 
15395 :   //^2759:1204
15396 :   Bit16u _2759_1204(i16 cmdSlot)
15397 :   {
15398 :     //^2759:1204
15399 :     ENTER(6);
15400 :     //^2759:120A
15401 :     U16 bp06 = 0;
15402 :     //^2759:120F
15403 :     if (_4976_5366 != 0) {
15404 :       //^2759:1219
15405 :       U16 di = _4976_5366 -1;
15406 :       //^2759:121F
15407 :       sk53b4 *bp04 = &_4976_53b4[di];
15408 :       //^2759:122D
15409 :       if (cmdSlot == -1) {
15410 :         //^2759:1233
15411 :         _4976_5356 = 0;
15412 :       }
15413 :       else {
15414 :         //^2759:123C
15415 :         bp04->w50 |= 0x0800;
15416 :         //^2759:1245
15417 :         bp06 = ENGAGE_COMMAND(di, cmdSlot);
15418 :         //^2759:1253
15419 :         i16 si = QUERY_CMDSTR_ENTRY(_4976_534f, _4976_5350, _4976_534e, CnNC);
15420 :         //^2759:126A
15421 :         if (si == 16) {
15422 :           //^2759:126F
15423 :           si = 15;
15424 :         }
15425 :         //^2759:1272
15426 :         if (si != 17 && si != 18) {
15427 :           //^2759:127C
15428 :           ADD_ITEM_CHARGE(_4976_5368, -si);
15429 :         }
15430 :         //^2759:128C
15431 :         if (true
15432 :           && ADD_ITEM_CHARGE(_4976_5368, 0) == 0
15433 :           && (QUERY_GDAT_DBSPEC_WORD_VALUE(_4976_5368, 0x00) & 0x0800) != 0
15434 :         ) {
15435 :           //^2759:12AF
15436 :           _2c1d_07a3(di, _4976_5354);
15437 :           //^2759:12BB
15438 :           DEALLOC_RECORD(_4976_5368);
15439 :         }
15440 :       }
15441 :       //^2759:12C5
15442 :       if (_4976_5356 != 0) {
15443 :         //^2759:12CC
15444 :         _4976_5356 &= 0xfbff;
15445 :       }
15446 :       else {
15447 :         //^2759:12D4
15448 :         _2759_0541();
15449 :       }
15450 :       //^2759:12D8
15451 :       _2759_0644(0);
15452 :     }
15453 :     //^2759:12DF
15454 :     return bp06;
15455 :   }
15456 : 
15457 :   //^2759:0589
15458 :   void _2759_0589(Bit16u xx, Bit16u yy)
15459 :   {
15460 :     //^2759:0589
15461 :     ENTER(4);
15462 :     //^2759:058F
15463 :     U16 si = xx;
15464 :     U16 di = yy;
15465 :     //^2759:0595
15466 :     sk53b4 *bp04 = &_4976_53b4[si];
15467 :     //^2759:05A9
15468 :     if (bp04->curHP() == 0)
15469 :       //^2759:05B0
15470 :       return;
15471 :     //^2759:05B2
15472 :     if (_2759_02d6(si, bp04->Possess(di), di) == 0)
15473 :       //^2759:05CB
15474 :       return;
15475 :     //^2759:05CD
15476 :     _4976_5354 = _4976_5324 = di;
15477 :     //^2759:05D5
15478 :     _4976_5366 = _4976_531e = si +1;
15479 :     //^2759:05DE
15480 :     _4976_5352 = 1;
15481 :     _4976_5356 = 0;
15482 :     //^2759:05EA
15483 :     _443c_0662();
15484 :     //^2759:05EF
15485 :     _2759_0644(0);
15486 :     //^2759:05F7
15487 :     _2e62_0670(si);
15488 :     //^2759:05FE
15489 :     return;
15490 :   }
15491 : 
15492 :   //^2759:0602
15493 :   void _2759_0602(Bit16u xx)
15494 :   {
15495 :     //^2759:0602
15496 :     ENTER(0);
15497 :     //^2759:0605
15498 :     if (_4976_53b4[xx].curHP() == 0)
15499 :       //^2759:0614
15500 :       return;
15501 :     //^2759:0616
15502 :     _4976_5354 = _4976_5324 = 2;
15503 :     //^2759:061F
15504 :     _4976_5366 = _4976_531e = xx +1;
15505 :     //^2759:0629
15506 :     _4976_5352 = 1;
15507 :     _4976_5356 = 0;
15508 :     //^2759:0635
15509 :     _443c_0662();
15510 :     //^2759:063A
15511 :     _2759_0644(0);
15512 :     //^2759:0642
15513 :     return;
15514 :   }
15515 : 
15516 :   //^01B0:087A
15517 :   void _01b0_087a() //#DS=04BF
15518 :   {
15519 :     DOSIMPL();
15520 : 
15521 : //    //^01B0:087A
15522 : //    ENTER(0);
15523 : //    //^01B0:087D
15524 : //    LOADDS(0x3083);
15525 : //    //^01B0:0883
15526 : //    __asm pushf
15527 : //    __asm cli
15528 : //    __asm inc ds:[_04bf_0e52]
15529 : //    __asm popf
15530 : //    //^01B0:088B
15531 : //    return;
15532 :   }
15533 : 
15534 :   //^443C:03F4
15535 :   void _443c_03f4()
15536 :   {
15537 :     //^443C:03F4
15538 :     ENTER(0);
15539 :     //^443C:03F7
15540 :     _01b0_087a() INDIRECT_CALL;
15541 :     //^443C:03FF
15542 :     return;
15543 :   }
15544 : 
15545 :   //^443C:08AB
15546 :   void _443c_08ab(i16 *xx, i16 *yy, i16 *zz)
15547 :   {
15548 :     //^443C:08AB
15549 :     ENTER(0);
15550 :     //^443C:08AE
15551 :     _01b0_0d39(xx, yy, zz, 0) INDIRECT_CALL;
15552 :     //^443C:08CD
15553 :     return;
15554 :   }
15555 : 
15556 :   //^0CEE:2ABC
15557 :   U16 QUERY_GDAT_FOOD_VALUE_FROM_RECORD(ObjectID rl)
15558 :   {
15559 :     //^0CEE:2ABC
15560 :     ENTER(0);
15561 :     //^0CEE:2ABF
15562 :     return QUERY_GDAT_DBSPEC_WORD_VALUE(rl, 3);
15563 :   }
15564 : 
15565 :   //^24A5:10B3
15566 :   U16 DRINK_MISCITEM_WATER(ObjectID rlMiscItem)
15567 :   {
15568 :     //^24A5:10B3
15569 :     ENTER(0);
15570 :     //^24A5:10B7
15571 :     ObjectID si = rlMiscItem;
15572 :     //^24A5:10BA
15573 :     if (true
15574 :       && (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 1) != 0
15575 :       && ADD_ITEM_CHARGE(si, 0) != 0
15576 :     ) {
15577 :       //^24A5:10D7
15578 :       ADD_ITEM_CHARGE(si, -1);
15579 :       //^24A5:10E1
15580 :       if (si == _4976_57c8.w0) {
15581 :         //^24A5:10E7
15582 :         _2c1d_06b5(si, 0);
15583 :       }
15584 :       //^24A5:10F1
15585 :       return 1;
15586 :     }
15587 :     //^24A5:10F6
15588 :     return 0;
15589 :   }
15590 : 
15591 :       void _2c1d_1bb5(U16 xx); // TODO: Unreachable
15592 :       void _2c1d_0009(U16 xx, U16 yy, U16 zz, U16 ww); // TODO: Unreachable
15593 : 
15594 :   //^24A5:10FB
15595 :   void _24a5_10fb(Bit16u xx, ObjectID yy, Bit16u zz)
15596 :   {
15597 :     //^24A5:10FB
15598 :     ENTER(18);
15599 :     //^24A5:1101
15600 :     ObjectID di = yy;
15601 :     //^24A5:1104
15602 :     U16 bp12 = 1;
15603 :     //^24A5:1109
15604 :     if (di != di.FFFF) {
15605 :       //^24A5:110E
15606 :       bp12 = 0;
15607 :     }
15608 :     //^24A5:1115
15609 :     else if (_4976_57c8.w0 == ObjectID::FFFF) {
15610 :       //^24A5:111C
15611 :       _443c_03f4();
15612 :       //^24A5:1121
15613 :       _4976_4bfe = 1;
15614 :       //^24A5:1127
15615 :       //^24A5:113B
15616 :       if ((_4976_5db8 & 2) == 0) {
15617 :         //^24A5:1143
15618 :         FIRE_MOUSE_SET_POS();
15619 :         //^24A5:1148
15620 :         _4976_4bfe = 0;
15621 :         //^24A5:114E
15622 :         return;
15623 :       }
15624 :       //^24A5:1151
15625 :       _443c_085a();
15626 :       //^24A5:1156
15627 :       _4976_4860 = 1;
15628 :       //^24A5:115C
15629 :       return;
15630 :     }
15631 :     else {
15632 :       //^24A5:115F
15633 :       xx = _4976_52be -1;
15634 :       //^24A5:1166
15635 :       di = _4976_57c8.w0;
15636 :       //^24A5:116A
15637 :       zz = -1;
15638 :     }
15639 :     //^24A5:116F
15640 :     if (_4976_4bfc != 0)
15641 :       //^24A5:1176
15642 :       return;
15643 :     //^24A5:1179
15644 :     sk53b4 *bp04 = &_4976_53b4[xx];
15645 :     //^24A5:118A
15646 :     U16 bp10 = QUERY_GDAT_FOOD_VALUE_FROM_RECORD(di);
15647 :     //^24A5:1194
15648 :     if (bp10 != 0) {
15649 :       //^24A5:119B
15650 :       if (bp12 != 0) {
15651 :         //^24A5:11A1
15652 :         _443c_085a();
15653 :         //^24A5:11A6
15654 :         _2c1d_073d();
15655 :         //^24A5:11AB
15656 :         for (U16 bp0c = 5; (--bp0c) != 0; ) {
15657 :           //^24A5:11B2
15658 :           _0b36_1688(0x07, 0x00, ((bp0c & 1) != 0) ? 0x25 : 0x26, 545, -1);
15659 :           //^24A5:11D1
15660 :           _44c8_1be8(0);
15661 :           //^24A5:11D9
15662 :           SLEEP_SEVERAL_TIME(8);
15663 :           //^24A5:11E1
15664 :         }
15665 :       }
15666 :       //^24A5:11F0
15667 :       bp04->curFood(min_value(bp04->curFood() +bp10, MAXFOOD));
15668 :       //^24A5:120C
15669 :       _2c1d_03e7(xx, di, zz, 2);
15670 :       //^24A5:121D
15671 :       DEALLOC_RECORD(di);
15672 :       //^24A5:1224
15673 :       if (zz != 0xffff) {
15674 :         //^24A5:122D
15675 :         bp04->Possess(zz, ObjectID::FFFF);
15676 :       }
15677 :       //^24A5:123E
15678 :       goto _14a9;
15679 :     }
15680 :     //^24A5:1241
15681 :     if (DRINK_MISCITEM_WATER(di) != 0) {
15682 :       //^24A5:124B
15683 :       bp04->curWater(min_value(bp04->curWater() +800, MAXWATER));
15684 :       //^24A5:1267
15685 :       if (zz != 0xffff) {
15686 :         //^24A5:1270
15687 :         bp04->Possess(zz, di);
15688 :       }
15689 :       //^24A5:127C
15690 :       goto _14a9;
15691 :     }
15692 :     //^24A5:127F
15693 :     U16 bp0a = di.DBType();
15694 :     //^24A5:128A
15695 :     if (bp0a == dbPotion) {
15696 :       //^24A5:1292
15697 :       Potion *bp08 = GET_ADDRESS_OF_RECORD8(di);
15698 :       //^24A5:129F
15699 :       U16 si = bp08->PotionPower();
15700 :       //^24A5:12AB
15701 :       U16 bp0c = ((511 -si) / (((si +1) >> 3) +32)) >> 1;
15702 :       //^24A5:12C2
15703 :       si = (si / 25) +8;
15704 :       //^24A5:12D0
15705 :       U16 bp0e;
15706 :       switch (bp08->PotionType()) {
15707 :         default:
15708 :           //^24A5:12E3
15709 :           return;
15710 : 
15711 :         case  6:      // ӎИ{ROS}
15712 :           //^24A5:12ED
15713 :           _2c1d_0300(bp04, 2, si);
15714 :           //^24A5:12FE
15715 :           break;
15716 : 
15717 :         case  7:      // ӎИ{KU}
15718 :           //^24A5:1301
15719 :           //^24A5:1318
15720 :           _2c1d_0300(bp04, 1, bp08->PotionPower() / 35 +5);
15721 :           //^24A5:12FE
15722 :           break;
15723 : 
15724 :         case  8:      // ӎИ{DAIN}
15725 :           //^24A5:131A
15726 :           //^24A5:131D
15727 :           _2c1d_0300(bp04, 3, si);
15728 :           //^24A5:12FE
15729 :           break;
15730 : 
15731 :         case  9:      // ӎИ{NETA}
15732 :           //^24A5:131F
15733 :           //^24A5:1322
15734 :           _2c1d_0300(bp04, 4, si);
15735 :           //^24A5:12FE
15736 :           break;
15737 : 
15738 :         case 10:      // ‘Î{VEN}”é–ò
15739 :           //^24A5:1324
15740 :           _2c1d_1bb5(xx);
15741 :           //^24A5:132D
15742 :           break;
15743 : 
15744 :         case 11:      // ӎИ{MON}
15745 :           //^24A5:1330
15746 :           bp04->curStamina(bp04->curStamina() +min_value(bp04->maxStamina() -bp04->curStamina(), bp04->maxStamina() / bp0c));
15747 :           //^24A5:1354
15748 :           break;
15749 : 
15750 :         case 12:      // ӎИ{YA}
15751 :           //^24A5:1357
15752 :           si += (si >> 1);
15753 :           //^24A5:135D
15754 :           _2c1d_0009(1 << xx, 2, si, si * si);
15755 :           //^24A5:1373
15756 :           break;
15757 : 
15758 :         case 13:      // ӎИ{EE}
15759 :           //^24A5:1375
15760 :           bp0a = min_value(bp04->curMP() +si +(si -8), MAXMP);
15761 :           //^24A5:1393
15762 :           if (bp04->maxMP() < bp0a) {
15763 :             //^24A5:139F
15764 :             bp0a -= (bp0a -max_value(bp04->curMP(), bp04->maxMP())) >> 1;
15765 :           }
15766 :           //^24A5:13B8
15767 :           bp04->curMP(bp0a);
15768 :           //^24A5:13C2
15769 :           break;
15770 : 
15771 :         case 14:      // ӎИ{VI}
15772 :           //^24A5:13C5
15773 :           bp0a = bp08->PotionPower() / 42;
15774 :           //^24A5:13E3
15775 :           bp04->curHP(bp04->curHP() + (bp04->maxHP() / bp0c));
15776 :           //^24A5:13FB
15777 :           bp0e = bp04->w52;
15778 :           //^24A5:1402
15779 :           if (bp0e == 0)
15780 :             //^24A5:1404
15781 :             break;
15782 :           //^24A5:1406
15783 :           bp0c = 10;
15784 :           do {
15785 :             //^24A5:140B
15786 :             for (si = 0; si < bp0a; si++) {
15787 :               //^24A5:140F
15788 :               bp04->w52 &= RAND();
15789 :               //^24A5:141B
15790 :             }
15791 :             //^24A5:1421
15792 :             bp0a = 1;
15793 :             //^24A5:1426
15794 :             if (bp04->w52 != bp0e)
15795 :               //^24A5:1430
15796 :               break;
15797 :             //^24A5:1432
15798 :             bp0c--;
15799 :             //^24A5:1435
15800 :           } while (bp0c != 0);
15801 :           //^24A5:143C
15802 :           break;
15803 : 
15804 :         case 15:      // WATER FLASK
15805 :           //^24A5:143E
15806 :           bp04->curWater(min_value(bp04->curWater() +1600, MAXWATER));
15807 : 
15808 :           break;
15809 :       }
15810 :       //^24A5:145A
15811 :       if (zz == 0xffff)
15812 :         //^24A5:1460
15813 :         _2c1d_073d();
15814 :       //^24A5:1465
15815 :       DEALLOC_RECORD(di);
15816 :       //^24A5:146C
15817 :       di = ALLOC_NEW_RECORD(dbPotion);
15818 :       //^24A5:1476
15819 :       if (di == di.FFFF)
15820 :         //^24A5:147B
15821 :         return;
15822 :       //^24A5:147E
15823 :       SET_ITEMTYPE(di, 0x14);
15824 :       //^24A5:1488
15825 :       if (zz == 0xffff) {
15826 :         //^24A5:148E
15827 :         _2c1d_06b5(di, 0);
15828 :       }
15829 :       else {
15830 :         //^24A5:149A
15831 :         bp04->Possess(zz, di);
15832 :       }
15833 :       //^24A5:14A9
15834 : _14a9:
15835 :       if (bp04->curStamina() > bp04->maxStamina()) {
15836 :         //^24A5:14B6
15837 :         bp04->curStamina(bp04->maxStamina());
15838 :       }
15839 :       //^24A5:14BE
15840 :       if (bp04->curHP() > bp04->maxHP()) {
15841 :         //^24A5:14CB
15842 :         bp04->curHP(bp04->maxHP());
15843 :       }
15844 :       //^24A5:14D3
15845 :       QUEUE_NOISE_GEN2(0x16, bp04->HeroType(), 0x83, 0xfe, _4976_4bfa, _4976_4c06, 0, 0x96, 0x80);
15846 :       //^24A5:14FC
15847 :       bp04->w50 |= 0x3800;
15848 :       //^24A5:1505
15849 :       if (zz != 0xffff) {
15850 :         //^24A5:150B
15851 :         bp04->w50 |= 0x4000;
15852 :         //^24A5:1511
15853 :         CALC_PLAYER_WEIGHT(xx);
15854 :       }
15855 :     }
15856 :     //^24A5:151A
15857 :     return;
15858 :   }
15859 : 
15860 :   //^24A5:174D
15861 :   void _24a5_174d()
15862 :   {
15863 :     //^24A5:174D
15864 :     ENTER(0);
15865 :     //^24A5:1750
15866 :     _443c_03f4();
15867 :     //^24A5:1755
15868 :     _4976_4c38 = 1;
15869 :     //^24A5:175B
15870 :     _443c_08ab(&_4976_5da0, &_4976_5da2, &_4976_5db8);
15871 :     //^24A5:176F
15872 :     if ((_4976_5db8 & 2) == 0) {
15873 :       //^24A5:1777
15874 :       FIRE_MOUSE_SET_POS();
15875 :       //^24A5:177C
15876 :       _4976_4c38 = 0;
15877 :     }
15878 :     else {
15879 :       //^24A5:1784
15880 :       _1031_098e();
15881 :       //^24A5:1789
15882 :       _443c_085a();
15883 :       //^24A5:178E
15884 :       SLEEP_SEVERAL_TIME(8);
15885 :     }
15886 :     //^24A5:1796
15887 :     return;
15888 :   }
15889 : 
15890 :       void _12b4_0aa5(U16 xx); // TODO: Unreachable
15891 : 
15892 :   //^0CEE:317F
15893 :   U16 IS_WALL_ORNATE_ALCOVE_FROM_RECORD(ObjectID rl)
15894 :   {
15895 :     //^0CEE:317F
15896 :     ENTER(0);
15897 :     //^0CEE:3182
15898 :     return (IS_WALL_ORNATE_ALCOVE(QUERY_CLS2_FROM_RECORD(rl)) == 1) ? 1 : 0;
15899 :   }
15900 : 
15901 :   //^0CEE:0AE1
15902 :   ObjectID GET_WALL_TILE_ANYITEM_RECORD(U16 xx, U16 yy)
15903 :   {
15904 :     //^0CEE:0AE1
15905 :     ENTER(0);
15906 :     //^0CEE:0AE5
15907 :     ObjectID si = GET_TILE_RECORD_LINK(xx, yy);
15908 :     //^0CEE:0AF1
15909 :     while (si.DBType() <= dbActuator) {
15910 :       //^0CEE:0AF3
15911 :       si = GET_NEXT_RECORD_LINK(si);
15912 :       //^0CEE:0AF9
15913 :     }
15914 :     //^0CEE:0B08
15915 :     return si;
15916 :   }
15917 : 
15918 :   //^0CEE:31D7
15919 :   U16 IS_WALL_ORNATE_SPRING(ObjectID rl)
15920 :   {
15921 :     //^0CEE:31D7
15922 :     ENTER(2);
15923 :     //^0CEE:31DB
15924 :     U8 bp01 = QUERY_CLS2_FROM_RECORD(rl);
15925 :     //^0CEE:31E6
15926 :     if (bp01 == 0xff)
15927 :       //^0CEE:31EA
15928 :       return 0;
15929 :     //^0CEE:31EE
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); // TODO: Unreachable
15934 : 
15935 :   //^2FCF:16B8
15936 :   ObjectID FIND_DISTINCTIVE_ITEM_ON_TILE(U16 xx, U16 yy, i16 dir, U16 disit)
15937 :   {
15938 :     //^2FCF:16B8
15939 :     ENTER(0);
15940 :     //^2FCF:16BC
15941 :     for (ObjectID si = GET_WALL_TILE_ANYITEM_RECORD(xx, yy); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
15942 :       //^2FCF:16CB
15943 :       if (GET_DISTINCTIVE_ITEMTYPE(si) == disit) {
15944 :         //^2FCF:16D7
15945 :         if (dir == -1 || si.Dir() == dir) {
15946 :           //^2FCF:16E7
15947 :           return si;
15948 :         }
15949 :       }
15950 :       //^2FCF:16EB
15951 :     }
15952 :     //^2FCF:16F9
15953 :     return ObjectID::FFFF;
15954 :   }
15955 : 
15956 :   //^2FCF:19F4
15957 :   void MOVE_RECORD_AT_WALL(U16 xx, U16 yy, U16 dir, ObjectID rlUnk, ObjectID rlWhatYouPlace)
15958 :   {
15959 :     // 1) call when you place an apple to the ornate wall (alcove, keyhole, shop panel)
15960 :     // # xx=wall-x, yy=wall-y, dir=wall-side, rlUnk=FFFF, rlWhatYouPlace=your-holding-item
15961 : 
15962 :     // e.g. you place a torch at wall. _2fcf_19f4( 8, 4, 2,FFFF,1502)
15963 :     // e.g. you take a torch at wall.  _2fcf_19f4( 8, 4, 2,FFFF,FFFF)
15964 : 
15965 :     //^2FCF:19F4
15966 :     ENTER(68);
15967 :     //^2FCF:19FA
15968 :     ObjectID si = rlWhatYouPlace;
15969 :     U16 bp26 = 0;
15970 :     U16 bp3a = 0;
15971 :     ObjectID bp34 = ObjectID::FFFF;
15972 :     //^2FCF:1A0C
15973 :     ObjectID bp0e = GET_TILE_RECORD_LINK(xx, yy);
15974 :     //^2FCF:1A1C
15975 :     U16 bp2a;
15976 :     for (U16 bp28 = 0; bp0e != bp0e.FFFE && bp28 == 0; bp0e = GET_NEXT_RECORD_LINK(bp0e)) {
15977 :       //^2FCF:1A24
15978 :       U16 bp10 = bp0e.Dir();
15979 :       //^2FCF:1A2D
15980 :       if (bp10 != dir)
15981 :         //^2FCF:1A32
15982 :         continue;
15983 :       //^2FCF:1A35
15984 :       if (IS_WALL_ORNATE_ALCOVE_FROM_RECORD(bp0e) != 0) {
15985 :         //^2FCF:1A45
15986 :         if (si == si.FFFF) {
15987 :           //^2FCF:1A4A
15988 :           ObjectID bp32 = GET_WALL_TILE_ANYITEM_RECORD(xx, yy);
15989 :           //^2FCF:1A5A
15990 :           ObjectID bp30 = ObjectID::FFFF;
15991 :           //^2FCF:1A5F
15992 :           for (; bp32 != bp32.FFFE; bp32 = GET_NEXT_RECORD_LINK(bp32)) {
15993 :             //^2FCF:1A61
15994 :             if (bp32.Dir() == bp10) {
15995 :               //^2FCF:1A6C
15996 :               bp30 = bp32;
15997 :             }
15998 :             //^2FCF:1A72
15999 :           }
16000 :           //^2FCF:1A84
16001 :           if (bp30 == bp30.FFFF)
16002 :             //^2FCF:1A8A
16003 :             break;
16004 :           //^2FCF:1A8D
16005 :           U16 bp2e = bp30.DBType();
16006 :           //^2FCF:1A99
16007 :           if (bp2e < dbWeapon || bp2e > dbMiscellaneous_item)
16008 :             //^2FCF:1AA8
16009 :             break;
16010 :           //^2FCF:1AAB
16011 :           MOVE_RECORD_TO(bp30, xx, yy, -1, 0);
16012 :           //^2FCF:1ABF
16013 :           bp34 = bp30;
16014 :           //^2FCF:1AC5
16015 :           break;
16016 :         }
16017 :         //^2FCF:1AC8
16018 :         bp2a = 1;
16019 :         //^2FCF:1ACD
16020 :         MOVE_RECORD_TO(ObjectID(si, bp10), -1, 0, xx, yy);
16021 :         //^2FCF:1AED
16022 :         break;
16023 :       }
16024 :       //^2FCF:1AF0
16025 :       if (IS_WALL_ORNATE_SPRING(bp0e) != 0) {
16026 :         //^2FCF:1B00
16027 :         if (si == si.FFFF) {
16028 :           //^2FCF:1B05
16029 :           if (_4976_3fc6 == -1)
16030 :             //^2FCF:1B0C
16031 :             break;
16032 :           //^2FCF:1B0F
16033 :           for (i16 bp42 = 0; bp42 < 4; bp42++) {
16034 :             //^2FCF:1B16
16035 :             if (_4976_53b4[bp42].curHP() != 0) {
16036 :               //^2FCF:1B27
16037 :               _4976_53b4[bp42].curWater(MAXWATER);
16038 :             }
16039 :             //^2FCF:1B37
16040 :           }
16041 :           //^2FCF:1B40
16042 :           QUEUE_NOISE_GEN2(0x16, _4976_53b4[_4976_3fc6].HeroType(), 0x83, 0xfe, _4976_4bfa, _4976_4c06, 0, 0x96, 0x80);
16043 :           //^2FCF:1B6F
16044 :           break;
16045 :         }
16046 :         //^2FCF:1B72
16047 :         if ((QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 1) != 0) {
16048 :           //^2FCF:1B81
16049 :           ADD_ITEM_CHARGE(si, 15);
16050 :           //^2FCF:1B8B
16051 :           bp2a = 1;
16052 :           bp34 = si;
16053 :           //^2FCF:1B93
16054 :           break;
16055 :         }
16056 :         //^2FCF:1B96
16057 :         if (GET_DISTINCTIVE_ITEMTYPE(si) != 0x0194)
16058 :           //^2FCF:1BA2
16059 :           break;
16060 :         //^2FCF:1BA5
16061 :         SET_ITEMTYPE(si, 15);
16062 :         //^2FCF:1BAF
16063 :         bp2a = 1;
16064 :         bp34 = si;
16065 :         //^2FCF:1BB7
16066 :         break;
16067 :       }
16068 :       //^2FCF:1BBA
16069 :       U16 bp1c = bp0e.DBType();
16070 :       //^2FCF:1BC6
16071 :       U16 bp16;
16072 :       if (bp1c == dbActuator) {
16073 :         //^2FCF:1BCE
16074 :         Actuator *bp04 = GET_ADDRESS_OF_RECORD3(bp0e);
16075 :         //^2FCF:1BDD
16076 :         bp16 = bp04->ActuatorType();
16077 :         //^2FCF:1BEA
16078 :         U16 bp18 = bp04->ActuatorData();
16079 :         //^2FCF:1BF7
16080 :         U16 bp1a = bp04->ActionType();
16081 :         //^2FCF:1C04
16082 :         if (_4976_3fc6 == -1 && bp16 != 0x7e)
16083 :           //^2FCF:1C11
16084 :           continue;
16085 :         //^2FCF:1C14
16086 :         U8 bp23 = GET_WALL_DECORATION_OF_ACTUATOR(bp04);
16087 :         //^2FCF:1C24
16088 :         if (bp16 == 0)
16089 :           //^2FCF:1C2A
16090 :           continue;
16091 :         //^2FCF:1C2D
16092 :         U16 di = 1;
16093 :         //^2FCF:1C30
16094 :         U16 bp44 = bp16;
16095 :         //^2FCF:1C36
16096 :         U16 bp2c;
16097 :         Door *bp14;
16098 :         U16 bp1e;
16099 :         U16 bp36;
16100 :         switch (bp44) {
16101 :           default:
16102 :             //^2FCF:1C48
16103 :             continue;
16104 : 
16105 :           case 0x3F: // 0x3f -> 'Shop panel'
16106 :             //^2FCF:1C4F
16107 :             if (si == si.FFFF)
16108 :               //^2FCF:1C57
16109 :               bp04->w4_0_0(0);
16110 :             //^2FCF:1C5F
16111 :             break;
16112 : 
16113 :           case 0x01: // 0x01 -> ?
16114 :             //^2FCF:1C62
16115 :             di = 0;
16116 :             //^2FCF:1C64
16117 :             if (bp04->ActionType() != 3)
16118 :               //^2FCF:1C74
16119 :               //^2FCF:1C79
16120 :               continue;
16121 :             //^2FCF:1C76
16122 :             break;
16123 : 
16124 :           case 0x02: // 0x02 -> ?
16125 :             //^2FCF:1C7C
16126 :             di = (bp04->RevertEffect() != ((si == si.FFFF) ? 1 : 0)) ? 1 : 0;
16127 :             //^2FCF:1CA2
16128 :             //^2FCF:1E65
16129 :             //^2FCF:1E67
16130 :             break;
16131 : 
16132 :           case 0x15: // 0x15 -> 'Activator, charged item watcher'
16133 :             //^2FCF:1CA5
16134 :             if (ADD_ITEM_CHARGE(si, 0) == 0)
16135 :               //^2FCF:1CB3
16136 :               break;
16137 : 
16138 :             goto _1cb6;
16139 : 
16140 :           case 0x03: // 0x03 -> 'Activator, item watcher
16141 :             //^2FCF:1CB6
16142 : _1cb6:
16143 :             bp2c = (GET_DISTINCTIVE_ITEMTYPE(si) == bp18) ? 1 : 0;
16144 :             //^2FCF:1CCC
16145 :             di = (bp04->RevertEffect() == bp2c) ? 1 : 0;
16146 :             //^2FCF:1CE7
16147 :             if (bp2c == 0 || bp04->OnceOnlyActuator() == 0)
16148 :               //^2FCF:1D01
16149 :               break;
16150 :             //^2FCF:1D04
16151 :             DEALLOC_RECORD(_2c1d_073d());
16152 :             //^2FCF:1D10
16153 :             break;
16154 : 
16155 :           case 0x46: // 0x46 -> 'Activator, seal-able push button wall switch'
16156 :             //^2FCF:1D13
16157 :             bp14 = GET_ADDRESS_OF_TILE_RECORD(bp04->Xcoord(), bp04->Ycoord())->castToDoor();
16158 :             //^2FCF:1D39
16159 :             if (bp14->w2_d_d() == 0)
16160 :               //^2FCF:1D4A
16161 :               continue;
16162 : 
16163 :             goto _1d4d;
16164 : 
16165 :           case 0x18: // 0x18 -> 'Activator, push button wall switch'
16166 :             //^2FCF:1D4D
16167 : _1d4d:
16168 :             if (si != si.FFFF || bp04->w4_0_0() != 0)
16169 :               //^2FCF:1D52
16170 :               continue;
16171 :             //^2FCF:1D66
16172 :             sk5c20 bp40;
16173 :             bp40.SetMap(_4976_0c5a);
16174 :             bp40.SetTick(_4976_4bec +bp18 +2);
16175 :             //^2FCF:1D8F
16176 :             bp40.TimerType(0x57);
16177 :             bp40.b5 = 0;
16178 :             //^2FCF:1D97
16179 :             bp40.w6 = bp0e;
16180 :             //^2FCF:1D9D
16181 :             QUEUE_TIMER(&bp40);
16182 :             //^2FCF:1DA9
16183 :             bp04->w4_0_0(1);
16184 :             //^2FCF:1DB1
16185 :             di = 0;
16186 :             //^2FCF:1DB3
16187 :             if (di != 0 || bp1a != 3)
16188 :               //^2FCF:1DC0
16189 :               break;
16190 :             //^2FCF:1DC3
16191 :             bp26 = 1;
16192 :             //^2FCF:1DC8
16193 :             if (bp04->SoundEffect() != 0) {
16194 :               //^2FCF:1DD6
16195 :               QUEUE_NOISE_GEN2(0x09, bp23, 0x88, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x8c, 0x80);
16196 :             }
16197 :             //^2FCF:1DFA
16198 :             INVOKE_ACTUATOR(bp04, 0, 0);
16199 :             //^2FCF:1E0B
16200 :             INVOKE_ACTUATOR(bp04, 1, bp18 +1);
16201 :             //^2FCF:1E1F
16202 :             continue;
16203 : 
16204 :           case 0x17: // 0x17 -> 'Activator, 2 state wall switch'
16205 :             //^2FCF:1E22
16206 :             if (si != si.FFFF)
16207 :               //^2FCF:1E27
16208 :               continue;
16209 :             //^2FCF:1E2A
16210 :             bp04->OnceOnlyActuator(bp04->OnceOnlyActuator() ^ 1);
16211 :             //^2FCF:1E49
16212 :             di = !(bp04->OnceOnlyActuator() ^ bp04->RevertEffect());
16213 :             //^2FCF:1E65
16214 :             //^2FCF:1E67
16215 :             break;
16216 : 
16217 :           case 0x7E: // 0x7e -> 'Activator, resuscitation'
16218 :             //^2FCF:1E6A
16219 :             if (bp04->OnceOnlyActuator() == 0 || ((_4976_4bf6 +2) & 3) != dir)
16220 :               //^2FCF:1E8B
16221 :               break;
16222 :             //^2FCF:1E8E
16223 :             _2f3f_0343(_4976_4bfa, _4976_4c06, _4976_4bf6, _4976_4bf4);
16224 :             //^2FCF:1EA6
16225 :             bp28 = 1;
16226 :             //^2FCF:1EAB
16227 :             di = 0;
16228 :             //^2FCF:1EAD
16229 :             break;
16230 : 
16231 :           case 0x1A: // 0x1a -> 'Activator, key hole'
16232 :             //^2FCF:1EB0
16233 :             bp1e = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x0e);
16234 :             //^2FCF:1EC5
16235 :             if (bp04->OnceOnlyActuator() != 0) {
16236 :               //^2FCF:1ED6
16237 :               if (si != si.FFFF)
16238 :                 //^2FCF:1EDB
16239 :                 goto _22b1;
16240 :               //^2FCF:1EDE
16241 :               si = FIND_DISTINCTIVE_ITEM_ON_TILE(xx, yy, bp10, bp1e);
16242 :               //^2FCF:1EF3
16243 :               if (si == si.FFFE) {
16244 :                 //^2FCF:1EF8
16245 :                 si = ALLOC_NEW_DBITEM(bp1e);
16246 :                 //^2FCF:1F03
16247 :                 if (si == si.FFFF)
16248 :                   //^2FCF:1F08
16249 :                   continue;
16250 :                 //^2FCF:1F0B
16251 :                 APPEND_RECORD_TO(si = ObjectID(si, bp10), NULL, xx, yy);
16252 :               }
16253 :               //^2FCF:1F30
16254 :               ADD_ITEM_CHARGE(si, 15);
16255 :               //^2FCF:1F3A
16256 :               MOVE_RECORD_TO(si, xx, yy, -1, 0);
16257 :               //^2FCF:1F4C
16258 :               bp34 = si;
16259 :             }
16260 :             else {
16261 :               //^2FCF:1F51
16262 :               if (si == si.FFFF || GET_DISTINCTIVE_ITEMTYPE(si) != bp1e)
16263 :                 //^2FCF:1F65
16264 :                 continue;
16265 :               //^2FCF:1F68
16266 :               bp2a = 1;
16267 :               //^2FCF:1F6D
16268 :               MOVE_RECORD_TO(ObjectID(bp10, si), -1, 0, xx, yy);
16269 :             }
16270 :             //^2FCF:1F8D
16271 :             si = si.FFFF;
16272 :             //^2FCF:1F90
16273 :             goto _22ab;
16274 : 
16275 :           case 0x1B: // 0x1b -> ?
16276 :             //^2FCF:1F96
16277 :             if (bp18 == 0)
16278 :               //^2FCF:1F9C
16279 :               continue;
16280 :             //^2FCF:1F9F
16281 :             bp1e = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x0e);
16282 :             //^2FCF:1FB4
16283 :             if (GET_DISTINCTIVE_ITEMTYPE(si) != bp1e)
16284 :               //^2FCF:1FC0
16285 :               continue;
16286 :             //^2FCF:1FC3
16287 :             bp2a = 1;
16288 :             //^2FCF:1FC8
16289 :             si = si.FFFF;
16290 :             //^2FCF:1FCB
16291 :             if (--bp18 == 0) {
16292 :               //^2FCF:1FD5
16293 :               di = 0;
16294 :               //^2FCF:1FD7
16295 :               bp04->w4_0_0(1);
16296 :             }
16297 :             //^2FCF:1FDF
16298 :             bp04->ActuatorData(bp18);
16299 :             //^2FCF:1FF5
16300 :             break;
16301 : 
16302 :           case 0x1C: // 0x1c -> ?
16303 :             //^2FCF:1FF8
16304 :             if (si != si.FFFF || bp04->OnceOnlyActuator() != 0)
16305 :               //^2FCF:2011
16306 :               continue;
16307 :             //^2FCF:2014
16308 :             bp36 = (bp04->RevertEffect() != 0) ? bp04->ActionType() : ((bp04->ActionType() + _4976_4bf6) & 3);
16309 :             //^2FCF:204E
16310 :             _2fcf_183c(bp04->Xcoord(), bp04->Ycoord(), bp18 & 0x3f, bp36);
16311 :             //^2FCF:2078
16312 :             _1031_098e();
16313 : 
16314 :             break;
16315 :         }
16316 :         //^2FCF:207D
16317 :         if (bp1a == 3) {
16318 :           //^2FCF:2083
16319 :           bp1a = (di != 0) ? 1 : 0;
16320 :           //^2FCF:2091
16321 :           di = 0;
16322 :         }
16323 :         //^2FCF:2093
16324 :         if (di != 0)
16325 :           //^2FCF:2097
16326 :           continue;
16327 :         //^2FCF:209A
16328 :         bp26 = 1;
16329 :         //^2FCF:209F
16330 :         if (bp04->SoundEffect() != 0) {
16331 :           //^2FCF:20B0
16332 :           QUEUE_NOISE_GEN2(0x09, bp23, 0x88, 0xfe, _4976_4bfa, _4976_4c06, 1, 0x8c, 0x80);
16333 :         }
16334 :         //^2FCF:20D4
16335 :         INVOKE_ACTUATOR(bp04, bp1a, 0);
16336 :       }
16337 :       //^2FCF:20E9
16338 :       if (rlUnk == rlUnk.FFFF || bp1c == dbText) {
16339 :         //^2FCF:20FB
16340 :         Text *bp0c = GET_ADDRESS_OF_RECORD2(bp0e);
16341 :         //^2FCF:210A
16342 :         if (bp0c->TextMode() != 1)
16343 :           //^2FCF:211B
16344 :           continue;
16345 :         //^2FCF:211E
16346 :         U8 bp23 = bp0c->TextIndex() & 0xff;
16347 :         //^2FCF:212D
16348 :         if (_4976_3fc6 == -1)
16349 :           //^2FCF:2134
16350 :           continue;
16351 :         //^2FCF:2137
16352 :         i16 bp20;
16353 :         i16 bp22;
16354 :         i16 bp36;
16355 :         U16 bp1e;
16356 :         switch (bp0c->SimpleTextExtUsage()) {
16357 :           case  4:
16358 :           case  8:
16359 :             //^2FCF:2161
16360 :             bp1e = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x0e);
16361 :             //^2FCF:2176
16362 :             if (bp0c->TextVisibility() != 0) {
16363 :               //^2FCF:2187
16364 :               if (si != si.FFFF)
16365 :                 //^2FCF:218C
16366 :                 goto _22b1;
16367 :               //^2FCF:218F
16368 :               si = FIND_DISTINCTIVE_ITEM_ON_TILE(xx, yy, bp10, bp1e);
16369 :               //^2FCF:21A4
16370 :               if (si == si.FFFF) {
16371 :                 //^2FCF:21A9
16372 :                 si = ALLOC_NEW_DBITEM(bp1e);
16373 :                 //^2FCF:21B4
16374 :                 if (si == si.FFFF)
16375 :                   //^2FCF:21B9
16376 :                   continue;
16377 :                 //^2FCF:21BC
16378 :                 APPEND_RECORD_TO(si = ObjectID(si, bp10), NULL, xx, yy);
16379 :               }
16380 :               //^2FCF:21E1
16381 :               ADD_ITEM_CHARGE(si, 15);
16382 :               //^2FCF:21EB
16383 :               MOVE_RECORD_TO(si, xx, yy, -1, 0);
16384 :               //^2FCF:21FD
16385 :               bp34 = si;
16386 :               //^2FCF:2200
16387 :               si = si.FFFF;
16388 :               //^2FCF:2203
16389 :               if (bp16 != 8)
16390 :                 //^2FCF:2209
16391 :                 goto _22ab;
16392 :               //^2FCF:220C
16393 :               sk5c20 bp40;
16394 :               bp40.SetMap(_4976_0c5a);
16395 :               bp40.SetTick(QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x12) + _4976_4bec +2);
16396 :               //^2FCF:224A
16397 :               bp40.TimerType(0x5c);
16398 :               bp40.b5 = 0;
16399 :               //^2FCF:2252
16400 :               bp40.w6 = bp0e;
16401 :               //^2FCF:2258
16402 :               QUEUE_TIMER(&bp40);
16403 :             }
16404 :             //^2FCF:2266
16405 :             else if (bp16 != 8) {
16406 :               //^2FCF:226C
16407 :               if (si == si.FFFF)
16408 :                 //^2FCF:2271
16409 :                 continue;
16410 :               //^2FCF:2274
16411 :               if (GET_DISTINCTIVE_ITEMTYPE(si) != bp1e)
16412 :                 //^2FCF:2280
16413 :                 continue;
16414 :               //^2FCF:2283
16415 :               bp2a = 1;
16416 :               //^2FCF:2288
16417 :               MOVE_RECORD_TO(ObjectID(bp10, si), -1, 0, xx, yy);
16418 :               //^2FCF:22A8
16419 :               si = si.FFFF;
16420 :             }
16421 :             //^2FCF:22AB
16422 : _22ab:
16423 :             _4976_4cb8 = 1;
16424 :             //^2FCF:22B1
16425 : _22b1:
16426 :             bp28 = 1;
16427 :             //^2FCF:22B6
16428 :             continue;
16429 : 
16430 :           case  7:
16431 :             //^2FCF:22B9
16432 :             if (bp0c->TextVisibility() != 0)
16433 :               //^2FCF:22C7
16434 :               continue;
16435 : 
16436 :             goto _22ca;
16437 : 
16438 :           case  6:
16439 :             //^2FCF:22CA
16440 : _22ca:
16441 :             if (si != si.FFFF)
16442 :               //^2FCF:22CF
16443 :               continue;
16444 :             //^2FCF:22D2
16445 :             bp36 = (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp23, dtWordValue, 0x11) != 0) ? -1 : 1;
16446 :             //^2FCF:22F4
16447 :             bp20 = _4976_4bfa;
16448 :             bp22 = _4976_4c06;
16449 :             //^2FCF:2300
16450 :             bp36 = _0cee_0510(_4976_4bfa, bp36, &bp20, &bp22, NULL);
16451 :             //^2FCF:2320
16452 :             if (bp36 < 0)
16453 :               //^2FCF:2322
16454 :               continue;
16455 :             //^2FCF:2324
16456 :             _2fcf_183c(bp20, bp22, bp36, _4976_4bf6);
16457 :             //^2FCF:2338
16458 :             _1031_098e();
16459 :             //^2FCF:233D
16460 :             continue;
16461 : 
16462 :           case 13:
16463 :             //^2FCF:233F
16464 :             if (si != si.FFFF)
16465 :               //^2FCF:2342
16466 :               continue;
16467 :             //^2FCF:2344
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 :       //^2FCF:235F
16481 :       if (bp1c >= dbActuator)
16482 :         //^2FCF:2363
16483 :         break;
16484 :       //^2FCF:2365
16485 :     }
16486 :     //^2FCF:2380
16487 :     if (rlUnk == rlUnk.FFFF) {
16488 :       //^2FCF:2386
16489 :       if (bp2a != 0)
16490 :         //^2FCF:238C
16491 :         _2c1d_073d();
16492 :       //^2FCF:2391
16493 :       if (bp34 != bp34.FFFF) {
16494 :         //^2FCF:2397
16495 :         _2c1d_06b5(bp34, 1);
16496 :       }
16497 :       //^2FCF:23A3
16498 :       _4976_4e5c = bp26;
16499 :       //^2FCF:23A9
16500 :       return;
16501 :     }
16502 :     //^2FCF:23AB
16503 :     GenericContainerRecord *bp08 = GET_ADDRESS_OF_GENERIC_CONTAINER_RECORD(rlUnk);
16504 :     //^2FCF:23BA
16505 :     if (bp2a == 0 && rlWhatYouPlace != rlWhatYouPlace.FFFF) {
16506 :       //^2FCF:23C6
16507 :       APPEND_RECORD_TO(rlWhatYouPlace, &bp08->w2, -1, 0);
16508 :     }
16509 :     //^2FCF:23DE
16510 :     if (bp34 != bp34.FFFF) {
16511 :       //^2FCF:23E4
16512 :       APPEND_RECORD_TO(bp34, &bp08->w2, -1, 0);
16513 :     }
16514 :     //^2FCF:23FC
16515 :     return;
16516 :   }
16517 : 
16518 :   //^098D:0CD7
16519 :   U16 _098d_0cd7(i16 xx, U16 yy, U16 zz)
16520 :   {
16521 :     //^098D:0CD7
16522 :     ENTER(0);
16523 :     //^098D:0CDA
16524 :     if (zz != 0) {
16525 :       //^098D:0CE0
16526 :       return _4976_019a[xx] +yy;
16527 :     }
16528 :     //^098D:0CEE
16529 :     return xx * 25 +yy +3100;
16530 :   }
16531 : 
16532 :   //^32CB:08C1
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 :     //^32CB:08C1
16536 :     ENTER(2);
16537 :     //^32CB:08C7
16538 :     U16 di = uu;
16539 :     _0b36_0520(&_4976_5940, cls1, cls2, cls4);
16540 :     //^32CB:08E2
16541 :     if (yy != zz) {
16542 :       //^32CB:08EA
16543 :       U8 bp01;
16544 :       if (di == 2) {
16545 :         //^32CB:08EF
16546 :         bp01 = 0x14;
16547 :         //^32CB:08F3
16548 :         goto _08fe;
16549 :       }
16550 :       //^32CB:08F5
16551 :       else if (di == 3) {
16552 :         //^32CB:08FA
16553 :         bp01 = 0x15;
16554 :         //^32CB:08FE
16555 : _08fe:
16556 :         U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtWordValue, bp01);
16557 :         //^32CB:0916
16558 :         if (si != 0) {
16559 :           //^32CB:091A
16560 :           yy = ((((si >> 8) << 7) / (si & 255)) +1) >> 1;
16561 :         }
16562 :       }
16563 :     }
16564 :     //^32CB:0932
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 :     //^32CB:0972
16575 :     _32cb_0804(_4976_5940.b58, U8(di), colorkey1, colorkey2, _4976_5940.w56);
16576 :     //^32CB:0988
16577 :     _0b36_06d3(&_4976_5940);
16578 :     //^32CB:0993
16579 :     return;
16580 :   }
16581 : 
16582 :   //^32CB:0997
16583 :   void _32cb_0997()
16584 :   {
16585 :     //^32CB:0997
16586 :     ENTER(0);
16587 :     //^32CB:099A
16588 :     _0b36_0a3f(&_4976_5940);
16589 :     //^32CB:09A5
16590 :     return;
16591 :   }
16592 : 
16593 :   //^32CB:0A4C
16594 :   void _32cb_0a4c(SRECT *prc, U8 xx, U8 yy)
16595 :   {
16596 :     //^32CB:0A4C
16597 :     ENTER(0);
16598 :     //^32CB:0A4F
16599 :     COPY_MEMORY(prc, &_4976_4d1a[_4976_4dde], 8);
16600 :     //^32CB:0A6E
16601 :     _4976_4d1a[_4976_4dde].b11 = xx;
16602 :     _4976_4d1a[_4976_4dde].b10 = yy;
16603 :     _4976_4d1a[_4976_4dde].w8 = 0xffff;
16604 :     //^32CB:0AA0
16605 :     _4976_4dde++;
16606 :     //^32CB:0AA4
16607 :     return;
16608 :   }
16609 : 
16610 :   //^3E74:5AD9
16611 :   void QUERY_GDAT_IMAGE_METRICS(U8 cls1, U8 cls2, U8 cls3, i16 *pcx, i16 *pcy)
16612 :   {
16613 :     //^3E74:5AD9
16614 :     ENTER(4);
16615 :     //^3E74:5ADE
16616 :     U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls3);
16617 :     //^3E74:5AF5
16618 :     if (_4976_5c98[si].Absent()) {
16619 :       //^3E74:5B10
16620 :       U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(cls1, cls2, cls3);
16621 :       //^3E74:5B29
16622 :       *pcx = READ_I16(bp04,-4);
16623 :       *pcy = READ_I16(bp04,-2);
16624 :     }
16625 :     else {
16626 :       //^3E74:5B3F
16627 :       U8 *bp04 = _3e74_506b(cls1, cls2, dtImage, cls3);
16628 :       //^3E74:5B5A
16629 :       *pcx = READ_I16(bp04,+0) & 1023;
16630 :       *pcy = READ_I16(bp04,+2) & 1023;
16631 :     }
16632 :     //^3E74:5B79
16633 :     return;
16634 :   }
16635 : 
16636 :     U16 _32cb_158f(U8 xx); // TODO: Unreachable
16637 : 
16638 :   //^0B36:037E
16639 :   U8 *_0b36_037e(U8 *localpal, i8 xx, i16 colorkey1, i16 colorkey2, i16 palentcnt)
16640 :   {
16641 :     //^0B36:037E
16642 :     ENTER(8);
16643 :     //^0B36:0384
16644 :     if (localpal != NULL && xx != 0) {
16645 :       //^0B36:0398
16646 :       xx = U8(max_value(0, 64 -xx));
16647 :       //^0B36:03AF
16648 :       for (i16 bp02 = 0; bp02 < palentcnt; bp02++) {
16649 :         //^0B36:03B7
16650 :         if (bp02 != colorkey1 && bp02 != colorkey2) {
16651 :           //^0B36:03CA
16652 :           U16 di = _4976_4be2[localpal[bp02]].b0;
16653 :           i16 si = 0;
16654 :           //^0B36:03E6
16655 :           i16 bp04 = max_value((_4976_4bde[di].pv1[_4976_4be2[localpal[bp02]].b1] * xx) >> 6, 0);
16656 :           //^0B36:0433
16657 :           for (; _4976_4bde[di].b0 -1 > si; si++) {
16658 :             //^0B36:0435
16659 :             if (true
16660 :               && _4976_4bde[di].pv1[si] <= bp04
16661 :               && _4976_4bde[di].pv1[si +1] >= bp04
16662 :             ) {
16663 :               //^0B36:046C
16664 :               i16 bp06 = bp04 - _4976_4bde[di].pv1[si   ];
16665 :               //^0B36:048A
16666 :               i16 bp08 = _4976_4bde[di].pv1[si +1] -bp04;
16667 :               //^0B36:04A7
16668 :               if (bp06 > bp08)
16669 :                 //^0B36:04AF
16670 :                 si++;
16671 :               //^0B36:04B0
16672 :               break;
16673 :             }
16674 :             //^0B36:04B2
16675 :           }
16676 :           //^0B36:04CD
16677 :           si = min_value(si, _4976_4bde[di].b0 -1);
16678 :           //^0B36:04EB
16679 : 
16680 :           localpal[bp02] = _4976_4bde[di].pv5[si];
16681 :         }
16682 :         //^0B36:0508
16683 :       }
16684 :     }
16685 :     //^0B36:03AF
16686 :     return localpal;
16687 :   }
16688 : 
16689 :   //^32CB:0804
16690 :   void _32cb_0804(U8 *localpal, U8 cls4, U16 colorkey1, i16 colorkey2, U16 palentcnt)
16691 :   {
16692 :     //^32CB:0804
16693 :     ENTER(0);
16694 :     //^32CB:0809
16695 :     U16 di = palentcnt;
16696 :     //^32CB:080C
16697 :     i16 si;
16698 :     if (_4976_4bea != 0) {
16699 :       //^32CB:0813
16700 :       if (cls4 < 0) {
16701 :         //^32CB:0819
16702 :         si = max_value(-_4976_5a88, _4976_421b[-cls4]);
16703 :       }
16704 :       else {
16705 :         //^32CB:083A
16706 :         si = _4976_4221[cls4];
16707 :         //^32CB:0844
16708 :         cls4 += 9;
16709 :       }
16710 :     }
16711 :     else {
16712 :       //^32CB:084A
16713 :       si = _4976_4226[cls4];
16714 :     }
16715 :     //^32CB:0854
16716 :     if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x08, _4976_4218, dt07, cls4) != 0) {
16717 :       //^32CB:086C
16718 :       _0b36_0334(localpal, 0x08, _4976_4218, cls4, di);
16719 :       //^32CB:0885
16720 :       _0b36_037e(localpal, i8(_4976_5a88), colorkey1, colorkey2, di);
16721 :     }
16722 :     else {
16723 :       //^32CB:0892
16724 :       _0b36_037e(localpal, 64 -U8(((64 -si) * (64 - _4976_5a88)) >> 6), colorkey1, colorkey2, di);
16725 :     }
16726 :     //^32CB:08BD
16727 :     return;
16728 :   }
16729 : 
16730 :   //^32CB:09A7
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 :     //^32CB:09A7
16734 :     ENTER(0);
16735 :     //^32CB:09AB
16736 :     _32cb_08c1(mirrorflip, dd, width, 0, 0, height, -1, -1, colorkey1, -1, cls1, cls2, cls4);
16737 :     //^32CB:09D7
16738 :     COPY_MEMORY(&_4976_5940, ref, 314);
16739 :     //^32CB:09EE
16740 :     _0b36_018f(ref);
16741 :     //^32CB:09FB
16742 :     ref->w48 = colorkey;
16743 :     //^32CB:0A05
16744 :     SET_ORIGIN_RECT(&ref->rc36, width, height);
16745 :     //^32CB:0A1F
16746 :     U16 si;
16747 :     ref->pb44 = _3e74_57b5(si = _3e74_5888(), width, height, 8);
16748 :     //^32CB:0A47
16749 :     return si;
16750 :   }
16751 : 
16752 :   //^32CB:0AA6
16753 :   void _32cb_0aa6(U8 *xx, U16 *yy)
16754 :   {
16755 :     //^32CB:0AA6
16756 :     ENTER(0);
16757 :     //^32CB:0AA9
16758 :     *yy = (_4976_5c6a - _4976_5aa0) & 3;
16759 :     //^32CB:0ABB
16760 :     U8 cl = (*yy == 0 || *yy == 2) ? 0x71 : 0x6d;
16761 :     //^32CB:0ACF
16762 :     U16 dx = 0;
16763 :     //^32CB:0AD1
16764 :     if (_4976_5c5e >= 0x80) {
16765 :       //^32CB:0AD8
16766 :       dx = 3;
16767 :     }
16768 :     //^32CB:0ADD
16769 :     else if (_4976_5c5e >= 0x40) {
16770 :       //^32CB:0AE4
16771 :       dx = 2;
16772 :     }
16773 :     //^32CB:0AE9
16774 :     else if (_4976_5c5e >= 0x10) {
16775 :       //^32CB:0AF0
16776 :       dx = 1;
16777 :     }
16778 :     //^32CB:0AF5
16779 :     else if (_4976_5c5e > 0 && _4976_5c5e < 0x10) {
16780 :       //^32CB:0B03
16781 :       dx = 0;
16782 :     }
16783 :     //^32CB:0B05
16784 :     *xx = cl & U8(dx);
16785 :     //^32CB:0B0F
16786 :     return;
16787 :   }
16788 : 
16789 :   //^32CB:0649
16790 :   U8 *_32cb_0649(U8 cls1, U8 cls2, U8 cls3, i16 colorkey)
16791 :   {
16792 :     //^32CB:0649
16793 :     ENTER(6);
16794 :     //^32CB:064D
16795 :     U8 *bp04 = QUERY_GDAT_IMAGE_LOCALPAL(cls1, cls2, cls3);
16796 :     //^32CB:0667
16797 :     i16 bp06;
16798 :     if (bp04 == NULL) {
16799 :       //^32CB:066B
16800 :       if (_4976_5a88 == 63)
16801 :         //^32CB:0672
16802 :         return NULL;
16803 :       //^32CB:0678
16804 :       for (bp06 = 0; bp06 < 256; bp06++) {
16805 :         //^32CB:067F
16806 :         _4976_582a[bp06] = U8(bp06);
16807 :         //^32CB:0689
16808 :       }
16809 :       //^32CB:0693
16810 :       bp06 = 256;
16811 :     }
16812 :     else {
16813 :       //^32CB:069A
16814 :       COPY_MEMORY(bp04, _4976_582a, 16);
16815 :       //^32CB:06B0
16816 :       bp06 = 16;
16817 :     }
16818 :     //^32CB:06B5
16819 :     return _0b36_037e(_4976_582a, U8(_4976_5a88), colorkey, -1, bp06);
16820 :   }
16821 : 
16822 :   //^44C8:0762
16823 :   void FIRE_UPDATE_BLIT_PALETTE(U8 *localpal)
16824 :   {
16825 :     //^44C8:0762
16826 :     ENTER(0);
16827 :     //^44C8:0767
16828 :     U8 *di = _44c8_077d;
16829 :     //^44C8:0771
16830 :     U8 *si = localpal;
16831 :     //^44C8:0774
16832 :     memcpy(di, si, 16);
16833 :     //^44C8:078D
16834 :     return;
16835 :   }
16836 : 
16837 :   //^44C8:0791
16838 :   void FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(U16 offSrc, U16 offDst, U16 size)
16839 :   {
16840 :     //^44C8:0791
16841 :     ENTER(0);
16842 :     //^44C8:0796
16843 :     //^44C8:0798
16844 :     U8 *bx = _44c8_077d;
16845 :     //^44C8:079B
16846 :     U8 *di = &_4976_5e6a[offDst];
16847 :     //^44C8:07A4
16848 :     U16 cx = size;
16849 :     //^44C8:07A7
16850 :     U8 *si = _4976_5e64;
16851 :     //^44C8:07AB
16852 :     bool carry = (offSrc & 1) ? true : false;
16853 :     si += (offSrc >>= 1);
16854 :     //^44C8:07B4
16855 :     if (carry) {
16856 :       //^44C8:07B6
16857 :       U8 al = lodsb(si);
16858 :       stosb(di, bx[al & 15]);
16859 :       cx--;
16860 :       //^44C8:07BD
16861 :       if (cx == 0) goto _080a;
16862 :     }
16863 : 
16864 :     {
16865 :       //^44C8:07BF
16866 :       bool carry = (cx & 1) ? true : false;
16867 :       cx >>= 1;
16868 :       //^44C8:07C1
16869 :       if (cx != 0) {
16870 :         //^44C8:07C3
16871 :         bool carry = (cx & 1) ? true : false;
16872 :         cx >>= 1;
16873 :         //^44C8:07C6
16874 :         if (cx != 0) {
16875 :           //^44C8:07C8
16876 :           U16 bp = 0x0f0f;
16877 :           do {
16878 :             //^44C8:07CD
16879 :             U16 ax = lodsw(si);
16880 :             U16 dx = ax >> 4;
16881 :             dx &= bp;
16882 :             ax &= bp;
16883 :             //^44C8:07D7
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 :             //^44C8:07E9
16889 :           } while (--cx != 0);
16890 :         }
16891 :         //^44C8:07ED
16892 :         if (carry) {
16893 :           //^44C8:07EF
16894 :           U8 al = lodsb(si);
16895 :           stosb(di, bx[al >> 4     ]);
16896 :           stosb(di, bx[al      & 15]);
16897 :         }
16898 :       }
16899 :       //^44C8:0801
16900 :       if (carry) {
16901 :         //^44C8:0803
16902 :         U8 al = lodsb(si);
16903 :         stosb(di, bx[al >> 4]);
16904 :       }
16905 :     }
16906 :     //^44C8:080A
16907 : _080a:
16908 :     //^44C8:080D
16909 :     return;
16910 :   }
16911 : 
16912 : //  //^44C8:08AE
16913 : //  void _44c8_08ae(U16 offSrc, U16 offDst, U16 size, U8 colorkey)
16914 : //  {
16915 : //    //^44C8:08AE
16916 : //    ENTER(0);
16917 : //    //^44C8:08B3
16918 : //    U8 *bx = _44c8_077d;
16919 : //    //^44C8:08B8
16920 : //    U8 *di = &_4976_5e6a[offDst];
16921 : //    //^44C8:08C1
16922 : //    U8 dh = colorkey;
16923 : //    //^44C8:08C4
16924 : //    U16 cx = size;
16925 : //    //^44C8:08C7
16926 : //    U16 ax = offSrc;
16927 : //    bool carry = (ax & 1) ? true : false;
16928 : //    ax >>= 1;
16929 : //    //^44C8:08CD
16930 : //    U8 *si = &_4976_5e64[ax];
16931 : //    //^44C8:08D4
16932 : //    if (carry) {
16933 : //      //^44C8:08D6
16934 : //      U8 al = lodsb(si);
16935 : //      al &= 15;
16936 : //      if (al == dh) {
16937 : //        //^44C8:08DD
16938 : //        di++;
16939 : //      }
16940 : //      else {
16941 : //        stosb(di, bx[al]);
16942 : //      }
16943 : //      //^44C8:08E3
16944 : //      if (--cx == 0) goto _0931;
16945 : //    }
16946 : //
16947 : //    {
16948 : //      //^44C8:08E6
16949 : //      bool carry = (cx & 1) ? true : false;
16950 : //      cx >>= 1;
16951 : //      //^44C8:08E9
16952 : //      if (cx != 0) {
16953 : //        do {
16954 : //          //^44C8:08EB
16955 : //          U8 al = lodsb(si);
16956 : //          U8 ah = al & 15;
16957 : //          al >>= 4;
16958 : //          //^44C8:08F4
16959 : //          if (al != dh) {
16960 : //            //^44C8:08F8
16961 : //            if (ah != al) {
16962 : //              //^44C8:08FC
16963 : //              stosb(di, bx[al]);
16964 : //              stosb(di, bx[ah]);
16965 : //              //^44C8:0904
16966 : //              if (--cx != 0) continue;
16967 : //              break;
16968 : //            }
16969 : //            //^44C8:091D
16970 : //            stosb(di, bx[al]);
16971 : //            di++;//^44C8:0921
16972 : //            if (--cx != 0) continue;
16973 : //            break;
16974 : //          }
16975 : //          //^44C8:0908
16976 : //          if (ah != dh) {
16977 : //            //^44C8:090C
16978 : //            di++;
16979 : //            //^44C8:090D
16980 : //            stosb(di, bx[ah]);
16981 : //            //^44C8:0912
16982 : //            if (--cx != 0) continue;
16983 : //            break;
16984 : //          }
16985 : //          //^44C8:0916
16986 : //          di += 2;
16987 : //          //^44C8:0918
16988 : //        } while (--cx != 0);
16989 : //      }
16990 : //      //^44C8:0923
16991 : //      if (carry) {
16992 : //        //^44C8:0926
16993 : //        U8 al = lodsb(si) >> 4;
16994 : //        //^44C8:0927
16995 : //        if (al != dh) {
16996 : //          //^44C8:092E
16997 : //          stosb(di, bx[al]);
16998 : //        }
16999 : //      }
17000 : //    }
17001 : //    //^44C8:0931
17002 : //_0931:
17003 : //    //^44C8:0932
17004 : //    return;
17005 : //  }
17006 : 
17007 :     U16 _44c8_1e1a(U8 *xx, U16 yy); // TODO: Unreachable
17008 : 
17009 :   //^44C8:1E43
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 :     //^44C8:1E43
17013 :     ENTER(16);
17014 :     //^44C8:1E49
17015 :     FIRE_UPDATE_BLIT_PALETTE(localpal);
17016 :     //^44C8:1E55
17017 :     cc = (cc +1) & 0xfffe;
17018 :     //^44C8:1E5F
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 :     //^44C8:1E89
17024 :     U16 di = tt;
17025 :     U16 si = ss -tt;
17026 :     //^44C8:1E94
17027 :     _4976_5e64 = xx;
17028 :     _4976_5e6a = yy;
17029 :     //^44C8:1EAE
17030 :     if (zz == NULL) {
17031 :       //^44C8:1EB9
17032 :       for (U16 bp0a = 0; bp0a < bp06; bp02 += oo, bp0a++) {
17033 :         //^44C8:1EC1
17034 :         i16 bp0e = bp08;
17035 :         //^44C8:1EC7
17036 :         for (U16 bp0c = 0; bp0e >= si; bp0e -= si, bp0c += si, si = ss, di = 0) {
17037 :           //^44C8:1ECE
17038 :           if (colorkey < 0) {
17039 :             //^44C8:1ED4
17040 :             FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp02 +bp0c, si);
17041 :             //^44C8:1EE4
17042 :             continue;
17043 :           }
17044 :           //^44C8:1EE6
17045 :           FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, si, U8(colorkey));
17046 :           //^44C8:1EFA
17047 :         }
17048 :         //^44C8:1F0A
17049 :         if (bp0e > 0) {
17050 :           //^44C8:1F10
17051 :           if (colorkey < 0) {
17052 :             //^44C8:1F16
17053 :             FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp0c +bp0c, bp0e);
17054 :           }
17055 :           else {
17056 :             //^44C8:1F2A
17057 :             FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, bp0e, U8(colorkey));
17058 :           }
17059 :           //^44C8:1F40
17060 :           si -= bp0e;
17061 :           di += bp0e;
17062 :         }
17063 :         //^44C8:1F46
17064 :         if ((bp08 & 1) != 0) {
17065 :           //^44C8:1F4D
17066 :           if (--si != 0) {
17067 :             //^44C8:1F54
17068 :             di++;
17069 :           }
17070 :           else {
17071 :             //^44C8:1F57
17072 :             si = ss;
17073 :             di = 0;
17074 :           }
17075 :         }
17076 :         //^44C8:1F5C
17077 :       }
17078 :       //^44C8:1F70
17079 :       return;
17080 :     }
17081 :     //^44C8:1F73
17082 :     for (U16 bp0a = 0; bp0a < bp06; bp0a++) {
17083 :       //^44C8:1F7B
17084 :       for (U16 bp10 = bp08; bp10 > 0; ) {
17085 :         //^44C8:1F84
17086 :         for (U16 bp0c = 0; bp10 > 0 && _44c8_1e1a(zz, bp04 +bp0c) == 0; ) {
17087 :           //^44C8:1F8B
17088 :           --bp10;
17089 :           ++bp0c;
17090 :           ++di;
17091 :           --si;
17092 :           //^44C8:1F93
17093 :           if (si == 0) {
17094 :             //^44C8:1F99
17095 :             di = 0;
17096 :             si = ss;
17097 :           }
17098 :           //^44C8:1F9E
17099 :         }
17100 :         //^44C8:1FBC
17101 :         U16 bp0e;
17102 :         for (bp0e = 0; bp10 > 0 && _44c8_1e1a(zz, bp04 +bp0c) != 0; ) {
17103 :           //^44C8:1FC3
17104 :           ++bp0e;
17105 :           --bp10;
17106 :           //^44C8:1FC9
17107 :         }
17108 :         //^44C8:1FE7
17109 :         if (bp0e > 0) {
17110 :           //^44C8:1FED
17111 :           while (bp0e >= si) {
17112 :             //^44C8:1FEF
17113 :             if (colorkey < 0) {
17114 :               //^44C8:1FF5
17115 :               FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp02 +bp0c, si);
17116 :             }
17117 :             else {
17118 :               //^44C8:2007
17119 :               FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, si, U8(colorkey));
17120 :             }
17121 :             //^44C8:201B
17122 :             bp0e -= si;
17123 :             bp0c += si;
17124 :             //^44C8:2021
17125 :             si = ss;
17126 :             di = 0;
17127 :             //^44C8:2026
17128 :           }
17129 :           //^44C8:202B
17130 :           if (bp0e > 0) {
17131 :             //^44C8:2031
17132 :             if (colorkey < 0) {
17133 :               //^44C8:2037
17134 :               FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP_NOKEY(di, bp02 +bp0c, bp0e);
17135 :             }
17136 :             else {
17137 :               //^44C8:204B
17138 :               FIRE_BLIT_TO_MEMORY_ROW_4TO8BPP(di, bp02 +bp0c, bp0e, U8(colorkey));
17139 :             }
17140 :             //^44C8:2061
17141 :             si -= bp0e;
17142 :             di += bp0e;
17143 :           }
17144 :         }
17145 :         //^44C8:2067
17146 :         if ((bp08 & 1) != 0) {
17147 :           //^44C8:206E
17148 :           if (--si != 0) {
17149 :             //^44C8:2075
17150 :             ++di;
17151 :           }
17152 :           else {
17153 :             //^44C8:2078
17154 :             si = ss;
17155 :             di = 0;
17156 :           }
17157 :         }
17158 :         //^44C8:207D
17159 :         bp04 += cc;
17160 :         bp02 += oo;
17161 :         //^44C8:2089
17162 :       }
17163 :       //^44C8:2092
17164 :     }
17165 :     //^44C8:20A0
17166 :     return;
17167 :   }
17168 : 
17169 :   //^44C8:20A4
17170 :   void _44c8_20a4(U8 *xx, U8 *yy, U8 *zz, SRECT *prc, U16 ss, U16 tt, U16 oo, i16 pp, U8 *localpal)
17171 :   {
17172 :     //^44C8:20A4
17173 :     ENTER(0);
17174 :     //^44C8:20A7
17175 :     _44c8_1e43(xx, yy, zz, prc, ss, tt, 0, 0, prc->cx, oo, pp, localpal);
17176 :     //^44C8:20E3
17177 :     return;
17178 :   }
17179 : 
17180 :   //^32CB:0C7D
17181 :   void _32cb_0c7d(skxxx4 *ref, U16 xx, U16 yy)
17182 :   {
17183 :     //^32CB:0C7D
17184 :     ENTER(16);
17185 :     //^32CB:0C83
17186 :     if (_4976_5c5e == 0) {
17187 :       //^32CB:0C8A
17188 :       _44c8_1d26(reinterpret_cast<U8 *>(_3e74_5817(xx)), ref->b58[yy]);
17189 :       //^32CB:0CAA
17190 :       return;
17191 :     }
17192 :     //^32CB:0CAD
17193 :     U8 bp0b;
17194 :     U16 bp0a;
17195 :     _32cb_0aa6(&bp0b, &bp0a);
17196 :     //^32CB:0CBE
17197 :     i16 bp06;
17198 :     i16 bp08;
17199 :     QUERY_GDAT_IMAGE_METRICS(0x17, _4976_4218, bp0b, &bp06, &bp08);
17200 :     //^32CB:0CDA
17201 :     U16 di = _3e74_5888();
17202 :     //^32CB:0CE1
17203 :     _3e74_57b5(di, ref->rc36.cx, bp08, 4);
17204 :     //^32CB:0CF6
17205 :     U16 si = (ref->rc36.cx +1) & 0xfffe;
17206 :     //^32CB:0D03
17207 :     U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x17, _4976_4218, bp0b);
17208 :     //^32CB:0D1B
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 :     //^32CB:0D64
17212 :     bp04 = reinterpret_cast<U8 *>(_3e74_5817(di));
17213 :     //^32CB:0D71
17214 :     U8 *bp10 = _32cb_0649(0x17, _4976_4218, bp0b, 0);
17215 :     //^32CB:0D8A
17216 :     bp10[0] = ref->b58[yy];
17217 :     //^32CB:0D9A
17218 :     si = READ_I16(bp04,-4) * READ_I16(bp04,-2);
17219 :     //^32CB:0DA7
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 :     //^32CB:0DF8
17223 :     _3e74_58a3(di);
17224 :     //^32CB:0DFF
17225 :     return;
17226 :   }
17227 : 
17228 :   //^3E74:5163
17229 :   Bit8u *QUERY_GDAT_ENTRY_DATA_BUFF(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4)
17230 :   {
17231 :     //^3E74:5163
17232 :     Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, cls3, cls4);
17233 :     //^3E74:5181
17234 :     if (si == -1) {
17235 :       //^3E74:5186
17236 :       return NULL;
17237 :     }
17238 :     //^3E74:518C
17239 :     if (_4976_5c98[si].Absent()) {
17240 :       //^3E74:51A9
17241 :       if (IS_CLS1_CRITICAL_FOR_LOAD(cls1) == 0) {
17242 :         //^3E74:51C7
17243 :         //^3E74:5186
17244 :         return NULL;
17245 :       }
17246 :       //^3E74:51B6
17247 :       Bit16u bp02;
17248 :       return _3e74_15a9(si, &bp02, 0);
17249 :     }
17250 :     else {
17251 :       //^3E74:51C9
17252 :       return REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]);
17253 :     }
17254 :   }
17255 : 
17256 :   //^0CEE:26CF
17257 :   U8 QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(U16 actuatorData)
17258 :   {
17259 :     //^0CEE:26CF
17260 :     ENTER(0);
17261 :     //^0CEE:26D2
17262 :     return QUERY_CLS1_FROM_RECORD(GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(actuatorData));
17263 :   }
17264 : 
17265 :         ObjectID _0cee_1513(U16 xx); // TODO: Unreachable
17266 : 
17267 :   //^32CB:0EE5
17268 :   U16 IS_DISTINCTIVE_ITEM_ON_ACTUATOR(Actuator *ref, U16 disit, U16 onTile)
17269 :   {
17270 :     //^32CB:0EE5
17271 :     ENTER(2);
17272 :     //^32CB:0EEB
17273 :     for (ObjectID si = GET_TILE_RECORD_LINK(ref->Xcoord(), ref->Ycoord()); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
17274 :       //^32CB:0F0D
17275 :       U16 bp02 = si.DBType();
17276 :       //^32CB:0F18
17277 :       if (onTile != 0 && bp02 >= dbWeapon && bp02 <= dbMiscellaneous_item) {
17278 :         //^32CB:0F2A
17279 :         if (GET_DISTINCTIVE_ITEMTYPE(si) != disit)
17280 :           //^32CB:0F34
17281 :           continue;
17282 :         //^32CB:0F36
17283 :         return 1;
17284 :       }
17285 :       //^32CB:0F3B
17286 :       if (bp02 == dbCreature) {
17287 :         //^32CB:0F41
17288 :         for (ObjectID di = GET_ADDRESS_OF_RECORD4(si)->GetPossessionObject(); di != di.FFFE; di = GET_NEXT_RECORD_LINK(di)) {
17289 :           //^32CB:0F52
17290 :           if (GET_DISTINCTIVE_ITEMTYPE(di) == disit)
17291 :             //^32CB:0F5E
17292 :             //^32CB:0F36
17293 :             return 1;
17294 :           //^32CB:0F60
17295 :         }
17296 :       }
17297 :       //^32CB:0F6E
17298 :     }
17299 :     //^32CB:0F7C
17300 :     return 0;
17301 :   }
17302 : 
17303 :   //^32CB:0E03
17304 :   void _32cb_0e03(i16 xx, i16 yy, U8 *str)
17305 :   {
17306 :     //^32CB:0E03
17307 :     ENTER(24);
17308 :     //^32CB:0E07
17309 :     if (QUERY_MBCS_PRESENCE(str) == 0) {
17310 :       //^32CB:0E18
17311 :       for (U8 *bp04 = str; *bp04 != 0; bp04++) {
17312 :         //^32CB:0E26
17313 :         if (*bp04 >= 'A' && *bp04 <= 'Z') {
17314 :           //^32CB:0E35
17315 :           *bp04 = *bp04 -0x40;
17316 :         }
17317 :         //^32CB:0E42
17318 :         else if (*bp04 >= 0x7b) {
17319 :           //^32CB:0E4B
17320 :           *bp04 = *bp04 -0x60;
17321 :         }
17322 :         //^32CB:0E52
17323 :       }
17324 :     }
17325 :     //^32CB:0E5E
17326 :     i16 bp06;
17327 :     i16 bp08;
17328 :     if (_3929_03dc(str, &bp06, &bp08) != 0) {
17329 :       //^32CB:0E7A
17330 :       U8 bp18[16];
17331 :       COPY_MEMORY(_4976_4bda, bp18, 16);
17332 :       //^32CB:0E93
17333 :       _0b36_037e(bp18, U8(_4976_5a88), -1, -1, 16);
17334 :       //^32CB:0EAA
17335 :       DRAW_STRONG_TEXT(_4976_4c16, -1, _4976_00f6, xx -(bp06 >> 1), yy, bp18[15], bp18[0]|0x4000, str);
17336 :     }
17337 :     //^32CB:0EE3
17338 :     return;
17339 :   }
17340 : 
17341 :   //^48AE:05AE
17342 :   U16 _48ae_05ae(i16 xx, U8 yy, U16 zz, U16 ss, U16 tt, i16 ww)
17343 :   {
17344 :     //^48AE:05AE
17345 :     ENTER(10);
17346 :     //^48AE:05B4
17347 :     U8 bp03 = GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(xx);
17348 :     //^48AE:05C0
17349 :     U8 bp04 = QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(xx);
17350 :     //^48AE:05CC
17351 :     U16 si = QUERY_GDAT_ENTRY_DATA_INDEX(bp04, bp03, dtWordValue, 0x02);
17352 :     //^48AE:05E2
17353 :     U8 *bp08 = ALLOC_MEMORY(64, afDefault, 1024);
17354 :     //^48AE:05F9
17355 :     U16 bp0a = zz * 3 +18;
17356 :     //^48AE:0607
17357 :     U16 bp02 = QUERY_GDAT_CREATURE_WORD_VALUE(yy, U8(bp0a * 3 +0xa2));
17358 :     //^48AE:0620
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 :       //^48AE:0658
17365 :             si = si * bp02 / 100;
17366 :     }
17367 :     //^48AE:0666
17368 :     bp0a = zz * 3 +17;
17369 :     //^48AE:0674
17370 :     bp02 = QUERY_GDAT_CREATURE_WORD_VALUE(yy, zz *3 +0xa1);
17371 :     //^48AE:068D
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 :       //^48AE:06C5
17378 :       si = si * bp02 / 100;
17379 :     }
17380 :     //^48AE:06D3
17381 :     DEALLOC_UPPER_MEMORY(64);
17382 :     //^48AE:06DE
17383 :     if (ww < 0) {
17384 :       //^48AE:06E4
17385 :       ww = GET_MAX_CHARGE(ObjectID(0, GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(xx), 0));
17386 :     }
17387 :     //^48AE:06FA
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 :     //^48AE:0723
17395 :     if (tt != 0) {
17396 :       //^48AE:0729
17397 :       U16 di = QUERY_GDAT_CREATURE_WORD_VALUE(yy, U8(zz * 3) +0xa0);
17398 :       //^48AE:0741
17399 :       if (di == 0)
17400 :         //^48AE:0745
17401 :         di = 10;
17402 :       //^48AE:0748
17403 :       di = si * di / 100;
17404 :       //^48AE:0755
17405 :       if (ss != 0) {
17406 :         //^48AE:075B
17407 :         si += di;
17408 :       }
17409 :       else {
17410 :         //^48AE:075F
17411 :         si -= di;
17412 :       }
17413 :     }
17414 :     //^48AE:0761
17415 :     return si;
17416 :   }
17417 : 
17418 :   //^48AE:0767
17419 :   U16 _48ae_0767(i16 xx, i16 yy, U8 *zz, i16 *vv, i16 ww)
17420 :   {
17421 :     //^48AE:0767
17422 :     ENTER(0);
17423 :     //^48AE:076C
17424 :     i16 si = 0;
17425 :     //^48AE:076E
17426 :     i16 dx = _4976_4c76 -1;
17427 :     U16 cx = 0;
17428 :     //^48AE:0776
17429 :     *vv = 0;
17430 :     //^48AE:077E
17431 :     i16 di;
17432 :     while (si < yy && xx > 0 && dx >= 0 && (di = _4976_4c80[dx]) > 0) {
17433 :       //^48AE:0780
17434 :       if (xx >= di) {
17435 :         //^48AE:0785
17436 :         *zz = U8(dx);
17437 :         //^48AE:078D
17438 :         si++;
17439 :         //^48AE:078E
17440 :         xx -= di;
17441 :         //^48AE:0791
17442 :         cx += di;
17443 :         //^48AE:0793
17444 :         *vv++;
17445 :       }
17446 :       else {
17447 :         //^48AE:079B
17448 :         dx--;
17449 :       }
17450 :             //^48AE:079C
17451 :     }
17452 :     //^48AE:07B9
17453 :     return cx;
17454 :   }
17455 : 
17456 :   //^32CB:0F82
17457 :   void _32cb_0f82(Actuator *ref, U8 aa, i16 bb, i16 cc, U16 dd, U16 ee, U16 ff, U16 gg, U16 hh)
17458 :   {
17459 :     //^32CB:0F82
17460 :     ENTER(58);
17461 :     //^32CB:0F88
17462 :     Actuator *bp0c = NULL;
17463 :     //^32CB:0F92
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 :       //^32CB:0FB4
17467 :       if (bp26 == dbActuator) {
17468 :         //^32CB:0FBA
17469 :         bp0c = GET_ADDRESS_OF_RECORD3(di);
17470 :         //^32CB:0FC7
17471 :         if (bp0c->ActuatorType() == 0x30)
17472 :           //^32CB:0FD4
17473 :           break;
17474 :       }
17475 :       //^32CB:0FD6
17476 :     }
17477 :     //^32CB:0FF4
17478 :     i16 si = bp0c->ActuatorData();
17479 :     U16 bp24 = si;
17480 :     //^32CB:1006
17481 :     U8 bp11 = U8(ref->ActuatorData());
17482 :     //^32CB:1016
17483 :     if (ref->w4_0_0() == 0 || ref->OnceOnlyActuator() != 0) {
17484 :       //^32CB:1032
17485 :       U16 bp14 = (ref->Delay() * 3) +16;
17486 :       //^32CB:104A
17487 :       U8 *bp04 = ALLOC_MEMORY(64, afDefault, 1024);
17488 :       //^32CB:1061
17489 :       if (_48ae_0281(bp11, U8(bp14), bp04, 0) != 0) {
17490 :         //^32CB:107F
17491 :         U16 *bp10 = reinterpret_cast<U16 *>(QUERY_GDAT_ENTRY_DATA_BUFF(0x09, aa, dt08, 0x13));
17492 :         //^32CB:1097
17493 :         i16 bp28;
17494 :         if (bp10 != NULL) {
17495 :           //^32CB:109B
17496 :           bp28 = QUERY_GDAT_ENTRY_DATA_LENGTH(0x09, aa, dt08, 0x13) >> 1;
17497 :           //^32CB:10B2
17498 :           for (si = 0; si < bp28; si++) {
17499 :             //^32CB:10B6
17500 :             if ((bp10[si] & 511) == bp24)
17501 :               //^32CB:10C8
17502 :               break;
17503 :           }
17504 :         }
17505 :         do {
17506 :           //^32CB:10D0
17507 :           si += (ref->OnceOnlyActuator() != 0 || _4976_5a96 < 0) ? 1 : -1;
17508 :           //^32CB:10F2
17509 :           if (bp10 != NULL) {
17510 :             //^32CB:10FA
17511 :             if (si < 0) {
17512 :               //^32CB:10FE
17513 :               si = bp28 -1;
17514 :             }
17515 :             //^32CB:1106
17516 :             else if (si >= bp28) {
17517 :               //^32CB:110B
17518 :               si = 0;
17519 :             }
17520 :             //^32CB:110D
17521 :             bp24 = bp10[si] & 511;
17522 :           }
17523 :           else {
17524 :             //^32CB:111E
17525 :             si &= 511;
17526 :             bp24 = si;
17527 :           }
17528 :           //^32CB:1124
17529 :           //^32CB:1127
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 :         //^32CB:11A2
17540 :         ref->OnceOnlyActuator(0);
17541 :       }
17542 :       //^32CB:11AA
17543 :       ref->w4_0_0(1);
17544 :       //^32CB:11B2
17545 :       bp0c->w4_0_0(1);
17546 :       //^32CB:11BA
17547 :       bp0c->ActuatorData(bp24);
17548 :       //^32CB:11CD
17549 :       DEALLOC_UPPER_MEMORY(64);
17550 :     }
17551 :     //^32CB:11D8
17552 :     U16 bp18 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, aa, dtImageOffset, 0xfd);
17553 :     //^32CB:11EE
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 :     //^32CB:122E
17557 :     _32cb_0997();
17558 :     //^32CB:1232
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 :       //^32CB:1264
17564 :       U16 *bp10 = reinterpret_cast<U16 *>(QUERY_GDAT_ENTRY_DATA_BUFF(0x09, aa, dt08, 0x13));
17565 :       //^32CB:127C
17566 :       if (bp10 != NULL) {
17567 :         //^32CB:1280
17568 :         i16 bp28 = QUERY_GDAT_ENTRY_DATA_LENGTH(0x09, aa, dt08, 0x13) >> 1;
17569 :         //^32CB:1297
17570 :         for (si = 0; si < bp28; si++) {
17571 :           //^32CB:129B
17572 :           if ((bp10[si] & 511) == bp24)
17573 :             //^32CB:12AD
17574 :             break;
17575 :         }
17576 :         //^32CB:12B5
17577 :         ObjectID di;
17578 :         if ((bp10[si] & 0x8000) != 0 && (di = _0cee_1513(bp24)) != ObjectID::FFFF) {
17579 :           //^32CB:12D5
17580 :           APPEND_RECORD_TO(di, NULL, ref->Xcoord(), ref->Ycoord());
17581 :         }
17582 :       }
17583 :       else {
17584 :         //^32CB:12FD
17585 :         _32cb_08c1(0, dd, ee, i8(bp18 >> 8), i8(bp18), bb, ff, gg, hh, -1, 9, aa, 0x11);
17586 :         //^32CB:132F
17587 :         _32cb_0997();
17588 :       }
17589 :     }
17590 :     //^32CB:1333
17591 :     _32cb_08c1(0, dd, ee, 0, 0, bb, ff, gg, hh, -1, 9, aa, 0x0f);
17592 :     //^32CB:135C
17593 :     _32cb_0997();
17594 :     //^32CB:1360
17595 :     if (cc == 3) {
17596 :       //^32CB:1366
17597 :       i16 bp2a;
17598 :       i16 bp2c;
17599 :       QUERY_TOPLEFT_OF_RECT(ff, &bp2a, &bp2c);
17600 :       //^32CB:137B
17601 :       U16 bp18 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, aa, dtImageOffset, 0xf2);
17602 :       //^32CB:1391
17603 :       bp2a += i8(bp18 >> 8);
17604 :       bp2c += i8(bp18);
17605 :       //^32CB:139F
17606 :       _32cb_0e03(bp2a, bp2c, _2405_0029(QUERY_ITEMDB_FROM_DISTINCTIVE_ITEMTYPE(bp24), GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(bp24)));
17607 :     }
17608 :     //^32CB:13C9
17609 :     if (cc == 3) {
17610 :       //^32CB:13D2
17611 :       U16 bp22 = _48ae_05ae(bp24, bp11, ref->ShopItemPoolNo(), 1, 1, -1);
17612 :       //^32CB:13F8
17613 :       U16 bp20 = _48ae_05ae(bp24, bp11, ref->ShopItemPoolNo(), 0, 1, -1);
17614 :       //^32CB:141E
17615 :       for (i16 bp16 = 0; bp16 < 2; bp16++) {
17616 :         //^32CB:1426
17617 :         U16 bp18 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, aa, dtImageOffset, (bp16 != 0) ? 0xf0 : 0xf1);
17618 :         //^32CB:1446
17619 :         i16 bp2a = i8(bp18 >> 8);
17620 :         i16 bp2c = i8(bp18);
17621 :         //^32CB:1454
17622 :         U16 bp1a = (bp16 != 0) ? bp22 : bp20;
17623 :         //^32CB:1465
17624 :         if (bp1a <= 0)
17625 :           //^32CB:1469
17626 :           continue;
17627 :         //^32CB:146C
17628 :         U8 bp3a[16];
17629 :         i16 bp1e;
17630 :         _48ae_0767(bp1a, 6, bp3a, &bp1e, bp16);
17631 :         //^32CB:1486
17632 :         if (bp1e <= 0)
17633 :           //^32CB:148C
17634 :           continue;
17635 :         //^32CB:148F
17636 :         U16 bp1c = _3e74_5888();
17637 :         //^32CB:1497
17638 :         _3e74_57b5(bp1c, bp1e >> 3, 7, 4);
17639 :         //^32CB:14AD
17640 :         _32cb_08c1(0, 64, 64, 0, 0, bb, -1, gg, -1, -1, 0x09, aa, 0x10);
17641 :         //^32CB:14D2
17642 :         U8 *bp08 = reinterpret_cast<U8 *>(_3e74_5817(bp1c));
17643 :         //^32CB:14E1
17644 :         SRECT bp34;
17645 :         SET_ORIGIN_RECT(&bp34, 8, 7);
17646 :         //^32CB:14F2
17647 :         for (si = 0; si < bp1e; si++) {
17648 :           //^32CB:14F6
17649 :           DRAW_DIALOGUE_PICT(_4976_5940.pb0, bp08, &bp34, bp3a[si] << 3, 0, -1, NULL);
17650 :           //^32CB:1522
17651 :           bp34.x += 8;
17652 :           //^32CB:1526
17653 :         }
17654 :         //^32CB:152C
17655 :         DRAW_DIALOGUE_PICT(bp08, _4976_4c16, QUERY_BLIT_RECT(bp08, &bp34, ff|0x8000, &bp2a, &bp2c, gg), 
17656 :           0, 0, hh, _4976_597a);
17657 :         //^32CB:157F
17658 :       }
17659 :     }
17660 :     //^32CB:158B
17661 :     return;
17662 :   }
17663 : 
17664 :       void _32cb_3f0d(U16 xx); // TODO: Unreachable
17665 : 
17666 :   //^32CB:15B8
17667 :   i16 _32cb_15b8(i16 xx, i16 yy, i16 zz)
17668 :   {
17669 :     //^32CB:15B8
17670 :     ENTER(854);
17671 :     //^32CB:15BE
17672 :     i16 bp14 = (yy <= -1)
17673 :       ? 4
17674 :       : ((yy >= 1)
17675 :         ? 6
17676 :         : 5
17677 :       );
17678 :     //^32CB:15DD
17679 :     bp14 = _4976_5a80[xx].x2.w[bp14];
17680 :     //^32CB:15F9
17681 :     i16 bp28 = bp14 >> 8;
17682 :     //^32CB:15FF
17683 :     i16 di = _4976_412d[xx];
17684 :     //^32CB:1609
17685 :     U8 bp1f = U8(bp14) & 0xff;
17686 :     //^32CB:1611
17687 :     if (bp1f == 0xff)
17688 :       //^32CB:1617
17689 :       return -1;
17690 :     //^32CB:161D
17691 :     U16 bp2a = (bp1f == 0) ? 1 : 0;
17692 :     //^32CB:162D
17693 :     U16 bp22 = IS_WALL_ORNATE_ALCOVE(bp1f);
17694 :     //^32CB:163A
17695 :     U16 bp24;
17696 :     if (bp2a == 0) {
17697 :       //^32CB:1640
17698 :       bp24 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x07);
17699 :     }
17700 :     //^32CB:1655
17701 :     U16 bp0e = 0;
17702 :     //^32CB:165A
17703 :     U16 si;
17704 :     if (bp2a != 0 || (si = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x04)) == 0)
17705 :       //^32CB:1678
17706 :       si = _4976_4216;
17707 :     //^32CB:167C
17708 :     U16 bp1a;
17709 :     U16 bp1e;
17710 :     if (bp2a != 0 || (bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x05)) == 0) {
17711 :       //^32CB:169B
17712 :       bp1a = 12;
17713 :       bp1e = 0;
17714 :     }
17715 :     else {
17716 :       //^32CB:16A7
17717 :       bp1e = bp1a >> 8;
17718 :       bp1a = (bp1a & 255) -1;
17719 :     }
17720 :     //^32CB:16BA
17721 :     U16 bp1c = _098d_0cd7(xx, bp1a, (yy != 0) ? 1 : 0);
17722 :     //^32CB:16D9
17723 :     U16 bp18;
17724 :     U16 bp16;
17725 :     bp18 = bp16 = _4976_4189[di];
17726 :     //^32CB:16E5
17727 :     if (bp22 == 3 && yy == 0) {
17728 :       //^32CB:16F7
17729 :       U16 bp34 = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtImageOffset, 0xfd);
17730 :       //^32CB:170D
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 :       //^32CB:174C
17733 :       if (zz == 0)
17734 :         //^32CB:1752
17735 :         _4976_5940.w48 = -2;
17736 :       //^32CB:1758
17737 :       _32cb_0997();
17738 :       //^32CB:175C
17739 :       if (zz == 0)
17740 :         //^32CB:1762
17741 :         //^32CB:1F38
17742 :         return si;
17743 :       //^32CB:1765
17744 :       if (di == 1) {
17745 :         //^32CB:176A
17746 :         _32cb_0a4c(&_4976_5940.rc36, 6, U8(xx));
17747 :       }
17748 :     }
17749 :     //^32CB:177A
17750 :     if (di == 2 && (yy <= -2 || yy >= 2))
17751 :       //^32CB:178B
17752 :       bp16 = 0x72;
17753 :     //^32CB:1792
17754 :     else if (di == 3 && (yy <= -2 || yy >= 2))
17755 :       //^32CB:17A3
17756 :       bp16 = 0x4c;
17757 :     //^32CB:17A8
17758 :     if (bp2a != 0) {
17759 :       //^32CB:17B1
17760 :       U8 bp20;
17761 :       if (yy != 0 && yy > -1) {
17762 :         //^32CB:17C9
17763 :         if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x08, _4976_4218, dtImage, 0xfe) != 0) {
17764 :           //^32CB:17E0
17765 :           bp20 = 0xfe;
17766 :         }
17767 :         else {
17768 :           //^32CB:17E6
17769 :           bp20 = 0xfd;
17770 :           bp0e = 1;
17771 :         }
17772 :       }
17773 :       //^32CB:17EF
17774 :       _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, si, -1, 8, _4976_4218, bp20);
17775 :       //^32CB:1817
17776 :       if (zz == 0)
17777 :         //^32CB:181D
17778 :         _4976_5940.w48 = -2;
17779 :       //^32CB:1823
17780 :       _32cb_0997();
17781 :       //^32CB:1827
17782 :       if (yy != 0)
17783 :         //^32CB:182D
17784 :         //^32CB:1F38
17785 :         return si;
17786 :       //^32CB:1830
17787 :       ObjectID bp32 = _4976_5a80[xx].x2.w14();
17788 :       //^32CB:1845
17789 :       if (bp32 == bp32.FFFF)
17790 :         //^32CB:184A
17791 :         //^32CB:1F38
17792 :         return si;
17793 :       //^32CB:184D
17794 :       skxxx4 bp01d6;
17795 :       _0b36_0520(&bp01d6, 0x08, _4976_4218, bp20);
17796 :       //^32CB:1865
17797 :       i16 bp2c = bp01d6.w28;
17798 :       i16 bp2e = bp01d6.w30;
17799 :       //^32CB:1873
17800 :       i16 bp48;
17801 :       i16 bp4a;
17802 :       QUERY_GDAT_IMAGE_METRICS(8, _4976_4218, bp20, &bp48, &bp4a);
17803 :       //^32CB:188F
17804 :       U16 bp26 = _3e74_5888();
17805 :       //^32CB:1897
17806 :       U8 bp009c[80];
17807 :       _0cee_159b(bp009c, bp32, 2);
17808 :       //^32CB:18AA
17809 :       U16 bp36 = 0;
17810 :       U16 bp38 = 1;
17811 :       //^32CB:18B4
17812 :       U8 bp45;
17813 :       while ((bp45 = bp009c[bp36++]) != 0) {
17814 :         //^32CB:18B6
17815 :         if (bp45 == vbLf)
17816 :           //^32CB:18BC
17817 :           bp38++;
17818 :       }
17819 :       //^32CB:18D5
17820 :       U16 bp4c = QUERY_MBCS_PRESENCE(bp009c);
17821 :       //^32CB:18E5
17822 :       U16 bp3a;
17823 :       U16 bp3c;
17824 :       if (bp4c != 0) {
17825 :         //^32CB:18E9
17826 :         bp3a = _4976_012e;
17827 :         bp3c = _4976_0130 +2;
17828 :         si = 0;
17829 :       }
17830 :       else {
17831 :         //^32CB:18FB
17832 :         bp3a = _4976_012a;
17833 :         bp3c = _4976_012c +2;
17834 :       }
17835 :       //^32CB:1909
17836 :       U8 *bp08 = _3e74_57b5(bp26, bp28, bp4a, 4);
17837 :       //^32CB:1922
17838 :       _44c8_1d26(bp08, si);
17839 :       //^32CB:1931
17840 :       SRECT rc44;
17841 :       rc44.y = (bp4a >> 1) - (bp3c * bp38 >> 1);
17842 :       //^32CB:1945
17843 :       if (bp4c != 0) {
17844 :         //^32CB:194E
17845 :         for (U16 bp36 = 0; bp009c[bp36] != 0; ) {
17846 :           //^32CB:1956
17847 :           if (bp4a - (_4976_0130 + _4976_0136 +1) <= rc44.y)
17848 :             //^32CB:1968
17849 :             break;
17850 :           //^32CB:196B
17851 :           U8 bp0356[384];
17852 :           i16 bp30 = _3929_04e2(bp009c, bp0356, &bp36, bp48 -1);
17853 :           //^32CB:198C
17854 :           if (bp30 != 0) {
17855 :             //^32CB:1995
17856 :             rc44.x = (bp48 >> 1) - (bp30 >> 1);
17857 :             //^32CB:19A4
17858 :             if (rc44.y >= 0 && rc44.x >= 0 && bp30 <= bp48) {
17859 :               //^32CB:19C1
17860 :               DRAW_STRING(bp08, bp26, bp48, rc44.x   , rc44.y + _4976_0130 +1, 1, 0x4000, bp0356, 4);
17861 :               //^32CB:19EE
17862 :               DRAW_STRING(bp08, bp26, bp48, rc44.x +1, rc44.y + _4976_0130 +1, 1, 0x4000, bp0356, 4);
17863 :               //^32CB:1A1D
17864 :               DRAW_STRING(bp08, bp26, bp48, rc44.x   , rc44.y + _4976_0130   , 2, 0x4000, bp0356, 4);
17865 :             }
17866 :           }
17867 :           //^32CB:1A49
17868 :           if (bp009c[bp36] == vbLf)
17869 :             //^32CB:1A58
17870 :             bp36++;
17871 :           //^32CB:1A5B
17872 :           rc44.y += bp3c;
17873 :           //^32CB:1A61
17874 :         }
17875 :       }
17876 :       else {
17877 :         //^_1a76
17878 :         U8 *bp0c = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x08, _4976_4218, 0x03);
17879 :         //^32CB:1A8C
17880 :         rc44.cx = bp3c;
17881 :         //^32CB:1A92
17882 :         rc44.cy = READ_I16(bp0c,-2);
17883 :         //^32CB:1A9C
17884 :         U8 *bp08 = reinterpret_cast<U8 *>(_3e74_5817(bp26));
17885 :         //^32CB:1AAB
17886 :         U8 *bp04 = bp009c;
17887 : 
17888 :         do {
17889 :           //^32CB:1AB5
17890 :           U16 bp36 = 0;
17891 :           //^32CB:1ABA
17892 :           while (bp04[bp36] != 0 && bp04[bp36] != vbLf)
17893 :             //^32CB:1ABC
17894 :             bp36++;
17895 :           //^32CB:1AD7
17896 :           i16 bp30 = bp3a * bp36;
17897 :           //^32CB:1AE0
17898 :           if (bp36 != 0) {
17899 :             //^32CB:1AE6
17900 :             rc44.x = (bp48 >> 1) - (bp30 >> 1);
17901 :             //^32CB:1AF5
17902 :             if (rc44.x < 0) {
17903 :               //^32CB:1AFB
17904 :               bp04 += bp36;
17905 :             }
17906 :             else {
17907 :               //^32CB:1AF9
17908 :               while (bp36-- != 0) {
17909 :                 //^32CB:1B03
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 :                 //^32CB:1B46
17920 :                 rc44.x += bp3a;
17921 :                 //^32CB:1B49
17922 :               }
17923 :             }
17924 :           }
17925 :           //^32CB:1B56
17926 :           rc44.y += bp3c;
17927 :           //^32CB:1B5C
17928 :         } while (*(bp04++) != 0);
17929 :       }
17930 :       //^32CB:1B6B
17931 :       _0b36_0520(&bp01d6, 0xff, 0x00, 0x00);
17932 :       //^32CB:1B80
17933 :       bp01d6.w12 = bp26;
17934 :       bp01d6.w6 = 0xffff;
17935 :       bp01d6.w52 = bp16;
17936 :       bp01d6.w54 = bp18;
17937 :       //^32CB:1B9B
17938 :       if (bp4c != 0) {
17939 :         //^32CB:1BA1
17940 :         bp01d6.b58[1] = _4976_4bda[0];
17941 :         bp01d6.b58[2] = _4976_4bda[5];
17942 :       }
17943 :       else {
17944 :         //^32CB:1BB6
17945 :         COPY_MEMORY(
17946 :           QUERY_GDAT_IMAGE_LOCALPAL(0x08, _4976_4218, 3),
17947 :           bp01d6.b58,
17948 :           16
17949 :           );
17950 :       }
17951 :       //^32CB:1BDA
17952 :       bp01d6.w56 = 16;
17953 :       //^32CB:1BE1
17954 :       _32cb_0804(bp01d6.b58, U8(di), si, -1, bp01d6.w56);
17955 :       //^32CB:1BF3
17956 :       bp01d6.pb44 = _4976_4c16;
17957 :       //^32CB:1C02
17958 :       bp01d6.w24 = bp1c;
17959 :       bp01d6.w26 = bp1e;
17960 :       bp01d6.w28 = bp2c;
17961 :       bp01d6.w30 = bp2e;
17962 :       bp01d6.w48 = si;
17963 :       //^32CB:1C22
17964 :       _0b36_0a3f(_0b36_06d3(&bp01d6));
17965 :       //^32CB:1C38
17966 :       _3e74_58a3(bp26);
17967 :       //^32CB:1C41
17968 :       //^32CB:1F38
17969 :       return si;
17970 :     }
17971 :     //^32CB:1C44
17972 :     U8 bp20;
17973 :     if (yy == 0) {
17974 :       //^32CB:1C4A
17975 :       bp20 = 1;
17976 :       //^32CB:1C4E
17977 :       if (bp24 == 0) {
17978 :         //^32CB:1C54
17979 :         if ((_4976_412d[xx] & 1) != 0) {
17980 :           //^32CB:1C5E
17981 :           bp0e = _4976_5a92;
17982 :         }
17983 :         else {
17984 :           //^32CB:1C66
17985 :           bp0e = _4976_5a92 ^ 1;
17986 :         }
17987 :       }
17988 :     }
17989 :     else {
17990 :       //^32CB:1C71
17991 :       bp20 = 0;
17992 :       //^32CB:1C75
17993 :       if (yy >= 1) {
17994 :         //^32CB:1C7B
17995 :         if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x09, bp1f, dtImage, U8(bp28) +2) != 0) {
17996 :           //^32CB:1C95
17997 :           bp20 = 2;
17998 :         }
17999 :         else {
18000 :           //^32CB:1C9B
18001 :           bp0e = 1;
18002 :         }
18003 :       }
18004 :     }
18005 :     //^32CB:1CA0
18006 :     bp20 = bp20 +U8(bp28);
18007 :     //^32CB:1CA9
18008 :     SRECT *bp12;
18009 :     if (yy == 0 && QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp1f, dtWordValue, 0x63) != 0) {
18010 :       //^32CB:1CCB
18011 :       _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, -3, -3, 9, bp1f, bp20);
18012 :       //^32CB:1CF4
18013 :       _32cb_08c1(bp0e, bp16, bp18, _4976_595c, _4976_595e, di, bp1c, bp1e, si, -1, 9, bp1f, 200);
18014 :       //^32CB:1D1F
18015 :       if (zz == 0)
18016 :         //^32CB:1D25
18017 :         _4976_5940.w48 = -1;
18018 :       //^32CB:1D2B
18019 :       _32cb_0997();
18020 :       //^32CB:1D2F
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 :       //^32CB:1D67
18027 :       _32cb_0c7d(&bp0310, bp26, si);
18028 :       //^32CB:1D78
18029 :       bp0310.pb44 = reinterpret_cast<U8 *>(_3e74_5817(bp26));
18030 :       //^32CB:1D89
18031 :       _0b36_0a3f(&bp0310);
18032 :       //^32CB:1D96
18033 :       _0b36_01cd(&bp0310);
18034 :       //^32CB:1DA3
18035 :       bp0310.w48 = bp0310.b58[si];
18036 :       bp0310.pb44 = _4976_4c16;
18037 :       bp0310.w24 = bp1c;
18038 :       bp0310.w26 = bp1e;
18039 :       bp0310.w56 = 0;
18040 :       //^32CB:1DD0
18041 :       _0b36_00c3(bp26, &bp0310);
18042 :       //^32CB:1DE1
18043 :       _0b36_0a3f(&bp0310);
18044 :       //^32CB:1DEE
18045 :       SRECT *bp12 = &bp0310.rc36;
18046 :       //^32CB:1DF8
18047 :       _3e74_58a3(bp26);
18048 :     }
18049 :     else {
18050 :       //^32CB:1E03
18051 :       _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, si, -1, 9, bp1f, bp20);
18052 :       //^32CB:1E2B
18053 :       if (zz == 0)
18054 :         //^32CB:1E31
18055 :         _4976_5940.w48 = -2;
18056 :       //^32CB:1E37
18057 :       _32cb_0997();
18058 :       //^32CB:1E3B
18059 :       bp12 = &_4976_5940.rc36;
18060 :       //^32CB:1E43
18061 :       if (zz == 0)
18062 :         //^32CB:1E49
18063 :         //^32CB:1F38
18064 :         return si;
18065 :     }
18066 :     //^32CB:1E4C
18067 :     if (bp22 != 3 && (xx == 1 || xx == 2 || xx == 3)) {
18068 :       //^32CB:1E64
18069 :       _32cb_0a4c(bp12, 6, U8(xx));
18070 :     }
18071 :     //^32CB:1E76
18072 :     if (bp22 == 0 || yy != 0)
18073 :       //^32CB:1E85
18074 :       //^32CB:1F38
18075 :       return si;
18076 :     //^32CB:1E88
18077 :     COPY_MEMORY(&_4976_5940, &_4976_5aa8, 314);
18078 :     //^32CB:1E9D
18079 :     if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x09, bp1f, dtImage, 0x0f) != 0) {
18080 :       //^32CB:1EB3
18081 :       if (bp22 == 2) {
18082 :         //^32CB:1EB9
18083 :         _32cb_0f82(
18084 :           GET_ADDRESS_OF_RECORD3(_4976_5a80[xx].x2.w14()), 
18085 :           bp1f, di, xx, bp16, bp18, bp1c, bp1e, si
18086 :           );
18087 :         //^32CB:1EEF
18088 :         //^32CB:1F38
18089 :         return si;
18090 :       }
18091 :       //^32CB:1EF1
18092 :       _32cb_08c1(bp0e, bp16, bp18, 0, 0, di, bp1c, bp1e, si, -1, 9, bp1f, 15);
18093 :       //^32CB:1F17
18094 :       if (zz == 0)
18095 :         //^32CB:1F1D
18096 :         _4976_5940.w48 = -2;
18097 :       //^32CB:1F23
18098 :       _32cb_0997();
18099 :       //^32CB:1F27
18100 :       //^32CB:1F38
18101 :       return si;
18102 :     }
18103 :     //^32CB:1F29
18104 :     if (bp22 == 1)
18105 :       _32cb_3f0d(xx);
18106 :     //^32CB:1F38
18107 :     return si;
18108 :   }
18109 : 
18110 :   //^0B36:1446
18111 :   i16 _0b36_1446(skxxx5 *ref, i16 xx, i16 yy, U16 colorkey)
18112 :   {
18113 :     //^0B36:1446
18114 :     ENTER(20);
18115 :     //^0B36:144C
18116 :     U8 *bp04 = QUERY_PICT_BITS(ref);
18117 :     //^0B36:145E
18118 :     if (bp04 == NULL)
18119 :       //^0B36:1466
18120 :       return -1;
18121 :     //^0B36:146C
18122 :     U16 si = ref->w22;
18123 :     //^0B36:1473
18124 :     U16 bp0e = _3e74_5888();
18125 :     //^0B36:147B
18126 :     _3e74_57b5(bp0e, (si == 4) ? 2 : 1, 1, si);
18127 :     //^0B36:1497
18128 :     U16 bp10 = _3e74_5888();
18129 :     //^0B36:149F
18130 :     U8 *bp0c = _3e74_57b5(bp10, (si == 4) ? 2 : 1, 1, si);
18131 :     //^0B36:14C1
18132 :     U8 *bp08 = reinterpret_cast<U8 *>(_3e74_5817(bp0e));
18133 :     //^0B36:14D0
18134 :     _44c8_1d26(bp08, colorkey);
18135 :     //^0B36:14E1
18136 :     _44c8_1d26(bp0c, colorkey);
18137 :     //^0B36:14F2
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 :     //^0B36:1547
18141 :     U16 bp14 = 1;
18142 :     //^0B36:154C
18143 :     U16 bp12 = CALC_IMAGE_BYTE_LENGTH(bp08);
18144 :     //^0B36:155B
18145 :     for (U16 di = 0; di < bp12; di++) {
18146 :       //^0B36:155F
18147 :       if (*(bp08++) != *(bp0c++)) {
18148 :         //^0B36:1573
18149 :         bp14 = 0;
18150 :         //^0B36:1578
18151 :         break;
18152 :       }
18153 :       //^0B36:157A
18154 :     }
18155 :     //^0B36:1580
18156 :     _3e74_58a3(bp0e);
18157 :     //^0B36:1589
18158 :     _3e74_58a3(bp10);
18159 :     //^0B36:1592
18160 :     return bp14;
18161 :   }
18162 : 
18163 :   //^32CB:00F1
18164 :   U16 _32cb_00f1(U16 xx, U16 yy, i16 zz)
18165 :   {
18166 :     //^32CB:00F1
18167 :     ENTER(10);
18168 :     //^32CB:00F7
18169 :     U16 si = xx;
18170 :     U16 di = yy;
18171 :     //^32CB:00FD
18172 :     if (PT_IN_RECT(&_4976_5940.rc36, si, di) == 0) {
18173 :       //^32CB:010F
18174 :       return 0;
18175 :     }
18176 :     //^32CB:0114
18177 :     if ((_4976_5940.w50 & 1) != 0) {
18178 :       //^32CB:011C
18179 :       si = _4976_5940.rc36.x + _4976_5940.rc36.cx -1 -si + _4976_5940.w32;
18180 :     }
18181 :     else {
18182 :       //^32CB:0128
18183 :       si = si - _4976_5940.rc36.x + _4976_5940.w32;
18184 :     }
18185 :     //^32CB:0134
18186 :     di = di - _4976_5940.rc36.y + _4976_5940.w34;
18187 :     //^32CB:0140
18188 :     U8 *bp0a = QUERY_PICT_BITS(&_4976_5940);
18189 :     //^32CB:0151
18190 :     U16 bp04 = READ_I16(bp0a,-4) >> 1;
18191 :     //^32CB:015D
18192 :     _4976_5a94 = ((si - _4976_5940.w14 -bp04) * 100) / bp04;
18193 :     //^32CB:0172
18194 :     U16 bp06 = READ_I16(bp0a,-2) >> 1;
18195 :     //^32CB:017B
18196 :     _4976_5a96 = ((di -bp06) * 100) / bp06;
18197 :     //^32CB:018C
18198 :     i16 bp02 = _0b36_1446(&_4976_5940, si, di, zz);
18199 :     //^32CB:01A0
18200 :     if (bp02 == -1 || bp02 == 1)
18201 :       //^32CB:01AC
18202 :       //^32CB:010F
18203 :       return 0;
18204 :     //^32CB:01AF
18205 :     return 1;
18206 :   }
18207 : 
18208 :   //^32CB:0287
18209 :   U16 _32cb_0287(U16 xx, U16 yy, U16 zz)
18210 :   {
18211 :     //^32CB:0287
18212 :     ENTER(10);
18213 :     //^32CB:028D
18214 :     i16 si = xx;
18215 :     //^32CB:0290
18216 :     U16 di = 0;
18217 :     //^32CB:0292
18218 :     if (si > 3)
18219 :       //^32CB:0297
18220 :       return 0;
18221 :     //^32CB:029C
18222 :     sk5a80 *bp0a = _4976_5a80;
18223 :     //^32CB:02A9
18224 :     _4976_5a80 = reinterpret_cast<sk5a80 *>(ALLOC_MEMORY(72, afDefault, 1024));
18225 :     //^32CB:02C1
18226 :     i16 bp04 = _4976_5a9c;
18227 :     i16 bp06 = _4976_5a9e;
18228 :     //^32CB:02CD
18229 :     _0cee_02dd(_4976_5aa0, _4976_40e8[si][1], _4976_40e8[si][0], &bp04, &bp06);
18230 :     //^32CB:02F7
18231 :     _4976_5a80[si].b0 = U8(bp04);
18232 :     //^32CB:030A
18233 :     _4976_5a80[si].b1 = U8(bp06);
18234 :     //^32CB:031E
18235 :     _0cee_1dbe(&_4976_5a80[si].x2, _4976_5aa0, bp04, bp06);
18236 :     //^32CB:0344
18237 :     i16 bp02 = _32cb_15b8(si, _4976_4116[si], 0);
18238 :     //^32CB:0358
18239 :     if (bp02 >= 0) {
18240 :       //^32CB:035C
18241 :       di = _32cb_00f1(yy, zz, bp02);
18242 :     }
18243 :     //^32CB:036E
18244 :     DEALLOC_UPPER_MEMORY(72);
18245 :     //^32CB:0379
18246 :     _4976_5a80 = bp0a;
18247 :     //^32CB:0386
18248 :     return (si == 3 || _4976_5940.w18 < 32 || _4976_5940.w20 < 32) ? 1 : di;
18249 :   }
18250 : 
18251 :   //^121E:0003
18252 :   void _121e_0003(U16 xx)
18253 :   {
18254 :     //^121E:0003
18255 :     ENTER(2);
18256 :     //^121E:0009
18257 :     U16 bp02 = 1;
18258 :     //^121E:000E
18259 :     i16 di = _4976_4bfa;
18260 :     i16 si = _4976_4c06;
18261 :     //^121E:0016
18262 :     switch (xx) {
18263 :       case 1:
18264 :         //^121E:002A
18265 :         di += _4976_0232[(_4976_4bf6 +3) & 3];
18266 :         si += _4976_023a[(_4976_4bf6 +3) & 3];
18267 :         //^121E:004C
18268 :         break;
18269 : 
18270 :       case 3:
18271 :         //^121E:004E
18272 :         di += _4976_0232[_4976_4bf6];
18273 :         si += _4976_023a[_4976_4bf6];
18274 :         //^121E:0062
18275 :         bp02 = 2;
18276 :         //^121E:0067
18277 :         break;
18278 : 
18279 :       case 2:
18280 :         //^121E:0069
18281 :         di += _4976_0232[(_4976_4bf6 +1) & 3];
18282 :         si += _4976_023a[(_4976_4bf6 +1) & 3];
18283 :         //^121E:0087
18284 :         bp02 = 3;
18285 : 
18286 :         break;
18287 :     }
18288 :     //^121E:008C
18289 :     if (di >= 0 && di < _4976_4dd2 && si >= 0 && si < _4976_4dd4) {
18290 :       //^121E:00A0
18291 :       MOVE_RECORD_AT_WALL(di, si, (_4976_4bf6 +bp02) & 3, ObjectID::FFFF, _4976_57c8.w0);
18292 :     }
18293 :     //^121E:00BA
18294 :     return;
18295 :   }
18296 : 
18297 :   //^32CB:35C1
18298 :   U16 _32cb_35c1(i16 *xx, i16 *yy, i16 zz, i16 ww)
18299 :   {
18300 :     //^32CB:35C1
18301 :     ENTER(2);
18302 :     //^32CB:35C7
18303 :     U16 cx = zz;
18304 :     i16 di = *xx;
18305 :     i16 si = *yy;
18306 :     //^32CB:35D6
18307 :     if (ww != 0) {
18308 :       //^32CB:35DC
18309 :       if ((si -= ww * 5) < 0) {
18310 :         //^32CB:35E8
18311 :         si += 20;
18312 :         //^32CB:35EB
18313 :         //^32CB:3607
18314 :         di = _4976_408c[di][2];
18315 :       }
18316 :       //^32CB:35F6
18317 :       else if (si > 24) {
18318 :         //^32CB:35FB
18319 :         si -= 20;
18320 :         //^32CB:35FE
18321 :         di = _4976_408c[di][3];
18322 :       }
18323 :       //^32CB:360A
18324 :       if (di < 0)
18325 :         //^32CB:360E
18326 :         return 0;
18327 :     }
18328 :     //^32CB:3612
18329 :     if (cx != 0) {
18330 :       //^32CB:3616
18331 :       i16 bp02 = (si % 5) + cx;
18332 :       //^32CB:3623
18333 :       if (bp02 > 4) {
18334 :         //^32CB:362A
18335 :         si += cx -4;
18336 :         //^32CB:3631
18337 :         di = _4976_408c[di][1];
18338 :       }
18339 :       //^32CB:363F
18340 :       else if (bp02 < 0) {
18341 :         //^32CB:3645
18342 :         si += cx +4;
18343 :         //^32CB:364C
18344 :         di = _4976_408c[di][0];
18345 :       }
18346 :       else {
18347 :         //^32CB:3657
18348 :         si += cx;
18349 :       }
18350 :       //^32CB:3659
18351 :       if (di < 0)
18352 :         //^32CB:365D
18353 :         //^32CB:360E
18354 :         return 0;
18355 :     }
18356 :     //^32CB:365F
18357 :     *xx = di;
18358 :     *yy = si;
18359 :     //^32CB:366B
18360 :     return 1;
18361 :   }
18362 : 
18363 :   //^098D:0C50
18364 :   i16 _098d_0c50(i16 _5x5, U16 dir)
18365 :   {
18366 :     //^098D:0C50
18367 :     ENTER(0);
18368 :     //^098D:0C55
18369 :     i16 di = (_5x5 % 5) -2;
18370 :     //^098D:0C63
18371 :     i16 si = (_5x5 / 5) -2;
18372 :     //^098D:0C6E
18373 :     i16 cx;
18374 :     switch (dir) {
18375 :       case 2:
18376 :         //^098D:0C82
18377 :         di = -di;
18378 :         //^098D:0C88
18379 :         //^098D:0C9E
18380 :         si = -si;
18381 : 
18382 :         break;
18383 : 
18384 :       case 3:
18385 :         //^098D:0C8C
18386 :         cx = di;
18387 :         //^098D:0C8E
18388 :         di = -si;
18389 :         //^098D:0C94
18390 :         si = cx;
18391 :         //^098D:0C96
18392 :         break;
18393 : 
18394 :       case 1:
18395 :         //^098D:0C98
18396 :         cx = di;
18397 :         //^098D:0C9A
18398 :         di = si;
18399 :         //^098D:0C9C
18400 :         //^098D:0C9E
18401 :         si = -cx;
18402 : 
18403 :     }
18404 :     //^098D:0CA2
18405 :     return di +((si +2) * 5) +2;
18406 :   }
18407 : 
18408 :   //^48AE:07FD
18409 :   i16 _48ae_07fd(ObjectID rl, U16 xx)
18410 :   {
18411 :     //^48AE:07FD
18412 :     ENTER(4);
18413 :     //^48AE:0803
18414 :     ObjectID di = rl;
18415 :     //^48AE:0806
18416 :     U16 si = 12;
18417 :     //^48AE:0809
18418 :     switch (di.DBType()) {
18419 :       case dbCreature:
18420 :         {
18421 :           //^48AE:0821
18422 :           Creature *bp04 = GET_ADDRESS_OF_RECORD4(di);
18423 :           //^48AE:082E
18424 :           return _32cb_0054(bp04, (xx -bp04->b15_0_2()) & 3);
18425 :         }
18426 :       case dbCloud:
18427 :         {
18428 :           //^48AE:0852
18429 :           if (GET_ADDRESS_OF_RECORDF(di)->b2_7_7() != 0)
18430 :             //^48AE:0869
18431 :             break;
18432 :           //^48AE:086B
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 :           //^48AE:086B
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 :     //^48AE:0878
18459 :     return _098d_0c50(si, xx);
18460 :   }
18461 : 
18462 :   //^098D:0CB7
18463 :   i16 _098d_0cb7(U16 xx, i16 _5x5, U16 dir)
18464 :   {
18465 :     //^098D:0CB7
18466 :     ENTER(0);
18467 :     //^098D:0CBA
18468 :     return _098d_0c50(_5x5, dir) +(xx * 25) +5000;
18469 :   }
18470 : 
18471 :   //^32CB:3672
18472 :   void _32cb_3672(ObjectID rl, i16 xx, U16 yy, U16 zz, i16 vv, Creature *ref, U16 ww, U16 ss, U16 tt)
18473 :   {
18474 :     //^32CB:3672
18475 :     ENTER(34);
18476 :     //^32CB:3678
18477 :     U16 si = zz;
18478 :     //^32CB:367B
18479 :     i16 bp18;
18480 :     if (ref != NULL) {
18481 :       //^32CB:3686
18482 :       sk03a2 *bp04 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(ref->CreatureType());
18483 :       //^32CB:369A
18484 :       U16 bp22 = bp04->w30;
18485 :       //^32CB:36A4
18486 :       U16 di = ((bp22 & 15) > 1) ? 0 : 1;
18487 :       //^32CB:36B5
18488 :       i16 bp20 = QUERY_GDAT_CREATURE_WORD_VALUE(ref->CreatureType(), 0x41);
18489 :       //^32CB:36C9
18490 :       if (bp20 == 0) {
18491 :         //^32CB:36CF
18492 :         bp20 = _4976_4398[di];
18493 :       }
18494 :       //^32CB:36D7
18495 :       si -= bp20;
18496 :       //^32CB:36DA
18497 :       U16 bp1e = (rl.Dir() - _4976_5aa0) & 3;
18498 :       //^32CB:36EA
18499 :       bp18 = (xx == 3 && _4976_5aa2 != 0) ? _4976_41d0[_4976_0c5c] : 12;
18500 :       //^32CB:370A
18501 :       if (_32cb_35c1(&xx, &bp18, _4976_4388[di][bp1e], _4976_4388[2 +di][bp1e]) == 0)
18502 :         //^32CB:373B
18503 :         return;
18504 :     }
18505 :     //^32CB:373E
18506 :     else if (tt == 0) {
18507 :       //^32CB:3744
18508 :       bp18 = _48ae_07fd(rl, _4976_5aa0);
18509 :     }
18510 :     //^32CB:3755
18511 :     i16 bp12 = _4976_412d[xx];
18512 :     //^32CB:3760
18513 :     U16 bp0a;
18514 :     U16 bp06;
18515 :     U16 bp1a;
18516 :     if (tt != 0) {
18517 :       //^32CB:3766
18518 :       bp0a = 0;
18519 :       //^32CB:376B
18520 :       bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(_4976_5aa8.b8, _4976_5aa8.b9, dtImageOffset, 0xfd);
18521 :       //^32CB:3783
18522 :       yy = _4976_5aa8.w28 + i8(bp1a >> 8) + _4976_41de[_4976_41b0[vv][0]];
18523 :       //^32CB:37A4
18524 :       si = _4976_41de[_4976_41b0[vv][1]] + (i8(bp1a) + _4976_5aa8.w30);
18525 :       //^32CB:37C6
18526 :       bp06 = _4976_5aa8.w24;
18527 :     }
18528 :     else {
18529 :       //^32CB:37CB
18530 :       bp0a = 4 -(bp18 / 5);
18531 :       //^32CB:37DC
18532 :       if (xx == 0 && bp0a < 2)
18533 :         //^32CB:37E8
18534 :         return;
18535 :       //^32CB:37EB
18536 :       bp06 = _098d_0cb7(xx, bp18, 0) | 0x8000;
18537 :     }
18538 :     //^32CB:3801
18539 :     U16 bp1c = 0;
18540 :     //^32CB:3806
18541 :     U8 bp0d = QUERY_CLS1_FROM_RECORD(rl);
18542 :     //^32CB:3812
18543 :     U8 bp0e = QUERY_CLS2_FROM_RECORD(rl);
18544 :     //^32CB:381E
18545 :     if (bp0d == 0x14 && bp0e < 8) {
18546 :       //^32CB:382A
18547 :       if (ss == 0) {
18548 :         //^32CB:3830
18549 :         ss = ss +GET_ADDRESS_OF_RECORD9(rl)->IsOpened();
18550 :       }
18551 :       //^32CB:384C
18552 :       bp1c = 1;
18553 :     }
18554 :     //^32CB:3851
18555 :     U8 bp0f = _4976_4380[ss][0];
18556 :     //^32CB:385D
18557 :     U16 bp08 = 0;
18558 :     //^32CB:3862
18559 :     i16 bp14 = _4976_4116[xx];
18560 :     //^32CB:386D
18561 :     if (bp14 == 0) {
18562 :       //^32CB:3871
18563 :       i16 bp16 = bp18 / 5;
18564 :       //^32CB:387D
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 :         //^32CB:38AD
18571 :         bp0f = U8(bp10);
18572 :       }
18573 :       //^32CB:38B5
18574 :       else if (bp1c != 0 && tt == 0 && bp16 > 2) {
18575 :         //^32CB:38C7
18576 :         bp08 = 1;
18577 :       }
18578 :     }
18579 :     //^32CB:38CE
18580 :     else if (bp1c != 0 && bp14 == 1) {
18581 :       //^32CB:38DA
18582 :       bp08 = 1;
18583 :     }
18584 :     //^32CB:38DF
18585 :     if (vv != -1) {
18586 :       //^32CB:38E5
18587 :       yy += _4976_41de[_4976_41b0[vv][0]];
18588 :       //^32CB:38FA
18589 :       if (ref == NULL) {
18590 :         //^32CB:3902
18591 :         si += _4976_41de[_4976_41b0[vv][1]];
18592 :       }
18593 :     }
18594 :     //^32CB:3916
18595 :     bp1a = QUERY_GDAT_ENTRY_DATA_INDEX(bp0d, 0xfe, dtImageOffset, bp0f);
18596 :     //^32CB:392E
18597 :     if (bp1a != 0) {
18598 :       //^32CB:3932
18599 :       yy += i8(bp1a >> 8);
18600 :       //^32CB:3939
18601 :       si += i8(bp1a);
18602 :     }
18603 :     //^32CB:393F
18604 :     U16 bp0c = _4976_418f[bp12][bp0a];
18605 :     //^32CB:3951
18606 :     _32cb_08c1(bp08, bp0c, bp0c, yy, si, bp12, bp06, 0, 10, -1, bp0d, bp0e, bp0f);
18607 :     //^32CB:397D
18608 :     if (ww == 0)
18609 :       //^32CB:3983
18610 :       _4976_5940.w48 = -2;
18611 :     //^32CB:3989
18612 :     _32cb_0997();
18613 :     //^32CB:398D
18614 :     return;
18615 :   }
18616 : 
18617 :   //^32CB:03A6
18618 :   ObjectID _32cb_03a6(U16 xx, U16 yy, U16 zz, U16 ww, U16 vv, ObjectID ss, U16 tt, U16 uu)
18619 :   {
18620 :     //^32CB:03A6
18621 :     ENTER(28);
18622 :     //^32CB:03AC
18623 :     U16 bp12 = ss.Dir();
18624 :     //^32CB:03B5
18625 :     Creature *bp04;
18626 :     ObjectID si;
18627 :     if (tt == 2) {
18628 :       //^32CB:03BB
18629 :       bp04 = GET_ADDRESS_OF_RECORD4(GET_CREATURE_AT(ww, vv));
18630 :       //^32CB:03D5
18631 :       si = bp04->GetPossessionObject();
18632 :     }
18633 :     else {
18634 :       //^32CB:03DE
18635 :       bp04 = NULL;
18636 :       //^32CB:03E8
18637 :       si = GET_TILE_RECORD_LINK(ww, vv);
18638 :     }
18639 :     //^32CB:03F7
18640 :     if (si == si.FFFE) {
18641 :       //^32CB:03FC
18642 :       if (uu != 0)
18643 :         //^32CB:0402
18644 :         return ss;
18645 :       //^32CB:0408
18646 :       //^32CB:0634
18647 :       return ObjectID::FFFF;
18648 :     }
18649 :     //^32CB:040B
18650 :     i16 di = (tt == 3) ? 2 : 0;
18651 :     //^32CB:0418
18652 :     ObjectID bp0e = ObjectID::FFFF;
18653 :     //^32CB:041D
18654 :     Container *bp0c = NULL;
18655 :     U16 bp16;
18656 :     Container *bp08;
18657 : 
18658 :     do {
18659 :       //^32CB:0427
18660 :       U16 bp10 = si.DBType();
18661 :       //^32CB:0432
18662 :       if (bp10 < dbWeapon || bp10 > dbMiscellaneous_item)
18663 :         //^32CB:0441
18664 :         continue;
18665 :       //^32CB:0444
18666 :       if (si.Dir() != bp12)
18667 :         //^32CB:044E
18668 :         continue;
18669 :       //^32CB:0451
18670 :       U16 bp14 = 0;
18671 :       bp08 = NULL;
18672 :       //^32CB:0460
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 :         //^32CB:0485
18678 :         if ((bp08 = GET_ADDRESS_OF_RECORD9(si))->IsOpened() != 0) {
18679 :           //^32CB:04A0
18680 :           bp14 = 3;
18681 :         }
18682 :         //^32CB:04A7
18683 :         else if (uu == 0) {
18684 :           //^32CB:04AD
18685 :           bp14 = 2;
18686 :         }
18687 :       }
18688 :       do {
18689 :         //^32CB:04B2
18690 :         _32cb_3672(si, zz, 0, 0, di, bp04, 0, bp14, (tt == 3) ? 1 : 0);
18691 :         //^32CB:04DC
18692 :         if (_32cb_00f1(xx, yy, 10) == 1) {
18693 :           //^32CB:04F0
18694 :           bp0c = bp08;
18695 :           //^32CB:04FC
18696 :           bp0e = si;
18697 :           bp16 = bp14;
18698 :           //^32CB:0505
18699 :           break;
18700 :         }
18701 :         //^32CB:0507
18702 :         if (bp14 == 0)
18703 :           //^32CB:050B
18704 :           break;
18705 :         //^32CB:050D
18706 :         bp14 = 0;
18707 :         //^32CB:0512
18708 :       } while (true);
18709 : 
18710 :       //^32CB:0514
18711 :       di++;
18712 :       //^32CB:0515
18713 :       if (tt == 3) {
18714 :         //^32CB:051B
18715 :         if (di >= 14)
18716 :           //^32CB:0520
18717 :           di = 2;
18718 :       }
18719 :       else {
18720 :         //^32CB:0525
18721 :         di &= 15;
18722 :       }
18723 :       //^32CB:0529
18724 :     } while ((si = GET_NEXT_RECORD_LINK(si)) != si.FFFE);
18725 : 
18726 :     //^32CB:053A
18727 :     bp08 = bp0c;
18728 :     //^32CB:0546
18729 :     if (bp08 == NULL)
18730 :       //^32CB:054A
18731 :       goto _0639;
18732 :     //^32CB:054D
18733 :     switch (bp16) {
18734 :       case 0:
18735 :         //^32CB:0561
18736 :         if (uu != 0)
18737 :           //^32CB:0567
18738 :           //^32CB:05FF
18739 :           return ObjectID::FFFE;
18740 :         //^32CB:056A
18741 :         if (bp08->IsOpened() == 0)
18742 :           //^32CB:0578
18743 :           goto _0642;
18744 :         //^32CB:057B
18745 :         bp08->IsOpened(0);
18746 :         //^32CB:0583
18747 :         break;
18748 : 
18749 :       case 2:
18750 :         //^32CB:0586
18751 :         bp08->IsOpened(1);
18752 :         //^32CB:058E
18753 :         break;
18754 : 
18755 :       case 3:
18756 :         {
18757 :         //^32CB:0591
18758 :         if (uu != 0 && (QUERY_GDAT_DBSPEC_WORD_VALUE(ss, 4) & 0x8000) != 0)
18759 :           //^32CB:05A8
18760 :           //^32CB:05FF
18761 :           return ObjectID::FFFE;
18762 :         //^32CB:05AA
18763 :         ObjectID bp1c;
18764 :         ObjectID bp1a;
18765 :         bp1c = bp1a = bp08->GetContainedObject();
18766 :         //^32CB:05B7
18767 :         i16 bp18;
18768 :         for (bp18 = 0; bp1c != bp1c.FFFE; ) {
18769 :           //^32CB:05BE
18770 :           bp18++;
18771 :           bp1a = bp1c;
18772 :           bp1c = GET_NEXT_RECORD_LINK(bp1c);
18773 :         }
18774 :         //^32CB:05D9
18775 :         if (uu != 0) {
18776 :           //^32CB:05DF
18777 :           if (bp18 < 8) {
18778 :             //^32CB:05E5
18779 :             APPEND_RECORD_TO(ss, &bp08->w2, -1, 0);
18780 :             //^32CB:05FD
18781 :             break;
18782 :           }
18783 :           //^32CB:05FF
18784 :           return ObjectID::FFFE;
18785 :         }
18786 :         //^32CB:0604
18787 :         if (bp18 <= 0)
18788 :           //^32CB:0608
18789 :           break;
18790 :         //^32CB:060A
18791 :         CUT_RECORD_FROM(bp1a, &bp08->w2, -1, 0);
18792 :         //^32CB:0622
18793 :         _4976_57f2 = 1;
18794 :         //^32CB:0628
18795 :         _2c1d_06b5(bp1a, 1);
18796 : 
18797 :         break;
18798 :         }
18799 : 
18800 :     }
18801 :     //^32CB:0634
18802 :     return ObjectID::FFFF;
18803 : 
18804 :     //^32CB:0639
18805 : _0639:
18806 :     if (bp0e == ObjectID::FFFF)
18807 :       //^32CB:063F
18808 :       //^32CB:0402
18809 :       return ss;
18810 :     //^32CB:0642
18811 : _0642:
18812 :     return bp0e;
18813 :   }
18814 : 
18815 :   //^121E:013A
18816 :   void _121e_013a(U16 xx, U16 yy, U16 zz)
18817 :   {
18818 :     //^121E:013A
18819 :     ENTER(4);
18820 :     //^121E:0140
18821 :     if (_4976_3fc6 == -1)
18822 :       //^121E:0147
18823 :       return;
18824 :     //^121E:014A
18825 :     U16 di = _4976_4bfa;
18826 :     U16 si = _4976_4c06;
18827 :     //^121E:0152
18828 :     U16 bp04 = _4976_4d1a[zz].b10;
18829 :     //^121E:0165
18830 :     if (bp04 != 0) {
18831 :       //^121E:0169
18832 :       if (bp04 != 3)
18833 :         //^121E:016E
18834 :         return;
18835 :       //^121E:0171
18836 :       di += _4976_0232[_4976_4bf6];
18837 :       si += _4976_023a[_4976_4bf6];
18838 :     }
18839 :     //^121E:0185
18840 :     ObjectID bp02 = _32cb_03a6(xx, yy, bp04, di, si, _4976_4d1a[zz].w8, _4976_4d1a[zz].b11, 0);
18841 :     //^121E:01BC
18842 :     if (bp02 != bp02.FFFF) {
18843 :       //^121E:01C1
18844 :       if (_4976_4d1a[zz].b11 == 2) {
18845 :         //^121E:01D2
18846 :         MOVE_RECORD_TO(bp02, di, si, -1, -1);
18847 :       }
18848 :       else {
18849 :         //^121E:01D6
18850 :         MOVE_RECORD_TO(bp02, di, si, -1, 0);
18851 :       }
18852 :       //^121E:01E7
18853 :       _4976_57f2 = 1;
18854 :       //^121E:01ED
18855 :       if (IS_CONTAINER_MONEYBOX(bp02) != 0) {
18856 :         //^121E:01FA
18857 :         GET_ADDRESS_OF_RECORD9(bp02)->b7_2_2(0);
18858 :       }
18859 :       //^121E:020C
18860 :       _2c1d_06b5(bp02, 1);
18861 :     }
18862 :     //^121E:0218
18863 :     _4976_4e5c = 1;
18864 :     //^121E:021E
18865 :     return;
18866 :   }
18867 : 
18868 :   //^121E:03AE
18869 :   U16 _121e_03ae(U16 aa, U16 bb, U16 xx, U16 yy, U16 cc, U16 dd, U16 ee)
18870 :   {
18871 :     //^121E:03AE
18872 :     ENTER(0);
18873 :     //^121E:03B3
18874 :     U16 di = dd;
18875 :     //^121E:03B6
18876 :     ObjectID si = _32cb_03a6(aa, bb, cc, xx, yy, ObjectID(_4976_57c8.w0, (_4976_4bf6 +di) & 3), ee, 1);
18877 :     //^121E:03EA
18878 :     if (si == si.FFFF) {
18879 :       //^121E:03EF
18880 :       _2c1d_073d();
18881 :       //^121E:03F4
18882 :       return 1;
18883 :     }
18884 :     //^121E:03F9
18885 :     if (si == si.FFFE) {
18886 :       //^121E:03FE
18887 :       if (ee == 2) {
18888 :         //^121E:0404
18889 :         return _121e_0222(xx, yy, di +4);
18890 :       }
18891 :       else {
18892 :         //^121E:040C
18893 :         return _121e_0222(xx, yy, di);
18894 :       }
18895 :     }
18896 :     //^121E:041C
18897 :     return 0;
18898 :   }
18899 : 
18900 :   //^098D:02A2
18901 :   U16 _098d_02a2(U16 rectno, i16 xx, i16 yy)
18902 :   {
18903 :     //^098D:02A2
18904 :     ENTER(8);
18905 :     //^098D:02A6
18906 :     SRECT bp08;
18907 :     if (QUERY_EXPANDED_RECT(rectno, &bp08) == NULL)
18908 :       //^098D:02BA
18909 :       return 0;
18910 :     //^098D:02BE
18911 :     return PT_IN_RECT(&bp08, xx, yy);
18912 :   }
18913 : 
18914 :   //^121E:00BE
18915 :   void _121e_00be(U16 ww, U16 xx, U16 yy)
18916 :   {
18917 :     //^121E:00BE
18918 :     ENTER(0);
18919 :     //^121E:00C1
18920 :     if (_4976_4c3c == 0)
18921 :       //^121E:00C6
18922 :       return;
18923 :     //^121E:00C8
18924 :     if (ww != 0) {
18925 :       //^121E:00CE
18926 :       if (_4976_4c3e != 0)
18927 :         //^121E:00D3
18928 :         return;
18929 :       //^121E:00D5
18930 :       _443c_03f4();
18931 :       //^121E:00DA
18932 :       _4976_4c3e = 1;
18933 :       //^121E:00E0
18934 :       _443c_08ab(&_4976_5da0, &_4976_5da2, &_4976_5db8);
18935 :       //^121E:00F4
18936 :       if ((_4976_5db8 & 2) == 0) {
18937 :         //^121E:00FC
18938 :         FIRE_MOUSE_SET_POS();
18939 :         //^121E:0101
18940 :         _4976_4c3e = 0;
18941 :         //^121E:0107
18942 :       }
18943 :       else {
18944 :         //^121E:0109
18945 :         _443c_085a();
18946 :       }
18947 :     }
18948 :     else {
18949 :       //^121E:0110
18950 :       QUEUE_NOISE_GEN2(0x08, _4976_4218, 0x84, 0xfe, xx, yy, 0, 140, 200);
18951 :     }
18952 :     //^121E:0132
18953 :     _4976_4e5c = 1;
18954 :     //^121E:0138
18955 :     return;
18956 :   }
18957 : 
18958 :   //^0CEE:2E35
18959 :   i16 _0cee_2e35(U8 cls2)
18960 :   {
18961 :     //^0CEE:2E35
18962 :     ENTER(0);
18963 :     //^0CEE:2E39
18964 :     U16 si = QUERY_GDAT_CREATURE_WORD_VALUE(cls2, 0x04);
18965 :     //^0CEE:2E47
18966 :     if (si == 0)
18967 :       //^0CEE:2E4B
18968 :       return 4;
18969 :     //^0CEE:2E4E
18970 :     return si;
18971 :   }
18972 : 
18973 :   //^32CB:28C7
18974 :   void _32cb_28c7(U16 xx, i16 yy, Creature *vv, sk4ebe *ww, ObjectID rl)
18975 :   {
18976 :     //^32CB:28C7
18977 :     ENTER(28);
18978 :     //^32CB:28CD
18979 :     U16 di = 0;
18980 :     //^32CB:28CF
18981 :     sk1c9a02c3 *bp04 = _1c9a_02c3(vv, QUERY_CREATURE_AI_SPEC_FROM_TYPE(vv->CreatureType()));
18982 :     //^32CB:28F3
18983 :     i16 si = _4937_000f(bp04->w0, &bp04->w2);
18984 :     //^32CB:290C
18985 :     U16 bp06 = (ww == NULL) ? 0 : ww->b7;
18986 :     //^32CB:2924
18987 :     U16 bp0a = ((_0cee_2de0(rl) & 4) != 0) ? 2 : ((_4976_5aa0 - vv->b15_0_2()) & 3);
18988 :     //^32CB:2950
18989 :     U16 bp08 = _4976_5a98[si][bp0a +10];
18990 :     //^32CB:2969
18991 :     U8 bp0b = vv->CreatureType();
18992 :     //^32CB:2973
18993 :     U8 bp0c = _4976_5a98[si][bp0a +2];
18994 :     //^32CB:298A
18995 :     if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
18996 :       //^32CB:299F
18997 :       bp0c = (bp0a +2) & 3;
18998 :       //^32CB:29A9
18999 :       if ((bp0c & 1) != 0)
19000 :         //^32CB:29AF
19001 :         di = 1;
19002 :       //^32CB:29B2
19003 :       bp0c = _4976_5a98[si][bp0c +2];
19004 :       //^32CB:29CD
19005 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
19006 :         //^32CB:29E2
19007 :         di = 0;
19008 :         //^32CB:29E4
19009 :         bp0c = _4976_5a98[si][4];
19010 :       }
19011 :     }
19012 :     //^32CB:29FA
19013 :     else if (false
19014 :       || (bp08 & 1) != 0
19015 :       || ((bp06 & 64) != 0 && (bp06 & 2) != 0 && (bp06 & 1) == 0)
19016 :     ) {
19017 :       //^32CB:2A16
19018 :       di = 1;
19019 :     }
19020 :     //^32CB:2A19
19021 :     if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
19022 :       //^32CB:2A31
19023 :       bp0c = bp0a -6;
19024 :       //^32CB:2A39
19025 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c) == 0) {
19026 :         //^32CB:2A4E
19027 :         if (true
19028 :           && bp0c == 0xfb
19029 :           && QUERY_GDAT_ENTRY_IF_LOADABLE(0x0f, bp0b, dtImage, bp0c +2) != 0
19030 :         ) {
19031 :           //^32CB:2A6E
19032 :           di = 1;
19033 :           //^32CB:2A71
19034 :           bp0c = bp0c +2;
19035 :         }
19036 :         else {
19037 :           //^32CB:2A7B
19038 :           di = 0;
19039 :           //^32CB:2A7D
19040 :           bp0c = 0xfc;
19041 :         }
19042 :       }
19043 :     }
19044 :     //^32CB:2A81
19045 :     i16 bp10 = _4976_4189[yy];
19046 :     //^32CB:2A8D
19047 :     i16 bp14 = (ww != NULL && ww->b26 == 19) ? ww->w14 : si;
19048 :     //^32CB:2AAB
19049 :     U16 bp12 = _4976_5a98[bp14][0];
19050 :     //^32CB:2AC1
19051 :     if (xx == 3 && _4976_5aa2 != 0) {
19052 :       //^32CB:2ACE
19053 :       bp12 = _4976_41d0[_4976_0c5c];
19054 :       bp10 = _4976_41d7[_4976_0c5c];
19055 :     }
19056 :     else {
19057 :       //^32CB:2AE9
19058 :       bp10 = _0b36_0036(_4976_5a98[si][bp0a +6], bp10);
19059 :     }
19060 :     //^32CB:2B0D
19061 :     U16 bp0e = _098d_0cb7(xx, bp12, bp0a) | 0x8000;
19062 :     //^32CB:2B24
19063 :     i16 bp18, bp16;
19064 :     bp18 = bp16 = i8(_4976_5a98[bp14][1]);
19065 :     //^32CB:2B3D
19066 :     if (bp16 != 0) {
19067 :       //^32CB:2B44
19068 :       i16 bp1c;
19069 :       i16 bp1a;
19070 :       switch (bp0a) {
19071 :       case 0:
19072 :         //^32CB:2B50
19073 :         bp1c = -7;
19074 :         //^32CB:2B55
19075 :         //^32CB:2B5C
19076 :         bp1a = 0;
19077 :         //^32CB:2B61
19078 :         break;
19079 : 
19080 :       case 2:
19081 :         //^32CB:2B57
19082 :         bp1c = 7;
19083 :         //^32CB:2B5C
19084 :         bp1a = 0;
19085 :         //^32CB:2B61
19086 :         break;
19087 : 
19088 :       case 1:
19089 :       case 3:
19090 :         //^32CB:2B63
19091 :         bp1a = -64;
19092 :         bp1c = 0;
19093 : 
19094 :         break;
19095 :       }
19096 :       //^32CB:2B6D
19097 :       bp1a = _0b36_0036(bp1a, bp16);
19098 :       //^32CB:2B7D
19099 :       bp18 = _0b36_0036(bp1c, bp18);
19100 :     }
19101 :     //^32CB:2B8D
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 :     //^32CB:2BDA
19105 :     return;
19106 :   }
19107 : 
19108 :   //^32CB:01B6
19109 :   U16 _32cb_01b6(U16 xx, U16 yy, U16 ss, U16 tt, U16 *ww)
19110 :   {
19111 :     //^32CB:01B6
19112 :     ENTER(8);
19113 :     //^32CB:01BC
19114 :     ObjectID si = GET_CREATURE_AT(ss, tt);
19115 :     //^32CB:01CB
19116 :     if (si == si.FFFF)
19117 :       //^32CB:01D0
19118 :       return 0;
19119 :     //^32CB:01D5
19120 :     Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
19121 :     //^32CB:01E2
19122 :     sk4ebe *bp08;
19123 :     if (bp04->b5 == 255) {
19124 :       //^32CB:01EC
19125 :       bp08 = NULL;
19126 :     }
19127 :     else {
19128 :       //^32CB:01F8
19129 :       bp08 = &_4976_4ebe[bp04->b5];
19130 :     }
19131 :     //^32CB:0216
19132 :     _32cb_28c7(3, _4976_4130, bp04, bp08, si);
19133 :     //^32CB:0232
19134 :     i16 di = _4976_5940.w48;
19135 :     //^32CB:0236
19136 :     _4976_5940.w48 = -2;
19137 :     //^32CB:023C
19138 :     _32cb_0997();
19139 :     //^32CB:0241
19140 :     if (_32cb_00f1(xx, yy, di) == 0)
19141 :       //^32CB:0253
19142 :       //^32CB:01D0
19143 :       return 0;
19144 :     //^32CB:0256
19145 :     if (_4976_5a94 < 0xffb5) {
19146 :       //^32CB:025D
19147 :       *ww = 3;
19148 :     }
19149 :     //^32CB:0267
19150 :     else if (_4976_5a94 > 0x004b) {
19151 :       //^32CB:026E
19152 :       *ww = 1;
19153 :     }
19154 :     else {
19155 :       //^32CB:0278
19156 :       *ww = 0;
19157 :     }
19158 :     //^32CB:0280
19159 :     return 1;
19160 :   }
19161 : 
19162 :   //^121E:0222
19163 :   U16 _121e_0222(U16 xx, U16 yy, U16 ww)
19164 :   {
19165 :     //^121E:0222
19166 :     ENTER(12);
19167 :     //^121E:0228
19168 :     Creature *bp0c = NULL;
19169 :     //^121E:0232
19170 :     if (_4976_3fc6 == -1)
19171 :       //^121E:0239
19172 :       return 0;
19173 :     //^121E:023E
19174 :     U16 bp06 = (_4976_4bf6 +ww) & 3;
19175 :     //^121E:024A
19176 :     ObjectID di = GET_CREATURE_AT(xx, yy);
19177 :     //^121E:0259
19178 :     if (di != di.FFFF) {
19179 :             //^121E:025E
19180 :       sk03a2 *bp04 = QUERY_CREATURE_AI_SPEC_FROM_RECORD(di);
19181 :       //^121E:026B
19182 :       bp0c = GET_ADDRESS_OF_RECORD4(di);
19183 :       //^121E:0278
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 :         //^121E:02A7
19192 :         //^121E:0239
19193 :         return 0;
19194 :       }
19195 :     }
19196 :     //^121E:02A9
19197 :     di = _2c1d_073d();
19198 :     //^121E:02B0
19199 :     if (ww >= 4 && ww <= 7) {
19200 :       //^121E:02BC
19201 :       U8 bp07 = (ww -4 + _4976_4bf6) & 3;
19202 :       //^121E:02CA
19203 :       if (bp0c != NULL) {
19204 :         //^121E:02D2
19205 :         for (ObjectID si = bp0c->GetPossessionObject(); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
19206 :           //^121E:02DB
19207 :           if (si.Dir() == bp07 && IS_CONTAINER_MONEYBOX(si) != 0) {
19208 :             //^121E:02F4
19209 :             GET_ADDRESS_OF_RECORD9(si)->b7_2_2(0);
19210 :           }
19211 :           //^121E:0304
19212 :         }
19213 :       }
19214 :       //^121E:0312
19215 :       MOVE_RECORD_TO(ObjectID(di, bp07), -1, -1, xx, yy);
19216 :     }
19217 :     else{
19218 :       //^121E:0323
19219 :       MOVE_RECORD_TO(ObjectID(di, bp06), -1, 0, xx, yy);
19220 :     }
19221 :     //^121E:0344
19222 :     _4976_4e5c = 1;
19223 :     //^121E:034A
19224 :     return 1;
19225 :   }
19226 : 
19227 :   //^0CEE:2E09
19228 :   U16 _0cee_2e09(ObjectID rl)
19229 :   {
19230 :     //^0CEE:2E09
19231 :     ENTER(0);
19232 :     //^0CEE:2E0C
19233 :     return QUERY_CREATURE_AI_SPEC_FROM_RECORD(rl)->w32;
19234 :   }
19235 : 
19236 :   //^2C1D:1FB1
19237 :   U16 _2c1d_1fb1(U16 xx)
19238 :   {
19239 :     //^2C1D:1FB1
19240 :     ENTER(0);
19241 :     //^2C1D:1FB4
19242 :     if (_4976_3fc6 == -1)
19243 :       //^2C1D:1FBB
19244 :       return 0;
19245 :     //^2C1D:1FBF
19246 :     return _2c1d_1de2(_4976_3fc6, -1, xx);
19247 :   }
19248 : 
19249 :   //^121E:0351
19250 :   U16 _121e_0351(U16 xx, U16 yy)
19251 :   {
19252 :     //^121E:0351
19253 :     ENTER(0);
19254 :     //^121E:0356
19255 :     U16 si = 0;
19256 :     //^121E:0358
19257 :     U16 di = (_4976_4dda == 17) ? 768 : 765;
19258 :     //^121E:0367
19259 :     if (_098d_02a2(di, xx, yy) != 0) {
19260 :       //^121E:037A
19261 :       si = _2c1d_1fb1(0);
19262 :     }
19263 :     //^121E:037E
19264 :     else if (_098d_02a2(di +1, xx, yy) != 0) {
19265 :       //^121E:0394
19266 :       si = _2c1d_1fb1(si);
19267 :     }
19268 :     //^121E:039E
19269 :     if (si != 0)
19270 :       //^121E:03A2
19271 :       _4976_4e5c = 1;
19272 :     //^121E:03A8
19273 :     return si;
19274 :   }
19275 : 
19276 :   //^121E:0422
19277 :   void _121e_0422(i16 xx, i16 yy)
19278 :   {
19279 :     //^121E:0422
19280 :     ENTER(38);
19281 :     //^121E:0428
19282 :     U16 di = yy;
19283 :     //^121E:042B
19284 :     if (_4976_4ddc != 0) {
19285 :       //^121E:0432
19286 :       _4976_4ddc = 0;
19287 :       //^121E:0438
19288 :       _12b4_0aa5(_4976_0c5c);
19289 :       //^121E:0442
19290 :       _29ee_000f();
19291 :     }
19292 :     //^121E:044A
19293 :     xx -= _4976_00e8;
19294 :     //^121E:0450
19295 :     di -= _4976_00ea;
19296 :     //^121E:0454
19297 :     U16 bp0c = _4976_4bfa;
19298 :     //^121E:045A
19299 :     U16 bp0e = _4976_4c06;
19300 :     //^121E:0460
19301 :     bp0c += _4976_0232[_4976_4bf6];
19302 :     //^121E:046D
19303 :     bp0e += _4976_023a[_4976_4bf6];
19304 :     //^121E:047A
19305 :     ObjectID bp0a = _4976_57c8.w0;
19306 :     //^121E:0480
19307 :     Door *bp04;
19308 :     U16 si;
19309 :     for (si = 0; si < _4976_4dde; si++) {
19310 :       //^121E:0485
19311 :       if (PT_IN_RECT(&_4976_4d1a[si].rc0, xx, di) != 0) {
19312 :         //^121E:04A4
19313 :         switch (_4976_4d1a[si].b11 -1) {
19314 :           case 3:
19315 :             //^121E:04C5
19316 :             if (_4976_3fc6 == -1)
19317 :               //^121E:04CC
19318 :               break;
19319 :             //^121E:04CF
19320 :             U16 bp16;
19321 :             U16 bp18;
19322 :             if (_4976_4d1a[si].b10 == 3) {
19323 :               //^121E:04DF
19324 :               bp16 = bp0c;
19325 :               bp18 = bp0e;
19326 :             }
19327 :             else {
19328 :               //^121E:04EA
19329 :               bp16 = _4976_4bfa;
19330 :               bp18 = _4976_4c06;
19331 :             }
19332 :             //^121E:04F3
19333 :             //^121E:04F6
19334 :             bp04 = GET_ADDRESS_OF_TILE_RECORD(U8(bp16), U8(bp18))->castToDoor();
19335 :             //^121E:0509
19336 :             if (bp04->Button() != 0) {
19337 :               //^121E:051D
19338 :               if (bp0a == bp0a.FFFF)
19339 :                 //^121E:0523
19340 :                 continue;
19341 :               //^121E:0526
19342 :               QUEUE_NOISE_GEN1(0x03, 0x00, 0x88, 0x8c, 0x80, _4976_4bfa, _4976_4c06, 1);
19343 :               //^121E:0545
19344 :               sk5c20 bp22;
19345 :               INVOKE_MESSAGE(bp16, bp18, 0, 2, _4976_4bec +1);
19346 :               //^121E:0566
19347 :               bp22.SetMap(_4976_0c5a);
19348 :               bp22.SetTick(_4976_4bec +1);
19349 :               //^121E:0589
19350 :               bp22.TimerType(0x58);
19351 :               bp22.b5 = 0;
19352 :               //^121E:0591
19353 :               ObjectID bp1c = GET_TILE_RECORD_LINK(bp16, bp18);
19354 :               //^121E:05A1
19355 :               QUEUE_TIMER(&bp22);
19356 :               //^121E:05AD
19357 :               bp04->w2_b_b(1);
19358 :               //^121E:05B5
19359 :               _4976_4e5c = 1;
19360 :               //^121E:05BB
19361 :               continue;
19362 :             }
19363 :             else {
19364 :               //^121E:05BE
19365 :               bp16 += _4976_0232[(_4976_4bf6 +1) & 3];
19366 :               //^121E:05D0
19367 :               bp18 += _4976_023a[(_4976_4bf6 +1) & 3];
19368 :               //^121E:05E2
19369 :               MOVE_RECORD_AT_WALL(bp16, bp18, (_4976_4bf6 + 3) & 3, -1, _4976_57c8.w0);
19370 :               //^121E:0600
19371 :               continue;
19372 :             }
19373 : 
19374 :           case 5:
19375 :             //^121E:0603
19376 :             U16 bp24;
19377 :             if (_32cb_0287(bp24 = _4976_4d1a[si].b10, xx, di) == 0)
19378 :               //^121E:0626
19379 :               continue;
19380 :             //^121E:0629
19381 :             _121e_0003(bp24);
19382 :             //^121E:0631
19383 :             return;
19384 : 
19385 :           case 0:
19386 :           case 1:
19387 :           case 2:
19388 :             //^121E:0634
19389 :             if (bp0a == bp0a.FFFF) {
19390 :               //^121E:063A
19391 :               if (_4976_4d1a[si].w8 == 0xffff)
19392 :                 //^121E:0648
19393 :                 continue;
19394 :               //^121E:064A
19395 :               _121e_013a(xx, di, si);
19396 :               //^121E:0653
19397 :               //^121E:07B7
19398 :               //^121E:07BA
19399 :               return;
19400 :             }
19401 :             //^121E:0656
19402 :             if (_4976_4d1a[si].b11 == 3) {
19403 :               //^121E:0666
19404 :               if (_121e_03ae(xx, di, bp0c, bp0e, 0, 2, 3) == 0)
19405 :                 //^121E:067F
19406 :                 continue;
19407 :               //^121E:0681
19408 :               return;
19409 :             }
19410 :             //^121E:0684
19411 :             if (_4976_4d1a[si].b11 == 1)
19412 :               //^121E:0692
19413 :               continue;
19414 :             //^121E:0694
19415 :             for (U16 bp26 = 0; bp26 <= 1; bp26++) {
19416 :               //^121E:069B
19417 :               if (_121e_03ae(xx, di, _4976_4bfa, _4976_4c06, 0, bp26, 1) != 0)
19418 :                 //^121E:06B9
19419 :                 return;
19420 :             }
19421 : 
19422 :             break;
19423 : 
19424 :           case 4:
19425 :             break;
19426 :         }
19427 :       }
19428 :       //^121E:06C5
19429 :     }
19430 :     //^121E:06CF
19431 :     si = GET_TILE_VALUE(bp0c, bp0e);
19432 :     //^121E:06E0
19433 :     U16 bp12 = ((si >> 5) == ttTrickWall && ((si >> 5) & 1) != 0 && ((si >> 5) & 4) == 0) ? 1 : 0;
19434 :     //^121E:06FF
19435 :     U16 bp14;
19436 :     if (bp0a == bp0a.FFFF) {
19437 :       //^121E:0708
19438 :       if (_4976_4dda == 0 && (_098d_02a2(765, xx, di) == 0 || _098d_02a2(766, xx, di) != 0)) {
19439 :         //^121E:0735
19440 :         _121e_00be(bp12, bp0c, bp0e);
19441 :         //^121E:0742
19442 :         //^121E:07B7
19443 :         //^121E:07BA
19444 :         return;
19445 :       }
19446 :       //^121E:0744
19447 :       ObjectID bp10 = GET_CREATURE_AT(bp0c, bp0e);
19448 :       //^121E:0754
19449 :       if (bp10 == bp10.FFFF)
19450 :         //^121E:0759
19451 :         return;
19452 :       //^121E:075C
19453 :       sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp10);
19454 :       //^121E:076E
19455 :       if ((bp08->w0 & 1) == 0)
19456 :         //^121E:0775
19457 :         return;
19458 :       //^121E:0778
19459 :       if (_32cb_01b6(xx, di, bp0c, bp0e, &bp14) == 0)
19460 :         //^121E:0793
19461 :         return;
19462 :       //^121E:0796
19463 :       if (_0cee_2e1e(bp10) != 255) {
19464 :         //^121E:07A4
19465 :         if (bp14 != 0) {
19466 :           //^121E:07AA
19467 :           ROTATE_CREATURE(bp10, 0, bp14);
19468 :           //^121E:07BA
19469 :           return;
19470 :         }
19471 :         //^121E:07BD
19472 :         _4976_4ddc = 1;
19473 :         //^121E:07C3
19474 :         _4976_4dbe = _4976_4dc0 = xx;
19475 :         //^121E:07CD
19476 :         _29ee_000f();
19477 :         //^121E:07D2
19478 :         _4976_0c5c = 6;
19479 :         //^121E:07D8
19480 :         return;
19481 :       }
19482 :       //^121E:07DB
19483 :       QUEUE_NOISE_GEN2(0x0f, QUERY_CLS2_FROM_RECORD(bp10), 0x84, 0xfe, bp0c, bp0e, 0, 0x8c, 0x80);
19484 :       //^121E:0803
19485 :       return;
19486 :     }
19487 :     //^121E:0806
19488 :     for (si = 0; si <= 1; si++) {
19489 :       //^121E:080A
19490 :       if (_121e_03ae(xx, di, _4976_4bfa, _4976_4c06, 0, si, 1) != 0)
19491 :         //^121E:0826
19492 :         return;
19493 :       //^121E:0829
19494 :       if (_098d_02a2(si +760, xx, di) != 0 && _121e_0222(_4976_4bfa, _4976_4c06, si) != 0)
19495 :         //^121E:0853
19496 :         return;
19497 :       //^121E:0856
19498 :     }
19499 :     //^121E:085C
19500 :     if (_4976_4dda == 0 && bp12 == 0)
19501 :       //^121E:0869
19502 :       return;
19503 :         //^121E:086C
19504 :     for (si = 2; si <= 3; si++) {
19505 :       //^121E:0871
19506 :       if (_121e_03ae(xx, di, bp0c, bp0e, 3, si, 1) != 0)
19507 :         //^121E:088B
19508 :         return;
19509 :       //^121E:088E
19510 :       if (_098d_02a2(si +760, xx, di) != 0 && _121e_0222(bp0c, bp0e, si) != 0)
19511 :         //^121E:08B6
19512 :         return;
19513 :       //^121E:08B9
19514 :     }
19515 :     //^121E:08BF
19516 :     ObjectID bp10 = GET_CREATURE_AT(bp0c, bp0e);
19517 :     //^121E:08CF
19518 :     if (bp10 != bp10.FFFF) {
19519 :       //^121E:08D4
19520 :       sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp10);
19521 :       //^121E:08E3
19522 :       if ((bp08->w0 & 1) != 0) {
19523 :         //^121E:08ED
19524 :         for (si = 0; bp08->w30 > si; si++) {
19525 :           //^121E:08F1
19526 :           if (_121e_03ae(xx, di, bp0c, bp0e, 3, si +2, 2) != 0)
19527 :             //^121E:090D
19528 :             return;
19529 :           //^121E:090F
19530 :           if (_098d_02a2(_0cee_2e09(bp10) +si, xx, di) != 0) {
19531 :             //^121E:092B
19532 :             if (_121e_0222(bp0c, bp0e, si +6) != 0)
19533 :               //^121E:0940
19534 :               return;
19535 :           }
19536 :           //^121E:0942
19537 :         }
19538 :       }
19539 :     }
19540 :     //^121E:0951
19541 :     _121e_0351(xx, di);
19542 :     //^121E:095D
19543 :     return;
19544 :   }
19545 : 
19546 :   //^1031:16FD
19547 :   void _1031_16fd(Bit16u ww, i16 xx, i16 yy)
19548 :   {
19549 :     //^1031:16FD
19550 :     ENTER(24);
19551 :     //^1031:1703
19552 :     i16 di = yy;
19553 :     //^1031:1709
19554 :     ObjectID bp0c = _4976_52af[_4976_5366].Possess(_4976_5354);
19555 :     //^1031:171F
19556 :     Container *bp04 = GET_ADDRESS_OF_RECORD9(bp0c);
19557 :     //^1031:172E
19558 :     if (ww != 150 || bp04->b5_5_7() != 1)
19559 :       //^1031:1736
19560 :       return;
19561 :     //^1031:174E
19562 :     SRECT bp18;
19563 :     QUERY_EXPANDED_RECT(99, &bp18);
19564 :     //^1031:175D
19565 :     xx -= bp18.x - _4976_53a0;
19566 :     di -= bp18.y - _4976_53a2;
19567 :     //^1031:1770
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 :       //^1031:17B2
19574 :       return;
19575 :     }
19576 :     //^1031:17B5
19577 :     xx = xx / (_4976_0144 + _4976_0148);
19578 :     di = di / (_4976_0146 + _4976_014a);
19579 :     //^1031:17D5
19580 :     i16 bp0e = _4976_5364;
19581 :     //^1031:17DC
19582 :     i16 bp10 = _4976_5365;
19583 :     //^1031:17E3
19584 :     _0cee_02dd(_4976_539f, 3 -di, xx -3, &bp0e, &bp10);
19585 :     //^1031:1807
19586 :     i16 si = _0cee_0510(_4976_539e, 0, &bp0e, &bp10, NULL);
19587 :     //^1031:1826
19588 :     if (si < 0)
19589 :       //^1031:182A
19590 :       return;
19591 :     //^1031:182D
19592 :     i16 bp0a = _4976_0c5a;
19593 :     //^1031:1833
19594 :     CHANGE_CURRENT_MAP_TO(si);
19595 :     //^1031:183A
19596 :     U16 bp06 = GET_TILE_VALUE(bp0e, bp10);
19597 :     //^1031:184C
19598 :     U16 bp08 = bp06 >> 5;
19599 :     //^1031:1854
19600 :     if (true
19601 :       && bp08 != ttWall
19602 :       && bp08 != ttMapExit
19603 :       && (bp08 != ttTrickWall || (bp06 & 5) != 0)
19604 :     ) {
19605 :       //^1031:1876
19606 :       if (true
19607 :         && bp0e == _4976_536a
19608 :         && bp10 == _4976_536c
19609 :         && si == _4976_5318
19610 :       ) {
19611 :         //^1031:188E
19612 :         if (_4976_5326 == 1 && _4976_533c >= 0) {
19613 :           //^1031:189C
19614 :           bp0e = _4976_5328;
19615 :           bp10 = _4976_532a;
19616 :           //^1031:18A8
19617 :           si = _4976_533c;
19618 :         }
19619 :         //^1031:18AE
19620 :         else if (_4976_533e >= 0 && (_4976_5326 == 1 || _4976_5326 == 3)) {
19621 :           //^1031:18C3
19622 :           bp0e = _4976_5320;
19623 :           bp10 = _4976_5322;
19624 :           //^1031:18CC
19625 :           si = _4976_533e;
19626 :         }
19627 :       }
19628 :       //^1031:18D3
19629 :       SET_DESTINATION_OF_MINION_MAP(bp0c, bp0e, bp10, si);
19630 :       //^1031:18E5
19631 :       _1c9a_0247(bp04->GetContainedObject());
19632 :       //^1031:18F2
19633 :       _2759_0644(0);
19634 :     }
19635 :     //^1031:18FA
19636 :     CHANGE_CURRENT_MAP_TO(bp0a);
19637 :     //^1031:1903
19638 :     return;
19639 :   }
19640 : 
19641 :   //^2759:13F5
19642 :   void _2759_13f5(Bit16u xx)
19643 :   {
19644 :     //^2759:13F5
19645 :     ENTER(4);
19646 :     //^2759:13FB
19647 :     U16 si = _4976_3e1e[xx];
19648 :     //^2759:1409
19649 :     U16 di = 1 << xx;
19650 :     //^2759:1410
19651 :     if ((_4976_5356 & di) != 0) {
19652 :       //^2759:1416
19653 :       si = -si;
19654 :       //^2759:141C
19655 :       goto _1445;
19656 :     }
19657 :     //^2759:141E
19658 :     sk53b4 *bp04 = &_4976_52af[_4976_5366];
19659 :     //^2759:142F
19660 :     if (bp04->curMP() >= si) {
19661 :       //^2759:1438
19662 :       bp04->curMP(bp04->curMP() -si);
19663 :       //^2759:143F
19664 :       bp04->w50 |= 0x0800;
19665 :       //^2759:1445
19666 : _1445:
19667 :       _4976_5356 ^= di;
19668 :       _4976_531a += si;
19669 :     }
19670 :     //^2759:144D
19671 :     return;
19672 :   }
19673 : 
19674 :   //^38C8:0060
19675 :   void _38c8_0060()
19676 :   {
19677 :     //^38C8:0060
19678 :     ENTER(0);
19679 :     //^38C8:0064
19680 :     if (_4976_5bec != 0 && _4976_01ba == 0) {
19681 :       //^38C8:0072
19682 :       if (_4976_4be8 != 0) {
19683 :         //^38C8:0079
19684 :         _1031_1907();
19685 :         //^38C8:007E
19686 :         _44c8_1be8(0);
19687 :       }
19688 :       else {
19689 :         //^38C8:0088
19690 :         _4976_5bec = 0;
19691 :         //^38C8:008E
19692 :         if (_4976_5366 == 0)
19693 :           //^38C8:0095
19694 :           _4976_531c = 1;
19695 :         else
19696 :           //^38C8:009D
19697 :           _4976_5352 = 1;
19698 :         //^38C8:00A3
19699 :         U16 si = _4976_52be;
19700 :         //^38C8:00A8
19701 :         if (si != 0) {
19702 :           //^38C8:00AC
19703 :           _4976_52be = 0;
19704 :           //^38C8:00B2
19705 :           _24a5_1798(si -1);
19706 :           //^38C8:00B9
19707 :         }
19708 :         else {
19709 :           //^38C8:00BB
19710 :           _32cb_06cf();
19711 :           //^38C8:00C0
19712 :           _29ee_000f();
19713 :         }
19714 :       }
19715 :     }
19716 :     //^38C8:00C5
19717 :     return;
19718 :   }
19719 : 
19720 :   void _1031_1907(); // TODO: Unreachable
19721 :   void _2c1d_14ba(); // TODO: Unreachable
19722 : 
19723 :   //^476D:00B1
19724 :   void FILE_DELETE(U8 *filename);
19725 :   //^476D:012C
19726 :   U16 FILE_WRITE(i16 handle, U32 buffSize, const void *buff);
19727 :   //^476D:008F
19728 :   i16 FILE_CREATE(const U8 *filename);
19729 : 
19730 :   //^2066:03C0
19731 :   U16 SKSAVE_WRITE(void *buff, U16 buffSize);
19732 :   //^2066:000F
19733 :   U8 SUPPRESS_WRITER(const void *pvData, const void *pvMask, U16 cbData, U32 repeat);
19734 :   //^2066:06E8
19735 :   Bit8u WRITE_RECORD_CHECKCODE(Bit16u recordLink, Bit8u writeDir, Bit8u writeFollowing);
19736 :   //^2066:0B96
19737 :   U16 STORE_EXTRA_DUNGEON_DATA();
19738 :   //^2066:0583
19739 :   U16 WRITE_POSSESSION_INDICES();
19740 :   //^2066:0147
19741 :   U16 SUPPRESS_FLUSH();
19742 : 
19743 :   void _2066_046d(); // TODO: Unreachable
19744 : 
19745 :   //^2066:38D9
19746 :   void _2066_38d9()
19747 :   {
19748 :     //^2066:38D9
19749 :     ENTER(2);
19750 :     //^2066:38DE
19751 :     for (i16 bp02 = 0; bp02 < 10; bp02++) {
19752 :       //^2066:38E6
19753 :       _4976_52e2 = bp02 +0x30;
19754 :       //^2066:38EE
19755 :       i16 si = OPEN_FILE(FORMAT_SKSTR(_4976_19d0, NULL));
19756 :       //^2066:390D
19757 :       if (si >= 0) {
19758 :         //^2066:3911
19759 :         READ_FILE(si, 42, &_4976_5250[bp02]);
19760 :         //^2066:3931
19761 :         CLOSE_FILE(si);
19762 :         //^2066:3938
19763 :       }
19764 :       else {
19765 :         //^2066:393A
19766 :         _4976_3b5f[0] = _4976_52e2;
19767 :         //^2066:3940
19768 :         SK_STRCPY(_4976_5250[bp02].b2, _4976_3b5f);
19769 :         //^2066:3961
19770 :         _4976_5250[bp02].w38 = 0xBEEF;
19771 :         _4976_5250[bp02].w40 = 0xDEAD;
19772 :       }
19773 :       //^2066:397B
19774 :     }
19775 :     //^2066:3987
19776 :     return;
19777 :   }
19778 : 
19779 :   //^2066:3697
19780 :   void _2066_3697(U8 cls2, U16 yy)
19781 :   {
19782 :     //^2066:3697
19783 :     ENTER(104);
19784 :     //^2066:369B
19785 :     _4976_5250 = reinterpret_cast<sksave_header_asc *>(ALLOC_MEMORY(420, afDefault, 1024));
19786 :     //^2066:36B4
19787 :     U8 bp6a[40];
19788 :     U8 *bp18 = QUERY_GDAT_TEXT(0x1a, cls2, 0x00, bp6a);
19789 :     //^2066:36CF
19790 :     U8 bp40[40];
19791 :     U8 *bp14 = QUERY_GDAT_TEXT(0x1a, cls2, 0x01, bp40);
19792 :     //^2066:36EA
19793 :     U8 *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x1a, cls2, 0x00);
19794 :     //^2066:3700
19795 :     U8 *bp08;
19796 :     if (_4976_5d76 != 0) {
19797 :       //^2066:3707
19798 :       bp08 = QUERY_GDAT_IMAGE_LOCALPAL(0x1a, cls2, 0x00);
19799 :     }
19800 :     else {
19801 :       //^2066:371C
19802 :       bp08 = bp04 +CALC_IMAGE_BYTE_LENGTH(bp04);
19803 :     }
19804 :     //^2066:3737
19805 :     SRECT bp10;
19806 :     DRAW_DIALOGUE_PARTS_PICT(bp04, QUERY_EXPANDED_RECT(4, &bp10), -1, bp08);
19807 :     //^2066:375E
19808 :     FREE_PICT_ENTRY(bp04);
19809 :     //^2066:376B
19810 :     FIRE_FADE_SCREEN(1);
19811 :     //^2066:3773
19812 :     _3929_0bd7(0x1c2, _4976_4bda[2], _4976_3b6f);
19813 :     //^2066:378D
19814 :     _3929_0bd7(0x1d2, _4976_4bda[9], bp18);
19815 :     //^2066:37A9
19816 :     _3929_0bd7(0x1d3, _4976_4bda[9], bp14);
19817 :     //^2066:37C5
19818 :     _2066_38d9();
19819 :     //^2066:37CA
19820 :     _4976_4bd2 = yy;
19821 :     //^2066:37D0
19822 :     _1031_0675(4);
19823 :     //^2066:37D8
19824 :     _4976_523a = 0;
19825 :     //^2066:37DE
19826 :     while (_4976_4860 > 0) {
19827 :       //^2066:37E0
19828 :       _443c_086b();
19829 :       //^2066:37E5
19830 :       _4976_523a++;
19831 :       //^2066:37E9
19832 :     }
19833 :     //^2066:37F0
19834 :     return;
19835 :   }
19836 : 
19837 :           void _2066_33c4(U8 *xx, U16 yy); // TODO: Unreachable
19838 : 
19839 :   //^2066:398A
19840 :   void _2066_398a(i16 xx)
19841 :   {
19842 :     //^2066:398A
19843 :     ENTER(10);
19844 :     //^2066:3990
19845 :     SRECT bp0a;
19846 :     QUERY_EXPANDED_RECT(451, &bp0a);
19847 :     //^2066:39A0
19848 :     i16 di = bp0a.y +4;
19849 :     //^2066:39A8
19850 :     for (i16 si = 0; si < 10; si++) {
19851 :       //^2066:39AC
19852 :       U16 bp02 = (si == xx) ? _4976_4bda[11] : _4976_4bda[9];
19853 :       //^2066:39C8
19854 :       DRAW_GAMELOAD_STR(bp0a.x, di, bp02, _4976_5250[si].b2);
19855 :       //^2066:39EB
19856 :       di += _4976_0128;
19857 :       //^2066:39EF
19858 :     }
19859 :     //^2066:39F5
19860 :     return;
19861 :   }
19862 :   //^2066:3820
19863 :   void _2066_3820(U8 *xx, U16 yy)
19864 :   {
19865 :     //^2066:3820
19866 :     ENTER(8);
19867 :     //^2066:3824
19868 :     SRECT bp08;
19869 :     QUERY_EXPANDED_RECT(0x1c5, &bp08);
19870 :     //^2066:3834
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 :     //^2066:3873
19874 :     DRAW_GAMELOAD_STR(bp08.x, bp08.y +4, _4976_4bda[11], xx);
19875 :     //^2066:3896
19876 :     if (yy != 0) {
19877 :       //^2066:389C
19878 :       bp08.x += SK_STRLEN(xx) * _4976_0126;
19879 :       bp08.cx = _4976_0126;
19880 :       bp08.cy -= 4;
19881 :       //^2066:38BA
19882 :       FIRE_FILL_BACKBUFF_RECT(&bp08, _4976_4bda[9]);
19883 :     }
19884 :     //^2066:38D2
19885 :     _0aaf_002f();
19886 :     //^2066:38D7
19887 :     return;
19888 :   }
19889 : 
19890 :       void _3929_0b01(U16 xx, U16 yy); // TODO: Unreachable
19891 :       void _3929_0b20(U16 xx, U32 yy); // TODO: Unreachable
19892 : 
19893 :   //^3E74:5B7C
19894 :   void _3e74_5b7c(U16 xx)
19895 :   {
19896 :     //^3E74:5B7C
19897 :     ENTER(20);
19898 :     //^3E74:5B80
19899 :     _476d_05b6(xx);
19900 :     //^3E74:5B89
19901 :     if (_4976_484d++ == _4976_484f[_4976_484d]) {
19902 :       //^3E74:5B9F
19903 :       if (_4976_484f[_4976_484d] != 0)
19904 :         //^3E74:5BAA
19905 :         return;
19906 :       //^3E74:5BAD
19907 :       U8 *bp04 = _4976_4853;
19908 :       //^3E74:5BB5
19909 :       _3929_09fb(15, bp04);
19910 :       //^3E74:5BC5
19911 :       U8 bp14[16];
19912 :       _3929_09fb(15, SK_LTOA10(2, bp14));
19913 :       //^3E74:5BE2
19914 :       _3929_0b01(15, 46);
19915 :       //^3E74:5BED
19916 :       _3929_0b20(15, 8);
19917 :       //^3E74:5BFB
19918 :       _3929_0b20(15, _4976_5e9c);
19919 :       //^3E74:5C0D
19920 :       _3929_0b20(15, _4976_5ea6);
19921 :       //^3E74:5C1F
19922 :       _3929_0b20(15, _4976_5d66);
19923 :       //^3E74:5C31
19924 :       bp04 = _4976_485a;
19925 :       //^3E74:5C39
19926 :       SK_STRCPY(bp14, bp04);
19927 :       //^3E74:5C4C
19928 :       if (_4976_5bee != 0)
19929 :         //^3E74:5C53
19930 :         bp14[0] = 0x47;
19931 :       //^3E74:5C57
19932 :       if (_4976_5bef != 0)
19933 :         //^3E74:5C5E
19934 :         bp14[1] = 0x53;
19935 :       //^3E74:5C62
19936 :       if (_4976_5bf0 != 0)
19937 :         //^3E74:5C69
19938 :         bp14[2] = 0x45;
19939 :       //^3E74:5C6D
19940 :       _3929_09fb(15, bp14);
19941 :     }
19942 :     //^3E74:5C7C
19943 :     _4976_484d = 0;
19944 :     //^3E74:5C82
19945 :     return;
19946 :   }
19947 : 
19948 :   //^1031:0D36
19949 :   void _1031_0d36(U16 xx, U16 yy)
19950 :   {
19951 :     //^1031:0D36
19952 :     ENTER(0);
19953 :     //^1031:0D3A
19954 :     _3e74_5b7c(yy);
19955 :     //^1031:0D43
19956 :     _4976_19a7 = 1;
19957 :     //^1031:0D49
19958 :     if (_4976_4e00 < 7) {
19959 :       //^1031:0D50
19960 :       i16 si = _4976_19a5 +2;
19961 :       //^1031:0D57
19962 :       if (si > 10)
19963 :         //^1031:0D5C
19964 :         si -= 11;
19965 :       //^1031:0D5F
19966 :       if (si-- == 0)
19967 :         //^1031:0D66
19968 :         si = 10;
19969 :       //^1031:0D69
19970 :       _4976_19a5 = si;
19971 :       //^1031:0D6E
19972 :       _4976_4e02[_4976_19a5].w0 = xx;
19973 :       //^1031:0D7C
19974 :       _4976_4e02[_4976_19a5].w2 = yy;
19975 :       //^1031:0D8D
19976 :       _4976_4e00++;
19977 :     }
19978 :     //^1031:0D91
19979 :     _4976_19a7 = 0;
19980 :     //^1031:0D97
19981 :     _1031_0b7e();
19982 :     //^1031:0D9B
19983 :     return;
19984 :   }
19985 : 
19986 :   //^01B0:054A
19987 :   U8 _01b0_054a(U16 xx) //#DS=04BF
19988 :   {
19989 :     //^01B0:054A
19990 :     ENTER(0);
19991 :     //^01B0:054F
19992 :     U16 di = xx;
19993 :     //^01B0:0552
19994 :     LOADDS(0x3083);
19995 :     //^01B0:0558
19996 :     if ((di & 0x1000) != 0)
19997 :       //^01B0:055E
19998 :       di = 0;
19999 :     //^01B0:0560
20000 :     U16 si = ((di & 0x0200) != 0) ? (_04bf_033e[di & 0x007f]) : (_04bf_02be[di & 0x007f]);
20001 :         //^01B0:057E
20002 :     if (si != 0 && (di & 0x0400) != 0)
20003 :       //^01B0:0588
20004 :       si &= 0x001f;
20005 :     //^01B0:058E
20006 :     return U8(si);
20007 :   }
20008 : 
20009 :   //^476D:05B6
20010 :   U8 _476d_05b6(U16 xx)
20011 :   {
20012 :     //^476D:05B6
20013 :     ENTER(0);
20014 :     //^476D:05B9
20015 :     return _01b0_054a(xx) CALL_IBMIO;
20016 :   }
20017 : 
20018 :   //^2066:37F2
20019 :   void _2066_37f2()
20020 :   {
20021 :     //^2066:37F2
20022 :     ENTER(0);
20023 :     //^2066:37F5
20024 :     while (_4976_523a-- != 0)
20025 :       //^2066:37F7
20026 :       _443c_085a();
20027 :     //^2066:3807
20028 :     _1031_06a5();
20029 :     //^2066:380C
20030 :     _4976_022c = 1;
20031 :     //^2066:3812
20032 :     DEALLOC_UPPER_MEMORY(420);
20033 :     //^2066:381E
20034 :     return;
20035 :   }
20036 : 
20037 :   //^2066:33E7
20038 :   i16 _2066_33e7()
20039 :   {
20040 :     //^2066:33E7
20041 :     ENTER(22);
20042 :     //^2066:33ED
20043 :     _2066_3697(0x81, 6);
20044 :     //^2066:33F9
20045 :     i16 si;
20046 :     if (_4976_5bf6 != 0) {
20047 :       //^2066:3400
20048 :       si = _4976_525c;
20049 :       //^2066:3404
20050 :       COPY_MEMORY(&_4976_5250[si], &_4976_5266, 42);
20051 :     }
20052 :     else {
20053 :       //^2066:3428
20054 :       for (si = 0; si < 10; si++) {
20055 :         //^2066:342C
20056 :         if (true
20057 :           && _4976_5250[si].w40 == 0xDEAD
20058 :           && _4976_5250[si].w38 == 0xBEEF
20059 :         ) {
20060 :           //^2066:3449
20061 :           _2066_33c4(_4976_5268, si);
20062 :           //^2066:3455
20063 :           break;
20064 :         }
20065 :         //^2066:3457
20066 :       }
20067 :     }
20068 :     //^2066:345D
20069 :     _2066_398a(si);
20070 :     //^2066:3464
20071 :     U8 *bp04 = _4976_5268;
20072 :     //^2066:346C
20073 :     if (si != 10) {
20074 :       //^2066:3471
20075 :       _2066_3820(bp04, 0);
20076 :     }
20077 :     else {
20078 :       //^2066:3483
20079 :       _0aaf_002f();
20080 :     }
20081 :     //^2066:3488
20082 :     while (_476d_05a9() != 0) {
20083 :       //^2066:348F
20084 :       _1031_0d36(32, _476d_050e());
20085 :     }
20086 :     //^2066:34A7
20087 :     _1031_1e6a();
20088 :     //^2066:34AC
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 :         //^2066:34C0
20098 :         si = -1;
20099 :         //^2066:34C3
20100 :         _4976_4c0a = 0;
20101 :         //^2066:34C9
20102 :         bp0c = 1;
20103 :         //^2066:34CE
20104 :         break;
20105 : 
20106 :       case 2:
20107 :         //^2066:34D1
20108 :         _4976_4c0a = 0;
20109 :         //^2066:34D7
20110 :         if (si == 10)
20111 :           //^2066:34DC
20112 :           break;
20113 :         //^2066:34DF
20114 :         if (*bp04 == 0) {
20115 :           //^2066:34E8
20116 :           _2066_33c4(bp04, si);
20117 :         }
20118 :         //^2066:34F6
20119 :         _2066_3820(bp04, 0);
20120 :         //^2066:3506
20121 :         bp0c = 1;
20122 :         //^2066:350B
20123 :         break;
20124 : 
20125 :       case 3:
20126 :         //^2066:350E
20127 :         _4976_4c0a = 0;
20128 :         //^2066:3514
20129 :         QUERY_EXPANDED_RECT(_4976_4df8, &bp14);
20130 :         //^2066:3525
20131 :         QUERY_TOPLEFT_OF_RECT(_4976_4e44, &bp06, &bp08);
20132 :         //^2066:353B
20133 :         bp0a = _4976_4e68;
20134 :         //^2066:3541
20135 :         bp0a -= bp14.y +bp08;
20136 :         //^2066:354A
20137 :         si = min_value(bp0a / _4976_0128, 10);
20138 :         //^2066:355E
20139 :         if (true
20140 :           && _4976_5250[si].w40 == 0xDEAD
20141 :           && _4976_5250[si].w38 == 0xBEEF
20142 :         ) {
20143 :           //^2066:3579
20144 :           _2066_33c4(_4976_5268, si);
20145 :         }
20146 :         else {
20147 :           //^2066:3587
20148 :           SK_STRCPY(_4976_5268, _4976_5250[si].b2);
20149 :         }
20150 :         //^2066:35A7
20151 :         _2066_398a(si);
20152 :         //^2066:35AE
20153 :         _2066_3820(bp04, 0);
20154 :         //^2066:35BE
20155 :         break;
20156 : 
20157 :       case 4:
20158 :         //^2066:35C0
20159 :         if (si != 10 && _4976_4c0a == 0) {
20160 :           //^2066:35CC
20161 :           _4976_4c0a = 1;
20162 :           //^2066:35D2
20163 :           _2066_3820(bp04, 1);
20164 :           //^2066:35E2
20165 :           di = SK_STRLEN(bp04);
20166 :         }
20167 : 
20168 :         break;
20169 :     }
20170 :     //^2066:35F1
20171 :     if (_4976_4c0a != 0 && _4976_4dfa >= 0xa5 && _4976_4dfa <= 0xd6) {
20172 :       //^2066:3608
20173 :       if (_4976_4e9c == 14) {
20174 :         //^2066:360F
20175 :         if (di > 0) {
20176 :           //^2066:3613
20177 :           di--;
20178 :           //^2066:3614
20179 :           bp04[di] = 0;
20180 :         }
20181 :         //^2066:361D
20182 :         else if (_4976_4e9c == 28) {
20183 :           //^2066:3624
20184 :           _4976_4c0a = 0;
20185 :         }
20186 :         //^2066:362C
20187 :         else if (di < 31) {
20188 :           //^2066:3631
20189 :           U8 bp15 = _476d_05b6(_4976_4e9c);
20190 :           //^2066:363E
20191 :           if (bp15 >= 0x61 && bp15 <= 0x7a) {
20192 :             //^2066:364A
20193 :             bp15 += 0xe0;
20194 :           }
20195 :           //^2066:364F
20196 :           bp04[di] = bp15;
20197 :           //^2066:3658
20198 :           bp04[++di] = 0;
20199 :         }
20200 :         //^2066:365D
20201 :         _2066_3820(bp04, _4976_4c0a);
20202 :       }
20203 :     }
20204 :     //^2066:366F
20205 :     _4976_4dfc = 0;
20206 :     _4976_4dfa = 0;
20207 :     //^2066:367B
20208 :     if (bp0c == 0) {
20209 :       //^2066:3684
20210 :       _2066_37f2();
20211 :     }
20212 :     //^2066:3689
20213 :     return si;
20214 :   }
20215 : 
20216 :   //^1C9A:3BAB
20217 :   void _1c9a_3bab()
20218 :   {
20219 :     //^1C9A:3BAB
20220 :     ENTER(0);
20221 :     //^1C9A:3BAF
20222 :     for (U16 si = 0; _4976_1a68 > 0; si++) {
20223 :       //^1C9A:3BB3
20224 :       if (_4976_4ebe[si].w0 >= 0) {
20225 :         //^1C9A:3BC6
20226 :         _1c9a_0fcb(si);
20227 :       }
20228 :     }
20229 :     //^1C9A:3BD4
20230 :     return;
20231 :   }
20232 : 
20233 :   //^1C9A:3B74
20234 :   void _1c9a_3b74()
20235 :   {
20236 :     //^1C9A:3B74
20237 :     ENTER(2);
20238 :     //^1C9A:3B7A
20239 :     U16 di = _4976_0c5a;
20240 :     //^1C9A:3B7E
20241 :     U16 bp02 = _4976_4d0e->nMaps;
20242 :     //^1C9A:3B8B
20243 :     for (i16 si = 0; si < bp02; si++) {
20244 :       //^1C9A:3B8F
20245 :       CHANGE_CURRENT_MAP_TO(si);
20246 :       //^1C9A:3B96
20247 :       _1c9a_3a6e();
20248 :     }
20249 :     //^1C9A:3BA0
20250 :     CHANGE_CURRENT_MAP_TO(di);
20251 :     //^1C9A:3BA7
20252 :     return;
20253 :   }
20254 : 
20255 :   //^1C9A:3BD7
20256 :   void _1c9a_3bd7()
20257 :   {
20258 :     //^1C9A:3BD7
20259 :     ENTER(4);
20260 :     //^1C9A:3BDC
20261 :     _4976_1a68 = 0;
20262 :     //^1C9A:3BE2
20263 :     for (U16 si = 0; si < _4976_4ec2; si++) {
20264 :       //^1C9A:3BE6
20265 :       _4976_4ebe[si].w0 = -1;
20266 :       //^1C9A:3BF8
20267 :     }
20268 :     //^1C9A:3BFF
20269 :     Creature *bp04 = reinterpret_cast<Creature *>(static_cast<U8 *>(_4976_4cca[4]));
20270 :     //^1C9A:3C0C
20271 :     for (U16 si = _4976_4d0e->nRecords[dbCreature]; si-- != 0; bp04++) {
20272 :       //^1C9A:3C16
20273 :       bp04->b5 = 0;
20274 :     }
20275 :     //^1C9A:3C29
20276 :     _1c9a_3b74();
20277 :     //^1C9A:3C2D
20278 :     return;
20279 :   }
20280 : 
20281 :   //^2E62:0CD8
20282 :   void _2e62_0cd8(U16 xx)
20283 :   {
20284 :     //^2E62:0CD8
20285 :     ENTER(0);
20286 :     //^2E62:0CDC
20287 :     for (U16 si = 0; si < _4976_4c3c; si++) {
20288 :       //^2E62:0CE0
20289 :       _4976_53b4[si].w50 |= xx;
20290 :     }
20291 :     //^2E62:0CF7
20292 :     return;
20293 :   }
20294 : 
20295 :   //^2F3F:0789
20296 :   void _2f3f_0789()
20297 :   {
20298 :     //^2F3F:0789
20299 :     ENTER(8);
20300 :     //^2F3F:078F
20301 :     if (_4976_4c24 == 0) {
20302 :       //^2F3F:0799
20303 :       ObjectID di = _4976_57c8.w0;
20304 :       //^2F3F:079E
20305 :       if (di == di.FFFF) {
20306 :         //^2F3F:07A3
20307 :         _4976_57de = 0xff;
20308 :         //^2F3F:07A8
20309 :         _443c_0434();
20310 :       }
20311 :       else {
20312 :         i16 si = _4976_3fc6;
20313 :         //^2F3F:07B3
20314 :         _4976_3fc6 = -1;
20315 :         //^2F3F:07B9
20316 :         _2c1d_06b5(di, 1);
20317 :         //^2F3F:07C3
20318 :         _4976_3fc6 = si;
20319 :       }
20320 :       //^2F3F:07C7
20321 :       sk53b4 *bp04 = _4976_53b4;
20322 :       //^2F3F:07CF
20323 :       U16 si;
20324 :       for (si = 0; si < _4976_4c3c; si++, bp04++) {
20325 :         //^2F3F:07D3
20326 :         bp04->w50 &= 1023;
20327 :         //^2F3F:07DC
20328 :         WRITE_UI8(_4976_3de2,+si,0xff);
20329 :         //^2F3F:07E1
20330 :         _4976_5342[si] = 0;
20331 :         //^2F3F:07EB
20332 :         _4976_3dde[si] = 0xff;
20333 :         //^2F3F:07F0
20334 :         _4976_5330[si][1] = 0;
20335 :         //^2F3F:07FE
20336 :         _4976_3de6[si][1] = 0xffff;
20337 :         //^2F3F:0809
20338 :         _4976_5330[si][0] = 0;
20339 :         //^2F3F:0817
20340 :         _4976_3de6[si][0] = 0xffff;
20341 :         //^2F3F:0822
20342 :         _4976_5330[si][2] = 0;
20343 :         //^2F3F:0830
20344 :       }
20345 :       //^2F3F:083C
20346 :       _2e62_0cd8(0x4000);
20347 :       //^2F3F:0845
20348 :       si = _4976_3fc6;
20349 :       //^2F3F:084A
20350 :       if (si == 0xffff)
20351 :         //^2F3F:084F
20352 :         return;
20353 :       //^2F3F:0852
20354 :       _4976_3fc6 = -1;
20355 :       //^2F3F:0858
20356 :       _1031_16a0(si);
20357 :       //^2F3F:085F
20358 :       return;
20359 :     }
20360 :     //^2F3F:0862
20361 :     _4976_57c8.w0 = ObjectID::FFFF;
20362 :     _4976_57de = 0xff;
20363 :     //^2F3F:086D
20364 :     for (ObjectID di = GET_TILE_RECORD_LINK(0, 0); di != di.FFFE; di = GET_NEXT_RECORD_LINK(di)) {
20365 :       //^2F3F:087B
20366 :       if (di.DBType() == dbActuator) {
20367 :         //^2F3F:0888
20368 :         Actuator *bp08 = GET_ADDRESS_OF_RECORD3(di);
20369 :         //^2F3F:0895
20370 :         if (bp08->ActuatorType() == 0x007e) {
20371 :           //^2F3F:08A4
20372 :           _4976_404b = 1;
20373 :           //^2F3F:08AA
20374 :           _2f3f_0343(0, 1, 0, _4976_4bf4);
20375 :           //^2F3F:08BB
20376 :           _2f3f_04ea(0, 1, 0, _4976_4bf4, 160);
20377 :           //^2F3F:08CF
20378 :           _4976_404b = 0;
20379 :           //^2F3F:08D5
20380 :           _4976_53b4[0].playerDir(U8(_4976_4bf6));
20381 :           //^2F3F:08DB
20382 :           _4976_53b4[0].playerPos(U8(_4976_4bf6));
20383 :           //^2F3F:08E1
20384 :           _2e62_0cd8(0x4000);
20385 :           //^2F3F:08EA
20386 :           _1031_16a0(0);
20387 :           //^2F3F:08F2
20388 :           return;
20389 :         }
20390 :       }
20391 :       //^2F3F:08F4
20392 :     }
20393 :     //^2F3F:0905
20394 :     return;
20395 :   }
20396 : 
20397 :   //^0CD5:0039
20398 :   void _0cd5_0039(i16 *buff, X16 cnt, i16 val, i16 delta)
20399 :   {
20400 :     //^0CD5:0039
20401 :     ENTER(0);
20402 :     //^0CD5:003E
20403 :     X16 si = 0;
20404 :     delta >>= 1;
20405 :     //^0CD5:0043
20406 :     for (U16 di = 0; di<cnt; di++) {
20407 :       //^0CD5:0047
20408 :       buff[si] = val;
20409 :       si += delta;
20410 :       //^0CD5:0059
20411 :     }
20412 :     //^0CD5:005F
20413 :     return;
20414 :   }
20415 : 
20416 :   //^19F0:045A
20417 :   void _19f0_045a(i16 xx, i16 yy)
20418 :   {
20419 :     //^19F0:045A
20420 :     ENTER(0);
20421 :     //^19F0:045D
20422 :     if (xx == _4976_5216 && yy == _4976_5218 && _4976_0c5a == _4976_0c5a)
20423 :       //^19F0:0476
20424 :       return;
20425 :     //^19F0:0478
20426 :     _4976_521a = _4976_0c5a;
20427 :     _4976_521c = GET_TILE_VALUE(_4976_5216 = xx, _4976_5218 = yy);
20428 :     //^19F0:0498
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 :     //^19F0:04BD
20433 :     return;
20434 :   }
20435 : 
20436 :   //^19F0:0207
20437 :   i16 _19f0_0207(X16 xx, X16 yy, X16 ss, X16 tt, U16 (sksave_converter::*comparer)(i16 xx, i16 yy))
20438 :   {
20439 :     //^19F0:0207
20440 :     ENTER(16);
20441 :     //^19F0:020D
20442 :     if (ABS16(xx -ss) + ABS16(yy -tt) <= 1)
20443 :       //^19F0:0230
20444 :       return 1;
20445 :     //^19F0:0236
20446 :     X16 di = ss -xx;
20447 :     di = (di < 0) ? -di : di;
20448 :     //^19F0:024B
20449 :     X16 si = (tt -yy);
20450 :     si = (si < 0) ? -si : si;
20451 :     //^19F0:0260
20452 :     X16 bp08 = (di < si) ? 1 : 0;
20453 :     //^19F0:026E
20454 :     X16 bp0e = (di == si) ? 1 : 0;
20455 :     //^19F0:027C
20456 :     di = ss;
20457 :     i16 bp04 = (di -xx <= 0) ? -1 : 1;
20458 :     //^19F0:0291
20459 :     si = tt;
20460 :     i16 bp06 = (si -yy <= 0) ? -1 : 1;
20461 :     //^19F0:02A6
20462 :     i16 bp02;
20463 :     i16 bp10;
20464 :     if (bp08 != 0) {
20465 :       //^19F0:02AC
20466 :       bp02 = si -yy;
20467 :       bp10 = (bp02 != 0) ? ((di -xx) << 6) / bp02 : 128;
20468 :     }
20469 :     else {
20470 :       //^19F0:02CB
20471 :       bp02 = di -xx;
20472 :       bp10 = (bp02 != 0) ? ((si -yy) << 6) / bp02 : 128;
20473 :     }
20474 :     //^19F0:02EB
20475 : _02eb:
20476 :     if (bp0e != 0) {
20477 :       //^19F0:02F1
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 :         //^19F0:0326
20483 :         goto _041e;
20484 :       }
20485 :       //^19F0:0329
20486 :       goto _041a;
20487 :     }
20488 :     //^19F0:032C
20489 :     if (bp08 != 0) {
20490 :       //^19F0:0332
20491 :       bp02 = si -yy;
20492 :       bp02 = ((bp02 != 0) ? ((di +bp04 -xx) << 6) / bp02 : 128) -bp10;
20493 :     }
20494 :     else {
20495 :       //^19F0:0354
20496 :       bp02 = di +bp04 -xx;
20497 :       bp02 = ((bp02 != 0) ? ((si -yy) << 6) / bp02 : 128) -bp10;
20498 :     }
20499 :     //^19F0:037A
20500 :     i16 bp0a = (bp02 < 0) ? -bp02 : bp02;
20501 :     //^19F0:0388
20502 :     if (bp08 != 0) {
20503 :       //^19F0:038F
20504 :       bp02 = si +bp06 -yy;
20505 :       bp02 = ((bp02 != 0) ? ((di -xx) << 6) / bp02 : 128) -bp10;
20506 :     }
20507 :     else {
20508 :       //^19F0:03B1
20509 :       bp02 = di -xx;
20510 :       bp02 = ((bp02 != 0) ? ((si +bp06 -yy) << 6) / bp02 : 128) -bp10;
20511 :     }
20512 :     //^19F0:03D7
20513 :     i16 bp0c = (bp02 < 0) ? -bp02 : bp02;
20514 :     //^19F0:03E5
20515 :     if (bp0a < bp0c)
20516 :       di += bp04;
20517 :     else
20518 :       si += bp06;
20519 :     //^19F0:03F2
20520 :     if (true
20521 :       && (this->*comparer)(di, si) != 0
20522 :       && (bp0a != bp0c || (this->*comparer)(di += bp04, si -= bp06) != 0)
20523 :     ) {
20524 :       //^19F0:041A
20525 : _041a:
20526 :       return 0;
20527 :     }
20528 :     //^19F0:041E
20529 : _041e:
20530 :     if (ABS16(di -xx) + ABS16(si -yy) > 1)
20531 :       //^19F0:043F
20532 :       goto _02eb;
20533 :     //^19F0:0442
20534 :     return CALC_SQUARE_DISTANCE(xx, yy, ss, tt);
20535 :   }
20536 : 
20537 :   //^19F0:00B8
20538 :   U16 _19f0_00b8(i16 xx, i16 yy)
20539 :   {
20540 :     //^19F0:00B8
20541 :     ENTER(8);
20542 :     //^19F0:00BE
20543 :     U16 bp04 = GET_TILE_VALUE(xx, yy);
20544 :     U16 bp02 = bp04 >> 5;
20545 :     if (bp02 != 0) {
20546 :       //^19F0:00DF
20547 :       if (bp02 == ttDoor) {
20548 :         //^19F0:00E5
20549 :         U16 di = U8(bp04) & 7;
20550 :         if (di == 3 || di == 4) {
20551 :           //^19F0:00F8
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 :       //^19F0:0128
20561 :       if (bp02 == ttTrickWall && (bp04 & 4) == 0)
20562 :         goto _01cf;
20563 :       //^19F0:0138
20564 :       if ((bp04 & 0x10) != 0) {
20565 :         //^19F0:0141
20566 :         for (ObjectID si = GET_WALL_TILE_ANYITEM_RECORD(xx, yy); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
20567 :           //^19F0:0150
20568 :           U16 bp06 = si.DBType();
20569 :           if (bp06 == dbCloud || GET_ADDRESS_OF_RECORDF(si)->CloudType() == 14)
20570 :             goto _01cf;
20571 :           //^19F0:0177
20572 :           if (bp06 == dbCreature) {
20573 :             ObjectID bp08 = _1c9a_03cf(&xx, &yy, 255);
20574 :             if (bp08 != bp08.FFFF) {
20575 :               //^19F0:019A
20576 :               U16 di = _0cee_2de0(bp08);
20577 :               if ((di & 1) != 0) {
20578 :                 //^19F0:01AA
20579 :                 if (((di >> 6) & 3) >= 2)
20580 :                   continue;
20581 :                 goto _01cf;
20582 :               }
20583 :               //^19F0:01B7
20584 :               if ((di & 0x20) == 0)
20585 :                 goto _01cf;
20586 :             }
20587 :           }
20588 :           //^19F0:01BD
20589 :         }
20590 :       }
20591 :             //^19F0:01CB
20592 :       return 0;
20593 :     }
20594 :     //^19F0:01CF
20595 : _01cf:
20596 :     return 1;
20597 :   }
20598 : 
20599 :   //^19F0:04BF
20600 :   ObjectID _19f0_04bf()
20601 :   {
20602 :     //^19F0:04BF
20603 :     ENTER(0);
20604 :     //^19F0:04C3
20605 :     ObjectID si = _4976_5220;
20606 :     if (si == si.FFFF) {
20607 :       //^19F0:04CD
20608 :       si = _4976_521e;
20609 :       if (si == si.FFFF) {
20610 :         //^19F0:04D7
20611 :         _4976_521e = GET_TILE_RECORD_LINK(_4976_5216, _4976_5218);
20612 :         //^19F0:04E9
20613 :       }
20614 :       //^19F0:04F4
20615 :       for (si = _4976_521e; si != si.FFFE && si.DBType() <= dbActuator; si = GET_NEXT_RECORD_LINK(si));
20616 :       //^19F0:0506
20617 :       _4976_5220 = si;
20618 :     }
20619 :     //^19F0:050A
20620 :     return si;
20621 :   }
20622 : 
20623 :   //^19F0:0559
20624 :   U16 _19f0_0559(X16 xx)
20625 :   {
20626 :     //^19F0:0559
20627 :     ENTER(4);
20628 :     //^19F0:055E
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 :     //^19F0:058E
20638 :     else if (bp04 != si) {
20639 :       if (((si -1) & 3) == bp04)
20640 :         //^19F0:059E
20641 : _059e:
20642 :         bp02 = 1;
20643 :       else
20644 :         bp02 = 0xffff;
20645 :     }
20646 :     else {
20647 :       //^19F0:05A7
20648 :       _4976_4ece->b26 = 0;
20649 :       _4976_4ee5 = 0xfe;
20650 :       //^19F0:05B5
20651 :       return 0;
20652 :     }
20653 :     //^19F0:05B9
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 :   //^075F:1BC2
20661 :   void _075f_1bc2(U8 zz[4], U16 xx, U16 yy, i16 ss, i16 tt, X16 ww)
20662 :   {
20663 :     //^075F:1BC2
20664 :     ENTER(2);
20665 :     //^075F:1BC8
20666 :         X16 di = ww;
20667 :     U16 si = CALC_VECTOR_DIR(xx, yy, ss, tt);
20668 :     //^075F:1BE0
20669 :     if (di == 255) {
20670 :       //^075F:1BE6
20671 :       COPY_MEMORY(&_4976_00dc[si], zz, 4);
20672 :       if (RAND01() != 0) {
20673 :         //^075F:1C06
20674 :         U8 bp01 = zz[0];
20675 :         zz[0] = zz[1];
20676 :         zz[1] = bp01;
20677 :       }
20678 :       //^075F:1C1D
20679 :       if (RAND01() != 0) {
20680 :         U8 bp01 = zz[2];
20681 :         zz[2] = zz[3];
20682 :         zz[3] = bp01;
20683 :       }
20684 :       return;
20685 :     }
20686 :     //^075F:1C41
20687 :     si <<= 1;
20688 :     if ((si & 2) == 0)
20689 :       di++;
20690 :     //^075F:1C4B
20691 :     si += (di >> 1) & 1;
20692 :     COPY_MEMORY(&_4976_00bc[si], zz, 4);
20693 :     //^075F:1C70
20694 :     return;
20695 :   }
20696 : 
20697 :   //^2C1D:028C
20698 :   i16 _2c1d_028c(i16 xx, i16 yy, X16 ww)
20699 :   {
20700 :     //^2C1D:028C
20701 :     ENTER(4);
20702 :     //^2C1D:0292
20703 :     if (_4976_4c3c != 0) {
20704 :       //^2C1D:0299
20705 :       if (ABS16(xx - _4976_4c2e) + ABS16(yy - _4976_4c30) <= 1) {
20706 :         //^2C1D:02BE
20707 :         U8 bp04[4];
20708 :         _075f_1bc2(bp04, _4976_4c2e, _4976_4c30, xx, yy, ww);
20709 :         //^2C1D:02DC
20710 :         for (U16 si = 0; si < 4; si++) {
20711 :           //^2C1D:02E0
20712 :           i16 di = GET_PLAYER_AT_POSITION(bp04[si]);
20713 :           if (di < 0)
20714 :             continue;
20715 :           return di;
20716 :           //^2C1D:02F3
20717 :         }
20718 :       }
20719 :     }
20720 :     //^2C1D:02F9
20721 :     return -1;
20722 :   }
20723 : 
20724 :   //^1C9A:0551
20725 :   U32 _1c9a_0551(U32 val, U16 cnt)
20726 :   {
20727 :     //^1C9A:0551
20728 :     ENTER(4);
20729 :     //^1C9A:0556
20730 :     X32 bp04 = 1;
20731 :     for (i16 si = 0; si < 32; si++, bp04 <<= 1) {
20732 :       //^1C9A:0564
20733 :       if ((val & bp04) != 0 && --cnt == 0) {
20734 :         break;
20735 :       }
20736 :     }
20737 :     //^1C9A:058F
20738 :     return bp04;
20739 :   }
20740 : 
20741 :   //^1C9A:0598
20742 :   U16 _1c9a_0598(U32 val)
20743 :   {
20744 :     //^1C9A:0598
20745 :     ENTER(0);
20746 :     //^1C9A:059D
20747 :     i16 di = 0;
20748 :     U16 si = 0;
20749 :     for (; val != 0 && di < 32; di++, val >>= 1) {
20750 :       //^1C9A:05A3
20751 :             if ((U16(val) & 1) != 0)
20752 :         si++;
20753 :     }
20754 :     //^1C9A:05CD
20755 :     return si;
20756 :   }
20757 : 
20758 :   //^19F0:0891
20759 :   U16 _19f0_0891(i16 zz, X16 xx, X16 yy, i16 ss, X16 tt, X16 ww)
20760 :   {
20761 :     //^19F0:0891
20762 :     ENTER(18);
20763 :     //^19F0:0897
20764 :     i16 di = ss;
20765 :     X16 bp02 = zz & 0x80;
20766 :     if (bp02 != 0)
20767 :       zz &= 0xff7f;
20768 :     //^19F0:08AC
20769 :     U16 si = _4976_4eee;
20770 :     if (si != 0) {
20771 :       //^19F0:08B8
20772 :       if (di == 0xffff) {
20773 :         //^19F0:08BD
20774 :         di = xx + _4976_0232[ww];
20775 :         tt = yy + _4976_023a[ww];
20776 :       }
20777 :       //^19F0:08DA
20778 :       if (di >= 0 && di < _4976_4dd2 && tt >= 0 && tt < _4976_4dd4 && (xx -di == 0 || yy -tt == 0)) {
20779 :         //^19F0:0911
20780 :         i16 bp04 = CALC_SQUARE_DISTANCE(xx, yy, di, tt);
20781 :         if (bp04 <= 1 || (si &= 0x0ff8) != 0) {
20782 :           //^19F0:0938
20783 :           if (bp04 != 0 || (si &= 7) != 0) {
20784 :             //^19F0:094B
20785 :             if (_4976_4eca->w20_c_f() >= U16(bp04)) {
20786 :               //^19F0:095E
20787 :               if (bp04 == 0) {
20788 :                 for (i16 bp0e = 0; bp0e < 4; bp0e++) {
20789 :                   //^19F0:096B
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 :                   //^19F0:09AC
20797 :                 }
20798 :                 //^19F0:09B5
20799 :                 if (bp0e < 4)
20800 :                   goto _0ccf;
20801 :               }
20802 :               //^19F0:09BE
20803 :               switch (zz) {
20804 :                 case 2:
20805 :                   //^19F0:09D1
20806 :                   _19f0_045a(di, tt);
20807 :                   if (_19f0_050f() == ObjectID::FFFE)
20808 :                     goto _0ccf;
20809 :                   break;
20810 : 
20811 :                 case 0:
20812 :                 case 1:
20813 :                   //^19F0:09E7
20814 :                   if (_4976_0c5a != _4976_5232 || di != _4976_5236 || tt != _4976_5238)
20815 :                     goto _0ccf;
20816 :                   break;
20817 : 
20818 :                 default:
20819 :                   break;
20820 :               }
20821 :               //^19F0:0A08
20822 :               if (bp04 <= 1 || _19f0_0207(xx, yy, di, tt, _19f0_00b8) != 0) {
20823 :                 //^19F0:0A2C
20824 :                 if ((_4976_3752[_4976_4efa] & 0x200) != 0) {
20825 :                   //^19F0:0A3A
20826 :                   _19f0_045a(di, tt);
20827 :                   //^19F0:0A48
20828 :                   for (ObjectID bp10 = _19f0_04bf(); bp10 != bp10.FFFE; bp10 = GET_NEXT_RECORD_LINK(bp10)) {
20829 :                     //^19F0:0A4A
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 :                     //^19F0:0A7E
20839 :                   }
20840 : 
20841 :                 }
20842 :                 //^19F0:0A90
20843 :                 if (bp02 != 0) {
20844 :                   //^19F0:0A99
20845 :                   if (ww == 0xffff) {
20846 :                     //^19F0:0A9F
20847 :                     if (bp04 == 0 && _4976_0c5a == _4976_5232 && di == _4976_5236 && tt == _4976_5238) {
20848 :                       //^19F0:0ABD
20849 :                       ww = (_4976_4bf6 +2) & 3;
20850 :                     }
20851 :                     else {
20852 :                       //^19F0:0AC7
20853 :                       ww = CALC_VECTOR_DIR(xx, yy, di, tt);
20854 :                     }
20855 :                   }
20856 :                   //^19F0:0ADC
20857 :                   X16 bp08;
20858 :                   X16 bp06;
20859 :                   if (_19f0_0559(ww) == 0) {
20860 :                     //^19F0:0AEB
20861 :                     bp08 = RAND01();
20862 :                     if (bp04 <= 1 && (si & 7) != 0 && ((si & 0xff8) == 0 || RAND01() != 0)) {
20863 :                       //^19F0:0B0E
20864 :                       si &= 7;
20865 :                       if (zz <= 1) {
20866 :                         //^19F0:0B18
20867 :                         bp06 = _2c1d_028c(xx, yy, 0x00ff);
20868 :                         if (bp06 != 0xffff) {
20869 :                           //^19F0:0B31
20870 :                           bp06 = _4976_53b4[bp06].playerPos();
20871 :                           goto _0bae;
20872 :                         }
20873 :                       }
20874 :                       //^19F0:0B40
20875 :                       bp06 = (bp08 +ww +2) & 3;
20876 :                       goto _0bae;
20877 :                     }
20878 :                     //^19F0:0B4A
20879 :                     si &= 0xff8;
20880 :                     if (zz <= 1 && RAND02() != 0) {
20881 :                       //^19F0:0B5D
20882 :                       bp08 = RAND01();
20883 :                       bp06 = (bp08 != 0) ? ((ww +2) & 3) : ww;
20884 :                       //^19F0:0B79
20885 :                       if (GET_PLAYER_AT_POSITION(bp06) -1) {
20886 :                         if (GET_PLAYER_AT_POSITION((bp06 +3) & 3) == -1) {
20887 :                           //^19F0:0B9C
20888 :                           bp08 = 1 -bp08;
20889 :                         }
20890 :                       }
20891 :                     }
20892 :                     //^19F0:0BA5
20893 :                     bp06 = (ww +3) & 3;
20894 :                     //^19F0:0BAE
20895 : _0bae:
20896 :                     //^19F0:0BB1
20897 :                     si = _1c9a_0551(si, RAND16(_1c9a_0598(si)) +1);
20898 :                     X16 bp12 = si;
20899 :                     //^19F0:0BD4
20900 :                     switch (bp12) {
20901 :                       case 0x0002:
20902 :                         //^19F0:0BED
20903 :                         _4976_4ece->b26 = 0x26;
20904 :                         break;
20905 :                       case 0x0001:
20906 :                         //^19F0:0BF9
20907 :                         _4976_4ece->b26 = 0x08;
20908 :                         break;
20909 :                       case 0x0004:
20910 :                         //^19F0:0C04
20911 :                         _4976_4ece->b26 = 0x0a;
20912 :                         _4976_4ece->b30 = 0x0b;
20913 :                         break;
20914 :                       case 0x0010:
20915 :                         //^19F0:0C14
20916 :                         bp04 = i16(0xff80);
20917 :                         goto _0c4a;
20918 :                       case 0x0020:
20919 :                         //^19F0:0C1B
20920 :                         bp04 = i16(0xff83);
20921 :                         goto _0c4a;
20922 :                       case 0x0040:
20923 :                         //^19F0:0C22
20924 :                         bp04 = i16(0xff82);
20925 :                         goto _0c4a;
20926 :                       case 0x0080:
20927 :                         //^19F0:0C29
20928 :                         bp04 = i16(0xff87);
20929 :                         goto _0c4a;
20930 :                       case 0x0100:
20931 :                         //^19F0:0C30
20932 :                         bp04 = i16(0xff86);
20933 :                         goto _0c4a;
20934 :                       case 0x0400:
20935 :                         //^19F0:0C37
20936 :                         bp04 = i16(0xff89);
20937 :                         goto _0c4a;
20938 :                       case 0x0800:
20939 :                         //^19F0:0C3E
20940 :                         bp04 = i16(0xff8a);
20941 :                         goto _0c4a;
20942 :                       case 0x0200:
20943 :                         bp04 = i16(0xff81);
20944 :                         //^19F0:0C4A
20945 : _0c4a:
20946 :                         _4976_4ece->b30 = U8(bp04);
20947 :                         _4976_4ece->b26 = (bp08 != 0) ? 0x28 : 0x27;
20948 :                         break;
20949 :                       case 0x0008:
20950 :                         //^19F0:0C65
20951 :                         _4976_4ece->b26 = (bp08 != 0) ? 0x0f : 0x0e;
20952 :                         break;
20953 :                     }
20954 :                     //^19F0:0C79
20955 :                     _4976_4ece->w24.SetX(di);
20956 :                     _4976_4ece->w24.SetY(tt);
20957 :                     _4976_4ece->w24.SetMap(_4976_0c5a);
20958 :                     //^19F0:0CB0
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 :                 //^19F0:0CCA
20966 :                 return 1;
20967 :               }
20968 :             }
20969 :           }
20970 :         }
20971 :       }
20972 :     }
20973 :     //^19F0:0CCF
20974 : _0ccf:
20975 :     if (bp02 != 0)
20976 :       _4976_4ee5 = 0xfd;
20977 :     return 0;
20978 :   }
20979 : 
20980 :   //^19F0:0547
20981 :   X16 _19f0_0547(ObjectID rl, X16 xx)
20982 :   {
20983 :     //^19F0:0547
20984 :     ENTER(0);
20985 :     //^19F0:054A
20986 :     return _1c9a_0006(rl, xx);
20987 :   }
20988 : 
20989 :   //^19F0:01D6
20990 :   U16 _19f0_01d6(i16 xx, i16 yy)
20991 :   {
20992 :     //^19F0:01D6
20993 :     ENTER(0);
20994 :     //^19F0:01D9
20995 :     if (_4976_0c5a == _4976_5232 && xx == _4976_5236 && yy == _4976_5238)
20996 :       //^19F0:01F4
20997 :       return 1;
20998 :     //^19F0:01F9
20999 :     return _19f0_00b8(xx, yy);
21000 :   }
21001 : 
21002 :   //^19F0:05E8
21003 :   i16 _19f0_05e8(X16 aa, skxxxb (*bb)[1][32], Ax3 *cc, i16 xx, i16 yy, i16 zz, X16 ww)
21004 :   {
21005 :     //^19F0:05E8
21006 :     ENTER(16);
21007 :     //^19F0:05EE
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 :     //^19F0:061D
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 :         //^19F0:062E
21022 :         bp02 += _4976_0232[si];
21023 :         di += _4976_023a[si];
21024 :         //^19F0:0641
21025 :         if (bp02 < 0 || bp02 >= _4976_4dd2 || di < 0 || di >= _4976_4dd4)
21026 :           //^19F0:0663
21027 :           continue;
21028 :         //^19F0:0666
21029 :         U8 bp0d = GET_TILE_VALUE(bp02, di);
21030 :         ObjectID bp10;
21031 :         if ((bp0d & 0x10) != 0) {
21032 :           //^19F0:067B
21033 :           if ((bp0d >> 5) == ttWall) {
21034 :             //^19F0:0687
21035 :             if (ww == 0)
21036 :               break;
21037 :             //^19F0:0690
21038 :             for (bp10 = GET_TILE_RECORD_LINK(bp02, di); bp10 != bp10.FFFE; bp10 = GET_NEXT_RECORD_LINK(bp10)) {
21039 :               //^19F0:069D
21040 :               if (bp10.DBType() == dbActuator || bp10.DBType() == dbText) {
21041 :                 //^19F0:06B9
21042 :                 if (bp10.Dir() == ((si +2) & 3)) {
21043 :                   //^19F0:06CB
21044 :                   U8 bp0e = QUERY_CLS2_FROM_RECORD(bp10);
21045 :                   if (bp0e != 0xff) {
21046 :                     //^19F0:06DB
21047 :                     if (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp0e, dtWordValue, 0xf0) == aa)
21048 :                       goto _0783;
21049 :                   }
21050 :                 }
21051 :               }
21052 :               //^19F0:06F3
21053 :             }
21054 :             //^19F0:0705
21055 :             continue;
21056 :           }
21057 :           //^19F0:0707
21058 :           if (ww == 0 && (_4976_4ee0 != bp02 || _4976_4ee1 != di) && (bp10 = GET_CREATURE_AT(bp02, di)) != ObjectID::FFFF) {
21059 :             //^19F0:0733
21060 :             if (_19f0_0547(bp10, aa) != 0)
21061 :               goto _0783;
21062 :           }
21063 :         }
21064 :         //^19F0:0743
21065 :         if (bb[bp02][di]->b0 != 0 || _19f0_01d6(bp02, di) != 0)
21066 :           break;
21067 :         //^19F0:0769
21068 :       }
21069 :       //^19F0:0777
21070 :       si++;
21071 :     } while (--bp08 >= 0);
21072 :     //^19F0:0780
21073 :     goto _088b;
21074 :     //^19F0:0783
21075 : _0783:
21076 :     bp08 = bb[xx][yy]->b0;
21077 :     si += 2;
21078 :     si &= 3;
21079 :     while (++bp04 < bp06) {
21080 :       //^19F0:07A6
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 :       //^19F0:07E1
21087 :       if (bp0d != 0 && bp0d <= bp08) {
21088 :         //^19F0:07F1
21089 :         if (_19f0_01d6(xx, yy) == 0)
21090 :           continue;
21091 :       }
21092 :       //^19F0:0801
21093 :       xx = bp0a;
21094 :       yy = bp0c;
21095 :       break;
21096 :       //^19F0:080F
21097 :     }
21098 :     //^19F0:081A
21099 :     si += 2;
21100 :     si &= 3;
21101 :     if (_19f0_0891((ww != 0) ? 3 : 2, xx, yy, bp02, di, si) != 0) {
21102 :       //^19F0:0848
21103 :       _19f0_045a(xx, yy);
21104 :       cc->SetX(bp02);
21105 :       cc->SetY(di);
21106 :       cc->SetMap(_4976_0c5a);
21107 :       //^19F0:0886
21108 :       return 1;
21109 :     }
21110 :     //^19F0:088B
21111 : _088b:
21112 :     return 0;
21113 :   }
21114 : 
21115 :   //^1C9A:1B16
21116 :   i16 _1c9a_1b16(X16 xx, X16 yy)
21117 :   {
21118 :     //^1C9A:1B16
21119 :     ENTER(6);
21120 :     //^1C9A:1B1C
21121 :     ObjectID si = _4976_521e;
21122 :     if (si == si.FFFF) {
21123 :       //^1C9A:1B26
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 :       //^1C9A:1B3A
21130 :       if (bp06 == dbText) {
21131 :         //^1C9A:1B40
21132 :         Text *bp04 = GET_ADDRESS_OF_RECORD2(si);
21133 :         //^1C9A:1B4D
21134 :         if (bp04->TextMode() == 2 && bp04->w2_c_f() == xx && bp04->w2_8_b() == yy) {
21135 :           //^1C9A:1B82
21136 :           return bp04->w2_3_7();  // TODO: Complex text use
21137 :         }
21138 :       }
21139 :       //^1C9A:1B89
21140 :     }
21141 :     //^1C9A:1BA7
21142 :     return -1;
21143 :   }
21144 : 
21145 :   //^1C9A:1A48
21146 :   i16 _1c9a_1a48(X16 xx, X16 yy)
21147 :   {
21148 :     //^1C9A:1A48
21149 :     ENTER(8);
21150 :     //^1C9A:1A4E
21151 :     X16 bp08 = (xx == 1) ? 2 : -1;
21152 :     //^1C9A:1A60
21153 :     ObjectID si = _4976_521e;
21154 :     if (si == si.FFFF) {
21155 :       //^1C9A:1A6D
21156 :       _4976_521e = GET_TILE_RECORD_LINK(_4976_5216, _4976_5218);
21157 :       si = _4976_521e;
21158 :     }
21159 :     //^1C9A:1A7F
21160 :     X16 bp06;
21161 :     for (; si != si.FFFE && (bp06 = si.DBType()) <= dbActuator; si = GET_NEXT_RECORD_LINK(si)) {
21162 :       //^1C9A:1A81
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 :             //^1C9A:1AE7
21171 :             return bp04->w2_3_7();
21172 :           }
21173 :         }
21174 :       }
21175 :       //^1C9A:1AEE
21176 :     }
21177 :     //^1C9A:1B0F
21178 :     return -1;
21179 :   }
21180 : 
21181 :   //^19F0:0081
21182 :   X16 _19f0_0081(i16 xx, i16 yy)
21183 :   {
21184 :     //^19F0:0081
21185 :     ENTER(0);
21186 :     //^19F0:0086
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 :   //^19F0:1511
21193 :   X16 _19f0_1511(ObjectID rl)
21194 :   {
21195 :     //^19F0:1511
21196 :     ENTER(0);
21197 :     //^19F0:1514
21198 :     return _1c9a_0006(rl, 9);
21199 :   }
21200 : 
21201 :   //^075F:1791
21202 :   X16 _075f_1791(ObjectID rlxx, ObjectID rlyy)
21203 :   {
21204 :     //^075F:1791
21205 :     ENTER(12);
21206 :     //^075F:1797
21207 :     Cloud *bp04 = GET_ADDRESS_OF_RECORDF(rlxx);
21208 :     i16 si = 0;
21209 :     U16 bp0a = bp04->CloudType();
21210 :     //^075F:17B5
21211 :     if (bp0a >= 8)
21212 :       return si;
21213 :     //^075F:17BD
21214 :     U8 bp0b = _4976_00b4[bp0a];
21215 :     if (bp0b == 0)
21216 :       return si;
21217 :     //^075F:17D0
21218 :     GenericRecord *bp08;
21219 :     U16 di;
21220 :     if (rlyy == rlyy.FFFF) {
21221 :       if ((bp0b & 4) == 0)
21222 :         return si;
21223 :     }
21224 :     else {
21225 :       //^075F:17E4
21226 :       di = rlyy.DBType();
21227 :       if (di == dbDoor && (bp0b & 2) != 0) {
21228 :         //^075F:17F9
21229 :         bp08 = GET_ADDRESS_OF_RECORD(rlyy);
21230 :       }
21231 :       else {
21232 :         //^075F:180A
21233 :         if (di != dbCreature)
21234 :           return si;
21235 :         //^075F:1812
21236 :         if ((bp0b & 8) == 0)
21237 :           return si;
21238 :       }
21239 :     }
21240 :     //^075F:1820
21241 :     if (di == dbCreature && (QUERY_CREATURE_AI_SPEC_FROM_RECORD(rlyy)->w24 & 0x1000) != 0 && bp0a != 0)
21242 :       return si;
21243 :     //^075F:1843
21244 :     si = bp04->b3_0_f();
21245 :     if ((bp0b & 1) != 0) {
21246 :       //^075F:1855
21247 :       si = (bp04->b3_0_f() >> 1) +1;
21248 :       si = RAND16(si) +si +1;
21249 :     }
21250 :     //^075F:186D
21251 :     switch (bp0a) {
21252 :       case 2:
21253 :         //^075F:187C
21254 :         si >>= 1;
21255 :         goto _187e;
21256 :       case 0:
21257 :         //^075F:187E
21258 : _187e:
21259 :         if (di == 0 && bp08->castToDoor()->DestroyablebyFireball() == 0)
21260 :           si = 0;
21261 :         break;
21262 :       case 3:
21263 :         //^075F:1897
21264 :         if ((_0cee_2de0(rlyy) & 0x20) == 0)
21265 :           si = 0;
21266 :         break;
21267 :       case 7:
21268 :         //^075F:18A9
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 :     //^075F:18E7
21280 :     return si;
21281 :   }
21282 : 
21283 :   //^19F0:13AA
21284 :   X16 _19f0_13aa(i16 xx, i16 yy)
21285 :   {
21286 :     //^19F0:13AA
21287 :     ENTER(10);
21288 :     //^19F0:13B0
21289 :     i16 bp08 = 0;
21290 :     do {
21291 :       //^19F0:13B5
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 :         //^19F0:1410
21294 :         i16 di = xx;
21295 :         i16 si = yy;
21296 :         for (i16 bp0a = 0; bp0a++ < 3; ) {
21297 :           //^19F0:141E
21298 :           di += _4976_0232[bp08];
21299 :           si += _4976_023a[bp08];
21300 :           //^19F0:1430
21301 :           if (di < 0 || di >= _4976_4dd2 || si < 0 || si >= _4976_4dd4)
21302 :             break;
21303 :           //^19F0:1450
21304 :           for (ObjectID bp06 = GET_WALL_TILE_ANYITEM_RECORD(di, si); bp06 != bp06.FFFE; bp06 = GET_NEXT_RECORD_LINK(bp06)) {
21305 :             //^19F0:145B
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 :                 //^19F0:14BA
21310 :                 return 1;
21311 :               }
21312 :             }
21313 :             //^19F0:14BF
21314 :           }
21315 :           //^19F0:14D1
21316 :           if (_4976_4ee0 != di || _4976_4ee1 != si) {
21317 :             //^19F0:14E3
21318 :             if (_19f0_00b8(di, si) != 0)
21319 :               continue;
21320 :           }
21321 :           //^19F0:14EF
21322 :         }
21323 :       }
21324 :       //^19F0:14FD
21325 :     } while (++bp08 < 4);
21326 :     //^19F0:150B
21327 :     return 0;
21328 :   }
21329 : 
21330 :   //^19F0:1522
21331 :   i16 _19f0_1522(X16 aa, i16 xx, i16 yy, i16 ss, i16 tt, i16 ww)
21332 :   {
21333 :     //^19F0:1522
21334 :     ENTER(50);
21335 :     //^19F0:1528
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 :     //^19F0:154B
21346 :     X16 bp1e = aa & 0x40;
21347 :     X16 bp20 = aa & 0x20;
21348 :     aa &= 0xff1f;
21349 :     //^19F0:1562
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 :       //^19F0:158F
21359 :       bp0c = tt;
21360 :       if (ww == 6) {
21361 :         //^19F0:159B
21362 :         bp18 = 0;
21363 :         bp0c = _4976_4ec6->b15 & 3;
21364 :         goto _1811;
21365 :       }
21366 :       //^19F0:15AE
21367 :       if (ww < 4)
21368 :         goto _17af;
21369 :       //^19F0:15B7
21370 :       bp18 = 0;
21371 :       if ((_4976_4eec & 0x2000) == 0)
21372 :         goto _1df6;
21373 :       //^19F0:15C7
21374 :       X16 si = 0;
21375 :       bp06 = GET_TILE_VALUE(xx, yy);
21376 :       GenericRecord *_bp2e;
21377 :       switch (bp06 >> 5) {
21378 :         case ttPit:
21379 :           //^19F0:15F2
21380 :           if (ww == 5 && (bp06 & 8) != 0 && (bp06 & 1) == 0) {
21381 :             //^19F0:1606
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 :           //^19F0:161F
21392 : _161f:
21393 :           if ((bp06 & 2) == 0)
21394 :             break;
21395 :           //^19F0:1629
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 :           //^19F0:1668
21403 :           bp08 = 0x37;
21404 :           si = 0x10;
21405 :           bp0c = _4976_4ec6->b15_0_2();
21406 :           break;
21407 :         case ttStairs:
21408 :           //^19F0:1680
21409 :           if ((bp06 & 4) != 0) {
21410 :             if (ww != 4)
21411 :               break;
21412 :             //^19F0:168D
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 :       //^19F0:16B7
21427 :       if ((_4976_4eec & si) == 0)
21428 :         goto _1df6;
21429 :       bp14 = _4976_0c5a;
21430 :       //^19F0:16C9
21431 :       i16 bp0e;
21432 :       if ((_bp2e != NULL) && (bp08 == 0x39 || bp08 == 0x3a)) {
21433 :         //^19F0:16DA
21434 :         Actuator *bp2e = _bp2e->castToActuator();
21435 :         xx = bp2e->Xcoord();
21436 :         yy = bp2e->Ycoord();
21437 :         bp0e = bp2e->ActuatorData();
21438 :       }
21439 :       else {
21440 :         //^19F0:1706
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 :           //^19F0:173F
21446 :           bp06 = _4976_4ca8[bp0e][xx][yy];
21447 :           if ((bp06 >> 5) != 2 || (bp06 & 8) == 0)
21448 :             goto _1df6;
21449 :         }
21450 :       }
21451 :       //^19F0:1778
21452 :       if (IS_CREATURE_ALLOWED_ON_LEVEL(_4976_4ec4, bp0e) == 0)
21453 :         goto _1df6;
21454 :       //^19F0:178D
21455 :       bp16 = 1;
21456 :       _1c9a_0648(bp0e);
21457 :       di = xx;
21458 :       tt = yy;
21459 :       yy = xx = -1;
21460 :       //^19F0:17AD
21461 :       goto _1811;
21462 :       //^19F0:17AF
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 :         //^19F0:17D8
21471 :         bp18 = (xx == di && yy == tt) ? 1 : 0;
21472 :         if (bp18 == 0 && ww == -1) {
21473 :           //^19F0:17F9
21474 :           ww = bp0c = CALC_VECTOR_DIR(xx, yy, di, tt);
21475 :         }
21476 :       }
21477 :       //^19F0:1811
21478 : _1811:
21479 :       if (di < 0 || di >= _4976_4dd2 || tt < 0 || tt >= _4976_4dd4)
21480 :         goto _1df6;
21481 :       //^19F0:1836
21482 :       if (bp28 != 0) {
21483 :         if (aa == 3) {
21484 :           //^19F0:1842
21485 :           bp1a = _19f0_0081(di, tt);
21486 :         }
21487 :         //^19F0:184C
21488 :         else if (aa == 7) {
21489 :           bp1a = !_19f0_000a(di, tt);
21490 :         }
21491 :         //^19F0:1864
21492 :         if (bp1a == 0)
21493 :           goto _1df6;
21494 :         //^19F0:186D
21495 :         _19f0_045a(di, tt);
21496 :         goto _1df6;
21497 :       }
21498 :       //^19F0:187A
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 :         //^19F0:18BC
21503 :         if ((aa == 4 || aa == 5) && (_4976_4eca->b2 == 0xff))
21504 :           //^19F0:18D3
21505 :           aa = 0;
21506 :         //^19F0:18D8
21507 :         bp06 = _4976_521c;
21508 :         switch (bp06 >> 5) {
21509 :           case ttWall: // 0
21510 :             //^19F0:18F4
21511 :             si = 1;
21512 :             break;
21513 :           case ttFloor: // 1
21514 :             //^19F0:18FA
21515 :             goto _1a94;
21516 :           case ttPit: // 2
21517 :             //^19F0:18FD
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: // 3:
21533 :             //^19F0:1929
21534 :             si = 0x100;
21535 :             break;
21536 :           case ttDoor: // 4:
21537 :             {
21538 :             //^19F0:192F
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 :             //^19F0:195B
21547 :             if (_4976_521e == ObjectID::FFFF) {
21548 :               //^19F0:1962
21549 :               _4976_521e = GET_TILE_RECORD_LINK(di, tt);
21550 :             }
21551 :             Door *bp04 = GET_ADDRESS_OF_RECORD0(_4976_521e);
21552 :             if (bp1e != 0) {
21553 :               //^19F0:1986
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 :             //^19F0:19AD
21562 :             if (bp04->b3_2_2() != 0 && bp04->b3_1_1() == 0) {
21563 :               si = 0x200;
21564 :               break;
21565 :             }
21566 :             //^19F0:19D1
21567 :             if (((bp04->OpeningDir() != 0) ? _4976_4eca->w0_6_7() : 1) < bp06) {
21568 :               //^19F0:19F9
21569 : _19f9:
21570 :               si = 0x4200;
21571 :               break;
21572 :             }
21573 :             //^19F0:19FF
21574 :             si = 2;
21575 :             break;
21576 :             }
21577 :           case ttTeleporter: // 5:
21578 :             {
21579 :             //^19F0:1A05
21580 :             if ((bp06 & 8) == 0) {
21581 :               if (GET_TELEPORTER_DETAIL(&_4976_5226, U8(di), U8(tt)) != 0) {
21582 :                 //^19F0:1A20
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 :               //^19F0:1A42
21590 :               si = 0x402;
21591 :               break;
21592 :             }
21593 :             //^19F0:1A47
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 :               //^19F0:1A83
21600 :               si = 0x400;
21601 :               break;
21602 :             }
21603 :             //^19F0:1A88
21604 :             si = 2;
21605 :             break;
21606 :             }
21607 :           case ttTrickWall: // 6:
21608 :             {
21609 :             //^19F0:1A8D
21610 :             if ((bp06 & 4) != 0) {
21611 : _1a94:
21612 :               si = 2;
21613 :               break;
21614 :             }
21615 :             //^19F0:1A99
21616 :             if ((bp06 & 1) != 0) {
21617 :               si = 0x80;
21618 :               break;
21619 :             }
21620 :             //^19F0:1AA5
21621 :             si = 0x40;
21622 :             break;
21623 :             }
21624 :           case 7:
21625 :             goto _1df6;
21626 :         }
21627 :         //^19F0:1AA8
21628 :         si &= _4976_4eec;
21629 :         if (si != 0) {
21630 :           //^19F0:1AB5
21631 :           if (aa == 1 || ABS16(di - _4976_5236) + ABS16(tt - _4976_5238) > 1) {
21632 :             //^19F0:1AE2
21633 :             X16 bp0a;
21634 :             bp0a = 0;
21635 :             if (_4976_0c5a == _4976_5232 && di == _4976_5236 && tt == _4976_5238)
21636 :               bp0a = 0x800;
21637 :             //^19F0:1B04
21638 :             if (bp18 == 0) {
21639 :               ObjectID bp12;
21640 :               bp12 = _19f0_050f();
21641 :               if (bp12 != bp12.FFFE) {
21642 :                 //^19F0:1B16
21643 :                 if (bp1e == 0 || QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp12)->w10 == 0) {
21644 :                   //^19F0:1B30
21645 :                   if (bp20 == 0 || bp16 != 0 || (bp22 = _19f0_1511(bp12)) == 0) {
21646 :                     //^19F0:1B4B
21647 :                                         bp0a |= 0x1000;
21648 :                   }
21649 :                 }
21650 :               }
21651 :             }
21652 :             //^19F0:1B50
21653 :             if ((bp0a & _4976_4eec) == bp0a) {
21654 :               if (aa == 4 || aa == 5) {
21655 :                 //^19F0:1B6E
21656 :                 ObjectID bp12;
21657 :                 for (bp12 = _19f0_04bf(); bp12 != bp12.FFFE; bp12 = GET_NEXT_RECORD_LINK(bp12)) {
21658 :                   //^19F0:1B75
21659 :                   X16 bp10 = 0;
21660 :                   bp06 = bp12.DBType();
21661 :                   if (bp06 == dbCloud) {
21662 :                     //^19F0:1B8B
21663 :                     U16 bp26 = GET_ADDRESS_OF_RECORDF(bp12)->CloudType();
21664 :                     if (bp26 == 7) {
21665 :                       //^19F0:1BA7
21666 :                       bp10 = _075f_1791(bp12, _4976_4ec4);
21667 :                     }
21668 :                     else {
21669 :                       //^19F0:1BB7
21670 :                       if (bp26 == 14)
21671 :                         bp24 = 1;
21672 :                     }
21673 :                   }
21674 :                   //^19F0:1BC4
21675 :                   else  if (bp06 == dbMissile) {
21676 :                     //^19F0:1BCA
21677 :                     if (_4976_4ee0 != di || _4976_4ee1 != tt) {
21678 :                       //^19F0:1BDD
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 :                         //^19F0:1C1E
21683 :                         bp10 = _075f_06bd(bp04, bp04->GetMissileObject());
21684 :                       }
21685 :                     }
21686 :                   }
21687 :                   //^19F0:1C36
21688 :                   if (bp10 != 0)
21689 :                     goto _1df6;
21690 :                   //^19F0:1C3F
21691 :                 }
21692 :                 //^19F0:1C54
21693 :                 if (aa == 5 && bp24 == 0 && _19f0_13aa(di, tt) != 0)
21694 :                   goto _1df6;
21695 :               }
21696 :               //^19F0:1C71
21697 :               bp1a = 1;
21698 :               if (bp16 != 0 || si == 0x400) {
21699 :                 //^19F0:1C85
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 :                 //^19F0:1CB8
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 :                     //^19F0:1CDF
21708 :                     bp1a = 0;
21709 :                     goto _1df6;
21710 :                   }
21711 :                   //^19F0:1CE7
21712 :                   _1c9a_0648(_4976_581c);
21713 :                 }
21714 :                 //^19F0:1CF1
21715 :                 bp1a = _19f0_1522(aa | bp1e, _4976_5826, _4976_5828, _4976_5826, _4976_5828, 6);
21716 :                 _1c9a_0648(bp0e);
21717 :                 goto _1df6;
21718 :               }
21719 :               //^19F0:1D20
21720 :               if (bp18 == 0) {
21721 :                 //^19F0:1D29
21722 :                 if (si == 0x4000) {
21723 :                   return _19f0_0d10(bp1c, xx, yy, di, tt, bp0c);
21724 :                 }
21725 :                 //^19F0:1D4A
21726 :                 if ((si & 0x8000) != 0) {
21727 :                   if (aa == 6) {
21728 :                     //^19F0:1D60
21729 :                     bp0a = _4976_4eec;
21730 :                     _4976_4eec &= 0x7DB7;
21731 :                     //^19F0:1D6C
21732 :                     bp1a = _19f0_1522(aa | bp1e, di, tt, di + _4976_0232[bp0c], tt + _4976_023a[bp0c], bp0c);
21733 :                     _4976_4eec = bp0a;
21734 :                   }
21735 :                   //^19F0:1DA3
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 :                   //^19F0:1DEB
21744 :                   if (bp1a == 0)
21745 :                     _4976_5224 = 1;
21746 :                 }
21747 :               }
21748 :             }
21749 :           }
21750 :         }
21751 :       }
21752 :     }
21753 :     //^19F0:1DF6
21754 : _1df6:
21755 :     if (bp1c != 0 && bp1a != 0 && bp18 == 0 && (bp22 == 0 || _19f0_0891(0x82, xx, yy, di, tt, -1) == 0)) {
21756 :       //^19F0:1E3E
21757 :       if ((_4976_4ef0 & 0x20) == 0) {
21758 :         //^19F0:1E46
21759 :         for (bp06 = 0; bp06 <= 3; bp06++) {
21760 :           //^19F0:1E4D
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 :               //^19F0:1E89
21766 :               if (_19f0_0d10(0x82, xx, yy, bp30, bp32, bp06) != 0)
21767 :                 goto _1ff2;
21768 :             }
21769 :           }
21770 :           //^19F0:1EA9
21771 :         }
21772 :       }
21773 :       //^19F0:1EB2
21774 :       if (aa == 6) {
21775 :         bp0c += 2;
21776 :         bp0c &= 3;
21777 :         bp08 = 9;
21778 :       }
21779 :       //^19F0:1EC8
21780 :       else if (bp08 == -1) {
21781 :         bp08 =(ABS16(xx -di) + ABS16(yy -tt) <= 1) ? 2 : 1;
21782 :       }
21783 :       //^19F0:1EFC
21784 :       bp06 = _4976_4ec6->b15_0_2();
21785 :       if (bp06 != bp0c) {
21786 :         //^19F0:1F0F
21787 :         if (((bp0c +2) & 3) == bp06 || bp08 != 2) {
21788 :           //^19F0:1F22
21789 :           if ((aa == 4 || aa == 5) && (_4976_3752[_4976_4efa] & 0x100) == 0 && RAND02() != 0) {
21790 :             //^19F0:1F45
21791 :             bp08 = 9;
21792 :           }
21793 :           else {
21794 :             //^19F0:1F4C
21795 :             _19f0_0559(bp0c);
21796 :             goto _1ff2;
21797 :           }
21798 :         }
21799 :       }
21800 :       //^19F0:1F57
21801 :       if (bp06 != bp0c && bp08 != 9) {
21802 :         //^19F0:1F65
21803 :         bp08 = ((bp06 & 3) == bp0c) ? 4 : 3;
21804 :       }
21805 :       //^19F0:1F7C
21806 :       else if ((_4976_37a6[_4976_4ee4] & 2) != 0 && aa != 6 && bp16 == 0) {
21807 :         bp08 = 0;
21808 :       }
21809 :       //^19F0:1F9A
21810 :       _4976_4ece->w24.SetX(di);
21811 :       _4976_4ece->w24.SetY(tt);
21812 :       _4976_4ece->w24.SetMap(_4976_0c5a);
21813 :       //^19F0:1FD1
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 :     //^19F0:1FF2
21821 : _1ff2:
21822 :     if (bp16 != 0)
21823 :       _1c9a_0648(bp14);
21824 :     //^19F0:2001
21825 :     return bp1a;
21826 :   }
21827 : 
21828 :   //^19F0:050F
21829 :   ObjectID _19f0_050f()
21830 :   {
21831 :     //^19F0:050F
21832 :     ENTER(0);
21833 :     //^19F0:0513
21834 :     ObjectID si = _4976_5222;
21835 :     if (si == si.FFFF) {
21836 :       //^19F0:051D
21837 :       for (si = _19f0_04bf(); si != si.FFFE && si.DBType() != dbCreature; si = GET_NEXT_RECORD_LINK(si));
21838 :             //^19F0:053E
21839 :       _4976_5222 = si;
21840 :     }
21841 :     //^19F0:0542
21842 :     return si;
21843 :   }
21844 : 
21845 :   //^1C9A:0006
21846 :   X16 _1c9a_0006(ObjectID rl, U16 xx)
21847 :   {
21848 :     //^1C9A:0006
21849 :     ENTER(14);
21850 :     //^1C9A:000C
21851 :     U16 si = xx;
21852 :     U16 di = si & 0x80;
21853 :     si &= 0x3f;
21854 :     if (si == 0xffff || si == 0xfffe)
21855 :       return 0;
21856 :     //^1C9A:002C
21857 :     if (si == 0x3f)
21858 :       goto _0238;
21859 :     //^1C9A:0034
21860 :     if (si == 0x3e) {
21861 :       //^1C9A:0039
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 :     //^1C9A:006E
21870 :     if (si == 0x29) {
21871 :       //^1C9A:0073
21872 :       if (IS_CONTAINER_MONEYBOX(rl) != 0) {
21873 :         //^1C9A:0080
21874 :         if (GET_ADDRESS_OF_RECORD9(rl)->b7_2_2() != 0) {
21875 :           return !di;
21876 :         }
21877 :         return di;
21878 :       }
21879 :       //^1C9A:00A2
21880 :       si = 7;
21881 :     }
21882 :     //^1C9A:00A5
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 :         //^1C9A:00D0
21892 :         if (IS_CONTAINER_MONEYBOX(rl) != 0 && GET_ADDRESS_OF_RECORD9(rl)->b7_2_2() == 0) {
21893 :           goto _0238;
21894 :         }
21895 :         //^1C9A:00FB
21896 :         si = 0x10;
21897 :       }
21898 :       //^1C9A:00FE
21899 :       si = _4976_4ec6->w8 * 3 +si;
21900 :     }
21901 :     //^1C9A:0111
21902 :     U8 *bp04 = _4976_5164[si];
21903 :     if (bp04 == 0) {
21904 :       //^1C9A:0128
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 :     //^1C9A:0173
21912 :     i16 bp0c;
21913 :     if (bp0e == dbCreature) {
21914 :       bp0c = GET_ADDRESS_OF_RECORD4(rl)->CreatureType();
21915 :       goto _0219;
21916 :     }
21917 :     //^1C9A:0192
21918 :     Actuator *bp08;
21919 :     if (bp0e == dbActuator) {
21920 :       bp08 = GET_ADDRESS_OF_RECORD3(rl);
21921 :       switch (bp08->ActuatorType()) {
21922 :         case 0x1b: // 0x1b -> '?'
21923 :           //^1C9A:01BD
21924 :           if (bp08->ActuatorData() == 0)
21925 :             return 0;
21926 :           goto _01d1;
21927 :         case 0x1a: // 0x1a -> 'Activator, key hole'
21928 :           //^1C9A:01D1
21929 : _01d1:
21930 :           bp0c = QUERY_GDAT_ENTRY_DATA_INDEX(0x09, GET_WALL_DECORATION_OF_ACTUATOR(bp08), dtWordValue, 0x0e);
21931 :           goto _0219;
21932 :         default:
21933 :           //^1C9A:01EF
21934 :           bp0c = bp08->ActuatorType();
21935 :           goto _0219;
21936 :       }
21937 :     }
21938 :     //^1C9A:01FE
21939 :     if (bp0e >= dbWeapon && bp0e <= dbMiscellaneous_item) {
21940 :       //^1C9A:020A
21941 :       bp0c = GET_DISTINCTIVE_ITEMTYPE(rl);
21942 :       goto _0219;
21943 :     }
21944 :     //^1C9A:0216
21945 :     return 0;
21946 :     //^1C9A:0219
21947 : _0219:
21948 :     if ((bp04[bp0c >> 3] & (1 << (bp0c & 7))) != 0) {
21949 :       //^1C9A:0238
21950 : _0238:
21951 :       return !di;
21952 :     }
21953 :     //^1C9A:0241
21954 :     return di;
21955 :   }
21956 :   //^1C9A:19D4
21957 :   void _1c9a_19d4(ObjectID rl, i16 xx, i16 yy, U16 ww)
21958 :   {
21959 :     //^1C9A:19D4
21960 :     ENTER(0);
21961 :     //^1C9A:19D9
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 :       //^1C9A:19FB
21983 :       _13e4_0401(rl, xx, yy, (di != 0) ? ((si -6)|0x8000) : (si -6), 0x64, 0);
21984 :     }
21985 :     //^1C9A:1A24
21986 :     return;
21987 :   }
21988 :   //^24A5:036A
21989 :   void _24a5_036a(i16 aa, U16 bb, i16 xx, i16 yy, U16 ww)
21990 :   {
21991 :     //^24A5:036A
21992 :     ENTER(46);
21993 :     //^24A5:0370
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://^03A4
22008 :         //^24A5:03A4
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 :           //^24A5:0408
22022 :           bp1e = BETWEEN_VALUE(0, _4976_5c63 + _4976_5c68, 5);
22023 :           bp12 = (_4976_3d44[bp1e] * si) / 0x64 +bp12;
22024 :           break;
22025 :         }
22026 :         //^24A5:043F
22027 :         if (bp10 != 0 && (bp16 >> 8) == 0)
22028 :           break;
22029 :         //^24A5:0452
22030 :         di += si;
22031 :         break;
22032 :       case 1://^0457
22033 :       case 2://^0457
22034 :       case 5://^0457
22035 :       case 16://^0457
22036 :       case 17://^0457
22037 :       case 18://^0457
22038 :       case 19://^0457
22039 :         //^24A5:0457
22040 :         if ((ww & 1) == 0)
22041 :           break;
22042 :         if (bp2e.w0() != 1 && bp2e.w0() != 2 && bp2e.w0() != 5)
22043 :           goto _0519;
22044 :         //^24A5:0476
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 :         //^24A5:04BA
22055 :         TELE_inf bp1c;
22056 :         if (GET_TELEPORTER_DETAIL(&bp1c, U8(xx), U8(yy)) != 0) {
22057 :           //^24A5:04D1
22058 :           bp1e = BETWEEN_VALUE(0, _4976_5c63 + _4976_5c68, 5);
22059 :           bp0a = (_4976_3d44[bp1e] * si) / 0x64 +bp12;
22060 :         }
22061 :         else {
22062 :           //^24A5:0507
22063 :           if (bp10 == 0 || (bp16 >> 8) != 0)
22064 :             di += si;
22065 :           //^24A5:0519
22066 : _0519:
22067 :           bp0a = bp2e.w4();
22068 :         }
22069 :         for (; bp0a != bp0a.FFFE; bp0a = GET_NEXT_RECORD_LINK(bp0a)) {
22070 :           //^24A5:051F
22071 :           bp0e = bp0a.DBType();
22072 :           if (bp0e == dbCloud) {
22073 :             //^24A5:0530
22074 :             Cloud *bp04 = GET_ADDRESS_OF_RECORDF(bp0a);
22075 :             if (bp04->CloudType() != 2 && bp04->CloudType() != 0 && bp04->CloudType() != 0x30)
22076 :               continue;
22077 :             //^24A5:0565
22078 :             bp14 = (bp04->b3_0_f() >> 1) +bp14;
22079 :             continue;
22080 :           }
22081 :           //^24A5:057B
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 :           //^24A5:05A9
22089 :         }
22090 :         //^24A5:05BE
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://^05EE
22100 :       case 4://^05EE
22101 :       case 6://^05EE
22102 :       case 7://^05EE
22103 :       case 8://^05EE
22104 :       case 9://^05EE
22105 :       case 10://^05EE
22106 :       case 11://^05EE
22107 :       case 12://^05EE
22108 :       case 13://^05EE
22109 :       case 14://^05EE
22110 :       case 15://^05EE
22111 :         break;
22112 :     }
22113 :     //^24A5:05EE
22114 :     if (aa <= 8 && aa != 0) {
22115 :       bp12 = max_value(3, bp12 - _4976_3d5b[aa]);
22116 :     }
22117 :     else {
22118 :       bp12 = 0;
22119 :     }
22120 :     //^24A5:061A
22121 :     if (aa > 5)
22122 :       aa = 5;
22123 :     //^24A5:0625
22124 :     if (di != 0) {
22125 :       //^24A5:0629
22126 :       di = max_value(2, di - _4976_3d6d[aa]);
22127 :     }
22128 :     //^24A5:0640
22129 :     _4976_52d4 += di + bp12;
22130 :     if (bp14 != 0) {
22131 :       //^24A5:064F
22132 :       bp14 = max_value(2, bp14 - _4976_3d6d[aa]);
22133 :     }
22134 :     //^24A5:0668
22135 :     _4976_52d6 += bp14;
22136 :     //^24A5:066F
22137 :     return;
22138 :   }
22139 :               U16 _19f0_2813(U16 ww, i16 xx, i16 yy, i16 ss, i16 tt, i16 aa, U16 bb); // TODO: Unreachable
22140 :   //^19F0:0D10
22141 :   U16 _19f0_0d10(U16 ww,i16 xx,i16 yy,i16 ss,i16 tt,i16 aa)
22142 :   {
22143 :     //^19F0:0D10
22144 :     ENTER(32);
22145 :     //^19F0:0D16
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 :     //^19F0:0D46
22154 :     if (si == 0)
22155 :       goto _123a;
22156 :         //^19F0:0D4F
22157 :     if (di == -1) {
22158 :       //^19F0:0D54
22159 :       di = xx + _4976_0232[aa];
22160 :       tt = yy + _4976_023a[aa];
22161 :     }
22162 :     //^19F0:0D73
22163 :     else if (aa == -1) {
22164 :       //^19F0:0D79
22165 :       aa = CALC_VECTOR_DIR(xx, yy, di, tt);
22166 :     }
22167 :     //^19F0:0D90
22168 :     else if (xx == di && yy == tt) {
22169 :       goto _123a;
22170 :     }
22171 :     //^19F0:0DA0
22172 :     if (di < 0 || di >= _4976_4dd2 || tt < 0 || tt >= _4976_4dd4)
22173 :       goto _123a;
22174 :     //^19F0:0DC5
22175 :     if ((xx -di) != 0 && (yy -tt) != 0)
22176 :       goto _123a;
22177 :     //^19F0:0DD7
22178 :     _19f0_045a(di, tt);
22179 :     if ((_4976_521c >> 5) != 4)
22180 :       goto _123a;
22181 :     X16 bp0a = (_4976_521c & 7);
22182 :     //^19F0:0DF8
22183 :     if (ww == 0) {
22184 :       if (bp0a == 0) {
22185 : _0e04:
22186 :         bp06 = 1;
22187 :         goto _108f;
22188 :       }
22189 :     }
22190 :     //^19F0:0E0C
22191 :     else if (bp0a == 5) {
22192 :       goto _123a;
22193 :     }
22194 :     //^19F0:0E15
22195 :     else if (bp0a == 4) {
22196 :       goto _0e04;
22197 :     }
22198 :     //^19F0:0E1D
22199 :     if (_4976_521e == ObjectID::FFFF) {
22200 :       //^19F0:0E24
22201 :       _4976_521e = GET_TILE_RECORD_LINK(di, tt);
22202 :     }
22203 :     //^19F0:0E32
22204 :     Door *bp04 = GET_ADDRESS_OF_RECORD0(_4976_521e);
22205 :     if (ww == 2 && bp04->b3_4_4() == 0)
22206 :       goto _123a;
22207 :     //^19F0:0E5C
22208 :     if (bp04->b3_2_2() != 0) {
22209 :       //^19F0:0E6D
22210 :       if (bp04->b3_1_1() != 0) {
22211 :         if (ww == 0)
22212 :           goto _104f;
22213 :       }
22214 :       //^19F0:0E83
22215 :       else if (ww != 0) {
22216 :         goto _104f;
22217 :       }
22218 :       //^19F0:0E8C
22219 :       else if ((si &= 0xfff3) == 0) {
22220 :         goto _123a;
22221 :       }
22222 :     }
22223 :     //^19F0:0E99
22224 :     i16 bp08 = CALC_SQUARE_DISTANCE(xx, yy, di, tt);
22225 :     if (bp08 == 1) {
22226 :       //^19F0:0EB3
22227 :       if ((si & 3) != 0) {
22228 :         //^19F0:0EB9
22229 :         if (bp04->Button() != 0)
22230 :           goto _0f9d;
22231 :         //^19F0:0ECD
22232 :         if (bp04->b3_5_5() != 0)
22233 :           goto _0f9d;
22234 :       }
22235 :       //^19F0:0EDE
22236 :       if (ww == 0) {
22237 :         //^19F0:0EE4
22238 :         if ((si & 4) != 0 && bp04->DestroyablebyFireball() != 0)
22239 :           goto _0f9d;
22240 :         //^19F0:0EFE
22241 :         if ((si & 8) != 0 && bp04->BashablebyChopping() != 0)
22242 :           goto _0f9d;
22243 :       }
22244 :       //^19F0:0F15
22245 :       if ((si & 0x40) != 0)
22246 :         goto _0f9d;
22247 :       goto _123a;
22248 :     }
22249 :     //^19F0:0F21
22250 :     if (_4976_4eca->w20_c_f() < bp08)
22251 :       goto _123a;
22252 :     //^19F0:0F34
22253 :     if ((si & 1) != 0) {
22254 :       if (bp04->Button() != 0 || bp04->b3_5_5() != 0)
22255 :         goto _0f7f;
22256 :     }
22257 :     //^19F0:0F59
22258 :     if (ww != 0 || (si & 4) == 0)
22259 :       goto _123a;
22260 :     //^19F0:0F6B
22261 :     if (bp04->DestroyablebyFireball() == 0)
22262 :       goto _123a;
22263 :     //^19F0:0F7F
22264 : _0f7f:
22265 :     if (_19f0_0207(xx, yy, di, tt, _19f0_00b8) == 0)
22266 :       goto _123a;
22267 :     //^19F0:0F9D
22268 : _0f9d:
22269 :     if ((si & 1) != 0) {
22270 :       //^19F0:0FA6
22271 :       i16 bp10 = xx;
22272 :       i16 bp12 = yy;
22273 :       i16 bp14 = bp08;
22274 :       for (; bp14 >= 0; ) {
22275 :         //^19F0:0FBB
22276 :         for (bp18 = GET_WALL_TILE_ANYITEM_RECORD(bp10, bp12); bp18 != bp18.FFFE; bp18 = GET_NEXT_RECORD_LINK(bp18)) {
22277 :           //^19F0:0FCB
22278 :           U16 bp16 = bp18.DBType();
22279 :           if (bp16 == dbMissile) {
22280 :             //^19F0:0FDC
22281 :             Missile *bp1c = GET_ADDRESS_OF_RECORDE(bp18);
22282 :             //^19F0:0FEB
22283 :             if (bp1c->GetMissileObject() != ObjectID::FF8D && bp1c->GetMissileObject() != ObjectID::FF84)
22284 :               continue;
22285 :             //^19F0:0FFC
22286 :             if (_4976_5c20[bp1c->TimerIndex()].b9_2_3() != aa)
22287 :               continue;
22288 :             goto _104f;
22289 :           }
22290 :           //^19F0:101F
22291 :           else if (bp16 == dbCloud) {
22292 :             //^19F0:1025
22293 :             Cloud *bp20 = GET_ADDRESS_OF_RECORDF(bp18);
22294 :             if (bp20->CloudType() != 13 && bp20->CloudType() != 4)
22295 :               continue;
22296 :             //^19F0:104F
22297 : _104f:
22298 :             bp06 = 2;
22299 :             goto _108f;
22300 :           }
22301 :           //^19F0:1056
22302 :         }
22303 :         //^19F0:106B
22304 :         bp10 += _4976_0232[aa];
22305 :         bp12 += _4976_023a[aa];
22306 :         bp14--;
22307 :         //^19F0:1086
22308 :       }
22309 :     }
22310 :     //^19F0:108F
22311 : _108f:
22312 :     if (bp06 != 0 && ww == 2)
22313 :       goto _123a;
22314 :     if (bp0e == 0)
22315 :       goto _1235;
22316 :     //^19F0:10A7
22317 :     if (aa == -1) {
22318 :       aa = CALC_VECTOR_DIR(xx, yy, di, tt);
22319 :     }
22320 :     //^19F0:10C2
22321 :     if (bp06 == 1) {
22322 :       //^19F0:10C8
22323 :       _4976_4ee5 = 0xfe;
22324 :       goto _1235;
22325 :     }
22326 :     //^19F0:10D0
22327 :     if (bp06 == 2) {
22328 :       _4976_4ece->b26 = 0;
22329 :       goto _1230;
22330 :     }
22331 :     //^19F0:10E2
22332 :     if (_19f0_0559(aa) != 0)
22333 :       goto _1235;
22334 :     //^19F0:10F1
22335 :     if ((si & 0x20) != 0) {
22336 :       si &= 0xffdf;
22337 :       if (ww == 0) {
22338 :         //^19F0:1101
22339 :         bp04->b3_4_4(1);
22340 :       }
22341 :     }
22342 :     //^19F0:1109
22343 :     if (bp08 > 1)
22344 :       si &= 5;
22345 :     //^19F0:1113
22346 :     if ((si & 0x42) != 0) {
22347 :       if ((si & 0xffbd) == 0 || RAND02() == 0) {
22348 :         //^19F0:1128
22349 :         _4976_4ece->b26 = 0xb;
22350 :         goto _11d2;
22351 :       }
22352 :     }
22353 :     //^19F0:1134
22354 :     if ((si & 1) != 0) {
22355 :       //^19F0:113A
22356 :       if ((si & 0xffbc) == 0 || RAND02() == 0) {
22357 :         //^19F0:1149
22358 :         _4976_4ece->b26 = (RAND01() != 0) ? 0x28 : 0x27;
22359 :         //^19F0:1160
22360 :         _4976_4ece->b30 = (ww == 0) ? 0x8d : 0x84;
22361 :         goto _11d2;
22362 :       }
22363 :     }
22364 :     //^19F0:1176
22365 :     U16 bp0c = _4976_4eee;
22366 :     if ((si & 8) != 0 && (bp0c & 1) != 0 && ((si & 0xffb4) == 0 || RAND01() != 0)) {
22367 :       //^19F0:1198
22368 :       _4976_4eee &= 1;
22369 :       goto _11af;
22370 :     }
22371 :     //^19F0:11A0
22372 :     if ((si & 4) == 0)
22373 :       goto _123a;
22374 :     //^19F0:11A9
22375 :     _4976_4eee &= 0x50;
22376 :     //^19F0:11AF
22377 : _11af:
22378 :     si = _19f0_0891(0x84, xx, yy, di, tt, aa);
22379 :     _4976_4eee = bp0c;
22380 :     //^19F0:11CE
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 :     //^19F0:1230
22390 : _1230:
22391 :     _4976_4ee5 = 0xfc;
22392 :     //^19F0:1235
22393 : _1235:
22394 :     return 1;
22395 : _123a:
22396 :     if (bp0e != 0)
22397 :       _4976_4ee5 = 0xfd;
22398 :     return 0;
22399 :   }
22400 : 
22401 :   //^0CEE:3275
22402 :   X16 _0cee_3275(U8 xx)
22403 :   {
22404 :     //^0CEE:3275
22405 :     ENTER(0);
22406 :     //^0CEE:3278
22407 :     return QUERY_GDAT_ENTRY_DATA_INDEX(0x0e, xx, dtWordValue, 0x0d);
22408 :   }
22409 : 
22410 :   //^19F0:000A
22411 :   U16 _19f0_000a(i16 xx, i16 yy)
22412 :   {
22413 :     //^19F0:000A
22414 :     ENTER(6);
22415 :     //^19F0:000F
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 :       //^19F0:0066
22423 :       return 0;
22424 :     }
22425 :     //^19F0:006A
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); // TODO: Unreachable
22435 : 
22436 :   //^1C9A:1BD8
22437 :   U16 _1c9a_1bd8(i16 xx, i16 yy, U16 aa, U16 bb, i16 cc, skxxx9 *ss, skxxxc *tt)
22438 :   {
22439 :     //^1C9A:1BD8
22440 :     ENTER(132);
22441 :     //^1C9A:1BDE
22442 :     skxxx9 *bp0c = ss;
22443 :     //^1C9A:1BEC
22444 :     if (bp0c->b7 == 0) {
22445 :       //^1C9A:1BF5
22446 :       bp0c->w2.SetX(xx);
22447 :       //^1C9A:1C07
22448 :       bp0c->w2.SetY(yy);
22449 :       //^1C9A:1C1A
22450 :       bp0c->w2.SetMap(_4976_0c5a);
22451 :       //^1C9A:1C2C
22452 :       bp0c->w4 = bp0c->w2;
22453 :       //^1C9A:1C34
22454 :       bp0c->b6 = 0;
22455 :       //^1C9A:1C39
22456 :       return 0;
22457 :     }
22458 :     //^1C9A:1C3E
22459 :     U32 bp64 = U32(cc) << 2;
22460 :     //^1C9A:1C4F
22461 :     skxxxa *bp22 = reinterpret_cast<skxxxa *>(ALLOC_MEMORY(bp64, afZeroMem, 1024));
22462 :     //^1C9A:1C69
22463 :     U8 (*bp08)[4] = (U8 (*)[4])ALLOC_MEMORY(1024, afDefault, 1024);
22464 :     //^1C9A:1C81
22465 :     U32 bp6c = _4976_4d0e->nMaps << 2;
22466 :     //^1C9A:1C96
22467 :     skxxxb (**bp1a)[1][32] = reinterpret_cast<skxxxb (**)[1][32]>(ALLOC_MEMORY(bp6c, afZeroMem, 1024));
22468 :     //^1C9A:1CB0
22469 :     U32 bp68;
22470 :     bp68 = bp6c = _4976_4d0e->nMaps << 1;
22471 :     //^1C9A:1CCA
22472 :     i16 *bp1e = reinterpret_cast<i16 *>(ALLOC_MEMORY(bp68, afDefault, 1024));
22473 :     //^1C9A:1CE3
22474 :     U8 bp56 = 0;
22475 :     //^1C9A:1CE8
22476 :     _0cd5_0039(bp1e, _4976_4d0e->nMaps, -1, 2);
22477 :     //^1C9A:1D05
22478 :     bp68 = (U32(_4976_4dd2) << 5) << 2;
22479 :     //^1C9A:1D1D
22480 :     skxxxb (*bp04)[1][32] = reinterpret_cast<skxxxb (*)[1][32]>(ALLOC_MEMORY(bp68, afDefault, 1024));
22481 :     //^1C9A:1D36
22482 :     U16 bp48 = _4976_0c5a;
22483 :     //^1C9A:1D3C
22484 :     bp1a[0] = (skxxxb (*)[1][32])bp04;
22485 :     //^1C9A:1D51
22486 :     bp6c += bp64 +bp68 +1024;
22487 :     //^1C9A:1D6A
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 :     //^1C9A:1D84
22495 :     skxxxa *bp10 = bp22;
22496 :     //^1C9A:1D90
22497 :     bp0c = ss;
22498 :     //^1C9A:1D9C
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 :       //^1C9A:1DA1
22510 :       bp0c->b6 = -1;
22511 :       //^1C9A:1DA9
22512 :       bp10->b0 =  bp0c->b12       & 31;
22513 :       //^1C9A:1DB6
22514 :       bp10->b1 = (bp0c->b12 >> 5) & 31;
22515 :       //^1C9A:1DCA
22516 :       bp10->b2 = (bp0c->b13 >> 2) & 63;
22517 :       //^1C9A:1DDE
22518 :       bp38 |= (bp0c->b16 = _4976_3932[bp0c->b7]);
22519 :       //^1C9A:1DF6
22520 :       switch (bp0c->b7) {
22521 :         case  3:
22522 :           //^1C9A:1E0D
22523 :           bp7e = _4976_4ece->w12.GetX();
22524 :           bp80 = _4976_4ece->w12.GetY();
22525 :           bp0082 = _4976_4ece->w12.GetMap();
22526 :           //^1C9A:1E36
22527 :           if (true
22528 :             && bp7e == _4976_5232
22529 :             && bp80 == _4976_5236
22530 :             && bp0082 == _4976_5238
22531 :           ) {
22532 :             //^1C9A:1E52
22533 :             bp0c->b16 ^= 3;
22534 :           }
22535 :           //^1C9A:1E5A
22536 : _1e5a:
22537 :           bp52 = 1;
22538 :           //^1C9A:1E5F
22539 :           break;
22540 : 
22541 :         case 12:
22542 :           //^1C9A:1E62
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 :           //^1C9A:1EA4
22547 :           goto _1e5a;
22548 : 
22549 :         case 11:
22550 :           //^1C9A:1EA6
22551 :           goto _1e5a;
22552 : 
22553 :         case  1:
22554 :           //^1C9A:1EA8
22555 :           bp78 = _4976_4ec6->TriggerX();
22556 :           //^1C9A:1EB6
22557 :           bp7a = _4976_4ec6->TriggerY();
22558 :           //^1C9A:1EC3
22559 :           bp7c = _4976_4ec6->TriggerMap();
22560 :           //^1C9A:1ED0
22561 :           goto _1e5a;
22562 : 
22563 :         case  5:
22564 :           //^1C9A:1ED2
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 :           //^1C9A:1F12
22567 :           break;
22568 : 
22569 :         case  8:
22570 :         case  9:
22571 :           //^1C9A:1F14
22572 :           bp58 = 1;
22573 : 
22574 :           goto _1f19;
22575 : 
22576 :         case  6:
22577 :         case  7:
22578 :         case 10:
22579 :           //^1C9A:1F19
22580 : _1f19:
22581 :           bp0084 = _4976_4eee;
22582 :           //^1C9A:1F20
22583 :           break;
22584 : 
22585 :         case 23:
22586 :           //^1C9A:1F22
22587 :           _4976_4eec = 0x0227;
22588 :           _4976_52d4 = 0;
22589 :           _4976_52d6 = 0;
22590 :           //^1C9A:1F34
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 :       //^1C9A:1F3E
22609 :       U16 bp70 = 0;
22610 :       U16 bp6e = 0;
22611 :       //^1C9A:1F46
22612 :       if ((_4976_3932[bp0c->b7] & 0x20) != 0) {
22613 :         //^1C9A:1F5A
22614 :         bp6e = (_4976_57e6 != 0 && (_4976_4eca->w0 & 0x0400) == 0) ? 1 : 0;
22615 :         //^1C9A:1F76
22616 :         if (bp6e == 0) {
22617 :           //^1C9A:1F7A
22618 :           bp70 = (_4976_4c36 != 0 && _4976_57e4.w0 < 0 && (_4976_4eca->w0 & 0x0800) == 0) ? 1 : 0;
22619 :           //^1C9A:1F9D
22620 :           if (bp70 == 0) {
22621 :             //^1C9A:1FA1
22622 :             goto _20fa;
22623 :           }
22624 :         }
22625 :         //^1C9A:1FA4
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 :         //^1C9A:2040
22635 :         U16 bp76 = RAND();
22636 :         //^1C9A:2048
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 :           //^1C9A:2088
22644 :           goto _20fa;
22645 :         }
22646 :         //^1C9A:208A
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 :           //^1C9A:20E3
22653 :           if ((bp76 & 0x0070) != 0) {
22654 :             //^1C9A:20EA
22655 :             bp0c->b0 = -1;
22656 :           }
22657 :           else {
22658 :             //^1C9A:20F3
22659 :             bp0c->b0 >>= 3;
22660 :           }
22661 :         }
22662 :       }
22663 :       //^1C9A:20FA
22664 : _20fa:
22665 :       U16 bp2c = bp0c->b0;
22666 :       //^1C9A:2104
22667 :       if ((bp0c->b16 & 2) != 0)
22668 :         //^1C9A:210B
22669 :         bp2c++;
22670 :       //^1C9A:210E
22671 :       bp3e = max_value(bp3e, bp2c);
22672 :       //^1C9A:211E
22673 :       bp10 += 4;
22674 :       bp0c += 22;
22675 :       //^1C9A:2126
22676 :     }
22677 :     //^1C9A:212F
22678 :     U16 bp5a = _4976_4eec & 0x2000;
22679 :     //^1C9A:2138
22680 :     X16 bp5c;
22681 :     X16 bp5e;
22682 :     if (bp5a != 0) {
22683 :       //^1C9A:213C
22684 :       bp5a = _4976_4eec & 0x0118;
22685 :       //^1C9A:2145
22686 :       if (bp5a != 0) {
22687 :         //^1C9A:2149
22688 :         bp5c = _4976_4eec & 0x0110;
22689 :         bp5e = _4976_4eec & 0x0108;
22690 :       }
22691 :     }
22692 :     //^1C9A:215B
22693 :     if (bp58 != 0 || bp3e != 0) {
22694 :       //^1C9A:2167
22695 :       ZERO_MEMORY(bp04, bp68);
22696 :     }
22697 :     //^1C9A:217B
22698 :     U16 bp2a = 0;
22699 :     U16 bp28 = 0;
22700 :     i16 bp2c = 0;
22701 :     //^1C9A:2188
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 :     //^1C9A:21A0
22710 :     i16 bp32 = 1;
22711 :     i16 bp30 = -1;
22712 :     U8 bp37 = 0;
22713 :     U16 bp50 = 0xffff;
22714 :     //^1C9A:21B3
22715 :     _19f0_045a(bp12, bp14);
22716 :     //^1C9A:21C0
22717 :     X16 bp4c;
22718 :     X16 bp4e;
22719 :     if (bp52 != 0) {
22720 :       //^1C9A:21C9
22721 :       _4976_5225 = GET_TELEPORTER_DETAIL(&_4976_5226, U8(bp12), U8(bp14));
22722 :       //^1C9A:21DE
22723 :       if (_4976_5225 != 0) {
22724 :         //^1C9A:21E5
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 :       //^1C9A:2200
22735 : _2200:
22736 :       bp42 = bp08[bp2a][0];
22737 :       bp44 = bp08[bp2a][1];
22738 :       bp46 = bp08[bp2a][2];
22739 :       //^1C9A:223B
22740 :       bp2a = (bp2a +1) & 255;
22741 :       //^1C9A:2245
22742 :       if (bp46 != _4976_0c5a) {
22743 :         //^1C9A:224E
22744 :         _1c9a_0648(bp46);
22745 :         //^1C9A:2256
22746 :         bp04 = bp1a[bp46];
22747 :       }
22748 :       //^1C9A:226E
22749 :       bp2c = bp04[bp42][bp44]->b0;
22750 :       //^1C9A:2289
22751 :       if (bp2c > bp3e)
22752 :         //^1C9A:228E
22753 :         goto _35b1;
22754 :       //^1C9A:2291
22755 :       if (bp2c > 6)
22756 :         //^1C9A:2297
22757 :         aa |= 0x0040;
22758 :       //^1C9A:229C
22759 :       if ((aa & 0xff1f) == 5 && bp2c > 1) {
22760 :         //^1C9A:22AD
22761 :         aa = (aa & 0x00e0) | 0x0004;
22762 :       }
22763 :       //^1C9A:22B9
22764 :       bp40 = _4976_3930 & 1;
22765 :       //^1C9A:22C2
22766 :       if (bp40 == 0)
22767 :         //^1C9A:22C6
22768 :         bp40--;
22769 :       //^1C9A:22C9
22770 :       if ((_4976_3930 & 1) != 0) {
22771 :         //^1C9A:22D1
22772 :         _4976_3930 = (_4976_3930 >> 1) ^ 0xB400;
22773 :       }
22774 :       else {
22775 :         //^1C9A:22DE
22776 :         _4976_3930 >>= 1;
22777 :       }
22778 :       //^1C9A:22E2
22779 :       bp30 = _4976_3930 & 3;
22780 :       //^1C9A:22EB
22781 :       bp32 = (bp5a != 0) ? 7 : 5;
22782 :       //^1C9A:22FE
22783 :       goto _3592;
22784 :       //^1C9A:2301
22785 : _2301:
22786 :       if (bp46 != _4976_0c5a) {
22787 :         //^1C9A:230A
22788 :         _1c9a_0648(bp46);
22789 :         //^1C9A:2312
22790 :         bp04 = bp1a[bp46];
22791 :       }
22792 :       //^1C9A:232A
22793 :       if (bp5a != 0 && bp32 <= 2) {
22794 :         //^1C9A:2336
22795 :         if (bp32 == 2) {
22796 :           //^1C9A:233C
22797 :           if (bp5e == 0)
22798 :             //^1C9A:2342
22799 :             goto _3586;
22800 :           //^1C9A:2345
22801 :         }
22802 :         //^1C9A:234C
22803 :         else if (bp5c == 0) {
22804 :           //^1C9A:2352
22805 :           goto _3586;
22806 :         }
22807 :         else {
22808 :           //^1C9A:2355
22809 :           bp30 = 4;
22810 :         }
22811 :         //^1C9A:235A
22812 :                 bp12 = bp42;
22813 :         bp14 = bp44;
22814 :         goto _23b0;
22815 :       }
22816 :       else {
22817 :         //^1C9A:2368
22818 :         bp12 = bp42 + _4976_0232[bp30];
22819 :         bp14 = bp44 + _4976_023a[bp30];
22820 :         //^1C9A:2386
22821 :         if (bp12 < 0 || bp12 >= _4976_4dd2 || bp14 < 0 || bp14 >= _4976_4dd4)
22822 :           //^1C9A:23AD
22823 :           goto _3586;
22824 :         //^1C9A:23B0
22825 : _23b0:
22826 :         _4976_5224 = 0;
22827 :         //^1C9A:23B5
22828 :         bp37 = bp04[bp12][bp14]->b0;
22829 :         //^1C9A:23D0
22830 :         if (bp37 == 0 || bp30 >= 4) {
22831 :           //^1C9A:23DD
22832 :           if (_19f0_1522(aa, bp42, bp44, bp12, bp14, bp30) == 0) {
22833 :             //^1C9A:23FB
22834 :             bp37 = 0xff;
22835 :           }
22836 :           else {
22837 :             //^1C9A:2402
22838 :             bp50 = 0xffff;
22839 :             //^1C9A:2407
22840 :             if (_4976_521a != _4976_0c5a) {
22841 :               //^1C9A:2413
22842 :               if (bp1a[_4976_521a] == NULL) {
22843 :                 //^1C9A:2427
22844 :                 bp68 = ((_4976_4dba[_4976_521a].RawColumn() +1) << 5) << 2;
22845 :                 //^1C9A:244C
22846 :                 bp68 += 200;
22847 :                 //^1C9A:2459
22848 :                 if (i32(bp68) > _4976_5d30) {
22849 :                   //^1C9A:246D
22850 :                   bp3a = _3e74_5888();
22851 :                   //^1C9A:2475
22852 :                   _3e74_5708(bp3a, bp68);
22853 :                   //^1C9A:2486
22854 :                   for (bp3c = 0; _4976_4d0e->nMaps > bp3c; bp3c++) {
22855 :                     //^1C9A:248D
22856 :                     if (bp1e[bp3c] < 0)
22857 :                       //^1C9A:249B
22858 :                       continue;
22859 :                     //^1C9A:249D
22860 :                     bp1a[bp3c] = reinterpret_cast<skxxxb (*)[1][32]>(_3e74_5817(bp1e[bp3c]));
22861 :                     //^1C9A:24CB
22862 :                   }
22863 :                 }
22864 :                 //^1C9A:2517
22865 :                 bp04 = reinterpret_cast<skxxxb (*)[1][32]>(ALLOC_MEMORY(bp68, afZeroMem, 1024));
22866 :                 //^1C9A:2531
22867 :                 bp6c += bp68;
22868 :                 //^1C9A:253D
22869 :                 bp1a[_4976_521a] = bp04;
22870 :               }
22871 :               //^1C9A:2555
22872 :               if (bp30 < 4) {
22873 :                 //^1C9A:255B
22874 :                 bp50 = _4976_0c5a;
22875 :               }
22876 :               //^1C9A:2561
22877 :               _1c9a_0648(_4976_521a);
22878 :               //^1C9A:256A
22879 :               bp04 = bp1a[_4976_0c5a];
22880 :             }
22881 :             else {
22882 :               //^1C9A:2584
22883 :               if (bp30 < 4) {
22884 :                 //^1C9A:258A
22885 :                 if (_4976_5225 != 0) {
22886 :                   //^1C9A:2591
22887 :                   bp50 = _4976_5226.b4;
22888 :                   bp4c = _4976_5226.b2;
22889 :                   bp4e = _4976_5226.b3;
22890 :                   
22891 :                 }
22892 :                 //^1C9A:25A8
22893 :                 else if (_4976_5216 != bp12 || _4976_5218 != bp14) {
22894 :                   //^1C9A:25B8
22895 :                   bp50 = _4976_0c5a;
22896 :                 }
22897 :               }
22898 :             }
22899 :             //^1C9A:25BE
22900 :             bp4c = bp12;
22901 :             //^1C9A:25C7
22902 :             bp4e = bp14;
22903 :             //^1C9A:25CA
22904 :             bp37 = 0;
22905 :           }
22906 :         }
22907 :         //^1C9A:25CE
22908 :         if (bp37 != 0)
22909 :           //^1C9A:25D4
22910 :           goto _2ece;
22911 :         //^1C9A:25D7
22912 :         if (bp04[bp12 = _4976_5216][bp14 = _4976_5218]->b0 != 0)
22913 :           //^1C9A:25F6
22914 :           goto _3586;
22915 :       }
22916 :     }
22917 :     //^1C9A:25F9
22918 :     U16 bp16 = _4976_0c5a;
22919 :     //^1C9A:25FF
22920 :     U16 bp54;
22921 :     if ((bp38 & 1) != 0) {
22922 :       //^1C9A:260D
22923 :       bp10 = bp22;
22924 :       bp0c = ss;
22925 :       //^1C9A:2625
22926 :       for (i16 di = 0; di < cc; di++, bp0c++, bp10++) {
22927 :         //^1C9A:262A
22928 :         if (bp0c->b0 < bp2c || (bp0c->b16 & 1) == 0)
22929 :           //^1C9A:2645
22930 :           continue;
22931 :         //^1C9A:2648
22932 :         switch (bp0c->b7) {
22933 :           case  0:
22934 :             //^1C9A:2661
22935 : _2661:
22936 :             si = 1;
22937 :             //^1C9A:2664
22938 :             break;
22939 : 
22940 :           case  2:
22941 :             //^1C9A:2667
22942 :             switch (bp0c->w8) {
22943 :               case 4:
22944 :                 //^1C9A:267F
22945 :                 break;
22946 : 
22947 :               case 0:
22948 :                 //^1C9A:2682
22949 :                 si = (_4976_0c5a == _4976_5232 && bp12 == _4976_5236 && bp14 == _4976_5238) ? 1 : 0;
22950 :                 //^1C9A:26A4
22951 :                 //^1C9A:2D9B
22952 :                 break;
22953 : 
22954 :               case 2:
22955 :                 //^1C9A:26A7
22956 :                 if (CALC_VECTOR_DIR(_4976_5236, _4976_5238, bp12, bp14) != _4976_5234)
22957 :                   //^1C9A:26C3
22958 :                   break;
22959 :                 //^1C9A:26C6
22960 :                 bp3c = _19f0_0207(_4976_5236, _4976_5238, bp12, bp14, _19f0_000a);
22961 :                 //^1C9A:26E5
22962 :                 if (bp3c <= 0)
22963 :                   //^1C9A:26E9
22964 :                   break;
22965 :                 //^1C9A:26EC
22966 :                 if (bp0c->w10 < bp3c)
22967 :                   //^1C9A:26F8
22968 :                   break;
22969 :                 //^1C9A:26FB
22970 :                 si = 1;
22971 :                 //^1C9A:26FE
22972 :                 break;
22973 :             }
22974 :             //^1C9A:2701
22975 :             if (bp0c->w10 != CALC_SQUARE_DISTANCE(bp12, bp14, _4976_5236, _4976_5238))
22976 :               //^1C9A:2720
22977 :               break;
22978 :             //^1C9A:2723
22979 :             if ((bp12 - _4976_5236 == 0 || bp14 - _4976_5238 == 0) && _19f0_0207(_4976_5236, _4976_5238, bp12, bp14, _1c9a_1bae) != 0)
22980 :               //^1C9A:2755
22981 :               break;
22982 :             //^1C9A:2758
22983 :             si = 1;
22984 :             //^1C9A:275B
22985 :             break;
22986 : 
22987 :           case  7:
22988 :             //^1C9A:275E
22989 :             if (bp16 != _4976_5232)
22990 :               //^1C9A:2767
22991 :               break;
22992 :             //^1C9A:276A
22993 :             _4976_4eee = bp0c->w10;
22994 :             //^1C9A:2775
22995 :             si = _19f0_0891(0, bp12, bp14, _4976_5236, _4976_5238, -1);
22996 :             //^1C9A:2791
22997 :             _4976_4eee = bp0084;
22998 :             //^1C9A:2798
22999 :             break;
23000 : 
23001 :           case  6:
23002 :             //^1C9A:279B
23003 :             if (bp16 != _4976_5232)
23004 :               //^1C9A:27A4
23005 :               break;
23006 :             //^1C9A:27A7
23007 :             _4976_4eee = bp0c->w10;
23008 :             //^1C9A:27B2
23009 :             si = _19f0_0891(1, bp12, bp14, _4976_5236, _4976_5238, -1);
23010 :             //^1C9A:27CE
23011 :             _4976_4eee = bp0084;
23012 :             //^1C9A:27D5
23013 :             break;
23014 : 
23015 :           case  8:
23016 :           case  9:
23017 :             //^1C9A:27D8
23018 :             if (bp0c->b0 != bp2c)
23019 :               //^1C9A:27E4
23020 :               break;
23021 :             //^1C9A:27E7
23022 :             _4976_4eee &= aa;
23023 :             //^1C9A:27EF
23024 :             si = _19f0_05e8(bp0c->w8, bp04, &bp0c->w2, bp12, bp14, -1, (bp0c->b7 == 9) ? 1 : 0);
23025 :             //^1C9A:2826
23026 :             if (si != 0) {
23027 :               //^1C9A:282A
23028 :               bp0c->w2.SetX(_4976_5216);
23029 :               //^1C9A:283C
23030 :               bp0c->w2.SetY(_4976_5218);
23031 :               //^1C9A:284F
23032 :               bp0c->w2.SetMap(_4976_521a);
23033 :               //^1C9A:2861
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 :             //^1C9A:28A8
23039 :             _4976_4eee = bp0084;
23040 :             //^1C9A:28AF
23041 :             break;
23042 : 
23043 :           case 24:
23044 :             //^1C9A:28B2
23045 :             if ((_4976_521c & 0x10) == 0)
23046 :               //^1C9A:28B9
23047 :               break;
23048 :             //^1C9A:28BC
23049 :             bp3c = _1c9a_1b16(bp0c->w8, bp0c->w10);
23050 :             //^1C9A:28D0
23051 :             if (bp3c == 0xffff)
23052 :               //^1C9A:28D5
23053 :               break;
23054 :             //^1C9A:28D8
23055 :             if (bp10->b3 <= bp3c)
23056 :               //^1C9A:28E5
23057 :               break;
23058 :             //^1C9A:28E8
23059 :             if (bp3c == 0 || bp10->b3 < 127 || bp0c->b0 == 0) {
23060 :               //^1C9A:28FE
23061 :               si = 1;
23062 :               //^1C9A:2901
23063 :               bp0c->b16 = bp0c->b16 & 0xfb;
23064 :               //^1C9A:290E
23065 :               break;
23066 :             }
23067 :             //^1C9A:2911
23068 :             bp10->b3 = i8(bp3c);
23069 :             //^1C9A:291B
23070 :             break;
23071 : 
23072 :           case 25:
23073 :             //^1C9A:291E
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 :               //^1C9A:295B
23081 :               break;
23082 :             }
23083 :             //^1C9A:295E
23084 :             si = 1;
23085 :             //^1C9A:2961
23086 :             break;
23087 : 
23088 :           case 10:
23089 :             //^1C9A:2964
23090 :             if (bp16 != _4976_5232 || (_4976_37a6[_4976_4ee4] & 3) != 0)
23091 :               //^1C9A:2982
23092 :               break;
23093 :             //^1C9A:2985
23094 :             _4976_4eee &= bp0c->w10;
23095 :             //^1C9A:2990
23096 :             si = _19f0_0891(0, bp12, bp14, -1, -1, _4976_4ec6->b15_0_2());
23097 :             //^1C9A:29B2
23098 :             _4976_4eee = bp0084;
23099 :             //^1C9A:29B9
23100 :             break;
23101 : 
23102 :           case  4:
23103 :             //^1C9A:29BC
23104 :             if (bp16 != _4976_5232 || (CALC_SQUARE_DISTANCE(bp12, bp14, _4976_5236, _4976_5238) +8) != 2)
23105 :               //^1C9A:29E3
23106 :               break;
23107 :             //^1C9A:29E6
23108 :             si = 1;
23109 :             //^1C9A:29E9
23110 :             break;
23111 : 
23112 :           case 15:
23113 :           case 16:
23114 :             //^1C9A:29EC
23115 :             si = _19f0_2165(0, bp12, bp14, bp12, bp14, -1, bp0c->w8);
23116 :             //^1C9A:2D99
23117 :             //^1C9A:2D9B
23118 :             break;
23119 : 
23120 :           case  5:
23121 :             //^1C9A:2A0E
23122 :             if (bp0c->w12() != 0xffff)
23123 :               //^1C9A:2A18
23124 :               goto _2b85;
23125 :             //^1C9A:2A1B
23126 :             if (bp0c->b6 <= 0) {
23127 :               //^1C9A:2A25
23128 :               bp54 = 1;
23129 :             }
23130 :             else {
23131 :               //^1C9A:2A2C
23132 :               if ((_4976_3930 & 1) != 0) {
23133 :                 //^1C9A:2A34
23134 :                 _4976_3930 = (_4976_3930 >> 1) ^ 0xB400;
23135 :               }
23136 :               else {
23137 :                 //^1C9A:2A41
23138 :                 _4976_3930 >>= 1;
23139 :               }
23140 :               //^1C9A:2A45
23141 :               bp54 = ((_4976_3930 & 7) == 0) ? 1 : 0;
23142 :             }
23143 :             //^1C9A:2A57
23144 :             if (bp54 == 0)
23145 :               //^1C9A:2A5D
23146 :               break;
23147 :             //^1C9A:2A60
23148 :             if (bp16 == _4976_5232) {
23149 :               //^1C9A:2A69
23150 :               bp3c = CALC_SQUARE_DISTANCE(bp12, bp14, _4976_5236, _4976_5238);
23151 :             }
23152 :             else {
23153 :               //^1C9A:2A82
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 :             //^1C9A:2B20
23163 :             if (bp10->b3 <= bp3c)
23164 :               //^1C9A:2B2E
23165 :               break;
23166 :             //^1C9A:2B31
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 :               //^1C9A:2B72
23169 :               break;
23170 :             //^1C9A:2B75
23171 :             si = 1;
23172 :             //^1C9A:2B78
23173 :             bp10->b3 = X8(bp3c);
23174 :             //^1C9A:2B82
23175 :             break;
23176 : 
23177 :           case 11:
23178 :             //^1C9A:2B85
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 :               //^1C9A:2BCE
23185 :               si = 1;
23186 :             }
23187 :             //^1C9A:2BD1
23188 :             break;
23189 : 
23190 :           case 12:
23191 :             //^1C9A:2BD4
23192 :             if (false
23193 :               || bp10->b2 != bp16
23194 :               ||(bp3c = CALC_SQUARE_DISTANCE(bp12, bp14, bp10->b0, bp10->b1)) >= bp10->b3
23195 :             ) {
23196 :               //^1C9A:2C0B
23197 :               if (bp10->b2 != bp50)
23198 :                 //^1C9A:2C18
23199 :                 break;
23200 :               //^1C9A:2C1B
23201 :               bp3c = CALC_SQUARE_DISTANCE(bp4c, bp4e, bp10->b0, bp10->b1);
23202 :               //^1C9A:2C37
23203 :               if (bp3c >= bp10->b3)
23204 :                 //^1C9A:2C45
23205 :                 break;
23206 :               //^1C9A:2C48
23207 :               si = 1;
23208 :             }
23209 :             //^1C9A:2C4B
23210 :             bp10->b3 = X8(bp3c);
23211 :             //^1C9A:2C55
23212 :             if (bp10->b3 != 0)
23213 :               //^1C9A:2C59
23214 :               break;
23215 :             //^1C9A:2C5C
23216 :             bp0c->b16 = bp0c->b16 & 0xfb;
23217 :             //^1C9A:2C69
23218 :             break;
23219 : 
23220 :           case  3:
23221 :             //^1C9A:2C6C
23222 :             if (false
23223 :               || (bp16 == bp0082 && bp12 == bp7e && bp14 == bp80)
23224 :               || (bp50 == bp0082 && bp4c == bp7e && bp4e == bp80)
23225 :             ) {
23226 :               //^1C9A:2CA7
23227 :               si = 1;
23228 :             }
23229 :             //^1C9A:2CAA
23230 :             break;
23231 : 
23232 :           case 13:
23233 :             //^1C9A:2CAD
23234 :             if (bp0c->w12() != 0xffff)
23235 :               //^1C9A:2CB7
23236 :               goto _2b85;
23237 :             //^1C9A:2CBA
23238 :             if (bp2c <= 0)
23239 :               //^1C9A:2CC0
23240 :               break;
23241 :             //^1C9A:2CC3
23242 :             if (bp0c->b6 <= 0)
23243 :               //^1C9A:2CCD
23244 :               goto _2661;
23245 :             //^1C9A:2CD0
23246 :             if ((_4976_3930 & 1) != 0) {
23247 :               //^1C9A:2CD8
23248 :               _4976_3930 = (_4976_3930 >> 1) & 0xB400;
23249 :             }
23250 :             else {
23251 :               //^1C9A:2CE5
23252 :               _4976_3930 >>= 1;
23253 :             }
23254 :             //^1C9A:2CE9
23255 :             if ((_4976_3930 & 7) != 0)
23256 :               //^1C9A:2CF1
23257 :               break;
23258 :             //^1C9A:2CF4
23259 :             si = 1;
23260 :             //^1C9A:2CF7
23261 :             break;
23262 : 
23263 :           case  1:
23264 :             //^1C9A:2CFA
23265 :             if (false
23266 :               || (bp16 == bp7c && bp12 == bp78 && bp14 == bp7a)
23267 :               || (bp50 == bp7c && bp4c == bp78 && bp4e == bp7a)
23268 :             ) {
23269 :               //^1C9A:2D33
23270 :               si = 1;
23271 :             }
23272 :             //^1C9A:2D36
23273 :             break;
23274 : 
23275 :           case 14:
23276 :             //^1C9A:2D39
23277 :             bp3c = bp0c->w8;
23278 :             //^1C9A:2D43
23279 :             if (bp3c < 0) {
23280 :               //^1C9A:2D47
23281 :               if (RAND16(-bp3c) == 0)
23282 :                 //^1C9A:2D54
23283 :                 break;
23284 :               //^1C9A:2D57
23285 :               si = 1;
23286 :               //^1C9A:2D5A
23287 :               break;
23288 :             }
23289 :             //^1C9A:2D5D
23290 :             if (bp3c <= 0)
23291 :               //^1C9A:2D63
23292 :               break;
23293 :             //^1C9A:2D66
23294 :             if (RAND16(bp3c) != 0)
23295 :               //^1C9A:2D73
23296 :               break;
23297 :             //^1C9A:2D76
23298 :             si = 1;
23299 :             //^1C9A:2D79
23300 :             break;
23301 : 
23302 :           case 21:
23303 :             //^1C9A:2D7C
23304 :             si = _19f0_1522(bp0c->w8, bp12, bp14, bp12, bp14, -1);
23305 :             //^1C9A:2D9B
23306 :             break;
23307 : 
23308 :           case 20:
23309 :             //^1C9A:2D9D
23310 :             if (bp12 == xx && bp14 == yy)
23311 :               //^1C9A:2DAB
23312 :               break;
23313 :             //^1C9A:2DAD
23314 :             bp36 = _19f0_050f();
23315 :             //^1C9A:2DB5
23316 :             if (bp36 == ObjectID::FFFE)
23317 :               //^1C9A:2DB8
23318 :               break;
23319 :             //^1C9A:2DBA
23320 :             if (_1c9a_0006(bp36, bp0c->w8) == 0)
23321 :               //^1C9A:2DCC
23322 :               break;
23323 :             //^1C9A:2DCE
23324 :             _1c9a_19d4(bp36, bp12, bp14, bp0c->w10);
23325 :             //^1C9A:2DE5
23326 :             si = 1;
23327 :             //^1C9A:2DE8
23328 :             break;
23329 : 
23330 :           case 23:
23331 :             //^1C9A:2DEA
23332 :             if ((_4976_521c & 16) == 0)
23333 :               //^1C9A:2DEF
23334 :               break;
23335 :             //^1C9A:2DF1
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 :         //^1C9A:2E13
23348 :         if (si != 0)
23349 :           //^1C9A:2E15
23350 :           break;
23351 :         //^1C9A:2E17
23352 :       }
23353 :     }
23354 :     //^1C9A:2E28
23355 :     if (bp2c < bp3e) {
23356 :       //^1C9A:2E30
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 :     //^1C9A:2E6F
23363 :     skxxxb bp74;
23364 :     bp74.b0 = bp2c +1;
23365 :     //^1C9A:2E77
23366 :     bp74.b1 = X8(bp30);
23367 :     //^1C9A:2E7D
23368 :     bp74.w2.SetMap(bp46);
23369 :     //^1C9A:2E8D
23370 :     bp74.w2.SetX(bp42);
23371 :     //^1C9A:2E9A
23372 :     bp74.w2.SetY(bp44);
23373 :     //^1C9A:2EAB
23374 :     bp04[0][bp12][bp14] = bp74;
23375 :     //^1C9A:2ECB
23376 :     goto _3368;
23377 :     //^1C9A:2ECE
23378 : _2ece:
23379 :     i8 bp5f;
23380 :     if (bp37 == 0xff && bp30 < 4) {
23381 :       //^1C9A:2EE0
23382 :       bp5f = _4976_5224;
23383 :       bp37 = U8(bp2c);
23384 :       //^1C9A:2EEF
23385 :       if ((bp37 & 2) != 0) {
23386 :         //^1C9A:2EFA
23387 :         if ((bp38 & 8) != 0)
23388 :           //^1C9A:2F00
23389 :           _19f0_045a(bp12, bp14);
23390 :         //^1C9A:2F0D
23391 :         bp0c = ss;
23392 :         //^1C9A:2F19
23393 :         for (di = 0; di < cc; di++, bp0c++) {
23394 :           //^1C9A:2F1E
23395 :           if (bp0c->b0 +1 < bp2c || (bp0c->b16 & 2) == 0)
23396 :             continue;
23397 :           //^1C9A:2F3D
23398 :           U16 bp4a;
23399 :           X16 bp6e;
23400 :           X16 bp70;
23401 :           Creature *bp26 ;
23402 :           switch (bp0c->b7) {
23403 :             case  3:
23404 :               //^1C9A:2F58
23405 :               si = (_4976_0c5a == _4976_5232 && bp12 == _4976_5236 && bp14 == _4976_5238) ? 1 : 0;
23406 :               //^1C9A:2F7C
23407 :               break;
23408 : 
23409 :             case  2:
23410 :               //^1C9A:2F7F
23411 :               if (_4976_0c5a != _4976_5232 || bp12 != _4976_5236 || bp14 != _4976_5238)
23412 :                 //^1C9A:2FA0
23413 :                 break;
23414 :               //^1C9A:2FA3
23415 :               switch (bp0c->w8) {
23416 :                 default:
23417 :                   //^1C9A:2FB4
23418 :                   break;
23419 : 
23420 :                 case 1:
23421 :                   //^1C9A:2FB7
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 :                     //^1C9A:2FED
23427 :                     goto _31c0;
23428 :                   }
23429 :                   //^1C9A:2FF0
23430 :                   bp37 = 0xff;
23431 :                   //^1C9A:2FF4
23432 :                   break;
23433 : 
23434 :                 case 3:
23435 :                   //^1C9A:2FF7
23436 :                   bp4a = GET_TILE_VALUE(bp12 + _4976_0232[bp30], bp14 + _4976_023a[bp30]);
23437 :                   //^1C9A:301D
23438 :                   if ((bp4a >> 5) == ttPit && (bp4a & 8) != 0 && (bp4a & 1) == 0)
23439 :                     //^1C9A:3032
23440 :                     goto _31c0;
23441 :                   //^1C9A:3035
23442 :                   bp37 = 0xff;
23443 :                   //^1C9A:3039
23444 :                   break;
23445 :               }
23446 : 
23447 :             case  8:
23448 :               //^1C9A:303C
23449 :               if ((_4976_521c >> 5) == 0)
23450 :                 //^1C9A:3046
23451 :                 break;
23452 : 
23453 :               goto _3049;
23454 : 
23455 :             case  9:
23456 :               //^1C9A:3049
23457 : _3049:
23458 :               _4976_4eee &= bp0c->w10;
23459 :               //^1C9A:3054
23460 :               si = _19f0_05e8(bp0c->w8, bp04, &bp0c->w2, bp42, bp44, bp30, (bp0c->b7 == 9) ? 1 : 0);
23461 :               //^1C9A:308C
23462 :               if (si != 0) {
23463 :                 //^1C9A:3090
23464 :                 bp0c->w4.SetX(_4976_5216);
23465 :                 //^1C9A:30A2
23466 :                 bp0c->w4.SetY(_4976_5218);
23467 :                 //^1C9A:30B5
23468 :                 bp0c->w4.SetMap(_4976_521a);
23469 :                 //^1C9A:30C7
23470 :                 bp0c->b6 = bp1a[_4976_521a][_4976_5216][_4976_5218]->b0 -1;
23471 :               }
23472 :               //^1C9A:30F1
23473 :               _4976_4eee = bp0084;
23474 :               //^1C9A:30F8
23475 :               break;
23476 : 
23477 :             case 15:
23478 :             case 17:
23479 :               //^1C9A:30FB
23480 :               si = _19f0_2165(0, bp42, bp44, bp12, bp14, bp30, bp0c->w8);
23481 :               //^1C9A:311D
23482 :               if (si == 0 && _4976_522c != 0)
23483 :                 //^1C9A:312E
23484 :                 bp37 = 0xff;
23485 :               //^1C9A:3132
23486 :               break;
23487 : 
23488 :             case 19:
23489 :               //^1C9A:3135
23490 :               if ((_4976_4ec6->b15 & 3) != bp30)
23491 :                 //^1C9A:3145
23492 :                 break;
23493 : 
23494 :               goto _3148;
23495 : 
23496 :             case 18:
23497 :               //^1C9A:3148
23498 : _3148:
23499 :               if ((bp36 = _19f0_050f()) == ObjectID::FFFE)
23500 :                 //^1C9A:3155
23501 :                 break;
23502 :               //^1C9A:3158
23503 :               bp26 = GET_ADDRESS_OF_RECORD4(bp36);
23504 :               //^1C9A:3169
23505 :               if (bp26->CreatureType() != bp0c->w8)
23506 :                 //^1C9A:317A
23507 :                 break;
23508 :               //^1C9A:317D
23509 :               si = (bp0c->w10 == 1) ? 1 : 0;
23510 :               //^1C9A:318D
23511 :               if (si != 0)
23512 :                 //^1C9A:3191
23513 :                 break;
23514 :               //^1C9A:3194
23515 :               if (bp0c->w10 == 2) {
23516 :                 //^1C9A:319E
23517 :                 for (bp36 = bp26->GetPossessionObject(); bp36 != bp36.FFFE; bp36 = GET_NEXT_RECORD_LINK(bp36)) {
23518 :                   //^1C9A:31A7
23519 :                   if (bp36.DBType() != dbMissile && bp36.Dir() != bp30) {
23520 :                     //^1C9A:31C0
23521 : _31c0:
23522 :                     si = 1;
23523 :                     //^1C9A:31C3
23524 :                     break;
23525 :                   }
23526 :                   //^1C9A:31C6
23527 :                 }
23528 :                 //^1C9A:31D8
23529 :                 break;
23530 :               }
23531 :               //^1C9A:31DB
23532 :               bp6e = bp12 + _4976_0232[bp30];
23533 :               //^1C9A:31EA
23534 :               bp70 = bp14 + _4976_023a[bp30];
23535 :               //^1C9A:31F9
23536 :               if (_4976_0c5a != _4976_5232 || bp6e != _4976_5236 || bp70 != _4976_5238) {
23537 :                 //^1C9A:3214
23538 :                 bp36 = GET_CREATURE_AT(bp6e, bp70);
23539 :                 //^1C9A:3223
23540 :                 si = (bp36 != bp36.FFFF && (_0cee_2de0(bp36) & 1) == 0) ? 1 : 0;
23541 :               }
23542 :               else {
23543 :                 //^1C9A:3236
23544 :                 si = 1;
23545 :               }
23546 :               //^1C9A:323F
23547 :               if (si == 0)
23548 :                 //^1C9A:3246
23549 :                 bp37 = 0xff;
23550 :               //^1C9A:324A
23551 :               break;
23552 : 
23553 :             case 20:
23554 :               //^1C9A:324D
23555 :               bp36 = _19f0_050f();
23556 :               //^1C9A:3255
23557 :               if (bp36 == bp36.FFFE)
23558 :                 //^1C9A:325A
23559 :                 break;
23560 :               //^1C9A:325D
23561 :               if (_1c9a_0006(bp36, bp0c->w8) == 0)
23562 :                 //^1C9A:3271
23563 :                 break;
23564 :               //^1C9A:3274
23565 :               _1c9a_19d4(bp36, bp12, bp14, bp0c->w10);
23566 :               //^1C9A:328B
23567 :               si = 1;
23568 :               //^1C9A:328E
23569 :               break;
23570 : 
23571 :             case 22:
23572 :               //^1C9A:3291
23573 :               if ((_4976_521c & 16) == 0)
23574 :                 //^1C9A:3298
23575 :                 break;
23576 :               //^1C9A:329B
23577 :               si = _19f0_2813(bp0c->w10, bp42, bp44, bp12,bp14,bp30,bp0c->w8);
23578 :               //^1C9A:32BF
23579 :               if (si==0)
23580 :                 //^1C9A:32C3
23581 :                 bp37=0xff;
23582 :               //^1C9A:32C7
23583 :               break;
23584 : 
23585 :             case 23:
23586 :               //^1C9A:32C9
23587 :               if ((_4976_521c & 16)!=0){
23588 :                 //^1C9A:32D0
23589 :                 _24a5_036a(bp2c,bp30,bp12,bp14,4);
23590 :                 //^1C9A:32E6
23591 :                 bp37=0xff;
23592 :               }
23593 :               //^1C9A:32EA
23594 :               break;
23595 : 
23596 :             case 26:
23597 :               //^1C9A:32EC
23598 :               if (bp0c->w8 == 1 && (_4976_0c5a != _4976_5232 || bp12 != _4976_5236 || bp14 != _4976_5238))
23599 :                 //^1C9A:330F
23600 :                 break;
23601 :               //^1C9A:3311
23602 :               if (_19f0_0d10(bp0c->w10,bp42,bp44,bp12,bp14,bp30)!=0)
23603 :                 //^1C9A:3333
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 :           //^1C9A:3336
23625 :           if (si != 0)
23626 :             break;
23627 :           //^1C9A:333A
23628 :         }
23629 :       }
23630 :       //^1C9A:3347
23631 :       if (bp5f == 0) {
23632 :         //^1C9A:334F
23633 :         bp04[bp12][bp14]->b0 = bp37;
23634 :       }
23635 :     }
23636 :     //^1C9A:3368
23637 : _3368:
23638 :     if (si == 0)
23639 :       //^1C9A:336C
23640 :       goto _3586;
23641 :     //^1C9A:336F
23642 :     if ((bp0c->b16 & 16) == 0) {
23643 :       //^1C9A:3381
23644 :       if ((bp0c->b16 & 32) != 0) {
23645 :         //^1C9A:3388
23646 :         bp0c->w2.SetX(_4976_5236);
23647 :         //^1C9A:3397
23648 :         bp0c->w2.SetY(_4976_5238);
23649 :         //^1C9A:33AA
23650 :         bp0c->w2.SetMap(_4976_5232);
23651 :       }
23652 :       else {
23653 :         //^1C9A:33AF
23654 :         bp0c->w2.SetX(bp12);
23655 :         //^1C9A:33C1
23656 :         bp0c->w2.SetY(bp14);
23657 :         //^1C9A:33D4
23658 :         bp0c->w2.SetMap(bp16);
23659 :       }
23660 :       //^1C9A:33E9
23661 :       if (bp37 != 0) {
23662 :         //^1C9A:33EF
23663 :         bp0c->b6 = i8(bp2c -1);
23664 :         //^1C9A:33FB
23665 :         bp12 = bp42;
23666 :         bp14 = bp44;
23667 :         bp16 = bp46;
23668 :       }
23669 :       else {
23670 :         //^1C9A:340F
23671 :         bp0c->b6 = i8(bp2c);
23672 :       }
23673 :       //^1C9A:3419
23674 :       bp0c->w4.SetX(bp12);
23675 :       //^1C9A:342B
23676 :       bp0c->w4.SetY(bp14);
23677 :       //^1C9A:343E
23678 :       bp0c->w4.SetMap(bp16);
23679 :     }
23680 :     //^1C9A:3450
23681 :     bp34 = di;
23682 :     //^1C9A:3455
23683 :     if (false
23684 :       || di != 0
23685 :       || ((bp0c->b16 & 4) != 0 && bp0c->b0 > bp2c)
23686 :     ) {
23687 :       //^1C9A:3477
23688 :       cc = di;
23689 :       //^1C9A:347D
23690 :       while (ss[--di].b1 < 0) {
23691 :         //^1C9A:347F
23692 :         if (di == 0)
23693 :           //^1C9A:3483
23694 :           goto _35ba;
23695 :       }
23696 :       //^1C9A:349A
23697 :       if ((bp0c->b16 & 4) == 0) {
23698 :         //^1C9A:34A9
23699 :         cc = di +1;
23700 :       }
23701 :       //^1C9A:34AF
23702 :       if ((bp0c->b16 & 64) == 0) {
23703 :         //^1C9A:34BE
23704 :         i16 bp2e = 0;
23705 : 
23706 :         do {
23707 :           //^1C9A:34C3
23708 :           bp12 = ss[di].b1;
23709 :           //^1C9A:34D7
23710 :           if (bp12 > 0)
23711 :             //^1C9A:34DB
23712 :             bp2e += bp12;
23713 :           //^1C9A:34DE
23714 :           if (ss[di].b0 > bp2c +bp2e) {
23715 :             //^1C9A:34F8
23716 :             ss[di].b0 = i8(bp2c) +i8(bp2e);
23717 :           }
23718 :           //^1C9A:350D
23719 :         } while (--bp2e >= 0);
23720 :       }
23721 :       //^1C9A:3510
23722 :       X8 bp38 = 0;
23723 :       bp3e = 0;
23724 :       //^1C9A:3519
23725 :       for (di = 0; di < cc; di++) {
23726 :         //^1C9A:351D
23727 :         bp3c = ss[di].b16;
23728 :         //^1C9A:3532
23729 :         bp38 = bp38 | X8(bp3c);
23730 :         //^1C9A:353A
23731 :         if (di == 0 || ss[di].b6 < 0) {
23732 :           //^1C9A:3551
23733 :           X16 bp2e = ss[di].b0;
23734 :           //^1C9A:3564
23735 :           if ((bp3c & 2) != 0)
23736 :             //^1C9A:356B
23737 :             bp2e++;
23738 :           //^1C9A:356E
23739 :           bp3e = max_value(bp2e, bp3e);
23740 :         }
23741 :         //^1C9A:357E
23742 :       }
23743 :       //^1C9A:3584
23744 :       si = 0;
23745 :       //^1C9A:3586
23746 : _3586:
23747 :       bp30 = (bp30 +bp40) & 3;
23748 :       //^1C9A:3592
23749 : _3592:
23750 :       if (--bp32 != 0 && ((bp28 +1) & 255) != bp2a)
23751 :         //^1C9A:35A3
23752 :         goto _2301;
23753 :       //^1C9A:35A6
23754 :       if (bp2a != bp28)
23755 :         //^1C9A:35AE
23756 :         goto _2200;
23757 :       //^1C9A:35B1
23758 : _35b1:
23759 :       if (bp34 == 0xffff)
23760 :         //^1C9A:35B7
23761 :         goto _36d0;
23762 :     }
23763 :     //^1C9A:35BA
23764 : _35ba:
23765 :     bp0c = &ss[bp34];
23766 :     //^1C9A:35D0
23767 :     bp42 = bp0c->w4.GetX();
23768 :     //^1C9A:35DD
23769 :     bp44 = bp0c->w4.GetY();
23770 :     //^1C9A:35EA
23771 :     bp46 = bp0c->w4.GetMap();
23772 :     //^1C9A:35F7
23773 :     for (bp2c = bp0c->b6; --bp2c >= 0; ) {
23774 :       //^1C9A:3602
23775 :       bp74 = *(bp1a[bp46][bp42][bp44]);
23776 :       //^1C9A:362D
23777 :       tt[bp2c].b0_0_2(bp74.b1);
23778 :       //^1C9A:3646
23779 :       tt[bp2c].b0_3_7(bp42);
23780 :       //^1C9A:3660
23781 :       tt[bp2c].b1_0_4(bp44);
23782 :       //^1C9A:3679
23783 :       if (bp74.w2.GetMap() == bp46) {
23784 :         //^1C9A:3687
23785 :         tt[bp2c].b1_5_5(0);
23786 :       }
23787 :       else {
23788 :         //^1C9A:3698
23789 :         bp46 = bp74.w2.GetMap();
23790 :         //^1C9A:36A4
23791 :         tt[bp2c].b1_5_5(1);
23792 :       }
23793 :       //^1C9A:36B3
23794 :       bp42 = bp74.w2.GetX();
23795 :       //^1C9A:36BC
23796 :       bp44 = bp74.w2.GetY();
23797 :       //^1C9A:36C8
23798 :     }
23799 :     //^1C9A:36D0
23800 : _36d0:
23801 :     if (bp56 != 0) {
23802 :       //^1C9A:36D6
23803 :       for (bp12 = 0; _4976_4d0e->nMaps > bp12; bp12++) {
23804 :         //^1C9A:36DD
23805 :         bp3a = bp1e[bp12];
23806 :         //^1C9A:36ED
23807 :         if (bp3a >= 0)
23808 :           //^1C9A:36F1
23809 :           _3e74_58a3(bp3a);
23810 :         //^1C9A:36FA
23811 :       }
23812 :     }
23813 :     //^1C9A:370C
23814 :     DEALLOC_UPPER_MEMORY(bp6c);
23815 :     //^1C9A:3719
23816 :     _1c9a_0648(bp48);
23817 :     //^1C9A:3721
23818 :     return bp34;
23819 :   }
23820 : 
23821 :   //^1C9A:0648
23822 :   void _1c9a_0648(U16 xx)
23823 :   {
23824 :     //^1C9A:0648
23825 :     ENTER(0);
23826 :     //^1C9A:064C
23827 :     U16 si = xx;
23828 :     if (_4976_0c5a != si) {
23829 :       CHANGE_CURRENT_MAP_TO(si);
23830 :       if (si == _4976_4c12) {
23831 :         //^1C9A:0662
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 :     //^1C9A:0691
23845 :     return;
23846 :   }
23847 : 
23848 :   //^1C9A:02F6
23849 :   void _1c9a_02f6(i16 xx, i16 yy)
23850 :   {
23851 :     //^1C9A:02F6
23852 :     ENTER(34);
23853 :     //^1C9A:02FB
23854 :     U16 si = 0;
23855 :     //^1C9A:02FD
23856 :     i16 bp0c = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4218, dtWordValue, 0x6d);
23857 :     //^1C9A:0312
23858 :     if (bp0c == 0) {
23859 :       //^1C9A:0318
23860 :       _4976_4cb8 = 0;
23861 :       //^1C9A:031E
23862 :       _4976_52d4 = 0;
23863 :       _4976_38f0 = 0;
23864 :       _4976_52d6 = 0;
23865 :       _4976_38f2 = 0;
23866 :       //^1C9A:032E
23867 :       return;
23868 :     }
23869 :     //^1C9A:0330
23870 :     if (bp0c > 8) {
23871 :       //^1C9A:0336
23872 :       bp0c = 8;
23873 :     }
23874 :     //^1C9A:033B
23875 :     skxxx9 bp22;
23876 :     bp22.b0 = i8(bp0c);
23877 :     bp22.b1 = 0;
23878 :     bp22.b7 = 0x17;
23879 :     //^1C9A:0349
23880 :     skxxxc bp0a[5]; // size=?
23881 :     _1c9a_1bd8(xx, yy, 7, 0, 1, &bp22, bp0a);
23882 :     //^1C9A:0367
23883 :     if (_4976_52d4 != _4976_38f0) {
23884 :       //^1C9A:0370
23885 :       _4976_38f0 = _4976_52d4;
23886 :       si = 1;
23887 :     }
23888 :     //^1C9A:0376
23889 :     if (_4976_52d6 != _4976_38f2) {
23890 :       //^1C9A:037F
23891 :       _4976_38f2 = _4976_52d6;
23892 :       si = 1;
23893 :     }
23894 :     //^1C9A:0385
23895 :     if (si != 0) {
23896 :       //^1C9A:0389
23897 :       _24a5_013d();
23898 :     }
23899 :     //^1C9A:038E
23900 :     _4976_4cb8 = 0;
23901 :     //^1C9A:0394
23902 :     return;
23903 :   }
23904 : 
23905 :   //^38C8:03AD
23906 :   void _38c8_03ad()
23907 :   {
23908 :     //^38C8:03AD
23909 :     ENTER(0);
23910 :     //^38C8:03B1
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 :     //^38C8:03D5
23918 :     ZERO_MEMORY(_4976_580a, 16);
23919 :     //^38C8:03E5
23920 :     ZERO_MEMORY(_4976_536e, 48);
23921 :     //^38C8:03F5
23922 :     _4976_5366 = 0;
23923 :     _4976_5dbc = 0;
23924 :     //^38C8:0401
23925 :     _1c9a_3bd7();
23926 :     //^38C8:0406
23927 :     _1031_0541(5);
23928 :     //^38C8:040E
23929 :     _13ae_0009(U8(_4976_4bf4));
23930 :     //^38C8:0418
23931 :     _4976_4bd8 = 0;
23932 :     //^38C8:041E
23933 :     if (_4976_4c24 == 0) {
23934 :       //^38C8:0425
23935 :       FIRE_FILL_SCREEN_RECT(2, 0);
23936 :       //^38C8:0430
23937 :       _0aaf_0067(_0aaf_02f8(6, 0));
23938 :       //^38C8:0442
23939 :       U16 si = _4976_5d10;
23940 :       //^38C8:0447
23941 :       if (si != 0) {
23942 :         //^38C8:044B
23943 :         _4976_5d10 = 1;
23944 :         //^38C8:0451
23945 :         GRAPHICS_DATA_CLOSE();
23946 :       }
23947 :       //^38C8:0456
23948 :       _2066_03e0(0);
23949 :       //^38C8:045E
23950 :       if (si != 0) {
23951 :         //^38C8:0462
23952 :         GRAPHICS_DATA_OPEN();
23953 :         //^38C8:0467
23954 :         _4976_5d10 = si;
23955 :       }
23956 :       //^38C8:046B
23957 :       WAIT_SCREEN_REFRESH();
23958 :     }
23959 :     else {
23960 :       //^38C8:0472
23961 :       WAIT_SCREEN_REFRESH();
23962 :       //^38C8:0477
23963 :       _4976_01ba = 0;
23964 :     }
23965 :     //^38C8:047D
23966 :     FIRE_FILL_SCREEN_RECT(2, 0);
23967 :     //^38C8:0488
23968 :     _29ee_000f();
23969 :     //^38C8:048D
23970 :     _2f3f_0789();
23971 :     //^38C8:0492
23972 :     _4976_4c02 = 1;
23973 :     //^38C8:0498
23974 :     _1c9a_02f6(_4976_4bfa, _4976_4c06);
23975 :     //^38C8:04A7
23976 :     return;
23977 :   }
23978 : 
23979 :   //^101B:0001
23980 :   void _101b_0001(U16 xx)
23981 :   {
23982 :     //^101B:0001
23983 :     ENTER(2);
23984 :     //^101B:0005
23985 :     _443c_085a();
23986 :     //^101B:000A
23987 :     if (xx != 0 && _4976_4c26 == 0) {
23988 :       //^101B:0017
23989 :       U8 bp01 = (_4976_4c3c > 0) ? _4976_53b4[0].HeroType() : 0xfe;
23990 :       //^101B:002A
23991 :       QUEUE_NOISE_GEN2(0x16, bp01, 0x87, 0xfe, _4976_4bfa, _4976_4c06, 0, 255, 255);
23992 :       //^101B:004E
23993 :       SLEEP_SEVERAL_TIME(240);
23994 :     }
23995 :     //^101B:0057
23996 :     _2066_03e0(0);
23997 :     //^101B:005F
23998 :     _4976_01ba = 1;
23999 :     //^101B:0065
24000 :     if (xx != 0) {
24001 :       //^101B:006B
24002 :       FIRE_FILL_SCREEN_RECT(2, 0);
24003 :       //^101B:0076
24004 :       if (_4976_5bf6 != 0) {
24005 :         //^101B:007D
24006 :         _4976_5bf2 = (_0aaf_0067(_0aaf_02f8(16, 0)) == 0) ? 1 : 0;
24007 :         //^101B:009D
24008 :         if (_4976_5bf2 != 0) {
24009 :           //^101B:00A1
24010 :           _4976_4c24 = 0;
24011 :           //^101B:00A7
24012 :           if (GAME_LOAD() != -1) {
24013 :             //^101B:00B1
24014 :             _38c8_03ad();
24015 :             //^101B:00B6
24016 :             _4976_5bf2 = 0;
24017 :             //^101B:00BC
24018 :             _443c_086b();
24019 :             //^101B:00C1
24020 :             _1031_098e();
24021 :             //^101B:00C6
24022 :             return;
24023 :           }
24024 :         }
24025 :       }
24026 :     }
24027 :     //^101B:00C8
24028 :     FIRE_FILL_SCREEN_RECT(2, 0);
24029 :     //^101B:00D3
24030 :     FIRE_SELECT_PALETTE_SET(0);
24031 :     //^101B:00DB
24032 :     _0b36_1757(0x06, 0x00, 0x01, 2, 0xffff);
24033 :     //^101B:00ED
24034 :     FIRE_SELECT_PALETTE_SET(1);
24035 :     //^101B:00F5
24036 :     _1031_0541(1);
24037 :     //^101B:00FD
24038 :     while (_1031_1e6a(), _4976_4dfa != 239);
24039 :     //^101B:010A
24040 :     SK_PREPARE_EXIT();
24041 :     //^101B:010F
24042 :     return;
24043 :   }
24044 : 
24045 :   //^2066:0D09
24046 :   void _2066_0d09()
24047 :   {
24048 :     //^2066:0D09
24049 :     ENTER(132);
24050 :     //^2066:0D0F
24051 :     U16 bp18 = 0;
24052 :     U8 bp21 = 0;
24053 :     //^2066:0D18
24054 :     _2759_0541();
24055 :     //^2066:0D1D
24056 :     _2759_0644(0);
24057 :     //^2066:0D25
24058 :     _38c8_0002();
24059 :     //^2066:0D2A
24060 :     _443c_085a();
24061 :     //^2066:0D2F
24062 :     REARRANGE_TIMERLIST();
24063 :     //^2066:0D34
24064 :     if (_4976_49a0 == 0 && _4976_5eb0 != 0)
24065 :       //^2066:0D42
24066 :       _476d_04e8(2);
24067 :     //^2066:0D4A
24068 :     _4976_52f4 = 2;
24069 : 
24070 :     //^2066:0D50
24071 : _0d50:
24072 :     _4976_5258 = 0;
24073 :     //^2066:0D5C
24074 :     _4976_5246 = NULL;
24075 :     _4976_5240 = NULL;
24076 :     _4976_525e = NULL;
24077 :     //^2066:0D7A
24078 :     U8 bp13 = 0;
24079 :     U16 bp16 = 0;
24080 : 
24081 :     do {
24082 :       //^2066:0D83
24083 :       if (_4976_49a0 == 0 && bp13 != 0)
24084 :         //^2066:0D90
24085 :         _476d_04e8(2);
24086 :       //^2066:0D98
24087 :       U16 bp0e = _0aaf_0067(_0aaf_02f8((_4976_49a0 != 0) ? 0x12 : 0x0b, bp13));
24088 :       //^2066:0DBB
24089 :       if (bp0e == 3)
24090 :         //^2066:0DC1
24091 :         goto _1523;
24092 :       //^2066:0DC4
24093 :       if (bp0e == 2) {
24094 :         //^2066:0DCA
24095 :         _2066_046d();
24096 :         //^2066:0DCE
24097 :         bp13 = 0;
24098 :       }
24099 :       //^2066:0DD5
24100 :       else if (bp0e == 1) {
24101 :         //^2066:0DDB
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 :           //^2066:0E28
24108 :           //^2066:0DCE
24109 :           bp13 = 0;
24110 :         }
24111 :         else {
24112 :           //^2066:0E2A
24113 :           _443c_086b();
24114 :           //^2066:0E2F
24115 :           _4976_5bf6 = 0;
24116 :           //^2066:0E35
24117 :           bp18 = 1;
24118 :           //^2066:0E3A
24119 :           goto _1523;
24120 :         }
24121 :       }
24122 :       //^2066:0E3D
24123 :       else if (bp0e == 0) {
24124 :         //^2066:0E43
24125 :         if (_4976_49a0 != 0 || _476d_04af(0) == 1) {
24126 :           //^2066:0E57
24127 :           bp16 = 1;
24128 :         }
24129 :         else {
24130 :           //^2066:0E5E
24131 :           bp16 = 0;
24132 :           //^2066:0E63
24133 :           switch (_4976_5eb8) {
24134 :             case 0:
24135 :               //^2066:0E73
24136 :               bp13 = 0x15;
24137 :               //^2066:0E77
24138 :               break;
24139 : 
24140 :             case 2:
24141 :               //^2066:0E79
24142 :               bp13 = 0x16;
24143 :               //^2066:0E7D
24144 :               break;
24145 : 
24146 :             case 4:
24147 :               //^2066:0E7F
24148 :               bp13 = 0x17;
24149 :               //^2066:0E83
24150 :               break;
24151 : 
24152 :             case 3:
24153 :               //^2066:0E85
24154 :               bp13 = 0x1a;
24155 : 
24156 :               break;
24157 : 
24158 :             case 1:
24159 : 
24160 :               break;
24161 :           }
24162 :         }
24163 :       }
24164 :       //^2066:0E89
24165 :     } while (bp16 == 0);
24166 : 
24167 :     //^2066:0E92
24168 :     U8 *bp1c = ALLOC_MEMORY(1024, afDefault, 128);
24169 :     //^2066:0EAA
24170 :     U16 bp20 = 1;
24171 :     i16 bp1e = 3;
24172 :     //^2066:0EB4
24173 :     goto _100f;
24174 :     //^2066:0EB7
24175 : _0eb7:
24176 :     goto _1045;
24177 : 
24178 :     //^2066:100F
24179 : _100f:
24180 :     if (bp1e >= 0)
24181 :       //^2066:1015
24182 :       goto _0eb7;
24183 :     //^2066:1018
24184 :     DEALLOC_UPPER_MEMORY(1024);
24185 :     //^2066:1024
24186 :     if (bp20 != 0) {
24187 :       //^2066:102A
24188 :       _0aaf_0067(_0aaf_02f8(0x13, bp21));
24189 :             //^2066:103E
24190 :       bp21 = 0x14;
24191 :       //^2066:1042
24192 :       goto _0d50;
24193 :     }
24194 :     //^2066:1045
24195 : _1045:
24196 :     i16 bp0e = _2066_33e7();
24197 :     //^2066:104D
24198 :     if (bp0e < 0)
24199 :       //^2066:1051
24200 :       goto _0d50;
24201 :     //^2066:1054
24202 :     _4976_525c = bp0e;
24203 :     _4976_52e2 = U8(_4976_525c) +0x30;
24204 :     //^2066:1062
24205 :     _0aaf_02f8(0x0d, 0x00);
24206 :     //^2066:106D
24207 :     U8 *bp08 = FORMAT_SKSTR(_4976_19d0, NULL);
24208 :     //^2066:1087
24209 :     U8 *bp0c = FORMAT_SKSTR(_4976_19d4, NULL);
24210 :     //^2066:10A1
24211 :     DELETE_FILE(bp0c);
24212 :     //^2066:10AE
24213 :     FILE_RENAME(bp08, bp0c);
24214 :     //^2066:10C2
24215 :     _4976_394e = FILE_CREATE(bp08);
24216 :     //^2066:10D2
24217 :     if (_4976_394e < 0)
24218 :       //^2066:10D6
24219 :       goto _14fa;
24220 :     //^2066:10D9
24221 :     i16 bp10 = FILE_OPEN(bp0c);
24222 :     //^2066:10E9
24223 :     sksave_header_asc bp4c;
24224 :     if (bp10 >= 0) {
24225 :       //^2066:10ED
24226 :       READ_FILE(bp10, 42, &bp4c);
24227 :       //^2066:1101
24228 :       CLOSE_FILE(bp10);
24229 :     }
24230 :     else {
24231 :       //^2066:110C
24232 :       bp4c.w38 = 0;
24233 :     }
24234 :     //^2066:1116
24235 :     bp4c.w0 = 1;
24236 :     //^2066:111B
24237 :     SK_STRCPY(bp4c.b2, _4976_5268);
24238 :     //^2066:112C
24239 :     WRITE_FILE(_4976_394e, 42, &bp4c);
24240 :     //^2066:1141
24241 :     if (SKSAVE_WRITE(_4976_4d0e, 44) == 0)
24242 :       //^2066:1156
24243 :       goto _14fa;
24244 :     //^2066:1159
24245 :     if (SKSAVE_WRITE(_4976_4dba, _4976_4d0e->nMaps << 4) == 0)
24246 :       //^2066:117A
24247 :       goto _14fa;
24248 :         //^2066:117D
24249 :     if (SKSAVE_WRITE(_4976_4c7c, _4976_4cb4 << 1) == 0)
24250 :       //^2066:1196
24251 :       goto _14fa;
24252 : 
24253 :     //^2066:1199
24254 :     if (SKSAVE_WRITE(_4976_4d16, _4976_4d0e->cwListSize << 1) == 0)
24255 :       goto _14fa;
24256 :     //^2066:11BA
24257 :     if (SKSAVE_WRITE(_4976_4d12, _4976_4d0e->cwTextData << 1) == 0)
24258 :       goto _14fa;
24259 : 
24260 :     //^2066:11DB
24261 :     for (bp0e = 0; bp0e < 16; bp0e++) {
24262 :       //^2066:11E2
24263 :       if (SKSAVE_WRITE(_4976_4cca[bp0e], dbSize[bp0e] * _4976_4d0e->nRecords[bp0e]) == 0)
24264 :         //^2066:1214
24265 :         goto _14fa;
24266 :       //^2066:1217
24267 :     }
24268 :     //^2066:1220
24269 :     if (SKSAVE_WRITE(_4976_4db6, _4976_4d0e->cbMapData) == 0)
24270 :       //^2066:123B
24271 :       goto _14fa;
24272 :     //^2066:123E
24273 :     _1c9a_3bab();
24274 :     //^2066:1243
24275 :     COMPACT_TIMERLIST();
24276 :     //^2066:1248
24277 :     sksave_table_84 bp0084;
24278 :     ZERO_MEMORY(&bp0084, 56);
24279 :     //^2066:125A
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 :     //^2066:1317
24308 :     if (SUPPRESS_WRITER(&bp0084, _4976_395a, 56, 1) != 0)
24309 :       goto _14fa;
24310 :     //^2066:1339
24311 :     if (SUPPRESS_WRITER(_4976_5f52, _4976_3956, 1, 8) != 0)
24312 :       goto _14fa;
24313 :     //^2066:1355
24314 :     if (SUPPRESS_WRITER(_4976_5f12, _4976_3956, 1, 64) != 0)
24315 :       goto _14fa;
24316 :     //^2066:1371
24317 :     if (SUPPRESS_WRITER(_4976_5f5a, _4976_3956, 2, 64) != 0)
24318 :       goto _14fa;
24319 :     //^2066:138D
24320 :     if (SUPPRESS_WRITER(_4976_53b4, _4976_3992, 261, _4976_4c3c) != 0)
24321 :       goto _14fa;
24322 :     //^2066:13AC
24323 :     if (SUPPRESS_WRITER(&_4976_57e4, _4976_3a97, 6, 1) != 0)
24324 :       goto _14fa;
24325 :     //^2066:13C8
24326 :     if (SUPPRESS_WRITER(_4976_5c20, _4976_3a9d, 10, _4976_5c1e) != 0)
24327 :       goto _14fa;
24328 :     //^2066:13EA
24329 :     _4976_5240 = reinterpret_cast<U16 *>(ALLOC_MEMORY(_4976_4d0e->nRecords[dbContainer] << 1, afDefault, 1024));
24330 :     //^2066:140E
24331 :     _4976_5246 = reinterpret_cast<U16 *>(ALLOC_MEMORY(_4976_4d0e->nRecords[dbCreature] << 1, afDefault, 1024));
24332 :     //^2066:1432
24333 :     _4976_525e = reinterpret_cast<U16 *>(ALLOC_MEMORY(200, afDefault, 1024));
24334 :     //^2066:144B
24335 :     _4976_3954 = _4976_3952 = _4976_3950 = 0;
24336 :     //^2066:1456
24337 :     _4976_5258 = 0;
24338 :     //^2066:1462
24339 :     for (bp0e = 0; bp0e < _4976_4c3c; bp0e++) {
24340 :       //^2066:1469
24341 :       ObjectID *bp04 = _4976_53b4[bp0e].w193;
24342 :       //^2066:147A
24343 :       for (i16 bp12 = 0; bp12 < 30; bp12++) {
24344 :         //^2066:1481
24345 :         if (WRITE_RECORD_CHECKCODE(*(bp04++), 0, 0) != 0)
24346 :           goto _14fa;
24347 :         //^2066:149A
24348 :       }
24349 :       //^2066:14A3
24350 :     }
24351 :     //^2066:14AF
24352 :     if (WRITE_RECORD_CHECKCODE(_4976_57c8.w0, 0, 0) != 0)
24353 :       goto _14fa;
24354 :     //^2066:14C3
24355 :     if (STORE_EXTRA_DUNGEON_DATA() == 0)
24356 :       goto _14fa;
24357 :     //^2066:14CA
24358 :     if (WRITE_POSSESSION_INDICES() != 0)
24359 :       goto _14fa;
24360 :     //^2066:14D2
24361 :     if (SUPPRESS_FLUSH() != 0)
24362 :       goto _14fa;
24363 :     //^2066:14DA
24364 :     CLOSE_FILE(_4976_394e);
24365 :     //^2066:14E4
24366 :     _4976_5bf6 = 1;
24367 :     //^2066:14EA
24368 :     _4976_523c = _4976_4bec;
24369 :     //^2066:14F8
24370 :     goto _1523;
24371 : 
24372 :     //^2066:14FA
24373 : _14fa:
24374 :     CLOSE_FILE(_4976_394e);
24375 :     //^2066:1504
24376 :     DELETE_FILE(bp08);
24377 :     //^2066:1511
24378 :     _0aaf_0067(_0aaf_02f8(0x00, 0x1b));
24379 : 
24380 : _1523:
24381 :     //^2066:1523
24382 :     if (_4976_525e != NULL) {
24383 :       //^2066:152C
24384 :       DEALLOC_UPPER_MEMORY(200);
24385 :     }
24386 :     //^2066:1538
24387 :     if (_4976_5246 != NULL) {
24388 :       //^2066:1541
24389 :       DEALLOC_UPPER_MEMORY(U32(_4976_4d0e->nRecords[dbCreature]) << 1);
24390 :     }
24391 :     //^2066:1558
24392 :     if (_4976_5240 != NULL) {
24393 :       //^2066:1561
24394 :       DEALLOC_UPPER_MEMORY(U32(_4976_4d0e->nRecords[dbContainer] << 1));
24395 :     }
24396 :     //^2066:1578
24397 :     _1c9a_3b74();
24398 :     //^2066:157D
24399 :     if (bp18 != 0) {
24400 :       //^2066:1583
24401 :       _101b_0001(0);
24402 :     }
24403 :     //^2066:158B
24404 :     _2066_03e0(0);
24405 :     //^2066:1592
24406 :     _38c8_0060();
24407 :     //^2066:1597
24408 :     _443c_086b();
24409 :     //^2066:159C
24410 :     return;
24411 :   }
24412 : 
24413 :   void _2481_01d8(); // TODO: Unreachable
24414 :   //^2C1D:105F
24415 :   i16 _2c1d_105f(U16 xx)
24416 :   {
24417 :     //^2C1D:105F
24418 :     ENTER(6);
24419 :     //^2C1D:1065
24420 :     if (_4976_57e8 != 0)
24421 :       return 1;
24422 :     //^2C1D:1072
24423 :     sk53b4 *bp04 = &_4976_53b4[xx];
24424 :     U16 bp06 = _2c1d_0ffc(bp04);
24425 :     U16 di = _2c1d_203d(xx);
24426 :     U16 si;
24427 :     //^2C1D:109E
24428 :     if (bp06 > di) {
24429 :       si = 2;
24430 :       if ((U32(bp06) << 3) > bp06 * 5U) {
24431 :         //^2C1D:10CC
24432 :         si++;
24433 :       }
24434 :       //^2C1D:10CD
24435 :       di = 1;
24436 :     }
24437 :     else {
24438 :       //^2C1D:10D2
24439 :       si = ((di -bp06) << 2) / bp06 +4;
24440 :       di = 2;
24441 :     }
24442 :     //^2C1D:10E7
24443 :     if ((bp04->w52 & 0x20) != 0)
24444 :       si += di;
24445 :     //^2C1D:10F4
24446 :     si = max_value(1, si -bp04->b259);
24447 :     if (si > 2) {
24448 :       si = (si +1) & 0xfffe;
24449 :     }
24450 :     return si;
24451 :   }
24452 :   //^12B4:0881
24453 :   X16 _12b4_0881(X16 aa, U16 ss, U16 tt, i16 xx, i16 yy, ObjectID *rl)
24454 :   {
24455 :     //^12B4:0881
24456 :     ENTER(0);
24457 :     //^12B4:0886
24458 :     xxx;
24459 :     //^12B4:094F
24460 :     return;
24461 :   }
24462 :       void _12b4_023f(i16 xx, i16 yy, i16 *ss, i16 *tt, i16 ww, X16 vv); // TODO: placeholder
24463 :       X16 _12b4_0bf1(i16 xx, i16 yy, i16 ww, ObjectID *rl); // TODO: placeholder
24464 :       X16 _12b4_099e(ObjectID rl); // TODO: placeholder
24465 : 
24466 : 
24467 :   //^12B4:0300
24468 :   U16 _12b4_0300(X16 xx)
24469 :   {
24470 :     //^12B4:0300
24471 :     ENTER(38);
24472 :     //^12B4:0306
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 :     //^12B4:0338
24479 :     U16 si;
24480 :     for (si = 0; si < _4976_4c3c; bp04++, si++) {
24481 :       //^12B4:033C
24482 :       if (bp04->curHP() != 0) {
24483 :         bp26 = max_value(bp26, _2c1d_105f(si));
24484 :       }
24485 :       //^12B4:035B
24486 :     }
24487 :     //^12B4:0367
24488 :     if ((bp26 > 1 && _4976_4bea == 0 && xx != 3 && xx == 5 && _4976_4c08 == 0 && bp08 == 0) || _4976_19ba != ObjectID::FFFF) {
24489 :       //^12B4:0394
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 :     //^12B4:03D8
24501 :     U16 bp10;
24502 :     if (_4976_19ba != ObjectID::FFFF) {
24503 :       //^12B4:03E2
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 :         //^12B4:0427
24509 :         _4976_19ba = ObjectID::FFFF;
24510 :         bp10 = _4976_4bf4;
24511 :         if (xx == 3) {
24512 :           //^12B4:0439
24513 :           _12b4_0d75(_4976_4eb8, _4976_4eba, _4976_4eac, 0xfe);
24514 :         }
24515 :         //^12B4:0450
24516 :         if (_12b4_0300(xx) != 0) {
24517 :           //^12B4:045C
24518 :           _12b4_0141(_4976_4eb2);
24519 :           if (xx != 3) {
24520 :             //^12B4:046B
24521 :             CHANGE_CURRENT_MAP_TO(bp10);
24522 :             _12b4_0d75(_4976_4eb8, _4976_4eba, _4976_4eac, 0xfe);
24523 :           }
24524 :         }
24525 :         //^12B4:048B
24526 :         CHANGE_CURRENT_MAP_TO(_4976_4bf4);
24527 :       }
24528 :       //^12B4:0495
24529 :       _4976_19ba = ObjectID::FFFF;
24530 :       if (_4976_4ddc == 0)
24531 :         _4976_0c5c = 6;
24532 :       //^12B4:04A8
24533 :       return 1;
24534 :     }
24535 :     //^12B4:04AE
24536 :     bp10 = _4976_0c5a;
24537 :     X16 di = xx -3;
24538 :     //^12B4:04BC
24539 :     if (_4976_4c08 != 0 && di == 2) {
24540 :       CHANGE_CURRENT_MAP_TO(_4976_4c12);
24541 :     }
24542 :     //^12B4:04D2
24543 :     i16 bp1a = _4976_4c2e;
24544 :     i16 bp1c = _4976_4c30;
24545 :     i16 bp0e = _4976_4c2c;
24546 :     //^12B4:04E4
24547 :     _0cee_02dd(bp0e, _4976_19b2[di], _4976_19b6[di], &bp1a, &bp1c);
24548 :     //^12B4:0505
24549 :     U16 bp0a = GET_TILE_VALUE(bp1a, bp1c);
24550 :     _4976_4e5c = 1;
24551 :     bp04 = _4976_53b4;
24552 :     //^12B4:0525
24553 :     for (si = 0; si < _4976_4c3c; bp04++, si++) {
24554 :       //^12B4:0529
24555 :       if (bp04->curHP() != 0) {
24556 :         //^12B4:0533
24557 :         _2c1d_1c7c(si, ((_2c1d_203d(si) * 3) / _2c1d_0ffc(bp04)) +1);
24558 :       }
24559 :       //^12B4:055E
24560 :     }
24561 :     //^12B4:056A
24562 :     RESET_SQUAD_DIR();
24563 :     //^12B4:056E
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://^059A
24571 :       //^12B4:059A
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://^05C2
24578 :       //^12B4:05C2
24579 : _05c2:
24580 :       _12b4_00af(bp06 & 4);
24581 :       break;
24582 :     case 3://^05D0
24583 :       //^12B4:05D0
24584 :       if (_4976_4c3c == 0)
24585 :         break;
24586 :       //^12B4:05DA
24587 :       bp12 = _0cee_2de0(bp14) & 1;
24588 :       if (bp12 != 0 || _0cee_2e1e(bp14) == 0xff) {
24589 :         //^12B4:05FB
24590 :         _12b4_023f(bp1a, bp1c, &bp16, &bp18, bp0e, di);
24591 :       }
24592 :       //^12B4:0616
24593 :       bp24 = ((bp0e +xx) -3) & 3;
24594 :       if (_12b4_0bf1(bp1a, bp1c, bp24, &bp14) != 0 && _12b4_099e(bp14) != 0) {
24595 :         //^12B4:064C
24596 :         _12b4_0d75(bp1a, bp1c, bp24, 0xfe);
24597 :         goto _0685;
24598 :       }
24599 :       //^12B4:0662
24600 :       if (bp12 != 0)
24601 :         break;  
24602 :       //^12B4:066B
24603 :       _13e4_0401(ObjectID::FFFF, bp1a, bp1c, 0x4005, 5, 0);
24604 :       break;
24605 :     case 5://^0685
24606 :       //^12B4:0685
24607 : _0685:
24608 :       if (_4976_4c08 != 0 && di == 2) {
24609 :         //^12B4:0691
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 :       //^12B4:06C3
24616 :       if (bp08 != 0) {
24617 :         MOVE_RECORD_TO(ObjectID::FFFF, -1, 0, bp1a, bp1c);
24618 :         goto _0768;
24619 :       }
24620 :       //^12B4:06D6
24621 :       TELE_inf bp22;
24622 :       if (GET_TELEPORTER_DETAIL(&bp22, U8(bp1a), U8(bp1c)) != 0) {
24623 :         if (((bp22.b1 +2) & 3) != bp0e) {
24624 :           //^12B4:06FC
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 :       //^12B4:0750
24634 :       MOVE_RECORD_TO(ObjectID::FFFF, _4976_4bfa, _4976_4c06, bp1a, bp1c);
24635 :       //^12B4:0768
24636 : _0768:
24637 :       _4976_4c00 = bp26;
24638 :       _4976_4c14 = 0;
24639 :       //^12B4:0776
24640 :       return 1;
24641 :     case 2://^0779
24642 :       //^12B4:0779
24643 :       if (_4976_4c3c == 0)
24644 :         break;
24645 :       _12b4_023f(bp1a, bp1c, &bp16, &bp18, bp0e, di);
24646 :       //^12B4:079E
24647 :       if ((bp0a >> 5) != ttDoor || (bp0a & 7) != 4)
24648 :         break;
24649 :       //^12B4:07B7
24650 :       bp0c = 0;
24651 :       if (bp16 != 0xffff) {
24652 :         //^12B4:07C2
24653 :         bp04 = &_4976_53b4[bp16];
24654 :         bp0c += _2c1d_0e57(bp04, _2c1d_0ea2(bp04, 1, 0) + (RAND() & 15));
24655 :       }
24656 :       //^12B4:0803
24657 :       if (bp18 != bp16 && bp18 != 0xffff) {
24658 :         //^12B4:0811
24659 :         bp04 = &_4976_53b4[bp18];
24660 :         bp0c += _2c1d_0e57(bp04, _2c1d_0ea2(bp04, 1, 0) + (RAND() & 15));
24661 :       }
24662 :       //^12B4:084F
24663 :       _075f_2205(bp1a, bp1c, bp0c, 0, 0);
24664 :       break;
24665 :     case 4://^0864
24666 :       break;
24667 :     }
24668 :     //^12B4:0864
24669 :     _1031_098e();
24670 :     _4976_4e5c = 0;
24671 :     return 0;
24672 :   }
24673 : 
24674 :   //^1031:1951
24675 :   Bit16u HANDLE_UI_EVENT(sk4e4e *ref)
24676 :   {
24677 :     // CSBwinSimilarity: TAG01a7b2,_HandleMouseEvents
24678 : 
24679 :     // process user input event such as mouse click and keyboard pressure.
24680 : 
24681 :     //^1031:1951
24682 :     ENTER(46);
24683 :     //^1031:1957
24684 :     Bit16u si = ref->w4;
24685 :     Bit16u bp04 = ref->w0;
24686 :     Bit16u bp06 = ref->w2;
24687 :     //^1031:196B
24688 :     if (si >= 0x03 && si <= 0x06) {
24689 :       //^1031:1975
24690 :       if (_4976_4c00 == 0 || (_4976_4c14 != 0 && ((_4976_4bf6 +si -3) & 3) == _4976_4c0c))
24691 :         //^1031:197A
24692 :         goto _19b1;
24693 :     }
24694 :     //^1031:1994
24695 :     if (_4976_4bea != 0) {
24696 :       //^1031:199B
24697 :       if (si == 0x01 || si == 0x02 || si == 0x03)
24698 :         //^1031:19A8
24699 :         goto _19b1;
24700 :     }
24701 :     //^1031:19AA
24702 :     Bit16u di;
24703 :     if (_4976_4dfe != 0) {
24704 :       //^1031:19B1
24705 : _19b1:
24706 :       _4976_4e5c = 1;
24707 :       //^1031:19B7
24708 :             di = 0;
24709 :       //^1031:19B9
24710 :       //^1031:1E64
24711 :       return di;
24712 :     }
24713 :     //^1031:19BC
24714 :     di = 1;
24715 :     //^1031:19BF
24716 :     _4976_4e5c = 0;
24717 :     //^1031:19C5
24718 :     if (si == 0xe3) {
24719 :       //^1031:19CB
24720 :       _1031_050c();
24721 :     }
24722 :     //^1031:19D2
24723 :     else if (si == 0xe1) {
24724 :       //^1031:19D8
24725 :       _1031_04f5();
24726 :     }
24727 :     //^1031:19DF
24728 :     else if (si == 0x02 || si == 0x01) {
24729 :       //^1031:19E9
24730 :       _12b4_0141(si);
24731 :     }
24732 :     //^1031:19F2
24733 :     else if (si >= 0x03 && si <= 0x06) {
24734 :       //^1031:19FC
24735 :       _12b4_0300(si);
24736 :     }
24737 :     //^1031:1A05
24738 :     else if (si >= 0x14 && si <= 0x42) {
24739 :       //^1031:1A0F
24740 :       _2c1d_0889(si -0x14);
24741 :     }
24742 :     //^1031:1A1D
24743 :     else if (si >= 0xea && si <= 0xed) {
24744 :       //^1031:1A29
24745 :       _2c1d_0654(si -0xea);
24746 :     }
24747 :     //^1031:1A37
24748 :     else if (si >= 0x7d && si <= 0x81) {
24749 :       //^1031:1A42
24750 :       if (si == 0x81) {
24751 :         //^1031:1A48
24752 :         _443c_0662();
24753 :       }
24754 :       else {
24755 :         //^1031:1A4F
24756 :         _443c_04b6(si -0x7d);
24757 :       }
24758 :       //^1031:1A5B
24759 :       _1031_0667();
24760 :       //^1031:1A5F
24761 :       goto _1ab8;
24762 :     }
24763 :     //^1031:1A61
24764 :     else if (si >= 0xe4 && si <= 0xe9) {
24765 :       //^1031:1A6D
24766 :       _2759_28db(si -0xe4);
24767 :     }
24768 :     //^1031:1A7B
24769 :     else if (si == 0x5d || si == 0x5e) {
24770 :       //^1031:1A85
24771 :       i16 bp02 = (si == 0x5d) ? -1 : 1;
24772 :       //^1031:1A95
24773 :       _4976_52af[_4976_5366].playerDir((_4976_52af[_4976_5366].playerDir() +bp02) & 3);
24774 :       //^1031:1AB8
24775 : _1ab8:
24776 :       _2759_0644(0);
24777 :     }
24778 :     //^1031:1AC2
24779 :     else if (si >= 0x10 && si <= 0x13) {
24780 :       //^1031:1ACC
24781 :       _1031_16a0(GET_PLAYER_AT_POSITION((si -0x10 + _4976_4bf6) & 3));
24782 :       //^1031:1AE5
24783 :       _2e62_0cfa(0);
24784 :     }
24785 :     //^1031:1AEF
24786 :     else if (si >= 0x07 && si <= 0x0b) {
24787 :       //^1031:1AF9
24788 :       if (_4976_4bfc != 0 && si <= 0x0b) {
24789 :         //^1031:1B05
24790 :         //^1031:1DDE
24791 :         _2f3f_04ea(_4976_4bfa, _4976_4c06, _4976_4bf6, _4976_4bf4, 0xa1);
24792 :       }
24793 :       else {
24794 :         //^1031:1B0B
24795 :         Bit16u bp02 = si -0x07;
24796 :         //^1031:1B13
24797 :         if (bp02 == 4 || bp02 < _4976_4c3c) {
24798 :           //^1031:1B21
24799 :           if (_4976_4bfc == 0) {
24800 :             //^1031:1B2B
24801 :             _24a5_1798(bp02);
24802 :           }
24803 :         }
24804 :       }
24805 :     }
24806 :     //^1031:1B37
24807 :     else if (si == 0x52) {
24808 :       //^1031:1B3C
24809 :       if (_4976_3fc6 == 0xffff) {
24810 :         //^1031:1B46
24811 :         _24a5_1798(_4976_3fc6);
24812 :       }
24813 :     }
24814 :     //^1031:1B53
24815 :     else if (si == 0x6c) {
24816 :       //^1031:1B58
24817 :       _4976_4e5c = _2759_274d();
24818 :       //^1031:1B5D
24819 :       //^1031:1BA9
24820 :     }
24821 :     //^1031:1B5F
24822 :     else if (si == 0x6b) {
24823 :       //^1031:1B64
24824 :       REMOVE_RUNE_FROM_TAIL();
24825 :     }
24826 :     //^1031:1B6C
24827 :     else if (si >= 0x65 && si <= 0x6a) {
24828 :       //^1031:1B76
24829 :       ADD_RUNE_TO_TAIL(si -0x65);
24830 :     }
24831 :     //^1031:1B84
24832 :     else if (si == 0x70) {
24833 :       //^1031:1B89
24834 :       _2759_1204(-1);
24835 :     }
24836 :     //^1031:1B93
24837 :     else if (si >= 0x71 && si <= 0x73) {
24838 :       //^1031:1B9D
24839 :       _4976_4e5c = _2759_1204(si -0x71);
24840 :     }
24841 :     //^1031:1BAF
24842 :     else if (si >= 0x74 && si <= 0x7b) {
24843 :       //^1031:1BB9
24844 :       si -= 0x74;
24845 :       //^1031:1BBC
24846 :       _2759_0589(si >> 1, ((si & 1) != 0) ? 1 : 0);
24847 :     }
24848 :     //^1031:1BD6
24849 :     else if (si >= 0x5f && si <= 0x62) {
24850 :       //^1031:1BE0
24851 :       i16 bp02 = GET_PLAYER_AT_POSITION((si -0x5f + _4976_4bf6) & 3);
24852 :       //^1031:1BF6
24853 :       if (bp02 >= 0) {
24854 :         //^1031:1BFD
24855 :         _2759_0602(bp02);
24856 :       }
24857 :     }
24858 :     //^1031:1C09
24859 :     else if (si == 0x46) {
24860 :       //^1031:1C0E
24861 :       _24a5_10fb(0xffff, 0xffff, 0xffff);
24862 :     }
24863 :     //^1031:1C1B
24864 :     else if (si == 0x47) {
24865 :       //^1031:1C20
24866 :       _24a5_174d();
24867 :     }
24868 :     //^1031:1C28
24869 :     else if (si == 0x50) {
24870 :       //^1031:1C2D
24871 :       _121e_0422(bp04, bp06);
24872 :     }
24873 :     //^1031:1C3D
24874 :     else if (si == 0x96) {
24875 :       //^1031:1C43
24876 :       _1031_16fd(si, bp04, bp06);
24877 :     }
24878 :     //^1031:1C54
24879 :     else if (si >= 0x97 && si <= 0x9a) {
24880 :       //^1031:1C60
24881 :       _2759_13f5(si -0x97);
24882 :     }
24883 :     //^1031:1C6F
24884 :     else if (si == 0x93) {
24885 :       //^1031:1C75
24886 :       _4976_4c02 = 0;
24887 :       //^1031:1C7B
24888 :       _38c8_0002();
24889 :       //^1031:1C80
24890 :       _44c8_1d26(_4976_4c16, _4976_4bda[0]);
24891 :       //^1031:1C9A
24892 :       Bit8u bp2e[40];
24893 :       _3929_0bd7(
24894 :         6,
24895 :         _4976_4bda[4],
24896 :         QUERY_GDAT_TEXT(0x01, 0x00, 0x12, bp2e)
24897 :         );
24898 :       //^1031:1CC4
24899 :       _44c8_1be8(0);
24900 :       //^1031:1CCC
24901 :       _1031_0675(3);
24902 :       //^1031:1CD3
24903 :       _1031_098e();
24904 :     }
24905 :     //^1031:1CDA
24906 :     else if (si == 0x94) {
24907 :       //^1031:1CE0
24908 :       if (_4976_4c02 == 0) {
24909 :         //^1031:1CEA
24910 :         _4976_4c02 = 1;
24911 :         //^1031:1CF0
24912 :         _38c8_0060();
24913 :         //^1031:1CF5
24914 :         _1031_06a5();
24915 :         //^1031:1CF9
24916 :         _1031_098e();
24917 :       }
24918 :     }
24919 :     //^1031:1D00
24920 :     else if (true
24921 :       && _4976_4c38 == 0 
24922 :       && _4976_4bfe == 0 
24923 :       && _4976_4c3e == 0
24924 :       && _4976_4ddc == 0
24925 :     ) {
24926 :       //^1031:1D28
24927 :       if (si == 0x91) {
24928 :         //^1031:1D2E
24929 :         if (_4976_4bfc == 0) {
24930 :           //^1031:1D38
24931 :           _4976_3d59 = 0;
24932 :           //^1031:1D3E
24933 :           if (_4976_52be != 0) {
24934 :             //^1031:1D45
24935 :             _24a5_1798(4);
24936 :           }
24937 :           //^1031:1D4D
24938 :           _4976_3d59 = 1;
24939 :           //^1031:1D53
24940 :           _2759_0541();
24941 :           //^1031:1D58
24942 :           _38c8_0002();
24943 :           //^1031:1D5D
24944 :           _4976_4be8 = 1;
24945 :           //^1031:1D63
24946 :           if (_4976_4bea != 0) {
24947 :             //^1031:1D6A
24948 :             _12b4_0300(_4976_4bf2);
24949 :             //^1031:1D74
24950 :             _4976_4bea = 0;
24951 :           }
24952 :           //^1031:1D7A
24953 :           _1031_1907();
24954 :           //^1031:1D7E
24955 :           _44c8_1be8(0);
24956 :           //^1031:1D86
24957 :           _4976_4bf0 = 1;
24958 :           //^1031:1D8C
24959 :                     _1031_0541(2);
24960 :           //^1031:1D93
24961 :           _1031_098e();
24962 :         }
24963 :       }
24964 :       //^1031:1D9A
24965 :       else if (si == 0x92) {
24966 :         //^1031:1DA0
24967 :         _2c1d_14ba();
24968 :       }
24969 :       //^1031:1DA8
24970 :       else if (si == 0x8c) {
24971 :         //^1031:1DAE
24972 :         if (_4976_4c3c > 0 && _4976_4bfc == 0) {
24973 :           //^1031:1DC2
24974 :           _4976_4e62--;
24975 :           //^1031:1DC6
24976 :           _2066_0d09();
24977 :           //^1031:1DCB
24978 :                     _4976_4e62++;
24979 :         }
24980 :       }
24981 :       //^1031:1DD1
24982 :       else if (si == 0xa0 || si == 0xa1) {
24983 :         //^1031:1DDD
24984 :                 _2f3f_04ea(_4976_4bfa, _4976_4c06, _4976_4bf6, _4976_4bf4, si);
24985 :       }
24986 :       //^1031:1DF8
24987 :       else if (si == 0xd7) {
24988 :         //^1031:1DFE
24989 :         _4976_4c24 = 1;
24990 :       }
24991 :       //^1031:1E06
24992 :       else if (si == 0xd8) {
24993 :         //^1031:1E0C
24994 :         _4976_4c24 = 1;
24995 :         _4976_5bea = 1;
24996 :       }
24997 :       //^1031:1E1A
24998 :       else if (si == 0xd9) {
24999 :         //^1031:1E20
25000 :         _4976_4c24 = 0;
25001 :       }
25002 :       //^1031:1E28
25003 :       else if (si == 0xda) {
25004 :         //^1031:1E2E
25005 :         _2481_01d8();
25006 :       }
25007 :       //^1031:1E35
25008 :       else if (si == 0xdf) {
25009 :         //^1031:1E3B
25010 :         _4976_5bf2 = 1;
25011 :       }
25012 :       //^1031:1E43
25013 :       else if (si == 0xe0) {
25014 :         //^1031:1E49
25015 :         SK_PREPARE_EXIT();
25016 :       }
25017 :     }
25018 :     //^1031:1E4E
25019 :     if (_4976_4dfa >= 0xa5 && _4976_4dfa <= 0xc6)
25020 :       //^1031:1E5E
25021 :       _4976_4e5c = 1;
25022 :     //^1031:1E66
25023 :     return di;
25024 :   }
25025 : 
25026 :   //^1031:1E6A
25027 :   void _1031_1e6a() //#DS=4976
25028 :   {
25029 :     //^1031:1E6A
25030 :     ENTER(0);
25031 :     //^1031:1E6E
25032 :     if (_4976_4dfe != 0)
25033 :       //^1031:1E75
25034 :       _4976_4dfe--;
25035 :     //^1031:1E79
25036 :     _4976_4e48 = 0;
25037 : 
25038 :     do {
25039 :       //^1031:1E7F
25040 :       _1031_0f3a();
25041 :       //^1031:1E83
25042 :       if (_4976_4e60 == _4976_4e5e)
25043 :         //^1031:1E8A
25044 :         break;
25045 :       //^1031:1E8C
25046 :       Bit16u si = _4976_4e60++;
25047 :       //^1031:1E94
25048 :       if (_4976_4e60 > 2)
25049 :         //^1031:1E9C
25050 :         _4976_4e60 = 0;
25051 :       //^1031:1EA2
25052 :       if (HANDLE_UI_EVENT(&_4976_4e6c[si]) != 0) {
25053 :         //^1031:1EB8
25054 :         if (_4976_4e62 != 0)
25055 :           //^1031:1EBF
25056 :           _4976_4e62--;
25057 :       }
25058 :       else {
25059 :         //^1031:1EC5
25060 :         _4976_4e60 = si;
25061 :       }
25062 :       //^1031:1EC9
25063 :     } while (_4976_4e5c == 0);
25064 :     //^1031:1ED0
25065 :     return;
25066 :   }
25067 : 
25068 :   //^476D:04ED
25069 :   Bit16u _476d_04ed(Bit16u xx)
25070 :   {
25071 :     //^476D:04ED
25072 :     ENTER(0);
25073 :     //^476D:04F0
25074 :     return 0;
25075 :   }
25076 : 
25077 :   //^1031:0781
25078 :   void _1031_0781(Bit16u xx); // TODO: Unreachable
25079 : 
25080 :   //^
25081 :   void _4726_0383(); // TODO: Unreachable
25082 : 
25083 :   //^01B0:051A
25084 :   Bit16u _01b0_051a() //#DS=04BF
25085 :   {
25086 :     //^01B0:051A
25087 :     ENTER(0);
25088 :     //^01B0:051E
25089 :     LOADDS(0x3083);
25090 :     //^01B0:0524
25091 :     if (_04bf_0282 != 0 && _04bf_0284 != 0) {
25092 :       //^01B0:0532
25093 :       _4726_0383() INDIRECT_CALL;
25094 :     }
25095 :     //^01B0:0536
25096 :     return (_04bf_1886 != 0) ? 1 : 0;
25097 :   }
25098 : 
25099 :   //^476D:05A9
25100 :   Bit16u _476d_05a9()
25101 :   {
25102 :     //^476D:05A9
25103 :     ENTER(0);
25104 :     //^476D:05AC
25105 :     return _01b0_051a() CALL_IBMIO;
25106 :   }
25107 : 
25108 :   Bit8u _476d_04e8(Bit16u xx); // TODO: Unreachable
25109 :   Bit16u _476d_04af(Bit16u xx); // TODO: Unreachable
25110 : 
25111 :   Bit16u _476d_050e(); // TODO: Placeholder
25112 :   void _1031_06a5(); // TODO: Placeholder
25113 :   Bit16u _2066_2ca8(); // TODO: Placeholder
25114 :   Bit16u _2066_32bb(); // TODO: Placeholder
25115 : 
25116 :   //^2FCF:0B8B
25117 :   void _2fcf_0b8b(Bit16u xx, Bit16u yy, Bit16u zz)
25118 :   {
25119 :     //^2FCF:0B8B
25120 :     ENTER(6);
25121 :     //^2FCF:0B91
25122 :     _4976_4c12 = 0xffff;
25123 :     //^2FCF:0B97
25124 :     TELE_inf bp06;
25125 :     _4976_4c08 = GET_TELEPORTER_DETAIL(&bp06, Bit8u(xx), Bit8u(yy));
25126 :     //^2FCF:0BAD
25127 :     if (_4976_4c08 != 0) {
25128 :       //^2FCF:0BB1
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 :       //^2FCF:0BE6
25136 :       for (Bit16u si = 0; si < 4; si++) {
25137 :         //^2FCF:0BEA
25138 :         if (GET_TELEPORTER_DETAIL(&bp06, xx + _4976_0232[si], yy + _4976_023a[si]) != 0) {
25139 :           //^2FCF:0C13
25140 :           _4976_4c12 = bp06.target_z();
25141 :           //^2FCF:0C1B
25142 :           Bit16u di = bp06.cross_scene_test_of_teleporter_target() +6 -bp06.cross_scene_test();
25143 :           //^2FCF:0C2C
25144 :           si = (si +di +2) & 3;
25145 :           //^2FCF:0C37
25146 :           _4976_4c04 = bp06.target_x_pos() + _4976_0232[si];
25147 :           //^2FCF:0C47
25148 :           _4976_4c1e = bp06.target_y_pos() + _4976_023a[si];
25149 :           //^2FCF:0C57
25150 :           _4976_4c10 = (_4976_4bf6 + di) & 3;
25151 :           //^2FCF:0C62
25152 :           break;
25153 :         }
25154 :         //^2FCF:0C64
25155 :       }
25156 :     }
25157 :     //^2FCF:0C6A
25158 :     _4976_0c5a = -1;
25159 :     //^2FCF:0C70
25160 :     CHANGE_CURRENT_MAP_TO(zz);
25161 :     //^2FCF:0C79
25162 :     return;
25163 :   }
25164 : 
25165 :   //^443C:06AF
25166 :   void _443c_06af(sk0ce0 *ref)
25167 :   {
25168 :     //^443C:06AF
25169 :     ENTER(0);
25170 :     //^443C:06B2
25171 :     return;
25172 :   }
25173 : 
25174 :   //^1031:096A
25175 :   void _1031_096a()
25176 :   {
25177 :     //^1031:096A
25178 :     ENTER(0);
25179 :     //^1031:096E
25180 :     for (i16 si = 0; si < 18; si++) {
25181 :       //^1031:0972
25182 :       _443c_06af(&_4976_0ce0[1 +si]);
25183 :       //^1031:0985
25184 :     }
25185 :     //^1031:098B
25186 :     return;
25187 :   }
25188 : 
25189 :   //^482B:015C
25190 :   Bit16u _482b_015c(Bit16u xx)
25191 :   {
25192 :     //^482B:015C
25193 :     ENTER(0);
25194 :     //^482B:0160
25195 :     for (Bit16u si = 0; si < _4976_49d4; si++) {
25196 :       //^482B:0164
25197 :       if (_4976_5f06[si].w5 == xx) {
25198 :         //^482B:017A
25199 :         return si +1;
25200 :       }
25201 :       //^482B:017F
25202 :     }
25203 :     //^482B:0186
25204 :     return 0;
25205 :   }
25206 : 
25207 :   //^01B0:18D3
25208 :   void _01b0_18d3(Bit16u xx) //#DS=4976
25209 :   {
25210 :     //^01B0:18D3
25211 :     ENTER(2);
25212 :     //^01B0:18D8
25213 :     Bit8u bp02 = _4976_04ee;
25214 :     //^01B0:18E9
25215 :     LOADDS(0x3083);  //#DS=04BF
25216 :     //^01B0:18EF
25217 :     if (_04bf_028c != 0) {
25218 :       //^01B0:18F6
25219 :       if (_01b0_13d6 != 0) {
25220 :         //^01B0:18FE
25221 :         _01b0_13d6 = 1;  
25222 :         //^01B0:1908
25223 :         while (_01b0_13d6 != 0);
25224 :         //^01B0:1910
25225 :         for (Bit16u si = 0; si < _04bf_028e; si++) {
25226 :           //^01B0:1914
25227 :           _04bf_0290[si] = 0;
25228 :           //^01B0:192C
25229 :         }
25230 :       }
25231 :       //^01B0:1933
25232 :     }
25233 :     else {
25234 :       //^01B0:1935
25235 :       IBMIO_BLEND_TO_SNDBUFF(&bp02, 1, 1, 6000);
25236 :     }
25237 :     //^01B0:1949
25238 :     return;
25239 :   }
25240 : 
25241 :   //^47EB:02C3
25242 :   void _47eb_02c3(sk5f0a *ref)
25243 :   {
25244 :     //^47EB:02C3
25245 :     ENTER(0);
25246 :     //^47EB:02C6
25247 :     _01b0_18d3(0) CALL_IBMIO;
25248 :     //^47EB:02D1
25249 :     return;
25250 :   }
25251 : 
25252 :   //^47EB:00D9
25253 :   void _47eb_00d9(sk5f0a *ref)
25254 :   {
25255 :     //^47EB:00D9
25256 :     ENTER(4);
25257 :     //^47EB:00DD
25258 :     _47eb_02c3(ref);
25259 :     //^47EB:00EA
25260 :     sk5f0a **bp04 = &_4976_5efa;
25261 :     //^47EB:00F2
25262 :     while ((*bp04) != NULL && (*bp04) != ref) {
25263 :       //^47EB:00F4
25264 :       bp04 = &(*bp04)->pv8;
25265 :       //^47EB:0107
25266 :     }
25267 :     //^47EB:0124
25268 :     if ((*bp04) == ref) {
25269 :       //^47EB:0138
25270 :       (*bp04) = ref->pv8;
25271 :     }
25272 :     //^47EB:014D
25273 :     return;
25274 :   }
25275 : 
25276 :   //^482B:07C2
25277 :   void _482b_07c2(Bit16u xx)
25278 :   {
25279 :     //^482B:07C2
25280 :     ENTER(0);
25281 :     //^482B:07C7
25282 :     for (Bit16u si = 0; _4976_49d4-- > si; ) {
25283 :       //^482B:07CB
25284 :       Bit16u di = _4976_5f06[_4976_49d4].w5;
25285 :       //^482B:07DF
25286 :       if (di != 0xffff) {
25287 :         //^482B:07E4
25288 :         if (_482b_015c(di) == 0) {
25289 :           //^482B:07EE
25290 :           _47eb_00d9(&_4976_5f0a[_4976_5f06[_4976_49d4].w0]);
25291 :           //^482B:0814
25292 :           _4976_49d6--;
25293 :         }
25294 :       }
25295 :       //^482B:0818
25296 :     }
25297 :     //^482B:0823
25298 :     _4976_49d4 = si;
25299 :     _4976_49d0 = 0;
25300 :     //^482B:082D
25301 :     return;
25302 :   }
25303 : 
25304 :   //^4726:00F3
25305 :   void EMS_FREE()
25306 :   {
25307 :     DOSIMPL();
25308 : 
25309 : //    //^4726:00F3
25310 : //    ENTER(0);
25311 : //    //^4726:00F6
25312 : //    if (_4976_5ea4 != 0) {
25313 : //      //^4726:00FD
25314 : //      __asm mov dx,[_4976_5ea4]
25315 : //      __asm mov ah,0x45
25316 : //      __asm int 0x67
25317 : //    }
25318 : //    //^4726:0105
25319 : //    return;
25320 :   }
25321 : 
25322 :   //^069A:05DE
25323 :   void _farfree(void *ref);
25324 : 
25325 :   //^069A:014A
25326 :   void __restorezero();
25327 : 
25328 :   //^069A:00EA
25329 :   void __declspec(noreturn) __terminate(Bit8u errorLevel)
25330 :   {
25331 : //    //^069A:00EA
25332 : //    //^069A:00EF
25333 : //    __restorezero();
25334 : //    //^069A:00F4
25335 : //    __asm mov bp,sp
25336 : //    __asm mov ah,0x4c
25337 : //    __asm mov al,[bp+04]
25338 : //    __asm int 0x21h
25339 :   }
25340 : 
25341 :   //^4726:0448
25342 :   void SK_EXIT()
25343 :   {
25344 :     //^4726:0448
25345 :     ENTER(0);
25346 :     //^4726:044B
25347 :     EMS_FREE();
25348 :     //^4726:044F
25349 :     _farfree(_4976_5e94);
25350 :     //^4726:045E
25351 :     __terminate((_4976_4c26 != 0) ? 1 : 0);
25352 :     //^4726:0473
25353 :     return;
25354 :   }
25355 : 
25356 :   //^
25357 :   void _069a_043c(Bit16u *xx, Bit16u yy); // TODO: Unreachable
25358 : 
25359 :   //^101B:0111
25360 :   void SK_PREPARE_EXIT()
25361 :   {
25362 :     //^101B:0111
25363 :     ENTER(0);
25364 :     //^101B:0114
25365 :     _1031_096a();
25366 :     //^101B:0119
25367 :     while (_4976_4860 <= 0)
25368 :       //^101B:011B
25369 :       _443c_085a();
25370 :     //^101B:0127
25371 :     GRAPHICS_DATA_CLOSE();
25372 :     //^101B:012C
25373 :     GRAPHICS_DATA_CLOSE();
25374 :     //^101B:0131
25375 :     _482b_07c2(1);
25376 :     //^101B:0139
25377 :     if (_4976_4c26 != 0) {
25378 :       //^101B:0140
25379 :       FIRE_FILL_SCREEN_RECT(2, 0);
25380 :     }
25381 :     //^101B:014B
25382 :     SK_EXIT();
25383 :     //^101B:0150
25384 :     _069a_043c(&_4976_4de0, 1);
25385 :     //^101B:015B
25386 :     return;
25387 : 
25388 :   }
25389 : 
25390 :   //^3A15:3331
25391 :   void RUN_ACTUATOR_TICK_GENERATOR(Actuator *ref, ObjectID recordLink)
25392 :   {
25393 :     //^3A15:3331
25394 :         //^3A15:3337
25395 :     Bit16u di = ref->ActionType();
25396 :     //^3A15:3343
25397 :     Bit16u si;
25398 :     switch (di) {
25399 :       case 0x001e: // 0x001e -> Activator, tick generator
25400 :         //^3A15:3358
25401 :         si = 1; break;
25402 :       case 0x0033: // 0x0033 -> -
25403 :         //^3A15:335D
25404 :         si = 8; break;
25405 :       case 0x0034: // 0x0034 -> -
25406 :         //^3A15:3362
25407 :         si = 16; break;
25408 :       case 0x0035: // 0x0035 -> -
25409 :         //^3A15:3367
25410 :         si = 32; break;
25411 :       case 0x0036: // 0x0036 -> -
25412 :         //^3A15:336C
25413 :         si = 64; break;
25414 :       case 0x0037: // 0x0037 -> -
25415 :         //^3A15:3371
25416 :         si = 128; break;
25417 :     }
25418 :     //^3A15:3374
25419 :     if (ref->ActuatorData() != 0) {
25420 :       //^3A15:3385
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 :       //^3A15:33ED
25430 :       QUEUE_TIMER(&bp0a);
25431 :     }
25432 :     //^3A15:3400
25433 :     return;
25434 :   }
25435 : 
25436 :   //^0B36:1647
25437 :   void DRAW_DIALOGUE_PARTS_PICT(Bit8u *buffsrc, SRECT *rc, __int16 colorkey, Bit8u *localpal)
25438 :   {
25439 :     // the back buffer is an off-screen buffer of the dungeon viewport (224x136x8bpp)
25440 : 
25441 :     // what you draw:
25442 :     // a) dialogue window
25443 :     // b) dialogue button
25444 :     // c) 18x18 bevelled icon frame
25445 : 
25446 :     //^0B36:1647
25447 :     //^0B36:164A
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 :     //^0B36:1686
25463 :     return;
25464 :   }
25465 : 
25466 :   //^3E74:0AE3
25467 :   void FREE_PICT_ENTRY(Bit8u *buff)
25468 :   {
25469 :     //^3E74:0AE3
25470 :     //^3E74:0AE7
25471 :     if (_4976_5d76 == 0) {
25472 :       //^3E74:0AF1
25473 :       sk5cfc *bp04 = &_4976_5cfc;
25474 :       //^3E74:0AF9
25475 :       for (; (void *)PTR_ADD(buff,-14) != (void *)bp04->pv0; ) {
25476 :         //^3E74:0AFB
25477 :         bp04 = bp04->pv0;
25478 :       }
25479 :       //^3E74:0B31
25480 :       bp04->pv0 = bp04->pv0->pv0;
25481 :       //^3E74:0B48
25482 :       Bit32u bp08 = CALC_IMAGE_BYTE_LENGTH(buff);
25483 :       //^3E74:0B60
25484 :       if (reinterpret_cast<SkImage *>(PTR_ADD(buff,-14))->AllocLower() == 0) {
25485 :         //^3E74:0B7C
25486 :         DEALLOC_UPPER_MEMORY(bp08);
25487 :       }
25488 :       else {
25489 :         //^3E74:0B88
25490 :         DEALLOC_LOWER_MEMORY(bp08);
25491 :       }
25492 :     }
25493 :     //^3E74:0B94
25494 :     return;
25495 :   }
25496 : 
25497 :   //^3929:0BD7
25498 :   void _3929_0bd7(Bit16u xx, Bit16u yy, Bit8u *zz)
25499 :   {
25500 :     //^3929:0BD7
25501 :     //^3929:0BDB
25502 :     __int16 bp02;
25503 :     __int16 bp04;
25504 :     if (_3929_03dc(zz, &bp02, &bp04) != 0) {
25505 :       //^3929:0BF6
25506 :       SRECT bp0c;
25507 :       if (QUERY_BLIT_RECT(NULL, &bp0c, xx, &bp02, &bp04, -1) != 0) {
25508 :         //^3929:0C1A
25509 :         DRAW_GAMELOAD_STR(bp0c.x, bp0c.y + bp0c.cy -1, yy, zz);
25510 :       }
25511 :     }
25512 :     //^3929:0C35
25513 :     return;
25514 :   }
25515 : 
25516 :   //^3929:000F
25517 :   Bit16u QUERY_MBCS_PRESENCE(Bit8u *str);
25518 : 
25519 :   //^3929:0044
25520 :   blitx1 *_3929_0044(Bit8u xx, Bit8u x1, __int8 x2, Bit8u *vv);
25521 : 
25522 :   //^3929:03DC
25523 :   Bit16u _3929_03dc(Bit8u *buff, __int16 *xx, __int16 *yy)
25524 :   {
25525 :     //^3929:03DC
25526 :     //^3929:03E2
25527 :     if (buff == NULL) {
25528 :       //^3929:03EA
25529 :       return 0;
25530 :     }
25531 :     //^3929:03EF
25532 :     __int16 si;
25533 :     Bit16u di;
25534 :     if (QUERY_MBCS_PRESENCE(buff) != 0) {
25535 :       //^3929:0402
25536 :       si = - _4976_0132;
25537 :       Bit8u bp05 = 1;
25538 :       di = 0;
25539 :       //^3929:040F
25540 :       for (; *buff != 0; ) {
25541 :         //^3929:0412
25542 :         Bit8u bp06 = *(buff++);
25543 :         Bit8u bp07;
25544 :         //^3929:041E
25545 :         if (bp06 >= 0xf0) {
25546 :           //^3929:0422
25547 :           bp07 = *buff; buff++;
25548 :         }
25549 :         //^3929:0430
25550 :         else if (bp06 < 32) {
25551 :           //^3929:0436
25552 :           if (bp06 == 2) {
25553 :             //^3929:043C
25554 :             bp05 = *buff + 0xe0 + bp06;
25555 :           }
25556 :           //^3929:044A
25557 :           continue;
25558 :         }
25559 :         else {
25560 :           //^3929:044C
25561 :           bp07 = bp06;
25562 :           bp06 = 0;
25563 :         }
25564 :         //^3929:0456
25565 :         Bit8u bp08;
25566 :         blitx1 *bp04 = _3929_0044(bp05, bp06, bp07, &bp08);
25567 :         //^3929:0474
25568 :         if (bp04 != NULL) {
25569 :           //^3929:0478
25570 :           si += bp04->x2 + _4976_0132;
25571 :           //^3929:0485
25572 :           di = max_value(di, bp04->y2 - _4976_0136);
25573 :         }
25574 :         //^3929:0498
25575 :       }
25576 :       //^3929:04A4
25577 :     }
25578 :     else {
25579 :       //^3929:04A6
25580 :       si = - _4976_0120;
25581 :       di = _4976_011e - _4976_0124;
25582 :       //^3929:04B6
25583 :       while (*(buff++) != 0) {
25584 :         //^3929:04B8
25585 :         si += _4976_0126;
25586 :       }
25587 :     }
25588 :     //^3929:04C8
25589 :     if (si <= 0) {
25590 :       //^3929:04CC
25591 :       //^3929:03EA
25592 :       return 0;
25593 :     }
25594 :     //^3929:04CF
25595 :     *xx = si;
25596 :     *yy = di;
25597 :     //^3929:04DB
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 :   //^3929:04E2
25608 :   Bit16u _3929_04e2(Bit8u *str, Bit8u *yy, Bit16u *zz, __int16 ww)
25609 :   {
25610 :     //^3929:04E2
25611 :     //^3929:04E8
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 :     //^3929:0504
25619 :     if (QUERY_MBCS_PRESENCE(str) != 0 || _4976_475e != 0xff) {
25620 :       //^3929:051E
25621 :       if (_4976_475e == 0xff) {
25622 :         //^3929:0525
25623 :         _4976_475e = 1;
25624 :       }
25625 :       else {
25626 :         //^3929:052C
25627 :         yy[di] = 2; di++;
25628 :         //^3929:0534
25629 :         yy[di] = 0x20 + _4976_475e;
25630 :         //^3929:053C
25631 :                 di++;
25632 :       }
25633 : 
25634 :       while (true) {
25635 :         //^3929:053D
25636 :         yy[di] = 0;
25637 :         //^3929:0544
25638 :         if (str[si] == vbLf || str[si] == 0) {
25639 :           //^3929:0553
25640 :           if (str[si] == 0) {
25641 :             _4976_475e = 0xff;
25642 :           }
25643 :           //^3929:0564
25644 :           break;
25645 :         }
25646 :         //^3929:0567
25647 :         Bit8u bp0d = str[si];
25648 :         //^3929:0570
25649 :         Bit8u bp0e;
25650 :         if (bp0d >= 0xf0) {
25651 :           //^3929:0574
25652 :           bp0e = str[si +1];
25653 :         }
25654 :         else {
25655 :           //^3929:057D
25656 :           if (bp0d < 0x20) {
25657 :             //^3929:0583
25658 :             yy[di] = str[si]; si++; di++;
25659 :             //^3929:0591
25660 :             if (bp0d == 2) {
25661 :               //^3929:0597
25662 :               _4976_475e = (yy[di] = str[si]) + 0xe0; si++; di++;
25663 :             }
25664 :             //^3929:05AA
25665 :             continue;
25666 :           }
25667 :           //^3929:05AC
25668 :           bp0e = bp0d;
25669 :           bp0d = 0;
25670 :           //^3929:05B6
25671 :           if (str[si] == 0x20) {
25672 :             //^3929:05BF
25673 :             bp04 = si;
25674 :             bp06 = di;
25675 :             bp08 = bp02;
25676 :           }
25677 :         }
25678 :         //^3929:05CB
25679 :         Bit8u bp0f;
25680 :         blitx1 *bp0c = _3929_0044(_4976_475e, bp0d, bp0e, &bp0f);
25681 :         //^3929:05E9
25682 :         if (bp0c == NULL) {
25683 :           //^3929:05ED
25684 :           si++;
25685 :           if (bp0d != 0) {
25686 :             //^3929:05F7
25687 :             si++;
25688 :           }
25689 :           //^3929:05F8
25690 :           continue;
25691 :         }
25692 :         //^3929:05FB
25693 :         if (__int16(bp0c->x2) + _4976_0132 + bp02 <= ww) {
25694 :           //^3929:060E
25695 :           if (bp02 == 0) {
25696 :             //^3929:0614
25697 :             bp02 = - _4976_0132;
25698 :           }
25699 :           //^3929:061C
25700 :           bp02 += bp0c->x2 + _4976_0132;
25701 :           //^3929:062A
25702 :           if (bp0d != 0) {
25703 :             //^3929:0630
25704 :             yy[di] = str[si]; si++; di++;
25705 :           }
25706 :           //^3929:063E
25707 :           yy[di] = str[si]; si++;
25708 :           //^3929:064B
25709 :           di++; continue;
25710 :         }
25711 :         //^3929:064E
25712 :         if (bp04 != 0xffff) {
25713 :           //^3929:0654
25714 :           *zz = bp04 +1;
25715 :           //^3929:065E
25716 :           yy[bp06] = 0;
25717 :           //^3929:0668
25718 :           return bp08;
25719 :         }
25720 :         //^3929:066D
25721 :         break;
25722 :       }
25723 :     }
25724 :     else {
25725 :       while (true) {
25726 :         //^3929:066F
25727 :         yy[di] = 0;
25728 :         //^3929:0676
25729 :         if (str[si] == vbLf || str[si] == 0)
25730 :           //^3929:0685
25731 :           break;
25732 :         //^3929:0687
25733 :         if (str[si] == 0x20) {
25734 :           //^3929:0690
25735 :           bp04 = si;
25736 :           bp06 = di;
25737 :           bp08 = bp02;
25738 :         }
25739 :         //^3929:069C
25740 :         if (bp02 + _4976_0126 <= ww) {
25741 :           //^3929:06A8
25742 :           if (bp02 == 0) {
25743 :             //^3929:06AE
25744 :             bp02 = - _4976_0120;
25745 :           }
25746 :           //^3929:06B6
25747 :           bp02 += _4976_0126;
25748 :           //^3929:06BC
25749 :           yy[di] = str[si]; si++; di++;
25750 :           //^3929:06CA
25751 :           continue;
25752 :         }
25753 :         //^3929:06CC
25754 :         if (bp04 == 0xffff) {
25755 :           //^3929:06D0
25756 :           break;
25757 :         }
25758 :       }
25759 :     }
25760 :     //^3929:06D4
25761 :     *zz = si;
25762 :     //^3929:06DA
25763 :     return bp02;
25764 :   }
25765 : 
25766 :   //^470A:0089
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 :   //^3929:0B6C
25772 :   void DRAW_GAMELOAD_STR(Bit16u dstx, Bit16u dsty, Bit16u clr1, Bit8u *str)
25773 :   {
25774 :     // draw dialogue text such as.
25775 :     // a) version: "V1.0"
25776 :     // b) button text: "A6 86 97 A8" [ƒ[ƒgJ] (=load), "8B 84 A7 92 A5" [ƒLƒƒƒ“ƒZƒ‹] (=cancel)
25777 :     // c) savegame name: "0 GAMEE", "GAME 1 STRONG", "2 UNUSED", "3 UNUSED", ...
25778 : 
25779 :     //^3929:0B6C
25780 :     //^3929:0B6F
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 :     //^3929:0BA4
25793 :     return;
25794 :   }
25795 : 
25796 :   //^3A15:020F
25797 :   void _3a15_020f()
25798 :   {
25799 :     //^3A15:020F
25800 :     ENTER(4);
25801 :     //^3A15:0215
25802 :     Bit16u di = _4976_5c1e;
25803 :     //^3A15:021A
25804 :     if (di == 0)
25805 :       //^3A15:021C
25806 :       return;
25807 :     //^3A15:0220
25808 :     Bit16u si;
25809 :     for (si = 0; si < 4; si++) {
25810 :       //^3A15:0222
25811 :       _4976_53b4[si].w46 = 0xffff;
25812 :       //^3A15:0231
25813 :     }
25814 :     //^3A15:0237
25815 :     si = 0;
25816 :     //^3A15:0239
25817 :     sk5c20 *bp04 = _4976_5c20;
25818 :     //^3A15:0246
25819 :     for (; si < di; si++, bp04++) {
25820 :       //^3A15:0248
25821 :       switch (bp04->TimerType()) {
25822 :         case 12:
25823 :           //^3A15:0262
25824 :           _4976_53b4[bp04->b5].w46 = si;
25825 :           break;
25826 :         case 29:
25827 :         case 30:
25828 :           //^3A15:0278
25829 :           GET_ADDRESS_OF_RECORDE(bp04->w6)->TimerIndex(si);
25830 :           break;
25831 :       }
25832 :       //^3A15:028D
25833 :     }
25834 :     //^3A15:0296
25835 :     return;
25836 :   }
25837 : 
25838 :   //^3A15:029A
25839 :   void COMPACT_TIMERLIST()
25840 :   {
25841 :     //^3A15:029A
25842 :     //^3A15:02A0
25843 :     Bit16u si = 0;
25844 :     Bit16u di = _4976_5c1e;
25845 :     //^3A15:02A7
25846 :     if (di != 0) {
25847 :       //^3A15:02AB
25848 :       sk5c20 *bp04 = _4976_5c20;
25849 : 
25850 :       do {
25851 :         //^3A15:02B8
25852 :         if (bp04->TimerType() == 0) {
25853 :           //^3A15:02C2
25854 :           sk5c20 *bp08 = &bp04[1];
25855 :           //^3A15:02D1
25856 :           for (; bp08->TimerType() == 0; bp08++);
25857 :           //^3A15:02E1
25858 :           *bp04 = *bp08;
25859 :           //^3A15:02F5
25860 :           bp08->TimerType(0);
25861 :         }
25862 :         //^3A15:02FD
25863 :         bp04++;
25864 :         si++;
25865 :         //^3A15:0302
25866 :       } while (si != di);
25867 :       //^3A15:0308
25868 :       _3a15_008e();
25869 :       _3a15_020f();
25870 :     }
25871 :     //^3A15:0310
25872 :     return;
25873 :   }
25874 : 
25875 :   //^0CD5:0147
25876 :   Bit16u RAND02()
25877 :   {
25878 :     // CSBwinSimilarity: TAG001074,STRandom0_3
25879 : 
25880 :     //^0CD5:0147
25881 :     //^0CD5:014A
25882 :     _4976_49ba = _4976_49ba * 0xbb40e62d + 11;
25883 :     //^0CD5:016A
25884 :     return (_4976_49ba >> 8) & 3;
25885 :   }
25886 : 
25887 :   //^098D:02D2
25888 :   Bit16u CALC_SIZE_OF_COMPRESSED_RECT(Bit16u xx)
25889 :   {
25890 :     //^098D:02D2
25891 :     Bit16u di = xx;
25892 :     Bit16u si = 8;
25893 :     //^098D:02DD
25894 :     if ((di & 4) != 0) {
25895 :       //^098D:02E3
25896 :       //^098D:02F7
25897 :       si = si -2;
25898 :     }
25899 :     else {
25900 :       //^098D:02E5
25901 :       if ((di & 2) != 0) {
25902 :         //^098D:02EB
25903 :         si = si -2;
25904 :       }
25905 :       //^098D:02F1
25906 :       if ((di & 1) != 0) {
25907 :         //^098D:02F7
25908 :         si = si -2;
25909 :       }
25910 :     }
25911 :     //^098D:02FD
25912 :     if ((di & 24) != 0) {
25913 :       //^098D:0303
25914 :       si = si -2;
25915 :     }
25916 :     //^098D:0309
25917 :     return si;
25918 :   }
25919 : 
25920 :   //^098D:1208
25921 :   void _098d_1208() //#DS=4976?
25922 :   {
25923 :     // TODO: –{ƒYƒŒ”Ÿ”
25924 :     //^098D:1208
25925 :     //^098D:120B
25926 :     LOAD_RECTS_AND_COMPRESS(1, 0, 0);
25927 :     //^098D:1218
25928 :     _4976_4ba4 = 1;
25929 :     //^098D:121E
25930 :     return;
25931 :   }
25932 : 
25933 :   //^3E74:0A51
25934 :   void DEALLOC_LOWER_MEMORY(Bit32u size) //#DS=4976?
25935 :   {
25936 :     // TODO: –{ƒYƒŒ”Ÿ”
25937 :     //^3E74:0A51
25938 :     //^3E74:0A54
25939 :     if ((size & 1) != 0) {
25940 :       //^3E74:0A5F
25941 :       size++;
25942 :     }
25943 :     //^3E74:0A67
25944 :     _4976_5d30 += size;
25945 :     //^3E74:0A75
25946 :     return;
25947 :   }
25948 : 
25949 :   //^3E74:5AB7
25950 :   Bit16u QUERY_GDAT_ENTRY_DATA_LENGTH(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4);
25951 : 
25952 :   //^098D:1185
25953 :   void LOAD_RECTS_AND_COMPRESS(Bit8u cls1, Bit8u cls2, Bit8u cls4) //#DS=4976?
25954 :   {
25955 :     // TODO: –{ƒYƒŒ”Ÿ”
25956 :     //^098D:1185
25957 :     //^098D:1189
25958 :     Bit32u bp08 = QUERY_GDAT_ENTRY_DATA_LENGTH(cls1, cls2, dt04, cls4);
25959 :     //^098D:11A2
25960 :     Bit8u *bp04 = ALLOC_MEMORY(bp08, afUseLower, 1024);
25961 :     //^098D:11C0
25962 :     LOAD_GDAT_ENTRY_DATA_TO(cls1, cls2, dt04, cls4, bp04);
25963 :     //^098D:11DC
25964 :     COMPRESS_RECTS((__int16 *)bp04, bp08, &_4976_0194, ALLOC_UPPER_MEMORY);
25965 :     //^098D:11F9
25966 :     DEALLOC_LOWER_MEMORY(bp08);
25967 :   }
25968 : 
25969 :   //^3E74:51E4
25970 :   void LOAD_GDAT_ENTRY_DATA_TO(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4, Bit8u *where) //#DS=4976?
25971 :   {
25972 :     // TODO: –{ƒYƒŒ”Ÿ”
25973 :     //^3E74:51E4
25974 :     Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, cls3, cls4);
25975 :     //^3E74:5201
25976 :     LOAD_GDAT_RAW_DATA(si, CONVERT_PHYS_TO_SHELF_FORM(where));
25977 :   }
25978 : 
25979 :   //^098D:116D
25980 :   Bit8u *ALLOC_UPPER_MEMORY(Bit32u size)
25981 :   {
25982 :     // TODO: –{ƒYƒŒ”Ÿ”
25983 :     //^098D:116D
25984 :     //^098D:1170
25985 :     return ALLOC_MEMORY(size, afUseUpper, 1024);
25986 :   }
25987 : 
25988 :   //^098D:0E78
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 :     // TODO: –{ƒYƒŒ”Ÿ”
25996 :     //^098D:0E78
25997 :     //^098D:0E7E
25998 :     if (*(data++) != (__int16)0xfc0d)
25999 :       return;
26000 :     //^098D:0E8F
26001 :     __int16 bp0e = *(data++);
26002 :     //^098D:0E9C
26003 :     __int16 *bp08 = data;
26004 :     //^098D:0EA8
26005 :     data += bp0e << 1;
26006 :     //^098D:0EB2
26007 :     while (zz->pb0 != NULL) {
26008 :       //^098D:0EB4
26009 :       zz = zz->pb0;
26010 :     }
26011 :     //^098D:0ED0
26012 :     for (; --bp0e >= 0; ) {
26013 :       //^098D:0ED3
26014 :       Bit16u bp0a = *bp08; bp08++;
26015 :       //^098D:0EE0
26016 :       Bit16u bp0c = *bp08; bp08++;
26017 :       //^098D:0EED
26018 :       __int16 si = bp0c - bp0a +1;
26019 :       //^098D:0EF3
26020 :       __int16 *bp16 = data;
26021 :       //^098D:0EFF
26022 :       Bit8u bp17 = 0x1f;
26023 :       //^098D:0F03
26024 :       Bit16u bp1a = data[0];
26025 :       //^098D:0F0C
26026 :       Bit16u bp1c = data[1];
26027 : 
26028 :       do {
26029 :         //^098D:0F13
26030 :         if (*(data++) != (__int16)bp1a) {
26031 :           //^098D:0F22
26032 :           bp17 &= ~2;
26033 :         }
26034 :         //^098D:0F2A
26035 :         if (*(data) != (__int16)bp1c) {
26036 :           //^098D:0F35
26037 :           bp17 &= ~1;
26038 :         }
26039 :         //^098D:0F3D
26040 :         if (*(data++) > 255) {
26041 :           //^098D:0F4B
26042 :           bp17 &= ~4;
26043 :         }
26044 :         //^098D:0F53
26045 :         Bit16u bp1e = 2;
26046 : 
26047 :         do {
26048 :           //^098D:0F58
26049 :           __int16 di = *(data++);
26050 :           //^098D:0F64
26051 :           if (di < 0 || di > 255) {
26052 :             //^098D:0F6E
26053 :             bp17 &= ~16;
26054 :           }
26055 :           //^098D:0F76
26056 :           if (di < -128 || di > 127) {
26057 :             //^098D:0F80
26058 :             bp17 &= ~8;
26059 :           }
26060 :           //^098D:0F88
26061 :         } while (--bp1e != 0);
26062 : 
26063 :         //^098D:0F8D
26064 :       } while (--si > 0);
26065 : 
26066 :       //^098D:0F90
26067 :       if ((bp17 & 3) != 0) {
26068 :         //^098D:0F96
26069 :         bp17 &= ~4;
26070 :       }
26071 :       //^098D:0F9E
26072 :       si = bp0c - bp0a +1;
26073 :       //^098D:0FA7
26074 :       Bit32u bp12 = CALC_SIZE_OF_COMPRESSED_RECT(bp17) * si + 10;
26075 :       //^098D:0FC3
26076 :       if ((bp17 & 1) != 0) {
26077 :         //^098D:0FC9
26078 :         bp12 += 2;
26079 :       }
26080 :       //^098D:0FD1
26081 :       RectTable *bp04 = reinterpret_cast<RectTable *>((this->*allocFunc)(bp12));
26082 :       //^098D:0FE2
26083 :       zz = (zz->pb0 = bp04);
26084 :       //^098D:0FF8
26085 :       bp04->pb0 = NULL;
26086 :       //^098D:1006
26087 :       bp04->w4 = bp0a;
26088 :       //^098D:100D
26089 :       bp04->w6 = bp0c;
26090 :       //^098D:1014
26091 :       bp04->b8 = (Bit8u)bp17;
26092 :       //^098D:101B
26093 :       bp04->b9 = (Bit8u)bp1a;
26094 :       //^098D:1022
26095 :       bp04++;
26096 :       //^098D:1026
26097 :       if ((bp17 & 1) != 0) {
26098 :         //^098D:102C
26099 :         WRITE_WORD(bp04,bp1c);
26100 :         //^098D:1035
26101 :         PTR_ADVANCE(bp04,+2);
26102 :       }
26103 :       //^098D:1043
26104 :       data = bp16;
26105 : 
26106 :       do {
26107 :         //^098D:104F
26108 :         if ((bp17 & 4) != 0) {
26109 :           //^098D:1055
26110 :           WRITE_BYTE(bp04,(Bit8u)*data); data++;
26111 :           //^098D:1065
26112 :           PTR_ADVANCE(bp04,+1);
26113 :           //^098D:1072
26114 :           WRITE_BYTE(bp04,(Bit8u)*data); data++;
26115 :           //^098D:1082
26116 :           PTR_ADVANCE(bp04,+1);
26117 :         }
26118 :         else {
26119 :           //^098D:1091
26120 :           if ((bp17 & 2) == 0) {
26121 :             //^098D:109C
26122 :             WRITE_WORD(bp04,*data);
26123 :             //^098D:10A8
26124 :             PTR_ADVANCE(bp04,+2);
26125 :           }
26126 :           //^098D:10B6
26127 :           data++;
26128 :           //^098D:10BA
26129 :           if ((bp17 & 1) == 0) {
26130 :             //^098D:10C5
26131 :             WRITE_WORD(bp04,*data);
26132 :             //^098D:10D1
26133 :             PTR_ADVANCE(bp04,+2);
26134 :           }
26135 :           //^098D:10DF
26136 :           data++;
26137 :         }
26138 :         //^098D:10E3
26139 :         if ((bp17 & 24) != 0) {
26140 :           //^098D:10E9
26141 :           WRITE_BYTE(bp04,(Bit8u)*data); data++;
26142 :           //^098D:10F9
26143 :           PTR_ADVANCE(bp04,+1);
26144 :           //^098D:1106
26145 :           WRITE_BYTE(bp04,(Bit8u)*data); data++;
26146 :           //^098D:1116
26147 :           PTR_ADVANCE(bp04,+1);
26148 :         }
26149 :         else {
26150 :           //^098D:111F
26151 :           WRITE_WORD(bp04,*data); data++;
26152 :           //^098D:112F
26153 :           PTR_ADVANCE(bp04,+2);
26154 :           //^098D:113D
26155 :           WRITE_WORD(bp04,*data); data++;
26156 :           //^098D:114D
26157 :           PTR_ADVANCE(bp04,+2);
26158 :         }
26159 : 
26160 :         //^098D:115B
26161 :       } while (--si > 0);
26162 : 
26163 :       //^098D:1161
26164 :     }
26165 :     //^098D:1169
26166 :     return;
26167 : 
26168 : #undef  PTR_ADVANCE
26169 : #undef  WRITE_BYTE
26170 : #undef  WRITE_WORD
26171 :   }
26172 : 
26173 :   //^098D:030F
26174 :   SRECT *QUERY_RECT(RectTable *entry, Bit16u rectno) //#DS=4976?
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 :     // TODO: ’P‘Ì“®ìŠm”FÏ 13:59 2006/05/07
26182 :     //^098D:030F
26183 :     //^098D:0315
26184 :     Bit16u si = rectno;
26185 :     //^098D:0318
26186 :     if (si == 0)
26187 :       return NULL;
26188 :     //^098D:031F
26189 :     for (; entry != NULL; entry = entry->pb0) {
26190 :       //^098D:0322
26191 :       if (entry->w4 > si || entry->w6 < si)
26192 :         continue;
26193 :       //^098D:0337
26194 :       si -= entry->w4;
26195 :       //^098D:033B
26196 :       _4976_0198++;
26197 :       //^098D:033F
26198 :       if (_4976_0198 >= 4) {
26199 :         //^098D:
26200 :         _4976_0198 = 0;
26201 :       }
26202 :       //^098D:034D
26203 :       sk4b84 *bp04 = &_4976_4b84[_4976_0198];
26204 :       //^098D:035C
26205 :       Bit8u bp05 = entry->b8;
26206 : 
26207 :       // bp05 combinations:
26208 :       // 0x00    @prefix @entry (x=RW, y=RW)
26209 :       // 0x01    @prefix (y=w10) @entry
26210 : 
26211 :       //^098D:0366
26212 :       if ((bp05 & 2) != 0) {
26213 :         //^098D:036A
26214 :         bp04->w0 = entry->b9;
26215 :       }
26216 :       //^098D:0376
26217 :       entry++;
26218 :       //^098D:037A
26219 :       if ((bp05 & 1) != 0) {
26220 :         //^098D:0380
26221 :         bp04->w2 = READ_WORD(entry);
26222 :         //^098D:038F
26223 :         PTR_ADVANCE(entry,+2);
26224 :       }
26225 :       //^098D:039D
26226 :       PTR_ADVANCE(entry,+(CALC_SIZE_OF_COMPRESSED_RECT(bp05) * si));
26227 :       //^098D:03B8
26228 :       if ((bp05 & 4) != 0) {
26229 :         //^098D:03BE
26230 :         bp04->w0 = READ_BYTE(entry);
26231 :         //^098D:03CC
26232 :         PTR_ADVANCE(entry,+1);
26233 :         //^098D:03D9
26234 :         bp04->w2 = READ_BYTE(entry);
26235 :         //^098D:03E7
26236 :         PTR_ADVANCE(entry,+1);
26237 :         //^098D:03EE
26238 :       }
26239 :       else {
26240 :         //^098D:03F0
26241 :         if ((bp05 & 2) == 0) {
26242 :           //^098D:03FB
26243 :           bp04->w0 = READ_WORD(entry);
26244 :           //^098D:0407
26245 :           PTR_ADVANCE(entry,+2);
26246 :         }
26247 :         //^098D:0415
26248 :         if ((bp05 & 1) == 0) {
26249 :           //^098D:0420
26250 :           bp04->w2 = READ_WORD(entry);
26251 :           //^098D:042F
26252 :           PTR_ADVANCE(entry,+2);
26253 :         }
26254 :       }
26255 :       //^098D:043D
26256 :       if ((bp05 & 8) != 0) {
26257 :         //^098D:0443
26258 :         bp04->w4 = READ_SBYTE(entry); PTR_ADVANCE(entry,+1);
26259 :         //^098D:0453
26260 :         bp04->w6 = READ_SBYTE(entry);
26261 :         //^098D:045B
26262 :       }
26263 :       //^098D:045D
26264 :       else if ((bp05 & 16) != 0) {
26265 :         //^098D:0463
26266 :         bp04->w4 = READ_BYTE(entry); PTR_ADVANCE(entry,+1);
26267 :         //^098D:0474
26268 :         bp04->w6 = READ_BYTE(entry);
26269 :         //^098D:047D
26270 :       }
26271 :       else {
26272 :         //^098D:047F
26273 :         bp04->w4 = READ_WORD(entry); PTR_ADVANCE(entry,+2);
26274 :         //^098D:048E
26275 :         bp04->w6 = READ_WORD(entry);
26276 :       }
26277 :       //^098D:0495
26278 :       return (SRECT *)bp04;
26279 : 
26280 :       //^098D:04A4
26281 :     }
26282 :     //^098D:04BF
26283 :     return NULL;
26284 : 
26285 : #undef  PTR_ADVANCE
26286 : #undef  READ_BYTE
26287 : #undef  READ_SBYTE
26288 : #undef  READ_WORD
26289 :   }
26290 : 
26291 :   //^098D:0048
26292 :   SRECT *SET_SRECT(SRECT *prc, Bit16u x, Bit16u y, Bit16u cx, Bit16u cy)
26293 :   {
26294 :     //^098D:0048
26295 :     //^098D:004B
26296 :     prc->x = x;
26297 :     prc->y = y;
26298 :     prc->cx = cx;
26299 :     prc->cy = cy;
26300 :     //^098D:0069
26301 :     return prc;
26302 :   }
26303 : 
26304 :   //^098D:0126
26305 :   SRECT *UNION_RECT(SRECT *rc1, const SRECT *rc2, __int16 *offx, __int16 *offy)
26306 :   {
26307 :     // it modifies rc1 to represent union area.
26308 :     // returns non-null if 2 rects have union area.
26309 : 
26310 :     // it is to clip the rc1 within rc2.
26311 :     // you are to draw picture at top-left of rc1.
26312 : 
26313 :     // rc1
26314 :     // +------+
26315 :     // |      |
26316 :     // |    +------+ rc2
26317 :     // |    |*|    |
26318 :     // +----|-+    |
26319 :     //      |      |
26320 :     //      +------+
26321 :     // 
26322 :     // in this case, (offx,offy) is at (5, 2).
26323 : 
26324 :     // rc2
26325 :     // +------+
26326 :     // |      |
26327 :     // |    +------+ rc1
26328 :     // |    |*|    |
26329 :     // +----|-+    |
26330 :     //      |      |
26331 :     //      +------+
26332 :     // 
26333 :     // in this case, (offx,offy) is at (0, 0).
26334 : 
26335 :     //^098D:0126
26336 :     __int16 si = rc2->x - rc1->x;
26337 :     //^098D:0139
26338 :     if (si > 0) {
26339 :       //^098D:013D
26340 :       *offx = si;
26341 :       //^098D:0143
26342 :       rc1->x += si;
26343 :       rc1->x -= si;
26344 :     }
26345 :     else {
26346 :       //^098D:014F
26347 :       *offx = 0;
26348 :     }
26349 :     //^098D:0157
26350 :     si = rc2->y - rc1->y;
26351 :     //^098D:0167
26352 :     if (si > 0) {
26353 :       //^098D:016B
26354 :       *offy = si;
26355 :       //^098D:0171
26356 :       rc1->y += si;
26357 :       rc1->y -= si;
26358 :     }
26359 :     else {
26360 :       //^098D:017E
26361 :       *offy = 0;
26362 :     }
26363 :     //^098D:0186
26364 :     si = (rc1->x +rc1->x -1) - (rc2->x +rc2->x -1);
26365 :     //^098D:01AC
26366 :     if (si > 0) {
26367 :       //^098D:01B2
26368 :       rc1->x -= si;
26369 :     }
26370 :     //^098D:01B9
26371 :     si = (rc1->y +rc1->y -1) - (rc2->y +rc2->y -1);
26372 :     //^098D:01D5
26373 :     if (si > 0) {
26374 :       //^098D:01D9
26375 :       rc1->y -= si;
26376 :     }
26377 :     //^098D:01E0
26378 :     if (rc1->x > 0 && rc1->y > 0) {
26379 :       //^098D:01F1
26380 :       return rc1;
26381 :     }
26382 :     //^098D:01F9
26383 :     return NULL;
26384 :   }
26385 : 
26386 :   //^098D:0599
26387 :   SRECT *QUERY_BLIT_RECT(Bit8u *buff, SRECT *rect, Bit16u rectno, __int16 *yourcx, __int16 *yourcy, __int16 ww) //#DS=4976?
26388 :   {
26389 :     //^098D:0599
26390 :     //^098D:059F
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 :     //^098D:05A4
26404 :     if (rectno == 0xffff) {
26405 :       //^098D:05AA
26406 :       return NULL;
26407 :     }
26408 :     //^098D:05B1
26409 :     Bit16u si = rectno & 0x8000;
26410 :     //^098D:05B9
26411 :     if (si != 0) {
26412 :       //^098D:05BD
26413 :       bp0e = rectno & 0x7fff;
26414 :     }
26415 :     //^098D:05C6
26416 :     bp04 = QUERY_RECT(_4976_0194.pb0, rectno);
26417 :     //^098D:05DE
26418 :     if (bp04 == NULL) {
26419 :       //^098D:05AA
26420 :       return NULL;
26421 :     }
26422 :     //^098D:05E4
26423 :     SET_SRECT(&bp1a, -10000, -10000, 20000, 20000);
26424 :     //^098D:05FC
26425 :     SRECT bp22;
26426 :     if (ww == -1) {
26427 :       //^098D:0602
26428 :       bp0e = bp04->x;
26429 :     }
26430 :     else {
26431 :       //^098D:060D
26432 :       COPY_MEMORY(bp04, &bp22, 8);
26433 :       //^098D:0624
26434 :       bp22.x = bp0e = ww;
26435 :       //^098D:062D
26436 :       bp04 = &bp22;
26437 :     }
26438 :     //^098D:0636
26439 :     if (bp0e < 8) {
26440 :       //^098D:063C
26441 :       bp0a = bp04->cx;
26442 :       bp0c = bp04->cy;
26443 :     }
26444 :     else {
26445 :       //^098D:064F
26446 :       if (bp0e == 9) {
26447 :         //^098D:05AA
26448 :         return NULL;
26449 :       }
26450 :       //^098D:0658
26451 :       bp0e = 10;
26452 :       bp0a = 0;
26453 :       bp0c = 0;
26454 :     }
26455 :     //^098D:0666
26456 :     if (si != 0) {
26457 :       //^098D:066A
26458 :       bp0a += *yourcx;
26459 :       bp0c += *yourcy;
26460 :       *yourcx = 0;
26461 :       *yourcy = 0;
26462 :     }
26463 :     //^098D:068C
26464 :     if (buff == NULL && (*yourcx <= 0 || *yourcy <= 0)) {
26465 :       //^098D:06A6
26466 :       //^098D:05AA
26467 :       return NULL;
26468 :     }
26469 :     //^098D:06A9
26470 :     bp10 = 0;
26471 :     //^098D:06AE
26472 :     for (; bp04->y != 0; ) {
26473 :       //^098D:06B1
26474 :       if (bp04->x >= 10 && bp04->x <= 18) {
26475 :         //^098D:06C6
26476 :         bp08 = QUERY_RECT(_4976_0194.pb0, bp04->y);
26477 :         //^098D:06DF
26478 :         if (bp08 == NULL)
26479 :           break;
26480 :         //^098D:06E6
26481 :         si = bp08->cx;
26482 :         di = bp08->cy;
26483 :         bp12 = bp08->x;
26484 :         bp24 = bp08->y;
26485 :         //^098D:06FE
26486 :         bp08 = QUERY_RECT(_4976_0194.pb0, bp08->y);
26487 :         //^098D:0717
26488 :         if (bp08 == NULL)
26489 :           break;
26490 :         //^098D:071E
26491 :         switch (bp12) {
26492 :           default:
26493 :             //^098D:072D
26494 :             //^098D:05AA
26495 :             return NULL;
26496 : 
26497 :           case 0:
26498 :             //^098D:0730
26499 :             di -= (bp08->cy +1) >> 1;
26500 :             //^098D:073C
26501 :             si -= (bp08->cx +1) >> 1;
26502 :             //^098D:0748
26503 :             break;
26504 : 
26505 :           case 1:
26506 :             //^098D:0788
26507 :             break;
26508 : 
26509 :           case 2:
26510 :             //^098D:0754
26511 :             si -= bp08->cx -1;
26512 :             //^098D:075C
26513 :             //^098D:0746
26514 :             break;
26515 : 
26516 :           case 3:
26517 :             //^098D:074A
26518 :             di -= bp08->cy -1;
26519 :             //^098D:0754
26520 :             si -= bp08->cx -1;
26521 :             //^098D:075C
26522 :             //^098D:0746
26523 :             break;
26524 : 
26525 :           case 4:
26526 :             //^098D:0780
26527 :             di -= bp08->cx -1;
26528 :             //^098D:0788
26529 :             break;
26530 : 
26531 :           case 5:
26532 :             //^098D:073C
26533 :             si -= (bp08->cx +1) >> 1;
26534 :             //^098D:0748
26535 :             break;
26536 : 
26537 :           case 6:
26538 :             //^098D:075E
26539 :             si -= bp08->cx -1;
26540 :             //^098D:0768
26541 :             di -= (bp08->cy +1) >> 1;
26542 :             //^098D:0772
26543 :             break;
26544 : 
26545 :           case 7:
26546 :             //^098D:0774
26547 :             si -= (bp08->cx +1) >> 1;
26548 :             //^098D:0780
26549 :             di -= bp08->cy -1;
26550 :             //^098D:0788
26551 :             break;
26552 : 
26553 :           case 8:
26554 :             //^098D:0768
26555 :             di -= (bp08->cy +1) >> 1;
26556 :             //^098D:0772
26557 :             break;
26558 :         }
26559 : 
26560 :         //^098D:078A
26561 :         bp1a.x += si;
26562 :         //^098D:078D
26563 :         if (bp1a.x < si) {
26564 :           //^098D:0794
26565 :           bp1a.x = si;
26566 :         }
26567 :         //^098D:0797
26568 :         if (bp08->cx + si <= bp1a.x + bp1a.cx -1) {
26569 :           //^098D:07AB
26570 :           bp1a.cx = bp08->cx - bp1a.x + si;
26571 :         }
26572 :         //^098D:07B7
26573 :         bp1a.y += di;
26574 :         //^098D:07BA
26575 :         if (bp1a.y < di) {
26576 :           //^098D:07C1
26577 :           bp1a.y = di;
26578 :         }
26579 :         //^098D:07C4
26580 :         if (bp08->cy + di <= bp1a.y + bp1a.cy -1) {
26581 :           //^098D:07D8
26582 :           bp1a.cy = bp08->cx - bp1a.y + di;
26583 :         }
26584 :         //^098D:07E4
26585 :         switch (bp04->x) {
26586 :           default:
26587 :             //^098D:07F9
26588 :             //^098D:05AA
26589 :             return NULL;
26590 : 
26591 :           case 10:
26592 :             //^098D:07FC
26593 :             di += (bp08->cy +1) >> 1;
26594 :             //^098D:0808
26595 :             si += (bp08->cx +1) >> 1;
26596 :             //^098D:0814
26597 :             break;
26598 : 
26599 :           case 11:
26600 :             //^098D:0856
26601 :             break;
26602 : 
26603 :           case 12:
26604 :             //^098D:0820
26605 :             si += bp08->cx -1;
26606 :             //^098D:0814
26607 :             break;
26608 : 
26609 :           case 13:
26610 :             //^098D:0816
26611 :             di += bp08->cy -1;
26612 :             //^098D:0820
26613 :             si += bp08->cx -1;
26614 :             //^098D:0814
26615 :             break;
26616 : 
26617 :           case 14:
26618 :             //^098D:084C
26619 :             di += bp08->cy -1;
26620 : 
26621 :             break;
26622 : 
26623 :           case 15:
26624 :             //^098D:0808
26625 :             si += (bp08->cx +1) >> 1;
26626 :             //^098D:0814
26627 :             break;
26628 : 
26629 :           case 16:
26630 :             //^098D:082A
26631 :             si += bp08->cx -1;
26632 :             //^098D:0834
26633 :             di += (bp08->cy +1) >> 1;
26634 :             //^098D:083E
26635 :             break;
26636 : 
26637 :           case 17:
26638 :             //^098D:0840
26639 :             si += (bp08->cx +1) >> 1;
26640 :             //^098D:084C
26641 :             di += bp08->cy -1;
26642 : 
26643 :             break;
26644 : 
26645 :           case 18:
26646 :             //^098D:0834
26647 :             di += (bp08->cy +1) >> 1;
26648 :             //^098D:083E
26649 :             break;
26650 :         }
26651 :         //^098D:0856
26652 :         bp0a += si + bp04->cx;
26653 :         //^098D:0862
26654 :         bp0c += di + bp04->cy;
26655 :         //^098D:086B
26656 :       }
26657 :       else {
26658 :         //^098D:086E
26659 :         bp08 = QUERY_RECT(_4976_0194.pb0, bp04->y);
26660 :         //^098D:088A
26661 :         if (bp08 == NULL)
26662 :           break;
26663 :         //^098D:0891
26664 :         bp24 = bp04->y;
26665 :         si = bp08->cx;
26666 :         di = bp08->cy;
26667 :         //^098D:08A6
26668 :         if (bp08->x == 1) {
26669 :           //^098D:08AC
26670 :           bp0a += si;
26671 :           bp0c += di;
26672 :           bp1a.x += si;
26673 :           bp1a.y += di;
26674 :         }
26675 :         else if (bp08->x == 9) {
26676 :           //^098D:08C7
26677 :           switch (bp04->x) {
26678 :             case 0:
26679 :               //^098D:08DC
26680 :               si = bp04->cx - ((si +1) >> 1);
26681 :               //^098D:08EC
26682 :               //^098D:0960
26683 :               di = bp04->cy - ((di +1) >> 1);
26684 :               break;
26685 : 
26686 :             case 1:
26687 :               //^098D:08EE
26688 :               si = bp04->cx;
26689 :               //^098D:08F5
26690 :               di = bp04->cy;
26691 :               break;
26692 : 
26693 :             case 2:
26694 :               //^098D:08FE
26695 :               si = bp04->cx - (si -1);
26696 :               //^098D:0908
26697 :               //^098D:0939
26698 :               //^098D:08F5
26699 :               di = bp04->cy;
26700 :               break;
26701 : 
26702 :             case 3:
26703 :               //^098D:090A
26704 :               si = bp04->cx - (si -1);
26705 :               //^098D:0918
26706 :               di = bp04->cy - (di -1);
26707 :               //^098D:0922
26708 :               //^098D:096C
26709 :               break;
26710 : 
26711 :             case 4:
26712 :               //^098D:0924
26713 :               si = bp04->cx;
26714 :               //^098D:092B
26715 :               //^098D:0918
26716 :               di = bp04->cy - (di -1);
26717 :               //^098D:0922
26718 :               //^098D:096C
26719 :               break;
26720 : 
26721 :             case 5:
26722 :               //^098D:092D
26723 :               si = bp04->cx - ((si +1) >> 1);
26724 :               //^098D:0939
26725 :               //^098D:093D
26726 :               //^098D:08F5
26727 :               di = bp04->cy;
26728 :               break;
26729 : 
26730 :             case 6:
26731 :               //^098D:093F
26732 :               si = bp04->cx - (si -1);
26733 :               //^098D:0949
26734 :               //^098D:08E8
26735 :               break;
26736 : 
26737 :             case 7:
26738 :               //^098D:094B
26739 :               si = bp04->cx - ((si +1) >> 1);
26740 :               //^098D:0957
26741 :               //^098D:0914
26742 :               //^098D:0918
26743 :               di = bp04->cy - (di -1);
26744 :               //^098D:0922
26745 :               //^098D:096C
26746 :               break;
26747 : 
26748 :             case 8:
26749 :               //^098D:0959
26750 :               si = bp04->cx;
26751 :               //^098D:0960
26752 :               di = bp04->cy - ((di +1) >> 1);
26753 :               break;
26754 :           }
26755 :           //^098D:0970
26756 :           if (bp10 != 0) {
26757 :             //^098D:0976
26758 :             bp10 = 0;
26759 :             bp0a += si;
26760 :             bp0c += di;
26761 :             bp1a.x += si;
26762 :             bp1a.y += di;
26763 :           }
26764 :           //^098D:0987
26765 :           if (bp1a.x < si) {
26766 :             //^098D:098C
26767 :             bp1a.x = si;
26768 :           }
26769 :           //^098D:098F
26770 :           if (bp08->cx + si <= bp1a.x + bp1a.cx -1) {
26771 :             //^098D:09A3
26772 :             bp1a.cx = bp08->cx - bp1a.x + si;
26773 :           }
26774 :           //^098D:09AF
26775 :           if (bp1a.y < di) {
26776 :             //^098D:09B4
26777 :             bp1a.y = di;
26778 :           }
26779 :           //^098D:09B7
26780 :           if (bp08->cy + di <= bp1a.y + bp1a.cy -1) {
26781 :             //^098D:09CB
26782 :             bp1a.cy = bp08->cy - bp1a.y + di;
26783 :           }
26784 :         }
26785 :         else {
26786 :           //^098D:09D9
26787 :           if (bp08->x <= 8) {
26788 :             //^098D:09E2
26789 :             bp10 = 1;
26790 :           }
26791 :         }
26792 :       }
26793 :       //^098D:09E7
26794 :       bp04 = bp08;
26795 :       //^098D:09F3
26796 :     }
26797 :     //^098D:0A00
26798 :     si = *yourcx;
26799 :     //^098D:0A08
26800 :     if (si == 0) {
26801 :       //^098D:0A0C
26802 :       si = *(Bit16u *)&buff[-4];
26803 :     }
26804 :     //^098D:0A13
26805 :     di = *yourcy;
26806 :     //^098D:0A1B
26807 :     if (di == 0) {
26808 :       //^098D:0A1F
26809 :       di = *(Bit16u *)&buff[-2];
26810 :     }
26811 :     //^098D:0A26
26812 :     switch (bp0e) {
26813 :       default:
26814 :         //^098D:0A35
26815 :         //^098D:05AA
26816 :         return NULL;
26817 : 
26818 :       case 0:
26819 :         //^098D:0A38
26820 :         rect->x = ((si +1) >> 1) - (bp0a);
26821 :         //^098D:0A48
26822 :         //^098D:0AB1
26823 :         rect->y = bp0c - ((di +1) >> 1);
26824 :         break;
26825 : 
26826 :       case 1:
26827 :         //^098D:0A4A
26828 :         rect->x = bp0a;
26829 :         //^098D:0A53
26830 :         rect->y = bp0c;
26831 :         break;
26832 : 
26833 :       case 2:
26834 :         //^098D:0A5F
26835 :         rect->x = bp0a - (si -1);
26836 :         //^098D:0A53
26837 :         rect->y = bp0c;
26838 :         break;
26839 : 
26840 :       case 3:
26841 :         //^098D:0A64
26842 :         rect->x = bp0a - (si -1);
26843 :         //^098D:0A72
26844 :         rect->y = bp0c - (di -1);
26845 :         //^098D:0A7D
26846 :         //^098D:0ABE
26847 :         break;
26848 : 
26849 :       case 4:
26850 :         //^098D:0A7F
26851 :         rect->x = bp0a;
26852 :         //^098D:0A88
26853 :         //^098D:0A72
26854 :         rect->y = bp0c - (di -1);
26855 :         //^098D:0A7D
26856 :         //^098D:0ABE
26857 :         break;
26858 : 
26859 :       case 5:
26860 :         //^098D:0A8A
26861 :         rect->x = bp0a - ((si +1) >> 1);
26862 :         //^098D:0A9A
26863 :         //^098D:0A53
26864 :         rect->y = bp0c;
26865 :         break;
26866 : 
26867 :       case 6:
26868 :         //^098D:0A9C
26869 :         rect->x = bp0a - (si -1);
26870 :         //^098D:0A9F
26871 :         //^098D:0A3D
26872 :         //^098D:0A48
26873 :         //^098D:0AB1
26874 :         rect->y = bp0c - ((di +1) >> 1);
26875 :         break;
26876 : 
26877 :       case 7:
26878 :         //^098D:0AA1
26879 :         rect->x = bp0a - ((si +1) >> 1);
26880 :         //^098D:0A72
26881 :         rect->y = bp0c - (di -1);
26882 :         //^098D:0A7D
26883 :         //^098D:0ABE
26884 :         break;
26885 : 
26886 :       case 8:
26887 :         //^098D:0AA8
26888 :         rect->x = bp0a;
26889 :         //^098D:0AB1
26890 :         rect->y = bp0c - ((di +1) >> 1);
26891 :         break;
26892 :     }
26893 :     //^098D:0AC2
26894 :     if (_4976_4bca.cx != 0) {
26895 :       //^098D:0AC9
26896 :       COPY_MEMORY(&_4976_4bca, &bp1a, 8);
26897 :     }
26898 :     //^098D:0ADE
26899 :     if (_4976_4bc8 != 0 && _4976_4bca.x != 0 && bp24 == 3) {
26900 :       //^098D:0AF2
26901 :       if (UNION_RECT(&bp1a, &_4976_00fe, yourcx, yourcy) == NULL) {
26902 :         //^098D:05AA
26903 :         return NULL;
26904 :       }
26905 :     }
26906 :     //^098D:0B15
26907 :     bp0a = bp1a.x - rect->x;
26908 :     //^098D:0B21
26909 :     if (bp0a <= 0) {
26910 :       //^098D:0B25
26911 :       *yourcx = 0;
26912 :       //^098D:0B33
26913 :       rect->cx = min_value(si, bp1a.cx + bp0a);
26914 :     }
26915 :     else {
26916 :       //^098D:0B37
26917 :       *yourcx = bp0a;
26918 :       //^098D:0B40
26919 :       rect->x = bp1a.x;
26920 :       //^098D:0B49
26921 :       rect->cx = min_value(si - bp0a, bp1a.cx);
26922 :     }
26923 :     //^098D:0B60
26924 :     bp0c = bp1a.y - rect->y;
26925 :     //^098D:0B6D
26926 :     if (bp0c <= 0) {
26927 :       //^098D:0B71
26928 :       *yourcy = 0;
26929 :       //^098D:0B79
26930 :       rect->cy = min_value(di, bp1a.cy + bp0c);
26931 :     }
26932 :     else {
26933 :       //^098D:0B83
26934 :       *yourcy = bp0c;
26935 :       //^098D:0B8C
26936 :       rect->y = bp1a.y;
26937 :       //^098D:0B96
26938 :       rect->cy = min_value(di - bp0c, bp1a.cy);
26939 : 
26940 :     }
26941 :     //^098D:0BAD
26942 :     if (rect->cx <= 0 || rect->cy <= 0)
26943 :       return NULL;
26944 :     //^098D:0BC1
26945 :     return rect;
26946 :   }
26947 : 
26948 :   //^0B36:16E4
26949 :   void DRAW_GAMELOAD_DIALOGUE_TO_SCREEN(Bit8u *buffsrc, Bit16u rectno, __int16 colorkey, Bit8u localpal[16])
26950 :   {
26951 :     //^0B36:16E4
26952 :     //^0B36:16E8
26953 :     __int16 bp02 = 0;
26954 :     __int16 bp04 = 0;
26955 :     SRECT bp0c;
26956 :     //^0B36:16F2
26957 :     if (QUERY_BLIT_RECT(buffsrc, &bp0c, rectno, &bp02, &bp04, -1) != NULL) {
26958 :       //^0B36:1718
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 :     //^0B36:1755
26975 :     return;
26976 :   }
26977 : 
26978 :   //^01B0:0D39
26979 :   void _01b0_0d39(__int16 *xx, __int16 *yy, __int16 *zz, Bit16u ww) //#DS=04BF
26980 :   {
26981 :     //^01B0:0D39
26982 :     ENTER(0);
26983 :     //^01B0:0D3C
26984 :     LOADDS(0x3083);
26985 :     //^01B0:0D42
26986 :     if (ww != 0) {
26987 :       //^01B0:0D4A
26988 :       *xx = _04bf_185e;
26989 :       //^01B0:0D53
26990 :       *yy = _04bf_1860;
26991 :       //^01B0:0D5C
26992 :       *zz = _04bf_1936;
26993 :     }
26994 :     else {
26995 :       //^01B0:0D64
26996 :       *xx = _04bf_03be;
26997 :       //^01B0:0D6D
26998 :       *yy = _04bf_03c0;
26999 :       //^01B0:0D76
27000 :       *zz = _04bf_17ee;
27001 :     }
27002 :     //^01B0:0D7F
27003 :     //^01B0:0D81
27004 :     return;
27005 :   }
27006 : 
27007 :   //^01B0:0008
27008 :   void MOVE_MEMORY(const void *buffSrc, void *buffDst, Bit16u size);
27009 : 
27010 :   //^00EB:01EB
27011 :   void MOVE_MEMORY_WITH_DELTA(Bit16u offSrc, Bit16u offDst, Bit16u size) //#DS=04BF
27012 :   {
27013 :     //^00EB:01EB
27014 :     //^00EB:01EE
27015 :     MOVE_MEMORY(
27016 :       _04bf_0cf0 +offSrc,
27017 :       _04bf_0e34 +offDst,
27018 :       size
27019 :       );
27020 :     //^00EB:021F
27021 :     return;
27022 :   }
27023 : 
27024 :   //^00EB:0221
27025 :   void COPY_MEMORY_WITH_DELTA_AND_TRANSPARENT(Bit16u offSrc, Bit16u offDst, Bit16u size, Bit8u colorkey) //#DS=04BF
27026 :   {
27027 :     //^00EB:0221
27028 :     //^00EB:0224
27029 :     Bit8u dh = colorkey;
27030 :     Bit8u *di = _04bf_0e34 + offDst;
27031 :     Bit16u cx = size;
27032 :     Bit8u *si = _04bf_0cf0 + offSrc;
27033 : 
27034 :     do {
27035 :       //^00EB:0242
27036 :       Bit8u al = *(si++);
27037 :       //^00EB:0243
27038 :       if (al != colorkey) {
27039 :         //^00EB:0247;
27040 :         *(di++) = al;
27041 :       }
27042 :       else {
27043 :         //^00EB:024C
27044 :         di++;
27045 :       }
27046 :       //^00EB:024D
27047 :     } while (--cx != 0);
27048 :     //^00EB:024F
27049 :     return;
27050 :   }
27051 : 
27052 :   //^00EB:0812
27053 :   void MOVE_MEMORY_STRETCH_13TO16(Bit16u offSrc, Bit16u offDst)
27054 :   {
27055 :     // compose 0.5 stepping viewport. (123% larger)
27056 : 
27057 :     //^00EB:0812
27058 :     //^00EB:0817
27059 :     Bit8u *di = _04bf_0e34 +offDst;
27060 :     Bit8u *si = _04bf_0cf0 +offSrc;
27061 :     Bit16u cx = 14;
27062 : 
27063 :     // DS:SI  E000:871B -> E000:8728 (+13)
27064 :     // ES:DI  A000:3340 -> A000:3350 (+16)
27065 : 
27066 :     // [DS:SI] in  E000:8728  A4 A7 A2 A7 AB AB A6 A9 A9 A9 A9 A9 A8
27067 :     // [ES:DI] out A000:3350  A4 A7 A2 A2 A7 AB AB A6 A9 A9 A9 A9 A9 A9 A9 A8
27068 : 
27069 :     // [DS:SI] in  E000:87FB  00 01 02 03 04 05 06 07 08 09 0A 0B 0C
27070 :     // [ES:DI] out A000:3480  00 01 02 02 03 04 05 06 07 07 08 09 0A 0B 0B 0C
27071 : 
27072 :     do {
27073 :       //^00EB:082C
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 :       //^00EB:083E
27091 :     } while (--cx != 0);
27092 :     //^00EB:0840
27093 :     return;
27094 :   }
27095 : 
27096 :   //^00EB:0845
27097 :   void _00eb_0845(Bit8u *buff, SRECT *rc, Bit16u ww) //#DS=04BF
27098 :   {
27099 :     //^00EB:0845
27100 :     //^00EB:084B
27101 :     LOADDS(0x0c48);
27102 :     //^00EB:0851
27103 :     Bit16u bp12 = ((ww & 0x8000) != 0) ? 1 : 0;
27104 :     //^00EB:0862
27105 :     _01b0_07f8();
27106 :     //^00EB:0867
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 :       //^00EB:08B0
27115 :       //^00EB:092C
27116 :       SRECT bp10;
27117 :       bp10.y = max(rc->y, _04bf_09e0.dsty);
27118 :       //^00EB:0948
27119 :       bp10.x = max(rc->x, _04bf_09e0.dstx);
27120 :       //^00EB:0962
27121 :       bp10.cx = min(rc->x + rc->cx -1, _04bf_09e0.dstx + _04bf_09e0.srccx -1) -bp10.x +1;
27122 :       //^00EB:099D
27123 :       bp10.cy = min(rc->y + rc->cy -1, _04bf_09e0.dsty + _04bf_09e0.srccy -1) -bp10.y +1;
27124 :       //^00EB:09D2
27125 :       __int16 bp06 = bp10.x - rc->x;
27126 :       __int16 bp08 = bp10.y - rc->y;
27127 :       //^00EB:09E8
27128 :       bp10.y -= _04bf_09e0.dsty;
27129 :       bp10.x -= _04bf_09e0.dstx;
27130 :       //^00EB:09F4
27131 :       if (bp12 != 0) {
27132 :         //^00EB:09FA
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 :       //^00EB:0A1E
27145 :       Bit16u si = rc->y * 320 + rc->x;
27146 :       Bit16u bp02 = 0;
27147 :       Bit16u di = 0;
27148 :       Bit16u bp04 = rc->y;
27149 :       //^00EB:0A3D
27150 :       for (; rc->y + rc->cy -1 >= bp04; di += 103, bp02 += rc->cx, si += 320, bp04++) {
27151 :         //^00EB:0A40
27152 :         if (bp04 >= _04bf_09e0.dsty && _04bf_09e0.dsty + _04bf_09e0.srccy -1 >= bp04) {
27153 :           //^00EB:0A5C
27154 :           _04bf_0cf0 = buff;
27155 :           _04bf_0e34 = _04bf_0cf4;
27156 :           //^00EB:0A73
27157 :           if (bp12 != 0) {
27158 :             //^00EB:0A79
27159 :             MOVE_MEMORY_STRETCH_13TO16(
27160 :               (((di >> 7) +8) *224) +21,
27161 :               0
27162 :               );
27163 :           }
27164 :           //^00EB:0A94
27165 :           MOVE_MEMORY_WITH_DELTA(bp02, 0, rc->cx);
27166 :           //^00EB:0AA7
27167 :           _04bf_0cf0 = _04bf_0cf4;
27168 :           _04bf_0e34 = _04bf_079e;
27169 :           //^00EB:0ABB
27170 :           MOVE_MEMORY_WITH_DELTA(_04bf_09e0.dstx, ((bp04 - _04bf_09e0.dsty) * 24) +bp10.x, bp10.cx);
27171 :           //^00EB:0AD9
27172 :           _04bf_0cf0 = &_04bf_0e80[6 + _04bf_1938 * 582];
27173 :           _04bf_0e34 = _04bf_0cf4;
27174 :           //^00EB:0AF5
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 :           //^00EB:0B25
27182 :           _04bf_0cf0 = _04bf_0cf4;
27183 :           _04bf_0e34 = pbVram;
27184 :           //^00EB:0B3B
27185 :           //^00EB:0B8B
27186 :           MOVE_MEMORY_WITH_DELTA(0, si, rc->cx);
27187 :         }
27188 :         else {
27189 :           //^00EB:0B47
27190 :           _04bf_0cf0 = buff;
27191 :           _04bf_0e34 = pbVram;
27192 :           //^00EB:0B60
27193 :           if (bp12 != 0) {
27194 :             //^00EB:0B66
27195 :             MOVE_MEMORY_STRETCH_13TO16((((di >> 7) + 8) * 224) + 21, si);
27196 :           }
27197 :           else {
27198 :             //^00EB:0B80
27199 :             MOVE_MEMORY_WITH_DELTA(bp02, si, rc->cx);
27200 :           }
27201 :         }
27202 :         //^00EB:0B92
27203 :       }
27204 :     }
27205 :     else {
27206 :       //^00EB:08B3
27207 :       if (bp12 != 0) {
27208 :         //^00EB:08B9
27209 :         _04bf_0e34 = (Bit8u *)__vram;
27210 :         _04bf_0cf0 = buff;
27211 :         //^00EB:08D2
27212 :         Bit16u di = 0;
27213 :         Bit16u si = 320*40;
27214 :         //^00EB:08D7
27215 :         for (; si < 320*176; di += 103, si += 320) {
27216 :           //^00EB:08D9
27217 :           MOVE_MEMORY_STRETCH_13TO16(
27218 :             ((di >> 7) +8) *224 +21,
27219 :             si
27220 :             );
27221 :           //^00EB:08F1
27222 :         }
27223 :       }
27224 :       else {
27225 :         //^00EB:0901
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 :     //^00EB:0BBA
27239 :     _01b0_080b();
27240 :     //^00EB:0BBF
27241 :     return;
27242 :   }
27243 : 
27244 :   //^098D:0D3F
27245 :   SRECT *SCALE_RECT(Bit16u rectno, SRECT *rc, Bit16u horzResolution, Bit16u vertResolution)
27246 :   {
27247 :     //^098D:0D3F
27248 :     //^098D:0D45
27249 :     Bit16u di = horzResolution;
27250 :     Bit16u si = vertResolution;
27251 :     //^098D:0D4B
27252 :     SRECT *bp04 = QUERY_RECT(&_4976_0194, rectno);
27253 :     //^098D:0D63
27254 :     if (bp04 != NULL) {
27255 :       //^098D:0D6A
27256 :       if (bp04->y != 0) {
27257 :         //^098D:0D77
27258 :         bp04 = QUERY_RECT(&_4976_0194, bp04->y);
27259 :         //^098D:0D93
27260 :         if (bp04 != NULL) {
27261 :           //^098D:0D9A
27262 :           if (bp04->x == 9) {
27263 :             //^098D:0DA6
27264 :             __int16 bp06 = (di == 10000) ? (bp04->cx) : (__int16)((__int32(bp04->cx) * di) / 10000);
27265 :             //^098D:0DD6
27266 :             __int16 bp08 = (si == 10000) ? (bp04->cy) : (__int16)((__int32(bp04->cy) * si) / 10000);
27267 :             //^098D:0E09
27268 :             if (bp06 == 0 && di != 0) {
27269 :               //^098D:0E13
27270 :               bp06 = 1;
27271 :             }
27272 :             //^098D:0E18
27273 :             if (bp08 == 0 && si != 0) {
27274 :               //^098D:0E22
27275 :               bp08 = 1;
27276 :             }
27277 :             //^098D:0E27
27278 :             if (bp06 > 0 && bp08 > 0) {
27279 :               //^098D:0E33
27280 :               return QUERY_BLIT_RECT(NULL, rc, rectno, &bp06, &bp08, -1);
27281 :             }
27282 :           }
27283 :         }
27284 :       }
27285 :     }
27286 :     //^098D:0E55
27287 :     return NULL;
27288 :   }
27289 : 
27290 :   //^098D:0E5D
27291 :   SRECT *QUERY_EXPANDED_RECT(Bit16u rectno, SRECT *rc)
27292 :   {
27293 :     //^098D:0E5D
27294 :     //^098D:0E60
27295 :     return SCALE_RECT(rectno, rc, 10000, 10000);
27296 :   }
27297 : 
27298 :   //^44C8:1BE8
27299 :   void _44c8_1be8(Bit16u xx) //#DS=4976
27300 :   {
27301 :     //^44C8:1BE8
27302 :     //^44C8:1BEE
27303 :     Bit16u di = _4976_4bea;
27304 :     _4976_4bea = 0;
27305 :     //^44C8:1BF8
27306 :     SRECT bp0e;
27307 :     QUERY_EXPANDED_RECT(7, &bp0e);
27308 :     //^44C8:1C07
27309 :     _4976_4bea = di;
27310 :     //^44C8:1C0B
27311 :     Bit16u si;
27312 :     if (_4976_5e68 == 0) {
27313 :       //^44C8:1C12
27314 :       __int16 bp02, bp04, bp06;
27315 :       _01b0_0d39(&bp02, &bp04, &bp06, 1) CALL_IBMIO;
27316 :       //^44C8:1C2E
27317 :       if (bp0e.x +bp0e.cx -1 < bp02 || bp0e.y +bp0e.cy -1 < bp04 || bp04 +bp06 < bp0e.y) {
27318 :         //^44C8:1C51
27319 :         si = 0;
27320 :       }
27321 :       else {
27322 :         //^44C8:1C55
27323 :         _443c_085a();
27324 :         si = 1;
27325 :       }
27326 :     }
27327 :     //^44C8:1C5D
27328 :     _00eb_0845(_4976_4c16, &bp0e, (_4976_4bea != 0) ? 0x8008 : 0x0008) CALL_IBMIO;
27329 :     //^44C8:1C85
27330 :     if (_4976_5e68 == 0 && si != 0) {
27331 :       //^44C8:1C90
27332 :       _443c_086b();
27333 :     }
27334 :     //^44C8:1C95
27335 :     return;
27336 :   }
27337 : 
27338 :   //^0AAF:002F
27339 :   void _0aaf_002f()
27340 :   {
27341 :     //^0AAF:002F
27342 :     //^0AAF:0032
27343 :     if (_4976_01ba != 0) {
27344 :       //^0AAF:0039
27345 :       _443c_085a();
27346 :       //^0AAF:003E
27347 :       DRAW_GAMELOAD_DIALOGUE_TO_SCREEN(_4976_4c16, 5, -1, NULL);
27348 :       //^0AAF:0056
27349 :       _443c_086b();
27350 :     }
27351 :     else {
27352 :       //^0AAF:005D
27353 :       _44c8_1be8(0);
27354 :     }
27355 :   }
27356 : 
27357 :   //^0CD5:00A0
27358 :   Bit16u max_value(__int16 v1, __int16 v2) {
27359 :     //^0CD5:00A0
27360 :     //^0CD5:00A3
27361 :     if (v1 > v2)
27362 :       return v1;
27363 :     return v2;
27364 :   }
27365 : 
27366 :   //^0CD5:008E
27367 :   Bit16u min_value(__int16 v1, __int16 v2) {
27368 :     //^0CD5:008E
27369 :     //^0CD5:0091
27370 :     if (v1 < v2)
27371 :       return v1;
27372 :     return v2;
27373 :   }
27374 : 
27375 :   //^44C8:1BA2
27376 :   void FIRE_WAIT_VSYNC()
27377 :   {
27378 :     //^44C8:1BA2
27379 :     //^44C8:1BA5
27380 :     IBMIO_WAIT_VSYNC() CALL_IBMIO;
27381 :   }
27382 : 
27383 :   //^0CD5:000E
27384 :   void WAIT_SCREEN_REFRESH()
27385 :   {
27386 :     //^0CD5:000E
27387 :     FIRE_WAIT_VSYNC();
27388 :   }
27389 : 
27390 :   //^3E74:178C
27391 :   RawEntry *QUERY_GDAT_ENTRYPTR(Bit8u cls1, Bit16u cls2, Bit8u cls3, Bit16u cls4);
27392 : 
27393 :   //^3E74:1CF3
27394 :   Bit16u QUERY_GDAT_ENTRY_IF_LOADABLE(Bit8u cls1, Bit8u cls2, Bit8u cls3, Bit8u cls4)
27395 :   {
27396 :     //^3E74:1CF3
27397 :     //^3E74:1CF7
27398 :     RawEntry *bp04 = QUERY_GDAT_ENTRYPTR(cls1, cls2, cls3, cls4);
27399 :     //^3E74:1D14
27400 :     if (bp04 != NULL) {
27401 :       //^3E74:1D18
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 :         //^3E74:1D56
27409 :         return 1;
27410 :       }
27411 :     }
27412 :     //^3E74:1D5B
27413 :     return 0;
27414 :   }
27415 : 
27416 :   //^0B36:000A
27417 :   Bit16u CALC_IMAGE_BYTE_LENGTH(Bit8u *buff)
27418 :   {
27419 :     //^0B36:000A
27420 :     //^0B36:000D
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 :   //^00EB:03D5
27425 :   void IBMIO_WAIT_VSYNC()
27426 :   {
27427 :     //^00EB:03D5
27428 :     //^00EB:03D8
27429 :     while ((inportb(0x03da) & 0x08) != 0);
27430 :     //^00EB:03E0
27431 :     while ((inportb(0x03da) & 0x08) == 0);
27432 :   }
27433 : 
27434 :   //^00EB:045D
27435 :   void IBMIO_UPDATE_PALETTE_SET()
27436 :   {
27437 :     //^00EB:045D
27438 :     //^00EB:0463
27439 :     IBMIO_WAIT_VSYNC();
27440 :     //^00EB:0466
27441 :     outportb(0x03c8, 0);
27442 :     Bit16u si = 0;
27443 :     //^00EB:0470
27444 :     for (; si < 256; si++) {
27445 :       //^00EB:0472
27446 :       Bit8u bp01 = _04bf_09f0[si][0];
27447 :       Bit8u bp02 = _04bf_09f0[si][1];
27448 :       Bit8u bp03 = _04bf_09f0[si][2];
27449 :       //^00EB:04A2
27450 :       outportb(0x03c9, bp01);
27451 :       outportb(0x03c9, bp02);
27452 :       outportb(0x03c9, bp03);
27453 :       //^00EB:04B1
27454 :     }
27455 :     //^00EB:04B8
27456 :     //^00EB:04B9
27457 :     return;
27458 :   }
27459 : 
27460 :   //^00EB:0654
27461 :   void IBMIO_SELECT_PALETTE_SET(Bit8u number) //#DS=04BF
27462 :   {
27463 :     //^00EB:0654
27464 :     //^00EB:0659
27465 :     LOADDS(0x0c48);
27466 :     //^00EB:065E
27467 :     if (number == 0) {
27468 :       //^00EB:0664
27469 :       IBMIO_WAIT_VSYNC();
27470 :       //^00EB:0668
27471 :       outportb(0x03c8, 0);
27472 :       Bit16u si = 0;
27473 :       for (; si < 256; si++) {
27474 :         //^00EB:0674
27475 :         outportb(0x03c9, 0);
27476 :         outportb(0x03c9, 0);
27477 :         outportb(0x03c9, 0);
27478 :         //^00EB:067C
27479 :       }
27480 :       //^00EB:0683
27481 :     }
27482 :     //^00EB:0686
27483 :     else if (number == 1) {
27484 :       //^00EB:068C
27485 :       IBMIO_UPDATE_PALETTE_SET();
27486 :     }
27487 :     //^00EB:0690
27488 :     _04bf_00fc = number;
27489 :     //^00EB:0696
27490 :     return;
27491 :   }
27492 : 
27493 :   //^44C8:1BD4
27494 :   void FIRE_SELECT_PALETTE_SET(Bit8u number)
27495 :   {
27496 :     //^44C8:1BD4
27497 :     IBMIO_SELECT_PALETTE_SET(number) CALL_IBMIO;
27498 :   }
27499 : 
27500 :   //^00EB:0353
27501 :   void IBMIO_FILL_SCREEN_LINE(Bit16u offDst, Bit16u fill, Bit16u size) //#DS=04BF?
27502 :   {
27503 :     //^00EB:0353
27504 :     //^00EB:0357
27505 : 
27506 :     // TODO: Alt impl
27507 :     memset(_04bf_0e34 + offDst, fill, size);
27508 :   }
27509 : 
27510 :   //^00EB:0383
27511 :   void IBMIO_FILL_RECT_SCREEN(SRECT *rc, Bit16u fill) //#DS=04BF
27512 :   {
27513 :     //^00EB:0383
27514 :     //^00EB:0389
27515 :     LOADDS(0x0c48);
27516 :     //^00EB:038E
27517 :     _04bf_0e34 = pbVram;
27518 :     //^00EB:039A
27519 :     Bit16u di = rc->y * 320 + rc->x;
27520 :     Bit16u si = 0;
27521 :         //^00EB:03AD
27522 :     for (; rc->cy > si; di += 320, si++) {
27523 :       //^00EB:03AF
27524 :       IBMIO_FILL_SCREEN_LINE(di, fill, rc->cx);
27525 :       //^00EB:03C2
27526 :     }
27527 :     //^00EB:03D0
27528 :     return;
27529 :   }
27530 : 
27531 :   //^44C8:1233
27532 :   void FIRE_FILL_4BPP_PICT_LINE(Bit16u offDst, Bit16u fill, Bit16u size)
27533 :   {
27534 :     //^44C8:1233
27535 :     //^44C8:1237
27536 :     Bit8u *di = _4976_5e6a;
27537 :     Bit16u bx = offDst;
27538 :     Bit16u cx = size;
27539 :     Bit8u ah = Bit8u(fill);
27540 :     //^44C8:1245
27541 :     bool carry = (bx & 1) ? true : false;
27542 :     bx >>= 1;
27543 :     di += bx;
27544 :     //^44C8:124B
27545 :     if (carry) {
27546 :       //^44C8:124D
27547 :       *di &= 0xf0; di++;
27548 :       //^44C8:1255
27549 :       cx--;
27550 :       if (cx == 0)
27551 :         //^44C8:1256
27552 :         return;
27553 :     }
27554 :     //^44C8:1258
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 :     //^44C8:127B
27576 :     return;
27577 :   }
27578 : 
27579 :   //^44C8:1A1E
27580 :   void FIRE_FILL_RECT_4BPP_PICT(Bit8u *buff, SRECT *rc, Bit16u fill, Bit16u width)
27581 :   {
27582 :     //^44C8:1A1E
27583 :     //^44C8:1A23
27584 :     _4976_5e6a = buff;
27585 :     //^44C8:1A30
27586 :     width = (width + 1) & 0xfffe;
27587 :     //^44C8:1A3A
27588 :     Bit16u di = rc->y * width + rc->x;
27589 :     Bit16u si = 0;
27590 :     //^44C8:1A4B
27591 :     for (; rc->cy > si; di += width, si++) {
27592 :       //^44C8:1A4D
27593 :       FIRE_FILL_4BPP_PICT_LINE(di, fill, rc->cx);
27594 :       //^44C8:1A60
27595 :     }
27596 :     //^44C8:1A6D
27597 :     return;
27598 :   }
27599 : 
27600 :   //^44C8:127E
27601 :   void FIRE_FILL_8BPP_PICT_LINE(Bit16u offDst, Bit16u fill, Bit16u size)
27602 :   {
27603 :     //^44C8:127E
27604 :     //^44C8:1282
27605 :     Bit8u *di = _4976_5e6a + offDst;
27606 :     Bit16u cx = size;
27607 :     Bit8u al = Bit8u(fill);
27608 :     //^44C8:1292
27609 : 
27610 :     //^44C8:129B
27611 :     Bit16u dx = cx;
27612 :     if ((cx >> 1) != 0) {
27613 :       //^44C8:12A1
27614 :       while (cx != 0) {
27615 :         *di = al; di++;
27616 :         *di = al; di++;
27617 :         cx--;
27618 :       }
27619 :     }
27620 :     //^44C8:12A5
27621 :     if ((dx & 1) != 0) {
27622 :       //^44C8:12AA
27623 :       *di = al; di++;
27624 :     }
27625 :     //^44C8:12AB
27626 :     return;
27627 :   }
27628 : 
27629 :   //^44C8:19D5
27630 :   void FIRE_FILL_RECT_8BPP_PICT(Bit8u *buff, SRECT *rc, Bit16u fill, Bit16u width)
27631 :   {
27632 :     //^44C8:19D5
27633 :     //^44C8:19DA
27634 :     _4976_5e6a = buff;
27635 :     //^44C8:19E7
27636 :     Bit16u di = rc->y * width + rc->x;
27637 :     Bit16u si = 0;
27638 :     //^44C8:19F8
27639 :     for (; rc->cy > si; di += width, si++) {
27640 :       //^44C8:19FA
27641 :       FIRE_FILL_8BPP_PICT_LINE(di, fill, rc->cx);
27642 :       //^44C8:1A0D
27643 :     }
27644 :     //^44C8:1A1A
27645 :     return;
27646 :   }
27647 : 
27648 :   //^44C8:1A71
27649 :   void FIRE_FILL_RECT_ANY(Bit8u *buff, SRECT *rc, Bit16u fill, Bit16u width, Bit16u bpp)
27650 :   {
27651 :     //^44C8:1A71
27652 :     //^44C8:1A75
27653 :     Bit16u si = fill;
27654 :     //^44C8:1A78
27655 :     if (buff == NULL) {
27656 :       //^44C8:1A80
27657 :       IBMIO_FILL_RECT_SCREEN(rc, si) CALL_IBMIO;
27658 :     }
27659 :     //^44C8:1A94
27660 :     else if (bpp == 4) {
27661 :       //^44C8:1A9A
27662 :       FIRE_FILL_RECT_4BPP_PICT(buff, rc, si, width);
27663 :     }
27664 :     else {
27665 :       //^44C8:1AB0
27666 :       FIRE_FILL_RECT_8BPP_PICT(buff, rc, si, width);
27667 :     }
27668 :     //^44C8:1AC7
27669 :     return;
27670 :   }
27671 : 
27672 :   //^44C8:1DAF
27673 :   void FIRE_FILL_SCREEN_RECT(Bit16u rectno, Bit8u fill)
27674 :   {
27675 :     //^44C8:1DAF
27676 :     //^44C8:1DB3
27677 :     SRECT bp08;
27678 :     FIRE_FILL_RECT_ANY(NULL, QUERY_EXPANDED_RECT(rectno, &bp08), fill, _cl_c4700(bp08.cx), 8);
27679 :   }
27680 : 
27681 :   //^0AAF:0000
27682 :   void FIRE_FADE_SCREEN(Bit16u fadeOutIfTrue) //#DS=4976
27683 :   {
27684 :     //^0AAF:0000
27685 :     //^0AAF:0003
27686 :     if (_4976_01ba != 0) {
27687 :       //^0AAF:000A
27688 :       if (fadeOutIfTrue != 0) {
27689 :         //^0AAF:0010
27690 :         FIRE_SELECT_PALETTE_SET(0);
27691 :         //^0AAF:0018
27692 :         FIRE_FILL_SCREEN_RECT(2, 0);
27693 :       }
27694 :       else {
27695 :         //^0AAF:0025
27696 :         FIRE_SELECT_PALETTE_SET(1);
27697 :       }
27698 :     }
27699 :     //^0AAF:002D
27700 :     return;
27701 :   }
27702 : 
27703 :   //^44C8:1D8C
27704 :   void FIRE_FILL_BACKBUFF_RECT(SRECT *rc, Bit8u fill)
27705 :   {
27706 :     //^44C8:1D8C
27707 :     //^44C8:1D8F
27708 :         FIRE_FILL_RECT_ANY(
27709 :       _4976_4c16,
27710 :       rc,
27711 :       fill,
27712 :       _4976_00f6,
27713 :       8
27714 :       );
27715 :     //^44C8:1DAD
27716 :     return;
27717 :   }
27718 : 
27719 :   //^098D:0071
27720 :   SRECT *SET_ORIGIN_RECT(SRECT *rc, __int16 width, __int16 height)
27721 :   {
27722 :     //^098D:0071
27723 :     //^098D:0074
27724 :     rc->x = 0;
27725 :     rc->y = 0;
27726 :     rc->cx = width;
27727 :     rc->cy = height;
27728 :     //^098D:0090
27729 :     return rc;
27730 :   }
27731 : 
27732 :   //^098D:00F9
27733 :   SRECT *INFLATE_RECT(SRECT *rc, __int16 halfWidth, __int16 halfHeight)
27734 :   {
27735 :     //^098D:00F9
27736 :     //^098D:00FC
27737 :     rc->x -= halfWidth;
27738 :     rc->y -= halfHeight;
27739 :     rc->cx += halfWidth << 1;
27740 :     rc->cy += halfHeight << 1;
27741 :     //^098D:011E
27742 :     return rc;
27743 :   }
27744 : 
27745 :   //^098D:0201
27746 :   SRECT *CALC_CENTERED_RECT_IN_RECT(SRECT *rcNew, const SRECT *rcBBox, Bit16u newWidth, Bit16u newHeight)
27747 :   {
27748 :     //^098D:0201
27749 :     //^098D:0204
27750 :     rcNew->cx = newWidth;
27751 :     //^098D:020E
27752 :     rcNew->x = rcBBox->x + ((rcBBox->cx - rcNew->cx + 1) >> 1);
27753 :     //^098D:022D
27754 :     rcNew->cy = newHeight;
27755 :     //^098D:0234
27756 :     rcNew->y = rcBBox->y + ((rcBBox->cy - rcNew->cy + 1) >> 1);
27757 :     //^098D:0255
27758 :     return rcNew;
27759 :   }
27760 : 
27761 :   //^098D:0CFE
27762 :   void QUERY_TOPLEFT_OF_RECT(Bit16u rectno, __int16 *xpos, __int16 *ypos)
27763 :   {
27764 :     //^098D:0CFE
27765 :     //^098D:0D02
27766 :     __int16 bp02 = 1;
27767 :     __int16 bp04 = 1;
27768 :     //^098D:0D0C
27769 :     SRECT bp0c;
27770 :     QUERY_BLIT_RECT(NULL, &bp0c, rectno, &bp02, &bp04, -1);
27771 :     //^098D:0D2B
27772 :     *xpos = bp0c.x;
27773 :     *ypos = bp0c.y;
27774 :     //^098D:0D3D
27775 :     return;
27776 :   }
27777 : 
27778 :   //^0CD5:0063
27779 :   void SLEEP_SEVERAL_TIME(Bit16u count)
27780 :   {
27781 :     //^0CD5:0063
27782 :     //^0CD5:0066
27783 :     while (count-- != 0) {
27784 :       //^0CD5:0068
27785 :       WAIT_SCREEN_REFRESH();
27786 :       //^0CD5:006C
27787 :     }
27788 :   }
27789 : 
27790 :   //^0AAF:01DB
27791 :   void _0aaf_01db(Bit16u rectno, Bit16u yy)
27792 :   {
27793 :     //^0AAF:01DB
27794 :     //^0AAF:01E0
27795 :     if (_4976_5cb0 != 0) {
27796 :       //^0AAF:01EA
27797 :       if (yy == 0)
27798 :         //^0AAF:01F0
27799 :         return;
27800 :       //^0AAF:01F3
27801 :       Bit8u *bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(_4976_4bd5, _4976_4bd6, _4976_4bd4);
27802 :       //^0AAF:020D
27803 :       SRECT bp10;
27804 :       CALC_CENTERED_RECT_IN_RECT(&bp10, &_4976_4e9e, READ_UI16(bp04,-4), READ_UI16(bp04,-2));
27805 :       //^0AAF:0229
27806 :       if (_4976_4e44 != 0xffff) {
27807 :         //^0AAF:0230
27808 :         __int16 bp12;
27809 :         __int16 bp14;
27810 :         QUERY_TOPLEFT_OF_RECT(_4976_4e44, &bp12, &bp14);
27811 :         //^0AAF:0246
27812 :         bp10.x -= bp12;
27813 :         bp10.y -= bp14;
27814 :       }
27815 :       //^0AAF:0252
27816 :       Bit8u *bp08;
27817 :       if (_4976_5d76 != 0) {
27818 :         //^0AAF:0259
27819 :         bp08 = QUERY_GDAT_IMAGE_LOCALPAL(_4976_4bd5, _4976_4bd6, _4976_4bd4);
27820 :       }
27821 :       else {
27822 :         //^0AAF:0272
27823 :         bp08 = bp04 + CALC_IMAGE_BYTE_LENGTH(bp04);
27824 :       }
27825 :       //^0AAF:028D
27826 :       DRAW_DIALOGUE_PARTS_PICT(bp04, &bp10, 7, bp08);
27827 :       //^0AAF:02A8
27828 :       FREE_PICT_ENTRY(bp04);
27829 :     }
27830 :     else {
27831 :       //^0AAF:02B7
27832 :       Bit8u si = (yy != 0) ? (_4976_4bda[0]) : (_4976_4bda[1]);
27833 :       //^0AAF:02D2
27834 :       SRECT bp10;
27835 :       FIRE_FILL_BACKBUFF_RECT(QUERY_EXPANDED_RECT(rectno, &bp10), si);
27836 :     }
27837 :     //^0AAF:02ED
27838 :     SLEEP_SEVERAL_TIME(20);
27839 :     //^0AAF:02F5
27840 :     return;
27841 :   }
27842 : 
27843 :   //^0AAF:02F8
27844 :   Bit8u _0aaf_02f8(Bit8u xx, Bit8u yy) //#DS=4976
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 :     //^0AAF:02F8
27868 :     //^0AAF:02FE
27869 :     if (xx == 0x07 || xx == 0x13) {
27870 :       //^0AAF:030A
27871 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x001a, 0x0059, 0x0001, 0x0000) != 0) {
27872 :         //^0AAF:031E
27873 :         xx = 0x59;
27874 :       }
27875 :     }
27876 :     //^0AAF:0322
27877 :     bp28[0] = _4976_4bda[11];
27878 :     bp28[1] = _4976_4bda[9];
27879 :     //^0AAF:0338
27880 :     if (yy != 0 && xx != 0) {
27881 :       //^0AAF:0344
27882 :       if (QUERY_GDAT_ENTRY_IF_LOADABLE(0x001a, 0x0000, 0x0001, 0x0000) != 0) {
27883 :         //^0AAF:0358
27884 :         _0aaf_0067(_0aaf_02f8(0, yy));
27885 :         //^0AAF:036A
27886 :         yy = 0x00;
27887 :       }
27888 :     }
27889 :     //^0AAF:036E
27890 :     bp0c = 0;
27891 :     //^0AAF:0377
27892 :     for (bp17=0; bp17 < 0x14; bp17++) {
27893 :       //^0AAF:0379
27894 :       bp00b4[bp0c] = QUERY_GDAT_TEXT(0x1a, xx, bp17, bp03d4[bp0c]);
27895 :       //^0AAF:03B6
27896 :       if (bp00b4[bp0c][0] != 0) {
27897 :         //^0AAF:03C0
27898 :         bp0c++;
27899 :       }
27900 :       //^0AAF:03C3
27901 :     }
27902 :     //^0AAF:03CC
27903 :     if ((_4976_5cb0 != 0) && ((_4976_5d76 != 0) || (_4976_00f4 +8 <= _4976_5d30))) {
27904 :       //^0AAF:03F9
27905 :       bp04 = QUERY_GDAT_IMAGE_ENTRY_BUFF(0x1a, xx, 0x00);
27906 :       //^0AAF:040F
27907 :       if (_4976_5d76 != 0) {
27908 :         //^0AAF:0416
27909 :         bp08 = QUERY_GDAT_IMAGE_LOCALPAL(0x1a, xx, 0);
27910 :       }
27911 :       else {
27912 :         //^0AAF:042B
27913 :         bp08 = bp04 + CALC_IMAGE_BYTE_LENGTH(bp04);
27914 :       }
27915 :       //^0AAF:0443
27916 :       DRAW_DIALOGUE_PARTS_PICT(bp04, QUERY_EXPANDED_RECT(4, &bp20), -1, bp08);
27917 :       //^0AAF:046D
27918 :       FREE_PICT_ENTRY(bp04);
27919 :       //^0AAF:047A
27920 :     }
27921 :     else {
27922 :       //^0AAF:047D
27923 :       FIRE_FILL_BACKBUFF_RECT(SET_ORIGIN_RECT(&bp20, _4976_00f6, _4976_00f8), _4976_4bda[1]);
27924 :       //^0AAF:04A7
27925 :       FIRE_FILL_BACKBUFF_RECT(INFLATE_RECT(&bp20, -10, -10), _4976_4bda[5]);
27926 :       //^0AAF:04CD
27927 :       if (bp0c == 0x0003) {
27928 :         bp10 = 1;
27929 :       }
27930 :       else if (bp0c == 0x0004) {
27931 :         bp10 = 4;
27932 :       }
27933 :       else {
27934 :         bp10 = 0;
27935 :       }
27936 :       //^0AAF:04EF
27937 :       for (Bit16u si=0; si < bp0c; si++) {
27938 :         //^0AAF:04F3
27939 :         _0aaf_01db(_4976_01bc[si + bp10], 0);
27940 :         //^0AAF:0506
27941 :       }
27942 :     }
27943 :     //^0AAF:050C
27944 :     _3929_0bd7(0x1c2, _4976_4bda[2], _4976_01e0);
27945 :     //^0AAF:0526
27946 :     FIRE_FADE_SCREEN(1);
27947 :     //^0AAF:052D
27948 :     if (bp0c < 2) {
27949 :       //^0AAF:0533
27950 :       bp0e = 0x01d5;
27951 :     }
27952 :     else {
27953 :       //^0AAF:053A
27954 :       bp0e = 0x01d7;
27955 :     }
27956 :     //^0AAF:053F
27957 :     switch (bp0c) {
27958 :       case 2:
27959 :         //^0AAF:0553
27960 :         bp10 = 1;
27961 :         break;
27962 :       case 3:
27963 :         //^0AAF:055A
27964 :         bp10 = 3;
27965 :         break;
27966 :       case 4:
27967 :         //^0AAF:0561
27968 :         bp10 = 6;
27969 :         break;
27970 :       default:
27971 :         //^0AAF:0568
27972 :         bp10 = 0;
27973 :         break;
27974 :     }
27975 :     //^0AAF:056D
27976 :     for (si=0; si < bp0c; si++) {
27977 :       //^0AAF:0571
27978 :       _3929_0bd7(_4976_01cc[si + bp10], _4976_4bda[9], bp00b4[si]);
27979 :       //^0AAF:05A1
27980 :     }
27981 :     //^0AAF:05A7
27982 :     QUERY_EXPANDED_RECT(bp0e, &bp20);
27983 :     //^0AAF:05B7
27984 :     bp12 = bp20.cx;
27985 :     bp14 = bp20.cy;
27986 :     //^0AAF:05C3
27987 :     if (yy != 0 && xx == 0) {
27988 :       //^0AAF:05CF
27989 :       bp04e4[0].pb0 = QUERY_GDAT_TEXT(0x1a, xx, yy, bp0454);
27990 :     }
27991 :     else {
27992 :       //^0AAF:05F1
27993 :       bp04e4[0].pb0 = QUERY_GDAT_TEXT(0x1a, xx, 0x14, bp0454);
27994 :       //^0AAF:060F
27995 :       if (yy != 0) {
27996 :         //^0AAF:0615
27997 :         bp04e4[1].pb0 = QUERY_GDAT_TEXT(0x1a, 0, yy, bp04d4);
27998 :         //^0AAF:0633
27999 :         goto _0641;
28000 :       }
28001 :     }
28002 :     //^0AAF:0635
28003 :     bp04e4[1].pb0 = NULL;
28004 :     //^0AAF:0641
28005 : _0641:
28006 :     Bit16u di = 0;
28007 :     si = 0;
28008 :     //^0AAF:0647
28009 :     bp24 = &bp04e4[0];
28010 :     //^0AAF:0651
28011 :     for (bp16=0; bp16 < 2; bp16++, bp24++) {
28012 :       //^0AAF:0659
28013 :       if (bp24->pb0 != 0) {
28014 :         //^0AAF:0668
28015 :         _3929_03dc(bp24->pb0, &bp24->w4, &bp24->w6);
28016 :         //^0AAF:068B
28017 :         if (bp24->w4 > bp12 - (bp12 >> 3)) {
28018 :           //^0AAF:069F
28019 :           if (bp24->w4 < bp12 + (bp12 >> 2)) {
28020 :             //^0AAF:06B0
28021 :             bp24->w4 -= bp24->w4 >> 2;
28022 :           }
28023 :           else {
28024 :             //^0AAF:06BD
28025 :             bp24->w4 = bp12;
28026 :           }
28027 :         }
28028 :         //^0AAF:06C7
28029 :         for (bp0e=0; bp24->pb0[bp0e] != 0; ) {
28030 :           //^0AAF:06CE
28031 :           _3929_04e2(bp24->pb0, bp64, &bp0e, bp24->w4);
28032 :           //^0AAF:06EE
28033 :           di += bp24->w6 + (_4976_0134 << 1) - (_4976_0136) + 1;
28034 :           //^0AAF:0704
28035 :           if (bp24->pb0[bp0e] == vbLf) {
28036 :             //^0AAF:0710
28037 :             bp0e++;
28038 :           }
28039 :           //^0AAF:0713
28040 :         }
28041 :       }
28042 :       //^0AAF:0722
28043 :     }
28044 :     //^0AAF:0732
28045 :     if (di != 0) {
28046 :       //^0AAF:0739
28047 :       di = max_value(0, ((bp14 - di - (_4976_0134 << 1)) >> 1) + _4976_0130 - 1);
28048 :       //^0AAF:075A
28049 :       di += bp20.y;
28050 :       //^0AAF:075D
28051 :       bp24 = bp04e4;
28052 :       //^0AAF:0767
28053 :       for (bp16=0; bp16 < 2; bp24++, bp16++) {
28054 :         //^0AAF:076F
28055 :         if (bp24->pb0 != NULL) {
28056 :           //^0AAF:077B
28057 :           for (bp0e=0; bp24->pb0[bp0e] != 0; ) {
28058 :             //^0AAF:0782
28059 :             bp0a = _3929_04e2(bp24->pb0, bp64, &bp0e, bp24->w4);
28060 :             //^0AAF:07A5
28061 :             DRAW_GAMELOAD_STR((_4976_00f6 -bp0a) >> 1, di, bp28[bp16], bp64);
28062 :             //^0AAF:07C9
28063 :             di += _4976_013a + _4976_0134;
28064 :             //^0AAF:07D2
28065 :             if (bp24->pb0[bp0e] == vbLf) {
28066 :               //^0AAF:07E1
28067 :               bp0e++;
28068 :             }
28069 :             //^0AAF:07E4
28070 :           }
28071 :         }
28072 :         //^0AAF:07F3
28073 :       }
28074 :     }
28075 :     //^0AAF:0803
28076 :     _0aaf_002f();
28077 :     FIRE_FADE_SCREEN(0);
28078 :     //^0AAF:080E
28079 :     _4976_022c = 1;
28080 :     //^0AAF:0814
28081 :     return xx;
28082 :   }
28083 : 
28084 :   //^3E74:2614
28085 :   void GRAPHICS_DATA_CLOSE()
28086 :   {
28087 :     //^3E74:2614
28088 :     if ((_4976_5d10--) == 0) {
28089 :       //^3E74:261D
28090 :       FILE_CLOSE(_4976_5c94);
28091 :       //^3E74:2627
28092 :       if (_4976_5c9c != 0 && _4976_5ca8 == 0) {
28093 :         //^3E74:2635
28094 :         FILE_CLOSE(_4976_5c96);
28095 :       }
28096 :     }
28097 :     //^3E74:263F
28098 :     return;
28099 :   }
28100 : 
28101 :   //^3A15:3511
28102 :   void _3a15_3511() //#DS=4976?
28103 :   {
28104 :     //^3A15:3511
28105 :     for (Bit16u di=0; _4976_4d0e->nMaps > di; di++) {
28106 :       //^3A15:351C
28107 :       Bit16u bp14 = _4976_4dba[di].RawColumn();
28108 :       //^3A15:3534
28109 :       Bit16u bp16 = _4976_4dba[di].RawRow();
28110 :       //^3A15:354C
28111 :       Bit8u *bp04 = *_4976_4ca8[di];
28112 :       //^3A15:3567
28113 :       Bit16u *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[di]]];
28114 :       //^3A15:3591
28115 :       for (Bit16u bp10=0; bp10 <= bp14; bp10++) {
28116 :         //^3A15:3599
28117 :         for (Bit16u bp12=0; bp12 <= bp16; bp12++) {
28118 :           //^3A15:35A1
28119 :           if ((*(bp04++) & 0x10) != 0) {
28120 :             //^3A15:35B0
28121 :             ObjectID bp0e = *bp0c;
28122 :             bp0c++;
28123 :             //^3A15:35BD
28124 :             while (bp0e.DBType() <= dbActuator) {
28125 :               //^3A15:35C0
28126 :               if (bp0e.DBType() == dbActuator) {
28127 :                 //^3A15:35D1
28128 :                 Actuator *bp08 = GET_ADDRESS_OF_RECORD(bp0e)->castToActuator();
28129 :                 //^3A15:35E0
28130 :                 Bit16u bp1c = bp08->ActuatorType();
28131 :                 //^3A15:35ED
28132 :                 switch (bp1c) {
28133 :                   case 0x001e: // 0x001e -> 'Activator, tick generator'
28134 :                   case 0x0033: // 0x0033 -> ?
28135 :                   case 0x0034: // 0x0034 -> ?
28136 :                   case 0x0035: // 0x0035 -> ?
28137 :                   case 0x0036: // 0x0036 -> ?
28138 :                   case 0x0037: // 0x0037 -> ?
28139 :                     {
28140 :                       //^3A15:3606
28141 :                       if (_4976_4c24 != 0) {
28142 :                         //^3A15:360D
28143 :                         if (bp08->OnceOnlyActuator() != 0) {
28144 :                           //^3A15:361E
28145 :                           CHANGE_CURRENT_MAP_TO(di);
28146 :                           //^3A15:3625
28147 :                           RUN_ACTUATOR_TICK_GENERATOR(bp08, bp0e);
28148 :                           //^3A15:3635
28149 :                           break;
28150 :                         }
28151 :                         //^3A15:3638
28152 :                         bp08->w4 &= 0xfffe;
28153 :                         //^3A15:3640
28154 :                         break;
28155 :                       }
28156 :                       //^3A15:3643
28157 :                       Bit16u si;
28158 :                       for (si=0; si < _4976_5c16; ) {
28159 :                         //^3A15:3647
28160 :                         sk5c20 *bp1a = &_4976_5c20[si];
28161 :                         si++;
28162 :                         //^3A15:365F
28163 :                         if (bp1a->TimerType() == 0x56 && bp1a->w6 == bp0e) {
28164 :                           //^3A15:3672
28165 :                           bp1a->SetMap(di);
28166 :                           break;
28167 :                         }
28168 :                         //^3A15:36A1
28169 :                       }
28170 :                       //^3A15:36A7
28171 :                       for (; si < _4976_5c16; si++) {
28172 :                         //^3A15:36A9
28173 :                         sk5c20 *bp1a = &_4976_5c20[si];
28174 :                         //^3A15:36C3
28175 :                         if (bp1a->TimerType() == 0x56) {
28176 :                           //^3A15:36CA
28177 :                           if (bp1a->w6 == bp0e) {
28178 :                             //^3A15:36D3
28179 :                             _3a15_061a(si);
28180 :                           }
28181 :                         }
28182 :                         //^3A15:36D9
28183 :                       }
28184 :                       break;
28185 :                     }
28186 :                 }
28187 :               }
28188 :               //^3A15:36E0
28189 :               bp0e = GET_NEXT_RECORD_LINK(bp0e);
28190 :               //^3A15:36EC
28191 :             }
28192 :           }
28193 :           //^3A15:36FD
28194 :         }
28195 :         //^3A15:370B
28196 :       }
28197 :       //^3A15:3719
28198 :     }
28199 :     //^3A15:372B
28200 :     COMPACT_TIMERLIST();
28201 :     //^3A15:372F
28202 :     return;
28203 :   }
28204 : 
28205 :   //^0CD5:00D2
28206 :   Bit16u RAND() //#DS=4976
28207 :   {
28208 :     // CSBwinSimilarity: TAG001030,STRandom
28209 : 
28210 :     //^0CD5:00D2
28211 :     _4976_49ba = _4976_49ba * 0xbb40e62d + 11;
28212 :     //^0CD5:00F5
28213 :     return _4976_49ba >> 8;
28214 :   }
28215 : 
28216 :   //^4937:00CC
28217 :   Bit16u _4937_00cc(Bit8u ct, Bit16u xx, Bit16u *yy, Bit16u *zz, sk5fde **ww, Bit16u vv)
28218 :   {
28219 :     //^4937:00CC
28220 :     sk5fda *bp04 = _4976_5fda[_4976_5fe2[QUERY_GDAT_CREATURE_WORD_VALUE(ct, 0)]];
28221 :     //^4937:00FD
28222 :     while (bp04->w0 != 0xffff && bp04->w0 != xx) {
28223 :       bp04++;
28224 :     }
28225 :     //^4937:0114
28226 :     Bit16u di = bp04->w2;
28227 :     *yy = di;
28228 :     //^4937:0123
28229 :     if ((QUERY_CREATURE_AI_SPEC_FROM_TYPE(ct)->w0 & 0x0001) != 0) {
28230 :       //^4937:0138
28231 :       Bit16u si = 0;
28232 :       sk5fde *bp08 = &_4976_5fde[di];
28233 :       //^4937:0151
28234 :       do {
28235 :         si++;
28236 :       } while((bp08++)->w2 != 0);
28237 :       //^4937:0161
28238 :       if (vv != 0) {
28239 :         //^4937:0167
28240 :         si |= 0x8000 | ((vv & 0x003f) << 6);
28241 :       }
28242 :       else {
28243 :         //^4937:0179
28244 :         si |= 0x9000;
28245 :       }
28246 :       //^4937:017D
28247 :       *zz = si;
28248 :       return 1;
28249 :     }
28250 :     //^4937:0188
28251 :     *zz = 0xffff;
28252 :     //^4937:0190
28253 :     return _4937_01a9(di, zz, ww);
28254 :   }
28255 : 
28256 :   //^1C9A:09DB
28257 :   void _1c9a_09db(Bit16u recordLink)
28258 :   {
28259 :     //^1C9A:09DB
28260 :     sk5fde bp0e;
28261 :     sk5fde *bp12 = &bp0e;
28262 :     //^1C9A:09E8
28263 :     Creature *bp04 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature();
28264 :     //^1C9A:09F7
28265 :     sk1c9a02c3 *bp08 = _1c9a_02c3(bp04, QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType()));
28266 :     //^1C9A:0A1A
28267 :     _4937_00cc(
28268 :       bp04->CreatureType(),
28269 :       0x11,
28270 :       &bp08->w0,
28271 :       &bp08->w2,
28272 :       &bp12,
28273 :       bp04->w12
28274 :       );
28275 :   }
28276 : 
28277 :   //^2066:1FAB
28278 :   void _2066_1fab()
28279 :   {
28280 :     //^2066:1FAB
28281 :     //^2066:1FB1
28282 :     for (Bit16u si=0; si <= _4976_4d0e->nMaps; si++) {
28283 :       //^2066:1FB6
28284 :       Bit16u bp2e = _4976_4dba[si].RawColumn();
28285 :       Bit16u bp30 = _4976_4dba[si].RawRow();
28286 :       //^2066:1FE6
28287 :       Bit8u *bp04 = *_4976_4ca8[si];
28288 :       //^2066:2001
28289 :       Bit16u *bp1c = &_4976_4d16[_4976_4c7c[_4976_4dd6[si]]];
28290 :       //^2066:202B
28291 :       for (Bit16u bp2a=0; bp2a <= bp2e; bp2a++) {
28292 :         //^2066:2033
28293 :         for (Bit16u bp2c=0; bp2c <= bp30; bp2c++) {
28294 :           //^2066:203B
28295 :           Bit8u bp35 = *(bp04++);
28296 :           //^2066:2047
28297 :           if ((bp35 & 0x10) != 0) {
28298 :             //^2066:204E
28299 :             Bit16u di = *bp1c;
28300 :             bp1c++;
28301 :             //^2066:2058
28302 :             do {
28303 :               switch ((di & 0x3c00) >> 10) {
28304 :                 case dbTeleporter:
28305 :                   {
28306 :                     //^2066:22D0
28307 :                     Teleporter *bp0c = (Teleporter *)GET_ADDRESS_OF_RECORD(di);
28308 :                     //^2066:22DD
28309 :                     CHANGE_CURRENT_MAP_TO(bp0c->DestinationMap());
28310 :                     //^2066:22EE
28311 :                     Bit16u bp26 = GET_TILE_RECORD_LINK(bp0c->DestinationX(), bp0c->DestinationY());
28312 :                     //^2066:230E
28313 :                     if (bp26 == 0xfffe)
28314 :                       break;
28315 :                     //^2066:2316
28316 :                     if (((bp26 & 0x3c00) >> 10) != dbTeleporter)
28317 :                       break;
28318 :                     //^2066:2327
28319 :                     Teleporter *bp10 = GET_ADDRESS_OF_RECORD1(bp26);
28320 :                     //^2066:2336
28321 :                     if (bp10->DestinationX() != bp2a)
28322 :                       break;
28323 :                     //^2066:2348
28324 :                     if (bp10->DestinationY() != bp2c)
28325 :                       break;
28326 :                     //^2066:2357
28327 :                     if (bp10->DestinationMap() != si)
28328 :                       break;
28329 :                     //^2066:2362
28330 :                     Bit16u bp3c = 0;
28331 :                     //^2066:2367
28332 :                     Bit16u bp32 = _2066_1f37(bp26, bp0c->DestinationMap(), &bp3c);
28333 :                     //^2066:2384
28334 :                     bp32 |= _2066_1f37(di, si, &bp3c);
28335 :                     //^2066:2395
28336 :                     if (bp3c == 2) {
28337 :                       //^2066:239B
28338 :                       bp10->w0 = bp0c->w0 = _2066_1ec9(GET_NEXT_RECORD_LINK(di), GET_NEXT_RECORD_LINK(bp26));
28339 :                       break;
28340 :                     }
28341 :                     //^2066:23C1
28342 :                     if (bp3c == 0 && bp32 != 0)
28343 :                       goto _23de;
28344 :                     break;
28345 :                   }
28346 :                 case dbText:
28347 :                   {
28348 :                     //^2066:2071
28349 :                     Text *bp20 = GET_ADDRESS_OF_RECORD(di)->castToText();
28350 :                     //^2066:207E
28351 :                     if (bp20->TextMode() != 1)
28352 :                       break;
28353 :                     //^2066:2092
28354 :                     switch (bp20->SimpleTextExtUsage()) {
28355 :                       case 0x06: // Ladder enabled
28356 :                       case 0x07: // Ladder disabled
28357 :                         {
28358 :                           //^2066:20B4
28359 :                           Bit16u bp34 = di >> 14;
28360 :                           //^2066:20BC
28361 :                           _2066_1ea3(bp2a + _4976_0232[bp34], bp2c + _4976_023a[bp34], si);
28362 :                           break;
28363 :                         }
28364 :                       case 0x08: // Recharge
28365 :                         {
28366 :                           //^2066:20E1
28367 :                           bp20->w2 |= 1;
28368 :                           break;
28369 :                         }
28370 :                     }
28371 :                     break;
28372 :                   }
28373 :                 case dbActuator:
28374 :                   {
28375 :                     //^2066:20EB
28376 :                     Actuator *bp08 = GET_ADDRESS_OF_RECORD(di)->castToActuator();
28377 :                     //^2066:20F8
28378 :                     Bit16u bp3e = bp08->ActuatorType();
28379 :                     //^2066:2105
28380 :                     switch (bp3e) {
28381 :                       case 0x001c: // unused in retail ver.
28382 :                       case 0x003f: // Shop panel
28383 :                         //^2066:213E
28384 :                         bp08->w4 &= 0xfffe;
28385 :                         bp08->w4 |= 0x0004;
28386 :                         break;
28387 :                       case 0x0027: // Cross scene
28388 :                       case 0x002c: // Continuous ornate animator
28389 :                         //^2066:211E
28390 :                         if (bp08->OnceOnlyActuator() != 1)
28391 :                           break;
28392 :                         //^2066:2133
28393 :                         bp08->w4 |= 0x0001;
28394 :                         break;
28395 :                       case 0x0046: // Activator, seal-able push button wall switch
28396 :                         //^2066:214E
28397 :                         CHANGE_CURRENT_MAP_TO(si);
28398 :                         //^2066:2155
28399 :                         if ((GET_TILE_VALUE(bp08->Xcoord(), bp08->Ycoord()) >> 5) != ttDoor)
28400 :                           break;
28401 :                         //^2066:2181
28402 :                         //^2066:2192
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 :                     //^2066:21C3
28411 :                     Creature *bp14 = GET_ADDRESS_OF_RECORD(di)->castToCreature();
28412 :                     //^2066:21D0
28413 :                     sk03a2 *bp18 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp14->CreatureType());
28414 :                     //^2066:21E4
28415 :                     bp14->HP1(bp18->w4);
28416 :                     //^2066:21F2
28417 :                     if ((bp18->w0 & 1) == 0) {
28418 :                       //^2066:21FC
28419 :                       bp14->HP3(0);
28420 :                       //^2066:2205
28421 :                       bp14->HP4_0_4(bp2a);
28422 :                       //^2066:2214
28423 :                       bp14->HP4_5_9(bp2c);
28424 :                       //^2066:2227
28425 :                       bp14->HP4_A_F(si);
28426 :                       break;
28427 :                     }
28428 :                     //^2066:223B
28429 :                     bp14->w8 = bp14->w10 = 0;
28430 :                     //^2066:2248
28431 :                     _1c9a_09db(di);
28432 :                     //^2066:224F
28433 :                     if (bp14->b14_7_7() != 0)
28434 :                       break;
28435 :                     //^2066:2263
28436 :                     Bit16u bp28 = bp14->w2;
28437 :                     //^2066:226A
28438 :                     if (bp28 == 0xfffe)
28439 :                       break;
28440 :                     //^2066:2272
28441 :                     bp14->w2 = (bp28 & 0x3fff) | (RAND02() << 14);
28442 :                     //^2066:228A
28443 :                     while (bp28 != 0xfffe) {
28444 :                       //^2066:228C
28445 :                       GenericRecord *bp24 = GET_ADDRESS_OF_RECORD(bp28);
28446 :                       //^2066:229B
28447 :                       if (bp24->w0 != 0xfffe) {
28448 :                         //^2066:22A4
28449 :                         bp24->w0.Dir(RAND02());
28450 :                       }
28451 :                       //^2066:22BB
28452 :                       bp28 = GET_NEXT_RECORD_LINK(bp28);
28453 :                       //^2066:22C7
28454 :                     }
28455 :                     break;
28456 :                   }
28457 :               }
28458 :               //^2066:23CD
28459 :               di = GET_NEXT_RECORD_LINK(di);
28460 :             } while(di != 0xfffe);
28461 :           }
28462 :           //^2066:23DE
28463 : _23de:
28464 :           if ((bp35 >> 5) == ttPit) {
28465 :             //^2066:23EA
28466 :             if (QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4dba[si].MapGraphicsStyle(), dtWordValue, 0x6a) == 0) {
28467 :               //^2066:2412
28468 :               __int16 bp38 = bp2a;
28469 :               __int16 bp3a = bp2c;
28470 :               Bit16u bp34 = _0cee_0510(si, 1, &bp38, &bp3a, NULL);
28471 :               //^2066:243A
28472 :               _2066_1ea3(bp38, bp3a, bp34);
28473 :             }
28474 :           }
28475 :           //^2066:244A
28476 :         }
28477 :         //^2066:2458
28478 :       }
28479 :       //^2066:2466
28480 :     }
28481 :   }
28482 : 
28483 :   //^476D:007A
28484 :   i16 FILE_OPEN(const Bit8u *filename);
28485 : 
28486 :   //^476D:00D2
28487 :   Bit16u FILE_READ(Bit16u handle, Bit32u buffSize, void *buff);
28488 : 
28489 :   //^476D:00A5
28490 :   void FILE_CLOSE(Bit16u handle);
28491 : 
28492 :   //^476D:00BF
28493 :   void FILE_RENAME(const Bit8u *curfilename, const Bit8u *newfilename);
28494 : 
28495 :   //^00EB:02EB
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 :   //^44C8:05AE
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 :   //^44C8:09D7
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 :   //^44C8:0C74
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 :   //^44C8:0F29
28545 :   void _44c8_0f29(  // TODO: Unreachable
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 :   //^44C8:1101
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 :     //^44C8:1101
28575 :     ENTER(0);
28576 :     //^44C8:1106
28577 :     Bit16u di = srcPitch;
28578 :     Bit16u si = colorkey;
28579 :     //^44C8:110C
28580 :     if (dst == NULL) {
28581 :       //^44C8:1114
28582 :       IBMIO_BLIT_TO_SCREEN_xTO8BPP(src, rc, srcx, srcy, di, si, localPal, srcBpp) CALL_IBMIO;
28583 :       //^44C8:113C
28584 :     }
28585 :     else {
28586 :       //^44C8:113F
28587 :       if (srcBpp == 4) {
28588 :         //^44C8:1145
28589 :         if (dstBpp == 4) {
28590 :           //^44C8:114B
28591 :           FIRE_BLIT_TO_MEMORY_4TO4BPP(src, dst, rc, srcx, srcy, srcPitch, dstPitch, colorkey, mirrorFlip);
28592 :         }
28593 :         else {
28594 :           //^44C8:1171
28595 :           FIRE_BLIT_TO_MEMORY_4TO8BPP(src, dst, rc, srcx, srcy, srcPitch, dstPitch, colorkey, mirrorFlip, localPal);
28596 :         }
28597 :       }
28598 :       else {
28599 :         //^44C8:11A0
28600 :         if (localPal == NULL) {
28601 :           //^44C8:11A8
28602 :           FIRE_BLIT_TO_MEMORY_8TO8BPP(src, dst, rc, srcx, srcy, srcPitch, dstPitch, colorkey, mirrorFlip);
28603 :         }
28604 :         else {
28605 :           //^44C8:11D1
28606 :           _44c8_0f29(src, dst, rc, srcx, srcy, di, dstPitch, si, mirrorFlip, localPal);
28607 :         }
28608 :       }
28609 :     }
28610 :     //^44C8:11FE
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 :   //^00EB:0254
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 :   //^476D:030A
28641 :   Bit16u _476d_030a(Bit16u xx); // TODO: Undefined
28642 : 
28643 :   //^2C1D:0250
28644 :   __int16 GET_PLAYER_AT_POSITION(Bit16u position)
28645 :   {
28646 :     //^2C1D:0250
28647 :     sk53b4 *bp04 = _4976_53b4;
28648 :     //^2C1D:025D
28649 :     for (Bit16u si=0; si<_4976_4c3c; si++, bp04++) {
28650 :       //^2C1D:0261
28651 :       if (bp04->playerPos() == position && bp04->curHP() != 0) {
28652 :         //^2C1D:0276
28653 :         return si;
28654 :       }
28655 :       //^2C1D:027A
28656 :     }
28657 :     //^2C1D:0286
28658 :     return -1;
28659 :   }
28660 : 
28661 :   //^4726:0107
28662 :   Bit8u *EMS_MAP_BANK_TO_MEMORY(Bit32u info, Bit16u physPage0to3);
28663 : 
28664 :   //^3E74:0683
28665 :   Bit8u *_3e74_0683(__int32 size, Bit16u poolno)
28666 :   {
28667 :     //^3E74:0683
28668 :     Bit16u si = poolno;
28669 :     //^3E74:068B
28670 :     EMS_MAP_BANK_TO_MEMORY(0, 0);
28671 :     //^3E74:0699
28672 :     sk5d00 *bp04 = _4976_5d00;
28673 :     //^3E74:06A6
28674 :     Bit8u *bp08 = 0;
28675 :     __int32 bp10 = 0x7fffffff;
28676 :     //^3E74:06BA
28677 :     while (bp04 != NULL) {
28678 :       //^3E74:06BC
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 :         //^3E74:0711
28688 :         bp10 = bp0c;
28689 :         bp08 = (Bit8u *)bp04;
28690 :       }
28691 :       //^3E74:0729
28692 :       bp04 = bp04->pv0;
28693 :       //^3E74:0739
28694 :     }
28695 :     //^3E74:074D
28696 :     return bp08;
28697 :   }
28698 : 
28699 :   //^3E74:088E
28700 :   Bit8u *ALLOC_MEMORY(__int32 size, Bit16u flags, Bit16u poolno);
28701 : 
28702 :   //^3E74:0B96
28703 :   Bit8u *ALLOC_PICT_BUFF(Bit16u srccx, Bit16u srccy, Bit16u flags, Bit16u bpp)
28704 :   {
28705 :     //^3E74:0B96
28706 :     Bit16u si = srccx;
28707 :     //^3E74:0B9E
28708 :     Bit8u *bp04 = ALLOC_MEMORY((bpp == 4) ? (((si +1) & 0xfffe) >> 1) : (si & 0xffff), flags, 8);
28709 :     //^3E74:0BD2
28710 :     bp04 = bp04;
28711 :     //^3E74:0BE1
28712 :     WRITE_UI16(bp04,-6,bpp);  // bpp
28713 :     //^3E74:0BFF
28714 :     WRITE_UI16(bp04,-4,si);    // image width
28715 :     //^3E74:0C06
28716 :     WRITE_UI16(bp04,-2,srccy);  // image height
28717 :     //^3E74:0C0D
28718 :     return bp04;
28719 :   }
28720 : 
28721 :   //^47E1:0008
28722 :   void COPY_MEMORY(const void *buffSrc, const void *buffDst, Bit32u buffSize);
28723 : 
28724 :   //^3E74:189B
28725 :   Bit16u QUERY_GDAT_ENTRY_DATA_INDEX(Bit8u cls1, Bit16u cls2, Bit8u cls3, Bit16u cls4);
28726 : 
28727 :   //^3E74:01A5
28728 :   Bit8u *REALIZE_GRAPHICS_DATA_MEMORY(shelf_memory info);
28729 : 
28730 :   //^3E74:0422
28731 :   Bit16u QUERY_GDAT_RAW_DATA_LENGTH(Bit16u index);
28732 : 
28733 :   //^3E74:1586
28734 :   Bit16u IS_CLS1_CRITICAL_FOR_LOAD(Bit8u cls1)
28735 :   {
28736 :     //^3E74:1586
28737 :     switch (cls1) {
28738 :       case 0x1B: // ?
28739 :       case 0x06: // Credits
28740 :       case 0x1C: // Kanji table
28741 :       case 0x05: // Main Menu and Credits
28742 :         //^3E74:15A0
28743 :         return 1;
28744 :     }
28745 :     //^3E74:15A5
28746 :     return 0;
28747 :   }
28748 : 
28749 :   //^3E74:0472
28750 :   __int32 QUERY_GDAT_RAW_DATA_FILE_POS(Bit16u index)
28751 :   {
28752 :     //^3E74:0472
28753 :     Bit16u di = index;
28754 :     Bit32u bp04 = _4976_5d6a;
28755 :     Bit16u si = 0;
28756 :     //^3E74:048A
28757 :     if (di >= _4976_4839) {
28758 :       //^3E74:0490
28759 :       si = _4976_4839;
28760 :       bp04 += _4976_483b;
28761 :     }
28762 :     //^3E74:04A1
28763 :     while (si < di) {
28764 :       //^3E74:04A3
28765 :       bp04 += QUERY_GDAT_RAW_DATA_LENGTH(si);
28766 :       si++;
28767 :       //^3E74:04B1
28768 :     }
28769 :     //^3E74:04B5
28770 :     _4976_4839 = di;
28771 :     //^3E74:04B9
28772 :     _4976_483b = bp04 - _4976_5d6a;
28773 :     //^3E74:04CE
28774 :     return bp04;
28775 :   }
28776 : 
28777 :   //^476D:0005
28778 :   Bit16u FILE_SEEK(Bit16u handle, Bit32u xxx);
28779 : 
28780 :   //^0CCD:000A
28781 :   void __declspec(noreturn) RAISE_SYSERR(Bit16u syserr);
28782 : 
28783 :   //^3E74:0EA2
28784 :   void GRAPHICS_DATA_READ(Bit32u location, Bit32u size, Bit8u *buff)
28785 :   {
28786 :     //^3E74:0EA2
28787 :     Bit16u bp14[2] = {_4976_5c94};
28788 :     Bit32u bp08[2] = {location, 0};
28789 :     __int32 bp10[2] = {size, 0};
28790 :     //^3E74:0ECF
28791 :     if (_4976_5c9c != 0) {
28792 :       //^3E74:0ED6
28793 :       bp14[1] = _4976_5c96;
28794 :       bp08[1] = location - _4976_5cea;
28795 :       //^3E74:0EF0
28796 :       if (bp08[1] >= 0) {
28797 :         //^3E74:0EFA
28798 :         bp10[1] = size;
28799 :       }
28800 :       else {
28801 :         //^3E74:0F08
28802 :         bp10[1] = bp08[1] + size;
28803 :         //^3E74:0F1A
28804 :         if (bp10[1] > 0) {
28805 :           //^3E74:0F24
28806 :           bp08[1] = 0;
28807 :         }
28808 :         else {
28809 :           //^3E74:0F30
28810 :           bp10[1] = 0;
28811 :         }
28812 :       }
28813 :       //^3E74:0F3A
28814 :       bp10[0] -= bp10[1];
28815 :     }
28816 :     //^3E74:0F46
28817 :     for (Bit16u si=0; si < 2; si++) {
28818 :       //^3E74:0F4B
28819 :       if (bp10[si] != 0) {
28820 :         do {
28821 :           //^3E74:0F61
28822 :           if (FILE_SEEK(bp14[si], bp08[si]) != 0) {
28823 :             //^3E74:0F8A
28824 :             if (FILE_READ(bp14[si], bp10[si], buff) != 0)
28825 :               break;
28826 :           }
28827 :           //^3E74:0FB9
28828 :           GRAPHICS_DATA_CLOSE();
28829 :           //^3E74:0FBE
28830 :           RAISE_SYSERR((si == 0) ? 0x002e : 0x0020);
28831 :           //^3E74:0FD1
28832 :         } while (false);
28833 : 
28834 :         buff += bp10[si];
28835 :       }
28836 :       //^3E74:0FEC
28837 :     }
28838 :     //^3E74:0FF5
28839 :   }
28840 : 
28841 :   //^3E74:0FF8
28842 :   void LOAD_GDAT_RAW_DATA(Bit16u index, Bit8u *buff)
28843 :   {
28844 :     //^3E74:0FF8
28845 :     Bit16u di = index;
28846 :     GRAPHICS_DATA_OPEN();
28847 :     //^3E74:1006
28848 :     __int32 bp04;
28849 :     Bit32u bp0c;
28850 :     if (di == 0) {
28851 :       //^3E74:100A
28852 :       bp04 = _4976_5d7a;
28853 :       bp0c = _4976_5d6a - bp04;
28854 :     }
28855 :     else{
28856 :       //^3E74:102C
28857 :       bp0c = QUERY_GDAT_RAW_DATA_FILE_POS(di);
28858 :       bp04 = QUERY_GDAT_RAW_DATA_LENGTH(di);
28859 :     }
28860 :     //^3E74:1046
28861 :     Bit16u si = bp0c / 1024;
28862 :     //^3E74:1058
28863 :     Bit32u bp08 = ((Bit32u)si) << 10;
28864 :     //^3E74:1066
28865 :     while (bp04 > 0) {
28866 :       //^3E74:1069
28867 :       if (si != _4976_480d || _4976_5d34 != 0) {
28868 :         //^3E74:1076
28869 :         _4976_480d = si;
28870 :         //^3E74:107A
28871 :         Bit32u bp18 = _4976_5caa - bp08;
28872 :         //^3E74:108D
28873 :         if (bp18 > 0x00000400) {
28874 :           bp18 = 0x00000400;
28875 :         }
28876 :         //^3E74:10A3
28877 :         GRAPHICS_DATA_READ(bp08, bp18, _4976_5d04);
28878 :         //^3E74:10BE
28879 :         _4976_5d34 = 0;
28880 :       }
28881 :       //^3E74:10C4
28882 :       __int32 bp14 = bp0c - bp08;
28883 :       //^3E74:10D6
28884 :       Bit32u bp10 = (0x00000400 - bp14 > bp04) ? (bp04) : (0x00000400 - bp14);
28885 :       //^3E74:1106
28886 :       COPY_MEMORY(&_4976_5d04[bp14], REALIZE_GRAPHICS_DATA_MEMORY(buff), bp10);
28887 :       //^3E74:1136
28888 :       bp04 -= bp10;
28889 :       bp0c += bp10;
28890 :       buff += bp10;
28891 :       //^3E74:114E
28892 :       si++;
28893 :       bp08 += 0x00000400;
28894 :       //^3E74:1158
28895 :     }
28896 :     //^3E74:116C
28897 :     GRAPHICS_DATA_CLOSE();
28898 :   }
28899 : 
28900 :   //^3E74:0213
28901 :   Bit8u *CONVERT_PHYS_TO_SHELF_FORM(Bit8u *buff)
28902 :   {
28903 :     //^3E74:0213
28904 :     Bit8u *bp04 = buff;
28905 : 
28906 :     DOSIMPL(); // TODO: WRONG conversion. Fix me
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 :   //^3E74:15A9
28915 :   Bit8u *_3e74_15a9(Bit16u index, Bit16u *yy, Bit16u allocUpper)
28916 :   {
28917 :     //^3E74:15A9
28918 :     Bit16u si = index;
28919 :     Bit16u di = allocUpper;
28920 :     //^3E74:15B5
28921 :     if (_4976_5d76 == 0) {
28922 :       //^3E74:15BF
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 :       //^3E74:15F8
28930 :       LOAD_GDAT_RAW_DATA(
28931 :         si,
28932 :         CONVERT_PHYS_TO_SHELF_FORM(bp04)
28933 :         );
28934 :       //^3E74:160E
28935 :       WRITE_UI16(bp04,-6 +4,(di != 0) ? afDefault : afUseLower);
28936 :       //^3E74:1634
28937 :       WRITE_UI32(bp04,-6 +0,bp08);
28938 :       //^3E74:1658
28939 :       //^3E74:16E3
28940 :       return bp04;
28941 :     }
28942 :     else {
28943 :       //^3E74:165B
28944 :       Bit8u *bp04;
28945 :       if (_3e74_55f9(si + 0xfffe0000, yy) != 0) {
28946 :         //^3E74:1679
28947 :         bp04 = reinterpret_cast<Bit8u *>(_3e74_5817(*yy));
28948 :         //^3E74:168B
28949 :         if (di == 0)
28950 :           return bp04;
28951 :         //^3E74:168F
28952 :         _3e74_583a(*yy);
28953 :       }
28954 :       else {
28955 :         //^3E74:169D
28956 :         bp04 = _3e74_5708(
28957 :           *yy,
28958 :           QUERY_GDAT_RAW_DATA_LENGTH(si)
28959 :           );
28960 :         //^3E74:16BA
28961 :         LOAD_GDAT_RAW_DATA(
28962 :           si,
28963 :           CONVERT_PHYS_TO_SHELF_FORM(bp04)
28964 :           );
28965 :         //^3E74:16D0
28966 :         if (di == 0) {
28967 :           //^3E74:16D4
28968 :           _3e74_585a(*yy, 0);
28969 :         }
28970 :       }
28971 :       //^3E74:16E3
28972 :       return bp04;
28973 :     }
28974 :   }
28975 : 
28976 :   //^3E74:521A
28977 :   Bit8u *QUERY_GDAT_IMAGE_LOCALPAL(Bit8u cls1, Bit8u cls2, Bit8u cls4)
28978 :   {
28979 :     //^3E74:521A
28980 :     Bit16u si = QUERY_GDAT_ENTRY_DATA_INDEX(cls1, cls2, dtImage, cls4);
28981 :     //^3E74:5236
28982 :     if (si != 0xffff) {
28983 :       //^3E74:523B
28984 :       SkImage *bp04;
28985 :       if (_4976_5c98[si].Absent() != 0) {
28986 :         //^3E74:5258
28987 :         if (IS_CLS1_CRITICAL_FOR_LOAD(cls1) == 0)
28988 :           goto _5276;
28989 :         //^3E74:5265
28990 :         Bit16u bp06;
28991 :         bp04 = reinterpret_cast<SkImage *>(_3e74_15a9(si, &bp06, 0));
28992 :       }
28993 :       else {
28994 :         //^3E74:5287
28995 :         bp04 = reinterpret_cast<SkImage *>(REALIZE_GRAPHICS_DATA_MEMORY(_4976_5c98[si]));
28996 :       }
28997 :       //^3E74:529F
28998 :       //^3E74:52A5
28999 :       if (bp04->Yoffset() == -32 && bp04->BitsPixel() != 4) {
29000 :         //^3E74:52CE
29001 :         return NULL;
29002 :       }
29003 :       //^3E74:52D4
29004 :       PTR_PADA(bp04, QUERY_GDAT_RAW_DATA_LENGTH(si) - 16);
29005 :       //^3E74:52EB
29006 :       return reinterpret_cast<Bit8u *>(bp04);
29007 :     }
29008 : _5276:
29009 :     //^3E74:5276
29010 :     return QUERY_GDAT_IMAGE_LOCALPAL(0x0015, 0x00fe, 0x00fe);
29011 :   }
29012 : 
29013 :   //^3E74:4FBE
29014 :   Bit8u *QUERY_GDAT_IMAGE_ENTRY_BUFF(Bit8u cls1, Bit8u cls2, Bit8u cls4);
29015 : 
29016 :   //^0B36:1599
29017 :   void DRAW_DIALOGUE_PICT(Bit8u *srcImage, Bit8u *dstImage, blit_rc *rect, Bit16u srcx, Bit16u srcy, Bit16u colorkey, Bit8u localpal[16])
29018 :   {
29019 :     // draw the:
29020 :     // a) pre rendered dialogue to screen
29021 : 
29022 :     //^0B36:1599
29023 :     FIRE_BLIT_PICTURE(
29024 :       srcImage,
29025 :       dstImage,
29026 :       rect,
29027 :       srcx,
29028 :       srcy,
29029 :       ((Bit16u *)srcImage)[-2], // src-pitch
29030 :       ((Bit16u *)dstImage)[-2], // dst-pitch
29031 :       colorkey,
29032 :       0,
29033 :       ((Bit16u *)srcImage)[-3], // src-bpp
29034 :       ((Bit16u *)dstImage)[-3], // dst-bpp
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 :   //^2E62:0004
29042 :   Bit8u *QUERY_GDAT_SQUAD_ICON(Bit8u *dstImage, Bit8u colorno, Bit8u localpal[16])
29043 :   {
29044 :     //^2E62:0004
29045 :     Bit16u si = (((_4976_53b4[colorno].playerDir() + 4 - _4976_4bf6) & 3) + ((_4976_57e6 != 0) ? 4 : 0)) * _4976_0118;
29046 :     //^2E62:003C
29047 :     COPY_MEMORY(
29048 :       QUERY_GDAT_IMAGE_LOCALPAL(1, 6, colorno),
29049 :       localpal,
29050 :       16
29051 :       );
29052 :     //^2E62:0060
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 :     //^2E62:009A
29063 :     return dstImage;
29064 :   }
29065 : 
29066 :   //^3E74:0A1B
29067 :   void DEALLOC_UPPER_MEMORY(Bit32u size);
29068 : 
29069 :   //^3E74:0C16
29070 :   void FREE_PICT_BUFF(Bit8u *buff)
29071 :   {
29072 :     // READ_UI16(buff,-6) -> bpp(4 or 8)
29073 :     // READ_UI16(buff,-4) -> width
29074 :     // READ_UI16(buff,-2) -> height
29075 : 
29076 :     //^3E74:0C16
29077 :     DEALLOC_UPPER_MEMORY(
29078 :       (  (READ_UI16(buff,-6) == 4) 
29079 :         ? (((READ_UI16(buff,-4) +1) & 0xfffe) >> 1)  // if 4 bpp, round up width to byte align.
29080 :         :   (READ_UI16(buff,-4)     & 0xffff)    // if 8 bpp, already byte aligned.
29081 :       ) * READ_UI16(buff,-2)
29082 :     );
29083 :   }
29084 : 
29085 :   //^01B0:07F8
29086 :   void _01b0_07f8() //#DS=04BF
29087 :   {
29088 :     //^01B0:07F8
29089 :     LOADDS(0x3083)
29090 :     //^01B0:0803
29091 :     _04bf_0e7a++;
29092 :   }
29093 : 
29094 :   //^443C:0342
29095 :   Bit16u _443c_0342(Bit16u xx, Bit16u yy, Bit16u zz); // TODO: Undefined
29096 : 
29097 :   //^00EB:0777
29098 :   void _00eb_0777(Bit8u *buff, blit_rc *rc, Bit16u srcx, Bit16u srcy, Bit16u srcpitch, __int16 colorkey) //#DS=04BF
29099 :   {
29100 :     //^00EB:0777
29101 :     LOADDS(0x0c48)
29102 :     //^00EB:0780
29103 :     if (_04bf_00fd != 0)
29104 :       return;
29105 :     //^00EB:078A
29106 :     _04bf_09e0.dstx = rc->dstx;
29107 :     _04bf_09e0.dsty = rc->dsty;
29108 :     _04bf_09e8.dstx = _04bf_09e8.dsty = 0;
29109 :     //^00EB:07A6
29110 :     _04bf_09e0.srccx = _04bf_09e8.srccx = rc->srccx;
29111 :     //^00EB:07B0
29112 :     _04bf_09e0.srccy = _04bf_09e8.srccy = rc->srccy;
29113 :     //^00EB:07BA
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 :     //^00EB:07DC
29125 :     IBMIO_BLIT_TO_SCREEN_8TO8BPP(
29126 :       buff,
29127 :       __vram,
29128 :       rc,
29129 :       srcx,
29130 :       srcy,
29131 :       srcpitch,
29132 :       320,
29133 :       colorkey
29134 :       );
29135 :     //^00EB:0803
29136 :     _04bf_079c = colorkey;
29137 :     _04bf_00fd = 1;
29138 :   }
29139 : 
29140 :   //^01B0:05AE
29141 :   void _01b0_05ae() //#DS=04BF
29142 :   {
29143 :     //^01B0:05AE
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 :       //^01B0:05EE
29156 :       _04bf_1850 = 0;
29157 : 
29158 :       //^01B0:05F4
29159 :       _04bf_0e7c = _443c_0342(_04bf_03be, _04bf_03c0, _04bf_17e8) INDIRECT_CALL;
29160 :       //^01B0:060A
29161 :       if (_04bf_0e7c >= 0) {
29162 :         //^01B0:060E
29163 :         _04bf_1938 = _04bf_0e7c;
29164 :       }
29165 :     }
29166 :     //^01B0:0611
29167 :     Bit8u *bp04 = &_04bf_0e80[_04bf_1938 * 0x0246];
29168 :     //^01B0:0622
29169 :     _04bf_185e = _04bf_03be - *bp04;
29170 :     //^01B0:0634
29171 :     _04bf_1860 = _04bf_03c0 - bp04[1];
29172 :     //^01B0:0644
29173 :     _04bf_0e38 = bp04[2];
29174 :     _04bf_1936 = bp04[3];
29175 :     _04bf_18aa = 0;
29176 :     _04bf_18ac = 0;
29177 :     //^01B0:0662
29178 :     if (_04bf_185e < 0) {
29179 :       //^01B0:0669
29180 :       _04bf_18aa = 0 - _04bf_185e;
29181 :       _04bf_185e = 0;
29182 :     }
29183 :     //^01B0:0678
29184 :     if (_04bf_1860 < 0) {
29185 :       //^01B0:067F
29186 :       _04bf_18ac = 0 - _04bf_1860;
29187 :       _04bf_1860 = 0;
29188 :     }
29189 :     //^01B0:068E
29190 :     if (_04bf_185e >= 320)
29191 :       return;
29192 :     //^01B0:069B
29193 :     if (_04bf_1860 >= 200)
29194 :       return;
29195 :     //^01B0:06A8
29196 :     if (_04bf_17a8 != 0)
29197 :       return;
29198 :     _04bf_17a8++;
29199 :     //^01B0:06BB
29200 :     blit_rc bp0c;
29201 :     bp0c.dstx = _04bf_185e;
29202 :     bp0c.srccx = _04bf_0e38 - _04bf_18aa;
29203 :     //^01B0:06CB
29204 :     if (bp0c.dstx + bp0c.srccx - 1 > 319) {
29205 :       //^01B0:06D7
29206 :       bp0c.srccx -= bp0c.dstx + bp0c.srccx - 320;
29207 :     }
29208 :     //^01B0:06E3
29209 :     bp0c.dsty = _04bf_1860;
29210 :     bp0c.srccy = _04bf_1936 - _04bf_18ac;
29211 :     //^01B0:06F3
29212 :     if (bp0c.dsty + bp0c.srccy - 1 > 199) {
29213 :       //^01B0:06FF
29214 :       bp0c.srccy += bp0c.dsty + bp0c.srccy - 200;
29215 :     }
29216 :     //^01B0:070B
29217 :     _00eb_0777(&bp04[6], &bp0c, _04bf_18aa, _04bf_18ac, _04bf_0e38, bp04[4]);
29218 :     //^01B0:0738
29219 :     return;
29220 :   }
29221 : 
29222 :   //^00EB:073F
29223 :   void _00eb_073f() //#DS=04BF
29224 :   {
29225 :     //^00EB:073F
29226 :     LOADDS(0x0c48);
29227 :     //^00EB:0748
29228 :     if (_04bf_00fd != 0) {
29229 :       //^00EB:074F
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 :     //^00EB:0774
29242 :     return;
29243 :   }
29244 : 
29245 :   //^01B0:073D
29246 :   void _01b0_073d() //#DS=04BF
29247 :   {
29248 :     //^01B0:073D
29249 :     //^01B0:0740
29250 :     if (_04bf_17a8 != 0) {
29251 :       //^01B0:0747
29252 :       _00eb_073f();
29253 :       //^01B0:074C
29254 :       _04bf_17a8--;
29255 :     }
29256 :     //^01B0:0750
29257 :     return;
29258 :   }
29259 : 
29260 :   //^01B0:0752
29261 :   void _01b0_0752(Bit16u cursorx, Bit16u cursory, Bit16u buttons) //#DS=04BF
29262 :   {
29263 :     //^01B0:0752
29264 :     Bit16u di = cursorx;
29265 :     Bit16u si = cursory;
29266 :     _04bf_03be = di;
29267 :     _04bf_03c0 = si;
29268 :     //^01B0:0765
29269 :     if ((di == _04bf_03c2 || si != _04bf_03c4) && _04bf_17a2 <= 0) {
29270 :       //^01B0:0778
29271 :       _01b0_073d();
29272 :       _01b0_05ae();
29273 :       _04bf_03c2 = di;
29274 :       _04bf_03c4 = si;
29275 :     }
29276 :     //^01B0:0788
29277 :     _04bf_17ee = ((buttons >> 1) & 1) | ((buttons << 1) & 2);
29278 :     //^01B0:079D
29279 :     _04bf_0e7c = buttons ^ _04bf_1934;
29280 :     //^01B0:07A7
29281 :     if (_04bf_0e7c != 0 && _04bf_03c6 != 0) {
29282 :       //^01B0:07B2
29283 :       if ((_04bf_0e7c & 1) != 0) {
29284 :         //^01B0:07BA
29285 :         _443c_0342(di, si, ((buttons & 1) != 0) ? 2 : 4) INDIRECT_CALL;
29286 :       }
29287 :       //^01B0:07D0
29288 :       if ((_04bf_0e7c & 2) != 0) {
29289 :         //^01B0:07D8
29290 :         _443c_0342(di, si, ((buttons & 2) != 0) ? 1 : 8) INDIRECT_CALL;
29291 :       }
29292 :       //^01B0:07EE
29293 :       _04bf_1934 = buttons;
29294 :     }
29295 :     //^01B0:07F4
29296 :     return;
29297 :   }
29298 : 
29299 :   //^01B0:080B
29300 :   void _01b0_080b() //#DS=04BF
29301 :   {
29302 :     //^01B0:080B
29303 :     LOADDS(0x3083)
29304 :     //^01B0:0819
29305 :     while (_04bf_17a4 > 0) {
29306 :       //^01B0:081B
29307 :       _04bf_17a4--;
29308 :       _04bf_179c = (_04bf_179c +1) % 10;
29309 :       //^01B0:082D
29310 :       Bit16u si = _04bf_17ac[_04bf_179c].w0;
29311 :       //^01B0:083B
29312 :       Bit16u bp02 = _04bf_17ac[_04bf_179c].w2;
29313 :       //^01B0:084C
29314 :       Bit16u di = _04bf_17ac[_04bf_179c].w4;
29315 :       //^01B0:085B
29316 :       _01b0_0752(bp02, di, si);
29317 :       //^01B0:0867
29318 :     }
29319 :     //^01B0:0870
29320 :     _04bf_0e7a--;
29321 :   }
29322 : 
29323 :   //^01B0:0AA8
29324 :   void _01b0_0aa8() //#DS=04BF
29325 :   {
29326 :     //^01B0:0AA8
29327 :     LOADDS(0x3083);
29328 :     //^01B0:0AB3
29329 :     if ((_04bf_17a2--) == 1) {
29330 :       //^01B0:0ABF
29331 :       _01b0_07f8();
29332 :       _01b0_05ae();
29333 :       //^01B0:0AC7
29334 :       _04bf_03c2 = _04bf_03be;
29335 :       _04bf_03c4 = _04bf_03c0;
29336 :       //^01B0:0AD3
29337 :       _01b0_080b();
29338 :     }
29339 :     //^01B0:0AD7
29340 :   }
29341 : 
29342 :   //^443C:086B
29343 :   void _443c_086b()
29344 :   {
29345 :     //^443C:086B
29346 :     _4976_4860--;
29347 :     //^443C:0872
29348 :     _01b0_0aa8() CALL_IBMIO;
29349 :   }
29350 : 
29351 :   //^443C:04B6
29352 :   void _443c_04b6(Bit16u xx)
29353 :   {
29354 :     //^443C:04B6
29355 :     Bit16u di = 1;
29356 :     //^443C:04BF
29357 :     if ((xx & 0x8000) != 0) {
29358 :       //^443C:04C6
29359 :       di = 0;
29360 :       xx &= 3;
29361 :     }
29362 :     //^443C:04CC
29363 :     __int16 si = GET_PLAYER_AT_POSITION((xx + _4976_4bf6) & 3);
29364 :     //^443C:04DF
29365 :     if (_4976_5dbc != 0) {
29366 :       //^443C:04E9
29367 :       if (si < 0)
29368 :         return;
29369 :       //^443C:04F0
29370 :       _4976_495c.srccx = _4976_0118;
29371 :       _4976_495c.srccy = _4976_011a;
29372 :       //^443C:04FC
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 :       //^443C:0530
29376 :       Bit8u bp1c[16];
29377 :       QUERY_GDAT_SQUAD_ICON(bp08, (Bit8u)si, bp1c);
29378 :       //^443C:0544
29379 :       _44c8_1d26(bp0c, 0x000c);
29380 :       //^443C:0554
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 :       //^443C:0585
29396 :       _443c_085a();
29397 :       //^443C:058A
29398 :       _01b0_0b01(3, bp0c, 8, 6, _4976_0118, _4976_011a, 8, NULL, bp1c[12]) CALL_IBMIO;
29399 :       //^443C:05B5
29400 :       _01b0_0c70(3) CALL_IBMIO;
29401 :       //^443C:05C0
29402 :       FREE_PICT_BUFF(bp0c);
29403 :       //^443C:05CD
29404 :       FREE_PICT_BUFF(bp08);
29405 :       //^443C:05DA
29406 :       _4976_5dba = xx;
29407 :       _4976_5dbc = xx +1;
29408 :       //^443C:05E7
29409 :       _443c_086b();
29410 :     }
29411 :     else {
29412 :       //^_05ee
29413 :       Bit16u bp02 = _4976_5dbc -1;
29414 :       _4976_5dbc = 0;
29415 :       //^443C:05FB
29416 :       Bit16u bp04 = GET_PLAYER_AT_POSITION((bp02 + _4976_4bf6) & 0x0003);
29417 :       //^443C:060C
29418 :       if (di != 0) {
29419 :         //^443C:0610
29420 :         _4976_53b4[bp04].playerDir((Bit8u)_4976_4bf6);
29421 :       }
29422 :       //^443C:061F
29423 :       if (bp02 != xx) {
29424 :         //^443C:0627
29425 :         if (si >= 0) {
29426 :           //^443C:062B
29427 :           _4976_53b4[si].playerPos((Bit8u)bp02);
29428 :         }
29429 :         //^443C:0642
29430 :         _4976_53b4[bp04].playerPos((Bit8u)(xx + _4976_4bf6));
29431 :       }
29432 :     }
29433 :     //^443C:065A
29434 :     _443c_040e();
29435 :   }
29436 : 
29437 :   //^443C:0662
29438 :   void _443c_0662()
29439 :   {
29440 :     //^443C:0662
29441 :     if (_4976_5dbc != 0) {
29442 :       //^443C:066C
29443 :       _443c_04b6(_4976_5dba | 0x8000);
29444 :     }
29445 :     //^443C:0678
29446 :   }
29447 : 
29448 :   //^38C8:0002
29449 :   void _38c8_0002()
29450 :   {
29451 :     //^38C8:0002
29452 :     //^38C8:0005
29453 :     if (_4976_5bec == 0 && _4976_01ba == 0) {
29454 :       //^38C8:0013
29455 :       _4976_5bec = 1;
29456 :       if (_4976_5dbc != 0) {
29457 :         //^38C8:0020
29458 :         _443c_0662();
29459 :         _2759_0644(0);
29460 :       }
29461 :       //^38C8:002D
29462 :       _1031_04f5();
29463 :       _443c_085a();
29464 :       _12b4_0092();
29465 :       //^38C8:003C
29466 :       if (_4976_52be == 0) {
29467 :         //^38C8:0043
29468 :         FIRE_FILL_HALFTONE_RECTI(0x09, 0);
29469 :       }
29470 :       //^38C8:004E
29471 :       FIRE_FILL_HALFTONE_RECTI(0x0B, 0);
29472 :       _443c_086b();
29473 :     }
29474 :     //^38C8:005E
29475 :     return;
29476 :   }
29477 : 
29478 :   //^2636:02F8
29479 :   Bit8u *QUERY_GDAT_TEXT(Bit8u cls1, Bit8u cls2, Bit8u cls4, Bit8u *buff);
29480 : 
29481 :   //^0AAF:0067
29482 :   Bit8u _0aaf_0067(Bit8u cls2)
29483 :   {
29484 :     //^0AAF:0067
29485 :     Bit16u di = 0;
29486 :     Bit16u si = 0xffff;
29487 :     Bit16u bp08 = 0;
29488 :     //^0AAF:0077
29489 :     Bit16u bp38[21];
29490 :     ZERO_MEMORY(&bp38[1], 2*20);
29491 :     //^0AAF:0088
29492 :     Bit8u bp5e[38];
29493 :     for (Bit8u bp0d = 0; bp0d < 0x14; bp0d++) {
29494 :       //^0AAF:008F
29495 :       if (*QUERY_GDAT_TEXT(0x1a, cls2, bp0d, (Bit8u *)bp5e) != 0) {
29496 :         //^0AAF:00B0
29497 :         Bit16u bp0a = QUERY_GDAT_ENTRY_DATA_INDEX(0x1a, cls2, dtWordValue, bp0d);
29498 :         //^0AAF:00C7
29499 :         Bit8u *bp04 = (Bit8u *)&bp38[1 + di];
29500 :         *bp04 = (Bit8u)bp0a;
29501 :         //^0AAF:00E2
29502 :         if (*bp04 == 0) {
29503 :           //^0AAF:00E6
29504 :           *bp04 = bp0d;
29505 :         }
29506 :         //^0AAF:00EF
29507 :         bp04[1] = (Bit8u)(bp0a >> 8);
29508 :         //^0AAF:00FC
29509 :         if (bp04[1] != 0) {
29510 :           //^0AAF:0100
29511 :           si = bp04[1];
29512 :           bp08 = bp04[0];
29513 :         }
29514 :         //^0AAF:0110
29515 :         di++;
29516 :       }
29517 :       //^0AAF:0111
29518 :     }
29519 :     //^0AAF:011D
29520 :     _4976_4bd2 = di;
29521 :     //^0AAF:0121
29522 :     if (si == 0xffff && di == 1) {
29523 :       //^0AAF:012B
29524 :       si = 1;
29525 :     }
29526 :     //^0AAF:012E
29527 :     _1031_0675(4);
29528 :     //^0AAF:0136
29529 :     for (Bit16u bp06 = 0; _4976_4860 > 0; bp06++) {
29530 :       //^0AAF:013D
29531 :       _443c_086b();
29532 :       //^0AAF:0142
29533 :     }
29534 :     //^0AAF:014C
29535 :     _4976_4dfc = 0x00ff;
29536 : 
29537 :     do {
29538 :       //^0AAF:0152
29539 :       _1031_1e6a();
29540 :       WAIT_SCREEN_REFRESH();
29541 :       //^0AAF:015C
29542 :       if (si != 0xffff) {
29543 :         //^0AAF:0161
29544 :         if (_476d_04ed(si) != 0) {
29545 :           //^0AAF:016C
29546 :           _1031_0781(bp08 + 0x00db);
29547 :         }
29548 :       }
29549 :       //^0AAF:0179
29550 :       if (_4976_4dfc == 0x00ff && _476d_05a9() != 0 && _476d_050e() == 0x001c) {
29551 :         //^0AAF:0194
29552 :         _1031_0781(0x00db);
29553 :       }
29554 :       //^0AAF:019D
29555 :     } while (_4976_4dfc == 0x00ff);
29556 : 
29557 :     //^0AAF:01A5
29558 :     Bit8u bp0c = (Bit8u)bp38[_4976_4dfc];
29559 :     //^0AAF:01B8
29560 :     while ((bp06--) != 0) {
29561 :       //^0AAF:01BA
29562 :       _443c_085a();
29563 :       //^0AAF:01BF
29564 :     }
29565 :     //^0AAF:01C9
29566 :     _4976_022c = 1;
29567 :     //^0AAF:01CF
29568 :     _1031_06a5();
29569 :     //^0AAF:01D4
29570 :     return bp0c;
29571 :   }
29572 : 
29573 :   //^2066:03E0
29574 :   Bit16u _2066_03e0(Bit16u xx)
29575 :   {
29576 :     //^2066:03E0
29577 :     Bit16u di = xx;
29578 :     Bit8u bp01 = 0;
29579 :     //^2066:03ED
29580 :     if (_4976_499e != 0) {
29581 :       //^2066:03F4
29582 :       return 1;
29583 :     }
29584 :     //^2066:03F9
29585 :     Bit16u si = 1;
29586 :     //^2066:03FC
29587 :     if (_476d_030a(1) == 0) {
29588 :       //^2066:0408
29589 :       if (di != 2)
29590 :         return si;
29591 :     }
29592 :     //^2066:040D
29593 :     _4976_52f4 = 1;
29594 :     //^2066:0413
29595 :     while (di != 0 || _476d_030a(1) != 0) {
29596 :       //^2066:0415
29597 :       _38c8_0002();
29598 :       //^2066:041A
29599 :       di = si = 0;
29600 :       //^2066:0420
29601 :       _0aaf_0067(_0aaf_02f8((_4976_5c9c != 0) ? ((_4976_5ca8 != 0) ? (0x13) : (0x14)) : (0x07), bp01 = _476d_04e8(1)));
29602 :       //^2066:0453
29603 :       bp01 = 0x14;
29604 :       //^2066:0457
29605 :     }
29606 :     //^2066:0467
29607 :     return si;
29608 :   }
29609 : 
29610 :   //^2066:0002
29611 :   void _2066_0002()
29612 :   {
29613 :     //^2066:0002
29614 :     _4976_524e = _4976_5254 = 0;
29615 :   }
29616 : 
29617 :   //^3A15:0314
29618 :   void REARRANGE_TIMERLIST()
29619 :   {
29620 :     // chain an unused timer entry to next unused timer entry.
29621 : 
29622 :     //^3A15:0314
29623 :     //^3A15:0319
29624 :     _4976_5c14 = 0;
29625 :     _4976_5c18 = 0xffff;
29626 :     //^3A15:0325
29627 :     Bit16u di;
29628 :     for (Bit16u si=0; si < _4976_5c16; si++) {
29629 :       //^3A15:0329
29630 :       if (_4976_5c20[si].TimerType() == 0) {
29631 :         //^3A15:033D
29632 :         if (_4976_5c18 == 0xffff) {
29633 :           //^3A15:0344
29634 :           _4976_5c18 = si;
29635 :         }
29636 :         else {
29637 :           //^3A15:034A
29638 :           _4976_5c20[di].w0_0_f(si);
29639 :         }
29640 :         //^3A15:035A
29641 :         _4976_5c20[si].w0_0_f(0xffff);
29642 :         //^3A15:036C
29643 :         di = si;
29644 :       }
29645 :       else {
29646 :         //^3A15:0370
29647 :         _4976_5c14 = si+1;
29648 :       }
29649 :       //^3A15:0376
29650 :     }
29651 :     //^3A15:037D
29652 :     return;
29653 :   }
29654 : 
29655 :   //^3A15:008E
29656 :   void _3a15_008e()
29657 :   {
29658 :     //^3A15:008E
29659 :     //^3A15:0094
29660 :     Bit16u bp12 = _4976_5c1e;
29661 :     //^3A15:009A
29662 :     if (bp12 != 0) {
29663 :       //^3A15:00A1
29664 :       for (Bit16u di = 0; di < bp12; di++) {
29665 :         //^3A15:00A5
29666 :         _4976_5c1a[di] = di;
29667 :         //^3A15:00B2
29668 :       }
29669 :       //^3A15:00B8
29670 :       if (bp12 != 1) {
29671 :         //^3A15:00C1
29672 :         for (__int16 bp0e = (bp12 -2) >> 1; bp0e >= 0; bp0e--) {
29673 :           //^3A15:00CE
29674 :           Bit16u di = bp0e;
29675 :           sk5c20 *bp04 = &_4976_5c20[_4976_5c1a[di]];
29676 :           while (true) {
29677 :             //^3A15:00F3
29678 :             Bit16u si = (di << 1) + 1;
29679 :             //^3A15:00FA
29680 :             if (si >= bp12)
29681 :               break;
29682 :             //^3A15:0102
29683 :             sk5c20 *bp08 = &_4976_5c20[_4976_5c1a[si]];
29684 :             //^3A15:0124
29685 :             if (si+1 < bp12) {
29686 :               //^3A15:012C
29687 :               sk5c20 *bp0c = &_4976_5c20[_4976_5c1a[si+1]];
29688 :               //^3A15:014F
29689 :               if (_3a15_0381(bp04, bp08) != 0) {
29690 :                 //^3A15:0167
29691 :                 if (_3a15_0381(bp04, bp0c) != 0)
29692 :                   //^3A15:017D
29693 :                   break;
29694 :                 //^3A15:017F
29695 :                 si++;
29696 :               }
29697 :               else {
29698 :                 //^3A15:0182
29699 :                 if (_3a15_0381(bp0c, bp08) != 0)
29700 :                   //^3A15:019A
29701 :                   si++;
29702 :               }
29703 :             }
29704 :             else {
29705 :               //^3A15:019D
29706 :               if (_3a15_0381(bp04, bp08) != 0)
29707 :                 //^3A15:01B3
29708 :                 break;
29709 :             }
29710 :             //^3A15:01B5
29711 :             Bit16u bp10 = _4976_5c1a[di];
29712 :             //^3A15:01C5
29713 :             _4976_5c1a[di] = _4976_5c1a[si];
29714 :             //^3A15:01DF
29715 :             _4976_5c1a[si] = bp10;
29716 :             //^3A15:01EF
29717 :             di = si;
29718 :           }
29719 :           //^3A15:01F4
29720 :         }
29721 :       }
29722 :     }
29723 :     //^3A15:0200
29724 :     _4976_4762 = -1;
29725 :     //^3A15:0206
29726 :     REARRANGE_TIMERLIST();
29727 :     //^3A15:020B
29728 :     return;
29729 :   }
29730 : 
29731 :   //^2636:000C
29732 :   Bit8u *FORMAT_SKSTR(const Bit8u *format, Bit8u *output);
29733 : 
29734 :   //^2066:25B8
29735 :   int READ_DUNGEON_STRUCTURE(int xx);
29736 : 
29737 :   //^2066:01C3
29738 :   int SUPPRESS_READER(void *_data, const void *_mask, Bit16u buffSize, Bit32u repeat, Bit16u fill);
29739 : 
29740 :   //^2066:030D
29741 :   int READ_1BIT(Bit16u *pw);
29742 : 
29743 :   //^2066:0569
29744 :   void ADD_INDEX_TO_POSSESSION_INDICES(Bit16u recordLink);
29745 : 
29746 :   //^2066:15AA
29747 :   int READ_RECORD_CHECKCODE(__int16 xpos, __int16 ypos, ObjectID *recordLinkPtr, Bit16u xx, Bit16u yy)
29748 :   {
29749 :     // xx=(read-direction-in-record-link)
29750 :     // yy=(read-subsequent-records)
29751 : 
29752 :     //^2066:15AA
29753 :     while (true) {
29754 :       //^2066:15B0
29755 :       Bit16u bp0e;
29756 :       if (READ_1BIT(&bp0e) != 0)
29757 :         return 1;
29758 :       //^2066:15C2
29759 :       if (bp0e == 0)
29760 :         break;
29761 :       //^2066:15CB
29762 :       Bit8u bp0c = 0x0f;
29763 :       Bit8u bp0b;
29764 :       //^2066:15CF
29765 :       if (SUPPRESS_READER(&bp0b, &bp0c, 1, 1, 1) != 0)
29766 :         return 1;
29767 :       //^2066:15EF
29768 :       Bit16u di = bp0b;
29769 :       Bit16u bp0a;
29770 :       if (xx != 0 && di != dbCreature) {
29771 :         //^2066:1601
29772 :         bp0c = 0x03;
29773 :         //^2066:1605
29774 :         if (SUPPRESS_READER(&bp0b, &bp0c, 1, 1, 1) != 0)
29775 :           return 1;
29776 :         //^2066:1625
29777 :         bp0a = bp0b;
29778 :       }
29779 :       else {
29780 :         //^2066:162F
29781 :         bp0a = 0;
29782 :       }
29783 :       //^2066:1634
29784 :       if (di == dbCloud && _4976_3b59 != 0) {
29785 :         //^2066:1640
29786 :         Bit16u bp10 = 0x7f;
29787 :         //^2066:1645
29788 :         if (SUPPRESS_READER(&bp0e, &bp10, 2, 1, 1) != 0)
29789 :           return 1;
29790 :         //^2066:1665
29791 :         bp0e = bp0e;
29792 :         if (recordLinkPtr == NULL)
29793 :           break;
29794 :         //^2066:1676
29795 :         *recordLinkPtr = 0xff80 | bp0e;
29796 :         break;
29797 :       }
29798 :       //^2066:1685
29799 :       Bit16u si = ALLOC_NEW_RECORD(di);
29800 :       si = (si & 0x3fff) | bp0a << 14;
29801 :       //^2066:169E
29802 :       APPEND_RECORD_TO(si, recordLinkPtr, xpos, ypos);
29803 :       //^2066:16B3
29804 :       void *bp04 = GET_ADDRESS_OF_RECORD(si);
29805 :       //^2066:16C0
29806 :       const void *bp08 = _4976_3b13[di];
29807 :       if (bp08 != NULL) {
29808 :         //^2066:16DA
29809 :         Bit16u bp12 = 0;
29810 :         //^2066:16DF
29811 :         switch (di) {
29812 :           case dbCreature:
29813 :             {
29814 :               //^2066:16F6
29815 :               bp0c = 0x7f;
29816 :               if (SUPPRESS_READER(&bp0b, &bp0c, 1, 1, 1) != 0)
29817 :                 return 1;
29818 :               //^2066:171A
29819 :               reinterpret_cast<Creature *>(bp04)->b4 = bp0b;
29820 :               //^2066:1724
29821 :               if ((_0cee_2de0(si) & 1) == 0)
29822 :                 break;
29823 :               bp08 = db4Mask2;
29824 :               break;
29825 :             }
29826 :           case dbContainer:
29827 :             {
29828 :               //^2066:173A
29829 :               bp0c = 0x03;
29830 :               if (SUPPRESS_READER(&bp0c, &bp0c, 1, 1, 1) != 0)
29831 :                 return 1;
29832 :               //^2066:175E
29833 :               reinterpret_cast<Container *>(bp04)->b4 &= 0xf9;
29834 :               reinterpret_cast<Container *>(bp04)->b4 |= (bp0b & 3) << 1;
29835 :               //^2066:1774
29836 :               if (IS_CONTAINER_MAP(si) == 0)
29837 :                 break;
29838 :               //^2066:177F
29839 :               bp08 = db9Mask2;
29840 :               bp12 = 1;
29841 :               break;
29842 :             }
29843 :           case dbMissile:
29844 :             {
29845 :               //^2066:178E
29846 :               if (_4976_3b5b != 0) {
29847 :                 //^2066:1795
29848 :                 bp08 = dbEMask2;
29849 :                 bp12 = 1;
29850 :               }
29851 :               break;
29852 :             }
29853 :         }
29854 :         //^2066:17A2
29855 :         if (SUPPRESS_READER(bp04, bp08, _4976_0242[di], 1, 0) != 0)
29856 :           return 1;
29857 :         //^2066:17C9
29858 :         switch (di) {
29859 :           case dbCreature:
29860 :             {
29861 :               //^2066:17DD
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 :               //^2066:181F
29875 :               _4976_3b5b = 0;
29876 :               break;
29877 :             }
29878 :           case dbContainer:
29879 :             {
29880 :               //^2066:1828
29881 :               if (bp12 != 0) {
29882 :                 Bit16u bp14;
29883 :                 //^2066:182E
29884 :                 if (READ_1BIT(&bp14) != 0)
29885 :                   return 1;
29886 :                 //^2066:1840
29887 :                 if (bp14 != 0) {
29888 :                   //^2066:1846
29889 :                   //^2066:18B2
29890 :                   ADD_INDEX_TO_POSSESSION_INDICES(si);
29891 :                 }
29892 :                 //^2066:1848
29893 :                 reinterpret_cast<Container *>(bp04)->w2 = 0xfffe;
29894 :               }
29895 :               else {
29896 :                 //^2066:1854
29897 :                 if (IS_CONTAINER_MONEYBOX(si) != 0) {
29898 :                   //^2066:185F
29899 :                   tableMask[dbMiscellaneous_item] = dbAMask1;
29900 :                 }
29901 :                 //^2066:1869
29902 :                 reinterpret_cast<Container *>(bp04)->w2 = 0xfffe;
29903 :                 //^2066:1872
29904 :                 if (READ_RECORD_CHECKCODE(-1, 0, &reinterpret_cast<Container *>(bp04)->w2, 0, 1) != 0)
29905 :                   return 1;
29906 :                 //^2066:1891
29907 :                 if (IS_CONTAINER_MONEYBOX(si) == 0)
29908 :                   break;
29909 :                 //^2066:189F
29910 :                 tableMask[dbMiscellaneous_item] = dbAMask2;
29911 :                 break;
29912 :               }
29913 :               break;
29914 :             }
29915 :           case dbMissile:
29916 :             {
29917 :               //^2066:18AC
29918 :               if (bp12 != 0) {
29919 :                 //^2066:18B2
29920 :                 ADD_INDEX_TO_POSSESSION_INDICES(si);
29921 :               }
29922 :               else {
29923 :                 //^2066:18BB
29924 :                 _4976_5c20[reinterpret_cast<Missile *>(bp04)->w6].w6 = si;
29925 :                 //^2066:18D1
29926 :                 reinterpret_cast<Missile *>(bp04)->w2 = 0xfffe;
29927 :                 _4976_3b59 = 1;
29928 :                 //^2066:18E0
29929 :                 if (READ_RECORD_CHECKCODE(-1, 0, &reinterpret_cast<Missile *>(bp04)->w2, 0, 0) != 0)
29930 :                   return 1;
29931 :                 //^2066:18FC
29932 :                 _4976_3b59 = 0;
29933 :               }
29934 :               break;
29935 :             }
29936 :           case dbCloud:
29937 :             {
29938 :               //^2066:1904
29939 :               if (READ_1BIT(&bp0e) != 0)
29940 :                 return 1;
29941 :               //^2066:1913
29942 :               if (bp0e == 0)
29943 :                 break;
29944 :               //^2066:1919
29945 :               Bit16u bp10 = 0x03ff;
29946 :               //^2066:191E
29947 :               if (SUPPRESS_READER(&bp0e, &bp10, 2, 1, 1) != 0)
29948 :                 return 1;
29949 :               //^2066:193B
29950 :               bp0e = bp0e;
29951 :               _4976_5c20[bp0e].w8 = si;
29952 :               break;
29953 :             }
29954 :         }
29955 :       }
29956 :       //^2066:1950
29957 :       if (yy == 0)
29958 :         break;
29959 :         }
29960 :     //^2066:1959
29961 :     return 0;
29962 :   }
29963 : 
29964 :   //^0CEE:0921
29965 :   Bit8u GET_TELEPORTER_DETAIL(TELE_inf *teleinf, Bit8u x_pos, Bit8u y_pos);
29966 : 
29967 :   //^2066:197C
29968 :   Bit16u _2066_197c()
29969 :   {
29970 :     //^2066:197C
29971 :     ENTER(4);
29972 :     //^2066:1981
29973 :     sk5c20 *bp04 = _4976_5c20;
29974 :     //^2066:198E
29975 :     for (Bit16u si = 0; si < _4976_5c1e; bp04++, si++) {
29976 :       //^2066:1992
29977 :       switch (bp04->TimerType()) {
29978 :         case 60:
29979 :         case 61:
29980 :           //^2066:19A3
29981 :           if (_4976_5244 == 0) {
29982 :             //^2066:19AA
29983 :             return 1;
29984 :           }
29985 :           //^2066:19AF
29986 :           bp04->w8 = 0xfffe;
29987 :           //^2066:19B8
29988 :           if (READ_RECORD_CHECKCODE(-1, 0, bp04->pv8_0_f(), 0, 0) != 0)
29989 :             //^2066:19D5
29990 :             //^2066:19AA
29991 :             return 1;
29992 : 
29993 :           break;
29994 :       }
29995 :       //^2066:19D7
29996 :     }
29997 :     //^2066:19E2
29998 :     return 0;
29999 :   }
30000 : 
30001 :   //^2066:062B
30002 :   Bit16u _2066_062b()
30003 :   {
30004 :     //^2066:062B
30005 :     ENTER(12);
30006 :     //^2066:0631
30007 :     Bit16u bp0a = _4976_3954;
30008 :     //^2066:0637
30009 :     Bit16u *bp04 = _4976_525e;
30010 :     //^2066:0644
30011 :     for (; bp0a-- != 0; ) {
30012 :       //^2066:0647
30013 :       ObjectID di = *bp04; bp04++;
30014 :       //^2066:0651
30015 :       GenericRecord *bp08 = GET_ADDRESS_OF_RECORD(di);
30016 :       //^2066:065E
30017 :       switch (di.DBType()) {
30018 :         case dbContainer:
30019 :           {
30020 :             //^2066:0672
30021 :             Bit16u bp0e = 0x03ff;
30022 :             //^2066:0677
30023 :             Bit16u bp0c;
30024 :             if (SUPPRESS_READER(&bp0c, &bp0e, 2, 1, 1) != 0)
30025 :               //^2066:0692
30026 :               //^2066:06E1
30027 :               return 1;
30028 :             //^2066:0694
30029 :             Bit16u si = bp0c;
30030 :             bp08->castToContainer()->SetContainedObject(ObjectID(0, dbCreature, si));
30031 : 
30032 :             break;
30033 :           }
30034 :         case dbMissile:
30035 :           {
30036 :             //^2066:069F
30037 :             Bit16u bp0e = 0x03ff;
30038 :             //^2066:06A4
30039 :             Bit16u bp0c;
30040 :             if (SUPPRESS_READER(&bp0c, &bp0e, 2, 1, 1) != 0)
30041 :               //^2066:06BF
30042 :               //^2066:06E1
30043 :               return 1;
30044 :             //^2066:06C1
30045 :             Bit16u si = bp0c;
30046 :             bp08->castToMissile()->SetMissileObject(ObjectID(0, dbContainer));
30047 :           }
30048 :       }
30049 :       //^2066:06D0
30050 :     }
30051 :     //^2066:06DD
30052 :     return 0;
30053 :   }
30054 : 
30055 :   //^2066:19E7
30056 :   int _2066_19e7()
30057 :   {
30058 :     //^2066:19E7
30059 :     for (Bit16u si=0; si < _4976_4c3c; si++) {
30060 :       //^2066:19F1
30061 :       ObjectID *bp08 = &_4976_53b4[si].w193[0];
30062 :       //^2066:1A01
30063 :       for (Bit16u di=0; di < 30; di++) {
30064 :         //^2066:1A05
30065 :         *bp08 = ObjectID::FFFE; bp08++;
30066 :         //^2066:1A11
30067 :       }
30068 :       //^2066:1A17
30069 :     }
30070 :     //^2066:1A1E
30071 :     _4976_57c8.w0 = ObjectID::FFFE;
30072 :     Bit16u bp18 = _4976_0c5a;
30073 :     //^2066:1A2A
30074 :     for (Bit16u bp16=0; _4976_4d0e->nMaps > bp16; bp16++) {
30075 :       //^2066:1A32
30076 :       CHANGE_CURRENT_MAP_TO(bp16);
30077 :       //^2066:1A3B
30078 :       for (Bit16u bp0e=0; bp0e < _4976_4dd2; bp0e++) {
30079 :         //^2066:1A42
30080 :         for (Bit16u bp10=0; bp10 < _4976_4dd4; bp10++) {
30081 :           //^2066:1A49
30082 :           ObjectID bp12 = GET_TILE_RECORD_LINK(bp0e, bp10);
30083 :           while (bp12 != ObjectID::FFFE) {
30084 :             //^2066:1A58
30085 :             if (bp12.DBType() > dbActuator) {
30086 :               //^2066:1A66
30087 :               GET_ADDRESS_OF_RECORD(bp12)->w0 = ObjectID::FFFE;
30088 :               //^2066:1A78
30089 :               CUT_RECORD_FROM(bp12, NULL, bp0e, bp10);
30090 :               break;
30091 :             }
30092 :             else {
30093 :               //^2066:1A8F
30094 :               bp12 = GET_NEXT_RECORD_LINK(bp12);
30095 :             }
30096 :             //^2066:1A9B
30097 :           }
30098 :           //^2066:1AA1
30099 :         }
30100 :         //^2066:1AAD
30101 :       }
30102 :       //^2066:1AB9
30103 :     }
30104 :     //^2066:1ACE
30105 :         CHANGE_CURRENT_MAP_TO(bp18);
30106 :     //^2066:1AD7
30107 :     for (Bit16u si = dbCreature; si < dbMax; si++) {
30108 :       //^2066:1ADC
30109 :       Bit16u *bp08 = reinterpret_cast<Bit16u *>(&_4976_4cca[si]);
30110 :       //^2066:1AEF
30111 :       Bit16u bp1a = _4976_0242[si] >> 1;
30112 :       for (Bit16u di = _4976_4d0e->nRecords[si]; di-- != 0; bp08 += bp1a) {
30113 :         //^2066:1B0A
30114 :         reinterpret_cast<GenericRecord *>(bp08)->w0 = ObjectID::FFFF;
30115 :         //^2066:1B12
30116 :       }
30117 :       //^2066:1B21
30118 :     }
30119 :     //^2066:1B27
30120 :     _4976_525e = (Bit16u *)ALLOC_MEMORY(200, afDefault, 1024);
30121 :     //^2066:1B40
30122 :     _4976_3954 = 0;
30123 :     //^2066:1B46
30124 :     for (Bit16u si = 0; si < _4976_4c3c; si++) {
30125 :       //^2066:1B4A
30126 :       ObjectID *bp08 = &_4976_53b4[si].w193[0];
30127 :       //^2066:1B5A
30128 :       for (Bit16u di = 0; di < 30; di++) {
30129 :         //^2066:1B5E
30130 :         if (READ_RECORD_CHECKCODE(-1, 0, bp08++, 0, 0) != 0) {
30131 :           //^2066:1B7C
30132 :           //^2066:1E7E
30133 :           Bit16u si = 1;
30134 :           //^2066:1E81
30135 :           DEALLOC_UPPER_MEMORY(200);
30136 :           return si;
30137 :         }
30138 :         //^2066:1B7F
30139 :       }
30140 :       //^2066:1B85
30141 :     }
30142 :     //^2066:1B8C
30143 :     if (READ_RECORD_CHECKCODE(-1, 0, &_4976_57c8.w0, 0, 0) != 0) {
30144 :       //^2066:1BA3
30145 :       //^2066:1E7E
30146 :       Bit16u si = 1;
30147 :       //^2066:1E81
30148 :       DEALLOC_UPPER_MEMORY(200);
30149 :       return si;
30150 :     }
30151 :     //^2066:1BA6
30152 :     for (Bit16u si = 0; si < _4976_4c3c; si++) {
30153 :       //^2066:1BAA
30154 :       ObjectID *bp08 = &_4976_53b4[si].w193[0];
30155 :       //^2066:1BBA
30156 :       for (Bit16u di = 0; di < 30; di++, bp08++) {
30157 :         //^2066:1BBE
30158 :         if (*bp08 == ObjectID::FFFE) {
30159 :           //^2066:1BC7
30160 :           *bp08 = ObjectID::FFFF;
30161 :         }
30162 :         else {
30163 :           //^2066:1BCE
30164 :           _2c1d_03e7(si, *bp08, di, 0);
30165 :         }
30166 :         //^2066:1BE0
30167 :       }
30168 :       //^2066:1BEA
30169 :     }
30170 :     //^2066:1BF1
30171 :     if (_4976_57c8.w0 == ObjectID::FFFE) {
30172 :       //^2066:1BF8
30173 :       _4976_57c8.w0 = ObjectID::FFFF;
30174 :     }
30175 :     else {
30176 :       //^2066:1C00
30177 :       _2c1d_03e7(_4976_3fc6, _4976_57c8.w0, 0xffff, 0);
30178 :     }
30179 :     //^2066:1C14
30180 :     if (_2066_197c() != 0) {
30181 :       //^2066:1C1C
30182 :       //^2066:1E7E
30183 :       Bit16u si = 1;
30184 :       //^2066:1E81
30185 :       DEALLOC_UPPER_MEMORY(200);
30186 :       return si;
30187 :     }
30188 :     //^2066:1C1F
30189 :     bp18 = _4976_0c5a;
30190 :     for (Bit16u bp16 = 0; _4976_4d0e->nMaps > bp16; bp16++) {
30191 :       //^2066:1C2D
30192 :       CHANGE_CURRENT_MAP_TO(bp16);
30193 :       Bit8u *bp04 = *_4976_4c78;
30194 :       for (Bit16u bp0e = 0; bp0e < _4976_4dd2; bp0e++) {
30195 :         //^2066:1C4F
30196 :         for (Bit16u bp10 = 0; bp10 < _4976_4dd4; bp10++) {
30197 :           //^2066:1C57
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 :               //^2066:1C7A
30207 :               bp1b = 0x00; break;
30208 :             case ttPit:
30209 :               //^2066:1C80
30210 :               bp1b = 0x08; break;
30211 :             case ttDoor:
30212 :               //^2066:1C86
30213 :               bp1b = 0x07; break;
30214 :             case ttTeleporter:
30215 :               {
30216 :                 //^2066:1C8C
30217 :                 TELE_inf bp2a;
30218 :                 if (GET_TELEPORTER_DETAIL(&bp2a, (Bit8u)bp0e, (Bit8u)bp10) != 0) {
30219 :                   //^2066:1CA3
30220 :                   bp1b = 0x00;
30221 :                   if (bp2a.target_z() < bp16) {
30222 :                     //^2066:1CB1
30223 :                     bp24 = 1;
30224 :                   }
30225 :                 }
30226 :                 else {
30227 :                   //^2066:1CB8
30228 :                   bp1b = 0x04;
30229 :                 }
30230 :                 break;
30231 :               }
30232 :             case ttTrickWall:
30233 :               bp1b = 0x04; break;
30234 :           }
30235 :           //^2066:1CC2
30236 :           if (bp1b != 0) {
30237 :             if (SUPPRESS_READER(bp04, &bp1b, 1, 1, 0) != 0) {
30238 :               //^2066:1CE6
30239 :               //^2066:1E7E
30240 :               Bit16u si = 1;
30241 :               //^2066:1E81
30242 :               DEALLOC_UPPER_MEMORY(200);
30243 :               return si;
30244 :             }
30245 :           }
30246 :           //^2066:1CE9
30247 :           bp04++;
30248 :           //^2066:1CEC
30249 :           if (bp24 == 0) {
30250 :             //^2066:1CF5
30251 :             ObjectID ax = GET_TILE_RECORD_LINK(bp0e, bp10);
30252 :             //^2066:1D02
30253 :             while (true) {
30254 :               //^2066:1E11
30255 :               ObjectID bp12 = ax;
30256 :               //^2066:1E14
30257 :               if (bp12 == ObjectID::FFFE) {
30258 :                 //^2066:1E1D
30259 :                 if (READ_RECORD_CHECKCODE(bp0e, bp10, NULL, 1, 1) != 0) {
30260 :                   //^2066:1E34
30261 :                   //^2066:1E7E
30262 :                   Bit16u si = 1;
30263 :                   //^2066:1E81
30264 :                   DEALLOC_UPPER_MEMORY(200);
30265 :                   return si;
30266 :                 }
30267 :               }
30268 :               else {
30269 :                 //^2066:1D05
30270 :                 Bit16u bp22 = bp12.DBType();
30271 :                 const void *bp0c = tableMask[bp22];
30272 :                 //^2066:1D25
30273 :                 if (bp0c != NULL) {
30274 :                   //^2066:1D2C
30275 :                   Actuator *bp08 = (Actuator *)GET_ADDRESS_OF_RECORD(bp12);
30276 :                   if (bp22 == dbActuator) {
30277 :                     //^2066:1D44
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 :                         //^2066:1DA7
30288 :                         Bit16u bp1e;
30289 :                         Bit16u bp20 = 0x01FF;
30290 :                         if (SUPPRESS_READER(&bp1e, &bp20, 2, 1, 1) != 0) {
30291 :                           //^2066:1DC9
30292 :                           //^2066:1E7E
30293 :                           Bit16u si = 1;
30294 :                           //^2066:1E81
30295 :                           DEALLOC_UPPER_MEMORY(200);
30296 :                           return si;
30297 :                         }
30298 :                         //^2066:1DCC
30299 :                         bp08->w2 &= 0x007F;
30300 :                         bp08->w2 |= (bp1e & 0x01FF) << 7;
30301 :                         break;
30302 :                     }
30303 :                   }
30304 :                   //^2066:1DE1
30305 :                   if (SUPPRESS_READER(&bp08, &bp0c, _4976_0242[bp22], 1, 0) != 0) {
30306 :                     //^2066:1E06
30307 :                     //^2066:1E7E
30308 :                     Bit16u si = 1;
30309 :                     //^2066:1E81
30310 :                     DEALLOC_UPPER_MEMORY(200);
30311 :                     return si;
30312 :                   }
30313 :                 }
30314 :               }
30315 :               //^2066:1E08
30316 :               ax = GET_NEXT_RECORD_LINK(bp12);
30317 :             }
30318 :           }
30319 :           //^2066:1E36
30320 :         }
30321 :         //^2066:1E45
30322 :       }
30323 :       //^2066:1E54
30324 :     }
30325 :     //^2066:1E69
30326 :     CHANGE_CURRENT_MAP_TO(bp18);
30327 :     //^2066:1E72
30328 :     if (_2066_062b() != 0) {
30329 :       //^2066:1E78
30330 :       //^2066:1E7E
30331 :       Bit16u si = 1;
30332 :       //^2066:1E81
30333 :       DEALLOC_UPPER_MEMORY(200);
30334 :       return si;
30335 :     }
30336 : 
30337 :     {
30338 :       //^2066:1E7A
30339 :       Bit16u si = 0;
30340 :       //^2066:1E81
30341 :       DEALLOC_UPPER_MEMORY(200);
30342 :       return si;
30343 :     }
30344 :   }
30345 : 
30346 :   //^2066:2D9C
30347 :   __int16 GAME_LOAD()
30348 :   {
30349 :     //^2066:2D9C
30350 :     Bit16u bp04 = 0;
30351 :     Bit16u si = 0;
30352 :     Bit8u bp01 = 0;
30353 :     Bit16u bp08;
30354 :     //^2066:2DAD
30355 :     if (_4976_4c24 != 0) {
30356 :       //^2066:2DB4
30357 : _2db4:
30358 :       bp04 = !_2066_03e0(0);
30359 :       //^2066:2DC6
30360 :       if (_2066_2ca8() == 0) {
30361 :         //^2066:2DCE
30362 :         goto _3262;
30363 :       }
30364 :       else {
30365 :         //^2066:2DD1
30366 :         goto _31b8;
30367 :       }
30368 :     }
30369 :     //^2066:2DD4
30370 :     bp01 = 0;
30371 :     _4976_52f4 = 2;
30372 :     //^2066:2DDE
30373 :     if (bp01 == 0) {
30374 :       //^2066:2DE4
30375 :       if (_4976_49a0 != 0 || _4976_5eb0 == 0)
30376 :         goto _2e5b;
30377 :       //^2066:2DF2
30378 :       if (_476d_030a(2) == 1)
30379 :         goto _2e5b;
30380 :       //^2066:2DFF
30381 :       _476d_04e8(2);
30382 :     }
30383 : 
30384 :     //^2066:2E07
30385 :     while (true) {
30386 :       //^2066:2E07
30387 :       if (_4976_49a0 == 0) {
30388 :         //^2066:2E0E
30389 :         if (bp01 != 0) {
30390 :           //^2066:2E14
30391 :           _476d_04e8(2);
30392 :         }
30393 :         //^2066:2E1C
30394 :         Bit16u di = _0aaf_0067(_0aaf_02f8(15, bp01));
30395 :         //^2066:2E32
30396 :         if (di == 1) {
30397 :           //^2066:2E37
30398 :           _2066_03e0(0);
30399 :           //^2066:2E3E
30400 :           //^2066:32B2
30401 :           di = -1;
30402 :           //^2066:32B5
30403 :           return di;
30404 :         }
30405 :       }
30406 :       else {
30407 :         //^2066:2E41
30408 :         if (bp01 != 0) {
30409 :           //^2066:2E47
30410 :           _0aaf_0067(_0aaf_02f8(0, bp01));
30411 :         }
30412 :       }
30413 :       //^2066:2E5B
30414 : _2e5b:
30415 :       if (_4976_49a0 == 0 && _476d_04af(1) != 1) {
30416 :         //^2066:2E6F
30417 :         //^2066:2F37
30418 :         switch (_4976_5eb8) {
30419 :           case 0x0000:
30420 :             //^2066:2F3E
30421 :             bp01 = 0x1d;
30422 :             break;
30423 :           case 0x0003:
30424 :             //^2066:2F4B
30425 :             bp01 = 0x1a;
30426 :             break;
30427 :           case 0x0002:
30428 :             //^2066:2F58
30429 :             bp01 = 0x16;
30430 :             break;
30431 :           case 0x0004:
30432 :             //^2066:2F65
30433 :             bp01 = 0x17;
30434 :             break;
30435 :         }
30436 :       }
30437 :       else {
30438 :         //^2066:2E72
30439 :         Bit16u bp06 = _2066_32bb();
30440 :         //^2066:2E7A
30441 :         if (bp06 < 0) {
30442 :           //^2066:2E7E
30443 :           _4976_525c = 0;
30444 :           //^2066:2E84
30445 :           //^2066:32B2
30446 :           Bit16u di = -1;
30447 :           //^2066:32B5
30448 :           return di;
30449 :         }
30450 :         //^2066:2E87
30451 :         _4976_525c = bp06;
30452 :         _4976_52e2 = bp06 + 0x30;
30453 :         bp08 = 0;
30454 :         si = 1;
30455 :         //^2066:2E9D
30456 :         _4976_394e = FILE_OPEN(FORMAT_SKSTR(_4976_19d0, NULL));
30457 :         //^2066:2EBD
30458 :         if (_4976_394e < 0) {
30459 :           //^2066:2EC4
30460 :           _4976_394e = FILE_OPEN(FORMAT_SKSTR(_4976_19d4, NULL));
30461 :           //^2066:2EE4
30462 :           if (_4976_394e >= 0) {
30463 :             //^2066:2EE8
30464 :             bp08 = 1;
30465 :           }
30466 :           else {
30467 :             //^2066:2EF0
30468 :             if (_4976_5bf2 == 0) {
30469 :               //^2066:2EF7
30470 :               _4976_394e = FILE_OPEN(FORMAT_SKSTR(_4976_19c0, NULL));
30471 :               //^2066:2F17
30472 :               if (_4976_394e >= 0) {
30473 :                 //^2066:2F1B
30474 :                 bp04 = 1;
30475 :                 _4976_4c24 = 1;
30476 :                 //^2066:2F1B
30477 :                 goto _2db4;
30478 :               }
30479 :             }
30480 :             //^2066:2F29
30481 :             si = 0;
30482 :             bp01 = 0x1c;
30483 :             _4976_5eb8 = 0x0003;
30484 :           }
30485 :         }
30486 :       }
30487 :       //^2066:2F69
30488 :       if (_4976_49a0 == 0 && _4976_5eb8 != 1) {
30489 :         //^2066:2F77
30490 :         continue;
30491 :       }
30492 : 
30493 :       break;
30494 :     }
30495 :     //^2066:2F7A
30496 :     _4976_5bf6 = 0;
30497 :     _4976_4c3c = 0;
30498 :     _4976_57c8.w0 = 0xffff;
30499 :     //^2066:2F8C
30500 :     sksave_header bp6a;
30501 :     FILE_READ(_4976_394e, 42, &bp6a);
30502 :     //^2066:2FA1
30503 :     _4976_5244 = bp6a.bp4c;
30504 :     //^2066:2FA7
30505 :     _4976_524a = 0x0000002A;
30506 :     //^2066:2FB3
30507 :     _4976_4c24 = !_4976_5bf2;
30508 :     //^2066:2FBE
30509 :     do {
30510 :       if (READ_DUNGEON_STRUCTURE(0) == 0)
30511 :         break;
30512 :       //^2066:2FCC
30513 :       _4976_4c24 = 0;
30514 :       //^2066:2FD2
30515 :       _2066_0002();
30516 :       //^2066:2FD6
30517 :       skload_table_60 t1;
30518 :       if (SUPPRESS_READER(&t1, _4976_395a, 56, 1, 1) != 0)
30519 :         break;
30520 :       //^2066:2FF5
30521 :       _4976_4bec = _4976_4c1a = t1.bp40;  // game tick
30522 :       _4976_49ba = t1.bp3c;  // random seed
30523 :       _4976_4c3c = t1.bp38;  // player cnt
30524 :       _4976_4bfa = t1.bp36;  // column
30525 :       _4976_4c06 = t1.bp34;  // row
30526 :       _4976_4bf6 = t1.bp32;  // dir
30527 :       _4976_4bf4 = t1.bp30;  // map#
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 :       //^2066:30B5
30547 :       if (SUPPRESS_READER(_4976_5f52, _4976_3956, 1, 8, 1) != 0)
30548 :         break;
30549 :       //^2066:30D3
30550 :       if (SUPPRESS_READER(_4976_5f12, _4976_3956, 1, 64, 1) != 0)
30551 :         break;
30552 :       //^2066:30F1
30553 :       if (SUPPRESS_READER(_4976_5f5a, _4976_3956, 2, 64, 1) != 0)
30554 :         break;
30555 :       //^2066:310F
30556 :       if (SUPPRESS_READER(_4976_53b4, _4976_3992, 261, _4976_4c3c, 1) != 0)
30557 :         break;
30558 :       //^2066:3130
30559 :       if (SUPPRESS_READER(&_4976_57e4, _4976_3a97, 6, 1, 1) != 0)
30560 :         break;
30561 :       //^2066:314E
30562 :       if (SUPPRESS_READER(_4976_5c20, _4976_3a9d, 10, _4976_5c1e, 1) != 0)
30563 :         break;
30564 :       //^2066:3172
30565 :       Bit16u bp06 = _4976_5c1e;
30566 :       //^2066:3178
30567 :       while (bp06 < _4976_5c16) {
30568 :         //^2066:317A
30569 :         _4976_5c20[bp06].TimerType(0x00);
30570 :         //^2066:318D
30571 :         bp06++;
30572 :         //^2066:3190
30573 :       }
30574 :       //^2066:3199
30575 :       _3a15_008e();
30576 :       //^2066:319F
30577 :       if (_2066_19e7() != 0)
30578 :         break;
30579 :       //^2066:31A9
30580 :       _2066_2b6c();
30581 :       _3a15_020f();
30582 :       _4976_5bf2 = 1;
30583 :       //^2066:31B8
30584 : _31b8:
30585 :       FILE_CLOSE(_4976_394e);
30586 :       //^2066:31C2
30587 :       si = 0;
30588 :       _3a15_3511();
30589 :       //^2066:31C9
30590 :       _4976_5ca8 = 0;
30591 :       //^2066:31CF
30592 :       if (_4976_4c24 != 0) {
30593 :         //^2066:31D6
30594 :         if (bp04 != 0) {
30595 :           //^2066:31DC
30596 :           WAIT_SCREEN_REFRESH();
30597 :         }
30598 :         //^2066:31E1
30599 :         //^2066:31E3
30600 :         //^2066:3227
30601 :         _2066_03e0(0);
30602 :       }
30603 :       else {
30604 :         //^2066:31E5
30605 :         _4976_5bf6 = 1;
30606 :         //^2066:31EB
30607 :         if (bp08 != 0) {
30608 :           //^2066:31F1
30609 :           FILE_RENAME(FORMAT_SKSTR(_4976_19d4, NULL), FORMAT_SKSTR(_4976_19d0, NULL));
30610 :         }
30611 :         //^2066:3225
30612 :         _2066_03e0(1);
30613 :       }
30614 :       //^2066:322C
30615 :       _0aaf_02f8(0x000E, 0x0000);
30616 :       //^2066:3237
30617 :       _4976_4bd8 = 0x0001;
30618 :       _4976_4c2a = 0x0000;
30619 :       //^2066:3243
30620 :       _2fcf_0b8b(_4976_4bfa, _4976_4c06, _4976_4bf4);
30621 :       //^2066:3257
30622 :       _4976_4cb8 = 0x0001;
30623 :       //^2066:325D
30624 :       Bit16u di = 1;
30625 :       //^2066:32B5
30626 :       return di;
30627 :     } while (false);
30628 : _3262:
30629 :     //^2066:3262
30630 :     if (si != 0) {
30631 :       //^2066:3266
30632 :       si = 0;
30633 :       FILE_CLOSE(_4976_394e);
30634 :     }
30635 :     //^2066:3272
30636 :     _0aaf_0067(_0aaf_02f8((_4976_5bf2 == 0) ? 0 : ((_4976_5c9c != 0) ? ((_4976_5ca8 != 0) ? 0x13 : 0x14) : (0x07)), 0x001F));
30637 :     //^2066:32A6
30638 :     if (_4976_5bf2 == 0) {
30639 :       //^2066:32AD
30640 :       SK_PREPARE_EXIT();
30641 :     }
30642 :     //^2066:32B2
30643 :     Bit16u di = -1;
30644 :     //^2066:32B5
30645 :     return di;
30646 :   }
30647 : 
30648 :   //^0CEE:0A43
30649 :   int GET_OBJECT_INDEX_FROM_TILE(int x_pos, int y_pos);
30650 : 
30651 :   //^0CEE:0CB2
30652 :   void CUT_RECORD_FROM(Bit16u recordLink, ObjectID *recordLinkLookFor, __int16 xposLookFor, __int16 yposLookFor)
30653 :   {
30654 :     // Cut the record from the target.
30655 :     // The record is specified by recordLink.
30656 :     // The target is one of recordLinkLookFor or a pair of xposLookFor&yposLookFor.
30657 : 
30658 :     //^0CEE:0CB2
30659 :     Bit16u si = recordLink;
30660 :     //^0CEE:0CBB
30661 :     if (si == 0xfffe || si == 0xffff)
30662 :       return;
30663 :     //^0CEE:0CCB
30664 :     GenericRecord *bp08 = (GenericRecord *)GET_ADDRESS_OF_RECORD(si & 0x3fff);
30665 :     //^0CEE:0CDB
30666 :     ObjectID *bp0c;
30667 :     if (xposLookFor >= 0) {
30668 :       //^0CEE:0CE4
30669 :       Bit16u bp0e = GET_OBJECT_INDEX_FROM_TILE(xposLookFor, yposLookFor);
30670 :       Bit16u *bp04 = &_4976_4d16[bp0e];
30671 :       //^0CEE:0D05
30672 :       if (bp08->w0 == 0xfffe && (*bp04 & 0x3fff) == si) {
30673 :         //^0CEE:0D21
30674 :         _4976_4c78[xposLookFor][yposLookFor] &= 0xef;
30675 :         //^0CEE:0D4D
30676 :         Bit16u di = _4976_4d0e->cwListSize -1;
30677 :         COPY_MEMORY(
30678 :           bp04 +1,
30679 :           bp04,
30680 :           (di -bp0e) << 1
30681 :           );
30682 :         //^0CEE:0D77
30683 :         _4976_4d16[di] = 0xffff;
30684 :         //^0CEE:0D86
30685 :         bp04 = &_4976_4c52[xposLookFor +1];
30686 :         //^0CEE:0D9D
30687 :         di = _4976_4cb4 - _4976_4dd6[_4976_0c5a] + xposLookFor;
30688 :         //^0CEE:0DC3
30689 :         while (di-- != 0) {
30690 :           //^0CEE:0DB9
30691 :           (*bp04)--;
30692 :           bp04++;
30693 :         }
30694 :       }
30695 :       //^0CEE:0DCC
30696 :       if ((*bp04 & 0x3fff) == si) {
30697 :         //^0CEE:0DD9
30698 :         Bit16u ax = bp08->w0;
30699 :         //^0CEE:0DE2
30700 :         //^0CEE:0E35
30701 :         *bp04 = ax;
30702 :         bp08->w0 = 0xfffe;
30703 :         return;
30704 :       }
30705 :       //^0CEE:0DE4
30706 :       //^0CEE:0DEA
30707 :       bp0c = reinterpret_cast<ObjectID *>(bp04);
30708 :     }
30709 :     else {
30710 :       //^0CEE:0DF2
30711 :       //^0CEE:0DEA
30712 :       bp0c = recordLinkLookFor;
30713 :     }
30714 :     //^0CEE:0E0B
30715 :     while (*bp0c != bp0c->FFFE && bp0c->GetAsNorth() != si) {
30716 :       bp0c = &GET_ADDRESS_OF_RECORD(*bp0c)->w0;
30717 :     }
30718 :     //^0CEE:0E1E
30719 :     if (*bp0c != bp0c->FFFE) {
30720 :       //^0CEE:0E27
30721 :       *bp0c = GET_NEXT_RECORD_LINK(*bp0c);
30722 :     }
30723 :     //^0CEE:0E38
30724 :     bp08->w0 = 0xfffe;
30725 :   }
30726 : 
30727 :   //^0CEE:3035
30728 :   Bit8u QUERY_CLS2_OF_TEXT_RECORD(ObjectID recordLink)
30729 :   {
30730 :     //^0CEE:3035
30731 :     Text *bp04 = GET_ADDRESS_OF_RECORD2(recordLink);
30732 :     if (bp04->TextMode() == 1) {
30733 :       //^0CEE:3059
30734 :       Bit16u si = bp04->SimpleTextExtUsage();
30735 :       //^0CEE:306B
30736 :       switch (si) {
30737 :         case 0x0000: // 0x00 - Creature transformer
30738 :         case 0x0002: // 0x02 - Animate image
30739 :         case 0x0005: // 0x05 - ?
30740 :         case 0x000D: // 0x0d - 2-state switch
30741 :           //^0CEE:3080
30742 :           return Bit8u(bp04->OrnateIndex());
30743 :       }
30744 :     }
30745 :     //^0CEE:3091
30746 :     return -1;
30747 :   }
30748 : 
30749 :   //^0CEE:241B
30750 :   Bit8u QUERY_CLS2_FROM_RECORD(ObjectID recordLink)
30751 :   {
30752 :     //^0CEE:241B
30753 :     if (recordLink != ObjectID::FFFF) {
30754 :       //^0CEE:2428
30755 :       GenericRecord *bp04;
30756 :       if (recordLink < ObjectID::FF80) {
30757 :         //^0CEE:242E
30758 :         bp04 = GET_ADDRESS_OF_RECORD(recordLink);
30759 :       }
30760 :       else {
30761 :         //^0CEE:243E
30762 :         return ((Bit8u)recordLink.w) - 0x80;
30763 :       }
30764 :       //^0CEE:2446
30765 :       switch (recordLink.DBType()) {
30766 :         case dbText:    // 2
30767 :           //^0CEE:24EA
30768 :           return QUERY_CLS2_OF_TEXT_RECORD(recordLink);
30769 :         case dbActuator:  // 3
30770 :           //^0CEE:24D7
30771 :           return GET_WALL_DECORATION_OF_ACTUATOR(GET_ADDRESS_OF_RECORD3(recordLink));
30772 :         case dbCreature:  // 4
30773 :           //^0CEE:2461
30774 :           return bp04->castToCreature()->CreatureType();
30775 :         case dbWeapon:    // 5
30776 :           //^0CEE:246B
30777 :           return bp04->castToWeapon()->ItemType();
30778 :         case dbCloth:    // 6
30779 :           //^0CEE:2478
30780 :           return bp04->castToCloth()->ItemType();
30781 :         case dbScroll:    // 7
30782 :           //^0CEE:2484
30783 :           return 0;
30784 :         case dbPotion:    // 8
30785 :           //^0CEE:2488
30786 :           return bp04->castToPotion()->PotionType();
30787 :         case dbContainer:  // 9
30788 :           //^0CEE:2494
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:  //10
30794 :           //^0CEE:24B2
30795 :           return bp04->castToMisc()->ItemType();
30796 :         case db11:      //11
30797 :         case db12:      //12
30798 :         case db13:      //13
30799 :           break;
30800 :         case dbMissile:    //14
30801 :           //^0CEE:24BE
30802 :           return (Bit8u)QUERY_CLS2_FROM_RECORD(bp04->castToMissile()->GetMissileObject());
30803 :         case dbCloud:    //15
30804 :           //^0CEE:24CB
30805 :           return bp04->castToCloud()->CloudType();
30806 :       }
30807 :     }
30808 :     //^0CEE:24F5
30809 :     return -1;
30810 :   }
30811 : 
30812 : 
30813 :   //^0CEE:2614
30814 :   Bit16u GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(Bit16u actuatorData)
30815 :   {
30816 :     //^0CEE:2614
30817 :     //^0CEE:2618
30818 :     Bit16u si = actuatorData & 0x01ff;
30819 :     //^0CEE:261F
30820 :     switch (si >> 7) {
30821 :       case 0:
30822 :         //^0CEE:2630
30823 :         return dbWeapon;
30824 :       case 1:
30825 :         //^0CEE:2635
30826 :         return dbCloth;
30827 :       case 2:
30828 :         //^0CEE:263A
30829 :         return dbMiscellaneous_item;
30830 :       case 3:
30831 :         //^0CEE:263F
30832 :         if (si > 0x01fc)
30833 :           break;
30834 :         //^0CEE:2645
30835 :         if (si == 0x01fc) {
30836 :           //^0CEE:264B
30837 :           return dbScroll;
30838 :         }
30839 :         //^0CEE:2650
30840 :         if (si >= 0x01e0) {
30841 :           //^0CEE:2656
30842 :           return dbContainer;
30843 :         }
30844 :         //^0CEE:265B
30845 :         if (si >= 0x01b0) {
30846 :           //^0CEE:2661
30847 :           return dbCreature;
30848 :         }
30849 :         //^0CEE:2666
30850 :         return dbPotion;
30851 :     }
30852 :     //^0CEE:266B
30853 :     return 0xffff;
30854 :   }
30855 : 
30856 :   //^0CEE:2679
30857 :   Bit8u GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(Bit16u actuatorData)
30858 :   {
30859 :     // returns a value ranged from 0 to 127, as an item type.
30860 : 
30861 :     //^0CEE:2679
30862 :     //^0CEE:267C
30863 :     Bit16u dx = (actuatorData & 0x01ff);
30864 :     switch (dx >> 7) {
30865 :       case 1:
30866 :         //^0CEE:2699
30867 :         dx -= 0x0080;
30868 :         break;
30869 :       case 2:
30870 :         //^0CEE:269F
30871 :         dx -= 0x0100;
30872 :         break;
30873 :       case 3:
30874 :         //^0CEE:26A5
30875 :         if (dx >= 0x01fc) {
30876 :           //^0CEE:26AB
30877 :           dx = 0;
30878 :           break;
30879 :         }
30880 :         //^0CEE:26AF
30881 :         if (dx >= 0x01e0) {
30882 :           //^0CEE:26B5
30883 :           dx -= 0x01e0;
30884 :           break;
30885 :         }
30886 :         //^0CEE:26BB
30887 :         if (dx >= 0x01b0) {
30888 :           //^0CEE:26C1
30889 :           dx -= 0x01b0;
30890 :           break;
30891 :         }
30892 :         //^0CEE:26C7
30893 :         dx -= 0x0180;
30894 :     }
30895 :     //^0CEE:26CB
30896 :     return (Bit8u)dx;
30897 :   }
30898 : 
30899 :   //^0CEE:2DE0
30900 :   Bit16u _0cee_2de0(ObjectID recordLink);
30901 :   //^0CEE:2D1B
30902 :   sk03a2 *QUERY_CREATURE_AI_SPEC_FROM_RECORD(ObjectID recordLink);
30903 : 
30904 :   //^0CEE:23DE
30905 :   Bit8u QUERY_CLS1_FROM_RECORD(ObjectID recordLink)
30906 :   {
30907 :     //^0CEE:23DE
30908 :     ObjectID di = recordLink;
30909 :     //^0CEE:23E6
30910 :     if (di != di.FFFF) {
30911 :       //^0CEE:23EB
30912 :       Bit16u si = di.DBType();
30913 :       if (si == dbMissile) {
30914 :         //^0CEE:23FA
30915 :         return QUERY_CLS1_FROM_RECORD(GET_ADDRESS_OF_RECORDE(di)->GetMissileObject());
30916 :       }
30917 :       //^0CEE:240F
30918 :       return _4976_0caa[si];
30919 :     }
30920 :     //^0CEE:2415
30921 :     return 0xff;
30922 :   }
30923 : 
30924 : 
30925 :   Bit8u *_3e74_0756(Bit8u *xx, __int32 size); // TODO: Unreachale
30926 :   Bit16u _2fcf_0cdf(Bit16u recordLink, __int16 xpos, __int16 ypos, __int16 *xx, __int16 *yy); // TODO: Unreachale
30927 :   Bit16u _2c1d_201d(); // TODO: Unreachale
30928 :   void _2fcf_01c5(Bit16u recordLink, __int16 xx, __int16 yy, Bit16u curmap, Bit16u ss); // TODO: Unreachale
30929 :   void _2c1d_1c0c(Bit16u xx, Bit16u yy, Bit16u zz); // TODO: Unreachale
30930 :   void _2c1d_1b0f(__int16 xx, Bit16u yy); // TODO: Unreachable
30931 :   Bit16u _0cee_06dc(__int16 xx, __int16 yy); // TODO: Unreachable
30932 : 
30933 :   void _13e4_0401(Bit16u recordLink, __int16 xx, __int16 yy, Bit16u ss, Bit16u tt, Bit16u uu); // TODO: placeholder
30934 :   void _1c9a_0e14(Bit16u recordLink, __int16 xpos, __int16 ypos); // TODO: placeholder // TODO: placeholder
30935 :   Bit16u _075f_084d(__int16 x1, __int16 y1, __int16 x2, __int16 y2, Bit16u ps, ObjectID recordLink); // TODO: placeholder
30936 :   void _075f_2205(__int16 xpos, __int16 ypos, Bit16u xx, U16 yy, U16 zz); // TODO: placeholder
30937 :   Bit16u _2c1d_18aa(__int16 xx, Bit16u yy, Bit16u ss, Bit16u tt); // TODO: placeholder
30938 :   void _075f_0255(ObjectID recordLink, Bit16u ww, __int16 xx, __int16 yy, Bit16u ss); // TODO: placeholder
30939 :   void _12b4_0d75(__int16 xpos, __int16 ypos, Bit16u xx, __int16 yy); // TODO: placeholder
30940 :   Bit16u _32cb_0054(Creature *ref, Bit16u xx); // TODO: placeholder
30941 :   void _098d_000f(__int16 xx, __int16 yy, Bit16u ww, Bit16u *x2, Bit16u *y2); // TODO: placeholder
30942 :   void _29ee_000f(); // TODO: placeholder
30943 :   Bit16u _2fcf_0109(ObjectID recordLink); // TODO: placeholder
30944 :   void _2676_0131(); // TODO: placeholder
30945 :   void _32cb_5d0d(Bit16u dir, __int16 xx, __int16 yy); // TODO: placeholder
30946 :   void _2c1d_1c7c(Bit16u xx, Bit16u yy); // TODO: placeholder
30947 :   Bit16u _2c1d_203d(Bit16u xx); // TODO: placeholder
30948 :   Bit16u _2c1d_0ffc(sk53b4 *xx); // TODO: placeholder
30949 :   void _482b_05bf(Bit16u xx); // TODO: placeholder
30950 :   void _1c9a_0247(ObjectID recordLink); // TODO: placeholder
30951 : 
30952 :   //^0CEE:159B
30953 :   void _0cee_159b(U8 *str, ObjectID rl, Bit16u ww)
30954 :   {
30955 :     //^0CEE:159B
30956 :     ENTER(154);
30957 :     //^0CEE:15A1
30958 :     U16 si = 0;
30959 :     //^0CEE:15A3
30960 :     U8 bp009a[128];
30961 :     U8 *bp04 = bp009a;
30962 :     //^0CEE:15AD
30963 :     U8 bp19 = 0xff;
30964 :     //^0CEE:15B1
30965 :     Text *bp10;
30966 :     if (rl.DBType() == dbScroll) {
30967 :       //^0CEE:15BF
30968 :       Scroll *_bp10 = GET_ADDRESS_OF_RECORD7(rl);
30969 :       //^0CEE:15CD
30970 :       U16 bp14 = _bp10->w2_a_f();
30971 :       //^0CEE:15DD
30972 :       if (bp14 != 0) {
30973 :         //^0CEE:15E1
30974 :         bp19 = U8(bp14);
30975 :         //^0CEE:15E4
30976 :         goto _1678;
30977 :       }
30978 :       //^0CEE:15E7
30979 :       bp10 = &reinterpret_cast<Text *>(static_cast<U8 *>(_4976_4cca[dbText]))[_bp10->ReferredText() & 0x03ff];
30980 :     }
30981 :     else {
30982 :       //^0CEE:1609
30983 :       bp10 = GET_ADDRESS_OF_RECORD2(rl);
30984 :     }
30985 :     //^0CEE:1617
30986 :     //^0CEE:161A
30987 :     U16 bp18 = bp10->TextMode();
30988 :     //^0CEE:1626
30989 :     if (bp18 == 0 || (bp18 == 1 && bp10->SimpleTextExtUsage() == 14)) {
30990 :       //^0CEE:164B
30991 :       if (bp10->TextVisibility() != 0 || (ww & 0x8000) != 0) {
30992 :         //^0CEE:1663
30993 :         if (bp18 == 1) {
30994 :           //^0CEE:1669
30995 :           bp19 = bp10->TextIndex() & 0xff;
30996 :         }
30997 :         //^0CEE:167B
30998 : _1678:
30999 :         ww = ww & 0x7fff;
31000 :         //^0CEE:1684
31001 :         U8 bp15;
31002 :         if (ww == 1) {
31003 :           //^0CEE:168A
31004 :           *(bp04++) = vbLf;
31005 :           //^0CEE:1694
31006 :           bp15 = ' ';
31007 :         }
31008 :         //^0CEE:1698
31009 :         bp15 = vbLf;
31010 :         //^0CEE:169C
31011 :         if (bp19 != 0xff) {
31012 :           //^0CEE:16A2
31013 :           bp04 += SK_STRLEN(QUERY_GDAT_TEXT(0x03, 0x00, bp19, bp04));
31014 :         }
31015 :         else {
31016 :           //^0CEE:16C7
31017 :           U16 bp14 = 0;
31018 :           //^0CEE:16CC
31019 :           U16 di = 0;
31020 :           //^0CEE:16CE
31021 :           U16 *bp0c = &_4976_4d12[bp10->TextIndex()];
31022 : 
31023 :           while (true) {
31024 :             //^0CEE:16ED
31025 :             U16 bp12;
31026 :             if (bp14 == 0) {
31027 :               //^0CEE:16F3
31028 :               si = *(bp0c++);
31029 :               //^0CEE:16FD
31030 :               bp12 = (si >> 10) & 0x1f;
31031 :             }
31032 :             //^0CEE:1704
31033 :             else if (bp14 == 1) {
31034 :               //^0CEE:170A
31035 :               bp12 = (si >> 5) & 0x1f;
31036 :             }
31037 :             else {
31038 :               //^0CEE:1711
31039 :               bp12 = si & 0x1f;
31040 :             }
31041 :             //^0CEE:1713
31042 :             //^0CEE:1719
31043 :             bp14 = ++bp14 % 3; // TODO: ƒMƒƒNƒmƒ
31044 :             //^0CEE:1729
31045 :             if (di != 0) {
31046 :               //^0CEE:172D
31047 :               *bp04 = 0;
31048 :               //^0CEE:1734
31049 :               const U8 *bp08;
31050 :               if (di == 30) {
31051 :                 //^0CEE:1739
31052 :                 bp08 = _4976_0262[bp12];
31053 :               }
31054 :               else {
31055 :                 //^0CEE:1744
31056 :                 bp08 = _4976_0362[bp12];
31057 :               }
31058 :               //^0CEE:174C
31059 :               //^0CEE:1752
31060 :               SK_STRCAT(bp04, bp08);
31061 :               //^0CEE:1766
31062 :               bp04 += SK_STRLEN(bp08);
31063 :               //^0CEE:1776
31064 :               di = 0;
31065 :               //^0CEE:1778
31066 :               continue;
31067 :             }
31068 :             //^0CEE:177B
31069 :             if (bp12 < 0x1c) {
31070 :               //^0CEE:1781
31071 :               if (bp12 == 0x1a) {
31072 :                 //^0CEE:1787
31073 :                 bp12 = 0x20;
31074 :                 //^0CEE:179F
31075 :                 //^0CEE:178C
31076 :                 *(bp04++) = U8(bp12);
31077 :                 //^0CEE:17B9
31078 :                 continue;
31079 :               }
31080 :               //^0CEE:178E
31081 :               else if (bp12 == 0x1b) {
31082 :                 //^0CEE:1794
31083 :                 bp12 = 0x2e;
31084 :                 //^0CEE:1799
31085 :                 //^0CEE:179F
31086 :                 *(bp04++) = U8(bp12);
31087 :                 //^0CEE:17B9
31088 :                 continue;
31089 :               }
31090 :               else {
31091 :                 //^0CEE:179B
31092 :                 bp12 += 0x41;
31093 :                 //^0CEE:179F
31094 :                 *(bp04++) = U8(bp12);
31095 :                 //^0CEE:17B9
31096 :                 continue;
31097 :               }
31098 :             }
31099 :             //^0CEE:17A7
31100 :             else if (bp12 == 0x1c) {
31101 :               //^0CEE:17AD
31102 :               *(bp04++) = bp15;
31103 :               //^0CEE:17B9
31104 :               continue;
31105 :             }
31106 :             //^0CEE:17BC
31107 :             else if (bp12 <= 0x1e) {
31108 :               //^0CEE:17C2
31109 :               di = bp12;
31110 :               //^0CEE:17C5
31111 :               continue;
31112 :             }
31113 :             else {
31114 :               //^0CEE:17C0
31115 :               break;
31116 :             }
31117 :           }
31118 :         }
31119 :       }
31120 :     }
31121 :     //^0CEE:17C8
31122 :     *bp04 = 0;
31123 :     //^0CEE:17CF
31124 :     FORMAT_SKSTR(bp009a, str);
31125 :     //^0CEE:17E3
31126 :     return;
31127 :   }
31128 : 
31129 :   //^0CEE:3202
31130 :   Bit16u _0cee_3202(ObjectID rl)
31131 :   {
31132 :     //^0CEE:3202
31133 :     ENTER(2);
31134 :     //^0CEE:3206
31135 :     U8 bp01 = QUERY_CLS2_FROM_RECORD(rl);
31136 :     //^0CEE:3211
31137 :     if (bp01 == 0xff)
31138 :       //^0CEE:3215
31139 :       return 0;
31140 :     //^0CEE:3219
31141 :     return QUERY_GDAT_ENTRY_DATA_INDEX(0x09, bp01, dtWordValue, 0x0c);
31142 :   }
31143 : 
31144 :   Bit16u _2fcf_16ff(Bit16u xx); // TODO: placeholder
31145 :   Bit16u _3a15_0447(Bit16u xx); // TODO: placeholder
31146 :   void _01b0_1997(void *ref, Bit16u xx, Bit16u yy, Bit16u zz); // TODO: placeholder
31147 :   void _01b0_1a6d(void *ref, Bit16u xx, Bit16u yy, Bit16u zz, Bit16u ss, Bit16u tt); // TODO: placeholder
31148 :   void _01b0_1ba1(void *ref, Bit16u xx, Bit16u yy, Bit16u zz); // TODO: placeholder
31149 :   Bit16u _47eb_02e0(sk5efe *xx, sk5efe *yy); // TODO: placeholder
31150 :   Bit8u *_47eb_0048(sk5f0a *xx, Bit16u yy); // TODO: placeholder
31151 :   i16 _19f0_2165(X16 aa, i16 xx, i16 yy, i16 ss, i16 tt, i16 vv, i16 ww); // TODO: placeholder
31152 : 
31153 :   //^0CEE:0184
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 :     //^0CEE:0184
31157 :     ENTER(8);
31158 :     //^0CEE:018A
31159 :     U16 di = alsoCreaturePossessions;
31160 :     U16 si = alsoContainedObjects;
31161 :     //^0CEE:0190
31162 :     for (ObjectID *bp08 = ref; *ref != ObjectID::FFFE && *ref != ObjectID::FFFF; ref = &GET_ADDRESS_OF_RECORD(*ref)->w0) {
31163 :       //^0CEE:019F
31164 :       if (dir != 0xff) {
31165 :         //^0CEE:01A5
31166 :         if (ref->Dir() != dir)
31167 :           //^0CEE:01B7
31168 :           continue;
31169 :       }
31170 :       //^0CEE:01BA
31171 :       if (ref->DBType() == dbCreature && di != 0) {
31172 :         //^0CEE:01CF
31173 :         ObjectID *bp04 = &GET_ADDRESS_OF_RECORD4(*ref)->w2;
31174 :         //^0CEE:01E0
31175 :         bp04 = OVERSEE_RECORD(bp04, 255, recordMatched, pfnFinder, pvUser, di, si);
31176 :         //^0CEE:020D
31177 :         if (bp04 != NULL) {
31178 :           //^0CEE:0212
31179 :           return bp04;
31180 :         }
31181 :       }
31182 :       //^0CEE:021B
31183 :       if (si != 0 && IS_CONTAINER_CHEST(*ref) != 0) {
31184 :         //^0CEE:022F
31185 :         ObjectID *bp04 = &GET_ADDRESS_OF_RECORD(*ref)->w0;
31186 :         //^0CEE:0241
31187 :         bp04 = &bp04[1];
31188 :         //^0CEE:024F
31189 :         bp04 = OVERSEE_RECORD(bp04, 255, recordMatched, pfnFinder, pvUser, di, si);
31190 :         //^0CEE:0279
31191 :         if (bp04 != NULL) {
31192 :           //^0CEE:0281
31193 :           //^0CEE:0212
31194 :           return bp04;
31195 :         }
31196 :       }
31197 :       //^0CEE:0283
31198 :       if ((this->*pfnFinder)(ref, pvUser) != 0) {
31199 :         //^0CEE:0299
31200 :         *recordMatched = bp08;
31201 :                 //^0CEE:02A9
31202 :         return ref;
31203 :       }
31204 :       //^0CEE:02B1
31205 :     }
31206 :     //^0CEE:02D5
31207 :     return NULL;
31208 :   }
31209 : 
31210 :   //^3A15:0381
31211 :   int _3a15_0381(sk5c20 *xx, sk5c20 *yy)
31212 :   {
31213 :     //^3A15:0381
31214 :     if (xx->GetTick() >= yy->GetTick()) {
31215 :       //^3A15:03B8
31216 :       Bit16u si =  (xx->GetTick() == yy->GetTick()) ? 1 : 0;
31217 :       //^3A15:03EC
31218 :       if (si != 0 && (xx->TimerType() > yy->TimerType()))
31219 :         //^3A15:03FE
31220 :         return 1;
31221 :       //^3A15:0400
31222 :       if (si != 0) {
31223 :         //^3A15:0404
31224 :         si = (xx->TimerType() == yy->TimerType()) ? 1 : 0;
31225 :         //^3A15:041D
31226 :         if (si != 0) {
31227 :           //^3A15:0421
31228 :           if (xx->b5 > yy->b5) {
31229 :             //^3A15:043D
31230 :             return 1;
31231 :           }
31232 :         }
31233 :       }
31234 :       //^3A15:0431
31235 :       if (si == 0)
31236 :         //^3A15:0433
31237 :         return 0;
31238 :       //^3A15:0435
31239 :       if ((Bit16u)xx <= (Bit16u)yy)
31240 :         //^3A15:043D
31241 :         return 1;
31242 :       //^3A15:043B
31243 :       return 0;
31244 :     }
31245 :     //^3A15:043D
31246 :     return 1;
31247 :   }
31248 : 
31249 :   //^3A15:0486
31250 :   void _3a15_0486(Bit16u xx)
31251 :   {
31252 :     //^3A15:0486
31253 :     //^3A15:048C
31254 :     Bit16u di = xx;
31255 :     _4976_4762 = -1;
31256 :     Bit16u bp06 = _4976_5c1e -1;
31257 :     //^3A15:049C
31258 :     if (bp06 == 0)
31259 :       //^3A15:04A0
31260 :       return;
31261 :     //^3A15:04A3
31262 :     Bit16u bp0a = _4976_5c1a[di];
31263 :     //^3A15:04B3
31264 :     sk5c20 *bp04 = &_4976_5c20[bp0a];
31265 :     //^3A15:04C8
31266 :     Bit16u bp08 = 0;
31267 :     //^3A15:04CD
31268 :     for (; di > 0; ) {
31269 :       //^3A15:04CF
31270 :       Bit16u si = (di -1) >> 1;
31271 :       //^3A15:04D6
31272 :       if (_3a15_0381(bp04, &_4976_5c20[_4976_5c1a[si]]) == 0)
31273 :         //^3A15:0500
31274 :         break;
31275 :       //^3A15:0502
31276 :       _4976_5c1a[di] = _4976_5c1a[si];
31277 :       //^3A15:051C
31278 :       di = si;
31279 :       //^3A15:051E
31280 :       bp08 = 1;
31281 :       //^3A15:0523
31282 :     }
31283 :     //^3A15:0527
31284 :     if (bp08 == 0) {
31285 :       //^3A15:0530
31286 :       bp06 = (bp06 -1) >> 1;
31287 :       //^3A15:0539
31288 :       while (di <= bp06) {
31289 :         //^3A15:053C
31290 :         Bit16u si = (di << 1) +1;
31291 :         //^3A15:0544
31292 :         if ((si +1) < _4976_5c1e) {
31293 :           //^3A15:054A
31294 :           if (_3a15_0381(&_4976_5c20[_4976_5c1a[si +1]], &_4976_5c20[_4976_5c1a[si]]) != 0) {
31295 :             //^3A15:0590
31296 :             si++;
31297 :           }
31298 :         }
31299 :         //^3A15:0591
31300 :         if (_3a15_0381(&_4976_5c20[_4976_5c1a[si]], bp04) == 0)
31301 :           //^3A15:05BD
31302 :           break;
31303 :         //^3A15:05BF
31304 :         _4976_5c1a[di] = _4976_5c1a[si];
31305 :         //^3A15:05D9
31306 :         di = si;
31307 :         //^3A15:05DB
31308 :       }
31309 :     }
31310 :     //^3A15:05E3
31311 :     _4976_5c1a[di] = bp0a;
31312 :     //^3A15:05F3
31313 :     return;
31314 :   }
31315 : 
31316 :   //^3A15:0696
31317 :   Bit16u QUEUE_TIMER(sk5c20 *ref)
31318 :   {
31319 :     //^3A15:0696
31320 :     if (ref->TimerType() == 0) {
31321 :       //^3A15:06A5
31322 :       return 0xffff;
31323 :     }
31324 :     //^3A15:06AB
31325 :     if (_4976_5c1e == _4976_5c16) {
31326 :       //^3A15:06B4
31327 :       RAISE_SYSERR(45);
31328 :     }
31329 :     //^3A15:06BC
31330 :     Bit16u si = _4976_5c18;
31331 :     //^3A15:06CD
31332 :     _4976_5c18 = _4976_5c20[si].w0_0_f();
31333 :     //^3A15:06D5
31334 :     _4976_5c20[si] = *ref;
31335 :     //^3A15:06F3
31336 :     if (_4976_5c14 <= si) {
31337 :       //^3A15:
31338 :       _4976_5c14 = si +1;
31339 :     }
31340 :     //^3A15:06FF
31341 :     __int16 di = _4976_4762;
31342 :     //^3A15:0704
31343 :     if (di < 0) {
31344 :       //^3A15:0708
31345 :       di = _4976_5c1e;
31346 :     }
31347 :     //^3A15:070C
31348 :     _4976_4762 = -1;
31349 :     _4976_5c1e++;
31350 :     //^3A15:0716
31351 :     _4976_5c1a[di] = si;
31352 :     //^3A15:0723
31353 :     _3a15_0486(di);
31354 :     //^3A15:0729
31355 :     return si;
31356 :   }
31357 : 
31358 :   //^01B0:1C8D
31359 :   void _01b0_1c8d(Bit16u xx) //#DS=04BF
31360 :   {
31361 :     //^01B0:1C8D
31362 :     //^01B0:1C91
31363 :     if (_01b0_13d6 == 0) {
31364 :       //^01B0:1C9B
31365 :       switch (_04bf_028a) {
31366 :         case 3:
31367 :           //^01B0:1CAF
31368 :           _01b0_13ce = 0x16b6;
31369 : 
31370 :           break;
31371 :         case 5:
31372 :           //^01B0:1CB8
31373 :           _01b0_13ce = 0x1779;
31374 :         
31375 :           break;
31376 :         case 6:
31377 :           //^01B0:1CC1
31378 :           _01b0_13ce = 0x170e;
31379 : 
31380 :           break;
31381 :       }
31382 :       //^01B0:1CC8
31383 :       Bit16u bp02 = 0x001234dc / _04bf_17a6;
31384 :       //^01B0:1CDB
31385 :       _01b0_13c8 = bp02;
31386 :     }
31387 :     //^01B0:1CE2
31388 :     if (xx > _01b0_13d6)
31389 :       //^01B0:1CEC
31390 :       _01b0_13d6 = xx;
31391 :     //^01B0:1CF0
31392 :     return;
31393 :   }
31394 : 
31395 :   //^01B0:1CF3
31396 :   Bit16u IBMIO_SBLASTER_BLEND_TO_SNDBUFF(Bit8u *buff, Bit16u buffSize, __int8 volume, Bit16u caller) //#DS=04BF
31397 :   {
31398 :     //^01B0:1CF3
31399 :     //^01B0:1CF9
31400 :     Bit16u bp02 = 0;
31401 :     //^01B0:1CFE
31402 :     if (_04bf_028c != 0 && _04bf_0288 != 0) {
31403 :       //^01B0:1D12
31404 :       if (Bit32u(_04bf_17a6 * buffSize) / caller <= _04bf_028e) {
31405 :         //^01B0:1D36
31406 :         volume >>= 1;
31407 :         //^01B0:1D3B
31408 :         Bit8u *di = _01b0_13d2;
31409 :         Bit16u bx = _01b0_14dd;
31410 :         Bit16u dx = _01b0_14df;
31411 :         Bit8u *si = buff;
31412 :         //^01B0:1D51
31413 :         Bit16u bp06;
31414 :         if (_01b0_4896 != caller) {
31415 :           //^01B0:1D5A
31416 :           Bit16u bp04 = buffSize;
31417 :           bp06 = 0;
31418 :           //^01B0:1D65
31419 :           if (_01b0_4896 > caller) {
31420 :             //^01B0:1D95
31421 :             ATLASSERT(false);
31422 :           }
31423 :           else {
31424 :             //^01B0:1DCB
31425 :             ATLASSERT(false);
31426 :           }
31427 :         }
31428 :         else {
31429 :           //^01B0:1D6A
31430 :           Bit16u cx = buffSize;
31431 :           //^01B0:1D6D
31432 :           bp06 = cx;
31433 : 
31434 :           do {
31435 :             //^01B0:1D70
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 :             //^01B0:1D87
31446 :             bx++;
31447 :             //^01B0:1D88
31448 :             if (bx >= dx) {
31449 :               bx = 0;
31450 :             }
31451 :             //^01B0:1D8F
31452 :           } while (--cx != 0);
31453 :         }
31454 :         //^01B0:1DFF
31455 :         //^01B0:1E01
31456 :         _01b0_1c8d(bp06);
31457 :         //^01B0:1E09
31458 :         bp02 = 1;
31459 :       }
31460 :     }
31461 :     //^01B0:1E0E
31462 :     return bp02;
31463 :   }
31464 : 
31465 :   //^01B0:1E15
31466 :   Bit16u IBMIO_BLEND_TO_SNDBUFF(Bit8u *buff, Bit16u buffSize, Bit8u volume, Bit16u caller) //#DS=04BF
31467 :   {
31468 :     // it blends your wave data to sndbuff.
31469 : 
31470 :     //^01B0:1E15
31471 :     //^01B0:1E1B
31472 :     Bit8u di = volume;
31473 :     Bit16u si = caller;
31474 :     //^01B0:1E21
31475 :     LOADDS(0x3083);
31476 :     //^01B0:1E27
31477 :     Bit16u bp02 = 0;
31478 :     //^01B0:1E2C
31479 :     if (_04bf_028c != 0) {
31480 :       //^01B0:1E33
31481 :       if (_04bf_028a == 3 || _04bf_028a == 5 || _04bf_028a == 6) {
31482 :         //^01B0:1E48
31483 :         bp02 = IBMIO_SBLASTER_BLEND_TO_SNDBUFF(buff, buffSize, di, si);
31484 :       }
31485 :     }
31486 :     else {
31487 :       //^01B0:1E5F
31488 :       switch (_04bf_028a -2) {
31489 :         case 2:
31490 :           //^01B0:1E71
31491 :           _01b0_1997(buff, buffSize, di, si);
31492 :           //^01B0:1E80
31493 :           break;
31494 :         case 3:
31495 :           //^01B0:1E82
31496 :           _01b0_1a6d(buff, buffSize, di, si, 3, 0);
31497 : 
31498 :           break;
31499 :         case 4:
31500 :           //^01B0:1E88
31501 :           _01b0_1ba1(buff, buffSize, di, si);
31502 :           //^01B0:1E9A
31503 :           break;
31504 :         case 5:
31505 :           //^01B0:1E9C
31506 :           _01b0_1a6d(buff, buffSize, di, si, 5, 1);
31507 : 
31508 :           break;
31509 :         case 6:
31510 :           //^01B0:1EA2
31511 :           _01b0_1a6d(buff, buffSize, di, si, 6, 0);
31512 : 
31513 :           break;
31514 :         case 7:
31515 :           //^01B0:1EA8
31516 :           _01b0_1a6d(buff, buffSize, di, si, 7, 1);
31517 : 
31518 :           break;
31519 :       }
31520 :     }
31521 :     //^01B0:1EBE
31522 :     return bp02;
31523 :   }
31524 : 
31525 :   //^47EB:0333
31526 :   void _47eb_0333(sk5efe *ref)
31527 :   {
31528 :     //^47EB:0333
31529 :     //^47EB:0339
31530 :     Bit16u bp08 = 0;
31531 :     //^47EB:033E
31532 :     __int16 si = ref->b6;
31533 :     __int16 di = ref->b7;
31534 :     //^47EB:034F
31535 :     __int8 *bp04 = &ref->b6;
31536 :     //^47EB:035E
31537 :     bp04[0] = (__int8)(((ref->b5 << 8) / (si * si + di * di + 8)) >> 8);
31538 :     //^47EB:0388
31539 :     Bit8u cl;
31540 :     if (si == 0) {
31541 :       //^47EB:038C
31542 :       cl = 8;
31543 :     }
31544 :     //^47EB:0390
31545 :     else if (di == 0) {
31546 :       //^47EB:0394
31547 :       if (si < 0) {
31548 :         //^47EB:0398
31549 :         cl = 15;
31550 :       }
31551 :       else {
31552 :         //^47EB:039C
31553 :         cl = 1;
31554 :       }
31555 :     }
31556 :     else {
31557 :       //^47EB:03A0
31558 :       if (si < 0) {
31559 :         //^47EB:03A4
31560 :         si = -si;
31561 :         bp08 = 1;
31562 :       }
31563 :       //^47EB:03AF
31564 :       if (di < 0) {
31565 :         //^47EB:03B3
31566 :         di = -di;
31567 :       }
31568 :       //^47EB:03B9
31569 :       Bit16u bp06 = (si << 11) / di;
31570 :       cl = 0;
31571 : 
31572 :       //^47EB:03C7
31573 :       while (_4976_49c0[cl++] > bp06);
31574 :     }
31575 : 
31576 :     //^47EB:03DA
31577 :     if (bp08 != 0) {
31578 :       //^47EB:03E0
31579 :       bp04[1] = 16 - cl;
31580 :       bp04[2] = cl;
31581 :     }
31582 :     else {
31583 :       //^47EB:03EF
31584 :       bp04[1] = cl;
31585 :       bp04[2] = 16 - cl;
31586 :     }
31587 :     //^47EB:03FC
31588 :     //^47EB:0400
31589 :     return;
31590 :   }
31591 : 
31592 :   //^47EB:014F
31593 :   Bit16u _47eb_014f(Bit16u xx, sk5efe *ref)
31594 :   {
31595 :     //^47EB:014F
31596 :     //^47EB:0155
31597 :     if (xx == 0)
31598 :       //^47EB:015B
31599 :       return 0;
31600 :     //^47EB:0160
31601 :     Bit16u bp02 = 0;
31602 :     sk5efe *bp06 = ref;
31603 :     //^47EB:0171
31604 :     for (; bp02 < xx; bp02++, bp06++) {
31605 :       //^47EB:0173
31606 :       _47eb_0333(bp06);
31607 :       //^47EB:0180
31608 :       bp06->b11 = (Bit8u)bp02;
31609 :       //^47EB:018A
31610 :     }
31611 : 
31612 :     Bit16u bp10 = 0;
31613 :     do {
31614 :       //^47EB:0199
31615 :       bp06 = ref;
31616 :       //^47EB:01AA
31617 :       Bit16u bp0c = bp06->b11;
31618 :       //^47EB:01B6
31619 :       for (bp06++, bp02++; bp02 < xx; bp02++, bp06++) {
31620 :         //^47EB:01C1
31621 :         Bit16u bp0e = bp06->b11;
31622 :         //^47EB:01CD
31623 :         if (_47eb_02e0(&ref[bp0c], &ref[bp0e]) == 0) {
31624 :           //^47EB:01F8
31625 :           WRITE_UI8(bp06,-1,(Bit8u)bp0e);
31626 :           //^47EB:0202
31627 :           bp06->b11 = (Bit8u)bp0c;
31628 :           //^47EB:0209
31629 :           bp10 = 1;
31630 :         }
31631 :         else {
31632 :           //^47EB:0210
31633 :           bp0c = bp0e;
31634 :         }
31635 :         //^47EB:0216
31636 :       }
31637 :       //^47EB:0225
31638 :     } while (bp10 != 0);
31639 :     //^47EB:022E
31640 :     for (Bit16u si=0, di=0; di < _4976_49be; ) {
31641 :       //^47EB:02A9
31642 :       if (si >= xx) {
31643 :         //^47EB:02AE
31644 :         di++;
31645 :         continue;
31646 :       }
31647 :       //^47EB:0234
31648 :       Bit16u bp0c = ref[si].b11;
31649 :       si++;
31650 :       //^47EB:024A
31651 :       bp06 = &ref[bp0c];
31652 :       //^47EB:025D
31653 :       Bit8u *bp0a = &bp06->b8;
31654 :       //^47EB:026C
31655 :       if (IBMIO_BLEND_TO_SNDBUFF(_47eb_0048(bp06->pv0->pv0, 0), bp06->pv0->w4, *bp0a, 0x157c) CALL_IBMIO == 0)
31656 :         //^47EB:02A7
31657 :         break;
31658 : 
31659 :       //^47EB:02A9
31660 :     }
31661 :     //^47EB:02B5
31662 :     return si;
31663 :   }
31664 : 
31665 :   //^482B:0101
31666 :   Bit16u QUERY_SND_ENTRY_INDEX(Bit8u cls1, Bit8u cls2, Bit8u cls4)
31667 :   {
31668 :     //^482B:0101
31669 :     //^482B:0105
31670 :     for (Bit16u si=0; si < _4976_49d4; si++) {
31671 :       //^482B:0109
31672 :       if (_4976_5f06[si].b2 == cls1) {
31673 :         //^482B:011F
31674 :         if (_4976_5f06[si].b3 == cls2) {
31675 :           //^482B:0135
31676 :           if (_4976_5f06[si].b4 == cls4) {
31677 :             //^482B:014B
31678 :             return si +1;
31679 :           }
31680 :         }
31681 :       }
31682 :       //^482B:0150
31683 :     }
31684 :     //^482B:0157
31685 :     return 0;
31686 :   }
31687 : 
31688 :   //^482B:018B
31689 :   void QUEUE_NOISE_GEN1(Bit8u cls1, Bit8u cls3, Bit8u cls4, Bit8u xx, Bit8u yy, __int16 xpos, __int16 ypos, __int16 tickDelta)
31690 :   {
31691 :     //^482B:018B
31692 :     //^482B:0191
31693 :     if (tickDelta > 0 && _4976_0c5a != _4976_4c28 && _4976_0c5a != _4976_4c12) {
31694 :       //^482B:01A6
31695 :       return;
31696 :     }
31697 :     //^482B:01A9
31698 :     if (_4976_49d0 == 20) {
31699 :       //^482B:01B0
31700 :       return;
31701 :     }
31702 :     //^482B:01B3
31703 :     Bit16u bp0e = QUERY_SND_ENTRY_INDEX(cls1, cls3, cls4);
31704 :     //^482B:01C9
31705 :     if (bp0e == 0) {
31706 :       //^482B:01CD
31707 :       return;
31708 :     }
31709 :     //^482B:01D0
31710 :     if (_4976_4be8 != 0) {
31711 :       //^482B:01D7
31712 :       yy >>= 1;
31713 :     }
31714 :     //^482B:01DA
31715 :     if (tickDelta > 1) {
31716 :       //^482B:01E3
31717 :       Bit16u bp10 = 0;
31718 :       //^482B:01E8
31719 :       for (__int16 si=0; si < 8; si++) {
31720 :         //^482B:01EC
31721 :         if (_4976_5f0e[si].w0 == 0) {
31722 :           //^482B:01FF
31723 :           bp10 = 1;
31724 :           //^482B:0204
31725 :           break;
31726 :         }
31727 :         //^482B:0206
31728 :       }
31729 :       //^482B:020C
31730 :       if (bp10 == 0) {
31731 :         //^482B:0212
31732 :         return;
31733 :       }
31734 :       //^482B:0215
31735 :       sk5f0e *bp04 = &_4976_5f0e[si];
31736 :       //^482B:022C
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 :       //^482B:026C
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 :       //^482B:02A8
31754 :       QUEUE_TIMER(&bp1a);
31755 :       //^482B:02B4
31756 :       return;
31757 :     }
31758 :     //^482B:02B7
31759 :     sk5f0a *bp08 = &_4976_5f0a[_4976_5f06[bp0e -1].w0];
31760 :     //^482B:02DC
31761 :     if (tickDelta > 0) {
31762 :       //^482B:02E2
31763 :       xpos += _4976_4d0a->MapOffsetX() - _4976_4dba[_4976_4bf4].MapOffsetX() - _4976_4bfa;
31764 :       //^482B:0308
31765 :       ypos += _4976_4d0a->MapOffsetY() - _4976_4dba[_4976_4bf4].MapOffsetY() - _4976_4c06;
31766 :     }
31767 :     else {
31768 :       //^482B:0330
31769 :       xpos -= _4976_4bfa;
31770 :       ypos -= _4976_4c06;
31771 :     }
31772 :     //^482B:033C
31773 :     __int16 si;
31774 :     switch (_4976_4bf6) {
31775 :       case 1:
31776 :         //^482B:0350
31777 :         si = xpos;
31778 :         xpos = ypos;
31779 :                 //^482B:035B
31780 :         ypos = -si;
31781 :         //^482B:0360
31782 :         break;
31783 :       case 2:
31784 :         //^482B:0362
31785 :         xpos = -xpos;
31786 :         //^482B:036D
31787 :         //^482B:035B
31788 :         ypos = -ypos;
31789 :         //^482B:0360
31790 :         break;
31791 :       case 3:
31792 :         //^482B:036F
31793 :         si = xpos;
31794 :         xpos = -ypos;
31795 :         ypos = si;
31796 : 
31797 :         break;
31798 :     }
31799 :     //^482B:037D
31800 :     sk5efe *bp0c;
31801 :     __int16 di;
31802 :     if (tickDelta < 0) {
31803 :       //^482B:0383
31804 :       if (_4976_49d2 == 6)
31805 :         //^482B:038A
31806 :         return;
31807 :       //^482B:038D
31808 :       bp0c = _4976_5efe;
31809 :       di = _4976_49d2;
31810 :     }
31811 :     else {
31812 :       //^482B:03A0
31813 :       bp0c = _4976_5f02;
31814 :       di = _4976_49d0;
31815 :     }
31816 :     //^482B:03B1
31817 :     for (si=0; si < di; si++) {
31818 :       //^482B:03B5
31819 :       if (bp0c[si].pv0 != bp08) {
31820 :         //^482B:03D2
31821 :         if (bp08->pv0 != bp0c[si].pv0)
31822 :           //^482B:03F8
31823 :           continue;
31824 :       }
31825 :             //^482B:03FA
31826 :       if (bp0c[si].b6 == xpos && bp0c[si].b7 == ypos)
31827 :         //^482B:0426
31828 :         return;
31829 : 
31830 :       //^482B:0429
31831 :     }
31832 :     //^482B:042E
31833 :     bp0c[di].pv0 = &_4976_5f0a[_4976_5f06[bp0e -1].w0];
31834 :     //^482B:0467
31835 :         bp0c[di].b4 = xx;
31836 :     bp0c[di].b5 = yy;
31837 :     bp0c[di].b6 = (__int8)xpos;
31838 :     bp0c[di].b7 = (__int8)ypos;
31839 :     //^482B:04B3
31840 :     if (tickDelta == 0) {
31841 :       //^482B:04B9
31842 :       _47eb_014f(1, &bp0c[di]);
31843 :     }
31844 :     //^482B:04D5
31845 :     else if (tickDelta > 0) {
31846 :       //^482B:04DB
31847 :       _4976_49d0++;
31848 :     }
31849 :     else {
31850 :       //^482B:04E1
31851 :       _4976_49d2++;
31852 :     }
31853 :     //^482B:04E5
31854 :     return;
31855 :   }
31856 : 
31857 :   //^482B:00BF
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 :     //^482B:00BF
31861 :     //^482B:00C2
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 :     //^482B:00FF
31873 :     return;    
31874 :   }
31875 : 
31876 :   //^3A15:061A
31877 :   void _3a15_061a(Bit16u xx)
31878 :   {
31879 :     //^3A15:061A
31880 :     //^3A15:061F
31881 :     Bit16u si = xx;
31882 :     //^3A15:0622
31883 :     if (_4976_4762 >= 0) {
31884 :       //^3A15:0629
31885 :       _3a15_0486(_4976_4762);
31886 :     }
31887 :     //^3A15:0632
31888 :     _4976_5c20[si].TimerType(0);
31889 :     //^3A15:0644
31890 :     _4976_5c20[si].w0_0_f(_4976_5c18);
31891 :     //^3A15:0657
31892 :     _4976_5c18 = si;
31893 :     //^3A15:065B
31894 :     _4976_5c1e--;
31895 :     //^3A15:065F
31896 :     Bit16u di = _4976_5c1e;
31897 :     //^3A15:0664
31898 :     if (di != 0) {
31899 :       //^3A15:0668
31900 :       si = _3a15_0447(si);
31901 :       //^3A15:0670
31902 :       if (si != di) {
31903 :         //^3A15:0674
31904 :         _4976_5c1a[_4976_4762 = si] = _4976_5c1a[di];
31905 :       }
31906 :     }
31907 :     //^3A15:0692
31908 :     return;
31909 :   }
31910 : 
31911 :   //^2FCF:1587
31912 :   void INVOKE_MESSAGE(__int16 xpos, __int16 ypos, Bit16u dir, Bit16u actionType, Bit32u tick)
31913 :   {
31914 :     //^2FCF:1587
31915 :     //^2FCF:158B
31916 :     sk5c20 bp0a;
31917 :     bp0a.SetMap(_4976_0c5a);
31918 :     bp0a.SetTick(tick);
31919 :     //^2FCF:15A6
31920 :     bp0a.TimerType(4);
31921 :     //^2FCF:15AA
31922 :     if (actionType != 0) {
31923 :       //^2FCF:15B1
31924 :       if (actionType != 1) {
31925 :         //^2FCF:15B6
31926 :         if (actionType == 2) {
31927 :           //^2FCF:15C3
31928 :           bp0a.b5 = 2;
31929 :         }
31930 :       }
31931 :       else {
31932 :         //^2FCF:15BD
31933 :         bp0a.b5 = 3;
31934 :       }
31935 :     }
31936 :     else {
31937 :       //^2FCF:15C9
31938 :       bp0a.b5 = 1;
31939 :     }
31940 :     //^2FCF:15CD
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 :     //^2FCF:15E5
31946 :     QUEUE_TIMER(&bp0a);
31947 :   }
31948 : 
31949 :   //^0CEE:2515
31950 :   void SET_ITEMTYPE(ObjectID recordLink, Bit8u itemType)
31951 :   {
31952 :     //^0CEE:2515
31953 :     //^0CEE:251A
31954 :     ObjectID si = recordLink;
31955 :     //^0CEE:251D
31956 :     if (si != si.FFFF && si < si.FF80) {
31957 :       //^0CEE:252D
31958 :       GenericRecord *_bp04 = GET_ADDRESS_OF_RECORD(si);
31959 :       //^0CEE:2539
31960 :       switch (si.DBType()) {
31961 :         case dbCreature:
31962 :           {
31963 :             Creature *bp04 = _bp04->castToCreature();
31964 : 
31965 :             //^0CEE:2554
31966 :             bp04->CreatureType(itemType);
31967 :             //^0CEE:255E
31968 :             break;
31969 :           }
31970 :         case dbWeapon:
31971 :           {
31972 :             Weapon *bp04 = _bp04->castToWeapon();
31973 : 
31974 :             //^0CEE:2560
31975 :             //^0CEE:25C0
31976 :             bp04->ItemType(itemType);
31977 : 
31978 :             break;
31979 :           }
31980 :         case dbCloth:
31981 :           {
31982 :             Cloth *bp04 = _bp04->castToCloth();
31983 : 
31984 :             //^0CEE:2562
31985 :             //^0CEE:25C0
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 :             //^0CEE:2564
31999 :             bp04->PotionType(itemType);
32000 :             //^0CEE:2578
32001 :             break;
32002 :           }
32003 :         case dbContainer:
32004 :           {
32005 :             Container *bp04 = _bp04->castToContainer();
32006 : 
32007 :             //^0CEE:257A
32008 :             bp04->ContainerType(itemType);
32009 :             //^0CEE:25AA
32010 :             if (bp04->ContainerType() != 1)
32011 :               //^0CEE:25B6
32012 :               break;
32013 :             //^0CEE:25B8
32014 :             bp04->w6_0_f(0xffff);
32015 :             break;
32016 :           }
32017 :       }
32018 :     }
32019 :     //^0CEE:25D4
32020 :   }
32021 : 
32022 :   //^0CEE:14D9
32023 :   ObjectID ALLOC_NEW_DBITEM(Bit16u itemspec)
32024 :   {
32025 :     //^0CEE:14D9
32026 :     //^0CEE:14DE
32027 :     Bit16u di = itemspec;
32028 :     //^0CEE:14E1
32029 :     ObjectID si = ALLOC_NEW_RECORD(GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(di) | 0x8000);
32030 :     //^0CEE:14F8
32031 :     if (si != si.FFFF) {
32032 :       //^0CEE:14FD
32033 :       SET_ITEMTYPE(si, GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(di));
32034 :     }
32035 :     //^0CEE:150D
32036 :     return si;
32037 :   }
32038 : 
32039 :   //^0CEE:30A6
32040 :   Bit8u GET_WALL_DECORATION_OF_ACTUATOR(Actuator *ref)
32041 :   {
32042 :     //^0CEE:30A6
32043 :     Bit16u si = ref->GraphicNumber();
32044 :     if (si != 0) {
32045 :       //^0CEE:30BE
32046 :       Bit8u *bp04 = &_4976_4c78[_4976_4dd2 -1][_4976_4dd4 + _4976_4d0a->CreaturesTypes()];
32047 :       //^0CEE:30ED
32048 :       return bp04[si -1];
32049 :     }
32050 :     //^0CEE:30F6
32051 :     return -1;
32052 :   }
32053 : 
32054 :   //^0CEE:30FB
32055 :   Bit8u GET_FLOOR_DECORATION_OF_ACTUATOR(Actuator *ref)
32056 :   {
32057 :     //^0CEE:30FB
32058 :     //^0CEE:3100
32059 :     Bit16u si = ref->GraphicNumber();
32060 :     //^0CEE:310F
32061 :     if (si != 0) {
32062 :       //^0CEE:3113
32063 :       Bit8u *bp04 = &_4976_4c78[_4976_4dd2 -1][_4976_4dd4 + _4976_4d0a->CreaturesTypes() + _4976_4d0a->WallGraphics()];
32064 :       //^0CEE:3150
32065 :       return bp04[si -1];
32066 :     }
32067 :     else {
32068 :       //^0CEE:3159
32069 :       return 0xff;
32070 :     }
32071 :   }
32072 : 
32073 :   //^0CEE:2391
32074 :   Bit16u GET_DISTINCTIVE_ITEMTYPE(ObjectID recordLink)
32075 :   {
32076 :     // get the object type of record by uniquely identified number.
32077 :     // e.g. it always returns 2 if you get type of any torch record.
32078 :     // returns 511 if record is no meaningful to distinct.
32079 : 
32080 :     //^0CEE:2391
32081 :     //^0CEE:2397
32082 :     if (recordLink != recordLink.FFFF) {
32083 :       //^0CEE:239D
32084 :       Bit8u bp01 = QUERY_CLS2_FROM_RECORD(recordLink);
32085 :       //^0CEE:23A9
32086 :       Bit16u di = recordLink.DBType();
32087 :       //^0CEE:23B4
32088 :       Bit16u si = _4976_0c8a[di];
32089 :       //^0CEE:23BC
32090 :       if ((si & 0x8000) != 0) {
32091 :         //^0CEE:23C2
32092 :         si &= 0x7fff;
32093 :         bp01 = 0;
32094 :       }
32095 :       //^0CEE:23CA
32096 :       return si + bp01;
32097 :     }
32098 :     else {
32099 :       //^0CEE:23D7
32100 :       return 511;
32101 :     }
32102 :   }
32103 : 
32104 :   //^2FCF:15F3
32105 :   void INVOKE_ACTUATOR(Actuator *ref, Bit16u actionType, __int16 delayPlus)
32106 :   {
32107 :     //^2FCF:15F3
32108 :     //^2FCF:15F6
32109 :     INVOKE_MESSAGE(
32110 :       ref->Xcoord(),
32111 :       ref->Ycoord(),
32112 :       ref->Direction(),
32113 :       actionType,
32114 :             _4976_4bec + ref->Delay() + delayPlus
32115 :       );
32116 :     //^2FCF:164C
32117 :     return;
32118 :   }
32119 : 
32120 :   U16 _1c9a_0694(ObjectID *ref, void *pv); // TODO: Unreachable
32121 : 
32122 :   //^1C9A:06BD
32123 :   ObjectID *_1c9a_06bd(ObjectID recordLink, Bit16u ss, Bit16u dir)
32124 :   {
32125 :     //^1C9A:06BD
32126 :     //^1C9A:06C1
32127 :     ObjectID *bp04 = 0;
32128 :     //^1C9A:06CB
32129 :     if (recordLink != recordLink.FFFF) {
32130 :       //^1C9A:06D1
32131 :       Creature *bp08 = GET_ADDRESS_OF_RECORD4(recordLink);
32132 :       //^1C9A:06E0
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 :       //^1C9A:070F
32144 :       if (bp04 != NULL && *bp04 == 0xFFFE)
32145 :         //^1C9A:0720
32146 :         bp04 = NULL;
32147 :     }
32148 :     //^1C9A:072A
32149 :     return bp04;
32150 :   }
32151 : 
32152 :   //^2FCF:2444
32153 :   void _2fcf_2444(__int16 xpos, __int16 ypos, ObjectID recordLink, Bit16u ss, Bit16u tt, Bit16u uu)
32154 :   {
32155 :     // you placed an item at floor.    _2fcf_2444(  3,  5,2801,1,1,0) @ 22
32156 :     // you took an item from floor.    _2fcf_2444(  3,  5,2801,1,0,0) @ 22
32157 :     //                  _2fcf_2444(  3,  5,6009,1,0,0) @ 22
32158 : 
32159 :     // you have insert a key to hole  _2fcf_2444(  4,  5,E979,0,1,0) @ 22
32160 :     // you have no one at leader's hand  _2fcf_2444(  3,  5,FFFF,1,0,0) @ 22
32161 : 
32162 :     // you are moving    _2fcf_2444(  3,  3,FFFF,0,0,0) @ 22
32163 :     // you have moved    _2fcf_2444(  3,  2,FFFF,0,1,0) @ 22
32164 : 
32165 :     // creature is moving  _2fcf_2444(  8,  2,1055,0,0,0) @ 16
32166 :     // creature has moved  _2fcf_2444(  8,  3,1055,0,1,0) @ 16
32167 : 
32168 :     // creature has removed  _2fcf_2444(  1,  6,10EB,0,0,0) @ 22
32169 :     //            _2fcf_2444(  3,  5,10EB,1,0,0) @ 22
32170 : 
32171 :     // creature has dropped  _2fcf_2444(  3,  3,6009,0,1,0) @ 22
32172 : 
32173 :     //^2FCF:2444
32174 :     //^2FCF:244A
32175 :     ObjectID *bp1c = 0;
32176 :     //^2FCF:2454
32177 :     Bit16u bp0e;
32178 :     Bit16u di;
32179 :     if (recordLink != recordLink.FFFF) {
32180 :       //^2FCF:245A
32181 :       bp0e = recordLink.DBType();
32182 :       //^2FCF:2466
32183 :       di = GET_DISTINCTIVE_ITEMTYPE(recordLink);
32184 :       //^2FCF:2471
32185 :       ObjectID bp2c = GET_CREATURE_AT(xpos, ypos);
32186 :       //^2FCF:2481
32187 :       if (bp2c != bp2c.FFFF) {
32188 :         //^2FCF:2486
32189 :         Creature *bp08 = GET_ADDRESS_OF_RECORD4(bp2c);
32190 :         //^2FCF:2495
32191 :         sk03a2 *bp0c = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp08->CreatureType());
32192 :         //^2FCF:24A9
32193 :         if ((uu != 0 && tt == 0) || ((bp0c->w0 & 0x0001) != 0 && (bp0c->w30 & 0x0800) != 0)) {
32194 :           //^2FCF:24C7
32195 :           bp1c = &bp08->w2;
32196 :         }
32197 :       }
32198 :     }
32199 :     else {
32200 :       //^2FCF:24D7
32201 :       bp0e = 0xffff;
32202 :       di = 0xffff;
32203 :     }
32204 :     //^2FCF:24DF
32205 :     if (tt == 0 && bp0e != 0xffff) {
32206 :       //^2FCF:24EB
32207 :       if (bp1c == 0) {
32208 :         //^2FCF:24F3
32209 :         CUT_RECORD_FROM(recordLink, NULL, xpos, ypos);
32210 :       }
32211 :       else {
32212 :         //^2FCF:24FF
32213 :         CUT_RECORD_FROM(recordLink, bp1c, -1, 0);
32214 :       }
32215 :     }
32216 :     //^2FCF:2514
32217 :     Bit16u bp2a = _4976_4c78[xpos][ypos];
32218 :     //^2FCF:252E
32219 :     Bit16u bp1e;
32220 :     if ((bp2a >> 5) == ttWall) {
32221 :       //^2FCF:2535
32222 :       bp1e = recordLink.Dir();
32223 :     }
32224 :     else {
32225 :       //^2FCF:2540
32226 :       bp1e = 0xffff;
32227 :     }
32228 :     //^2FCF:2545
32229 :     Bit16u bp26 = 0;
32230 :     Bit16u bp24 = 0;
32231 :     Bit16u bp22 = 0;
32232 :     Bit16u bp20 = 0;
32233 :     //^2FCF:2553
32234 :     ObjectID si = GET_TILE_RECORD_LINK(xpos, ypos);
32235 :     //^2FCF:2562
32236 :     if (si == si.FFFF) {
32237 :       //^2FCF:256B
32238 :       for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
32239 :         //^2FCF:256E
32240 :         Bit16u bp12 = si.DBType();
32241 :         //^2FCF:2579
32242 :         if (bp12 == dbCreature && _2fcf_0109(si) == 0) {
32243 :           //^2FCF:2588
32244 :           if ((_0cee_2de0(si) & 0x0001) != 0 && _1c9a_06bd(si, di, 255) != NULL) {
32245 :             //^2FCF:25A5
32246 :             bp24 = 1;
32247 :           }
32248 :           else {
32249 :             //^2FCF:25AA
32250 :             bp22 = 1;
32251 :           }
32252 :         }
32253 :         //^2FCF:25B2
32254 :         if (bp12 == dbText && bp0e == 0xffff && tt != 0 && ss == 0) {
32255 :           //^2FCF:25CA
32256 :           Text *bp18 = GET_ADDRESS_OF_RECORD2(si);
32257 :           //^2FCF:25D7
32258 :           if (bp18->TextMode() != 0 || bp18->TextVisibility() == 0)
32259 :             //^2FCF:25F0
32260 :             continue;
32261 :           //^2FCF:25F2
32262 :           Bit8u bp0106[200];
32263 :           _0cee_159b(bp0106, si, 1);
32264 :           //^2FCF:2603
32265 :           _3929_09fb(15, bp0106);
32266 :           //^2FCF:2613
32267 :           continue;
32268 :         }
32269 :         //^2FCF:2615
32270 :         if (bp12 > 4 && bp12 < 14) {
32271 :           //^2FCF:2621
32272 :           bp20 = 1;
32273 :           //^2FCF:2626
32274 :           bp24 |= (GET_DISTINCTIVE_ITEMTYPE(si) == di) ? 1 : 0;
32275 :           //^2FCF:263B
32276 :           bp26 |= (GET_DISTINCTIVE_ITEMTYPE(si) != di) ? 1 : 0;
32277 :         }
32278 :         //^2FCF:2650
32279 :       }
32280 :     }
32281 :     else {
32282 :       for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
32283 :         //^2FCF:2663
32284 :         if (si.Dir() == bp1e && si.DBType() > dbCreature) {
32285 :           //^2FCF:267A
32286 :           bp20 = 1;
32287 :           //^2FCF:267F
32288 :           bp24 |= (GET_DISTINCTIVE_ITEMTYPE(si) == di) ? 1 : 0;
32289 :           //^2FCF:2694
32290 :           bp26 |= (GET_DISTINCTIVE_ITEMTYPE(si) != di) ? 1 : 0;
32291 :         }
32292 :         //^2FCF:26B2
32293 :       }
32294 :     }
32295 :     //^2FCF:26B7
32296 :     if (tt != 0 && bp0e != 0xffff) {
32297 :       //^2FCF:26C3
32298 :       if (bp1c == NULL) {
32299 :         //^2FCF:26CB
32300 :         APPEND_RECORD_TO(recordLink, NULL, xpos, ypos);
32301 :       }
32302 :       else {
32303 :         //^2FCF:26D7
32304 :         APPEND_RECORD_TO(recordLink, bp1c, -1, 0);
32305 :       }
32306 :     }
32307 :     //^2FCF:26EC
32308 :     for (si = GET_TILE_RECORD_LINK(xpos, ypos); si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
32309 :       //^2FCF:26FC
32310 :       if (bp1e == 0xffff && _0cee_3202(si) != 0 && QUERY_CLS1_FROM_RECORD(recordLink) == 15 && QUERY_CLS2_FROM_RECORD(recordLink) == 0) {
32311 :         //^2FCF:2730
32312 :         __int16 bp2e = ADD_ITEM_CHARGE(recordLink, 0);
32313 :         //^2FCF:273F
32314 :         if (bp2e < 0 || bp2e >= _4976_4c3c)
32315 :           //^2FCF:274E
32316 :           break;
32317 :         //^2FCF:2751
32318 :         sk5c20 bp3c;
32319 :         bp3c.SetMap(_4976_0c5a);
32320 :         bp3c.SetTick(_4976_4bec + 1);
32321 :         //^2FCF:2774
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 :         //^2FCF:2794
32329 :         QUEUE_TIMER(&bp3c);
32330 :         //^2FCF:27A0
32331 :         break;
32332 :       }
32333 :       //^2FCF:27A3
32334 :       Bit16u bp12 = si.DBType();
32335 :       //^2FCF:27AE
32336 :       if (bp12 == dbActuator) {
32337 :         //^2FCF:27B6
32338 :         Actuator *bp04 = GET_ADDRESS_OF_RECORD3(si);
32339 :         //^2FCF:27C3
32340 :         if (bp04->ActuatorType() == 0)
32341 :           //^2FCF:27D1
32342 :           continue;
32343 :         //^2FCF:27D4
32344 :         Bit16u bp14 = bp04->ActuatorData();
32345 :         Bit16u bp10 = tt;
32346 :         //^2FCF:27EA
32347 :         if (bp1e == 0xffff) {
32348 :           //^2FCF:27F3
32349 :           switch (bp04->ActuatorType()) {
32350 :             default:
32351 :               //^2FCF:2801
32352 :               continue;
32353 :             case 1:
32354 :               //^2FCF:280B
32355 :               if (ss != 0)
32356 :                 //^2FCF:2811
32357 :                 continue;
32358 :               //^2FCF:2814
32359 :               if (bp20 != 0)
32360 :                 //^2FCF:281A
32361 :                 continue;
32362 :               //^2FCF:281D
32363 :               if (bp22 == 0)
32364 :                 //^2FCF:2823
32365 :                 goto _29a8;
32366 :               //^2FCF:2826
32367 :               continue;
32368 :             case 2:
32369 :               //^2FCF:2829
32370 :               if (bp0e > 4)
32371 :                 //^2FCF:282F
32372 :                 continue;
32373 :               //^2FCF:2832
32374 :               if (ss != 0)
32375 :                 //^2FCF:2838
32376 :                 continue;
32377 :               //^2FCF:283B
32378 :               if (bp22 == 0)
32379 :                 //^2FCF:2841
32380 :                 goto _29a8;
32381 :               //^2FCF:2844
32382 :               continue;
32383 :             case 3:
32384 :               //^2FCF:2847
32385 :               if (bp0e != 0xffff)
32386 :                 //^2FCF:284D
32387 :                 continue;
32388 :               //^2FCF:2850
32389 :               if (_4976_4c3c == 0)
32390 :                 //^2FCF:2857
32391 :                 continue;
32392 :               //^2FCF:285A
32393 :               if (bp14 == 0) {
32394 :                 //^2FCF:2860
32395 :                 if (ss == 0)
32396 :                   //^2FCF:2866
32397 :                   goto _29a8;
32398 :                 //^2FCF:2869
32399 :                 continue;
32400 :               }
32401 :               //^2FCF:286C
32402 :               if (tt == 0) {
32403 :                 //^2FCF:2872
32404 :                 bp10 = 0;
32405 :                 //^2FCF:2877
32406 :                 goto _29a8;
32407 :               }
32408 :               //^2FCF:287A
32409 :               bp10 = (_4976_4bf6 +1 == bp14) ? 1 : 0;
32410 :               //^2FCF:288D
32411 :               goto _29a8;
32412 :             case 4:
32413 :               //^2FCF:2890
32414 :               if (bp14 != di)
32415 :                 //^2FCF:2895
32416 :                 continue;
32417 :               //^2FCF:2898
32418 :               if (bp24 == 0)
32419 :                 //^2FCF:289E
32420 :                 goto _29a8;
32421 :               //^2FCF:28A1
32422 :               continue;
32423 :             case 5:
32424 :             case 6:
32425 :               //^2FCF:2D72
32426 :               continue;
32427 :             case 7:
32428 :               //^2FCF:28A4
32429 :               if (bp0e > 4)
32430 :                 //^2FCF:28AA
32431 :                 continue;
32432 :               //^2FCF:28AD
32433 :               if (bp0e == 0xffff)
32434 :                 //^2FCF:28B3
32435 :                 continue;
32436 :               //^2FCF:28B6
32437 :               if (bp22 == 0)
32438 :                 //^2FCF:28BC
32439 :                 continue;
32440 :               //^2FCF:28BF
32441 :               continue;
32442 :             case 8:
32443 :               //^2FCF:28C2
32444 :               if (bp0e != 0xffff)
32445 :                 //^2FCF:28C8
32446 :                 continue;
32447 :               //^2FCF:28CB
32448 :               bp10 = _2fcf_16ff(bp14);
32449 :               //^2FCF:28D6
32450 :               goto _29a8;
32451 :           }
32452 :         }
32453 :         //^2FCF:28D9
32454 :         if (si.Dir() != bp1e)
32455 :           //^2FCF:28E3
32456 :           continue;
32457 :         //^2FCF:28E6
32458 :         Bit16u bp3e = bp04->ActuatorType();
32459 :         //^2FCF:28F3
32460 :         switch (bp3e) {
32461 :           case 0x001a: // &H1A -> Activator, key hole
32462 :             {
32463 :               //^2FCF:2952
32464 :               if (bp24 != 0)
32465 :                 //^2FCF:2958
32466 :                 continue;
32467 :               //^2FCF:295B
32468 :               if (bp04->OnceOnlyActuator() == tt)
32469 :                 //^2FCF:296D
32470 :                 continue;
32471 :               //^2FCF:2970
32472 :               if (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, GET_WALL_DECORATION_OF_ACTUATOR(bp04), dtWordValue, 0x0e) != di)
32473 :                 //^2FCF:2990
32474 :                 continue;
32475 :               //^2FCF:2993
32476 :               bp04->OnceOnlyActuator(tt);
32477 :               //^2FCF:29A8
32478 : _29a8:
32479 :               bp10 = bp10 ^ bp04->RevertEffect();
32480 :               //^2FCF:29BD
32481 :               Bit16u bp28 = bp04->ActionType();
32482 :               //^2FCF:29CA
32483 :               if (bp28 == 3) {
32484 :                 //^2FCF:29CF
32485 :                 bp28 = (bp10 != 0) ? 0 : 1;
32486 :               }
32487 :               else {
32488 :                 //^2FCF:29E1
32489 :                 if (bp10 == 0)
32490 :                   //^2FCF:29E7
32491 :                   continue;
32492 :               }
32493 :               //^2FCF:29EA
32494 :               if (bp04->SoundEffect() != 0) {
32495 :                 //^2FCF:29FB
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 :               //^2FCF:2A47
32511 :               INVOKE_ACTUATOR(bp04, bp28, 0);
32512 :               //^2FCF:2A59
32513 :               continue;
32514 :             }
32515 :           case 0x0029: // &H29 -> -
32516 :             {
32517 :               //^2FCF:290C
32518 :               if (bp20 == 0)
32519 :                 //^2FCF:2912
32520 :                 goto _29a8;
32521 :               //^2FCF:2915
32522 :               continue;
32523 :             }
32524 :           case 0x002a: // &H2A -> Activator, alcove item trap
32525 :             {
32526 :               //^2FCF:2918
32527 :               if (bp24 != 0)
32528 :                 //^2FCF:291E
32529 :                 continue;
32530 :               //^2FCF:2921
32531 :               if (bp04->ActuatorData() == di)
32532 :                 //^2FCF:2930
32533 :                 goto _29a8;
32534 :               //^2FCF:2932
32535 :               continue;
32536 :             }
32537 :           case 0x002b: // &H2B -> -
32538 :             {
32539 :               //^2FCF:2935
32540 :               if (bp26 != 0)
32541 :                 //^2FCF:293B
32542 :                 continue;
32543 :               //^2FCF:293E
32544 :               if (bp04->ActuatorData() != di)
32545 :                 //^2FCF:294D
32546 :                 goto _29a8;
32547 :               //^2FCF:294F
32548 :               continue;
32549 :             }
32550 :         }
32551 :         //^2FCF:2905
32552 :         continue;
32553 :       }
32554 :       //^2FCF:2A5C
32555 :       if (bp12 == dbText) {
32556 :         //^2FCF:2A65
32557 :         Text *bp18 = GET_ADDRESS_OF_RECORD2(si);
32558 :         //^2FCF:2A72
32559 :         if (bp18->TextMode() == 1) { }
32560 :         //^2FCF:2A81
32561 :         if (bp1e == 0xffff) {
32562 :           //^2FCF:2A8A
32563 :           if (bp18->SimpleTextExtUsage() != 9) { // 0x09 -> ?
32564 :             //^2FCF:2AA2
32565 :             if (bp18->SimpleTextExtUsage() == 10) { // 0x0a -> Bush
32566 :               //^2FCF:2AA7
32567 :               //^2FCF:2B5B
32568 :               if (bp0e != 0xffff)
32569 :                 //^2FCF:2B61
32570 :                 continue;
32571 :               //^2FCF:2B64
32572 :               if (tt != 0)
32573 :                 //^2FCF:2B6A
32574 :                 continue;
32575 :               //^2FCF:2B6D
32576 :               if (_4976_4c3c == 0)
32577 :                 //^2FCF:2B74
32578 :                 continue;
32579 :               //^2FCF:2B77
32580 :               Bit16u bp32 = 0;
32581 :               Bit16u bp30 = 0;
32582 :               //^2FCF:2B81
32583 :               for (; bp30 < _4976_4c3c; bp30++) {
32584 :                 //^2FCF:2B83
32585 :                 if (_4976_53b4[bp30].curHP() != 0) {
32586 :                   //^2FCF:2B94
32587 :                   bp32 = bp32 + _2c1d_203d(bp30) / _2c1d_0ffc(&_4976_53b4[bp30]);
32588 :                 }
32589 :                 //^2FCF:2BC3
32590 :               }
32591 :               //^2FCF:2BCF
32592 :               bp32 = min_value(90, (bp32 * 10) + ((bp18->TextVisibility() != 0) ? 50 : 25));
32593 :               //^2FCF:2BFE
32594 :               if (ss == 0 && RAND16(100) < bp32) {
32595 :                 //^2FCF:2C17
32596 :                 sk5c20 bp3c;
32597 :                 bp3c.SetTick(_4976_4bec);
32598 :                 bp3c.SetMap(_4976_0c5a);
32599 :                 //^2FCF:2C34
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 :                 //^2FCF:2C70
32607 :                 QUEUE_TIMER(&bp3c);
32608 :                 //^2FCF:2C7C
32609 :                 bp30 = RAND02();
32610 :                 //^2FCF:2C84
32611 :                 if (_4976_53b4[bp30].curHP() == 0) {
32612 :                   //^2FCF:2C92
32613 :                   bp30 = _4976_3fc6;
32614 :                 }
32615 :                 //^2FCF:2C98
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 :                 //^2FCF:2CC6
32628 :                 continue;
32629 :               }
32630 :               //^2FCF:2CC9
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 :               //^2FCF:2CF6
32642 :               continue;
32643 :             }
32644 :             //^2FCF:2AAA
32645 :             continue;
32646 :           }
32647 :           //^2FCF:2AAD
32648 :           if (bp0e != 0xffff) {
32649 :             //^2FCF:2AB3
32650 :             continue;
32651 :           }
32652 :           //^2FCF:2AB6
32653 :           if (ss != 0) {
32654 :             //^2FCF:2ABC
32655 :             continue;
32656 :           }
32657 :           //^2FCF:2ABF
32658 :           if (_4976_4c3c == 0) {
32659 :             //^2FCF:2AC6
32660 :             continue;
32661 :           }
32662 :           //^2FCF:2AC9
32663 :           if (RAND16(100) >= (bp18->TextIndex() & 0x00ff)) {
32664 :             //^2FCF:2AE7
32665 :             continue;
32666 :           }
32667 :           //^2FCF:2AEA
32668 :           Bit16u bp10 = (bp18->TextVisibility() != tt) ? 1 : 0;
32669 :           //^2FCF:2B00
32670 :           INVOKE_MESSAGE(
32671 :             xpos,
32672 :             ypos,
32673 :             0,
32674 :             (bp10 != 0) ? 0 : 1,
32675 :             _4976_4bec +1
32676 :             );
32677 :           //^2FCF:2B2C
32678 :           INVOKE_MESSAGE(
32679 :             xpos,
32680 :             ypos,
32681 :             0,
32682 :             (bp10 != 0) ? 1 : 0,
32683 :             _4976_4bec +5
32684 :             );
32685 :           //^2FCF:2B58
32686 :           continue;
32687 :         }
32688 :         //^2FCF:2CF8
32689 :         if (si.Dir() != bp1e)
32690 :           //^2FCF:2D00
32691 :           continue;
32692 :         //^2FCF:2D02
32693 :         if (bp18->SimpleTextExtUsage() != 4 && bp18->SimpleTextExtUsage() != 8)
32694 :           //^2FCF:2D1F
32695 :           continue;
32696 :         //^2FCF:2D21
32697 :         if (bp24 != 0)
32698 :           //^2FCF:2D25
32699 :           continue;
32700 :         //^2FCF:2D27
32701 :         if (bp18->TextVisibility() == tt)
32702 :           //^2FCF:2D34
32703 :           continue;
32704 :         //^2FCF:2D36
32705 :         if (QUERY_GDAT_ENTRY_DATA_INDEX(0x09, ((Bit8u)bp18->TextIndex()) & 0xff, dtWordValue, 0x0e) != di)
32706 :           //^2FCF:2D56
32707 :           continue;
32708 :         //^2FCF:2D58
32709 :         bp18->TextVisibility(tt);
32710 :         //^2FCF:2D6A
32711 :         continue;
32712 :       }
32713 :       //^2FCF:2D6C
32714 :       if (bp12 >= dbCreature)
32715 :         //^2FCF:2D70
32716 :         break;
32717 :       //^2FCF:2D72
32718 :     }
32719 :     //^2FCF:2D83
32720 :     return;
32721 :   }
32722 : 
32723 :   //^1C9A:156A
32724 :   void DELETE_CREATURE_RECORD(__int16 xpos, __int16 ypos, Bit16u ss, Bit16u tt)
32725 :   {
32726 :     //^1C9A:156A
32727 :     //^1C9A:1570
32728 :     ObjectID si = GET_CREATURE_AT(xpos, ypos);
32729 :     //^1C9A:157E
32730 :     if (si == si.FFFF)
32731 :       //^1C9A:1583
32732 :       return;
32733 :     //^1C9A:1586
32734 :     Creature *bp04 = GET_ADDRESS_OF_RECORD4(si);
32735 :     //^1C9A:1593
32736 :     sk03a2 *bp08 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType());
32737 :     //^1C9A:15A7
32738 :     if ((bp08->w0 & 0x0001) == 0) {
32739 :       //^1C9A:15B4
32740 :       Bit16u bp10 = QUERY_GDAT_CREATURE_WORD_VALUE(bp04->CreatureType(), 0x01);
32741 :       //^1C9A:15C8
32742 :       Bit16u di = _4976_3752[bp10];
32743 :       //^1C9A:15D0
32744 :       if ((di & 0x0004) == 0) {
32745 :         //^1C9A:15D6
32746 :         Creature *bp0c = bp04; // TODO: This is a alternative impl.
32747 :         //^1C9A:15E5
32748 :         Bit16u bp0e = _4976_0c5a;
32749 :         //^1C9A:15EB
32750 :         CHANGE_CURRENT_MAP_TO(bp0c->TriggerMap());
32751 :         //^1C9A:15FF
32752 :         INVOKE_MESSAGE(bp0c->TriggerX(), bp0c->TriggerY(), 0, 0, _4976_4bec +1);
32753 :         //^1C9A:162E
32754 :         CHANGE_CURRENT_MAP_TO(bp0e);
32755 :       }
32756 :     }
32757 :     //^1C9A:1637
32758 :     MOVE_RECORD_TO(si, xpos, ypos, -4, 0);
32759 :     //^1C9A:164A
32760 :     _1c9a_1374(si, xpos, ypos, ss, tt);
32761 :     //^1C9A:165E
32762 :     _1c9a_0247(si);
32763 :     //^1C9A:1664
32764 :     DEALLOC_RECORD(si);
32765 :     //^1C9A:166B
32766 :     return;
32767 :   }
32768 : 
32769 :   //^1C9A:1374
32770 :   void _1c9a_1374(ObjectID recordLink, __int16 xx, __int16 yy, Bit16u ss, __int16 tt)
32771 :   {
32772 :     //^1C9A:1374
32773 :     //^1C9A:137A
32774 :     if (ss == 2)
32775 :       return;
32776 :     //^1C9A:1383
32777 :     Creature *bp04 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature();
32778 :     //^1C9A:1392
32779 :     ObjectID si;
32780 :     Bit16u di;
32781 :     if (ss == 0) {
32782 :       //^1C9A:139B
32783 :       for (Bit16u bp0a = 10; bp0a <= 20; bp0a++) {
32784 :         //^1C9A:13A3
32785 :         Bit16u bp06 = QUERY_GDAT_CREATURE_WORD_VALUE(bp04->CreatureType(), (Bit8u)bp0a);
32786 :         //^1C9A:13B9
32787 :         if (bp06 == 0)
32788 :           //^1C9A:13BF
32789 :           continue;
32790 : 
32791 :         // bp0c -> battle prize: base item count. 1 or 2 items.
32792 :         // bp0e -> battle prize: additional random item count. from 0 to 6 items.
32793 : 
32794 :                 //^1C9A:13C2
32795 :         Bit16u bp0c = (bp06 & 15) + 1;
32796 :         //^1C9A:13C9
32797 :         Bit16u bp0e = (bp06 & 0x0070) >> 4;
32798 :         //^1C9A:13D5
32799 :         if (bp0e != 0) {
32800 :           //^1C9A:13D9
32801 :           bp0c = bp0c + RAND16(bp0e +1);
32802 :         }
32803 :         //^1C9A:13E9
32804 :         bp06 >>= 7;
32805 :         //^1C9A:13ED
32806 :         while (bp0c-- != 0) {
32807 :           //^1C9A:13F0
32808 :           si = ALLOC_NEW_DBITEM(bp06);
32809 :           //^1C9A:13FB
32810 :           if (si == si.FFFF)
32811 :             //^1C9A:1400
32812 :             break;
32813 :           //^1C9A:1403
32814 :           if (xx == _4976_4bfa && yy == _4976_4c06) {
32815 :             //^1C9A:1415
32816 :             di = (_4976_4bf6 + RAND01()) & 3;
32817 :           }
32818 :           else {
32819 :             //^1C9A:1428
32820 :             di = RAND02();
32821 :           }
32822 :           //^1C9A:142F
32823 :           MOVE_RECORD_TO(ObjectID(si, di), -1, 0, xx, yy);
32824 :           //^1C9A:144F
32825 :           if (tt >= 0) {
32826 :             //^1C9A:1455
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 :           //^1C9A:1481
32840 :         }
32841 :         //^1C9A:148E
32842 :       }
32843 :     }
32844 :     //^1C9A:149A
32845 :     si = bp04->GetPossessionObject();
32846 :     //^1C9A:14A3
32847 :     if (si == si.FFFE)
32848 :       //^1C9A:14A8
32849 :       return;
32850 : 
32851 :     ObjectID bp08;
32852 :     do {
32853 :       //^1C9A:14AB
32854 :       bp08 = GET_NEXT_RECORD_LINK(si);
32855 :       //^1C9A:14B5
32856 :       if ((_0cee_2de0(recordLink) & 0x0001) == 0) {
32857 :         //^1C9A:14C3
32858 :         if (xx == _4976_4bfa && yy == _4976_4c06) {
32859 :           //^1C9A:14D5
32860 :           di = (_4976_4bf6 + RAND01()) & 3;
32861 :         }
32862 :         else {
32863 :           //^1C9A:14E8
32864 :           di = RAND02();
32865 :         }
32866 :         //^1C9A:14EF
32867 :         si.Dir(di);
32868 :       }
32869 :       //^1C9A:14FE
32870 :       if (si.DBType() == dbMissile) {
32871 :         //^1C9A:150B
32872 :         DEALLOC_RECORD(si);
32873 :       }
32874 :       else {
32875 :         //^1C9A:1514
32876 :         MOVE_RECORD_TO(si, -1, 0, xx, yy);
32877 :         //^1C9A:1527
32878 :         if (tt >= 0) {
32879 :           //^1C9A:152D
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 :       //^1C9A:1559
32894 :       si = bp08;
32895 :       //^1C9A:155E
32896 :     } while (si != si.FFFE);
32897 : 
32898 :     //^1C9A:1566
32899 :     return;
32900 :   }
32901 : 
32902 :   //^2FCF:00B2
32903 :   ObjectID ROTATE_RECORD_BY_TELEPORTER(Teleporter *ref, ObjectID recordLink)
32904 :   {
32905 :     //^2FCF:00B2
32906 :     //^2FCF:00B7
32907 :     ObjectID cx = recordLink;
32908 :     //^2FCF:00BA
32909 :     Bit16u si = _4976_581e;
32910 :     //^2FCF:00BE
32911 :     Bit16u di = ref->Rotation();
32912 :     //^2FCF:00CD
32913 :     if (ref->RotationType() != 0) {
32914 :       //^2FCF:00DB
32915 :       si = di;
32916 :     }
32917 :     else {
32918 :       //^2FCF:00DF
32919 :       si = (si + di) & 3;
32920 :       //^2FCF:00E8
32921 :       cx.Dir(cx.Dir() + di);
32922 :     }
32923 :     //^2FCF:00FF
32924 :     _4976_581e = si;
32925 :     //^2FCF:0103
32926 :     return cx;
32927 :   }
32928 : 
32929 :   //^2FCF:0009
32930 :   void ROTATE_CREATURE(ObjectID recordLink, Bit16u rotationType, Bit16u rotation)
32931 :   {
32932 :     //^2FCF:0009
32933 :     //^2FCF:000F
32934 :     Creature *bp08 = GET_ADDRESS_OF_RECORD4(recordLink);
32935 :     //^2FCF:001E
32936 :     Bit16u di = bp08->b15_0_2();
32937 :     //^2FCF:002A
32938 :     Bit16u si;
32939 :     if (rotationType != 0) {
32940 :       //^2FCF:0030
32941 :       si = rotation;
32942 :     }
32943 :     else {
32944 :       //^2FCF:0035
32945 :       si = (di + rotation) & 3;
32946 :     }
32947 :     //^2FCF:003F
32948 :     Bit16u bp0a = (si - di) & 3;
32949 :     //^2FCF:0049
32950 :     bp08->b15_0_2(si);
32951 :     //^2FCF:005A
32952 :     if ((_0cee_2de0(recordLink) & 0x0001) != 0) {
32953 :       //^2FCF:0068
32954 :       ObjectID *bp04 = &bp08->w2;
32955 :       //^2FCF:0076
32956 :       while (*bp04 != bp04->FFFE) {
32957 :         //^2FCF:0078
32958 :         bp04->Dir(bp04->Dir() + bp0a);
32959 :         //^2FCF:0096
32960 :         bp04 = &(GET_ADDRESS_OF_RECORD(*bp04)->w0);
32961 :         //^2FCF:00A5
32962 :       }
32963 :     }
32964 :     //^2FCF:00AE
32965 :     return;
32966 :   }
32967 : 
32968 :   //^2C1D:01DD
32969 :   void ROTATE_SQUAD(Bit16u dir)
32970 :   {
32971 :     //^2C1D:01DD
32972 :     //^2C1D:01E3
32973 :     Bit16u di = dir;
32974 :     //^2C1D:01E6
32975 :     if (di != _4976_4bf6) {
32976 :       //^2C1D:01EC
32977 :       __int16 dx = di - _4976_4bf6;
32978 :       //^2C1D:01F4
32979 :       if (dx < 0)
32980 :         //^2C1D:01F8
32981 :         dx += 4;
32982 :       //^2C1D:01FB
32983 :       sk53b4 *bp04 = _4976_53b4;
32984 :       //^2C1D:0203
32985 :       for (Bit16u si=0; si < _4976_4c3c; bp04++, si++) {
32986 :         //^2C1D:0207
32987 :         bp04->playerPos(bp04->playerPos() + (Bit8u)dx);
32988 :         //^2C1D:0216
32989 :         bp04->playerDir(bp04->playerDir() + (Bit8u)dx);
32990 :         //^2C1D:0222
32991 :       }
32992 :       //^2C1D:022E
32993 :       _4976_4bf6 = di;
32994 :       //^2C1D:0232
32995 :       if (_4976_4c08 != 0) {
32996 :         //^2C1D:0239
32997 :         _4976_4c2c = _4976_4c10 = (_4976_4c10 + dx) & 3;
32998 :       }
32999 :       else {
33000 :         //^2C1D:0246
33001 :         _4976_4c2c = _4976_4bf6;
33002 :       }
33003 :     }
33004 :     //^2C1D:024C
33005 :     return;
33006 :   }
33007 : 
33008 :   //^2FCF:0434
33009 :   Bit16u _2fcf_0434(ObjectID recordLink, __int16 xpos, __int16 ypos, __int16 xx, __int16 yy, Bit16u zz)
33010 :   {
33011 :     //^2FCF:0434
33012 :     //^2FCF:043A
33013 :     ObjectID si = recordLink;
33014 :     _4976_5822 = 0;
33015 :     Bit16u bp14 = 0; // 1 if telefragged?
33016 :     Bit16u bp12 = 0;
33017 :     Bit16u bp20 = _4976_0c5a; // curmap
33018 :     Bit16u di = _4976_0c5a; // curmap
33019 :     //^2FCF:0452
33020 :     Bit16u bp28;
33021 :     Bit16u bp1e;
33022 :     Bit16u bp26;
33023 :     Bit16u bp24; // teleporter scope
33024 :     if (si == si.FFFF) {
33025 :       //^2FCF:0457
33026 :       if (_4976_4ddc != 0) {
33027 :         //^2FCF:045E
33028 :         _4976_4ddc = 0;
33029 :         _29ee_000f();
33030 :       }
33031 :       //^2FCF:0469
33032 :       _4976_4bfa = xx;
33033 :       _4976_4c06 = yy;
33034 :       Bit16u bp24 = 2;
33035 :       //^2FCF:047A
33036 :       bp26 = (_4976_52be == 0 && _4976_4be8 == 0) ? 1 : 0;
33037 :       bp1e = 0xffff;
33038 :       bp28 = 0;
33039 :     }
33040 :     else {
33041 :       //^2FCF:049E
33042 :       bp28 = _2fcf_0109(si);
33043 :       bp1e = si.DBType();
33044 :       bp24 = 3;
33045 :       //^2FCF:04B7
33046 :       if (bp1e == dbCreature) {
33047 :         //^2FCF:04BD
33048 :         bp24 = (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0x1e) != 0) ? 2 : 1;
33049 :       }
33050 :       //^2FCF:04D9
33051 :       else if (bp1e == dbMissile) {
33052 :         //^2FCF:04DF
33053 :         Missile *bp04 = GET_ADDRESS_OF_RECORD(si)->castToMissile();
33054 :         //^2FCF:04EC
33055 :         _4976_581e = _4976_5c20[bp04->TimerIndex()].b9_2_3();
33056 :       }
33057 :       //^2FCF:050B
33058 :       bp26 = 0;
33059 :     }
33060 :     //^2FCF:0510
33061 :     for (Bit16u bp1a = 50; bp1a != 0; --bp1a) {
33062 :       //^2FCF:0518
33063 :       Bit16u bp16 = _4976_4c78[xx][yy];
33064 :       //^2FCF:0532
33065 :       Bit16u bp18 = bp16 >> 5;  
33066 :       //^2FCF:053A
33067 :       if (bp18 == ttTeleporter) {
33068 :         //^2FCF:0542
33069 :         if ((bp16 & 0x0008) == 0)
33070 :           //^2FCF:0549
33071 :           break;
33072 :         //^2FCF:054C
33073 :         Teleporter *bp04 = GET_ADDRESS_OF_TILE_RECORD((Bit8u)xx, (Bit8u)yy)->castToTeleporter();
33074 :         //^2FCF:055F
33075 :         if (bp04->Scope() == scopeCreatures && bp1e != dbCreature)
33076 :           //^2FCF:0577
33077 :           break;
33078 :         //^2FCF:057A
33079 :         if (bp24 != 3) {
33080 :           //^2FCF:0580
33081 :           if ((bp24 & bp04->Scope()) == 0)
33082 :             //^2FCF:0592
33083 :             break;
33084 :         }
33085 :         //^2FCF:0595
33086 :         bp14 = (bp04->DestinationX() == xx && bp04->DestinationY() == yy && bp04->DestinationMap() == di) ? 1 : 0;
33087 :         //^2FCF:05C8
33088 :         xx = bp04->DestinationX();
33089 :         yy = bp04->DestinationY();
33090 :         _4976_5822 = bp04->Sound();
33091 :         di = bp04->DestinationMap();
33092 :         //^2FCF:05F8
33093 :         CHANGE_CURRENT_MAP_TO(di);
33094 :         //^2FCF:05FF
33095 :         if (si == si.FFFF) {
33096 :           //^2FCF:0604
33097 :           _4976_4bfa = xx;
33098 :           _4976_4c06 = yy;
33099 :           //^2FCF:0610
33100 :           if (bp04->Sound() != 0) {
33101 :             //^2FCF:0621
33102 :             QUEUE_NOISE_GEN1(0x03,0x00,0x89,0x61,0x80,_4976_4bfa,_4976_4c06,-1);
33103 :           }
33104 :           //^2FCF:063F
33105 :           if (bp20 == di) {
33106 :             //^2FCF:0644
33107 :             bp26 &= _4976_5bee;
33108 :           }
33109 :           //^2FCF:064C
33110 :           ROTATE_SQUAD((bp04->Rotation() + ((bp04->RotationType() != 0) ? 0 : _4976_4bf6)) & 3);
33111 :         }
33112 :         //^2FCF:0680
33113 :         else if (bp1e == dbCreature && zz != 00) {
33114 :           //^2FCF:068C
33115 :           if (bp04->Sound() != 0) {
33116 :             //^2FCF:069D
33117 :             QUEUE_NOISE_GEN1(0x03,0x00,0x89,0x61,0x80,xx,yy,0x01);
33118 :           }
33119 :           //^2FCF:06B9
33120 :           ROTATE_CREATURE(si, bp04->RotationType(), bp04->Rotation());
33121 :         }
33122 :         //^2FCF:06DC
33123 :         else if (bp1e == dbMissile) {
33124 :           //^2FCF:06E2
33125 :           si = ROTATE_RECORD_BY_TELEPORTER(bp04, si);
33126 :         }
33127 :         //^2FCF:06F4
33128 :         else if (bp04->RotationType() == 0 && xpos != -2) {
33129 :           //^2FCF:070B
33130 :           si.Dir(si.Dir() + bp04->Rotation());
33131 :         }
33132 :         //^2FCF:072D
33133 :         if (bp14 == 0)
33134 :           //^2FCF:0733
33135 :           continue;
33136 :         //^2FCF:0736
33137 :         break;
33138 :       }
33139 :       //^2FCF:0739
33140 :       if (bp18 == ttPit && bp28 == 0 && (bp16 & 8) != 0 && (bp16 & 1) == 0) {
33141 :         //^2FCF:075F
33142 :         Bit16u bp2a = QUERY_GDAT_ENTRY_DATA_INDEX(0x08, _4976_4d0a->MapGraphicsStyle(), dtWordValue, 0x6a);
33143 :         //^2FCF:077F
33144 :         if (bp2a != 0 && bp1e == dbCreature) {
33145 :           //^2FCF:078B
33146 :           Creature *bp10 = GET_ADDRESS_OF_RECORD(si)->castToCreature();
33147 :           //^2FCF:0798
33148 :           xx = bp10->TriggerX();
33149 :           yy = bp10->TriggerY();
33150 :           di = bp10->TriggerMap();
33151 :           //^2FCF:07BE
33152 :           CHANGE_CURRENT_MAP_TO(di);
33153 :           //^2FCF:07C5
33154 :           continue;
33155 :         }
33156 :         //^2FCF:07C8
33157 :         if (bp26 != 0 && bp2a == 0 && _4976_5824 == 0) {
33158 :           //^2FCF:07DB
33159 :           bp26 = _4976_5bee;
33160 :           //^2FCF:07E3
33161 :           if (bp12 != 0) {
33162 :             //^2FCF:07E9
33163 :             LOAD_LOCALLEVEL_GRAPHICS_TABLE(di);
33164 :             //^2FCF:07F0
33165 :             _2676_0131();
33166 :           }
33167 :           //^2FCF:07F5
33168 :           _32cb_5d0d(_4976_4bf6, xx, yy);
33169 :           //^2FCF:0807
33170 :           _44c8_1be8(1);
33171 :         }
33172 :         //^2FCF:080F
33173 :         if (bp2a != 0) {
33174 :           //^2FCF:0818
33175 :           Bit16u bp2e = 0;
33176 :           //^2FCF:081D
33177 :           ObjectID bp2c = GET_TILE_RECORD_LINK(xx, yy);
33178 :           //^2FCF:082A
33179 :           for (; bp2c != bp2c.FFFE && ((bp1e = bp2c.DBType()) <= dbActuator); bp2c = GET_NEXT_RECORD_LINK(bp2c)) {
33180 :             //^2FCF:082C
33181 :             if (bp1e == dbText) {
33182 :               //^2FCF:0832
33183 :               Text *bp0c = GET_ADDRESS_OF_RECORD(bp2c)->castToText();
33184 :               //^2FCF:0841
33185 :               if (bp0c->TextMode() == 1) {
33186 :                 //^2FCF:0852
33187 :                 if (bp0c->SimpleTextExtUsage() == 0x0c) {
33188 :                   //^2FCF:0867
33189 :                   bp2e = bp0c->TextIndex() & 0xff;
33190 :                   //^2FCF:0877
33191 :                   break;
33192 :                 }
33193 :               }
33194 :             }
33195 :             //^2FCF:0879
33196 :           }
33197 :           //^2FCF:089C
33198 :           Bit16u bp30 = _2fcf_2da7(0x0003, 0x0000, bp2e, &xx, &yy);
33199 :           //^2FCF:08B8
33200 :           di = _2fcf_2da7(2, RAND16(bp30), bp2e, &xx, &yy);
33201 :         }
33202 :         else {
33203 :           //^2FCF:08DC
33204 :           di = _0cee_0510(di, 1, &xx, &yy, NULL);
33205 :         }
33206 :         //^2FCF:08FA
33207 :         CHANGE_CURRENT_MAP_TO(di);
33208 :         //^2FCF:0901
33209 :         if (si == si.FFFF) {
33210 :           //^2FCF:0909
33211 :           _4976_4bfa = xx;
33212 :           _4976_4c06 = yy;
33213 :           //^2FCF:0915
33214 :           if (_4976_4c3c > 0) {
33215 :             //^2FCF:091F
33216 :             sk53b4 *bp08;
33217 :             if (_4976_5824 != 0) {
33218 :               //^2FCF:0926
33219 :               bp26 = (_4976_5bee != 0 && _4976_52be == 0 && _4976_4be8 == 0) ? 1 : 0;
33220 :               //^2FCF:0945
33221 :               bp08 = _4976_53b4;
33222 :               //^2FCF:094D
33223 :               for (bp18=0; bp18 < _4976_4c3c; bp08++, bp18++) {
33224 :                 //^2FCF:0954
33225 :                 if (bp08->curHP() != 0) {
33226 :                   //^2FCF:095E
33227 :                   _2c1d_1c7c(
33228 :                     bp18,
33229 :                     ((_2c1d_203d(bp18) * 25) / _2c1d_0ffc(bp08)) + 1
33230 :                     );
33231 :                 }
33232 :                 //^2FCF:098D
33233 :               }
33234 :             }
33235 :             else {
33236 :               //^2FCF:09A1
33237 :               bp08 = _4976_53b4;
33238 :               //^2FCF:09A9
33239 :               for (bp18 = 0; (bp18 < _4976_4c3c); bp08++, bp18++) {
33240 :                 //^2FCF:09B0
33241 :                 if (bp08->curHP() != 0) {
33242 :                   //^2FCF:09BA
33243 :                   _2c1d_18aa(
33244 :                     bp18, 
33245 :                     min_value(bp08->maxHP() >> 2, 17) + RAND02(),
33246 :                     0x0030,
33247 :                     0x0002
33248 :                     );
33249 :                   //^2FCF:09E9
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 :                 //^2FCF:0A12
33263 :               }
33264 :             }
33265 :           }
33266 :           //^2FCF:0A23
33267 :           _4976_5824 = 0;
33268 :           //^2FCF:0A29
33269 :           continue;
33270 :         }
33271 :         //^2FCF:0A2C
33272 :         if (bp1e != dbCreature)
33273 :           //^2FCF:0A32
33274 :           continue;
33275 :         //^2FCF:0A35
33276 :         if (zz == 0)
33277 :           //^2FCF:0A3B
33278 :           continue;
33279 :         //^2FCF:0A3E
33280 :         if (xpos >= 0) {
33281 :           //^2FCF:0A44
33282 :           CHANGE_CURRENT_MAP_TO(bp20);
33283 :           //^2FCF:0A4D
33284 :           _13e4_0401(
33285 :             si,
33286 :             xpos,
33287 :             ypos,
33288 :             0x0000,
33289 :             0x0000,
33290 :             0x0014
33291 :             );
33292 :         }
33293 :         //^2FCF:0A62
33294 :         CHANGE_CURRENT_MAP_TO(di);
33295 :         //^2FCF:0A69
33296 :         break;
33297 :       }
33298 :       //^2FCF:0A6C
33299 :       if (bp18 != ttStairs || si == si.FFFF || bp1e == 14 || bp1e == 4)
33300 :         //^2FCF:0A8C
33301 :         break;
33302 :       //^2FCF:0A8F
33303 :       if ((bp16 & 0x0004) == 0) {
33304 :         //^2FCF:0A96
33305 :         di = _0cee_0510(di, 1, &xx, &yy, NULL);
33306 :         //^2FCF:0AB1
33307 :         CHANGE_CURRENT_MAP_TO(di);
33308 :       }
33309 :       //^2FCF:0AB8
33310 :       Bit16u bp22 = _0cee_06dc(xx, yy);
33311 :       //^2FCF:0AC8
33312 :       xx += _4976_0232[bp22];
33313 :       //^2FCF:0AD4
33314 :       yy += _4976_023a[bp22];
33315 :       //^2FCF:0AE0
33316 :       bp22 = (bp22 +2 ) & 3;
33317 :       //^2FCF:0AEB
33318 :       Bit16u bp1c = si.Dir();
33319 :       //^2FCF:0AF3
33320 :       bp1c = ((((bp1c - bp22 + 1) & 2) >> 1) + bp22) & 3;
33321 :       //^2FCF:0B05
33322 :       si.Dir(bp1c);
33323 : 
33324 :       //^2FCF:0B12
33325 :     }
33326 :     //^2FCF:0B1F
33327 :     _4976_5826 = xx;
33328 :     _4976_5828 = yy;
33329 :     _4976_581c = di;
33330 :     //^2FCF:0B2F
33331 :     _4976_5820 = si.Dir();
33332 :     //^2FCF:0B37
33333 :     if (bp12 != 0 && zz != 0 && si != si.FFFF) {
33334 :       //^2FCF:0B48
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 :     //^2FCF:0B73
33348 :     CHANGE_CURRENT_MAP_TO(bp20);
33349 :     //^2FCF:0B7C
33350 :     _482b_05bf(1);
33351 :     //^2FCF:0B84
33352 :     return bp28;
33353 :   }
33354 : 
33355 :   //^1C9A:03CF
33356 :   ObjectID _1c9a_03cf(__int16 *xx, __int16 *yy, Bit16u ss)
33357 :   {
33358 :     //^1C9A:03CF
33359 :     //^1C9A:03D5
33360 :     __int16 bp0c = *xx;
33361 :     __int16 di = *yy;
33362 :     Bit16u bp10;
33363 :     Bit16u bp12;
33364 :     //^1C9A:03E4
33365 :     _098d_000f(
33366 :       bp0c, 
33367 :       di, 
33368 :       (ss == 255) ? 12 : (_4976_014c[ss]),
33369 :       &bp10,
33370 :       &bp12
33371 :       );
33372 :     //^1C9A:0410
33373 :     __int16 bp0e = 4;
33374 :     //^1C9A:0415
33375 :     for (__int16 si=0; si <= bp0e; si++) {
33376 :       //^1C9A:041A
33377 :       ObjectID bp06 = GET_CREATURE_AT(bp0c, di);
33378 :       //^1C9A:0427
33379 :       if (bp06 != bp06.FFFF) {
33380 :         //^1C9A:042F
33381 :         Creature *bp04 = GET_ADDRESS_OF_RECORD(bp06)->castToCreature();
33382 :         //^1C9A:043E
33383 :         __int16 bp08 = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType())->b35;
33384 :         //^1C9A:0458
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 :         //^1C9A:048F
33398 :         bp14 -= bp10;
33399 :         bp16 -= bp12;
33400 :         __int16 bp0a = (bp14 * bp14) + (bp16 * bp16);
33401 :         //^1C9A:04AE
33402 :         if (_4976_3924[bp08] > bp0a) {
33403 :           //^1C9A:04BC
33404 :           *xx = bp0c;
33405 :           *yy = di;
33406 :           //^1C9A:04CB
33407 :           return bp06;
33408 :         }
33409 :       }
33410 :       //^1C9A:04D0
33411 :       if (ss == 255) {
33412 :         //^1C9A:04D7
33413 :         bp0c = *xx + _4976_3914[si].w0;
33414 :         //^1C9A:04EE
33415 :         di = *yy + _4976_3914[si].w2;
33416 :       }
33417 :       else {
33418 :         //^1C9A:0504
33419 :         bp0c = *xx + _4976_38f4[(ss << 1) + si].w0;
33420 :         //^1C9A:0523
33421 :         di = *yy + _4976_38f4[(ss << 1) + si].w2;
33422 :       }
33423 :       //^1C9A:0541
33424 :     }
33425 :     //^1C9A:054A
33426 :     return ObjectID::FFFF;
33427 :   }
33428 : 
33429 :   //^0CD5:0078
33430 :   __int16 ABS16(__int16 val)
33431 :   {
33432 :     //^0CD5:0078
33433 :     //^0CD5:007C
33434 :     __int16 si = val;
33435 :     //^0CD5:007F
33436 :     if (si < 0) {
33437 :       //^0CD5:0083
33438 :       return -si;
33439 :     }
33440 :     //^0CD5:0089
33441 :     return si;
33442 :   }
33443 : 
33444 :   //^075F:1B61
33445 :   Bit16u CALC_VECTOR_DIR(__int16 x1, __int16 y1, __int16 x2, __int16 y2)
33446 :   {
33447 :     // calc normal vector of: v2 - v1. v2=(x2,y2), v1=(x1,y1)
33448 :     //
33449 :     // return: 0 if v2 is at north from v1
33450 :     //         1 if v2 is at east from v1
33451 :     //         2 if v2 is at south from v1
33452 :     //         3 if v2 is at west from v1
33453 : 
33454 :     //^075F:1B61
33455 :     //^075F:1B66
33456 :     __int16 di = x2;
33457 :     __int16 si = y2;
33458 :     x1 -= di;
33459 :     di = ABS16(x1);
33460 :     //^075F:1B7B
33461 :     y1 -= si;
33462 :     si = ABS16(y1);
33463 :     //^075F:1B8B
33464 :     if (di == si) {
33465 :       //^075F:1B90
33466 :       if (RAND01() != 0) {
33467 :         //^075F:1B99
33468 :         di++;
33469 :       }
33470 :       else {
33471 :         //^075F:1B9C
33472 :         si++;
33473 :       }
33474 :     }
33475 :     //^075F:1B9D
33476 :     if (di < si) {
33477 :       //^075F:1BA1
33478 :       if (y1 > 0)
33479 :         //^075F:1BA7
33480 :         return 0;
33481 : 
33482 :       //^075F:1BAB
33483 :       return 2;
33484 :     }
33485 :     //^075F:1BB0
33486 :     if (x1 > 0) {
33487 :       //^075F:1BB6
33488 :       return 3;
33489 :     }
33490 :     //^075F:1BBB
33491 :     return 1;
33492 :   }
33493 : 
33494 :   //^075F:1B32
33495 :   Bit16u CALC_SQUARE_DISTANCE(__int16 x1, __int16 y1, __int16 x2, __int16 y2)
33496 :   {
33497 :     //^075F:1B32
33498 :     //^075F:1B37
33499 :     __int16 di = x1;
33500 :     __int16 si = y1;
33501 :     //^075F:1B3D
33502 :     di -= x2;
33503 :     si -= y2;
33504 : 
33505 :     return ((di < 0) ? (-di) : di) + ((si < 0) ? (-si) : si);
33506 :   }
33507 : 
33508 :   //^4937:005C
33509 :   Bit16u _4937_005c(Bit16u xx, Bit16u *yy)
33510 :   {
33511 :     //^4937:005C
33512 :     //^4937:0061
33513 :     Bit16u si;
33514 :     if ((*yy & 0x4000) != 0) {
33515 :       //^4937:006B
33516 :       si = 0;
33517 :     }
33518 :     //^4937:006F
33519 :     else if ((*yy & 0x8000) != 0) {
33520 :       //^4937:0079
33521 :       Bit16u di;
33522 :       if ((*yy & 0x1000) != 0) {
33523 :         //^4937:0080
33524 :         *yy &= 0xe03f;
33525 :         di = 0;
33526 :       }
33527 :       else {
33528 :         //^4937:0089
33529 :         di = (*yy & 0x0fc0) >> 6;
33530 :       }
33531 :       //^4937:0097
33532 :       si = (_4976_4bec + di) / (*yy & 0x003f);
33533 :     }
33534 :     else {
33535 :       //^4937:00B8
33536 :       si = *yy & 0x003f;
33537 :     }
33538 :     //^4937:00C3
33539 :     return xx + si;
33540 :   }
33541 : 
33542 :   //^4937:0036
33543 :   sk5fde *_4937_0036(Bit16u xx, Bit16u *yy)
33544 :   {
33545 :     //^4937:0036
33546 :     //^4937:0039
33547 :     return &_4976_5fde[_4937_005c(xx, yy)];
33548 :   }
33549 : 
33550 :   //^1C9A:198E
33551 :   Bit16u _1c9a_198e(ObjectID recordLink, Bit16u xx)
33552 :   {
33553 :     //^1C9A:198E
33554 :     //^1C9A:1992
33555 :     if (xx != 0) {
33556 :       //^1C9A:1998
33557 :       Bit16u si = QUERY_CREATURE_AI_SPEC_FROM_RECORD(recordLink)->w24_8_b();
33558 :       //^1C9A:19B1
33559 :       if (si == 15) {
33560 :         //^1C9A:19B6
33561 :         return 0;
33562 :       }
33563 :       //^1C9A:19BA
33564 :       return ((xx + RAND02()) << 3) / (si + 2);
33565 :     }
33566 :     //^1C9A:19B6
33567 :     return 0;
33568 :   }
33569 : 
33570 :   //^0CEE:1585
33571 :   void DEALLOC_RECORD(ObjectID recordLink)
33572 :   {
33573 :     // it is a unused record if next object is FFFF.
33574 : 
33575 :     //^0CEE:1585
33576 :     //^0CEE:1588
33577 :     GET_ADDRESS_OF_RECORD(recordLink)->w0 = ObjectID::FFFF;
33578 :   }
33579 : 
33580 :   //^075F:06BD
33581 :   Bit16u _075f_06bd(Missile *ref, ObjectID recordLink) //#DS=4976?
33582 :   {
33583 :     //^075F:06BD
33584 :     //^075F:06C3
33585 :     _4976_4b7c = 0;
33586 :     _4976_4b7a = 3;
33587 :     //^075F:06CF
33588 :     Bit16u di = ref->EnergyRemaining();
33589 :     //^075F:06DA
33590 :     Bit16u si;
33591 :     if (recordLink.DBType() != dbCloud) {
33592 :       //^075F:06EB
33593 :       Bit16u si = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 0x09);
33594 :       //^075F:06F9
33595 :       if (si != 0) {
33596 :         //^075F:06FD
33597 :         si += (di >> 1);
33598 :         //^075F:0703
33599 :         Bit16u bp02 = ref->b5_4_7() +3;
33600 :         //^075F:0715
33601 :         si = (bp02 * bp02 * si) >> 7;
33602 :         //^075F:071F
33603 :         _4976_4b7a = 4;
33604 :         //^075F:0725
33605 :         _4976_4b7c = QUERY_GDAT_DBSPEC_WORD_VALUE(recordLink, 0x0d);
33606 :         //^075F:0734
33607 :         if (_4976_4b7c != 0) {
33608 :           //^075F:0738
33609 :           if ((RAND() & 0x007f) > di) {
33610 :             //^075F:0744
33611 :             _4976_4b7c -= RAND16((_4976_4b7c >> 1) + 1);
33612 :           }
33613 :         }
33614 :       }
33615 :       //^075F:0755
33616 :       si += RAND02();
33617 :       //^075F:075C
33618 :       si += QUERY_ITEM_WEIGHT(recordLink);
33619 :       //^075F:0767
33620 :       if ((RAND() & 0x01ff) < ref->EnergyRemaining2()) {
33621 :         //^075F:077C
33622 :         si <<= 1;
33623 :       }
33624 :     }
33625 :     else {
33626 :       //^075F:0780
33627 :       if (recordLink == recordLink.FF81) {
33628 :         //^075F:0786
33629 :         si = RAND() & 0x000f;
33630 :         //^075F:0790
33631 :         _4976_4b7c = si + 10;
33632 :         //^075F:0796
33633 :         si += RAND() & 0x001f;
33634 :       }
33635 :       else {
33636 :         //^075F:07A2
33637 :         if (recordLink >= recordLink.FF83) {
33638 :           //^075F:07A8
33639 :           _4976_4b7a = 5;
33640 :           //^075F:07AE
33641 :           if (recordLink == recordLink.FF86) {
33642 :             //^075F:07B4
33643 :             _4976_4b7c = di >> 1;
33644 :             //^075F:07BB
33645 :             return (di >> 4) + 1;
33646 :           }
33647 :           //^075F:07C4
33648 :           return 0;
33649 :         }
33650 :         //^075F:07C9
33651 :         _4976_4b7a = 1;
33652 :         //^075F:07CF
33653 :         si = (RAND() & 0x000f) + (RAND() & 0x000f) + 10;
33654 :         //^075F:07E8
33655 :         if (recordLink == recordLink.FF82) {
33656 :           //^075F:07EE
33657 :           _4976_4b7a = 7;
33658 :           //^075F:07F4
33659 :           si >>= 4;
33660 :           si += di;
33661 :         }
33662 :       }
33663 :     }
33664 :     //^075F:07F9
33665 :     si = ((si + di) >> 4) + 1;
33666 :     //^075F:0803
33667 :     si += RAND16((si >> 1) + 1) + RAND02();
33668 :     //^075F:0818
33669 :     si = max_value(si, si - 32 - ((ref->EnergyRemaining2() >> 3) << 1));
33670 :     //^075F:083A
33671 :     si = min_value(si, di << 1);
33672 :     //^075F:0847
33673 :     return si;
33674 :   }
33675 : 
33676 :   //^1C9A:0958
33677 :   Bit16u _1c9a_0958(ObjectID recordLink)
33678 :   {
33679 :     //^1C9A:0958
33680 :     //^1C9A:095C
33681 :     Creature *bp04 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature();
33682 :     //^1C9A:096B
33683 :     sk1c9a02c3 *bp08 = _1c9a_02c3(bp04, QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType()));
33684 :     //^1C9A:098E
33685 :     sk5fde *bp0c = _4937_0036(bp08->w0, &bp08->w2);
33686 :     //^1C9A:09AB
33687 :     return (bp0c->w0 & 0x4000) >> 14;
33688 :   }
33689 : 
33690 :   //^0CD5:0118
33691 :   Bit16u RAND01()
33692 :   {
33693 :     // CSBwinSimilarity: TAG001050,STRandomBool
33694 : 
33695 :     //^0CD5:0118
33696 :     //^0CD5:011B
33697 :     _4976_49ba = _4976_49ba * 0xbb40e62d + 11;
33698 :     //^0CD5:013B
33699 :     return (_4976_49ba >> 8) & 1;
33700 :   }
33701 : 
33702 :   //^0CEE:328C
33703 :   Bit16u _0cee_328c(Bit8u cls2)
33704 :   {
33705 :     //^0CEE:328C
33706 :     //^0CEE:328F
33707 :     return QUERY_GDAT_ENTRY_DATA_INDEX(0x0e, cls2, dtWordValue, 0x10);
33708 :   }
33709 : 
33710 :   //^0CEE:322D
33711 :   Bit8u GET_GRAPHICS_FOR_DOOR(Door *ref)
33712 :   {
33713 :     //^0CEE:322D
33714 :     //^0CEE:3230
33715 :     if (ref->DoorType() == 0) {
33716 :       //^0CEE:323E
33717 :       if (_4976_4d0a->b2_7_7() == 0)
33718 :         //^0CEE:3271
33719 :         return 0xff;
33720 :       //^0CEE:3254
33721 :       return _4976_4d0a->DoorType0();
33722 :     }
33723 :     else {
33724 :       //^0CEE:3259
33725 :       if (_4976_4d0a->b3_0_0() == 0)
33726 :         //^0CEE:3271
33727 :         return 0xff;
33728 :       //^0CEE:3268
33729 :       return _4976_4d0a->DoorType1();
33730 :     }
33731 :   }
33732 : 
33733 :   //^075F:0AF9
33734 :   Bit16u _075f_0af9(__int16 ww, __int16 xpos, __int16 ypos, Bit16u ss, ObjectID recordLink)
33735 :   {
33736 :     //^075F:0AF9
33737 :     //^075F:0AFF
33738 :     Bit16u bp1c = 0;
33739 :     Bit16u bp2a = 0;
33740 :     //^075F:0B09
33741 :     Missile *bp08 = GET_ADDRESS_OF_RECORD(recordLink)->castToMissile();
33742 :     //^075F:0B18
33743 :     ObjectID si = bp08->w2;
33744 :     //^075F:0B21
33745 :     Bit16u bp2c = si.DBType();
33746 :     //^075F:0B2A
33747 :     Bit16u bp28;
33748 :     ObjectID bp1e;
33749 :     if (bp2c == dbPotion) {
33750 :       //^075F:0B2F
33751 :       Potion *bp04 = GET_ADDRESS_OF_RECORD(si)->castToPotion();
33752 :       //^075F:0B3C
33753 :       Bit16u bp20;
33754 :       switch (bp04->PotionType()) {
33755 :         case 0x03: // 0x03 -> {VEN} BOMB
33756 :           //^075F:0B52
33757 :           bp20 = 0xff87;
33758 :           //^075F:0B57
33759 :           //^075F:0B5E
33760 :           bp2a = 1;
33761 :           //^075F:0B63
33762 :           bp28 = bp04->PotionPower();
33763 :           //^075F:0B70
33764 :           bp1e = si;
33765 :           break;
33766 :         case 0x13: // 0x13 -> {FUL} BOMB
33767 :           //^075F:0B59
33768 :           bp20 = 0xff80;
33769 :           //^075F:0B5E
33770 :           bp2a = 1;
33771 :           //^075F:0B63
33772 :           bp28 = bp04->PotionPower();
33773 :           //^075F:0B70
33774 :           bp1e = si;
33775 :           break;
33776 :       }
33777 :     }
33778 :     //^075F:0B73
33779 :     Bit16u bp26 = (bp2c == dbCloud && si != si.FF81 && si != si.FF86) ? 1 : 0;
33780 :     //^075F:0B8D
33781 :     ObjectID *bp10 = NULL;
33782 :     Bit16u bp36 = 0;
33783 :     //^075F:0B9C
33784 :     __int16 bp22;
33785 :     __int16 bp24;
33786 :     if (xpos <= 255) {
33787 :       //^075F:0BA3
33788 :       bp22 = xpos;
33789 :       bp24 = ypos;
33790 :     }
33791 :     else {
33792 :       //^075F:0BB1
33793 :       bp22 = (xpos >> 8) -1;
33794 :       bp24 =  ypos >> 8;
33795 :       //^075F:0BC4
33796 :       xpos &= 255;
33797 :       ypos &= 255;
33798 :     }
33799 :     //^075F:0BCE
33800 :     __int16 bp30 = bp22;
33801 :     __int16 bp38 = bp22;
33802 :     __int16 bp32 = bp24;
33803 :     __int16 bp3a = bp24;
33804 :     //^075F:0BE0
33805 :     ObjectID bp20;
33806 :     Bit16u bp16;
33807 :     switch (ww) {
33808 :       case  0:
33809 :         {
33810 :           //^075F:0BF5
33811 :           Bit16u di = _4976_5c20[bp08->TimerIndex()].b9_2_3();
33812 :           //^075F:0C13
33813 :           bp38 += _4976_0232[di];
33814 :           //^075F:0C1E
33815 :           bp3a += _4976_023a[di];
33816 :           //^075F:0C29
33817 :           if (_075f_084d(bp38, bp3a, bp22, bp24, di, recordLink) == 0)
33818 :             break;
33819 :           //^075F:0C47
33820 :           return 1;
33821 :         }
33822 :       case  4:
33823 :         {
33824 :           //^075F:0C4A
33825 :           __int16 bp12 = _4976_4c78[xpos][ypos] & 0x07;
33826 :           //^075F:0C66
33827 :           Door *bp1a = GET_ADDRESS_OF_TILE_RECORD((Bit8u)xpos, (Bit8u)ypos)->castToDoor();
33828 :           //^075F:0C79
33829 :           if (bp12 != 5 && (si == si.FF84 || si == si.FF8D)) {
33830 :             //^075F:0C89
33831 :             if (bp1a->Button() == 0 && bp1a->w2_d_d() == 0) {
33832 :               //^075F:0C9A
33833 :               break;
33834 :             }
33835 :             //^075F:0CAB
33836 :             INVOKE_MESSAGE(
33837 :               xpos,
33838 :               ypos,
33839 :               0,
33840 :               (si == si.FF84) ? 2 : 0,
33841 :               _4976_4bec +1
33842 :               );
33843 :             //^075F:0CD8
33844 :             break;
33845 :           }
33846 :           //^075F:0CDB
33847 :           if (bp12 == 5 || bp12 <= 1)
33848 :             //^075F:0CDF
33849 :             //^075F:0CE5
33850 :             //^075F:0D42
33851 :             return 0;
33852 : 
33853 :           //^075F:0CE7
33854 :           if (_0cee_328c(GET_GRAPHICS_FOR_DOOR(bp1a)) != 0) {
33855 :             //^075F:0CFF
33856 :             if (bp2c == 15) {
33857 :               //^075F:0D05
33858 :               if (((si >= si.FF83) ? 1 : 0) != 0) {
33859 :                 //^075F:0D42
33860 :                 return 0;
33861 :               }
33862 :             }
33863 :             //^075F:0D13
33864 :             if (((bp08->b5 < (RAND() & 0x007f)) && (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 2) != 0) ? 1 : 0) {
33865 :               //^075F:0D42
33866 :               return 0;
33867 :             }
33868 :           }
33869 :           //^075F:0D47
33870 :           Bit16u bp16 = _075f_06bd(bp08, si) +1;
33871 :           //^075F:0D59
33872 :           _075f_2205(xpos, ypos, bp16 + RAND16(bp16), 0, 0);
33873 :           //^075F:0D7A
33874 :           break;
33875 :         }
33876 :       case -3:
33877 :       case -2:
33878 :         {
33879 :           //^075F:0D7D
33880 :           __int16 bp12 = GET_PLAYER_AT_POSITION(ss);
33881 :           //^075F:0D89
33882 :           if (bp12 < 0) {
33883 :             //^075F:0D8D
33884 :             if (ww == -3) {
33885 :               //^075F:0D93
33886 :               goto _0e37;
33887 :             }
33888 :             //^075F:0D96
33889 :             //^075F:0D42
33890 :             return 0;
33891 :           }
33892 :           //^075F:0D98
33893 :           bp36 = 1;
33894 :           //^075F:0D9D
33895 :           bp16 = _075f_06bd(bp08, si);
33896 :           //^075F:0DAE
33897 :           if (bp16 != 0) {
33898 :             //^075F:0DB2
33899 :             if ((((_4976_53b4[bp12].playerDir() == (_4976_5c20[bp08->TimerIndex()].b9_2_3() +2)) ? 1 : 0) & 3) != 0) {
33900 :               //^075F:0DF2
33901 :               _4976_4b7a |= 0x8000;
33902 :             }
33903 :             //^075F:0DF8
33904 :             if (_2c1d_18aa(bp12, bp16, 0, _4976_4b7a) != 0 && _4976_4b7c != 0 && RAND01() != 0) {
33905 :               //^075F:0E20
33906 :               _2c1d_1b0f(bp12, _4976_4b7c);
33907 :             }
33908 :           }
33909 :           //^075F:0E2E
33910 :           if (ww == -2) {
33911 :             //^075F:0E34
33912 :             break;
33913 :           }
33914 : 
33915 :           goto _0e37;
33916 :         }
33917 :       case -1:
33918 :         {
33919 :           //^075F:0E37
33920 : _0e37:
33921 :           bp38 = xpos;
33922 :           bp3a = ypos;
33923 :           //^075F:0E43
33924 :           ObjectID bp2e = _1c9a_03cf(&bp38, &bp3a, ss);
33925 :           //^075F:0E5B
33926 :           if (bp2e == -1) {
33927 :             //^075F:0E60
33928 :             if (ww == -3)
33929 :               //^075F:0E66
33930 :               break;
33931 :             //^075F:0E69
33932 :             //^075F:0D42
33933 :             return 0;
33934 :           }
33935 :           //^075F:0E6C
33936 :           if (_1c9a_0958(bp2e) != 0) {
33937 :             //^075F:0E79
33938 :             if (ww == -3)
33939 :               //^075F:0E7F
33940 :               break;
33941 :             //^075F:0E82
33942 :             //^075F:0D42
33943 :             return 0;
33944 :           }
33945 :           //^075F:0E85
33946 :           Creature *bp04 = GET_ADDRESS_OF_RECORD(bp2e)->castToCreature();
33947 :           //^075F:0E94
33948 :           sk03a2 *bp0c = QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp04->CreatureType());
33949 :           //^075F:0EA8
33950 :           if ((bp0c->w0 & 0x0020) != 0 && si != si.FF83) {
33951 :             //^075F:0EB7
33952 :             if (ww == -3)
33953 :               //^075F:0EBD
33954 :               break;
33955 :             //^075F:0EC0
33956 :             //^075F:0D42
33957 :             return 0;
33958 :           }
33959 :           //^075F:0EC3
33960 :           if ((bp0c->w0 & 0x0001) == 0) {
33961 :             //^075F:0ECD
33962 :             if (bp0c->b29 != 255) {
33963 :               //^075F:0ED4
33964 :               goto _0f82;
33965 :             }
33966 :             else {
33967 :               //^075F:0ED7
33968 :               goto _0f11;
33969 :             }
33970 :           }
33971 :           //^075F:0ED9
33972 :           if ((bp0c->w30 & 0x0100) != 0 && si < si.FF80) {
33973 :             //^075F:0EE7
33974 :             //^075F:0EFA
33975 :             if (ww == -3)
33976 :               //^075F:0F00
33977 :               break;
33978 :             //^075F:0F03
33979 :             //^075F:0D42
33980 :             return 0;
33981 :           }
33982 :           //^075F:0EE9
33983 :           if (bp0c->w0_6_7() > 1) {
33984 :             //^075F:0EFA
33985 :             if (ww == -3)
33986 :               //^075F:0F00
33987 :               break;
33988 :             //^075F:0F03
33989 :             //^075F:0D42
33990 :             return 0;
33991 :           }
33992 :           //^075F:0F06
33993 :           if ((bp0c->w30 & 0x0800) == 0) {
33994 :             //^075F:0F11
33995 : _0f11:
33996 :             Bit16u di = _4976_5c20[bp08->TimerIndex()].b9_2_3();
33997 :             //^075F:0F2F
33998 :             di = (di +2) &3;
33999 :             //^075F:0F36
34000 :             bp30 += _4976_0232[di];
34001 :             //^075F:0F41
34002 :             bp32 += _4976_023a[di];
34003 :             //^075F:0F4C
34004 :             Bit16u bp34 = recordLink.Dir();
34005 :             //^075F:0F55
34006 :             if ((di & 1) == (bp34 & 1)) {
34007 :               //^075F:0F65
34008 :               bp34--;
34009 :             }
34010 :             else {
34011 :               //^075F:0F6A
34012 :               bp34++;
34013 :             }
34014 :             //^075F:0F6D
34015 :             recordLink.Dir(bp34);
34016 :           }
34017 :           //^075F:0F82
34018 : _0f82:
34019 :           bp16 = (_075f_06bd(bp08, si) << 6) / bp0c->b2;
34020 :           //^075F:0FA7
34021 :           if (bp16 != 0) {
34022 :             //^075F:0FAB
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 :             //^075F:0FED
34032 :             if (bp26 == 0 && (bp0c->w0 & 0x0200) != 0) {
34033 :               //^075F:0FFD
34034 :               if ((QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0) & 0x0040) != 0) {
34035 :                 //^075F:100C
34036 :                 bp10 = &bp04->w2;
34037 :               }
34038 :             }
34039 :           }
34040 :           //^075F:101A
34041 :           if (bp2a == 0 && bp2c != 5) {
34042 :             //^075F:1026
34043 :             if (false
34044 :               || bp2c != 15
34045 :               || si == si.FF84
34046 :               || (si >= si.FF89 && si <= si.FF8E)
34047 :             ) {
34048 :               //^075F:1039
34049 :               //^075F:1064
34050 :               bp36 = 1;
34051 :               break;
34052 :             }
34053 :           }
34054 :           //^075F:103B
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 :         //^075F:1069
34070 :         break;
34071 :     }
34072 :     //^075F:1069
34073 :     if (ww == -3 && bp36 == 0) {
34074 :       //^075F:0D42
34075 :       return 0;
34076 :     }
34077 :     //^075F:1078
34078 :     if (bp26 == 0 && bp2a == 0 && si != si.FF86)
34079 :       //^075F:1089
34080 :       goto _113b;
34081 : 
34082 :     //^075F:108C
34083 :     Bit16u bp14;
34084 :     if (bp2a != 0) {
34085 :       //^075F:1092
34086 :       bp14 = bp28;
34087 :       DEALLOC_RECORD(bp1e);
34088 :       //^075F:10A1
34089 :       bp08->SetMissileObject(si = bp20);
34090 :     }
34091 :     else {
34092 :       //^075F:10AF
34093 :       bp14 = bp08->EnergyRemaining();
34094 :       //^075F:10BB
34095 :       if (si == si.FF86) {
34096 :         //^075F:10C0
34097 :         bp14 >>= 2;
34098 :         //^075F:10C4
34099 :         if (bp14 == 0)
34100 :           //^075F:10C9
34101 :           goto _113b;
34102 :       }
34103 :       //^075F:10CB
34104 :       if (si == si.FF82) {
34105 :         //^075F:10D0
34106 :       }
34107 :     }
34108 :     //^075F:10DA
34109 :     Bit16u di;
34110 :     if (si == si.FF89 || si == si.FF8A) {
34111 :       //^075F:10E8
34112 :       di = _4976_5c20[bp08->TimerIndex()].b9_2_3();
34113 :       //^075F:1106
34114 :       bp1c = bp08->EnergyRemaining();
34115 :     }
34116 :     //^075F:1112
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 :     //^075F:113B
34125 : _113b:
34126 :     CUT_RECORD_FROM(recordLink, NULL, bp22, bp24);
34127 :     //^075F:1150
34128 :     DELETE_MISSILE_RECORD(recordLink, bp10, bp30, bp32);
34129 :     //^075F:1166
34130 :     if (bp1c != 0) {
34131 :       //^075F:116C
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 :     //^075F:11A3
34140 :     return 1;
34141 :   }
34142 : 
34143 :   //^2FCF:0234
34144 :   void _2fcf_0234(__int16 xposFrom, __int16 yposFrom, __int16 xposTo, __int16 yposTo)
34145 :   {
34146 :     //^2FCF:0234
34147 :     //^2FCF:023A
34148 :     Bit16u bp04 = 0;
34149 :     //^2FCF:023F
34150 :     Bit8u bp10[4];
34151 :     ZERO_MEMORY(&bp10, 4);
34152 :     //^2FCF:0250
34153 :     Bit16u bp02;
34154 :     for (bp02=0; bp02 < 4; bp02++) {
34155 :       //^2FCF:0257
34156 :       if (GET_PLAYER_AT_POSITION(bp02) >= 0) {
34157 :         //^2FCF:0264
34158 :         bp10[bp02] = bp02 +1;
34159 :       }
34160 :       //^2FCF:0274
34161 :     }
34162 :     //^2FCF:027D
34163 :     Bit8u bp0c[4];
34164 :     if (xposTo >= 0 && CALC_SQUARE_DISTANCE(xposFrom, yposFrom, xposTo, yposTo) == 1) {
34165 :       //^2FCF:02A2
34166 :       bp02 = CALC_VECTOR_DIR(xposFrom, yposFrom, xposTo, yposTo);
34167 :       //^2FCF:02B9
34168 :       Bit16u di = (bp02 +1) & 3;
34169 :       //^2FCF:02BF
34170 :       ZERO_MEMORY(&bp0c, 4);
34171 :       //^2FCF:02D0
34172 :       if ((bp0c[(bp02 +3) &3] = bp10[bp02]) != 0) {
34173 :         //^2FCF:02F3
34174 :         bp04 = 1;
34175 :       }
34176 :       //^2FCF:02F8
34177 :       if ((bp0c[(di +1) &3] = bp10[di]) != 0) {
34178 :         //^2FCF:030E
34179 :         bp04 = 1;
34180 :       }
34181 :       //^2FCF:0313
34182 :       if (bp10[bp02] == 0) {
34183 :         //^2FCF:0324
34184 :         bp10[bp02] = bp10[((bp02 +3) &3)];
34185 :       }
34186 :       //^2FCF:0341
34187 :       if (bp10[di] == 0) {
34188 :         //^2FCF:034A
34189 :         bp10[di] = bp10[(di +1) &3];
34190 :       }
34191 :     }
34192 :     //^2FCF:035C
34193 :     __int16 bp06 = xposFrom;
34194 :     __int16 bp08 = yposFrom;
34195 : 
34196 :     //^2FCF:0368
34197 :     while (true) {
34198 :       //^2FCF:0368
34199 : _0368:
34200 :       ObjectID si = GET_TILE_RECORD_LINK(bp06, bp08);
34201 :       //^2FCF:0375
34202 :       for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
34203 :         //^2FCF:0377
34204 :         if (si.DBType() == dbMissile) {
34205 :           //^2FCF:0384
34206 :           if (_4976_5c20[GET_ADDRESS_OF_RECORD(si)->castToMissile()->TimerIndex()].TimerType() != 29) {
34207 :             //^2FCF:03A5
34208 :             bp02 = bp10[si.Dir()];
34209 :             //^2FCF:03B7
34210 :             if (bp02 != 0) {
34211 :               //^2FCF:03BB
34212 :               if (_075f_0af9(-3, xposFrom, yposFrom, bp02, si) != 0) {
34213 :                 //^2FCF:03D2
34214 :                 _075f_056c(si);
34215 :                 //^2FCF:03D9
34216 :                 goto _0368;
34217 :               }
34218 :             }
34219 :           }
34220 :         }
34221 :         //^2FCF:03DB
34222 :       }
34223 :       //^2FCF:03E9
34224 :       if (bp04 == 0) {
34225 :         //^2FCF:03ED
34226 :         break;
34227 :       }
34228 :       //^2FCF:03EF
34229 :       xposFrom |= ((bp06 = xposTo) +1) << 8;
34230 :       //^2FCF:0401
34231 :       yposFrom |= ((bp08 = yposTo)) << 8;
34232 :       //^2FCF:0412
34233 :       COPY_MEMORY(bp0c, bp10, 4);
34234 :       //^2FCF:0428
34235 :       bp04 = 0;
34236 :       //^2FCF:042D
34237 :       continue;
34238 :     }
34239 :     //^2FCF:0430
34240 :     return;
34241 :   }
34242 : 
34243 :   //^2FCF:013C
34244 :   void SET_MINION_RECENT_OPEN_DOOR_LOCATION(ObjectID recordLink, __int16 xpos, __int16 ypos, Bit16u curmap, Bit16u ww)
34245 :   {
34246 :     //^2FCF:013C
34247 :     //^2FCF:0141
34248 :     ObjectID si = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature()->w2;
34249 :     //^2FCF:0152
34250 :     for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
34251 :       //^2FCF:0154
34252 :       if (si.DBType() == dbMissile) {
34253 :         //^2FCF:0161
34254 :         Missile *bp04 = GET_ADDRESS_OF_RECORD(si)->castToMissile();
34255 :         //^2FCF:016E
34256 :         bp04->SetX(xpos);
34257 :         bp04->SetY(ypos);
34258 :         bp04->SetMap(curmap);
34259 :         bp04->b6_0_0(ww);
34260 :       }
34261 :       //^2FCF:01B4
34262 :     }
34263 :     //^2FCF:01C2
34264 :     return;
34265 :   }
34266 : 
34267 :   //^1C9A:0DB0
34268 :   void _1c9a_0db0(ObjectID recordLink)
34269 :   {
34270 :     //^1C9A:0DB0
34271 :     //^1C9A:0DB5
34272 :     if (recordLink.DBType() == dbCreature) {
34273 :       //^1C9A:0DC3
34274 :       Bit8u bp01 = GET_ADDRESS_OF_RECORD(recordLink)->castToCreature()->b5_0_7();
34275 :       //^1C9A:0DD7
34276 :       if (bp01 != 0xff) {
34277 :         //^1C9A:0DDD
34278 :         __int16 si = _4976_4ebe[bp01].w2;
34279 :         //^1C9A:0DF0
34280 :         if (si >= 0) {
34281 :           //^1C9A:0DF4
34282 :           _3a15_061a(si);
34283 :           //^1C9A:0DFB
34284 :           _4976_4ebe[bp01].w2 = 0xffff;
34285 :         }
34286 :       }
34287 :     }
34288 :     //^1C9A:0E11
34289 :     return;
34290 :   }
34291 : 
34292 :   //^0CD5:00FE
34293 :   Bit16u RAND16(Bit16u maxcnt)
34294 :   {
34295 :     // CSBwinSimilarity: STRandom
34296 : 
34297 :     //^0CD5:00FE
34298 :     //^0CD5:0101
34299 :     if (maxcnt == 0)
34300 :       //^0CD5:0107
34301 :       return 0;
34302 :     //^0CD5:010B
34303 :     return RAND() % maxcnt;
34304 :   }
34305 : 
34306 :   //^0CEE:2E1E
34307 :   Bit16u _0cee_2e1e(Bit16u recordLink)
34308 :   {
34309 :     //^0CEE:2E1E
34310 :     //^0CEE:2E21
34311 :     return QUERY_CREATURE_AI_SPEC_FROM_RECORD(recordLink)->b29;
34312 :   }
34313 : 
34314 :   //^1C9A:0FCB
34315 :   void _1c9a_0fcb(Bit16u xx)
34316 :   {
34317 :     //^1C9A:0FCB
34318 :     //^1C9A:0FD1
34319 :     Bit16u di = xx;
34320 :     //^1C9A:0FD4
34321 :     if (di <= _4976_4ec2) {
34322 :       //^1C9A:0FDA
34323 :       sk4ebe *bp04 = &_4976_4ebe[di];
34324 :       //^1C9A:1004
34325 :       Bit16u si = 0x1000 | bp04->w0;
34326 :       //^1C9A:100F
34327 :       Creature *bp08 = GET_ADDRESS_OF_RECORD(si)->castToCreature();
34328 :       //^1C9A:101C
34329 :       _1c9a_0db0(si);
34330 :       //^1C9A:1022
34331 :       _4976_1a68--;
34332 :       //^1C9A:1026
34333 :       bp08->b5_0_7(0xff);
34334 :       bp08->w0 = 0xffff;
34335 :     }
34336 :     //^1C9A:1036
34337 :   }
34338 : 
34339 :   //^0CEE:00CD
34340 :   void LOAD_LOCALLEVEL_GRAPHICS_TABLE(Bit16u curmap) //#DS=4976?
34341 :   {
34342 :     //^0CEE:00CD
34343 :     //^0CEE:00D3
34344 :     CHANGE_CURRENT_MAP_TO(_4976_4bf4 = curmap);
34345 :     //^0CEE:00DF
34346 :     Bit8u *bp04 = (_4976_4cac = &_4976_4c78[_4976_4dd2 -1][_4976_4dd4]);
34347 :     //^0CEE:0107
34348 :     Bit16u si = _4976_4d0a->WallGraphics();
34349 :     //^0CEE:0114
34350 :     COPY_MEMORY(
34351 :       bp04 += _4976_4d0a->CreaturesTypes(), 
34352 :       _4976_4dc2,
34353 :       si
34354 :       );
34355 :     //^0CEE:0137
34356 :     Bit16u di = _4976_4d0a->FloorGraphics();
34357 :     //^0CEE:0144
34358 :     COPY_MEMORY(
34359 :       bp04 += si,
34360 :       _4976_4cba,
34361 :       di
34362 :       );
34363 :     //^0CEE:015D
34364 :     COPY_MEMORY(
34365 :       bp04 += di,
34366 :       _4976_4c60,
34367 :       _4976_4d0a->DoorDecorationGraphics()
34368 :       );
34369 :     //^0CEE:0180
34370 :     return;
34371 :   }
34372 : 
34373 :   //^1C9A:0397
34374 :   ObjectID GET_CREATURE_AT(__int16 xpos, __int16 ypos)
34375 :   {
34376 :     // find a creature at (xpos,ypos).
34377 :     //
34378 :     // return ObjectID::FFFF if no creature found.
34379 : 
34380 :     //^1C9A:0397
34381 :     //^1C9A:039B
34382 :     ObjectID si = GET_TILE_RECORD_LINK(xpos, ypos);
34383 :     //^1C9A:03A8
34384 :     for (; si != si.FFFE; si = GET_NEXT_RECORD_LINK(si)) {
34385 :       //^1C9A:03AA
34386 :       if (si.DBType() == dbCreature)
34387 :         //^1C9A:03B7
34388 :         return si;
34389 :       //^1C9A:03BB
34390 :     }
34391 :     //^1C9A:03C9
34392 :     return si.FFFF;
34393 :   }
34394 : 
34395 : 
34396 :   //^0CEE:2E53
34397 :   Bit16u IS_CREATURE_ALLOWED_ON_LEVEL(Bit16u recordLink, Bit16u curmap)
34398 :   {
34399 :     //^0CEE:2E53
34400 :     //^0CEE:2E59
34401 :     if ((_0cee_2de0(recordLink) & 0x4000) != 0) {
34402 :       //^0CEE:2E66
34403 :       return 1;
34404 :     }
34405 :     //^0CEE:2E6C
34406 :     Bit8u bp09 = QUERY_CLS2_FROM_RECORD(recordLink);
34407 :     //^0CEE:2E77
34408 :     Map_definitions *bp08 = &_4976_4dba[curmap];
34409 :     //^0CEE:2E8D
34410 :     Bit8u *bp04 = &_4976_4ca8[curmap][bp08->RawColumn()][bp08->RawRow() +1];
34411 :     //^0CEE:2ECE
34412 :     __int16 si = bp08->CreaturesTypes();
34413 :     //^0CEE:2EDD
34414 :     for (; si > 0; --si) {
34415 :       //^0CEE:2EDF
34416 :       if (*(bp04++) == bp09)
34417 :         return 1;
34418 :       //^0CEE:2EF0
34419 :     }
34420 :     //^0CEE:2EF5
34421 :     return 0;
34422 :     //^0CEE:2EF7
34423 :   }
34424 : 
34425 :   //^2FCF:0DD5
34426 :   Bit16u MOVE_RECORD_TO(ObjectID rlWhatYouMove, __int16 xposFrom, __int16 yposFrom, __int16 xposTo, __int16 yposTo) //#DS=4976?
34427 :   {
34428 :     // CSBwinSimilarity: TAG011f52,MoveObject
34429 : 
34430 :     // in CSBwin, similar to TAG011f52,MoveObject
34431 :     // place battle prize?
34432 : 
34433 :     // place an object to tile. or take an object from tile. the target can be floor/wall/alcove/creature/missile.
34434 :     // you can move creatures/missiles too.
34435 :     //
34436 :     // rlWhatYouMove: an object what you wanna move. this also includes new tile position.
34437 :     //
34438 :     // a) player [takes] an object at [creature]
34439 :     //    xposFrom=xx, yposFrom=yy, xposTo=[-1], yposTo=[-1]
34440 :     // b) player [takes] an object at [alcove/floor]
34441 :     //    xposFrom=xx, yposFrom=yy, xposTo=[-1], yposTo=[ 0]
34442 :     //
34443 :     // c) player [places] an object to [creature]
34444 :     //    xposFrom=[-1], yposFrom=[-1], xposTo=xx, yposTo=yy
34445 :     // d) player [places] an object to [alcove/floor]
34446 :         //    xposFrom=[-1], yposFrom=[ 0], xposTo=xx, yposTo=yy
34447 :     //
34448 :     // e) if player surely moves (not called if run to wall)
34449 :     //    xposFrom=[old xpos], yposFrom=[old ypos], xposTo=[new xpos], yposTo=[new ypos], rlWhatYouMove=0xFFFF
34450 :     //
34451 :     // f) if an item in missile drops
34452 :     //    xposFrom=[-2], yposFrom=[ 0], xposTo=[xpos], yposTo=[ypos], rlWhatYouMove=[an flying item such as gold coin]
34453 :     // g) if an item injects to creature
34454 :     //    xposFrom=[xpos], yposFrom=[ypos], xposTo=[-2], yposTo=[ 0], rlWhatYouMove=[an flying item such as gold coin]
34455 :     //
34456 :     // h) to generate creature,
34457 :     //    xposFrom=[-4], yposFrom=[ 0], xposTo=[xpos], yposTo=[ypos], rlWhatYouMove=[creature]
34458 :     // i) to kill creature,
34459 :     //    xposFrom=[xpos], yposFrom=[ypos], xposTo=[-4], yposTo=[ 0], rlWhatYouMove=[creature]
34460 : 
34461 :     //^2FCF:0DD5
34462 :     //^2FCF:0DDB
34463 :     ObjectID si = rlWhatYouMove;
34464 :     _4976_5822 = 0;
34465 :     Bit16u bp10 = 0;
34466 :     Bit16u bp12 = 0;
34467 :     Bit16u bp08 = _4976_0c5a; // current mapno
34468 :     Bit16u bp0c = _4976_4bf6; // current player dir
34469 :     Bit16u bp1a = 0;
34470 :     //^2FCF:0DFA
34471 :     Bit16u bp0a;
34472 :     Bit16u bp0e;
34473 :     GenericRecord *bp04;
34474 :     if (si == si.FFFF) {
34475 :       //^2FCF:0DFF
34476 :       _4976_4cb8 = 1;
34477 :       bp0a = 0xffff;
34478 :       //^2FCF:0E0A
34479 :       if (xposFrom >= 0) {
34480 :         //^2FCF:0E10
34481 :         _2fcf_0234(xposFrom, yposFrom, xposTo, yposTo);
34482 :       }
34483 :     }
34484 :     else {
34485 :       //^2FCF:0E25
34486 :       bp0a = si.DBType();
34487 :       //^2FCF:0E30
34488 :       if (bp0a == dbCreature) {
34489 :         //^2FCF:0E35
34490 :         bp04 = GET_ADDRESS_OF_RECORD(si);
34491 :       }
34492 :       //^2FCF:0E42
34493 :       bp0e = si.Dir();
34494 :     }
34495 :     //^2FCF:0E4A
34496 :     Bit16u bp1e;
34497 :     Bit16u di;
34498 :     if (xposTo < 0) {
34499 :       //^2FCF:0E53
34500 :       bp10 = _2fcf_0434(si, xposFrom, yposFrom, xposTo, yposTo, 1);
34501 :       //^2FCF:0E6C
34502 :       if (bp10 != 0xffff) {
34503 :         //^2FCF:0E71
34504 :         if (QUERY_GDAT_DBSPEC_WORD_VALUE(si, 0xf8) != 0) {
34505 :           //^2FCF:0E80
34506 :           if (bp08 == _4976_4bf4 || _4976_581c == _4976_4bf4) {
34507 :             //^2FCF:0E92
34508 :             _4976_4cb8 = 1;
34509 :           }
34510 :         }
34511 :         //^2FCF:0E98
34512 :         si = si & 0x3fff | (_4976_5820 << 14);
34513 :       }
34514 :       //^2FCF:0EA8
34515 :       xposTo = _4976_5826;
34516 :       yposTo = _4976_5828;
34517 :       bp1e = _4976_581e;
34518 :       di = _4976_581c;
34519 :       //^2FCF:0EBF
34520 :       CHANGE_CURRENT_MAP_TO(di);
34521 :       //^2FCF:0EC6
34522 :       if (bp0a == dbCreature && IS_CREATURE_ALLOWED_ON_LEVEL(si, di) == 0) {
34523 :         //^2FCF:0ED9
34524 :         _1c9a_1374(si, xposTo, yposTo, 0, 1);
34525 :         //^2FCF:0EEC
34526 :         CHANGE_CURRENT_MAP_TO(bp08);
34527 :         //^2FCF:0EF5
34528 :         if (xposFrom >= 0) {
34529 :           //^2FCF:0EFB
34530 :           DELETE_CREATURE_RECORD(xposFrom, yposFrom, 2, 0xffff);
34531 :         }
34532 :         //^2FCF:0F0D
34533 :         return 1;
34534 :       }
34535 :       //^2FCF:0F13
34536 :       bp12 = (di == bp08 && xposTo == xposFrom && yposTo == yposFrom) ? 1 : 0;
34537 :       //^2FCF:0F32
34538 :       if (bp12 != 0) {
34539 :         //^2FCF:0F38
34540 :         if (si == 0xffff) {
34541 :           //^2FCF:0F3D
34542 :           if (_4976_4bf6 == bp0c) {
34543 :             //^2FCF:0F45
34544 :             goto _1562;
34545 :           }
34546 :         }
34547 :         else {
34548 :           //^2FCF:0F48
34549 :           if (_4976_5820 == bp0e && bp0a != dbMissile) {
34550 :             //^2FCF:0F56
34551 :             goto _1562;
34552 :           }
34553 :         }
34554 :       }
34555 :       else {
34556 :         //^2FCF:0F59
34557 :         if (di != bp08) {
34558 :           //^2FCF:0F5E
34559 :           if (si == 0xffff && _4976_4bf4 != bp08) {
34560 :             //^2FCF:0F6B
34561 :             LOAD_LOCALLEVEL_GRAPHICS_TABLE(bp08);
34562 :           }
34563 :           else {
34564 :             //^2FCF:0F75
34565 :             CHANGE_CURRENT_MAP_TO(bp08);
34566 :           }
34567 :         }
34568 :       }
34569 :     }
34570 :     //^2FCF:0F7E
34571 :     if (xposFrom >= 0) {
34572 :       //^2FCF:0F87
34573 :       if (si == si.FFFF) {
34574 :         //^2FCF:0F8C
34575 :         _2fcf_2444(xposFrom, yposFrom, -1, bp12, 0, 0);
34576 :       }
34577 :       else {
34578 :         //^2FCF:0FA6
34579 :         if (bp10 != 0) {
34580 :           //^2FCF:0FAC
34581 :           CUT_RECORD_FROM(si, NULL, xposFrom, yposFrom);
34582 :         }
34583 :         else {
34584 :           //^2FCF:0FC1
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 :         //^2FCF:1009
34595 :         if (bp0a == dbCreature && xposTo < -1) {
34596 :           //^2FCF:1015
34597 :           Bit16u bp06 = bp04->castToCreature()->b5_0_7();
34598 :           //^2FCF:1021
34599 :           if (bp06 != 255) {
34600 :             //^2FCF:1026
34601 :             _1c9a_0fcb(bp06);
34602 :           }
34603 :         }
34604 :       }
34605 :     }
34606 :     //^2FCF:102F
34607 :     __int16 bp16, bp18;
34608 :     if (xposTo >= 0) {
34609 :       //^2FCF:1038
34610 :       if (si == si.FFFF) {
34611 :         //^2FCF:1040
34612 :         CHANGE_CURRENT_MAP_TO(di);
34613 :         //^2FCF:1047
34614 :         _2fcf_0b8b(xposTo, yposTo, di);
34615 :         //^2FCF:1055
34616 :         si = GET_CREATURE_AT(_4976_4bfa, _4976_4c06);
34617 :         //^2FCF:1066
34618 :         if (si != si.FFFF) {
34619 :           //^2FCF:106E
34620 :           Bit16u bp20 = _0cee_2de0(si);
34621 :           //^2FCF:1078
34622 :           if ((bp20 & 0x8000) == 0) {
34623 :             //^2FCF:1080
34624 :             if ((bp20 & 0x0001) != 0 && _0cee_2e1e(si) == 255) {
34625 :               //^2FCF:1093
34626 :               if (_2fcf_0cdf(0xffff, xposTo, yposTo, &bp16, &bp18) != 0) {
34627 :                 //^2FCF:10B3
34628 :                 LOAD_LOCALLEVEL_GRAPHICS_TABLE(di);
34629 :                 //^2FCF:10BA
34630 :                 _4976_0230 = di;
34631 :                 //^2FCF:10BE
34632 :                 MOVE_RECORD_TO(0xffff, -1, 0, bp16, bp18);
34633 :                 //^2FCF:10D1
34634 :                 LOAD_LOCALLEVEL_GRAPHICS_TABLE(bp08);
34635 :                 //^2FCF:10DA
34636 :                 if (_4976_0230 == bp08) {
34637 :                   //^2FCF:10E5
34638 :                   _4976_0230 = 0xffff;
34639 :                   //^2FCF:10EB
34640 :                   goto _1183;
34641 :                 }
34642 :                 else {
34643 :                   //^2FCF:10E2
34644 :                   goto _1562;
34645 :                 }
34646 :               }
34647 :               else {
34648 :                 //^2FCF:10B0
34649 :                 goto _1151;
34650 :               }
34651 :             }
34652 :             //^2FCF:10EE
34653 :             if (_2fcf_0cdf(si, xposTo, yposTo, &bp16, &bp18) != 0) {
34654 :               //^2FCF:110A
34655 :               bp1a = _2c1d_201d() >> 2;
34656 :               //^2FCF:1115
34657 :               bp1a += RAND16((bp1a >> 1) +1);
34658 :               //^2FCF:1127
34659 :               _13e4_0401(si, xposTo, yposTo, 0x2000, 0x0000, bp1a);
34660 :               //^2FCF:113E
34661 :               MOVE_RECORD_TO(si, xposTo, yposTo, bp16, bp18);
34662 :               //^2FCF:114F
34663 :               goto _1183;
34664 :             }
34665 :             //^2FCF:1108
34666 :             goto _1151;
34667 :           }
34668 :         }
34669 :         //^2FCF:106B
34670 :         goto _1183;
34671 :       }
34672 :       //^2FCF:103D
34673 :       goto _11a3;
34674 :     }
34675 : 
34676 :     //^2FCF:1151
34677 : _1151:
34678 :     _1c9a_0db0(si);
34679 :     //^2FCF:1158
34680 :     if (MOVE_RECORD_TO(si, _4976_4bfa, _4976_4c06, -3, 0) == 0) {
34681 :       //^2FCF:1170
34682 :       _2fcf_01c5(si, _4976_4bfa, _4976_4c06, di, 0);
34683 :     }
34684 : 
34685 :     //^2FCF:1183
34686 : _1183:
34687 :     if (di == bp08) {
34688 :       //^2FCF:1188
34689 :       //^2FCF:1199
34690 :       //^2FCF:155A
34691 :       _2fcf_2444(_4976_4bfa, _4976_4c06, 0xffff, bp12, 1, 0);
34692 :     }
34693 :     else {
34694 :       //^2FCF:119C
34695 :       _4976_0230 = di;
34696 :       //^2FCF:11A0
34697 :     }
34698 :     goto _1562;
34699 : 
34700 :     //^2FCF:11A3
34701 : _11a3:
34702 :     if (bp0a == dbCreature) {
34703 :       //^2FCF:11AC
34704 :       CHANGE_CURRENT_MAP_TO(di);
34705 :       //^2FCF:11B3
34706 :       Bit16u bp06 = bp04->castToCreature()->b5_0_7();
34707 :       //^2FCF:11BF
34708 :       if (di == _4976_4c28 && xposTo == _4976_4c2e && yposTo == _4976_4c30) {
34709 :         //^2FCF:11E0
34710 :         if ((_0cee_2de0(si) & 0x8000) == 0) {
34711 :           //^2FCF:11EC
34712 :           if (_2fcf_0cdf(0xffff, xposTo, yposTo, &bp16, &bp18) != 0) {
34713 :             //^2FCF:120C
34714 :             bp1a = (_0cee_2e1e(si) >> 3) + RAND16(10);
34715 :             //^2FCF:1225
34716 :             _2c1d_1c0c(bp1a, 4, 2);
34717 :             //^2FCF:1234
34718 :             QUEUE_NOISE_GEN2(0x16, 0xfe, 0x8a, 0xfe, xposTo, yposTo, 1, 100, 200);
34719 :             //^2FCF:1254
34720 :             MOVE_RECORD_TO(0xffff, xposTo, yposTo, bp16, bp18);
34721 :           }
34722 :           else {
34723 :             //^2FCF:1209
34724 :             goto _13a5;
34725 :           }
34726 :         }
34727 :         //^2FCF:1269
34728 :         Bit16u bp1c = GET_CREATURE_AT(xposTo, yposTo);
34729 :         //^2FCF:1279
34730 :         Bit16u bp22;
34731 :         if (bp1c != 0xffff) {
34732 :           //^2FCF:1281
34733 :           bp22 = _0cee_2e1e(si);
34734 :           //^2FCF:128B
34735 :           Bit16u bp20 = _0cee_2de0(bp1c);
34736 :           //^2FCF:1297
34737 :           if (_0cee_2de0(si) != 0 && bp22 == 255) {
34738 :             //^2FCF:12AA
34739 :             if ((bp20 & 0x0001) != 0) {
34740 :               //^2FCF:12B1
34741 :               if (_0cee_2e1e(bp1c) == 255) {
34742 :                 //^2FCF:12BF
34743 :                 goto _13a5;
34744 :               }
34745 :             }
34746 :             //^2FCF:12C2
34747 :             if (_2fcf_0cdf(bp1c, xposTo, yposTo, &bp16, &bp18) == 0) {
34748 :               //^2FCF:12E0
34749 :               _1c9a_0db0(si);
34750 :               //^2FCF:12E7
34751 :               _2fcf_01c5(si, xposTo, yposTo, di, 0);
34752 :               //^2FCF:12F5
34753 :               goto _1562;
34754 :             }
34755 :             else {
34756 :               //^2FCF:12DE
34757 :               goto _1359;
34758 :             }
34759 :           }
34760 :           //^2FCF:12F8
34761 :           if ((bp20 & 1) != 0 && _0cee_2e1e(bp1c) == 255) {
34762 :             //^2FCF:130D
34763 :             if (_2fcf_0cdf(si, xposTo, yposTo, &bp16, &bp18) == 0)
34764 :               //^2FCF:1327
34765 :               goto _13a5;
34766 :             //^2FCF:1329
34767 :             MOVE_RECORD_TO(si, -1, 0, bp16, bp18);
34768 :             //^2FCF:1338
34769 :             goto _1562;
34770 :           }
34771 :           else {
34772 :             //^2FCF:133B
34773 :             if (_2fcf_0cdf(bp1c, xposTo, yposTo, &bp16, &bp18) == 0)
34774 :               //^2FCF:1357
34775 :               goto _13a5;
34776 : 
34777 :             goto _1359;
34778 :           }
34779 :         }
34780 :         else {
34781 :           //^2FCF:127E
34782 :           goto _13ce;
34783 :         }
34784 : 
34785 :         //^2FCF:1359
34786 : _1359:
34787 :         {
34788 :           bp1a = bp22 >> 2;
34789 :           //^2FCF:1362
34790 :           bp1a += RAND16((bp1a >> 1) +1);
34791 :           //^2FCF:1374
34792 :           _13e4_0401(bp1c, xposTo, yposTo, 0x2000, 0, bp1a);
34793 :           //^2FCF:138D
34794 :           MOVE_RECORD_TO(bp1c, xposTo, yposTo, bp16, bp18);
34795 :           //^2FCF:13A3
34796 :           goto _13ce;
34797 :         }
34798 : 
34799 :         //^2FCF:13A5
34800 : _13a5:
34801 :         {
34802 :           if (bp06 != 255) {
34803 :             //^2FCF:13AC
34804 :             _1c9a_0fcb(bp06);
34805 :           }
34806 :           //^2FCF:13B5
34807 :           _2fcf_01c5(si, xposTo, yposTo, di, _4976_5822);
34808 :           //^2FCF:13CB
34809 :           return 2;
34810 :         }
34811 : 
34812 :         //^2FCF:13CE
34813 : _13ce:
34814 :         {
34815 :           if (bp10 != 0) {
34816 :             //^2FCF:13D4
34817 :             APPEND_RECORD_TO(si, NULL, xposTo, yposTo);
34818 :           }
34819 :           else {
34820 :             //^2FCF:13E9
34821 :             _2fcf_2444(xposTo, yposTo, si, 0, 0, 0);
34822 :           }
34823 :           //^2FCF:13FE
34824 :           SET_MINION_RECENT_OPEN_DOOR_LOCATION(si, xposTo, yposTo, di, 0);
34825 :           //^2FCF:140F
34826 :           if (bp06 == 255) {
34827 :             //^2FCF:1416
34828 :             if ((_0cee_2de0(si) & 1) == 0) {
34829 :               //^2FCF:1425
34830 :               _1c9a_0e14(si, xposTo, yposTo);
34831 :               //^2FCF:1434
34832 :             }
34833 :           }
34834 :           else {
34835 :             //^2FCF:1437
34836 :             bp06 = _4976_4ebe[bp06].w2;
34837 :             //^2FCF:144C
34838 :             if (bp06 != 0xffff) {
34839 :               //^2FCF:1454
34840 :               _4976_5c20[bp06].Xcoord((Bit8u)xposTo);
34841 :               //^2FCF:1466
34842 :               _4976_5c20[bp06].Ycoord((Bit8u)yposTo);
34843 :               //^2FCF:147B
34844 :               _4976_5c20[bp06].SetMap(di);
34845 :               //^2FCF:14C3
34846 :             }
34847 :           }
34848 :           goto _1562;
34849 :         }
34850 :       }
34851 :     }
34852 :     else {
34853 :       //^2FCF:14C6
34854 :       CHANGE_CURRENT_MAP_TO(di);
34855 :       //^2FCF:14CD
34856 :       if (bp0a == dbCloud) {
34857 :         //^2FCF:14D3
34858 :         APPEND_RECORD_TO(si, NULL, xposTo, yposTo);
34859 :         //^2FCF:14E6
34860 :       }
34861 :       else {
34862 :         //^2FCF:14E8
34863 :         Bit16u bp14 = (xposFrom < 0 && yposFrom < 0) ? 1 : 0;
34864 :         //^2FCF:14FE
34865 :         if (bp14 == 0 && di != bp08) {
34866 :           //^2FCF:1507
34867 :           Bit16u bp1c = GET_CREATURE_AT(xposTo, yposTo);
34868 :           //^2FCF:1517
34869 :           if (bp1c != 0xffff) {
34870 :             //^2FCF:151C
34871 :             bp14 = _0cee_2de0(bp1c) & 1;
34872 :           }
34873 :         }
34874 :         //^2FCF:152B
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 :     //^2FCF:1562
34886 : _1562:
34887 :     _4976_581e = bp1e;
34888 :     _4976_5826 = xposTo;
34889 :     _4976_5828 = yposTo;
34890 :     _4976_581c = di;
34891 :     //^2FCF:1578
34892 :     CHANGE_CURRENT_MAP_TO(bp08);
34893 :     //^2FCF:1581
34894 :     return 0;
34895 :     //^2FCF:1583
34896 :   }
34897 : 
34898 :   //^
34899 :   void _075f_056c(Bit16u recordLink); // TODO: Undefined
34900 : 
34901 :   //^075F:0596
34902 :   void DELETE_MISSILE_RECORD(ObjectID rlMissile, ObjectID *prlDropTo, __int16 xposDropTo, __int16 yposDropTo)
34903 :   {
34904 :     //^075F:0596
34905 :     //^075F:059C
34906 :     ObjectID si = rlMissile;
34907 :     //^075F:059F
34908 :     Missile *bp04 = GET_ADDRESS_OF_RECORDE(si);
34909 :     //^075F:05AF
34910 :     ObjectID di = bp04->GetMissileObject();
34911 :     //^075F:05B5
34912 :     if (di.DBType() != dbCloud) {
34913 :       //^075F:05C3
34914 :       if (prlDropTo != NULL) {
34915 :         //^075F:05CB
34916 :         APPEND_RECORD_TO(di, prlDropTo, -1, 0);
34917 :       }
34918 :       else {
34919 :         //^075F:05DE
34920 :         ObjectID bp06 = GET_CREATURE_AT(xposDropTo, yposDropTo);
34921 :         //^075F:05EE
34922 :         if (bp06 != bp06.FFFF && (_0cee_2de0(bp06) & 0x0001) != 0) {
34923 :           //^075F:0602
34924 :           Bit16u bp08 = si.Dir();
34925 :           //^075F:060A
34926 :           if ((QUERY_CREATURE_AI_SPEC_FROM_RECORD(bp06)->w30 & 15) == 1) {
34927 :             //^075F:0623
34928 :             bp08 = _4976_5c20[bp04->w6].b9_2_3();
34929 :             //^075F:063F
34930 :           }
34931 :           else {
34932 :             //^075F:0641
34933 :             bp08 = si.Dir();
34934 :           }
34935 :           //^075F:0649
34936 :           MOVE_RECORD_TO(ObjectID(di, bp08), -2, -1, xposDropTo, yposDropTo);
34937 :         }
34938 :         else {
34939 :           //^075F:0667
34940 :           MOVE_RECORD_TO(ObjectID(di, si.Dir()), -2, 0, xposDropTo, yposDropTo);
34941 :         }
34942 :       }
34943 :       //^075F:0687
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 :     //^075F:06B2
34957 :     DEALLOC_RECORD(si);
34958 :     //^075F:06B9
34959 :     return;
34960 :   }
34961 : 
34962 :   //^0CEE:0EC8
34963 :   Bit16u RECYCLE_A_RECORD_FROM_THE_WORLD(Bit16u itemdb, Bit8u itemtype)
34964 :   {
34965 :     // searches almost unused record from the dungeon,
34966 :     // then detach it from the dungeon,
34967 :     // then recycle the record as unused one.
34968 :     //
34969 :     // itemdb: itemdb of a record which you want to recycle.
34970 :     // itemtype: searches for any recyclable itemtype if itemtype is 0xff.
34971 :     //
34972 :     // return-val: 0xffff if there is no recyclable ones.
34973 : 
34974 :     //^0CEE:0EC8
34975 :     //^0CEE:0ECE
34976 :     if (itemdb == dbCloud) {
34977 :       //^0CEE:0ED4
34978 :       return 0xffff;
34979 :     }
34980 :     //^0CEE:0EDA
34981 :     Bit16u bp1a = _4976_0c5a;
34982 :     //^0CEE:0EE0
34983 :     Bit16u di = (_4976_4c08 != 0) ? _4976_4c12 : 0xffff;
34984 :     //^0CEE:0EF1
34985 :     Bit16u bp26 = 0;
34986 :     //^0CEE:0EF6
34987 :     Bit16u bp0e;
34988 :     Bit16u bp18;
34989 :     bp0e = bp18 = _4976_4c42[itemdb];
34990 :     //^0CEE:0F05
34991 :     if (bp0e == _4976_4bf4 || bp0e == di) {
34992 :       //^0CEE:0F13
34993 :       if (di != 0xffff) {
34994 :         do {
34995 :           //^0CEE:0F18
34996 :           if (_4976_4d0e->nMaps <= (++bp0e)) {
34997 :             //^0CEE:0F2C
34998 :             bp0e = 0;
34999 :           }
35000 :           //^0CEE:0F31
35001 :           if (bp0e == bp18) {
35002 :             //^0CEE:0F39
35003 :             bp0e = di;
35004 :             di = 0xffff;
35005 :           }
35006 :           //^0CEE:0F3F
35007 :         } while (bp0e == di || bp0e == _4976_4bf4);
35008 :       }
35009 :       else {
35010 :         do {
35011 :           //^0CEE:0F4F
35012 :           if (_4976_4d0e->nMaps <= (++bp0e)) {
35013 :             //^0CEE:0F63
35014 :             bp0e = 0;
35015 :           }
35016 :           //^0CEE:0F68
35017 :         } while (bp0e == _4976_4bf4);
35018 :         //^0CEE:0F71
35019 :         if (bp0e == bp18) {
35020 :           //^0CEE:0F76
35021 :           bp0e = _4976_4bf4;
35022 :         }
35023 :       }
35024 :     }
35025 :     //^0CEE:0F7C
35026 :     bp18 = bp0e;
35027 :     Bit16u bp20 = 0;
35028 : 
35029 :     while (true) {
35030 :       //^0CEE:0F87
35031 :             Bit16u bp14 = _4976_4dba[bp0e].RawColumn();
35032 :       //^0CEE:0FA0
35033 :       Bit16u bp16 = _4976_4dba[bp0e].RawRow();
35034 :       //^0CEE:0FB9
35035 :       Bit8u *bp04 = *_4976_4ca8[bp0e];
35036 :       //^0CEE:0FD5
35037 :       Bit16u *bp0c = &_4976_4d16[_4976_4c7c[_4976_4dd6[bp0e]]];
35038 :       //^0CEE:1000
35039 :       for (Bit16u bp10=0; bp10 <= bp14; bp10++) {
35040 :         //^0CEE:1008
35041 :         for (Bit16u bp12=0; bp12 <= bp16; bp12++) {
35042 :           //^0CEE:1010
35043 :           if ((*(bp04++) & 0x10) != 0) {
35044 :             //^0CEE:1024
35045 :             Bit8u bp27 = 0xff;
35046 :             //^0CEE:1028
35047 :             Bit16u si = *(bp0c++);
35048 :             //^0CEE:1032
35049 :             Bit16u bp24 = ((bp0e == _4976_4bf4) && (bp10 - _4976_4bfa + 5 <= 10) || (bp12 - _4976_4c06 + 5 <= 10)) ? 1 : 0;
35050 :             Bit16u bp22;
35051 : 
35052 :             // bp10: x-pos of GC(garbage-collector) cursor
35053 :             // bp12: y-pos of GC cursor
35054 :             // bp24: 1 if player is near from GC cursor. 0 if far
35055 : 
35056 :             while (true) {
35057 :               //^0CEE:1063
35058 :               Bit16u bp1c = (si & 0x3c00) >> 10;
35059 :               //^0CEE:106E
35060 :               if (bp1c == dbActuator) {
35061 :                 //^0CEE:1073
35062 :                 Actuator *bp08 = GET_ADDRESS_OF_RECORD(si)->castToActuator();
35063 :                 //^0CEE:107F
35064 :                 Bit16u bp1e = bp08->ActuatorType();
35065 :                 //^0CEE:108C
35066 :                 if (bp1e >= 0x2c || _4976_0c5e[bp1e] == 0) {
35067 :                   //^0CEE:109E
35068 :                   if (bp26 != 0 && bp24 != 0 && bp1e == 0x30) {
35069 :                     //^0CEE:10B9
35070 :                     bp24 = 0;
35071 :                     //^0CEE:10BE
35072 :                     bp1e = bp08->ActuatorData();
35073 :                     //^0CEE:10CE
35074 :                     if (GET_ITEMDB_OF_ITEMSPEC_ACTUATOR(bp1e) == itemdb) {
35075 :                       //^0CEE:10DD
35076 :                       bp27 = GET_ITEMTYPE_OF_ITEMSPEC_ACTUATOR(bp1e);
35077 :                     }
35078 :                   }
35079 :                   goto _1314;
35080 :                 }
35081 :                 goto _1324;
35082 :               }
35083 :               //^0CEE:10EC
35084 :               else if (bp1c == dbText) {
35085 :                 //^0CEE:10F2
35086 :                 Text *bp08 = GET_ADDRESS_OF_RECORD(si)->castToText();
35087 :                 //^0CEE:10FE
35088 :                 if (bp08->TextMode() != 1) {
35089 :                   //^0CEE:110F
35090 :                   goto _1314;
35091 :                 }
35092 :                 //^0CEE:1112
35093 :                 if (bp08->SimpleTextExtUsage() != 4) {
35094 :                   //^0CEE:1127
35095 :                   goto _1314;
35096 :                 }
35097 :                 //^0CEE:112A
35098 :                 goto _1324;
35099 :               }
35100 :               //^0CEE:112D
35101 :               else if (bp1c > dbActuator && bp24 != 0) {
35102 :                 goto _1314;
35103 :               }
35104 :               //^0CEE:113C
35105 :               else if (bp1c == itemdb) {
35106 :                 //^0CEE:1147
35107 :                 GenericRecord *bp08 = GET_ADDRESS_OF_RECORD(si);
35108 :                 //^0CEE:1153
35109 :                 switch (itemdb) {
35110 :                   case dbCreature:  // 4
35111 :                     {
35112 :                       Creature *_bp08 = bp08->castToCreature();
35113 : 
35114 :                       //^0CEE:1168
35115 :                       //^0CEE:116B
35116 :                       if (_bp08->b15_2_2() != 0)
35117 :                         goto _1314;
35118 :                       //^0CEE:117C
35119 :                       if (_bp08->w2 != 0xfffe)
35120 :                         goto _1314;
35121 :                       //^0CEE:1186
35122 :                       if (itemtype != 0xff) {
35123 :                         //^0CEE:118C
35124 :                         if (_bp08->CreatureType() != itemtype)
35125 :                           goto _1314;
35126 :                       }
35127 :                       //^0CEE:119B
35128 :                       CHANGE_CURRENT_MAP_TO(bp0e);
35129 :                       //^0CEE:11A3
35130 :                       DELETE_CREATURE_RECORD(bp10, bp12, 1, 0xffff);
35131 :                       //^0CEE:11B5
35132 :                       break;
35133 :                     }
35134 :                   case dbMissile:    //14
35135 :                     {
35136 :                       Missile *_bp08 = bp08->castToMissile();
35137 : 
35138 :                       //^0CEE:11B8
35139 :                       if (itemtype != 0xff) {
35140 :                         //^0CEE:11BE
35141 :                         if (QUERY_CLS2_FROM_RECORD(_bp08->w2) != itemtype)
35142 :                           goto _1314;
35143 :                       }
35144 :                       //^0CEE:11D3
35145 :                       _075f_056c(si);
35146 :                       //^0CEE:11DA
35147 :                       CUT_RECORD_FROM(si, NULL, bp10, bp12);
35148 :                       //^0CEE:11EC
35149 :                       DELETE_MISSILE_RECORD(si, NULL, bp10, bp12);
35150 :                       //^0CEE:11FC
35151 :                       break;
35152 :                     }
35153 :                   case dbCloth:    // 6
35154 :                     {
35155 :                       Cloth *_bp08 = bp08->castToCloth();
35156 : 
35157 :                       //^0CEE:11FF
35158 :                       if (_bp08->Important() != 0)
35159 :                         goto _1314;
35160 :                       //^0CEE:1213
35161 :                       //^0CEE:121A
35162 :                       //^0CEE:1263
35163 :                       Bit16u bp1e = _bp08->ItemType();
35164 :                       //^0CEE:1269
35165 :                       if (bp1e == bp27)
35166 :                         goto _1314;
35167 :                       //^0CEE:1278
35168 :                       if (itemtype != 0xff && itemtype != bp1e)
35169 :                         goto _1314;
35170 :                       //^0CEE:1289
35171 :                       CHANGE_CURRENT_MAP_TO(bp0e);
35172 :                       //^0CEE:1291
35173 :                       MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35174 :                       //^0CEE:12B0
35175 :                       break;
35176 :                     }
35177 :                   case dbWeapon:    // 5
35178 :                     {
35179 :                       Weapon *_bp08 = bp08->castToWeapon();
35180 : 
35181 :                       //^0CEE:121C
35182 :                       if (_bp08->Important() != 0)
35183 :                         goto _1314;
35184 :                       //^0CEE:1230
35185 :                       //^0CEE:1213
35186 :                       //^0CEE:121A
35187 :                       //^0CEE:1263
35188 :                       Bit16u bp1e = _bp08->ItemType();
35189 :                       //^0CEE:1269
35190 :                       if (bp1e == bp27)
35191 :                         goto _1314;
35192 :                       //^0CEE:1278
35193 :                       if (itemtype != 0xff && itemtype != bp1e)
35194 :                         goto _1314;
35195 :                       //^0CEE:1289
35196 :                       CHANGE_CURRENT_MAP_TO(bp0e);
35197 :                       //^0CEE:1291
35198 :                       MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35199 :                       //^0CEE:12B0
35200 :                     }
35201 :                   case dbPotion:    // 8
35202 :                     {
35203 :                       Potion *_bp08 = bp08->castToPotion();
35204 : 
35205 :                       //^0CEE:1248
35206 :                       if (_bp08->VisiblePower() != 0)
35207 :                         goto _1314;
35208 :                       //^0CEE:125C
35209 :                       Bit16u bp1e = _bp08->PotionType();
35210 :                       //^0CEE:1269
35211 :                       if (bp1e == bp27)
35212 :                         goto _1314;
35213 :                       //^0CEE:1278
35214 :                       if (itemtype != 0xff && itemtype != bp1e)
35215 :                         goto _1314;
35216 :                       //^0CEE:1289
35217 :                       CHANGE_CURRENT_MAP_TO(bp0e);
35218 :                       //^0CEE:1291
35219 :                       MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35220 :                       //^0CEE:12B0
35221 :                     }
35222 :                   case dbMiscellaneous_item:  //10
35223 :                     {
35224 :                       Miscellaneous_item *_bp08 = bp08->castToMisc();
35225 : 
35226 :                       //^0CEE:1232
35227 :                       if (_bp08->Important() != 0)
35228 :                         goto _1314;
35229 :                       //^0CEE:1246
35230 :                       //^0CEE:1213
35231 :                       //^0CEE:121A
35232 :                       //^0CEE:1263
35233 :                       Bit16u bp1e = _bp08->ItemType();
35234 :                       //^0CEE:1269
35235 :                       if (bp1e == bp27)
35236 :                         goto _1314;
35237 :                       //^0CEE:1278
35238 :                       if (itemtype != 0xff && itemtype != bp1e)
35239 :                         goto _1314;
35240 :                       //^0CEE:1289
35241 :                       CHANGE_CURRENT_MAP_TO(bp0e);
35242 :                       //^0CEE:1291
35243 :                       MOVE_RECORD_TO(si, bp10, bp12, -1, (bp20 != 0) ? -1 : 0);
35244 :                       //^0CEE:12B0
35245 :                     }
35246 :                   case dbScroll:    // 7
35247 :                   case dbContainer:  // 9
35248 :                   case db11:      //11
35249 :                   case db12:      //12
35250 :                   case db13:      //13
35251 :                     //^0CEE:12B0
35252 :                     break;
35253 :                 }
35254 :                 //^0CEE:12B0
35255 :                 CHANGE_CURRENT_MAP_TO(bp1a);
35256 :                 //^0CEE:12B8
35257 :                 _4976_4c42[itemdb] = (Bit8u)bp0e;
35258 :                 //^0CEE:12C2v
35259 :                 return si & 0x3fff;
35260 :               }
35261 :               //^0CEE:12CA
35262 :               else if (bp1c == dbCreature && itemdb != dbMissile) {
35263 :                 //^0CEE:12D6
35264 :                 Creature *bp08 = GET_ADDRESS_OF_RECORD(si)->castToCreature();
35265 :                 //^0CEE:12E2
35266 :                 if (bp08->w2 == 0xfffe) {
35267 :                   //^0CEE:12EA
35268 :                   goto _1314;
35269 :                 }
35270 :                 //^0CEE:12EC
35271 :                 if ((QUERY_CREATURE_AI_SPEC_FROM_TYPE(bp08->CreatureType())->w0 & 0x0001) == 0) {
35272 :                   //^0CEE:1300
35273 :                   goto _1314;
35274 :                 }
35275 :                 //^0CEE:1302
35276 :                 bp20 = 1;
35277 :                 bp22 = si;
35278 :                 //^0CEE:130A
35279 :                 si = bp08->w2;
35280 :                 //^0CEE:1311
35281 :                 continue;
35282 :               }
35283 :               else {
35284 :                 goto _1314;
35285 :               }
35286 : 
35287 :               //^0CEE:1314
35288 : _1314:
35289 :               si = GET_NEXT_RECORD_LINK(si);
35290 :               //^0CEE:131C
35291 :               if (si != 0xfffe)
35292 :                 continue;
35293 :               //^0CEE:1324
35294 : _1324:
35295 :               if (bp20 == 0)
35296 :                 break;
35297 :               //^0CEE:132A
35298 :               si = bp22;
35299 :               bp20 = 0;
35300 :               goto _1314;
35301 :             }
35302 :           }
35303 :           //^0CEE:1334
35304 :         }
35305 :         //^0CEE:1342
35306 :       }
35307 :       //^0CEE:1350
35308 :       if (bp0e != _4976_4bf4 || _4976_4d0e->nMaps <= 1) {
35309 :         //^0CEE:1364
35310 :         if (bp26 != 0) {
35311 :           //^0CEE:136A
35312 :           _4976_4c42[itemdb] = (Bit8u)bp0e;
35313 :           //^0CEE:1374
35314 :           //^0CEE:0ED4
35315 :           return 0xffff;
35316 :         }
35317 :         //^0CEE:1377
35318 :         bp26 = 1;
35319 :         //^0CEE:137C
35320 :         continue;
35321 :       }
35322 :       //^0CEE:137F
35323 :       if (di != 0xffff) {
35324 :         do {
35325 :           //^0CEE:1384
35326 :           if (_4976_4d0e->nMaps <= (++bp0e)) {
35327 :             //^0CEE:1398
35328 :             bp0e = 0;
35329 :           }
35330 :           //^0CEE:139D
35331 :           if (bp0e == bp18) {
35332 :             //^0CEE:13A5
35333 :             bp0e = di;
35334 :             di = 0xffff;
35335 :           }
35336 :           //^0CEE:13AB
35337 :         } while (bp0e == di || bp0e == _4976_4bf4);
35338 :         //^0CEE:13B9
35339 :         continue;
35340 :       }
35341 :       do {
35342 :         //^0CEE:13BC
35343 :         if (_4976_4d0e->nMaps <= (++bp0e)) {
35344 :           //^0CEE:13D0
35345 :           bp0e = 0;
35346 :         }
35347 :         //^0CEE:13D5
35348 :       } while (bp0e == _4976_4bf4);
35349 :       //^0CEE:13DE
35350 :       if (bp0e != bp18)
35351 :         continue;
35352 :       //^0CEE:13E6
35353 :       bp0e = _4976_4bf4;
35354 :     }
35355 :   }
35356 : 
35357 :   //^0CEE:1409
35358 :   ObjectID ALLOC_NEW_RECORD(Bit16u db)
35359 :   {
35360 :     //^0CEE:1409
35361 :     Bit16u si = db;
35362 :     ObjectID di = ObjectID::FFFF;
35363 :     Bit16u bp08 = _4976_4d0e->nRecords[(si & 0x7fff)];
35364 :     //^0CEE:1429
35365 :     if (si == 0x800a) {
35366 :       //^0CEE:142F
35367 :       si = 0x000a;
35368 :     }
35369 :     else {
35370 :       //^0CEE:1434
35371 :       if (si == 0x000a) {
35372 :         //^0CEE:1439
35373 :         bp08 -= 3;
35374 :       }
35375 :     }
35376 :     //^0CEE:143D
35377 :     Bit16u bp06 = bp08;
35378 :     Bit16u bp0a = _4976_0242[si];
35379 :     Bit8u *bp04 = _4976_4cca[si];
35380 : 
35381 :     while (true) {
35382 :       //^0CEE:145F
35383 :       if (reinterpret_cast<GenericRecord *>(bp04)->w0 == 0xffff) {
35384 :         //^0CEE:1468
35385 :         di = ObjectID(0, si, bp08 - bp06);
35386 :       }
35387 :       else {
35388 :         //^0CEE:1479
35389 :         if (bp06-- != 0) {
35390 :           //^0CEE:147E
35391 :           bp04 += (bp0a >> 1) << 1;
35392 :           continue;
35393 :         }
35394 :         //^0CEE:148A
35395 :         di = RECYCLE_A_RECORD_FROM_THE_WORLD(si, 0xff);
35396 :         //^0CEE:1496
35397 :         if (di == di.FFFF) {
35398 :           //^0CEE:149B
35399 :           //^0CEE:14D5
35400 :           return ObjectID::FFFF;
35401 :         }
35402 :         //^0CEE:14A0
35403 :         bp04 = (Bit8u *)GET_ADDRESS_OF_RECORD(di);
35404 :       }
35405 :       //^0CEE:14AC
35406 :       ZERO_MEMORY(bp04, bp0a);
35407 :       //^0CEE:14C0
35408 :       reinterpret_cast<GenericRecord *>(bp04)->w0 = ObjectID::FFFE;
35409 :       //^0CEE:14C8
35410 :       if (si == dbContainer) {
35411 :         //^0CEE:14CD
35412 :         reinterpret_cast<Container *>(bp04)->w2 = ObjectID::FFFE;
35413 :       }
35414 :       //^0CEE:14D3
35415 :       return di;
35416 :     }
35417 :   }
35418 : 
35419 :