?login_element?

Subversion Repositories NedoOS

Rev

Rev 555 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. scrbuf=0xe000 ;делится на 0x800
  5. tilemap=0xdd00 ;0x300
  6. collisionmap=0xda00 ;0x300 (перед ней ~20 байт затирается)
  7. validmap=0xfc00 ;0x300 (перед ней ~20 байт затирается)
  8. VALID0=0xfb ;валидная, не надо обновлять
  9. VALID1=0x80 ;невалидная, надо обновлять, там можно более длинные процедуры
  10. VALID00=VALID0+256*VALID0
  11. VALID01=VALID0+256*VALID1
  12. VALID10=VALID1+256*VALID0
  13. VALID11=VALID1+256*VALID1
  14. validmaplinesize=32
  15. validmapwid=validmaplinesize-2 ;в конце строки лежит validmapnext
  16.  
  17. emptyattr=7
  18.  
  19. fieldwid=10
  20. fieldhgt=8
  21. fieldx=0
  22. fieldy=0
  23.  
  24. coordsfactor=4
  25.  
  26. leftwallx=0
  27. topwally=0
  28. rightwallx=fieldwid*24*coordsfactor
  29. bottomwally=fieldhgt*24*coordsfactor
  30.  
  31. dir_r=0x09
  32. dir_l=0x08
  33. dir_u=0x0b
  34. dir_d=0x0a
  35.  
  36. collisionmaplinesize=32
  37. collisionmapwid=fieldwid*3
  38. collisionmaphgt=fieldhgt*3
  39. collisionmapsize=collisionmaplinesize*collisionmaphgt
  40. tilemaplinesize=collisionmaplinesize
  41. tilemapwid=collisionmapwid
  42. tilemaphgt=collisionmaphgt
  43. tilemapsize=collisionmapsize
  44.  
  45. maxemptytile=9
  46.  
  47. maxobjects=20
  48. maxbullets=100
  49. TERMINATOR=0x80
  50.  
  51. tanksize=16
  52. tankdamagesize=11 ;грязный хак
  53. tankaimsize=8
  54. tankspeed=4 ;2^n!
  55. bulletspeed=6
  56. bulletenergy=20
  57.  
  58. startlives=5
  59. maxlives=10
  60.  
  61. ;timer=23672
  62.        
  63.         include "macro.asm"
  64.        
  65.         org PROGSTART
  66. begin
  67.         OS_HIDEFROMPARENT
  68.         ld e,3 ;6912
  69.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  70.  
  71.         ;OS_GETSCREENPAGES
  72. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  73.         ld a,(user_scr0_high) ;ok
  74.         SETPG16K
  75.        
  76.         ld hl,valid00
  77.         ld de,VALID00
  78.         ld bc,valid00_size
  79.         ldir
  80.         ld hl,valid01
  81.         ld de,VALID01
  82.         ld c,valid01_size
  83.         ldir
  84.         ld hl,valid10
  85.         ld de,VALID10
  86.         ld c,valid10_size
  87.         ldir
  88.         ld hl,valid11
  89.         ld de,VALID11
  90.         ld c,valid11_size
  91.         ldir
  92.  
  93.         ld a,1
  94.         ld (nlevel),a
  95.  
  96. newlevel
  97.         call cls
  98.         call clscrbuf
  99.        
  100.         ld a,startlives
  101.         ld (lives),a
  102.         call prlives
  103.  
  104.         call initlevel
  105.  
  106.         call clearvalid
  107.         call restoreobjects_clear
  108.         call restorebullets_clear
  109.  
  110.         call prmap
  111.         call fillcollisionmap
  112.        
  113.         OS_GETTIMER ;hlde=timer
  114.         ex de,hl
  115.         ;ld hl,(timer)
  116.         ld (oldtimer),hl
  117.        
  118. loop
  119.         call restoreobjects
  120.         call restorebullets
  121.         ;ld a,2
  122.         ;out (0xfe),a
  123.         call probjlist
  124.         ;ld a,4
  125.         ;out (0xfe),a
  126.         call prbulletlist
  127.         ;ld a,0
  128.         ;out (0xfe),a
  129.        
  130. loopdelay
  131.         OS_GETTIMER ;hlde=timer
  132.         ex de,hl
  133.         ;ld hl,(timer)
  134. oldtimer=$+1
  135.         ld bc,0
  136.         ld (oldtimer),hl
  137.         ld a,l
  138.         sub c
  139.         jr z,loopdelay
  140.         ld b,a
  141.         ;ld a,5
  142.         ;out (0xfe),a
  143. logicloop0
  144.         push bc
  145.         call control
  146.         call animate
  147.         call logic
  148.         call bulletlogic
  149.         ;ld a,1
  150.         ;out (0xfe),a
  151.         call fillcollisionmap
  152.         ;ld a,5
  153.         ;out (0xfe),a
  154.         call bulletcollision
  155.         pop bc
  156.         djnz logicloop0
  157.         ;ld a,6
  158.         ;out (0xfe),a
  159.         call prvalid
  160.         ;call displaycollisionmap
  161. ;TODO сделать что-нибудь, когда врагов не осталось
  162.         ld a,(nenemies)
  163.         or a
  164.         jp nz,loop
  165.         ld hl,nlevel
  166.         inc (hl)
  167.         jp newlevel
  168.  
  169. initlevel
  170.         call genmap
  171.  
  172.         ld ix,objlist
  173.         call genobj_terminate
  174.         ld ix,bulletlist
  175.         call genbullet_terminate
  176.        
  177.         ld de,0x0010 ;x
  178.         ld hl,0x02b0 ;y
  179.         ld bc,params_tank
  180.         ld a,1 ;a=dir
  181.         call genobj
  182.        
  183.         ld a,(nlevel)
  184.         inc a
  185.         ld b,a
  186. initlevel_addenemies0
  187.         push bc
  188.         ;ld de,0x0010 ;x = 0x0010..0x0370
  189.         call rndxcoord ;out: hl=x
  190.         ex de,hl
  191.         ld hl,0x0010 ;y
  192.         ld bc,params_tanke
  193.         ld a,2 ;a=dir
  194.         call genobj
  195.         ld hl,nenemies
  196.         inc (hl)
  197.  
  198.         if 1==0
  199.         ld de,0x0370 ;x
  200.         ld hl,0x0010 ;y
  201.         ld bc,params_tanke
  202.         ld a,2 ;a=dir
  203.         call genobj
  204.         ld hl,nenemies
  205.         inc (hl)
  206.         endif
  207.         pop bc
  208.         djnz initlevel_addenemies0
  209. reter        
  210.         ret
  211.  
  212. attrbox  
  213. ;bc=yx
  214. ;a=фон
  215. ;d=y координата левого верхнего угла
  216. ;е=х координата левого верхнего угла
  217. ;0x5800+xcoordredbox+(32*ycoordredbox)
  218.         ld l,d  ;y
  219.         ld h,0        
  220.         add hl,hl    
  221.         add hl,hl    
  222.         add hl,hl    
  223.         add hl,hl    
  224.         add hl,hl
  225.         ld d,0x58
  226.         add hl,de ;x
  227. attrbox_lines
  228.         ld e,l
  229.         ld d,h  
  230.         push bc
  231. attrbox_pixels
  232.         ld (de),a
  233.         inc e
  234.         dec c        
  235.         jr nz,attrbox_pixels
  236.         pop bc
  237.         ld de,32
  238.         add hl,de    
  239.         djnz attrbox_lines
  240.         ret
  241.  
  242. genmap
  243.         ld hl,tilemap
  244.         ld de,tilemap+1
  245.         ld bc,tilemapsize-1
  246.         ld (hl),0
  247.         ldir
  248.        
  249.         ld hl,tilemap+(3*tilemaplinesize)
  250.         ld b,fieldhgt-2
  251. genmaplines
  252.         push bc
  253.         push hl
  254.         ld b,fieldwid
  255. genmapline
  256.         push bc
  257.         push hl
  258.         push hl
  259.         ld a,b ;1..fieldwid
  260.         sub 2 ;n
  261.         cp fieldwid-2 ;nc=левый или правый край
  262.         adc a,nblocks+1 ;n + cy + (nblocks+1)
  263.         sub b ;n + cy + nblocks - (n+2)
  264.         ld c,a ;nblocks или nblocks-1
  265.         call rnd
  266.         ld c,a
  267.         ld b,0
  268.         ld de,9
  269.         call mulbcde
  270.         ld bc,blocks
  271.         add hl,bc
  272.         ex de,hl
  273.         pop hl
  274.         ld bc,tilemaplinesize-2
  275.         dup 3
  276.         ld a,(de)
  277.         ld (hl),a
  278.         inc de
  279.         inc hl
  280.         ld a,(de)
  281.         ld (hl),a
  282.         inc de
  283.         inc hl
  284.         ld a,(de)
  285.         ld (hl),a
  286.         inc de
  287.         add hl,bc
  288.         edup
  289.         pop hl
  290.         inc hl
  291.         inc hl
  292.         inc hl
  293.         pop bc
  294.         djnz genmapline
  295.         pop hl
  296.         ld bc,tilemaplinesize*3
  297.         add hl,bc
  298.         pop bc
  299.         djnz genmaplines
  300.         ret
  301.  
  302. control
  303.         GET_KEY
  304.         cp key_esc
  305.         jp z,quit
  306.         call getkey ;c=%???lrduf (0=нажато)
  307.         ld a,c
  308.         rra ;f
  309.         jr nc,control_noreleasefire
  310.         ld a,1
  311.         ld (control_firehasbeenreleased),a
  312. control_noreleasefire
  313.  
  314. ;кнопки должны срабатывать, когда мы стоим посредине клетки ((x&(8*coordsfactor-1)) == 4*coordsfactor, (y&(8*coordsfactor-1)) == 4*coordsfactor)
  315.         ld ix,objlist ;первый объект - наш
  316.         call checkevencoords ;nz=не посредине клетки
  317.         ret nz
  318.  
  319.         ld a,c
  320.         rra ;f
  321.         jr c,control_nofire
  322.         ;проверим, что до этого был момент, когда огонь не нажимали
  323. control_firehasbeenreleased=$+1
  324.         ld a,0
  325.         or a
  326.         jr z,control_nofire ;не было момента, когда огонь не нажимали
  327.         xor a
  328.         ld (control_firehasbeenreleased),a
  329.         ;ld ix,objlist ;первый объект - наш
  330.         push bc
  331.         call shoot
  332.         pop bc
  333. control_nofire
  334.  
  335.         ld ix,objlist ;первый объект - наш
  336.         ;если не нажата кнопка движения и мы едем, то остановиться
  337.         rr c
  338.         ld a,c
  339.         cpl
  340.         and 0x0f
  341.         jr nz,control_nokeysreleased
  342.         ld a,(ix+obj_anim)
  343.         cp ANIM_GO
  344.         jr nz,control_nokeysreleased
  345.         SETANIM ANIM_STOP
  346. control_nokeysreleased
  347.  
  348.         ld a,c
  349.         rra ;u
  350.         jr c,control_nou
  351.         call goifpossible
  352.         ld (ix+obj_dir),0
  353. control_nou
  354.         rra ;d
  355.         jr c,control_nod
  356.         call goifpossible
  357.         ld (ix+obj_dir),2
  358. control_nod
  359.         rra ;r
  360.         jr c,control_nor
  361.         call goifpossible
  362.         ld (ix+obj_dir),1
  363. control_nor
  364.         rra ;l
  365.         jr c,control_nol
  366.         call goifpossible
  367.         ld (ix+obj_dir),3
  368. control_nol
  369.        
  370.         ret
  371.        
  372. goifpossible
  373.         ld c,a
  374.         ld a,(ix+obj_anim)
  375.         cp ANIM_APPEAR
  376.         jr nz,$+4
  377.         ld a,ANIM_STOP
  378.         cp ANIM_STOP
  379.         ld a,c
  380.         ret nz ;не стоим, так что не можем поехать
  381.         SETANIM ANIM_GO
  382.         ret
  383.        
  384. checkevencoords
  385. ;out: nz=не посредине клетки
  386.         ld a,(ix+obj_x)
  387.         and 8*coordsfactor-1
  388.         cp 4*coordsfactor
  389.         ret nz
  390.         ld a,(ix+obj_y)
  391.         and 8*coordsfactor-1
  392.         cp 4*coordsfactor
  393.         ret
  394.  
  395. shoot
  396.         SETANIM ANIM_SHOOT
  397.         ld c,(ix+obj_dir)
  398.         ld b,0
  399.         ld hl,tankbulletcoords
  400.         add hl,bc
  401.         add hl,bc
  402.         ld a,(hl) ;dx
  403.         ld c,a ;%sxxxxxxx
  404.         rla    ;%xxxxxxx?, CY=s
  405.         sbc a,a;%ssssssss
  406.         ld b,a ;dx
  407.         inc hl
  408.         ld a,(hl) ;dy
  409.         GETXDE_YHL
  410.         ex de,hl ;hl=x
  411.         add hl,bc ;x+dx
  412.         push hl ;x+dx
  413.         push de ;y
  414.         ld e,a
  415.         rla
  416.         sbc a,a
  417.         ld d,a ;dy
  418.         pop hl ;y
  419.         add hl,de ;hl = y+dy
  420.         pop de ;de = x+dx
  421.         ld a,(ix+obj_dir) ;a=dir
  422.         ld bc,params_bullet
  423. curbulletlistend=$+2
  424.         ld ix,bulletlist
  425.         call genobjorbullet
  426. genbullet_terminate
  427.         ld bc,objterminator
  428.         ld (ix+obj_objaddr),c
  429.         ld (ix+(obj_objaddr+1)),b
  430.         ld (ix+(obj_x+1)),TERMINATOR
  431.         ld (curbulletlistend),ix
  432.         ret
  433.  
  434. genobjorbullet
  435. ;de=x
  436. ;hl=y
  437. ;bc=params (obj(16),energy(8),speed(8))
  438. ;a=dir
  439.         ld (ix+obj_dir),a
  440.         PUTXDE_YHL
  441.         SETANIM ANIM_APPEAR
  442.         ld (ix+obj_delaycounter),1
  443.         ld (ix+obj_gundelaycounter),0
  444.         ld a,(bc)
  445.         ld (ix+obj_objaddr),a
  446.         inc bc
  447.         ld a,(bc)
  448.         ld (ix+(obj_objaddr+1)),a
  449.         inc bc
  450.         ld a,(bc)
  451.         ld (ix+obj_energy),a
  452.         inc bc
  453.         ld a,(bc)
  454.         ld (ix+obj_speed),a
  455.         ld bc,objsize
  456.         add ix,bc
  457.         ret
  458.  
  459. genobj
  460. ;de=x
  461. ;hl=y
  462. ;bc=params (obj(16),energy(8),speed(8))
  463. ;a=dir
  464. curobjlistend=$+2
  465.         ld ix,objlist
  466.         call genobjorbullet
  467. genobj_terminate
  468.         ld bc,objterminator
  469.         ld (ix+obj_objaddr),c
  470.         ld (ix+(obj_objaddr+1)),b
  471.         ld (ix+(obj_x+1)),TERMINATOR
  472.         ld (curobjlistend),ix
  473.         ret
  474.  
  475. animate
  476.         ld ix,objlist-objsize
  477. animate0_prepareregs
  478.         ld a,TERMINATOR
  479.         ld bc,objsize
  480. animate0
  481.         add ix,bc
  482. animate0_afterdel
  483.         cp (ix+(obj_x+1))
  484.         ret z
  485.         dec (ix+obj_animcounter)
  486.         jp nz,animate0
  487.         ;текущая фаза анимации кончилась, ищем следующую
  488.         ld l,(ix+obj_objaddr)
  489.         ld h,(ix+(obj_objaddr+1)) ;hl=адрес описателя объекта (в начале лежит указатель на список анимаций)
  490.         ld a,(hl)
  491.         inc hl
  492.         ld h,(hl)
  493.         ld l,a ;hl=указатель на список анимаций
  494.         ld e,(ix+obj_anim) ;номер анимации
  495.         ld d,0
  496.         add hl,de
  497.         add hl,de
  498.         ld a,(hl)
  499.         inc hl
  500.         ld h,(hl)
  501.         ld l,a ;hl=указатель на анимацию
  502.         ld e,(ix+obj_animphase) ;номер фазы анимации
  503.         inc e ;следующая фаза анимации
  504.         ld (animate_pointer),hl
  505.         add hl,de
  506.         add hl,de
  507.         add hl,de
  508.         ld a,(hl) ;время фазы
  509.         or a ;если 0, то это конец анимации
  510.         jr nz,animate_noend
  511.         inc hl
  512.         ld a,(hl) ;режим зацикливания (0=переход на нулевую анимацию, 1=зацикливаемся тут, 2=удалить)
  513.         cp 2 ;признак ANIMENDDIE
  514.         jr z,animate_delete
  515.         or a
  516.         jr nz,animate_no0
  517.         ld (ix+obj_anim),a ;0-я анимация
  518. animate_no0
  519.         ld e,0
  520. animate_pointer=$+1
  521.         ld hl,0
  522.         add hl,de
  523.         add hl,de
  524.         add hl,de
  525.         ld a,(hl) ;время фазы
  526. animate_noend
  527.         ld (ix+obj_animcounter),a
  528.         ld (ix+obj_animphase),e ;следующая фаза анимации
  529.         jp animate0_prepareregs
  530.        
  531. animate_delete
  532.         push ix
  533.         pop hl
  534.         ld de,objlist
  535.         or a
  536.         sbc hl,de
  537.         jr z,animate_delete_player
  538.         ld hl,curobjlistend
  539.         call delobj ;копируем из ix+objsize в ix
  540.  
  541.         ld hl,nenemies
  542.         dec (hl)
  543.        
  544.         ld a,TERMINATOR
  545.         ld bc,objsize
  546.         jp animate0_afterdel
  547. animate_delete_player
  548.         call decreaselives
  549.         call rndbottomcoords ;bc=x, de=y
  550.         SETANIM ANIM_APPEAR
  551.         ld (ix+obj_dir),1 ;a=dir
  552.         jp animate0_prepareregs
  553.        
  554. bulletlogic
  555.         ld ix,bulletlist-objsize
  556.         jr logic0
  557. logic
  558.         ld ix,objlist-objsize
  559. logic0
  560.         ld bc,objsize
  561.         add ix,bc
  562. logic0_afterdel
  563.         ld l,(ix+obj_objaddr)
  564.         ld h,(ix+(obj_objaddr+1)) ;hl=адрес описателя объекта (в начале лежит указатель на список анимаций)
  565.         inc hl
  566.         inc hl
  567.         jp (hl) ;hl=адрес обработчика объекта
  568.        
  569. rndbottomcoords
  570. ;out: bc=x, de=y
  571. rndbottomcoords_retry
  572.         call rndxcoord
  573.         ex de,hl
  574.         ld hl,0x02b0 ;y
  575.         PUTXDE_YHL
  576.         call checkobstacles_tank ;nc=препятствие
  577.         jr nc,rndbottomcoords_retry
  578.         ret
  579.  
  580. rndxcoord
  581. ;out: hl=x
  582.         ld c,fieldwid
  583.         call rnd
  584.         ld c,a
  585.         ld b,0
  586.         ld de,8*coordsfactor*3
  587.         call mulbcde
  588.         ld bc,4*coordsfactor
  589.         add hl,bc ;x
  590.         ret
  591.  
  592. delobj
  593. ;hl=адрес указателя на конец списка (на терминатор)
  594. ;копируем из ix+objsize в ix
  595.         ld (delobj_curlistend1),hl
  596.         ld (delobj_curlistend2),hl
  597.         ld c,(hl)
  598.         inc hl
  599.         ld b,(hl) ;указатель на конец списка (на терминатор)
  600.         ld hl,objsize
  601.         add hl,bc
  602.         ld b,h
  603.         ld c,l ;указатель на конец списка (после объекта-терминатора)
  604.         ld d,hx
  605.         ld e,lx ;de=ix
  606.         ld a,e
  607.         add a,objsize
  608.         ld l,a
  609.         adc a,d
  610.         sub l
  611.         ld h,a ;hl=ix+objsize
  612.         ld a,c
  613.         sub l
  614.         ld c,a
  615.         ld a,b
  616.         sbc a,h
  617.         ld b,a ;bc=objlistend-hl
  618.         ld a,b
  619.         or c
  620.         ret z ;почему удаляем терминатор после встречи двух пуль??? TODO
  621.         ldir ;копируем все следующие объекты, включая терминатор
  622. delobj_curlistend1=$+1
  623.         ld hl,(curobjlistend)
  624.         ld bc,-objsize
  625.         add hl,bc
  626. delobj_curlistend2=$+1
  627.         ld (curobjlistend),hl
  628.         push ix
  629.         call fillcollisionmap
  630.         pop ix
  631.         ret
  632.        
  633. movetank
  634.         ld a,(ix+obj_anim)
  635.         cp ANIM_GO
  636.         ret nz
  637. moveobj
  638.         GETXDE_YHL
  639.         ld b,(ix+obj_speed)
  640.         ld c,(ix+obj_dir)
  641.         inc c
  642.         dec c
  643.         call z,moveobj_u
  644.         dec c
  645.         call z,moveobj_r
  646.         dec c
  647.         call z,moveobj_d
  648.         dec c
  649.         call z,moveobj_l
  650.         PUTXDE_YHL
  651.         ret
  652. moveobj_u
  653.         dec hl
  654.         djnz $-1
  655.         ret
  656. moveobj_r
  657.         inc de
  658.         djnz $-1
  659.         ret
  660. moveobj_d
  661.         inc hl
  662.         djnz $-1
  663.         ret
  664. moveobj_l
  665.         dec de
  666.         djnz $-1
  667.         ret
  668.  
  669. objtank
  670.         dw anims_tank
  671. objtank_move
  672.         GETXDE_YHL
  673.         push de
  674.         push hl
  675.         call movetank
  676.         call checkobstacles_tank ;nc=коллизия
  677.         jr nc,objtank_collided
  678.         ld c,tanksize ;размер
  679.         call checkwalls ;nc=стена
  680.         ;TODO как-то воткнуть checkwalls в moveobj, но не в ущерб пулям
  681. objtank_collided
  682.         pop hl
  683.         pop de
  684.         jp c,logic0 ;не стена
  685.         PUTXDE_YHL ;стена - восстановим старые координаты
  686.         jp logic0
  687.  
  688. objtanke
  689.         dw anims_tanke
  690.         dec (ix+obj_gundelaycounter)
  691.         jr nz,objtanke_nogundelaystop
  692.         inc (ix+obj_gundelaycounter)
  693.         ld a,(ix+obj_anim)
  694.         cp ANIM_PREPARESHOOT
  695.         jr nz,objtanke_noshoot
  696.         push ix
  697.         call shoot
  698.         pop ix
  699.         ld (ix+obj_gundelaycounter),50
  700.         jr objtanke_stop
  701. objtanke_noshoot
  702. objtanke_nogundelaystop
  703.         ld a,(ix+obj_anim)
  704.         cp ANIM_DIE
  705.         jp z,objtanke_nologic
  706. ;логика должна срабатывать, когда мы стоим посредине клетки ((x&(8*coordsfactor-1)) == 4*coordsfactor, (y&(8*coordsfactor-1)) == 4*coordsfactor)
  707.         call checkevencoords ;nz=не посредине клетки
  708.         jp nz,objtanke_nologic
  709. ;едем энное растояние, потом случайно меняем направление или встаём
  710.         dec (ix+obj_delaycounter)
  711.         jr nz,objtanke_nonewmove
  712.         ld (ix+obj_delaycounter),20
  713.         ld c,5
  714.         call rnd
  715.         cp 4
  716.         jr z,objtanke_stop
  717.         ld (ix+obj_dir),a
  718.         SETANIM ANIM_GO
  719.         jr objtanke_nonewmove
  720. objtanke_stop
  721.         SETANIM ANIM_STOP
  722. objtanke_nonewmove
  723. ;если одна из координат близка к нашей (x-(tanksize/2*coordsfactor) > xe >= x+(tanksize/2*coordsfactor)), то встать, задержать и стрелять
  724.         GETXDE_YHL
  725.         push hl ;y
  726.         ld hl,(objlist+obj_x) ;наша координата
  727.         ld bc,-(tankaimsize/2*coordsfactor)
  728.         add hl,bc
  729.         or a
  730.         sbc hl,de ;надо -tanksize*coordsfactor..-1
  731.         ld bc,tankaimsize*coordsfactor
  732.         add hl,bc ;cy=координата близка к нашей
  733.         pop hl ;y
  734.         ex de,hl ;de=y, hl=x
  735.         jr z,$+4
  736.         jr nc,objtanke_noprepareshootx
  737.         ld hl,(objlist+obj_y) ;наша координата
  738.         or a
  739.         sbc hl,de ;y >= ye? тогда d, иначе u
  740.         ld a,2 ;d
  741.         jr nc,$+4 ;y >= xe
  742.         ld a,0 ;u
  743.         ld (ix+obj_dir),a
  744.         jr objtanke_prepareshoot
  745. objtanke_noprepareshootx
  746.         push hl ;x
  747.         ld hl,(objlist+obj_y) ;наша координата
  748.         ld bc,-(tankaimsize/2*coordsfactor)
  749.         add hl,bc
  750.         or a
  751.         sbc hl,de ;надо -tanksize*coordsfactor..-1
  752.         ld bc,tankaimsize*coordsfactor
  753.         add hl,bc ;cy=координата близка к нашей
  754.         pop de ;x
  755.         jr z,$+4
  756.         jr nc,objtanke_noprepareshoot
  757.         ld hl,(objlist+obj_x) ;наша координата
  758.         or a
  759.         sbc hl,de ;x >= xe? тогда r, иначе l
  760.         ld a,1 ;r
  761.         jr nc,$+4 ;x >= xe
  762.         ld a,3 ;l
  763.         ld (ix+obj_dir),a
  764. objtanke_prepareshoot
  765.         SETANIM ANIM_PREPARESHOOT
  766.         ;ld (ix+obj_delaycounter),1
  767. objtanke_noprepareshoot
  768. objtanke_nologic
  769.         jp objtank_move
  770.  
  771. objbullet
  772.         dw 0
  773.         call moveobj
  774.         ld c,0 ;размер
  775.         call checkwalls ;nc=стена
  776.         jp c,logic0 ;не стена
  777.         ld hl,curbulletlistend
  778.         call delobj ;копируем из ix+objsize в ix
  779.         ld bc,-objsize
  780.         add ix,bc
  781.         jp logic0
  782.        
  783. bulletcollision
  784.         ld ix,bulletlist-objsize
  785.         ld ly,-(128-1)
  786. bulletcollision0
  787.         dec ly
  788.         ld bc,objsize
  789.         add ix,bc
  790. bulletcollision0_afterdel
  791.         ld a,(ix+(obj_x+1))
  792.         cp TERMINATOR
  793.         ret z
  794.         GETXDE_YHL
  795.         call calctilemapaddr_de_hl
  796.         ld a,(hl)
  797.         cp maxemptytile+1
  798.         jr nc,bulletcollision_collided
  799.         call calccollisionmapaddr
  800.         ld a,(hl)
  801.         add a,ly ;номер текущей пули ;CY=1 при совпадении
  802.         call nz,checkbulletcollision
  803.         jp c,bulletcollision0 ;не коллизия
  804. bulletcollision_delete
  805.         ld hl,curbulletlistend
  806.         call delobj ;копируем из ix+objsize в ix
  807.         jp bulletcollision0_afterdel
  808. bulletcollision_collided
  809.         ;ld c,l
  810.         GETXDE_YHL
  811.         push hl
  812.         ex de,hl
  813.         ld a,(ix+obj_dir)
  814.         rra ;nc=vertical direction
  815.         ccf
  816.         call divmul3 ;hl=x клетки карты
  817.         ex (sp),hl ;сохранили x клетки карты ;hl=y
  818.         ld a,(ix+obj_dir)
  819.         rra ;nc=vertical direction
  820.         call divmul3 ;hl=y клетки карты
  821.         pop bc ;x клетки карты
  822.         ld b,l ;y клетки карты
  823.         ld a,c
  824.         call calctilemapaddr_a_l
  825.         ld a,(ix+obj_dir)
  826.         dec a
  827.         jr z,objbullet_collided_ver ;r
  828.         dec a
  829.         jr z,objbullet_collided_hor ;d
  830.         dec a
  831.         jr z,objbullet_collided_ver ;l
  832.                                     ;u
  833. objbullet_collided_hor
  834.         call degradetile
  835.         inc c
  836.         inc hl
  837.         call degradetile
  838.         inc c
  839.         inc hl
  840.         call degradetile
  841.         jp bulletcollision_delete
  842. objbullet_collided_ver
  843.         ld de,tilemaplinesize
  844.         call degradetile
  845.         inc b
  846.         add hl,de
  847.         call degradetile
  848.         inc b
  849.         add hl,de
  850.         call degradetile
  851.         jp bulletcollision_delete
  852.        
  853. divmul3
  854. ;если CY=1, то делим до знакомест и округляем до 3
  855. ;иначе просто делим до знакомест
  856.         ld de,8*coordsfactor
  857.         jp nc,divhlde ;hl=x(y) клетки карты (без округления)
  858.         ld de,8*coordsfactor*3
  859.         call divhlde ;hl=x(y) клетки поля
  860.         ld c,l
  861.         ld b,h
  862.         add hl,hl
  863.         add hl,bc
  864.         ret ;hl=x(y) клетки карты
  865.  
  866. degradetile
  867. ;bc=yx клетки карты
  868. ;hl=tilemap+
  869.         ;push bc
  870.         push de
  871.         ;push hl
  872.         call degradetile_changetile
  873.         call calcscrbufaddr ;de=scrbuf+
  874.         call restoretile
  875.         ;pop hl
  876.         pop de
  877.         ;pop bc
  878.         ret
  879. degradetile_changetile
  880.         ld a,(hl)
  881.         cp tilem
  882.         ret z
  883.         cp tileb
  884.         ld (hl),tile0
  885.         ret z
  886.         cp tilec
  887.         ld (hl),tileb
  888.         ret z
  889.         ld (hl),tile0
  890.         ret
  891.        
  892. objterminator
  893.         dw 0
  894.         ret
  895.  
  896. decreaselives
  897. lives=$+1
  898.         ld a,0
  899.         dec a
  900.         ld (lives),a
  901.         push af
  902.         call prlives
  903.         pop af
  904.         ret nz
  905.        
  906. gameover    
  907. fieldEx=32
  908. fieldEy=24
  909. centr=(fieldEx/2)-(10/2)+(256*fieldEy/2)
  910. ;bc=yx
  911. ;a=фон
  912. ;d=y координата левого верхнего угла
  913. ;е=х координата левого верхнего угла
  914. ;0x5800+xcoordredbox+(32*ycoordredbox)
  915.         ld c,12
  916.         ld b,3
  917.         ld de,centr-0x0101
  918.         ld a,0x57        
  919.         ld (curattr),a
  920.         call attrbox
  921.         ld hl,endtext
  922.         ld bc,centr
  923.         call prtext
  924. gameoverloop
  925.         YIELD
  926.         GET_KEY
  927.         cp key_esc
  928.         jr nz,gameoverloop
  929. quit
  930.         QUIT
  931.  
  932. endtext
  933.         db "Game over!",0
  934.  
  935. font
  936.         incbin "zx.fnt"
  937.        
  938.         include "collisio.asm"
  939.         include "tankgfx.asm"
  940.         include "tankdata.asm"
  941.         include "math.asm"
  942.         include "input.asm"
  943.  
  944. nlevel
  945.         db 0 ;1..
  946. nenemies
  947.         db 0
  948. end
  949.  
  950. reobjlist
  951.         ds 2*(maxobjects+1)
  952. rebulletlist
  953.         ds 2*(maxbullets+1)
  954.  
  955. objlist
  956.         ds objsize*(maxobjects+1)
  957. objlistend
  958.        
  959. bulletlist
  960.         ds objsize*(maxbullets+1)
  961. bulletlistend
  962.  
  963.  
  964.         ;display "End=",end
  965.         ;display "Free after end=",/d,0xc000-end
  966.         ;display "Size ",/d,end-begin," bytes"
  967.        
  968.         savebin "tank.com",begin,end-begin
  969.        
  970.         ;LABELSLIST "..\us\user.l"
  971.