0,0 → 1,1424 |
; -------------------------------------------------------------------------- |
; FILE: TPhasers.Asm |
; DATE: October 18, 2008 |
; -------------------------------------------------------------------------- |
|
; -------------------------------------------------------------------------- |
; Input: |
; AL = quadrant X of a COMMANDER |
; DL = quadrant Y of a COMMANDER |
; Output: |
; CF=1 if commander was removed |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_RemoveCommander: |
pushad |
|
mcLoadGameDataPtr ebx |
cmp [ebx + TREKDATA.REMCOM], 0 |
je .not_removed |
|
mcLoadMemberRef esi, TREKDATA.CX |
mcLoadMemberRef edi, TREKDATA.CY |
mcZeroBits ecx |
|
.find_commander: |
cmp [esi + ecx], al |
jne .next_commander |
cmp [edi + ecx], dl |
jne .next_commander |
; |
; Replace commander by the last entry |
; |
movzx edx, [ebx + TREKDATA.REMCOM] |
dec edx |
push edx |
|
mov al, [esi + edx] |
mov dl, [edi + edx] |
mov [esi + ecx], al |
mov [edi + ecx], dl |
|
mcZeroBits eax |
pop edx |
mov [esi + edx], al |
mov [edi + edx], al |
|
dec [ebx + TREKDATA.REMCOM] |
|
popad |
stc |
ret |
|
.next_commander: |
inc ecx |
cmp cl, [ebx + TREKDATA.REMCOM] |
jb .find_commander |
|
.not_removed: |
popad |
clc |
ret |
|
; -------------------------------------------------------------------------- |
; DEADKL |
; -------------------------------------------------------------------------- |
; Input: |
; AL = sector X of an enemy |
; DL = sector Y of an enemy |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc41: |
.pTrekData PVOID ? |
.pQUAD PBYTE ? |
.nTYPE BYTE ? |
.nIXX BYTE ? |
.nIYY BYTE ? |
.nEnemies BYTE ? |
.nJ INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_DeadKlingon: |
mcBeginLocals loc41.size |
|
mcStoreLocal loc41.nIXX, al |
mcStoreLocal loc41.nIYY, dl |
|
call TArray_QuadPtr |
mcStoreLocal loc41.pQUAD, ebx |
|
mov cl, [ebx] |
mcStoreLocal loc41.nTYPE, cl |
|
mcLoadGameDataPtr ebx |
mcStoreLocal loc41.pTrekData, ebx |
|
call TConsole_SetGameMsgAttr |
mcLoadLocal al, loc41.nIXX |
mcLoadLocal dl, loc41.nIYY |
mcLoadLocal bl, loc41.nTYPE |
mov cl, 2 |
call TConsole_CramEnemyAt |
|
mcLoadLocal al, loc41.nTYPE |
mcOnRegEqu al, CHAR_THOLIAN, .L30 |
mcOnRegEqu al, CHAR_ROMULAN, .L27 |
|
call TArray_MyGalaxyPtr |
sub dword [ebx], 100 |
|
mcLoadLocal edi, loc41.pTrekData |
dec [edi + TREKDATA.KLHERE] |
dec [edi + TREKDATA.REMKL] |
|
mcLoadLocal al, loc41.nTYPE |
mcOnRegEqu al, CHAR_KLINGON, .L25 |
mcOnRegEqu al, CHAR_SCOM, .L26 |
; |
; COMMANDER finds his fate! |
; |
mcLoadLocal edi, loc41.pTrekData |
mov [edi + TREKDATA.COMHERE], 0 |
|
mov al, [edi + TREKDATA.QUADX] |
mov dl, [edi + TREKDATA.QUADY] |
call TPhasers_RemoveCommander |
|
fld [glb_dbl_1E38] |
fstp [edi + TREKDATA.FUTURE2] |
|
cmp [edi + TREKDATA.REMCOM], 0 |
je .kill_commander |
|
mov al, [edi + TREKDATA.INCOM] |
call TCommon_LoadByteIntoFPU |
mov al, [edi + TREKDATA.REMCOM] |
call TCommon_LoadByteIntoFPU |
fdivp |
push edi |
call TCommon_ExpRan |
pop edi |
fld [edi + TREKDATA.DATE] |
faddp |
fstp [edi + TREKDATA.FUTURE2] |
|
.kill_commander: |
inc [edi + TREKDATA.KILLC] |
jmp .L30 |
|
.L25: |
; |
; Ordinary KLINGON wasted! |
; |
inc [edi + TREKDATA.KILLK] |
jmp .L30 |
|
.L26: |
; |
; SUPER-COMMANDER finally brought down! |
; |
mcZeroBits eax |
mov [edi + TREKDATA.NSCREM], al |
mov [edi + TREKDATA.ISHERE], al |
mov [edi + TREKDATA.ISX], al |
mov [edi + TREKDATA.ISY], al |
mov [edi + TREKDATA.ISATB], al |
mov [edi + TREKDATA.ISCATE], al |
|
inc [edi + TREKDATA.NSCKILL] |
fld [glb_dbl_1E38] |
fld st |
fstp [edi + TREKDATA.FUTURE6] |
fstp [edi + TREKDATA.FUTURE7] |
jmp .L30 |
|
.L27: |
; |
; ROMULAN destroyed! |
; |
call TArray_MyNewStufPtr |
sub byte [ebx], 10 |
|
dec [edi + TREKDATA.IRHERE] |
dec [edi + TREKDATA.NROMREM] |
inc [edi + TREKDATA.NROMKL] |
|
.L30: |
; |
; Finish message |
; |
mov ecx, 306 |
call TConsole_Prout |
|
mcLoadLocal ebx, loc41.pQUAD |
mov byte [ebx], CHAR_COSMOS |
|
mcLoadLocal esi, loc41.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
je .done |
|
mov al, [esi + TREKDATA.REMCOM] |
shl al, 2 |
add al, [esi + TREKDATA.REMKL] |
call TCommon_LoadByteIntoFPU |
fld [esi + TREKDATA.REMRES] |
fdivrp |
fstp [esi + TREKDATA.REMTIME] |
; |
; Kill Tholian |
; |
cmp [esp + loc41.nTYPE], CHAR_THOLIAN |
je .kill_tholian |
; |
; Remove enemy ship from arrays describing local conditions |
; |
mov cl, [esi + TREKDATA.NENHERE] |
mcStoreLocal loc41.nEnemies, cl |
lea edi, [esi + TREKDATA.KY] |
add esi, TREKDATA.KX |
mcZeroBits ecx |
mcLoadLocal al, loc41.nIXX |
mcLoadLocal dl, loc41.nIYY |
|
.find_enemy_ship: |
cmp al, [esi + ecx] |
jne .next_ship |
cmp dl, [edi + ecx] |
je .L45 |
|
.next_ship: |
inc ecx |
cmp cl, [esp + loc41.nEnemies] |
jb .find_enemy_ship |
|
;int 3 |
jmp .done |
|
.L45: |
inc ecx |
|
mcLoadLocal ebx, loc41.pTrekData |
dec [ebx + TREKDATA.NENHERE] |
dec [esp + loc41.nEnemies] |
|
cmp cl, [ebx + TREKDATA.NENHERE] |
ja .L55 |
; |
; Shift all ships up to delete the killed one |
; |
mcStoreLocal loc41.nJ, ecx |
|
.remove_ship: |
mcLoadLocal ecx, loc41.nJ |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
dec ecx |
mov al, [esi + ecx + 1] |
mov dl, [edi + ecx + 1] |
mov [esi + ecx], al |
mov [edi + ecx], dl |
|
imul ecx, 10 |
mcLoadMemberRef esi, TREKDATA.KPOWER |
mcLoadMemberRef edi, TREKDATA.KDIST |
fld tbyte [esi + ecx + 10] |
fld tbyte [edi + ecx + 10] |
fstp tbyte [edi + ecx] |
fstp tbyte [esi + ecx] |
|
inc [esp + loc41.nJ] |
mov ecx, [esp + loc41.nJ] |
cmp cl, [esp + loc41.nEnemies] |
jbe .remove_ship |
|
.L55: |
; |
; Cleanup the tail of arrays |
; |
movzx ecx, [esp + loc41.nEnemies] |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mcZeroBits eax |
mov [esi + ecx], al |
mov [edi + ecx], al |
|
imul ecx, 10 |
fldz |
fldz |
mcLoadMemberRef esi, TREKDATA.KPOWER |
mcLoadMemberRef edi, TREKDATA.KDIST |
fstp tbyte [esi + ecx] |
fstp tbyte [edi + ecx] |
jmp .done |
|
.kill_tholian: |
dec [esi + TREKDATA.ITHERE] |
|
.done: |
mcEndLocals loc41.size |
ret |
|
; -------------------------------------------------------------------------- |
; HITEM |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = pointer to array of DOUBLE values with hits |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc40: |
.pTrekData PVOID ? |
.pHITS PDOUBLE ? |
.nNENHER2 COUNT ? |
.nK INDEX ? |
.nKK INDEX ? |
.dbl_KP DOUBLE ? |
.dbl_KPOW DOUBLE ? |
.pKPOWER PDOUBLE ? |
.pKDIST PDOUBLE ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.nII BYTE ? |
.nJJ BYTE ? |
.n1 BYTE ? |
.n2 BYTE ? |
.dbl_HIT DOUBLE ? |
.dbl_WHAM DOUBLE ? |
.dbl_DUSTFAC DOUBLE ? |
.dbl_1 DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_HitThem: |
mcBeginLocals loc40.size |
|
mcLoadGameDataPtr edi |
mcStoreLocal loc40.pTrekData, edi |
mcStoreLocal loc40.pHITS, esi |
|
movzx eax, [edi + TREKDATA.NENHERE] |
mcStoreLocal loc40.nNENHER2, eax |
|
lea ebx, [edi + TREKDATA.KX] |
lea ecx, [edi + TREKDATA.KY] |
lea esi, [edi + TREKDATA.KPOWER] |
lea eax, [edi + TREKDATA.KDIST] |
mcStoreLocal loc40.pKX, ebx |
mcStoreLocal loc40.pKY, ecx |
mcStoreLocal loc40.pKPOWER, esi |
mcStoreLocal loc40.pKDIST, eax |
|
call TConsole_ScrollUp |
|
mcLoad1 eax |
mcStoreLocal loc40.nKK, eax |
mcStoreLocal loc40.nK, eax |
|
.next_hit: |
invoke Sleep, 500 |
|
mcLoadLocal ecx, loc40.nK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pHITS |
fld tbyte [esi + ecx] |
fstp [esp + loc40.dbl_WHAM] |
|
fldz |
fld [esp + loc40.dbl_WHAM] |
mc_CMP_ST0_ST1 |
jz .L30 |
|
call TRandom_Ranf |
fld [glb_dbl_0dot01] |
fmulp |
fld [glb_dbl_0dot9] |
faddp |
fstp [esp + loc40.dbl_DUSTFAC] |
|
mcLoadLocal ecx, loc40.nKK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pKDIST |
lea edi, [esi + ecx] |
mcLoadLocalRef esi, loc40.dbl_DUSTFAC |
call TCommon_X_exp_Y |
fld [esp + loc40.dbl_WHAM] |
fmulp |
fstp [esp + loc40.dbl_HIT] |
|
mcLoadLocal ecx, loc40.nKK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pKPOWER |
fld tbyte [esi + ecx] |
fstp [esp + loc40.dbl_KP] |
|
fld [esp + loc40.dbl_KP] |
fabs |
fld [esp + loc40.dbl_HIT] |
fld st |
faddp |
call TCommon_FPU_Min |
|
fld [esp + loc40.dbl_KP] |
call TCommon_FPU_SignAB |
|
fld [esp + loc40.dbl_KP] |
fsubrp |
fld st |
fstp tbyte [esi + ecx] |
fstp [esp + loc40.dbl_KPOW] |
|
mcLoadLocal ecx, loc40.nKK |
dec ecx |
mcLoadLocal esi, loc40.pKX |
mcLoadLocal edi, loc40.pKY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcStoreLocal loc40.nII, al |
mcStoreLocal loc40.nJJ, dl |
|
call TConsole_SetGameMsgAttr |
fld [esp + loc40.dbl_HIT] |
fld [glb_dbl_0dot005] |
mc_CMP_ST0_ST1 |
jc .L10 |
|
mov ecx, 302 |
call TConsole_Cram |
jmp .L20 |
|
.L10: |
fld [esp + loc40.dbl_HIT] |
mov cl, 2 |
call TConsole_CramFloat |
|
mov ecx, 303 |
call TConsole_Cram |
|
.L20: |
mcLoadLocal al, loc40.nII |
mcLoadLocal dl, loc40.nJJ |
call TConsole_CramEnemyAtEx |
call TConsole_ScrollUp |
|
fldz |
fld [esp + loc40.dbl_KPOW] |
mc_CMP_ST0_ST1 |
jnz .L25 |
|
mcLoadLocal al, loc40.nII |
mcLoadLocal dl, loc40.nJJ |
call TPhasers_DeadKlingon |
|
mcLoadLocal esi, loc40.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
je .game_won |
|
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
jmp .L40 |
|
.L25: |
fldz |
fld [esp + loc40.dbl_KPOW] |
mc_CMP_ST0_ST1 |
jc .L30 |
|
fld [glb_dbl_0dot9] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L30 |
|
call TRandom_Ranf |
fld [glb_dbl_0dot4] |
fmulp |
fld [glb_dbl_0dot4] |
faddp |
fld [esp + loc40.dbl_KP] |
fmulp |
fld [esp + loc40.dbl_KPOW] |
mc_CMP_ST0_ST1 |
jnc .L30 |
|
call TConsole_SetCrewMsgAttr |
mov ecx, 304 |
call TConsole_Cram |
|
mov cl, 2 |
mcLoadLocal al, loc40.nII |
mcLoadLocal dl, loc40.nJJ |
call TConsole_CramLoc |
|
call TConsole_ScrollUp |
mov ecx, 305 |
call TConsole_Prout |
|
fld [esp + loc40.dbl_KPOW] |
fchs |
|
mcLoadLocal ecx, loc40.nKK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pKPOWER |
fstp tbyte [esi + ecx] |
|
.L30: |
inc [esp + loc40.nKK] |
|
.L40: |
; |
; Next hit |
; |
inc [esp + loc40.nK] |
mov ecx, [esp + loc40.nK] |
cmp ecx, [esp + loc40.nNENHER2] |
jbe .next_hit |
jmp .done |
|
.game_won: |
mov al, 1 |
call TFinish_Main |
|
.done: |
mcEndLocals loc40.size |
ret |
|
; -------------------------------------------------------------------------- |
; PHASERS |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc39: |
.pTrekData PVOID ? |
.bIFAST BOOL ? |
.bIPOOP BOOL ? |
.bIDOIT BOOL ? |
.bNO BOOL ? |
.nK INDEX ? |
.nI INDEX ? |
.pIWHERE PVOID ? |
.nEnemies COUNT ? |
.nKEY UINT32 ? |
.nKEY1 UINT32 ? |
.nKEY2 UINT32 ? |
.nIREC UINT32 ? |
.pszAITEM PCHAR ? |
.dbl_POW DOUBLE ? |
.dbl_POWREM DOUBLE ? |
.dbl_EXTRA DOUBLE ? |
.dbl_TEMP DOUBLE ? |
.dbl_PART1 DOUBLE ? |
.dbl_PART2 DOUBLE ? |
.dbl_HITS_I_ DOUBLE ? |
.dbl_OVER DOUBLE ? |
.arr_HITS DOUBLES 20 |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_Main: |
mcBeginLocals loc39.size |
|
call TConsole_SetGameMsgAttr |
|
mcLoadGameDataPtr esi |
mcStoreLocal loc39.pTrekData, esi |
|
movzx ecx, [esi + TREKDATA.NENHERE] |
mcStoreLocal loc39.nEnemies, ecx |
|
mcZeroBits eax |
mcStoreLocal loc39.bIFAST, eax |
mcStoreLocal loc39.bNO, eax |
mcStoreLocal loc39.nIREC, eax |
|
inc eax |
mcStoreLocal loc39.bIPOOP, eax |
mcStoreLocal loc39.bIDOIT, eax |
mov [esi + TREKDATA.IDIDIT], al |
|
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
adc [esp + loc39.nIREC], 0 |
|
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
adc [esp + loc39.nIREC], 0 |
|
cmp [esp + loc39.nIREC], 0 |
je .check_firing_solution |
|
dec [esp + loc39.bIPOOP] |
|
.check_firing_solution: |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L5 |
|
mov ecx, 274 |
call TConsole_Prout |
jmp .L19 |
|
.L5: |
mov cl, DEV_PHASERS |
call TArray_IsDamaged |
jnc .L10 |
|
mov ecx, 275 |
call TConsole_Prout |
jmp .L19 |
|
.L10: |
; |
; Do checks for hi-speed shield control |
; |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L20 |
|
mov cl, DEV_SHIELD_CONTROL |
call TArray_IsDamaged |
jnc .L13 |
|
mov ecx, 276 |
call TConsole_Prout |
jmp .L19 |
|
.L13: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_200] |
mc_CMP_ST0_ST1 |
jc .L16 |
|
mov ecx, 277 |
call TConsole_Prout |
|
.L19: |
dec [esp + loc39.bIDOIT] |
|
cmp [esp + loc39.bIPOOP], 0 |
je .L15 |
cmp [esp + loc39.nEnemies], 0 |
je .L15 |
|
mov ecx, 278 |
call TConsole_Prout |
jmp .L870 |
|
.L15: |
mcLoadLocal esi, loc39.pTrekData |
dec [esi + TREKDATA.IDIDIT] |
|
cmp [esp + loc39.bIFAST], 0 |
je .done |
|
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_200] |
faddp |
fstp [esi + TREKDATA.ENERGY] |
jmp .done |
|
.L16: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_200] |
fsubp |
fstp [esi + TREKDATA.ENERGY] |
inc [esp + loc39.bIFAST] |
|
.L20: |
; |
; Read in amount of energy to expend on phaser fire |
; |
call TCmdBuf_Scan |
mcStoreLocal loc39.pszAITEM, esi |
|
movzx ecx, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY, ecx |
|
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc39.dbl_POW] |
|
cmp [esp + loc39.nEnemies], 0 |
je .L35 |
|
mcLoad1 edx |
mcStoreLocal loc39.nK, edx |
|
cmp [esp + loc39.nKEY], CMD_TOKEN_ALPHA |
je .L23 |
cmp [esp + loc39.nKEY], CMD_TOKEN_REAL |
je .L28 |
|
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L23 |
|
inc [esp + loc39.bNO] |
|
call TCmdBuf_Scan |
mcStoreLocal loc39.pszAITEM, esi |
|
movzx ecx, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY, ecx |
|
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc39.dbl_POW] |
|
.L23: |
cmp [esp + loc39.nKEY], CMD_TOKEN_ALPHA |
jne .check_devices |
|
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 165 |
call TCmdBuf_Crop |
jc .L90 |
|
.check_devices: |
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
jc .L80 |
|
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
jc .L81 |
; |
; Is KEY = EOL, 'AUTO' or phaser power |
; |
cmp [esp + loc39.nKEY], CMD_TOKEN_ALPHA |
jne .L2301 |
|
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 166 |
call TCmdBuf_Crop |
jc .L27 |
jmp .L24 |
|
.L2301: |
; |
; Differentiate between EOL and phaser power (command mode) |
; |
cmp [esp + loc39.nKEY], CMD_TOKEN_EOL |
jne .L30 |
|
.L24: |
; |
; Request MANUAL/AUTO fire |
; |
mcLoad8bitsToReg32 ecx, 174 |
call TGame_Prompt |
call TConsole_SetGameMsgAttr |
|
call TCmdBuf_Scan |
|
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
add eax, 0 |
js .L15 |
|
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
jne .L24 |
|
mcLoad8bitsToReg32 ecx, 165 |
call TCmdBuf_Crop |
jc .L90 |
|
mcLoad8bitsToReg32 ecx, 166 |
call TCmdBuf_Crop |
jnc .L24 |
|
.L2409: |
; |
; Inform user of available energy and read in |
; desired phaser power |
; |
cmp [esp + loc39.nEnemies], 0 |
je .L26 |
|
mov ecx, 279 |
call TConsole_Cram |
|
.L25: |
mcLoadLocal esi, loc39.pTrekData |
mov cl, 2 |
fld [esi + TREKDATA.ENERGY] |
call TConsole_CramFloat |
call TConsole_ScrollUp |
|
cmp [esp + loc39.bIPOOP], 0 |
je .L26 |
|
mov al, '(' |
call TConsole_PutChar |
|
mcZeroBits eax |
mcStoreLocal loc39.nIREC, eax |
|
inc eax |
mcStoreLocal loc39.nK, eax |
|
.sum_all_power: |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_1dot01] |
faddp |
fstp [esp + loc39.dbl_PART2] |
|
mov esi, glb_dbl_0dot9 |
mcLoadLocal ebx, loc39.pTrekData |
mcLoadLocal ecx, loc39.nK |
dec ecx |
imul ecx, 10 |
lea edi, [ebx + ecx + TREKDATA.KDIST] |
call TCommon_X_exp_Y |
fld st |
faddp |
fstp [esp + loc39.dbl_PART1] |
|
fld [ebx + ecx + TREKDATA.KPOWER] |
fabs |
|
fld [esp + loc39.dbl_PART1] |
fdivp |
|
fld [esp + loc39.dbl_PART2] |
fmulp |
|
call TCommon_FP_Truncate |
inc eax |
add [esp + loc39.nIREC], eax |
|
inc [esp + loc39.nK] |
mcLoadLocal ecx, loc39.nK |
cmp ecx, [esp + loc39.nEnemies] |
jbe .sum_all_power |
|
mcLoadLocal eax, loc39.nIREC |
call TConsole_CramInt |
mov ecx, 280 |
call TConsole_Prout |
|
.L26: |
mov ecx, 281 |
call TGame_Prompt |
|
.L27: |
call TCmdBuf_Scan |
|
movzx eax, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY, eax |
|
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc39.dbl_POW] |
|
.L28: |
mcLoadLocal eax, loc39.nKEY |
mcStoreLocal loc39.nKEY1, eax |
|
cmp eax, CMD_TOKEN_EOL |
je .L2409 |
|
.L30: |
call TCmdBuf_Scan |
mcStoreLocal loc39.pszAITEM, esi |
|
movzx eax, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY2, eax |
|
mcLoadLocal eax, loc39.nKEY1 |
mcStoreLocal loc39.nKEY, eax |
|
cmp [esp + loc39.nKEY2], CMD_TOKEN_EOL |
je .L35 |
|
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L34 |
|
inc [esp + loc39.bNO] |
jmp .L35 |
|
.L34: |
call TMove_BegPardon |
jmp .L15 |
|
.L35: |
cmp [esp + loc39.nKEY], CMD_TOKEN_REAL |
jne .L26 |
|
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .L41 |
|
mov ecx, 282 |
call TConsole_Cram |
jmp .L25 |
|
.L41: |
fld [esp + loc39.dbl_POW] |
fld [glb_dbl_5] |
mc_CMP_ST0_ST1 |
jc .L46 |
jz .L46 |
|
fldz |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .L15 |
jz .L15 |
|
mov ecx, 283 |
call TConsole_Prout |
jmp .L15 |
|
.L42: |
; |
; Print message for shield control |
; and decide if malfunction occurs |
; |
call TConsole_ScrollUp |
|
fld [glb_dbl_0dot995] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L45 |
; |
; Malfunction! |
; |
call TMove_RedAlert |
call TConsole_SetCrewMsgAttr |
mov ecx, 284 |
call TConsole_Prout |
|
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 285 |
call TConsole_Prout |
jmp .done |
|
.L45: |
call TConsole_SetGameMsgAttr |
mov ecx, 229 |
call TConsole_Prout |
jmp [esp + loc39.pIWHERE] |
|
.L46: |
; |
; Allocate energy among klingons according to |
; nearest first strategy and compute hits |
; |
cmp [esp + loc39.bIFAST], 0 |
je .L47 |
|
mov eax, .L47 |
mcStoreLocal loc39.pIWHERE, eax |
jmp .L42 |
|
.L47: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
fsubp |
fld st |
fstp [esi + TREKDATA.ENERGY] |
fstp [esp + loc39.dbl_EXTRA] |
|
cmp [esp + loc39.nEnemies], 0 |
je .L75 |
; |
; Loop that distribute hits in automatic mode |
; |
fldz |
fstp [esp + loc39.dbl_EXTRA] |
|
fld [esp + loc39.dbl_POW] |
fstp [esp + loc39.dbl_POWREM] |
|
mcLoad1 eax |
mcStoreLocal loc39.nI, eax |
|
.compute_hit: |
fldz |
fstp [esp + loc39.dbl_HITS_I_] |
|
fldz |
fld [esp + loc39.dbl_POWREM] |
mc_CMP_ST0_ST1 |
jc .L50 |
jz .L50 |
|
mcLoadLocal ebx, loc39.pTrekData |
mcLoadLocal ecx, loc39.nI |
dec ecx |
imul ecx, 10 |
lea edi, [ebx + ecx + TREKDATA.KDIST] |
mov esi, glb_dbl_0dot9 |
call TCommon_X_exp_Y |
fld st |
faddp |
|
fld [ebx + ecx + TREKDATA.KPOWER] |
fabs |
fdivrp |
fld st |
fstp [esp + loc39.dbl_HITS_I_] |
fstp [esp + ecx + loc39.arr_HITS] |
|
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_0dot01] |
faddp |
fld [esp + loc39.dbl_HITS_I_] |
fmulp |
fstp [esp + loc39.dbl_OVER] |
|
fld [esp + loc39.dbl_POWREM] |
fstp [esp + loc39.dbl_TEMP] |
|
fld [esp + loc39.dbl_POWREM] |
fld [esp + loc39.dbl_HITS_I_] |
fsubp |
fld [esp + loc39.dbl_OVER] |
fsubp |
fld st |
fstp [esp + loc39.dbl_POWREM] |
|
fldz |
mc_CMP_ST0_ST1 |
jc .extra_plus_over |
|
fld [esp + loc39.dbl_TEMP] |
fld [esp + loc39.dbl_HITS_I_] |
call TCommon_FPU_Min |
fstp [esp + loc39.dbl_HITS_I_] |
|
fldz |
fstp [esp + loc39.dbl_OVER] |
|
mcLoadLocal ecx, loc39.nI |
dec ecx |
imul ecx, 10 |
fld [esp + loc39.dbl_HITS_I_] |
fstp [esp + ecx + loc39.arr_HITS] |
|
.extra_plus_over: |
fld [esp + loc39.dbl_EXTRA] |
fld [esp + loc39.dbl_OVER] |
faddp |
fstp [esp + loc39.dbl_EXTRA] |
|
.L50: |
inc [esp + loc39.nI] |
mov ecx, [esp + loc39.nI] |
cmp ecx, [esp + loc39.nEnemies] |
jbe .compute_hit |
|
fldz |
fld [esp + loc39.dbl_POWREM] |
mc_CMP_ST0_ST1 |
jc .hit_them |
jz .hit_them |
|
fld [esp + loc39.dbl_EXTRA] |
fld [esp + loc39.dbl_POWREM] |
faddp |
fstp [esp + loc39.dbl_EXTRA] |
|
.hit_them: |
mcLoadLocalRef esi, loc39.arr_HITS |
call TPhasers_HitThem |
|
fldz |
fld [esp + loc39.dbl_EXTRA] |
mc_CMP_ST0_ST1 |
jz .L200 |
|
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .L200 |
|
.L75: |
; |
; Inform of overkill |
; |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.ITHERE], 0 |
je .L78 |
|
call TConsole_SetGameMsgAttr |
mov ecx, 286 |
call TConsole_Cram |
|
cmp [esp + loc39.nEnemies], 0 |
je .L7501 |
|
mov ecx, 287 |
call TConsole_Cram |
|
.L7501: |
mov ecx, 288 |
call TConsole_Prout |
jmp .L200 |
|
.L78: |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
fld [esp + loc39.dbl_EXTRA] |
call TConsole_CramFloat |
mov ecx, 289 |
call TConsole_Prout |
jmp .L200 |
|
.L80: |
; |
; Manual section begins here. |
; Inform of imposed manual condition. |
; |
call TConsole_SetGameMsgAttr |
mov ecx, 299 |
call TConsole_Prout |
jmp .L84 |
|
.L81: |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mov ecx, 290 |
call TConsole_Prout |
mov ecx, 291 |
call TConsole_Prout |
mov ecx, 292 |
call TConsole_Prout |
mov ecx, 293 |
call TConsole_Prout |
call TConsole_ScrollUp |
|
.L84: |
call TConsole_SetGameMsgAttr |
mov ecx, 282 |
call TConsole_Cram |
|
mov cl, 2 |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_0dot006] |
fsubp |
call TConsole_CramFloat |
call TConsole_ScrollUp |
|
.L870: |
; |
; Loop for desired individual hits |
; |
mcLoad1 eax |
mcStoreLocal loc39.nK, eax |
|
.L87: |
mov cl, ATTR_PROMPT_TEXT |
call TConsole_SetAttr |
|
cmp [esp + loc39.bIPOOP], 0 |
je .L88 |
; |
; Print battle computer recommendation |
; |
mov al, '(' |
call TConsole_PutChar |
|
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_1dot01] |
faddp |
fstp [esp + loc39.dbl_PART2] |
|
mov esi, glb_dbl_0dot9 |
mcLoadLocal ebx, loc39.pTrekData |
mcLoadLocal ecx, loc39.nK |
dec ecx |
imul ecx, 10 |
lea edi, [ebx + ecx + TREKDATA.KDIST] |
call TCommon_X_exp_Y |
fld st |
faddp |
fstp [esp + loc39.dbl_PART1] |
|
fld [ebx + ecx + TREKDATA.KPOWER] |
fabs |
|
fld [esp + loc39.dbl_PART1] |
fdivp |
|
fld [esp + loc39.dbl_PART2] |
fmulp |
|
call TCommon_FP_Truncate |
inc eax |
call TConsole_CramInt |
|
mov ecx, 300 |
call TConsole_Cram |
|
.L88: |
mov ecx, 294 |
call TConsole_Cram |
|
mcLoadLocal ecx, loc39.nK |
mcLoadLocal ebx, loc39.pTrekData |
dec ecx |
lea esi, [ebx + TREKDATA.KX] |
lea edi, [ebx + TREKDATA.KY] |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
call TConsole_CramEnemyAtEx |
|
cmp [esp + loc39.bIDOIT], 1 |
je .L89 |
; |
; Phasers can't actually be fired - loop back for |
; next computer readout or terminate if that's all. |
; |
call TConsole_ScrollUp |
|
inc [esp + loc39.nK] |
mov ecx, [esp + loc39.nK] |
cmp ecx, [esp + loc39.nEnemies] |
jbe .L87 |
jmp .L15 |
|
.L89: |
mov ecx, 301 |
call TGame_Prompt |
|
.L90: |
cmp [esp + loc39.nK], 1 |
jne .scan_hit |
|
fldz |
fstp [esp + loc39.dbl_POW] |
|
.scan_hit: |
call TCmdBuf_Scan |
|
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
mcLoadLocal ecx, loc39.nK |
dec ecx |
imul ecx, 10 |
fld st |
fstp [esp + ecx + loc39.arr_HITS] |
fstp [esp + loc39.dbl_HITS_I_] |
|
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
je .L95 |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L91 |
|
cmp [esp + loc39.nK], 1 |
je .L84 |
jmp .L87 |
|
.L91: |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L84 |
|
inc [esp + loc39.bNO] |
jmp .L90 |
|
.L95: |
fldz |
fld [esp + loc39.dbl_HITS_I_] |
mc_CMP_ST0_ST1 |
jc .L15 |
|
fld [esp + loc39.dbl_POW] |
fld [esp + loc39.dbl_HITS_I_] |
faddp |
fstp [esp + loc39.dbl_POW] |
; |
; If total amount is too much, then |
; inform and start over. |
; |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .L97 |
|
call TConsole_SetGameMsgAttr |
mov ecx, 295 |
call TConsole_Prout |
jmp .L84 |
|
.L97: |
inc [esp + loc39.nK] |
mov ecx, [esp + loc39.nK] |
cmp ecx, [esp + loc39.nEnemies] |
jbe .L90 |
; |
; If total requested is 0.0 - abort phasers. |
; |
fldz |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jz .L15 |
|
call TCmdBuf_Scan |
|
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
jne .L9701 |
|
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
adc [esp + loc39.bNO], 0 |
|
.L9701: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
fsubp |
fstp [esi + TREKDATA.ENERGY] |
|
cmp [esp + loc39.bIFAST], 0 |
je .L98 |
|
mov eax, .L98 |
mcStoreLocal loc39.pIWHERE, eax |
jmp .L42 |
|
.L98: |
mcLoadLocalRef esi, loc39.arr_HITS |
call TPhasers_HitThem |
|
mcLoadLocal edi, loc39.pTrekData |
inc [edi + TREKDATA.IDIDIT] |
|
.L200: |
; |
; Raising shields after phaser fire. |
; |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
|
cmp [esp + loc39.bIFAST], 0 |
je .L210 |
|
call TConsole_ScrollUp |
cmp [esp + loc39.bNO], 0 |
jne .L202 |
|
fld [glb_dbl_0dot99] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L205 |
|
call TConsole_SetCrewMsgAttr |
mov ecx, 296 |
call TConsole_Prout |
mov ecx, 297 |
call TConsole_Prout |
|
.L202: |
mcLoadLocal edi, loc39.pTrekData |
mov [edi + TREKDATA.SHLDUP], 0 |
jmp .L210 |
|
.L205: |
call TConsole_SetGameMsgAttr |
mov ecx, 228 |
call TConsole_Prout |
|
.L210: |
; |
; Check for phaser overheat |
; |
fld [glb_dbl_1500] |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .done |
jz .done |
|
fld [esp + loc39.dbl_POW] |
fld [glb_dbl_1500] |
fsubp |
fld [glb_dbl_0dot00038] |
fmulp |
fstp [esp + loc39.dbl_TEMP] |
|
call TRandom_Ranf |
fld [esp + loc39.dbl_TEMP] |
mc_CMP_ST0_ST1 |
jc .done |
|
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 298 |
call TConsole_Prout |
|
call TRandom_Ranf |
fld1 |
faddp |
fld [esp + loc39.dbl_TEMP] |
fld1 |
faddp |
fmulp |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.DAMFAC] |
fmulp |
mov cl, DEV_PHASERS |
call TArray_SetDblDamage |
|
.done: |
mcEndLocals loc39.size |
ret |
|
; --- EOF --- |