?login_element?

Subversion Repositories NedoOS

Rev

Rev 1542 | Go to most recent revision | 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.         jp DrawWormDataInMap
  139.  
  140. ForcedUnDrawWormsInMap
  141. ForcedDrawWormsInMap
  142.         ld a,SPRLIST_IMPOSSIBLE;xor a ;"nop" - print all
  143.         ld (DrawWormsInMap_staypatch),a
  144.         ld a,DrawWormsInMap_drawminepatch_never
  145.         ld (DrawWormsInMap_drawminepatch),a ;never print mines
  146.         call DrawWormsInMap
  147.         ld a,SPRLIST_PRINTED;0x7e ;"ld a,(hl)" - print only non-staying
  148.         ld (DrawWormsInMap_staypatch),a
  149.         ld a,DrawWormsInMap_drawminepatch_always
  150.         ld (DrawWormsInMap_drawminepatch),a ;always print mines
  151.         ret
  152.  
  153. UnDrawWormsInMap ;FIXME
  154. DrawWormsInMap
  155.        if !ATM
  156.         LD A,PGMAP;16
  157.         CALL OUTME
  158.        endif
  159.         ld hl,WORMXY
  160. DrawWormsInMap0
  161.         ;POP BC ;SPRITE (lsb=xlow*64;32)
  162.         ;POP HL ;COORDS
  163.         ;POP DE ;SPEED
  164.         ld c,(hl)
  165.         inc l
  166.         ld a,(hl) ;spritehsb
  167.         inc l
  168.         cp 1
  169.         ret z ;jr z,DrawWormsInMap0q
  170.        ld b,a
  171.        cp sprmine_0/256
  172. drawminesphase=$
  173. drawminesphase0=24 ;jr
  174. drawminesphase1=32 ;jr nz
  175. drawminesphase_xor=drawminesphase0^drawminesphase1
  176.        jr nz,DrawWormsInMap_nomine
  177.        ld a,c
  178.        xor 8;1
  179.        ld c,a
  180. DrawWormsInMap_nomine
  181.         ld e,(hl) ;xhigh
  182.         inc l
  183.        ld a,e
  184.        cp XWID
  185.        jr nc,DrawWormsInMap_skip
  186.         ld d,0
  187.        dup 2
  188.         sla c
  189.         rl e
  190.         rl d
  191.        edup
  192.         sla c ;bc=gfx
  193.        ld a,b
  194.        cp sprmine_0/256
  195. DrawWormsInMap_drawminepatch=$+1
  196.        jr z,DrawWormsInMap_drawalways
  197.         inc l
  198.         inc l
  199.         ld a,(hl) ;dy ;/nop
  200. DrawWormsInMap_staypatch=$+1
  201.        cp SPRLIST_PRINTED
  202.        jr z,DrawWormsInMap_skipdy ;staying printed
  203.         cp SPRLIST_STAYING
  204.        jr nz,$+4
  205.        ld (hl),SPRLIST_PRINTED
  206.         dec l
  207.         dec l
  208. DrawWormsInMap_drawalways
  209. DrawWormsInMap_drawminepatch_always=DrawWormsInMap_drawalways-(DrawWormsInMap_drawminepatch+1)
  210.        push hl
  211.         ld l,(hl) ;y
  212. ;de=x in pixels
  213. ;l=y
  214. ;bc=gfx
  215.         call DrawWormInMap
  216.        pop hl
  217. DrawWormsInMap_skip
  218. DrawWormsInMap_drawminepatch_never=DrawWormsInMap_skip-(DrawWormsInMap_drawminepatch+1)
  219.         inc l
  220.         inc l
  221. DrawWormsInMap_skipdy
  222.         inc l
  223.         jr DrawWormsInMap0
  224.  
  225. UnDrawWormsDataInMap ;FIXME
  226. DrawWormsDataInMap
  227.        if !ATM
  228.         LD A,PGMAP;16
  229.         CALL OUTME
  230.        endif
  231.         ld hl,WORMXY
  232. DrawWormsDataInMap0
  233.         ;POP BC ;SPRITE (lsb=xlow*32)
  234.         ;POP HL ;COORDS
  235.         ;POP DE ;SPEED
  236.         ;ld e,(hl)
  237.         inc l
  238.         ld a,(hl) ;spritehsb
  239.         inc l
  240.         cp 1
  241.         ret z ;jr z,DrawWormsInMap0q
  242.         ld c,(hl) ;xhigh
  243.         inc l
  244.         ld b,(hl) ;y
  245.         inc l
  246.         inc l
  247.        cp sprmine_0/256
  248.        jr z,DrawWormsDataInMap_skip
  249.        ld a,c ;xhigh
  250.        cp XWID
  251.        jr nc,DrawWormsDataInMap_skip ;dead
  252.        ;ld a,(hl) ;dy
  253.        ;cp SPRLIST_STAYING
  254.        ;jr nz,DrawWormsDataInMap_skip ;not staying
  255.        push hl
  256.         call DrawWormDataInMap
  257.        pop hl
  258. DrawWormsDataInMap_skip
  259.         inc l
  260.         jr DrawWormsDataInMap0
  261.  
  262. DrawWormDataInMap
  263. ;hl=wormxy+5
  264. ;c=xhigh
  265. ;b=y
  266.         ld a,b ;y
  267.         SUB 13
  268.         LD B,A ;y
  269.        ld de,+(CUWORMS+2)-(WORMXY+5)
  270.        add hl,de
  271.        ld a,(hl) ;health
  272.         add hl,hl
  273.         LD de,NAMES-(2*(CUWORMS+2))
  274.         ADD HL,de ;name+12
  275. ;a=health
  276. ;b=y
  277. ;c=xhigh (XXXXXXXX XXx?????)
  278. ;hl=name
  279.        PUSH af ;health
  280.        push bc ;yx
  281.        ld a,XWID-(6*XWIDCHR) ;TODO по ширине имени
  282.        cp c ;x
  283.        jr nc,$+3
  284.        ld c,a ;чтобы не заезжало за правый край карты
  285.         call SetXYInMap
  286.         LD B,6
  287. SPRINTnam
  288.         LD a,(HL)
  289.         ex af,af' ;'
  290.         INC HL
  291.         LD A,(HL)
  292.         CALL Pr2CharsInMap
  293.         INC HL
  294.         DJNZ SPRINTnam
  295.         dec hl ;чтобы можно было использовать hl для указания на команду (т.е. на цвет)
  296.        pop bc ;yx
  297.        ld a,b
  298.        add a,6
  299.        ld b,a ;y
  300.        ld a,XWID-(2*XWIDCHR)
  301.        cp c ;x
  302.        jr nc,$+3
  303.        ld c,a ;чтобы не заезжало за правый край карты
  304.         call SetXYInMap
  305.        POP AF ;health
  306.         LD BC,+('0'-1)*256+100
  307.         INC B
  308.         SUB C
  309.         JR NC,$-2
  310.         ADD A,C
  311.        ld c,a;PUSH AF ;health mod 100
  312.         LD a,' '
  313.         ex af,af' ;'
  314.         LD A,B
  315.         CALL Pr2CharsInMap
  316.        ld a,c;POP AF ;health mod 100
  317.         LD BC,+('0'-1)*256+10
  318.         INC B
  319.         SUB C
  320.         JR NC,$-2
  321.         ex af,af' ;'
  322.         LD A,B
  323.         ex af,af' ;'
  324.         add a,'0'+10
  325.         jp Pr2CharsInMap
  326.  
  327. UnDrawCircleInMap
  328. ;e,bc=y0,x0
  329. ;d=R
  330.        push bc
  331.        push de
  332.         call PrepareUnSetPixInMap
  333.         ld hl,UnSetPixInMap
  334.         xor a
  335.         call UnDrawCircle
  336.         call SetPgMask
  337.        pop de
  338.        pop bc
  339.        
  340.         ld a,e
  341.         sub 8 ;таблица строк маски использует координату "y" для ног, т.е. на 8 пикс ниже
  342.         srl a
  343.         ld e,a ;y0
  344.         srl b
  345.         rr c ;x0
  346.         dec bc
  347.         dec bc
  348.         srl d ;R
  349.        
  350.         ld hl,UnSetPixInMask
  351.         ld a,0x87 ;"add a,a"
  352. UnDrawCircle
  353. ;e,bc=y0,x0
  354. ;d=R
  355. ;hl=pixproc
  356. ;a="add a,a"/"nop"
  357.         ld (hline_unsetpixpatch),hl
  358.         ld (hline_y2patch),a
  359.         ld hx,e ;y0
  360.         LD L,d ;R
  361.         ld H,#00 ;hl=R
  362.         ADD HL,HL ;hl=curwidth=R*2
  363.         ld a,3 ;???
  364.         sub l
  365.         ld l,a
  366.         sbc a,h
  367.         sub l
  368.         ld h,a ;hl=3-(R*2)
  369.         LD e,d ;R
  370.         ld d,#00 ;e=curx=R, d=cury=0
  371.  
  372. fCIR0    PUSH bc ;x0
  373.        push hl
  374.        push de
  375.        push bc
  376. ;e=curx
  377. ;d=cury
  378. ;hx,bc=y0,x0
  379.         ld a,c
  380.         sub e
  381.         ld c,a ;x=x0-curx
  382.         jr nc,$+3
  383.          dec b
  384.         ld a,e ;len=curx
  385.         add a,a ;len=2*len
  386.         ld lx,a ;len
  387.        push bc
  388.        push de
  389.         ld a,hx ;y0
  390.         add a,d ;cury
  391.         ld e,a ;y=y0+cury
  392.         push ix
  393.         call hline_lx ;e,bc=y,x ;lx=len=2*curx
  394.         pop ix
  395.        pop de
  396.        pop bc
  397.         ld a,hx ;y0
  398.         sub d ;cury
  399.         ld e,a ;y=y0-cury
  400.         call hline_lx ;e,bc=y,x ;lx=len=2*curx
  401.        pop bc
  402.        pop de
  403.        pop HL
  404.       PUSH HL ;curwidth
  405.         BIT 7,H:JR Z,fCIR2
  406. ;curwidth<0
  407.         INC d ;cury
  408.         LD L,d
  409.         ld H,#00
  410.         LD bc,#0006 ;???
  411.         JR fCIR3 ;hl=cury
  412. fCIR2
  413. ;конец ступеньки
  414.        push bc
  415.        push de
  416.         ld a,c
  417.         sub d
  418.         ld c,a ;x=x0-cury
  419.         jr nc,$+3
  420.          dec b
  421.         ld a,d ;len=cury
  422.         add a,a ;len=2*len
  423.         ld lx,a ;len
  424.        push bc
  425.        push de
  426.         ld a,hx ;y0
  427.         add a,e ;curx
  428.         ld e,a ;y
  429.         push ix
  430.         call hline_lx ;b,ec=y,x ;lx=len=2*cury
  431.         pop ix
  432.        pop de
  433.        pop bc
  434.         ld a,hx ;y0
  435.         sub e ;curx
  436.         ld e,a ;y
  437.         call hline_lx ;b,ec=y,x ;lx=len=2*cury
  438.        pop de
  439.        pop bc
  440.         INC d ;cury
  441.         DEC e ;curx
  442.         LD L,d
  443.         ld H,#00
  444.         LD c,e
  445.         ld b,#00
  446.         OR A
  447.         SBC HL,bc ;hl=cury-curx
  448.         LD bc,#000A ;???
  449. fCIR3    ADD HL,HL
  450.         add HL,HL ;hl=(cury-curx)*4
  451.         add HL,bc ;hl=(cury-curx)*4 + const
  452.       POP bc
  453.       ADD HL,bc ;hl=(cury-curx)*4 + const + curwidth
  454.  
  455.         POP bc ;x0
  456.         LD A,e
  457.         cp d
  458.         JP NC,fCIR0
  459.         ret
  460.        
  461. hline_lx
  462. ;e=y (TODO check here)
  463. ;bc=x
  464. ;lx=len
  465.         LD A,e
  466. hline_y2patch=$
  467.         add a,a ;/nop
  468.        add a,MAPHGT-TERRAINHGT
  469.         SUB TERRAINHGT;MAPHGT
  470.         RET NC
  471.         ld e,a
  472.         ld d,lx
  473. hline0
  474.        push bc
  475. hline_unsetpixpatch=$+1
  476.         call UnSetPixInMap ;/UnSetPixInMask
  477.        pop bc
  478.         inc bc
  479.         dec d ;--
  480.         jr nz,hline0
  481.         ret
  482.  
  483. UnSetPixInMask
  484. ;e=truey ;e=y (/2) (от верхнего края TERRAIN)
  485. ;bc=x (/2)
  486.        ; LD A,e
  487.        ; add a,a
  488.        ;add a,MAPHGT-TERRAINHGT
  489.        ; SUB TERRAINHGT;MAPHGT
  490.        ; RET NC
  491.       ;PUSH HL
  492.       ;push bc
  493.          ;sub 8 ;таблица строк маски использует координату "y" для ног, т.е. на 8 пикс ниже
  494.         ld l,e;a
  495.          ;srl b ;xhigh
  496.          ;rr c ;xlow
  497.          ;dec bc
  498.          ;dec bc ;маска рассчитана под "x" центра червя, т.е. сдвинута на 4 больших (2 масочных) пикс
  499.         LD H,TMASKLN/256
  500.         LD A,C
  501.         AND 0xf8
  502.         ADD A,b ;0/1 = xhigh/2
  503.         RRCA
  504.         RRCA
  505.         RRCA
  506.         CP MASKWID
  507.        ret nc;JR NC,UnSetPixInMaskq
  508.         ADD A,(HL)
  509.         INC H
  510.         LD H,(HL)
  511.         LD L,A
  512.         JR NC,$+3
  513.         INC H
  514.         LD A,C
  515.         AND 7
  516.         INC A
  517.         LD B,A
  518.         LD A,0xfe
  519.         RRCA
  520.         DJNZ $-1
  521.          ;ld b,TABROLL07/256
  522.          ;ld a,(bc) ;bit
  523.          ;cpl
  524.         and (HL)
  525.         LD (HL),A
  526. ;UnSetPixInMaskq
  527.       ;POP BC
  528.       ;POP HL
  529.         RET
  530.