Sequence studio, texture AI disclosure and MASM code comparison before arrival. Show a typed hall briefing after admission. Start the jukebox at 50% user volume on hall entry. Apply positional gain before playback to avoid a full-volume startup burst.
315 lines
7.4 KiB
PHP
315 lines
7.4 KiB
PHP
BeginArrival3D PROC
|
|
call LoadArrivalAssets3D
|
|
call LoadCityArrival3D
|
|
call CollectGraphicProfiles3D
|
|
mov engineMode, MODE_ARRIVAL
|
|
mov arrivalState3D, ARRIVAL_WALK
|
|
mov cityPhase3D, CITY_BLACK
|
|
mov cityTime3D, 0
|
|
mov cityClock3D, 0
|
|
mov arrivalTime3D, 0
|
|
mov arrivalConfirmed3D, 0
|
|
mov nativeProfileActive3D, 0
|
|
mov arrivalSelected3D, 0
|
|
cmp entryAccountCount3D, 0
|
|
je @F
|
|
mov arrivalSelected3D, 1
|
|
@@:
|
|
mov arrivalError3D, 0
|
|
call ClearKeys3D
|
|
ret
|
|
BeginArrival3D ENDP
|
|
|
|
ArrivalChar3D PROC character:DWORD
|
|
cmp engineMode, MODE_ARRIVAL
|
|
jne arrival_char_done
|
|
cmp arrivalState3D, ARRIVAL_NAME
|
|
jne arrival_char_done
|
|
mov eax, character
|
|
cmp eax, 127
|
|
ja arrival_char_done
|
|
cmp eax, 8
|
|
je arrival_char_backspace
|
|
cmp arrivalNameLength3D, 16
|
|
jae arrival_char_done
|
|
cmp al, '0'
|
|
jb arrival_char_alpha
|
|
cmp al, '9'
|
|
jbe arrival_char_store
|
|
arrival_char_alpha:
|
|
mov dl, al
|
|
or dl, 20h
|
|
cmp dl, 'a'
|
|
jb arrival_char_symbol
|
|
cmp dl, 'z'
|
|
jbe arrival_char_store
|
|
arrival_char_symbol:
|
|
cmp al, '_'
|
|
je arrival_char_store
|
|
cmp al, '-'
|
|
jne arrival_char_done
|
|
arrival_char_store:
|
|
mov ecx, arrivalNameLength3D
|
|
mov arrivalName3D[ecx], al
|
|
inc ecx
|
|
mov arrivalNameLength3D, ecx
|
|
mov arrivalName3D[ecx], 0
|
|
mov arrivalError3D, 0
|
|
ret
|
|
arrival_char_backspace:
|
|
mov ecx, arrivalNameLength3D
|
|
test ecx, ecx
|
|
jz arrival_char_done
|
|
dec ecx
|
|
mov arrivalNameLength3D, ecx
|
|
mov arrivalName3D[ecx], 0
|
|
arrival_char_done:
|
|
ret
|
|
ArrivalChar3D ENDP
|
|
|
|
ArrivalEscape3D PROC
|
|
cmp arrivalState3D, ARRIVAL_NAME
|
|
jne @F
|
|
mov arrivalState3D, ARRIVAL_PROFILE
|
|
mov arrivalError3D, 0
|
|
call ClearKeys3D
|
|
ret
|
|
@@:
|
|
cmp arrivalState3D, ARRIVAL_PROFILE
|
|
je arrival_pause
|
|
cmp arrivalState3D, ARRIVAL_STOP
|
|
jae arrival_escape_done
|
|
mov arrivalState3D, ARRIVAL_STOP
|
|
mov arrivalTime3D, 0
|
|
call ClearKeys3D
|
|
ret
|
|
arrival_pause:
|
|
xor paused3D, 1
|
|
arrival_escape_done:
|
|
ret
|
|
ArrivalEscape3D ENDP
|
|
|
|
HandleArrival3D PROC uses ebx esi
|
|
mov eax, deltaTime3D
|
|
add arrivalTime3D, eax
|
|
add cityClock3D, eax
|
|
cmp arrivalState3D, ARRIVAL_NAME
|
|
je arrival_name_input
|
|
cmp arrivalState3D, ARRIVAL_PROFILE
|
|
je arrival_profile_input
|
|
cmp arrivalState3D, ARRIVAL_WALK
|
|
jne arrival_animation
|
|
call HandleCityApproach3D
|
|
ret
|
|
arrival_animation:
|
|
cmp arrivalState3D, ARRIVAL_STOP
|
|
jne arrival_admission
|
|
cmp arrivalTime3D, 720
|
|
jb arrival_handle_done
|
|
mov arrivalState3D, ARRIVAL_PROFILE
|
|
mov arrivalTime3D, 0
|
|
call ClearKeys3D
|
|
ret
|
|
arrival_admission:
|
|
cmp arrivalState3D, ARRIVAL_ADMIT
|
|
jne arrival_entry
|
|
cmp arrivalTime3D, 1200
|
|
jb arrival_handle_done
|
|
mov arrivalState3D, ARRIVAL_ENTER
|
|
mov arrivalTime3D, 0
|
|
ret
|
|
arrival_entry:
|
|
cmp arrivalTime3D, 1400
|
|
jb arrival_handle_done
|
|
mov engineMode, MODE_WALK
|
|
mov playerX, (16*FP_1+FP_HALF)
|
|
mov playerY, (27*FP_1+FP_HALF)
|
|
mov playerAngle, 384
|
|
mov interactTargetId, 0
|
|
mov interactPromptPtr, 0
|
|
call ClearKeys3D
|
|
call BeginWelcome3D
|
|
; Start only after admission, with the normal positional attenuation.
|
|
mov jboxUserVolume, 5
|
|
invoke PlayJukeboxTrack3D, 0
|
|
ret
|
|
arrival_profile_input:
|
|
invoke Pressed3D, 26h
|
|
test eax, eax
|
|
jz @F
|
|
cmp arrivalSelected3D, 0
|
|
je @F
|
|
dec arrivalSelected3D
|
|
@@:
|
|
invoke Pressed3D, 28h
|
|
test eax, eax
|
|
jz @F
|
|
mov eax, entryAccountCount3D
|
|
inc eax
|
|
cmp arrivalSelected3D, eax
|
|
jae @F
|
|
inc arrivalSelected3D
|
|
@@:
|
|
cmp mouseClick3D, 0
|
|
je arrival_profile_enter
|
|
cmp mouseX3D, 174
|
|
jb arrival_profile_enter
|
|
cmp mouseX3D, 310
|
|
jae arrival_profile_enter
|
|
mov eax, mouseY3D
|
|
sub eax, 70
|
|
js arrival_profile_mouse_button
|
|
cmp eax, 120
|
|
jae arrival_profile_mouse_button
|
|
xor edx, edx
|
|
mov ecx, 24
|
|
div ecx
|
|
mov ebx, eax
|
|
mov eax, arrivalSelected3D
|
|
xor edx, edx
|
|
mov ecx, 5
|
|
div ecx
|
|
imul eax, 5
|
|
add eax, ebx
|
|
mov ecx, entryAccountCount3D
|
|
inc ecx
|
|
cmp eax, ecx
|
|
ja arrival_handle_done
|
|
mov arrivalSelected3D, eax
|
|
ret
|
|
arrival_profile_mouse_button:
|
|
cmp mouseY3D, 201
|
|
jb arrival_handle_done
|
|
cmp mouseY3D, 219
|
|
ja arrival_handle_done
|
|
jmp arrival_profile_confirm
|
|
arrival_profile_enter:
|
|
invoke Pressed3D, 0Dh
|
|
test eax, eax
|
|
jz arrival_handle_done
|
|
arrival_profile_confirm:
|
|
mov eax, arrivalSelected3D
|
|
test eax, eax
|
|
jz arrival_confirmed
|
|
dec eax
|
|
cmp eax, entryAccountCount3D
|
|
je arrival_create_name
|
|
invoke SelectGraphicProfile3D, eax
|
|
test eax, eax
|
|
jz arrival_selection_error
|
|
arrival_confirmed:
|
|
mov arrivalConfirmed3D, 1
|
|
mov arrivalState3D, ARRIVAL_ADMIT
|
|
mov arrivalTime3D, 0
|
|
mov arrivalError3D, 0
|
|
call ClearKeys3D
|
|
ret
|
|
arrival_create_name:
|
|
mov arrivalState3D, ARRIVAL_NAME
|
|
mov arrivalNameLength3D, 0
|
|
mov arrivalName3D, 0
|
|
mov arrivalError3D, 0
|
|
call ClearKeys3D
|
|
ret
|
|
arrival_name_input:
|
|
invoke Pressed3D, 0Dh
|
|
test eax, eax
|
|
jz arrival_handle_done
|
|
call CreateGraphicProfile3D
|
|
test eax, eax
|
|
jnz arrival_confirmed
|
|
arrival_selection_error:
|
|
mov arrivalError3D, 1
|
|
arrival_handle_done:
|
|
ret
|
|
HandleArrival3D ENDP
|
|
|
|
DrawEntryProfileRows3D PROC uses ebx esi edi
|
|
local start:DWORD,rowY:DWORD,ink:DWORD
|
|
invoke DrawBoxBorder, 174, 42, 138, 181, 0017191Ch, 00BD985Ah, 1
|
|
invoke DrawString8x8, 182, 51, OFFSET entryChoose3D, 00F0D7ABh
|
|
mov eax, arrivalSelected3D
|
|
xor edx, edx
|
|
mov ecx, 5
|
|
div ecx
|
|
imul eax, 5
|
|
mov start, eax
|
|
mov ebx, eax
|
|
mov rowY, 70
|
|
entry_row:
|
|
mov eax, entryAccountCount3D
|
|
inc eax
|
|
cmp ebx, eax
|
|
ja entry_rows_done
|
|
mov ink, 00C5C7C9h
|
|
cmp ebx, arrivalSelected3D
|
|
jne @F
|
|
invoke DrawBoxBorder, 178, rowY, 130, 22, 003B5148h, 00B6D9B4h, 1
|
|
mov ink, 00FFFFFFh
|
|
@@:
|
|
mov esi, OFFSET entryGuest3D
|
|
test ebx, ebx
|
|
jz entry_row_draw
|
|
mov eax, entryAccountCount3D
|
|
inc eax
|
|
cmp ebx, eax
|
|
jne entry_row_name
|
|
mov esi, OFFSET entryNew3D
|
|
jmp entry_row_draw
|
|
entry_row_name:
|
|
mov eax, ebx
|
|
dec eax
|
|
shl eax, 6
|
|
add eax, OFFSET entryAccountNames3D
|
|
mov esi, eax
|
|
mov edi, OFFSET entryDisplayName3D
|
|
mov ecx, 15
|
|
entry_display_copy:
|
|
lodsb
|
|
cmp al, '.'
|
|
je entry_display_end
|
|
test al, al
|
|
jz entry_display_end
|
|
stosb
|
|
loop entry_display_copy
|
|
entry_display_end:
|
|
mov BYTE PTR [edi], 0
|
|
mov esi, OFFSET entryDisplayName3D
|
|
entry_row_draw:
|
|
mov eax, rowY
|
|
add eax, 3
|
|
invoke DrawString8x8, 182, eax, esi, ink
|
|
mov eax, entryAccountCount3D
|
|
inc eax
|
|
cmp ebx, eax
|
|
je entry_row_next
|
|
mov eax, bankroll
|
|
test ebx, ebx
|
|
jz entry_display_bank
|
|
mov eax, ebx
|
|
dec eax
|
|
mov eax, entryAccountBanks3D[eax*4]
|
|
entry_display_bank:
|
|
invoke FormatNumber, eax, OFFSET hudNumBuffer
|
|
mov eax, rowY
|
|
add eax, 13
|
|
invoke DrawString8x8, 182, eax, OFFSET entryMoney3D, 00B1C9ADh
|
|
mov eax, rowY
|
|
add eax, 13
|
|
invoke DrawString8x8, 192, eax, OFFSET hudNumBuffer, 00B1C9ADh
|
|
entry_row_next:
|
|
add rowY, 24
|
|
inc ebx
|
|
mov eax, ebx
|
|
sub eax, start
|
|
cmp eax, 5
|
|
jb entry_row
|
|
entry_rows_done:
|
|
cmp arrivalError3D, 0
|
|
je @F
|
|
invoke DrawString8x8, 182, 190, OFFSET entryProfileError3D, 00EC8875h
|
|
@@:
|
|
invoke DrawBoxBorder, 180, 202, 126, 17, 003F5748h, 00D8BC6Ah, 1
|
|
invoke DrawString8x8, 223, 207, OFFSET entryConfirm3D, 00FFFFFFh
|
|
ret
|
|
DrawEntryProfileRows3D ENDP
|