Advertisement
Guest User

Untitled

a guest
Sep 10th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ----------------------------------------------------------------------------------------
  2. ; X = unit index
  3. calculateRoute:
  4. {
  5.             lda SrcPosX
  6.             cmp DestPosX
  7.             bne notAtTarget
  8.  
  9.             lda SrcPosY
  10.             cmp DestPosY
  11.             bne notAtTarget
  12.  
  13.             lda #$00
  14.             sta OBJ_ATTR(Unit, TargetMoveLo),x
  15.             sta OBJ_ATTR(Unit, TargetMoveHi),x
  16.  
  17.             jmp addEndMarkerToRoute
  18.            
  19. notAtTarget:
  20.  
  21.             lda OBJ_ATTR(Unit, RouteIndex),x
  22.             cmp #(ROUTE_BUFFER_SIZE-1)
  23.             bne routeBufferHasRoom
  24.            
  25.             jmp addEndMarkerToRoute
  26.  
  27. routeBufferHasRoom:
  28.  
  29.             lda RouteBufferForUnitLo,x
  30.             sta RouteBuffer
  31.             lda RouteBufferForUnitHi,x
  32.             sta RouteBuffer+1
  33.  
  34.             ; get general direction
  35.             jsr getDirectionFromSrcToDst
  36.             sta Direction
  37.            
  38.             ; offset position into direction of target
  39. tryMoveIntoDirection:          
  40.             lsr
  41.             lsr
  42.             lsr
  43.             lsr
  44.             lsr
  45.             tay
  46.             jsr moveIntoDirection
  47.            
  48.             jsr canMoveToPosition
  49.             bne isValidMove
  50.            
  51.             ; restore packed position to current route position        
  52.             lda SrcPosX
  53.             sta SaveSrcPosX
  54.             ldy SrcPosY
  55.             sty SaveSrcPosY
  56.             jsr packPosition
  57.            
  58.             ; try next direction clockwise
  59.             lda #<RouteBuffer1
  60.             sta RouteBufferPtrLo
  61.             lda #>RouteBuffer1
  62.             sta RouteBufferPtrHi
  63.  
  64.             lda Direction
  65.             ldy #$20
  66.             jsr tryAlternativeRoute
  67.             sta FirstRouteLength
  68.            
  69.             ; restore position before alternative route
  70. SaveSrcPosX = *+1          
  71.             lda #$00
  72.             sta SrcPosX
  73. SaveSrcPosY = *+1          
  74.             ldy #$00
  75.             sty SrcPosY
  76.             jsr packPosition
  77.  
  78.             ; try next direction counterclockwise
  79.             lda #<RouteBuffer2
  80.             sta RouteBufferPtrLo
  81.             lda #>RouteBuffer2
  82.             sta RouteBufferPtrHi
  83.  
  84.             lda Direction
  85.             ldy #$e0
  86.             jsr tryAlternativeRoute
  87.  
  88.             ; A = second route length
  89.            
  90. FirstRouteLength = *+1
  91.             cmp #$00           
  92.             bcc secondRouteShorter
  93.  
  94.             lda #<RouteBuffer1
  95.             sta RouteBufferPtrLo
  96.             lda #>RouteBuffer1
  97.             sta RouteBufferPtrHi
  98.             lda FirstRouteLength
  99.  
  100. secondRouteShorter:
  101.  
  102.             sta RouteCopySize
  103.             beq noRouteToCopy
  104.  
  105.             lda RouteBufferForUnitLo,x
  106.             clc
  107.             adc OBJ_ATTR(Unit, RouteIndex),x
  108.             sta RouteBufferDest
  109.             lda RouteBufferForUnitHi,x
  110.             adc #$00
  111.             sta RouteBufferDest+1
  112.  
  113.             ldy #$00
  114.             {
  115.                 lda (RouteBufferPtrLo),y
  116. .global RouteBufferDest = *+1          
  117.                 sta $0123,y
  118.                 inc OBJ_ATTR(Unit, RouteIndex),x
  119.                 lda OBJ_ATTR(Unit, RouteIndex),x
  120.                 cmp #(ROUTE_BUFFER_SIZE-1)
  121.                 beq _break
  122.                
  123.                 iny
  124. .global RouteCopySize = *+1            
  125.                 cpy #$00
  126.                 bne _cont
  127.             }
  128. noRouteToCopy:         
  129.             jmp addEndMarkerToRoute
  130.            
  131. isValidMove:           
  132.  
  133.             ; store direction from src to dest in route buffer
  134.             lda OBJ_ATTR(Unit, RouteIndex),x
  135.             tay
  136.  
  137. Direction = *+1
  138.             lda #$00           
  139. RouteBuffer = *+1          
  140.             sta $0123,y
  141.  
  142.             inc OBJ_ATTR(Unit, RouteIndex),x
  143.  
  144.             ; store packed position in SrcPos
  145.             jsr unpackPosition
  146.             sta SrcPosX
  147.             sty SrcPosY
  148.             jmp calculateRoute
  149.            
  150. }
  151.  
  152.  
  153. ; ----------------------------------------------------------------------------------------
  154. ; input: X = unit index, A = direction, Y = searchDirection ($20 = clockwise, $e0 = counterclockwise)
  155. tryAlternativeRoute:
  156. {
  157.             sty SearchDirection
  158.             clc
  159. SearchDirection = *+1          
  160.             adc #$00
  161.             sta Direction
  162.            
  163.             ldy #$00
  164.             sty RouteIndex
  165.  
  166. tryMoveIntoDirection:
  167.             lsr
  168.             lsr
  169.             lsr
  170.             lsr
  171.             lsr
  172.             tay
  173.             jsr moveIntoDirection
  174.  
  175.             jsr canMoveToPosition
  176.             bne isValidMove
  177.  
  178.             ; restore packed position to current route position        
  179.             lda SrcPosX
  180.             ldy SrcPosY
  181.             jsr packPosition
  182.            
  183.             ; try next direction
  184.             lda Direction
  185.             clc
  186.             adc SearchDirection
  187.             sta Direction
  188.             jmp tryMoveIntoDirection
  189.  
  190. isValidMove:
  191.  
  192. Direction = *+1
  193.             lda #$00           
  194.  
  195. RouteIndex = *+1
  196.             ldy #$00
  197.             sta (RouteBufferPtrLo),y
  198.             inc RouteIndex
  199.  
  200.             ; store packed position in SrcPos
  201.             jsr unpackPosition
  202.             sta SrcPosX
  203.             sty SrcPosY
  204.  
  205.             lda SrcPosX
  206.             cmp DestPosX
  207.             bne notAtTarget
  208.  
  209.             lda SrcPosY
  210.             cmp DestPosY
  211.             bne notAtTarget
  212.  
  213.             lda RouteIndex
  214.             rts
  215.            
  216. notAtTarget:
  217.  
  218.             lda RouteIndex
  219.             cmp #ROUTEBUFFER_SIZE
  220.             bne routeBufferHasRoom
  221.            
  222.             rts
  223.  
  224. routeBufferHasRoom:
  225.             jsr getDirectionFromSrcToDst
  226.             sta Direction
  227.            
  228.             ; offset position into direction of target
  229.             jmp tryMoveIntoDirection
  230. }
  231.  
  232.  
  233. ; ----------------------------------------------------------------------------------------
  234. ; input: X = unit index
  235. deleteRoute:
  236. {
  237.             lda #$00
  238.             sta OBJ_ATTR(Unit, RouteIndex),x
  239.  
  240.             lda RouteBufferForUnitLo,x
  241.             sta RouteBuffer
  242.             lda RouteBufferForUnitHi,x
  243.             sta RouteBuffer+1
  244.            
  245.             lda #$ff
  246. RouteBuffer = *+1          
  247.             sta $0123
  248.             rts
  249. }
  250.  
  251.  
  252. ; ----------------------------------------------------------------------------------------
  253. ; input: X = unit index
  254. ; modifies: Y
  255. addEndMarkerToRoute:
  256. {
  257.             lda OBJ_ATTR(Unit, RouteIndex),x
  258.             tay
  259.  
  260.             lda RouteBufferForUnitLo,x
  261.             sta RouteBuffer
  262.             lda RouteBufferForUnitHi,x
  263.             sta RouteBuffer+1
  264.            
  265.             lda #$ff
  266. RouteBuffer = *+1          
  267.             sta $0123,y
  268.  
  269.             lda #$00
  270.             sta OBJ_ATTR(Unit, RouteIndex),x
  271.             rts
  272. }
  273.  
  274.  
  275. ; ----------------------------------------------------------------------------------------
  276. ; input: PackedPositionLo/Hi, Y = direction
  277. ; output: PackedPositionLo/Hi
  278. moveIntoDirection:
  279. {
  280.             lda DirectionToMapOffsetSign,y
  281.             bmi subtract
  282.             lda PackedPositionLo
  283.             clc
  284.             adc DirectionToMapOffset,y
  285.             sta PackedPositionLo
  286.             lda PackedPositionHi
  287.             adc #$00
  288.             sta PackedPositionHi
  289.             rts
  290. subtract:          
  291.             lda PackedPositionLo
  292.             sec
  293.             sbc DirectionToMapOffset,y
  294.             sta PackedPositionLo
  295.             lda PackedPositionHi
  296.             sbc #$00
  297.             sta PackedPositionHi
  298.             rts
  299.            
  300. DirectionToMapOffset:
  301.             .byte 64        ; N
  302.             .byte 63        ; NE
  303.             .byte 1         ; E
  304.             .byte 65        ; SE
  305.             .byte 64        ; S
  306.             .byte 63        ; SW
  307.             .byte 1         ; W
  308.             .byte 65        ; NW
  309.  
  310. DirectionToMapOffsetSign:
  311.             .byte $80       ; N
  312.             .byte $80       ; NE
  313.             .byte $00       ; E
  314.             .byte $00       ; SE
  315.             .byte $00       ; S
  316.             .byte $00       ; SW
  317.             .byte $80       ; W
  318.             .byte $80       ; NW
  319. }
  320.  
  321.  
  322. ; ----------------------------------------------------------------------------------------
  323. ; A = tile id
  324. canMoveIntoTile:
  325. {
  326.             tay
  327.            
  328.             lda TileIdToStructureId,y
  329.             cmp #STRUCTURE_REFINERY
  330.             bne notRefinery
  331.             lda OBJ_ATTR(Unit, Type),x
  332.             cmp #UNIT_HARVESTER
  333.             bne notHarvester
  334.             lda #$01
  335.             rts
  336. notRefinery:           
  337. notHarvester:
  338.             lda TileIdToMovementInfo,y
  339.             and #MOVEMENT_INFO_CAN_MOVE
  340.             rts
  341. }
  342.  
  343.  
  344. ; ----------------------------------------------------------------------------------------
  345. ; input: PackedPosition
  346. ; output: A
  347. canMoveToPosition:
  348. {
  349.             lda PackedPositionLo
  350.             sta TileMapPtrLo
  351.             sta TileInfoMapPtrLo
  352.             lda PackedPositionHi
  353.             clc
  354.             adc #>TileMap
  355.             sta TileMapPtrHi
  356.             lda PackedPositionHi
  357.             clc
  358.             adc #>TileInfoMap
  359.             sta TileInfoMapPtrHi
  360.            
  361.             ldy #$00
  362.             lda (TileMapPtrLo),y
  363.             jsr canMoveIntoTile
  364.             beq isInvalidMove
  365.  
  366.             ldy #$00
  367.             lda (TileInfoMapPtrLo),y
  368.             and #TILE_INFO_IS_STRUCTURE
  369.             bne isValidMove
  370.            
  371.             lda (TileInfoMapPtrLo),y
  372.             and #TILE_INFO_INDEX_MASK
  373.             cmp #TILE_INFO_NO_INDEX
  374.             beq isValidMove
  375.            
  376. isInvalidMove:
  377.             lda #$00
  378.             rts
  379.                        
  380. isValidMove:
  381.             lda #$01
  382.             rts                    
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement