Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; --------------------------------------------------------------------------
  2. ; FILE: TPhotons.Asm
  3. ; DATE: November 1, 2008
  4. ; --------------------------------------------------------------------------
  5.  
  6. ; --------------------------------------------------------------------------
  7. ; Input:
  8. ;   EAX = sector coordinate (X or Y)
  9. ; Output:
  10. ;   CF=1 if EAX is in range [1..10]
  11. ; --------------------------------------------------------------------------
  12. align PROC_ALIGN
  13. TPhotons_IsValidSector:
  14.     cmp     eax, 1
  15.     jb      .invalid
  16.     cmp     eax, 10
  17.     ja      .invalid
  18.  
  19.     stc
  20.     ret
  21.  
  22. .invalid:
  23.     clc
  24.     ret
  25.  
  26. ; --------------------------------------------------------------------------
  27. ; PHOTONS
  28. ; --------------------------------------------------------------------------
  29. virtual at 0
  30. loc44:
  31.     .pTrekData PVOID ?
  32.     .pdbl_KPower PDOUBLE ?
  33.     .nN COUNT ?
  34.     .nTubes COUNT ?
  35.     .bIHURT BOOL ?
  36.     .nI INDEX ?
  37.     .nJ INDEX ?
  38.     .nLL INDEX ?
  39.     .nL INDEX ?
  40.     .nJX INT32 ?
  41.     .nJY INT32 ?
  42.     .torp_IX INT32 ?
  43.     .torp_IY INT32 ?
  44.     .byte_IX BYTE ?
  45.     .byte_IY BYTE ?
  46.     .byte_STARTX BYTE ?
  47.     .byte_STARTY BYTE ?
  48.     .arr_TARGX INTEGERS 6
  49.     .arr_TARGY INTEGERS 6
  50.     ;
  51.     ; I have added here another 3 DOUBLE values (30 bytes) to "improve" the game.
  52.     ; However, that caused a misalignment of the local variables, which
  53.     ; in turn caused the failure of a Sleep API!! (MORALE: Always align the stack!)
  54.     ; Thanks to 'Clerk' from WASM.RU forum I was able to fix the issue.
  55.     ;
  56.     .arr_COURSE DOUBLES 6
  57.     .dbl_R DOUBLE ?
  58.     .dbl_AC DOUBLE ?
  59.     .dbl_TEMP DOUBLE ?
  60.     .dbl_DELTX DOUBLE ?
  61.     .dbl_DELTY DOUBLE ?
  62.     .dbl_HIT DOUBLE ?
  63.     .dbl_ANGLE DOUBLE ?
  64.     .dbl_DELTAX DOUBLE ?
  65.     .dbl_DELTAY DOUBLE ?
  66.     .dbl_BIGGER DOUBLE ?
  67.     .dbl_SINANG DOUBLE ?
  68.     .dbl_X DOUBLE ?
  69.     .dbl_Y DOUBLE ?
  70.     .dbl_DIST DOUBLE ?
  71.     .dbl_DISTN DOUBLE ?
  72.     .dbl_KP DOUBLE ?
  73.     .dbl_ANG DOUBLE ?
  74.     .dbl_SPRANG DOUBLE ?
  75.     .dbl_BETA DOUBLE ?
  76.     .ch_IQUAD CHAR ?
  77.     .ch_reserved CHAR ?
  78.     .size = $
  79. end virtual
  80. ; --------------------------------------------------------------------------
  81. align PROC_ALIGN
  82. TPhotons_Main:
  83.     mcBeginLocals loc44.size
  84.     call    TConsole_SetGameMsgAttr
  85.  
  86.     mcLoadGameDataPtr esi
  87.     mcStoreLocal loc44.pTrekData, esi
  88.     ;
  89.     ; Check torpedo count and status of photon tubes
  90.     ;
  91.     mov     [esi + TREKDATA.IDIDIT], 1
  92.     mov     [esi + TREKDATA.KSHOT], 0
  93.  
  94.     movzx   ecx, [esi + TREKDATA.NPTUBES]
  95.     mcStoreLocal loc44.nTubes, ecx
  96.  
  97.     mov     cl, DEV_PHOTON_TUBES
  98.     call    TArray_IsDamaged
  99.     jnc     .L10
  100.  
  101.     mov     ecx, 340
  102.     call    TConsole_Prout
  103.     jmp     .L3005
  104.  
  105. .L10:
  106.     mcLoadLocal esi, loc44.pTrekData
  107.     cmp     [esi + TREKDATA.TORPS], 0
  108.     jne     .L15
  109.  
  110.     mov     ecx, 341
  111.     call    TConsole_Prout
  112.     jmp     .L3005
  113.  
  114. .L15:
  115.     call    TCmdBuf_Scan
  116.     mov     eax, [ebx + TCmdBuf.cmdbuf_INUM]
  117.     mcStoreLocal loc44.nN, eax
  118.  
  119.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
  120.     je      .L30
  121.  
  122. .L16:
  123.     mcLoadLocal esi, loc44.pTrekData
  124.     movzx   eax, [esi + TREKDATA.TORPS]
  125.     call    TConsole_CramInt
  126.  
  127.     mov     ecx, 342
  128.     call    TConsole_Prout
  129.  
  130.     mov     ecx, 343
  131.     call    TGame_Prompt
  132.     jmp     .L15
  133.  
  134. .L30:
  135.     mcLoadLocal eax, loc44.nN
  136.     cmp     eax, 0
  137.     jle     .L3005
  138.     cmp     eax, [esp + loc44.nTubes]
  139.     jle     .L31
  140.  
  141.     mov     ecx, 344
  142.     call    TConsole_Cram
  143.     mcLoadLocal esi, loc44.pTrekData
  144.     movzx   eax, [esi + TREKDATA.NPTUBES]
  145.     call    TConsole_CramInt
  146.     mov     ecx, 704
  147.     call    TConsole_Prout
  148.     jmp     .L16
  149.  
  150. .L3004:
  151.     call    TMove_BegPardon
  152.  
  153. .L3005:
  154.     mcLoadLocal edi, loc44.pTrekData
  155.     dec     [edi + TREKDATA.IDIDIT]
  156.     jmp     KPHOTON.done
  157.  
  158. .L31:
  159.     mcLoadLocal esi, loc44.pTrekData
  160.     mcLoadLocal eax, loc44.nN
  161.     cmp     al, [esi + TREKDATA.TORPS]
  162.     jle     .L32
  163.     jmp     .L16
  164.  
  165. .L3101:
  166.     ;
  167.     ; All torpedoes fired at same spot
  168.     ;
  169.     cmp     [esp + loc44.nN], 1
  170.     je      .L36
  171.  
  172.     mcLoadLocalRef esi, loc44.arr_TARGX
  173.     mcLoadLocalRef edi, loc44.arr_TARGY
  174.  
  175.     mov     eax, [esi]
  176.     mov     edx, [edi]
  177.     mov     [esi + 4], eax
  178.     mov     [edi + 4], edx
  179.  
  180.     cmp     [esp + loc44.nN], 2
  181.     je      .L36
  182.  
  183.     mov     [esi + 8], eax
  184.     mov     [edi + 8], edx
  185.     jmp     .L36
  186.  
  187. .L32:
  188.     ;
  189.     ; Read in target sectors
  190.     ;
  191.     mcLoad1 eax
  192.     mcStoreLocal loc44.nI, eax
  193.  
  194. .scan_next_target:
  195.     call    TCmdBuf_Scan
  196.  
  197.     mcLoadLocal ecx, loc44.nI
  198.     dec     ecx
  199.     mcLoadLocalRef esi, loc44.arr_TARGX
  200.     mov     eax, [ebx + TCmdBuf.cmdbuf_INUM]
  201.     mov     [esi + ecx*4], eax
  202.     ;
  203.     ; IF ((I == 1) AND (CMD == EOL)) GOTO 34
  204.     ;
  205.     cmp     [esp + loc44.nI], 1
  206.     jne     .L3201
  207.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
  208.     je      .L34
  209.  
  210. .L3201:
  211.     ;
  212.     ; IF ((I == 2) AND (CMD == EOL)) GOTO 3101
  213.     ;
  214.     cmp     [esp + loc44.nI], 2
  215.     jne     .L3202
  216.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
  217.     je      .L3101
  218.  
  219. .L3202:
  220.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
  221.     jne     .L3004
  222.  
  223.     call    TCmdBuf_Scan
  224.  
  225.     mcLoadLocal ecx, loc44.nI
  226.     dec     ecx
  227.     mcLoadLocalRef esi, loc44.arr_TARGY
  228.     mov     eax, [ebx + TCmdBuf.cmdbuf_INUM]
  229.     mov     [esi + ecx*4], eax
  230.  
  231.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
  232.     jne     .L3004
  233.  
  234.     inc     [esp + loc44.nI]
  235.     mov     ecx, [esp + loc44.nI]
  236.     cmp     ecx, [esp + loc44.nN]
  237.     jbe     .scan_next_target
  238.     jmp     .L36
  239.  
  240. .L34:
  241.     mcLoad1 eax
  242.     mcStoreLocal loc44.nI, eax
  243.  
  244. .ask_target_sector:
  245.     mov     cl, ATTR_PROMPT_TEXT
  246.     call    TConsole_SetAttr
  247.  
  248.     mov     ecx, 345
  249.     call    TConsole_Cram
  250.  
  251.     mcLoadLocal eax, loc44.nI
  252.     call    TConsole_CramInt
  253.  
  254.     mov     ecx, 301
  255.     call    TGame_Prompt
  256.  
  257.     call    TCmdBuf_Scan
  258.  
  259.     mcLoadLocal ecx, loc44.nI
  260.     dec     ecx
  261.     mcLoadLocalRef esi, loc44.arr_TARGX
  262.     mov     eax, [ebx + TCmdBuf.cmdbuf_INUM]
  263.     mov     [esi + ecx*4], eax
  264.  
  265.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
  266.     jne     .L3004
  267.  
  268.     call    TCmdBuf_Scan
  269.  
  270.     mcLoadLocal ecx, loc44.nI
  271.     dec     ecx
  272.     mcLoadLocalRef esi, loc44.arr_TARGY
  273.     mov     eax, [ebx + TCmdBuf.cmdbuf_INUM]
  274.     mov     [esi + ecx*4], eax
  275.  
  276.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
  277.     jne     .L3004
  278.  
  279.     inc     [esp + loc44.nI]
  280.     mov     ecx, [esp + loc44.nI]
  281.     cmp     ecx, [esp + loc44.nN]
  282.     jbe     .ask_target_sector
  283.  
  284. .L36:
  285.     ;
  286.     ; Check for invalid targets
  287.     ;
  288.     mcLoadLocal ecx, loc44.nN
  289.     mcLoadLocalRef esi, loc44.arr_TARGX
  290.     mcLoadLocalRef edi, loc44.arr_TARGY
  291.  
  292. .validate_sector:
  293.     mov     eax, [edi]
  294.     add     edi, 4
  295.  
  296.     add     eax, 0
  297.     js      .L3005
  298.  
  299.     call    TPhotons_IsValidSector
  300.     jnc     .L3004
  301.  
  302.     lodsd
  303.  
  304.     add     eax, 0
  305.     js      .L3005
  306.  
  307.     call    TPhotons_IsValidSector
  308.     jnc     .L3004
  309.  
  310.     loop    .validate_sector
  311.     ;
  312.     ; Compute course for each torpedo
  313.     ;
  314.     mcLoad1 eax
  315.     mcStoreLocal loc44.nI, eax
  316.  
  317. .next_course:
  318.     mcLoadLocal ecx, loc44.nI
  319.     dec     ecx
  320.  
  321.     mcLoadLocalRef esi, loc44.arr_TARGY
  322.     mov     eax, [esi + ecx*4]
  323.  
  324.     mcLoadLocal ebx, loc44.pTrekData
  325.     movzx   edx, [ebx + TREKDATA.SECTY]
  326.  
  327.     sub     eax, edx
  328.     call    TCommon_FPU_Load_EAX
  329.     fld     [glb_dbl_0dot1]
  330.     fmulp
  331.     fstp    [esp + loc44.dbl_DELTX]
  332.  
  333.     mcLoadLocalRef esi, loc44.arr_TARGX
  334.     mov     edx, [esi + ecx*4]
  335.     movzx   eax, [ebx + TREKDATA.SECTX]
  336.  
  337.     sub     eax, edx
  338.     call    TCommon_FPU_Load_EAX
  339.     fld     [glb_dbl_0dot1]
  340.     fmulp
  341.     fstp    [esp + loc44.dbl_DELTY]
  342.     ;
  343.     ; Do not shoot the ENTERPRISE!
  344.     ;
  345.     fld     [esp + loc44.dbl_DELTX]
  346.     fldz
  347.     mc_CMP_ST0_ST1
  348.     jnz     .L40
  349.  
  350.     fld     [esp + loc44.dbl_DELTY]
  351.     fldz
  352.     mc_CMP_ST0_ST1
  353.     jnz     .L40
  354.  
  355.     call    TConsole_ScrollUp
  356.     call    TConsole_SetCrewMsgAttr
  357.     mov     ecx, 346
  358.     call    TConsole_Prout
  359.     mov     ecx, 347
  360.     call    TConsole_Prout
  361.     mov     ecx, 348
  362.     call    TConsole_Prout
  363.     jmp     .L3005
  364.  
  365. .L40:
  366.     fld     [esp + loc44.dbl_DELTX]
  367.     fld     [esp + loc44.dbl_DELTY]
  368.     fpatan
  369.     fld     [glb_dbl_1dot90985932]
  370.     fmulp
  371.     mcLoadLocal ecx, loc44.nI
  372.     dec     ecx
  373.     imul    ecx, 10
  374.     mcLoadLocalRef edi, loc44.arr_COURSE
  375.     fstp    tbyte [edi + ecx]
  376.  
  377.     inc     [esp + loc44.nI]
  378.     mov     ecx, [esp + loc44.nI]
  379.     cmp     ecx, [esp + loc44.nN]
  380.     jbe     .next_course
  381.     ;
  382.     ; Begin outer loop for moving torpedoes
  383.     ;
  384.     mcZeroBits eax
  385.     mcStoreLocal loc44.nI, eax
  386.  
  387. .L50:
  388.     inc     [esp + loc44.nI]
  389.     mov     ecx, [esp + loc44.nI]
  390.     cmp     ecx, [esp + loc44.nN]
  391.     ja      KPHOTON.L115
  392.  
  393.     mcLoadLocal esi, loc44.pTrekData
  394.     cmp     [esi + TREKDATA.CONDIT], CONDITION_DOCKED
  395.     je      .L50001
  396.  
  397.     dec     [esi + TREKDATA.TORPS]
  398.     jnz     .L50001
  399.  
  400.     mov     [esi + TREKDATA.QTORPS], 0
  401.  
  402. .L50001:
  403.     ;
  404.     ; J=I
  405.     ;
  406.     mcLoadLocal eax, loc44.nI
  407.     mcStoreLocal loc44.nJ, eax
  408.  
  409.     mov     al, [esi + TREKDATA.SECTX]
  410.     mov     dl, [esi + TREKDATA.SECTY]
  411.     mcStoreLocal loc44.byte_STARTX, al
  412.     mcStoreLocal loc44.byte_STARTY, dl
  413.  
  414.     call    TRandom_Ranf
  415.     call    TRandom_Ranf
  416.     faddp
  417.     fld     [glb_dbl_0dot5]
  418.     fmulp
  419.     fld     [glb_dbl_0dot5]
  420.     fsubp
  421.     fstp    [esp + loc44.dbl_R]
  422.  
  423.     fld     [glb_dbl_0dot49]
  424.     fld     [esp + loc44.dbl_R]
  425.     fabs
  426.     mc_CMP_ST0_ST1
  427.     jc      .L5709
  428.  
  429.     call    TRandom_Ranf
  430.     fld     [glb_dbl_1dot2]
  431.     faddp
  432.     fld     [esp + loc44.dbl_R]
  433.     fmulp
  434.     fstp    [esp + loc44.dbl_R]
  435.     ;
  436.     ; Torpedo misfires
  437.     ;
  438.     mov     cl, ATTR_HIT_DAMAGE
  439.     call    TConsole_SetAttr
  440.  
  441.     cmp     [esp + loc44.nN], 1
  442.     ja      .L5706
  443.  
  444.     mov     ecx, 349
  445.     call    TConsole_Prout
  446.     jmp     .L5707
  447.  
  448. .L5706:
  449.     mov     ecx, 350
  450.     call    TConsole_Cram
  451.     mcLoadLocal eax, loc44.nI
  452.     call    TConsole_CramInt
  453.     mov     ecx, 351
  454.     call    TConsole_Prout
  455.  
  456.     mov     eax, [esp + loc44.nI]
  457.     cmp     eax, [esp + loc44.nN]
  458.     je      .abort_burst
  459.  
  460.     mov     ecx, 352
  461.     call    TConsole_Prout
  462.  
  463. .abort_burst:
  464.     mcLoadLocal eax, loc44.nN
  465.     mcStoreLocal loc44.nI, eax
  466.  
  467. .L5707:
  468.     call    TRandom_Ranf
  469.     fld     [glb_dbl_0dot2]
  470.     mc_CMP_ST0_ST1
  471.     jc      .L5709
  472.  
  473.     call    TRandom_Ranf
  474.     fld     st
  475.     faddp
  476.     fld1
  477.     faddp
  478.     mcLoadLocal esi, loc44.pTrekData
  479.     fld     [esi + TREKDATA.DAMFAC]
  480.     fmulp
  481.     mov     cl, DEV_PHOTON_TUBES
  482.     call    TArray_SetDblDamage
  483.     jmp     KPHOTON.L115
  484.  
  485. .increase_deflection:
  486.     fld     [esp + loc44.dbl_R]
  487.     fld     [esi + TREKDATA.SHLD]
  488.     fmulp
  489.     fld     [glb_dbl_0dot001]
  490.     fmulp
  491.     fld     [esp + loc44.dbl_R]
  492.     faddp
  493.     fstp    [esp + loc44.dbl_R]
  494.     jmp     .calc_AC
  495.  
  496. .L5709:
  497.     mcLoadLocal esi, loc44.pTrekData
  498.     cmp     [esi + TREKDATA.QTORPS], 1
  499.     je      .calc_quantum_R
  500.     cmp     [esi + TREKDATA.SHLDUP], 0
  501.     jne     .increase_deflection
  502.     cmp     [esi + TREKDATA.CONDIT], CONDITION_DOCKED
  503.     je      .increase_deflection
  504.     jmp     .calc_AC
  505.  
  506. .calc_quantum_R:
  507.     call    TRandom_Ranf
  508.     fld     [glb_dbl_0dot15]
  509.     fmulp
  510.     fstp    [esp + loc44.dbl_R]
  511.  
  512. .calc_AC:
  513.     mcLoadLocal ecx, loc44.nI
  514.     dec     ecx
  515.     imul    ecx, 10
  516.     mcLoadLocalRef edi, loc44.arr_COURSE
  517.     fld     [glb_dbl_DOCKFAC]
  518.     fld     [esp + loc44.dbl_R]
  519.     fmulp
  520.     fld     tbyte [edi + ecx]
  521.     faddp
  522.     fstp    [esp + loc44.dbl_AC]
  523.     jmp     KPHOTON.L5710
  524.  
  525. KPHOTON:
  526.     ;
  527.     ; Enemy fires photon torpedo!
  528.     ;
  529.     mcBeginLocals loc44.size
  530.  
  531.     mcLoadGameDataPtr esi
  532.     mcStoreLocal loc44.pTrekData, esi
  533.  
  534.     movzx   ecx, [esi + TREKDATA.KSHOT]
  535.     dec     ecx
  536.     lea     edi, [esi + TREKDATA.KY]
  537.     add     esi, TREKDATA.KX
  538.     mov     al, [esi + ecx]
  539.     mov     dl, [edi + ecx]
  540.     mcStoreLocal loc44.byte_IX, al
  541.     mcStoreLocal loc44.byte_IY, dl
  542.     mcStoreLocal loc44.byte_STARTX, al
  543.     mcStoreLocal loc44.byte_STARTY, dl
  544.  
  545.     mcLoad1 eax
  546.     mcStoreLocal loc44.nI, eax
  547.     mcStoreLocal loc44.nN, eax
  548.  
  549.     mcLoadLocal esi, loc44.pTrekData
  550.     mov     al, [esi + TREKDATA.SECTY]
  551.     sub     al, [esp + loc44.byte_STARTY]
  552.     movsx   eax, al
  553.     call    TCommon_FPU_Load_EAX
  554.     fld     [glb_dbl_0dot1]
  555.     fmulp
  556.     fstp    [esp + loc44.dbl_DELTX]
  557.  
  558.     mov     al, [esp + loc44.byte_STARTX]
  559.     sub     al, [esi + TREKDATA.SECTX]
  560.     movsx   eax, al
  561.     call    TCommon_FPU_Load_EAX
  562.     fld     [glb_dbl_0dot1]
  563.     fmulp
  564.     fstp    [esp + loc44.dbl_DELTY]
  565.  
  566.     fld     [esp + loc44.dbl_DELTX]
  567.     fld     [esp + loc44.dbl_DELTY]
  568.     fpatan
  569.     fld     [glb_dbl_1dot90985932]
  570.     fmulp
  571.     fstp    [esp + loc44.dbl_AC]
  572.  
  573.     call    TRandom_Ranf
  574.     fld     [glb_dbl_0dot5]
  575.     fsubp
  576.     fstp    [esp + loc44.dbl_TEMP]
  577.  
  578.     mcLoadLocal esi, loc44.pTrekData
  579.     movzx   ecx, [esi + TREKDATA.KSHOT]
  580.     dec     ecx
  581.     imul    ecx, 10
  582.     lea     ebx, [esi + TREKDATA.KPOWER]
  583.     fld     tbyte [ebx + ecx]
  584.     fld     [glb_dbl_0dot001]
  585.     fmulp
  586.     fld1
  587.     faddp
  588.     fld     [esp + loc44.dbl_TEMP]
  589.     fmulp
  590.  
  591.     call    TRandom_Ranf
  592.     fld     [esp + loc44.dbl_TEMP]
  593.     fmulp
  594.     faddp
  595.     fld     st
  596.     fstp    [esp + loc44.dbl_R]
  597.  
  598.     fld     [glb_dbl_DOCKFAC]
  599.     fmulp
  600.     fld     [esp + loc44.dbl_AC]
  601.     faddp
  602.     fstp    [esp + loc44.dbl_AC]
  603.  
  604.     call    TConsole_SetGameMsgAttr
  605.     mcLoadLocal al, loc44.byte_IX
  606.     mcLoadLocal dl, loc44.byte_IY
  607.     call    TConsole_CramEnemyAtEx
  608.     mov     ecx, 354
  609.     call    TConsole_Prout
  610.     ;
  611.     ; Check for klingon misfire
  612.     ;
  613.     fld     [glb_dbl_0dot45]
  614.     fld     [esp + loc44.dbl_TEMP]
  615.     fabs
  616.     mc_CMP_ST0_ST1
  617.     jc      .L5710
  618.     ;
  619.     ; Enemy torpedo misfired. Determine damage.
  620.     ;
  621.     fld     [glb_dbl_15]
  622.     fld     [esp + loc44.dbl_AC]
  623.     fsubp
  624.     fld     [glb_dbl_0dot5235988]
  625.     fmulp
  626.     fstp    [esp + loc44.dbl_ANGLE]
  627.  
  628.     call    TRandom_Ranf
  629.     fld     [glb_dbl_600]
  630.     fmulp
  631.     fld     [glb_dbl_200]
  632.     faddp
  633.     fstp    [esp + loc44.dbl_HIT]
  634.  
  635.     mcLoadLocal esi, loc44.pTrekData
  636.     movzx   ecx, [esi + TREKDATA.KSHOT]
  637.     mcStoreLocal loc44.nLL, ecx
  638.     ;
  639.     ; BUG FIX! Set these members as if torpedo hit him!
  640.     ;
  641.     dec     ecx
  642.     movzx   eax, [esi + ecx + TREKDATA.KX]
  643.     movzx   edx, [esi + ecx + TREKDATA.KY]
  644.     mcStoreLocal loc44.torp_IX, eax
  645.     mcStoreLocal loc44.torp_IY, edx
  646.  
  647.     call    TArray_QuadPtr
  648.     mov     al, [ebx]
  649.     mcStoreLocal loc44.ch_IQUAD, al
  650.  
  651.     mov     ecx, 355
  652.     call    TConsole_Prout
  653.     jmp     .L68
  654.  
  655. .L5710:
  656.     fld     [glb_dbl_15]
  657.     fld     [esp + loc44.dbl_AC]
  658.     fsubp
  659.     fld     [glb_dbl_0dot5235988]
  660.     fmulp
  661.     fstp    [esp + loc44.dbl_ANGLE]
  662.  
  663.     call    TConsole_SetGameMsgAttr
  664.     cmp     [esp + loc44.nN], 1
  665.     je      .L58
  666.  
  667.     call    TConsole_ScrollUp
  668.     mov     ecx, 356
  669.     call    TConsole_Cram
  670.     mcLoadLocal eax, loc44.nJ
  671.     call    TConsole_CramInt
  672.  
  673. .L5720:
  674.     mov     ecx, 357
  675.     call    TConsole_Cram
  676.     jmp     .L59
  677.  
  678. .L58:
  679.     call    TConsole_ScrollUp
  680.     mov     ecx, 358
  681.     call    TConsole_Cram
  682.  
  683. .L59:
  684.     fld     [esp + loc44.dbl_ANGLE]
  685.     fld     st
  686.     fsin
  687.     fchs
  688.     fstp    [esp + loc44.dbl_DELTAX]
  689.     fcos
  690.     fstp    [esp + loc44.dbl_DELTAY]
  691.  
  692.     fld     [esp + loc44.dbl_DELTAX]
  693.     fabs
  694.     fld     [esp + loc44.dbl_DELTAY]
  695.     fabs
  696.     call    TCommon_FPU_Max
  697.     fstp    [esp + loc44.dbl_BIGGER]
  698.  
  699.     fld     [esp + loc44.dbl_DELTAX]
  700.     fld     [esp + loc44.dbl_BIGGER]
  701.     fdivp
  702.     fstp    [esp + loc44.dbl_DELTAX]
  703.  
  704.     fld     [esp + loc44.dbl_DELTAY]
  705.     fld     [esp + loc44.dbl_BIGGER]
  706.     fdivp
  707.     fstp    [esp + loc44.dbl_DELTAY]
  708.  
  709.     mov     al, [esp + loc44.byte_STARTX]
  710.     call    TCommon_LoadByteIntoFPU
  711.     fstp    [esp + loc44.dbl_X]
  712.  
  713.     mov     al, [esp + loc44.byte_STARTY]
  714.     call    TCommon_LoadByteIntoFPU
  715.     fstp    [esp + loc44.dbl_Y]
  716.     ;
  717.     ; Begin inner loop for moving a single torpedo
  718.     ;
  719.     mcZeroBits eax
  720.     mcStoreLocal loc44.nL, eax
  721.  
  722. .L5910:
  723.     inc     [esp + loc44.nL]
  724.     ;
  725.     ; X += DELTAX
  726.     ;
  727.     fld     [esp + loc44.dbl_X]
  728.     fld     [esp + loc44.dbl_DELTAX]
  729.     faddp
  730.     fld     st
  731.     fstp    [esp + loc44.dbl_X]
  732.     frndint
  733.     call    TCommon_FP_Truncate
  734.     mcStoreLocal loc44.torp_IX, eax
  735.  
  736.     cmp     eax, 1
  737.     jl      .L105
  738.     cmp     eax, 10
  739.     jg      .L105
  740.     ;
  741.     ; Y += DELTAY
  742.     ;
  743.     fld     [esp + loc44.dbl_Y]
  744.     fld     [esp + loc44.dbl_DELTAY]
  745.     faddp
  746.     fld     st
  747.     fstp    [esp + loc44.dbl_Y]
  748.     frndint
  749.     call    TCommon_FP_Truncate
  750.     mcStoreLocal loc44.torp_IY, eax
  751.  
  752.     cmp     eax, 1
  753.     jl      .L105
  754.     cmp     eax, 10
  755.     jg      .L105
  756.     ;
  757.     ; Check if new line must be done in track.
  758.     ;
  759.     cmp     [esp + loc44.nL], 4
  760.     je      .new_line
  761.     cmp     [esp + loc44.nL], 9
  762.     jne     .print_track
  763.  
  764. .new_line:
  765.     call    TConsole_ScrollUp
  766.  
  767. .print_track:
  768.     mov     cl, 1
  769.     fld     [esp + loc44.dbl_X]
  770.     call    TConsole_CramFloat
  771.  
  772.     mcLoad8bitsToReg32 ecx, 59
  773.     call    TConsole_Cram
  774.  
  775.     mov     cl, 1
  776.     fld     [esp + loc44.dbl_Y]
  777.     call    TConsole_CramFloat
  778.  
  779.     mov     cl, 3
  780.     call    TConsole_RepeatBlank
  781.  
  782.     mcLoadLocal eax, loc44.torp_IX
  783.     mcLoadLocal edx, loc44.torp_IY
  784.     call    TArray_QuadPtr
  785.     mov     al, [ebx]
  786.     mcStoreLocal loc44.ch_IQUAD, al
  787.  
  788.     cmp     al, CHAR_COSMOS
  789.     je      .L5910
  790.  
  791.     call    TConsole_ScrollUp
  792.     invoke  Sleep, 800
  793.     ;
  794.     ; Begin hit checks.
  795.     ;
  796.     movzx   ecx, [esp + loc44.byte_STARTX]
  797.     sub     ecx, [esp + loc44.torp_IX]
  798.     imul    ecx, ecx
  799.  
  800.     movzx   eax, [esp + loc44.byte_STARTY]
  801.     sub     eax, [esp + loc44.torp_IY]
  802.     imul    eax, eax
  803.  
  804.     add     eax, ecx
  805.     call    TCommon_FPU_Load_EAX
  806.     fsqrt
  807.     fstp    [esp + loc44.dbl_DIST]
  808.  
  809.     mov     eax, [esp + loc44.torp_IY]
  810.     movzx   ecx, [esp + loc44.byte_STARTY]
  811.     sub     eax, ecx
  812.     call    TCommon_FPU_Load_EAX
  813.     fld     [glb_dbl_0dot1]
  814.     fmulp
  815.     fstp    [esp + loc44.dbl_DELTX]
  816.  
  817.     mov     ecx, [esp + loc44.torp_IX]
  818.     movzx   eax, [esp + loc44.byte_STARTX]
  819.     sub     eax, ecx
  820.     call    TCommon_FPU_Load_EAX
  821.     fld     [glb_dbl_0dot1]
  822.     fmulp
  823.     fstp    [esp + loc44.dbl_DELTY]
  824.     ;
  825.     ; BULSEYE
  826.     ;
  827.     fld     [esp + loc44.dbl_DELTX]
  828.     fld     [esp + loc44.dbl_DELTY]
  829.     fpatan
  830.     fld     [glb_dbl_1dot90985932]
  831.     fmulp
  832.     fld     [glb_dbl_15]
  833.     fsubrp
  834.     fld     [glb_dbl_0dot5235988]
  835.     fmulp
  836.     fld     [esp + loc44.dbl_ANGLE]
  837.     fsubrp
  838.     fsin
  839.     fld     st
  840.     fstp    [esp + loc44.dbl_SINANG]
  841.  
  842.     fabs
  843.     fld     [esp + loc44.dbl_DIST]
  844.     fmulp
  845.     fstp    [esp + loc44.dbl_DISTN]
  846.     ;
  847.     ; HIT=(700.0 + 100*RANF(0)) - DISTN*1000.0
  848.     ;
  849.     call    TRandom_Ranf
  850.     fld     [glb_dbl_100]
  851.     fmulp
  852.     fld     [glb_dbl_700]
  853.     faddp
  854.  
  855.     fld     [esp + loc44.dbl_DISTN]
  856.     fld     [glb_dbl_1000]
  857.     fmulp
  858.     fsubp
  859.     fstp    [esp + loc44.dbl_HIT]
  860.     ;
  861.     ; Quantum warhead packs a punch!
  862.     ;
  863.     mcLoadLocal esi, loc44.pTrekData
  864.     cmp     [esi + TREKDATA.QTORPS], 1
  865.     jne     .check_object_type
  866.     cmp     [esi + TREKDATA.KSHOT], 0
  867.     jne     .check_object_type
  868.  
  869.     call    TRandom_Ranf
  870.     fld     [glb_dbl_700]
  871.     fmulp
  872.     fld     [glb_dbl_700]
  873.     faddp
  874.     fld     [esp + loc44.dbl_HIT]
  875.     faddp
  876.     fstp    [esp + loc44.dbl_HIT]
  877.     ;
  878.     ; Test for a type of object hit by torpedo
  879.     ;
  880. .check_object_type:
  881.     mcLoadLocal al, loc44.ch_IQUAD
  882.     mcOnRegEqu al, CHAR_KLINGON, .L62
  883.     mcOnRegEqu al, CHAR_ROMULAN, .L62
  884.     mcOnRegEqu al, CHAR_COMMANDER, .check_anti_photon
  885.     mcOnRegEqu al, CHAR_SCOM, .check_anti_photon
  886.     jmp     .L70
  887.  
  888. .check_anti_photon:
  889.     call    TRandom_Ranf
  890.     fld     [glb_dbl_0dot05]
  891.     mc_CMP_ST0_ST1
  892.     jc      .L62
  893.  
  894.     call    TConsole_SetGameMsgAttr
  895.     mov     cl, 2
  896.     mcLoadLocal bl, loc44.ch_IQUAD
  897.     mcLoadLocal eax, loc44.torp_IX
  898.     mcLoadLocal edx, loc44.torp_IY
  899.     call    TConsole_CramEnemyAt
  900.     mov     ecx, 360
  901.     call    TConsole_Prout
  902.     mov     ecx, 361
  903.     call    TConsole_Prout
  904.     jmp     TPhotons_Main.L50
  905.  
  906. .L62:
  907.     mcLoadLocal ebx, loc44.pTrekData
  908.     mcLoadMemberRef esi, TREKDATA.KX
  909.     mcLoadMemberRef edi, TREKDATA.KY
  910.     movzx   ecx, [ebx + TREKDATA.NENHERE]
  911.  
  912.     mcZeroBits eax
  913.     mcStoreLocal loc44.nLL, eax
  914.  
  915.     mcLoadLocal eax, loc44.torp_IX
  916.     mcLoadLocal edx, loc44.torp_IY
  917.  
  918. .find_klingon:
  919.     inc     [esp + loc44.nLL]
  920.  
  921.     cmp     al, [esi]
  922.     jne     .next_klingon
  923.  
  924.     cmp     dl, [edi]
  925.     je      .L68
  926.  
  927. .next_klingon:
  928.     inc     esi
  929.     inc     edi
  930.     loop    .find_klingon
  931.  
  932.     ;int     3
  933.     jmp     .done
  934.  
  935. .L68:
  936.     mcLoadLocal ecx, loc44.nLL
  937.     call    TArray_KlingonPowerPtr
  938.     mcStoreLocal loc44.pdbl_KPower, edx
  939.     fld     tbyte [edx]
  940.     fstp    [esp + loc44.dbl_KP]
  941.  
  942.     fld     [esp + loc44.dbl_KP]
  943.     fabs
  944.     fld     [esp + loc44.dbl_HIT]
  945.     call    TCommon_FPU_Min
  946.  
  947.     fld     [esp + loc44.dbl_KP]
  948.     call    TCommon_FPU_SignAB
  949.  
  950.     fld     [esp + loc44.dbl_KP]
  951.     fsubrp
  952.     mcLoadLocal edi, loc44.pdbl_KPower
  953.     fld     st
  954.     fstp    tbyte [edi]
  955.  
  956.     fldz
  957.     mc_CMP_ST0_ST1
  958.     jnz     .L69
  959.  
  960.     mcLoadLocal ecx, loc44.nLL
  961.     dec     ecx
  962.     mcLoadLocal ebx, loc44.pTrekData
  963.     mcLoadMemberRef esi, TREKDATA.KX
  964.     mcLoadMemberRef edi, TREKDATA.KY
  965.     mov     al, [esi + ecx]
  966.     mov     dl, [edi + ecx]
  967.     call    TPhasers_DeadKlingon
  968.     jmp     TPhotons_Main.L50
  969.  
  970. .L69:
  971.     call    TConsole_SetGameMsgAttr
  972.     mov     cl, 2
  973.     mcLoadLocal bl, loc44.ch_IQUAD
  974.     mcLoadLocal eax, loc44.torp_IX
  975.     mcLoadLocal edx, loc44.torp_IY
  976.     call    TConsole_CramEnemyAt
  977.  
  978. .L6901:
  979.     ;
  980.     ; If enemy damaged, but not destroyed - try
  981.     ; to displace him.
  982.     ;
  983.     call    TRandom_Ranf
  984.     fld     [glb_dbl_0dot5]
  985.     fsubp
  986.     fld     [glb_dbl_2dot5]
  987.     fmulp
  988.     fld     [esp + loc44.dbl_ANGLE]
  989.     faddp
  990.     fstp    [esp + loc44.dbl_ANG]
  991.  
  992.     fld     [esp + loc44.dbl_ANG]
  993.     fcos
  994.     fabs
  995.     fld     [esp + loc44.dbl_ANG]
  996.     fsin
  997.     fabs
  998.     call    TCommon_FPU_Max
  999.     fstp    [esp + loc44.dbl_TEMP]
  1000.  
  1001.     fld     [esp + loc44.dbl_ANG]
  1002.     fsin
  1003.     fchs
  1004.     fld     [esp + loc44.dbl_TEMP]
  1005.     fdivp
  1006.     fstp    [esp + loc44.dbl_X]
  1007.  
  1008.     fld     [esp + loc44.dbl_ANG]
  1009.     fcos
  1010.     fld     [esp + loc44.dbl_TEMP]
  1011.     fdivp
  1012.     fstp    [esp + loc44.dbl_Y]
  1013.     ;
  1014.     ; Calculate JX,JY - sector of displacement.
  1015.     ;
  1016.     fild    [esp + loc44.torp_IX]
  1017.     fld     [esp + loc44.dbl_X]
  1018.     faddp
  1019.     frndint
  1020.     call    TCommon_FP_Truncate
  1021.     mcStoreLocal loc44.nJX, eax
  1022.  
  1023.     fild    [esp + loc44.torp_IY]
  1024.     fld     [esp + loc44.dbl_Y]
  1025.     faddp
  1026.     frndint
  1027.     call    TCommon_FP_Truncate
  1028.     mcStoreLocal loc44.nJY, eax
  1029.     ;
  1030.     ; If displacement sector is out of quadrant range
  1031.     ; then simply report that enemy is not yet destroyed.
  1032.     ;
  1033.     cmp     eax, 1
  1034.     jl      .L6905
  1035.     cmp     eax, 10
  1036.     jg      .L6905
  1037.  
  1038.     mcLoadLocal eax, loc44.nJX
  1039.     cmp     eax, 1
  1040.     jl      .L6905
  1041.     cmp     eax, 10
  1042.     jg      .L6905
  1043.     ;
  1044.     ; Check if displaced into a black hole!
  1045.     ;
  1046.     mcLoadLocal edx, loc44.nJY
  1047.     call    TArray_QuadPtr
  1048.     mov     al, [ebx]
  1049.     mcOnRegNotEqu al, CHAR_BLACK_HOLE, .L6903
  1050.     ;
  1051.     ; Someone falls into a black hole!
  1052.     ;
  1053.     mov     ecx, 362
  1054.     call    TConsole_Prout
  1055.  
  1056.     mcLoadLocal esi, loc44.pTrekData
  1057.     mov     al, [esi + TREKDATA.SHIP]
  1058.     cmp     al, [esp + loc44.ch_IQUAD]
  1059.     jne     .L6902
  1060.  
  1061.     mov     al, 21
  1062.     call    TFinish_Main
  1063.     jmp     .done
  1064.  
  1065. .L6902:
  1066.     mcLoadLocal eax, loc44.torp_IX
  1067.     mcLoadLocal edx, loc44.torp_IY
  1068.     call    TPhasers_DeadKlingon
  1069.     jmp     TPhotons_Main.L50
  1070.  
  1071. .L6903:
  1072.     mcOnRegNotEqu al, CHAR_COSMOS, .L6905
  1073.     ;
  1074.     ; Displace it!
  1075.     ;
  1076.     mcLoadLocal eax, loc44.torp_IX
  1077.     mcLoadLocal edx, loc44.torp_IY
  1078.     call    TArray_QuadPtr
  1079.     mov     byte [ebx], CHAR_COSMOS
  1080.  
  1081.     mcLoadLocal eax, loc44.nJX
  1082.     mcLoadLocal edx, loc44.nJY
  1083.     call    TArray_QuadPtr
  1084.     mcLoadLocal al, loc44.ch_IQUAD
  1085.     mov     [ebx], al
  1086.  
  1087.     mov     ecx, 363
  1088.     call    TConsole_Prout
  1089.     mov     ecx, 364
  1090.     call    TConsole_Cram
  1091.     mov     cl, 2
  1092.     mcLoadLocal eax, loc44.nJX
  1093.     mcLoadLocal edx, loc44.nJY
  1094.     call    TConsole_CramLoc
  1095.     call    TConsole_ScrollUp
  1096.  
  1097.     mcLoadLocal esi, loc44.pTrekData
  1098.     mov     al, [esi + TREKDATA.SHIP]
  1099.     cmp     al, [esp + loc44.ch_IQUAD]
  1100.     jne     .L6904
  1101.     ;
  1102.     ; Starship displaced by a torpedo.
  1103.     ; Move it and reset enemy distances.
  1104.     ;
  1105.     mcLoadLocal eax, loc44.nJX
  1106.     mcLoadLocal edx, loc44.nJY
  1107.     mov     [esi + TREKDATA.SECTX], al
  1108.     mov     [esi + TREKDATA.SECTY], dl
  1109.  
  1110. .reset_distance:
  1111.     call    TCommon_ResetDist
  1112.     jmp     TPhotons_Main.L50
  1113.  
  1114. .L6904:
  1115.     ;
  1116.     ; Enemy displaced by photon blast!
  1117.     ;
  1118.     mcLoadLocal ebx, loc44.pTrekData
  1119.     mcLoadLocal ecx, loc44.nLL
  1120.     dec     ecx
  1121.  
  1122.     mcLoadMemberRef esi, TREKDATA.KX
  1123.     mcLoadMemberRef edi, TREKDATA.KY
  1124.     mcLoadLocal eax, loc44.nJX
  1125.     mcLoadLocal edx, loc44.nJY
  1126.     mov     [esi + ecx], al
  1127.     mov     [edi + ecx], dl
  1128.     jmp     .reset_distance
  1129.  
  1130. .L6905:
  1131.     mov     ecx, 365
  1132.     call    TConsole_Prout
  1133.     jmp     TPhotons_Main.L50
  1134.  
  1135. .L70:
  1136.     cmp     [esp + loc44.ch_IQUAD], CHAR_THOLIAN
  1137.     jne     .L7002
  1138.  
  1139.     mcLoadLocal eax, loc44.torp_IX
  1140.     mcLoadLocal edx, loc44.torp_IY
  1141.     call    TConsole_CramEnemyAtEx
  1142.  
  1143.     fld     [glb_dbl_600]
  1144.     fld     [esp + loc44.dbl_HIT]
  1145.     mc_CMP_ST0_ST1
  1146.     jc      .L7001
  1147.  
  1148.     mov     ecx, 306
  1149.     call    TConsole_Prout
  1150.  
  1151.     mcLoadLocal eax, loc44.torp_IX
  1152.     mcLoadLocal edx, loc44.torp_IY
  1153.     call    TArray_QuadPtr
  1154.     mov     byte [ebx], CHAR_COSMOS
  1155.  
  1156. .cleanup_tholian:
  1157.     mcLoadLocal ebx, loc44.pTrekData
  1158.     mcZeroBits eax
  1159.     mcStoreMember TREKDATA.ITHERE, al
  1160.     mcStoreMember TREKDATA.ITHX, al
  1161.     mcStoreMember TREKDATA.ITHY, al
  1162.     jmp     TPhotons_Main.L50
  1163.  
  1164. .L7001:
  1165.     fld     [glb_dbl_0dot05]
  1166.     call    TRandom_Ranf
  1167.     mc_CMP_ST0_ST1
  1168.     jc      .tholian_left
  1169.  
  1170. .L7510:
  1171.     mov     ecx, 366
  1172.     call    TConsole_Prout
  1173.     jmp     TPhotons_Main.L50
  1174.  
  1175. .tholian_left:
  1176.     mov     ecx, 367
  1177.     call    TConsole_Prout
  1178.  
  1179.     mcLoadLocal eax, loc44.torp_IX
  1180.     mcLoadLocal edx, loc44.torp_IY
  1181.     call    TArray_QuadPtr
  1182.     mov     byte [ebx], CHAR_WEB
  1183.  
  1184.     mov     al, CHAR_BLACK_HOLE
  1185.     call    TCommon_DropIn
  1186.     jmp     .cleanup_tholian
  1187.  
  1188. .L7002:
  1189.     cmp     [esp + loc44.ch_IQUAD], CHAR_WEB
  1190.     jne     .L7005
  1191.  
  1192.     mov     ecx, 368
  1193.     call    TConsole_Prout
  1194.     jmp     TPhotons_Main.L50
  1195.  
  1196. .L7005:
  1197.     cmp     [esp + loc44.ch_IQUAD], CHAR_STARBASE
  1198.     jne     .L75
  1199.     ;
  1200.     ; Starbase hit!
  1201.     ;
  1202.     mcLoadLocal eax, loc44.torp_IX
  1203.     mcLoadLocal edx, loc44.torp_IY
  1204.     call    TConsole_CramEnemyAtEx
  1205.  
  1206.     fld     [glb_dbl_600]
  1207.     fld     [esp + loc44.dbl_HIT]
  1208.     mc_CMP_ST0_ST1
  1209.     jc      .L7510
  1210.  
  1211.     mov     ecx, 369
  1212.     call    TConsole_Cram
  1213.  
  1214.     mcLoadLocal esi, loc44.pTrekData
  1215.     cmp     [esi + TREKDATA.IPHWHO], 1
  1216.     je      .end_msg
  1217.  
  1218.     mov     ecx, 370
  1219.     call    TConsole_Cram
  1220.  
  1221. .end_msg:
  1222.     mov     al, '.'
  1223.     call    TConsole_PutChar
  1224.     call    TConsole_ScrollUp
  1225.  
  1226.     mcLoadLocal esi, loc44.pTrekData
  1227.     mov     al, [esi + TREKDATA.QUADX]
  1228.     mov     dl, [esi + TREKDATA.QUADY]
  1229.     call    TArray_StarChartPtr
  1230.     add     dword [ebx], 0
  1231.     jns     .clean_base
  1232.  
  1233.     mcZeroBits eax
  1234.     mov     [ebx], eax
  1235.  
  1236. .clean_base:
  1237.     mcLoadLocal ebx, loc44.pTrekData
  1238.     movzx   ecx, [ebx + TREKDATA.REMBASE]
  1239.     mov     al, [ebx + TREKDATA.QUADX]
  1240.     mov     dl, [ebx + TREKDATA.QUADY]
  1241.     mcLoadMemberRef esi, TREKDATA.BASEQX
  1242.     mcLoadMemberRef edi, TREKDATA.BASEQY
  1243.  
  1244. .check_base_quad:
  1245.     cmp     al, [esi]
  1246.     jne     .next_base
  1247.     cmp     dl, [edi]
  1248.     jne     .next_base
  1249.     jmp     .L71
  1250.  
  1251. .next_base:
  1252.     inc     esi
  1253.     inc     edi
  1254.     loop    .check_base_quad
  1255.  
  1256.     ;int     3
  1257.     jmp     .done
  1258.  
  1259. .L71:
  1260.     ;
  1261.     ; Replace the values at ESI,EDI with
  1262.     ; the last base coordinates.
  1263.     ;
  1264.     movzx   ecx, [ebx + TREKDATA.REMBASE]
  1265.     dec     ecx
  1266.  
  1267.     mcLoadMemberRef edx, TREKDATA.BASEQX
  1268.     mov     al, [edx + ecx]
  1269.     mov     [esi], al
  1270.  
  1271.     mcLoadMemberRef edx, TREKDATA.BASEQY
  1272.     mov     al, [edx + ecx]
  1273.     mov     [edi], al
  1274.  
  1275.     dec     [ebx + TREKDATA.REMBASE]
  1276.     mov     [ebx + TREKDATA.BASEX], 0
  1277.     mov     [ebx + TREKDATA.BASEY], 0
  1278.  
  1279.     mcLoadLocal eax, loc44.torp_IX
  1280.     mcLoadLocal edx, loc44.torp_IY
  1281.     call    TArray_QuadPtr
  1282.     mov     byte [ebx], CHAR_COSMOS
  1283.  
  1284.     call    TArray_MyGalaxyPtr
  1285.     sub     dword [ebx], 10
  1286.  
  1287.     mcLoadLocal ebx, loc44.pTrekData
  1288.     cmp     [ebx + TREKDATA.IPHWHO], 1
  1289.     je      .refresh_condition
  1290.  
  1291.     inc     [ebx + TREKDATA.BASEKL]
  1292.  
  1293. .refresh_condition:
  1294.     mov     [ebx + TREKDATA.CONDIT], 0
  1295.     call    TCommon_NewCondition
  1296.     jmp     TPhotons_Main.L50
  1297.  
  1298. .L75:
  1299.     cmp     [esp + loc44.ch_IQUAD], CHAR_PLANET
  1300.     jne     .L80
  1301.  
  1302.     mcLoadLocal eax, loc44.torp_IX
  1303.     mcLoadLocal edx, loc44.torp_IY
  1304.     call    TConsole_CramEnemyAtEx
  1305.  
  1306.     fld     [glb_dbl_450]
  1307.     fld     [esp + loc44.dbl_HIT]
  1308.     mc_CMP_ST0_ST1
  1309.     jc      .L7510
  1310.  
  1311.     mov     ecx, 306
  1312.     call    TConsole_Prout
  1313.  
  1314.     mcLoadLocal ebx, loc44.pTrekData
  1315.     cmp     [ebx + TREKDATA.IPHWHO], 1
  1316.     je      .clean_planet
  1317.  
  1318.     inc     [ebx + TREKDATA.NPLANKL]
  1319.  
  1320. .clean_planet:
  1321.     call    TArray_MyNewStufPtr
  1322.     dec     byte [ebx]
  1323.  
  1324.     mcLoadLocal ebx, loc44.pTrekData
  1325.     movzx   ecx, [ebx + TREKDATA.IPLANET]
  1326.     dec     ecx
  1327.     imul    ecx, TPlanet.size
  1328.     mcLoadMemberRef edi, TREKDATA.PLNETS
  1329.     add     edi, ecx
  1330.     mcLoad8bitsToReg32 ecx, TPlanet.size
  1331.     mcZeroBits eax
  1332.     rep     stosb
  1333.  
  1334.     mcStoreMember TREKDATA.IPLANET, al
  1335.     mcStoreMember TREKDATA.PLNETX, al
  1336.     mcStoreMember TREKDATA.PLNETY, al
  1337.  
  1338.     mcLoadLocal eax, loc44.torp_IX
  1339.     mcLoadLocal edx, loc44.torp_IY
  1340.     call    TArray_QuadPtr
  1341.     mov     byte [ebx], CHAR_COSMOS
  1342.  
  1343.     mcLoadLocal esi, loc44.pTrekData
  1344.     cmp     [esi + TREKDATA.LANDED], 1
  1345.     jne     TPhotons_Main.L50
  1346.  
  1347.     mov     al, 15
  1348.     call    TFinish_Main
  1349.     jmp     .done
  1350.  
  1351. .L80:
  1352.     cmp     [esp + loc44.ch_IQUAD], CHAR_ASTERISK
  1353.     jne     .L90
  1354.     ;
  1355.     ; Check for Nova results...
  1356.     ;
  1357.     fld     [glb_dbl_270]
  1358.     fld     [esp + loc44.dbl_HIT]
  1359.     mc_CMP_ST0_ST1
  1360.     jnc     .L85
  1361.  
  1362.     mcLoadLocal eax, loc44.torp_IX
  1363.     mcLoadLocal edx, loc44.torp_IY
  1364.     call    TConsole_CramEnemyAtEx
  1365.     mov     ecx, 371
  1366.     call    TConsole_Prout
  1367.     jmp     TPhotons_Main.L50
  1368.  
  1369. .L85:
  1370.     mcLoadLocal eax, loc44.torp_IX
  1371.     mcLoadLocal edx, loc44.torp_IY
  1372.     call    TNova_Main
  1373.  
  1374.     call    TArray_MyGalaxyPtr
  1375.     cmp     dword [ebx], 1000
  1376.     je      .done
  1377.  
  1378.     mcLoadLocal esi, loc44.pTrekData
  1379.     cmp     [esi + TREKDATA.ALLDONE], 0
  1380.     jne     .done
  1381.     jmp     TPhotons_Main.L50
  1382.  
  1383. .L90:
  1384.     ;
  1385.     ; Check for a boomerang torpedo
  1386.     ;
  1387.     mcLoadLocal esi, loc44.pTrekData
  1388.     mov     al, [esi + TREKDATA.SHIP]
  1389.     cmp     [esp + loc44.ch_IQUAD], al
  1390.     jne     .L93
  1391.  
  1392.     cmp     [esi + TREKDATA.CONDIT], CONDITION_DOCKED
  1393.     jne     .L9010
  1394.  
  1395.     call    TRandom_Ranf
  1396.     fld     [glb_dbl_0dot77]
  1397.     mc_CMP_ST0_ST1
  1398.     jc      .L9010
  1399.  
  1400.     call    TConsole_SetGameMsgAttr
  1401.     mov     ecx, 372
  1402.     call    TConsole_Cram
  1403.     call    TConsole_CramShip
  1404.     mov     al, '.'
  1405.     call    TConsole_PutChar
  1406.     call    TConsole_ScrollUp
  1407.     jmp     TPhotons_Main.L50
  1408.  
  1409. .L9010:
  1410.     call    TConsole_SetGameMsgAttr
  1411.     call    TConsole_CramShip
  1412.     mov     ecx, 373
  1413.     call    TConsole_Prout
  1414.  
  1415.     call    TCommon_NewCondition
  1416.  
  1417.     mcLoadLocal esi, loc44.pTrekData
  1418.     movzx   ecx, [esi + TREKDATA.KSHOT]
  1419.     mcLoadLocalRef esi, loc44.dbl_HIT
  1420.     mcLoadLocalRef edi, loc44.bIHURT
  1421.     call    TAttack_Zap
  1422.  
  1423.     mcLoadLocal esi, loc44.pTrekData
  1424.     fld     [esi + TREKDATA.ENERGY]
  1425.     fldz
  1426.     mc_CMP_ST0_ST1
  1427.     jc      .L91
  1428.  
  1429.     cmp     [esi + TREKDATA.KSHOT], 0
  1430.     jne     .L9020
  1431.  
  1432.     mov     al, 22
  1433.     jmp     .call_finish
  1434.  
  1435. .L9020:
  1436.     mov     al, 5
  1437.     jmp     .call_finish
  1438.  
  1439. .L91:
  1440.     fld     [esp + loc44.dbl_HIT]
  1441.     call    TAttack_Casualties
  1442.     ;
  1443.     ; Check to see if ship displaced
  1444.     ;
  1445.     call    TConsole_CramShip
  1446.     jmp     .L6901
  1447.  
  1448. .L93:
  1449.     cmp     [esp + loc44.ch_IQUAD], CHAR_THING
  1450.     jne     .L95
  1451.  
  1452.     call    TConsole_ScrollUp
  1453.     call    TConsole_SetGameMsgAttr
  1454.     mov     ecx, 374
  1455.     call    TConsole_Prout
  1456.     mov     ecx, 375
  1457.     call    TConsole_Prout
  1458.  
  1459.     call    TConsole_ScrollUp
  1460.     call    TConsole_SetCrewMsgAttr
  1461.     mov     ecx, 376
  1462.     call    TConsole_Prout
  1463.  
  1464.     mcLoadLocal eax, loc44.torp_IX
  1465.     mcLoadLocal edx, loc44.torp_IY
  1466.     call    TArray_QuadPtr
  1467.     mov     byte [ebx], CHAR_COSMOS
  1468.     jmp     TPhotons_Main.L50
  1469.  
  1470. .L95:
  1471.     ;
  1472.     ; Torpedo enters vicinity of a black hole.
  1473.     ; Check for deflection.
  1474.     ;
  1475.     mcLoadLocal eax, loc44.torp_IX
  1476.     mcLoadLocal edx, loc44.torp_IY
  1477.     call    TConsole_CramEnemyAtEx
  1478.  
  1479.     fld     [glb_dbl_0dot1]
  1480.     fld     [esp + loc44.dbl_DISTN]
  1481.     mc_CMP_ST0_ST1
  1482.     jc      .L97
  1483.     ;
  1484.     ; Torpedo deflected!
  1485.     ;
  1486.     fld     [glb_dbl_0dot5]
  1487.     fld     [esp + loc44.dbl_DISTN]
  1488.     fsubp
  1489.     fld     [glb_dbl_7dot853981634]
  1490.     fmulp
  1491.     fstp    [esp + loc44.dbl_SPRANG]
  1492.  
  1493.     fld     [glb_dbl_1dot57079633]
  1494.     fld     [esp + loc44.dbl_ANGLE]
  1495.     faddp
  1496.     fld     [esp + loc44.dbl_SPRANG]
  1497.     fsubp
  1498.     fstp    [esp + loc44.dbl_BETA]
  1499.  
  1500.     fld     [esp + loc44.dbl_DISTN]
  1501.     fld     [esp + loc44.dbl_BETA]
  1502.     fsin
  1503.     fmulp
  1504.     fild    [esp + loc44.torp_IX]
  1505.     fsubrp
  1506.     call    TCommon_FP_Truncate
  1507.  
  1508.     mcStoreLocal loc44.byte_STARTX, al
  1509.     call    TPhotons_IsValidSector
  1510.     jnc     .L97
  1511.  
  1512.     fld     [esp + loc44.dbl_DISTN]
  1513.     fld     [esp + loc44.dbl_BETA]
  1514.     fcos
  1515.     fmulp
  1516.     fild    [esp + loc44.torp_IY]
  1517.     faddp
  1518.     call    TCommon_FP_Truncate
  1519.  
  1520.     mcStoreLocal loc44.byte_STARTY, al
  1521.     call    TPhotons_IsValidSector
  1522.     jnc     .L97
  1523.  
  1524.     fld     [esp + loc44.dbl_SPRANG]
  1525.     fld     [esp + loc44.dbl_SINANG]
  1526.     call    TCommon_FPU_SignAB
  1527.     fld     [esp + loc44.dbl_ANGLE]
  1528.     fsubrp
  1529.     fstp    [esp + loc44.dbl_ANGLE]
  1530.  
  1531.     mov     ecx, 378
  1532.     call    TConsole_Prout
  1533.     mov     ecx, 379
  1534.     call    TConsole_Cram
  1535.     jmp     .L5720
  1536.  
  1537. .L97:
  1538.     mov     ecx, 377
  1539.     call    TConsole_Prout
  1540.     jmp     TPhotons_Main.L50
  1541.  
  1542. .L105:
  1543.     ;
  1544.     ; End inner loop for moving one torpedo
  1545.     ;
  1546.     call    TConsole_ScrollUp
  1547.  
  1548. .L106:
  1549.     mov     ecx, 359
  1550.     call    TConsole_Prout
  1551.     jmp     TPhotons_Main.L50
  1552.  
  1553. .L115:
  1554.     mcLoadLocal esi, loc44.pTrekData
  1555.     cmp     [esi + TREKDATA.REMKL], 0
  1556.     je      .finished
  1557.  
  1558.     call    TCommon_SortKlingons
  1559.     jmp     .done
  1560.  
  1561. .finished:
  1562.     mov     al, 1
  1563.  
  1564. .call_finish:
  1565.     call    TFinish_Main
  1566.  
  1567. .done:
  1568.     mcEndLocals loc44.size
  1569.     ret
  1570.  
  1571. ; --- EOF ---
  1572.