; Spectator control supplies decisions to the real native games, never simulated results. .code BeginObserver3D PROC uses esi edi lea esi,screenBuffer lea edi,obsBackground3D mov ecx,SCREEN_SIZE rep movsd mov engineMode,MODE_OBSERVER mov obsError3D,0 mov paused3D,0 call ClearKeys3D mov mouseClick3D,0 ret BeginObserver3D ENDP StartObserver3D PROC uses ebx esi cmp obsActive3D,0 jne obs_start_done cmp obsSelection3D,OBS_GAME_COUNT jae obs_start_done xor esi,esi obs_save_profile: mov ebx,obsProfilePointers3D[esi*4] mov eax,[ebx] mov obsSavedProfile3D[esi*4],eax inc esi cmp esi,LENGTHOF obsProfilePointers3D jb obs_save_profile mov obsActive3D,1 mov obsPaused3D,0 mov obsRound3D,0 mov obsWins3D[0],0 mov obsWins3D[4],0 mov obsWins3D[8],0 mov tournamentMode,0 mov cardExitActive3D,0 mov obsError3D,0 mov eax,obsSelection3D mov eax,obsModes3D[eax*4] mov engineMode,eax cmp eax,MODE_POOL je obs_init_pool cmp eax,MODE_DURAK je obs_init_durak cmp eax,MODE_BLACKJACK je obs_init_blackjack call InitNativePoker3D jmp obs_check_assets obs_init_durak: call InitNativeDurak3D mov eax,obsSelection3D sub eax,2 mov dkVariant3D,eax jmp obs_check_assets obs_init_blackjack: call InitNativeBlackjack3D mov cbBotCount3D,0 obs_check_assets: cmp cardTablePixels3D,0 jne obs_start_round call StopObserver3D mov obsError3D,1 ret obs_init_pool: mov poolAI3D,1 mov eax,obsSelection3D sub eax,4 invoke StartBilliards3D,eax obs_start_round: call ObserverNewRound3D obs_start_done: ret StartObserver3D ENDP StopObserver3D PROC uses esi ebx cmp obsActive3D,0 je obs_stop_menu ; The save barrier remains active until every personal value has been restored. xor esi,esi obs_restore_profile: mov ebx,obsProfilePointers3D[esi*4] mov eax,obsSavedProfile3D[esi*4] mov [ebx],eax inc esi cmp esi,LENGTHOF obsProfilePointers3D jb obs_restore_profile mov obsActive3D,0 obs_stop_menu: mov engineMode,MODE_OBSERVER mov paused3D,0 mov cardExitActive3D,0 call ClearKeys3D mov mouseClick3D,0 invoke PlayCasinoSound3D,0,0,0 ret StopObserver3D ENDP ObserverNewRound3D PROC mov obsTimer3D,0 mov obsResultTimer3D,0 mov obsOutcome3D,0 inc obsRound3D mov bankroll,10000 cmp engineMode,MODE_POOL jne @F call ResetPool3D ret @@: cmp engineMode,MODE_DURAK jne @F mov dkBet3D,100 mov dkState3D,DK_IDLE call StartNativeDurak3D ret @@: cmp engineMode,MODE_BLACKJACK jne @F mov cbBet3D,100 mov cbState3D,CB_IDLE call StartNativeBlackjack3D ret @@: mov pkBlind3D,50 mov pkState3D,PK_IDLE call StartNativePoker3D ret ObserverNewRound3D ENDP ObserverOutcome3D PROC cmp engineMode,MODE_POOL jne @F cmp poolState3D,POOL_RESULT jne obs_no_outcome mov eax,poolWinner3D inc eax ret @@: cmp engineMode,MODE_DURAK jne @F cmp dkState3D,DK_RESULT jne obs_no_outcome mov eax,dkOutcome3D inc eax ret @@: cmp engineMode,MODE_BLACKJACK jne @F cmp cbState3D,CB_RESULT jne obs_no_outcome mov eax,cbOutcome3D cmp eax,3 jne obs_number_outcome mov eax,1 ret @@: cmp pkState3D,PK_RESULT jne obs_no_outcome mov eax,pkOutcome3D obs_number_outcome: inc eax ret obs_no_outcome: xor eax,eax ret ObserverOutcome3D ENDP ObserverBlackjack3D PROC cmp cbState3D,CB_PLAYER jne obs_bj_update cmp obsTimer3D,700 jb obs_bj_update mov obsTimer3D,0 ; Only our hand and the dealer's exposed up-card enter the decision. cmp cbPlayerScore3D,17 jae obs_bj_stand cmp cbPlayerScore3D,12 jb obs_bj_hit mov eax,cbDealer3D[0] xor edx,edx mov ecx,13 div ecx cmp edx,5 jae obs_bj_hit obs_bj_stand: invoke FinishBJPlayer3D,-1 jmp obs_bj_update obs_bj_hit: call NativeBJHit3D obs_bj_update: call HandleNativeBlackjack3D ret ObserverBlackjack3D ENDP ObserverDurak3D PROC cmp dkState3D,DK_TURN jne obs_durak_update cmp dkActor3D,0 jne obs_durak_update cmp obsTimer3D,700 jb obs_durak_update mov obsTimer3D,0 invoke DurakBotTurn3D,0 obs_durak_update: call HandleNativeDurak3D ret ObserverDurak3D ENDP ObserverTick3D PROC uses ebx cmp obsActive3D,0 je obs_tick_done call ObserverOutcome3D test eax,eax jz obs_tick_game cmp obsOutcome3D,0 jne obs_result_wait mov obsOutcome3D,eax inc obsWins3D[eax*4-4] mov obsResultTimer3D,0 obs_result_wait: mov eax,deltaTime3D add obsResultTimer3D,eax cmp obsResultTimer3D,3000 jb obs_tick_done call ObserverNewRound3D ret obs_tick_game: mov eax,deltaTime3D add obsTimer3D,eax cmp engineMode,MODE_POOL jne @F call HandlePool3D ret @@: cmp engineMode,MODE_DURAK jne @F call ObserverDurak3D ret @@: cmp engineMode,MODE_BLACKJACK jne @F call ObserverBlackjack3D ret @@: cmp pkState3D,PK_PLAYER jne obs_poker_update cmp obsTimer3D,700 jb obs_poker_update mov obsTimer3D,0 invoke PokerBotAct3D,0 obs_poker_update: call HandleNativePoker3D obs_tick_done: ret ObserverTick3D ENDP ObserverFrame3D PROC uses ebx esi invoke Pressed3D,1Bh test eax,eax jz obs_frame_input cmp obsActive3D,0 je obs_leave_hall call StopObserver3D jmp obs_frame_draw obs_leave_hall: mov engineMode,MODE_WALK call ClearKeys3D mov mouseClick3D,0 jmp obs_frame_draw obs_frame_input: cmp obsActive3D,0 jne obs_watch_input xor esi,esi obs_menu_digit: lea eax,[esi+31h] invoke Pressed3D,eax test eax,eax jnz obs_menu_pick inc esi cmp esi,OBS_GAME_COUNT jb obs_menu_digit invoke Pressed3D,26h test eax,eax jz @F cmp obsSelection3D,0 jne obs_menu_up mov obsSelection3D,OBS_GAME_COUNT obs_menu_up: dec obsSelection3D @@: invoke Pressed3D,28h test eax,eax jz @F inc obsSelection3D cmp obsSelection3D,OBS_GAME_COUNT jb @F mov obsSelection3D,0 @@: invoke Pressed3D,0Dh test eax,eax jnz obs_menu_start cmp mouseClick3D,0 je obs_frame_draw cmp mouseX3D,16 jb obs_frame_draw cmp mouseX3D,304 jae obs_frame_draw mov eax,mouseY3D sub eax,52 js obs_frame_draw xor edx,edx mov ecx,23 div ecx cmp eax,OBS_GAME_COUNT jae obs_menu_close_click cmp edx,20 jae obs_frame_draw mov esi,eax obs_menu_pick: mov obsSelection3D,esi obs_menu_start: call StartObserver3D jmp obs_frame_draw obs_menu_close_click: cmp mouseY3D,212 jb obs_frame_draw jmp obs_leave_hall obs_watch_input: invoke Pressed3D,20h test eax,eax jnz obs_watch_pause invoke Pressed3D,9 test eax,eax jnz obs_watch_speed invoke Pressed3D,4Eh test eax,eax jnz obs_watch_restart cmp mouseClick3D,0 je obs_watch_tick cmp mouseY3D,222 jb obs_watch_tick cmp mouseY3D,239 jae obs_watch_tick mov eax,mouseX3D cmp eax,74 jb obs_watch_pause cmp eax,134 jb obs_watch_speed cmp eax,226 jb obs_watch_restart call StopObserver3D jmp obs_frame_draw obs_watch_pause: xor obsPaused3D,1 jmp obs_watch_tick obs_watch_speed: shl obsSpeed3D,1 cmp obsSpeed3D,4 jbe obs_watch_tick mov obsSpeed3D,1 jmp obs_watch_tick obs_watch_restart: call ObserverNewRound3D obs_watch_tick: ; Human game commands never reach the autonomous seats. call ClearKeys3D mov mouseClick3D,0 cmp obsPaused3D,0 jne obs_frame_draw mov ebx,deltaTime3D mov eax,ebx imul eax,obsSpeed3D mov deltaTime3D,eax add animationClock3D,eax call ObserverTick3D mov deltaTime3D,ebx obs_frame_draw: call RenderObserver3D mov mouseClick3D,0 ret ObserverFrame3D ENDP RenderObserver3D PROC uses ebx esi edi cmp obsActive3D,0 jne obs_render_game lea esi,obsBackground3D lea edi,screenBuffer mov ecx,SCREEN_SIZE rep movsd invoke DrawBox,0,0,320,240,00151D20h invoke DrawString8x8,16,18,OFFSET obsTitle,00E8D7ADh xor ebx,ebx obs_render_row: imul esi,ebx,23 add esi,52 mov edi,00728689h cmp ebx,obsSelection3D jne @F mov edi,00E8D7ADh @@: invoke DrawBoxBorder,16,esi,288,20,00293436h,edi,1 add esi,6 lea eax,[ebx+1] invoke FormatNumber,eax,OFFSET hudNumBuffer invoke DrawString8x8,24,esi,OFFSET hudNumBuffer,edi invoke DrawString8x8,48,esi,obsNames3D[ebx*4],edi inc ebx cmp ebx,OBS_GAME_COUNT jb obs_render_row invoke DrawBoxBorder,16,212,288,20,00293436h,00728689h,1 invoke DrawString8x8,136,218,OFFSET obsClose,00E8D7ADh cmp obsError3D,0 je obs_render_done invoke DrawString8x8,16,198,OFFSET obsFailed,00DB8B83h ret obs_render_game: cmp engineMode,MODE_POOL jne @F call RenderPool3D jmp obs_render_hud @@: cmp engineMode,MODE_DURAK jne @F call RenderNativeDurak3D jmp obs_render_hud @@: cmp engineMode,MODE_BLACKJACK jne @F call RenderNativeBlackjack3D jmp obs_render_hud @@: call RenderNativePoker3D obs_render_hud: invoke DrawBox,0,0,320,32,00151D20h mov ebx,obsSelection3D invoke DrawString8x8,8,5,obsNames3D[ebx*4],00E8D7ADh invoke DrawString8x8,8,20,OFFSET obsFirst,0090CDB2h invoke FormatNumber,obsWins3D[0],OFFSET hudNumBuffer invoke DrawString8x8,48,20,OFFSET hudNumBuffer,0090CDB2h invoke DrawString8x8,88,20,OFFSET obsSecond,00DEA0A0h invoke FormatNumber,obsWins3D[4],OFFSET hudNumBuffer invoke DrawString8x8,128,20,OFFSET hudNumBuffer,00DEA0A0h invoke DrawString8x8,190,20,OFFSET obsRound,00E8D7ADh invoke FormatNumber,obsRound3D,OFFSET hudNumBuffer invoke DrawString8x8,254,20,OFFSET hudNumBuffer,00FFFFFFh invoke DrawBox,0,215,320,25,00151D20h cmp obsOutcome3D,0 je obs_render_turn mov ebx,OFFSET obsWin1 cmp obsOutcome3D,1 je @F mov ebx,OFFSET obsWin2 cmp obsOutcome3D,2 je @F mov ebx,OFFSET obsDraw @@: invoke DrawString8x8,200,5,ebx,00E8D7ADh jmp obs_render_controls obs_render_turn: mov eax,pkTurn3D cmp engineMode,MODE_POKER je obs_render_actor mov eax,dkActor3D cmp engineMode,MODE_DURAK je obs_render_actor mov eax,poolPlayer3D cmp engineMode,MODE_POOL je obs_render_actor xor eax,eax cmp cbState3D,CB_DEALER jne obs_render_actor inc eax obs_render_actor: and eax,1 invoke DrawString8x8,232,5,obsTurnNames3D[eax*4],00A7C7C5h obs_render_controls: mov ebx,OFFSET obsPause cmp obsPaused3D,0 je @F mov ebx,OFFSET obsPlay @@: invoke DrawBoxBorder,4,222,66,16,00293436h,00728689h,1 invoke DrawString8x8,14,226,ebx,00FFFFFFh mov eax,obsSpeed3D shr eax,1 mov ebx,obsSpeedNames3D[eax*4] invoke DrawBoxBorder,78,222,48,16,00293436h,00728689h,1 invoke DrawString8x8,94,226,ebx,00FFFFFFh invoke DrawBoxBorder,138,222,80,16,00293436h,00728689h,1 invoke DrawString8x8,154,226,OFFSET obsRestart,00FFFFFFh invoke DrawBoxBorder,230,222,86,16,00293436h,00728689h,1 invoke DrawString8x8,254,226,OFFSET obsGames,00FFFFFFh obs_render_done: ret RenderObserver3D ENDP