Mario.Asm
Upload User: bfc2008
Upload Date: 2007-02-21
Package Size: 35k
Code Size: 19k
Category:

Game Program

Development Platform:

DOS

  1. .386
  2. .model flat,stdcall
  3. option casemap:none
  4. include Mario.inc
  5. include Gates.inc
  6. .const
  7.    STBAR_GRIDS  equ  4
  8.    ;-- Margin 
  9.    LEFT_MARGIN  equ 1
  10.    TOP_MARGIN   equ 1
  11.    ;-- leading actor mov ;-- Back Scroll Mov
  12.    ACTOR_LOW_SPEED  equ 2
  13.    ACTOR_HIGH_SPEED equ 4
  14.    ACTOR_DROP_SPEED equ 4
  15.    ACTOR_JUMP_SPEED equ 4 + ACTOR_DROP_SPEED
  16.    ;-- Jump Height 
  17.    MAX_JUMP_HEIGHT  equ 5
  18.    ;-- Back Movie Time Interval
  19.    BACK_MOVIE_INTERVAL  equ 800
  20.    FRAME_MOVIE_INTERVAL equ 20
  21.    JUMP_MAX_TIME        equ 350
  22.    ;-- Game State --
  23.    GS_PLAY     equ  1000   ;-- Player can playing
  24.    GS_STARTGAME equ 1001
  25.    GS_PAUSE    equ  1002   ;-- Pause
  26.    GS_SELECT   equ  1003   ;-- Select Control
  27.    GS_GAMEOVER equ  1004   ;-- Game over
  28.    GS_INFO     equ  1005   ;-- Show Information
  29.    
  30. .data 
  31.    szMessage db 'Message Hooked!!!',0
  32.    
  33.    Stbar_Parts dd  150,250,375,550
  34.    
  35.    FpsFmtStr db 'FPS = %d',0
  36.    SmallFontName  db 'Courier New',0
  37.    
  38.    szKeyDown db 'Key Down',0
  39.    szKeyUp db 'Key Up',0
  40. .data?
  41.    ;-- Sprite ---
  42.    Sprite CSprite <?>
  43.    ;-- Key State 
  44.    KeyState CKeyState <?>
  45.    ;-- Gate Data Information ---
  46.    GateInfo CGateInfo <?>
  47.    ;-- Game State ---
  48.    GameState dd ?
  49.    ;-- Back Buffer
  50.    hBackDc     dd ?
  51.    hBackBmp    dd ?
  52.    hBigFont    dd ?
  53.    hSmallFont  dd ?
  54.    ;-- Map Images 
  55.    hImagesBmp    dd ?
  56.    hImagesDc     dd ?
  57.    ;--- Map Mask Images
  58.    hImagesMaskBmp dd ?
  59.    hImagesMaskDc  dd ?
  60.    ;-- Actor Images 
  61.    hActorDc  dd ?
  62.    hActorBmp dd ? 
  63.    ;-- Actor Mask Images
  64.    hActorMaskDc  dd ?
  65.    hActorMaskBmp dd ?
  66.    
  67.    ;--- Calc Frame Peer Second
  68.    FrameCount  dd ?
  69.    TimeLamp1   dd ?
  70.    szFpsBuffer    db 256 dup(?)
  71.    
  72.    ;-- sence background movie control
  73.    TimeBackMovieLamp  dd ?
  74.    CurrentBack        dd ?
  75.    
  76.    ;-- sence control
  77.    x_Detail dd ?
  78.    x_Index  dd ?
  79.    x_nPos   dd ?
  80.    
  81. .code
  82. start:
  83. invoke GetModuleHandle,NULL
  84. mov    hInstance,eax
  85. invoke GetCommandLine
  86. invoke InitCommonControls
  87. invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
  88. invoke ExitProcess,eax
  89. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
  90. LOCAL bQuit :DWORD
  91.  
  92. LOCAL wc:WNDCLASSEX
  93. LOCAL msg:MSG
  94. mov wc.cbSize,SIZEOF WNDCLASSEX
  95. mov wc.style,CS_HREDRAW or CS_VREDRAW
  96. mov wc.lpfnWndProc,OFFSET WndProc
  97. mov wc.cbClsExtra,NULL
  98. mov wc.cbWndExtra,DLGWINDOWEXTRA
  99. push hInst
  100. pop wc.hInstance
  101. mov wc.hbrBackground,COLOR_BTNFACE+1
  102. mov wc.lpszMenuName,OFFSET MenuName
  103. mov wc.lpszClassName,OFFSET ClassName
  104. invoke LoadIcon,NULL,IDI_APPLICATION
  105. mov wc.hIcon,eax
  106. mov wc.hIconSm,eax
  107. invoke LoadCursor,NULL,IDC_ARROW
  108. mov wc.hCursor,eax
  109.     invoke RtlZeroMemory,Addr Sprite,SizeOf(CSprite)
  110. invoke RegisterClassEx,addr wc
  111. invoke CreateDialogParam,hInstance,addr DlgName,NULL,addr WndProc,NULL
  112. mov hWnd,eax
  113. invoke ShowWindow,hWnd,SW_SHOWNORMAL
  114. invoke UpdateWindow,hWnd
  115. invoke InitApp
  116. mov bQuit ,FALSE 
  117. .while !(bQuit)
  118.     invoke PeekMessage,addr msg,NULL,0,0,PM_REMOVE
  119.     .if (eax)
  120.        .if (msg.message == WM_QUIT )
  121.           mov bQuit ,TRUE  
  122.        .else
  123.               invoke TranslateMessage,addr msg
  124.               invoke DispatchMessage,addr msg
  125.            .endif   
  126.     .else
  127.         ; Game Loop
  128.         .if (bActive)
  129.                invoke GameLoop
  130.             .else
  131.                invoke WaitMessage
  132.             .endif       
  133.     .endif        
  134. .endw
  135. invoke FreeRes
  136. mov eax,msg.wParam
  137. ret
  138. WinMain endp
  139. WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  140. mov eax,uMsg
  141. .if eax==WM_INITDIALOG
  142.     push hWin
  143.     pop  hWnd
  144.         invoke GetDC,hWin
  145.         mov hDc,eax 
  146.         invoke LoadRes
  147.         invoke SelectGate,1
  148. push TRUE 
  149. pop  bActive 
  150. .elseif eax==WM_COMMAND
  151. mov eax,wParam
  152. and eax,0FFFFh
  153. .if eax==IDM_FILE_EXIT
  154. invoke SendMessage,hWin,WM_CLOSE,0,0
  155. .elseif eax==IDM_HELP_ABOUT
  156. invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
  157. .endif
  158. ; .elseif eax==WM_SIZE
  159. .elseif eax==WM_CLOSE
  160.     push   FALSE 
  161.     pop    bActive
  162.     invoke ReleaseDC,hWin,hDc
  163. invoke DestroyWindow,hWin
  164. .elseif uMsg==WM_DESTROY
  165. invoke PostQuitMessage,NULL
  166. .else
  167. invoke DefWindowProc,hWin,uMsg,wParam,lParam
  168. ret
  169. .endif
  170. xor    eax,eax
  171. ret
  172. WndProc endp
  173. GameLoop proc 
  174.   .if GameState != GS_GAMEOVER  
  175.      invoke KeyProc
  176.      invoke CheckDrop
  177.      invoke UpdateWnd
  178.      invoke CheckGameOver
  179.   .endif
  180.   
  181.   invoke Flip
  182.   invoke CalcFps
  183.   ret
  184. GameLoop endp
  185. LoadRes proc
  186. LOCAL lf:LOGFONT
  187.   ; Create BackBuffer
  188.   invoke CreateCompatibleBitmap,hDc,17*32,12*32
  189.   mov hBackBmp,eax
  190.   
  191.   invoke CreateCompatibleDC,hDc
  192.   mov  hBackDc,eax
  193.   
  194.   invoke SelectObject,hBackDc,hBackBmp  
  195.   ;invoke SetTextColor,hBackDc,0h
  196.   invoke SetBkMode,hBackDc,TRANSPARENT
  197.   
  198.   invoke RtlZeroMemory,Addr lf,SizeOf(LOGFONT)
  199.   mov lf.lfHeight ,20
  200.   mov lf.lfWidth ,12
  201.   mov lf.lfWeight ,500
  202.   ;invoke lstrcpy,Addr lf.lfFaceName,Addr SmallFontName
  203.   invoke CreateFontIndirect,Addr lf
  204.   mov hBigFont,eax
  205.   mov lf.lfHeight ,15
  206.   mov lf.lfWidth,10
  207.   invoke CreateFontIndirect,Addr lf
  208.   mov hSmallFont,eax
  209.   invoke SelectObject,hBackDc,hSmallFont
  210.   invoke DeleteObject,eax
  211.   ; Create Map Images Buffer
  212.   invoke LoadBitmap,hInstance,BM_IMAGES
  213.   mov hImagesBmp,eax
  214.     
  215.   invoke CreateCompatibleDC,hDc
  216.   mov  hImagesDc,eax
  217.   
  218.   invoke SelectObject,hImagesDc,hImagesBmp
  219.   ; Create Map Mask Buffer
  220.   invoke CreateCompatibleDC,hDc
  221.   mov hImagesMaskDc,eax
  222.   
  223.   invoke LoadBitmap,hInstance,BM_IMAGES_MASK
  224.   mov hImagesMaskBmp,eax
  225.   
  226.   invoke SelectObject,hImagesMaskDc,hImagesMaskBmp
  227.   
  228.   ; Create Actor Buffer
  229.   invoke CreateCompatibleDC,hDc
  230.   mov hActorDc,eax
  231.   invoke LoadBitmap,hInstance,BM_ACTOR
  232.   mov hActorBmp ,eax
  233.   invoke SelectObject,hActorDc,hActorBmp
  234.   
  235.   ; Create Actor Mask Buffer 
  236.   invoke CreateCompatibleDC,hDc
  237.   mov hActorMaskDc,eax
  238.   invoke LoadBitmap,hInstance,BM_ACTOR_MASK
  239.   mov hActorMaskBmp,eax
  240.   invoke SelectObject,hActorMaskDc,hActorMaskBmp
  241.   
  242.   push 0
  243.   pop  FrameCount
  244.   invoke GetTickCount
  245.   mov TimeLamp1,eax
  246.   mov TimeBackMovieLamp ,eax
  247.   push 0
  248.   pop CurrentBack
  249.   
  250.   mov eax ,0
  251.   mov x_Detail,eax
  252.   mov x_Index,eax
  253.   mov x_nPos,eax
  254.   
  255.   ret
  256. LoadRes endp
  257. FreeRes proc
  258.   invoke DeleteObject,hBigFont
  259.   invoke DeleteObject,hImagesBmp
  260.   invoke DeleteObject,hBackBmp
  261.   invoke DeleteObject,hImagesMaskBmp
  262.   invoke DeleteObject,hActorBmp
  263.   invoke DeleteObject,hActorMaskBmp
  264.   
  265.   invoke DeleteDC,hBackDc  
  266.   invoke DeleteDC,hImagesDc
  267.   invoke DeleteDC,hImagesMaskDc
  268.   invoke DeleteDC,hActorDc
  269.   invoke DeleteDC,hActorMaskDc
  270.   ret
  271. FreeRes endp
  272. KeyProc proc
  273.     
  274.   invoke GetAsyncKeyState,27
  275.   .if eax >80000000h
  276.       invoke SendMessage,hWnd,WM_CLOSE,0,0
  277.   .endif  
  278.   
  279.   invoke GetAsyncKeyState,'W' ; Up
  280.   .if eax > 80000000h  ; Key Down
  281.      ; invoke MessageBox,hWnd,Addr szMessage,addr AppName,MB_OK
  282.       push TRUE 
  283.       pop  KeyState.bKeyWDown
  284.   .else
  285.       .if KeyState.bKeyWDown
  286.          invoke MessageBox,hWnd,Addr szKeyUp,addr AppName,MB_OK
  287.          push FALSE 
  288.          pop  KeyState.bKeyWDown
  289.       .endif
  290.   .endif
  291.   
  292.   invoke GetAsyncKeyState,'S'
  293.   .if eax > 80000000h
  294.       invoke MessageBox,hWnd,Addr szMessage,Addr AppName,MB_OK
  295.   .endif
  296.   
  297.   invoke GetAsyncKeyState,'A'  ; left
  298.   .if eax > 80000000h
  299.       invoke CanMoveLeft
  300.       .if eax
  301.          invoke SpriteMoveLeft
  302.       .endif
  303.       push TRUE 
  304.       pop  KeyState.bKeyADown
  305.   .else
  306.      .if KeyState.bKeyADown
  307.         push 5
  308.         pop  Sprite.Frame
  309.         push FALSE
  310.         pop  KeyState.bKeyADown
  311.       .endif
  312.   .endif
  313.   
  314.   invoke GetAsyncKeyState,'D'  ; Right
  315.   .if eax > 80000000h
  316.       invoke CanMoveRight
  317.       .if eax
  318.          invoke SpriteMoveRight
  319.       .endif
  320.       push TRUE 
  321.       pop  KeyState.bKeyDDown
  322.   .else
  323.      .if KeyState.bKeyDDown
  324.          push 0 
  325.          pop  Sprite.Frame
  326.          push FALSE 
  327.          pop  KeyState.bKeyDDown
  328.      .endif
  329.   .endif
  330.   
  331.   invoke GetAsyncKeyState,'J' ; Jump
  332.   .if eax > 80000000h
  333.       ; Key Down
  334.       .if !KeyState.bKeyJDown 
  335.           .if Sprite.bOnLine 
  336.              invoke GetTickCount
  337.              mov Sprite.JumpTimeLamp,eax
  338.              push  Sprite.y
  339.              pop   Sprite.JumpBaseY
  340.              ;invoke MessageBox,hWnd,Addr AppName,Addr AppName,MB_OK
  341.           .endif
  342.       .endif
  343.       invoke JumpProc
  344.       push TRUE 
  345.       pop  KeyState.bKeyJDown
  346.   .else
  347.       .if KeyState.bKeyJDown ;-- Key Up
  348.           
  349.           push FALSE
  350.           pop  KeyState.bKeyJDown
  351.       .endif
  352.   .endif
  353.  
  354.   invoke GetAsyncKeyState,'K'
  355.   .if eax > 80000000h
  356.       invoke MessageBox,hWnd,Addr szMessage,Addr AppName,MB_OK
  357.   .endif
  358.   
  359.   invoke GetAsyncKeyState,VK_CONTROL ; Turbo
  360.   .if eax > 80000000h
  361.       push ACTOR_HIGH_SPEED
  362.       pop  Sprite.Speed
  363.   .else
  364.       push ACTOR_LOW_SPEED
  365.       pop  Sprite.Speed
  366.   .endif
  367.   
  368.   ret
  369. KeyProc endp
  370. SpriteMoveLeft proc
  371.    .if Sprite.x >0
  372.        mov eax,Sprite.x_Detail
  373.        sub eax,Sprite.Speed
  374.        mov Sprite.x_Detail,eax
  375.        cmp eax,0
  376.        jg @@Other 
  377.        ;Sprite.x_Detail <0
  378.          add Sprite.x_Detail,32
  379.          dec Sprite.x
  380.       @@Other: 
  381.          ;Sprite.x_Detail >0
  382.        
  383.    .else
  384.       mov eax,Sprite.x_Detail
  385.       sub eax,Sprite.Speed
  386.       mov Sprite.x_Detail,eax
  387.       cmp eax,0
  388.       jg @@NotDo
  389.          ; Sprite.x_Detail <0
  390.          push 0
  391.          pop  Sprite.x_Detail
  392.      @@NotDo:
  393.    .endif
  394.     
  395.    mov eax,Sprite.x
  396.    sub eax,x_Index
  397.    .if eax <7   
  398.       .if x_Index > 0 ; Left Scroll Background
  399.           mov eax,x_Detail
  400.           sub eax ,Sprite.Speed
  401.           mov x_Detail,eax
  402.           cmp eax,0  
  403.           jg @@1 
  404.               ; x_Detail <0
  405.               sub x_nPos ,12
  406.               dec x_Index
  407.               mov ebx ,x_Detail
  408.               not ebx
  409.               inc ebx
  410.               mov eax,32
  411.               sub eax,ebx
  412.               mov x_Detail,eax
  413.           @@1:
  414.       .elseif x_Index == 0
  415.          .if x_Detail > 0 
  416.              mov eax, x_Detail
  417.              sub eax ,Sprite.Speed
  418.              mov x_Detail,eax
  419.          .endif
  420.       .endif    
  421.    .endif    
  422.   
  423.   .if Sprite.bOnLine 
  424.      invoke CanFrameMovie
  425.      .if eax    
  426.         mov eax,Sprite.Frame
  427.         inc eax
  428.         .if (eax >8) || (eax <4)
  429.              mov eax,5
  430.         .endif  
  431.         mov Sprite.Frame,eax
  432.       .endif
  433.   .else
  434.      push 9
  435.      pop  Sprite.Frame
  436.   .endif
  437.   ret
  438. SpriteMoveLeft endp
  439. SpriteMoveRight proc
  440.   .if Sprite.x < 44 ; Not the Last screen 
  441.      mov eax,Sprite.x_Detail
  442.      add eax,Sprite.Speed
  443.      mov Sprite.x_Detail,eax
  444.      .if eax > 31
  445.          inc Sprite.x
  446.          sub Sprite.x_Detail ,32
  447.      .endif
  448.      .else
  449.          push 0
  450.          pop  Sprite.x_Detail
  451.      .endif
  452.       
  453.      mov eax,Sprite.x
  454.      sub eax,x_Index
  455.      .if eax > 10 ; 17 -7
  456.          mov eax , GateInfo.DataLen
  457.          sub eax ,12*17
  458.         .if x_nPos < eax ; Right Scroll Background
  459.            mov eax , x_Detail
  460.            add eax , Sprite.Speed
  461.            mov x_Detail ,eax
  462.            .if eax > 31 
  463.               add x_nPos ,12
  464.               inc x_Index
  465.               mov eax ,x_Detail
  466.               sub eax,32
  467.               mov x_Detail,eax
  468.            .endif
  469.       .endif  
  470.       
  471.   .endif  
  472.   
  473.   .if Sprite.bOnLine
  474.       invoke CanFrameMovie
  475.       .if eax
  476.           mov eax,Sprite.Frame
  477.           inc eax
  478.          .if eax >3
  479.                mov eax,0
  480.          .endif  
  481.           mov Sprite.Frame,eax
  482.       .endif
  483.   .else
  484.       push 4
  485.       pop  Sprite.Frame
  486.   .endif
  487.   ret
  488. SpriteMoveRight endp
  489. CanMoveLeft proc
  490. ; check Sprite can move left    
  491. LOCAL x1:DWORD
  492. LOCAL y1:DWORD
  493. LOCAL n1:DWORD
  494. LOCAL n2:DWORD
  495.   .if Sprite.x_Detail != 0 
  496.       mov eax ,TRUE 
  497.   .else 
  498.      ; Sprite.x_Detail == 0
  499.      .if Sprite.x == 0 
  500.          mov eax ,FALSE 
  501.      .else
  502.         ; Sprite.x != 0
  503.         mov eax,Sprite.x
  504.         dec eax
  505.         mov x1,eax
  506.         mov eax,Sprite.y
  507.         mov y1,eax
  508.         invoke ReadMapXY,x1,y1
  509.         mov n1,eax
  510.         inc y1
  511.         invoke ReadMapXY,x1,y1
  512.         mov n2,eax
  513.         .if (n1!=MAP_BRICK)&& (n1!= MAP_BRICK1)
  514.             .if Sprite.y_Detail == 0
  515.                 mov eax ,TRUE 
  516.             .else
  517.                 .if (n2!=MAP_BRICK)&&(n2!=MAP_BRICK1)
  518.                     mov eax ,TRUE 
  519.                 .else
  520.                     mov eax,FALSE 
  521.                 .endif
  522.             .endif
  523.         .else
  524.            mov eax ,FALSE 
  525.         .endif
  526.    
  527.      .endif
  528.   .endif
  529.   
  530.   ret
  531. CanMoveLeft endp
  532. CanMoveRight proc
  533. ; check Sprite can move right
  534. LOCAL x1:DWORD
  535. LOCAL y1:DWORD
  536. LOCAL n1:DWORD
  537. LOCAL n2:DWORD
  538.   .if Sprite.x_Detail != 0 
  539.       mov eax ,TRUE ; can MoveRight
  540.   .else
  541.      mov eax,Sprite.x
  542.      inc eax
  543.      mov x1,eax
  544.      push Sprite.y
  545.      pop y1
  546.      invoke ReadMapXY,x1,y1
  547.      mov n1,eax
  548.      inc y1
  549.      invoke ReadMapXY,x1,y1
  550.      mov n2,eax
  551.      .if Sprite.y_Detail != 0 
  552.          .if (n1!=MAP_BRICK)&& (n1!= MAP_BRICK1)
  553.              .if (n2!= MAP_BRICK)&&(n2!= MAP_BRICK1)
  554.                  mov eax,TRUE 
  555.              .else
  556.                  mov eax,FALSE 
  557.              .endif
  558.          .else
  559.              mov eax,FALSE 
  560.          .endif
  561.      .else
  562.         ;-- Sprite.y_Detail == 0
  563.         .if (n1!= MAP_BRICK)&&(n1!=MAP_BRICK1)
  564.             mov eax ,TRUE 
  565.         .else
  566.             mov eax, FALSE 
  567.         .endif
  568.      .endif
  569.   .endif
  570.   ret
  571. CanMoveRight endp
  572. JumpProc proc
  573. LOCAL dwTime:DWORD
  574.   invoke GetTickCount
  575.   mov dwTime,eax
  576.   sub eax,Sprite.JumpTimeLamp
  577.   .if eax < JUMP_MAX_TIME
  578.   sub Sprite.y_Detail ,ACTOR_JUMP_SPEED
  579.   cmp Sprite.y_Detail,0
  580.   jg @@1
  581.   dec Sprite.y
  582.   add Sprite.y_Detail,32
  583. @@1:
  584.   .endif
  585. ;  mov eax,Sprite.y
  586. ;  sub eax,Sprite.JumpBaseY
  587. ;  .if eax< MAX_JUMP_HEIGHT 
  588. ;  .endif  
  589.   
  590.   
  591.   ret
  592. JumpProc endp
  593. InitApp proc
  594.     
  595.   invoke SendDlgItemMessage,hWnd,IDC_SBR1,SB_SETPARTS,STBAR_GRIDS,Addr Stbar_Parts
  596.   invoke SendDlgItemMessage,hWnd,IDC_SBR1,SB_SETTEXT,0,Addr AppName
  597.   ret
  598. InitApp endp
  599. UpdateWnd proc
  600. LOCAL x:DWORD
  601. LOCAL y:DWORD
  602. ;LOCAL dwTime:DWORD
  603. LOCAL x1:DWORD
  604.   
  605.   push esi
  606.   ; Draw Map
  607.   mov esi ,GateInfo.BaseAddress
  608.   add esi,x_nPos
  609.   mov eax,0
  610.   sub eax,x_Detail
  611.   mov x,eax  ; x = - x_Detail
  612.   
  613. @@1:
  614.   mov y,0
  615. @@2:
  616.   xor eax,eax
  617.   mov al,[esi]
  618.   inc esi
  619.   shl eax,5
  620.   mov x1,eax
  621.   invoke BitBlt,hBackDc,x,y,32,32,hImagesDc,x1,0,SRCCOPY
  622.   add y,32
  623.   cmp y,12*32
  624.   jb @@2
  625.   
  626.   add x,32
  627.   cmp x,17*32
  628.   jb @@1
  629.     
  630.   ; Draw Man 
  631.   ; Screen x = (Sprite.x - x_Index )*32 - x_Detail + Sprite.x_Detail
  632.   mov eax,Sprite.x
  633.   sub eax,x_Index
  634.   shl eax ,5  ; eax = eax *32
  635.   sub eax,x_Detail
  636.   add eax,Sprite.x_Detail ; Screen x
  637.   mov x,eax
  638.   ; Screen y = Sprite.y *32 + Sprite.y_Detail
  639.   mov eax,Sprite.y
  640.   shl eax,5
  641.   add eax,Sprite.y_Detail
  642.   mov y,eax
  643.   
  644.   mov eax,Sprite.Frame
  645.   shl eax,5
  646.   mov x1,eax
  647.   
  648.   ;invoke BitBlt,hBackDc,x,y,32,32,hActorDc,x1,0,SRCINVERT
  649.   invoke BitBlt,hBackDc,x,y,32,32,hActorMaskDc,x1,0,SRCAND
  650.   invoke BitBlt,hBackDc,x,y,32,32,hActorDc,x1,0,SRCPAINT
  651.   
  652.   ;invoke BitBlt,hBackDc,x,y,32,32,hImagesMaskDc,7*32,0,SRCAND
  653.   ;invoke BitBlt,hBackDc,x,y,32,32,hImagesDc,7*32,0,SRCPAINT
  654.   
  655.   invoke TextOut,hBackDc,10,10,Addr AppName,5
  656.   pop esi
  657.   
  658.   ret
  659. UpdateWnd endp
  660. Flip proc
  661.     
  662.   invoke BitBlt,hDc,LEFT_MARGIN,TOP_MARGIN,17*32,12*32,hBackDc,0,0,SRCCOPY  
  663.   ret
  664. Flip endp
  665. SelectGate proc iGate:DWORD
  666. LOCAL nPos :DWORD
  667.   ; Load Gate information
  668.   mov eax,offset Gates
  669.   mov GateInfo.BaseAddress,eax
  670.   push 45  ; width 45
  671.   pop  GateInfo.dwWidth
  672.   push 12*45
  673.   pop  GateInfo.DataLen
  674.   push iGate
  675.   pop  GateInfo.Num
  676.   ; refresh Gate information
  677.   push esi
  678.   mov esi,GateInfo.BaseAddress
  679.   mov nPos ,-1
  680. @@1:
  681.   mov al,[esi]
  682.   inc esi
  683.   inc nPos  
  684.   cmp al,MAP_MAN
  685.   jnz @@1
  686. @@2:  
  687.   dec esi
  688.   mov Byte ptr [esi],MAP_EMPTY
  689.   xor edx,edx
  690.   mov eax,nPos
  691.   mov ebx ,12
  692.   div ebx
  693.   mov Sprite.x,eax
  694.   mov Sprite.y,edx
  695.   
  696.   ;invoke wsprintf,Addr szFpsBuffer,Addr FpsFmtStr,Sprite.y
  697.   ;invoke MessageBox,hWnd,Addr szFpsBuffer,Addr FpsFmtStr,MB_OK
  698.   
  699.   push GS_STARTGAME
  700.   pop  GameState
  701.   
  702.   mov eax ,0
  703.   mov Sprite.x_Detail,eax
  704.   mov Sprite.y_Detail,eax
  705.   
  706.   mov x_Detail,eax
  707.   mov x_Index,eax
  708.   
  709.   push ACTOR_LOW_SPEED
  710.   pop  Sprite.Speed
  711.   
  712.   invoke RtlZeroMemory,Addr KeyState ,SizeOf(CKeyState)
  713.   pop esi
  714.   ret
  715. SelectGate endp
  716. ReadMapXY proc x:DWORD,y:DWORD
  717. ; return the (x,y) MapData
  718.   push esi
  719.   mov eax ,y
  720.   cmp eax,0
  721.   jl @@1
  722.     ; eax > 0
  723.     mov esi, GateInfo.BaseAddress  
  724.     xor edx,edx
  725.     mov eax,x
  726.     mov ebx,12
  727.     mul ebx 
  728.     add eax,y ; x*12+ y
  729.     add esi,eax 
  730.     xor eax,eax
  731.     mov al,byte ptr [esi] 
  732.     jmp @@2
  733. @@1:
  734.     ; -- eax <0
  735.     mov eax,0FFh
  736. @@2:  
  737.   pop  esi
  738.   ret
  739. ReadMapXY endp
  740. CheckDrop proc
  741. LOCAL y1:DWORD
  742. LOCAL x1:DWORD
  743.    push FALSE 
  744.    pop  Sprite.bOnLine    
  745.    
  746.   .if Sprite.y_Detail != 0
  747.       add Sprite.y_Detail,ACTOR_DROP_SPEED
  748.   .else ; Sprite.y_Detail == 0
  749.       mov eax ,Sprite.y
  750.       inc eax
  751.       mov y1,eax
  752.       invoke ReadMapXY,Sprite.x,y1
  753.       .if (al!= MAP_BRICK)&& (al!= MAP_BRICK1)
  754.          ; Drop
  755.          .if Sprite.x_Detail != 0 
  756.              mov eax ,Sprite.x
  757.              inc eax
  758.              mov x1,eax
  759.              invoke ReadMapXY,x1,y1
  760.              .if (al!= MAP_BRICK)&&(al!= MAP_BRICK1)
  761.                  add Sprite.y_Detail ,ACTOR_DROP_SPEED
  762.              .endif
  763.          .else
  764.              add Sprite.y_Detail,ACTOR_DROP_SPEED
  765.          .endif
  766.       .else ;-- al = MAP_BRICK
  767.           push TRUE 
  768.           pop  Sprite.bOnLine
  769.       .endif
  770.   .endif
  771.   .if Sprite.y_Detail >= 32
  772.       inc Sprite.y
  773.       sub Sprite.y_Detail,32
  774.   .endif
  775.            
  776.   ret
  777. CheckDrop endp
  778. CheckGameOver proc
  779. ; Set the Game State    
  780.    cmp Sprite.y,0
  781.    jl @Exit
  782.    ;  Sprite.y > 0
  783.    .if Sprite.y >11
  784.        push  GS_GAMEOVER
  785.        pop   GameState 
  786.    .endif    
  787. @Exit:  
  788.    ret
  789. CheckGameOver endp
  790. CalcFps proc
  791. LOCAL dwDetal :DWORD
  792. LOCAL dwTime :DWORD
  793.   add FrameCount ,1
  794.   invoke GetTickCount
  795.   mov dwTime,eax
  796.   sub eax,TimeLamp1
  797.   mov dwDetal,eax
  798.   .if eax > 1000
  799.       xor edx,edx
  800.       mov eax,FrameCount
  801.       div dwDetal
  802.       invoke wsprintf,Addr szFpsBuffer,Addr FpsFmtStr,edx
  803.       invoke SendDlgItemMessage,hWnd,IDC_SBR1,SB_SETTEXT,0,addr szFpsBuffer
  804.       push 0 
  805.       pop  FrameCount
  806.       push dwTime
  807.       pop  TimeLamp1
  808.   .endif
  809.   
  810.   ret
  811. CalcFps endp
  812. CanFrameMovie proc 
  813. LOCAL dwTime:DWORD
  814.   invoke GetTickCount
  815.   mov dwTime,eax
  816.   sub eax, Sprite.FrameTimeLamp
  817.   .if eax > FRAME_MOVIE_INTERVAL ; if dwTime - FrameTimeLamp > FRAME_MOVIE_INTERVAL
  818.       mov eax,dwTime
  819.       mov Sprite.FrameTimeLamp,eax
  820.       mov eax,TRUE 
  821.   .else
  822.       mov eax,FALSE 
  823.   .endif
  824.   
  825.   ret
  826. CanFrameMovie endp
  827. end start