Subversion Repositories NedoOS

Rev

Rev 77 | Rev 289 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

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