From f23bb705b7be0c70598f97df4a7956c45f9bf893 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 12 Jun 2024 19:10:05 +0100 Subject: [PATCH] Games: Locale comments for `Megamaze` - Add locale related comments for Megamaze. - Some whitespace cleanup. --- programs/games/megamaze/trunk/megamaze.asm | 1724 ++++++++++---------- programs/games/megamaze/trunk/wriggle.inc | 2 + 2 files changed, 869 insertions(+), 857 deletions(-) diff --git a/programs/games/megamaze/trunk/megamaze.asm b/programs/games/megamaze/trunk/megamaze.asm index 7b3a1aa614..0fc6967812 100644 --- a/programs/games/megamaze/trunk/megamaze.asm +++ b/programs/games/megamaze/trunk/megamaze.asm @@ -1,857 +1,867 @@ -IDA equ 1 ; We're running debugida.exe - -STRIP equ 40 -LEVNUM equ 500 - XFOFS equ 10 - YFOFS equ 55 - MSGXO equ 32 -GAMES_ALL equ 12 -WNDCOLOR equ 0x13c0c0c0;0x13f6f6f6; -MINCS equ 40 -MAXCS equ 80 -macro icall lbl -{ - call [lbl+ebp*4] -} - - use32 - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd run ; start of code - dd I_END ; size of image - dd end_mem ; memory for app - dd stack_end ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon -lang fix ru_RU -include "macros.inc" -purge mov -;include "../../../debug.inc" -COLOR_ORDER equ MENUETOS - -include 'gif_lite.inc' - -include 'tam.inc' -include 'smz.inc' -include 'tilt.inc' -include 'tilt2.inc' -include 'fhouse.inc' -include 'loops.inc' -include 'wriggle.inc' -include 'blackbox.inc' -include 'marble.inc' -include 'cstep.inc' -include 'orient.inc' -include 'nolt.inc' -include 'colzone.inc' - -run: - mov [Ces],STRIP;20 - mcall 3 - mov cl,16 - ror eax,cl - mov [generator],eax ; random generator from Tetris - - and [mpress_flag],0 - and [gif_unp],0 - xor ebp,ebp ; game_t -; mov ebp,10 - mcall 64,1,end_mem - mov [pause_time],40 - call resize - .game1: - mov [levnum],LEVNUM - .game: - and [win_flag],0 - and [drag_flag],0 - mov ecx,[levnum] - mov esi,[levels+ebp*4] - jecxz .skip - .nxt: - movzx eax,byte[esi] - add esi,eax - xor eax,eax - cmp al,byte[esi] - jne .noz - mov esi,LEVNUM;500 - sub esi,ecx - mov [levcount],esi - and [levnum],0 - jmp .game - .noz: - loop .nxt - .skip: - mcall 40,111b - mov [mouse_processed],1 - xor eax,eax - icall prepare_level -wnd_size: - mov eax,[Ces] - shr eax,2 - sub eax,2 - mov [sq_size],eax - if ~ IDA eq 1 - mov edx,[fx] - imul edx,[Ces] - add edx,XFOFS*2+20 - mov esi,[fy] - imul esi,[Ces] - add esi,YFOFS+30 - mov ecx,-1 - mcall 67,ecx - end if -red: - call draw_window - -drw: - call drwfld - -still: - mcall 2 - test al,al - jz still - mcall 10 - cmp eax,2 - je key - cmp eax,1 ; redraw request ? - je red - cmp eax,3 ; button in buffer ? - je button - cmp eax,6 ; mouse event ? - je mouse -key: - mcall 2 -; movzx ebx,ah -; dpd ebx - cmp ebp,10 - je .noplus - mov ebx,5 - cmp ah,184 - jne .nomin - cmp [Ces],MINCS - je still - .ces: - sub [Ces],ebx - call resize - jmp wnd_size - .nomin: - cmp ah,183 - jne .noplus - cmp [Ces],MAXCS - je still - neg ebx - jmp .ces - .noplus: - cmp ah,'h' - jne .nohlp -; if IDA eq 1 -; cmp [child],0 -; jne still -; else - call kill_help -; end if - mov [pack],ebp - mcall 51,1,show_help,chs_end -; dpd eax - mov [child],eax - jmp still - .nohlp: - cmp [win_flag],10 - je .levover - cmp [win_flag],2 - je .no_win - cmp [win_flag],1 - jne .now - .levover: - call lev_next - .no_win: - and [win_flag],al - jmp run.game - .now: - shr eax,8 - mov [jump],drw;red - cmp eax,13 - je run.game - icall key_handler - jmp [jump] - -button: - mcall 17 - cmp ah,1 - je close - cmp ah,2 - je .game_type - cmp ah,4 - je .inclev - cmp ah,3 - je .declev - jmp still - .declev: - dec [levnum] - cmp [levnum],0 - jge run.game - push [levcount] - pop [levnum] - jmp run.game - .inclev: - call lev_next - jmp run.game - .game_type: - inc ebp - cmp ebp,GAMES_ALL - jbe run.game1 - xor ebp,ebp - jmp run.game1 - close: - if ~ IDA eq 1 - call kill_help - end if - mcall -1 - -;if ~ IDA eq 1 - -kill_help: - mcall 9,prc_info2,-1 - mov edx,[child] - mov ecx,eax - .lp: - mcall 9 - cmp edx,[ebx+30] - jne .nochild - mcall 18,2 - and [child],0 - ret - .nochild: - loop .lp - ret - -;end if - -mouse: - cmp [mouse_processed],1 - jne .ex - mcall 37,1 - sub eax,XFOFS shl 16+YFOFS - xor edx,edx - mov ebx,[Ces] - mov ecx,eax - and eax,0xffff - div ebx - xor edx,edx - mov [mouse_y],eax - cmp eax,[fy] - jae .ex - mov eax,ecx - shr eax,16 - div ebx - mov [mouse_x],eax - cmp eax,[fx] - jae .ex - mcall 37,2 ; get buttons - cmp [drag_flag],0 - je .nodrag - mov ebx,eax - cmp eax,[mpress_flag] - mov eax,-1 - je .nochg - dec eax - .nochg: - mov [mpress_flag],ebx - jmp .call_hnd - .nodrag: - test eax,eax - jz .ex1 - cmp eax,[mpress_flag] - je .ex - mov [mpress_flag],eax - mov eax,-1 - .call_hnd: - mov [mouse_processed],0 - icall key_handler - jmp [jump] - .ex1: - mov [mpress_flag],0 - .ex: - jmp still - -lev_next: - push eax - inc [levnum] - mov eax,[levnum] - cmp eax,[levcount] - jbe .ex - and [levnum],0 - .ex: - pop eax - ret -;--------------------------------------------------------------------- -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* -draw_window: - pusha - mcall 12,1 - mov ebx,[fx] - imul ebx,[Ces] - push ebx - add ebx,50 shl 16+XFOFS*2+20 - mov ecx,[fy] - imul ecx,[Ces] - add ecx,10 shl 16+YFOFS+30 - mov edx, WNDCOLOR - mov edi, header - mcall 0 - - mov esi, edx - and esi,0xffffff - mcall 9,prc_info,-1 - pop ebx - - mov eax,[prc_info+70] ;status of window - test eax,100b - jne .end - - add ebx,XFOFS shl 16 - - mcall 8,,<25,12>,2 - - mcall 8,,<40,12>,3 - add ebx,13 shl 16 - inc edx - mcall - - mov ecx,ebp - mov edx,game_names+4 - call get_mstr - mcall 4,,0x8000 - imul esi,6 - add esi,3 - shl esi,16 - lea edx,[ebx+esi] - mcall 47,0x020001,levnum,,0x8000 - - mcall 4,,0x108000,next_msg,3 -.end: - mcall 12,2 - popa - ret -;--------------------------------------------------------------------- -unpack_level: - mov ecx,[cell_count] - mov edi,field - .lp: - movzx eax,byte[esi] - inc esi - shl ax,4 - shr al,4 - stosw - loop .lp - ret -;--------------------------------------------------------------------- -get_xy: -; eax-coord -; out: [lx]-[x+2][CS-4],[ly]-[y+2][CS-4] - pusha - xor edx,edx - mov esi,[sq_size] - lea edi,[esi*2] - neg edi - add edi,[Ces] - mov [lx],edi - mov [ly],edi - mov ebx,[fx] - div bx - imul eax,[Ces] - imul edx,[Ces] - lea edx,[edx+XFOFS+esi] - lea eax,[eax+YFOFS+esi] - mov word[ly+2],ax - mov word[lx+2],dx - popa - ret - -check_move: -; eax-coord, ebx-direction -; CF=0 if move is valid - bt dword[field+eax],ebx - ret - -delay: - pusha - mcall 5,[pause_time] - popa - ret - -get_mstr: -; in: edx,ecx -; out: edx,esi - mov esi,[edx-4] - jecxz .ex - lea edx,[edx+esi+4] - dec ecx - jmp get_mstr - .ex: - ret - -maze_field: - mov edi,field - mov [ly],YFOFS shl 16+YFOFS - mov eax,38 - mov ecx,[fy] - .lp1: - push ecx - mov [lx],XFOFS shl 16+XFOFS - mov ecx,[fx] - .lp2: - push ecx - xor esi,esi - .lp3: - mov edx,0xd0d0d0 - bt dword[edi],esi - jnc .gray - mov edx,0 - .gray: - mov ebx,[lx] - add ebx,[dir_ofs+esi*4] - mov ecx,[ly] - add ecx,[dir_ofs+esi*4+8] - mcall - inc esi - cmp esi,4 - jb .lp3 - inc edi - mov ecx,[Ces] - add word[lx],cx - add word[lx+2],cx - pop ecx - loop .lp2 - mov ecx,[Ces] - add word[ly],cx - add word[ly+2],cx - pop ecx - loop .lp1 - ret - -grid_field: - mov edx,0xa0a0a0 - mov eax,38 - - mov ecx,[fy] - mov ebx,[fx] - imul ebx,[Ces] - add ebx,XFOFS shl 16+XFOFS - mov esi,YFOFS shl 16+YFOFS - inc ecx - .lp1: - push ecx - mov ecx,esi - mcall - mov ecx,[Ces] - add esi,ecx - shl ecx,16 - add esi,ecx - pop ecx - loop .lp1 - - mov ecx,[fx] - mov esi,[fy] - imul esi,[Ces] - add esi,YFOFS shl 16+YFOFS - mov ebx,XFOFS shl 16+XFOFS - inc ecx - .lp2: - push ecx - mov ecx,esi - mcall - mov ecx,[Ces] - add ebx,ecx - shl ecx,16 - add ebx,ecx - pop ecx - loop .lp2 - ret - -get_xy_sf: - xor eax,eax - and [player],eax - mov [fx],eax - mov [fy],eax - lodsb - lodsb - mov ah,al - shr ah,4 - and al,0xf - mov byte[fx],ah - mov byte[fy],al - lodsb - mov byte[player],al - lodsb - mov byte[finish],al - .count: - mov eax,[fx] - mov [dirs+4],eax - neg eax - mov [dirs+8],eax - mov eax,[fx] - imul eax,[fy] - mov [cell_count],eax - - ret - -get_last_mclick: -; out - eax=0 no click or outside field -; eax>0 button pressed, ebx=[xy] - mov [mouse_processed],1 - mov eax,[mpress_flag] - mov ebx,[mouse_y] - imul ebx,[fx] - add ebx,[mouse_x] - ret - -erase_field: - pusha - mov ecx,[cell_count] - xor eax,eax - mov edi,field - rep stosb - popa - ret - -get_pxy: -; in: [pack] - cell#, out: word[pack] - packed [xy] - pusha - mov eax,[pack] - cdq - mov ebx,[fx] - div ebx - shl edx,8 - add eax,edx - mov [pack],eax - popa - ret - -check_bounds: -; in: eax - cell, ebx - dir -; out: ebx=-1 if bounds crossed - push eax ecx - mov ecx,eax - add ecx,[dirs+ebx*4] - mov ebx,ecx - call get_offset - mov ebx,eax - pop ecx eax - cmp ebx,-1 - ret - -get_offset: -; in: eax - start, ebx-end -; out: eax - dir or -1 if not straight -; ebx - distance - push ecx edx - mov ecx,-1 - mov edx,[cell_count] - cmp eax,edx - jae .ex - cmp ebx,edx - jae .ex - mov [pack],eax - call get_pxy - mov eax,[pack] - mov [pack],ebx - call get_pxy - mov ebx,[pack] - cmp ah,bh ; compare X - jne .noX - mov ecx,1 - sub bl,al - ja .ok - inc ecx - .ok2: - neg bl - jmp .ok - .noX: - cmp al,bl ; compare Y - jne .ex - inc ecx - sub bh,ah - mov bl,bh - jb .ok2 - add ecx,3 - .ok: - movzx ebx,bl - .ex: - mov eax,ecx - pop edx ecx - ret - -show_help: - mov ebp,[pack] - .red: - mcall 12,1 - mov ebx,[prc_info.box.left] - add ebx,[prc_info.box.width] - shl ebx,16 - add ebx,310 - mov ecx,[prc_info.box.top] - shl ecx,16 - add ecx,220 - mcall 0,,,0x03c0c0c0 - mcall 4,<8,8>,0x00ffffff,help_hdr,help_hdr.size - mov ecx,ebp - mov edx,game_names+4 - call get_mstr - sub esi,2 - mcall 4,<6*help_hdr.size+15,8>,0x00ffffff - - mov edx,[help_msg+ebp*4] - add edx,4 - xor ecx,ecx - mov ebx,10 shl 16+30 - .nxt: - mov esi,[edx-4] - jecxz .drw - dec ecx - lea edx,[edx+esi+4] - jmp .nxt - .drw: - cmp esi,-1 - je .edraw - mcall ,,0x000000ff - mov ecx,1 - add ebx,12 - jmp .nxt - .edraw: - mcall 12,2 - .still: - mcall 10 - cmp eax,2 - jne .nokey - mcall - jmp .close - .nokey: - cmp eax,1 ; redraw request ? - je .red - cmp eax,3 ; button in buffer ? - jne .still - mcall 17 - cmp ah,1 - jne .still - .close: - and [child],0 - mcall -1 - -getline: -; in: esi,edi - pusha - mov eax,esi - call get_xy - mov ebx,[lx] - mov ecx,[ly] - mov eax,edi - call get_xy - mov bx,word[lx+2] - mov cx,word[ly+2] - mov eax,[Ces] - shr eax,1 - sub eax,[sq_size] - add ebx,eax - add ecx,eax - shl eax,16 - add ebx,eax - add ecx,eax - mov [lx],ebx - mov [ly],ecx - mcall 38 - popa - ret - -bold_line: - WGSPC equ 1 - pusha - mov edi,WGSPC shl 16+WGSPC - add [lx],edi - add [ly],edi - mcall 38,[lx],[ly] - shl edi,1 - sub ebx,edi - sub ecx,edi - mcall - popa - ret - -get_rnd: - mov eax, [generator] - sub eax,0x43ab45b5 ; next random number - ror eax,1 - xor eax,0x32c4324f - ror eax,1 - mov [generator],eax - ret - -drwfld: - pusha - mov ebx,[fx] - imul ebx,[Ces] - add ebx,XFOFS shl 16 - mov ecx,[fy] - imul ecx,[Ces] - add ecx,YFOFS shl 16 - mcall 13,,,WNDCOLOR - add ebx,26 shl 16-26 - sub ecx,16 shl 16 - mov cx,16 - mcall - icall draw_field - icall draw_more - cmp [win_flag],0 - jz .edraw - movzx ecx,[win_flag] - mov edx,msgs+4 - call get_mstr - mcall 4,,0x100000ff - .edraw: - popa - ret - -resize: - mov eax,[Ces] - mov edi,dir_ofs+4 - stosd - stosd - stosw - stosw - mov [edi+4],eax - ret - -need_image: -; in: eax - gif pointer - cmp [gif_unp],0 - jne .skip - push esi edi - mov esi,eax - mov eax,field - mov edi,raw_area - call ReadGIF - mov [gif_unp],1 - pop edi esi - .skip: - ret - -out_image: -; in: eax - coord, ebx - image # - -STRIP2 = STRIP-2 - pusha - call get_xy - mov edx,[lx] - mov dx,word[ly+2] - add edx,1 shl 16+1 - imul ebx,STRIP2*STRIP2*3 - add ebx,raw_area+12 - mcall 7,,STRIP2 shl 16+STRIP2 - popa - ret - -OR_strip: -file 'orientg2.gif' - rd 2 - gif_unp dd 0 - -; DATA AREA -help_hdr db 'MegaMaze Help -' - .size=$-help_hdr - -dirs dd -1,0,0,1 -dir_ofs dd 0, 1, 1, 1 shl 16+1, 0, 1 - -dir_rotate db 2,0,3,1,1,3,0,2 - -w_colors dd 0x0404CA,0xCC0404,0x00CC00 -f_colors dd 0x9494FC,0xFC9494,0x99FF99,0xFFFF00 - -levnum dd LEVNUM - -prepare_level dd TM_levelp,SMZ_levelp,TILT_levelp,TILT2_levelp,FH_levelp,\ - LP_levelp,WG_levelp,BB_levelp,MAR_levelp,TM_levelp,OR_levelp,NLT_levelp,\ - CZ_levelp -key_handler dd TM_key,SMZ_key,TILT_key,TILT2_key,FH_key,LP_key,WG_key,BB_key,\ - MAR_key,CSTEP_key,OR_key,NLT_key,CZ_key -draw_more dd TM_drawm,SMZ_drawm,TILT_drawm,TILT2_drawm,FH_drawm,LP_drawm,\ - WG_drawm,BB_drawm,MAR_drawm,CSTEP_drawm,OR_drawm,NLT_drawm,CZ_drawm -draw_field dd maze_field,maze_field,maze_field,maze_field,grid_field,\ - grid_field,grid_field,grid_field,maze_field,maze_field,OR_drawf,maze_field,\ - grid_field -levels dd TM_level,SMZ_level,TILT_level,TILT2_level,FH_level,LP_level,\ - WG_level,BB_level,MAR_level,CSTEP_level,OR_level,NLT_level,CZ_level -help_msg dd TM_help,SMZ_help,TILT_help,TILT2_help,FH_help,LP_help,WG_help,\ - BB_help,MAR_help,CSTEP_help,OR_help,NLT_help,CZ_help - -header db 'Mega Maze', 0 - -next_msg db '< >' - -game_names mstr \ - 'Teseus & Minotaur #',\ - '1-2-3 Maze #',\ - 'Tilt Maze #',\ - 'Double Tilt #',\ - 'Full-house #',\ - 'Loops #',\ - 'Wriggle #',\ - 'BlackBox #',\ - 'Marble #',\ - 'Counter Step #',\ - 'Orientation #',\ - 'No left turn #',\ - 'Colour-zone #' - -msgs mstr ' ','You win!!!','Game over.','Start cell?','Dead end!',\ - " atoms hidden.",'Ray emerged.','Ray absorbed.','Ray reflected.',\ - 'Mark exactly guesses','Your score is','Guess mark toggled' - -I_END: -main_pid dd ? -child_stack rb 256 - chs_end: -drag_flag db ? -sq_size dd ? -mouse_processed dd ? -mpress_flag dd ? -mouse_x dd ? -mouse_y dd ? - -Ces dd ? -pack dd ? -fy dd ? -fx dd ? -lx dd ? -ly dd ? -generator dd ? -cell_count dd ? -levptr dd ? -levcount dd ? - -score dd ? -player: -teseus dd ? -finish: -minotaur dd ? - -stepptr dd ? -cur_step dd ? - -win_flag db ? -jump dd ? -pause_time dd ? -child dd ? -area rb 1024 -stak rb 1024 -stack_end: -prc_info process_information -prc_info2 process_information -field: - rb 128*128 -raw_area: - rb STRIP*STRIP*12*3+16 -end_mem: +IDA equ 1 ; We're running debugida.exe + +STRIP equ 40 +LEVNUM equ 500 + XFOFS equ 10 + YFOFS equ 55 + MSGXO equ 32 +GAMES_ALL equ 12 +WNDCOLOR equ 0x13c0c0c0;0x13f6f6f6; +MINCS equ 40 +MAXCS equ 80 +macro icall lbl +{ + call [lbl+ebp*4] +} + + use32 + org 0x0 + + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd run ; start of code + dd I_END ; size of image + dd end_mem ; memory for app + dd stack_end ; esp + dd 0x0 , 0x0 ; I_Param , I_Icon +lang fix ru_RU ; TODO: Include lang.inc here? Currently in game text (below) is en_US. +include "macros.inc" +purge mov +;include "../../../debug.inc" +COLOR_ORDER equ MENUETOS + +include 'gif_lite.inc' + +include 'tam.inc' +include 'smz.inc' +include 'tilt.inc' +include 'tilt2.inc' +include 'fhouse.inc' +include 'loops.inc' +include 'wriggle.inc' +include 'blackbox.inc' +include 'marble.inc' +include 'cstep.inc' +include 'orient.inc' +include 'nolt.inc' +include 'colzone.inc' + +run: + mov [Ces],STRIP;20 + mcall 3 + mov cl,16 + ror eax,cl + mov [generator],eax ; random generator from Tetris + + and [mpress_flag],0 + and [gif_unp],0 + xor ebp,ebp ; game_t +; mov ebp,10 + mcall 64,1,end_mem + mov [pause_time],40 + call resize + .game1: + mov [levnum],LEVNUM + .game: + and [win_flag],0 + and [drag_flag],0 + mov ecx,[levnum] + mov esi,[levels+ebp*4] + jecxz .skip + .nxt: + movzx eax,byte[esi] + add esi,eax + xor eax,eax + cmp al,byte[esi] + jne .noz + mov esi,LEVNUM;500 + sub esi,ecx + mov [levcount],esi + and [levnum],0 + jmp .game + .noz: + loop .nxt + .skip: + mcall 40,111b + mov [mouse_processed],1 + xor eax,eax + icall prepare_level +wnd_size: + mov eax,[Ces] + shr eax,2 + sub eax,2 + mov [sq_size],eax + if ~ IDA eq 1 + mov edx,[fx] + imul edx,[Ces] + add edx,XFOFS*2+20 + mov esi,[fy] + imul esi,[Ces] + add esi,YFOFS+30 + mov ecx,-1 + mcall 67,ecx + end if +red: + call draw_window + +drw: + call drwfld + +still: + mcall 2 + test al,al + jz still + mcall 10 + cmp eax,2 + je key + cmp eax,1 ; redraw request ? + je red + cmp eax,3 ; button in buffer ? + je button + cmp eax,6 ; mouse event ? + je mouse +key: + mcall 2 +; movzx ebx,ah +; dpd ebx + cmp ebp,10 + je .noplus + mov ebx,5 + cmp ah,184 + jne .nomin + cmp [Ces],MINCS + je still + .ces: + sub [Ces],ebx + call resize + jmp wnd_size + .nomin: + cmp ah,183 + jne .noplus + cmp [Ces],MAXCS + je still + neg ebx + jmp .ces + .noplus: + cmp ah,'h' + jne .nohlp +; if IDA eq 1 +; cmp [child],0 +; jne still +; else + call kill_help +; end if + mov [pack],ebp + mcall 51,1,show_help,chs_end +; dpd eax + mov [child],eax + jmp still + .nohlp: + cmp [win_flag],10 + je .levover + cmp [win_flag],2 + je .no_win + cmp [win_flag],1 + jne .now + .levover: + call lev_next + .no_win: + and [win_flag],al + jmp run.game + .now: + shr eax,8 + mov [jump],drw;red + cmp eax,13 + je run.game + icall key_handler + jmp [jump] + +button: + mcall 17 + cmp ah,1 + je close + cmp ah,2 + je .game_type + cmp ah,4 + je .inclev + cmp ah,3 + je .declev + jmp still + .declev: + dec [levnum] + cmp [levnum],0 + jge run.game + push [levcount] + pop [levnum] + jmp run.game + .inclev: + call lev_next + jmp run.game + .game_type: + inc ebp + cmp ebp,GAMES_ALL + jbe run.game1 + xor ebp,ebp + jmp run.game1 + close: + if ~ IDA eq 1 + call kill_help + end if + mcall -1 + +;if ~ IDA eq 1 + +kill_help: + mcall 9,prc_info2,-1 + mov edx,[child] + mov ecx,eax + .lp: + mcall 9 + cmp edx,[ebx+30] + jne .nochild + mcall 18,2 + and [child],0 + ret + .nochild: + loop .lp + ret + +;end if + +mouse: + cmp [mouse_processed],1 + jne .ex + mcall 37,1 + sub eax,XFOFS shl 16+YFOFS + xor edx,edx + mov ebx,[Ces] + mov ecx,eax + and eax,0xffff + div ebx + xor edx,edx + mov [mouse_y],eax + cmp eax,[fy] + jae .ex + mov eax,ecx + shr eax,16 + div ebx + mov [mouse_x],eax + cmp eax,[fx] + jae .ex + mcall 37,2 ; get buttons + cmp [drag_flag],0 + je .nodrag + mov ebx,eax + cmp eax,[mpress_flag] + mov eax,-1 + je .nochg + dec eax + .nochg: + mov [mpress_flag],ebx + jmp .call_hnd + .nodrag: + test eax,eax + jz .ex1 + cmp eax,[mpress_flag] + je .ex + mov [mpress_flag],eax + mov eax,-1 + .call_hnd: + mov [mouse_processed],0 + icall key_handler + jmp [jump] + .ex1: + mov [mpress_flag],0 + .ex: + jmp still + +lev_next: + push eax + inc [levnum] + mov eax,[levnum] + cmp eax,[levcount] + jbe .ex + and [levnum],0 + .ex: + pop eax + ret +;--------------------------------------------------------------------- +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* +draw_window: + pusha + mcall 12,1 + mov ebx,[fx] + imul ebx,[Ces] + push ebx + add ebx,50 shl 16+XFOFS*2+20 + mov ecx,[fy] + imul ecx,[Ces] + add ecx,10 shl 16+YFOFS+30 + mov edx, WNDCOLOR + mov edi, header + mcall 0 + + mov esi, edx + and esi,0xffffff + mcall 9,prc_info,-1 + pop ebx + + mov eax,[prc_info+70] ;status of window + test eax,100b + jne .end + + add ebx,XFOFS shl 16 + + mcall 8,,<25,12>,2 + + mcall 8,,<40,12>,3 + add ebx,13 shl 16 + inc edx + mcall + + mov ecx,ebp + mov edx,game_names+4 + call get_mstr + mcall 4,,0x8000 + imul esi,6 + add esi,3 + shl esi,16 + lea edx,[ebx+esi] + mcall 47,0x020001,levnum,,0x8000 + + mcall 4,,0x108000,next_msg,3 +.end: + mcall 12,2 + popa + ret +;--------------------------------------------------------------------- +unpack_level: + mov ecx,[cell_count] + mov edi,field + .lp: + movzx eax,byte[esi] + inc esi + shl ax,4 + shr al,4 + stosw + loop .lp + ret +;--------------------------------------------------------------------- +get_xy: +; eax-coord +; out: [lx]-[x+2][CS-4],[ly]-[y+2][CS-4] + pusha + xor edx,edx + mov esi,[sq_size] + lea edi,[esi*2] + neg edi + add edi,[Ces] + mov [lx],edi + mov [ly],edi + mov ebx,[fx] + div bx + imul eax,[Ces] + imul edx,[Ces] + lea edx,[edx+XFOFS+esi] + lea eax,[eax+YFOFS+esi] + mov word[ly+2],ax + mov word[lx+2],dx + popa + ret + +check_move: +; eax-coord, ebx-direction +; CF=0 if move is valid + bt dword[field+eax],ebx + ret + +delay: + pusha + mcall 5,[pause_time] + popa + ret + +get_mstr: +; in: edx,ecx +; out: edx,esi + mov esi,[edx-4] + jecxz .ex + lea edx,[edx+esi+4] + dec ecx + jmp get_mstr + .ex: + ret + +maze_field: + mov edi,field + mov [ly],YFOFS shl 16+YFOFS + mov eax,38 + mov ecx,[fy] + .lp1: + push ecx + mov [lx],XFOFS shl 16+XFOFS + mov ecx,[fx] + .lp2: + push ecx + xor esi,esi + .lp3: + mov edx,0xd0d0d0 + bt dword[edi],esi + jnc .gray + mov edx,0 + .gray: + mov ebx,[lx] + add ebx,[dir_ofs+esi*4] + mov ecx,[ly] + add ecx,[dir_ofs+esi*4+8] + mcall + inc esi + cmp esi,4 + jb .lp3 + inc edi + mov ecx,[Ces] + add word[lx],cx + add word[lx+2],cx + pop ecx + loop .lp2 + mov ecx,[Ces] + add word[ly],cx + add word[ly+2],cx + pop ecx + loop .lp1 + ret + +grid_field: + mov edx,0xa0a0a0 + mov eax,38 + + mov ecx,[fy] + mov ebx,[fx] + imul ebx,[Ces] + add ebx,XFOFS shl 16+XFOFS + mov esi,YFOFS shl 16+YFOFS + inc ecx + .lp1: + push ecx + mov ecx,esi + mcall + mov ecx,[Ces] + add esi,ecx + shl ecx,16 + add esi,ecx + pop ecx + loop .lp1 + + mov ecx,[fx] + mov esi,[fy] + imul esi,[Ces] + add esi,YFOFS shl 16+YFOFS + mov ebx,XFOFS shl 16+XFOFS + inc ecx + .lp2: + push ecx + mov ecx,esi + mcall + mov ecx,[Ces] + add ebx,ecx + shl ecx,16 + add ebx,ecx + pop ecx + loop .lp2 + ret + +get_xy_sf: + xor eax,eax + and [player],eax + mov [fx],eax + mov [fy],eax + lodsb + lodsb + mov ah,al + shr ah,4 + and al,0xf + mov byte[fx],ah + mov byte[fy],al + lodsb + mov byte[player],al + lodsb + mov byte[finish],al + .count: + mov eax,[fx] + mov [dirs+4],eax + neg eax + mov [dirs+8],eax + mov eax,[fx] + imul eax,[fy] + mov [cell_count],eax + + ret + +get_last_mclick: +; out - eax=0 no click or outside field +; eax>0 button pressed, ebx=[xy] + mov [mouse_processed],1 + mov eax,[mpress_flag] + mov ebx,[mouse_y] + imul ebx,[fx] + add ebx,[mouse_x] + ret + +erase_field: + pusha + mov ecx,[cell_count] + xor eax,eax + mov edi,field + rep stosb + popa + ret + +get_pxy: +; in: [pack] - cell#, out: word[pack] - packed [xy] + pusha + mov eax,[pack] + cdq + mov ebx,[fx] + div ebx + shl edx,8 + add eax,edx + mov [pack],eax + popa + ret + +check_bounds: +; in: eax - cell, ebx - dir +; out: ebx=-1 if bounds crossed + push eax ecx + mov ecx,eax + add ecx,[dirs+ebx*4] + mov ebx,ecx + call get_offset + mov ebx,eax + pop ecx eax + cmp ebx,-1 + ret + +get_offset: +; in: eax - start, ebx-end +; out: eax - dir or -1 if not straight +; ebx - distance + push ecx edx + mov ecx,-1 + mov edx,[cell_count] + cmp eax,edx + jae .ex + cmp ebx,edx + jae .ex + mov [pack],eax + call get_pxy + mov eax,[pack] + mov [pack],ebx + call get_pxy + mov ebx,[pack] + cmp ah,bh ; compare X + jne .noX + mov ecx,1 + sub bl,al + ja .ok + inc ecx + .ok2: + neg bl + jmp .ok + .noX: + cmp al,bl ; compare Y + jne .ex + inc ecx + sub bh,ah + mov bl,bh + jb .ok2 + add ecx,3 + .ok: + movzx ebx,bl + .ex: + mov eax,ecx + pop edx ecx + ret + +show_help: + mov ebp,[pack] + .red: + mcall 12,1 + mov ebx,[prc_info.box.left] + add ebx,[prc_info.box.width] + shl ebx,16 + add ebx,310 + mov ecx,[prc_info.box.top] + shl ecx,16 + add ecx,220 + mcall 0,,,0x03c0c0c0 + mcall 4,<8,8>,0x00ffffff,help_hdr,help_hdr.size + mov ecx,ebp + mov edx,game_names+4 + call get_mstr + sub esi,2 + mcall 4,<6*help_hdr.size+15,8>,0x00ffffff + + mov edx,[help_msg+ebp*4] + add edx,4 + xor ecx,ecx + mov ebx,10 shl 16+30 + .nxt: + mov esi,[edx-4] + jecxz .drw + dec ecx + lea edx,[edx+esi+4] + jmp .nxt + .drw: + cmp esi,-1 + je .edraw + mcall ,,0x000000ff + mov ecx,1 + add ebx,12 + jmp .nxt + .edraw: + mcall 12,2 + .still: + mcall 10 + cmp eax,2 + jne .nokey + mcall + jmp .close + .nokey: + cmp eax,1 ; redraw request ? + je .red + cmp eax,3 ; button in buffer ? + jne .still + mcall 17 + cmp ah,1 + jne .still + .close: + and [child],0 + mcall -1 + +getline: +; in: esi,edi + pusha + mov eax,esi + call get_xy + mov ebx,[lx] + mov ecx,[ly] + mov eax,edi + call get_xy + mov bx,word[lx+2] + mov cx,word[ly+2] + mov eax,[Ces] + shr eax,1 + sub eax,[sq_size] + add ebx,eax + add ecx,eax + shl eax,16 + add ebx,eax + add ecx,eax + mov [lx],ebx + mov [ly],ecx + mcall 38 + popa + ret + +bold_line: + WGSPC equ 1 + pusha + mov edi,WGSPC shl 16+WGSPC + add [lx],edi + add [ly],edi + mcall 38,[lx],[ly] + shl edi,1 + sub ebx,edi + sub ecx,edi + mcall + popa + ret + +get_rnd: + mov eax, [generator] + sub eax,0x43ab45b5 ; next random number + ror eax,1 + xor eax,0x32c4324f + ror eax,1 + mov [generator],eax + ret + +drwfld: + pusha + mov ebx,[fx] + imul ebx,[Ces] + add ebx,XFOFS shl 16 + mov ecx,[fy] + imul ecx,[Ces] + add ecx,YFOFS shl 16 + mcall 13,,,WNDCOLOR + add ebx,26 shl 16-26 + sub ecx,16 shl 16 + mov cx,16 + mcall + icall draw_field + icall draw_more + cmp [win_flag],0 + jz .edraw + movzx ecx,[win_flag] + mov edx,msgs+4 + call get_mstr + mcall 4,,0x100000ff + .edraw: + popa + ret + +resize: + mov eax,[Ces] + mov edi,dir_ofs+4 + stosd + stosd + stosw + stosw + mov [edi+4],eax + ret + +need_image: +; in: eax - gif pointer + cmp [gif_unp],0 + jne .skip + push esi edi + mov esi,eax + mov eax,field + mov edi,raw_area + call ReadGIF + mov [gif_unp],1 + pop edi esi + .skip: + ret + +out_image: +; in: eax - coord, ebx - image # + +STRIP2 = STRIP-2 + pusha + call get_xy + mov edx,[lx] + mov dx,word[ly+2] + add edx,1 shl 16+1 + imul ebx,STRIP2*STRIP2*3 + add ebx,raw_area+12 + mcall 7,,STRIP2 shl 16+STRIP2 + popa + ret + +OR_strip: +file 'orientg2.gif' + rd 2 + gif_unp dd 0 + +; DATA AREA +help_hdr db 'MegaMaze Help -' + .size=$-help_hdr + +dirs dd -1,0,0,1 +dir_ofs dd 0, 1, 1, 1 shl 16+1, 0, 1 + +dir_rotate db 2,0,3,1,1,3,0,2 + +w_colors dd 0x0404CA,0xCC0404,0x00CC00 +f_colors dd 0x9494FC,0xFC9494,0x99FF99,0xFFFF00 + +levnum dd LEVNUM + +prepare_level dd TM_levelp,SMZ_levelp,TILT_levelp,TILT2_levelp,FH_levelp,\ + LP_levelp,WG_levelp,BB_levelp,MAR_levelp,TM_levelp,OR_levelp,NLT_levelp,\ + CZ_levelp +key_handler dd TM_key,SMZ_key,TILT_key,TILT2_key,FH_key,LP_key,WG_key,BB_key,\ + MAR_key,CSTEP_key,OR_key,NLT_key,CZ_key +draw_more dd TM_drawm,SMZ_drawm,TILT_drawm,TILT2_drawm,FH_drawm,LP_drawm,\ + WG_drawm,BB_drawm,MAR_drawm,CSTEP_drawm,OR_drawm,NLT_drawm,CZ_drawm +draw_field dd maze_field,maze_field,maze_field,maze_field,grid_field,\ + grid_field,grid_field,grid_field,maze_field,maze_field,OR_drawf,maze_field,\ + grid_field +levels dd TM_level,SMZ_level,TILT_level,TILT2_level,FH_level,LP_level,\ + WG_level,BB_level,MAR_level,CSTEP_level,OR_level,NLT_level,CZ_level +help_msg dd TM_help,SMZ_help,TILT_help,TILT2_help,FH_help,LP_help,WG_help,\ + BB_help,MAR_help,CSTEP_help,OR_help,NLT_help,CZ_help + +header db 'Mega Maze', 0 + +next_msg db '< >' + +; TODO: Translate in game text and support 'lang.inc'. Defaults to en_US. +game_names mstr \ + 'Teseus & Minotaur #',\ + '1-2-3 Maze #',\ + 'Tilt Maze #',\ + 'Double Tilt #',\ + 'Full-house #',\ + 'Loops #',\ + 'Wriggle #',\ + 'BlackBox #',\ + 'Marble #',\ + 'Counter Step #',\ + 'Orientation #',\ + 'No left turn #',\ + 'Colour-zone #' + +msgs mstr ' ',\ + 'You win!!!',\ + 'Game over.',\ + 'Start cell?',\ + 'Dead end!',\ + " atoms hidden.",\ + 'Ray emerged.',\ + 'Ray absorbed.',\ + 'Ray reflected.',\ + 'Mark exactly guesses',\ + 'Your score is',\ + 'Guess mark toggled' + +I_END: +main_pid dd ? +child_stack rb 256 + chs_end: +drag_flag db ? +sq_size dd ? +mouse_processed dd ? +mpress_flag dd ? +mouse_x dd ? +mouse_y dd ? + +Ces dd ? +pack dd ? +fy dd ? +fx dd ? +lx dd ? +ly dd ? +generator dd ? +cell_count dd ? +levptr dd ? +levcount dd ? + +score dd ? +player: +teseus dd ? +finish: +minotaur dd ? + +stepptr dd ? +cur_step dd ? + +win_flag db ? +jump dd ? +pause_time dd ? +child dd ? +area rb 1024 +stak rb 1024 +stack_end: +prc_info process_information +prc_info2 process_information +field: + rb 128*128 +raw_area: + rb STRIP*STRIP*12*3+16 +end_mem: diff --git a/programs/games/megamaze/trunk/wriggle.inc b/programs/games/megamaze/trunk/wriggle.inc index aa5ed1ad48..9c699c739c 100644 --- a/programs/games/megamaze/trunk/wriggle.inc +++ b/programs/games/megamaze/trunk/wriggle.inc @@ -1,3 +1,5 @@ +; Language support for locales: ru_RU (CP866), en_US. + ; level format ; [fx|fy]..[field cells x2]..[worm_count]..[worm_len][start cell #][body dirs x2]