?login_element?

Subversion Repositories NedoOS

Rev

Rev 1985 | Rev 2032 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. tkeyangle=$-5
  2.               ;LRDU
  3.        ;DB -1 ;0000
  4.        ;DB 128;0001
  5.        ;DB 0  ;0010
  6.        ;DB -1 ;0011
  7.        ;DB 64 ;0100
  8.         DB 96 ;0101
  9.         DB 32 ;0110
  10.         DB 64 ;0111
  11.         DB 192;1000
  12.         DB 160;1001
  13.         DB 224;1010
  14.         DB 192;1011
  15.         DB -1 ;1100
  16.         DB 128;1101
  17.         DB 0  ;1110
  18.         DB -1 ;1111
  19. tkeyangleend
  20.  
  21. ;в 0x4000 включена pgmap
  22. CONTROL
  23.         LD HL,(IMcurXx+1)
  24.         LD a,(IMcurYy+1)
  25.         ld h,a
  26.         ;корректировать адрес стены в зависимости от направления
  27.         ld a,(IMavision+1)
  28.         sub 32
  29.         cp 64
  30.         jr nc,$+3
  31.          inc h      
  32.         bit 6,a
  33.         jr z,$+4
  34.          SET mapdifbit,L        
  35.         cp -64
  36.         jr c,$+3
  37.          inc l
  38.         ld (touchedwalladdr),hl
  39.  
  40.         ld a,0xf7
  41.         in a,(0xfe)
  42.         and 0x1f
  43. oldeditkeys=$+1
  44.         ld c,0
  45.         ld (oldeditkeys),a
  46.         cp c
  47.         jr z,noedit
  48.         ld c,a
  49.         bit 0,c
  50.         jr nz,noedit1
  51.         ld a,(hl)
  52.         or a
  53.         ld (hl),0xc0
  54.         jr z,edit1q
  55.          set 6,a
  56.         add a,2
  57.         cp 0xc0+(2*12)
  58.         jr c,$+4
  59.         ld a,0xc0
  60.          xor (hl)
  61.          and 0x3f
  62.          xor (hl)
  63.         ld (hl),a
  64. edit1q
  65. noedit1
  66.         bit 1,c
  67.         jr nz,noedit2
  68.         ld a,(hl)
  69.         or a
  70.         ld (hl),0xc0
  71.         jr z,edit2q
  72.          set 6,a
  73.         sub 2
  74.         cp 0xc0
  75.         jr nc,$+4
  76.         ld a,0xc0+(2*11)
  77.          xor (hl)
  78.          and 0x3f
  79.          xor (hl)
  80.         ld (hl),a
  81. edit2q
  82. noedit2
  83.         bit 2,c
  84.         jr nz,noedit3
  85.         ld a,(hl)
  86.         xor 1 ;mirror
  87.         ld (hl),a
  88. noedit3
  89.         bit 3,c
  90.         jr nz,noedit4
  91.         ld (hl),0
  92. noedit4
  93.         bit 4,c
  94.         jr nz,noedit5
  95.         ld a,(hl)
  96.         or a
  97.         jr z,noedit5
  98.         xor 64 ;page
  99.         ld (hl),a
  100. noedit5
  101. noedit
  102.  
  103. ;режимы двери:
  104. ;0: дверь закрыта
  105. ;1: дверь открывается, doortimer увеличивается
  106. ;2: дверь открыта, dooropentimer уменьшается
  107. ;3: дверь закрывается, doortimer уменьшается
  108. doortimer=$+1
  109.         ld a,0
  110. doortimermode=$+1
  111.         ld b,0
  112.         djnz control_door_noopening
  113.         add a,2
  114.         ld (doortimer),a
  115.         jr nz,control_doorq
  116.         dec a ;-1
  117.         ld (doortimer),a ;stay opened
  118.         ld a,50 ;a=door open time
  119.         ld (dooropentimer),a
  120.         ld a,2
  121.         ld (doortimermode),a
  122.         jr control_doorq
  123. control_door_noopening
  124.         djnz control_door_noopened
  125. dooropentimer=$+1
  126.         ld a,0
  127.         dec a
  128.         ld (dooropentimer),a
  129.         jr nz,control_doorq
  130.         ;call closecurrentdoor ;keeps hl
  131.         ld a,-2
  132.         ld (doortimer),a ;stay opened
  133.         ld a,3
  134.         ld (doortimermode),a
  135.         jr control_doorq
  136. control_door_noopened
  137.         djnz control_door_noclosing
  138. ;если игрок стоит в дверях, то не закрываем, а открываем
  139.         LD HL,(IMcurXx+1)
  140.         LD a,(IMcurYy+1)
  141.         ld h,a
  142.         ld a,ID_DOOR
  143.         cp (hl)
  144.         jr z,control_door_setopened
  145.         inc h
  146.         cp (hl)
  147.         jr z,control_door_setopened
  148.         dec h
  149.         set mapdifbit,l
  150.         cp (hl)
  151.         jr z,control_door_setopened
  152.         inc l
  153.         cp (hl)
  154.         jr z,control_door_setopened
  155.         ld a,(doortimer)
  156.         sub 2
  157.         ld (doortimer),a
  158.         jr nz,control_doorq
  159.         ;xor a
  160.         ld (doortimermode),a
  161.         call closecurrentdoor ;keeps hl
  162.         jr control_doorq
  163. control_door_setopened
  164.         ld a,1
  165.         ld (doortimermode),a
  166. control_door_noclosing
  167. control_doorq
  168.  
  169.        IF kempston
  170.         LD C,#FF
  171.         IN A,(#1F)
  172.         LD B,A
  173.         AND #E0
  174.         jr NZ,nKEMPSTON
  175.         LD A,B
  176.         RRA
  177.         jr NC,$+4
  178.         RES 1,C
  179.         RRA
  180.         jr NC,$+4
  181.         RES 0,C
  182.         RRA
  183.         jr NC,$+4
  184.         RES 3,C
  185.         RRA
  186.         jr NC,$+4
  187.         RES 2,C
  188.         RRA
  189.         jr NC,$+4
  190.         RES 6,C
  191. nKEMPSTON
  192. ;C=%1f11durl
  193.        ENDIF
  194.        IF autostrafe
  195.         BIT 3,C ;down
  196.         jr NZ,nAUTOSTRAFE
  197.         LD A,C
  198.         BIT 1,A
  199.         jr NZ,$+6
  200.         AND %01101111 ;strafe + rotate flag
  201.         OR %00001011 ;block down & rotate
  202.         BIT 0,A
  203.         jr NZ,$+6
  204.         AND %01011111 ;strafe + rotate flag
  205.         OR %00001011 ;block down & rotate
  206.         LD C,A
  207. nAUTOSTRAFE
  208.        ENDIF
  209.         LD B,#FF
  210.         ld a,#fe
  211.         in a,(#fe)
  212.         rra
  213.         rl b ;cs (open)
  214.         LD A,#7F
  215.         IN A,(#FE)
  216.         RRA
  217.         RL B ;space (fire)
  218.         LD A,#FD
  219.         IN A,(#FE)
  220.         RRA
  221.         RL B ;A
  222.         RRA
  223.         RRA
  224.         RL B ;D
  225.         RLA
  226.         RL B ;S (down)
  227.         LD A,#FB
  228.         IN A,(#FE)
  229.         RRA
  230.         RRA
  231.         RL B ;W (up)
  232.         LD A,#DF
  233.         IN A,(#FE)
  234.         RRA
  235.         RL B ;P (right)
  236.         RRA
  237.         LD A,B
  238.         RLA ;O (left)
  239.        IF kempston
  240.         AND C
  241.        ENDIF
  242.  
  243. ;A=%ofADdurl
  244.  
  245.        IF demoplay
  246. demoplayoff=$
  247.         OR A
  248.         jr C,demoplayQ
  249.        BIT 4,A ;"D"
  250.        jr NZ,demoplaynOFF
  251.         LD A,#37 ;scf
  252.         LD (demoplayoff),A
  253.         LD A,#91 ;sub c
  254.         LD (mouseon),A
  255.         LD A,#FF
  256. demoplaynOFF
  257. democursor=$+1
  258.         LD HL,demobegin
  259. demokey=$+1
  260.         LD A,%00111111
  261. demokeytime=$+1
  262.         LD C,1
  263.         DEC C
  264.         jr NZ,CnNEWKEY
  265.         LD A,(HL)
  266.         LD (demokey),A
  267.         INC HL
  268.         LD C,(HL)
  269.         INC HL
  270.         LD (democursor),HL
  271. CnNEWKEY
  272.         LD HL,demokeytime
  273.         LD (HL),C
  274. demoplayQ
  275.        ELSE
  276.        IF demorec
  277. democursor=$+1
  278.         LD HL,demobegin
  279. demokeytime=$+1
  280.         LD C,0
  281.         INC C
  282.         jr Z,CNEWKEY
  283.         CP (HL)
  284.         jr Z,CnNEWKEY
  285. CNEWKEY
  286.         INC HL
  287.         LD (HL),C
  288.         LD C,0
  289.         INC HL
  290. CnNEWKEY
  291.         LD (HL),A
  292.         LD (democursor),HL
  293.         LD HL,demokeytime
  294.         LD (HL),C
  295.        ENDIF
  296.        ENDIF
  297.  
  298. ;a=%ofADdurl
  299.        PUSH AF
  300.         bit 7,a
  301.         jr nz,noopendoor
  302.         ;call closecurrentdoor ;keeps hl
  303.  
  304.         ;LD HL,(IMcurXx+1)
  305.         ;LD a,(IMcurYy+1)
  306.         ;ld h,a
  307. touchedwalladdr=$+1
  308.         ld hl,0
  309.         ld c,ID_DOOR*2
  310.         ld a,(hl)
  311.         add a,a
  312.         cp c
  313.         jr nz,noopendoor
  314.         bit mapdifbit,l
  315.         jr z,opendoor_h
  316. opendoor_l
  317.         push hl
  318.         res 7,(hl)
  319.         inc l
  320.         ld a,(hl)
  321.         add a,a
  322.         cp c
  323.         jr z,opendoorok
  324.         dec l
  325.         dec l
  326.         ;ld a,(hl)
  327.         ;add a,a
  328.         ;cp c
  329.         jr opendoorok
  330. opendoor_h
  331.         push hl
  332.         res 7,(hl)
  333.         inc h
  334.         ld a,(hl)
  335.         add a,a
  336.         cp c
  337.         jr z,opendoorok
  338.         dec h
  339.         dec h
  340.         ;ld a,(hl)
  341.         ;add a,a
  342.         ;cp c
  343. opendoorok
  344.         res 7,(hl)
  345. ;ничего не делать, если hl==(oldopendooraddr2)
  346.        ld de,(oldopendooraddr2)
  347.        or a
  348.        sbc hl,de
  349.        add hl,de
  350.         pop de
  351.        jr z,noopendoor
  352.         call closecurrentdoor ;keeps hl,de
  353.         ld (oldopendooraddr2),hl
  354.         ld (oldopendooraddr),de
  355.         xor a
  356.         ld (doortimer),a
  357.         inc a
  358.         ld (doortimermode),a
  359.         ld a,5
  360.         call sfxplay
  361. noopendoor
  362.        pop af
  363. ;a=%ofADdurl
  364.        bit 6,a
  365.        jp nz,nofire
  366.        push af
  367.        
  368. ;сколько фреймов прошло с прошлого fire?
  369.         ld a,(firedelaycounter)
  370.         or a
  371.         jr z,fire_timeok
  372.         dec a
  373.         ld (firedelaycounter),a
  374.         jp popnofire
  375. fire_timeok
  376.         ld a,10
  377.         ld (firedelaycounter),a
  378.  
  379.         push hl
  380.         ld a,1 ;shot sfx
  381.         call sfxplay
  382.         pop hl
  383.  
  384.        if sprites
  385.        
  386.         call RAYPREPXY
  387.         LD A,SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  388.         ld l,a
  389.         LD (cura),A
  390.         CALL RAYCAST
  391. ;C=dist(scale#)
  392. ;B=texx
  393.         ld a,c
  394.         ld (fire_walldist),a
  395.        if 1==0
  396.        call getuser_scr_high_cur
  397.        SETPG8000
  398.        ld a,(fire_walldist)
  399.        ld hl,0x8000
  400.        ld bc,40
  401.        dup 8
  402.        ld (hl),7
  403.        rla
  404.        rr (hl)
  405.        add hl,bc
  406.        edup
  407.        endif
  408.        
  409.         call SCANMONS      
  410. ;в cursprites лежат данные о видимых спрайтах (от задних к передним)
  411. ;ID 8 (0=end)
  412. ;dist 16
  413. ;xscr 8
  414. ;monster index
  415.         ld hl,cursprites
  416. fire_scan0
  417.         ld a,(hl)
  418.         or a
  419.         jp z,fire_scan0q
  420.         inc l
  421.         ld c,(hl)
  422.         inc l
  423.         ld b,(hl) ;bc=dist
  424.         ld d,b
  425.         ld e,c
  426.         inc l
  427.         dup 3;4
  428.         srl d
  429.         rr e
  430.         edup
  431.         ld a,d
  432.         or a
  433.         jr z,$+4
  434.          ld e,255
  435.         or e
  436.         jr nz,$+3
  437.          inc e
  438.         ld d,t1x/256
  439.         ld a,(de) ;width*k (for typical sprite width)
  440.         ld e,a
  441.         ld a,(hl) ;xscr (центр = 0x40)
  442.         sub e
  443.         jr nc,$+3
  444.          xor a ;a=sprite left margin
  445.         cp SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  446.         jr nc,fire_miss
  447.         ld a,(hl) ;xscr
  448.         add a,e
  449.         jr nc,$+3
  450.          sbc a,a ;a=sprite right margin
  451.         cp SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  452.         jr c,fire_miss
  453.         push hl
  454. ;не убивать, если стена впереди закрывает монстра (т.е. стена ближе)
  455. ;bc=dist
  456. ;приводим к 128..255
  457.         LD DE,#000
  458.         INC B
  459.         DEC B
  460.         LD A,C
  461.         jr Z,fire_MOTOLOGRLQ
  462.        DUP 5;6
  463.         INC D
  464.         SRL B
  465.         RRA
  466.         jr Z,fire_MOTOLOGRLE
  467.        EDUP
  468. fire_MOTOLOGRLQ ;
  469. fire_MOTOLOGRLE ;
  470.         LD C,A ;128..255 ;D=0..5
  471.         LD B,tlogd/256
  472.         LD A,(BC) ;log(dist) = 128..255 for arg>=128
  473.        if atm==0
  474.        SUB 16;64                 ;0..127 for arg=64..127 ;???
  475.        endif
  476.         LD C,A                ;0 for arg<64
  477.         LD B,tlogd2sca/256
  478.          SRA D
  479.          RR E ;DE=+0,+#80,..+#300
  480.         ex de,hl
  481.         ADD HL,BC
  482.         LD a,(HL) ;scale#
  483.         pop hl
  484. fire_walldist=$+1
  485.         cp 0
  486.         jr c,fire_miss
  487.         push hl
  488.        
  489. ;найти этого монстра в таблице монстров
  490.         inc l
  491.         ld l,(hl) ;monster index
  492.         ld h,0
  493.         add hl,hl
  494.         add hl,hl
  495.         add hl,hl ;*8
  496.         ld bc,MONSTRS+5 ;Xx,Yy,TYPEphase_dir,TIMEenergy
  497.         add hl,bc ;TYPEphase
  498.         ld a,(hl)
  499.         cp 4*8
  500.         jr nc,fire_skip ;not a monster
  501.         and 7
  502.         cp 6
  503.         jr z,fire_skip ;dead monster
  504.         dec l
  505.         ld (hl),0 ;dir = no move
  506.         inc l
  507.         ld (hl),3*8+4 ;wounded, go
  508.         inc l
  509.         ld a,(hl) ;energy
  510.         sub 20
  511.         ld (hl),a ;energy
  512.         jr c,fire_kill
  513.         inc l
  514.         ld (hl),TIME_WOUNDED ;time
  515.         ld a,2 ;wound sfx
  516.         jr fire_killq
  517. fire_kill
  518.         dec l
  519.         ld (hl),3*8+6 ;dead
  520.         ;ld a,l
  521.         ;and 0xf8
  522.         ;ld l,a
  523.         ;inc l ;X
  524.         ;ld (hl),0xc0 ;impossible X
  525.         ld a,0 ;kill sfx
  526. fire_killq
  527.         call sfxplay
  528. fire_skip
  529.         pop hl
  530. fire_miss
  531.        if CURSPRITES_RECSZ == 5
  532.        inc l
  533.        endif
  534.         inc l
  535.         jp fire_scan0
  536. fire_scan0q
  537.  
  538.        endif
  539. popnofire
  540.        pop af
  541. nofire
  542.        push af
  543.  
  544. IMavision=$+1
  545.         LD HL,32*256
  546. IMdavision=$+1
  547.         LD DE,100
  548.         AND %10110011
  549.         CP 0
  550.         LD ($-1),A
  551.         jr Z,$+4
  552.         LD E,50 ;key just pressed/released
  553.        IF kempston&autostrafe
  554.         BIT 7,A
  555.         jr NZ,nAUTOROTATE
  556.         BIT 4,A
  557.         jr NZ,$+3
  558.         ADD HL,DE
  559.         BIT 5,A
  560.         jr NZ,$+4
  561.         SBC HL,DE
  562. nAUTOROTATE
  563.        ENDIF
  564.        IF doublerotate
  565.         RRA
  566.         jr C,$+4
  567.         ADD HL,DE
  568.         ADD HL,DE
  569.         RRA
  570.         jr C,$+6
  571.         SBC HL,DE
  572.         SBC HL,DE
  573.        ELSE
  574.         RRA
  575.         jr C,$+3
  576.         ADD HL,DE
  577.         RRA
  578.         jr C,$+4
  579.         SBC HL,DE
  580.        ENDIF
  581.  
  582.         LD A,E
  583.         ADD A,12;10
  584.         jr C,$+3
  585.          LD E,A ;key held: increase rotspd
  586.         LD (IMdavision),DE
  587.        IF mouse
  588.         LD BC,#FBDF
  589.         IN A,(C)
  590. mouseoldx=$+1
  591.         LD C,0
  592.         LD ($-1),A
  593. mouseon=$
  594.        IF demoplay
  595.         XOR A
  596.        ELSE
  597.         SUB C
  598.        ENDIF
  599.         NEG
  600.         LD E,A
  601.         RLA
  602.         SBC A,A
  603.         LD D,A
  604.         ex de,hl
  605.         DUP 6
  606.         ADD HL,HL
  607.         EDUP
  608.         ADD HL,DE
  609.        ENDIF
  610.         LD (IMavision),HL
  611.  
  612. ;делим вектор на коэфф замедления
  613. IMcurDX=$+1
  614.         LD HL,0
  615.         LD B,H
  616.         ld A,L
  617.         SRA B
  618.         RRA
  619.        IF doublespeed
  620.         SRA B
  621.         RRA
  622.        ENDIF
  623.         LD C,A
  624.         CP B
  625.        jr NZ,$+3
  626.        LD C,L
  627.         SBC HL,BC
  628.         LD B,H
  629.         ld C,L
  630. CSLOWXQ
  631. IMcurDY=$+1
  632.         LD HL,0
  633.         LD D,H
  634.         ld A,L
  635.         SRA D
  636.         RRA
  637.        IF doublespeed
  638.         SRA D
  639.         RRA
  640.        ENDIF
  641.         LD E,A
  642.         CP D
  643.        jr NZ,$+3
  644.        LD E,L
  645.         SBC HL,DE
  646.         LD D,H
  647.         ld E,L
  648. CSLOWYQ
  649.        POP AF ;%00ADSWPO
  650.        RRCA
  651.        RRCA
  652.        AND 15
  653.         LD HL,tkeyangle
  654.         ADD A,L
  655.         LD L,A
  656.        IF (tkeyangle^tkeyangleend)&256
  657.         ADC A,H
  658.         SUB L
  659.         LD H,A
  660.        ENDIF
  661.         LD A,(HL)
  662. ;прибавляем вектор направления
  663. ;sin и cos (IMavision+32*N), где N=0..7 в зав. от клавиш
  664. ;0=forth
  665. ;64=left
  666.        CP -1
  667.        JP Z,CTRLnspeed
  668.         LD HL,IMavision+1
  669.         ADD A,(HL)
  670.         LD L,A
  671.         LD H,tcos/256 ;-pi/4..+pi/4
  672.         LD A,(HL)
  673.        ADD A,C
  674.        LD C,A
  675.        BIT 7,(HL)
  676.        jr NZ,$+3
  677.        INC B
  678.        jr C,$+3
  679.        DEC B
  680.         LD A,64
  681.         SUB L
  682.         LD L,A
  683.         LD A,(HL)
  684.        ADD A,E
  685.        LD E,A
  686.        BIT 7,(HL)
  687.        jr NZ,$+3
  688.        INC D
  689.        jr C,$+3
  690.        DEC D
  691. CTRLnspeed
  692.         LD (IMcurDX),BC
  693.         LD (IMcurDY),DE
  694.        DUP 2
  695.         SRA D
  696.         RR E
  697.         SRA B
  698.         RR C
  699.        EDUP
  700.         ld b,e
  701.         LD HL,(IMcurXx)
  702.         LD de,(IMcurYy)
  703. ;hl=x
  704. ;de=y
  705. ;c=dx/4
  706. ;b=dy/4
  707.         call moveandcollideX
  708.         ex de,hl
  709.         call moveandcollideY
  710. ;hl=y
  711. ;de=x
  712.         LD (IMcurYy),HL
  713.         LD (IMcurXx),de
  714.  
  715. ;move monsters
  716.         LD A,d;(curX)
  717.         SUB viewrange
  718.         LD (logscmonX),A
  719.         LD A,h;(curY)
  720.         SUB viewrange
  721.         LD (logscmonY),A
  722.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  723.         ld hx,-1 ;monster index
  724.        jp logSCMONS0 ;цикл скан-я видимых монстров/предметов
  725. logSCMONNx
  726.         LD A,L
  727.         ADD A,8
  728.         LD L,A
  729.         JR C,logSCMxIH
  730. logSCMONS0
  731.        inc hx ;monster index
  732.         LD A,(HL) ;X
  733.         INC A
  734.        RET Z
  735. logscmonX=$+1
  736.         SUB 0
  737.         CP viewrange*2+1
  738.         JP NC,logSCMONNx
  739.         INC L
  740.         inc L
  741.         LD A,(HL)
  742. logscmonY=$+1
  743.         SUB 0
  744.         CP viewrange*2+1
  745.         JR C,logSCMONY
  746.         LD A,L
  747.         ADD A,6
  748.         LD L,A
  749.         JP NC,logSCMONS0
  750. logSCMxIH
  751.         INC H
  752.         JP logSCMONS0
  753. logSCMONY
  754.         DEC L
  755.         dec L
  756.         dec L
  757.        push hl
  758.         LD C,(HL)
  759.         INC L
  760.         LD B,(HL) ;Xx
  761.         INC L
  762.         LD E,(HL)
  763.         INC L
  764.         LD D,(HL) ;Yy
  765.         INC L
  766.         ld a,(hl) ;dir
  767.         or a
  768.         jr z,logSCMONS_nomove
  769.        push af ;dir
  770.         push bc ;x
  771.         ld l,a
  772.         LD H,tcos/256 ;-pi/4..+pi/4
  773.         LD c,(HL)
  774.         LD A,64
  775.         SUB L
  776.         LD L,A
  777.         LD b,(HL)
  778.         pop hl ;x
  779.         dup 3
  780.         sra b
  781.         sra c
  782.         edup
  783. ;hl=x
  784. ;de=y
  785. ;c=dx/4
  786. ;b=dy/4
  787.         call moveandcollideX
  788.         ex de,hl
  789.         call nc,moveandcollideY
  790. ;hl=y
  791. ;de=x
  792.        pop bc ;b=dir
  793.        ld a,b
  794.        jr nc,movemons_nochagedir
  795.        ld a,r
  796.        add a,a
  797.        inc a
  798. movemons_nochagedir
  799.         ld b,d
  800.         ld c,e ;x
  801.         ex de,hl ;y
  802. logSCMONS_nomove
  803.        pop hl
  804.         ld (hl),c
  805.         inc l
  806.         ld (hl),b ;Xx
  807.         inc l
  808.         ld (hl),e
  809.         inc l
  810.         ld (hl),d ;Yy
  811.         inc l
  812.         ld (hl),a ;dir
  813.         inc l ;skip dir
  814.  
  815. ;если (1..3)*8+(0..1) и близко, то wantattack:
  816.         ld a,(hl) ;TYPE*8+phase        
  817.         and (30*8)+6
  818.         cp 0*8+0 ;стоит спиной
  819.         ld e,MONSTERBACKviewrange
  820.         jr z,logSCMONS_startattack
  821.         cp 2*8+0 ;стоит лицом или идёт
  822.         ld e,MONSTERviewrange
  823.         jr nz,logSCMONS_noattack
  824. logSCMONS_startattack
  825.         ld a,(IMcurYy+1)
  826.         sub d ;Y
  827.         jr nc,$+4
  828.         neg
  829.         cp e;MONSTERviewrange
  830.         jr nc,logSCMONS_noattack
  831.         ld a,(IMcurXx+1)
  832.         sub b ;X
  833.         jr nc,$+4
  834.         neg
  835.         cp e;MONSTERviewrange
  836.         jr nc,logSCMONS_noattack
  837.         ld (hl),3*8+2 ;wantattack
  838.         inc l
  839.         inc l
  840.         ld (hl),TIME_WANTATTACK
  841.         dec l
  842.         dec l
  843. logSCMONS_noattack
  844.         ld c,(hl) ;TYPE*8+phase
  845.         INC L ;skip TYPE*8+phase
  846.         inc L ;skip energy
  847.         dec (hl) ;time
  848.         jr nz,logSCMONS_notime
  849.         ld (hl),TIME_STEP ;time
  850.         dec l
  851.         dec l ;hl points to TYPE*8+phase
  852.         ld a,c
  853.         and 7
  854.         jr z,logSCMONS_step
  855.         dec a
  856.         jr z,logSCMONS_step
  857.         dec a
  858.         jr z,logSCMONS_wantattack
  859.         dec a ;attack
  860.         jr z,logSCMONS_attack
  861.         dec a
  862.         jr z,logSCMONS_wounded
  863.         jr logSCMONS_nosetphase
  864. logSCMONS_wantattack
  865.         inc l
  866.         inc l
  867.         ld (hl),TIME_ATTACK
  868.         dec l
  869.         dec l
  870.         dec l
  871.         ld (hl),0 ;dir (no move)
  872.         inc l
  873.         ld a,3*8+3 ;moving attack
  874.         jr logSCMONS_setphase
  875. logSCMONS_attack
  876. ;todo shot
  877.  
  878. ;дальше продолжаем движение
  879. logSCMONS_wounded
  880.         ld a,r
  881.         add a,a ;dir
  882.         dec l
  883.         ld (hl),a ;dir
  884.         inc l
  885.         ld a,3*8+0 ;moving
  886.         jr logSCMONS_setphase
  887. logSCMONS_step
  888.         ld a,c
  889.         xor 1
  890. logSCMONS_setphase
  891.         ld (hl),a
  892. logSCMONS_nosetphase
  893.         inc l
  894.         inc l
  895. logSCMONS_notime
  896.         inc hl ;skip TIME
  897.        INC L ;skip x
  898.         jp logSCMONS0
  899.  
  900. moveandcollideX
  901. ;hl=x
  902. ;de=y
  903. ;c=dx/4
  904. ;b=dy/4
  905.         ;ADD HL,BC
  906.        PUSH HL
  907. ;|..............|
  908. ;.....<---*--->..      
  909.         ;or a:sbc hl,bc;LD HL,(IMcurXx)
  910.          ld a,l
  911.          sub mindist ;dx<0
  912.          ;dec h
  913.         BIT 7,c;B
  914.         jr nz,$+6
  915.          ld a,l
  916.          add a,mindist ;dx>0
  917.          inc h
  918.         jr nc,CTRLXpass ;проходимо (CY=0)
  919.         ;LD A,H
  920.         ;LD HL,(IMcurYy)
  921.         ;LD L,A
  922.         ld l,h
  923.         ld h,d ;Y
  924.         SET mapdifbit,L
  925.         LD A,(HL)
  926.         RLA ;проходимо?
  927. CTRLXpass
  928.        POP HL
  929.         jr nc,CTRLnXq ;проходимо (CY=0)
  930. CTRLnX
  931. ;непроходимо
  932.         ;LD HL,(IMcurXx)
  933.         BIT 7,c;B
  934.         LD l,256-mindist ;dx>0
  935.         ret z ;C
  936.         LD l,mindist ;dx<0
  937.         ret ;C
  938. CTRLnXq
  939.         ;add hl,bc
  940.         ld a,c
  941.         add a,l
  942.         ld l,a
  943.         adc a,h
  944.         sub l
  945.         ld h,a
  946.          or a ;NC
  947.         bit 7,c
  948.         ret z ;NC
  949.         dec h
  950.         ret ;NC
  951. moveandcollideY
  952. ;hl=y
  953. ;b=dy/4
  954.         ;ADD HL,DE
  955.        PUSH HL
  956.         ;or a:sbc hl,de;LD HL,(IMcurYy)
  957.          ld a,l
  958.          sub mindist ;dx<0
  959.          ;dec h
  960.         BIT 7,b;D
  961.         jr nz,$+6
  962.          ld a,l
  963.          add a,mindist ;dx>0
  964.          inc h
  965.         jr nc,CTRLYpass ;проходимо (CY=0)
  966.         ;LD A,H
  967.         ;LD HL,(IMcurXx)
  968.         ;LD L,H
  969.         ;LD H,A
  970.         ld l,d ;X
  971.         LD A,(HL)
  972.         RLA ;проходимо?
  973. CTRLYpass
  974.        POP HL
  975.        jr nc,CTRLnYq ;проходимо (CY=0)
  976. ;непроходимо
  977.         ;LD HL,(IMcurYy)
  978.         BIT 7,b;d
  979.         LD l,256-mindist ;dy>0
  980.         ret z ;C
  981.         LD l,mindist ;dy<0
  982.         ret ;C
  983. CTRLnYq
  984.         ;add hl,de
  985.         ld a,b
  986.         add a,l
  987.         ld l,a
  988.         adc a,h
  989.         sub l
  990.         ld h,a
  991.          or a ;NC
  992.         bit 7,b
  993.         ret z ;NC
  994.         dec h
  995.         RET ;NC
  996.  
  997. closecurrentdoor
  998. ;keeps hl,de
  999.         ld a,128+ID_DOOR;(hl)
  1000. oldopendooraddr=$+1
  1001.         ld (killablebyte),a
  1002. oldopendooraddr2=$+1
  1003.         ld (killablebyte),a
  1004.        ld bc,killablebyte
  1005.        ld (oldopendooraddr),bc
  1006.        ld (oldopendooraddr2),bc
  1007.         ret
  1008. killablebyte
  1009.         db 0
  1010.