?login_element?

Subversion Repositories NedoOS

Rev

Rev 2021 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.        IF corr_coord
  2. CORR_COORD
  3.        LD A,L
  4.        OR A
  5.        jr NZ,$+3
  6.        INC L
  7.        INC A
  8.        jr NZ,$+3
  9.        DEC L
  10.        LD A,H
  11.        OR A
  12.        jr NZ,$+3
  13.        INC H
  14.        INC A
  15.        RET NZ
  16.        DEC H
  17.         RET
  18.        ENDIF
  19.  
  20. RAYPREPXY
  21. ;TODO брать координаты не из прерывания!!!
  22.        IF optfast
  23.         LD HL,(IMcurDX)
  24.         LD A,H
  25.         OR L
  26.         LD HL,(IMcurDY)
  27.         OR H
  28.         OR L
  29.         LD A,lowmaxscale
  30.         jr Z,$+4
  31.         LD A,0;-1
  32.         LD (foptfast),A
  33.        ENDIF
  34. IMcurXx=$+1
  35.         LD HL,#0F80 ;#0580
  36.        IF corr_coord
  37.         CALL CORR_COORD
  38.        ENDIF
  39.         LD (curXx),HL
  40. IMcurYy=$+1
  41.         LD HL,#0180+(map&#FF00) ;#A580
  42.        IF corr_coord
  43.         CALL CORR_COORD
  44.        ENDIF
  45.         LD (curYy),HL
  46.         LD A,(IMavision+1)
  47.        LD (curangle),A
  48.         SUB 32
  49.         LD L,A
  50.         LD H,0
  51.         ADD HL,HL
  52.         ADD HL,HL
  53.         LD A,L
  54.         LD (avision4L),A
  55.         LD A,H
  56.         LD (avision4H),A
  57.         LD HL,(cury-1)
  58.         LD A,(curx)
  59.         LD L,A
  60.         LD (cur00yx),HL
  61.         LD (cur01yx),HL
  62.       ;LD A,L ;основное направление
  63.        CPL ;1-основное направление
  64.        LD L,A
  65.         LD (cur10yx),HL
  66.         LD (cur11yx),HL
  67.        CPL ;основное направление
  68.         LD L,H,H,A
  69.         LD (cur00xy),HL
  70.         LD (cur01xy),HL
  71.        LD A,L ;1-основное направление
  72.        CPL ;основное направление
  73.        LD L,A
  74.         LD (cur10xy),HL
  75.         LD (cur11xy),HL
  76.         LD HL,(curX)
  77.         LD A,(curY)
  78.         LD H,A
  79.        ;LD (curYX),HL
  80.         LD (ray00yx_YX),HL
  81.         LD (ray01yx_YX),HL
  82.         LD (ray10yx_YX),HL
  83.         LD (ray11yx_YX),HL
  84.         LD (ray00xy_YX),HL
  85.         LD (ray01xy_YX),HL
  86.         LD (ray10xy_YX),HL
  87.         LD (ray11xy_YX),HL
  88.         SET mapdifbit,L
  89.         LD (ray00xy_YX2),HL
  90.         LD (ray01xy_YX2),HL
  91.         LD (ray10xy_YX2),HL
  92.         LD (ray11xy_YX2),HL
  93.         ret
  94. SCAN
  95.         call RAYPREPXY
  96.  
  97.         ;TODO чтобы узнать, какая дверь открывается, надо её отметить на самой карте (с обеих сторон)
  98.  
  99.       IF interpolate == 0
  100.  
  101.        IF lores
  102.         LD L,0;2*(32-scrwid)
  103.         LD HY,SCRWIDPIX;scrwid*4
  104.        ELSE
  105.         LD L,0;4*(32-scrwid)
  106.         LD HY,SCRWIDPIX;scrwid*8
  107.        ENDIF
  108. RAY0
  109.         LD A,L
  110.         LD (cura),A
  111.         CALL RAYCAST
  112.        LD HL,(cura)
  113.         LD H,distbuf/256+2
  114.         LD (HL),C ;dist (scale#)
  115.         DEC H
  116.         LD (HL),B ;texx
  117.         DEC H
  118.         RRCA ;CY=0
  119.         LD A,(DE) ;ID(YX)
  120.          ;ld a,0xc0
  121.         LD (HL),A ;ID
  122.         INC L
  123.         DEC HY
  124.         JP NZ,RAY0
  125.  
  126.       ELSE ;interpolate
  127. main_step=interpolate;16
  128.          ;oldscan=RAYCAST(0)
  129.         XOR A
  130.         LD L,A
  131.         LD (cura),A
  132.         CALL RAYCAST
  133.         EXX
  134.          ;main_a=main_step-1
  135.         LD L,main_step-1
  136.        ;IF lores
  137.        ; LD HY,scrwid*4/main_step
  138.        ;ELSE
  139.        ; LD HY,scrwid*8/main_step
  140.        ;ENDIF
  141.        ld hy,SCRWIDPIX/main_step
  142.          ;repeat {
  143. ;L=main_a
  144. ;BCDE'=oldscan
  145. ;BCDE=newscan
  146. RAY0
  147.          ;newscan=RAYCAST(main_a)
  148.         LD A,L
  149.         LD (cura),A
  150.         CALL RAYCAST
  151.        LD HL,(cura)
  152.          ;INTERPOLATE_SUB(main_a, main_step, oldscan, newscan)
  153.         LD A,main_step
  154.         LD H,distbuf/256+2
  155.         LD (HL),C ;dist (scale#)
  156.         DEC H
  157.         LD (HL),B ;texx
  158.         DEC H
  159.         RRCA ;CY=0
  160.         CALL INTERPOLATE_SUB
  161.         LD A,(DE) ;ID(YX)
  162.          ;ld a,0xc0
  163.         LD (HL),A ;ID
  164.          ;oldscan=newscan
  165.         LD A,L
  166.         EXX
  167.          ;main_a+=main_step
  168.         ADD A,main_step
  169.         LD L,A
  170.          ;} until(main_a>255)
  171.         DEC HY
  172.         JP NZ,RAY0
  173.       ENDIF ;interpolate
  174.         RET
  175.  
  176. ;((b+f)/2)^2-b^2/4-f^2/4
  177. ;a=e
  178.        MACRO MULPOS
  179.         LD H,tsqr2/256
  180.         ADD A,C
  181.         RRA
  182.         LD L,A
  183.         LD A,(HL)
  184.         INC H
  185.         LD L,C
  186.         SUB (HL)
  187.         LD L,E
  188.         SUB (HL)
  189.        ENDM
  190.  
  191.        MACRO DIVPOS
  192.         SRL C
  193.        DUP 7
  194.         ADD A,C
  195.         jr NC,$+3
  196.         SUB C
  197.         RL B
  198.         ADD A,A
  199.        EDUP
  200.         ADD A,C
  201.         LD A,B
  202.         RLA
  203.        ENDM
  204.  
  205.        MACRO DIVNEG
  206.         SRL C
  207.        DUP 7
  208.         SUB C
  209.         jr NC,$+3
  210.         ADD A,C
  211.         RL B
  212.         ADD A,A
  213.        EDUP
  214.         SUB C
  215.         LD A,B
  216.         RLA
  217.        ENDM
  218.  
  219.  
  220. ;Y растёт вверх
  221. RAYCAST
  222. ;L=(cura)=угол на экране
  223. ;портит ABCDEHLIX
  224.         ld a,(doortimer)
  225.         ld ly,a
  226.         LD H,tda/256
  227.         LD A,(HL)
  228. avision4L=$+1
  229.         ADD A,0
  230.         LD (rayrealangle),A
  231.         LD L,A
  232. avision4H=$+1
  233.         ADC A,0
  234.         SUB L ;a1..0 = 0..3 ~ sector 1..4
  235.        ;LD H,tctg/256 ;-pi/4..+pi/4
  236.        INC H
  237.         LD C,(HL) ;ystep or xstep
  238.         LD HX,-1 ;IX=dist*cos
  239.         RRA
  240.         jr NC,ray13
  241.         RRA
  242.         JP NC,ray2
  243.         JP ray4
  244. ray13   RRA
  245.         JP NC,ray1
  246.         JP ray3
  247.  
  248.         macro INCR num ;0..5 = bcdehl
  249.         db 0x04+(8*(num))
  250.         endm
  251.  
  252.         macro DECR num ;0..5 = bcdehl
  253.         db 0x05+(8*(num))
  254.         endm
  255.  
  256. ;RAY 1,1,H,D,y,x
  257.        MACRO RAY mainplus,secplus,maindirhlreg,maindirdereg,maindir,secdir
  258. ;mainplus=\0 ;основное направление положительно
  259. ;secplus=\1 ;побочное направление положительно
  260. ;\2=основное направление для hl (YX)
  261. ;\4=основное направление для de (yx)
  262. ;\6=основное направление (0=x, 1=y)
  263. ;\7=побочное направление (0=x, 1=y)
  264. ;c=побочный шаг
  265.         LD A,E ;основное направление
  266.         LD LX,A ;IX=dist*cos
  267.         MULPOS ;a = a*c
  268.       IF secplus ;побочное направление положительно
  269.         ADD A,D ;побочное направление
  270.         LD B,A ;texx
  271. ray0176_YX=$+1
  272.         LD HL,0 ;hl = основная стенка
  273.        IF maindir != 0 ;"\6\6"-"xx"
  274. ray0176_YX2=$+1
  275.         LD DE,0 ;set mapdifbit ;осн.напр. y, побочное x
  276.        ELSE
  277.         LD D,H ;осн.напр. x, побочное y
  278.         ld E,L
  279.        ENDIF ;de = побочная стенка
  280.         jr NC,2f;raynshort\0\1\7\6 ;точно не пересечение по побоч.напр.
  281.         INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
  282.         LD A,(DE)
  283.          add a,a
  284.          cp ID_DOOR*2;128+(22*2)
  285.          jr z,9f
  286.          ld a,(de)
  287.         RLA
  288.         jp C,1f;raysec\0\1\7\6 ;выход по побочной стене
  289. 9
  290.         INCR maindirhlreg^1 ;secdirhlreg;INC \3 ;l/h
  291. 2;raynshort\0\1\7\6
  292.        IF maindir != 1 ;"\6\6"-"yy"
  293.         SET mapdifbit,L
  294.        ENDIF
  295.       ELSE ;побочное направление отрицательно
  296.         LD L,A
  297.         LD A,D ;побочное направление
  298.         SUB L
  299.         LD B,A ;texx
  300. ray0176_YX=$+1
  301.         LD HL,0 ;hl = основная стенка
  302.        IF maindir != 0 ;"\6\6"-"xx"
  303. ray0176_YX2=$+1
  304.         LD DE,0 ;set mapdifbit ;осн.напр. y, побочное x
  305.        ELSE
  306.         LD D,H ;осн.напр. x, побочное y
  307.         ld E,L
  308.        ENDIF ;de = побочная стенка
  309.         jr NC,2f;raynshort\0\1\7\6 ;точно не пересечение по побоч.напр.
  310.         LD A,(DE)
  311.          add a,a
  312.          cp ID_DOOR*2;128+(22*2)
  313.          jr z,9f
  314.          ld a,(de)
  315.         RLA
  316.         jp C,1f;raysec\0\1\7\6 ;выход по побочной стене
  317. 9
  318. ;продолжение по основному направлению
  319.         DECR maindirhlreg^1 ;secdirhlreg
  320.         DECR maindirdereg^1 ;secdirdereg
  321. 2;raynshort\0\1\7\6
  322.        IF maindir != 1 ;"\6\6"-"yy"
  323.         SET mapdifbit,L
  324.        ENDIF
  325.       ENDIF
  326. ;первый (короткий) шаг закончен, теперь идём полными шагами в цикле
  327. 3;raynsec=$;\0\1\7\6
  328.         INC HX
  329.        IF mainplus ;основное направление положительно
  330.         INCR maindirhlreg;INC \2 ;h/l
  331.        ENDIF
  332.         LD A,(HL)
  333.          add a,a
  334.          cp ID_DOOR*2;128+(22*2)
  335.          jp z,4f;doorhlq ;куб двери
  336.          ld a,(hl)
  337.         RLA
  338.         JP C,rayhlq ;b=texx ;выход по основной стене
  339. 13
  340.        IF mainplus ;основное направление положительно
  341.         INCR maindirdereg;INC \4 ;d/e
  342.        ELSE
  343.         DECR maindirhlreg
  344.         DECR maindirdereg
  345.        ENDIF
  346.         LD A,B ;texx
  347.        IF secplus ;побочное направление положительно
  348.         ADD A,C ;побочный шаг
  349.        ELSE
  350.         SUB C ;побочный шаг
  351.        ENDIF
  352.         LD B,A ;texx
  353.         jr NC,3b;raynsec;\0\1\7\6 ;точно не пересечение по побоч.напр.
  354. 12
  355.        IF secplus ;побочное направление положительно
  356.         INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
  357.        ENDIF
  358.         LD A,(DE)
  359.          add a,a
  360.          cp ID_DOOR*2;128+(22*2)
  361.          jr z,5f
  362.          ld a,(de)
  363.         RLA
  364.         jp C,1f;raysec\0\1\7\6 ;выход по побочной стене
  365. 9
  366.        IF secplus ;побочное направление положительно
  367.         INCR maindirhlreg^1 ;secdirhlreg;INC \3 ;l/h
  368.        ELSE        ;побочное направление отрицательно
  369.         DECR maindirhlreg^1 ;secdirhlreg
  370.         DECR maindirdereg^1 ;secdirdereg
  371.        ENDIF
  372.         JP 3b;raynsec;\0\1\7\6
  373.  
  374. 7 ;возврат из куба двери, если дверь открыта (в следующей стене игнорить дверь!!!)
  375.         LD A,B ;texx
  376.        IF secplus ;побочное направление положительно
  377.         ADD A,C ;побочный шаг
  378.        ELSE
  379.         SUB C ;побочный шаг
  380.        ENDIF
  381.         LD B,A ;texx
  382.         jr C,12b;raynsec;\0\1\7\6 ;точно не пересечение по побоч.напр.
  383. ;3;raynsec=$;\0\1\7\6
  384.         INC HX
  385.        IF mainplus ;основное направление положительно
  386.         INCR maindirhlreg;INC \2 ;h/l
  387.        ENDIF
  388.         jr 13b ;считаем, что стены впереди нет, продолжаем как обычно
  389.  
  390. ;куб двери по побочному шагу
  391. 5
  392.         ld a,(de)
  393.         rla
  394.         jr nc,$+5 ;закрытая дверь
  395.         ld ly,0
  396.        IF secplus ;побочное направление положительно
  397.         INCR maindirhlreg^1 ;secdirhlreg;INC \3 ;l/h
  398.        ELSE        ;побочное направление отрицательно
  399.         DECR maindirhlreg^1 ;secdirhlreg
  400.         DECR maindirdereg^1 ;secdirdereg
  401.        ENDIF
  402.         INC HX
  403.         bit 7,B ;texx
  404.        IF secplus ;побочное направление положительно
  405.         jp z,rayhlq ;видим основную стену до двери
  406.        ELSE
  407.         jp nz,rayhlq ;видим основную стену до двери
  408.        ENDIF
  409.         ;ld b,10 ;сплошной голубой (0=сплошной серый)
  410.         ;jp z,rayhlq
  411.  
  412.        IF secplus ;побочное направление положительно
  413.         INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
  414.        ENDIF
  415.         ;jp rayhlq ;дверь открыта, выход по основной стене
  416.          ;dec hx
  417.          ld a,b ;texx
  418.          add a,128
  419.          ;ld b,a
  420.         ;jr 1f ;jr C,8f;raysec\0\1\7\6 ;выход по побочной стене
  421.         ;LD A,B
  422.        IF secplus ;побочное направление положительно
  423.         SUB C
  424.        else
  425.         ADD A,C
  426.        endif
  427. ;a=texx как был
  428.         ex de,hl;EXD
  429.         ;ex de,hl
  430.         ;jp rayhlq ;дверь открыта, выход по основной стене
  431.         push bc
  432.        IF secplus ;побочное направление положительно
  433.         DIVPOS ;texx(a)/step(c), портит b,c
  434.        ELSE
  435.         DIVNEG ;texx(a)/step(c), портит b,c
  436.        ENDIF
  437.         pop bc
  438.        IF mainplus ;основное направление положительно
  439.         CPL
  440.          ;push hl
  441.          ;ld hl,timer
  442.          add a,ly;(hl)
  443.          jr c,6f ;b=texx, выход по осн. стене (полуоткрытая дверь)
  444.         LD B,A ;b=texx
  445.         sub ly;(hl)
  446.          ;pop hl
  447.        ELSE
  448.          ;push hl
  449.          ;ld hl,timer
  450.          add a,ly;(hl)
  451.          jr c,6f ;выход по осн. стене (полуоткрытая дверь)
  452.         LD B,A ;b=texx
  453.         sub ly;(hl)
  454.         CPL
  455.          ;pop hl
  456.        ENDIF
  457.          dec hx
  458.         JP raydeq ;c,de не важны
  459. 6 ;выход по осн. стене (полуоткрытая дверь)
  460.         ;pop hl
  461.         ex de,hl
  462.         jp rayhlq ;b=texx
  463.  
  464. ;куб двери по основному шагу
  465. 4
  466.         bit 7,(HL)
  467.         jr z,$+5 ;закрытая дверь
  468.         ld ly,0
  469. ;проверить, что позади дверь, тогда выход в 13b (т.е. впереди пусто)
  470.        IF mainplus ;основное направление положительно
  471.         DECR maindirhlreg;INC \4 ;d/e
  472.        ELSE
  473.         INCR maindirhlreg
  474.        ENDIF
  475.         ld a,(hl)
  476.        IF mainplus ;основное направление положительно
  477.         INCR maindirhlreg;INC \4 ;d/e
  478.        ELSE
  479.         DECR maindirhlreg
  480.        ENDIF
  481.          add a,a
  482.          cp ID_DOOR*2;128+(22*2)
  483.         jp z,13b ;позади дверь, значит, впереди пусто
  484. ;
  485.         srl c ;побочный шаг
  486.        IF mainplus ;основное направление положительно
  487.         INCR maindirdereg;INC \4 ;d/e
  488.        ELSE
  489.         DECR maindirhlreg
  490.         DECR maindirdereg
  491.        ENDIF
  492.         LD A,B ;texx
  493.        IF secplus ;побочное направление положительно
  494.         ADD A,C ;побочный шаг
  495.         LD B,A ;texx
  496.         SUB C ;побочный шаг
  497.        ELSE
  498.         SUB C ;побочный шаг
  499.         LD B,A ;texx
  500.         ADD A,C ;побочный шаг
  501.        ENDIF
  502.         jr c,2f
  503.         ex af,af' ;'
  504.         ld a,ly;(timer)
  505.         add a,b
  506.         ld b,a
  507.         jr nc,11f ;дверь по основному направлению
  508.         ex af,af' ;'
  509.         ld b,a ;texx как был
  510.         sla c ;побочный шаг как был
  511.         jp 7b ;нет двери
  512. 11      
  513.         jp doorhlq;3b;raynsec;\0\1\7\6 ;точно не пересечение по побоч.напр.
  514. 2;куб двери по основному шагу - выход по побочной стене
  515.        IF secplus ;побочное направление положительно
  516.         INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
  517.        ENDIF
  518.  
  519. ;побочная стена при шаге половинками
  520.         sla c ;побочный шаг как был
  521.         jr 8f
  522.        
  523. ;побочная стена
  524. 1;raysec\0\1\7\6
  525.         LD A,B
  526.        IF secplus ;побочное направление положительно
  527.         SUB C
  528.        else
  529.         ADD A,C
  530.        endif
  531. 8
  532. ;a=texx как был
  533.         ex de,hl;EXD
  534.        IF secplus ;побочное направление положительно
  535.         DIVPOS ;texx(a)/step(c)
  536.        ELSE
  537.         DIVNEG ;texx(a)/step(c)
  538.        ENDIF
  539.        IF mainplus ;основное направление положительно
  540.         CPL
  541.         LD B,A ;b=texx
  542.        ELSE
  543.         LD B,A ;b=texx
  544.         CPL
  545.        ENDIF
  546.         JP raydeq
  547.        ENDM
  548.  
  549. ;mainplus=\0 ;основное направление положительно
  550. ;secplus=\1 ;побочное направление положительно
  551. ;\2=основное направление для hl = 4..5
  552. ;\4=основное направление для de = 2..3
  553. ;\6=основное направление
  554. ;\7=побочное направление
  555. ;c = ystep or xstep (шаг по побочному направлению) всегда положительный
  556. ;HX=-1 ;IX=dist*cos
  557. ;сейчас l=angle
  558. ray1
  559.         BIT 7,L
  560.         JP NZ,ray1b
  561.         ;RAY 1,1,L,E,x,y ;1a
  562. cur11yx=$+1
  563.         LD DE,0
  564.         RAY 1,1,5,3,0,1;x,y ;1a
  565. ;cur11yx=cur0176
  566. ray11yx_YX=ray0176_YX
  567. ;ray11yx_YX2=ray0176_YX2
  568. ray1b
  569.         ;RAY 1,1,H,D,y,x ;1b
  570. cur11xy=$+1
  571.         LD DE,0
  572.         RAY 1,1,4,2,1,0;y,x ;1b
  573. ;cur11xy=cur0176
  574. ray11xy_YX=ray0176_YX
  575. ray11xy_YX2=ray0176_YX2
  576. ray2
  577.         BIT 7,L
  578.         JP NZ,ray2b
  579.         ;RAY 1,0,H,D,y,x ;2a
  580. cur10xy=$+1
  581.         LD DE,0
  582.         RAY 1,0,4,2,1,0;y,x ;2a
  583. ;cur10xy=cur0176
  584. ray10xy_YX=ray0176_YX
  585. ray10xy_YX2=ray0176_YX2
  586. ray2b
  587.         ;RAY 0,1,L,E,x,y ;2b
  588. cur01yx=$+1
  589.         LD DE,0
  590.         RAY 0,1,5,3,0,1;x,y ;2b
  591. ;cur01yx=cur0176
  592. ray01yx_YX=ray0176_YX
  593. ;ray01yx_YX2=ray0176_YX2
  594. ray3
  595.         BIT 7,L
  596.         JP NZ,ray3b
  597.         ;RAY 0,0,L,E,x,y ;3a
  598. cur00yx=$+1
  599.         LD DE,0
  600.         RAY 0,0,5,3,0,1;x,y ;3a
  601. ;cur00yx=cur0176
  602. ray00yx_YX=ray0176_YX
  603. ;ray00yx_YX2=ray0176_YX2
  604. ray3b
  605.         ;RAY 0,0,H,D,y,x ;3b
  606. cur00xy=$+1
  607.         LD DE,0
  608.         RAY 0,0,4,2,1,0;y,x ;3b
  609. ;cur00xy=cur0176
  610. ray00xy_YX=ray0176_YX
  611. ray00xy_YX2=ray0176_YX2
  612. ray4
  613.         BIT 7,L
  614.         JP NZ,ray4b
  615.         ;RAY 0,1,H,D,y,x ;4a
  616. cur01xy=$+1
  617.         LD DE,0
  618.         RAY 0,1,4,2,1,0;y,x ;4a
  619. ;cur01xy=cur0176
  620. ray01xy_YX=ray0176_YX
  621. ray01xy_YX2=ray0176_YX2
  622. ray4b
  623.         ;RAY 1,0,L,E,x,y ;4b
  624. cur10yx=$+1
  625.         LD DE,0
  626.         RAY 1,0,5,3,0,1;x,y ;4b
  627. ;cur10yx=cur0176
  628. ray10yx_YX=ray0176_YX
  629. ;ray10yx_YX2=ray0176_YX2
  630.  
  631. doorhlq
  632.         ld a,128
  633.         jr raydeq
  634. rayhlq_texxaxorb
  635.         xor b
  636.         ld b,a
  637. rayhlq
  638.         XOR A
  639. raydeq
  640. ;b=texx
  641. ;hl=YX
  642. ;dist*cos=ix+a
  643.  
  644.        PUSH HL
  645.         ADD A,LX
  646.         LD L,A
  647.         ADC A,HX
  648.         SUB L
  649.         LD H,A
  650. ;HL=dist*cos=128..#3fff
  651. ;приводим к 128..255
  652.         LD DE,#000
  653.         LD A,L
  654.         jr Z,TOLOGRLQ
  655.        DUP 5;6
  656.         INC D
  657.         SRL H
  658.         RRA
  659.         jr Z,TOLOGRLE
  660.        EDUP
  661. TOLOGRLQ ;
  662.        if antizalom;debug
  663.        cp 64
  664.        jr nc,$+4
  665.        ld a,64
  666.        else
  667.         OR A
  668.         JP M,$+5 ;>=128
  669.         LD A,128 ;<128
  670.        endif
  671. TOLOGRLE ;
  672.         LD L,A ;128..255
  673.        ;D=0..5
  674.         LD H,tlogd/256
  675. ;2.делим на cos
  676. rayrealangle=$+1
  677.         LD A,(tlogcos) ;0..63
  678.         ADD A,(HL) ;log(dist/2^N) = 128..255 for arg>=128
  679.        IF antizalom;debug
  680.        jr NC,$+3
  681.        INC D
  682.        ENDIF
  683.  
  684. ;3.умножение на corrdist(scrX) - получаем k/масштаб
  685. ;(сокращаем расстояние по краям в sqrt(2) раз)
  686. ;corrdist(scrX)=1/sqrt(1+scrX^2), где scrX=-1..+1
  687. ;из него номер таблицы масштабирования
  688. cura=$+1
  689.         LD HL,tcorrlogd ;L=scrX=0..255="-127.5..127.5"
  690.         SUB (HL) ;64..128
  691.        IF antizalom;debug
  692.        jr NC,DEBBP
  693.        DEC D
  694.        JP P,DEBBP
  695.        INC D
  696.        XOR A
  697. DEBBP ;
  698.        ENDIF
  699.         LD L,A
  700.         LD H,tlogd2sca/256
  701.          SRA D
  702.          RR E ;DE=+0,+#80,..+#300
  703.         ADD HL,DE
  704.        IF 0;debug
  705.         BIT 7,(HL)
  706.         jr NZ,$
  707.        ENDIF
  708.         LD C,(HL) ;dist(scale#)=63..1;127..1
  709.                   ;todo linear scale, recalc in DRAWWALLS
  710.          SCF
  711.          RR B ;texx=0x80..0xFF
  712.        IF scale64
  713.         SRL B ;texx=0x40..0x7F
  714.        ENDIF
  715.        POP DE
  716.         RET
  717.  
  718.        IF interpolate
  719.        IF 0
  720. I_SUB_INTERt ;
  721.         POP HL  ;
  722.         PUSH HL ;de
  723.         LD A,D
  724.         SUB H
  725.         jr NZ,holeny
  726.         LD A,E
  727.         SUB L
  728.         JP Z,I_SUB_INTER ;продолжение стены
  729.         DEC A
  730.         CP 3
  731.         jr C,nhole
  732.         JP isubneq
  733. holeny ;
  734.         DEC A
  735.         CP 3
  736.         jr NC,isubneq
  737.         LD A,E
  738.         CP L
  739.         jr NZ,isubneq
  740. nhole ;
  741.        ENDIF
  742. I_SUB_INTER
  743.          ; rightscan=Middlescan
  744.         LD A,C
  745.         EXX
  746.         ADD A,C
  747.         RRA
  748.         LD C,A ;dist
  749.         EXX
  750.         LD A,B
  751.         EXX
  752.         ADD A,B
  753.         RRA
  754.         LD B,A ;texx
  755. I_SUB_SCANQ ;
  756.          ;INTERPOLATE_SUB(a-step, step, leftscan, rightscan);r=M
  757.        PUSH HL ;step,a
  758.         LD A,L
  759.         SUB H
  760.         LD L,A ;a-step
  761.         LD A,H
  762.         LD H,distbuf/256+2
  763.         LD (HL),C ;dist
  764.         DEC H
  765.         LD (HL),B ;texx
  766.         DEC H
  767.         RRCA
  768.         CALL NC,INTERPOLATE_SUB
  769.         LD A,(DE) ;ID
  770.          ;ld a,0xc0
  771.         LD (HL),A ;ID
  772.          ;leftscan=rightscan ;=Middlescan
  773.         EXX
  774.        POP HL ;step,a
  775.          ;pop(rightscan)
  776.         POP DE
  777.         pop BC
  778.          ;INTERPOLATE_SUB(a, step, leftscan, rightscan) ;l=M,r=R
  779.          ;scan[a]=rightscan
  780.          ;if (step==1) exit
  781.         LD A,H
  782.         LD H,distbuf/256+2
  783.         LD (HL),C ;dist
  784.         DEC H
  785.         LD (HL),B ;texx
  786.         DEC H
  787.         RRCA
  788.         RET C
  789. INTERPOLATE_SUB
  790. ;L=a
  791. ;A=step/2                 ;not preserved
  792. ;BCDE'=leftscan ;(a-step) ;not preserved
  793. ;BCDE=rightscan ;(a)
  794. ;CY=0
  795.        EXA
  796.         LD A,(DE) ;ID
  797.         LD (HL),A ;ID ;texx,dist are written already
  798.        EXA
  799.          ;step=step/2
  800.         LD H,A
  801.          ;push(rightscan)
  802.         PUSH BC
  803.         push DE
  804.          ;if(rightscan.yx==leftscan.yx)
  805.      ;LD A,(DE)
  806.         EXX
  807.      ;EXD
  808.      ;XOR (HL)
  809.      ;EXD
  810.      ;JP Z,I_SUB_INTERt
  811.         POP HL  ;
  812.         PUSH HL ;de
  813.         ;OR A
  814.         SBC HL,DE ;CY=0
  815.         JP Z,I_SUB_INTER
  816. isubneq
  817.          ; rightscan=RAYCAST(a-step)
  818.         EXX
  819.         PUSH HL
  820.         LD A,L
  821.         SUB H
  822.         LD L,A ;a-step
  823.         LD (cura),A
  824.         CALL RAYCAST
  825.         POP HL
  826.         JP I_SUB_SCANQ
  827.          ;else - see above
  828.        ENDIF ;interpolate
  829.  
  830.  
  831. ;============================
  832.        IF sprites
  833. DOSORTSPRITES=1
  834. ;CURSPRITES_RECSZ=5;4
  835.  
  836. SCANMONS
  837.         LD A,(curX)
  838.         SUB viewrange
  839.         LD (scmonX),A
  840.         LD A,(curY)
  841.         SUB viewrange
  842.         LD (scmonY),A
  843.        LD HL,cursprites
  844.       if DOSORTSPRITES
  845.        LD (HL),0 ;end of sprites
  846.       endif
  847.        LD (scaneof),HL
  848.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  849.         ld hx,-1 ;monster index
  850.        jp SCMONS0 ;цикл скан-я видимых монстров/предметов
  851. SCMONNx
  852.         LD A,L
  853.         ADD A,8
  854.         LD L,A
  855.         JR C,SCMxIH
  856. SCMONS0
  857.        inc hx ;monster index
  858.         LD A,(HL) ;X
  859.         INC A
  860.        RET Z
  861. scmonX=$+1
  862.         SUB 0
  863.         CP viewrange*2+1
  864.         JP NC,SCMONNx
  865.         INC L
  866.         inc L
  867.         LD A,(HL)
  868. scmonY=$+1
  869.         SUB 0
  870.         CP viewrange*2+1
  871.         JR C,SCMONY
  872.         LD A,L
  873.         ADD A,6
  874.         LD L,A
  875.         JP NC,SCMONS0
  876. SCMxIH  INC H
  877.         JP SCMONS0
  878. SCMONY  DEC L
  879.         dec L
  880.         dec L
  881.         LD C,(HL)
  882.         INC L
  883.         LD B,(HL) ;Xx
  884.         INC L
  885.         LD E,(HL)
  886.         INC L
  887.         LD D,(HL) ;Yy
  888.         INC L
  889.    PUSH HL
  890.         PUSH BC
  891.        ld a,(IMavision+1)
  892.        sub (hl) ;DIR
  893.        inc l ;skip DIR (TODO use)
  894.        LD L,(HL) ;TYPE*8+phase
  895.        ld H,0
  896.         LD BC,MONSTAB-8
  897.         ADD HL,BC
  898.       if doublescr
  899.        ;a=mydir-objdir. если около 128, смотрит на нас. около 0 - от нас. около 64 - влево?
  900.         sub 32
  901.         rlca
  902.         rlca
  903.         rlca
  904.         and 6
  905.         add a,ZOMBIEMANrotate-ZOMBIEMANgo
  906.        ld c,a ;mydir-objdir
  907.       endif
  908.        LD A,(HL) ;ID текстуры (в зависимости от фазы)
  909.        ld lx,a ;!=0
  910.       if doublescr
  911.        ld a,l
  912.        cp 0xff&(3*8+0 + (MONSTAB-8))
  913.        jr z,goside_phase1
  914.        cp 0xff&(3*8+1 + (MONSTAB-8))
  915.        ;jr z,goside_phase2
  916.        jr nz,nogoside
  917. goside_phase2
  918. goside_phase1
  919.         ld b,0
  920.         add hl,bc
  921.         ld a,(hl)
  922.         ld lx,a
  923. nogoside
  924.       endif
  925.         POP BC
  926. ;calculate sprite position
  927.         LD HL,(curYy)
  928.         SBC HL,DE ;Yy
  929.         ex de,hl;EXD
  930.         LD HL,(curXx)
  931.         SBC HL,BC ;Xx
  932.         CALL OBJMUL
  933.        ;BC=dist
  934.        ;DE=xscr
  935.        IF lores
  936.         SRA D
  937.         RR E
  938.        ENDIF
  939.         LD HL,pixperchr*scrwid/2-256
  940.         SBC HL,DE
  941.         INC H
  942.        jr NZ,SCANnSPR ;X out of screen
  943.        IF lores
  944.         BIT 7,L
  945.        jr NZ,SCANnSPR ;X out of screen
  946.        ENDIF
  947. ;write data to cursprites
  948. ;ID 8 (0=end)
  949. ;dist 16
  950. ;xscr 8
  951. ;monster index
  952.        if DOSORTSPRITES == 0
  953.         LD A,L ;xscr
  954. scaneof=$+1
  955.         ld hl,0
  956.         ld e,lx
  957.         ld (hl),e ;id
  958.         inc l
  959.         ld (hl),c
  960.         inc l
  961.         ld (hl),b ;bc=dist
  962.         inc l
  963.         ld (hl),a ;xscr
  964.         inc l
  965.        if CURSPRITES_RECSZ == 5
  966.        ld a,hx
  967.        ld (hl),a ;monster index
  968.        inc l
  969.        endif
  970.         ld (hl),0
  971.         ld (scaneof),hl
  972.        else
  973.  
  974.        PUSH BC
  975.         EXX
  976.        POP BC
  977.         LD HL,cursprites+((-(CURSPRITES_RECSZ-2))&0xff)
  978. SCANsort0
  979.        if CURSPRITES_RECSZ == 5
  980.         INC L
  981.        endif
  982.         INC L
  983.         inc L
  984.         LD A,(HL)
  985.         OR A
  986.         jr Z,SCANins
  987.         INC L
  988.         LD E,(HL)
  989.         INC L
  990.         LD D,(HL) ;de=dist
  991.         ex de,hl;EXD
  992.         SBC HL,BC
  993.         ex de,hl;EXD
  994.         jr NC,SCANsort0
  995.         DEC L
  996.         dec L
  997. SCANins
  998.        PUSH BC
  999. scaneof=$+1
  1000.         LD DE,0
  1001.         LD A,E
  1002.         SUB L
  1003.         INC A ;bytes to move
  1004.         LD C,A
  1005.         LD B,0
  1006.         LD H,D
  1007.         ld L,E
  1008.         LD A,E
  1009.         ADD A,CURSPRITES_RECSZ;4
  1010.         LD E,A
  1011.         LD (scaneof),A
  1012.         LDDR
  1013.         INC HL
  1014.        POP BC
  1015.        LD A,lx;1
  1016. ;A=ID текстуры
  1017. ;BC'=dist
  1018. ;L'=xscr
  1019.         LD (HL),A
  1020.         INC L
  1021.         LD (HL),C
  1022.         INC L
  1023.         LD (HL),B
  1024.         INC L
  1025.         EXX
  1026.         LD A,L
  1027.         EXX
  1028.         LD (HL),A ;xscr
  1029.         INC L
  1030.        if CURSPRITES_RECSZ == 5
  1031.        ld a,hx
  1032.        ld (hl),a ;monster index
  1033.        inc l
  1034.        endif
  1035.         EXX
  1036.        endif
  1037. SCANnSPR ;
  1038.  
  1039.    POP HL
  1040.         INC L
  1041.         inc L
  1042.         inc L
  1043.         inc HL
  1044.        INC L
  1045.         JP SCMONS0
  1046.  
  1047. DRAWSPRITES
  1048. ;ID 8 (0=end)
  1049. ;dist 16
  1050. ;xscr 8
  1051. ;monster index
  1052.         LD IY,cursprites
  1053. DRAWSPRITES0 ;
  1054.         LD A,(IY) ;id
  1055.         OR A
  1056.         RET Z
  1057.         INC IY
  1058.         LD C,(IY)
  1059.         INC IY
  1060.         LD B,(IY) ;bc=dist
  1061.         INC IY
  1062. ;A=ID
  1063.         EXX
  1064.          LD D,a ;ID (не адрес)
  1065.         EXX
  1066.  
  1067.         LD L,(IY) ;xscr
  1068.         INC IY
  1069.        if CURSPRITES_RECSZ == 5
  1070.         INC IY
  1071.        endif
  1072. ;L=xscr
  1073. ;BC=dist
  1074.         INC B
  1075.         DJNZ gFILLNCLOSE
  1076.         LD A,108;64 ;от этого числа зависит только ширина спрайта при максимальном приближении, но не максимальная высота (она ограничена этим числом и сравнением дальше, закомментированным) ;108 чуть ниже ATM экрана, 128 запас около 8 пикс снизу
  1077.         CP C
  1078.          ;jr nc,DRAWSPRITES0 ;лампы не уменьшаем ;TODO уметь отличать врагов от ламп
  1079.         jr C,$+3
  1080.         LD C,A ;спрайт слишком близко!!! уменьшим
  1081. gFILLNCLOSE
  1082.        PUSH BC ;dist
  1083. ;приводим к 128..255
  1084.         LD DE,#000
  1085.         INC B
  1086.         DEC B
  1087.         LD A,C
  1088.         jr Z,MOTOLOGRLQ
  1089.        DUP 5;6
  1090.         INC D
  1091.         SRL B
  1092.         RRA
  1093.         jr Z,MOTOLOGRLE
  1094.        EDUP
  1095. MOTOLOGRLQ ;
  1096.         ;OR A
  1097.         ;JP M,$+5 ;>=128
  1098.         ;LD A,128 ;<128
  1099.         ;;cp 96
  1100.         ;;jr nc,$+4
  1101.         ;;ld a,96 ;спрайт слишком близко!!! увеличим dist для уменьшения высоты
  1102. MOTOLOGRLE ;
  1103.         LD C,A ;128..255 ;D=0..5
  1104.         LD B,tlogd/256
  1105.         LD A,(BC) ;log(dist) = 128..255 for arg>=128
  1106.        if atm==0
  1107.        SUB 16;64                 ;0..127 for arg=64..127 ;???
  1108.        endif
  1109.         LD C,A                ;0 for arg<64
  1110.         LD B,tlogd2sca/256
  1111.          SRA D
  1112.          RR E ;DE=+0,+#80,..+#300
  1113.         ex de,hl;EXD
  1114.         ADD HL,BC
  1115.         LD C,(HL) ;scale#
  1116.         ex de,hl;EXD
  1117.       ;
  1118.        POP DE ;dist
  1119.        if atm
  1120.         ld a,l
  1121.         ld h,d
  1122.         ld l,e
  1123.         srl h
  1124.         rr l
  1125.         add hl,de
  1126.         ex de,hl ;de = de * 1.5
  1127.         ld l,a
  1128.        else
  1129.        IF loresspr
  1130.         SLA E
  1131.         RL D
  1132.        ENDIF
  1133.         SLA E
  1134.         RL D ;DE=texx step = de * 4
  1135.        endif
  1136.  
  1137.        IF loresspr_hires|optresspr
  1138.        RES 0,L
  1139.        ENDIF
  1140.         LD H,distbuf/256+2 ;ID,texx,dist
  1141.         LD A,C ;scale#
  1142.         CP (HL)
  1143.          if !atm
  1144.          ld hx,0xc0 ;TODO
  1145.          endif
  1146.         CALL NC,DRAWSPRITE ;object center is visible ;TODO независимо от видимости центра
  1147.         JP DRAWSPRITES0
  1148.  
  1149. ;умножение
  1150. ;A=+-0.7
  1151. ;HL=A*DE
  1152.     ;A сохраняется!!!
  1153. MULT
  1154.         LD HL,0
  1155. MULTADD
  1156.         RLCA
  1157.         JR NC,MULTPLU
  1158.         DUP 6
  1159.         SRA D
  1160.         RR E
  1161.         RLCA
  1162.         JR C,$+4
  1163.         SBC HL,DE
  1164.         EDUP
  1165.         RLCA
  1166.         RET C
  1167.         SRA D
  1168.         RR E
  1169.          OR A
  1170.         SBC HL,DE
  1171.         RET
  1172. MULTPLU DUP 6
  1173.         SRA D
  1174.         RR E
  1175.         RLCA
  1176.         JR NC,$+3
  1177.         ADD HL,DE
  1178.         EDUP
  1179.         RLCA
  1180.         RET NC
  1181.         SRA D
  1182.         RR E
  1183.         ADD HL,DE
  1184.         RET
  1185.  
  1186. OBJMULQ
  1187.         POP AF ;X
  1188.        LD D,#40 ;X out of screen
  1189.         RET
  1190. ;пересчет координат объекта (Xx=HL, Yy=DE)
  1191. ;в координаты на экране (DE=xscr, BC=расстояние)
  1192. OBJMUL
  1193.         PUSH HL ;X
  1194.        PUSH DE ;Y
  1195.        PUSH HL ;X
  1196.         LD HL,(curangle) ;L=центр взгляда
  1197.         LD C,(HL) ;sin=шаг по Y
  1198.         LD A,-64
  1199.         SUB L
  1200.         LD L,A
  1201.         LD B,(HL) ;-COS=шаг по X
  1202.    ;Bc=DXdy=COSsin
  1203.         LD A,C
  1204.         CPL
  1205.         CALL MULT ;HL=A*DE=-sin*Y
  1206.        POP DE ;X
  1207.         LD A,B
  1208.         CALL MULTADD ;HL=-COS*X-sin*Y=d(расстояние по объекта)
  1209.        POP DE ;Y
  1210.         BIT 7,H
  1211.         jr NZ,OBJMULQ ;если расстояние<0,то объект за спиной=>exit
  1212.         LD (_OBJd1),HL
  1213.         CALL MULT;A=B=-COS, HL=-COS*Y
  1214.        POP DE ;X
  1215.         LD A,C
  1216.         CALL MULTADD ;HL=-COS*Y+sin*X=xscr*d
  1217.         ex de,hl;EXD
  1218. _OBJd1=$+1
  1219.         LD BC,0 ;BC=d ;после MONDIV получим DE=xscr
  1220.         ;jp MONDIV
  1221.        ENDIF ;sprites
  1222. ;деление
  1223. ;DE=+-7.8;BC=+7.8
  1224. ;DE=DE/BC=+-8.7/2
  1225.     ;BC сохраняется!!!
  1226. MONDIV
  1227.         LD H,0
  1228.         LD A,D
  1229.         SLA E
  1230.         RLA
  1231.         JP C,MONDIVNEG ;если делимое<0
  1232.         LD L,A
  1233.         INC E
  1234.         LD A,E
  1235.        DUP 7
  1236.         SBC HL,BC
  1237.         JR NC,$+3
  1238.         ADD HL,BC
  1239.         RLA
  1240.         ADC HL,HL
  1241.        EDUP
  1242.         CPL
  1243.         LD D,A
  1244.        DUP 7
  1245.         SBC HL,BC
  1246.         JR NC,$+3
  1247.         ADD HL,BC
  1248.         RLA
  1249.         ADD HL,HL
  1250.        EDUP
  1251.         SBC HL,BC
  1252.         JR NC,$+3
  1253.         ADD HL,BC
  1254.         RLA
  1255.         CPL
  1256.         LD E,A
  1257.         RET
  1258. ;если делимое<0
  1259. MONDIVNEG
  1260.         CPL
  1261.         LD L,A
  1262.         SBC A,A
  1263.         XOR E
  1264.        DUP 7
  1265.         SBC HL,BC
  1266.         JR NC,$+3
  1267.         ADD HL,BC
  1268.         RLA
  1269.         ADC HL,HL
  1270.        EDUP
  1271.         LD D,A
  1272.        DUP 7
  1273.         SBC HL,BC
  1274.         JR NC,$+3
  1275.         ADD HL,BC
  1276.         RLA
  1277.         ADD HL,HL
  1278.        EDUP
  1279.         SBC HL,BC
  1280.         JR NC,$+3
  1281.         ADD HL,BC
  1282.         RLA
  1283.         LD E,A
  1284.         RET
  1285.