?login_element?

Subversion Repositories NedoOS

Rev

Rev 1903 | Rev 1974 | 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. ;режимы двери:
  24. ;0: дверь закрыта
  25. ;1: дверь открывается, doortimer увеличивается
  26. ;2: дверь открыта, dooropentimer уменьшается
  27. ;3: дверь закрывается, doortimer уменьшается
  28. doortimer=$+1
  29.         ld a,0
  30. doortimermode=$+1
  31.         ld b,0
  32.         djnz control_door_noopening
  33.         add a,2
  34.         ld (doortimer),a
  35.         jr nz,control_doorq
  36.         dec a ;-1
  37.         ld (doortimer),a ;stay opened
  38.         ld a,50 ;a=door open time
  39.         ld (dooropentimer),a
  40.         ld a,2
  41.         ld (doortimermode),a
  42.         jr control_doorq
  43. control_door_noopening
  44.         djnz control_door_noopened
  45. dooropentimer=$+1
  46.         ld a,0
  47.         dec a
  48.         ld (dooropentimer),a
  49.         jr nz,control_doorq
  50.         ;call closecurrentdoor ;keeps hl
  51.         ld a,-2
  52.         ld (doortimer),a ;stay opened
  53.         ld a,3
  54.         ld (doortimermode),a
  55.         jr control_doorq
  56. control_door_noopened
  57.         djnz control_door_noclosing
  58. ;если игрок стоит в дверях, то не закрываем, а открываем
  59.         LD HL,(IMcurXx+1)
  60.         LD a,(IMcurYy+1)
  61.         ld h,a
  62.         ld a,ID_DOOR
  63.         cp (hl)
  64.         jr z,control_door_setopened
  65.         inc h
  66.         cp (hl)
  67.         jr z,control_door_setopened
  68.         dec h
  69.         set mapdifbit,l
  70.         cp (hl)
  71.         jr z,control_door_setopened
  72.         inc l
  73.         cp (hl)
  74.         jr z,control_door_setopened
  75.         ld a,(doortimer)
  76.         sub 2
  77.         ld (doortimer),a
  78.         jr nz,control_doorq
  79.         ;xor a
  80.         ld (doortimermode),a
  81.         call closecurrentdoor ;keeps hl
  82.         jr control_doorq
  83. control_door_setopened
  84.         ld a,1
  85.         ld (doortimermode),a
  86. control_door_noclosing
  87. control_doorq
  88.  
  89.        IF kempston
  90.         LD C,#FF
  91.         IN A,(#1F)
  92.         LD B,A
  93.         AND #E0
  94.         jr NZ,nKEMPSTON
  95.         LD A,B
  96.         RRA
  97.         jr NC,$+4
  98.         RES 1,C
  99.         RRA
  100.         jr NC,$+4
  101.         RES 0,C
  102.         RRA
  103.         jr NC,$+4
  104.         RES 3,C
  105.         RRA
  106.         jr NC,$+4
  107.         RES 2,C
  108.         RRA
  109.         jr NC,$+4
  110.         RES 6,C
  111. nKEMPSTON
  112. ;C=%1f11durl
  113.        ENDIF
  114.        IF autostrafe
  115.         BIT 3,C ;down
  116.         jr NZ,nAUTOSTRAFE
  117.         LD A,C
  118.         BIT 1,A
  119.         jr NZ,$+6
  120.         AND %01101111 ;strafe + rotate flag
  121.         OR %00001011 ;block down & rotate
  122.         BIT 0,A
  123.         jr NZ,$+6
  124.         AND %01011111 ;strafe + rotate flag
  125.         OR %00001011 ;block down & rotate
  126.         LD C,A
  127. nAUTOSTRAFE
  128.        ENDIF
  129.         LD B,#FF
  130.         ld a,#fe
  131.         in a,(#fe)
  132.         rra
  133.         rl b ;cs (open)
  134.         LD A,#7F
  135.         IN A,(#FE)
  136.         RRA
  137.         RL B ;space (fire)
  138.         LD A,#FD
  139.         IN A,(#FE)
  140.         RRA
  141.         RL B ;A
  142.         RRA
  143.         RRA
  144.         RL B ;D
  145.         RLA
  146.         RL B ;S (down)
  147.         LD A,#FB
  148.         IN A,(#FE)
  149.         RRA
  150.         RRA
  151.         RL B ;W (up)
  152.         LD A,#DF
  153.         IN A,(#FE)
  154.         RRA
  155.         RL B ;P (right)
  156.         RRA
  157.         LD A,B
  158.         RLA ;O (left)
  159.        IF kempston
  160.         AND C
  161.        ENDIF
  162.  
  163. ;A=%ofADdurl
  164.  
  165.        IF demoplay
  166. demoplayoff=$
  167.         OR A
  168.         jr C,demoplayQ
  169.        BIT 4,A ;"D"
  170.        jr NZ,demoplaynOFF
  171.         LD A,#37 ;scf
  172.         LD (demoplayoff),A
  173.         LD A,#91 ;sub c
  174.         LD (mouseon),A
  175.         LD A,#FF
  176. demoplaynOFF
  177. democursor=$+1
  178.         LD HL,demobegin
  179. demokey=$+1
  180.         LD A,%00111111
  181. demokeytime=$+1
  182.         LD C,1
  183.         DEC C
  184.         jr NZ,CnNEWKEY
  185.         LD A,(HL)
  186.         LD (demokey),A
  187.         INC HL
  188.         LD C,(HL)
  189.         INC HL
  190.         LD (democursor),HL
  191. CnNEWKEY
  192.         LD HL,demokeytime
  193.         LD (HL),C
  194. demoplayQ
  195.        ELSE
  196.        IF demorec
  197. democursor=$+1
  198.         LD HL,demobegin
  199. demokeytime=$+1
  200.         LD C,0
  201.         INC C
  202.         jr Z,CNEWKEY
  203.         CP (HL)
  204.         jr Z,CnNEWKEY
  205. CNEWKEY
  206.         INC HL
  207.         LD (HL),C
  208.         LD C,0
  209.         INC HL
  210. CnNEWKEY
  211.         LD (HL),A
  212.         LD (democursor),HL
  213.         LD HL,demokeytime
  214.         LD (HL),C
  215.        ENDIF
  216.        ENDIF
  217.  
  218. ;a=%ofADdurl
  219.        PUSH AF
  220.         bit 7,a
  221.         jr nz,noopendoor
  222.         ;call closecurrentdoor ;keeps hl
  223.  
  224.         LD HL,(IMcurXx+1)
  225.         LD a,(IMcurYy+1)
  226.         ld h,a
  227.         ld c,ID_DOOR*2
  228.         ld a,(hl)
  229.         add a,a
  230.         cp c
  231.         jr z,opendoor_h_dec
  232.         inc h ;dec h
  233.         ld a,(hl)
  234.         add a,a
  235.         cp c
  236.         jr z,opendoor_h_inc
  237.         dec h ;inc h
  238.         set mapdifbit,l
  239.         ld a,(hl)
  240.         add a,a
  241.         cp c
  242.         jr z,opendoor_l_dec
  243.         inc l
  244.         ld a,(hl)
  245.         add a,a
  246.         cp c
  247.         ;jr z,opendoor
  248.         jr nz,noopendoor
  249. opendoor_l_inc
  250.         push hl
  251.         res 7,(hl)
  252.         inc l
  253.         res 7,(hl)
  254.         jr opendoorok
  255. opendoor_l_dec
  256.         push hl
  257.         res 7,(hl)
  258.         dec l
  259.         res 7,(hl)
  260.         jr opendoorok
  261. opendoor_h_dec
  262.         push hl
  263.         res 7,(hl)
  264.         dec h
  265.         res 7,(hl)
  266.         jr opendoorok
  267. opendoor_h_inc
  268.         push hl
  269.         res 7,(hl)
  270.         inc h
  271.         res 7,(hl)
  272. opendoorok
  273. ;ничего не делать, если hl==(oldopendooraddr2)
  274.        ld de,(oldopendooraddr2)
  275.        or a
  276.        sbc hl,de
  277.        add hl,de
  278.         pop de
  279.        jr z,noopendoor
  280.         call closecurrentdoor ;keeps hl,de
  281.         ld (oldopendooraddr2),hl
  282.         ld (oldopendooraddr),de
  283.         xor a
  284.         ld (doortimer),a
  285.         inc a
  286.         ld (doortimermode),a
  287.         ld a,5
  288.         call sfxplay
  289. noopendoor
  290.        pop af
  291. ;a=%ofADdurl
  292.        bit 6,a
  293.        jp nz,nofire
  294.        push af
  295.        if sprites
  296.        
  297.         call RAYPREPXY
  298.         LD A,SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  299.         ld l,a
  300.         LD (cura),A
  301.         CALL RAYCAST
  302. ;C=dist(scale#)
  303. ;B=texx
  304.         ld a,c
  305.         ld (fire_walldist),a
  306.        if 1==0
  307.        call getuser_scr_high_cur
  308.        SETPG8000
  309.        ld a,(fire_walldist)
  310.        ld hl,0x8000
  311.        ld bc,40
  312.        dup 8
  313.        ld (hl),7
  314.        rla
  315.        rr (hl)
  316.        add hl,bc
  317.        edup
  318.        endif
  319.        
  320.         call SCANMONS      
  321. ;в cursprites лежат данные о видимых спрайтах (от задних к передним)
  322. ;ID 8 (0=end)
  323. ;dist 16
  324. ;xscr 8
  325. ;monster index
  326.         ld hl,cursprites
  327. fire_scan0
  328.         ld a,(hl)
  329.         or a
  330.         jp z,fire_scan0q
  331.         inc l
  332.         ld c,(hl)
  333.         inc l
  334.         ld b,(hl) ;bc=dist
  335.         ld d,b
  336.         ld e,c
  337.         inc l
  338.         dup 3;4
  339.         srl d
  340.         rr e
  341.         edup
  342.         ld a,d
  343.         or a
  344.         jr z,$+4
  345.          ld e,255
  346.         or e
  347.         jr nz,$+3
  348.          inc e
  349.         ld d,t1x/256
  350.         ld a,(de) ;width*k (for typical sprite width)
  351.         ld e,a
  352.         ld a,(hl) ;xscr (центр = 0x40)
  353.         sub e
  354.         jr nc,$+3
  355.          xor a ;a=sprite left margin
  356.         cp SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  357.         jr nc,fire_miss
  358.         ld a,(hl) ;xscr
  359.         add a,e
  360.         jr nc,$+3
  361.          sbc a,a ;a=sprite right margin
  362.         cp SCRWIDPIX/2;0x40;TODO связано с scrwid/2
  363.         jr c,fire_miss
  364.         push hl
  365. ;не убивать, если стена впереди закрывает монстра (т.е. стена ближе)
  366. ;bc=dist
  367. ;приводим к 128..255
  368.         LD DE,#000
  369.         INC B
  370.         DEC B
  371.         LD A,C
  372.         jr Z,fire_MOTOLOGRLQ
  373.        DUP 5;6
  374.         INC D
  375.         SRL B
  376.         RRA
  377.         jr Z,fire_MOTOLOGRLE
  378.        EDUP
  379. fire_MOTOLOGRLQ ;
  380. fire_MOTOLOGRLE ;
  381.         LD C,A ;128..255 ;D=0..5
  382.         LD B,tlogd/256
  383.         LD A,(BC) ;log(dist) = 128..255 for arg>=128
  384.        if atm==0
  385.        SUB 16;64                 ;0..127 for arg=64..127 ;???
  386.        endif
  387.         LD C,A                ;0 for arg<64
  388.         LD B,tlogd2sca/256
  389.          SRA D
  390.          RR E ;DE=+0,+#80,..+#300
  391.         ex de,hl
  392.         ADD HL,BC
  393.         LD a,(HL) ;scale#
  394.         pop hl
  395. fire_walldist=$+1
  396.         cp 0
  397.         jr c,fire_miss
  398.         push hl
  399.        
  400. ;найти этого монстра в таблице монстров
  401.         inc l
  402.         ld l,(hl) ;monster index
  403.         ld h,0
  404.         add hl,hl
  405.         add hl,hl
  406.         add hl,hl ;*8
  407.         ld bc,MONSTRS+1 ;Xx,Yy,TYPEphase,TIMEenergy
  408.         add hl,bc
  409.         ld (hl),0xc0 ;impossible X
  410.         ld a,0;5
  411.         call sfxplay
  412.         pop hl
  413. fire_miss
  414.        if CURSPRITES_RECSZ == 5
  415.        inc l
  416.        endif
  417.         inc l
  418.         jp fire_scan0
  419. fire_scan0q
  420.  
  421.        endif
  422.        pop af
  423. nofire
  424.        push af
  425.  
  426. IMavision=$+1
  427.         LD HL,32*256
  428. IMdavision=$+1
  429.         LD DE,100
  430.         AND %10110011
  431.         CP 0
  432.         LD ($-1),A
  433.         jr Z,$+4
  434.         LD E,50 ;key just pressed/released
  435.        IF kempston&autostrafe
  436.         BIT 7,A
  437.         jr NZ,nAUTOROTATE
  438.         BIT 4,A
  439.         jr NZ,$+3
  440.         ADD HL,DE
  441.         BIT 5,A
  442.         jr NZ,$+4
  443.         SBC HL,DE
  444. nAUTOROTATE
  445.        ENDIF
  446.        IF doublerotate
  447.         RRA
  448.         jr C,$+4
  449.         ADD HL,DE
  450.         ADD HL,DE
  451.         RRA
  452.         jr C,$+6
  453.         SBC HL,DE
  454.         SBC HL,DE
  455.        ELSE
  456.         RRA
  457.         jr C,$+3
  458.         ADD HL,DE
  459.         RRA
  460.         jr C,$+4
  461.         SBC HL,DE
  462.        ENDIF
  463.  
  464.         LD A,E
  465.         ADD A,12;10
  466.         jr C,$+3
  467.          LD E,A ;key held: increase rotspd
  468.         LD (IMdavision),DE
  469.        IF mouse
  470.         LD BC,#FBDF
  471.         IN A,(C)
  472. mouseoldx=$+1
  473.         LD C,0
  474.         LD ($-1),A
  475. mouseon=$
  476.        IF demoplay
  477.         XOR A
  478.        ELSE
  479.         SUB C
  480.        ENDIF
  481.         NEG
  482.         LD E,A
  483.         RLA
  484.         SBC A,A
  485.         LD D,A
  486.         ex de,hl
  487.         DUP 6
  488.         ADD HL,HL
  489.         EDUP
  490.         ADD HL,DE
  491.        ENDIF
  492.         LD (IMavision),HL
  493.  
  494. ;делим вектор на коэфф замедления
  495. IMcurDX=$+1
  496.         LD HL,0
  497.         LD B,H
  498.         ld A,L
  499.         SRA B
  500.         RRA
  501.        IF doublespeed
  502.         SRA B
  503.         RRA
  504.        ENDIF
  505.         LD C,A
  506.         CP B
  507.        jr NZ,$+3
  508.        LD C,L
  509.         SBC HL,BC
  510.         LD B,H
  511.         ld C,L
  512. CSLOWXQ
  513. IMcurDY=$+1
  514.         LD HL,0
  515.         LD D,H
  516.         ld A,L
  517.         SRA D
  518.         RRA
  519.        IF doublespeed
  520.         SRA D
  521.         RRA
  522.        ENDIF
  523.         LD E,A
  524.         CP D
  525.        jr NZ,$+3
  526.        LD E,L
  527.         SBC HL,DE
  528.         LD D,H
  529.         ld E,L
  530. CSLOWYQ
  531.        POP AF ;%00ADSWPO
  532.        RRCA
  533.        RRCA
  534.        AND 15
  535.         LD HL,tkeyangle
  536.         ADD A,L
  537.         LD L,A
  538.        IF (tkeyangle^tkeyangleend)&256
  539.         ADC A,H
  540.         SUB L
  541.         LD H,A
  542.        ENDIF
  543.         LD A,(HL)
  544. ;прибавляем вектор направления
  545. ;sin и cos (IMavision+32*N), где N=0..7 в зав. от клавиш
  546. ;0=forth
  547. ;64=left
  548.        CP -1
  549.        JP Z,CTRLnspeed
  550.         LD HL,IMavision+1
  551.         ADD A,(HL)
  552.         LD L,A
  553.         LD H,tcos/256 ;-pi/4..+pi/4
  554.         LD A,(HL)
  555.        ADD A,C
  556.        LD C,A
  557.        BIT 7,(HL)
  558.        jr NZ,$+3
  559.        INC B
  560.        jr C,$+3
  561.        DEC B
  562.         LD A,64
  563.         SUB L
  564.         LD L,A
  565.         LD A,(HL)
  566.        ADD A,E
  567.        LD E,A
  568.        BIT 7,(HL)
  569.        jr NZ,$+3
  570.        INC D
  571.        jr C,$+3
  572.        DEC D
  573. CTRLnspeed
  574.         LD (IMcurDX),BC
  575.         LD (IMcurDY),DE
  576.        DUP 2
  577.         SRA D
  578.         RR E
  579.         SRA B
  580.         RR C
  581.        EDUP
  582.  
  583.         LD HL,(IMcurXx)
  584.         ADD HL,BC
  585.         BIT 7,B
  586.        PUSH DE,HL
  587.         LD HL,(IMcurXx)
  588.         LD DE,256-mindist ;dx>0
  589.         jr Z,$+4
  590.         LD  E,mindist ;dx<0
  591.         ADD HL,DE
  592.         LD A,H
  593.         LD HL,(IMcurYy)
  594.         LD  E,mindist
  595.         SBC HL,DE
  596.         LD B,H
  597.         ADD HL,DE
  598.         ADD HL,DE
  599.         LD L,A
  600.         SET mapdifbit,L
  601.         LD A,(HL)
  602.         LD H,B
  603.         OR (HL)
  604.        POP HL,DE
  605.         RLA ;проходимо?
  606.         jr C,CTRLnX
  607.         LD (IMcurXx),HL
  608.         ;jr CTRLnXq
  609. CTRLnX
  610. ;непроходимо
  611. ;CTRLnXq
  612.         LD HL,(IMcurYy)
  613.         ADD HL,DE
  614.         BIT 7,D
  615.        PUSH HL
  616.         LD HL,(IMcurYy)
  617.         LD DE,256-mindist ;dx>0
  618.         jr Z,$+4
  619.         LD  E,mindist ;dx<0
  620.         ADD HL,DE
  621.         LD A,H
  622.         LD HL,(IMcurXx)
  623.         LD  E,mindist
  624.         SBC HL,DE
  625.         LD B,H
  626.         ADD HL,DE
  627.         ADD HL,DE
  628.         LD L,H
  629.         LD H,A
  630.         LD A,(HL)
  631.         LD L,B
  632.         OR (HL)
  633.        POP HL
  634.         RLA ;проходимо?
  635.        RET C
  636.         LD (IMcurYy),HL ;H!=0
  637.         RET
  638.  
  639. closecurrentdoor
  640. ;keeps hl,de
  641.         ld a,128+ID_DOOR;(hl)
  642. oldopendooraddr=$+1
  643.         ld (killablebyte),a
  644. oldopendooraddr2=$+1
  645.         ld (killablebyte),a
  646.        ld bc,killablebyte
  647.        ld (oldopendooraddr),bc
  648.        ld (oldopendooraddr2),bc
  649.         ret
  650. killablebyte
  651.         db 0
  652.