?login_element?

Subversion Repositories NedoOS

Rev

Rev 1111 | Blame | Compare with Previous | Last modification | View Log | Download

  1.         module OBJECTS
  2.  
  3. ;----------------------------------------------------------------
  4. draw:
  5.         ld hl,renderData
  6. .mLoop:
  7.         ld a,(hl)
  8.         cp #FF
  9.         ret z
  10.         push hl
  11.         ld ixh,a
  12.         inc hl
  13.         ld a,(hl)
  14.         ld ixl,a
  15.         or ixh
  16.         jr z,.nnn
  17.         ld a,(ix+oData.x)               ; X cannot be = 0, so the object is destroyed.
  18.         ;(this is not a valid solution and must be changed since the exit door may be on the left edge of the screen)
  19.         or a
  20.         jr z,.nnn
  21.         call .clear
  22.         ld e,(ix+oData.scrAddrL)        ; scr addr low
  23.         ld d,(ix+oData.scrAddrH)        ; scr addr high
  24.         push de
  25.         ld a,(ix+oData.needDraw)
  26.         or a
  27.         call z,.go
  28.         pop de
  29.         call .paint
  30. .nnn:
  31.         pop hl
  32.         inc hl
  33.         inc hl
  34.         jr .mLoop
  35. .go:   
  36.         ld a,d
  37.         or e
  38.         ret z
  39. .dStart:
  40.         ld l,(ix+oData.sprAddrL)        ; spr addr low
  41.         ld h,(ix+oData.sprAddrH)        ; spr addr high
  42.         ; FIXME draw method
  43. .draw:
  44.         ld a,(ix+oData.drawMethod)
  45.         or a
  46.         jp z,printSpr_scraddrDE
  47. .d3x2:
  48.         ld a,(ix+oData.bit)
  49.         or a
  50.         jp z,printSprite3x2as2x2
  51.         jp printSprite3x2
  52. .oneObject
  53.         call .clear
  54.         ld e,(ix+oData.scrAddrL)        ; scr addr low
  55.         ld d,(ix+oData.scrAddrH)        ; scr addr high
  56.         jr .dStart
  57. .paint:
  58.  
  59.         call scrAddrToAttrAddr
  60.         ex de,hl
  61.         ld a,(ix+oData.launchTime)
  62.         or a
  63.         jr nz,.normal           ; do not paint forward until started
  64.         ld a,(ix+oData.direction)
  65.         rrca
  66.         jr c,.normal
  67.         inc l
  68.         rrca
  69.         jr c,.normal
  70.         dec l
  71.         rrca
  72.         jr c,.normal
  73.         rrca
  74.         jr nc,.normal
  75.         ld bc,32
  76.         add hl,bc
  77. .normal:
  78.         ld a,(ix+oData.color)
  79.         jp fillAttr2x2
  80. .clear:
  81.         ld a,(ix+oData.accelerate)
  82.         cp 2
  83.         jr nc,.spriteTail
  84.         ; ╨Ъ╨Ю╨б╨в╨л╨Ы╨╨Э╨Р !!!!!!!!! clear after object stopped
  85.         ld a,(ix+oData.direction)
  86.         or a
  87.         ret nz
  88.         ld a,(ix+oData.clearSide)
  89.         or a
  90.         ret z
  91. ;       ex af,af
  92. ;       call SOUND_PLAYER.SET_SOUND.key
  93. ;       ex af,af
  94.         ld l,(ix+oData.scrAddrL)
  95.         ld h,(ix+oData.scrAddrH)       
  96.         inc hl
  97.         inc hl
  98.         rrca
  99.         jr c,.st        ; for clear right
  100.         dec hl
  101.         dec hl
  102.         dec hl
  103.         rrca
  104.         jr c,.st        ; for clear left
  105.         ex af,af
  106.         inc hl
  107.        if EGA
  108.         ld bc,16*40
  109.         add hl,bc
  110.        else
  111.         call nextLine16
  112.        endif
  113.         ex af,af
  114.         rrca
  115.         jr c,.st        ; for clear bottom
  116.         ex af,af
  117.         call preLine24
  118.         ex af,af
  119.         rrca
  120.        if EGA
  121.        else
  122.        endif
  123.         jr c,.st        ; for clear top
  124.         ret
  125. .spriteTail:
  126.         ld l,(ix+oData.clrScrAddrL)
  127.         ld h,(ix+oData.clrScrAddrH)
  128. .st:   
  129.  
  130.         ld a,(ix+oData.clearSide)
  131.         ld (ix+oData.clearSide),0
  132.         rrca
  133.         jr c,.clearHoriz
  134.         rrca
  135.         jr c,.clearHoriz
  136.         rrca
  137.         jr c,.clearVert
  138.         rrca
  139.         jr c,.clearVert
  140.         ret
  141.  
  142. .clearHoriz:
  143.        if EGA
  144.         jp clear1x2
  145.        else
  146.         ld b,2
  147.         ld de,32
  148. .clearHorizSides:
  149.         xor a
  150.         ld (hl),a
  151.         inc h
  152.         ld (hl),a
  153.         inc h
  154.         ld (hl),a
  155.         inc h
  156.         ld (hl),a
  157.         inc h
  158.         ld (hl),a
  159.         inc h
  160.         ld (hl),a
  161.         inc h
  162.         ld (hl),a
  163.         inc h
  164.         ld (hl),a
  165.         ld a,h
  166.         sub 7
  167.         ld h,a
  168.         add hl,de
  169.         djnz .clearHorizSides
  170.        endif
  171.         ret
  172. .clearVert:
  173.        if EGA
  174.         ret ;jp clear2x1
  175.        else
  176.         ld b,8
  177.         xor a
  178. .nLine:
  179.         ld (hl),a
  180.         inc l
  181.         ld (hl),a
  182.         dec l
  183.         inc h
  184.         djnz .nLine
  185.        endif
  186.         ret
  187. ;----------------------------------------------------------------
  188. getRenderDataAddress:
  189.         ; return D = positive or negative direction
  190.         ; return HL - renderData address (positive = renderData + MAX_OBJECTS * 2 - 2; negative = renderData)
  191.         ld hl,renderData
  192.         ld a,(global_direction)
  193.         and DIRECTION.LEFT or DIRECTION.UP
  194.         ld d,a          ; D = if (positive direction) #00 else #FF
  195.         ret nz
  196.         ld hl,renderData + (MAX_OBJECTS * 2) - 2
  197.         ret
  198. nextRenderAddress:
  199.         ; D - positive or negative direction
  200.         ld a,d
  201.         or a
  202.         jr z,.positive
  203.         inc hl
  204.         inc hl
  205.         ret
  206. .positive:
  207.         dec hl
  208.         dec hl
  209.         ret
  210. ;----------------------------------------------------------------
  211. disableIXObject:
  212.         ; HL - sound data address
  213.         ; BC - (pop-up info) execute address
  214.         ld a,(ix+oData.isDestroyed)
  215.         or a
  216.         ret z
  217.         rrca                    ; A = 1
  218.         jr c,.setDefault
  219.         rrca                   
  220.         ret nc
  221.         ; A = 2
  222. .fadeOut:
  223.         ld a,(ix+oData.delta)
  224.         sub 1
  225.         jr nc,.fo
  226.         call POP_UP_INFO.isFinish
  227.         ret nz
  228. ;       rrc (ix+oData.isDestroyed)
  229.         call clear2x2
  230.         ; reset object from object data map
  231.         jp resetObjectIX
  232. .fo:
  233.         ld (ix+oData.delta),a
  234.         ld a,(ix+oData.color)
  235.         dec a
  236.         ld (ix+oData.color),a
  237.         rrca
  238.         jr c,.fo2
  239.         or #40
  240. .fo2:
  241.         and %01001111
  242.         ld c,(ix+oData.cellId)
  243.         ex af,af
  244.         call getAttrAddrByCellId
  245.         ex af,af
  246.         ex de,hl
  247.         jp fillAttr2x2
  248. .setDefault:
  249.         push bc
  250.         call SOUND_PLAYER.init
  251.         call alignToCell
  252.         call draw.oneObject
  253.         rlc (ix+oData.isDestroyed)
  254.         ld (ix+oData.isMovable),0
  255.         ld (ix+oData.color),16
  256.         ld (ix+oData.delta),16
  257.         ld l,(ix+oData.cellId)
  258.         ld h,high levelCells
  259.         ld (hl),0
  260.         ret
  261.         ; go to pop-up info address
  262. ;----------------------------------------------------------------
  263. preDestructionOther:
  264.         ; HL - sound data
  265.         call SOUND_PLAYER.init
  266.         ld (iy+oData.isDestroyed),1
  267.         ld (iy+oData.isMovable),0
  268.         ld (iy+oData.color),7
  269.         ld l,(iy+oData.cellId)
  270.         jr dt
  271. preDestructionThis:
  272.         ; HL - sound data
  273.         call SOUND_PLAYER.init
  274.         ld (ix+oData.isDestroyed),1
  275.         ld (ix+oData.color),7
  276.         ld (ix+oData.isMovable),0
  277.         ld l,(ix+oData.cellId)
  278. dt:
  279.         ld h,high levelCells
  280.         ld (hl),0
  281.         ret
  282. ;----------------------------------------------------------------
  283. update:
  284.         BORDER 6
  285.         call sortObjects
  286.         BORDER 4
  287.         call getRenderDataAddress
  288. .loop
  289.         ld a,(hl)
  290.         or a
  291.         jr z,.n2
  292.         inc a
  293.         ret z
  294.         dec a
  295.         push hl
  296.         push de
  297.         ld ixh,a
  298.         inc hl
  299.         ld a,(hl)
  300.         ld ixl,a
  301.         call moveObject
  302.        if EGA
  303.         ld a,(ix+oData.direction)
  304.         or a
  305.         jr nz,.nostopobj
  306.         ld a,(ix+oData.x)
  307.         ld (ix+oData.preX),a
  308.         ld a,(ix+oData.y)
  309.         ld (ix+oData.preY),a
  310. .nostopobj
  311.        endif
  312.        
  313.         ld bc,.next
  314.         push bc
  315. ;       ; get execute
  316.         ld l,(ix+oData.exec)
  317.         ld a,(ix+oData.exec + 1)
  318.         ld h,a
  319.         or l
  320.         ret z
  321.         jp (hl)
  322. .next:
  323.         pop de
  324.         pop hl
  325. .n2:
  326.         call nextRenderAddress
  327.         jr .loop
  328. ;----------------------------------------------------------------
  329. isSameObject:
  330.         ld a,(iy+oData.spriteId)
  331.         cp (ix+oData.spriteId)
  332.         ret
  333. ;----------------------------------------------------------------
  334. sortObjects:
  335.         ld a,MAX_OBJECTS
  336.         ld de,testS
  337.         ld hl,objectsData+oData.cellId
  338.         ld bc,OBJECT_DATA_SIZE
  339. .sendCell:
  340.         ex af,af
  341.         ld a,(hl)
  342.         ld (de),a
  343.         inc de
  344.         add hl,bc
  345.         ex af,af
  346.         dec a
  347.         jr nz,.sendCell
  348.         call sortObjectIds      ; sorting cell IDs
  349.         ; clearing the buffer of object addresses for rendering
  350.         ld hl,renderData
  351.         ld de,renderData + 1
  352.         ld bc,(MAX_OBJECTS * 2) - 1
  353.         ld (hl),0
  354.         ldir
  355.  
  356.         ; creating addresses of objects for rendering: from left to right, top to bottom.
  357.         ld ix,objectsData
  358.         ld de,objectsData + oData.cellId
  359.         ld bc,MAX_OBJECTS * 256
  360. .mLoop:
  361.         push bc
  362.         push de
  363.         ld c,0
  364.         ld hl,testS - 1
  365.         ld a,(de)
  366.         or a
  367.         jr z,.skip
  368. .nextId:
  369.         inc hl
  370.         inc c
  371.         cp (hl)
  372.         jr nz,.nextId
  373.         dec c
  374.         ld a,c
  375.         rlca
  376.         add a,low renderData
  377.         ld l,a
  378.         adc a,high renderData
  379.         sub l
  380.         ld h,a
  381.         ld a,ixh
  382.         ld (hl),a
  383.         inc hl
  384.         ld a,ixl
  385.         ld (hl),a
  386. ;       ld bc,OBJECT_DATA_SIZE
  387. ;       add ix,bc
  388. .skip:
  389.         ld bc,OBJECT_DATA_SIZE
  390.         add ix,bc
  391.         pop hl
  392. ;       ld bc,OBJECT_DATA_SIZE
  393.         add hl,bc
  394.         ex de,hl
  395.         pop bc
  396.         djnz .mLoop
  397.         ret
  398. ;-------------------------------------------------------------------
  399. ;       Determines the initial movement of a moving object, if the direction of movement is not a wall, then it moves.
  400. identifyMovingObjects:
  401.         call getRenderDataAddress
  402.         ; HL > renderData address
  403.         ; D > positive or negative direction
  404.         ld c,0          ; launch time
  405. .loop:
  406.         ld a,(hl)
  407.         cp #FF
  408.         ret z
  409.         push hl
  410.         push de
  411.         ld ixh,a
  412.         inc hl
  413.         or (hl)
  414.         jr z,.next
  415.         ld a,(hl)
  416.         ld ixl,a
  417.         ld h,high levelCells
  418.         ld l,(ix+oData.cellId)
  419.         ld a,e
  420.         rrca
  421.         jr c,.checkLeft
  422.         rrca
  423.         jr c,.checkRight
  424.         rrca
  425.         jr c,.checkUp
  426.         rrca
  427.         ret nc
  428. .checkDown:
  429.         ld a,l
  430.         ld b,l
  431.         add MAP_WIDTH
  432.         ld l,a
  433.         ld a,(hl)
  434.         ld l,b
  435.         inc a
  436.         jr nz,.procced
  437. .next:
  438.         pop de
  439.         pop hl
  440.         call nextRenderAddress
  441.         jr .loop
  442. .checkLeft:
  443.         dec l
  444.         ld a,(hl)
  445.         inc l
  446.         inc a          
  447.         jr z,.next
  448.         jr .procced
  449. .checkRight:
  450.         inc l
  451.         ld a,(hl)
  452.         dec l
  453.         inc a          
  454.         jr z,.next
  455. ;       jr .procced
  456. .procced:
  457.         ld a,(ix+oData.isMovable)
  458.         or a
  459.         jr z,.next
  460.         ld (hl),0
  461.         ld (ix+oData.launchTime),c
  462.         ld (ix+oData.direction),e
  463.         ld a,c
  464.         add MAX_SPEED - 1
  465.         ld c,a
  466.         jr .next
  467. .checkUp:
  468.         ld a,l
  469.         ld b,l
  470.         sub MAP_WIDTH
  471.         ld l,a
  472.         ld a,(hl)
  473.         ld l,b
  474.         inc a
  475.         jr z,.next
  476.         jr .procced
  477. ;--------------------------------------------------------------------------
  478. collision:
  479.         ; return IY target object data address or IY = 0
  480.         ld iy,0
  481.         ld h,high levelCells
  482.         ld a,(ix+oData.direction)
  483.         or a
  484.         ret z
  485.         ld (ix+oData.clearSide),a
  486.         rrca
  487.         jr c,.moveNegative      ; to left
  488.         rrca
  489.         jr c,.moveRight         ; to right
  490.         rrca
  491.         jr c,.moveNegative      ; to up
  492.         rrca
  493.         ret nc
  494. .moveDown:
  495.         ld e,(ix+oData.x)
  496.         ld a,(ix+oData.y)
  497.         add MAP_WIDTH
  498.         ld d,a
  499.         jr .mr
  500. ;       call getCellIDByCoords
  501. ;       ld l,a
  502. ;       ld a,(hl)
  503. ;       inc a
  504. ;       jr z,alignToCellPositive        ; #FF > wall
  505. ;       dec a
  506. ;       ret z                   ; #00 > free way
  507. ;       jp getObjDataById       ; ID`s > #01-#0A convert to object data address
  508. .moveNegative:
  509.         ld e,(ix+oData.x)
  510.         ld d,(ix+oData.y)
  511.         call getCellIDByCoords
  512.         ld l,a
  513.         ld a,(hl)
  514.         inc a
  515.         jr z,alignToCellNegative        ; #FF > wall
  516.         dec a
  517.         ret z                   ; #00 > free way
  518.         jp getObjDataById       ; #01-#0A convert to object data address to IY
  519. .moveRight:
  520.         ld a,(ix+oData.x)
  521.         add 16
  522.         ld e,a
  523.         ld d,(ix+oData.y)
  524. .mr:
  525.         call getCellIDByCoords
  526.         ld l,a
  527.         ld a,(hl)
  528.         inc a
  529.         jr z,alignToCellPositive        ; #FF > wall
  530.         dec a
  531.         ret z                   ; #00 > free way
  532.         jp getObjDataById       ; #01-#0A convert to object data address
  533. ; .moveUp:
  534. ;       ld e,(ix+oData.x)
  535. ;       ld d,(ix+oData.y)
  536. ;       call getCellIDByCoords
  537. ;       ld l,a
  538. ;       ld a,(hl)
  539. ;       inc a
  540. ;       jr z,alignToCellNegative        ; #FF > wall
  541. ;       dec a
  542. ;       ret z                   ; #00 > free way
  543. ;       jp getObjDataById       ; #01-#0A convert to object data address
  544.  
  545.  
  546. alignToCellPositive:
  547.         ld a,(ix+oData.x)
  548.         and %11110000
  549.         ld (ix+oData.x),a
  550.         ld (ix+oData.preX),a
  551.         ld e,a
  552.         ld a,(ix+oData.y)
  553.         jr atcn
  554. ;       and %11110000
  555. ;       ld (ix+oData.y),a
  556. ;       ld (ix+oData.preY),a
  557. ;       ld d,a
  558. ;       call getCellIDByCoords
  559. ;       ld l,a
  560. ;       ld (ix+oData.cellId),a
  561. ;       ld a,(ix+oData.id)
  562. ;       ld h,high levelCells
  563. ;       ld (hl),a
  564. ;       jr resetMovable
  565. alignToCellNegative:
  566.        if EGA
  567.         ld a,(ix+oData.x)
  568.         add a,7
  569.        else
  570.         ld a,(ix+oData.preX)
  571.        endif
  572.         and %11110000
  573.         ld (ix+oData.x),a
  574.         ld (ix+oData.preX),a
  575.         ld e,a
  576.        if EGA
  577.         ld a,(ix+oData.y)
  578.         add a,7
  579.        else
  580.         ld a,(ix+oData.preY)
  581.        endif
  582. atcn:
  583.         and %11110000
  584.         ld (ix+oData.y),a
  585.        if !EGA
  586.         ld (ix+oData.preY),a
  587.        endif
  588.         ld d,a
  589.         call getCellIDByCoords
  590.         ld l,a
  591.         ld (ix+oData.cellId),a
  592.         ld a,(ix+oData.id)
  593.         ld h,high levelCells
  594.         ld (hl),a
  595. resetMovable:
  596.         ld a,(ix+oData.direction)
  597.         ld (ix+oData.direction),0
  598.         ld (ix+oData.delta),0
  599.         ld (ix+oData.accelerate),1
  600.         jp getDrawData
  601. alignToCell:
  602.  
  603.         ; FIXME create the same without a reset to pass through the object but with cell alignment,
  604.         ; if the object is not passable then use this subroutine.
  605.  
  606.         ld a,(ix+oData.direction)
  607.         and DIRECTION.LEFT or DIRECTION.UP
  608.         ; if (positive direction) #00 else #FF
  609.         jr z,alignToCellPositive
  610.         jr alignToCellNegative
  611.  
  612. ;---------------------------------------------------------
  613.  
  614. moveObject:
  615.         ; return > IY = target object address or IY = #0000
  616.         ld a,(ix+oData.isDestroyed)
  617.         or a
  618.         ret nz
  619.         ld a,(ix+oData.direction)
  620.         or a
  621.         ret z
  622.         ex af,af
  623.         ld a,(ix+oData.launchTime)
  624.         sub 1
  625.         jr c,.start
  626.         ld (ix+oData.launchTime),a
  627.         ret
  628. .moveLeft:
  629.         ld a,(ix+oData.x)
  630.         ld (ix+oData.preX),a
  631.         sub b
  632.         ld (ix+oData.x),a
  633.        if EGA
  634.         ld a,(ix+oData.y)
  635.         ld (ix+oData.preY),a
  636.        endif
  637.         ret
  638. .start:
  639.         call accelerate                 ; B > step value
  640.         ex af,af
  641.         rrca
  642.         jr c,.moveLeft
  643.         rrca
  644.         jr c,.moveRight
  645.         rrca
  646.         jp c,.moveUp
  647.         rrca
  648.        if !EGA
  649.         ret nc
  650.        else
  651.         jr c,.moveDown
  652.         ld a,(ix+oData.x)
  653.         ld (ix+oData.preX),a
  654.         ld a,(ix+oData.y)
  655.         ld (ix+oData.preY),a
  656.        endif
  657. .moveDown:
  658.         ld a,(ix+oData.y)
  659.         ld (ix+oData.preY),a
  660.         add b
  661.         ld (ix+oData.y),a
  662.         ret
  663. .moveRight:
  664.         ld a,(ix+oData.x)
  665.         ld (ix+oData.preX),a
  666.         add b
  667.         ld (ix+oData.x),a
  668.        if EGA
  669.         ld a,(ix+oData.y)
  670.         ld (ix+oData.preY),a
  671.        endif
  672.         ret
  673. .moveUp:
  674.         ld a,(ix+oData.y)
  675.         ld (ix+oData.preY),a
  676.         sub b
  677.         ld (ix+oData.y),a
  678.         ret
  679. ;--------------------------------------------------------------------------
  680. accelerate:
  681.         ld a,(ix+oData.delta)
  682.         add ACCELERATE_STEP             ; ACCELERATE_STEP
  683.         ld (ix+oData.delta),a
  684.         ld b,(ix+oData.accelerate)
  685.         ret nc
  686.         ld a,b
  687.         inc a
  688.         ld b,a
  689.         cp MAX_SPEED            ;MAX_SPEED
  690.         ret nc
  691.         ld (ix+oData.accelerate),a
  692.         ret
  693. ;-------------------------------------------------
  694. create:
  695.         ; HL - objects level data
  696.         ld ix,objectsData       ; objects data storage
  697.         xor a                   ; object ID
  698. .nextObject
  699.         inc a                           ; next object ID
  700.         ld (ix+oData.id),a              ; save object ID
  701.         ex af,af
  702.         ld a,(hl)
  703.         inc hl
  704.         ld (ix+oData.cellId),a          ; cell id in levelCells
  705.         ; set coordinates
  706.         ld c,a
  707.         call getCoordsByCellId
  708.         ld (ix+oData.x),e
  709.         ld (ix+oData.preX),e
  710.         ld (ix+oData.y),d
  711.         ld (ix+oData.preY),d
  712.         ; set screen address for draw
  713.         call getScrAddrByCellId
  714.         ld (ix+oData.scrAddrL),e
  715.         ld (ix+oData.scrAddrH),d
  716.         ; set sprite ID
  717.         ld a,(hl)      
  718.         ld (ix+oData.spriteId),a
  719.         push hl
  720.         push af
  721.         call findObj
  722.         pop af
  723.         pop hl
  724.         inc hl
  725.         push hl
  726.         call getSpriteAddr
  727.         ld (ix+oData.sprAddrL),l
  728.         ld (ix+oData.sprAddrH),h
  729.  
  730.         push hl
  731.         push de
  732.         push bc
  733.         call getDrawData
  734.         ld e,(ix+oData.scrAddrL)
  735.         ld d,(ix+oData.scrAddrH)
  736.         call draw.go
  737.         pop bc
  738.         pop de
  739.         pop hl
  740.  
  741.         pop hl
  742.         ld a,(hl)       ; cell id
  743.         cp #FF
  744.         ret z           ; exit if #FF
  745.         ld bc,OBJECT_DATA_SIZE
  746.         add ix,bc                       ; next object data address
  747.         ex af,af
  748.         jr .nextObject
  749. ;----------------------------------------------------------------
  750. findObj:
  751.         cp ENEMY_FACE_00_PBM_ID
  752.         jp z,ENEMY_SKULL.init
  753.         cp HERO_FACE_00_PBM_ID
  754.         jp z,HERO.init
  755.         cp CHUPA_001_PBM_ID
  756.         jp z,CHUPA.init
  757.         cp EXIT_DOOR_PBM_ID
  758.         jp z,EXIT_DOOR.init
  759.         cp ICEHOLE_PBM_ID
  760.         jp z,ICE_HOLE.init
  761. ;       cp SPLIT_PBM_ID
  762. ;       jp z,SPLIT.init
  763.         cp BOOM_01_PBM_ID
  764.         jp z,BOMB.init
  765.         cp BOX_PBM_ID
  766.         jp z,BOX.init
  767.  
  768.         cp BROKEN_BLOCK_PBM_ID
  769.         jp z,BROKEN_BLOCK.init
  770.         ret
  771. ;----------------------------------------------------------------
  772. setObjectId:
  773.         ; object ID to level cell
  774.         ld a,(ix+oData.id)
  775.         ld l,(ix+oData.cellId)
  776.         ld h,high levelCells
  777.         ld (hl),a
  778.         ret
  779. ;----------------------------------------------------------------
  780. alignAndDestroy:
  781.         call OBJECTS.alignToCell
  782.         jp OBJECTS.setDestroyIX
  783. setDestroyIX:
  784.         ld (ix+oData.isDestroyed),1
  785.         ret
  786. setDestroyIY:
  787.         ld (iy+oData.isDestroyed),1
  788.         ret
  789. ;----------------------------------------------------------------
  790. resetObjectIX:
  791.         call clear2x2
  792.         ld e,ixl
  793.         ld d,ixh
  794.         ld l,(ix+oData.cellId)
  795. ;       call resetObject
  796. ;       ret
  797. resetObject:
  798.         ld h,high levelCells
  799.         ld (hl),0
  800.         ld h,d
  801.         ld l,e
  802.         inc de
  803.         ld bc,OBJECT_DATA_SIZE - 1
  804.         ld (hl),#00
  805.         ldir
  806.         ret
  807. resetObjectIY:
  808.         ld e,iyl
  809.         ld d,iyh
  810.         ld l,(iy+oData.cellId)
  811.         call resetObject
  812.         ret
  813.  
  814.         endmodule