?login_element?

Subversion Repositories NedoOS

Rev

Rev 1504 | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;процедуры для генерации карты, нижнего уровня (зависят от типа экрана)
  2.  
  3. ClearMap
  4.         ld hl,tpushpgs +SKIPPGS ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  5.         ld b,16
  6. ClearMap0
  7.         push bc
  8.         push hl
  9.         ld a,(hl)
  10.         SETPGC000
  11.         ld hl,0xc000
  12.         xor a
  13. ClearMap1
  14.         inc l
  15.         ld (hl),a
  16.         inc l
  17.         ld (hl),a
  18.         inc l
  19.         inc l ;skip push
  20.         jr nz,ClearMap1
  21.         inc h
  22.         jr nz,ClearMap1
  23.         pop hl
  24.         pop bc
  25.         inc hl
  26.         djnz ClearMap0
  27.         ret
  28.  
  29. MapNextPg
  30.        push af
  31.        push bc
  32.         ld a,ly
  33.         sub 4
  34.         ld ly,a
  35.         ld a,(iy)
  36.         SETPGC000
  37.        pop bc
  38.        pop af
  39.         ld h,0xff
  40.         ret
  41.  
  42. MapNextPg_de
  43.        push af
  44.        push bc
  45.         ld a,ly
  46.         sub 4
  47.         ld ly,a
  48.         ld a,(iy)
  49.         SETPGC000
  50.        pop bc
  51.        pop af
  52.         ld d,0xff
  53.         ret
  54.  
  55. FindPlacesForGrass ;записывает в grassbuf
  56. ;по чётным столбцам сверху вниз ищем переходы 0->1
  57.         ld de,grassbuf
  58.         ld c,0xfd
  59.         ld b,+(MAPWID+1)/2
  60.         xor a ;RLE counter
  61.         ex af,af' ;'
  62. findgrass_columns0
  63.         call findgrass_column4
  64.         inc c
  65.         call findgrass_column4
  66.         ld a,c
  67.         sub 5
  68.         ld c,a
  69.         djnz findgrass_columns0
  70.         xor a
  71.         ld (de),a;0 ;иначе в последнем столбце может появиться лажа
  72.         ret
  73.  
  74. findgrass_column4
  75.         ld iy,tpushpgs +SKIPPGS+12 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  76.         call findgrass_column2
  77. findgrass_column2
  78.         call findgrass_column
  79. findgrass_column
  80. ;iy=tpushpgs+
  81. ;c=LSB of addr
  82. ;de=gfx
  83.        push bc
  84.        push iy
  85.         ld a,(iy)
  86.         ld h,0xff
  87.         ld l,c
  88.         SETPGC000        
  89.         ld b,BIGMAPHGT-1;MAPHGT-1
  90. findgrass1
  91.         ld a,(hl)
  92.         cpl
  93.         and 0x47;c
  94.         dec h ;dec h - это сверху вниз!
  95.         bit 6,h
  96.        ;jr z,$
  97.         call z,MapNextPg
  98.         and (hl)
  99.         ex af,af' ;'
  100.         inc a
  101.          jr nz,findgrass_nooverflow
  102.          ld (de),a;0 ;0=просто пропуск 255 пикс
  103.          inc de
  104.         ld a,d
  105.         cp (grassbuf+grassbufsz)/256
  106.         jp z,nowhere ;buffer overflow
  107.          ld a,1
  108. findgrass_nooverflow
  109.         ex af,af' ;'
  110.         jr z,findgrass_empty
  111.        ;ld a,(hl)
  112.        ;xor 0x80
  113.        ;ld (hl),a
  114.         ex af,af' ;'
  115.         ld (de),a
  116.         inc de
  117.         ld a,d
  118.         cp (grassbuf+grassbufsz)/256
  119.         jp z,nowhere ;buffer overflow
  120.         xor a
  121.         ex af,af' ;'
  122. findgrass_empty
  123.         djnz findgrass1
  124.        pop iy
  125.        pop bc
  126.         inc ly
  127.         ret
  128.  
  129. MakeMaskFromMap
  130. ;FIXME в случае неполной маски (нужна защита от влетания в стену на краю карты - надо полную маску или при любой порче ландшафта крайний левый пикс маски формировать из 5 левых пикс, справа аналогично?)
  131. ;TODO x в маске считается для центра червя, x=0 соответствует x=4 в карте
  132. ;то есть берём байт маски из карты так: ----M-M- M-M-m-m- m-m-----
  133.  
  134.        call SetPgMask8000
  135.        if 0;1
  136.         ld hl,MASK -0x4000
  137.         ld de,MASK+1 -0x4000
  138.         ld bc,MASKSZ-1
  139.         ld (hl),0
  140.         ldir
  141.        endif
  142.  
  143.         ld hl,MASKDO -0x4000
  144.         ld e,0xfd
  145.         ld b,MASKWID
  146. MakeMaskFromMap0
  147.         call MakeMaskFromMap_column4
  148.         inc e
  149.         call MakeMaskFromMap_column4 ;hl is same
  150.         inc hl
  151.         ld a,e
  152.         sub 5
  153.         ld e,a
  154.         djnz MakeMaskFromMap0
  155.  
  156.        call setpgsmain40008000
  157.        call SetPgMask
  158.  
  159.        if 0;1
  160.         LD HL,MASKSZ+MASK-(MASKWID*2) ;fill last lines (костыль, пока карты нет)
  161.         LD BC,+(MASKWID*2)*256+255
  162.         LD (HL),C
  163.         INC HL
  164.         DJNZ $-2
  165.        endif
  166.        
  167. ;extra bottom line of mask is always filled (for element placement)
  168.         LD HL,MASKSZ+MASK
  169.         LD BC,MASKWID*256+255
  170.         LD (HL),C
  171.         INC HL
  172.         DJNZ $-2
  173.         ret
  174.  
  175. MakeMaskFromMap_column4
  176.         ld iy,tpushpgs+SKIPPGS +12 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  177.         call MakeMaskFromMap_column2
  178. MakeMaskFromMap_column2
  179.         call MakeMaskFromMap_column
  180. MakeMaskFromMap_column
  181. ;e=LSB of addr
  182. ;iy=tpushpgs+
  183. ;hl=mask
  184.         push bc
  185.         push de
  186.         push hl
  187.         push iy
  188.         ld a,(iy)
  189.         SETPGC000
  190.         ld d,0xff-8 ;сверху вниз ;-8, потому что маска для ног червя
  191.         ld bc,MASKWID
  192.         ld hx,+((BIGMAPHGT-8)/2)&0xff
  193. MakeMaskFromMap_column0
  194.         ld a,(de)
  195.         rla
  196.         rl (hl)
  197.         add hl,bc
  198.         dec d
  199.         dec d
  200.         bit 6,d
  201.         call z,MapNextPg_de
  202.         dec hx
  203.         jr nz,MakeMaskFromMap_column0
  204.         ;jr $
  205.         pop iy
  206.         pop hl
  207.         pop de
  208.         pop bc
  209.         inc ly
  210.         ret
  211.  
  212. TexturizeGroundInMap
  213.         call SetPgTexture8000
  214.         ld de,0x8000
  215.         ld c,0xfd ;c=LSB of addr
  216. TexturizeGroundInMap0
  217.         call TexturizeGroundInMappp4
  218.         inc c
  219.         call TexturizeGroundInMappp4
  220.         ld a,c
  221.         sub 5
  222.         ld c,a
  223.         jr nc,TexturizeGroundInMap0
  224.         jp setpgsmain40008000
  225.  
  226. TexturizeGroundInMappp4
  227. ;c=LSB of addr
  228.         ld hl,tpushpgs +SKIPPGS+12 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  229.         call TexturizeGroundInMappp2
  230. TexturizeGroundInMappp2
  231.         call TexturizeGroundInMappp
  232. TexturizeGroundInMappp
  233. ;hl=tpushpgs+
  234. ;c=LSB of addr
  235. ;de=gfx
  236.         push hl
  237.         ld b,4
  238. TexturizeGround0
  239.         push bc
  240.         push hl
  241.         ld a,(hl)
  242.         ld h,0xff
  243.         ld l,c
  244.         SETPGC000
  245.        push de
  246.         ld b,64
  247. TexturizeGround1
  248.         ld a,(de)
  249.         inc e
  250.         and (hl)
  251.         ld (hl),a
  252.         dec h
  253.         djnz TexturizeGround1
  254.         ld a,e
  255.        pop de
  256.         xor e
  257.         and 0x7f
  258.         xor e
  259.         ld e,a
  260.         pop hl
  261.         pop bc
  262.         dec l
  263.         dec l
  264.         dec l
  265.         dec l
  266.         djnz TexturizeGround0
  267.         ld hl,128
  268.         add hl,de
  269.         ex de,hl
  270.         pop hl
  271.         res 5,d
  272.         inc l
  273.         ret
  274.  
  275. AddGrassInMap
  276.         ld ix,grassbuf
  277.         ld c,0xfd ;c=LSB of addr
  278.         ld b,+(MAPWID+1)/2
  279.         xor a ;RLE counter
  280.         ex af,af' ;'
  281. addgrass_columns0
  282.         call addgrass_column4
  283.         inc c
  284.         call addgrass_column4
  285.         ld a,c
  286.         sub 5
  287.         ld c,a
  288.         djnz addgrass_columns0
  289.         ret
  290.        
  291. addgrass_column4
  292.         ld iy,tpushpgs +SKIPPGS+12 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  293.         call addgrass_column2
  294. addgrass_column2
  295.         call addgrass_column
  296. addgrass_column
  297. ;iy=tpushpgs+
  298. ;c=LSB of addr
  299. ;de=gfx
  300.        push bc
  301.        push iy
  302.         ld a,(iy)
  303.         ld h,0xff
  304.         ld l,c
  305.         SETPGC000
  306.         ld b,BIGMAPHGT-1;MAPHGT-1
  307. addgrass0
  308.         ;dec h
  309.         ;bit 6,h
  310.         ;call z,MapNextPg
  311.         ex af,af' ;'
  312. addgrass_noadd1
  313.         inc a
  314.         cp (ix)
  315.         jr nz,addgrass_noadd
  316.         inc ix
  317.          or a
  318.          jr z,addgrass_noadd1 ;0=просто пропуск 255 пикс
  319.      push bc
  320.      push hl
  321.      push iy
  322.         LD de,grass16
  323.         ld a,ly
  324.         and 3 ;xphase
  325.         add a,a
  326.         add a,a
  327.         add a,a
  328.         add a,e
  329.         ld e,a
  330.         jr nc,$+3
  331.         inc d
  332. addgrass1
  333.         ld a,(de)
  334.         or a
  335.         jr z,addgrass1q
  336.        and 0x47
  337.        jr z,addgrass_noleft
  338.        xor (hl)
  339.        and 0x47
  340.        xor (hl)
  341.        ld (hl),a
  342. addgrass_noleft
  343.         ld a,(de)
  344.        and 0xb8
  345.        jr z,addgrass_noright
  346.        xor (hl)
  347.        and 0xb8
  348.        xor (hl)
  349.        ld (hl),a
  350. addgrass_noright
  351.         dec h
  352.         bit 6,h
  353.         call z,MapNextPg
  354.         inc de
  355.         djnz addgrass1 ;чтобы не вылететь за карту
  356. addgrass1q
  357.      pop iy
  358.         ld a,(iy)
  359.         SETPGC000
  360.      pop hl
  361.      pop bc
  362.         xor a
  363. addgrass_noadd
  364.         ex af,af' ;'
  365.         dec h
  366.         bit 6,h
  367.         call z,MapNextPg
  368.         djnz addgrass0
  369.        pop iy
  370.        pop bc
  371.         inc ly
  372.         ret
  373.  
  374. PRLMNerror
  375.         INC C ;don't fit, next x
  376.         POP DE
  377.         LD A,C
  378.         CP MASKWID-5 ;ширина элемента не более 10 знакомест
  379.         jp C,PRLMN00
  380. ;       pop de
  381.        pop af
  382. ;        scf
  383.         ret
  384.  
  385. PRLMN
  386. ;draw element in map and mask
  387. ;c=X (in chr)
  388. ;b=N
  389.        call SetPgLmn8000
  390.  
  391.         ld a,b
  392.         SCF
  393.         rla ;a=N*2+1
  394.         LD HL,LMNS
  395. PRLMN0  LD E,(HL)
  396.         INC HL
  397.         LD D,(HL) ;size in bytes
  398.         INC HL
  399.         DEC A
  400.         JR Z,PRLMNO
  401.         ADD HL,DE
  402.         JR PRLMN0
  403. PRLMNO
  404.         LD D,(HL) ;width
  405.         INC HL
  406.         LD E,(HL) ;hgt
  407.         INC HL
  408.  
  409.        call SetPgMask
  410.        
  411.  
  412. ;TODO
  413.  
  414.         ret ;FIXME
  415.        
  416.        PUSH HL ;gfx
  417. PRLMN00
  418.         LD HL,MASK+(MASKWID*(MAPHGT-TERRAINHGT));MASKBUF+(MASKWID*(MAPHGT-TERRAINHGT))
  419.         XOR A
  420.         LD B,A
  421.         ADD HL,BC ;+x
  422.         LD B,E ;hgt
  423.        PUSH DE
  424.         LD DE,MASKWID
  425. ;есть ли достаточная высота неба под элемент?
  426.         OR (HL)
  427.         ADD HL,DE
  428.         DJNZ $-2
  429.         jr NZ,PRLMNerror ;don't fit, next x
  430. ;ищем грунт (он точно есть, мы в маске сделали лишнюю залитую строку)
  431.          INC B
  432.          OR (HL)
  433.          ADD HL,DE
  434.         JR Z,$-3
  435.        POP DE
  436.         LD A,D ;wid
  437.         DEC A
  438.         RRA
  439.         NEG
  440.         ADD A,C
  441.         LD C,A ;x
  442.        ld a,b
  443.        add a,MAPHGT-TERRAINHGT
  444.        ld b,a ;y
  445. ;PGMASK уже включено
  446. ;b=y
  447. ;c=x
  448. ;d=width
  449. ;e=hgt
  450.        POP HL ;gfx
  451.  
  452.      PUSH BC ;c=x
  453.         XOR A
  454.         OR B ;y
  455.         PUSH HL ;gfx
  456.         PUSH DE ;width,hgt
  457.         LD HL,MASK;MASKBUF
  458.         LD DE,MASKWID
  459.         JR Z,$+5
  460.         ADD HL,DE
  461.         DJNZ $-1 ;hl=MASK+(y*MASKWID)
  462.         ADD HL,BC ;hl=MASK+(y*MASKWID)+x
  463.         POP BC ;width,hgt
  464.         POP DE ;gfx
  465. ;hl=MASK+
  466. ;de=gfx
  467. ;b=width
  468. ;c=hgt
  469. PRLMNmask1
  470.         PUSH BC
  471.         PUSH HL
  472.          xor a
  473.          ld c,a
  474. PRLMNmask2
  475.         LD A,(DE)
  476.          rra
  477.          rl c
  478.          rra
  479.          rr c
  480.          push af
  481.         OR (HL)
  482.         LD (HL),A
  483.         INC HL
  484.         INC DE
  485.          pop af
  486.         DJNZ PRLMNmask2
  487.          ld a,0
  488.          rra
  489.          rl c
  490.          rra
  491.          OR (HL)
  492.          LD (HL),A        
  493.         POP HL
  494.         LD C,MASKWID
  495.         ADD HL,BC
  496.         POP BC
  497.         DEC C
  498.         JR NZ,PRLMNmask1      
  499.         ex de,hl
  500.       LD D,(HL) ;width
  501.       INC HL
  502.       LD E,(HL) ;hgt
  503.       INC HL
  504.        POP BC
  505.        PUSH BC
  506.         XOR A
  507.         OR B ;y
  508.         PUSH HL ;gfx
  509.         PUSH DE ;width,hgt
  510.         LD HL,MAP;+(MAPWID*(MAPHGT-TERRAINHGT));#C000
  511.         LD DE,MAPWID*2
  512.         JR Z,$+5
  513.         ADD HL,DE
  514.         DJNZ $-1
  515.         ADD HL,BC
  516.         ADD HL,BC ;hl=MAP+(y*MAPWID*2)+(x*2)
  517.        
  518. ;TODO
  519.        
  520.        ;LD A,PGMAP;16
  521.        ;CALL OUTME
  522.         POP BC ;width,hgt
  523.         POP DE ;gfx
  524.        
  525. ;TODO
  526.              
  527.        
  528.        
  529.         LD A,B ;width
  530.      POP BC ;c=x
  531.         ADD A,C
  532.         LD C,A ;update x (чтобы не лепить объекты совсем рядом)
  533.        ;or a ;NC
  534.         RET
  535.  
  536.        if 0
  537. CheckGroundExist ;проверяем, есть ли земля на ниж. линии (CY=error)
  538.  
  539. ;TODO
  540.         xor a
  541.         inc a
  542.  
  543.         ret nz
  544.         scf
  545.         ret ;error ;нет земли на ниж. линии
  546.        endif
  547.  
  548. EorFillInMap
  549.         ld c,0xfd ;c=LSB of addr
  550. EorFillInMap0
  551.         call EorFillInMap_column4
  552.         inc c
  553.         call EorFillInMap_column4
  554.         ld a,c
  555.         sub 5
  556.         ld c,a
  557.         jr nc,EorFillInMap0
  558.         ret
  559.        
  560. EorFillInMap_column4
  561. ;c=LSB of addr
  562.         ld iy,tpushpgs + SKIPPGS+12
  563.         call EorFillInMap_column2
  564. EorFillInMap_column2
  565.         call EorFillInMap_column
  566. EorFillInMap_column
  567.         xor a ;TODO 0xff для пещер
  568. ;a=накопленный байт
  569. ;iy=tpushpgs+
  570. ;c=LSB of addr
  571. ;b=число страниц осталось в этом столбце
  572.        push bc
  573.        push iy
  574.        push af
  575.         ld a,(iy)
  576.         ld h,0xff
  577.         ld l,c
  578.         SETPGC000
  579.        pop af
  580.         LD B,BIGMAPHGT&0xff
  581. MKMAPF0 XOR (HL)
  582.         LD (HL),A
  583.         dec h
  584.         bit 6,h
  585.         call z,MapNextPg
  586.         DJNZ MKMAPF0
  587.        pop iy
  588.        pop bc
  589.         inc ly
  590.         ret
  591.