?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;0 - пусто
  2. ;1..127 - объект
  3. ;128..254 - пуля
  4. ;[255 - препятствие]
  5. fillcollisionmap
  6.         ;ld hl,collisionmap
  7.         ;ld de,collisionmap+1
  8.         ;ld bc,collisionmapsize-1
  9.         ;ld (hl),0
  10.         ;ldir
  11.         ld (fillcollisionmapsp),sp
  12.         ld sp,collisionmap+collisionmapsize
  13.         ld de,0
  14.         ld b,collisionmaphgt
  15. fillcollisionmap_clear0
  16.         dup collisionmaplinesize/2
  17.         push de
  18.         edup
  19.         djnz fillcollisionmap_clear0
  20. fillcollisionmapsp=$+1
  21.         ld sp,0
  22. ;помечаем пули
  23.         ld ix,bulletlist
  24.         ld c,128
  25. fillcollisionmap_bullet0
  26.         ld a,(ix+(obj_x+1))
  27.         cp TERMINATOR
  28.         jr z,fillcollisionmap_bulletq
  29.         call calccollisionmapaddr
  30.         ld (hl),c
  31.         ld de,objsize
  32.         add ix,de
  33.         inc c
  34.         jp fillcollisionmap_bullet0
  35. fillcollisionmap_bulletq
  36. ;помечаем объекты
  37.         ld ix,objlist
  38.         ld c,1
  39. fillcollisionmap_obj0
  40.         ld a,(ix+(obj_x+1))
  41.         cp TERMINATOR
  42.         ret z
  43.         call calccollisionmapaddr
  44.         ld de,collisionmaplinesize-2
  45.         ld (hl),c
  46.         inc hl
  47.         ld (hl),c
  48.         inc hl
  49.         ld (hl),c
  50.         add hl,de
  51.         ld (hl),c
  52.         inc hl
  53.         ld (hl),c
  54.         inc hl
  55.         ld (hl),c
  56.         add hl,de
  57.         ld (hl),c
  58.         inc hl
  59.         ld (hl),c
  60.         inc hl
  61.         ld (hl),c
  62.         ld de,objsize
  63.         add ix,de
  64.         inc c
  65.         jp fillcollisionmap_obj0
  66.        
  67. calccollisionmapaddr
  68. ;bc,e не портим
  69.         GETXDE_YHL
  70.         if coordsfactor !=4
  71.         display "coordsfactor!=4"
  72.         endif
  73.         ld a,l
  74.         rr h
  75.         rra
  76.         rr h
  77.         rra
  78.         rra
  79.         rra
  80.         rra
  81.         and 0x1f
  82.         ld l,a
  83.         ld h,0
  84.         add hl,hl
  85.         add hl,hl
  86.         add hl,hl
  87.         add hl,hl
  88.         add hl,hl ;fillcollisionmaplinesize=32
  89.         if coordsfactor !=4
  90.         display "coordsfactor!=4"
  91.         endif
  92.         ld a,e
  93.         rr d
  94.         rra
  95.         rr d
  96.         rra
  97.         rra
  98.         rra
  99.         rra
  100.         and 0x1f
  101.         add a,l
  102.         ld l,a
  103.         ld a,collisionmap/256
  104.         add a,h
  105.         ld h,a
  106.         ret
  107.  
  108. calctilemapaddr_de_hl
  109. ;de=x
  110. ;hl=y
  111. ;bc,e не портим
  112.         if coordsfactor !=4
  113.         display "coordsfactor!=4"
  114.         endif
  115.         ld a,l
  116.         rr h
  117.         rra
  118.         rr h
  119.         rra
  120.         rra
  121.         rra
  122.         rra
  123.         and 0x1f
  124.         ld l,a
  125.         if coordsfactor !=4
  126.         display "coordsfactor!=4"
  127.         endif
  128.         ld a,e
  129.         rr d
  130.         rra
  131.         rr d
  132.         rra
  133.         rra
  134.         rra
  135.         rra
  136.         and 0x1f
  137. calctilemapaddr_a_l
  138.         ld h,0
  139.         add hl,hl
  140.         add hl,hl
  141.         add hl,hl
  142.         add hl,hl
  143.         add hl,hl ;fillcollisionmaplinesize=32
  144.         add a,l
  145.         ld l,a
  146.         ld a,tilemap/256
  147.         add a,h
  148.         ld h,a
  149.         ret
  150.  
  151. checkbulletcollision
  152. ;hl=collisionmapaddr
  153. ;out: nc=коллизия
  154.         ld a,(hl)
  155.         or a ;пусто
  156.         ;scf
  157.         ;jr z,$;ret z ;CY=1
  158.         jp m,checkbulletcollision_bullet
  159. ;1..127 = объект
  160.         ld c,a
  161.         ld b,0
  162.         ld de,objsize
  163.         call mulbcde
  164.        
  165.         if 1==1
  166.         ld bc,objlist-objsize+obj_energy
  167.         add hl,bc
  168.        
  169.         else ;проверка попадания в яблочко
  170.         ;надо проверить x > xbullet > x+tanksize
  171.         ld bc,objlist-objsize+obj_x
  172.         add hl,bc
  173.         ld a,(ix+obj_x) ;xbullet
  174.         sub (hl) ;x
  175.         ld c,a
  176.         inc hl
  177.         ld a,(ix+(obj_x+1)) ;xbullet(HSB)
  178.         sbc a,(hl) ;x(HSB)
  179.         ld b,a ;bc = xbullet-x
  180.         scf
  181.         ret nz ;bc >= 256 (точно мимо)
  182.         ld a,c
  183.         or a
  184.         scf
  185.         ret z
  186.         cp tankdamagesize*coordsfactor
  187.         ccf
  188.         ret c ;bc >= tanksize
  189.         inc hl
  190.         ld a,(ix+obj_y) ;ybullet
  191.         sub (hl) ;y
  192.         ld c,a
  193.         inc hl
  194.         ld a,(ix+(obj_y+1)) ;ybullet(HSB)
  195.         sbc a,(hl) ;y(HSB)
  196.         ld b,a ;bc = ybullet-y
  197.         scf
  198.         ret nz ;bc >= 256 (точно мимо)
  199.         ld a,c
  200.         or a
  201.         scf
  202.         ret z
  203.         cp tankdamagesize*coordsfactor
  204.         ccf
  205.         ret c ;bc >= tanksize
  206.         ld bc,obj_energy-(obj_y+1)
  207.         add hl,bc
  208.         endif ;проверка попадания в яблочко
  209.        
  210.         ld a,(hl)
  211.         sub (ix+obj_energy) ;энергия пули
  212.         ld (hl),a
  213.         ret nc ;у объекта ещё осталась энергия
  214.         push ix
  215.         ex de,hl
  216.         ld ix,-obj_energy
  217.         add ix,de
  218.         SETANIM ANIM_DIE
  219.         pop ix
  220.         or a
  221.         ret ;nc
  222. checkbulletcollision_bullet
  223. ;128..255 = пуля (в collisionmap всегда видна более поздняя пуля, т.е. её можно смело удалять)
  224.         sub 128
  225.         ;push af ;номер найденной пули
  226.         ;push ix
  227.         ;pop hl
  228.         ;ld bc,-bulletlist&0xffff
  229.         ;add hl,bc
  230.         ;ld de,objsize
  231.         ;call divhlde ;hl=номер нашей пули
  232.         ;pop af ;номер найденной пули
  233.         ;cp l ;номер нашей пули
  234.         ;scf
  235.         ;ret z ;CY=1 ;пуля увидела сама себя
  236.         ld c,a
  237.         ld b,0
  238.         ld de,objsize
  239.         call mulbcde
  240.         ex de,hl
  241.         push ix
  242.         ld ix,bulletlist
  243.         add ix,de
  244.         ld hl,curbulletlistend
  245.         call delobj ;копируем из ix+objsize в ix
  246.         pop ix
  247.         or a
  248.         ret ;nc
  249.        
  250. checkwalls
  251. ;bc=размер
  252. ;out: nc=стена
  253. _=4 ;половина клеточки
  254.         ld h,(ix+(obj_y+1))
  255.         ld a,(ix+obj_y) ;y
  256.         srl h
  257.         rra
  258.         srl h
  259.         rra
  260.         cp _&0xff
  261.         ccf
  262.         ret nc ;верхняя стена
  263. ;вычесть (bottomwally/coordsfactor-4)-размер, смотрим <=
  264.         add a,c ;размер
  265. _=(bottomwally/coordsfactor-4)+1
  266.         cp _&0xff
  267.         ret nc ;нижняя стена
  268. _=4 ;половина клеточки
  269.         ld d,(ix+(obj_x+1))
  270.         ld a,(ix+obj_x) ;x
  271.         srl d
  272.         rra
  273.         srl d
  274.         rra
  275.         cp _&0xff
  276.         ccf
  277.         ret nc ;левая стена
  278. ;вычесть (rightwallx/coordsfactor-4)-размер, смотрим <=
  279.         add a,c ;размер
  280. _=(rightwallx/coordsfactor-4)+1
  281.         cp _&0xff
  282.         ret ;nc=правая стена
  283.        
  284. checkobstacles_tank
  285. ;nc=препятствие
  286.         GETXDE_YHL
  287.         ld bc,-4*coordsfactor
  288.         ex de,hl
  289.         add hl,bc
  290.         ex de,hl
  291.         add hl,bc
  292.         ld a,l
  293.         and 8*coordsfactor-1
  294.         ld b,3 ;число проверяемых строк
  295.         jr z,$+3
  296.         inc b ;число проверяемых строк (стоим неровно по y)
  297.         call calctilemapaddr_de_hl ;bc,e не портим
  298.         ld a,e
  299.         and 8*coordsfactor-1
  300.         jr nz,checkobstacles_tank_lines4 ;стоим неровно по x
  301.         ld de,tilemaplinesize-2
  302. checkobstacles_tank_lines30
  303.         ld a,(hl)
  304.         cp maxemptytile+1
  305.         ret nc
  306.         inc hl
  307.         ld a,(hl)
  308.         cp maxemptytile+1
  309.         ret nc
  310.         inc hl
  311.         ld a,(hl)
  312.         cp maxemptytile+1
  313.         ret nc
  314.         add hl,de
  315.         djnz checkobstacles_tank_lines30
  316.         scf
  317.         ret ;CY=1 (нет препятствия)
  318. checkobstacles_tank_lines4
  319.         ld de,tilemaplinesize-3
  320. checkobstacles_tank_lines40
  321.         ld a,(hl)
  322.         cp maxemptytile+1
  323.         ret nc
  324.         inc hl
  325.         ld a,(hl)
  326.         cp maxemptytile+1
  327.         ret nc
  328.         inc hl
  329.         ld a,(hl)
  330.         cp maxemptytile+1
  331.         ret nc
  332.         inc hl
  333.         ld a,(hl)
  334.         cp maxemptytile+1
  335.         ret nc
  336.         add hl,de
  337.         djnz checkobstacles_tank_lines40
  338.         scf
  339.         ret ;CY=1 (нет препятствия)
  340.