?login_element?

Subversion Repositories NedoOS

Rev

Rev 2047 | Rev 2082 | 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 ;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.         and 0xf8 ;иначе фаза шевелится 0..1
  769.         push hl
  770.         ;ld a,l
  771.         ;and 0xf8
  772.         ;ld l,a
  773.         ;inc l ;X
  774.         res 1,l
  775.         res 2,l
  776.         ld (hl),0xc0 ;impossible X
  777.         cp 4*8
  778.         jr nz,logCOLLIDEnammo
  779.         ld hl,bullets
  780.         ld bc,40*256+50 ;ADDmax
  781.         call addmax
  782. logCOLLIDEnammo
  783.         cp 5*8
  784.         jr nz,logCOLLIDEnhealth
  785.         ld hl,health
  786.         ld bc,40*256+100 ;ADDmax
  787.         call addmax
  788. logCOLLIDEnhealth
  789.        
  790.         ld a,3 ;get obj
  791.         call sfxplay
  792.         pop hl
  793. logCOLLIDEnobj
  794.         inc l
  795.         ;ld a,(hl) ;energy
  796.         inc l
  797.         ;ld a,(hl) ;time
  798.         inc hl
  799.        INC L ;skip x
  800.         jp logCOLLIDE0
  801.  
  802. movemonsters
  803. ;move monsters
  804.         LD A,(IMcurXx+1);d;(curX)
  805.         SUB viewrange
  806.         LD (logscmonX),A
  807.         LD A,(IMcurYy+1);h;(curY)
  808.         SUB viewrange
  809.         LD (logscmonY),A
  810.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  811.         ld hx,-1 ;monster index
  812.        jp logSCMONS0 ;цикл скан-я видимых монстров/предметов
  813. logSCMONNx
  814.         LD A,L
  815.         ADD A,8
  816.         LD L,A
  817.         JR C,logSCMxIH
  818. logSCMONS0
  819.        inc hx ;monster index
  820.         LD A,(HL) ;X
  821.         INC A
  822.        RET Z
  823. logscmonX=$+1
  824.         SUB 0
  825.         CP viewrange*2+1
  826.         JP NC,logSCMONNx
  827.         INC L
  828.         inc L
  829.         LD A,(HL)
  830. logscmonY=$+1
  831.         SUB 0
  832.         CP viewrange*2+1
  833.         JR C,logSCMONY
  834.         LD A,L
  835.         ADD A,6
  836.         LD L,A
  837.         JP NC,logSCMONS0
  838. logSCMxIH
  839.         INC H
  840.         JP logSCMONS0
  841. logSCMONY
  842.         DEC L
  843.         dec L
  844.         dec L
  845.        push hl
  846.         LD C,(HL)
  847.         INC L
  848.         LD B,(HL) ;Xx
  849.         INC L
  850.         LD E,(HL)
  851.         INC L
  852.         LD D,(HL) ;Yy
  853.         INC L
  854.         ld a,(hl) ;dir
  855.         or a
  856.         jr z,logSCMONS_nomove
  857.        push af ;dir
  858.         push bc ;x
  859.         ld l,a
  860.         LD H,tcos/256 ;-pi/4..+pi/4
  861.         LD c,(HL)
  862.         LD A,64
  863.         SUB L
  864.         LD L,A
  865.         LD b,(HL)
  866.         pop hl ;x
  867.         dup 3
  868.         sra b
  869.         sra c
  870.         edup
  871. ;hl=x
  872. ;de=y
  873. ;c=dx/4
  874. ;b=dy/4
  875.         call moveandcollideX
  876.         ex de,hl
  877.         call nc,moveandcollideY
  878. ;hl=y
  879. ;de=x
  880.        pop bc ;b=dir
  881.        ld a,b
  882.        jr nc,movemons_nochagedir
  883.        ld a,r
  884.        add a,a
  885.        inc a
  886. movemons_nochagedir
  887.         ld b,d
  888.         ld c,e ;x
  889.         ex de,hl ;y
  890. logSCMONS_nomove
  891.        pop hl
  892.         ld (hl),c
  893.         inc l
  894.         ld (hl),b ;Xx
  895.         inc l
  896.         ld (hl),e
  897.         inc l
  898.         ld (hl),d ;Yy
  899.         inc l
  900.         ld (hl),a ;dir
  901.         inc l ;skip dir
  902.  
  903.       if 1
  904.       ld a,0xfe
  905.       in a,(0xfe)
  906.       rra
  907.       jr c,logSCMONS_noattack
  908. ;если (1..3)*8+(0..1) и близко, то wantattack:
  909.         ld a,(hl) ;TYPE*8+phase        
  910.         and (30*8)+6
  911.         cp 0*8+0 ;стоит спиной
  912.         ld e,MONSTERBACKviewrange
  913.         jr z,logSCMONS_startattack
  914.         cp 2*8+0 ;стоит лицом или идёт
  915.         ld e,MONSTERviewrange
  916.         jr nz,logSCMONS_noattack
  917. logSCMONS_startattack
  918.         ld a,(IMcurYy+1)
  919.         sub d ;Y
  920.         jr nc,$+4
  921.         neg
  922.         cp e;MONSTERviewrange
  923.         jr nc,logSCMONS_noattack
  924.         ld a,(IMcurXx+1)
  925.         sub b ;X
  926.         jr nc,$+4
  927.         neg
  928.         cp e;MONSTERviewrange
  929.         jr nc,logSCMONS_noattack
  930.         ld (hl),3*8+2 ;wantattack
  931.         inc l
  932.         inc l
  933.         ld (hl),TIME_WANTATTACK
  934.         dec l
  935.         dec l
  936.         push hl
  937.         ld a,4 ;shout
  938.         call sfxplay
  939.         pop hl
  940. logSCMONS_noattack
  941.       endif
  942.         ld c,(hl) ;TYPE*8+phase
  943.         INC L ;skip TYPE*8+phase
  944.         inc L ;skip energy
  945.         dec (hl) ;time
  946.         jr nz,logSCMONS_notime
  947.         ld (hl),TIME_STEP ;time
  948.         dec l
  949.         dec l ;hl points to TYPE*8+phase
  950.         ld a,c
  951.         and 7
  952.         jr z,logSCMONS_step
  953.         dec a
  954.         jr z,logSCMONS_step
  955.         dec a
  956.         jr z,logSCMONS_wantattack
  957.         dec a ;attack
  958.         jr z,logSCMONS_attack
  959.         dec a
  960.         jr z,logSCMONS_wounded
  961.         jr logSCMONS_nosetphase
  962. logSCMONS_wantattack
  963.         inc l
  964.         inc l
  965.         ld (hl),TIME_ATTACK
  966.         dec l
  967.         dec l
  968.         dec l
  969.         ld (hl),0 ;dir (no move)
  970.         inc l
  971.         ld a,3*8+3 ;moving attack
  972.         jr logSCMONS_setphase
  973. logSCMONS_attack
  974. ;todo shot
  975.  
  976. ;дальше продолжаем движение
  977. logSCMONS_wounded
  978.        ld a,(hl)
  979.        cp 4*8 ;ammo?
  980.        ld a,4*8+5 ;explode2
  981.        jr nc,logSCMONS_setphase;logSCMONS_wounded_ammo
  982.         ld a,r
  983.         add a,a ;dir
  984.         dec l
  985.         ld (hl),a ;dir
  986.         inc l
  987.         ld a,3*8+0 ;moving
  988.         jr logSCMONS_setphase ;not ammo
  989. ;logSCMONS_wounded_ammo
  990. ;       ld a,4*8+6 ;explode2
  991. ;       jr logSCMONS_setphase
  992. logSCMONS_step
  993.         ld a,c
  994.         xor 1
  995. logSCMONS_setphase
  996.         ld (hl),a
  997. logSCMONS_nosetphase
  998.         inc l
  999.         inc l
  1000. logSCMONS_notime
  1001.         inc hl ;skip TIME
  1002.        INC L ;skip x
  1003.         jp logSCMONS0
  1004.  
  1005. moveandcollideX
  1006. ;hl=x
  1007. ;de=y
  1008. ;c=dx/4
  1009. ;b=dy/4
  1010.         ;ADD HL,BC
  1011.        PUSH HL
  1012. ;|..............|
  1013. ;.....<---*--->..      
  1014.         ;or a:sbc hl,bc;LD HL,(IMcurXx)
  1015.          ld a,l
  1016.          sub mindist ;dx<0
  1017.          ;dec h
  1018.         BIT 7,c;B
  1019.         jr nz,$+6
  1020.          ld a,l
  1021.          add a,mindist ;dx>0
  1022.          inc h
  1023.         jr nc,CTRLXpass ;проходимо (CY=0)
  1024.         ;LD A,H
  1025.         ;LD HL,(IMcurYy)
  1026.         ;LD L,A
  1027.         ld l,h
  1028.         ld h,d ;Y
  1029.         SET mapdifbit,L
  1030.         LD A,(HL)
  1031.         RLA ;проходимо?
  1032. CTRLXpass
  1033.        POP HL
  1034.         jr nc,CTRLnXq ;проходимо (CY=0)
  1035. CTRLnX
  1036. ;непроходимо
  1037.         ;LD HL,(IMcurXx)
  1038.         BIT 7,c;B
  1039.         LD l,256-mindist ;dx>0
  1040.         ret z ;C
  1041.         LD l,mindist ;dx<0
  1042.         ret ;C
  1043. CTRLnXq
  1044.         ;add hl,bc
  1045.         ld a,c
  1046.         add a,l
  1047.         ld l,a
  1048.         adc a,h
  1049.         sub l
  1050.         ld h,a
  1051.          or a ;NC
  1052.         bit 7,c
  1053.         ret z ;NC
  1054.         dec h
  1055.         ret ;NC
  1056. moveandcollideY
  1057. ;hl=y
  1058. ;b=dy/4
  1059.         ;ADD HL,DE
  1060.        PUSH HL
  1061.         ;or a:sbc hl,de;LD HL,(IMcurYy)
  1062.          ld a,l
  1063.          sub mindist ;dx<0
  1064.          ;dec h
  1065.         BIT 7,b;D
  1066.         jr nz,$+6
  1067.          ld a,l
  1068.          add a,mindist ;dx>0
  1069.          inc h
  1070.         jr nc,CTRLYpass ;проходимо (CY=0)
  1071.         ;LD A,H
  1072.         ;LD HL,(IMcurXx)
  1073.         ;LD L,H
  1074.         ;LD H,A
  1075.         ld l,d ;X
  1076.         LD A,(HL)
  1077.         RLA ;проходимо?
  1078. CTRLYpass
  1079.        POP HL
  1080.        jr nc,CTRLnYq ;проходимо (CY=0)
  1081. ;непроходимо
  1082.         ;LD HL,(IMcurYy)
  1083.         BIT 7,b;d
  1084.         LD l,256-mindist ;dy>0
  1085.         ret z ;C
  1086.         LD l,mindist ;dy<0
  1087.         ret ;C
  1088. CTRLnYq
  1089.         ;add hl,de
  1090.         ld a,b
  1091.         add a,l
  1092.         ld l,a
  1093.         adc a,h
  1094.         sub l
  1095.         ld h,a
  1096.          or a ;NC
  1097.         bit 7,b
  1098.         ret z ;NC
  1099.         dec h
  1100.         RET ;NC
  1101.  
  1102. closecurrentdoor
  1103. ;keeps hl,de
  1104.         ld a,128+ID_DOOR;(hl)
  1105. oldopendooraddr=$+1
  1106.         ld (killablebyte),a
  1107. oldopendooraddr2=$+1
  1108.         ld (killablebyte),a
  1109.        ld bc,killablebyte
  1110.        ld (oldopendooraddr),bc
  1111.        ld (oldopendooraddr2),bc
  1112.         ret
  1113. killablebyte
  1114.         db 0
  1115.  
  1116. addmax
  1117. ;add b, max c
  1118.         ld a,(hl)
  1119.         cp c;100
  1120.         ret nc
  1121.         add a,b;40
  1122.         ld (hl),a
  1123.         cp c;100
  1124.         ret c
  1125.         ld (hl),c;100
  1126.         ret
  1127.