Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 35.19 KB | None | 0 0
  1. LONG __cdecl ProcessActorAnimation2(CHActorInfo *arg_actor, int a2, int arg_zero1, CHActorInfo *arg_zero2)
  2. {
  3.   CHActorInfo *actor; // ebx
  4.   CHActorInfo *var_zero; // esi
  5.   AMSeg3Decoded *palettePtr; // eax
  6.   AMStruct *animation; // edi
  7.   CHSegment7Entry *v8; // eax
  8.   unsigned __int32 v9; // eax
  9.   int v10; // eax
  10.   LONG result; // eax
  11.   int v12; // ecx
  12.   bool v13; // zf
  13.   int v14; // edi
  14.   AMSeg1 *seg1Ptr; // edi
  15.   unsigned int v16; // ecx
  16.   AMSeg2 *v17; // esi
  17.   AMSeg2 *amSeg2; // esi
  18.   int v19; // edx
  19.   int v20; // esi
  20.   int v21; // edx
  21.   AMStruct *v22; // edx
  22.   unsigned __int16 *v23; // ecx
  23.   int v24; // esi
  24.   float v25; // ST50_4
  25.   double v26; // st7
  26.   float v27; // ST50_4
  27.   float v28; // ST50_4
  28.   float v29; // ST50_4
  29.   long double v30; // st7
  30.   float v31; // ST50_4
  31.   int v32; // eax
  32.   double v33; // st7
  33.   __int16 v34; // ax
  34.   unsigned __int16 v35; // ax
  35.   double v36; // st7
  36.   int v37; // eax
  37.   int v38; // eax
  38.   int v39; // eax
  39.   AMStruct *v40; // ecx
  40.   double scaledAnimationDelay; // st7
  41.   unsigned __int64 delay; // rax
  42.   signed __int16 offsetOx; // ax
  43.   signed int deltaOy; // edx
  44.   double ox; // st7
  45.   double oy; // st6
  46.   CHActorInfo *linkedActor; // eax
  47.   CHActorInfo *linkedActor2; // ecx
  48.   CHActorInfo *zeroableActor2; // eax
  49.   double v50; // st7
  50.   signed int v51; // edi
  51.   unsigned __int32 v52; // eax
  52.   bool v53; // cf
  53.   AMImageFrame *v54; // ecx
  54.   AMImageFrame *v55; // edx
  55.   int v56; // ecx
  56.   float v57; // ecx
  57.   int v58; // eax
  58.   int v59; // ecx
  59.   LONG v60; // edi
  60.   LONG v61; // esi
  61.   int v62; // edi
  62.   int v63; // esi
  63.   int v64; // ecx
  64.   int v65; // eax
  65.   CHSegment7Entry *v66; // eax
  66.   CHFileHeader *v67; // ecx
  67.   int v68; // edx
  68.   int v69; // esi
  69.   long double v70; // st7
  70.   long double v71; // st6
  71.   long double v72; // st5
  72.   double v73; // st7
  73.   long double v74; // st7
  74.   double v75; // st7
  75.   void *v76; // ecx
  76.   signed int v77; // ST28_4
  77.   signed int v78; // ST24_4
  78.   signed int v79; // ST20_4
  79.   WORD v80; // ax
  80.   double v81; // st7
  81.   long double v82; // st6
  82.   long double v83; // st5
  83.   signed int v84; // ST28_4
  84.   signed int v85; // ST24_4
  85.   signed int v86; // ST20_4
  86.   WORD v87; // ax
  87.   long double v88; // rt2
  88.   long double v89; // st5
  89.   long double v90; // st7
  90.   signed int v91; // ST28_4
  91.   signed int v92; // ST24_4
  92.   signed int v93; // ST20_4
  93.   WORD v94; // ax
  94.   double v95; // st5
  95.   char v96; // cl
  96.   double v97; // st5
  97.   AMStruct *v98; // ecx
  98.   int *v99; // eax
  99.   int v100; // edx
  100.   char v101; // al
  101.   int v102; // edx
  102.   int v103; // ecx
  103.   double v104; // st7
  104.   int v105; // esi
  105.   signed int v106; // eax
  106.   int v107; // edi
  107.   __int16 v108; // ax
  108.   CHActorInfo *v109; // ecx
  109.   CHActorInfo *v110; // eax
  110.   int v111; // [esp+2Ch] [ebp-29Ch]
  111.   float v112; // [esp+2Ch] [ebp-29Ch]
  112.   int delta; // [esp+30h] [ebp-298h]
  113.   int v114; // [esp+3Ch] [ebp-28Ch]
  114.   double v115; // [esp+40h] [ebp-288h]
  115.   int dvar1; // [esp+48h] [ebp-280h]
  116.   AMStruct *animation2; // [esp+54h] [ebp-274h]
  117.   long double someOx; // [esp+58h] [ebp-270h]
  118.   CHActorInfo *zeroableActor; // [esp+64h] [ebp-264h]
  119.   long double v120; // [esp+68h] [ebp-260h]
  120.   int v121; // [esp+74h] [ebp-254h]
  121.   long double v122; // [esp+78h] [ebp-250h]
  122.   long double v123; // [esp+80h] [ebp-248h]
  123.   double v124; // [esp+88h] [ebp-240h]
  124.   int v125; // [esp+90h] [ebp-238h]
  125.   int v126; // [esp+94h] [ebp-234h]
  126.   long double v127; // [esp+98h] [ebp-230h]
  127.   long double v128; // [esp+A0h] [ebp-228h]
  128.   int v129; // [esp+ACh] [ebp-21Ch]
  129.   POINT pt; // [esp+B0h] [ebp-218h]
  130.   int v131; // [esp+B8h] [ebp-210h]
  131.   int v132; // [esp+BCh] [ebp-20Ch]
  132.   long double v133; // [esp+C0h] [ebp-208h]
  133.   int v134; // [esp+D4h] [ebp-1F4h]
  134.   CHActorInfo actor_clone; // [esp+D8h] [ebp-1F0h]
  135.   char Dest; // [esp+2A4h] [ebp-24h]
  136.  
  137.   actor = arg_actor;
  138.   var_zero = arg_zero2;
  139.   while ( 1 )
  140.   {
  141.     while ( 1 )
  142.     {
  143.       palettePtr = actor->DecodedPalette;
  144.       animation = actor->Animation;
  145.       zeroableActor = var_zero;
  146.       animation2 = animation;
  147.       if ( palettePtr && !palettePtr->Sufix.field_24 )
  148.         AMProcessDecodedPalette(palettePtr);
  149.       if ( !dword_4AF280 )
  150.       {
  151.         if ( actor->SomeFlags & 4 )
  152.         {
  153.           if ( !dword_4AF2A0 && !g_skip_actor_animation && !actor->field_19C )
  154.           {
  155.             v8 = actor->chSeg7Ptr;
  156.             if ( v8 )
  157.             {
  158.               if ( v8->field_D == 2 )
  159.               {
  160.                 v9 = animation->seg1Count;
  161.                 if ( actor->AnimationSeg2IndexOffset < (signed int)*((unsigned __int16 *)animation->seg1ptr
  162.                                                                    + 2
  163.                                                                    * (19 * animation->seg1Count
  164.                                                                     + actor->AnimationSeg2Index)
  165.                                                                    - 15) )
  166.                 {
  167.                   qmemcpy(&actor_clone, actor, sizeof(actor_clone));
  168.                   actor_clone.SomeFlags &= 0xFFFFFFFB;
  169.                   actor_clone.AnimationSeg1Index = v9 - 1;
  170.                   actor_clone.field_60 = v9 - 1;
  171.                   dword_4AF2A0 = 1;
  172.                   actor_clone.field_198 = 2;
  173.                   actor_clone.field_19C = 12;
  174.                   ProcessActorAnimation2(&actor_clone, a2, 0, 0);
  175.                   var_zero = zeroableActor;
  176.                   dword_4AF2A0 = 0;
  177.                 }
  178.               }
  179.             }
  180.           }
  181.         }
  182.       }
  183.       if ( !var_zero )
  184.         break;
  185.       if ( actor->SomeFlags & 0x20 )
  186.         actor->field_4C = var_zero->field_4C;
  187.       v10 = actor->field_4C;
  188.       actor->AnimationSeg1Index = actor->field_60;
  189.       actor->AnimationSeg2Index = v10;
  190.       result = (LONG)&var_zero->Animation->seg2ptr[var_zero->AnimationSeg2IndexOffset
  191.                                                  + var_zero->Animation->seg1ptr->Segment2Links[var_zero->AnimationSeg2Index
  192.                                                                                              + 19
  193.                                                                                              * var_zero->AnimationSeg1Index].Index];
  194.       v12 = *(_DWORD *)actor->gap_8C;
  195.       actor->posX = (double)(v12 + *(signed __int16 *)(result + 22) - (signed int)*(signed __int16 *)(result + 6))
  196.                   + var_zero->posX;
  197.       actor->posY = var_zero->posY;
  198.       actor->field_64 = -(double)(*(_DWORD *)&actor->gap_8C[4]
  199.                                 + *(signed __int16 *)(result + 24)
  200.                                 - (signed int)*(signed __int16 *)(result + 8));
  201.       actor->field_30 = (double)(v12 + *(signed __int16 *)(result + 22) - (signed int)*(signed __int16 *)(result + 6))
  202.                       + var_zero->field_30;
  203.       v13 = (actor->SomeFlags & 8) == 0;
  204.       actor->field_34 = (double)(*(_DWORD *)&actor->gap_8C[4]
  205.                                + *(signed __int16 *)(result + 24)
  206.                                - (signed int)*(signed __int16 *)(result + 8))
  207.                       + var_zero->field_34;
  208.       if ( !v13 )
  209.         break;
  210.       actor = actor->linkedActor2;
  211.       if ( !actor )
  212.         return result;
  213.     }
  214.     pt.x = g_some_ox + g_cursor_position.x;
  215.     result = actor->AnimationSeg1Index;
  216.     v14 = actor->AnimationSeg1Index;
  217.     pt.y = g_some_oy + g_cursor_position.y;
  218.     seg1Ptr = &animation2->seg1ptr[v14];
  219.     v16 = (unsigned int)animation2->seg2ptr;
  220.     v17 = animation2->seg2ptr;
  221.     if ( actor->field_50 )
  222.     {
  223.       amSeg2 = &v17[actor->AnimationSeg2Index + seg1Ptr->Segment2Links[0].Index];
  224.       goto LABEL_50;
  225.     }
  226.     v19 = actor->AnimationSeg2Index;
  227.     if ( !seg1Ptr->Segment2Links[v19].Count )
  228.     {
  229.       v22 = animation2;
  230. LABEL_35:
  231.       if ( v22->magicNumberOrAnimationId )
  232.         v22->magicNumberOrAnimationId = 0;
  233.       goto LABEL_37;
  234.     }
  235.     v20 = (int)&v17[seg1Ptr->Segment2Links[v19].Index];
  236.     if ( *(_WORD *)(v20 + 18) )
  237.     {
  238.       v21 = *(_DWORD *)actor->gap_68;
  239.       if ( v21 != 4 )
  240.       {
  241.         result += 4 - v21;
  242.         seg1Ptr += 4 - v21;
  243.         v20 = v16 + 26 * seg1Ptr->Segment2Links[actor->AnimationSeg2Index].Index;
  244.       }
  245.     }
  246.     v22 = animation2;
  247.     amSeg2 = (AMSeg2 *)(26 * actor->AnimationSeg2IndexOffset + v20);
  248.     v16 = animation2->seg1Count;
  249.     if ( result < v16 )
  250.     {
  251.       if ( seg1Ptr->Segment2Links[actor->AnimationSeg2Index].Count )
  252.         goto LABEL_50;
  253.       goto LABEL_35;
  254.     }
  255.     if ( animation2->magicNumberOrAnimationId )
  256.       animation2->magicNumberOrAnimationId = 0;
  257.     if ( actor->AnimationSeg1Index >= v16 )
  258.       break;
  259. LABEL_37:
  260.     seg1Ptr = &v22->seg1ptr[actor->AnimationSeg1Index];
  261.     result = 0;
  262.     v23 = &seg1Ptr->Segment2Links[0].Count;
  263.     while ( !*v23 )
  264.     {
  265.       ++result;
  266.       v23 += 2;
  267.       if ( result >= 8 )
  268.         goto LABEL_30;
  269.     }
  270.     if ( result >= 8 )
  271.       break;
  272.     v13 = actor->AnimationSeg2Index == actor->field_4C;
  273.     actor->AnimationSeg2Index = result;
  274.     if ( v13 )
  275.       actor->field_4C = result;
  276.     v24 = (int)&v22->seg2ptr[seg1Ptr->Segment2Links[result].Index];
  277.     if ( actor->AnimationSeg2IndexOffset > (signed int)seg1Ptr->Segment2Links[result].Count )
  278.       actor->AnimationSeg2IndexOffset = 0;
  279.     if ( !actor->field_6C && actor->AnimationSeg2IndexOffset < 0 )
  280.       actor->AnimationSeg2IndexOffset = 0;
  281.     v16 = 26 * actor->AnimationSeg2IndexOffset;
  282.     amSeg2 = (AMSeg2 *)(v16 + v24);
  283. LABEL_50:
  284.     if ( !dword_4AF280 && actor->AnimationSeg2IndexOffset >= 0 && actor->SomeFlags & 8 && amSeg2->AMSeg2field_C & 1 )
  285.     {
  286.       dword_4AE9E0 = (int)&dword_4A3520;
  287.       if ( zeroableActor )
  288.       {
  289.         v120 = zeroableActor->posX;
  290.         v25 = actor->posY + 60.0 - zeroableActor->posY;
  291.         v26 = v25;
  292.         v27 = actor->posX - v120;
  293.         sub_469F0A((void *)v16);
  294.         v28 = v26;
  295.         v122 = v28;
  296.         v29 = cos(v28);
  297.         v30 = v29 * 60.0 + v120;
  298.         dword_4A3548 = (signed int)v30;
  299.         dword_4A3520 = (signed int)v30;
  300.         v31 = sin(v122);
  301.         v32 = (signed int)(v31 * 36.0 + zeroableActor->posY);
  302.       }
  303.       else
  304.       {
  305.         v33 = actor->posX;
  306.         dword_4A3548 = (signed int)v33;
  307.         dword_4A3520 = (signed int)v33;
  308.         v32 = (signed int)actor->posY + 60;
  309.       }
  310.       dword_4A3550 = 60;
  311.       dword_4A3524 = v32;
  312.       dword_4A354C = v32;
  313.     }
  314.     v34 = actor->AnimationSeg2IndexOffset;
  315.     LODWORD(v115) = (unsigned __int16)actor->AnimationSeg2IndexOffset;
  316.     if ( v34 >= 0 && amSeg2->AMSeg2field_C & 2 )
  317.       actor->SomeFlags |= 2u;
  318.     dvar1 = actor->field_6C;
  319.     if ( !dvar1 && zeroableActor )
  320.       actor->SomeFlags &= 0xFFFFFFF7;
  321.     if ( !g_skip_actor_animation )
  322.     {
  323.       if ( !actor->field_50 )
  324.       {
  325.         v35 = seg1Ptr->Segment2Links[actor->AnimationSeg2Index].Count;
  326.         LODWORD(someOx) = seg1Ptr->Segment2Links[actor->AnimationSeg2Index].Count;
  327.         if ( (signed __int16)v35 <= 1 )
  328.         {
  329.           if ( dvar1 > 0 && a2 )
  330.             actor->field_6C = dvar1 - 1;
  331.           if ( LOWORD(v115) == -1 )
  332.           {
  333.             actor->AnimationSeg2IndexOffset = 0;
  334.             ++amSeg2;
  335.           }
  336.           goto LABEL_105;
  337.         }
  338.         if ( dvar1 )
  339.         {
  340.           if ( LOWORD(v115) == -1 )
  341.             actor->ScaledAnimationDelay = ElapsedGameTime;
  342.           if ( actor->field_198 != 2 && SLOWORD(v115) >= 0 )
  343.           {
  344.             amSeg2 = &animation2->seg2ptr[SLOWORD(v115) + seg1Ptr->Segment2Links[actor->AnimationSeg2Index].Index];
  345.             if ( actor->SomeFlags & 0x100000 )
  346.             {
  347.               v114 = amSeg2->FrameTime;
  348.               v36 = (double)v114 * actor->AnimationTimeScale;
  349.             }
  350.             else
  351.             {
  352.               v114 = amSeg2->FrameTime;
  353.               v36 = (double)v114;
  354.             }
  355.             if ( ElapsedGameTime + (signed __int16)(signed int)v36 < actor->ScaledAnimationDelay )
  356.               actor->ScaledAnimationDelay = ElapsedGameTime;
  357.           }
  358.           if ( ElapsedGameTime >= actor->ScaledAnimationDelay )
  359.           {
  360.             v37 = ElapsedGameTime - LODWORD(actor->ScaledAnimationDelay);
  361.             delta = LOWORD(v115);
  362.             v114 = v37 <= 0 ? 0 : v37;
  363.             LODWORD(someOx) = SLOWORD(someOx) - 1;
  364.             if ( (signed int)SLOWORD(v115) < SLODWORD(someOx)
  365.               || dvar1 <= 0
  366.               || !a2
  367.               || (v13 = dvar1 == 1, actor->field_6C = dvar1 - 1, !v13) )
  368.             {
  369.               if ( v114 >= 0 )
  370.               {
  371.                 do
  372.                 {
  373.                   if ( (signed int)SLOWORD(v115) < SLODWORD(someOx) )
  374.                   {
  375.                     actor->AnimationSeg2IndexOffset = LOWORD(v115) + 1;
  376.                     ++amSeg2;
  377.                   }
  378.                   else
  379.                   {
  380.                     v38 = actor->field_6C;
  381.                     if ( v38 > 0 && a2 )
  382.                       actor->field_6C = v38 - 1;
  383.                     if ( !actor->field_6C )
  384.                       break;
  385.                     v39 = actor->AnimationSeg2Index;
  386.                     v40 = animation2;
  387.                     actor->AnimationSeg2IndexOffset = 0;
  388.                     amSeg2 = &v40->seg2ptr[seg1Ptr->Segment2Links[v39].Index];
  389.                   }
  390.                   if ( actor->SomeFlags & 0x100000 )
  391.                   {
  392.                     dvar1 = amSeg2->FrameTime;
  393.                     scaledAnimationDelay = (double)dvar1 * actor->AnimationTimeScale;
  394.                   }
  395.                   else
  396.                   {
  397.                     dvar1 = amSeg2->FrameTime;
  398.                     scaledAnimationDelay = (double)dvar1;
  399.                   }
  400.                   delay = ElapsedGameTime + (signed __int16)(signed int)scaledAnimationDelay;
  401.                   v114 -= (signed __int16)(signed int)scaledAnimationDelay;
  402.                   LODWORD(actor->ScaledAnimationDelay) = delay;
  403.                   LODWORD(delay) = (unsigned __int16)actor->AnimationSeg2IndexOffset;
  404.                   v13 = (_WORD)delay == (_WORD)delta;
  405.                   HIDWORD(actor->ScaledAnimationDelay) = HIDWORD(delay);
  406.                   LODWORD(v115) = delay;
  407.                 }
  408.                 while ( !v13 && v114 >= 0 );
  409.               }
  410.             }
  411.             offsetOx = amSeg2->OffsetOX;
  412.             if ( (offsetOx || amSeg2->OffsetOY) && a2 && actor->field_6C )
  413.             {
  414.               deltaOy = amSeg2->OffsetOY;
  415.               delta = offsetOx;
  416.               actor->SomeFlags |= 0x2000u;
  417.               *(float *)&someOx = (double)delta;
  418.               *(float *)&delta = (double)deltaOy;
  419.               ox = *(float *)&someOx;
  420.               actor->posX = actor->posX + *(float *)&someOx;
  421.               oy = *(float *)&delta;
  422.               actor->posY = actor->posY + *(float *)&delta;
  423.               actor->field_30 = ox + actor->field_30;
  424.               actor->field_34 = oy + actor->field_34;
  425.             }
  426.           }
  427. LABEL_105:
  428.           if ( g_skip_actor_animation )
  429.             goto LABEL_113;
  430.           goto LABEL_106;
  431.         }
  432.       }
  433. LABEL_106:
  434.       linkedActor = actor->linkedActor;
  435.       if ( linkedActor )
  436.         ProcessActorAnimation2(linkedActor, a2, arg_zero1, actor);
  437.       linkedActor2 = actor->linkedActor2;
  438.       if ( linkedActor2 && ((actor->AnimationSeg2Index + 1) & 7) < 3 )
  439.       {
  440.         zeroableActor2 = zeroableActor;
  441.         if ( !zeroableActor )
  442.           zeroableActor2 = actor;
  443.         ProcessActorAnimation2(linkedActor2, a2, arg_zero1, zeroableActor2);
  444.       }
  445.     }
  446. LABEL_113:
  447.     memset(&dword_4AF1D0, 0, 0x40u);
  448.     word_4AF1EC = amSeg2->FlipImageFlags;
  449.     if ( arg_zero1 )
  450.       word_4AF1EC |= 4u;
  451.     dword_4AF1E0 = (signed int)actor->posX;
  452.     v50 = actor->posY;
  453.     v51 = (signed int)v50;
  454.     dword_4AF1E4 = (signed int)v50;
  455.     if ( actor->field_198 != 2 )
  456.       dword_4AF1E8 = (signed int)actor->field_64;
  457.     v52 = amSeg2->FrameIndex;
  458.     flt_4AF258 = actor->field_54;
  459.     v53 = v52 < animation2->FrameCount;
  460.     v54 = animation2->Frames;
  461.     dword_4AF220 = (int)animation2->Frames;
  462.     if ( !v53 )
  463.     {
  464.       result = (LONG)actor->Animation;
  465.       *(_DWORD *)result = 0;
  466.       return result;
  467.     }
  468.     v55 = &v54[v52];
  469.     v56 = (int)&v54[(unsigned __int16)amSeg2->AMSeg2gap_10[1]];
  470.     dword_4AF220 = (int)v55;
  471.     dword_4AF1A4 = v56;
  472.     if ( a2 )
  473.     {
  474.       v57 = actor->field_34;
  475.       actor->posX = actor->field_30;
  476.       actor->posY = v57;
  477.       v51 = dword_4AF1E4;
  478.     }
  479.     v58 = amSeg2->MinusOX;
  480.     v59 = dword_4AF1E0 - v58;
  481.     dword_4AF260 = dword_4AF1E0 - v58;
  482.     rect.left = dword_4AF1E0 - v58;
  483.     if ( arg_zero1 )
  484.     {
  485.       delta = v55->Height;
  486.       result = v51 + amSeg2->MinusOY - delta - dword_4AF1E8;
  487.     }
  488.     else
  489.     {
  490.       result = v51 - amSeg2->MinusOY - dword_4AF1E8;
  491.     }
  492.     rect.top = result;
  493.     v60 = v59 + v55->Width;
  494.     rect.right = v59 + v55->Width;
  495.     v61 = result + v55->Height;
  496.     dword_4AF264 = result;
  497.     rect.bottom = v61;
  498.     if ( v59 <= g_some_ox )
  499.       rect.left = g_some_ox;
  500.     if ( result <= g_some_oy )
  501.     {
  502.       result = g_some_oy;
  503.       rect.top = g_some_oy;
  504.     }
  505.     if ( v60 >= g_some_ox + 640 )
  506.     {
  507.       v60 = g_some_ox + 640;
  508.       rect.right = g_some_ox + 640;
  509.     }
  510.     if ( v61 >= g_some_oy + dword_4D161C )
  511.     {
  512.       v61 = g_some_oy + dword_4D161C;
  513.       rect.bottom = g_some_oy + dword_4D161C;
  514.     }
  515.     if ( g_skip_actor_animation || (actor->SomeFlags >> 3) & 1 )
  516.     {
  517.       if ( rect.left >= v60 || result >= v61 )
  518.         goto LABEL_271;
  519.       actor->SomeFlags |= 0x4000u;
  520.       v62 = 0;
  521.       if ( !dword_4AF8D8
  522.         && (actor->Animation->animationType != 2 || !dword_4AF890)
  523.         && PtInRect(&rect, pt)
  524.         && (*(_DWORD *)&actor->field_132 & 0x10000 || dword_4AF890)
  525.         && (actor->chSeg7Ptr && (SLOBYTE(actor->SomeFlags) < 0 || dword_4AF890) || actor->field_198 == 1) )
  526.       {
  527.         v63 = dword_4DE4B4;
  528.         dword_4DE4B4 = (int)actor;
  529.         if ( dword_4AF890 )
  530.         {
  531.           if ( g_some_actor_info_indices[0] != -1
  532.             && (actor == g_some_actor_infos[0] || actor == g_some_actorInfo2 || actor == g_some_actorInfo3)
  533.             && (dword_4AF86C || dword_4AF868 && (actor->actorIndex == sub_408110(g_some_actor_info_indices[0]) || v63)) )
  534.           {
  535.             dword_4DE4B4 = v63;
  536.           }
  537.         }
  538.       }
  539.       if ( g_skip_actor_animation )
  540.       {
  541.         dword_4AF1D0 = 0;
  542.         dword_4AF1F0 = 0;
  543.       }
  544.       else
  545.       {
  546.         if ( dword_4AF280 || (v64 = actor->field_78) == 0 || actor->field_54 >= 255.0 )
  547.         {
  548.           flt_4AF1F4 = 0.0;
  549.           byte_4AF208 = -1;
  550.           flt_4AF1F8 = 0.0;
  551.           dword_4AF1D4 = 255;
  552.           dword_4AF1D8 = 255;
  553.           dword_4AF1DC = 255;
  554.           dword_4AF1D0 = 0;
  555.         }
  556.         else
  557.         {
  558.           v65 = *(_DWORD *)(v64 + 20);
  559.           if ( dword_4AEAA0 )
  560.           {
  561.             flt_4AF1F4 = 3.9269907;
  562.             byte_4AF208 = -1;
  563.             dword_4AF1D4 = 64;
  564.             flt_4AF1F8 = 0.78539819;
  565.             dword_4AF1D8 = 64;
  566.             dword_4AF1DC = 64;
  567.           }
  568.           else
  569.           {
  570.             flt_4AF1F4 = *(double *)(v65 + 48);
  571.             flt_4AF1F8 = *(double *)(v65 + 56);
  572.             byte_4AF208 = *(_BYTE *)(v65 + 5);
  573.             dword_4AF1D4 = *(unsigned __int8 *)(v65 + 8);
  574.             dword_4AF1D8 = *(unsigned __int8 *)(v65 + 9);
  575.             dword_4AF1DC = *(unsigned __int8 *)(v65 + 10);
  576.             dword_4AF1FC = *(unsigned __int8 *)(v65 + 12);
  577.             dword_4AF200 = *(unsigned __int8 *)(v65 + 13);
  578.             dword_4AF204 = *(unsigned __int8 *)(v65 + 14);
  579.           }
  580.           if ( dword_4AF170 )
  581.           {
  582.             delta = *(unsigned __int8 *)(v65 + 1);
  583.             actor->field_54 = (double)delta;
  584.           }
  585.           dword_4AF1D0 = dword_4AF1D4 != 255 || dword_4AF1D8 != 255 || dword_4AF1DC != 255;
  586.         }
  587.         if ( dword_4AF280 )
  588.         {
  589. LABEL_171:
  590.           dword_4AF1F0 = 0;
  591.           goto LABEL_239;
  592.         }
  593.         if ( actor->field_198 == 2 )
  594.         {
  595.           dword_4AF1F0 = 3;
  596.           dword_4AF1E8 = (signed int)actor->field_64;
  597.           goto LABEL_239;
  598.         }
  599.         if ( !(actor->SomeFlags & 4) || actor->field_19C || actor->field_54 >= 255.0 )
  600.           goto LABEL_171;
  601.         v66 = actor->chSeg7Ptr;
  602.         if ( !v66 )
  603.         {
  604.           dword_4AF1F0 = 1;
  605.           goto LABEL_183;
  606.         }
  607.         LOBYTE(v66) = v66->field_D;
  608.         if ( (_BYTE)v66 == 2 )
  609.         {
  610.           dword_4AF1F0 = 0;
  611.           goto LABEL_239;
  612.         }
  613.         v66 = (CHSegment7Entry *)(unsigned __int8)v66;
  614.         dword_4AF1F0 = (unsigned __int8)v66;
  615.         if ( (_BYTE)v66 && v66 != (CHSegment7Entry *)3 )
  616.         {
  617.           v62 = 0;
  618. LABEL_183:
  619.           if ( dword_4AE9DC || g_some_ch_header[1].seg11Ptr )
  620.           {
  621.             v67 = g_some_ch_header;
  622.             v122 = 1.7e308;
  623.             v68 = g_some_ch_header[1].seg11Ptr;
  624.             v114 = 0;
  625.             v111 = v68;
  626.             dvar1 = -2;
  627.             if ( dword_4AE9DC )
  628.             {
  629.               v62 = dword_4AE9DC;
  630.               LODWORD(v115) = -1;
  631.               LODWORD(v128) = dword_4AE9DC;
  632.             }
  633.             else
  634.             {
  635.               v62 = LODWORD(v128);
  636.               LODWORD(v115) = 0;
  637.             }
  638.             if ( SLODWORD(v115) < v68 )
  639.             {
  640.               v69 = LODWORD(v127);
  641.               do
  642.               {
  643.                 if ( !LODWORD(v115) )
  644.                 {
  645.                   v67 = g_some_ch_header;
  646.                   v62 = g_some_ch_header[1].seg11Count;
  647.                 }
  648.                 if ( dword_4AF278 )
  649.                   sub_4452F0(v62);
  650.                 *(double *)&delta = actor->posX - (double)*(signed int *)v62;
  651.                 someOx = (actor->posY - actor->field_64 - (double)*(signed int *)(v62 + 4)) / 0.6;
  652.                 v70 = someOx;
  653.                 sub_469F0A(v67);
  654.                 v123 = v70;
  655.                 v71 = *(double *)(v62 + 24);
  656.                 v120 = v71;
  657.                 v72 = *(double *)(v62 + 32);
  658.                 v128 = v72;
  659.                 if ( fabs(v71 - v72) > 0.09 )
  660.                 {
  661.                   if ( v72 < v71 )
  662.                   {
  663.                     v128 = v72 + 6.283185482025146;
  664.                     if ( v71 > v70 )
  665.                       v123 = v70 + 6.283185307;
  666.                   }
  667.                 }
  668.                 else
  669.                 {
  670.                   *(double *)(v62 + 24) = -3.141592654;
  671.                   v120 = -3.141592654;
  672.                   *(double *)(v62 + 32) = 3.141592654;
  673.                   v128 = 3.141592654;
  674.                 }
  675.                 v127 = sqrt(someOx * someOx + *(double *)&delta * *(double *)&delta);
  676.                 someOx = cos(v123);
  677.                 *(double *)&delta = someOx * v127;
  678.                 v124 = sin(v123);
  679.                 v127 = sqrt(v124 * (v127 * 0.6) * (v124 * (v127 * 0.6)) + *(double *)&delta * *(double *)&delta);
  680.                 if ( v127 <= sqrt(
  681.                                someOx * *(double *)(v62 + 16) * (someOx * *(double *)(v62 + 16))
  682.                              + *(double *)(v62 + 16) * 0.6 * v124 * (*(double *)(v62 + 16) * 0.6 * v124))
  683.                   && v123 >= v120
  684.                   && v128 >= v123
  685.                   && v122 > v127 )
  686.                 {
  687.                   v122 = v127;
  688.                   v133 = v123;
  689.                   dvar1 = LODWORD(v115);
  690.                   v69 = v62;
  691.                   v114 = v62 == dword_4AE9DC;
  692.                 }
  693.                 v62 += 60;
  694.                 ++LODWORD(v115);
  695.               }
  696.               while ( SLODWORD(v115) < v111 );
  697.               LODWORD(v128) = v62;
  698.               LODWORD(v127) = v69;
  699.               if ( dvar1 >= -1 )
  700.               {
  701.                 *(double *)&dvar1 = *(double *)(v69 + 8);
  702.                 v124 = cos(v133);
  703.                 *(double *)&delta = v124 * *(double *)&dvar1;
  704.                 v120 = sin(v133);
  705.                 *(double *)&dvar1 = sqrt(
  706.                                       v120 * (*(double *)&dvar1 * 0.6) * (v120 * (*(double *)&dvar1 * 0.6))
  707.                                     + *(double *)&delta * *(double *)&delta);
  708.                 v73 = *(double *)(v69 + 16);
  709.                 *(double *)&delta = v124 * v73;
  710.                 someOx = v73 * 0.6 * v120;
  711.                 v120 = sqrt(*(double *)&delta * *(double *)&delta + someOx * someOx);
  712.                 if ( dword_4AF278 )
  713.                 {
  714.                   v62 = *(_DWORD *)v69 - g_some_ox;
  715.                   v121 = *(_DWORD *)(v69 + 4) - g_some_oy;
  716.                   v129 = v62;
  717.                   v126 = v62 + (signed int)*(double *)&delta;
  718.                   v125 = v121 + (signed int)someOx;
  719.                 }
  720.                 else
  721.                 {
  722.                   v62 = v129;
  723.                 }
  724.                 *(double *)&delta = (double)*(signed int *)(v69 + 40) - actor->posX;
  725.                 someOx = ((double)*(signed int *)(v69 + 44) - (actor->posY - actor->field_64)) / 0.6;
  726.                 v74 = someOx;
  727.                 sub_469F0A(v67);
  728.                 v123 = v74;
  729.                 v124 = (double)*(signed int *)(v69 + 48);
  730.                 v75 = v124;
  731.                 sub_469F0A(v76);
  732.                 v115 = v75;
  733.                 if ( v122 > *(double *)&dvar1 )
  734.                 {
  735.                   if ( v122 < v120 )
  736.                   {
  737.                     v112 = v123;
  738.                     *(float *)&someOx = v112;
  739.                     *(float *)&delta = flt_4AF1F4;
  740.                     v81 = sub_414570((float *)&someOx, (float *)&delta);
  741.                     v124 = v81;
  742.                     v82 = (v120 - v122) / (v120 - *(double *)&dvar1);
  743.                     v122 = v82;
  744.                     v83 = 1.0 - v82;
  745.                     v120 = 1.0 - v82;
  746.                     if ( v114 || fabs(v81) >= 1.570796327 )
  747.                     {
  748.                       v90 = v83;
  749.                       if ( dword_4AF278 )
  750.                       {
  751.                         v91 = v125;
  752.                         v92 = v126;
  753.                         v93 = v121;
  754.                         v94 = DD_MakeColor(0, 0, 0xFFu);
  755.                         sub_41DB60(v94, v62, v93, v92, v91);
  756.                         v90 = v120;
  757.                         v82 = v122;
  758.                       }
  759.                       if ( v82 < 0.5 )
  760.                       {
  761.                         if ( *(_BYTE *)(v69 + 59) )
  762.                         {
  763.                           *(float *)&delta = (v90 - 0.5 + v90 - 0.5) * flt_4AF1F8;
  764.                           v97 = *(float *)&delta;
  765.                           *(float *)&delta = v82 * 3.141592654;
  766.                           flt_4AF1F8 = v97 + *(float *)&delta;
  767.                         }
  768.                       }
  769.                       else
  770.                       {
  771.                         if ( *(_BYTE *)(v69 + 59) )
  772.                         {
  773.                           flt_4AF1F4 = v112;
  774.                           *(float *)&delta = (v82 - 0.5 + v82 - 0.5) * v115;
  775.                           v95 = *(float *)&delta;
  776.                           *(float *)&delta = v90 * 3.141592654;
  777.                           flt_4AF1F8 = v95 + *(float *)&delta;
  778.                         }
  779.                         else
  780.                         {
  781.                           v96 = *(_BYTE *)(v69 + 52);
  782.                         }
  783.                         byte_4AF208 = *(_BYTE *)(v69 + 52);
  784.                       }
  785.                     }
  786.                     else
  787.                     {
  788.                       if ( dword_4AF278 )
  789.                       {
  790.                         v84 = v125;
  791.                         v85 = v126;
  792.                         v86 = v121;
  793.                         v87 = DD_MakeColor(0, 0xFFu, 0);
  794.                         sub_41DB60(v87, v62, v86, v85, v84);
  795.                         v82 = v122;
  796.                         v83 = v120;
  797.                         v81 = v124;
  798.                       }
  799.                       if ( *(_BYTE *)(v69 + 59) )
  800.                       {
  801.                         v88 = v83;
  802.                         v89 = v123 - v81 * v83;
  803.                         v90 = v88;
  804.                         flt_4AF1F4 = v89;
  805.                         flt_4AF1F8 = v115 - (v115 - flt_4AF1F8) * v88;
  806.                       }
  807.                       else
  808.                       {
  809.                         v90 = v83;
  810.                       }
  811.                       delta = *(unsigned __int8 *)(v69 + 52);
  812.                       delta = (signed int)((double)delta - ((double)delta - (double)(unsigned __int8)byte_4AF208) * v90);
  813.                       byte_4AF208 = delta;
  814.                     }
  815.                     delta = *(unsigned __int8 *)(v69 + 53);
  816.                     dword_4AF1D4 = (signed int)((double)delta * v82 + (double)dword_4AF1D4 * v90);
  817.                     delta = *(unsigned __int8 *)(v69 + 54);
  818.                     dword_4AF1D8 = (signed int)((double)delta * v82 + (double)dword_4AF1D8 * v90);
  819.                     delta = *(unsigned __int8 *)(v69 + 55);
  820.                     dword_4AF1DC = (signed int)(v90 * (double)dword_4AF1DC + (double)delta * v82);
  821.                     delta = *(unsigned __int8 *)(v69 + 56);
  822.                     dword_4AF1FC = (signed int)((double)delta * v82);
  823.                     delta = *(unsigned __int8 *)(v69 + 57);
  824.                     dword_4AF200 = (signed int)((double)delta * v82);
  825.                     delta = *(unsigned __int8 *)(v69 + 58);
  826.                     dword_4AF204 = (signed int)(v82 * (double)delta);
  827.                   }
  828.                 }
  829.                 else
  830.                 {
  831.                   if ( *(_BYTE *)(v69 + 59) )
  832.                   {
  833.                     flt_4AF1F4 = v123;
  834.                     flt_4AF1F8 = v75;
  835.                   }
  836.                   dword_4AF1D4 = *(unsigned __int8 *)(v69 + 53);
  837.                   dword_4AF1D8 = *(unsigned __int8 *)(v69 + 54);
  838.                   dword_4AF1DC = *(unsigned __int8 *)(v69 + 55);
  839.                   dword_4AF1FC = *(unsigned __int8 *)(v69 + 56);
  840.                   dword_4AF200 = *(unsigned __int8 *)(v69 + 57);
  841.                   dword_4AF204 = *(unsigned __int8 *)(v69 + 58);
  842.                   byte_4AF208 = *(_BYTE *)(v69 + 52);
  843.                   if ( dword_4AF278 )
  844.                   {
  845.                     v77 = v125;
  846.                     v78 = v126;
  847.                     v79 = v121;
  848.                     v80 = DD_MakeColor(0xFFu, 0, 0);
  849.                     sub_41DB60(v80, v62, v79, v78, v77);
  850.                   }
  851.                 }
  852.                 if ( dword_4AF1D4 != 255 || dword_4AF1D8 != 255 || (dword_4AF1D0 = 0, dword_4AF1DC != 255) )
  853.                   dword_4AF1D0 = 1;
  854.               }
  855.             }
  856.           }
  857.         }
  858.       }
  859. LABEL_239:
  860.       v98 = animation2;
  861.       if ( (unsigned __int16)actor->PaletteIndex >= animation2->PaletteCount )
  862.       {
  863.         if ( animation2->magicNumberOrAnimationId )
  864.           animation2->magicNumberOrAnimationId = 0;
  865.         actor->PaletteIndex = 0;
  866.       }
  867.       v99 = (int *)actor->DecodedPalette;
  868.       if ( v99 )
  869.       {
  870.         v100 = v99[139];
  871.         dword_4AF19C = (int)actor->DecodedPalette;
  872.         if ( !v100 )
  873.         {
  874.           dword_4AF1C4 = *v99;
  875. LABEL_248:
  876.           v101 = actor->field_19C;
  877.           byte_4AF21D = actor->field_19D;
  878.           v102 = (int)v98->ImageSegments;
  879.           byte_4AF21E = v101;
  880.           result = (LONG)v98->ImageLines;
  881.           v103 = (int)v98->ImageContent;
  882.           dword_4AF240 = result;
  883.           dword_4AF244 = v102;
  884.           dword_4AF248 = v103;
  885.           dword_4AF24C = v103;
  886.           if ( dword_4A351C )
  887.           {
  888.             if ( actor->SomeFlags & 8 )
  889.             {
  890.               dword_4AF20C = (int)actor;
  891.               sub_424E60();
  892.               result = dword_4AF274;
  893.               if ( (*(_WORD *)&actor->gap_D0[6] || dword_4AF274 || dword_4AF27C)
  894.                 && actor->Animation != g_am_dialog_icons
  895.                 && !dword_4AF878
  896.                 && !dword_4AF85C
  897.                 && dword_4A2734 )
  898.               {
  899.                 if ( dword_4AF274 )
  900.                 {
  901.                   v104 = actor->posY;
  902.                   v131 = (signed int)actor->posX;
  903.                   v132 = (signed int)v104;
  904.                   sub_405DF0(v62, (int)g_dd_surface04_lpVoid, &v131, 31775);
  905.                   v105 = (signed int)actor->posX - g_some_ox - 30;
  906.                   v106 = (signed int)actor->posY;
  907.                   v134 = dword_4D161C;
  908.                   v107 = v106 - g_some_oy + 5;
  909.                   if ( actor->field_164 )
  910.                   {
  911.                     if ( actor == g_some_actor_infos[0] || actor == g_some_actorInfo2 || actor == g_some_actorInfo3 )
  912.                       sprintf(&Dest, "%s:%de%0.2f", actor, (unsigned __int16)actor->IndexInSegment1, actor->field_54);
  913.                     else
  914.                       sprintf(
  915.                         &Dest,
  916.                         "%s:%de%d",
  917.                         actor,
  918.                         (unsigned __int16)actor->IndexInSegment1,
  919.                         (signed int)actor->field_54);
  920.                   }
  921.                   else
  922.                   {
  923.                     sprintf(&Dest, "%se%d", actor, (signed int)actor->field_54);
  924.                   }
  925.                   sub_4439C0(&Dest);
  926.                   v108 = DD_MakeColor(0xBEu, 0xBEu, 0xBEu);
  927.                   result = DrawTextInRect(
  928.                              g_dd_surface04_lpVoid,
  929.                              2,
  930.                              0,
  931.                              v105,
  932.                              v107,
  933.                              640,
  934.                              v134,
  935.                              0,
  936.                              v108,
  937.                              (unsigned __int8 *)&Dest,
  938.                              0);
  939.                 }
  940.                 if ( actor->field_164
  941.                   && actor != g_some_actor_infos[0]
  942.                   && actor != g_some_actorInfo2
  943.                   && actor != g_some_actorInfo3 )
  944.                 {
  945.                   result = sub_4084B0((int)actor);
  946.                 }
  947.               }
  948.             }
  949.           }
  950. LABEL_271:
  951.           if ( g_skip_actor_animation )
  952.             return result;
  953.           goto LABEL_272;
  954.         }
  955.       }
  956.       else
  957.       {
  958.         v100 = *(_DWORD *)&v98->Palettes->Data[560 * (unsigned __int16)actor->PaletteIndex];
  959.         dword_4AF19C = (int)v98->Palettes + 560 * (unsigned __int16)actor->PaletteIndex;
  960.       }
  961.       dword_4AF1C4 = v100;
  962.       goto LABEL_248;
  963.     }
  964. LABEL_272:
  965.     result = actor->field_84;
  966.     var_zero = 0;
  967.     if ( result )
  968.       result = ProcessActorAnimation2((CHActorInfo *)result, a2, arg_zero1, actor);
  969.     v109 = actor->linkedActor2;
  970.     if ( v109 )
  971.     {
  972.       result = ((unsigned __int8)actor->AnimationSeg2Index + 1) & 7;
  973.       if ( (char)result >= 3 )
  974.       {
  975.         v110 = zeroableActor;
  976.         if ( !zeroableActor )
  977.           v110 = actor;
  978.         result = ProcessActorAnimation2(v109, a2, arg_zero1, v110);
  979.       }
  980.     }
  981.     if ( actor->Animation->animationType != 1 || !(actor->SomeFlags & 8) )
  982.       return result;
  983.     dword_4D56A0 = LODWORD(actor->posX);
  984.     dword_4D56A4 = LODWORD(actor->posY);
  985.     dword_4D56B0 = LODWORD(actor->field_30);
  986.     dword_4D56B4 = LODWORD(actor->field_34);
  987.     arg_zero1 = 0;
  988.     a2 = 0;
  989.     actor = (CHActorInfo *)&dword_4D5680;
  990.   }
  991. LABEL_30:
  992.   if ( actor->field_6C > 0 )
  993.     actor->field_6C = 0;
  994.   return result;
  995. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement