diff --git a/apps/game/assets/maps/house_elder.map b/apps/game/assets/maps/house_elder.map index ceeca16..0b18212 100644 --- a/apps/game/assets/maps/house_elder.map +++ b/apps/game/assets/maps/house_elder.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":11,"height":9,"blocked":[2,3,6,7,9,10],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8}},"encoding":"rle","tiles":[[9,12],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,6],[8,1],[9,5]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":11,"height":9,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"encoding":"rle","tiles":[[9,12],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,6],[8,1],[9,5]]} \ No newline at end of file diff --git a/apps/game/assets/maps/machine_hall.map b/apps/game/assets/maps/machine_hall.map new file mode 100644 index 0000000..2a8ca04 --- /dev/null +++ b/apps/game/assets/maps/machine_hall.map @@ -0,0 +1 @@ +{"format":"rpg-map","version":1,"width":13,"height":11,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"encoding":"rle","tiles":[[9,14],[8,4],[21,2],[8,5],[9,2],[8,11],[9,2],[8,5],[19,1],[8,5],[9,2],[8,5],[19,1],[8,5],[9,2],[8,5],[19,1],[8,5],[9,2],[8,5],[19,1],[8,5],[9,2],[8,5],[19,1],[8,5],[9,2],[8,5],[19,1],[8,5],[9,2],[8,5],[19,1],[8,5],[9,7],[8,1],[9,6]]} \ No newline at end of file diff --git a/apps/game/assets/maps/meadows.map b/apps/game/assets/maps/meadows.map index 72210fa..39d7fa5 100644 --- a/apps/game/assets/maps/meadows.map +++ b/apps/game/assets/maps/meadows.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":28,"height":28,"blocked":[2,3,6,7,9,10],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":7,"y":0,"dx":-3,"dy":-2},{"id":17,"x":17,"y":0,"dx":-4,"dy":2},{"id":15,"x":2,"y":1,"dx":1,"dy":0},{"id":16,"x":7,"y":1,"dx":-3,"dy":0},{"id":15,"x":8,"y":1,"dx":-3,"dy":1},{"id":17,"x":17,"y":1,"dx":-2,"dy":-1},{"id":16,"x":25,"y":1,"dx":-2,"dy":-2},{"id":16,"x":26,"y":1,"dx":0,"dy":1},{"id":15,"x":16,"y":2,"dx":3,"dy":1},{"id":16,"x":18,"y":2,"dx":-3,"dy":-1},{"id":17,"x":10,"y":3,"dx":1,"dy":1},{"id":17,"x":11,"y":3,"dx":1,"dy":1},{"id":16,"x":26,"y":3,"dx":-3,"dy":2},{"id":16,"x":7,"y":4,"dx":-3,"dy":1},{"id":16,"x":18,"y":4,"dx":-2,"dy":2},{"id":17,"x":26,"y":4,"dx":-4,"dy":0},{"id":15,"x":11,"y":5,"dx":4,"dy":0},{"id":16,"x":13,"y":8,"dx":-2,"dy":1},{"id":16,"x":15,"y":8,"dx":3,"dy":1},{"id":17,"x":24,"y":8,"dx":-1,"dy":0},{"id":17,"x":6,"y":9,"dx":-1,"dy":-2},{"id":16,"x":13,"y":9,"dx":-3,"dy":0},{"id":17,"x":23,"y":9,"dx":-3,"dy":1},{"id":16,"x":13,"y":10,"dx":0,"dy":0},{"id":15,"x":27,"y":10,"dx":-4,"dy":0},{"id":15,"x":4,"y":11,"dx":-3,"dy":0},{"id":15,"x":10,"y":11,"dx":-2,"dy":2},{"id":16,"x":14,"y":11,"dx":3,"dy":-2},{"id":15,"x":23,"y":11,"dx":-2,"dy":1},{"id":15,"x":0,"y":12,"dx":1,"dy":1},{"id":16,"x":1,"y":12,"dx":1,"dy":1},{"id":15,"x":4,"y":12,"dx":0,"dy":1},{"id":17,"x":1,"y":13,"dx":4,"dy":0},{"id":16,"x":10,"y":13,"dx":4,"dy":0},{"id":16,"x":18,"y":13,"dx":-2,"dy":-2},{"id":16,"x":23,"y":13,"dx":2,"dy":-1},{"id":15,"x":2,"y":14,"dx":0,"dy":1},{"id":17,"x":4,"y":14,"dx":-1,"dy":0},{"id":17,"x":15,"y":14,"dx":-1,"dy":0},{"id":16,"x":16,"y":14,"dx":3,"dy":-1},{"id":16,"x":18,"y":14,"dx":0,"dy":1},{"id":15,"x":24,"y":14,"dx":4,"dy":-1},{"id":15,"x":9,"y":15,"dx":1,"dy":0},{"id":16,"x":12,"y":15,"dx":-4,"dy":-2},{"id":15,"x":13,"y":15,"dx":-2,"dy":1},{"id":17,"x":19,"y":15,"dx":0,"dy":-1},{"id":16,"x":23,"y":15,"dx":3,"dy":-1},{"id":16,"x":27,"y":16,"dx":4,"dy":2},{"id":16,"x":4,"y":17,"dx":1,"dy":-2},{"id":16,"x":13,"y":17,"dx":-2,"dy":-2},{"id":15,"x":20,"y":17,"dx":-2,"dy":0},{"id":15,"x":22,"y":17,"dx":4,"dy":0},{"id":16,"x":5,"y":18,"dx":3,"dy":0},{"id":15,"x":0,"y":19,"dx":-2,"dy":1},{"id":16,"x":8,"y":19,"dx":-3,"dy":0},{"id":15,"x":26,"y":19,"dx":2,"dy":1},{"id":15,"x":18,"y":20,"dx":-3,"dy":0},{"id":15,"x":21,"y":20,"dx":0,"dy":-1},{"id":15,"x":23,"y":20,"dx":0,"dy":2},{"id":16,"x":25,"y":20,"dx":-3,"dy":1},{"id":16,"x":25,"y":21,"dx":-3,"dy":2},{"id":17,"x":0,"y":22,"dx":1,"dy":2},{"id":17,"x":21,"y":22,"dx":3,"dy":2},{"id":15,"x":22,"y":22,"dx":3,"dy":-2},{"id":16,"x":25,"y":22,"dx":1,"dy":1},{"id":16,"x":6,"y":23,"dx":-1,"dy":0},{"id":16,"x":8,"y":23,"dx":-3,"dy":0},{"id":15,"x":12,"y":23,"dx":-3,"dy":0},{"id":16,"x":13,"y":23,"dx":1,"dy":0},{"id":16,"x":6,"y":24,"dx":2,"dy":-1},{"id":17,"x":17,"y":24,"dx":0,"dy":0},{"id":16,"x":6,"y":25,"dx":-4,"dy":2},{"id":16,"x":26,"y":26,"dx":1,"dy":1},{"id":15,"x":1,"y":27,"dx":-2,"dy":-1},{"id":17,"x":10,"y":27,"dx":2,"dy":-1}],"encoding":"rle","tiles":[[0,1],[3,2],[4,1],[0,1],[4,3],[0,1],[4,3],[0,1],[4,1],[0,4],[4,8],[3,1],[4,1],[0,1],[1,1],[0,3],[4,3],[0,2],[4,1],[0,2],[4,1],[0,4],[4,2],[0,1],[4,1],[0,1],[4,4],[0,1],[3,1],[1,2],[0,2],[4,2],[0,3],[4,4],[0,4],[4,1],[0,1],[4,2],[0,1],[4,4],[3,1],[0,2],[1,2],[0,1],[4,2],[0,6],[4,9],[0,1],[4,2],[3,1],[4,2],[3,1],[0,2],[1,2],[0,1],[4,2],[0,5],[4,3],[0,1],[4,2],[0,1],[4,1],[0,1],[4,1],[0,1],[4,2],[0,1],[4,1],[3,1],[0,1],[1,3],[0,8],[4,5],[5,1],[0,5],[4,1],[3,1],[4,2],[0,4],[1,2],[0,1],[4,3],[0,1],[4,1],[0,2],[4,2],[0,1],[4,1],[0,11],[3,1],[0,3],[1,3],[4,2],[0,1],[4,1],[0,1],[4,5],[0,1],[2,4],[0,7],[4,1],[0,1],[4,1],[0,1],[4,1],[1,2],[4,2],[0,2],[4,3],[0,1],[4,1],[0,1],[2,4],[0,3],[3,1],[0,3],[4,1],[3,1],[0,3],[4,1],[1,1],[4,3],[0,1],[4,5],[0,1],[2,2],[0,1],[5,1],[0,7],[3,1],[0,1],[4,1],[0,3],[1,2],[4,2],[0,1],[4,3],[0,8],[3,1],[0,3],[4,1],[3,1],[0,4],[4,3],[1,1],[0,3],[4,5],[0,6],[3,1],[0,2],[3,1],[0,1],[4,1],[3,1],[0,3],[4,3],[1,1],[0,4],[4,5],[0,1],[4,5],[0,1],[4,2],[0,2],[3,1],[0,4],[4,2],[1,1],[4,1],[0,5],[4,3],[0,1],[4,4],[0,3],[3,1],[0,1],[4,1],[0,1],[3,1],[0,4],[4,1],[1,2],[4,2],[0,3],[4,3],[0,1],[4,4],[0,1],[1,2],[4,1],[3,2],[4,1],[0,5],[4,1],[0,1],[1,1],[0,1],[4,1],[0,4],[4,1],[0,2],[4,4],[0,3],[3,2],[0,1],[4,1],[3,1],[0,2],[2,2],[0,2],[1,3],[4,1],[0,6],[4,1],[0,1],[4,4],[0,1],[4,1],[3,1],[0,1],[3,1],[4,3],[2,4],[5,1],[0,1],[1,1],[4,1],[0,13],[3,1],[0,1],[3,1],[4,5],[2,3],[4,2],[1,1],[4,3],[0,4],[4,1],[0,3],[3,1],[0,4],[3,1],[4,1],[3,1],[0,1],[4,4],[0,2],[5,1],[1,2],[4,2],[0,3],[4,3],[0,13],[4,4],[0,1],[4,1],[1,1],[0,5],[4,2],[0,1],[10,1],[0,2],[4,2],[0,1],[3,3],[0,6],[4,1],[0,2],[4,1],[1,3],[0,9],[4,1],[0,5],[3,1],[0,6],[4,4],[0,1],[1,1],[0,8],[4,3],[0,1],[3,1],[0,1],[3,1],[0,3],[4,4],[0,1],[4,1],[0,1],[4,1],[0,1],[1,1],[0,10],[3,1],[0,2],[3,3],[0,2],[4,1],[0,2],[4,5],[0,1],[1,1],[0,9],[4,2],[0,2],[3,1],[0,4],[4,2],[0,7],[1,10],[4,2],[3,1],[0,24],[4,4],[0,2],[3,1],[0,21],[3,4]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":28,"height":28,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":7,"y":0,"dx":-3,"dy":-2},{"id":17,"x":17,"y":0,"dx":-4,"dy":2},{"id":15,"x":2,"y":1,"dx":1,"dy":0},{"id":16,"x":7,"y":1,"dx":-3,"dy":0},{"id":15,"x":8,"y":1,"dx":-3,"dy":1},{"id":17,"x":17,"y":1,"dx":-2,"dy":-1},{"id":16,"x":25,"y":1,"dx":-2,"dy":-2},{"id":16,"x":26,"y":1,"dx":0,"dy":1},{"id":15,"x":16,"y":2,"dx":3,"dy":1},{"id":16,"x":18,"y":2,"dx":-3,"dy":-1},{"id":17,"x":10,"y":3,"dx":1,"dy":1},{"id":17,"x":11,"y":3,"dx":1,"dy":1},{"id":16,"x":26,"y":3,"dx":-3,"dy":2},{"id":16,"x":7,"y":4,"dx":-3,"dy":1},{"id":16,"x":18,"y":4,"dx":-2,"dy":2},{"id":17,"x":26,"y":4,"dx":-4,"dy":0},{"id":15,"x":11,"y":5,"dx":4,"dy":0},{"id":16,"x":13,"y":8,"dx":-2,"dy":1},{"id":16,"x":15,"y":8,"dx":3,"dy":1},{"id":17,"x":24,"y":8,"dx":-1,"dy":0},{"id":17,"x":6,"y":9,"dx":-1,"dy":-2},{"id":16,"x":13,"y":9,"dx":-3,"dy":0},{"id":17,"x":23,"y":9,"dx":-3,"dy":1},{"id":16,"x":13,"y":10,"dx":0,"dy":0},{"id":15,"x":27,"y":10,"dx":-4,"dy":0},{"id":15,"x":4,"y":11,"dx":-3,"dy":0},{"id":15,"x":10,"y":11,"dx":-2,"dy":2},{"id":16,"x":14,"y":11,"dx":3,"dy":-2},{"id":15,"x":23,"y":11,"dx":-2,"dy":1},{"id":15,"x":0,"y":12,"dx":1,"dy":1},{"id":16,"x":1,"y":12,"dx":1,"dy":1},{"id":15,"x":4,"y":12,"dx":0,"dy":1},{"id":17,"x":1,"y":13,"dx":4,"dy":0},{"id":16,"x":10,"y":13,"dx":4,"dy":0},{"id":16,"x":18,"y":13,"dx":-2,"dy":-2},{"id":16,"x":23,"y":13,"dx":2,"dy":-1},{"id":15,"x":2,"y":14,"dx":0,"dy":1},{"id":17,"x":4,"y":14,"dx":-1,"dy":0},{"id":17,"x":15,"y":14,"dx":-1,"dy":0},{"id":16,"x":16,"y":14,"dx":3,"dy":-1},{"id":16,"x":18,"y":14,"dx":0,"dy":1},{"id":15,"x":24,"y":14,"dx":4,"dy":-1},{"id":15,"x":9,"y":15,"dx":1,"dy":0},{"id":16,"x":12,"y":15,"dx":-4,"dy":-2},{"id":15,"x":13,"y":15,"dx":-2,"dy":1},{"id":17,"x":19,"y":15,"dx":0,"dy":-1},{"id":16,"x":23,"y":15,"dx":3,"dy":-1},{"id":16,"x":27,"y":16,"dx":4,"dy":2},{"id":16,"x":4,"y":17,"dx":1,"dy":-2},{"id":16,"x":13,"y":17,"dx":-2,"dy":-2},{"id":15,"x":20,"y":17,"dx":-2,"dy":0},{"id":15,"x":22,"y":17,"dx":4,"dy":0},{"id":16,"x":5,"y":18,"dx":3,"dy":0},{"id":15,"x":0,"y":19,"dx":-2,"dy":1},{"id":16,"x":8,"y":19,"dx":-3,"dy":0},{"id":15,"x":26,"y":19,"dx":2,"dy":1},{"id":15,"x":18,"y":20,"dx":-3,"dy":0},{"id":15,"x":21,"y":20,"dx":0,"dy":-1},{"id":15,"x":23,"y":20,"dx":0,"dy":2},{"id":16,"x":25,"y":20,"dx":-3,"dy":1},{"id":16,"x":25,"y":21,"dx":-3,"dy":2},{"id":17,"x":0,"y":22,"dx":1,"dy":2},{"id":17,"x":21,"y":22,"dx":3,"dy":2},{"id":15,"x":22,"y":22,"dx":3,"dy":-2},{"id":16,"x":25,"y":22,"dx":1,"dy":1},{"id":16,"x":6,"y":23,"dx":-1,"dy":0},{"id":16,"x":8,"y":23,"dx":-3,"dy":0},{"id":15,"x":12,"y":23,"dx":-3,"dy":0},{"id":16,"x":13,"y":23,"dx":1,"dy":0},{"id":16,"x":6,"y":24,"dx":2,"dy":-1},{"id":17,"x":17,"y":24,"dx":0,"dy":0},{"id":16,"x":6,"y":25,"dx":-4,"dy":2},{"id":16,"x":26,"y":26,"dx":1,"dy":1},{"id":15,"x":1,"y":27,"dx":-2,"dy":-1},{"id":17,"x":10,"y":27,"dx":2,"dy":-1}],"encoding":"rle","tiles":[[0,1],[3,2],[4,1],[0,1],[4,3],[0,1],[4,3],[0,1],[4,1],[0,4],[4,8],[3,1],[4,1],[0,1],[1,1],[0,3],[4,3],[0,2],[4,1],[0,2],[4,1],[0,4],[4,2],[0,1],[4,1],[0,1],[4,4],[0,1],[3,1],[1,2],[0,2],[4,2],[0,3],[4,4],[0,4],[4,1],[0,1],[4,2],[0,1],[4,4],[3,1],[0,2],[1,2],[0,1],[4,2],[0,6],[4,9],[0,1],[4,2],[3,1],[4,2],[3,1],[0,2],[1,2],[0,1],[4,2],[0,5],[4,3],[0,1],[4,2],[0,1],[4,1],[0,1],[4,1],[0,1],[4,2],[0,1],[4,1],[3,1],[0,1],[1,3],[0,8],[4,5],[5,1],[0,5],[4,1],[3,1],[4,2],[0,4],[1,2],[0,1],[4,3],[0,1],[4,1],[0,2],[4,2],[0,1],[4,1],[0,11],[3,1],[0,3],[1,3],[4,2],[0,1],[4,1],[0,1],[4,5],[0,1],[2,4],[0,7],[4,1],[0,1],[4,1],[0,1],[4,1],[1,2],[4,2],[0,2],[4,3],[0,1],[4,1],[0,1],[2,4],[0,3],[3,1],[0,3],[4,1],[3,1],[0,3],[4,1],[1,1],[4,3],[0,1],[4,5],[0,1],[2,2],[0,1],[5,1],[0,7],[3,1],[0,1],[4,1],[0,3],[1,2],[4,2],[0,1],[4,3],[0,8],[3,1],[0,3],[4,1],[3,1],[0,4],[4,3],[1,1],[0,3],[4,5],[0,6],[3,1],[0,2],[3,1],[0,1],[4,1],[3,1],[0,3],[4,3],[1,1],[0,4],[4,5],[0,1],[4,5],[0,1],[4,2],[0,2],[3,1],[0,4],[4,2],[1,1],[4,1],[0,5],[4,3],[0,1],[4,4],[0,3],[3,1],[0,1],[4,1],[0,1],[3,1],[0,4],[4,1],[1,2],[4,2],[0,3],[4,3],[0,1],[4,4],[0,1],[1,2],[4,1],[3,2],[4,1],[0,5],[4,1],[0,1],[1,1],[0,1],[4,1],[0,4],[4,1],[0,2],[4,4],[0,3],[3,2],[0,1],[4,1],[3,1],[0,2],[2,2],[0,2],[1,3],[4,1],[0,6],[4,1],[0,1],[4,4],[0,1],[4,1],[3,1],[0,1],[3,1],[4,3],[2,4],[5,1],[0,1],[1,1],[4,1],[0,13],[3,1],[0,1],[3,1],[4,5],[2,3],[4,2],[1,1],[4,3],[0,4],[4,1],[0,3],[3,1],[0,4],[3,1],[4,1],[3,1],[0,1],[4,4],[0,2],[5,1],[1,2],[4,2],[0,3],[4,3],[0,13],[4,4],[0,1],[4,1],[1,1],[0,5],[4,2],[0,1],[10,1],[0,2],[4,2],[0,1],[3,3],[0,6],[4,1],[0,2],[4,1],[1,3],[0,9],[4,1],[0,5],[3,1],[0,6],[4,4],[0,1],[1,1],[0,8],[4,3],[0,1],[3,1],[0,1],[3,1],[0,3],[4,4],[0,1],[4,1],[0,1],[4,1],[0,1],[1,1],[0,10],[3,1],[0,2],[3,3],[0,2],[4,1],[0,2],[4,5],[0,1],[1,1],[0,9],[4,2],[0,2],[3,1],[0,4],[4,2],[0,7],[1,10],[4,2],[3,1],[0,24],[4,4],[0,2],[3,1],[0,21],[3,4]]} \ No newline at end of file diff --git a/apps/game/assets/maps/old_siding.map b/apps/game/assets/maps/old_siding.map new file mode 100644 index 0000000..ebd5780 --- /dev/null +++ b/apps/game/assets/maps/old_siding.map @@ -0,0 +1 @@ +{"format":"rpg-map","version":1,"width":24,"height":20,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":5,"y":0,"dx":-1,"dy":0},{"id":16,"x":13,"y":0,"dx":-4,"dy":0},{"id":16,"x":18,"y":0,"dx":-2,"dy":-1},{"id":16,"x":0,"y":1,"dx":-2,"dy":-2},{"id":16,"x":4,"y":1,"dx":0,"dy":-1},{"id":16,"x":6,"y":1,"dx":-2,"dy":2},{"id":16,"x":13,"y":2,"dx":3,"dy":1},{"id":16,"x":17,"y":2,"dx":0,"dy":-2},{"id":16,"x":15,"y":3,"dx":1,"dy":1},{"id":16,"x":19,"y":3,"dx":-1,"dy":2},{"id":16,"x":2,"y":4,"dx":-2,"dy":-1},{"id":16,"x":8,"y":4,"dx":-3,"dy":-1},{"id":16,"x":22,"y":4,"dx":-3,"dy":-1},{"id":16,"x":19,"y":5,"dx":0,"dy":0},{"id":16,"x":22,"y":5,"dx":0,"dy":0},{"id":16,"x":23,"y":5,"dx":-1,"dy":1},{"id":16,"x":19,"y":6,"dx":-3,"dy":1},{"id":16,"x":0,"y":7,"dx":1,"dy":-1},{"id":16,"x":17,"y":8,"dx":1,"dy":0},{"id":16,"x":19,"y":8,"dx":-1,"dy":-1},{"id":16,"x":22,"y":8,"dx":1,"dy":1},{"id":16,"x":5,"y":9,"dx":2,"dy":0},{"id":16,"x":20,"y":9,"dx":-3,"dy":-1},{"id":16,"x":17,"y":11,"dx":-2,"dy":1},{"id":16,"x":20,"y":11,"dx":-1,"dy":-1},{"id":16,"x":3,"y":13,"dx":2,"dy":0},{"id":16,"x":7,"y":13,"dx":-2,"dy":1},{"id":16,"x":17,"y":14,"dx":-2,"dy":-2},{"id":16,"x":3,"y":15,"dx":0,"dy":1},{"id":16,"x":8,"y":15,"dx":-3,"dy":1},{"id":16,"x":21,"y":15,"dx":-2,"dy":-1},{"id":16,"x":5,"y":16,"dx":-3,"dy":0},{"id":16,"x":3,"y":17,"dx":-3,"dy":-2},{"id":16,"x":4,"y":17,"dx":3,"dy":2},{"id":16,"x":8,"y":18,"dx":1,"dy":0},{"id":16,"x":14,"y":18,"dx":-4,"dy":-1},{"id":16,"x":7,"y":19,"dx":-1,"dy":1},{"id":16,"x":14,"y":19,"dx":0,"dy":1}],"encoding":"rle","tiles":[[4,2],[3,1],[4,23],[0,1],[4,25],[0,1],[4,30],[19,3],[4,6],[0,1],[4,14],[19,2],[4,1],[19,1],[4,2],[0,1],[4,3],[3,1],[4,13],[19,2],[4,2],[19,1],[4,8],[3,1],[4,7],[7,1],[4,2],[19,2],[4,3],[19,1],[4,5],[3,1],[4,2],[3,1],[4,9],[19,2],[4,4],[19,1],[4,7],[3,1],[4,9],[19,2],[4,5],[19,1],[4,7],[3,1],[4,4],[0,1],[4,3],[19,2],[4,6],[19,1],[4,3],[3,2],[1,10],[19,2],[1,1],[4,21],[19,2],[1,1],[4,21],[19,2],[1,1],[4,2],[7,1],[4,4],[0,1],[3,1],[4,6],[9,1],[4,5],[19,2],[1,1],[4,8],[3,1],[4,12],[19,2],[1,2],[4,9],[3,1],[4,9],[0,1],[19,2],[4,1],[1,1],[20,1],[4,19],[19,2],[4,9],[3,3],[4,8],[0,1],[4,14],[3,1],[4,22],[3,1],[4,1],[3,1],[4,21],[3,1]]} \ No newline at end of file diff --git a/apps/game/assets/maps/ponds.map b/apps/game/assets/maps/ponds.map index f72e0d8..fb1ba87 100644 --- a/apps/game/assets/maps/ponds.map +++ b/apps/game/assets/maps/ponds.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":24,"height":24,"blocked":[2,3,6,7,9,10],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":3,"y":0,"dx":-2,"dy":2},{"id":16,"x":14,"y":0,"dx":0,"dy":0},{"id":17,"x":2,"y":1,"dx":1,"dy":-1},{"id":16,"x":13,"y":1,"dx":-4,"dy":-2},{"id":16,"x":19,"y":1,"dx":-4,"dy":0},{"id":16,"x":23,"y":1,"dx":-2,"dy":1},{"id":16,"x":13,"y":2,"dx":2,"dy":1},{"id":16,"x":22,"y":2,"dx":3,"dy":1},{"id":16,"x":15,"y":3,"dx":-1,"dy":0},{"id":15,"x":10,"y":5,"dx":3,"dy":-2},{"id":16,"x":23,"y":5,"dx":-4,"dy":0},{"id":16,"x":6,"y":6,"dx":0,"dy":-1},{"id":15,"x":23,"y":6,"dx":-3,"dy":0},{"id":15,"x":3,"y":9,"dx":2,"dy":-2},{"id":16,"x":23,"y":9,"dx":1,"dy":-1},{"id":16,"x":22,"y":10,"dx":3,"dy":0},{"id":15,"x":1,"y":11,"dx":3,"dy":-1},{"id":16,"x":5,"y":11,"dx":1,"dy":-1},{"id":17,"x":20,"y":12,"dx":-3,"dy":-2},{"id":16,"x":21,"y":13,"dx":-1,"dy":1},{"id":16,"x":20,"y":14,"dx":1,"dy":2},{"id":16,"x":0,"y":16,"dx":2,"dy":1},{"id":15,"x":3,"y":17,"dx":4,"dy":-1},{"id":16,"x":15,"y":17,"dx":3,"dy":2},{"id":16,"x":22,"y":17,"dx":-2,"dy":2},{"id":16,"x":16,"y":18,"dx":0,"dy":0},{"id":15,"x":3,"y":19,"dx":3,"dy":0},{"id":15,"x":7,"y":19,"dx":0,"dy":-1},{"id":16,"x":14,"y":20,"dx":-2,"dy":-2},{"id":16,"x":19,"y":20,"dx":3,"dy":-1},{"id":16,"x":10,"y":21,"dx":2,"dy":1},{"id":16,"x":5,"y":22,"dx":1,"dy":1},{"id":16,"x":6,"y":22,"dx":-1,"dy":1},{"id":16,"x":14,"y":22,"dx":0,"dy":-1},{"id":16,"x":18,"y":22,"dx":0,"dy":-1},{"id":16,"x":19,"y":22,"dx":-1,"dy":-2},{"id":16,"x":22,"y":22,"dx":-4,"dy":-2},{"id":16,"x":7,"y":23,"dx":-2,"dy":-1},{"id":16,"x":15,"y":23,"dx":3,"dy":0},{"id":16,"x":17,"y":23,"dx":3,"dy":1}],"encoding":"rle","tiles":[[4,4],[0,1],[4,13],[0,3],[3,1],[4,2],[3,2],[0,4],[4,1],[0,1],[4,2],[0,1],[4,9],[0,3],[4,1],[3,2],[1,1],[0,3],[4,1],[0,1],[4,2],[0,1],[4,9],[0,1],[3,1],[4,3],[3,1],[4,1],[1,1],[0,1],[4,2],[0,2],[4,1],[0,2],[4,8],[0,1],[3,1],[0,2],[3,1],[0,5],[4,1],[0,2],[4,1],[0,2],[4,5],[0,1],[4,2],[0,1],[3,1],[0,2],[4,1],[0,2],[4,1],[1,1],[0,1],[4,1],[0,1],[4,1],[0,3],[4,4],[0,2],[4,3],[3,1],[0,1],[4,2],[3,1],[4,1],[0,1],[1,1],[0,1],[4,2],[0,6],[4,2],[5,1],[0,4],[4,1],[3,1],[0,1],[4,1],[0,1],[4,2],[1,2],[0,1],[4,1],[2,1],[0,1],[2,1],[4,1],[2,1],[4,1],[2,1],[0,1],[4,2],[0,1],[4,1],[0,2],[3,1],[4,3],[0,3],[1,1],[0,1],[4,1],[2,7],[4,1],[2,1],[4,1],[0,1],[4,1],[0,1],[4,1],[3,1],[4,2],[3,1],[0,2],[4,1],[1,3],[2,11],[0,3],[4,3],[3,2],[0,2],[2,2],[1,1],[2,10],[4,1],[2,1],[4,1],[0,1],[4,1],[3,2],[0,1],[4,1],[0,1],[4,2],[2,1],[1,2],[2,10],[4,1],[0,2],[4,2],[3,3],[0,2],[2,3],[1,1],[2,10],[0,2],[3,1],[4,2],[0,4],[4,1],[2,3],[1,1],[2,12],[4,1],[3,1],[4,2],[0,1],[3,1],[0,1],[4,1],[2,3],[1,1],[2,10],[4,5],[0,2],[4,4],[2,2],[1,2],[2,9],[4,2],[3,1],[4,1],[3,1],[4,1],[3,1],[0,2],[4,2],[2,2],[4,1],[1,1],[2,7],[4,1],[5,1],[4,2],[3,2],[4,4],[0,2],[4,1],[0,1],[5,1],[2,1],[1,1],[4,1],[2,2],[4,1],[2,1],[4,1],[2,2],[4,6],[3,1],[4,3],[0,2],[4,3],[1,7],[4,5],[3,1],[4,1],[0,1],[4,2],[3,1],[0,1],[4,2],[0,2],[4,13],[0,3],[4,1],[3,1],[4,2],[0,1],[4,1],[0,1],[4,4],[0,1],[5,1],[0,1],[4,7],[0,1],[4,1],[0,1],[4,1],[3,1],[4,3],[0,2],[4,4],[0,2],[4,10],[3,1],[4,11],[0,3],[4,21],[0,1],[4,10],[3,2]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":24,"height":24,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":3,"y":0,"dx":-2,"dy":2},{"id":16,"x":14,"y":0,"dx":0,"dy":0},{"id":17,"x":2,"y":1,"dx":1,"dy":-1},{"id":16,"x":13,"y":1,"dx":-4,"dy":-2},{"id":16,"x":19,"y":1,"dx":-4,"dy":0},{"id":16,"x":23,"y":1,"dx":-2,"dy":1},{"id":16,"x":13,"y":2,"dx":2,"dy":1},{"id":16,"x":22,"y":2,"dx":3,"dy":1},{"id":16,"x":15,"y":3,"dx":-1,"dy":0},{"id":15,"x":10,"y":5,"dx":3,"dy":-2},{"id":16,"x":23,"y":5,"dx":-4,"dy":0},{"id":16,"x":6,"y":6,"dx":0,"dy":-1},{"id":15,"x":23,"y":6,"dx":-3,"dy":0},{"id":15,"x":3,"y":9,"dx":2,"dy":-2},{"id":16,"x":23,"y":9,"dx":1,"dy":-1},{"id":16,"x":22,"y":10,"dx":3,"dy":0},{"id":15,"x":1,"y":11,"dx":3,"dy":-1},{"id":16,"x":5,"y":11,"dx":1,"dy":-1},{"id":17,"x":20,"y":12,"dx":-3,"dy":-2},{"id":16,"x":21,"y":13,"dx":-1,"dy":1},{"id":16,"x":20,"y":14,"dx":1,"dy":2},{"id":16,"x":0,"y":16,"dx":2,"dy":1},{"id":15,"x":3,"y":17,"dx":4,"dy":-1},{"id":16,"x":15,"y":17,"dx":3,"dy":2},{"id":16,"x":22,"y":17,"dx":-2,"dy":2},{"id":16,"x":16,"y":18,"dx":0,"dy":0},{"id":15,"x":3,"y":19,"dx":3,"dy":0},{"id":15,"x":7,"y":19,"dx":0,"dy":-1},{"id":16,"x":14,"y":20,"dx":-2,"dy":-2},{"id":16,"x":19,"y":20,"dx":3,"dy":-1},{"id":16,"x":10,"y":21,"dx":2,"dy":1},{"id":16,"x":5,"y":22,"dx":1,"dy":1},{"id":16,"x":6,"y":22,"dx":-1,"dy":1},{"id":16,"x":14,"y":22,"dx":0,"dy":-1},{"id":16,"x":18,"y":22,"dx":0,"dy":-1},{"id":16,"x":19,"y":22,"dx":-1,"dy":-2},{"id":16,"x":22,"y":22,"dx":-4,"dy":-2},{"id":16,"x":7,"y":23,"dx":-2,"dy":-1},{"id":16,"x":15,"y":23,"dx":3,"dy":0},{"id":16,"x":17,"y":23,"dx":3,"dy":1}],"encoding":"rle","tiles":[[4,4],[0,1],[4,13],[0,3],[3,1],[4,2],[3,2],[0,4],[4,1],[0,1],[4,2],[0,1],[4,9],[0,3],[4,1],[3,2],[1,1],[0,3],[4,1],[0,1],[4,2],[0,1],[4,9],[0,1],[3,1],[4,3],[3,1],[4,1],[1,1],[0,1],[4,2],[0,2],[4,1],[0,2],[4,8],[0,1],[3,1],[0,2],[3,1],[0,5],[4,1],[0,2],[4,1],[0,2],[4,5],[0,1],[4,2],[0,1],[3,1],[0,2],[4,1],[0,2],[4,1],[1,1],[0,1],[4,1],[0,1],[4,1],[0,3],[4,4],[0,2],[4,3],[3,1],[0,1],[4,2],[3,1],[4,1],[0,1],[1,1],[0,1],[4,2],[0,6],[4,2],[5,1],[0,4],[4,1],[3,1],[0,1],[4,1],[0,1],[4,2],[1,2],[0,1],[4,1],[2,1],[0,1],[2,1],[4,1],[2,1],[4,1],[2,1],[0,1],[4,2],[0,1],[4,1],[0,2],[3,1],[4,3],[0,3],[1,1],[0,1],[4,1],[2,7],[4,1],[2,1],[4,1],[0,1],[4,1],[0,1],[4,1],[3,1],[4,2],[3,1],[0,2],[4,1],[1,3],[2,11],[0,3],[4,3],[3,2],[0,2],[2,2],[1,1],[2,10],[4,1],[2,1],[4,1],[0,1],[4,1],[3,2],[0,1],[4,1],[0,1],[4,2],[2,1],[1,2],[2,10],[4,1],[0,2],[4,2],[3,3],[0,2],[2,3],[1,1],[2,10],[0,2],[3,1],[4,2],[0,4],[4,1],[2,3],[1,1],[2,12],[4,1],[3,1],[4,2],[0,1],[3,1],[0,1],[4,1],[2,3],[1,1],[2,10],[4,5],[0,2],[4,4],[2,2],[1,2],[2,9],[4,2],[3,1],[4,1],[3,1],[4,1],[3,1],[0,2],[4,2],[2,2],[4,1],[1,1],[2,7],[4,1],[5,1],[4,2],[3,2],[4,4],[0,2],[4,1],[0,1],[5,1],[2,1],[1,1],[4,1],[2,2],[4,1],[2,1],[4,1],[2,2],[4,6],[3,1],[4,3],[0,2],[4,3],[1,7],[4,5],[3,1],[4,1],[0,1],[4,2],[3,1],[0,1],[4,2],[0,2],[4,13],[0,3],[4,1],[3,1],[4,2],[0,1],[4,1],[0,1],[4,4],[0,1],[5,1],[0,1],[4,7],[0,1],[4,1],[0,1],[4,1],[3,1],[4,3],[0,2],[4,4],[0,2],[4,10],[3,1],[4,11],[0,3],[4,21],[0,1],[4,10],[3,2]]} \ No newline at end of file diff --git a/apps/game/assets/maps/rust_grove.map b/apps/game/assets/maps/rust_grove.map new file mode 100644 index 0000000..365e220 --- /dev/null +++ b/apps/game/assets/maps/rust_grove.map @@ -0,0 +1 @@ +{"format":"rpg-map","version":1,"width":24,"height":20,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":10,"y":0,"dx":1,"dy":1},{"id":16,"x":1,"y":2,"dx":-2,"dy":-1},{"id":16,"x":8,"y":3,"dx":-1,"dy":1},{"id":16,"x":9,"y":5,"dx":4,"dy":1},{"id":16,"x":15,"y":5,"dx":3,"dy":-1},{"id":16,"x":4,"y":8,"dx":3,"dy":1},{"id":16,"x":13,"y":9,"dx":-4,"dy":-2},{"id":16,"x":14,"y":11,"dx":-3,"dy":-1},{"id":16,"x":15,"y":11,"dx":-2,"dy":1},{"id":16,"x":9,"y":12,"dx":2,"dy":1},{"id":16,"x":12,"y":12,"dx":1,"dy":0},{"id":16,"x":20,"y":12,"dx":-2,"dy":-1},{"id":16,"x":2,"y":13,"dx":3,"dy":1},{"id":16,"x":23,"y":13,"dx":-3,"dy":1},{"id":16,"x":10,"y":14,"dx":3,"dy":2},{"id":17,"x":14,"y":14,"dx":1,"dy":0},{"id":16,"x":20,"y":16,"dx":-1,"dy":0},{"id":16,"x":12,"y":17,"dx":1,"dy":1},{"id":16,"x":14,"y":18,"dx":-2,"dy":2},{"id":16,"x":2,"y":19,"dx":2,"dy":1}],"encoding":"rle","tiles":[[3,4],[4,2],[3,4],[4,1],[3,2],[4,1],[3,4],[4,1],[3,2],[4,1],[3,10],[4,3],[3,5],[4,1],[3,3],[4,1],[3,1],[4,1],[3,2],[4,1],[3,2],[4,1],[3,1],[4,1],[3,2],[4,1],[3,2],[0,1],[3,1],[4,1],[3,4],[4,2],[3,2],[4,1],[3,3],[4,3],[3,2],[4,1],[3,1],[4,2],[3,1],[4,1],[18,1],[3,1],[18,1],[3,9],[4,1],[3,1],[4,1],[18,1],[3,3],[4,2],[3,1],[4,2],[3,2],[4,1],[3,1],[4,1],[3,3],[4,1],[3,7],[18,1],[3,2],[4,3],[3,2],[4,3],[3,4],[4,2],[3,4],[4,1],[3,2],[4,1],[3,3],[4,1],[3,3],[4,1],[3,1],[4,3],[3,9],[4,1],[3,1],[4,6],[3,1],[4,1],[3,2],[4,3],[3,1],[4,1],[3,4],[4,2],[3,1],[4,1],[3,1],[4,3],[3,1],[4,2],[1,1],[4,5],[3,1],[4,1],[3,1],[4,2],[3,3],[4,2],[3,5],[4,9],[3,1],[4,4],[3,2],[1,8],[4,7],[1,7],[3,4],[4,15],[3,1],[4,1],[3,3],[4,1],[3,6],[4,9],[3,2],[4,1],[3,2],[4,2],[3,4],[4,1],[3,1],[4,1],[3,3],[4,8],[3,4],[4,1],[3,2],[4,1],[3,9],[4,5],[0,1],[3,3],[18,1],[3,1],[4,1],[3,1],[4,2],[3,2],[4,1],[3,2],[4,1],[3,1],[4,1],[3,2],[18,1],[3,2],[4,1],[3,2],[4,1],[18,1],[4,3],[3,1],[4,1],[3,3],[4,1],[3,3],[4,1],[3,1],[4,1],[3,1],[4,4],[3,2],[4,5],[3,1],[4,1],[3,5],[4,2],[3,1],[4,1],[3,1],[4,2],[3,1],[4,2],[3,1],[4,1],[3,1],[4,1],[3,1],[4,2],[3,3],[4,1],[3,3],[4,2],[3,2],[4,2],[3,3],[4,2],[3,2],[4,1],[3,5],[4,4],[3,7],[4,2],[3,3],[4,3],[3,1],[4,2],[3,3]]} \ No newline at end of file diff --git a/apps/game/assets/maps/shop.map b/apps/game/assets/maps/shop.map index ceeca16..0b18212 100644 --- a/apps/game/assets/maps/shop.map +++ b/apps/game/assets/maps/shop.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":11,"height":9,"blocked":[2,3,6,7,9,10],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8}},"encoding":"rle","tiles":[[9,12],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,6],[8,1],[9,5]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":11,"height":9,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"encoding":"rle","tiles":[[9,12],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,2],[8,9],[9,6],[8,1],[9,5]]} \ No newline at end of file diff --git a/apps/game/assets/maps/zvenets.map b/apps/game/assets/maps/zvenets.map index 0d8fb72..39815e3 100644 --- a/apps/game/assets/maps/zvenets.map +++ b/apps/game/assets/maps/zvenets.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":28,"height":20,"blocked":[2,3,6,7,9,10],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":14,"y":0,"dx":1,"dy":1},{"id":16,"x":23,"y":0,"dx":0,"dy":1},{"id":16,"x":26,"y":0,"dx":3,"dy":1},{"id":16,"x":3,"y":1,"dx":0,"dy":0},{"id":17,"x":9,"y":1,"dx":3,"dy":0},{"id":15,"x":10,"y":1,"dx":3,"dy":2},{"id":16,"x":19,"y":1,"dx":-1,"dy":1},{"id":16,"x":1,"y":2,"dx":1,"dy":0},{"id":16,"x":3,"y":2,"dx":4,"dy":1},{"id":16,"x":11,"y":2,"dx":-1,"dy":-2},{"id":15,"x":10,"y":3,"dx":4,"dy":1},{"id":16,"x":15,"y":3,"dx":0,"dy":0},{"id":16,"x":26,"y":5,"dx":3,"dy":-1},{"id":16,"x":20,"y":6,"dx":1,"dy":-1},{"id":16,"x":26,"y":6,"dx":-2,"dy":-2},{"id":16,"x":5,"y":7,"dx":1,"dy":-2},{"id":16,"x":7,"y":7,"dx":0,"dy":0},{"id":16,"x":3,"y":8,"dx":3,"dy":2},{"id":16,"x":17,"y":8,"dx":1,"dy":0},{"id":16,"x":22,"y":9,"dx":1,"dy":-1},{"id":16,"x":2,"y":11,"dx":-3,"dy":-1},{"id":16,"x":26,"y":11,"dx":1,"dy":1},{"id":15,"x":4,"y":12,"dx":4,"dy":0},{"id":17,"x":23,"y":12,"dx":-2,"dy":2},{"id":15,"x":4,"y":14,"dx":-1,"dy":-1},{"id":15,"x":11,"y":14,"dx":3,"dy":1},{"id":16,"x":17,"y":14,"dx":-4,"dy":2},{"id":16,"x":23,"y":16,"dx":3,"dy":-2},{"id":17,"x":16,"y":17,"dx":3,"dy":-2},{"id":16,"x":5,"y":18,"dx":0,"dy":2}],"encoding":"rle","tiles":[[4,30],[3,1],[4,6],[0,4],[4,13],[3,1],[4,9],[0,2],[4,2],[0,1],[4,23],[0,3],[4,1],[0,1],[4,12],[3,1],[4,2],[3,1],[4,1],[3,1],[4,5],[0,5],[4,12],[3,1],[4,2],[0,2],[4,6],[0,5],[4,1],[0,1],[4,3],[7,1],[4,6],[3,1],[4,3],[3,1],[4,5],[7,1],[4,1],[10,1],[1,10],[4,8],[3,1],[0,2],[4,6],[1,5],[6,1],[4,1],[1,1],[4,1],[1,2],[4,6],[3,3],[4,1],[3,1],[4,6],[1,8],[4,1],[1,1],[4,6],[3,1],[4,3],[0,1],[4,7],[1,1],[4,1],[1,9],[4,1],[7,1],[4,8],[1,12],[0,1],[1,1],[4,1],[1,3],[4,1],[0,3],[4,4],[3,1],[0,1],[4,7],[1,2],[4,1],[1,8],[0,4],[4,5],[3,1],[0,5],[4,2],[1,11],[4,1],[0,3],[4,6],[3,1],[0,6],[1,8],[4,1],[1,2],[4,1],[0,3],[4,4],[3,1],[4,3],[0,3],[4,1],[0,5],[4,17],[0,1],[4,1],[0,2],[4,1],[0,1],[4,1],[0,2],[4,5],[0,4],[4,7],[3,1],[0,2],[4,1],[0,1],[4,1],[0,2],[4,2],[0,2],[4,4],[0,5],[4,5],[3,2],[4,2],[0,1],[3,1],[4,5],[0,12],[4,8],[0,3],[4,6],[0,5],[4,1],[0,5],[4,4],[0,1],[3,1],[0,1],[4,1],[3,1],[0,1],[4,7],[0,7],[4,1],[0,3],[4,4],[0,3],[4,1]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":28,"height":20,"blocked":[2,3,6,7,9,10,18,21],"tall":{"3":{"height":1.5,"ground":0},"6":{"height":2.5,"ground":1},"7":{"height":1.75,"ground":4,"shadow":true},"9":{"height":1,"ground":8},"18":{"height":0.6,"ground":4},"21":{"height":2.5,"ground":8}},"variants":{"0":[0,11,12],"1":[1,14],"4":[4,13]},"decor":[{"id":16,"x":14,"y":0,"dx":1,"dy":1},{"id":16,"x":23,"y":0,"dx":0,"dy":1},{"id":16,"x":26,"y":0,"dx":3,"dy":1},{"id":16,"x":3,"y":1,"dx":0,"dy":0},{"id":17,"x":9,"y":1,"dx":3,"dy":0},{"id":15,"x":10,"y":1,"dx":3,"dy":2},{"id":16,"x":19,"y":1,"dx":-1,"dy":1},{"id":16,"x":1,"y":2,"dx":1,"dy":0},{"id":16,"x":3,"y":2,"dx":4,"dy":1},{"id":16,"x":11,"y":2,"dx":-1,"dy":-2},{"id":15,"x":10,"y":3,"dx":4,"dy":1},{"id":16,"x":15,"y":3,"dx":0,"dy":0},{"id":16,"x":26,"y":5,"dx":3,"dy":-1},{"id":16,"x":20,"y":6,"dx":1,"dy":-1},{"id":16,"x":26,"y":6,"dx":-2,"dy":-2},{"id":16,"x":5,"y":7,"dx":1,"dy":-2},{"id":16,"x":7,"y":7,"dx":0,"dy":0},{"id":16,"x":3,"y":8,"dx":3,"dy":2},{"id":16,"x":17,"y":8,"dx":1,"dy":0},{"id":16,"x":22,"y":9,"dx":1,"dy":-1},{"id":16,"x":2,"y":11,"dx":-3,"dy":-1},{"id":16,"x":26,"y":11,"dx":1,"dy":1},{"id":15,"x":4,"y":12,"dx":4,"dy":0},{"id":17,"x":23,"y":12,"dx":-2,"dy":2},{"id":15,"x":4,"y":14,"dx":-1,"dy":-1},{"id":15,"x":11,"y":14,"dx":3,"dy":1},{"id":16,"x":17,"y":14,"dx":-4,"dy":2},{"id":16,"x":23,"y":16,"dx":3,"dy":-2},{"id":17,"x":16,"y":17,"dx":3,"dy":-2},{"id":16,"x":5,"y":18,"dx":0,"dy":2}],"encoding":"rle","tiles":[[4,30],[3,1],[4,6],[0,4],[4,13],[3,1],[4,9],[0,2],[4,2],[0,1],[4,23],[0,3],[4,1],[0,1],[4,12],[3,1],[4,2],[3,1],[4,1],[3,1],[4,5],[0,5],[4,12],[3,1],[4,2],[0,2],[4,6],[0,5],[4,1],[0,1],[4,3],[7,1],[4,6],[3,1],[4,3],[3,1],[4,5],[7,1],[4,1],[10,1],[1,10],[4,8],[3,1],[0,2],[4,6],[1,5],[6,1],[4,1],[1,1],[4,1],[1,2],[4,6],[3,3],[4,1],[3,1],[4,6],[1,8],[4,1],[1,1],[4,6],[3,1],[4,3],[0,1],[4,7],[1,1],[4,1],[1,9],[4,1],[7,1],[4,8],[1,12],[0,1],[1,1],[4,1],[1,3],[4,1],[0,3],[4,1],[1,2],[4,1],[3,1],[0,1],[4,7],[1,2],[4,1],[1,8],[0,4],[4,5],[3,1],[0,5],[4,2],[1,11],[4,1],[0,3],[4,6],[3,1],[0,6],[1,8],[4,1],[1,2],[4,1],[0,3],[4,4],[3,1],[4,3],[0,3],[4,1],[0,5],[4,17],[0,1],[4,1],[0,2],[4,1],[0,1],[4,1],[0,2],[4,5],[0,4],[4,7],[3,1],[0,2],[4,1],[0,1],[4,1],[0,2],[4,2],[0,2],[4,4],[0,5],[4,5],[3,2],[4,2],[0,1],[3,1],[4,5],[0,12],[4,8],[0,3],[4,6],[0,5],[4,1],[0,5],[4,4],[0,1],[3,1],[0,1],[4,1],[3,1],[0,1],[4,7],[0,7],[4,1],[0,3],[4,4],[0,3],[4,1]]} \ No newline at end of file diff --git a/apps/game/assets/tiles/machine.png b/apps/game/assets/tiles/machine.png new file mode 100644 index 0000000..818d12e --- /dev/null +++ b/apps/game/assets/tiles/machine.png Binary files differ diff --git a/apps/game/assets/tiles/rail.png b/apps/game/assets/tiles/rail.png new file mode 100644 index 0000000..4c4f8ad --- /dev/null +++ b/apps/game/assets/tiles/rail.png Binary files differ diff --git a/apps/game/assets/tiles/stairs.png b/apps/game/assets/tiles/stairs.png new file mode 100644 index 0000000..96bdcea --- /dev/null +++ b/apps/game/assets/tiles/stairs.png Binary files differ diff --git a/apps/game/assets/tiles/wire.png b/apps/game/assets/tiles/wire.png new file mode 100644 index 0000000..dde080e --- /dev/null +++ b/apps/game/assets/tiles/wire.png Binary files differ diff --git a/apps/game/src/Game.ts b/apps/game/src/Game.ts index 0ce79e3..140b7c7 100644 --- a/apps/game/src/Game.ts +++ b/apps/game/src/Game.ts @@ -64,7 +64,11 @@ 'tiles/floor', 'tiles/wall', 'tiles/well', - 'tiles/chest' + 'tiles/chest', + 'tiles/wire', + 'tiles/rail', + 'tiles/stairs', + 'tiles/machine' ]; /** Ключи аудио (WAV): sfx + амбиент-лупы областей (реестр в data/audio.ts). */ diff --git a/apps/game/src/data/assetSets.ts b/apps/game/src/data/assetSets.ts index bfffea8..5ed672c 100644 --- a/apps/game/src/data/assetSets.ts +++ b/apps/game/src/data/assetSets.ts @@ -28,7 +28,12 @@ [TILES.HOUSE, a.texture('tiles/house')], [TILES.FLOOR, a.texture('tiles/floor')], [TILES.WALL, a.texture('tiles/wall')], - [TILES.WELL, a.texture('tiles/well')] + [TILES.WELL, a.texture('tiles/well')], + // Акт 2: роща и разъезд. + [TILES.WIRE, a.texture('tiles/wire')], + [TILES.RAIL, a.texture('tiles/rail')], + [TILES.STAIRS, a.texture('tiles/stairs')], + [TILES.MACHINE, a.texture('tiles/machine')] ]); } diff --git a/apps/game/src/data/locations.ts b/apps/game/src/data/locations.ts index 229a0d2..0e10653 100644 --- a/apps/game/src/data/locations.ts +++ b/apps/game/src/data/locations.ts @@ -11,7 +11,15 @@ * файлами assets/maps/.map (формат rpg-map, RLE) и загружаются через * parseMap в BootScene. */ -export type AreaId = 'meadows' | 'ponds' | 'zvenets' | 'house_elder' | 'shop'; +export type AreaId = + | 'meadows' + | 'ponds' + | 'zvenets' + | 'rust_grove' + | 'old_siding' + | 'machine_hall' + | 'house_elder' + | 'shop'; /** Куда ведёт переход: в другую область (с точкой входа) или назад, откуда вошли. */ export type TransitionTarget = @@ -275,7 +283,9 @@ target: { kind: 'area', area: 'shop', entry: { x: 5, y: 7 } }, trigger: 'click', duration: 0.2 - } + }, + // Восточный край: тропа в Ржавую рощу (акт 2). + { tile: { x: 26, y: 10 }, target: { kind: 'area', area: 'rust_grove', entry: { x: 2, y: 10 } } } ], interactables: INTERACTABLES.zvenets, atmosphere: 'ash', @@ -307,6 +317,117 @@ { key: 'ambience/houses', tiles: [TILES.HOUSE], radius: 5, volume: 0.4 } ] }, + // --- акт 2: роща, разъезд, подземелье --- + rust_grove: { + id: 'rust_grove', + name: 'Ржавая роща', + ambience: 'ambience/ponds', + spawn: { x: 2, y: 10 }, + npcs: [], + enemies: [ + { kind: 'crawler', tile: { x: 6, y: 6 } }, + { kind: 'crawler', tile: { x: 17, y: 7 } }, + { + kind: 'spitter', + tile: { x: 18, y: 16 }, + patrol: { points: [{ x: 18, y: 16 }, { x: 20, y: 14 }], pauseSec: 1.4 } + }, + { kind: 'heavy', tile: { x: 7, y: 15 } } + ], + transitions: [ + // Тропа обратно в Звенец. + { tile: { x: 1, y: 10 }, target: { kind: 'area', area: 'zvenets', entry: { x: 25, y: 10 } } }, + // Тропа на восток: к Старому разъезду. + { tile: { x: 22, y: 10 }, target: { kind: 'area', area: 'old_siding', entry: { x: 2, y: 10 } } } + ], + atmosphere: 'ash', + // Роща темнее лугов: мёртвый лес глушит свет; вечером — глухая синева. + lighting: { ambient: 0xb0b4c0, nightAmbient: 0x565c74 }, + // Ветер в проводах: гул башни не слышен, только кабельный звон. + ambienceLayers: [{ key: 'ambience/wind', volume: 0.4 }] + }, + old_siding: { + id: 'old_siding', + name: 'Старый разъезд', + ambience: 'ambience/ponds', + spawn: { x: 2, y: 10 }, + npcs: [], + enemies: [ + { kind: 'crawler', tile: { x: 7, y: 9 } }, + { + kind: 'spitter', + tile: { x: 18, y: 8 }, + patrol: { points: [{ x: 18, y: 8 }, { x: 19, y: 6 }], pauseSec: 1.2 } + }, + { + kind: 'heavy', + tile: { x: 18, y: 16 }, + patrol: { points: [{ x: 18, y: 16 }, { x: 15, y: 17 }], pauseSec: 2 } + } + ], + transitions: [ + // Тропа обратно в рощу. + { tile: { x: 1, y: 10 }, target: { kind: 'area', area: 'rust_grove', entry: { x: 21, y: 10 } } }, + // Люк-ступени вниз, в зал Старой Машины (наступил — спустился). + { + tile: { x: 15, y: 15 }, + label: 'Люк в подземелье', + target: { kind: 'area', area: 'machine_hall', entry: { x: 6, y: 9 } }, + duration: 0.6 + } + ], + atmosphere: 'ash', + // Разъезд ещё темнее рощи: рельсы тянут свет в землю. + lighting: { ambient: 0xa4a8b6, nightAmbient: 0x4e546c }, + // Гул снизу: Машина дышит у люка (та же нота, что башня Звенца). + ambienceLayers: [ + { key: 'ambience/wind', volume: 0.25 }, + { key: 'ambience/tower_hum', at: { x: 15, y: 15 }, radius: 7, volume: 0.45 } + ], + // Свежий накат наметало у рельсов: без полотна рядом с люком не дышать. + hazards: [ + { + name: 'Накат у рельсов', + requiresItem: 'cloth', + tiles: [ + { x: 13, y: 15 }, + { x: 14, y: 15 }, + { x: 16, y: 15 }, + { x: 15, y: 14 }, + { x: 16, y: 16 }, + { x: 17, y: 15 } + ] + } + ] + }, + machine_hall: { + id: 'machine_hall', + name: 'Зал Старой Машины', + spawn: { x: 6, y: 9 }, + npcs: [], + enemies: [], + transitions: [ + // Проём в нижней стене: шаг — назад наверх, к люку. + { tile: { x: 6, y: 10 }, target: { kind: 'return' }, duration: 0.2 } + ], + atmosphere: 'none', + // Под землёй темно; единственный свет — холодное тление устья печи. + lighting: { + ambient: 0x3e4252, + sources: [ + { + id: 'machine_mouth', + at: { x: 5.5, y: 1.5 }, + color: 0x4a737f, + radius: 3.5, + intensity: 0.55, + flicker: 0.3 + } + ] + }, + // Гул здесь — везде: это её грудная клетка. + ambienceLayers: [{ key: 'ambience/tower_hum', volume: 0.6 }] + }, // --- интерьеры: рамка WALL, пол FLOOR, дверной проём снизу --- house_elder: { id: 'house_elder', diff --git a/apps/game/src/data/map.ts b/apps/game/src/data/map.ts index c5495f2..a6f68cf 100644 --- a/apps/game/src/data/map.ts +++ b/apps/game/src/data/map.ts @@ -13,6 +13,15 @@ FLOOR: 8, WALL: 9, WELL: 10, + // --- акт 2 --- + /** Бухта кабеля/труб в Ржавой роще (низкий tall-объект). */ + WIRE: 18, + /** Рельсы Старого разъезда (ходовые: шпалы с нитями). */ + RAIL: 19, + /** Люк-ступени вниз в зал Машины (ходовой тайл, step-переход). */ + STAIRS: 20, + /** Сама Старая Машина (tall-объект зала, непроходима). */ + MACHINE: 21, // Варианты текстур (микс по хэшу координат) — в tiles никогда не попадают. GRASS_V1: 11, GRASS_V2: 12, @@ -20,7 +29,16 @@ PATH_V1: 14 } as const; -const BLOCKED = [TILES.WATER, TILES.TREE, TILES.TOWER, TILES.HOUSE, TILES.WALL, TILES.WELL]; +const BLOCKED = [ + TILES.WATER, + TILES.TREE, + TILES.TOWER, + TILES.HOUSE, + TILES.WALL, + TILES.WELL, + TILES.WIRE, + TILES.MACHINE +]; /** Дерево — высокий объект 1.5 мировых юнита (48 px), под ним трава. */ export const TALL_OBJECTS: Record = { @@ -28,7 +46,11 @@ [TILES.TOWER]: { height: 2.5, ground: TILES.PATH }, [TILES.HOUSE]: { height: 1.75, ground: TILES.ASH, shadow: true }, // Стены интерьеров — вертикальные объекты, под ними пол. - [TILES.WALL]: { height: 1, ground: TILES.FLOOR } + [TILES.WALL]: { height: 1, ground: TILES.FLOOR }, + // Бухта кабеля — низкая груда на пепле. + [TILES.WIRE]: { height: 0.6, ground: TILES.ASH }, + // Старая Машина — ростом с башню, стоит на полу зала. + [TILES.MACHINE]: { height: 2.5, ground: TILES.FLOOR } }; /** @@ -197,6 +219,192 @@ } /** + * Локация «Ржавая роща»: мёртвый лес, оплетённый кабелями и трубами. + * Деревья стоят как механизмы — плотная роща с бухтами кабеля (WIRE), + * тропа с запада (из Звенца) на восток (к разъезду) через поляну + * мастерской Клинта в центре. + */ +export function buildRustGroveMap(width = 24, height = 20): TileMapData { + const seed = 20260908; + const rng = createRng(seed); + const tiles: number[] = new Array(width * height).fill(TILES.ASH); + const at = (x: number, y: number) => y * width + x; + + // Редкие проплешины чахлой травы. + for (let i = 0; i < 12; i++) { + const x = Math.floor(rng.next() * width); + const y = Math.floor(rng.next() * height); + if (tiles[at(x, y)] === TILES.ASH) tiles[at(x, y)] = TILES.GRASS; + } + + // Плотная роща: деревья гуще к краям, реже к центру. + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const d = Math.hypot((x - width / 2) / (width / 2), (y - height / 2) / (height / 2)); + if (rng.next() < 0.16 + d * 0.5 && (tiles[at(x, y)] === TILES.ASH || tiles[at(x, y)] === TILES.GRASS)) { + tiles[at(x, y)] = TILES.TREE; + } + } + } + + // Бухты кабеля: короткие цепочки по 1–3 тайла (как протянутые шлейфы). + for (const [bx, by, dir] of [ + [5, 4, 1], + [16, 3, -1], + [8, 15, 1], + [18, 14, -1], + [12, 5, 0] + ] as [number, number, number][]) { + for (let i = 0; i < 3; i++) { + const nx = bx + i * dir; + const ny = by + (i % 2); + if (nx >= 0 && ny >= 0 && nx < width && ny < height && tiles[at(nx, ny)] !== TILES.TREE) { + tiles[at(nx, ny)] = TILES.WIRE; + } + } + } + + // Тропа: с запада (вход из Звенца) на восток (к разъезду) — до самого + // тайла перехода (22,10), чтобы A* всегда доводил. + for (let x = 1; x <= 22; x++) tiles[at(x, 10)] = TILES.PATH; + + // Спавны врагов расчищаем: роща плотная — дерево могло вырасти на тайле. + for (const [ex, ey] of [ + [6, 6], + [17, 7], + [18, 16], + [20, 14], + [7, 15] + ]) { + if (tiles[at(ex, ey)] === TILES.TREE || tiles[at(ex, ey)] === TILES.WIRE) { + tiles[at(ex, ey)] = TILES.ASH; + } + } + + // Поляна мастерской Клинта: расчистка и утоптанный пепел вокруг центра. + for (let dy = -2; dy <= 2; dy++) { + for (let dx = -3; dx <= 3; dx++) { + const nx = 12 + dx; + const ny = 10 + dy; + if (nx >= 0 && ny >= 0 && nx < width && ny < height && Math.abs(dx) + Math.abs(dy) <= 4) { + tiles[at(nx, ny)] = TILES.ASH; + } + } + } + // Пятачок тропы у поляны (позже сюда встанет резонатор Клинта). + tiles[at(12, 8)] = TILES.PATH; + + // Входы/выходы: тайлы переходов всегда проходимы. + tiles[at(2, 10)] = TILES.PATH; + tiles[at(22, 10)] = TILES.PATH; + + return { + width, + height, + tiles, + blocked: [...BLOCKED], + tall: TALL_OBJECTS, + variants: GROUND_VARIANTS, + decor: buildDecor(tiles, width, height, seed) + }; +} + +/** + * Локация «Старый разъезд»: руины узловой станции. Через карту идут рельсы, + * вдоль них — вагоны-времянки (HOUSE) и редкие сухие деревья. Южнее стрелки — + * люк-ступени (STAIRS) вниз в зал Старой Машины. + */ +export function buildOldSidingMap(width = 24, height = 20): TileMapData { + const seed = 20260909; + const rng = createRng(seed); + const tiles: number[] = new Array(width * height).fill(TILES.ASH); + const at = (x: number, y: number) => y * width + x; + + // Редкие проплешины травы. + for (let i = 0; i < 10; i++) { + const x = Math.floor(rng.next() * width); + const y = Math.floor(rng.next() * height); + if (tiles[at(x, y)] === TILES.ASH) tiles[at(x, y)] = TILES.GRASS; + } + + // Рельсы: главная линия поперёк карты (вертикальная нить в изометрии). + for (let y = 3; y <= 16; y++) { + tiles[at(11, y)] = TILES.RAIL; + tiles[at(12, y)] = TILES.RAIL; + } + // Стрелка: боковая ветка к северо-востоку. + for (let x = 13; x <= 19; x++) tiles[at(x, 3 + (x - 13))] = TILES.RAIL; + + // Руины станции: пара вагонов-времянок и останки стены. + tiles[at(8, 6)] = TILES.HOUSE; + tiles[at(16, 12)] = TILES.HOUSE; + tiles[at(5, 13)] = TILES.WALL; + + // Редкие сухие деревья по краям. + for (let i = 0; i < 22; i++) { + const edge = rng.next() < 0.5; + const x = edge ? Math.floor(rng.next() * 3) : width - 1 - Math.floor(rng.next() * 3); + const y = Math.floor(rng.next() * height); + if (tiles[at(x, y)] === TILES.ASH || tiles[at(x, y)] === TILES.GRASS) { + tiles[at(x, y)] = TILES.TREE; + } + } + + // Тропа от западного входа к рельсам, вдоль них и к люку. + for (let x = 1; x <= 10; x++) tiles[at(x, 10)] = TILES.PATH; + for (let y = 10; y <= 14; y++) tiles[at(13, y)] = TILES.PATH; + tiles[at(14, 14)] = TILES.PATH; + tiles[at(14, 15)] = TILES.PATH; + + // Люк-ступени вниз (step-переход в зал Машины), рядом тропа. + tiles[at(15, 15)] = TILES.STAIRS; + + // Вход всегда проходим. + tiles[at(2, 10)] = TILES.PATH; + + return { + width, + height, + tiles, + blocked: [...BLOCKED], + tall: TALL_OBJECTS, + variants: GROUND_VARIANTS, + decor: buildDecor(tiles, width, height, seed) + }; +} + +/** + * Зал Старой Машины (подземелье разъезда): тесный интерьер с плитами пола, + * у северной стены — сама Машина (два тайла корпуса). Рельсы подходят к ней + * со стороны входа. Дверной проём снизу (kind 'return' наверх). + */ +export function buildMachineHallMap(): TileMapData { + const width = 13; + const height = 11; + const tiles: number[] = new Array(width * height).fill(TILES.WALL); + const at = (x: number, y: number) => y * width + x; + for (let y = 1; y < height - 1; y++) { + for (let x = 1; x < width - 1; x++) { + tiles[at(x, y)] = TILES.FLOOR; + } + } + // Машина: корпус в два тайла у северной стены. + tiles[at(5, 1)] = TILES.MACHINE; + tiles[at(6, 1)] = TILES.MACHINE; + // Рельсы подходят к Машине — её кормили составами. + for (let y = 3; y <= 9; y++) tiles[at(6, y)] = TILES.RAIL; + // Дверной проём в нижней стене (step-переход kind 'return'). + tiles[at(6, height - 1)] = TILES.FLOOR; + return { + width, + height, + tiles, + blocked: [...BLOCKED], + tall: TALL_OBJECTS + }; +} + +/** * Локация «Серые пруды»: опасная зона — большая гладь воды, туман, * много пепла и сгустков. Тропа начинается в северо-западном углу * (обратный переход на луга). @@ -387,6 +595,18 @@ tiles[at(2, 10)] = TILES.PATH; tiles[at(3, 10)] = TILES.PATH; + // Тропа в Ржавую рощу: восточный край (вокруг тоже расчищаем). + for (let dy = -1; dy <= 1; dy++) { + for (let dx = -2; dx <= 0; dx++) { + const nx = 26 + dx; + const ny = 10 + dy; + if (nx >= 0 && ny >= 0 && nx < width && ny < height) { + tiles[at(nx, ny)] = dx === -1 && dy === 0 ? TILES.PATH : TILES.ASH; + } + } + } + tiles[at(26, 10)] = TILES.PATH; + return { width, height, diff --git a/apps/game/tools/checks/transitions.mjs b/apps/game/tools/checks/transitions.mjs index a6ca710..bc209c4 100644 --- a/apps/game/tools/checks/transitions.mjs +++ b/apps/game/tools/checks/transitions.mjs @@ -3,7 +3,8 @@ * 1) step-переход: пешком в Звенец -> area==='zvenets'. * 2) клик-переход: клик по колодцу у дома Ирвина -> телепорт на луга (entry (22,21)). * 3) обратный колодец: клик по луговому колодцу -> возврат в Звенец. - * 4) снапшот перечисляет переходы области с триггерами. + * 4) акт 2: Звенец -> Ржавая роща -> Старый разъезд -> зал Машины (step). + * 5) снапшот перечисляет переходы области с триггерами. * Запуск: node tools/agent.mjs run tools/checks/transitions.mjs */ import { withChecks } from '../lib.mjs'; @@ -51,6 +52,20 @@ ); return null; }); + await c.run('акт 2: Звенец -> роща -> разъезд -> зал Машины', async () => { + // Цепочка step-переходов акта 2: восток Звенца -> роща -> разъезд, + // затем люк (15,15) вниз в зал Машины. Врагов спим на каждой + // области: бой сбивает маршрут (как в smoke-act1). + await t.sleepEnemies(); + await t.goToArea('rust_grove', { x: 26, y: 10 }); + await t.sleepEnemies(); + await t.goToArea('old_siding', { x: 22, y: 10 }); + await t.sleepEnemies(); + await t.goToArea('machine_hall', { x: 15, y: 15 }); + // Обратно наверх: проём в нижней стене зала. + await t.goToArea('old_siding', { x: 6, y: 10 }); + return null; + }); }, { pretty } ); diff --git a/apps/game/tools/maps/gen.test.ts b/apps/game/tools/maps/gen.test.ts index 96c58af..843dcaa 100644 --- a/apps/game/tools/maps/gen.test.ts +++ b/apps/game/tools/maps/gen.test.ts @@ -7,6 +7,9 @@ buildMeadowsMap, buildPondsMap, buildZvenetsMap, + buildRustGroveMap, + buildOldSidingMap, + buildMachineHallMap, buildHouseElderMap, buildShopMap } from '../../src/data/map'; @@ -26,6 +29,9 @@ meadows: buildMeadowsMap(), ponds: buildPondsMap(), zvenets: buildZvenetsMap(), + rust_grove: buildRustGroveMap(), + old_siding: buildOldSidingMap(), + machine_hall: buildMachineHallMap(), house_elder: buildHouseElderMap(), shop: buildShopMap() }; diff --git a/apps/game/tools/pixelart/gen.mjs b/apps/game/tools/pixelart/gen.mjs index 52b6f1d..1bf4905 100644 --- a/apps/game/tools/pixelart/gen.mjs +++ b/apps/game/tools/pixelart/gen.mjs @@ -498,6 +498,163 @@ return c; } +// ---------- тайлы акта 2: роща и разъезд ---------- + +/** Бухта кабеля: ржавые кольца труб/кабелей, лежат грудой (низкий tall-объект). */ +function wireTile() { + const c = new Canvas(...SIZES.tall.wire); + const r = rng(1515); + + // Груда: три кольца-сечения, нижнее шире (перспективный вал). + const rings = [ + { y: 24, half: 8, h: 5 }, + { y: 18, half: 6, h: 4 }, + { y: 13, half: 4, h: 4 } + ]; + for (const { y, half, h } of rings) { + for (let dy = 0; dy < h; dy++) { + for (let dx = -half; dx <= half; dx++) { + // Пустота внутри эллипса кольца (сечение трубы). + const inside = Math.abs(dx) < half - 2 && dy > 0 && dy < h - 1; + if (inside) continue; + // Ржавчина: внешняя дуга рыжая, тень снизу. + const rust = dy === 0 || dx === -half; + c.set(16 + dx, y + dy, rust ? (r() < 0.6 ? 'R2' : 'R1') : r() < 0.7 ? 'M1' : 'M0'); + } + } + // Сердцевина сечения — темный провал. + c.set(16, y + 1, 'P0'); + c.set(15, y + 2, 'P1'); + c.set(17, y + 2, 'P1'); + // Блик по верху кольца. + c.set(16 - half + 1, y, 'M2'); + c.set(16 + half - 1, y, 'M2'); + } + // Одиночный хвост кабеля в сторону. + for (let dx = 0; dx < 6; dx++) c.set(23 + dx, 28 + (dx % 2), dx < 4 ? 'M1' : 'M0'); + // Пепел у подножия. + c.set(6, 30, 'P5'); + c.set(26, 30, 'P5'); + return c; +} + +/** Рельсы: две нити со шпалами вдоль оси Y (экранная вертикаль ромба). */ +function railTile() { + const c = tileBase('P2', 'P3', 'P1', 19, 14); + const inDiamond = (x, y) => Math.abs(x - 15.5) / 16 + Math.abs(y - 7.5) / 8 <= 1; + // Шпалы: горизонтальные доски T0/T1 через равные промежутки. + for (const y of [3, 6, 9, 12]) { + for (let x = 2; x <= 29; x++) { + if (inDiamond(x, y)) c.set(x, y, x % 5 === 0 ? 'T0' : 'T1'); + } + } + // Нити рельсов: вертикальные полосы ржавого металла с бликом. + for (const [x1, x2] of [[11, 12], [19, 20]]) { + for (let y = 0; y <= 15; y++) { + for (const x of [x1, x2]) { + if (inDiamond(x, y)) c.set(x, y, x === x1 ? 'R1' : 'R2'); + } + } + } + // Блик верха рельса. + for (const x of [11, 19]) { + for (let y = 2; y <= 13; y++) if (inDiamond(x, y) && y % 4 === 1) c.set(x, y, 'R2'); + } + return c; +} + +/** Люк-ступени вниз: тёмный провал с тремя ступенями (ходовой тайл). */ +function stairsTile() { + const c = tileBase('P3', 'P4', 'P2', 23, 10); + // Проём: тёмный ромб в центре, уходящий вниз. + for (let y = 2; y <= 13; y++) { + const half = Math.floor((y - 2) * 0.8) + 1; + for (let dx = -half; dx <= half; dx++) { + const x = 15 + dx; + if (Math.abs(x - 15.5) / 16 + Math.abs(y - 7.5) / 8 <= 0.75) c.set(x, y, 'P0'); + } + } + // Ступени: горизонтальные полосы, светлеют кверху. + for (const [y, col] of [[11, 'P1'], [8, 'P2'], [5, 'P3']]) { + for (let x = 9; x <= 22; x++) { + if (Math.abs(x - 15.5) / 16 + Math.abs(y - 7.5) / 8 <= 0.7) c.set(x, y, col); + } + } + // Кромка люка — металл с ржавыми пятнами. + for (let y = 1; y <= 14; y++) { + for (let x = 4; x <= 27; x++) { + const d = Math.abs(x - 15.5) / 16 + Math.abs(y - 7.5) / 8; + if (d <= 1.0 && d > 0.78 && (x + y) % 3 === 0) c.set(x, y, 'R1'); + } + } + return c; +} + +/** Старая Машина: уснувшая печь-автоматон (высокий тайл, слот башни). */ +function machineTile() { + const c = new Canvas(...SIZES.tall.machine); + const r = rng(1616); + + // Корпус: массивный железный шкаф с боковыми тенями. + for (let y = 10; y <= 70; y++) { + for (let x = 6; x <= 25; x++) { + c.set(x, y, r() < 0.75 ? 'M1' : 'M0'); + } + c.set(6, y, 'M0'); + c.set(7, y, 'M0'); + c.set(24, y, 'M0'); + c.set(25, y, 'M0'); + // Потёки ржавчины: редкие вертикальные штрихи. + if (y % 7 === 3) { + c.set(9 + (y % 11), y, 'R1'); + c.set(21 - (y % 9), y, 'R2'); + } + } + // Сборные пояса и заклёпки. + for (const y of [14, 28, 42, 56]) { + for (let x = 6; x <= 25; x++) c.set(x, y, 'M2'); + } + for (const y of [18, 32, 46, 60]) { + for (const x of [8, 13, 18, 23]) c.set(x, y, 'P5'); + } + // Труба сверху с обручем. + for (let y = 2; y <= 9; y++) { + for (let x = 12; x <= 19; x++) c.set(x, y, r() < 0.8 ? 'M1' : 'M0'); + c.set(12, y, 'M0'); + c.set(19, y, 'M0'); + } + for (let x = 12; x <= 19; x++) c.set(x, 4, 'M2'); + + // Устье печи: тёмная арка, внутри — тлеющие угли (огонь = жизнь). + for (let y = 58; y <= 69; y++) { + const half = y < 62 ? 7 - (62 - y) : 7; + for (let dx = -half; dx <= half; dx++) c.set(16 + dx, y, 'P0'); + } + for (const [x, y, col] of [ + [13, 66, 'B0'], + [16, 67, 'F0'], + [18, 65, 'B0'], + [15, 64, 'F0'], + [20, 67, 'B0'] + ]) { + c.set(x, y, col); + } + // Обрамление арки: бронзовые заклёпки по углам — «звонное» железо. + c.set(9, 58, 'B0'); + c.set(22, 58, 'B0'); + // Ноги-опоры. + for (const [lx, rx] of [[7, 24]]) { + for (let y = 71; y <= 78; y++) { + c.set(lx, y, 'M0'); + c.set(rx, y, 'M0'); + } + } + // Пепел у подножия. + c.set(5, 79, 'P5'); + c.set(26, 79, 'P5'); + return c; +} + // ---------- персонажи 16x24 ---------- // Общие цвета: o — контур/глаза (P0), c/C — плащ тень/свет, @@ -733,6 +890,10 @@ save(wallTile(), 'tiles/wall.png'); save(wellTile(), 'tiles/well.png'); save(chestTile(), 'tiles/chest.png'); +save(wireTile(), 'tiles/wire.png'); +save(railTile(), 'tiles/rail.png'); +save(stairsTile(), 'tiles/stairs.png'); +save(machineTile(), 'tiles/machine.png'); console.log('Генерация персонажей:'); save(heroDown1, 'chars/hero_down_1.png'); diff --git a/apps/game/tools/pixelart/sizes.mjs b/apps/game/tools/pixelart/sizes.mjs index bf28edf..d66b43b 100644 --- a/apps/game/tools/pixelart/sizes.mjs +++ b/apps/game/tools/pixelart/sizes.mjs @@ -15,7 +15,11 @@ well: [32, 40], tree: [32, 48], house: [32, 56], - tower: [32, 80] + tower: [32, 80], + /** Бухта кабеля Ржавой рощи (низкая, в полтайла). */ + wire: [32, 32], + /** Старая Машина: печь-автоматон зала разъезда (слот башни). */ + machine: [32, 80] }, /** Крупные пропы. */ prop: { diff --git a/docs/art-style.md b/docs/art-style.md index f1706d8..c670809 100644 --- a/docs/art-style.md +++ b/docs/art-style.md @@ -132,6 +132,10 @@ | 5 | `tiles/bellflower.png` | трава + цветок B1/B2 (квестовый тайл) | | 6 | `tiles/tower.png` | башня Звенца — 32×80, tall-объект 2.5 юнита: бак на ногах-рельсах, колокол B0/B2 под баком | | 7 | `tiles/house.png` | дом Звенца — 32×56, tall-объект 1.75 юнита: стены из вагонных щитов, крыша из шпал | +| 18 | `tiles/wire.png` | бухта кабеля рощи — 32×32, tall-объект 0.6 юнита: ржавые кольца R1/R2 по M1/M0 с тёмными сечениями | +| 19 | `tiles/rail.png` | рельсы разъезда — 32×16, ходовой: две нити R1/R2 по шпалам T0/T1 на утоптанном пепле | +| 20 | `tiles/stairs.png` | люк-ступени — 32×16, ходовой: тёмный провал P0 с тремя ступенями, ржавая кромка R1 | +| 21 | `tiles/machine.png` | Старая Машина — 32×80, tall-объект 2.5 юнита: железный корпус M0/M1 с ржавыми потёками, труба, тёмное устье с тлеющими углями F0/B0 (огонь — жизнь) | | — | `tiles/house_big.png` | большой дом — 64×80, prop-объект footprint 2×2: два модуля щитов, козырёк над дверью, окна с переплётом | | — | `tiles/chest.png` | сундук — 24×18, prop интерьеров: вощёное дерево T0/T1, бронзовая полоса по стыку крышки и замок B0/B1/B2 (см. `SIZES.prop.chest`) | | — | `tiles/grass_2/3.png`, `tiles/path_2.png`, `tiles/ash_2.png` | варианты текстур 32×16 (та же палитра, другой seed шума) — микс по хэшу координат, в `tiles` не попадают |