A MoonBit toolkit for ASCII, CSV, and Tiled JSON grid maps with pathfinding.
showcase.htmlmoon run examples/tactical_previewmoonbit-pixelkit tactical preview
Legend: S actor, G goal, # wall, + reachable this turn, * planned path
Turn 1 movement range, budget 8:
S++++++#...G
+####++#....
+++#++.....
+##+#+####..
+++#.......
++###..##...
+++.........
Selected target: (6, 2)
Selected target reachable: true
This-turn path cost: 8
This-turn path steps: 8
S******#...G
+####+*#....
+++#+*.....
+##+#+####..
+++#.......
++###..##...
+++.........moon add ttxiangshang/moonbit-pixelkitimport {
"ttxiangshang/moonbit-pixelkit" @pixelkit,
}git clone https://github.com/zhenghao493-netizen/moonbit-pixelkit.git
cd moonbit-pixelkit
moon check
moon build
moon testmoon check
moon build
moon testmoon run cmd/main
moon run examples/ascii_maze
moon run examples/reachable_area
moon run examples/weighted_grid
moon run examples/game_loop_stub
moon run examples/turn_based_movement
moon run examples/tactical_preview
moon run examples/tiled_tactical_preview
moon run examples/parse_diagnosticsmoon packagemoon bench benchmarks/pathfinding --release --deny-warnlet source = (
#|S..
#|##.
#|..G
)
let map = parse_ascii_map(source).unwrap()
let path = astar(map, point(0, 0), point(2, 2)).unwrap().unwrap()
println("path length: \{path.length()}")let map = parse_ascii_map(source).unwrap()
let actor = map.single_point_with_id("start").unwrap()
let target = point(4, 1)
let preview = movement_preview(map, actor, target, 5).unwrap()
let reachable = preview.reachable_points()
let path = preview.path().unwrap()
println("cost: \{preview.path_cost().unwrap()}")
println("steps: \{map.validate_path(path).unwrap().steps()}")
println(map.render_ascii_overlay(reachable=reachable, path=path))let options = tiled_options(
terrain_layer=Some("Terrain"),
terrain_costs=[terrain_cost("2", 3), terrain_cost("3", 5)],
)
let map = parse_tiled_json(tiled_json, options~).unwrap()moon run examples/tiled_tactical_previewmoon packagegit tag v0.2.0
git push origin v0.2.0
git push gitlink v0.2.0moon check
moon build
moon test
moon run cmd/main
moon run examples/ascii_maze
moon run examples/reachable_area
moon run examples/weighted_grid
moon run examples/game_loop_stub
moon run examples/turn_based_movement
moon run examples/tactical_preview
moon packagegit push origin main
git push gitlink mainpub struct CsvOptions {
wall_ids : Array[String]
terrain_costs : Array[TerrainCost]
default_cost : Int
} derive(Debug)pub enum ParseError {
EmptyMap
EmptyFirstRow
NonRectangularRow(Int, Int, Int)
UnknownAsciiTile(Int, Int, Char)
InvalidDefaultCost
InvalidTerrainCost(String, Int)
TiledInvalidJson
TiledRootMustBeObject
TiledMissingField(String)
TiledFieldMustBeInteger(String)
TiledFieldMustBeString(String)
TiledFieldMustBeIntegerArray(String)
TiledUnsupportedEncoding(String)
TiledUnsupportedCompression(String)
TiledInvalidBase64Data(String)
TiledBase64SizeMismatch(String, Int, Int)
TiledInvalidDimensions
TiledUnsupportedOrientation(String)
TiledLayersMustBeArray
TiledLayersMustBeObjects
TiledLayerNotFound(String)
TiledLayerNotTileLayer(String)
TiledLayerSizeMismatch(String, Int, Int)
} derive(Eq, Debug)fn TileMap::validate_path(self : TileMap, path : Array[Point], options? : SearchOptions) -> Result[PathReport, String]fn TileMap::validate_path_detailed(self : TileMap, path : Array[Point], options? : SearchOptions) -> Result[PathReport, PathError]pub struct TiledOptions {
collision_layer : String
terrain_layer : String?
wall_gids : Array[Int]
terrain_costs : Array[TerrainCost]
default_cost : Int
} derive(Debug)fn bfs_reachable(map : TileMap, start : Point, max_cost : Int, options? : SearchOptions) -> Result[Array[Point], String]fn bfs_reachable_with_costs(map : TileMap, start : Point, max_cost : Int, options? : SearchOptions) -> Result[Array[ReachableCell], String]fn bfs_reachable_with_costs_detailed(map : TileMap, start : Point, max_cost : Int, options? : SearchOptions) -> Result[Array[ReachableCell], PathError]fn csv_options(wall_ids? : Array[String], terrain_costs? : Array[TerrainCost], default_cost? : Int) -> CsvOptionsfn movement_preview(map : TileMap, start : Point, target : Point, max_cost : Int, options? : SearchOptions) -> Result[MovementPreview, String]fn movement_preview_detailed(map : TileMap, start : Point, target : Point, max_cost : Int, options? : SearchOptions) -> Result[MovementPreview, PathError]fn parse_csv_map_with_options_detailed(input : String, options : CsvOptions) -> Result[TileMap, ParseError]fn parse_tiled_json_detailed(input : String, options? : TiledOptions) -> Result[TileMap, ParseError]fn tiled_options(collision_layer? : String, terrain_layer? : String?, wall_gids? : Array[Int], terrain_costs? : Array[TerrainCost], default_cost? : Int) -> TiledOptionsA MoonBit toolkit for ASCII, CSV, and Tiled JSON grid maps with pathfinding.