?login_element?

Subversion Repositories NedoOS

Rev

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

  1. objectslogic
  2.         ld a,(pgmetatilemap)
  3.         SETPGC000
  4.  
  5.         ld ix,objects
  6. objectslogic0
  7.         ld a,(ix+obj.y16+1)
  8.         cp DELETEDYHIGH
  9.         jp z,objectslogic0_skip
  10.  
  11.         ld l,(ix+obj.animaddr16+0)
  12.         ld h,(ix+obj.animaddr16+1)
  13.         ld e,(hl)
  14.         inc hl
  15.         ld d,(hl) ;de = phase
  16.         inc hl
  17.         dec (ix+obj.animtime)
  18.         jr nz,logic_nonextphase
  19.         ld a,(hl) ;new animtime
  20.         inc hl
  21.         ld (ix+obj.animtime),a
  22.         ld e,(hl)
  23.         inc hl
  24.         ld d,(hl) ;de = phase
  25.         ld a,d
  26.         cp 0xc0
  27.         jr nc,logic_nocycleanim
  28.         ex de,hl
  29.         ;ld e,(hl)
  30.         inc hl
  31.         ;ld d,(hl) ;de = phase (>=0xc000) or new animaddr (<0xc000)
  32. logic_nocycleanim
  33.         dec hl
  34.         ld (ix+obj.animaddr16+0),l
  35.         ld (ix+obj.animaddr16+1),h
  36. logic_nonextphase
  37.  
  38.         ld l,(ix+obj.xspeed16+0)
  39.         ld h,(ix+obj.xspeed16+1)
  40.         ld e,(ix+obj.x16+0)
  41.         ld d,(ix+obj.x16+1)
  42.         add hl,de
  43.         ld (ix+obj.x16+0),l
  44.         ld (ix+obj.x16+1),h
  45.         ld l,(ix+obj.yspeed16+0)
  46.         ld h,(ix+obj.yspeed16+1)
  47.         inc hl
  48.         inc hl
  49.         inc hl
  50.         inc hl ;gravity
  51.          ld a,h
  52.          rla
  53.          jr c,gravityok
  54.          ld de,8*YSUBPIX8
  55.          or a
  56.          sbc hl,de
  57.          add hl,de
  58.          jr c,gravityok
  59.          ex de,hl
  60. gravityok
  61.         ld (ix+obj.yspeed16+0),l
  62.         ld (ix+obj.yspeed16+1),h
  63.         ex de,hl ;de=yspeed
  64.        
  65.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  66.         ld h,(ix+obj.y16+1)
  67.         bit 7,(ix+obj.flags)
  68.         jr nz,logic_nocheckfloor
  69. ;check floor
  70.         push de ;yspeed
  71.         push hl ;y
  72.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  73.         ld b,(ix+obj.x16+1)
  74.          ld de,32*YSUBPIX8
  75.          add hl,de ;координата прямо под ногами
  76.         call gettile_bycoords
  77.         pop hl ;yspeed
  78.         pop bc ;y
  79.           ;ld c,(ix+obj.y16+0)
  80.           ;ld b,(ix+obj.y16+1)
  81.           add hl,bc
  82.         cp FIRSTSOLIDTILE;32
  83.          res 0,(ix+obj.flags) ;not on floor
  84.         jr c,nofloor
  85.          cp FIRSTOBJTILE
  86.         jr nc,nofloor
  87.          set 0,(ix+obj.flags) ;not on floor
  88. ;выравнивание по y на 16(пикс)*YSUBPIX8
  89.         ld a,l
  90.         and 16*YSUBPIX8;128
  91.         ld l,a
  92.         ld (ix+obj.yspeed16+0),0
  93.         ld (ix+obj.yspeed16+1),0
  94.         jr floorok
  95. nofloor
  96.         push hl ;y16
  97.  
  98.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  99.         ld h,(ix+obj.y16+1)
  100.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  101.         ld b,(ix+obj.x16+1)
  102.          ;ld de,0
  103.          ;add hl,de ;координата прямо в голове
  104.         call gettile_bycoords
  105.         cp FIRSTBETONTILE;64
  106.         pop hl ;y16
  107.         jr c,noceiling
  108. ;выравнивание по y на 16(пикс)*8 вверх
  109.         ld a,l
  110.         or 16*YSUBPIX8-1;127
  111.         ld l,a
  112.         inc hl
  113.         ld (ix+obj.yspeed16+0),0
  114.         ld (ix+obj.yspeed16+1),0        
  115. noceiling
  116. floorok
  117.         jr logic_checkfloorq
  118. logic_nocheckfloor
  119. ;hl=y
  120. ;de=yspeed
  121.         add hl,de
  122.         ld a,h
  123.         cp METATILEMAPHGT*16*YSUBPIX8/256
  124.         jr c,logic_nofalltohell
  125.         ld h,DELETEDYHIGH
  126. logic_nofalltohell
  127. logic_checkfloorq
  128.         ld (ix+obj.y16+0),l
  129.         ld (ix+obj.y16+1),h
  130. objectslogic0_skip
  131.         ld bc,OBJSIZE
  132.         add ix,bc
  133.         bit 7,(ix+obj.y16+1) ;yhigh
  134.         jp z,objectslogic0
  135.         ret
  136.  
  137. bulletslogic
  138.         ld a,(pgmetatilemap)
  139.         SETPGC000
  140.  
  141.         ld ix,bullets
  142. bulletslogic0
  143.         bit 7,(ix+obj.y16+1) ;yhigh
  144.         ret nz
  145.         ;jr $
  146. ;если health=1, то это мёртвая пуля, этот слот можно использовать
  147.         dec (ix+obj.health)
  148.         jr nz,bulletslogic_noremove
  149.         ld (ix+obj.y16+1),DELETEDYHIGH;0x7f ;yhigh
  150.         inc (ix+obj.health)
  151.         jp bulletslogic_skip        
  152. bulletslogic_noremove
  153.         ld l,(ix+obj.xspeed16+0)
  154.         ld h,(ix+obj.xspeed16+1)
  155.         ld e,(ix+obj.x16+0)
  156.         ld d,(ix+obj.x16+1)
  157.         add hl,de
  158.         ld (ix+obj.x16+0),l
  159.         ld (ix+obj.x16+1),h
  160.  
  161. ;TODO каждый второй фрейм
  162. ENEMYHGT=32*YSUBPIX8
  163. ENEMYWID=16*XSUBPIX8 ;(in double pixels)
  164. BULLETWID=8*XSUBPIX8 ;(in double pixels)
  165. ;TODO учесть размер врага
  166. ;попали, если enemyy<=bullety<=enemyy+ENEMYHGT и enemyx-BULLETWID<=bulletx<=enemyx+ENEMYWID
  167.          ;<--->
  168. ;   |------|
  169.  
  170. ;check enemy
  171.         ld e,(ix+obj.y16+0) ;*YSUBPIX8
  172.         ld d,(ix+obj.y16+1)
  173.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  174.         ld b,(ix+obj.x16+1)
  175.         ld a,d
  176.         cp DELETEDYHIGH
  177.         jp z,bulletslogic_checkenemy0q
  178. ;de=bullety
  179. ;bc=bulletx
  180.         exx
  181.         ld bc,OBJSIZE
  182.         exx
  183.         ld iy,objects+obj.sz
  184. bulletslogic_checkenemy0
  185.         bit 7,(iy+obj.y16+1) ;yhigh
  186.         jr nz,bulletslogic_checkenemy0q
  187. ;enemyx-BULLETWID<=bulletx<=enemyx+ENEMYWID
  188. ;-BULLETWID<=bulletx-enemyx<=ENEMYWID
  189. ;-(ENEMYWID+BULLETWID)<=enemyx-bulletx-BULLETWID<=0
  190.         ld l,(iy+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  191.         ld h,(iy+obj.x16+1) ;enemyx
  192.         ;ld a,l
  193.         ;sub BULLETWID
  194.         ;ld l,a
  195.         ;jr nc,$+3
  196.         ;dec h
  197.         or a
  198.         sbc hl,bc ;bc=bulletx
  199.         jr nc,bulletslogic_checkenemy_skip
  200.         ld a,l
  201.         add a,ENEMYWID;+BULLETWID
  202.         ld l,a
  203.         jr nc,bulletslogic_checkenemy_skip
  204.         inc h
  205.         jr nz,bulletslogic_checkenemy_skip
  206. bulletslogic_checkenemy_xok
  207. ;enemyy<=bullety<=enemyy+ENEMYHGT?
  208. ;0<=bullety-enemyy<=ENEMYHGT?
  209. ;-ENEMYHGT<=enemyy-bullety<=0?
  210.         ld l,(iy+obj.y16+0) ;*YSUBPIX8
  211.         ld h,(iy+obj.y16+1) ;enemyy
  212.         or a
  213.         sbc hl,de ;de=bullety
  214.         jr nc,bulletslogic_checkenemy_skip
  215.         ld a,l
  216.         add a,ENEMYHGT-1
  217.         ld l,a
  218.         jr nc,bulletslogic_checkenemy_skip
  219.         inc h
  220.         jr nz,bulletslogic_checkenemy_skip
  221. bulletslogic_checkenemy_yok
  222. ;попали!!!
  223.         ld (ix+obj.y16+1),DELETEDYHIGH ;уничтожаем пулю
  224. ;отнимаем энергию
  225.         ld a,(iy+obj.health)
  226.         sub 10
  227.         ld (iy+obj.health),a
  228.          ld a,9
  229.         jr nc,bulletslogic_enemyfound_notdead
  230.         set 7,(iy+obj.flags) ;dead
  231.         ld (iy+obj.yspeed16+0),-8*YSUBPIX8
  232.         ld (iy+obj.yspeed16+1),-1
  233.         ld (iy+obj.xspeed16+0),2*XSUBPIX8
  234.         ld (iy+obj.xspeed16+1),0
  235.          ld a,10 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  236. bulletslogic_enemyfound_notdead
  237.         push bc
  238.         push de
  239.          call sfxplay
  240.         pop de
  241.         pop bc
  242. bulletslogic_checkenemy_skip
  243.         exx
  244.         add iy,bc
  245.         exx
  246.         jr bulletslogic_checkenemy0
  247. bulletslogic_checkenemy0q
  248. ;~check enemy
  249.        
  250. ;check wall
  251.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  252.         ld h,(ix+obj.y16+1)
  253.           ld c,(ix+obj.yspeed16+0)
  254.           ld b,(ix+obj.yspeed16+1)
  255.           add hl,bc
  256.         push hl
  257.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  258.         ld b,(ix+obj.x16+1)
  259.          ld a,c
  260.          ;add a,2*XSUBPIX8
  261.          sub 6*XSUBPIX8
  262.          ld c,a
  263.          ;adc a,b
  264.          ;sub c
  265.          ld a,b
  266.          sbc a,0
  267.          ld b,a
  268.         call gettile_bycoords
  269.         ;inc l
  270.         ;ld a,(hl)
  271.         pop hl
  272.         sub FIRSTBETONTILE;32
  273.         cp FIRSTOBJTILE-FIRSTBETONTILE
  274.         jr nc,bulletslogic_nocrash
  275.         ld h,DELETEDYHIGH ;удалить
  276.         ld (ix+obj.xspeed16+0),0
  277.         ld (ix+obj.xspeed16+1),0
  278.         ld (ix+obj.yspeed16+0),0
  279.         ld (ix+obj.yspeed16+1),0
  280. bulletslogic_nocrash
  281.         ld (ix+obj.y16+0),l
  282.         ld (ix+obj.y16+1),h
  283. bulletslogic_skip
  284.         ld bc,OBJSIZE
  285.         add ix,bc
  286.         jp bulletslogic0
  287.  
  288. fire
  289. genbullet
  290. ;сначала найдём пустые места в списке пуль (т.е. где yhigh==0x7f)
  291. ;если таких нет, то добавляем в конец
  292.         ld iy,bullets
  293. genbullet_findempty0
  294.         bit 7,(iy+obj.y16+1) ;yhigh
  295.         jr nz,genbullet_findempty0q
  296.         ld a,(iy+obj.y16+1) ;yhigh
  297.         cp DELETEDYHIGH
  298.         jr z,genbullet_struct
  299.         ld bc,OBJSIZE
  300.         add iy,bc
  301.         jr genbullet_findempty0
  302. genbullet_findempty0q
  303.         ;jr $
  304. curbulletlistend=$+2
  305.         ld iy,bullets
  306.         push iy
  307.         ld de,-bulletlistend
  308.         add iy,de
  309.         pop iy
  310.         ret c ;no room
  311.  
  312.         call genbullet_struct
  313.         ld bc,OBJSIZE
  314.         add iy,bc
  315. genbullet_terminate
  316.         ld (curbulletlistend),iy
  317.         ld (iy+obj.y16+1),-1
  318.         ret
  319.  
  320. BULLETSPEED=MAXSPEED ;(in double pixels)
  321. genbullet_struct
  322.          ld a,1 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  323.          call sfxplay
  324.          
  325.          ld a,(lastdir) ;0=right
  326.          or a
  327.          ld de,BULLETSPEED;4
  328.          jr z,$+5
  329.          ld de,-BULLETSPEED;4
  330.          ld (iy+obj.xspeed16),e
  331.          ld (iy+obj.xspeed16+1),d
  332.  
  333.          ld de,bulletanim_right
  334.          jr z,$+5
  335.          ld de,bulletanim_left
  336.         ld (iy+obj.animaddr16),e
  337.         ld (iy+obj.animaddr16+1),d
  338.         ld (iy+obj.animtime),1
  339.         ld (iy+obj.health),100
  340.         ld a,(ix+obj.x16)
  341.         add a,4*XSUBPIX8
  342.         ld (iy+obj.x16),a
  343.         ld a,(ix+obj.x16+1)
  344.         adc a,0
  345.         ld (iy+obj.x16+1),a
  346.         ld a,(ix+obj.y16)
  347.         add a,16*YSUBPIX8
  348.         ld (iy+obj.y16),a
  349.         ld a,(ix+obj.y16+1)
  350.         adc a,0
  351.         ld (iy+obj.y16+1),a
  352.         xor a
  353.         ld (iy+obj.yspeed16),a
  354.         ld (iy+obj.yspeed16+1),a
  355.         ld (iy+obj.flags),a
  356.         ret
  357.        
  358.  
  359. logic
  360.         call objectslogic
  361.         call bulletslogic
  362.         call herocontrol
  363.         ret
  364.        
  365. ;hero control
  366. herocontrol
  367. joystate=$+1
  368. oldjoystate=$+2
  369.         ld bc,0
  370.         ld a,c
  371.         ld (oldjoystate),a
  372.         xor b
  373.         ld b,a
  374. ;bit - button (ZX key)
  375. ;7 - A (A)
  376. ;6 - B (S)
  377. ;5 - Select (Space)
  378. ;4 - Start (Enter)
  379. ;3 - Up (7)
  380. ;2 - Down (6)
  381. ;1 - Left (5)
  382. ;0 - Right (8)
  383.         bit 6,c
  384.         push bc
  385.         call nz,kick
  386.         pop bc
  387.         bit 5,c
  388.         jr z,nofire
  389.         bit 5,b
  390.         jr z,nofire
  391.         push bc
  392.         ld ix,objects
  393.         call fire
  394.         pop bc
  395. nofire
  396.  
  397.         ld ix,objects
  398.         ld l,(ix+obj.xspeed16+0)
  399.         ld h,(ix+obj.xspeed16+1)
  400.         bit 1,c
  401.         jr z,noleft
  402.         ld a,h
  403.         or a
  404.         jp m,nostartrunleft
  405.         ld a,1
  406.         ld (lastdir),a
  407.          ld de,heroanim_runleft
  408.         ld (ix+obj.animaddr16+0),e
  409.         ld (ix+obj.animaddr16+1),d
  410. nostartrunleft
  411.         ld de,-1
  412.         add hl,de
  413.         ld de,-MAXSPEED
  414.         or a
  415.         sbc hl,de
  416.         ld a,h
  417.         add hl,de
  418.         or a
  419.         jr z,leftq
  420.         ex de,hl
  421.         jr leftq
  422. noleft
  423.         bit 0,c
  424.         jr z,noright
  425.         ld a,h
  426.         or a
  427.         jp m,startrunright
  428.         or l
  429.         jr nz,nostartrunright
  430. startrunright
  431.         xor a
  432.         ld (lastdir),a
  433.          ld de,heroanim_runright
  434.         ld (ix+obj.animaddr16+0),e
  435.         ld (ix+obj.animaddr16+1),d
  436. nostartrunright
  437.         ld de,1
  438.         add hl,de
  439.         ld de,MAXSPEED
  440.         or a
  441.         sbc hl,de
  442.         ld a,h
  443.         add hl,de
  444.         or a
  445.         jr nz,leftq
  446.         ex de,hl
  447.         jr leftq
  448. noright
  449.          bit 0,(ix+obj.flags) ;on floor?
  450.          jr z,leftq ;не тормозим на лету
  451.         ld a,h
  452.         or l
  453.         ld e,a
  454.          bit 7,h
  455.          jr z,$+3
  456.          inc hl
  457.          sra h
  458.          rr l
  459.          ld a,h
  460.          or l
  461.          jr nz,leftq
  462.          ld a,e
  463.          or a
  464.          jr z,leftq ;уже стояли
  465. lastdir=$+1
  466.          ld a,0 ;/1
  467.          or a
  468.          ld de,heroanim_standright
  469.          jr z,$+5
  470.          ld de,heroanim_standleft
  471.         ld (ix+obj.animaddr16+0),e
  472.         ld (ix+obj.animaddr16+1),d
  473. leftq
  474.         ld (ix+obj.xspeed16+0),l
  475.         ld (ix+obj.xspeed16+1),h
  476. ;проверить, что не въехали в стену в текущем направлении и отскочить
  477.        push bc
  478.         bit 7,h
  479.         jp nz,checkleftwall
  480.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  481.         ld h,(ix+obj.y16+1)
  482.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  483.         ld b,(ix+obj.x16+1)
  484.          ld de,16*YSUBPIX8
  485.          add hl,de ;координата на уровне пояса
  486.         call gettile_bycoords
  487.         dec l
  488.         ld a,(hl) ;правее центра
  489.         cp FIRSTBETONTILE;64
  490.         jp c,checkleftwallq ;not beton
  491.          cp FIRSTOBJTILE
  492.          jr nc,checkwall_obj
  493. ;врезались справа, выравниваем x = (x&0xf0) - 1
  494.          ld de,heroanim_standright
  495.         ld (ix+obj.animaddr16+0),e
  496.         ld (ix+obj.animaddr16+1),d
  497.          ld (ix+obj.xspeed16+0),0
  498.          ld (ix+obj.xspeed16+1),0
  499.         ld l,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  500.         ld h,(ix+obj.x16+1)
  501.         ld a,l
  502.         and -8*XSUBPIX8
  503.         ld l,a
  504.         dec hl
  505.         ld (ix+obj.x16+0),l ;*XSUBPIX8 (in double pixels)
  506.         ld (ix+obj.x16+1),h        
  507.         jp checkleftwallq
  508. checkwall_obj
  509. ;берём объект!!!
  510.         ld (hl),0
  511.         ex de,hl
  512.         push de
  513.          ld a,3 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  514.          call sfxplay
  515.          
  516. ;нельзя восстанавливать графику в течение 2 следующих отрисовок
  517.         ld a,2+1
  518.         ld (skipfastredraws),a
  519.          
  520.         pop de
  521.        
  522.         ;call uvscroll_filltilemap
  523.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  524. ;de=тайл, который мы только что изменили
  525. ;мы должны пропустить по y ровно столько строчек, чтобы hl пересёк тот тайл, который мы только что изменили
  526.  
  527.         ld a,d
  528.         sub h ;a=y
  529.         cp TILEMAPHGT/2
  530.         jr nc,getobjnofill
  531.        
  532.         ;ld a,3 ;y по умолчанию
  533.        
  534.         ;push af
  535.         ;add a,h
  536.         ;ld h,a ;hl=metatilemap+
  537.         ;pop af
  538.         ld h,d
  539.         push af ;y
  540.        
  541.         ex de,hl
  542.         ld hl,TILEMAP
  543.         ld bc,TILEMAPWID*2
  544.         or a
  545.         jr z,getobjfill0q
  546. getobjfill0
  547.         add hl,bc
  548.         dec a
  549.         jr nz,getobjfill0
  550. getobjfill0q
  551.         ex de,hl
  552.         call uvscroll_filltilemap_line
  553.        
  554.         ;call uvscroll_showtilemap
  555.         call uvscroll_showtilemap_counthlde
  556.         pop af ;y
  557.         or a
  558.         jr z,getobjshow0q
  559.         ld b,a
  560. getobjshow0
  561.         push bc
  562.         ld bc,16*(UVSCROLL_WID/512)
  563.         add hl,bc ;y*(UVSCROLL_WID/512) ;allscroll+...
  564.         ex de,hl
  565.         ld bc,TILEMAPWID*2
  566.         add hl,bc ;tilemap+...
  567.         ex de,hl
  568.         pop bc
  569.         djnz getobjshow0
  570. getobjshow0q
  571.         ld b,1
  572.         call uvscroll_showtilemap_b
  573. getobjnofill
  574.         jr checkleftwallq
  575. checkleftwall
  576.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  577.         ld h,(ix+obj.y16+1)
  578.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  579.         ld b,(ix+obj.x16+1)
  580.          ld de,16*YSUBPIX8
  581.          add hl,de ;координата на уровне пояса
  582.         call gettile_bycoords
  583.         inc l
  584.         ld a,(hl) ;левее центра
  585.         cp FIRSTBETONTILE;64
  586.         jr c,checkleftwallq ;not beton
  587.          cp FIRSTOBJTILE
  588.          jr nc,checkwall_obj
  589. ;врезались слева, выравниваем x = (x+15)&0xf0
  590.          ld de,heroanim_standleft
  591.         ld (ix+obj.animaddr16+0),e
  592.         ld (ix+obj.animaddr16+1),d
  593.          ld (ix+obj.xspeed16+0),0
  594.          ld (ix+obj.xspeed16+1),0
  595.         ld l,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  596.         ld h,(ix+obj.x16+1)
  597.         ld bc,8*XSUBPIX8-1
  598.         add hl,bc
  599.         ld a,l
  600.         and -8*XSUBPIX8
  601.         ld l,a
  602.         ld (ix+obj.x16+0),l ;*XSUBPIX8 (in double pixels)
  603.         ld (ix+obj.x16+1),h
  604.  
  605. checkleftwallq
  606.        pop bc
  607.  
  608.         ld l,(ix+obj.yspeed16+0)
  609.         ld h,(ix+obj.yspeed16+1)
  610.         bit 7,c
  611.         jr z,nojump
  612.         bit 7,b
  613.         jr z,nojump ;не изменилась кнопка
  614.        
  615. ;check floor
  616.         bit 0,(ix+obj.flags) ;on floor
  617.         jr z,nojump
  618.  
  619.         ld hl,-60
  620.         ld (ix+obj.yspeed16+0),l
  621.         ld (ix+obj.yspeed16+1),h
  622.         ld e,(ix+obj.y16+0)
  623.         ld d,(ix+obj.y16+1)
  624.         add hl,de
  625.         ld (ix+obj.y16+0),l
  626.         ld (ix+obj.y16+1),h
  627.        
  628.        
  629. nojump
  630.  
  631.         ret
  632.  
  633. KICKDIST_X=8*XSUBPIX8
  634. KICKDIST_Y=32*YSUBPIX8
  635. kick
  636. ;герой толкает ближайшего врага
  637.         ld ix,objects
  638.         ld l,(ix+obj.x16+0)
  639.         ld h,(ix+obj.x16+1)
  640.         ld e,(ix+obj.y16+0)
  641.         ld d,(ix+obj.y16+1)
  642.        
  643.         ld ix,objects+OBJSIZE
  644. kick0
  645.         bit 7,(ix+obj.y16+1) ;yhigh
  646.         ret nz
  647.         push de
  648.         push hl
  649.         ld c,(ix+obj.x16+0)
  650.         ld b,(ix+obj.x16+1)
  651.         or a
  652.         sbc hl,bc
  653.         ld bc,KICKDIST_X
  654.         add hl,bc
  655.         ld bc,KICKDIST_X*2
  656.         or a
  657.         sbc hl,bc
  658.         jr nc,kick_xskip
  659.         ex de,hl
  660.         ld c,(ix+obj.y16+0)
  661.         ld b,(ix+obj.y16+1)
  662.         or a
  663.         sbc hl,bc
  664.         ld bc,KICKDIST_Y
  665.         add hl,bc
  666.         ld bc,KICKDIST_Y*2
  667.         or a
  668.         sbc hl,bc
  669.         jr nc,kick_xskip
  670.          ld a,11 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  671.          call sfxplay
  672.         pop hl
  673.         pop de
  674.         ld (ix+obj.yspeed16+0),-80
  675.         ld (ix+obj.yspeed16+1),-1
  676.         ld (ix+obj.xspeed16+0),8
  677.         ld (ix+obj.xspeed16+1),0
  678.         ret
  679. kick_xskip
  680.         pop hl
  681.         pop de
  682.  
  683.         ld bc,OBJSIZE
  684.         add ix,bc
  685.         jp kick0
  686.  
  687. gettile_bycoords
  688.         dup 3
  689.         srl h
  690.         rr l
  691.         edup
  692.         dup 4
  693.         add hl,hl
  694.         edup
  695.         dup 3
  696.         srl b
  697.         rr c
  698.         edup
  699.         dup 3
  700.         srl b
  701.         rr c
  702.         edup
  703.         ld a,c
  704.          sub 3
  705.         cpl
  706.         ld l,a
  707.         ld a,h
  708.          sub 3 ;проверять будем тайл в ногах, а не в голове
  709.         cpl
  710.         ld h,a
  711.         ld a,(hl) ;tile в ногах
  712.         ret
  713.