?login_element?

Subversion Repositories NedoOS

Rev

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