Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1811 → Rev 1812

/programs/games/StarTrek/trunk/TGame.Asm
0,0 → 1,2420
; --------------------------------------------------------------------------
; FILE: TGame.Asm
; DATE: September 28, 2008
; --------------------------------------------------------------------------
 
; --------------------------------------------------------------------------
; WAIT
; --------------------------------------------------------------------------
virtual at 0
loc48:
.pTrekData PVOID ?
.dbl_TEMP DOUBLE ?
.dbl_ANUM DOUBLE ?
.dbl_AITEM2 DOUBLE ?
.dbl_ DOUBLE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Wait:
mcBeginLocals loc48.size
 
mcLoadGameDataPtr esi
mcStoreLocal loc48.pTrekData, esi
 
mov [esi + TREKDATA.IDIDIT], 0
 
.L10:
call TCmdBuf_Scan
 
fld [ebx + TCmdBuf.cmdbuf_FNUM]
fstp [esp + loc48.dbl_ANUM]
 
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
jne .L20
 
mov ecx, 560
call TGame_Prompt
jmp .L10
 
.L20:
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .L60
 
fldz
fld [esp + loc48.dbl_ANUM]
mc_CMP_ST0_ST1
jc .done
jz .done
 
mcLoadLocal esi, loc48.pTrekData
fld [esi + TREKDATA.REMTIME]
fld [esp + loc48.dbl_ANUM]
mc_CMP_ST0_ST1
jnc .verify
 
cmp [esi + TREKDATA.NENHERE], 0
je .L30
 
.verify:
mcLoad8bitsToReg32 ecx, 158
call TGame_JA
jnc .done
 
.L30:
mcLoadLocal esi, loc48.pTrekData
inc [esi + TREKDATA.RESTING]
 
fld [esp + loc48.dbl_ANUM]
fstp [esp + loc48.dbl_AITEM2]
 
.L40:
fldz
fld [esp + loc48.dbl_ANUM]
mc_CMP_ST0_ST1
jc .stop_rest
jz .stop_rest
 
.still_resting:
mcLoadLocal esi, loc48.pTrekData
cmp [esi + TREKDATA.RESTING], 0
je .L50
 
fld [esp + loc48.dbl_ANUM]
fstp [esp + loc48.dbl_TEMP]
 
cmp [esi + TREKDATA.NENHERE], 0
je .set_time
 
call TRandom_Ranf
fld1
faddp
fld [esp + loc48.dbl_ANUM]
call TCommon_FPU_Min
fstp [esp + loc48.dbl_TEMP]
 
.set_time:
fld [esp + loc48.dbl_TEMP]
mcLoadLocal edi, loc48.pTrekData
fstp [edi + TREKDATA.TIME]
 
fld [esp + loc48.dbl_ANUM]
fld [edi + TREKDATA.TIME]
mc_CMP_ST0_ST1
jnc .check_tholian
 
call TAttack_Main
 
.check_tholian:
mcLoadLocal esi, loc48.pTrekData
cmp [esi + TREKDATA.NENHERE], 0
jne .call_events
 
call TEvents_MoveTholian
 
.call_events:
mcLoadLocal esi, loc48.pTrekData
cmp [esi + TREKDATA.ALLDONE], 0
jne .done
 
call TEvents_Main
 
mcLoadLocal edi, loc48.pTrekData
mov [edi + TREKDATA.IDIDIT], 1
 
cmp [edi + TREKDATA.ALLDONE], 0
jne .done
 
fld [esp + loc48.dbl_ANUM]
fld [esp + loc48.dbl_TEMP]
fsubp
fstp [esp + loc48.dbl_ANUM]
 
call TArray_MyGalaxyPtr
cmp dword [ebx], 1000
jne .L40
 
mcLoadLocal esi, loc48.pTrekData
mov [esi + TREKDATA.RESTING], 0
 
fldz
fstp [esi + TREKDATA.TIME]
jmp .L55
 
.stop_rest:
mcLoadLocal esi, loc48.pTrekData
mov [esi + TREKDATA.RESTING], 0
 
.L50:
call TConsole_SetGameMsgAttr
mcLoadLocal esi, loc48.pTrekData
fld [esi + TREKDATA.REMTIME]
mov cl, 2
call TConsole_CramFloat
mov ecx, 561
call TConsole_Prout
 
.L55:
mcLoadLocal esi, loc48.pTrekData
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED
jne .done
;
; Repair Death Ray!
;
fld [glb_dbl_9dot99]
fld [esp + loc48.dbl_AITEM2]
fld [esp + loc48.dbl_ANUM]
fsubp
mc_CMP_ST0_ST1
jc .done
 
fldz
mov cl, DEV_DEATHRAY
call TArray_SetDblDamage
jmp .done
 
.L60:
call TMove_BegPardon
 
.done:
mcEndLocals loc48.size
ret
 
; --------------------------------------------------------------------------
; GAME
; --------------------------------------------------------------------------
virtual at 0
loc42:
.pTrekData PVOID ?
.nKILLTOT COUNT ?
.nDESTBAS COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Report:
mcBeginLocals loc42.size
 
mcLoadGameDataPtr eax
mcStoreLocal loc42.pTrekData, eax
 
call TConsole_ScrollUp
call TConsole_SetGameMsgAttr
 
mov ecx, 309
call TConsole_Cram
 
mcLoadLocal esi, loc42.pTrekData
mov al, [esi + TREKDATA.LENGTH]
mcOnRegEqu al, 1, .short_game
mcOnRegEqu al, 2, .medium_game
mcOnRegEqu al, 4, .long_game
 
.assertion_failed:
;int 3
jmp .done
 
.short_game:
push 74
jmp .print_length
 
.medium_game:
push 75
jmp .print_length
 
.long_game:
push 76
 
.print_length:
pop ecx
call TConsole_Cram
 
mov al, CHAR_BLANK
call TConsole_PutChar
 
mcLoadLocal esi, loc42.pTrekData
movzx eax, [esi + TREKDATA.SKILL]
cmp al, 1
jb .assertion_failed
cmp al, 5
ja .assertion_failed
 
lea ecx, [eax + 12]
call TConsole_Cram
 
mov ecx, 310
call TConsole_Prout
 
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.IDIDIT], 0
je .L110
 
mov ecx, 311
call TConsole_Cram
 
mcLoadLocal esi, loc42.pTrekData
add esi, TREKDATA.PASSWD
mcZeroBits eax
 
.get_char:
lodsb
mcOnRegZero eax, .end_of_password
 
call TConsole_PutChar
jmp .get_char
 
.end_of_password:
mov ecx, 312
call TConsole_Prout
 
.L110:
mcLoadLocal esi, loc42.pTrekData
mov al, [esi + TREKDATA.KILLK]
add al, [esi + TREKDATA.KILLC]
add al, [esi + TREKDATA.NSCKILL]
 
movzx eax, al
mcStoreLocal loc42.nKILLTOT, eax
call TConsole_CramInt
 
mov ecx, 313
call TConsole_Cram
 
mcLoad8bitsToReg32 ecx, 204
mcLoadLocal esi, loc42.pTrekData
movzx eax, [esi + TREKDATA.INKLING]
call TConsole_CramSinglePlural
 
mov ecx, 314
mcZeroBits eax
cmp [esp + loc42.nKILLTOT], 1
sete al
add ecx, eax
call TConsole_Cram
 
mcLoad8bitsToReg32 ecx, 205
mcLoadLocal esi, loc42.pTrekData
movzx eax, [esi + TREKDATA.KILLC]
call TConsole_CramSinglePlural
 
mov al, '.'
call TConsole_PutChar
call TConsole_ScrollUp
 
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.SKILL], 2
jbe .L200
 
mov ecx, 316
call TConsole_Cram
 
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.NSCREM], 1
jne .scom_news
 
mov ecx, 317
call TConsole_Cram
 
.scom_news:
mov ecx, 318
call TConsole_Prout
 
.L200:
mcLoadLocal esi, loc42.pTrekData
mov al, [esi + TREKDATA.INBASE]
sub al, [esi + TREKDATA.REMBASE]
movzx eax, al
mcStoreLocal loc42.nDESTBAS, eax
mcOnRegZero eax, .L210
 
mov ecx, 319
call TConsole_CramSinglePlural
mov ecx, 320
call TConsole_Cram
 
.L210:
mcLoadLocal esi, loc42.pTrekData
mov ecx, 319
movzx eax, [esi + TREKDATA.REMBASE]
call TConsole_CramSinglePlural
 
cmp [esp + loc42.nDESTBAS], 0
je .end_of_bases
 
mov ecx, 321
call TConsole_Cram
 
.end_of_bases:
mov al, '.'
call TConsole_PutChar
call TConsole_ScrollUp
 
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.ICSOS], 0
je .L240
 
fld [esi + TREKDATA.FUTURE5]
fld [glb_dbl_1E38]
mc_CMP_ST0_ST1
jc .L240
jz .L240
 
cmp [esi + TREKDATA.REMCOM], 0
je .L240
cmp [esi + TREKDATA.REMBASE], 0
je .L240
cmp [esi + TREKDATA.BATX], 0
je .L240
cmp [esi + TREKDATA.BATY], 0
je .L240
 
mov al, [esi + TREKDATA.BATX]
mov dl, [esi + TREKDATA.BATY]
call TArray_GetGalaxyValue
mcLoad8bitsToReg32 eax, 100
xchg eax, ecx
mcZeroBits edx
div ecx
cmp edx, 10
jb .L240
 
mov al, [esi + TREKDATA.BATX]
mov dl, [esi + TREKDATA.BATY]
movzx ecx, [esi + TREKDATA.REMCOM]
lea edi, [esi + TREKDATA.CY]
add esi, TREKDATA.CX
 
.find_commander:
cmp al, [esi]
jne .next_commander
cmp dl, [edi]
je .L221
 
.next_commander:
inc esi
inc edi
loop .find_commander
jmp .L240
 
.L221:
mov ecx, 322
call TConsole_Cram
 
mcLoadLocal esi, loc42.pTrekData
mov al, [esi + TREKDATA.BATX]
mov dl, [esi + TREKDATA.BATY]
mov cl, 1
call TConsole_CramLoc
 
mov ecx, 323
call TConsole_Prout
 
mov ecx, 324
call TConsole_Cram
 
mov cl, 1
mcLoadLocal esi, loc42.pTrekData
fld [esi + TREKDATA.FUTURE5]
call TConsole_CramFloat
 
mov al, '.'
call TConsole_PutChar
call TConsole_ScrollUp
 
.L240:
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.ISSOS], 0
je .L245
cmp [esi + TREKDATA.ISATB], 1
jne .L245
 
mov ecx, 322
call TConsole_Cram
 
mcLoadLocal esi, loc42.pTrekData
mov al, [esi + TREKDATA.ISX]
mov dl, [esi + TREKDATA.ISY]
mov cl, 1
call TConsole_CramLoc
 
mov ecx, 325
call TConsole_Prout
 
mov ecx, 324
call TConsole_Cram
 
mov cl, 1
mcLoadLocal esi, loc42.pTrekData
fld [esi + TREKDATA.FUTURE7]
call TConsole_CramFloat
 
mov al, '.'
call TConsole_PutChar
call TConsole_ScrollUp
 
.L245:
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.ISUBDAM], 0
je .L249
 
mov ecx, 328
call TConsole_Cram
 
mov cl, DEV_SUBSPACE_RADIO
call TArray_GetDblDamage
fldz
mcZeroBits eax
mc_CMP_ST0_ST1
setz al
lea ecx, [eax + 326]
call TConsole_Cram
 
mov ecx, 329
call TConsole_Prout
mov ecx, 330
call TConsole_Prout
 
.L249:
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.CASUAL], 0
je .L250
 
movzx eax, [esi + TREKDATA.CASUAL]
call TConsole_CramInt
 
mov ecx, 331
call TConsole_Prout
 
.L250:
mcLoadLocal esi, loc42.pTrekData
cmp [esi + TREKDATA.NHELP], 0
je .L260
 
movzx eax, [esi + TREKDATA.NHELP]
mov ecx, 332
call TConsole_CramSinglePlural
 
mov ecx, 333
call TConsole_Cram
call TConsole_ScrollUp
 
.L260:
call TConsole_ScrollUp
 
.done:
mcEndLocals loc42.size
ret
 
; --------------------------------------------------------------------------
; Input:
; EAX = value in range [1..8]
; Output:
; CF=TRUE if value is in range
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_IsValidQuadrant:
cmp eax, 1
jb .failed
cmp eax, 8
ja .failed
 
stc
ret
 
.failed:
clc
ret
 
; --------------------------------------------------------------------------
; GETFN
; --------------------------------------------------------------------------
; Input:
; ESI = PCHAR - buffer to store the name into
; --------------------------------------------------------------------------
virtual at 0
loc88:
.pszBuffer PCHAR ?
.nAskThreeTimes COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_GetFileName:
mcBeginLocals loc88.size
mcStoreLocal loc88.pszBuffer, esi
 
mcLoad8bitsToReg32 eax, 3
mcStoreLocal loc88.nAskThreeTimes, eax
 
.L40:
call TCmdBuf_Scan
mov al, [ebx + TCmdBuf.cmdbuf_KEY]
mcOnRegEqu al, CMD_TOKEN_EOL, .L75
mcOnRegNotEqu al, CMD_TOKEN_ALPHA, .L100
 
call TCmdBuf_AnsiStrLen
cmp ecx, 27
ja .too_long
 
mcLoadLocal edi, loc88.pszBuffer
call TString_AnsiCopy
 
dec edi
mov esi, str_TRK
call TString_AnsiCopy
jmp .done
 
.too_long:
mov ecx, 668
call TConsole_ProutGameMsg
jmp .ask
 
.L75:
dec [esp + loc88.nAskThreeTimes]
jz .L100
 
.ask:
mov ecx, 665
call TGame_Prompt
jmp .L40
 
.L100:
mcLoadLocal esi, loc88.pszBuffer
mov byte [esi], 0
 
.done:
mcEndLocals loc88.size
ret
 
; --------------------------------------------------------------------------
; SCORE
; --------------------------------------------------------------------------
virtual at 0
loc57:
.pTrekData PVOID ?
.dbl_TIMUSED DOUBLE ?
.dbl_PERDATE DOUBLE ?
.dbl_ITHPERD DOUBLE ?
.dbl_pad_1 DOUBLE ?
.nISCORE INT32 ?
.nIWON INT32 ?
.nIDIED INT32 ?
.nKLSHIP INT32 ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Score:
mcBeginLocals loc57.size
 
mcLoadGameDataPtr esi
mcStoreLocal loc57.pTrekData, esi
 
fld [esi + TREKDATA.DATE]
fld [esi + TREKDATA.INDATE]
fsubp
fstp [esp + loc57.dbl_TIMUSED]
 
fld [esp + loc57.dbl_TIMUSED]
fldz
mc_CMP_ST0_ST1
jz .recalc_time_used
 
cmp [esi + TREKDATA.REMKL], 0
je .calc_per_date
 
.recalc_time_used:
fld [esp + loc57.dbl_TIMUSED]
fld [glb_dbl_5]
call TCommon_FPU_Max
fstp [esp + loc57.dbl_TIMUSED]
 
.calc_per_date:
mov al, [esi + TREKDATA.KILLC]
add al, [esi + TREKDATA.KILLK]
add al, [esi + TREKDATA.NSCKILL]
call TCommon_LoadByteIntoFPU
fld [esp + loc57.dbl_TIMUSED]
fdivp
fld st
fstp [esp + loc57.dbl_PERDATE]
fstp [glb_dbl_KlingonsPerDate]
 
fld [esp + loc57.dbl_PERDATE]
fld [glb_dbl_500]
fmulp
fld [glb_dbl_0dot5]
faddp
fstp [esp + loc57.dbl_ITHPERD]
 
mcZeroBits eax
mcStoreLocal loc57.nIWON, eax
 
cmp [esi + TREKDATA.GAMEWON], 0
je .check_ship
 
movzx eax, [esi + TREKDATA.SKILL]
imul eax, 100
mcStoreLocal loc57.nIWON, eax
 
.check_ship:
mov al, [esi + TREKDATA.SHIP]
mcOnRegEqu al, CHAR_ENTERPRISE, .killed_zero_ships
mcOnRegEqu al, CHAR_FQUEENE, .killed_one_ship
mcOnRegZero al, .killed_two_ships
 
;int 3
jmp .done
 
.killed_zero_ships:
push 0
jmp .store_killed_ships
 
.killed_one_ship:
push 1
jmp .store_killed_ships
 
.killed_two_ships:
push 2
 
.store_killed_ships:
pop edx
mcStoreLocal loc57.nKLSHIP, edx
 
mcZeroBits eax
cmp [esi + TREKDATA.ALIVE], 0
jne .I_died
 
add eax, 200
 
.I_died:
mcStoreLocal loc57.nIDIED, eax
 
cmp [esi + TREKDATA.GAMEWON], 0
jne .calc_total_score
 
mov [esi + TREKDATA.NROMREM], 0
 
.calc_total_score:
movzx eax, [esi + TREKDATA.KILLK]
imul eax, 10
mcStoreLocal loc57.nISCORE, eax
 
movzx eax, [esi + TREKDATA.KILLC]
imul eax, 50
add [esp + loc57.nISCORE], eax
 
fld [esp + loc57.dbl_ITHPERD]
call TCommon_FP_Truncate
add [esp + loc57.nISCORE], eax
 
mcLoadLocal eax, loc57.nIWON
add [esp + loc57.nISCORE], eax
 
mcLoadLocal eax, loc57.nIDIED
sub [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.BASEKL]
imul eax, 100
sub [esp + loc57.nISCORE], eax
 
mcLoadLocal eax, loc57.nKLSHIP
imul eax, 100
sub [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.NHELP]
imul eax, 45
sub [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.STARKL]
imul eax, 5
sub [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.CASUAL]
sub [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.NROMKL]
imul eax, 20
add [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.NSCKILL]
imul eax, 200
add [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.NPLANKL]
imul eax, 10
sub [esp + loc57.nISCORE], eax
 
movzx eax, [esi + TREKDATA.NROMREM]
add [esp + loc57.nISCORE], eax
;
; Report all that...
;
mov cl, ATTR_REPORT_TEXT
call TConsole_SetAttr
call TConsole_ScrollUp
mov ecx, 632
call TConsole_Prout
call TConsole_ScrollUp
 
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.NROMKL], 0
je .L1
 
movzx eax, [esi + TREKDATA.NROMKL]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 633
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.NROMKL]
imul eax, 20
mov cl, 10
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L1:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.NROMREM], 0
je .L5
 
movzx eax, [esi + TREKDATA.NROMREM]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 634
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.NROMREM]
mov cl, 10
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L5:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.KILLK], 0
je .L10
 
movzx eax, [esi + TREKDATA.KILLK]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 635
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.KILLK]
imul eax, 10
mov cl, 10
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L10:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.KILLC], 0
je .L12
 
movzx eax, [esi + TREKDATA.KILLC]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 636
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.KILLC]
imul eax, 50
mov cl, 10
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L12:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.NSCKILL], 0
je .L15
 
movzx eax, [esi + TREKDATA.NSCKILL]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 637
call TConsole_Prout
 
.L15:
fld [esp + loc57.dbl_ITHPERD]
fldz
mc_CMP_ST0_ST1
jz .L20
 
fld [esp + loc57.dbl_PERDATE]
mov cl, 2
mov dl, 6
call TConsole_CramFloatWidth
 
mov ecx, 638
call TConsole_Cram
 
fld [esp + loc57.dbl_ITHPERD]
call TCommon_FP_Truncate
mov cl, 10
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L20:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.STARKL], 0
je .L30
 
movzx eax, [esi + TREKDATA.STARKL]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 639
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.STARKL]
imul eax, 5
mov cl, 10
neg eax
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L30:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.NPLANKL], 0
je .L32
 
movzx eax, [esi + TREKDATA.NPLANKL]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 640
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.NPLANKL]
imul eax, 10
mov cl, 10
neg eax
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L32:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.BASEKL], 0
je .L35
 
movzx eax, [esi + TREKDATA.BASEKL]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 641
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.BASEKL]
imul eax, 100
mov cl, 10
neg eax
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L35:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.NHELP], 0
je .L40
 
movzx eax, [esi + TREKDATA.NHELP]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 642
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.NHELP]
imul eax, 45
mov cl, 10
neg eax
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L40:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.CASUAL], 0
je .L45
 
movzx eax, [esi + TREKDATA.CASUAL]
mov cl, 6
call TConsole_CramIntWidth
 
mov ecx, 643
call TConsole_Cram
 
mcLoadLocal esi, loc57.pTrekData
movzx eax, [esi + TREKDATA.CASUAL]
mov cl, 10
neg eax
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L45:
cmp [esp + loc57.nKLSHIP], 0
je .L50
 
mov cl, 6
mcLoadLocal eax, loc57.nKLSHIP
call TConsole_CramIntWidth
 
mov ecx, 644
call TConsole_Cram
 
mcLoadLocal eax, loc57.nKLSHIP
imul eax, 100
mov cl, 10
neg eax
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L50:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.ALIVE], 0
jne .L60
 
mov ecx, 645
call TConsole_Prout
 
.L60:
mcLoadLocal esi, loc57.pTrekData
cmp [esi + TREKDATA.GAMEWON], 0
je .L70
 
mov ecx, 646
call TConsole_Cram
 
movzx ecx, [esi + TREKDATA.SKILL]
add ecx, 646
call TConsole_Cram
 
mcLoadLocal eax, loc57.nIWON
mov cl, 25
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.L70:
call TConsole_ScrollUp
 
mov ecx, 652
call TConsole_Cram
 
mcLoadLocal eax, loc57.nISCORE
mov [glb_Score], eax
mov cl, 10
call TConsole_CramIntWidth
call TConsole_ScrollUp
 
.done:
mcEndLocals loc57.size
ret
 
; --------------------------------------------------------------------------
; Input:
; ECX = index of the message table
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Prompt:
push ebx
 
push ecx
mov cl, ATTR_PROMPT_TEXT
call TConsole_SetAttr
pop ecx
 
call TConsole_Cram
call TConsole_RefreshCaretLine
lock dec [glb_GameThreadBusy]
 
.check_if_cmd_complete:
mcZeroBits eax
lock add [glb_GameThreadBusy], eax
jnz .done
 
invoke Sleep, eax
jmp .check_if_cmd_complete
 
.done:
pop ebx
ret
 
; --------------------------------------------------------------------------
; JA
; --------------------------------------------------------------------------
; Input:
; ECX = prompt text index
; Output:
; CF=1 if user answered "YES"
; --------------------------------------------------------------------------
virtual at 0
loc27:
.nMsgIndex INDEX ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_JA:
mcBeginLocals loc27.size
mcStoreLocal loc27.nMsgIndex, ecx
 
.ask:
mcLoadLocal ecx, loc27.nMsgIndex
call TGame_Prompt
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .ask
 
mcLoad8bitsToReg32 ecx, 159
call TCmdBuf_Crop
jc .return_yes
 
mcLoad8bitsToReg32 ecx, 122
call TCmdBuf_Crop
jc .return_no
 
call TConsole_SetGameMsgAttr
call TConsole_ScrollUp
mcLoad8bitsToReg32 ecx, 160
call TConsole_Prout
call TConsole_ScrollUp
jmp .ask
 
.return_yes:
mcEndLocals loc27.size
stc
ret
 
.return_no:
mcEndLocals loc27.size
clc
ret
 
; --------------------------------------------------------------------------
; FREEZE
; --------------------------------------------------------------------------
; glb_bEmExit = 0 means normal freezing
; glb_bEmExit = 1 means freezing into EMSAVE.TRK
; --------------------------------------------------------------------------
virtual at 0
loc89:
.strFileName CHARS 32
.hFile HANDLE ?
.dwSize COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Freeze:
mcBeginLocals loc89.size
 
mcLoadGameDataPtr edi
mov [edi + TREKDATA.IDIDIT], 0
 
cmp [glb_bEmExit], 1
je .emergency_exit
 
.ask_fname:
mcLoadLocalRef esi, loc89.strFileName
call TGame_GetFileName
 
cmp byte [esp], 0
je .L920
 
invoke GetFileAttributes, esp
mcOnRegEqu eax, -1, .save
 
mov cl, ATTR_PROMPT_TEXT
call TConsole_SetAttr
 
mov ecx, 669
call TConsole_Cram
 
mov esi, esp
call TConsole_CramAnsi
 
mov ecx, 670
call TGame_JA
jnc .ask_fname
jmp .save
 
.emergency_exit:
mov esi, str_EmSaveGame
mov edi, esp
call TString_AnsiCopy
 
.save:
mcZeroBits eax
mcStoreLocal loc89.dwSize, eax
 
mov esi, esp
invoke CreateFileAnsi, esi, GENERIC_WRITE, 0, 0,\
CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0
 
mcStoreLocal loc89.hFile, eax
mcOnRegEqu eax, -1, .L920
 
mov esi, [glb_pCommon]
mov ecx, TCommon.size
mcLoadLocal ebx, loc89.hFile
mcLoadLocalRef edi, loc89.dwSize
invoke WriteFile, ebx, esi, ecx, edi, 0
 
invoke CloseHandle, ebx
 
mov ecx, TCommon.size
cmp [edi], ecx
jne .L920
 
.file_stored:
mcLoadGameDataPtr edi
inc [edi + TREKDATA.IDIDIT]
 
mov ecx, 666
call TConsole_ProutGameMsg
jmp .done
 
.L920:
mov ecx, 667
call TConsole_ProutGameMsg
 
.done:
mcEndLocals loc89.size
ret
 
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Prelim:
mcLoad8bitsToReg32 ecx, 92
call TConsole_ProutGameMsg
dec ecx
call TConsole_Prout
 
mcLoad1 ecx
call TConsole_Prout
 
mcLoad8bitsToReg32 ecx, 91
call TConsole_Prout
inc ecx
call TConsole_Prout
dec ecx
call TConsole_Prout
 
mov ecx, 654
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
 
mcLoad8bitsToReg32 ecx, 91
call TConsole_Prout
 
mov ecx, 657
call TConsole_Prout
inc ecx
call TConsole_Prout
 
mcLoad8bitsToReg32 ecx, 91
call TConsole_Prout
 
mov ecx, 659
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
inc ecx
call TConsole_Prout
 
mcLoad8bitsToReg32 ecx, 91
call TConsole_Prout
call TConsole_Prout
 
mov ecx, 663
call TConsole_Prout
mcLoad8bitsToReg32 ecx, 92
call TConsole_Prout
 
mov cl, 5
call TConsole_Skip
ret
 
; --------------------------------------------------------------------------
; ESI = points to file name
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_CutTheExtension:
mov edi, esi
mov al, '.'
mcLoadNeg1 ecx
repne scasb
dec edi
mov byte [edi], 0
ret
 
; --------------------------------------------------------------------------
virtual at 0
loc101:
.fileInfo rb WIN32_FIND_DATA.size
.hFind HANDLE ?
.nFilesPerLine COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_ListFrozenGames:
mcBeginLocals loc101.size
 
invoke FindFirstFile, str_FileMask, esp
mcStoreLocal loc101.hFind, eax
mcOnRegEqu eax, -1, .done
 
mov cl, ATTR_SCAN_SCALE
call TConsole_SetAttr
call TConsole_ScrollUp
mov ecx, 709
call TConsole_Prout
call TConsole_ScrollUp
mov [esp + loc101.nFilesPerLine], 4
 
.list_that_file:
mov eax, [esp + WIN32_FIND_DATA.dwAttr]
test eax, FILE_ATTR_DIR
jnz .next
 
mov cl, 2
call TConsole_RepeatBlank
 
lea esi, [esp + WIN32_FIND_DATA.strName]
call TGame_CutTheExtension
call TConsole_CramWide
 
dec [esp + loc101.nFilesPerLine]
jnz .next
 
mov [esp + loc101.nFilesPerLine], 4
call TConsole_ScrollUp
 
.next:
mcLoadLocal edx, loc101.hFind
invoke FindNextFile, edx, esp
mcOnRegNotZero eax, .list_that_file
 
call TConsole_ScrollUp
 
cmp [esp + loc101.nFilesPerLine], 4
je .done
 
call TConsole_ScrollUp
 
.done:
mcEndLocals loc101.size
ret
 
; --------------------------------------------------------------------------
; THAW
; --------------------------------------------------------------------------
virtual at 0
loc87:
.fileName CHARS 32
.hFile HANDLE ?
.dwSize COUNT ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Thaw:
mcBeginLocals loc87.size
 
mcLoadGameDataPtr edi
mov [edi + TREKDATA.IDIDIT], 0
 
.ask_fname:
mov esi, esp
call TGame_GetFileName
 
cmp byte [esp], 0
je .L800
 
invoke GetFileAttributes, esp
mcOnRegEqu eax, -1, .no_such_file
 
mov esi, esp
invoke CreateFileAnsi, esi, GENERIC_READ, 0, 0,\
OPEN_EXISTING, FILE_FLAG_SEQ_SCAN, 0
 
mcStoreLocal loc87.hFile, eax
mcOnRegEqu eax, -1, .L800
 
mov esi, [glb_pCommon]
mov ecx, TCommon.size
mcLoadLocal ebx, loc87.hFile
mcLoadLocalRef edi, loc87.dwSize
mov dword [edi], 0
invoke ReadFile, ebx, esi, ecx, edi, 0
 
invoke CloseHandle, ebx
 
mov ecx, TCommon.size
cmp [edi], ecx
jne .L800
 
mov ecx, 671
call TConsole_ProutGameMsg
jmp .done
 
.no_such_file:
mov esi, esp
mov edi, str_CmdListGames
call TString_AnsiEqual
jc .list_all_files
 
mov ecx, 673
call TConsole_ProutGameMsg
jmp .ask_fname
 
.list_all_files:
call TGame_ListFrozenGames
jmp .ask_fname
 
.L800:
;
; Game was not loaded
;
mcLoadGameDataPtr edi
add edi, TREKDATA.PASSWD
mov byte [edi], 0
 
mov ecx, 672
call TConsole_ProutGameMsg
 
.done:
mcEndLocals loc87.size
ret
 
; --------------------------------------------------------------------------
; Input:
; ESI = token for hashing and initializing the RNG
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_InitTournament:
mcZeroBits eax
mcZeroBits edx
 
.next_char:
mov dl, [esi]
inc esi
mcOnRegZero edx, .seed_RNG_with_EAX
 
shl eax, 5
xor al, dl
jmp .next_char
 
.seed_RNG_with_EAX:
call TRandom_Seed
 
mcLoadGameDataPtr ebx
mcLoadNeg1 eax
mcStoreMember TREKDATA.THINGX, al
mcStoreMember TREKDATA.THINGY, al
ret
 
; --------------------------------------------------------------------------
; Output:
; ECX = TRUE if FROZEN game is selected
; --------------------------------------------------------------------------
virtual at 0
loc10:
.bFrozen BOOL ?
.pszToken PCHAR ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Choose:
mcBeginLocals loc10.size
 
mcZeroBits eax
mcLoadGameDataPtr edi
mov ecx, TREKDATA.size
rep stosb
 
.L5:
mcZeroBits eax
mcStoreLocal loc10.bFrozen, eax
 
mcLoad8bitsToReg32 ecx, 3
call TGame_Prompt
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .L5
 
mcLoad8bitsToReg32 ecx, 10
call TCmdBuf_Crop
jc .L9
 
mcLoad8bitsToReg32 ecx, 11
call TCmdBuf_Crop
jc .L100
 
mcLoad8bitsToReg32 ecx, 12
call TCmdBuf_Crop
jc .L200
jmp .L5
 
.L9:
mcZeroBits eax
mcLoadGameDataPtr ebx
mcStoreMember TREKDATA.SKILL, al
mcStoreMember TREKDATA.LENGTH, al
 
.L10:
call TCmdBuf_Scan
mcStoreLocal loc10.pszToken, esi
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA
jne .L20
;
; Check for different kinds of games
;
mcZeroBits eax
mov ebx, [glb_pGameData]
mcStoreMember TREKDATA.KSTUF5, al
 
mcLoad8bitsToReg32 ecx, 74
call TCmdBuf_Crop
jnc .check_medium
 
mov [ebx + TREKDATA.LENGTH], 1
 
.check_medium:
mcLoad8bitsToReg32 ecx, 75
call TCmdBuf_Crop
jnc .check_long
 
mov [ebx + TREKDATA.LENGTH], 2
 
.check_long:
mcLoad8bitsToReg32 ecx, 76
call TCmdBuf_Crop
jnc .check_novice
 
mov [ebx + TREKDATA.LENGTH], 4
 
.check_novice:
mcLoad8bitsToReg32 ecx, 13
call TCmdBuf_Crop
jnc .check_fair
 
mov [ebx + TREKDATA.SKILL], 1
 
.check_fair:
mcLoad8bitsToReg32 ecx, 14
call TCmdBuf_Crop
jnc .check_good
 
mov [ebx + TREKDATA.SKILL], 2
 
.check_good:
mcLoad8bitsToReg32 ecx, 15
call TCmdBuf_Crop
jnc .check_expert
 
mov [ebx + TREKDATA.SKILL], 3
 
.check_expert:
mcLoad8bitsToReg32 ecx, 16
call TCmdBuf_Crop
jnc .check_emeritus
 
mov [ebx + TREKDATA.SKILL], 4
mov [ebx + TREKDATA.KSTUF5], 1
 
.check_emeritus:
mcLoad8bitsToReg32 ecx, 17
call TCmdBuf_Crop
jnc .check_both_entered
 
mov [ebx + TREKDATA.SKILL], 5
mov [ebx + TREKDATA.KSTUF5], 2
 
.check_both_entered:
cmp [ebx + TREKDATA.LENGTH], 0
je .L10
cmp [ebx + TREKDATA.SKILL], 0
je .L10
jmp .L30
 
.L20:
mov ebx, [glb_pGameData]
cmp [ebx + TREKDATA.LENGTH], 0
jne .L25
 
mcLoad8bitsToReg32 ecx, 4
call TGame_Prompt
jmp .L10
 
.L25:
cmp [ebx + TREKDATA.SKILL], 0
jne .L30
 
mcLoad8bitsToReg32 ecx, 5
call TGame_Prompt
jmp .L10
 
.L30:
;
; Read in secret password
;
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
jne .L40
 
.ask_password:
mcLoad8bitsToReg32 ecx, 6
call TGame_Prompt
jmp .L30
 
.L40:
call TCmdBuf_AnsiStrLen
cmp ecx, 8
ja .ask_password
 
mov edi, [glb_pGameData]
push edi
add edi, TREKDATA.PASSWD
inc ecx
rep movsb
pop edi
;
; Use parameters to generate initial game values
;
mov al, [edi + TREKDATA.SKILL]
call TCommon_LoadByteIntoFPU
fld [glb_dbl_0dot5]
fmulp
fstp [edi + TREKDATA.DAMFAC]
 
mcLoad8bitsToReg32 edx, 3
call TRandom_IRan
add eax, 2
mov [edi + TREKDATA.REMBASE], al
 
mcLoad8bitsToReg32 edx, 6
call TRandom_IRan
add eax, 5
mov [edi + TREKDATA.INPLAN], al
 
call TRandom_Ranf
fld [glb_dbl_2]
faddp
mov al, [edi + TREKDATA.SKILL]
call TCommon_LoadByteIntoFPU
fmulp
call TCommon_FP_Truncate
mov [edi + TREKDATA.NROMREM], al
 
movzx eax, [edi + TREKDATA.SKILL]
mcZeroBits edx
mcLoad8bitsToReg32 ecx, 3
div ecx
mov [edi + TREKDATA.NSCREM], al
 
mov al, [edi + TREKDATA.LENGTH]
call TCommon_LoadByteIntoFPU
fld [glb_dbl_7]
fmulp
fld st
fstp [edi + TREKDATA.REMTIME]
fstp [edi + TREKDATA.INTIME]
 
call TRandom_Ranf
fld st
faddp ; 2*RANF(0)
 
mov al, [edi + TREKDATA.SKILL]
call TCommon_LoadByteIntoFPU
fsubrp ; SKILL - 2*RANF(0)
 
fld1
faddp ; SKILL - 2*RAND(0) + 1.0
 
fild [glb_FPU_Int32]
fmulp ; (SKILL - 2*RANF(0) + 1.0)*SKILL
 
fld [glb_dbl_0dot1]
fmulp ; (SKILL - 2*RANF(0) + 1.0)*SKILL*0.1
 
fld [glb_dbl_0dot15]
faddp ; RATE = ... + 0.15
 
fld st
faddp
fld [edi + TREKDATA.INTIME]
fmulp
call TCommon_FP_Truncate
mov [edi + TREKDATA.REMKL], al
mov [edi + TREKDATA.INKLING], al
 
call TCommon_LoadByteIntoFPU
call TRandom_Ranf
fmulp
fld [glb_dbl_0dot0625]
fmulp
call TCommon_FP_Truncate
add al, [edi + TREKDATA.SKILL]
 
cmp al, 10
jbe .store_commander_count
 
mov al, 10
 
.store_commander_count:
mov [edi + TREKDATA.INCOM], al
mov [edi + TREKDATA.REMCOM], al
 
shl al, 2
add al, [edi + TREKDATA.INKLING]
call TCommon_LoadByteIntoFPU
fld [edi + TREKDATA.INTIME]
fmulp
fld st
fstp [edi + TREKDATA.REMRES]
fstp [edi + TREKDATA.INRESOR]
 
cmp [edi + TREKDATA.INKLING], 50
jbe .store_initial_base_count
 
inc [edi + TREKDATA.REMBASE]
 
.store_initial_base_count:
mov al, [edi + TREKDATA.REMBASE]
mov [edi + TREKDATA.INBASE], al
jmp .done
 
.L100:
;
; Process a tournament request
;
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .ask_tnumber
 
call TGame_InitTournament
jmp .L9
 
.ask_tnumber:
mcLoad8bitsToReg32 ecx, 7
call TGame_Prompt
jmp .L100
 
.L200:
;
; Frozen game requested
;
call TGame_Thaw
mov esi, [glb_pGameData]
cmp [esi + TREKDATA.PASSWD], 0
je .L5
;
; Game loaded
;
inc [esp + loc10.bFrozen]
mov ebx, [glb_pGameData]
mcZeroBits eax
mov [ebx + TREKDATA.THINGX], al
mov [ebx + TREKDATA.THINGY], al
 
lea esi, [ebx + TREKDATA.QUAD]
mcLoad8bitsToReg32 ecx, 100
 
.erase_things:
cmp byte [esi], CHAR_THING
jne .no_thing
 
mov byte [esi], CHAR_COSMOS
 
.no_thing:
inc esi
loop .erase_things
 
mov [ebx + TREKDATA.IDIDIT], 1
call TGame_Report
 
.done:
mcLoadLocal ecx, loc10.bFrozen
mcEndLocals loc10.size
ret
 
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_ListAllCommands:
call TConsole_SetGameMsgAttr
call TConsole_ScrollUp
mcLoad8bitsToReg32 ecx, 8
call TConsole_Prout
 
mcLoad8bitsToReg32 edx, 8
mcLoad8bitsToReg32 ecx, 76
 
.next:
inc ecx
push edx
call TConsole_Prout
pop edx
dec edx
jnz .next
 
call TConsole_ScrollUp
ret
 
; --------------------------------------------------------------------------
virtual at 0
loc99:
.OldSectX BYTE ?
.OldSectY BYTE ?
.NewSectX BYTE ?
.NewSectY BYTE ?
.CharEnemy BYTE ?
.__align_1 BYTE ?
.__align_2 BYTE ?
.__align_3 BYTE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_DbgMoveEnemy:
mcBeginLocals loc99.size
 
mov ecx, 714
call TGame_Prompt
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .done
 
mov eax, [ebx + TCmdBuf.cmdbuf_INUM]
mcStoreLocal loc99.OldSectX, al
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .done
 
mov eax, [ebx + TCmdBuf.cmdbuf_INUM]
mcStoreLocal loc99.OldSectY, al
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .done
 
mov eax, [ebx + TCmdBuf.cmdbuf_INUM]
mcStoreLocal loc99.NewSectX, al
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .done
 
mov eax, [ebx + TCmdBuf.cmdbuf_INUM]
mcStoreLocal loc99.NewSectY, al
 
movzx eax, [esp + loc99.NewSectX]
call TPhotons_IsValidSector
jnc .done
 
movzx eax, [esp + loc99.NewSectY]
call TPhotons_IsValidSector
jnc .done
 
mcLoadGameDataPtr ebx
mcZeroBits ecx
mcLoadMember cl, TREKDATA.NENHERE
jecxz .done
 
mcLoadMemberRef esi, TREKDATA.KX
mcLoadMemberRef edi, TREKDATA.KY
 
mcLoadLocal al, loc99.OldSectX
mcLoadLocal dl, loc99.OldSectY
 
.check_sector:
cmp al, [esi]
jne .next
 
cmp dl, [edi]
je .move_klingon
 
.next:
inc esi
inc edi
loop .check_sector
jmp .done
 
.move_klingon:
mcLoadLocal al, loc99.NewSectX
mcLoadLocal dl, loc99.NewSectY
 
mov [esi], al
mov [edi], dl
 
mcLoadLocal al, loc99.OldSectX
mcLoadLocal dl, loc99.OldSectY
call TArray_QuadPtr
 
mov al, [ebx]
mov byte [ebx], CHAR_COSMOS
mcStoreLocal loc99.CharEnemy, al
 
mcLoadLocal al, loc99.NewSectX
mcLoadLocal dl, loc99.NewSectY
call TArray_QuadPtr
mcLoadLocal al, loc99.CharEnemy
mov [ebx], al
 
call TCommon_SortKlingons
 
.done:
mcEndLocals loc99.size
ret
 
; --------------------------------------------------------------------------
virtual at 0
loc98:
.ShipQuadX BYTE ?
.ShipQuadY BYTE ?
.__align_1 BYTE ?
.__align_2 BYTE ?
.size = $
end virtual
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_DbgMoveShip:
mcBeginLocals loc98.size
 
mov ecx, 168
call TGame_Prompt
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .done
 
mov eax, [ebx + TCmdBuf.cmdbuf_INUM]
call TGame_IsValidQuadrant
jnc .done
mcStoreLocal loc98.ShipQuadX, al
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL
jne .done
 
mov eax, [ebx + TCmdBuf.cmdbuf_INUM]
call TGame_IsValidQuadrant
jnc .done
mcStoreLocal loc98.ShipQuadY, al
 
mcLoadGameDataPtr esi
cmp al, [esi + TREKDATA.QUADY]
jne .move_ship
 
mov al, [esi + TREKDATA.QUADX]
cmp [esp + loc98.ShipQuadX], al
je .done
 
.move_ship:
mcLoadLocal al, loc98.ShipQuadX
mcLoadLocal dl, loc98.ShipQuadY
 
mov [esi + TREKDATA.QUADX], al
mov [esi + TREKDATA.QUADY], dl
 
call TCommon_NewQuad
 
.done:
mcEndLocals loc98.size
ret
 
; --------------------------------------------------------------------------
; PROGRAM STARTRK from original FORTRAN source
; --------------------------------------------------------------------------
align PROC_ALIGN
TGame_Thread:
mcProlog
call TGame_Prelim
 
.L10:
call TGame_Choose
mcOnRegNotZero ecx, .L15
 
call TCommon_Setup
 
.L15:
mov [glb_MOVED], 0
 
.L20:
mov esi, [glb_pGameData]
cmp [esi + TREKDATA.ALLDONE], 0
jne .L9999
 
.reset_before_cmd:
mcZeroBits eax
mov [esi + TREKDATA.JUSTIN], al
mov [esi + TREKDATA.KDIDIT], al
 
fldz
fstp [esi + TREKDATA.TIME]
 
mcLoad8bitsToReg32 ecx, 2
call TGame_Prompt
 
call TCmdBuf_Scan
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
je .L20
 
mcLoad8bitsToReg32 ecx, 18
call TCmdBuf_Crop
jc .L100
 
mcLoad8bitsToReg32 ecx, 26
call TCmdBuf_Crop
jc .L200
 
mcLoad8bitsToReg32 ecx, 20
call TCmdBuf_Crop
jc .L300
 
mcLoad8bitsToReg32 ecx, 24
call TCmdBuf_Crop
jc .L400
 
mcLoad8bitsToReg32 ecx, 19
call TCmdBuf_Crop
jc .L500
 
mcLoad8bitsToReg32 ecx, 28
call TCmdBuf_Crop
jc .L600
 
mcLoad8bitsToReg32 ecx, 32
call TCmdBuf_Crop
jc .L700
 
mcLoad8bitsToReg32 ecx, 34
call TCmdBuf_Crop
jc .L800
 
mcLoad8bitsToReg32 ecx, 30
call TCmdBuf_Crop
jc .L900
 
mcLoad8bitsToReg32 ecx, 23
call TCmdBuf_Crop
jc .L1000
 
mcLoad8bitsToReg32 ecx, 31
call TCmdBuf_Crop
jc .L1100
 
mcLoad8bitsToReg32 ecx, 27
call TCmdBuf_Crop
jc .L1200
 
mcLoad8bitsToReg32 ecx, 22
call TCmdBuf_Crop
jc .L1300
 
mcLoad8bitsToReg32 ecx, 36
call TCmdBuf_Crop
jc .L1400
 
mcLoad8bitsToReg32 ecx, 37
call TCmdBuf_Crop
jc .L1450
 
mcLoad8bitsToReg32 ecx, 38
call TCmdBuf_Crop
jc .L1500
 
mcLoad8bitsToReg32 ecx, 39
call TCmdBuf_Crop
jc .L1550
 
mcLoad8bitsToReg32 ecx, 40
call TCmdBuf_Crop
jc .L1600
 
mcLoad8bitsToReg32 ecx, 41
call TCmdBuf_Crop
jc .L1650
 
mcLoad8bitsToReg32 ecx, 42
call TCmdBuf_Crop
jc .L1670
 
mcLoad8bitsToReg32 ecx, 43
call TCmdBuf_Crop
jc .L1680
 
mcLoad8bitsToReg32 ecx, 45
call TCmdBuf_Crop
jc .L1685
 
mcLoad8bitsToReg32 ecx, 46
call TCmdBuf_Crop
jc .L1690
;
; Non-abbreviated commands (checking)
;
mcLoad8bitsToReg32 ecx, 21
call TCmdBuf_Crop
jc .L1700
 
mcLoad8bitsToReg32 ecx, 33
call TCmdBuf_Crop
jc .L9000
 
mcLoad8bitsToReg32 ecx, 25
call TCmdBuf_Crop
jc .L1900
 
mcLoad8bitsToReg32 ecx, 29
call TCmdBuf_Crop
jc .L2000
 
mcLoad8bitsToReg32 ecx, 35
call TCmdBuf_Crop
jc .L2100
 
mcLoad8bitsToReg32 ecx, 44
call TCmdBuf_Crop
jc .L2200
 
mov ecx, 708
call TCmdBuf_Crop
jc .L2300
;
; Get help, mon!
;
call TGame_ListAllCommands
jmp .L20
 
.L100:
call TSrScan_Main
jmp .L20
 
.L200:
call TLrScan_Main
jmp .L20
 
.L300:
call TPhasers_Main
 
.L305:
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.IDIDIT], 0
je .L20
 
.L310:
call TAttack_Main
 
.L320:
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.KDIDIT], 0
jne .L2500
jmp .L15
 
.L400:
call TPhotons_Main
 
.L410:
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.IDIDIT], 0
je .L20
 
mov [glb_MOVED], 0
jmp .L2500
 
.L500:
cmp [glb_MOVED], 0
je .L510
 
.L505:
mov [glb_MOVED], 2
 
.L510:
call TMove_Warp
 
.L520:
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.IDIDIT], 0
jne .L521
 
cmp [glb_MOVED], 2
jne .L521
 
dec [glb_MOVED]
 
.L521:
cmp [esi + TREKDATA.IDIDIT], 0
je .L20
 
cmp [glb_MOVED], 2
jne .L522
 
cmp [esi + TREKDATA.JUSTIN], 0
jne .L522
 
call TAttack_Main
 
.L522:
mov [glb_MOVED], 1
jmp .L2500
 
.L600:
call TShields_Main
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.IDIDIT], 0
je .L20
 
call TAttack_Main
mcLoadGameDataPtr esi
mov [esi + TREKDATA.SHLDCHG], 0
jmp .L320
 
.L700:
call TDock_Main
jmp .L305
 
.L800:
call TDock_DamageReport
jmp .L20
 
.L900:
call TChart_Main
jmp .L20
 
.L1000:
cmp [glb_MOVED], 0
jne .L505
 
call TImpulse_Main
jmp .L520
 
.L1100:
call TGame_Wait
jmp .L410
 
.L1200:
call TChart_SetWarp
jmp .L20
 
.L1300:
call TSrScan_Status
jmp .L20
 
.L1400:
call TPlanet_Sensor
 
.skip_before_prompt:
call TConsole_ScrollUp
jmp .L20
 
.L1450:
call TPlanet_Orbit
jmp .L410
 
.L1500:
call TPlanet_Beam
jmp .L20
 
.L1550:
call TPlanet_Mine
jmp .L410
 
.L1600:
call TPlanet_Crystal
jmp .L20
 
.L1650:
call TPlanet_Galileo
jmp .L410
 
.L1670:
call TPlanet_Main
jmp .skip_before_prompt
 
.L1680:
call TSrScan_Request
jmp .L20
 
.L1685:
inc [glb_bEmExit]
call TGame_Freeze
jmp .quit_now_fast
 
.L1690:
mcLoadGameDataPtr edi
mov [edi + TREKDATA.IDIDIT], 0
 
call TGame_Report
jmp .L20
;
; Non-abbreviated commands (executing)
;
.L1700:
mov cl, 21
call TCmdBuf_VerifyToken
jnc .L20
 
call TDock_Help
jmp .L20
 
.L9000:
mov cl, 33
call TCmdBuf_VerifyToken
jnc .L20
jmp .L9001
 
.L1900:
mov cl, 25
call TCmdBuf_VerifyToken
jnc .L20
 
call TDock_Abandon
jmp .L20
 
.L2000:
mov cl, 29
call TCmdBuf_VerifyToken
jnc .L20
 
call TApp_SelfDestruct
jmp .L20
 
.L2100:
mov cl, 35
call TCmdBuf_VerifyToken
jnc .L20
 
call TGame_Freeze
 
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.IDIDIT], 1
je .L9999
jmp .L20
 
.L2200:
mov cl, 44
call TCmdBuf_VerifyToken
jnc .L20
 
call TPlanet_DeathRay
jmp .L305
 
.L2300:
mov ecx, 708
call TCmdBuf_VerifyToken_ECX
jnc .L20
 
call TLrScan_Log
jmp .L20
 
.L2500:
;
; After command which may use time invoke events module
;
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.ALLDONE], 0
jne .L9999
 
fld [esi + TREKDATA.TIME]
fldz
mc_CMP_ST0_ST1
jz .L2501
 
call TEvents_Main
 
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.ALLDONE], 0
jne .L9999
 
.L2501:
call TArray_MyGalaxyPtr
cmp dword [ebx], 1000
jne .L2510
 
mov al, 16
mcZeroBits ecx
call TNova_AutomaticOverride
 
mcZeroBits eax
mov [glb_MOVED], al
jmp .L2500
 
.L2510:
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.NENHERE], 0
jne .L2511
 
call TEvents_MoveTholian
 
.L2511:
mcLoadGameDataPtr esi
cmp [esi + TREKDATA.KDIDIT], 1
je .L15
cmp [esi + TREKDATA.NENHERE], 0
je .L15
 
cmp [glb_MOVED], 0
je .L310
cmp [esi + TREKDATA.JUSTIN], 1
je .L310
jmp .L20
 
.L9001:
call TGame_Score
 
.L9999:
call TConsole_ScrollUp
call TConsole_ScrollUp
call TPlanet_Stars
call TConsole_ScrollUp
 
mov ecx, 474
call TGame_JA
jnc .end_game
 
mov cl, 40
call TConsole_Skip
jmp .L10
 
.end_game:
call TConsole_ScrollUp
mov ecx, 475
call TConsole_ProutGameMsg
mov ecx, 476
call TConsole_Prout
call TConsole_ScrollUp
 
mov ecx, 653
call TGame_Prompt
 
.quit_now_fast:
invoke PostMessage, [glb_MainWnd], WM_CLOSE, 0, 0
 
mcEpilog
ret 4
 
; --- EOF ---