Subversion Repositories Kolibri OS

Rev

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

  1. ; --------------------------------------------------------------------------
  2. ; FILE: TPhasers.Asm
  3. ; DATE: October 18, 2008
  4. ; --------------------------------------------------------------------------
  5.  
  6. ; --------------------------------------------------------------------------
  7. ; Input:
  8. ;   AL = quadrant X of a COMMANDER
  9. ;   DL = quadrant Y of a COMMANDER
  10. ; Output:
  11. ;   CF=1 if commander was removed
  12. ; --------------------------------------------------------------------------
  13. align PROC_ALIGN
  14. TPhasers_RemoveCommander:
  15.     pushad
  16.  
  17.     mcLoadGameDataPtr ebx
  18.     cmp     [ebx + TREKDATA.REMCOM], 0
  19.     je      .not_removed
  20.  
  21.     mcLoadMemberRef esi, TREKDATA.CX
  22.     mcLoadMemberRef edi, TREKDATA.CY
  23.     mcZeroBits ecx
  24.  
  25. .find_commander:
  26.     cmp     [esi + ecx], al
  27.     jne     .next_commander
  28.     cmp     [edi + ecx], dl
  29.     jne     .next_commander
  30.     ;
  31.     ; Replace commander by the last entry
  32.     ;
  33.     movzx   edx, [ebx + TREKDATA.REMCOM]
  34.     dec     edx
  35.     push    edx
  36.  
  37.     mov     al, [esi + edx]
  38.     mov     dl, [edi + edx]
  39.     mov     [esi + ecx], al
  40.     mov     [edi + ecx], dl
  41.  
  42.     mcZeroBits eax
  43.     pop     edx
  44.     mov     [esi + edx], al
  45.     mov     [edi + edx], al
  46.  
  47.     dec     [ebx + TREKDATA.REMCOM]
  48.  
  49.     popad
  50.     stc
  51.     ret
  52.  
  53. .next_commander:
  54.     inc     ecx
  55.     cmp     cl, [ebx + TREKDATA.REMCOM]
  56.     jb      .find_commander
  57.  
  58. .not_removed:
  59.     popad
  60.     clc
  61.     ret
  62.  
  63. ; --------------------------------------------------------------------------
  64. ; DEADKL
  65. ; --------------------------------------------------------------------------
  66. ; Input:
  67. ;   AL = sector X of an enemy
  68. ;   DL = sector Y of an enemy
  69. ; --------------------------------------------------------------------------
  70. virtual at 0
  71. loc41:
  72.     .pTrekData PVOID ?
  73.     .pQUAD PBYTE ?
  74.     .nTYPE BYTE ?
  75.     .nIXX BYTE ?
  76.     .nIYY BYTE ?
  77.     .nEnemies BYTE ?
  78.     .nJ INDEX ?
  79.     .size = $
  80. end virtual
  81. ; --------------------------------------------------------------------------
  82. align PROC_ALIGN
  83. TPhasers_DeadKlingon:
  84.     mcBeginLocals loc41.size
  85.  
  86.     mcStoreLocal loc41.nIXX, al
  87.     mcStoreLocal loc41.nIYY, dl
  88.  
  89.     call    TArray_QuadPtr
  90.     mcStoreLocal loc41.pQUAD, ebx
  91.  
  92.     mov     cl, [ebx]
  93.     mcStoreLocal loc41.nTYPE, cl
  94.  
  95.     mcLoadGameDataPtr ebx
  96.     mcStoreLocal loc41.pTrekData, ebx
  97.  
  98.     call    TConsole_SetGameMsgAttr
  99.     mcLoadLocal al, loc41.nIXX
  100.     mcLoadLocal dl, loc41.nIYY
  101.     mcLoadLocal bl, loc41.nTYPE
  102.     mov     cl, 2
  103.     call    TConsole_CramEnemyAt
  104.  
  105.     mcLoadLocal al, loc41.nTYPE
  106.     mcOnRegEqu al, CHAR_THOLIAN, .L30
  107.     mcOnRegEqu al, CHAR_ROMULAN, .L27
  108.  
  109.     call    TArray_MyGalaxyPtr
  110.     sub     dword [ebx], 100
  111.  
  112.     mcLoadLocal edi, loc41.pTrekData
  113.     dec     [edi + TREKDATA.KLHERE]
  114.     dec     [edi + TREKDATA.REMKL]
  115.  
  116.     mcLoadLocal al, loc41.nTYPE
  117.     mcOnRegEqu al, CHAR_KLINGON, .L25
  118.     mcOnRegEqu al, CHAR_SCOM, .L26
  119.     ;
  120.     ; COMMANDER finds his fate!
  121.     ;
  122.     mcLoadLocal edi, loc41.pTrekData
  123.     mov     [edi + TREKDATA.COMHERE], 0
  124.  
  125.     mov     al, [edi + TREKDATA.QUADX]
  126.     mov     dl, [edi + TREKDATA.QUADY]
  127.     call    TPhasers_RemoveCommander
  128.  
  129.     fld     [glb_dbl_1E38]
  130.     fstp    [edi + TREKDATA.FUTURE2]
  131.  
  132.     cmp     [edi + TREKDATA.REMCOM], 0
  133.     je      .kill_commander
  134.  
  135.     mov     al, [edi + TREKDATA.INCOM]
  136.     call    TCommon_LoadByteIntoFPU
  137.     mov     al, [edi + TREKDATA.REMCOM]
  138.     call    TCommon_LoadByteIntoFPU
  139.     fdivp
  140.     push    edi
  141.     call    TCommon_ExpRan
  142.     pop     edi
  143.     fld     [edi + TREKDATA.DATE]
  144.     faddp
  145.     fstp    [edi + TREKDATA.FUTURE2]
  146.  
  147. .kill_commander:
  148.     inc     [edi + TREKDATA.KILLC]
  149.     jmp     .L30
  150.  
  151. .L25:
  152.     ;
  153.     ; Ordinary KLINGON wasted!
  154.     ;
  155.     inc     [edi + TREKDATA.KILLK]
  156.     jmp     .L30
  157.  
  158. .L26:
  159.     ;
  160.     ; SUPER-COMMANDER finally brought down!
  161.     ;
  162.     mcZeroBits eax
  163.     mov     [edi + TREKDATA.NSCREM], al
  164.     mov     [edi + TREKDATA.ISHERE], al
  165.     mov     [edi + TREKDATA.ISX], al
  166.     mov     [edi + TREKDATA.ISY], al
  167.     mov     [edi + TREKDATA.ISATB], al
  168.     mov     [edi + TREKDATA.ISCATE], al
  169.  
  170.     inc     [edi + TREKDATA.NSCKILL]
  171.     fld     [glb_dbl_1E38]
  172.     fld     st
  173.     fstp    [edi + TREKDATA.FUTURE6]
  174.     fstp    [edi + TREKDATA.FUTURE7]
  175.     jmp     .L30
  176.  
  177. .L27:
  178.     ;
  179.     ; ROMULAN destroyed!
  180.     ;
  181.     call    TArray_MyNewStufPtr
  182.     sub     byte [ebx], 10
  183.  
  184.     dec     [edi + TREKDATA.IRHERE]
  185.     dec     [edi + TREKDATA.NROMREM]
  186.     inc     [edi + TREKDATA.NROMKL]
  187.  
  188. .L30:
  189.     ;
  190.     ; Finish message
  191.     ;
  192.     mov     ecx, 306
  193.     call    TConsole_Prout
  194.  
  195.     mcLoadLocal ebx, loc41.pQUAD
  196.     mov     byte [ebx], CHAR_COSMOS
  197.  
  198.     mcLoadLocal esi, loc41.pTrekData
  199.     cmp     [esi + TREKDATA.REMKL], 0
  200.     je      .done
  201.  
  202.     mov     al, [esi + TREKDATA.REMCOM]
  203.     shl     al, 2
  204.     add     al, [esi + TREKDATA.REMKL]
  205.     call    TCommon_LoadByteIntoFPU
  206.     fld     [esi + TREKDATA.REMRES]
  207.     fdivrp
  208.     fstp    [esi + TREKDATA.REMTIME]
  209.     ;
  210.     ; Kill Tholian
  211.     ;
  212.     cmp     [esp + loc41.nTYPE], CHAR_THOLIAN
  213.     je      .kill_tholian
  214.     ;
  215.     ; Remove enemy ship from arrays describing local conditions
  216.     ;
  217.     mov     cl, [esi + TREKDATA.NENHERE]
  218.     mcStoreLocal loc41.nEnemies, cl
  219.     lea     edi, [esi + TREKDATA.KY]
  220.     add     esi, TREKDATA.KX
  221.     mcZeroBits ecx
  222.     mcLoadLocal al, loc41.nIXX
  223.     mcLoadLocal dl, loc41.nIYY
  224.  
  225. .find_enemy_ship:
  226.     cmp     al, [esi + ecx]
  227.     jne     .next_ship
  228.     cmp     dl, [edi + ecx]
  229.     je      .L45
  230.  
  231. .next_ship:
  232.     inc     ecx
  233.     cmp     cl, [esp + loc41.nEnemies]
  234.     jb      .find_enemy_ship
  235.  
  236.     ;int     3
  237.     jmp     .done
  238.  
  239. .L45:
  240.     inc     ecx
  241.  
  242.     mcLoadLocal ebx, loc41.pTrekData
  243.     dec     [ebx + TREKDATA.NENHERE]
  244.     dec     [esp + loc41.nEnemies]
  245.  
  246.     cmp     cl, [ebx + TREKDATA.NENHERE]
  247.     ja      .L55
  248.     ;
  249.     ; Shift all ships up to delete the killed one
  250.     ;
  251.     mcStoreLocal loc41.nJ, ecx
  252.  
  253. .remove_ship:
  254.     mcLoadLocal ecx, loc41.nJ
  255.     mcLoadMemberRef esi, TREKDATA.KX
  256.     mcLoadMemberRef edi, TREKDATA.KY
  257.     dec     ecx
  258.     mov     al, [esi + ecx + 1]
  259.     mov     dl, [edi + ecx + 1]
  260.     mov     [esi + ecx], al
  261.     mov     [edi + ecx], dl
  262.  
  263.     imul    ecx, 10
  264.     mcLoadMemberRef esi, TREKDATA.KPOWER
  265.     mcLoadMemberRef edi, TREKDATA.KDIST
  266.     fld     tbyte [esi + ecx + 10]
  267.     fld     tbyte [edi + ecx + 10]
  268.     fstp    tbyte [edi + ecx]
  269.     fstp    tbyte [esi + ecx]
  270.  
  271.     inc     [esp + loc41.nJ]
  272.     mov     ecx, [esp + loc41.nJ]
  273.     cmp     cl, [esp + loc41.nEnemies]
  274.     jbe     .remove_ship
  275.  
  276. .L55:
  277.     ;
  278.     ; Cleanup the tail of arrays
  279.     ;
  280.     movzx   ecx, [esp + loc41.nEnemies]
  281.     mcLoadMemberRef esi, TREKDATA.KX
  282.     mcLoadMemberRef edi, TREKDATA.KY
  283.     mcZeroBits eax
  284.     mov     [esi + ecx], al
  285.     mov     [edi + ecx], al
  286.  
  287.     imul    ecx, 10
  288.     fldz
  289.     fldz
  290.     mcLoadMemberRef esi, TREKDATA.KPOWER
  291.     mcLoadMemberRef edi, TREKDATA.KDIST
  292.     fstp    tbyte [esi + ecx]
  293.     fstp    tbyte [edi + ecx]
  294.     jmp     .done
  295.  
  296. .kill_tholian:
  297.     dec     [esi + TREKDATA.ITHERE]
  298.  
  299. .done:
  300.     mcEndLocals loc41.size
  301.     ret
  302.  
  303. ; --------------------------------------------------------------------------
  304. ; HITEM
  305. ; --------------------------------------------------------------------------
  306. ; Input:
  307. ;   ESI = pointer to array of DOUBLE values with hits
  308. ; --------------------------------------------------------------------------
  309. virtual at 0
  310. loc40:
  311.     .pTrekData PVOID ?
  312.     .pHITS PDOUBLE ?
  313.     .nNENHER2 COUNT ?
  314.     .nK INDEX ?
  315.     .nKK INDEX ?
  316.     .dbl_KP DOUBLE ?
  317.     .dbl_KPOW DOUBLE ?
  318.     .pKPOWER PDOUBLE ?
  319.     .pKDIST PDOUBLE ?
  320.     .pKX PBYTE ?
  321.     .pKY PBYTE ?
  322.     .nII BYTE ?
  323.     .nJJ BYTE ?
  324.     .n1 BYTE ?
  325.     .n2 BYTE ?
  326.     .dbl_HIT DOUBLE ?
  327.     .dbl_WHAM DOUBLE ?
  328.     .dbl_DUSTFAC DOUBLE ?
  329.     .dbl_1 DOUBLE ?
  330.     .size = $
  331. end virtual
  332. ; --------------------------------------------------------------------------
  333. align PROC_ALIGN
  334. TPhasers_HitThem:
  335.     mcBeginLocals loc40.size
  336.  
  337.     mcLoadGameDataPtr edi
  338.     mcStoreLocal loc40.pTrekData, edi
  339.     mcStoreLocal loc40.pHITS, esi
  340.  
  341.     movzx   eax, [edi + TREKDATA.NENHERE]
  342.     mcStoreLocal loc40.nNENHER2, eax
  343.  
  344.     lea     ebx, [edi + TREKDATA.KX]
  345.     lea     ecx, [edi + TREKDATA.KY]
  346.     lea     esi, [edi + TREKDATA.KPOWER]
  347.     lea     eax, [edi + TREKDATA.KDIST]
  348.     mcStoreLocal loc40.pKX, ebx
  349.     mcStoreLocal loc40.pKY, ecx
  350.     mcStoreLocal loc40.pKPOWER, esi
  351.     mcStoreLocal loc40.pKDIST, eax
  352.  
  353.     call    TConsole_ScrollUp
  354.  
  355.     mcLoad1 eax
  356.     mcStoreLocal loc40.nKK, eax
  357.     mcStoreLocal loc40.nK, eax
  358.  
  359. .next_hit:
  360.     invoke  Sleep, 500
  361.  
  362.     mcLoadLocal ecx, loc40.nK
  363.     dec     ecx
  364.     imul    ecx, 10
  365.     mcLoadLocal esi, loc40.pHITS
  366.     fld     tbyte [esi + ecx]
  367.     fstp    [esp + loc40.dbl_WHAM]
  368.  
  369.     fldz
  370.     fld     [esp + loc40.dbl_WHAM]
  371.     mc_CMP_ST0_ST1
  372.     jz      .L30
  373.  
  374.     call    TRandom_Ranf
  375.     fld     [glb_dbl_0dot01]
  376.     fmulp
  377.     fld     [glb_dbl_0dot9]
  378.     faddp
  379.     fstp    [esp + loc40.dbl_DUSTFAC]
  380.  
  381.     mcLoadLocal ecx, loc40.nKK
  382.     dec     ecx
  383.     imul    ecx, 10
  384.     mcLoadLocal esi, loc40.pKDIST
  385.     lea     edi, [esi + ecx]
  386.     mcLoadLocalRef esi, loc40.dbl_DUSTFAC
  387.     call    TCommon_X_exp_Y
  388.     fld     [esp + loc40.dbl_WHAM]
  389.     fmulp
  390.     fstp    [esp + loc40.dbl_HIT]
  391.  
  392.     mcLoadLocal ecx, loc40.nKK
  393.     dec     ecx
  394.     imul    ecx, 10
  395.     mcLoadLocal esi, loc40.pKPOWER
  396.     fld     tbyte [esi + ecx]
  397.     fstp    [esp + loc40.dbl_KP]
  398.  
  399.     fld     [esp + loc40.dbl_KP]
  400.     fabs
  401.     fld     [esp + loc40.dbl_HIT]
  402.     fld     st
  403.     faddp
  404.     call    TCommon_FPU_Min
  405.  
  406.     fld     [esp + loc40.dbl_KP]
  407.     call    TCommon_FPU_SignAB
  408.  
  409.     fld     [esp + loc40.dbl_KP]
  410.     fsubrp
  411.     fld     st
  412.     fstp    tbyte [esi + ecx]
  413.     fstp    [esp + loc40.dbl_KPOW]
  414.  
  415.     mcLoadLocal ecx, loc40.nKK
  416.     dec     ecx
  417.     mcLoadLocal esi, loc40.pKX
  418.     mcLoadLocal edi, loc40.pKY
  419.     mov     al, [esi + ecx]
  420.     mov     dl, [edi + ecx]
  421.     mcStoreLocal loc40.nII, al
  422.     mcStoreLocal loc40.nJJ, dl
  423.  
  424.     call    TConsole_SetGameMsgAttr
  425.     fld     [esp + loc40.dbl_HIT]
  426.     fld     [glb_dbl_0dot005]
  427.     mc_CMP_ST0_ST1
  428.     jc      .L10
  429.  
  430.     mov     ecx, 302
  431.     call    TConsole_Cram
  432.     jmp     .L20
  433.  
  434. .L10:
  435.     fld     [esp + loc40.dbl_HIT]
  436.     mov     cl, 2
  437.     call    TConsole_CramFloat
  438.  
  439.     mov     ecx, 303
  440.     call    TConsole_Cram
  441.  
  442. .L20:
  443.     mcLoadLocal al, loc40.nII
  444.     mcLoadLocal dl, loc40.nJJ
  445.     call    TConsole_CramEnemyAtEx
  446.     call    TConsole_ScrollUp
  447.  
  448.     fldz
  449.     fld     [esp + loc40.dbl_KPOW]
  450.     mc_CMP_ST0_ST1
  451.     jnz     .L25
  452.  
  453.     mcLoadLocal al, loc40.nII
  454.     mcLoadLocal dl, loc40.nJJ
  455.     call    TPhasers_DeadKlingon
  456.  
  457.     mcLoadLocal esi, loc40.pTrekData
  458.     cmp     [esi + TREKDATA.REMKL], 0
  459.     je      .game_won
  460.  
  461.     cmp     [esi + TREKDATA.ALLDONE], 0
  462.     jne     .done
  463.     jmp     .L40
  464.  
  465. .L25:
  466.     fldz
  467.     fld     [esp + loc40.dbl_KPOW]
  468.     mc_CMP_ST0_ST1
  469.     jc      .L30
  470.  
  471.     fld     [glb_dbl_0dot9]
  472.     call    TRandom_Ranf
  473.     mc_CMP_ST0_ST1
  474.     jc      .L30
  475.  
  476.     call    TRandom_Ranf
  477.     fld     [glb_dbl_0dot4]
  478.     fmulp
  479.     fld     [glb_dbl_0dot4]
  480.     faddp
  481.     fld     [esp + loc40.dbl_KP]
  482.     fmulp
  483.     fld     [esp + loc40.dbl_KPOW]
  484.     mc_CMP_ST0_ST1
  485.     jnc     .L30
  486.  
  487.     call    TConsole_SetCrewMsgAttr
  488.     mov     ecx, 304
  489.     call    TConsole_Cram
  490.  
  491.     mov     cl, 2
  492.     mcLoadLocal al, loc40.nII
  493.     mcLoadLocal dl, loc40.nJJ
  494.     call    TConsole_CramLoc
  495.  
  496.     call    TConsole_ScrollUp
  497.     mov     ecx, 305
  498.     call    TConsole_Prout
  499.  
  500.     fld     [esp + loc40.dbl_KPOW]
  501.     fchs
  502.  
  503.     mcLoadLocal ecx, loc40.nKK
  504.     dec     ecx
  505.     imul    ecx, 10
  506.     mcLoadLocal esi, loc40.pKPOWER
  507.     fstp    tbyte [esi + ecx]
  508.  
  509. .L30:
  510.     inc     [esp + loc40.nKK]
  511.  
  512. .L40:
  513.     ;
  514.     ; Next hit
  515.     ;
  516.     inc     [esp + loc40.nK]
  517.     mov     ecx, [esp + loc40.nK]
  518.     cmp     ecx, [esp + loc40.nNENHER2]
  519.     jbe     .next_hit
  520.     jmp     .done
  521.  
  522. .game_won:
  523.     mov     al, 1
  524.     call    TFinish_Main
  525.  
  526. .done:
  527.     mcEndLocals loc40.size
  528.     ret
  529.  
  530. ; --------------------------------------------------------------------------
  531. ; PHASERS
  532. ; --------------------------------------------------------------------------
  533. virtual at 0
  534. loc39:
  535.     .pTrekData PVOID ?
  536.     .bIFAST BOOL ?
  537.     .bIPOOP BOOL ?
  538.     .bIDOIT BOOL ?
  539.     .bNO BOOL ?
  540.     .nK INDEX ?
  541.     .nI INDEX ?
  542.     .pIWHERE PVOID ?
  543.     .nEnemies COUNT ?
  544.     .nKEY UINT32 ?
  545.     .nKEY1 UINT32 ?
  546.     .nKEY2 UINT32 ?
  547.     .nIREC UINT32 ?
  548.     .pszAITEM PCHAR ?
  549.     .dbl_POW DOUBLE ?
  550.     .dbl_POWREM DOUBLE ?
  551.     .dbl_EXTRA DOUBLE ?
  552.     .dbl_TEMP DOUBLE ?
  553.     .dbl_PART1 DOUBLE ?
  554.     .dbl_PART2 DOUBLE ?
  555.     .dbl_HITS_I_ DOUBLE ?
  556.     .dbl_OVER DOUBLE ?
  557.     .arr_HITS DOUBLES 20
  558.     .size = $
  559. end virtual
  560. ; --------------------------------------------------------------------------
  561. align PROC_ALIGN
  562. TPhasers_Main:
  563.     mcBeginLocals loc39.size
  564.  
  565.     call    TConsole_SetGameMsgAttr
  566.  
  567.     mcLoadGameDataPtr esi
  568.     mcStoreLocal loc39.pTrekData, esi
  569.  
  570.     movzx   ecx, [esi + TREKDATA.NENHERE]
  571.     mcStoreLocal loc39.nEnemies, ecx
  572.  
  573.     mcZeroBits eax
  574.     mcStoreLocal loc39.bIFAST, eax
  575.     mcStoreLocal loc39.bNO, eax
  576.     mcStoreLocal loc39.nIREC, eax
  577.  
  578.     inc     eax
  579.     mcStoreLocal loc39.bIPOOP, eax
  580.     mcStoreLocal loc39.bIDOIT, eax
  581.     mov     [esi + TREKDATA.IDIDIT], al
  582.  
  583.     mov     cl, DEV_SR_SENSORS
  584.     call    TArray_IsDamaged
  585.     adc     [esp + loc39.nIREC], 0
  586.  
  587.     mov     cl, DEV_COMPUTER
  588.     call    TArray_IsDamaged
  589.     adc     [esp + loc39.nIREC], 0
  590.  
  591.     cmp     [esp + loc39.nIREC], 0
  592.     je      .check_firing_solution
  593.  
  594.     dec     [esp + loc39.bIPOOP]
  595.  
  596. .check_firing_solution:
  597.     mcLoadLocal esi, loc39.pTrekData
  598.     cmp     [esi + TREKDATA.CONDIT], CONDITION_DOCKED
  599.     jne     .L5
  600.  
  601.     mov     ecx, 274
  602.     call    TConsole_Prout
  603.     jmp     .L19
  604.  
  605. .L5:
  606.     mov     cl, DEV_PHASERS
  607.     call    TArray_IsDamaged
  608.     jnc     .L10
  609.  
  610.     mov     ecx, 275
  611.     call    TConsole_Prout
  612.     jmp     .L19
  613.  
  614. .L10:
  615.     ;
  616.     ; Do checks for hi-speed shield control
  617.     ;
  618.     mcLoadLocal esi, loc39.pTrekData
  619.     cmp     [esi + TREKDATA.SHLDUP], 0
  620.     je      .L20
  621.  
  622.     mov     cl, DEV_SHIELD_CONTROL
  623.     call    TArray_IsDamaged
  624.     jnc     .L13
  625.  
  626.     mov     ecx, 276
  627.     call    TConsole_Prout
  628.     jmp     .L19
  629.  
  630. .L13:
  631.     mcLoadLocal esi, loc39.pTrekData
  632.     fld     [esi + TREKDATA.ENERGY]
  633.     fld     [glb_dbl_200]
  634.     mc_CMP_ST0_ST1
  635.     jc      .L16
  636.  
  637.     mov     ecx, 277
  638.     call    TConsole_Prout
  639.  
  640. .L19:
  641.     dec     [esp + loc39.bIDOIT]
  642.  
  643.     cmp     [esp + loc39.bIPOOP], 0
  644.     je      .L15
  645.     cmp     [esp + loc39.nEnemies], 0
  646.     je      .L15
  647.  
  648.     mov     ecx, 278
  649.     call    TConsole_Prout
  650.     jmp     .L870
  651.  
  652. .L15:
  653.     mcLoadLocal esi, loc39.pTrekData
  654.     dec     [esi + TREKDATA.IDIDIT]
  655.  
  656.     cmp     [esp + loc39.bIFAST], 0
  657.     je      .done
  658.  
  659.     fld     [esi + TREKDATA.ENERGY]
  660.     fld     [glb_dbl_200]
  661.     faddp
  662.     fstp    [esi + TREKDATA.ENERGY]
  663.     jmp     .done
  664.  
  665. .L16:
  666.     mcLoadLocal esi, loc39.pTrekData
  667.     fld     [esi + TREKDATA.ENERGY]
  668.     fld     [glb_dbl_200]
  669.     fsubp
  670.     fstp    [esi + TREKDATA.ENERGY]
  671.     inc     [esp + loc39.bIFAST]
  672.  
  673. .L20:
  674.     ;
  675.     ; Read in amount of energy to expend on phaser fire
  676.     ;
  677.     call    TCmdBuf_Scan
  678.     mcStoreLocal loc39.pszAITEM, esi
  679.  
  680.     movzx   ecx, [ebx + TCmdBuf.cmdbuf_KEY]
  681.     mcStoreLocal loc39.nKEY, ecx
  682.  
  683.     fld     [ebx + TCmdBuf.cmdbuf_FNUM]
  684.     fstp    [esp + loc39.dbl_POW]
  685.  
  686.     cmp     [esp + loc39.nEnemies], 0
  687.     je      .L35
  688.  
  689.     mcLoad1 edx
  690.     mcStoreLocal loc39.nK, edx
  691.  
  692.     cmp     [esp + loc39.nKEY], CMD_TOKEN_ALPHA
  693.     je      .L23
  694.     cmp     [esp + loc39.nKEY], CMD_TOKEN_REAL
  695.     je      .L28
  696.  
  697.     mcLoadLocal esi, loc39.pszAITEM
  698.     mcLoad8bitsToReg32 ecx, 122
  699.     call    TCmdBuf_Crop
  700.     jnc     .L23
  701.  
  702.     inc     [esp + loc39.bNO]
  703.  
  704.     call    TCmdBuf_Scan
  705.     mcStoreLocal loc39.pszAITEM, esi
  706.  
  707.     movzx   ecx, [ebx + TCmdBuf.cmdbuf_KEY]
  708.     mcStoreLocal loc39.nKEY, ecx
  709.  
  710.     fld     [ebx + TCmdBuf.cmdbuf_FNUM]
  711.     fstp    [esp + loc39.dbl_POW]
  712.  
  713. .L23:
  714.     cmp     [esp + loc39.nKEY], CMD_TOKEN_ALPHA
  715.     jne     .check_devices
  716.  
  717.     mcLoadLocal esi, loc39.pszAITEM
  718.     mcLoad8bitsToReg32 ecx, 165
  719.     call    TCmdBuf_Crop
  720.     jc      .L90
  721.  
  722. .check_devices:
  723.     mov     cl, DEV_COMPUTER
  724.     call    TArray_IsDamaged
  725.     jc      .L80
  726.  
  727.     mov     cl, DEV_SR_SENSORS
  728.     call    TArray_IsDamaged
  729.     jc      .L81
  730.     ;
  731.     ; Is KEY = EOL, 'AUTO' or phaser power
  732.     ;
  733.     cmp     [esp + loc39.nKEY], CMD_TOKEN_ALPHA
  734.     jne     .L2301
  735.  
  736.     mcLoadLocal esi, loc39.pszAITEM
  737.     mcLoad8bitsToReg32 ecx, 166
  738.     call    TCmdBuf_Crop
  739.     jc      .L27
  740.     jmp     .L24
  741.  
  742. .L2301:
  743.     ;
  744.     ; Differentiate between EOL and phaser power (command mode)
  745.     ;
  746.     cmp     [esp + loc39.nKEY], CMD_TOKEN_EOL
  747.     jne     .L30
  748.  
  749. .L24:
  750.     ;
  751.     ; Request MANUAL/AUTO fire
  752.     ;
  753.     mcLoad8bitsToReg32 ecx, 174
  754.     call    TGame_Prompt
  755.     call    TConsole_SetGameMsgAttr
  756.  
  757.     call    TCmdBuf_Scan
  758.  
  759.     mov     eax, [ebx + TCmdBuf.cmdbuf_INUM]
  760.     add     eax, 0
  761.     js      .L15
  762.  
  763.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA
  764.     jne     .L24
  765.  
  766.     mcLoad8bitsToReg32 ecx, 165
  767.     call    TCmdBuf_Crop
  768.     jc      .L90
  769.  
  770.     mcLoad8bitsToReg32 ecx, 166
  771.     call    TCmdBuf_Crop
  772.     jnc     .L24
  773.  
  774. .L2409:
  775.     ;
  776.     ; Inform user of available energy and read in
  777.     ; desired phaser power
  778.     ;
  779.     cmp     [esp + loc39.nEnemies], 0
  780.     je      .L26
  781.  
  782.     mov     ecx, 279
  783.     call    TConsole_Cram
  784.  
  785. .L25:
  786.     mcLoadLocal esi, loc39.pTrekData
  787.     mov     cl, 2
  788.     fld     [esi + TREKDATA.ENERGY]
  789.     call    TConsole_CramFloat
  790.     call    TConsole_ScrollUp
  791.  
  792.     cmp     [esp + loc39.bIPOOP], 0
  793.     je      .L26
  794.  
  795.     mov     al, '('
  796.     call    TConsole_PutChar
  797.  
  798.     mcZeroBits eax
  799.     mcStoreLocal loc39.nIREC, eax
  800.  
  801.     inc     eax
  802.     mcStoreLocal loc39.nK, eax
  803.  
  804. .sum_all_power:
  805.     call    TRandom_Ranf
  806.     fld     [glb_dbl_0dot05]
  807.     fmulp
  808.     fld     [glb_dbl_1dot01]
  809.     faddp
  810.     fstp    [esp + loc39.dbl_PART2]
  811.  
  812.     mov     esi, glb_dbl_0dot9
  813.     mcLoadLocal ebx, loc39.pTrekData
  814.     mcLoadLocal ecx, loc39.nK
  815.     dec     ecx
  816.     imul    ecx, 10
  817.     lea     edi, [ebx + ecx + TREKDATA.KDIST]
  818.     call    TCommon_X_exp_Y
  819.     fld     st
  820.     faddp
  821.     fstp    [esp + loc39.dbl_PART1]
  822.  
  823.     fld     [ebx + ecx + TREKDATA.KPOWER]
  824.     fabs
  825.  
  826.     fld     [esp + loc39.dbl_PART1]
  827.     fdivp
  828.  
  829.     fld     [esp + loc39.dbl_PART2]
  830.     fmulp
  831.  
  832.     call    TCommon_FP_Truncate
  833.     inc     eax
  834.     add     [esp + loc39.nIREC], eax
  835.  
  836.     inc     [esp + loc39.nK]
  837.     mcLoadLocal ecx, loc39.nK
  838.     cmp     ecx, [esp + loc39.nEnemies]
  839.     jbe     .sum_all_power
  840.  
  841.     mcLoadLocal eax, loc39.nIREC
  842.     call    TConsole_CramInt
  843.     mov     ecx, 280
  844.     call    TConsole_Prout
  845.  
  846. .L26:
  847.     mov     ecx, 281
  848.     call    TGame_Prompt
  849.  
  850. .L27:
  851.     call    TCmdBuf_Scan
  852.  
  853.     movzx   eax, [ebx + TCmdBuf.cmdbuf_KEY]
  854.     mcStoreLocal loc39.nKEY, eax
  855.  
  856.     fld     [ebx + TCmdBuf.cmdbuf_FNUM]
  857.     fstp    [esp + loc39.dbl_POW]
  858.  
  859. .L28:
  860.     mcLoadLocal eax, loc39.nKEY
  861.     mcStoreLocal loc39.nKEY1, eax
  862.  
  863.     cmp     eax, CMD_TOKEN_EOL
  864.     je      .L2409
  865.  
  866. .L30:
  867.     call    TCmdBuf_Scan
  868.     mcStoreLocal loc39.pszAITEM, esi
  869.  
  870.     movzx   eax, [ebx + TCmdBuf.cmdbuf_KEY]
  871.     mcStoreLocal loc39.nKEY2, eax
  872.  
  873.     mcLoadLocal eax, loc39.nKEY1
  874.     mcStoreLocal loc39.nKEY, eax
  875.  
  876.     cmp     [esp + loc39.nKEY2], CMD_TOKEN_EOL
  877.     je      .L35
  878.  
  879.     mcLoadLocal esi, loc39.pszAITEM
  880.     mcLoad8bitsToReg32 ecx, 122
  881.     call    TCmdBuf_Crop
  882.     jnc     .L34
  883.  
  884.     inc     [esp + loc39.bNO]
  885.     jmp     .L35
  886.  
  887. .L34:
  888.     call    TMove_BegPardon
  889.     jmp     .L15
  890.  
  891. .L35:
  892.     cmp     [esp + loc39.nKEY], CMD_TOKEN_REAL
  893.     jne     .L26
  894.  
  895.     mcLoadLocal esi, loc39.pTrekData
  896.     fld     [esi + TREKDATA.ENERGY]
  897.     fld     [esp + loc39.dbl_POW]
  898.     mc_CMP_ST0_ST1
  899.     jc      .L41
  900.  
  901.     mov     ecx, 282
  902.     call    TConsole_Cram
  903.     jmp     .L25
  904.  
  905. .L41:
  906.     fld     [esp + loc39.dbl_POW]
  907.     fld     [glb_dbl_5]
  908.     mc_CMP_ST0_ST1
  909.     jc      .L46
  910.     jz      .L46
  911.  
  912.     fldz
  913.     fld     [esp + loc39.dbl_POW]
  914.     mc_CMP_ST0_ST1
  915.     jc      .L15
  916.     jz      .L15
  917.  
  918.     mov     ecx, 283
  919.     call    TConsole_Prout
  920.     jmp     .L15
  921.  
  922. .L42:
  923.     ;
  924.     ; Print message for shield control
  925.     ; and decide if malfunction occurs
  926.     ;
  927.     call    TConsole_ScrollUp
  928.  
  929.     fld     [glb_dbl_0dot995]
  930.     call    TRandom_Ranf
  931.     mc_CMP_ST0_ST1
  932.     jc      .L45
  933.     ;
  934.     ; Malfunction!
  935.     ;
  936.     call    TMove_RedAlert
  937.     call    TConsole_SetCrewMsgAttr
  938.     mov     ecx, 284
  939.     call    TConsole_Prout
  940.  
  941.     call    TConsole_ScrollUp
  942.     call    TConsole_SetGameMsgAttr
  943.     mov     ecx, 285
  944.     call    TConsole_Prout
  945.     jmp     .done
  946.  
  947. .L45:
  948.     call    TConsole_SetGameMsgAttr
  949.     mov     ecx, 229
  950.     call    TConsole_Prout
  951.     jmp     [esp + loc39.pIWHERE]
  952.  
  953. .L46:
  954.     ;
  955.     ; Allocate energy among klingons according to
  956.     ; nearest first strategy and compute hits
  957.     ;
  958.     cmp     [esp + loc39.bIFAST], 0
  959.     je      .L47
  960.  
  961.     mov     eax, .L47
  962.     mcStoreLocal loc39.pIWHERE, eax
  963.     jmp     .L42
  964.  
  965. .L47:
  966.     mcLoadLocal esi, loc39.pTrekData
  967.     fld     [esi + TREKDATA.ENERGY]
  968.     fld     [esp + loc39.dbl_POW]
  969.     fsubp
  970.     fld     st
  971.     fstp    [esi + TREKDATA.ENERGY]
  972.     fstp    [esp + loc39.dbl_EXTRA]
  973.  
  974.     cmp     [esp + loc39.nEnemies], 0
  975.     je      .L75
  976.     ;
  977.     ; Loop that distribute hits in automatic mode
  978.     ;
  979.     fldz
  980.     fstp    [esp + loc39.dbl_EXTRA]
  981.  
  982.     fld     [esp + loc39.dbl_POW]
  983.     fstp    [esp + loc39.dbl_POWREM]
  984.  
  985.     mcLoad1 eax
  986.     mcStoreLocal loc39.nI, eax
  987.  
  988. .compute_hit:
  989.     fldz
  990.     fstp    [esp + loc39.dbl_HITS_I_]
  991.  
  992.     fldz
  993.     fld     [esp + loc39.dbl_POWREM]
  994.     mc_CMP_ST0_ST1
  995.     jc      .L50
  996.     jz      .L50
  997.  
  998.     mcLoadLocal ebx, loc39.pTrekData
  999.     mcLoadLocal ecx, loc39.nI
  1000.     dec     ecx
  1001.     imul    ecx, 10
  1002.     lea     edi, [ebx + ecx + TREKDATA.KDIST]
  1003.     mov     esi, glb_dbl_0dot9
  1004.     call    TCommon_X_exp_Y
  1005.     fld     st
  1006.     faddp
  1007.  
  1008.     fld     [ebx + ecx + TREKDATA.KPOWER]
  1009.     fabs
  1010.     fdivrp
  1011.     fld     st
  1012.     fstp    [esp + loc39.dbl_HITS_I_]
  1013.     fstp    [esp + ecx + loc39.arr_HITS]
  1014.  
  1015.     call    TRandom_Ranf
  1016.     fld     [glb_dbl_0dot05]
  1017.     fmulp
  1018.     fld     [glb_dbl_0dot01]
  1019.     faddp
  1020.     fld     [esp + loc39.dbl_HITS_I_]
  1021.     fmulp
  1022.     fstp    [esp + loc39.dbl_OVER]
  1023.  
  1024.     fld     [esp + loc39.dbl_POWREM]
  1025.     fstp    [esp + loc39.dbl_TEMP]
  1026.  
  1027.     fld     [esp + loc39.dbl_POWREM]
  1028.     fld     [esp + loc39.dbl_HITS_I_]
  1029.     fsubp
  1030.     fld     [esp + loc39.dbl_OVER]
  1031.     fsubp
  1032.     fld     st
  1033.     fstp    [esp + loc39.dbl_POWREM]
  1034.  
  1035.     fldz
  1036.     mc_CMP_ST0_ST1
  1037.     jc      .extra_plus_over
  1038.  
  1039.     fld     [esp + loc39.dbl_TEMP]
  1040.     fld     [esp + loc39.dbl_HITS_I_]
  1041.     call    TCommon_FPU_Min
  1042.     fstp    [esp + loc39.dbl_HITS_I_]
  1043.  
  1044.     fldz
  1045.     fstp    [esp + loc39.dbl_OVER]
  1046.  
  1047.     mcLoadLocal ecx, loc39.nI
  1048.     dec     ecx
  1049.     imul    ecx, 10
  1050.     fld     [esp + loc39.dbl_HITS_I_]
  1051.     fstp    [esp + ecx + loc39.arr_HITS]
  1052.  
  1053. .extra_plus_over:
  1054.     fld     [esp + loc39.dbl_EXTRA]
  1055.     fld     [esp + loc39.dbl_OVER]
  1056.     faddp
  1057.     fstp    [esp + loc39.dbl_EXTRA]
  1058.  
  1059. .L50:
  1060.     inc     [esp + loc39.nI]
  1061.     mov     ecx, [esp + loc39.nI]
  1062.     cmp     ecx, [esp + loc39.nEnemies]
  1063.     jbe     .compute_hit
  1064.  
  1065.     fldz
  1066.     fld     [esp + loc39.dbl_POWREM]
  1067.     mc_CMP_ST0_ST1
  1068.     jc      .hit_them
  1069.     jz      .hit_them
  1070.  
  1071.     fld     [esp + loc39.dbl_EXTRA]
  1072.     fld     [esp + loc39.dbl_POWREM]
  1073.     faddp
  1074.     fstp    [esp + loc39.dbl_EXTRA]
  1075.  
  1076. .hit_them:
  1077.     mcLoadLocalRef esi, loc39.arr_HITS
  1078.     call    TPhasers_HitThem
  1079.  
  1080.     fldz
  1081.     fld     [esp + loc39.dbl_EXTRA]
  1082.     mc_CMP_ST0_ST1
  1083.     jz      .L200
  1084.  
  1085.     mcLoadLocal esi, loc39.pTrekData
  1086.     cmp     [esi + TREKDATA.ALLDONE], 0
  1087.     jne     .L200
  1088.  
  1089. .L75:
  1090.     ;
  1091.     ; Inform of overkill
  1092.     ;
  1093.     mcLoadLocal esi, loc39.pTrekData
  1094.     cmp     [esi + TREKDATA.ITHERE], 0
  1095.     je      .L78
  1096.  
  1097.     call    TConsole_SetGameMsgAttr
  1098.     mov     ecx, 286
  1099.     call    TConsole_Cram
  1100.  
  1101.     cmp     [esp + loc39.nEnemies], 0
  1102.     je      .L7501
  1103.  
  1104.     mov     ecx, 287
  1105.     call    TConsole_Cram
  1106.  
  1107. .L7501:
  1108.     mov     ecx, 288
  1109.     call    TConsole_Prout
  1110.     jmp     .L200
  1111.  
  1112. .L78:
  1113.     call    TConsole_SetGameMsgAttr
  1114.     mov     cl, 2
  1115.     fld     [esp + loc39.dbl_EXTRA]
  1116.     call    TConsole_CramFloat
  1117.     mov     ecx, 289
  1118.     call    TConsole_Prout
  1119.     jmp     .L200
  1120.  
  1121. .L80:
  1122.     ;
  1123.     ; Manual section begins here.
  1124.     ; Inform of imposed manual condition.
  1125.     ;
  1126.     call    TConsole_SetGameMsgAttr
  1127.     mov     ecx, 299
  1128.     call    TConsole_Prout
  1129.     jmp     .L84
  1130.  
  1131. .L81:
  1132.     call    TConsole_SetGameMsgAttr
  1133.     call    TConsole_ScrollUp
  1134.     mov     ecx, 290
  1135.     call    TConsole_Prout
  1136.     mov     ecx, 291
  1137.     call    TConsole_Prout
  1138.     mov     ecx, 292
  1139.     call    TConsole_Prout
  1140.     mov     ecx, 293
  1141.     call    TConsole_Prout
  1142.     call    TConsole_ScrollUp
  1143.  
  1144. .L84:
  1145.     call    TConsole_SetGameMsgAttr
  1146.     mov     ecx, 282
  1147.     call    TConsole_Cram
  1148.  
  1149.     mov     cl, 2
  1150.     mcLoadLocal esi, loc39.pTrekData
  1151.     fld     [esi + TREKDATA.ENERGY]
  1152.     fld     [glb_dbl_0dot006]
  1153.     fsubp
  1154.     call    TConsole_CramFloat
  1155.     call    TConsole_ScrollUp
  1156.  
  1157. .L870:
  1158.     ;
  1159.     ; Loop for desired individual hits
  1160.     ;
  1161.     mcLoad1 eax
  1162.     mcStoreLocal loc39.nK, eax
  1163.  
  1164. .L87:
  1165.     mov     cl, ATTR_PROMPT_TEXT
  1166.     call    TConsole_SetAttr
  1167.  
  1168.     cmp     [esp + loc39.bIPOOP], 0
  1169.     je      .L88
  1170.     ;
  1171.     ; Print battle computer recommendation
  1172.     ;
  1173.     mov     al, '('
  1174.     call    TConsole_PutChar
  1175.  
  1176.     call    TRandom_Ranf
  1177.     fld     [glb_dbl_0dot05]
  1178.     fmulp
  1179.     fld     [glb_dbl_1dot01]
  1180.     faddp
  1181.     fstp    [esp + loc39.dbl_PART2]
  1182.  
  1183.     mov     esi, glb_dbl_0dot9
  1184.     mcLoadLocal ebx, loc39.pTrekData
  1185.     mcLoadLocal ecx, loc39.nK
  1186.     dec     ecx
  1187.     imul    ecx, 10
  1188.     lea     edi, [ebx + ecx + TREKDATA.KDIST]
  1189.     call    TCommon_X_exp_Y
  1190.     fld     st
  1191.     faddp
  1192.     fstp    [esp + loc39.dbl_PART1]
  1193.  
  1194.     fld     [ebx + ecx + TREKDATA.KPOWER]
  1195.     fabs
  1196.  
  1197.     fld     [esp + loc39.dbl_PART1]
  1198.     fdivp
  1199.  
  1200.     fld     [esp + loc39.dbl_PART2]
  1201.     fmulp
  1202.  
  1203.     call    TCommon_FP_Truncate
  1204.     inc     eax
  1205.     call    TConsole_CramInt
  1206.  
  1207.     mov     ecx, 300
  1208.     call    TConsole_Cram
  1209.  
  1210. .L88:
  1211.     mov     ecx, 294
  1212.     call    TConsole_Cram
  1213.  
  1214.     mcLoadLocal ecx, loc39.nK
  1215.     mcLoadLocal ebx, loc39.pTrekData
  1216.     dec     ecx
  1217.     lea     esi, [ebx + TREKDATA.KX]
  1218.     lea     edi, [ebx + TREKDATA.KY]
  1219.     mov     al, [esi + ecx]
  1220.     mov     dl, [edi + ecx]
  1221.     call    TConsole_CramEnemyAtEx
  1222.  
  1223.     cmp     [esp + loc39.bIDOIT], 1
  1224.     je      .L89
  1225.     ;
  1226.     ; Phasers can't actually be fired - loop back for
  1227.     ; next computer readout or terminate if that's all.
  1228.     ;
  1229.     call    TConsole_ScrollUp
  1230.  
  1231.     inc     [esp + loc39.nK]
  1232.     mov     ecx, [esp + loc39.nK]
  1233.     cmp     ecx, [esp + loc39.nEnemies]
  1234.     jbe     .L87
  1235.     jmp     .L15
  1236.  
  1237. .L89:
  1238.     mov     ecx, 301
  1239.     call    TGame_Prompt
  1240.  
  1241. .L90:
  1242.     cmp     [esp + loc39.nK], 1
  1243.     jne     .scan_hit
  1244.  
  1245.     fldz
  1246.     fstp    [esp + loc39.dbl_POW]
  1247.  
  1248. .scan_hit:
  1249.     call    TCmdBuf_Scan
  1250.  
  1251.     fld     [ebx + TCmdBuf.cmdbuf_FNUM]
  1252.     mcLoadLocal ecx, loc39.nK
  1253.     dec     ecx
  1254.     imul    ecx, 10
  1255.     fld     st
  1256.     fstp    [esp + ecx + loc39.arr_HITS]
  1257.     fstp    [esp + loc39.dbl_HITS_I_]
  1258.  
  1259.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
  1260.     je      .L95
  1261.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
  1262.     jne     .L91
  1263.  
  1264.     cmp     [esp + loc39.nK], 1
  1265.     je      .L84
  1266.     jmp     .L87
  1267.  
  1268. .L91:
  1269.     mcLoad8bitsToReg32 ecx, 122
  1270.     call    TCmdBuf_Crop
  1271.     jnc     .L84
  1272.  
  1273.     inc     [esp + loc39.bNO]
  1274.     jmp     .L90
  1275.  
  1276. .L95:
  1277.     fldz
  1278.     fld     [esp + loc39.dbl_HITS_I_]
  1279.     mc_CMP_ST0_ST1
  1280.     jc      .L15
  1281.  
  1282.     fld     [esp + loc39.dbl_POW]
  1283.     fld     [esp + loc39.dbl_HITS_I_]
  1284.     faddp
  1285.     fstp    [esp + loc39.dbl_POW]
  1286.     ;
  1287.     ; If total amount is too much, then
  1288.     ; inform and start over.
  1289.     ;
  1290.     mcLoadLocal esi, loc39.pTrekData
  1291.     fld     [esi + TREKDATA.ENERGY]
  1292.     fld     [esp + loc39.dbl_POW]
  1293.     mc_CMP_ST0_ST1
  1294.     jc      .L97
  1295.  
  1296.     call    TConsole_SetGameMsgAttr
  1297.     mov     ecx, 295
  1298.     call    TConsole_Prout
  1299.     jmp     .L84
  1300.  
  1301. .L97:
  1302.     inc     [esp + loc39.nK]
  1303.     mov     ecx, [esp + loc39.nK]
  1304.     cmp     ecx, [esp + loc39.nEnemies]
  1305.     jbe     .L90
  1306.     ;
  1307.     ; If total requested is 0.0 - abort phasers.
  1308.     ;
  1309.     fldz
  1310.     fld     [esp + loc39.dbl_POW]
  1311.     mc_CMP_ST0_ST1
  1312.     jz      .L15
  1313.  
  1314.     call    TCmdBuf_Scan
  1315.  
  1316.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA
  1317.     jne     .L9701
  1318.  
  1319.     mcLoad8bitsToReg32 ecx, 122
  1320.     call    TCmdBuf_Crop
  1321.     adc     [esp + loc39.bNO], 0
  1322.  
  1323. .L9701:
  1324.     mcLoadLocal esi, loc39.pTrekData
  1325.     fld     [esi + TREKDATA.ENERGY]
  1326.     fld     [esp + loc39.dbl_POW]
  1327.     fsubp
  1328.     fstp    [esi + TREKDATA.ENERGY]
  1329.  
  1330.     cmp     [esp + loc39.bIFAST], 0
  1331.     je      .L98
  1332.  
  1333.     mov     eax, .L98
  1334.     mcStoreLocal loc39.pIWHERE, eax
  1335.     jmp     .L42
  1336.  
  1337. .L98:
  1338.     mcLoadLocalRef esi, loc39.arr_HITS
  1339.     call    TPhasers_HitThem
  1340.  
  1341.     mcLoadLocal edi, loc39.pTrekData
  1342.     inc     [edi + TREKDATA.IDIDIT]
  1343.  
  1344. .L200:
  1345.     ;
  1346.     ; Raising shields after phaser fire.
  1347.     ;
  1348.     mcLoadLocal esi, loc39.pTrekData
  1349.     cmp     [esi + TREKDATA.ALLDONE], 0
  1350.     jne     .done
  1351.  
  1352.     cmp     [esp + loc39.bIFAST], 0
  1353.     je      .L210
  1354.  
  1355.     call    TConsole_ScrollUp
  1356.     cmp     [esp + loc39.bNO], 0
  1357.     jne     .L202
  1358.  
  1359.     fld     [glb_dbl_0dot99]
  1360.     call    TRandom_Ranf
  1361.     mc_CMP_ST0_ST1
  1362.     jc      .L205
  1363.  
  1364.     call    TConsole_SetCrewMsgAttr
  1365.     mov     ecx, 296
  1366.     call    TConsole_Prout
  1367.     mov     ecx, 297
  1368.     call    TConsole_Prout
  1369.  
  1370. .L202:
  1371.     mcLoadLocal edi, loc39.pTrekData
  1372.     mov     [edi + TREKDATA.SHLDUP], 0
  1373.     jmp     .L210
  1374.  
  1375. .L205:
  1376.     call    TConsole_SetGameMsgAttr
  1377.     mov     ecx, 228
  1378.     call    TConsole_Prout
  1379.  
  1380. .L210:
  1381.     ;
  1382.     ; Check for phaser overheat
  1383.     ;
  1384.     fld     [glb_dbl_1500]
  1385.     fld     [esp + loc39.dbl_POW]
  1386.     mc_CMP_ST0_ST1
  1387.     jc      .done
  1388.     jz      .done
  1389.  
  1390.     fld     [esp + loc39.dbl_POW]
  1391.     fld     [glb_dbl_1500]
  1392.     fsubp
  1393.     fld     [glb_dbl_0dot00038]
  1394.     fmulp
  1395.     fstp    [esp + loc39.dbl_TEMP]
  1396.  
  1397.     call    TRandom_Ranf
  1398.     fld     [esp + loc39.dbl_TEMP]
  1399.     mc_CMP_ST0_ST1
  1400.     jc      .done
  1401.  
  1402.     call    TConsole_ScrollUp
  1403.     call    TConsole_SetCrewMsgAttr
  1404.     mov     ecx, 298
  1405.     call    TConsole_Prout
  1406.  
  1407.     call    TRandom_Ranf
  1408.     fld1
  1409.     faddp
  1410.     fld     [esp + loc39.dbl_TEMP]
  1411.     fld1
  1412.     faddp
  1413.     fmulp
  1414.     mcLoadLocal esi, loc39.pTrekData
  1415.     fld     [esi + TREKDATA.DAMFAC]
  1416.     fmulp
  1417.     mov     cl, DEV_PHASERS
  1418.     call    TArray_SetDblDamage
  1419.  
  1420. .done:
  1421.     mcEndLocals loc39.size
  1422.     ret
  1423.  
  1424. ; --- EOF ---
  1425.