?login_element?

Subversion Repositories NedoOS

Rev

Rev 2049 | 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 4;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.         jp 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 5*8;4*8
  504.         jr nc,fire_skip ;not a monster/ammo
  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 a,(hl)
  512.        cp 4*8 ;ammo?
  513.         ld (hl),3*8+4 ;wounded, go
  514.        jr c,$+4 ;not ammo
  515.        ld (hl),4*8+4 ;ammo wounded
  516.         inc l
  517.         ld a,(hl) ;energy
  518.         sub 20
  519.         ld (hl),a ;energy
  520.         jr c,fire_kill
  521.         inc l
  522.         ld (hl),TIME_WOUNDED ;time
  523.         ld a,2 ;wound sfx
  524.         jr fire_killq
  525. fire_kill
  526.         dec l
  527.         ld (hl),3*8+6 ;dead
  528.         ;ld a,l
  529.         ;and 0xf8
  530.         ;ld l,a
  531.         ;inc l ;X
  532.         ;ld (hl),0xc0 ;impossible X
  533.         ld a,0 ;kill sfx
  534. fire_killq
  535.         call sfxplay
  536. fire_skip
  537.         pop hl
  538. fire_miss
  539.        if CURSPRITES_RECSZ == 5
  540.        inc l
  541.        endif
  542.         inc l
  543.         jp fire_scan0
  544. fire_scan0q
  545.  
  546.        endif
  547.         ld a,10
  548. firedelaycounter_popnofire
  549.         ld (firedelaycounter),a
  550. popnofire
  551.        pop af
  552. nofire
  553.        push af
  554.  
  555. IMavision=$+1
  556.         LD HL,32*256
  557. IMdavision=$+1
  558.         LD DE,100
  559.         AND %10110011
  560.         CP 0
  561.         LD ($-1),A
  562.         jr Z,$+4
  563.         LD E,50 ;key just pressed/released
  564.        IF kempston&autostrafe
  565.         BIT 7,A
  566.         jr NZ,nAUTOROTATE
  567.         BIT 4,A
  568.         jr NZ,$+3
  569.         ADD HL,DE
  570.         BIT 5,A
  571.         jr NZ,$+4
  572.         SBC HL,DE
  573. nAUTOROTATE
  574.        ENDIF
  575.        IF doublerotate
  576.         RRA
  577.         jr C,$+4
  578.         ADD HL,DE
  579.         ADD HL,DE
  580.         RRA
  581.         jr C,$+6
  582.         SBC HL,DE
  583.         SBC HL,DE
  584.        ELSE
  585.         RRA
  586.         jr C,$+3
  587.         ADD HL,DE
  588.         RRA
  589.         jr C,$+4
  590.         SBC HL,DE
  591.        ENDIF
  592.  
  593.         LD A,E
  594.         ADD A,12;10
  595.         jr C,$+3
  596.          LD E,A ;key held: increase rotspd
  597.         LD (IMdavision),DE
  598.        IF mouse
  599.         LD BC,#FBDF
  600.         IN A,(C)
  601. mouseoldx=$+1
  602.         LD C,0
  603.         LD ($-1),A
  604. mouseon=$
  605.        IF demoplay
  606.         XOR A
  607.        ELSE
  608.         SUB C
  609.        ENDIF
  610.         NEG
  611.         LD E,A
  612.         RLA
  613.         SBC A,A
  614.         LD D,A
  615.         ex de,hl
  616.         DUP 6
  617.         ADD HL,HL
  618.         EDUP
  619.         ADD HL,DE
  620.        ENDIF
  621.         LD (IMavision),HL
  622.  
  623. ;делим вектор на коэфф замедления
  624. IMcurDX=$+1
  625.         LD HL,0
  626.         LD B,H
  627.         ld A,L
  628.         SRA B
  629.         RRA
  630.        IF doublespeed
  631.         SRA B
  632.         RRA
  633.        ENDIF
  634.         LD C,A
  635.         CP B
  636.        jr NZ,$+3
  637.        LD C,L
  638.         SBC HL,BC
  639.         LD B,H
  640.         ld C,L
  641. CSLOWXQ
  642. IMcurDY=$+1
  643.         LD HL,0
  644.         LD D,H
  645.         ld A,L
  646.         SRA D
  647.         RRA
  648.        IF doublespeed
  649.         SRA D
  650.         RRA
  651.        ENDIF
  652.         LD E,A
  653.         CP D
  654.        jr NZ,$+3
  655.        LD E,L
  656.         SBC HL,DE
  657.         LD D,H
  658.         ld E,L
  659. CSLOWYQ
  660.        POP AF ;%00ADSWPO
  661.        RRCA
  662.        RRCA
  663.        AND 15
  664.         LD HL,tkeyangle
  665.         ADD A,L
  666.         LD L,A
  667.        IF (tkeyangle^tkeyangleend)&256
  668.         ADC A,H
  669.         SUB L
  670.         LD H,A
  671.        ENDIF
  672.         LD A,(HL)
  673. ;прибавляем вектор направления
  674. ;sin и cos (IMavision+32*N), где N=0..7 в зав. от клавиш
  675. ;0=forth
  676. ;64=left
  677.        CP -1
  678.        JP Z,CTRLnspeed
  679.         LD HL,IMavision+1
  680.         ADD A,(HL)
  681.         LD L,A
  682.         LD H,tcos/256 ;-pi/4..+pi/4
  683.         LD A,(HL)
  684.        ADD A,C
  685.        LD C,A
  686.        BIT 7,(HL)
  687.        jr NZ,$+3
  688.        INC B
  689.        jr C,$+3
  690.        DEC B
  691.         LD A,64
  692.         SUB L
  693.         LD L,A
  694.         LD A,(HL)
  695.        ADD A,E
  696.        LD E,A
  697.        BIT 7,(HL)
  698.        jr NZ,$+3
  699.        INC D
  700.        jr C,$+3
  701.        DEC D
  702. CTRLnspeed
  703.         LD (IMcurDX),BC
  704.         LD (IMcurDY),DE
  705.        DUP 2
  706.         SRA D
  707.         RR E
  708.         SRA B
  709.         RR C
  710.        EDUP
  711.         ld b,e
  712.         LD HL,(IMcurXx)
  713.         LD de,(IMcurYy)
  714. ;hl=x
  715. ;de=y
  716. ;c=dx/4
  717. ;b=dy/4
  718.         call moveandcollideX
  719.         ex de,hl
  720.         call moveandcollideY
  721. ;hl=y
  722. ;de=x
  723.         LD (IMcurYy),HL
  724.         LD (IMcurXx),de
  725.  
  726.         call collideobjects
  727.         call movemonsters
  728.         ret
  729.  
  730. collideobjects
  731. ;collide with objects
  732. ;все объекты - в центре своей клетки
  733.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  734.         ld hx,-1 ;monster index
  735.        jp logCOLLIDE0 ;цикл скан-я видимых монстров/предметов
  736. logCOLLIDENx
  737.         LD A,L
  738.         ADD A,8
  739.         LD L,A
  740.         JR C,logCOLLIDExIH
  741. logCOLLIDE0
  742.        inc hx ;monster index
  743.         LD A,(HL) ;X
  744.         INC A
  745.        RET Z
  746.         ld a,(IMcurXx+1)
  747.         cp (hl)
  748.         jr nz,logCOLLIDENx
  749.         inc l
  750.         inc l
  751.         ld a,(IMcurYy+1)
  752.         cp (hl)
  753.         jr z,logCOLLIDEY
  754.         LD A,L
  755.         ADD A,6
  756.         LD L,A
  757.         JP NC,logCOLLIDE0
  758. logCOLLIDExIH
  759.         INC H
  760.         JP logCOLLIDE0
  761. logCOLLIDEY
  762.         inc l
  763.         ;ld a,(hl) ;dir
  764.         inc l
  765.         ld a,(hl) ;TYPE*8+phase
  766.         cp 4*8
  767.         jr c,logCOLLIDEnobj
  768.         cp 6*8
  769.         jr nc,logCOLLIDEnobj
  770.         and 0xf8 ;иначе фаза шевелится 0..1
  771.         push hl
  772.         ;ld a,l
  773.         ;and 0xf8
  774.         ;ld l,a
  775.         ;inc l ;X
  776.         res 1,l
  777.         res 2,l
  778.         ld (hl),0xc0 ;impossible X
  779.         ;cp 4*8
  780.         ;jr nz,logCOLLIDEnammo
  781.         ld hl,bullets
  782.         ld bc,40*256+50 ;ADDmax
  783. logCOLLIDEnammo
  784.         cp 5*8
  785.         jr nz,logCOLLIDEnhealth
  786.         ld hl,health
  787.         ld bc,40*256+100 ;ADDmax
  788. logCOLLIDEnhealth
  789.         call addmax
  790.        
  791.         ld a,3 ;get obj
  792.         call sfxplay
  793.         pop hl
  794. logCOLLIDEnobj
  795.         inc l
  796.         ;ld a,(hl) ;energy
  797.         inc l
  798.         ;ld a,(hl) ;time
  799.         inc hl
  800.        INC L ;skip x
  801.         jp logCOLLIDE0
  802.  
  803. movemonsters
  804. ;move monsters
  805.         LD A,(IMcurXx+1);d;(curX)
  806.         SUB viewrange
  807.         LD (logscmonX),A
  808.         LD A,(IMcurYy+1);h;(curY)
  809.         SUB viewrange
  810.         LD (logscmonY),A
  811.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  812.         ld hx,-1 ;monster index
  813.        jp logSCMONS0 ;цикл скан-я видимых монстров/предметов
  814. logSCMONNx
  815.         LD A,L
  816.         ADD A,8
  817.         LD L,A
  818.         JR C,logSCMxIH
  819. logSCMONS0
  820.        inc hx ;monster index
  821.         LD A,(HL) ;X
  822.         INC A
  823.        RET Z
  824. logscmonX=$+1
  825.         SUB 0
  826.         CP viewrange*2+1
  827.         JP NC,logSCMONNx
  828.         INC L
  829.         inc L
  830.         LD A,(HL)
  831. logscmonY=$+1
  832.         SUB 0
  833.         CP viewrange*2+1
  834.         JR C,logSCMONY
  835.         LD A,L
  836.         ADD A,6
  837.         LD L,A
  838.         JP NC,logSCMONS0
  839. logSCMxIH
  840.         INC H
  841.         JP logSCMONS0
  842. logSCMONY
  843.         DEC L
  844.         dec L
  845.         dec L
  846.        push hl
  847.         LD C,(HL)
  848.         INC L
  849.         LD B,(HL) ;Xx
  850.         INC L
  851.         LD E,(HL)
  852.         INC L
  853.         LD D,(HL) ;Yy
  854.         INC L
  855.         ld a,(hl) ;dir
  856.         or a
  857.         jr z,logSCMONS_nomove
  858.        push af ;dir
  859.         push bc ;x
  860.         ld l,a
  861.         LD H,tcos/256 ;-pi/4..+pi/4
  862.         LD c,(HL)
  863.         LD A,64
  864.         SUB L
  865.         LD L,A
  866.         LD b,(HL)
  867.         pop hl ;x
  868.         dup 3
  869.         sra b
  870.         sra c
  871.         edup
  872. ;hl=x
  873. ;de=y
  874. ;c=dx/4
  875. ;b=dy/4
  876.         call moveandcollideX
  877.         ex de,hl
  878.         call nc,moveandcollideY
  879. ;hl=y
  880. ;de=x
  881.        pop bc ;b=dir
  882.        ld a,b
  883.        jr nc,movemons_nochagedir
  884.        ld a,r
  885.        add a,a
  886.        inc a
  887. movemons_nochagedir
  888.         ld b,d
  889.         ld c,e ;x
  890.         ex de,hl ;y
  891. logSCMONS_nomove
  892.        pop hl
  893.         ld (hl),c
  894.         inc l
  895.         ld (hl),b ;Xx
  896.         inc l
  897.         ld (hl),e
  898.         inc l
  899.         ld (hl),d ;Yy
  900.         inc l
  901.         ld (hl),a ;dir
  902.         inc l ;skip dir
  903.  
  904.       if 1
  905.       ld a,0xfe
  906.       in a,(0xfe)
  907.       rra
  908.       jr c,logSCMONS_noattack
  909. ;если (1..3)*8+(0..1) и близко, то wantattack:
  910.         ld a,(hl) ;TYPE*8+phase        
  911.         and (30*8)+6
  912.         cp 0*8+0 ;стоит спиной
  913.         ld e,MONSTERBACKviewrange
  914.         jr z,logSCMONS_startattack
  915.         cp 2*8+0 ;стоит лицом или идёт
  916.         ld e,MONSTERviewrange
  917.         jr nz,logSCMONS_noattack
  918. logSCMONS_startattack
  919.         ld a,(IMcurYy+1)
  920.         sub d ;Y
  921.         jr nc,$+4
  922.         neg
  923.         cp e;MONSTERviewrange
  924.         jr nc,logSCMONS_noattack
  925.         ld a,(IMcurXx+1)
  926.         sub b ;X
  927.         jr nc,$+4
  928.         neg
  929.         cp e;MONSTERviewrange
  930.         jr nc,logSCMONS_noattack
  931.         ld (hl),3*8+2 ;wantattack
  932.         inc l
  933.         inc l
  934.         ld (hl),TIME_WANTATTACK
  935.         dec l
  936.         dec l
  937.         push hl
  938.         ld a,4 ;shout
  939.         call sfxplay
  940.         pop hl
  941. logSCMONS_noattack
  942.       endif
  943.         ld c,(hl) ;TYPE*8+phase
  944.         INC L ;skip TYPE*8+phase
  945.         inc L ;skip energy
  946.         dec (hl) ;time
  947.         jr nz,logSCMONS_notime
  948.         ld (hl),TIME_STEP ;time
  949.         dec l
  950.         dec l ;hl points to TYPE*8+phase
  951.         ld a,c
  952.         and 7
  953.         jr z,logSCMONS_step
  954.         dec a
  955.         jr z,logSCMONS_step
  956.         dec a
  957.         jr z,logSCMONS_wantattack
  958.         dec a ;attack
  959.         jr z,logSCMONS_attack
  960.         dec a
  961.         jr z,logSCMONS_wounded
  962.         dec a
  963.         jr z,logSCMONS_explode2
  964.         jr logSCMONS_nosetphase
  965. logSCMONS_wantattack
  966.         inc l
  967.         inc l
  968.         ld (hl),TIME_ATTACK
  969.         dec l
  970.         dec l
  971.         dec l
  972.         ld (hl),0 ;dir (no move)
  973.         inc l
  974.         ld a,3*8+3 ;moving attack
  975.         jr logSCMONS_setphase
  976. logSCMONS_explode2
  977.        ld a,8*8 ;fire
  978.        jr logSCMONS_setphase
  979. logSCMONS_attack
  980. ;todo shot
  981.  
  982. ;дальше продолжаем движение
  983. logSCMONS_wounded
  984.        ld a,(hl)
  985.        cp 4*8 ;ammo?
  986.        ld a,4*8+5 ;explode2
  987.        jr nc,logSCMONS_setphase;logSCMONS_wounded_ammo
  988.         ld a,r
  989.         add a,a ;dir
  990.         dec l
  991.         ld (hl),a ;dir
  992.         inc l
  993.         ld a,3*8+0 ;moving
  994.         jr logSCMONS_setphase ;not ammo
  995. ;logSCMONS_wounded_ammo
  996. ;       ld a,4*8+6 ;explode2
  997. ;       jr logSCMONS_setphase
  998. logSCMONS_step
  999.         ld a,c
  1000.         xor 1
  1001. logSCMONS_setphase
  1002.         ld (hl),a
  1003. logSCMONS_nosetphase
  1004.         inc l
  1005.         inc l
  1006. logSCMONS_notime
  1007.         inc hl ;skip TIME
  1008.        INC L ;skip x
  1009.         jp logSCMONS0
  1010.  
  1011. moveandcollideX
  1012. ;hl=x
  1013. ;de=y
  1014. ;c=dx/4
  1015. ;b=dy/4
  1016.         ;ADD HL,BC
  1017.        PUSH HL
  1018. ;|..............|
  1019. ;.....<---*--->..      
  1020.         ;or a:sbc hl,bc;LD HL,(IMcurXx)
  1021.          ld a,l
  1022.          sub mindist ;dx<0
  1023.          ;dec h
  1024.         BIT 7,c;B
  1025.         jr nz,$+6
  1026.          ld a,l
  1027.          add a,mindist ;dx>0
  1028.          inc h
  1029.         jr nc,CTRLXpass ;проходимо (CY=0)
  1030.         ;LD A,H
  1031.         ;LD HL,(IMcurYy)
  1032.         ;LD L,A
  1033.         ld l,h
  1034.         ld h,d ;Y
  1035.         SET mapdifbit,L
  1036.         LD A,(HL)
  1037.         RLA ;проходимо?
  1038. CTRLXpass
  1039.        POP HL
  1040.         jr nc,CTRLnXq ;проходимо (CY=0)
  1041. CTRLnX
  1042. ;непроходимо
  1043.         ;LD HL,(IMcurXx)
  1044.         BIT 7,c;B
  1045.         LD l,256-mindist ;dx>0
  1046.         ret z ;C
  1047.         LD l,mindist ;dx<0
  1048.         ret ;C
  1049. CTRLnXq
  1050.         ;add hl,bc
  1051.         ld a,c
  1052.         add a,l
  1053.         ld l,a
  1054.         adc a,h
  1055.         sub l
  1056.         ld h,a
  1057.          or a ;NC
  1058.         bit 7,c
  1059.         ret z ;NC
  1060.         dec h
  1061.         ret ;NC
  1062. moveandcollideY
  1063. ;hl=y
  1064. ;b=dy/4
  1065.         ;ADD HL,DE
  1066.        PUSH HL
  1067.         ;or a:sbc hl,de;LD HL,(IMcurYy)
  1068.          ld a,l
  1069.          sub mindist ;dx<0
  1070.          ;dec h
  1071.         BIT 7,b;D
  1072.         jr nz,$+6
  1073.          ld a,l
  1074.          add a,mindist ;dx>0
  1075.          inc h
  1076.         jr nc,CTRLYpass ;проходимо (CY=0)
  1077.         ;LD A,H
  1078.         ;LD HL,(IMcurXx)
  1079.         ;LD L,H
  1080.         ;LD H,A
  1081.         ld l,d ;X
  1082.         LD A,(HL)
  1083.         RLA ;проходимо?
  1084. CTRLYpass
  1085.        POP HL
  1086.        jr nc,CTRLnYq ;проходимо (CY=0)
  1087. ;непроходимо
  1088.         ;LD HL,(IMcurYy)
  1089.         BIT 7,b;d
  1090.         LD l,256-mindist ;dy>0
  1091.         ret z ;C
  1092.         LD l,mindist ;dy<0
  1093.         ret ;C
  1094. CTRLnYq
  1095.         ;add hl,de
  1096.         ld a,b
  1097.         add a,l
  1098.         ld l,a
  1099.         adc a,h
  1100.         sub l
  1101.         ld h,a
  1102.          or a ;NC
  1103.         bit 7,b
  1104.         ret z ;NC
  1105.         dec h
  1106.         RET ;NC
  1107.  
  1108. closecurrentdoor
  1109. ;keeps hl,de
  1110.         ld a,128+ID_DOOR;(hl)
  1111. oldopendooraddr=$+1
  1112.         ld (killablebyte),a
  1113. oldopendooraddr2=$+1
  1114.         ld (killablebyte),a
  1115.        ld bc,killablebyte
  1116.        ld (oldopendooraddr),bc
  1117.        ld (oldopendooraddr2),bc
  1118.         ret
  1119. killablebyte
  1120.         db 0
  1121.  
  1122. addmax
  1123. ;add b, max c
  1124.         ld a,(hl)
  1125.         cp c;100
  1126.         ret nc
  1127.         add a,b;40
  1128.         ld (hl),a
  1129.         cp c;100
  1130.         ret c
  1131.         ld (hl),c;100
  1132.         ret
  1133.