?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;процедуры для рисования в карту, верхнего уровня (не зависят от типа экрана)
  2.  
  3. AnimMines
  4.         ld hl,drawminesphase
  5.         ld a,(hl)
  6.         xor drawminesphase_xor
  7.         ld (hl),a
  8.         ret
  9.  
  10. UnDrawCrossInMap
  11. DrawCrossInMap
  12. curwormxy=$+1
  13.         ld hl,WORMXY
  14.         ld c,(hl) ;xlow, sprlow (bit3=right)
  15.        ld b,c
  16.         inc l
  17.         inc l
  18.         ld e,(hl) ;xhigh
  19.         inc l
  20.        ;ld a,e
  21.        ;cp XWID
  22.        ;jr nc,DrawWormsInMap_skip
  23.         ld d,0
  24.        dup 2
  25.         sla c
  26.         rl e
  27.         rl d
  28.        edup
  29.         sla c ;bc=gfx
  30.         ld c,(hl) ;y        
  31. crossalpha=$+1 ;-64..+64 вправо (-64 самый нижний)
  32.         ld hl,tsin
  33.        
  34.         ld a,(hl)
  35.         sra a
  36.         sra a
  37.         neg ;y считается сверху вниз
  38.         add a,c
  39.         ld c,a ;y
  40.         ld a,64
  41.         sub l
  42.         ld l,a ;cos table
  43.         ld a,(hl)
  44.        bit 3,b
  45.        jr nz,$+4
  46.        neg
  47.         sra a
  48.         sra a
  49.         ld l,a
  50.         rla
  51.         sbc a,a
  52.         ld h,a
  53.         add hl,de
  54.         ex de,hl ;x
  55.        
  56.         ld l,c ;y
  57.         ld bc,sprcross
  58. ;de=x in pixels
  59. ;l=y
  60. ;bc=gfx
  61.         bit 7,d
  62.         ret nz
  63. _max=MAPWID*8-4
  64.         ld a,e
  65.         sub _max&0xff
  66.         ld a,d
  67.         sbc a,_max/256
  68.         ret nc
  69.        if !ATM
  70.         LD A,PGMAP;16
  71.         CALL OUTME
  72.        endif
  73.         jp DrawWormInMap
  74.  
  75. UnDrawCurWorm_ifprinted
  76. ;hl=curwormxy
  77. ;out: nz=not printed, keep hl
  78.         ex de,hl
  79.         ld hl,5
  80.         add hl,de
  81.         ex de,hl
  82.         ld a,(de) ;dy
  83.        cp SPRLIST_PRINTED
  84.        ;jr z,UnDrawCurWorm_ifprintedok ;стоячий червь (уже напечатанный) или пустышка
  85.        ;cp SPRLIST_END
  86.        ;jp z,WRMOVEQ ;конец списка
  87.        ;cp SPRLIST_STAYING
  88.        ret nz
  89.        ;jr z,UnDrawCurWorm_ifprintedok ;стоячий червь или пустышка
  90.        ;ret
  91. UnDrawCurWorm_ifprintedok
  92.         ld a,SPRLIST_STAYING;PRINTED
  93.         ld (de),a
  94.        if !ATM
  95.         LD A,PGMAP;16
  96.         CALL OUTME
  97.        endif
  98.        push hl
  99.         GETCOORDS
  100.         push de
  101.         ld e,l ;xhigh
  102.         ld d,0
  103.        dup 2
  104.         sla c
  105.         rl e
  106.         rl d
  107.        edup
  108.         sla c ;bc=gfx
  109.         push hl ;h=y, l=xhigh
  110.         ld l,h ;y        
  111. ;de=x in pixels
  112. ;l=y
  113. ;bc=gfx
  114.         call DrawWormInMap
  115.         pop bc ;b=y, c=xhigh
  116.         pop de ;x
  117.        pop hl ;curwormxy+2
  118.        pop hl
  119.         xor a ;printed
  120.         ret
  121.  
  122. DrawCurWormData
  123.        if !ATM
  124.         LD A,PGMAP;16
  125.         CALL OUTME
  126.        endif
  127.         ld hl,(curwormxy)
  128.         GETCOORDS
  129.         ld b,h
  130.         ld c,l ;b=y, c=xhigh
  131.        pop hl ;curwormxy+2
  132.        inc hl
  133.        inc hl
  134.        inc hl
  135. ;hl=wormxy+5
  136. ;c=xhigh
  137. ;b=y
  138.         ld a,c
  139.         cp INVISIBLEX
  140.         jp nz,DrawWormDataInMap
  141.         ret
  142.  
  143. ForcedUnDrawWormsInMap
  144. ForcedDrawWormsInMap
  145.         ld a,SPRLIST_IMPOSSIBLE;xor a ;"nop" - print all
  146.         ld (DrawWormsInMap_staypatch),a
  147.         ld a,DrawWormsInMap_drawminepatch_never
  148.         ld (DrawWormsInMap_drawminepatch),a ;never print mines
  149.         call DrawWormsInMap
  150.         ld a,SPRLIST_PRINTED;0x7e ;"ld a,(hl)" - print only non-staying
  151.         ld (DrawWormsInMap_staypatch),a
  152.         ld a,DrawWormsInMap_drawminepatch_always
  153.         ld (DrawWormsInMap_drawminepatch),a ;always print mines
  154.         ret
  155.  
  156. UnDrawWormsInMap ;FIXME
  157. DrawWormsInMap
  158.        if !ATM
  159.         LD A,PGMAP;16
  160.         CALL OUTME
  161.        endif
  162.         ld hl,WORMXY
  163. DrawWormsInMap0
  164.         ;POP BC ;SPRITE (lsb=xlow*64;32)
  165.         ;POP HL ;COORDS
  166.         ;POP DE ;SPEED
  167.         ld c,(hl)
  168.         inc l
  169.         ld a,(hl) ;spritehsb
  170.         inc l
  171.         cp 1
  172.         ret z ;jr z,DrawWormsInMap0q
  173.        ld b,a
  174.        cp sprmine_0/256
  175. drawminesphase=$
  176. drawminesphase0=24 ;jr
  177. drawminesphase1=32 ;jr nz
  178. drawminesphase_xor=drawminesphase0^drawminesphase1
  179.        jr nz,DrawWormsInMap_nomine
  180.        ld a,c
  181.        xor 8;1
  182.        ld c,a
  183. DrawWormsInMap_nomine
  184.         ld e,(hl) ;xhigh
  185.         inc l
  186.        ld a,e
  187.        cp XWID
  188.        jr nc,DrawWormsInMap_skip
  189.         ld d,0
  190.        dup 2
  191.         sla c
  192.         rl e
  193.         rl d
  194.        edup
  195.         sla c ;bc=gfx
  196.        ld a,b
  197.        cp sprmine_0/256
  198. DrawWormsInMap_drawminepatch=$+1
  199.        jr z,DrawWormsInMap_drawalways
  200.         inc l
  201.         inc l
  202.         ld a,(hl) ;dy ;/nop
  203. DrawWormsInMap_staypatch=$+1
  204.        cp SPRLIST_PRINTED
  205.        jr z,DrawWormsInMap_skipdy ;staying printed
  206.         cp SPRLIST_STAYING
  207.        jr nz,$+4
  208.        ld (hl),SPRLIST_PRINTED
  209.         dec l
  210.         dec l
  211. DrawWormsInMap_drawalways
  212. DrawWormsInMap_drawminepatch_always=DrawWormsInMap_drawalways-(DrawWormsInMap_drawminepatch+1)
  213.        push hl
  214.         ld l,(hl) ;y
  215. ;de=x in pixels
  216. ;l=y
  217. ;bc=gfx
  218.         call DrawWormInMap
  219.        pop hl
  220. DrawWormsInMap_skip
  221. DrawWormsInMap_drawminepatch_never=DrawWormsInMap_skip-(DrawWormsInMap_drawminepatch+1)
  222.         inc l
  223.         inc l
  224. DrawWormsInMap_skipdy
  225.         inc l
  226.         jr DrawWormsInMap0
  227.  
  228. UnDrawWormsDataInMap ;FIXME
  229. DrawWormsDataInMap
  230.        if !ATM
  231.         LD A,PGMAP;16
  232.         CALL OUTME
  233.        endif
  234.         ld hl,WORMXY
  235. DrawWormsDataInMap0
  236.         ;POP BC ;SPRITE (lsb=xlow*32)
  237.         ;POP HL ;COORDS
  238.         ;POP DE ;SPEED
  239.         ;ld e,(hl)
  240.         inc l
  241.         ld a,(hl) ;spritehsb
  242.         inc l
  243.         cp 1
  244.         ret z ;jr z,DrawWormsInMap0q
  245.         ld c,(hl) ;xhigh
  246.         inc l
  247.         ld b,(hl) ;y
  248.         inc l
  249.         inc l
  250.        cp sprmine_0/256
  251.        jr z,DrawWormsDataInMap_skip
  252.        ld a,c ;xhigh
  253.        cp XWID
  254.        jr nc,DrawWormsDataInMap_skip ;dead
  255.        ;ld a,(hl) ;dy
  256.        ;cp SPRLIST_STAYING
  257.        ;jr nz,DrawWormsDataInMap_skip ;not staying
  258.        push hl
  259.         call DrawWormDataInMap
  260.        pop hl
  261. DrawWormsDataInMap_skip
  262.         inc l
  263.         jr DrawWormsDataInMap0
  264.  
  265. DrawWormDataInMap
  266. ;hl=wormxy+5
  267. ;c=xhigh
  268. ;b=y
  269.         ld a,b ;y
  270.         SUB 13
  271.         LD B,A ;y
  272.        ld de,+(CUWORMS+2)-(WORMXY+5)
  273.        add hl,de
  274.        ld a,(hl) ;health
  275.         add hl,hl
  276.         LD de,NAMES-(2*(CUWORMS+2))
  277.         ADD HL,de ;name+12
  278. ;a=health
  279. ;b=y
  280. ;c=xhigh (XXXXXXXX XXx?????)
  281. ;hl=name
  282.        PUSH af ;health
  283.        push bc ;yx
  284.         if 0
  285.         push hl
  286.         ld b,12
  287. DrawWormDataInMap_namewid0
  288.         ld a,(hl)
  289.         cp ' '
  290.         jr z,$+3
  291.         ld c,b
  292.         inc hl
  293.         djnz DrawWormDataInMap_namewid0
  294. ;c=last nonempty chr shift=12..1
  295.         pop hl
  296.         endif
  297.        
  298.        ;ld a,XWID-(6*XWIDCHR) ;TODO по ширине имени
  299.        ;cp c ;x
  300.        ;jr nc,$+3
  301.        ;ld c,a ;чтобы не заезжало за правый край карты
  302.         call SetXYInMap ;keeps bc ;c=x/4
  303.         ld b,6 ;12 letters
  304.        srl c ;x (now in chrs)
  305.         ld a,MAPWID
  306.         sub c ;visiblewid = MAPWID-c = 0..MAPWID
  307.         cp b
  308.         jr nc,$+3
  309.         ld b,a ;min(6, visiblewid)
  310. SPRINTnam
  311.         LD a,(HL)
  312.         ex af,af' ;'
  313.         INC HL
  314.         LD A,(HL)
  315.         CALL Pr2CharsInMap
  316.         INC HL
  317.         DJNZ SPRINTnam
  318.         dec hl ;чтобы можно было использовать hl для указания на команду (т.е. на цвет)
  319.        pop bc ;yx
  320.        ld a,b
  321.        add a,6
  322.        ld b,a ;y
  323.        ld a,XWID-(2*XWIDCHR)
  324.        cp c ;x
  325.        jr nc,$+3
  326.        ld c,a ;чтобы не заезжало за правый край карты
  327.         call SetXYInMap
  328.        POP AF ;health
  329.         LD BC,+('0'-1)*256+100
  330.         INC B
  331.         SUB C
  332.         JR NC,$-2
  333.         ADD A,C
  334.        ld c,a;PUSH AF ;health mod 100
  335.         LD a,' '
  336.         ex af,af' ;'
  337.         LD A,B
  338.         CALL Pr2CharsInMap
  339.        ld a,c;POP AF ;health mod 100
  340.         LD BC,+('0'-1)*256+10
  341.         INC B
  342.         SUB C
  343.         JR NC,$-2
  344.         ex af,af' ;'
  345.         LD A,B
  346.         ex af,af' ;'
  347.         add a,'0'+10
  348.         jp Pr2CharsInMap
  349.  
  350. UnDrawCircleInMap
  351. ;e,bc=y0,x0
  352. ;d=R
  353.        push bc
  354.        push de
  355.         call PrepareUnSetPixInMap
  356.         ld hl,UnSetPixInMap
  357.         xor a
  358.         call UnDrawCircle
  359.         call SetPgMask
  360.        pop de
  361.        pop bc
  362.        
  363.         ld a,e
  364.         sub 8 ;таблица строк маски использует координату "y" для ног, т.е. на 8 пикс ниже
  365.         srl a
  366.         ld e,a ;y0
  367.         srl b
  368.         rr c ;x0
  369.         dec bc
  370.         dec bc
  371.         srl d ;R
  372.        
  373.         ld hl,UnSetPixInMask
  374.         ld a,0x87 ;"add a,a"
  375. UnDrawCircle
  376. ;e,bc=y0,x0
  377. ;d=R
  378. ;hl=pixproc
  379. ;a="add a,a"/"nop"
  380.         ld (hline_unsetpixpatch),hl
  381.         ld (hline_y2patch),a
  382.         ld hx,e ;y0
  383.         LD L,d ;R
  384.         ld H,#00 ;hl=R
  385.         ADD HL,HL ;hl=curwidth=R*2
  386.         ld a,3 ;???
  387.         sub l
  388.         ld l,a
  389.         sbc a,h
  390.         sub l
  391.         ld h,a ;hl=3-(R*2)
  392.         LD e,d ;R
  393.         ld d,#00 ;e=curx=R, d=cury=0
  394.  
  395. fCIR0    PUSH bc ;x0
  396.        push hl
  397.        push de
  398.        push bc
  399. ;e=curx
  400. ;d=cury
  401. ;hx,bc=y0,x0
  402.         ld a,c
  403.         sub e
  404.         ld c,a ;x=x0-curx
  405.         jr nc,$+3
  406.          dec b
  407.         ld a,e ;len=curx
  408.         add a,a ;len=2*len
  409.         ld lx,a ;len
  410.        push bc
  411.        push de
  412.         ld a,hx ;y0
  413.         add a,d ;cury
  414.         ld e,a ;y=y0+cury
  415.         push ix
  416.         call hline_lx ;e,bc=y,x ;lx=len=2*curx
  417.         pop ix
  418.        pop de
  419.        pop bc
  420.         ld a,hx ;y0
  421.         sub d ;cury
  422.         ld e,a ;y=y0-cury
  423.         call hline_lx ;e,bc=y,x ;lx=len=2*curx
  424.        pop bc
  425.        pop de
  426.        pop HL
  427.       PUSH HL ;curwidth
  428.         BIT 7,H:JR Z,fCIR2
  429. ;curwidth<0
  430.         INC d ;cury
  431.         LD L,d
  432.         ld H,#00
  433.         LD bc,#0006 ;???
  434.         JR fCIR3 ;hl=cury
  435. fCIR2
  436. ;конец ступеньки
  437.        push bc
  438.        push de
  439.         ld a,c
  440.         sub d
  441.         ld c,a ;x=x0-cury
  442.         jr nc,$+3
  443.          dec b
  444.         ld a,d ;len=cury
  445.         add a,a ;len=2*len
  446.         ld lx,a ;len
  447.        push bc
  448.        push de
  449.         ld a,hx ;y0
  450.         add a,e ;curx
  451.         ld e,a ;y
  452.         push ix
  453.         call hline_lx ;b,ec=y,x ;lx=len=2*cury
  454.         pop ix
  455.        pop de
  456.        pop bc
  457.         ld a,hx ;y0
  458.         sub e ;curx
  459.         ld e,a ;y
  460.         call hline_lx ;b,ec=y,x ;lx=len=2*cury
  461.        pop de
  462.        pop bc
  463.         INC d ;cury
  464.         DEC e ;curx
  465.         LD L,d
  466.         ld H,#00
  467.         LD c,e
  468.         ld b,#00
  469.         OR A
  470.         SBC HL,bc ;hl=cury-curx
  471.         LD bc,#000A ;???
  472. fCIR3    ADD HL,HL
  473.         add HL,HL ;hl=(cury-curx)*4
  474.         add HL,bc ;hl=(cury-curx)*4 + const
  475.       POP bc
  476.       ADD HL,bc ;hl=(cury-curx)*4 + const + curwidth
  477.  
  478.         POP bc ;x0
  479.         LD A,e
  480.         cp d
  481.         JP NC,fCIR0
  482.         ret
  483.        
  484. hline_lx
  485. ;e=y (TODO check here)
  486. ;bc=x
  487. ;lx=len
  488.         LD A,e
  489. hline_y2patch=$
  490.         add a,a ;/nop
  491.        add a,MAPHGT-TERRAINHGT
  492.         SUB TERRAINHGT;MAPHGT
  493.         RET NC
  494.         ld e,a
  495.         ld d,lx
  496. hline0
  497.        push bc
  498. hline_unsetpixpatch=$+1
  499.         call UnSetPixInMap ;/UnSetPixInMask
  500.        pop bc
  501.         inc bc
  502.         dec d ;--
  503.         jr nz,hline0
  504.         ret
  505.  
  506. UnSetPixInMask
  507. ;e=truey ;e=y (/2) (от верхнего края TERRAIN)
  508. ;bc=x (/2)
  509.        ; LD A,e
  510.        ; add a,a
  511.        ;add a,MAPHGT-TERRAINHGT
  512.        ; SUB TERRAINHGT;MAPHGT
  513.        ; RET NC
  514.       ;PUSH HL
  515.       ;push bc
  516.          ;sub 8 ;таблица строк маски использует координату "y" для ног, т.е. на 8 пикс ниже
  517.         ld l,e;a
  518.          ;srl b ;xhigh
  519.          ;rr c ;xlow
  520.          ;dec bc
  521.          ;dec bc ;маска рассчитана под "x" центра червя, т.е. сдвинута на 4 больших (2 масочных) пикс
  522.         LD H,TMASKLN/256
  523.         LD A,C
  524.         AND 0xf8
  525.         ADD A,b ;0/1 = xhigh/2
  526.         RRCA
  527.         RRCA
  528.         RRCA
  529.         CP MASKWID
  530.        ret nc;JR NC,UnSetPixInMaskq
  531.         ADD A,(HL)
  532.         INC H
  533.         LD H,(HL)
  534.         LD L,A
  535.         JR NC,$+3
  536.         INC H
  537.         LD A,C
  538.         AND 7
  539.         INC A
  540.         LD B,A
  541.         LD A,0xfe
  542.         RRCA
  543.         DJNZ $-1
  544.          ;ld b,TABROLL07/256
  545.          ;ld a,(bc) ;bit
  546.          ;cpl
  547.         and (HL)
  548.         LD (HL),A
  549. ;UnSetPixInMaskq
  550.       ;POP BC
  551.       ;POP HL
  552.         RET
  553.