?login_element?

Subversion Repositories NedoOS

Rev

Rev 2036 | Rev 2059 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  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 ;open sfx
  360.         call sfxplay
  361. noopendoor
  362.  
  363. ;сколько фреймов прошло с прошлого fire? считать независимо от fire!
  364.         ld a,(firedelaycounter)
  365.         dec a
  366.         ;jp m,fire_timeok
  367.         ;ld (firedelaycounter),a
  368.         jp p,firedelaycounter_popnofire
  369. ;fire_timeok
  370.  
  371.        pop af
  372. ;a=%ofADdurl
  373.        bit 6,a
  374.        jp nz,nofire
  375.        push af
  376.      
  377.         ld a,(bullets)
  378.         or a
  379.         jp z,popnofire
  380.         dec a
  381.         ld (bullets),a
  382.  
  383.         push hl
  384.         ld a,1 ;shot sfx
  385.         call sfxplay
  386.         pop hl
  387.  
  388.        if sprites
  389.        
  390.         call RAYPREPXY
  391.         LD A,SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  392.         ld l,a
  393.         LD (cura),A
  394.         CALL RAYCAST
  395. ;C=dist(scale#)
  396. ;B=texx
  397.         ld a,c
  398.         ld (fire_walldist),a
  399.        if 1==0
  400.        call getuser_scr_high_cur
  401.        SETPG8000
  402.        ld a,(fire_walldist)
  403.        ld hl,0x8000
  404.        ld bc,40
  405.        dup 8
  406.        ld (hl),7
  407.        rla
  408.        rr (hl)
  409.        add hl,bc
  410.        edup
  411.        endif
  412.        
  413.         call SCANMONS      
  414. ;в cursprites лежат данные о видимых спрайтах (от задних к передним)
  415. ;ID 8 (0=end)
  416. ;dist 16
  417. ;xscr 8
  418. ;monster index
  419.         ld hl,cursprites
  420. fire_scan0
  421.         ld a,(hl)
  422.         or a
  423.         jp z,fire_scan0q
  424.         inc l
  425.         ld c,(hl)
  426.         inc l
  427.         ld b,(hl) ;bc=dist
  428.         ld d,b
  429.         ld e,c
  430.         inc l
  431.         dup 3;4
  432.         srl d
  433.         rr e
  434.         edup
  435.         ld a,d
  436.         or a
  437.         jr z,$+4
  438.          ld e,255
  439.         or e
  440.         jr nz,$+3
  441.          inc e
  442.         ld d,t1x/256
  443.         ld a,(de) ;width*k (for typical sprite width)
  444.         ld e,a
  445.         ld a,(hl) ;xscr (центр = 0x40)
  446.         sub e
  447.         jr nc,$+3
  448.          xor a ;a=sprite left margin
  449.         cp SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  450.         jr nc,fire_miss
  451.         ld a,(hl) ;xscr
  452.         add a,e
  453.         jr nc,$+3
  454.          sbc a,a ;a=sprite right margin
  455.         cp SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  456.         jr c,fire_miss
  457.         push hl
  458. ;не убивать, если стена впереди закрывает монстра (т.е. стена ближе)
  459. ;bc=dist
  460. ;приводим к 128..255
  461.         LD DE,#000
  462.         INC B
  463.         DEC B
  464.         LD A,C
  465.         jr Z,fire_MOTOLOGRLQ
  466.        DUP 5;6
  467.         INC D
  468.         SRL B
  469.         RRA
  470.         jr Z,fire_MOTOLOGRLE
  471.        EDUP
  472. fire_MOTOLOGRLQ ;
  473. fire_MOTOLOGRLE ;
  474.         LD C,A ;128..255 ;D=0..5
  475.         LD B,tlogd/256
  476.         LD A,(BC) ;log(dist) = 128..255 for arg>=128
  477.        if atm==0
  478.        SUB 16;64                 ;0..127 for arg=64..127 ;???
  479.        endif
  480.         LD C,A                ;0 for arg<64
  481.         LD B,tlogd2sca/256
  482.          SRA D
  483.          RR E ;DE=+0,+#80,..+#300
  484.         ex de,hl
  485.         ADD HL,BC
  486.         LD a,(HL) ;scale#
  487.         pop hl
  488. fire_walldist=$+1
  489.         cp 0
  490.         jr c,fire_miss
  491.         push hl
  492.        
  493. ;найти этого монстра в таблице монстров
  494.         inc l
  495.         ld l,(hl) ;monster index
  496.         ld h,0
  497.         add hl,hl
  498.         add hl,hl
  499.         add hl,hl ;*8
  500.         ld bc,MONSTRS+5 ;Xx,Yy,TYPEphase_dir,TIMEenergy
  501.         add hl,bc ;TYPEphase
  502.         ld a,(hl)
  503.         cp 4*8
  504.         jr nc,fire_skip ;not a monster
  505.         and 7
  506.         cp 6
  507.         jr z,fire_skip ;dead monster
  508.         dec l
  509.         ld (hl),0 ;dir = no move
  510.         inc l
  511.         ld (hl),3*8+4 ;wounded, go
  512.         inc l
  513.         ld a,(hl) ;energy
  514.         sub 20
  515.         ld (hl),a ;energy
  516.         jr c,fire_kill
  517.         inc l
  518.         ld (hl),TIME_WOUNDED ;time
  519.         ld a,2 ;wound sfx
  520.         jr fire_killq
  521. fire_kill
  522.         dec l
  523.         ld (hl),3*8+6 ;dead
  524.         ;ld a,l
  525.         ;and 0xf8
  526.         ;ld l,a
  527.         ;inc l ;X
  528.         ;ld (hl),0xc0 ;impossible X
  529.         ld a,0 ;kill sfx
  530. fire_killq
  531.         call sfxplay
  532. fire_skip
  533.         pop hl
  534. fire_miss
  535.        if CURSPRITES_RECSZ == 5
  536.        inc l
  537.        endif
  538.         inc l
  539.         jp fire_scan0
  540. fire_scan0q
  541.  
  542.        endif
  543.         ld a,10
  544. firedelaycounter_popnofire
  545.         ld (firedelaycounter),a
  546. popnofire
  547.        pop af
  548. nofire
  549.        push af
  550.  
  551. IMavision=$+1
  552.         LD HL,32*256
  553. IMdavision=$+1
  554.         LD DE,100
  555.         AND %10110011
  556.         CP 0
  557.         LD ($-1),A
  558.         jr Z,$+4
  559.         LD E,50 ;key just pressed/released
  560.        IF kempston&autostrafe
  561.         BIT 7,A
  562.         jr NZ,nAUTOROTATE
  563.         BIT 4,A
  564.         jr NZ,$+3
  565.         ADD HL,DE
  566.         BIT 5,A
  567.         jr NZ,$+4
  568.         SBC HL,DE
  569. nAUTOROTATE
  570.        ENDIF
  571.        IF doublerotate
  572.         RRA
  573.         jr C,$+4
  574.         ADD HL,DE
  575.         ADD HL,DE
  576.         RRA
  577.         jr C,$+6
  578.         SBC HL,DE
  579.         SBC HL,DE
  580.        ELSE
  581.         RRA
  582.         jr C,$+3
  583.         ADD HL,DE
  584.         RRA
  585.         jr C,$+4
  586.         SBC HL,DE
  587.        ENDIF
  588.  
  589.         LD A,E
  590.         ADD A,12;10
  591.         jr C,$+3
  592.          LD E,A ;key held: increase rotspd
  593.         LD (IMdavision),DE
  594.        IF mouse
  595.         LD BC,#FBDF
  596.         IN A,(C)
  597. mouseoldx=$+1
  598.         LD C,0
  599.         LD ($-1),A
  600. mouseon=$
  601.        IF demoplay
  602.         XOR A
  603.        ELSE
  604.         SUB C
  605.        ENDIF
  606.         NEG
  607.         LD E,A
  608.         RLA
  609.         SBC A,A
  610.         LD D,A
  611.         ex de,hl
  612.         DUP 6
  613.         ADD HL,HL
  614.         EDUP
  615.         ADD HL,DE
  616.        ENDIF
  617.         LD (IMavision),HL
  618.  
  619. ;делим вектор на коэфф замедления
  620. IMcurDX=$+1
  621.         LD HL,0
  622.         LD B,H
  623.         ld A,L
  624.         SRA B
  625.         RRA
  626.        IF doublespeed
  627.         SRA B
  628.         RRA
  629.        ENDIF
  630.         LD C,A
  631.         CP B
  632.        jr NZ,$+3
  633.        LD C,L
  634.         SBC HL,BC
  635.         LD B,H
  636.         ld C,L
  637. CSLOWXQ
  638. IMcurDY=$+1
  639.         LD HL,0
  640.         LD D,H
  641.         ld A,L
  642.         SRA D
  643.         RRA
  644.        IF doublespeed
  645.         SRA D
  646.         RRA
  647.        ENDIF
  648.         LD E,A
  649.         CP D
  650.        jr NZ,$+3
  651.        LD E,L
  652.         SBC HL,DE
  653.         LD D,H
  654.         ld E,L
  655. CSLOWYQ
  656.        POP AF ;%00ADSWPO
  657.        RRCA
  658.        RRCA
  659.        AND 15
  660.         LD HL,tkeyangle
  661.         ADD A,L
  662.         LD L,A
  663.        IF (tkeyangle^tkeyangleend)&256
  664.         ADC A,H
  665.         SUB L
  666.         LD H,A
  667.        ENDIF
  668.         LD A,(HL)
  669. ;прибавляем вектор направления
  670. ;sin и cos (IMavision+32*N), где N=0..7 в зав. от клавиш
  671. ;0=forth
  672. ;64=left
  673.        CP -1
  674.        JP Z,CTRLnspeed
  675.         LD HL,IMavision+1
  676.         ADD A,(HL)
  677.         LD L,A
  678.         LD H,tcos/256 ;-pi/4..+pi/4
  679.         LD A,(HL)
  680.        ADD A,C
  681.        LD C,A
  682.        BIT 7,(HL)
  683.        jr NZ,$+3
  684.        INC B
  685.        jr C,$+3
  686.        DEC B
  687.         LD A,64
  688.         SUB L
  689.         LD L,A
  690.         LD A,(HL)
  691.        ADD A,E
  692.        LD E,A
  693.        BIT 7,(HL)
  694.        jr NZ,$+3
  695.        INC D
  696.        jr C,$+3
  697.        DEC D
  698. CTRLnspeed
  699.         LD (IMcurDX),BC
  700.         LD (IMcurDY),DE
  701.        DUP 2
  702.         SRA D
  703.         RR E
  704.         SRA B
  705.         RR C
  706.        EDUP
  707.         ld b,e
  708.         LD HL,(IMcurXx)
  709.         LD de,(IMcurYy)
  710. ;hl=x
  711. ;de=y
  712. ;c=dx/4
  713. ;b=dy/4
  714.         call moveandcollideX
  715.         ex de,hl
  716.         call moveandcollideY
  717. ;hl=y
  718. ;de=x
  719.         LD (IMcurYy),HL
  720.         LD (IMcurXx),de
  721.  
  722.         call collideobjects
  723.         call movemonsters
  724.         ret
  725.  
  726. collideobjects
  727. ;collide with objects
  728. ;все объекты - в центре своей клетки
  729.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  730.         ld hx,-1 ;monster index
  731.        jp logCOLLIDE0 ;цикл скан-я видимых монстров/предметов
  732. logCOLLIDENx
  733.         LD A,L
  734.         ADD A,8
  735.         LD L,A
  736.         JR C,logCOLLIDExIH
  737. logCOLLIDE0
  738.        inc hx ;monster index
  739.         LD A,(HL) ;X
  740.         INC A
  741.        RET Z
  742.         ld a,(IMcurXx+1)
  743.         cp (hl)
  744.         jr nz,logCOLLIDENx
  745.         inc l
  746.         inc l
  747.         ld a,(IMcurYy+1)
  748.         cp (hl)
  749.         jr z,logCOLLIDEY
  750.         LD A,L
  751.         ADD A,6
  752.         LD L,A
  753.         JP NC,logCOLLIDE0
  754. logCOLLIDExIH
  755.         INC H
  756.         JP logCOLLIDE0
  757. logCOLLIDEY
  758.         inc l
  759.         ;ld a,(hl) ;dir
  760.         inc l
  761.         ld a,(hl) ;TYPE*8+phase
  762.         cp 4*8
  763.         jr c,logCOLLIDEnobj
  764.         push hl
  765.         ;ld a,l
  766.         ;and 0xf8
  767.         ;ld l,a
  768.         ;inc l ;X
  769.         res 1,l
  770.         res 2,l
  771.         ld (hl),0xc0 ;impossible X
  772.         cp 4*8
  773.         jr nz,logCOLLIDEnammo
  774.         ld hl,bullets
  775.         ld bc,40*256+50 ;ADDmax
  776.         call addmax
  777. logCOLLIDEnammo
  778.         cp 5*8
  779.         jr nz,logCOLLIDEnhealth
  780.         ld hl,health
  781.         ld bc,40*256+100 ;ADDmax
  782.         call addmax
  783. logCOLLIDEnhealth
  784.        
  785.         ld a,3 ;get obj
  786.         call sfxplay
  787.         pop hl
  788. logCOLLIDEnobj
  789.         inc l
  790.         ;ld a,(hl) ;energy
  791.         inc l
  792.         ;ld a,(hl) ;time
  793.         inc hl
  794.        INC L ;skip x
  795.         jp logCOLLIDE0
  796.  
  797. movemonsters
  798. ;move monsters
  799.         LD A,(IMcurXx+1);d;(curX)
  800.         SUB viewrange
  801.         LD (logscmonX),A
  802.         LD A,(IMcurYy+1);h;(curY)
  803.         SUB viewrange
  804.         LD (logscmonY),A
  805.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  806.         ld hx,-1 ;monster index
  807.        jp logSCMONS0 ;цикл скан-я видимых монстров/предметов
  808. logSCMONNx
  809.         LD A,L
  810.         ADD A,8
  811.         LD L,A
  812.         JR C,logSCMxIH
  813. logSCMONS0
  814.        inc hx ;monster index
  815.         LD A,(HL) ;X
  816.         INC A
  817.        RET Z
  818. logscmonX=$+1
  819.         SUB 0
  820.         CP viewrange*2+1
  821.         JP NC,logSCMONNx
  822.         INC L
  823.         inc L
  824.         LD A,(HL)
  825. logscmonY=$+1
  826.         SUB 0
  827.         CP viewrange*2+1
  828.         JR C,logSCMONY
  829.         LD A,L
  830.         ADD A,6
  831.         LD L,A
  832.         JP NC,logSCMONS0
  833. logSCMxIH
  834.         INC H
  835.         JP logSCMONS0
  836. logSCMONY
  837.         DEC L
  838.         dec L
  839.         dec L
  840.        push hl
  841.         LD C,(HL)
  842.         INC L
  843.         LD B,(HL) ;Xx
  844.         INC L
  845.         LD E,(HL)
  846.         INC L
  847.         LD D,(HL) ;Yy
  848.         INC L
  849.         ld a,(hl) ;dir
  850.         or a
  851.         jr z,logSCMONS_nomove
  852.        push af ;dir
  853.         push bc ;x
  854.         ld l,a
  855.         LD H,tcos/256 ;-pi/4..+pi/4
  856.         LD c,(HL)
  857.         LD A,64
  858.         SUB L
  859.         LD L,A
  860.         LD b,(HL)
  861.         pop hl ;x
  862.         dup 3
  863.         sra b
  864.         sra c
  865.         edup
  866. ;hl=x
  867. ;de=y
  868. ;c=dx/4
  869. ;b=dy/4
  870.         call moveandcollideX
  871.         ex de,hl
  872.         call nc,moveandcollideY
  873. ;hl=y
  874. ;de=x
  875.        pop bc ;b=dir
  876.        ld a,b
  877.        jr nc,movemons_nochagedir
  878.        ld a,r
  879.        add a,a
  880.        inc a
  881. movemons_nochagedir
  882.         ld b,d
  883.         ld c,e ;x
  884.         ex de,hl ;y
  885. logSCMONS_nomove
  886.        pop hl
  887.         ld (hl),c
  888.         inc l
  889.         ld (hl),b ;Xx
  890.         inc l
  891.         ld (hl),e
  892.         inc l
  893.         ld (hl),d ;Yy
  894.         inc l
  895.         ld (hl),a ;dir
  896.         inc l ;skip dir
  897.  
  898.       if 1
  899.       ld a,0xfe
  900.       in a,(0xfe)
  901.       rra
  902.       jr c,logSCMONS_noattack
  903. ;если (1..3)*8+(0..1) и близко, то wantattack:
  904.         ld a,(hl) ;TYPE*8+phase        
  905.         and (30*8)+6
  906.         cp 0*8+0 ;стоит спиной
  907.         ld e,MONSTERBACKviewrange
  908.         jr z,logSCMONS_startattack
  909.         cp 2*8+0 ;стоит лицом или идёт
  910.         ld e,MONSTERviewrange
  911.         jr nz,logSCMONS_noattack
  912. logSCMONS_startattack
  913.         ld a,(IMcurYy+1)
  914.         sub d ;Y
  915.         jr nc,$+4
  916.         neg
  917.         cp e;MONSTERviewrange
  918.         jr nc,logSCMONS_noattack
  919.         ld a,(IMcurXx+1)
  920.         sub b ;X
  921.         jr nc,$+4
  922.         neg
  923.         cp e;MONSTERviewrange
  924.         jr nc,logSCMONS_noattack
  925.         ld (hl),3*8+2 ;wantattack
  926.         inc l
  927.         inc l
  928.         ld (hl),TIME_WANTATTACK
  929.         dec l
  930.         dec l
  931.         push hl
  932.         ld a,4 ;shout
  933.         call sfxplay
  934.         pop hl
  935. logSCMONS_noattack
  936.       endif
  937.         ld c,(hl) ;TYPE*8+phase
  938.         INC L ;skip TYPE*8+phase
  939.         inc L ;skip energy
  940.         dec (hl) ;time
  941.         jr nz,logSCMONS_notime
  942.         ld (hl),TIME_STEP ;time
  943.         dec l
  944.         dec l ;hl points to TYPE*8+phase
  945.         ld a,c
  946.         and 7
  947.         jr z,logSCMONS_step
  948.         dec a
  949.         jr z,logSCMONS_step
  950.         dec a
  951.         jr z,logSCMONS_wantattack
  952.         dec a ;attack
  953.         jr z,logSCMONS_attack
  954.         dec a
  955.         jr z,logSCMONS_wounded
  956.         jr logSCMONS_nosetphase
  957. logSCMONS_wantattack
  958.         inc l
  959.         inc l
  960.         ld (hl),TIME_ATTACK
  961.         dec l
  962.         dec l
  963.         dec l
  964.         ld (hl),0 ;dir (no move)
  965.         inc l
  966.         ld a,3*8+3 ;moving attack
  967.         jr logSCMONS_setphase
  968. logSCMONS_attack
  969. ;todo shot
  970.  
  971. ;дальше продолжаем движение
  972. logSCMONS_wounded
  973.         ld a,r
  974.         add a,a ;dir
  975.         dec l
  976.         ld (hl),a ;dir
  977.         inc l
  978.         ld a,3*8+0 ;moving
  979.         jr logSCMONS_setphase
  980. logSCMONS_step
  981.         ld a,c
  982.         xor 1
  983. logSCMONS_setphase
  984.         ld (hl),a
  985. logSCMONS_nosetphase
  986.         inc l
  987.         inc l
  988. logSCMONS_notime
  989.         inc hl ;skip TIME
  990.        INC L ;skip x
  991.         jp logSCMONS0
  992.  
  993. moveandcollideX
  994. ;hl=x
  995. ;de=y
  996. ;c=dx/4
  997. ;b=dy/4
  998.         ;ADD HL,BC
  999.        PUSH HL
  1000. ;|..............|
  1001. ;.....<---*--->..      
  1002.         ;or a:sbc hl,bc;LD HL,(IMcurXx)
  1003.          ld a,l
  1004.          sub mindist ;dx<0
  1005.          ;dec h
  1006.         BIT 7,c;B
  1007.         jr nz,$+6
  1008.          ld a,l
  1009.          add a,mindist ;dx>0
  1010.          inc h
  1011.         jr nc,CTRLXpass ;проходимо (CY=0)
  1012.         ;LD A,H
  1013.         ;LD HL,(IMcurYy)
  1014.         ;LD L,A
  1015.         ld l,h
  1016.         ld h,d ;Y
  1017.         SET mapdifbit,L
  1018.         LD A,(HL)
  1019.         RLA ;проходимо?
  1020. CTRLXpass
  1021.        POP HL
  1022.         jr nc,CTRLnXq ;проходимо (CY=0)
  1023. CTRLnX
  1024. ;непроходимо
  1025.         ;LD HL,(IMcurXx)
  1026.         BIT 7,c;B
  1027.         LD l,256-mindist ;dx>0
  1028.         ret z ;C
  1029.         LD l,mindist ;dx<0
  1030.         ret ;C
  1031. CTRLnXq
  1032.         ;add hl,bc
  1033.         ld a,c
  1034.         add a,l
  1035.         ld l,a
  1036.         adc a,h
  1037.         sub l
  1038.         ld h,a
  1039.          or a ;NC
  1040.         bit 7,c
  1041.         ret z ;NC
  1042.         dec h
  1043.         ret ;NC
  1044. moveandcollideY
  1045. ;hl=y
  1046. ;b=dy/4
  1047.         ;ADD HL,DE
  1048.        PUSH HL
  1049.         ;or a:sbc hl,de;LD HL,(IMcurYy)
  1050.          ld a,l
  1051.          sub mindist ;dx<0
  1052.          ;dec h
  1053.         BIT 7,b;D
  1054.         jr nz,$+6
  1055.          ld a,l
  1056.          add a,mindist ;dx>0
  1057.          inc h
  1058.         jr nc,CTRLYpass ;проходимо (CY=0)
  1059.         ;LD A,H
  1060.         ;LD HL,(IMcurXx)
  1061.         ;LD L,H
  1062.         ;LD H,A
  1063.         ld l,d ;X
  1064.         LD A,(HL)
  1065.         RLA ;проходимо?
  1066. CTRLYpass
  1067.        POP HL
  1068.        jr nc,CTRLnYq ;проходимо (CY=0)
  1069. ;непроходимо
  1070.         ;LD HL,(IMcurYy)
  1071.         BIT 7,b;d
  1072.         LD l,256-mindist ;dy>0
  1073.         ret z ;C
  1074.         LD l,mindist ;dy<0
  1075.         ret ;C
  1076. CTRLnYq
  1077.         ;add hl,de
  1078.         ld a,b
  1079.         add a,l
  1080.         ld l,a
  1081.         adc a,h
  1082.         sub l
  1083.         ld h,a
  1084.          or a ;NC
  1085.         bit 7,b
  1086.         ret z ;NC
  1087.         dec h
  1088.         RET ;NC
  1089.  
  1090. closecurrentdoor
  1091. ;keeps hl,de
  1092.         ld a,128+ID_DOOR;(hl)
  1093. oldopendooraddr=$+1
  1094.         ld (killablebyte),a
  1095. oldopendooraddr2=$+1
  1096.         ld (killablebyte),a
  1097.        ld bc,killablebyte
  1098.        ld (oldopendooraddr),bc
  1099.        ld (oldopendooraddr2),bc
  1100.         ret
  1101. killablebyte
  1102.         db 0
  1103.  
  1104. addmax
  1105.         ld a,(hl)
  1106.         cp c;100
  1107.         ret nc
  1108.         add a,40
  1109.         ld (hl),a
  1110.         cp c;100
  1111.         ret c
  1112.         ld (hl),c;100
  1113.         ret
  1114.