?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;процедуры для генерации карты, нижнего уровня (зависят от типа экрана)
  2.  
  3. ClearMap
  4.        ld a,PGMAP
  5.        call OUTME
  6.         LD HL,MAP
  7.         LD DE,MAP+1
  8.         LD BC,0xffff-MAP
  9.         LD (HL),0
  10.         LDIR
  11.         ret
  12.  
  13. FindPlacesForGrass ;записывает в grassbuf
  14.        ld a,PGMAP
  15.        call OUTME
  16. ;по чётным столбцам сверху вниз ищем переходы 0->1
  17.         ld ix,grassbuf
  18.         ld hl,MAP
  19.         ld de,MAPWID
  20.         ld c,128 ;1 bit >>2 every time
  21.         ld b,MAPWID
  22.         xor a ;RLE counter
  23.         ex af,af' ;'
  24. findgrass_columns0
  25.        push bc
  26.        push hl
  27.         ld b,MAPHGT-1
  28. findgrass1
  29.         ld a,(hl)
  30.         cpl
  31.         and c
  32.         add hl,de
  33.         and (hl)
  34.         ex af,af' ;'
  35.         inc a
  36.          jr nz,findgrass_nooverflow
  37.          ld (ix),a;0 ;0=просто пропуск 255 пикс
  38.          inc ix
  39.         ld a,hx
  40.         cp (grassbuf+grassbufsz)/256
  41.         jp z,nowhere ;buffer overflow
  42.          ld a,1
  43. findgrass_nooverflow
  44.         ex af,af' ;'
  45.         jr z,findgrass_empty
  46.         ex af,af' ;'
  47.         ld (ix),a
  48.         inc ix
  49.         ld a,hx
  50.         cp (grassbuf+grassbufsz)/256
  51.         jp z,nowhere ;buffer overflow
  52.         xor a
  53.         ex af,af' ;'
  54. findgrass_empty
  55.         djnz findgrass1
  56.        pop hl
  57.        pop bc
  58.         rrc c
  59.         rrc c
  60.         jr nc,findgrass_columns0
  61.         inc hl
  62.         djnz findgrass_columns0
  63.         ld (ix),b;0 ;иначе в последнем столбце может появиться лажа
  64.         ret
  65.  
  66. MakeMaskFromMap
  67. ;FIXME в случае неполной маски (нужна защита от влетания в стену на краю карты - надо полную маску или при любой порче ландшафта крайний левый пикс маски формировать из 5 левых пикс, справа аналогично?)
  68. ;x в маске считается для центра червя, x=0 соответствует x=4 в карте
  69. ;то есть берём байт маски из карты так: ----M-M- M-M-m-m- m-m-----
  70.         LD HL,MAP;+1
  71.         LD DE,MASK;MASKBUF
  72.         LD B,MASKHGT;88
  73. MKMAP41 PUSH BC
  74.        ld a,PGMAP
  75.        call OUTME
  76.        push de
  77.        ld de,MKMASKBUF
  78.         LD B,MASKWID
  79. MKMAP42 LD A,(HL)
  80.          RLA
  81.          RLA
  82.          RLA
  83.          RLA
  84.         DUP 2
  85.         RLA
  86.         RLA
  87.         RL C
  88.         EDUP
  89.         INC HL
  90.         LD A,(HL)
  91.         DUP 4
  92.         RLA
  93.         RLA
  94.         RL C
  95.         EDUP
  96.         INC HL
  97.         LD A,(HL)
  98.         DUP 2
  99.         RLA
  100.         RLA
  101.         RL C
  102.         EDUP
  103.         LD A,C
  104.         LD (DE),A
  105.         INC DE
  106.         DJNZ MKMAP42      
  107.        call SetPgMask
  108.        pop de
  109.        push hl
  110.        ld hl,MKMASKBUF
  111.        ld bc,MASKWID
  112.        ldir
  113.        pop hl        
  114.         LD bc,(MAPWID-MASKWID)*2
  115.         ADD HL,BC
  116.         POP BC
  117.         DJNZ MKMAP41
  118. ;extra bottom line of mask is always filled (for element placement)
  119.         LD HL,MASKSZ+MASK;MASKBUF
  120.         LD BC,MASKWID*256+255
  121.         LD (HL),C
  122.         INC HL
  123.         DJNZ $-2
  124.         ret
  125.  
  126. TexturizeGroundInMap
  127.        ld a,PGMAP
  128.        call OUTME
  129.         LD HL,MAP
  130.         LD DE,MAPWID
  131.         ld bc,texture
  132.         ld lx,MAPWID
  133. MkMapTex0 PUSH BC
  134.         PUSH HL
  135. MkMapTex1 LD A,(BC)
  136.         AND (HL)
  137.         LD (HL),A
  138.         LD A,C
  139.         inc a
  140.         xor c
  141.         and 0x7f
  142.         xor c
  143.         LD C,A
  144.         ADD HL,DE
  145.         JR NC,MkMapTex1
  146.         POP HL
  147.         INC L
  148.         POP BC
  149.         ld a,c
  150.         add a,128
  151.         ld c,a
  152.         jr nc,MkMapTex0ok
  153.         inc b
  154.         ld a,b
  155.         cp texture/256+8
  156.         jr c,MkMapTex0ok
  157.         ld b,texture/256
  158. MkMapTex0ok
  159.         dec lx
  160.         jr NZ,MkMapTex0
  161.         ret
  162.  
  163. AddGrassInMap
  164.        LD A,PGMAP;16
  165.        CALL OUTME
  166.         ld ix,grassbuf
  167.         ld de,MAPWID
  168.         ld hl,MAP
  169.         ld c,0xc0 ;2 bits >>2 every time
  170.         ld b,MAPWID
  171.         xor a ;RLE counter
  172.         ex af,af' ;'
  173. addgrass_columns0
  174.         ld a,c
  175.         ld (addgrassmask),a
  176.        push bc
  177.        push hl
  178.         ld b,MAPHGT-1
  179. addgrass0
  180.         add hl,de
  181.         ex af,af' ;'
  182. addgrass_noadd1
  183.         inc a
  184.         cp (ix)
  185.         jr nz,addgrass_noadd
  186.         inc ix
  187.          or a
  188.          jr z,addgrass_noadd1 ;0=просто пропуск 255 пикс
  189.      push bc
  190.      push hl
  191.         LD bc,sprgrass
  192. addgrass1
  193.         ld a,(bc)
  194.         or a
  195.         jr z,addgrass1q
  196. addgrassmask=$+1
  197.         and 0
  198.         or (hl)
  199.         ld (hl),a
  200.         add hl,de
  201.         jr c,addgrass1q ;end of column
  202.         inc bc
  203.         jr addgrass1
  204. addgrass1q
  205.      pop hl
  206.      pop bc
  207.         xor a
  208. addgrass_noadd
  209.         ex af,af' ;'
  210.         djnz addgrass0
  211.        pop hl
  212.        pop bc
  213.         rrc c
  214.         rrc c
  215.         jr nc,addgrass_columns0
  216.         inc hl
  217.         djnz addgrass_columns0
  218.         ret
  219.  
  220. sprgrass
  221.         DB #29,-1,#DB,#7E,#D5,#AA,0
  222.       ;DB #52,-1,#BF,-4,#AB,#55,0
  223.  
  224. PRLMNerror
  225.         INC C ;don't fit, next x
  226.        POP DE
  227.         LD A,C
  228.         CP MASKWID-5 ;ширина элемента не более 10 знакомест
  229.         jp C,PRLMN00
  230. ;       pop de
  231.        pop af
  232. ;        scf
  233.         ret
  234.  
  235. PRLMN
  236. ;draw element in map and mask
  237. ;c=X (in chr)
  238. ;hl=gfx
  239.         LD D,(HL) ;width
  240.         INC HL
  241.         LD E,(HL) ;hgt
  242.         INC HL
  243.  
  244.        call SetPgMask
  245.        
  246.        PUSH HL ;gfx
  247. PRLMN00
  248.         LD HL,MASK+(MASKWID*(MAPHGT-TERRAINHGT));MASKBUF+(MASKWID*(MAPHGT-TERRAINHGT))
  249.         XOR A
  250.         LD B,A
  251.         ADD HL,BC ;+x
  252.         LD B,E ;hgt
  253.        PUSH DE
  254.         LD DE,MASKWID
  255. ;есть ли достаточная высота неба под элемент?
  256.         OR (HL)
  257.         ADD HL,DE
  258.         DJNZ $-2
  259.         jr NZ,PRLMNerror ;don't fit, next x
  260. ;ищем грунт (он точно есть, мы в маске сделали лишнюю залитую строку)
  261.          INC B
  262.          OR (HL)
  263.          ADD HL,DE
  264.         JR Z,$-3
  265.        POP DE
  266.         LD A,D ;wid
  267.         DEC A
  268.         srl a;RRA
  269.         NEG
  270.         ADD A,C
  271.         LD C,A ;x
  272.        ld a,b
  273.        add a,MAPHGT-TERRAINHGT
  274.        ld b,a ;y
  275. ;PGMASK уже включено
  276. ;b=y
  277. ;c=x
  278. ;d=width
  279. ;e=hgt
  280.        POP HL ;gfx
  281.  
  282.      PUSH BC ;c=x
  283.         XOR A
  284.         OR B ;y
  285.         PUSH HL ;gfx
  286.         PUSH DE ;width,hgt
  287.         LD HL,MASK;MASKBUF
  288.         LD DE,MASKWID
  289.         JR Z,$+5
  290.         ADD HL,DE
  291.         DJNZ $-1 ;hl=MASK+(y*MASKWID)
  292.         ADD HL,BC ;hl=MASK+(y*MASKWID)+x
  293.         POP BC ;width,hgt
  294.         POP DE ;gfx
  295. ;hl=MASK+
  296. ;de=gfx
  297. ;b=width
  298. ;c=hgt
  299. PRLMNmask1
  300.         PUSH BC
  301.         PUSH HL
  302.          xor a
  303.          ld c,a
  304. PRLMNmask2
  305.         LD A,(DE)
  306.          rra
  307.          rl c
  308.          rra
  309.          rr c
  310.          push af
  311.         OR (HL)
  312.         LD (HL),A
  313.         INC HL
  314.         INC DE
  315.          pop af
  316.         DJNZ PRLMNmask2
  317.          ld a,0
  318.          rra
  319.          rl c
  320.          rra
  321.          OR (HL)
  322.          LD (HL),A        
  323.         POP HL
  324.         LD C,MASKWID
  325.         ADD HL,BC
  326.         POP BC
  327.         DEC C
  328.         JR NZ,PRLMNmask1      
  329.         ex de,hl
  330.       LD D,(HL) ;width
  331.       INC HL
  332.       LD E,(HL) ;hgt
  333.       INC HL
  334.     POP BC ;yx
  335.     PUSH BC ;yx
  336.         XOR A
  337.         OR B ;y
  338.         PUSH HL ;gfx
  339.         PUSH DE ;width,hgt
  340.         LD HL,MAP;+(MAPWID*(MAPHGT-TERRAINHGT));#C000
  341.         LD DE,MAPWID*2
  342.         JR Z,$+5
  343.         ADD HL,DE
  344.         DJNZ $-1
  345.         ADD HL,BC
  346.         ADD HL,BC ;hl=MAP+(y*MAPWID*2)+(x*2)
  347.        LD A,PGMAP;16
  348.        CALL OUTME
  349.         POP BC ;width,hgt
  350.         POP DE ;gfx
  351. PRLMN2  PUSH BC
  352.         PUSH HL
  353.         LD A,(DE)
  354.         INC HL
  355.         OR (HL)
  356.         LD (HL),A
  357.         INC DE
  358.         DJNZ $-5
  359.         POP HL
  360.         LD C,MAPWID
  361.         ADD HL,BC
  362.         POP BC
  363.         DEC C
  364.         JR NZ,PRLMN2
  365. ;de=end of gfx
  366.         ex de,hl ;hl=end of gfx
  367.         LD A,B ;width
  368.      POP BC ;c=x
  369.         ADD A,C
  370.         LD C,A ;update x (чтобы не лепить объекты совсем рядом)
  371.        ;or a ;NC
  372.         RET
  373.  
  374. CopyLMNGfx ;копируем графику выбранных элементов в LMNGFX (не более LMNGFXSZ)
  375. ;нужно только для 48/128, а на АТМ будет выводиться непосредственно из LMNS
  376. ;TODO с распаковкой? или добавить распаковку при использовании?
  377.        ld a,PGLMN
  378.        call OUTME
  379.      ld a,(LMNS)
  380. LMNSfirstbyte=$+1
  381.      cp 0x81
  382.      ret nz;jr nz,MKMAP_copyLMNbug ;48K повтор карты - используем элементы, которые успели спасти в экране (при послеигровой генерации в экране лежит 0)
  383.         ld hl,LMNlist ;впритык к концу параграфа
  384.         ld de,LMNGFX
  385. copyLMN0
  386.       ld (copyLMN_lastgood),de
  387.         ld a,(hl)
  388.        push hl
  389.         scf
  390.         rla ;a=N*2+1
  391.         LD HL,LMNS
  392. copyLMNfind0
  393.         LD c,(HL)
  394.         INC HL
  395.         LD b,(HL) ;size in bytes
  396.         INC HL
  397.         DEC A
  398.         JR Z,copyLMNfindq
  399.         ADD HL,bc
  400.         JR copyLMNfind0
  401. copyLMNfindq
  402.        push hl
  403.        ld h,d
  404.        ld l,e
  405.        add hl,bc
  406.        ld a,h
  407.        cp (LMNGFX+LMNGFXSZ)/256
  408.        pop hl
  409.        jr nc,copyLMNfail
  410.         ldir
  411.         dec de ;skip 0
  412.         LD c,(HL)
  413.         INC HL
  414.         LD b,(HL) ;size in bytes
  415.         INC HL
  416.        push hl
  417.        ld h,d
  418.        ld l,e
  419.        add hl,bc
  420.        ld a,h
  421.        cp (LMNGFX+LMNGFXSZ)/256
  422.        pop hl
  423.        jr nc,copyLMNfail
  424.         ldir        
  425.         dec de ;skip 0
  426.        pop hl
  427.         inc l
  428.         jr nz,copyLMN0
  429.        jr copyLMNok
  430. copyLMNfail
  431.        pop hl
  432. copyLMN_lastgood=$+1
  433.         ld de,0
  434. copyLMNok
  435.         xor a
  436.         ld (de),a ;end of gfx
  437. ;MKMAP_copyLMNbug ;при послеигровой генерации на 48K {0x4000}=0
  438.         ret
  439.  
  440.        if 0
  441. CheckGroundExist ;проверяем, есть ли земля на ниж. линии (CY=error)
  442.        ld a,PGMAP
  443.        call OUTME ;технически не нужно, т.к. вызывается после MKMAPPP
  444.         LD HL,MAP+((MAPHGT-1)*MAPWID);#FFEF
  445.         LD B,MAPWID
  446.         XOR A
  447.         OR (HL)    ;проверяем, есть ли земля на ниж. линии
  448.         inc HL     ;
  449.         DJNZ $-2   ;
  450.         ret nz
  451.         scf
  452.         ret ;error ;нет земли на ниж. линии
  453.        endif
  454.  
  455. EorFillInMap
  456.         LD A,PGMAP;16
  457.         CALL OUTME
  458.  
  459.         LD HL,MAP;#C000
  460.         LD DE,MAPWID
  461.         LD C,E
  462. MKMAPF  PUSH HL
  463.         LD B,MAPHGT
  464.         XOR A
  465. MKMAPF0 XOR (HL)
  466.         LD (HL),A
  467.         ADD HL,DE
  468.         DJNZ MKMAPF0
  469.         POP HL
  470.         INC L
  471.         DEC C
  472.         JR NZ,MKMAPF
  473.         ret
  474.