diff --git a/data/eng/Makefile b/data/eng/Makefile index 927d0189dd..0917c23e65 100644 --- a/data/eng/Makefile +++ b/data/eng/Makefile @@ -126,6 +126,8 @@ FASM_PROGRAMS:=\ games/arcanii:GAMES/ARCANII:$(PROGS)/games/arcanii/trunk/arcanii.asm \ games/freecell:GAMES/FREECELL:$(PROGS)/games/freecell/freecell.ASM \ games/invaders:GAMES/INVADERS:$(PROGS)/games/invaders/invaders.asm \ + games/kox:GAMES/KOX:$(PROGS)/games/kox/trunk/kox.asm \ + games/lights:GAMES/LIGHTS:$(PROGS)/games/lights/trunk/lights.asm \ games/lines:GAMES/LINES:$(PROGS)/games/lines/lines.asm \ games/mblocks:GAMES/MBLOCKS:$(PROGS)/games/mblocks/trunk/mblocks.asm \ games/phenix:GAMES/PHENIX:$(PROGS)/games/phenix/trunk/phenix.asm \ @@ -134,6 +136,7 @@ FASM_PROGRAMS:=\ games/pong3:GAMES/PONG3:$(PROGS)/games/pong3/trunk/pong3.asm \ games/rsquare:GAMES/RSQUARE:$(PROGS)/games/rsquare/trunk/rsquare.asm \ games/snake:GAMES/SNAKE:$(PROGS)/games/snake/trunk/snake.asm \ + games/sw:GAMES/SW:$(PROGS)/games/sw/trunk/sw.asm \ games/tetris:GAMES/TETRIS:$(PROGS)/games/tetris/trunk/tetris.asm \ lib/archiver.obj:LIB/ARCHIVER.OBJ:$(PROGS)/fs/kfar/trunk/kfar_arc/kfar_arc.asm \ lib/box_lib.obj:LIB/BOX_LIB.OBJ:$(PROGS)/develop/libraries/box_lib/trunk/box_lib.asm \ @@ -238,13 +241,11 @@ OTHER_FILES:=asciivju:ASCIIVJU autorun.dat:AUTORUN.DAT \ games/checkers:GAMES/CHECKERS \ games/FindNumbers:GAMES/FindNumbers games/gomoku:GAMES/GOMOKU \ games/klavisha:GAMES/KLAVISHA games/kosilka:GAMES/KOSILKA \ - games/kosskin.gfx:GAMES/KOSSKIN.GFX games/kox:GAMES/KOX \ - games/lights:GAMES/LIGHTS games/megamaze:GAMES/MEGAMAZE \ + games/kosskin.gfx:GAMES/KOSSKIN.GFX games/megamaze:GAMES/MEGAMAZE \ games/msquare:GAMES/MSQUARE \ games/reversi:GAMES/REVERSI games/rforces:GAMES/RFORCES \ games/sq_game:GAMES/SQ_GAME \ - games/sudoku:GAMES/SUDOKU games/sw:GAMES/SW \ - games/xonix:GAMES/XONIX \ + games/sudoku:GAMES/SUDOKU games/xonix:GAMES/XONIX \ lib/cnv_png.obj:LIB/CNV_PNG.OBJ lib/msgbox.obj:LIB/MSGBOX.OBJ \ lib/pixlib.obj:LIB/PIXLIB.OBJ lib/sort.obj:LIB/SORT.OBJ \ media/ac97snd:MEDIA/AC97SND media/kiv.ini:MEDIA/KIV.INI \ diff --git a/data/eng/games/kox b/data/eng/games/kox deleted file mode 100644 index d20a17e022..0000000000 Binary files a/data/eng/games/kox and /dev/null differ diff --git a/data/eng/games/lights b/data/eng/games/lights deleted file mode 100644 index fad55b5352..0000000000 Binary files a/data/eng/games/lights and /dev/null differ diff --git a/data/eng/games/sw b/data/eng/games/sw deleted file mode 100644 index 5a0200629e..0000000000 Binary files a/data/eng/games/sw and /dev/null differ diff --git a/data/rus/Makefile b/data/rus/Makefile index 86548f9739..3183313152 100644 --- a/data/rus/Makefile +++ b/data/rus/Makefile @@ -126,6 +126,8 @@ FASM_PROGRAMS:=\ games/arcanii:GAMES/ARCANII:$(PROGS)/games/arcanii/trunk/arcanii.asm \ games/freecell:GAMES/FREECELL:$(PROGS)/games/freecell/freecell.ASM \ games/invaders:GAMES/INVADERS:$(PROGS)/games/invaders/invaders.asm \ + games/kox:GAMES/KOX:$(PROGS)/games/kox/trunk/kox.asm \ + games/lights:GAMES/LIGHTS:$(PROGS)/games/lights/trunk/lights.asm \ games/lines:GAMES/LINES:$(PROGS)/games/lines/lines.asm \ games/mblocks:GAMES/MBLOCKS:$(PROGS)/games/mblocks/trunk/mblocks.asm \ games/phenix:GAMES/PHENIX:$(PROGS)/games/phenix/trunk/phenix.asm \ @@ -134,6 +136,7 @@ FASM_PROGRAMS:=\ games/pong3:GAMES/PONG3:$(PROGS)/games/pong3/trunk/pong3.asm \ games/rsquare:GAMES/RSQUARE:$(PROGS)/games/rsquare/trunk/rsquare.asm \ games/snake:GAMES/SNAKE:$(PROGS)/games/snake/trunk/snake.asm \ + games/sw:GAMES/SW:$(PROGS)/games/sw/trunk/sw.asm \ games/tetris:GAMES/TETRIS:$(PROGS)/games/tetris/trunk/tetris.asm \ lib/archiver.obj:LIB/ARCHIVER.OBJ:$(PROGS)/fs/kfar/trunk/kfar_arc/kfar_arc.asm \ lib/box_lib.obj:LIB/BOX_LIB.OBJ:$(PROGS)/develop/libraries/box_lib/trunk/box_lib.asm \ @@ -239,12 +242,11 @@ OTHER_FILES:=asciivju:ASCIIVJU autorun.dat:AUTORUN.DAT \ games/checkers:GAMES/CHECKERS \ games/FindNumbers:GAMES/FindNumbers games/gomoku:GAMES/GOMOKU \ games/klavisha:GAMES/KLAVISHA games/kosilka:GAMES/KOSILKA \ - games/kosskin.gfx:GAMES/KOSSKIN.GFX games/kox:GAMES/KOX \ - games/lights:GAMES/LIGHTS games/megamaze:GAMES/MEGAMAZE \ + games/kosskin.gfx:GAMES/KOSSKIN.GFX games/megamaze:GAMES/MEGAMAZE \ games/msquare:GAMES/MSQUARE games/padenie:GAMES/PADENIE \ games/reversi:GAMES/REVERSI games/rforces:GAMES/RFORCES \ games/sq_game:GAMES/SQ_GAME \ - games/sudoku:GAMES/SUDOKU games/sw:GAMES/SW games/whowtbam:GAMES/WHOWTBAM \ + games/sudoku:GAMES/SUDOKU games/whowtbam:GAMES/WHOWTBAM \ games/xonix:GAMES/XONIX \ lib/cnv_png.obj:LIB/CNV_PNG.OBJ lib/msgbox.obj:LIB/MSGBOX.OBJ \ lib/pixlib.obj:LIB/PIXLIB.OBJ lib/sort.obj:LIB/SORT.OBJ \ diff --git a/data/rus/games/kox b/data/rus/games/kox deleted file mode 100644 index d20a17e022..0000000000 Binary files a/data/rus/games/kox and /dev/null differ diff --git a/data/rus/games/lights b/data/rus/games/lights deleted file mode 100644 index fad55b5352..0000000000 Binary files a/data/rus/games/lights and /dev/null differ diff --git a/data/rus/games/sw b/data/rus/games/sw deleted file mode 100644 index 2fc1cd5268..0000000000 Binary files a/data/rus/games/sw and /dev/null differ diff --git a/programs/games/kox/trunk/data.inc b/programs/games/kox/trunk/data.inc new file mode 100644 index 0000000000..8cd2926d05 --- /dev/null +++ b/programs/games/kox/trunk/data.inc @@ -0,0 +1,66 @@ +;#************************** +;#* X.0.X - DATA +;#************************** 21/10/2007 + +macro DATA_SECTION +{ +; ДАННЫЕ ПРОГРАММЫ +;----------------------------------------------------------------------------- +lootxt: db 'oops! - Looser...' ; los +text: db 'KOX v0.003 [ESC] - quit' ; winheader string +texts: db 'Congratulations! You are winner.' ; in window win +textend: db 'New' ;button id=200 +px: dw 50 ;x,y - +py: dw 50 ; - for x_put/o_put +seed: dd 0 ;rnd +idx: dd 0 ;N cell +;============ X = Y ============= coords of cells + pole: dw 50, 50 ;+0 or - dd 50*65536+50 + dw 100, 50 ;+4 + dw 150, 50 ;+8 + dw 50,100 ;+.. + dw 100,100 ;+ + dw 150,100 ; + dw 50,150 ; + dw 100,150 ; + dw 150,150 ; + pox: dd 0,0 ;POLE ( 3x3 )= 9 _bytes_: 'x' / 'o' / empty + pox_: db 0 ;9= 8+1 + fill: db 0 ;turn counter 0..9 + xwin: db 0 ;who is winner 0/1 + owin: db 0 ;who is looser 0/1 + poxl: dw 0 ;16 bits - x memory + pool: dw 0 ;16 bits - o memory +;---------------------------------------------------------------------------- + oxwall: dw 100100100b,0010010010b,0001001001b ;vert. + dw 111000000b,0000111000b,0000000111b ;horiz + dw 100010001b,0001010100b ;diag -winning combinations + prav: ;==== правила-комбинации===== + dw 000000110b,0 ;ситуация - ход в ситуации + dw 000000101b,1 + dw 000000011b,2 + dw 000110000b,3 + dw 000101000b,4 + dw 000011000b,5 + dw 110000000b,6 + dw 101000000b,7 + dw 011000000b,8 ;horiz + + dw 001001000b,0 + dw 001000001b,3 + dw 000001001b,6 + dw 010010000b,1 + dw 010000010b,4 + dw 000010010b,7 + dw 100100000b,2 + dw 100000100b,5 + dw 000100100b,8 ;vert + + dw 000010001b,8 + dw 100010000b,0 + dw 100000001b,4 + dw 000010100b,6 + dw 001010000b,2 + dw 001000100b,4 ;diag + +} diff --git a/programs/games/kox/trunk/kox.asm b/programs/games/kox/trunk/kox.asm new file mode 100644 index 0000000000..df54cc5a1e --- /dev/null +++ b/programs/games/kox/trunk/kox.asm @@ -0,0 +1,20 @@ +;************************************************ +;* X-0-X / Kolibri OS / +;************************** 17/10/2007 ********** +include 'main.inc' +include 'data.inc' +include 'macs.inc' + + BeginProgram + + SetEventMask 100111b + call rndseed + + main_loop + + Subroutines + + DATA_SECTION + + EndProgram + diff --git a/programs/games/kox/trunk/kox.txt b/programs/games/kox/trunk/kox.txt new file mode 100644 index 0000000000..36d2f85de3 --- /dev/null +++ b/programs/games/kox/trunk/kox.txt @@ -0,0 +1,27 @@ +Kox v0.003 +---------------- + Крестики-нолики в комментариях не нуждаются. +Все играли? Вспоминайте... - пальцем на запотевшем стекле, +мелом на доске, палкой на снегу, на земле, ручкой +на уроках в клетчатой тетради... +Теперь и в Колибри. + + Цель каждого игрока - первым выстроить ряд из трех своих +фигур (крестиков или ноликов) ходя поочередно на поле 3x3. +Кто первый - тот выиграл. + + Вы играете крестиками, ноликами - ваш соперник, компьютер. +Он достаточно умен, шансов выиграть - не очень много. + + Прилагаю исходный текст на ассемблере, делайте с ним что хотите. +Он слегка оптимизирован (по размеру) но резервы еще есть. +Может похудеть еще байт на двести... + +Можно еще улучшить алгоритм искуственного интеллекта +(заткнуть последнюю дырку, чтобы ьыла ничейная смерть) +вторым ходом ходить в угол (пропускать нечетный idx) +если ответит в противоположный - снова в угол. +Мне лениво добавлять несколько десятков байт из-за 1 хода. +И так неплохо вроде... + +== 21/10/2007 == board.kolibrios.org diff --git a/programs/games/kox/trunk/macs.inc b/programs/games/kox/trunk/macs.inc new file mode 100644 index 0000000000..8872a5e7d7 --- /dev/null +++ b/programs/games/kox/trunk/macs.inc @@ -0,0 +1,317 @@ +;************************************ +;******** МАКРОСЫ ******************* +;************************************ +;------------------------------------ +; constants +;-----------------------цвет:0xRRGGBB +cBLACK = 0x000000 ; черный +cRED = 0xFF0000 ; красный +cYELLOW = 0xFFFF00 ; желтый +cGREEN = 0x00FF00 ; зеленый +cNAVY = 0x0000FF ; синий +cMAGENTA = 0xFF00FF ; малиновый +cBLUE = 0x00FFFF ; голубой +cWHITE = 0xFFFFFF ; белый +cBROWN = 0x554433 ; коричневый + +;------------------------------- +cMAGENTAl = 0xB800B8 ; magenta light +cVIOLETl = 0xF800F8 ; фиолетовый светл + +macro BeginProgram + { + use32 + org 0x0 + + db 'MENUET01' + dd 0x01 + dd __start + dd __end + dd 0x10000 ;__memory + dd 0x10000 ;__stack + dd 0x0 ; dd __params + dd 0x0 + __start: + } + +macro EndProgram + { + align 32 + rb 256 + __end: + ;org 0x10000 + __stack: + __memory: + } + + +macro LoopBegin lab,begi +{ + push ecx ; ECX->STACK store old + mov ecx,begi + lab: + push ecx ; ECX->STACK counter store +} + +macro LoopEnd lab,endi +{ + pop ecx ;ECX<-STACK counter restore + inc ecx + cmp ecx,endi + jne lab + pop ecx ;ECX<-STACK restore old +} + +macro SetEventMask mmm +{ + mov eax,40 + mov ebx,mmm + int 0x40 +} + +macro Subroutines +{ +;------------------------------------------------------------------------------ + rndseed: + mov eax,26 + mov ebx,9 + int 0x40 + mov dword[seed],eax + ret + rndnext: + mov eax,3 + int 0x40 + shr eax,16 + add eax,dword[seed] + ; not eax + ror eax,3 + xor eax,0xdeadbeef + mov dword[seed],eax + ret +;============0========== word[px],word[py] + o_put: + mov ax,word[px] + shl eax,16 ;*65536 + add eax,35 ;+35 + mov ebx,eax ;posX*65536+dX ; [x0] *65536 + [dx] + mov ax,word[py] ; + shl eax,16 ;*65536 + add eax,35 ;+35 + mov ecx,eax ;posY*65536+dY ; [y0] *65536 + [dy] + mov edx,cB + mov eax,13 ; функция 13 - box + int 0x40 ;BLACK BOX--------------- + + mov ax,word[px] + inc ax ;+1 + inc ax ;+1 + shl eax,16 ;*65536 + add eax,31 ;3 ;+35 + mov ebx,eax ;posX*65536+dX ; [x0] *65536 + [dx] + + mov ax,word[py] + add eax,2 + ;inc eax + ;inc eax + shl eax,16 + add eax,31 ;3 ;-2 + mov ecx,eax ;posY*65536+dY ; [y0] *65536 + [dy] + mov edx,cW + mov eax,13 ; функция 13 - box + int 0x40 ;WHITE BOX---------- + ret +;============X========== + x_put: + ;xor eax,eax + mov ax,word[px] + shl eax,16 ;*65536 + add ax,word[px] + add eax,35 ;+35 + mov ebx,eax ;posX*65536+dX + + xor eax,eax + mov ax,word[py] + shl eax,16 ;*65536 + add ax,word[py] + add eax,35 ;+35 + mov ecx,eax ;posX*65536+dX + mov edx,cB + mov eax,38 ; функция 38 - line \ + int 0x40 +;------------------------------xx + xor eax,eax + mov ax,word[px] + inc eax + shl eax,16 ;*65536 + add ax,word[px] + add eax,36 ;+35+1 + mov ebx,eax ;posX*65536+dX + xor eax,eax + mov ax,word[py] + shl eax,16 ;*65536 + add ax,word[py] + add eax,35 ;+35 + mov ecx,eax ;posX*65536+dX ; [x0] *65536 + [dx] + mov edx,cB + mov eax,38 ; функция 38 - line \\ + int 0x40 +;--------------------------------- + xor eax,eax + mov ax,word[px] + shl eax,16 ;*65536 + mov ebx,eax ;posX*65536 = .BX + + xor eax,eax + mov ax,word[px] + add eax,35 + add ebx,eax ;---------------------------BX + + xor eax,eax + mov ax,word[py] + add eax,35 + shl eax,16 ;*65536 + add ax,word[py] ;+y + mov ecx,eax ;(posY+35)*65536+posY = .CX + mov edx,cB ; цвет : черный + mov eax,38 ; функция 38 - line / + int 0x40 +;---------------------------------------- + xor eax,eax + mov ax,word[px] + inc ax + shl eax,16 ;*65536 + mov ebx,eax ;posX*65536 = .BX + + xor eax,eax + mov ax,word[px] + add eax,36 ;+35+1 + add ebx,eax ;---------------------------BX + + xor eax,eax + mov ax,word[py] + add eax,35 + shl eax,16 ;*65536 + add ax,word[py] ;+y + mov ecx,eax ;(posY+35)*65536+posY = .CX + mov edx,cB + mov eax,38 ; функция 38 - line // + int 0x40 + ret +;------------------------------------ПРОВЕРКА Hа выигрышную ситуацию-----x + x_win: xor ecx,ecx + xor ebx,ebx + xor eax,eax + lx0: mov bx,word[poxl] ;сравнить текущую ситуацию на поле X + mov esi,ecx + shl esi,1 ;*2 + mov ax,word[oxwall+esi] ; next pattern + and ebx,eax ;с победными , если хоть одна совпадает - + sub eax,ebx + jz wx ;победа -> set byte xwin=1 + inc ecx + cmp ecx,8 ;цикл ecx < 8 + jb lx0 + g00: ;нет совпадений + ret + wx: + inc byte[xwin] ;mov byte[xwin],1 + ret +;------------------------------------ПРОВЕРКА Hа выигрышную ситуацию-----0 + o_win: xor ecx,ecx + xor ebx,ebx + xor eax,eax + lo0: mov bx,word[pool] ;сравнить текущую ситуацию на поле O + mov esi,ecx + shl esi,1 ;*2 + mov ax,word[oxwall+esi] ; next pattern + and ebx,eax ;с победными , если хоть одна совпадает - + sub eax,ebx + jz wo ;победа -> set byte owin=1 + inc ecx + cmp ecx,8 ;цикл + jb lo0 + ret + wo: inc byte[owin] ;mov byte[owin],1 + ret +;==================================COmbinations -0- ============= + o_com: xor ecx,ecx + xor ebx,ebx + xor eax,eax + l000: mov bx,word[poxl] ; текущую ситуацию на поле X + ; or bx,word[pool] ;+ текущую ситуацию на поле O + mov esi,ecx + shl esi,2 ;*4 -сдвиг -слов + mov ax,word[prav+esi] ; следующее правило + and ebx,eax ; если не совпадает - + sub eax,ebx + jnz @F ;next ecx + xor eax,eax + xor ebx,ebx + mov ax,word[prav+esi+2] ;esi<-из таблицы правил + mov bl,byte[pox+eax] + cmp ebx,0 ;empty? + je g00d + @@: + inc ecx + cmp ecx,24 ;цикл до 24 + jb l000 + ret ;нет совпадений - do nothing + g00d: + ;применить его + xor eax,eax + mov ax,word[prav+esi+2] ;esi<-из таблицы правил + mov esi,eax + mov dword[idx],esi ;сохраним в idx + ret + +;==================================предвыигрышная комбинация... + x_com: xor ecx,ecx + xor ebx,ebx + xor eax,eax + l111: mov bx,word[pool] ; текущую ситуацию на поле O + mov esi,ecx + shl esi,2 ;*4 -сдвиг -слов + mov ax,word[prav+esi] ; следующее правило + and ebx,eax ; если не совпадает - + sub eax,ebx + jnz @F ;next ecx + xor eax,eax + xor ebx,ebx + mov ax,word[prav+esi+2] ;esi<-из таблицы правил + mov bl,byte[pox+eax] + cmp ebx,0 ;empty? + je g11d + @@: + inc ecx + cmp ecx,24 ;цикл до 24 + jb l111 + ret ;нет совпадений - do nothing + + g11d: + ;применить его + xor eax,eax + mov ax,word[prav+esi+2] ;esi<-из таблицы правил + mov esi,eax + mov dword[idx],esi ;сохраним в idx + ret +} + +macro playing_field +{ + pole_x0: + mov eax,38 ; func 38 + mov edx,cB ; the color is black + + mov ebx,92*65536+92 ;x + mov ecx,42*65536+192 ;y + int 0x40 ;- line vert 1 + mov ebx,142*65536+142 ;x + mov ecx,42*65536+192 ;y + int 0x40 ;- line vert 2 + mov ebx,42*65536+192 ;x + mov ecx,92*65536+92 ;y + int 0x40 ;- line horiz 1 + mov ebx,42*65536+192 ;x + mov ecx,142*65536+142 ;y + int 0x40 ;- line horiz 2 +} diff --git a/programs/games/kox/trunk/main.inc b/programs/games/kox/trunk/main.inc new file mode 100644 index 0000000000..89597c786b --- /dev/null +++ b/programs/games/kox/trunk/main.inc @@ -0,0 +1,290 @@ +;#************************** +;#* X-0-X = MAIN() +;#************************** 21/10/2007 +cB equ cBLACK +cW equ cWHITE + +macro main_loop +{ + +; функция отрисовки окна +;======================================== +draw_window: + mov eax,12 ; функция 12: сообщить системе + mov ebx,1 ; подфункция 1, начало перерисовки + int 0x40 + ; ===== ОКНО !!! + mov eax,0 ; функция 0: определить и вывести окно + mov ebx,100*65536+250 ; [x начальный] *65536 + [x размер] + mov ecx,ebx ;,100*65536+250 ; [y начальный] *65536 + [y размер] + mov edx,0x02FFFFFF + + mov esi,0x808899AA ; цвет заголовка RRGGBB + mov edi,0xFFAAcc ; цвет рамки RRGGBB + int 0x40 + ; НАДПИСЬ в заголовке KOX v0.001 + mov eax,4 ; функция 4: написать текст в окне + mov ebx,8*65536+8 ; [x начальный] *65536 + [y начальный] + mov ecx,0x00224422 ; цвет текста RRGGBB + mov edx,text ; указатель на начало текста + mov esi,texts-text ; длина текста в байтах + int 0x40 +;-----------------------------------#----------------------------------------- +; SCENE OF GAME - PLAY YARD - BOARD - DESK - PLAYING FIELD +;--------------- + playing_field ;macro in macs.inc +;------------------------------------------------------------------------------- +; ----КНОПКИ---- +;------------------------------------------------------------------------------- +;buttons: + mov eax,8 ; функция 8: определить и вывести кнопку + mov ebx,230*65536+12 ; [x начальный] *65536 + [x размер] + mov ecx,5*65536+12 ; [y начальный] *65536 + [y размер] + mov edx,100 ; идентификатор кнопки =100 + mov esi,0xFF6611 ; цвет кнопки RRGGBB + int 0x40 ; ===КНОПКА ЗАКРЫТИЯ ОКНА=== +;-------------------------------------------- + mov eax,8 ; + mov ebx,200*65536+35 ; ; + mov ecx,25*65536+20 ; + mov edx,200 ;== NEW GAME == + mov esi,0xCC66CC + int 0x40 +;-------------------------------------------- + mov eax,4 ; написать текст на кнопке NEW + mov ebx,210*65536+30 + mov ecx,cB + mov edx,textend + mov esi,3 + int 0x40 + endbut: + mov eax,12 + mov ebx,2 + int 0x40 +;============================= draw_window: END + event_wait: + mov eax,23 ;==СОБЫТИЯ== + mov ebx,100 ;ждать секунду + int 0x40 +;------------------------------------------------------------------------------- +; тип события возвращён в eax, далее проверяем, какое событие произошло +;------------------------------------------------------------------------------- + cmp eax,1 ; запрос на перерисовку? + je redraw + cmp eax,2 ; нажата клавиша клавиатуры? + je key + cmp eax,3 ; нажата кнопка в окне программы? + je button + cmp eax,6 ; mouse - click or move? + je MOUSE + jmp event_wait ; возвращаемся к началу цикла ожидания событий + ; если событий нет +;------------------------------------------------------------------------------- +; обработка событий +;------------------------------------------------------------------------------- +redraw: + call draw_window ; вызываем функцию draw_window и + jmp event_wait ; возвращаемся назад к циклу ожидания +key: + mov eax,2 ; считываем код нажатой клавиши. Возвращен в ah. + int 0x40 ; Клавиша должна быть прочитана для очистки + cmp ah,27 + je clos0 ; exit on ESC + jmp event_wait ; возврат к event_wait +button: + mov eax,17 ; считываем идентификатор нажатой кнопки + int 0x40 ; возвращен в ah. +;------------------------------------------------------------------------------- +; смотрим, какая кнопка была нажата и соответствующим образом реагируем. +;------------------------------------------------------------------------------- + cmp ah,100 ; кнопка с id=100("закрыть")? + jne noclose ; + clos0: ; + mov eax,-1 ; функция -1: завершить программу + int 0x40 ; + noclose: ; кнопка id=200( "New" ) + mov dword[pox],0 + mov dword[pox+4],0 ;clear memory + mov dword[pox_],0 ;rest and other stuff + mov word[poxl],0 ; bits of pole X + mov word[pool],0 ; bits of pole O + ;mov byte[fill],0 ; обнуляем счетчик ходов + ;mov byte[xwin],0 ; flag - x winner + ;mov byte[owin],0 ; flag - o winner + jmp redraw ; чистое игровое поле ==>> +;------------------------------------------------------------------------------- +; смотрим, где была нажата мышь +;------------------------------------------------------------------------------- + MOUSE: + mov eax,37 ; мышью.. + mov ebx,2 + int 0x40 + cmp eax,0 ; ..ничего не нажато - ждать событий + je event_wait + ;нажата кнопка мыши + mov eax,37 ; cursor coords + mov ebx,1 + int 0x40 ;eax=x*65536+y + mov [px],eax ;[px][py] - координата ткнутого места + + xor eax,eax + g11: ;1st cell====== + cmp word[px],92 + ja g12 ;>92 + cmp word[py],92 + ja g12 ;>92 + + ;mov dword[idx],0 ;N=(0..8) + jmp puts + + g12: ;2nd cell======== + inc al + cmp word[py],145 + ja g13 ;>142 + cmp word[px],92 + ja g13 ;>92 + ;mov dword[idx],1 ;N=(0..8) + jmp puts + g13: ;3========= + inc al + cmp word[px],92 + ja g21 ;>92 + ;mov dword[idx],2 ;N=(0..8) + jmp puts + g21: ;4======== + inc al + cmp word[px],145 + ja g22 + cmp word[py],92 + ja g22 + ;mov dword[idx],3 ;N=(0..8) + jmp puts + g22: ;5======= + inc al + cmp word[px],145 + ja g23 + cmp word[py],145 + ja g23 + ;mov dword[idx],4 ;N=(0..8) + jmp puts + g23: ;6======= + inc al + cmp word[px],142 + ja g31 ;>142 + ;mov dword[idx],5 ;N=(0..8) + jmp puts + g31: ;7======= + inc al + cmp word[py],92 + ja g32 + ;mov dword[idx],6 ;N=(0..8) + jmp puts + g32: ;8====== + inc al + cmp word[py],145 + ja g33 + ;mov dword[idx],7 ;N=(0..8) + jmp puts + g33: ;9====== + inc al + ;mov dword[idx],8 ;N=(0..8) + + puts: ;уже определили клетку + push eax + pop dword[idx] + mov esi,dword[idx] ; + cmp byte[pox+esi],0 ;поле свободно? (0-свободное поле) + jne event_wait ;возвращаемся назад к циклу ожидания + + shl esi,2 ;*4 + mov eax,dword[pole+esi] + mov dword[px],eax ;x coord from tabl ->px + ;mov ax,word[pole+esi+2] + ;mov word[py],ax ;y coord from tabl ->py + + call x_put ;"X" + + mov esi,dword[idx] ;esi - cell number =0..8 + mov byte[pox+esi],'x' + inc byte[fill] ;turn+1 + + xor eax,eax ;eax=0 + inc eax ;bit=1 eax=1 + mov ecx,dword[idx] ; esi=n + shl ax,cl ; <esi + call rndnext ; случайное число в eax + and eax, 01b ; eax= 0..1 + add esi,eax ; esi+=eax + ;esi=0..8 - index + cmp byte[pox+esi],0 ;случайное поле свободно? + jne rnew ;нет - новое случайное число + + cmp byte[pox+4],0 ;центр свободен? + jne @F ;нет - случайный ход (уже в esi) + mov esi,4 ;да - ходим в центр (4) вместо случ. + @@: + mov dword[idx],esi ;сохраним в idx + ;esi=0..8 - index + call o_com ;проверка 24хъ комбинаций XX0 + call x_com ;проверка 24хъ комбинаций 00* + + mov esi,dword[idx] ;idx-индекс клетки(0..8) куда ход + shl esi,2 ; esi*4 - поле состоит из записей по dword + mov eax,dword[pole+esi] ; + mov dword[px],eax ;x coord from tabl ->px + ; mov ax,word[pole+esi+2] ; + ; mov word[py],ax ;y coord from tabl ->py + call o_put ; рисуем нолик 'O' + + mov esi,dword[idx] + mov byte[pox+esi],'o' + inc byte[fill] ;turn++ + + xor eax,eax ;eax=0 + inc eax ;bit=1 eax=1 + mov ecx,dword[idx] ; ecx=n + shl ax,cl ; <STACK store + mov ecx,begi + lab: + push ecx ; ECX->STACK counter +} + +macro LoopEnd lab,endi +{ + pop ecx ;ECX<-STACK counter + inc ecx + cmp ecx,endi + jne lab + pop ecx ;ECX<-STACK restore +} + + + +;------------------------------------ +; constants +;-----------------------цвет:0xRRGGBB +cBLACK = 0x000000 ; черный +cRED = 0xFF0000 ; красный +cYELLOW = 0x3FFFF00 ; желтый +cGREEN = 0x00FF00 ; зеленый +cNAVY = 0x0000FF ; синий +cMAGENTA = 0xFF00FF ; малиновый +cBLUE = 0x00FFFF ; голубой +cWHITE = 0xFFFFFF ; белый +cBROWN = 0x554433 ; + +;------------------------------- +cMAGENTAl = 0xB800B8 ; magenta +cVIOLETl = 0xF800F8 ; фиолетовый + diff --git a/programs/games/lights/trunk/main.inc b/programs/games/lights/trunk/main.inc new file mode 100644 index 0000000000..a5b72a507e --- /dev/null +++ b/programs/games/lights/trunk/main.inc @@ -0,0 +1,217 @@ +;#************************** +;#* LIGHTS (c)* main.inc +;#************************** 15/10/2007 +L0 equ 0x0000F8 ; light off +L1 equ 0xFFFF00 ; light on +LAG equ 2 +deltaX equ 35 +deltaY equ 35 +posX equ 50 +posY equ 50 + +macro main_loop +{ + +; функция отрисовки окна +draw_window: + mov eax,12 ; функция 12: сообщить системе о + ; состоянии перерисовки окна + mov ebx,1 ; подфункция 1, начало перерисовки + int 0x40 + ; ===== ОКНО !!1 + mov eax,0 ; функция 0: определить и вывести окно + mov ebx,100*65536+270 ; [x начальный] *65536 + [x размер] + mov ecx,100*65536+280 ; [y начальный] *65536 + [y размер] + mov edx,0x02ccddff ; цвет рабочей области RRGGBB + ; 0x02000000 = тип окна 2 + mov esi,0x808899AA ; цвет области заголовка RRGGBB + ; 0x80000000 = цвет перетекает + mov edi,0xFFAAcc ; цвет рамки RRGGBB + int 0x40 + ; НАДПИСЬ в заголовке Lights v0.001 + mov eax,4 ; функция 4: написать текст в окне + mov ebx,8*65536+8 ; [x начальный] *65536 + [y начальный] + mov ecx,0x00224422 ; цвет текста RRGGBB + ; старший байт (0x00) - размер шрифта + ; (маленький) + mov edx,text ; указатель на начало текста + mov esi,texts-text ; длина текста в байтах + int 0x40 + + xor eax,eax ; НАДПИСЬ в окне!!! + mov ecx,eax + lb: ;loop ecx + mov edi,ecx ; + shl edi,3 ; + add edi,tBut ; + add al,byte[edi+1] ; + ; + inc ecx ; + cmp ecx,25 ; + jne lb ;ecx<25 + + cmp eax, 0xE7 ;25 + jne goon + ;int3 + ;call Bin2Hex + mov eax,4 ; функция 4: написать текст в окне + mov ebx,80*65536+250 ; [x начальный] *65536 + [y начальный] + mov ecx,0x10FF22FF ; цвет текста RRGGBB + ; ; старший байт (0x10) - размер шрифта + ; ; (большой) + ;mov edx,txthex + ;mov esi,17 + mov edx,texts ; указатель на начало текста + mov esi,textend-texts ; длина текста в байтах + int 0x40 + + goon: +;------------------------------------------------------------------------------- +; ----КНОПКИ---- +; button() +;------------------------------------------------------------------------------- + + mov eax,8 ; функция 8: определить и вывести кнопку + mov ebx,(200-19)*65536+12 ; [x начальный] *65536 + [x размер] + mov ecx,5*65536+12 ; [y начальный] *65536 + [y размер] + mov edx,100 ; идентификатор кнопки =1 + mov esi,0xFF6611 ; цвет кнопки RRGGBB + int 0x40 ; ===КНОПКА ЗАКРЫТИЯ ОКНА=== + + + LoopBegin labl,0 ;ecx - loop index + ;add ecx,5 + mov edi,ecx + shl edi,3 ;edi*8 -index of table + add edi,tBut + + xor ebx,ebx + mov bl,byte[edi+2] ;X + shl ebx,16 ;*65536=256*256 + add ebx,deltaX-LAG ;dX + xor ecx,ecx + mov cl,byte[edi+3] ;Y + shl ecx,16 ;*65536=256*256 + add ecx,deltaY-LAG ;dY + xor edx,edx + mov dl,byte[edi] ;N + + xor esi,esi + cmp byte[edi+1], 0 ;Color = 0/1 + je lit_off + mov esi,L1 ;on + jmp lend + lit_off: + mov esi,L0 ;off + lend: + mov eax,8 ;8-BUTTON + int 0x40 + LoopEnd labl,25 + +;============================================================= +endbut: + mov eax,12 ; функция 12: сообщить системе о + ; состоянии перерисовки окна + mov ebx,2 ; подфункция 2, перерисовка окончена + int 0x40 + ;ret ; конец функции - это не функция! + +event_wait: + ;mov eax,10 ; функция 10:=0A ожидание события + mov eax,23 + mov ebx,100 + int 0x40 + +; тип события возвращён в eax, далее проверяем, какое событие произошло +;------------------------------------------------------------------------------- + cmp eax,1 ; запрос на перерисовку? + je redraw + cmp eax,2 ; нажата клавиша клавиатуры? + je key + cmp eax,3 ; нажата кнопка в окне программы? + je button + + jmp event_wait ; возвращаемся к началу цикла ожидания событий + +; после того, как событие идентифицировано, его надо обработать +;------------------------------------------------------------------------------- +redraw: + call draw_window ; вызываем функцию draw_window и + jmp event_wait ; возвращаемся назад к циклу ожидания + +key: + mov eax,2 ; считываем код нажатой клавиши. Возвращен в ah. + int 0x40 ; Клавиша должна быть прочитана для очистки + cmp ah,27 + je clos0 ; exit on ESC + ; + jmp event_wait ; возврат к event_wait + +button: + mov eax,17 ; считываем идентификатор нажатой кнопки + int 0x40 ; возвращен ah. + +;------------------------------------------------------------------------------- +; смотрим, какая кнопка была нажата и соответствующим образом реагируем. +;------------------------------------------------------------------------------- + cmp ah,100 ; кнопка с id=100("закрыть")? + jne noclose + clos0: + mov eax,-1 ; функция -1: завершить программу + int 0x40 ; кнопка 5-29 + noclose: + + xor ecx,ecx ; + mov cl,ah ; + sub ecx,5 ; ecx - index for tBut + + mov edi,ecx + call x_lit ;+0 - центр + mov [tButIdx],edi ;save index + + mov edi,[tButIdx] + cmp byte[edi+6],0 + je next000 + mov edi,ecx + inc edi + call x_lit ;+1 справа + + next000: + mov edi,[tButIdx] + cmp byte[edi+5],0 + je next001 + mov edi,ecx + dec edi + call x_lit ;-1 слева + + next001: + mov edi,[tButIdx] + cmp byte[edi+4],0 + je next002 + mov edi,ecx + sub edi,5 + call x_lit ;-5 сверху + + next002: + mov edi,[tButIdx] + cmp byte[edi+7],0 + je next003 + mov edi,ecx + add edi,5 + call x_lit ;+5 снизу + next003: + call draw_window + jmp event_wait +;================================-- + x_lit: ; edi - index + shl edi,3 ; edi*8 -index of table tBut + add edi,tBut ; + not byte[edi+1] ; invert second byte = L0/L1 + ret ; +;================================-- + call draw_window ;наша кнопка;) +; здесь проверяем остальные кнопки + jmp event_wait ;возвращаемся к циклу ожидания +} + + diff --git a/programs/games/sw/trunk/sw.asm b/programs/games/sw/trunk/sw.asm new file mode 100644 index 0000000000..43747e12b0 --- /dev/null +++ b/programs/games/sw/trunk/sw.asm @@ -0,0 +1,1372 @@ +;v. 0.4: 20.10.2009 staper@inbox.ru + +use32 + org 0x0 + db 'MENUET01' + dd 0x1 + dd START + dd I_END + dd (I_END+600) and not 3 + dd (I_END+600) and not 3 + dd 0x0,0x0 + +DEBUG equ 0 + +use_new_logic equ 1 ;фюсрты хЄ яЁютхЁъє ъыхЄъш эр "юъЁєц╕ээюёЄ№", яЁюуЁрььр т√сшЁрхЄ эршсюыхх ётюсюфэє■ +use_ext_logic equ 1 ;ъ use_new_logic, фюяюыэшЄхы№эр  яЁютхЁър  ўххъ тюъЁєу чрфрээющ ъыхЄъш + +include '../../../macros.inc' +include 'lang.inc' + +;include 'debug.inc' + +macro dbg_dec num +{pushad +newline +debug_print_dec num +popad} + + +START: + + mcall 40,100111b + mcall 3 + mov [rsx1],ax + shr eax,16 + mov [rsx2],ax + jmp new_game + +redraw_all: + mcall 12,1 + mcall 0,100*65536+432,100*65536+260,0x34FFFFFF,,title + mcall 38,1*65536+421,27*65536+27,0x00b0b0b0 + mov edi,10 + @@: add ecx,20*65536+20 + mcall + dec edi + jnz @b + mcall ,1*65536+1,27*65536+226,;000000 + mov edi,21 + @@: add ebx,20*65536+20 + mcall + dec edi + jnz @b + mcall 13,202*65536+19,27*65536+202,0xFFFFFF + mcall 4,40*65536+12,0x80000000,text_user + mcall ,350*65536+12,,text_cpu + mcall 8,120*65536+70,7*65536+15,2,0xFFFFFF + mcall ,230*65536+70,,3, + mcall 4,135*65536+12,0x80000000,but_new + mcall ,240*65536+12,,but_auto + mcall 12,2 +ret + +draw_pole: +; mcall 0,100*65536+432,100*65536+260,0x74FFFFFF,,title + if DEBUG + call SysMsgBoardNum ;show esp + mcall 8,200*65536+10,7*65536+15,4,0xFFFFFF + endf + + + + mov esi,table1 + mov edi,90 + mov ebp,10 + mov ebx,1*65536+21 + mov ecx,27*65536+47 + call draw_bots + + mov esi,table5 + mov edi,90 + mov ebp,10 + mov ebx,221*65536+241 + mov ecx,27*65536+47 + call draw_bots + cmp [u_kill],10 + jne @f + mcall 4,69*65536+12,0x80ff0000,text_win + bts [flags],5 + @@: cmp [c_kill],10 + jne @f + mcall 4,372*65536+12,0x80ff0000,text_win + bts [flags],5 + @@: mcall 12,2 + cmp [number_bots],10 + jne still + bts [flags],0 +still: + mcall 10 + + cmp eax,6 + je mouse + dec eax + jnz @f + call redraw_all + jmp draw_pole +@@: dec eax + jz key + dec eax + jz button + jmp still + +key: + mcall 2 + jmp still + +button: + mcall 17 + dec ah + jnz @f + mcall -1 + + @@: mov ecx,(344)/4 + mov esi,table1 + .3: mov dword [esi],0 + add esi,4 + loop .3 + + dec ah + jz @f + + mov [flags],1001b ;auto fill + mov [number_bots],0 + + call set_bots + mov [number_bots],0 + bts [flags],2 + call set_bots + call redraw_all + btc [flags2],0 + jc second_pole.comp + jmp draw_pole + + @@: ;new game + mov [number_bots],0 +new_game: + mov [flags],1100b + call set_bots + btr [flags],0 + btr [flags],3 + btr [flags],2 + mov [number_bots],0 + call redraw_all + jmp draw_pole + +draw_bots: + cmp byte [esi],1 + je .one + cmp byte [esi],2 + je .two + cmp byte [esi],3 + je .three + cmp byte [esi],4 + jne .null + bts [flags],4 + jmp .three + +.end: + inc esi + dec ebp + jnz draw_bots + test edi,edi + jz @f + sub edi,10 + mov ebp,10 + add ebx,-200*65536-200 + add ecx,20*65536+20 + jmp draw_bots + @@: +ret + +.one: + push ebx ecx + call .0 + mov edx,0x00aa66 + mcall 13 + pop ecx ebx +.null: + add ebx,20*65536+20 + jmp .end +.two: + push ebx ecx + add ebx,8*65536-6 + add ecx,12*65536-12 + mcall 38,,,0x508cec + add ecx,-6*65536+6 + mcall + pop ecx ebx + jmp .null +.three: + push ebx ecx + call .0 + mov edx,0x00FF0000 + bt [flags],4 + jnc @f + mov edx,0x00555555 + btr [flags],4 + @@: mcall 13 + pop ecx ebx + xor edx,edx + mcall 38 + add ecx,20*65536-20 + mcall + add ecx,-20*65536+20 + jmp .null + +.0: + shr ebx,16 + inc bx + shl ebx,16 + add ebx,19 + shr ecx,16 + inc cx + shl ecx,16 + add ecx,19 +ret + +mouse: + bt [flags],5 + jc still + mcall 37,2 + test eax,eax + jz still + cmp al,2 + jg still + ;1 - левая кнопка, 2 - правая + dec al + jnz .mouse_1 + btr [flags],1 + jmp @f + .mouse_1: + bts [flags],1 + @@: + mcall 37,1 + mov dx,ax + shr eax,16 + cmp dx,27 + jbe still + cmp dx,227 + jge still + cmp ax,1 + jbe still + cmp ax,201 + jge second_pole + ;первое поле + bt [flags],0 + jc still + sub ax,1 + push dx + xor edx,edx + mov cx,20 + div cx + pop dx + mov [oX],al + push ax + sub dx,27 + mov ax,dx + xor dx,dx + div cx + mov [oY],al + xor dx,dx + mov cx,10 + mul cx + pop dx + add ax,dx + cmp ax,100 + jg still + +set_bot: + mov esi,table1 + bt [flags],2 + jnc @f + mov esi,table2 + @@: mov edi,esi + add edi,100 + cmp [number_bots],6 + jnb .1paluba + cmp [number_bots],3 + jnb .2paluba + cmp [number_bots],0 + je .4paluba + jmp .3paluba + +.4paluba: + bt [flags],1 ;четырёхпалубный + jnc @f + cmp [oX],6 + jg _still + jmp .41 + @@: cmp [oY],6 + jg _still + .41: inc [number_bots] + mov [edi],al + bt [flags],1 + jc @f + add al,10 + mov [edi+1],al + add al,10 + mov [edi+2],al + add al,10 + mov [edi+3],al + jmp init_table + @@: inc al + mov [edi+1],al + inc al + mov [edi+2],al + inc al + mov [edi+3],al + jmp init_table + + +.3paluba: ;трёхпалубный + bt [flags],1 + jnc @f + cmp [oX],7 + jg _still + jmp .31 + @@: cmp [oY],7 + jg _still + .31: + call find_near + + bt [flags],1 + jc @f + add al,10 + call find_near + add al,10 + call find_near + sub al,20 + jmp .32 + @@: inc al + call find_near + inc al + call find_near + sub al,2 + .32: + inc [number_bots] + mov ecx,4 + mov dl,[number_bots] + sub dl,2 + jz @f + add ecx,3 + @@: + mov [edi+ecx],al + bt [flags],1 + jc @f + add al,10 + mov [edi+ecx+1],al + add al,10 + mov [edi+ecx+2],al +jmp init_table + @@: inc al + mov [edi+ecx+1],al + inc al + mov [edi+ecx+2],al +jmp init_table + + + +.2paluba: ;двухпалубный + bt [flags],1 + jnc @f + cmp [oX],8 + jg _still + jmp .21 + @@: cmp [oY],8 + jg _still + .21: + call find_near + bt [flags],1 + jc @f + add al,10 + call find_near + sub al,10 + jmp .22 + @@: inc al + call find_near + dec al + .22: + inc [number_bots] + mov ecx,8 + mov dl,[number_bots] + sub dl,4 + jz @f + add ecx,2 + dec dl + jz @f + add ecx,2 + @@: add ecx,2 + mov [edi+ecx],al + bt [flags],1 + jc @f + add al,10 + mov [edi+ecx+1],al +jmp init_table + @@: inc al + mov [edi+ecx+1],al +jmp init_table + + +.1paluba: ;однопалубный + call find_near + inc [number_bots] + xor edx,edx + movzx ecx,[number_bots] + add ecx,9 + mov [edi+ecx],al +jmp init_table + +find_near: + push ax + call f_near ;0 + + cmp al,10 + jb @f + sub al,10 ;-10 + call f_near + +@@: cmp al,11 + jb @f + + xor edx,edx + mov ecx,10 + div cx + mov ax,[esp] + cmp dx,0 + je @f + + sub al,11 ;-11 + call f_near + +@@: cmp al,9 + jb @f + + xor edx,edx + mov ecx,10 + div cx + mov ax,[esp] + cmp dx,9 + je @f + + sub al,9 ;-9 + call f_near + +@@: cmp al,1 + jb @f + + xor edx,edx + mov ecx,10 + div cx + mov ax,[esp] + cmp dx,0 + je @f + + dec al ;-1 + call f_near + +@@: cmp al,99 + jg @f + + xor edx,edx + mov ecx,10 + div cx + mov ax,[esp] + cmp dx,9 + je @f + + inc al ;+1 + call f_near + +@@: cmp al,90 + jge @f + add al,10 ;+10 + call f_near + +@@: cmp al,91 + jge @f + + xor edx,edx + mov ecx,10 + div cx + mov ax,[esp] + cmp dx,0 + je @f + + add al,9 ;+9 + call f_near + +@@: cmp al,89 + jge @f + + xor edx,edx + mov ecx,10 + div cx + mov ax,[esp] + cmp dx,9 + je @f + add al,11 ;+11 + call f_near + +@@: pop ax +; xor bl,bl +; bt [flags],6 +; jnc @f +; bt [flags],9 +; jnc @f +; inc [p_pov] +; cmp [p_pov],20 +; jb @f +; bts [flags],9 +; @@: + btr [flags],6 + clc +ret + +f_near: + bt [flags],6 + jnc .2 +; bt [flags],9 +; jc @f +; cmp byte [esi+eax],2 +; jge @f +; @@: + cmp byte [esi+eax],4 + je @f + mov ax,[esp+4] + ret + @@:; add esp,4 +; jmp second_pole.cpu + mov ax,[esp+4] + mov cx,ax + add esp,6 + btr [flags],6 + stc +; mov bl,1 + ret + + .2: movzx edx, byte [smeshenie] + @@: cmp al,[edi+edx] + je .end + dec dl + jnz @b + cmp al,[edi] + je .end + mov ax,[esp+4] + ret + .end: add esp,10 + jmp _still + + + +init_table: +; xor eax,eax + movzx ecx, byte [number_bots] + mov edx,3 + dec cl + jz .i_t + + mov al,2 +.2: add dl,3 + dec cl + jz .i_t + dec al + jnz .2 + + mov al,3 +.3: add dl,2 + dec cl + jz .i_t + dec al + jnz .3 + + mov al,4 +.4: inc dl + dec cl + jz .i_t + dec al + jnz .4 + +.i_t: mov [smeshenie],dl +@@: movzx eax, byte [edi+edx] + mov byte [esi+eax],1 + dec dl + jnz @b + movzx eax, byte [edi] + mov byte [esi+eax],1 + bt [flags],3 + jc set_bots +; mcall 12,1 + jmp draw_pole + + +second_pole: + cmp ax,221 + jbe still + cmp ax,421 + jge still + ;второе поле + bt [flags],0 + jnc still + sub ax,221 + push dx + xor edx,edx + mov cx,20 + div cx + pop dx + push ax + sub dx,27 + mov ax,dx + xor dx,dx + div cx + xor dx,dx + mov cx,10 + mul cx + pop dx + add ax,dx + cmp ax,100 + jg still + + mov edi,table2 + mov esi,table5 + cmp byte [esi+eax],2 + jge still + mov bl, byte [edi+eax] + add bl,2 + mov ecx,table5 + call if_bot_killed + mov [esi+eax],bl + cmp bl,3 + jge .m_end +.comp: mov esi,table1 + + + + .cpu: +; jmp .rndm + xor eax,eax +; mov edi,4 + btr [flags],8 + xor ecx,ecx + mov edx,tbl_ranen + mov dword [edx],0 + @@: mov al,[esi+ecx] ;поиск "подраненного корабля" + cmp al,3 + je .0 + cmp cl,99 + jge .1 + inc cl + jmp @b + .0: mov [edx],cl +if DEBUG +dbg_dec ecx +endf + inc edx + inc cl + jmp @b + + .1: + dec edx + mov cl,[edx] + cmp edx,tbl_ranen + jb .rndm + je @f + sub cl,[edx-1] + cmp cl,1 + jne .2 + add cl,[edx-1] + jmp .12 + .2: + add cl,[edx-1] + jmp .13 + + @@: bts [flags],8 + mov eax,4 + call random + dec al + jz .11 + dec al + jz .12 + dec al + jz .13 + jmp .14 + .11: +if DEBUG +dbg_dec 100 +endf + cmp cl,10 + jge @f + bts [flags],8 + jmp .12 + @@: sub cl,10 + cmp byte [esi+ecx],2 + jge @f + mov eax,ecx + bts [flags],6 + call find_near +; test bl,bl +; jz .20 + jnc .20 + @@: bts [flags],8 + add cl,10 + bts [flags],8 + .12: +if DEBUG +dbg_dec 200 +endf + movzx eax,cl + push cx + mov ch,10 + div ch + pop cx + cmp ah,9 + jb @f + .121: + bt [flags],8 + jc .13 + bts [flags],8 + mov edx,tbl_ranen + mov cl,[edx] + jmp .14 + @@: inc cl + cmp byte [esi+ecx],2 + jge @f + mov eax,ecx + bts [flags],6 + call find_near +; test bl,bl +; jz .20 + jnc .20 + @@: dec cl + jmp .121 + + .13: +if DEBUG +dbg_dec 300 +endf + cmp cl,90 + jb @f + .131: + bt [flags],8 + jc .14 + bts [flags],8 + mov edx,tbl_ranen + mov cl,[edx] + jmp .11 + @@: add cl,10 + cmp byte [esi+ecx],2 + jge @f + mov eax,ecx + bts [flags],6 + call find_near +; test bl,bl +; jz .20 + jnc .20 + @@: sub cl,10 + jmp .131 + + .14: +if DEBUG +dbg_dec 400 +endf + movzx eax,cl + push cx + mov ch,10 + div ch + pop cx + cmp ah,0 + jne @f + .141: + bts [flags],8 + jmp .11;cpu;rndm + @@: dec cl + cmp byte [esi+ecx],2 + jge @f + mov eax,ecx + bts [flags],6 + call find_near +; test bl,bl +; jz .20 + jnc .20 + @@: inc cl + jmp .141 + +.rndm: + + mov eax,100 + call random + cmp eax,100 + jb @f + shr eax,1 +@@: + +if use_new_logic + btc [flags],10 + jnc @f + btc [flags],9 + jnc @f + call check_freedom +endf + +@@: cmp byte [esi+eax],2 + jb @f; .rndm + ;поиск свободной клеточки перед/после выбранной, + ;иначе random иногда входит в бесконечный цикл + bt ax,0 + jnc .r_1 + .r_0: + cmp al,0 + je .r_1 + dec al + + cmp byte [esi+eax],2 + jb @f + jmp .r_0 + .r_1: + cmp al,99 + je .r_0 + inc al + + cmp byte [esi+eax],2 + jb @f + jmp .r_1 +@@: + bts [flags],6 + call find_near +; test bl,bl +; jnz .cpu + jc .cpu;20 + +.20: + mov bl,[esi+eax] + add bl,2 + mov ecx,esi + mov edi,esi + call if_bot_killed + mov [esi+eax],bl +; cmp [u_kill],10 +; je .m_end + cmp [c_kill],10 + je .m_end + cmp bl,3 + jge .cpu + +.m_end:; mcall 12,1 +jmp draw_pole + +if_bot_killed: + push ebx + add edi,100 + mov ebx,19 + @@: cmp al,[edi+ebx] + je @f + dec ebx + jnz @b + cmp al,[edi+ebx] + jne .end + @@: + cmp ebx,16 + jnb .end_i + + @@: cmp bl,10 + jb .2 + btc bx,0 + mov bl, [edi+ebx] + cmp byte [ecx+ebx],3 + jne .end + inc byte [ecx+ebx] + jmp .end_i + + .2: cmp bl,4 + jb .3 + add edi,4 + cmp bl,7 + jb .3 + add edi,3 + .3: movzx edx, byte [edi] + cmp dl,al + je @f + cmp byte [ecx+edx],3 + jne .end + @@: mov dl,[edi+1] + cmp dl,al + je @f + cmp byte [ecx+edx],3 + jne .end + @@: mov dl,[edi+2] + cmp dl,al + je @f + cmp byte [ecx+edx],3 + jne .end + + @@: cmp bl,4 + jnb @f + mov dl,[edi+3] + cmp dl,al + je @f + cmp byte [ecx+edx],3 + jne .end + + + @@: mov dl,[edi] + cmp dl,al + je @f + inc byte [ecx+edx] + @@: mov dl,[edi+1] + cmp dl,al + je @f + inc byte [ecx+edx] + @@: mov dl,[edi+2] + + cmp bl,4 + jnb .9;@f + +; cmp dl,al +; je .end_i +; inc byte [ecx+edx] +; jmp .end_i + + + @@: cmp dl,al + je @f + inc byte [ecx+edx] + @@: mov dl,[edi+3] +.9: cmp dl,al + je .end_i + inc byte [ecx+edx] + .end_i: + pop ebx + inc ebx + cmp ecx,table5 + jne @f + inc [u_kill] + ret + @@: inc [c_kill] + ret + .end: pop ebx +ret + + + + +_still: + bt [flags],3 + jnc still + +set_bots: + cmp [number_bots],10 + jne @f + ret + @@: xor edx,edx + mov ecx,10 + cmp [number_bots],6 + jb @f + push dword 10 + jmp .1 + @@: cmp [number_bots],3 + jb @f + push dword 9 + jmp .1 + @@: cmp [number_bots],2 + jb @f + push dword 8 + jmp .1 + @@: push dword 7 + .1: + mov eax,[esp] + call random + mov [oX],al + mul cl + mov cl,al + mov eax,[esp] + call random + mov [oY],al + add cl,al + + cmp cl,100 + jge .1 + + add esp,4 + mov eax,2 + call random + cmp al,1 + jne @f + bts [flags],1 + mov al,cl + jmp set_bot + @@: btr [flags],1 + mov al,cl + jmp set_bot + + + + + + +;процедура отлавливает "наиболее свободную" из клеток для атаки + +if use_new_logic +check_freedom: +; mov esi,table1 + push ax + push word 100 + xor eax,eax + mov ebx,0x900 + +.1: bts [flags],6 + call find_near + jc .11 + cmp byte [esi+eax],2 ;0 + jb @f +.11: inc bl + +@@: cmp al,10 ;-10 + jb @f + push ax + + sub al,10 + if use_ext_logic + bts [flags],6 + call find_near + jc .21 + endf + cmp byte [esi+eax],2 + jb .22 +.21: inc bl +.22: pop ax + +@@: cmp al,11 + jb @f + push ax + + xor edx,edx + mov ecx,10 + push ax + div cx + pop ax + + cmp dx,0 + je .32 + + sub al,11 + if use_ext_logic + bts [flags],6 + call find_near + jc .31 + endf + cmp byte [esi+eax],2 ;-11 + jb .32 +.31: inc bl +.32: pop ax + +@@: cmp al,9 + jb @f + push ax + + xor edx,edx + mov ecx,10 + push ax + div cx + pop ax + cmp dx,9 + je .42 + + sub eax,9 + if use_ext_logic + bts [flags],6 + call find_near + jc .41 + endf + cmp byte [esi+eax],2 ;-9 + jb .42 +.41: inc bl +.42: pop ax + +@@: cmp al,1 + jb @f + push ax + + xor edx,edx + mov ecx,10 + push ax + div cx + pop ax + cmp dx,0 + je .52 + + dec al + if use_ext_logic + bts [flags],6 + call find_near + jc .51 + endf + cmp byte [esi+eax],2 ;-1 + jb .52 +.51: inc bl +.52: pop ax + +@@: cmp al,99 + jg @f + push ax + + xor edx,edx + mov ecx,10 + push ax + div cx + pop ax + cmp dx,9 + je .62 + + inc al + if use_ext_logic + bts [flags],6 + call find_near + jc .61 + endf + cmp byte [esi+eax],2 ;+1 + jb .62 +.61: inc bl +.62: pop ax + +@@: cmp al,90 + jge @f + push ax + add al,10 + if use_ext_logic + bts [flags],6 + call find_near + jc .71 + endf + cmp byte [esi+eax],2 ;+10 + jb .72 +.71: inc bl +.72: pop ax + +@@: cmp al,91 + jge @f + push ax + xor edx,edx + mov ecx,10 + push ax + div cx + pop ax + cmp dx,0 + je .82 + + add al,9 + if use_ext_logic + bts [flags],6 + call find_near + jc .81 + endf + cmp byte [esi+eax],2 ;+9 + jb .82 +.81: inc bl +.82: pop ax + +@@: cmp al,89 + jge @f + push ax + + xor edx,edx + mov ecx,10 + push ax + div cx + pop ax + + cmp dx,9 + je .92 + + add al,11 + if use_ext_logic + bts [flags],6 + call find_near + jc .91 + endf + cmp byte [esi+eax],2 ;+11 + jb .92 +.91: inc bl +.92: pop ax + +@@: bt [flags],7 + jc .ret + cmp byte [esi+eax],1 + jg @f + cmp bl,bh + jg @f + +; shl ebx,8 + bts [flags],6 + call find_near +; xchg cl,bl +; shr ebx,8 +; test cl,cl +; jnz @f + jc @f + + shl bx,8 + pop dx ;dh - ближайшая слева свободнейшая клетка, dl - справа + pop cx ;cl - рандомно выбранная клетка +; cmp al,dl +; jg .5 +; cmp al,cl +; jb .4 +; mov dl,al +; jmp .5 +;.4: cmp al,dh +; jb .5 +; mov dh,al + cmp al,dh + jb .5 + cmp al,cl + jg .4 + mov dh,al + jmp .5 +.4: cmp al,dl + jg .5 + mov dl,al +.5: push cx dx +@@: xor bl,bl + inc al + cmp al,100 + jb .1 + pop dx ax + +if DEBUG +dbg_dec eax +dbg_dec edx +endf + cmp dl,100 + jb @f + mov al,dh + ret +@@: mov al,dh + push dx + bts [flags],7 + call .1 + shl bx,8 + mov al,[esp] + call .1 + pop dx + btr [flags],7 + mov al,dl + test bl,bh + jbe .ret + mov al,dh +.ret: +ret + +endf + + + + + + + +align 4 +rsx1 dw ?;0x4321 +rsx2 dw ?;0x1234 +random: ; из ASCL + push ecx edx esi + mov cx,ax + mov ax,[rsx1] + mov bx,[rsx2] + mov si,ax + mov di,bx + mov dl,ah + mov ah,al + mov al,bh + mov bh,bl + xor bl,bl + rcr dl,1 + rcr ax,1 + rcr bx,1 + add bx,di + adc ax,si + add bx,0x62e9 + adc ax,0x3619 + mov [rsx1],bx + mov [rsx2],ax + xor dx,dx + cmp ax,0 + je nodiv + cmp cx,0 + je nodiv + div cx +nodiv: + mov ax,dx + pop esi edx ecx + and eax,0000ffffh +ret + + +if DEBUG +SysMsgBoardNum: ;warning: destroys eax,ebx,ecx,esi + mov ebx,esp + mov ecx,8 + mov esi,(number_to_out+1) +.1: + mov eax,ebx + and eax,0xF + cmp al,10 + sbb al,69h + das + mov [esi+ecx],al + shr ebx,4 + loop .1 + dec esi + mcall 71,1,number_to_out +ret + +number_to_out db '0x00000000',13,10,0 +endf + + + + +text_cpu db 'CPU',0 +text_user db 'USER',0 +if lang eq ru +title db 'Морской бой 0.4',0 +but_auto db 'Расставить',0 +but_new db 'Новая',0 +text_win db 'Выиграл!',0 +else +title db 'Sea war 0.4',0 +but_auto db 'Auto fill',0 +but_new db 'New',0 +text_win db 'Won!',0 +endf + +I_END: +; t1,t3,t5: 0-непомеченная клеточка, 1-занятая, 2-"промах", 3-"горит", 4-"потоплен" +; t2,t4: таблицы расположения элементов, 1 элемент по 4 клетки, 2x3, 3x2, 4x1 +align 16 +table1 rb 100 ;левое поле +table3 rb 20 +table2 rb 100 ;правое +table4 rb 20 +table5 rb 100 +u_kill rb 1 +c_kill rb 1 +p_pov rb 1 +smeshenie rb 1 +number_bots rb 1 +oX rb 1 +oY rb 1 +tbl_ranen rb 4 + +flags rw 1 +flags2 rw 1 +;бит 0: 0/1 - заполнение таблиц /игра +;1: нажата левая кнопка мыши (вертикаль) /правая (горизонталь) +;2: заполняется левое поле /правое +;3: ручное заполнение /автозаполнение +;4: в .three - потопленный корабль +;5: игра окончена +;6: в second_pole - вызов find_near +;7: в check_freedom +;8: зарезервировано +;9: зарезервировано +;10: зарезервировано \ No newline at end of file