diff --git a/apps/game/assets/maps/machine_hall.map b/apps/game/assets/maps/machine_hall.map index e8877cc..9be2095 100644 --- a/apps/game/assets/maps/machine_hall.map +++ b/apps/game/assets/maps/machine_hall.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":13,"height":11,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"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 +{"format":"rpg-map","version":1,"width":26,"height":22,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"encoding":"rle","tiles":[[9,27],[8,11],[21,2],[8,11],[9,2],[8,24],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,12],[19,1],[8,11],[9,2],[8,24],[9,14],[8,1],[9,12]]} \ No newline at end of file diff --git a/apps/game/assets/maps/meadows.map b/apps/game/assets/maps/meadows.map index a0981a4..d82d370 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,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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":4,"y":9,"dx":2,"dy":-1},{"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":15,"x":26,"y":19,"dx":2,"dy":1},{"id":15,"x":18,"y":20,"dx":-3,"dy":0},{"id":15,"x":27,"y":20,"dx":-3,"dy":1},{"id":15,"x":26,"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,1],[29,1],[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,2],[29,1],[0,1],[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,1],[28,1],[0,1],[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,2],[29,1],[0,1],[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],[28,1],[3,1],[4,3],[2,4],[5,1],[0,1],[1,1],[4,1],[0,13],[3,1],[0,1],[3,1],[28,1],[4,4],[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,3],[29,1],[0,2],[5,1],[1,2],[28,1],[4,1],[0,3],[4,3],[0,13],[4,4],[0,1],[4,1],[1,1],[0,3],[29,1],[0,1],[4,2],[28,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],[29,1],[0,2],[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,16],[29,1],[0,7],[4,4],[0,2],[3,1],[0,21],[3,4]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":56,"height":56,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"decor":[{"id":16,"x":7,"y":0,"dx":-3,"dy":-2},{"id":16,"x":17,"y":0,"dx":-4,"dy":2},{"id":15,"x":30,"y":0,"dx":1,"dy":1},{"id":16,"x":38,"y":0,"dx":-3,"dy":0},{"id":16,"x":39,"y":0,"dx":-3,"dy":1},{"id":15,"x":2,"y":1,"dx":-2,"dy":-2},{"id":16,"x":8,"y":1,"dx":-2,"dy":1},{"id":15,"x":22,"y":1,"dx":3,"dy":1},{"id":15,"x":24,"y":1,"dx":-3,"dy":-1},{"id":17,"x":43,"y":1,"dx":1,"dy":1},{"id":17,"x":44,"y":1,"dx":1,"dy":1},{"id":17,"x":3,"y":2,"dx":-3,"dy":2},{"id":17,"x":8,"y":2,"dx":-2,"dy":0},{"id":15,"x":10,"y":2,"dx":-3,"dy":1},{"id":16,"x":20,"y":2,"dx":-2,"dy":2},{"id":16,"x":28,"y":2,"dx":-4,"dy":0},{"id":16,"x":31,"y":2,"dx":3,"dy":1},{"id":15,"x":42,"y":2,"dx":4,"dy":0},{"id":17,"x":7,"y":3,"dx":1,"dy":0},{"id":16,"x":52,"y":3,"dx":-1,"dy":-2},{"id":16,"x":15,"y":4,"dx":-2,"dy":1},{"id":16,"x":17,"y":4,"dx":3,"dy":1},{"id":17,"x":26,"y":4,"dx":-1,"dy":0},{"id":17,"x":33,"y":4,"dx":2,"dy":-1},{"id":17,"x":35,"y":4,"dx":-1,"dy":-2},{"id":15,"x":42,"y":4,"dx":-3,"dy":0},{"id":16,"x":14,"y":5,"dx":0,"dy":0},{"id":16,"x":28,"y":5,"dx":-4,"dy":0},{"id":16,"x":34,"y":5,"dx":-3,"dy":0},{"id":15,"x":35,"y":5,"dx":2,"dy":1},{"id":16,"x":38,"y":5,"dx":-2,"dy":2},{"id":15,"x":43,"y":5,"dx":3,"dy":-2},{"id":15,"x":53,"y":5,"dx":-1,"dy":-1},{"id":15,"x":0,"y":6,"dx":1,"dy":1},{"id":17,"x":1,"y":6,"dx":1,"dy":1},{"id":16,"x":29,"y":6,"dx":4,"dy":0},{"id":17,"x":39,"y":6,"dx":4,"dy":0},{"id":16,"x":46,"y":6,"dx":-2,"dy":-2},{"id":17,"x":51,"y":6,"dx":2,"dy":-1},{"id":15,"x":1,"y":7,"dx":0,"dy":1},{"id":16,"x":3,"y":7,"dx":-1,"dy":0},{"id":16,"x":15,"y":7,"dx":-1,"dy":0},{"id":15,"x":17,"y":7,"dx":3,"dy":-1},{"id":16,"x":18,"y":7,"dx":0,"dy":1},{"id":15,"x":24,"y":7,"dx":4,"dy":-1},{"id":16,"x":37,"y":7,"dx":1,"dy":0},{"id":15,"x":38,"y":7,"dx":-3,"dy":-1},{"id":15,"x":39,"y":7,"dx":-3,"dy":-2},{"id":17,"x":47,"y":7,"dx":0,"dy":-1},{"id":15,"x":51,"y":7,"dx":3,"dy":-1},{"id":17,"x":26,"y":8,"dx":4,"dy":2},{"id":16,"x":30,"y":8,"dx":1,"dy":-2},{"id":16,"x":32,"y":8,"dx":-4,"dy":-2},{"id":15,"x":35,"y":8,"dx":-1,"dy":0},{"id":16,"x":38,"y":8,"dx":-2,"dy":-2},{"id":15,"x":45,"y":8,"dx":-2,"dy":0},{"id":15,"x":47,"y":8,"dx":4,"dy":0},{"id":17,"x":2,"y":9,"dx":3,"dy":0},{"id":16,"x":20,"y":9,"dx":-4,"dy":-2},{"id":16,"x":24,"y":9,"dx":-2,"dy":1},{"id":17,"x":33,"y":9,"dx":-3,"dy":0},{"id":16,"x":50,"y":9,"dx":2,"dy":1},{"id":15,"x":15,"y":10,"dx":-3,"dy":0},{"id":15,"x":18,"y":10,"dx":0,"dy":-1},{"id":15,"x":20,"y":10,"dx":0,"dy":2},{"id":16,"x":22,"y":10,"dx":-3,"dy":1},{"id":15,"x":25,"y":10,"dx":2,"dy":-1},{"id":15,"x":49,"y":10,"dx":-3,"dy":2},{"id":16,"x":51,"y":10,"dx":1,"dy":2},{"id":17,"x":17,"y":11,"dx":3,"dy":2},{"id":15,"x":18,"y":11,"dx":3,"dy":-2},{"id":17,"x":21,"y":11,"dx":1,"dy":1},{"id":16,"x":29,"y":11,"dx":-1,"dy":0},{"id":16,"x":31,"y":11,"dx":-3,"dy":0},{"id":15,"x":37,"y":11,"dx":1,"dy":0},{"id":17,"x":1,"y":12,"dx":2,"dy":-1},{"id":15,"x":9,"y":12,"dx":-3,"dy":1},{"id":17,"x":10,"y":12,"dx":0,"dy":0},{"id":17,"x":22,"y":12,"dx":4,"dy":-2},{"id":16,"x":26,"y":12,"dx":-4,"dy":2},{"id":16,"x":36,"y":12,"dx":0,"dy":1},{"id":15,"x":40,"y":12,"dx":-2,"dy":-1},{"id":17,"x":46,"y":12,"dx":-3,"dy":0},{"id":15,"x":16,"y":13,"dx":1,"dy":1},{"id":17,"x":28,"y":13,"dx":2,"dy":-1},{"id":16,"x":46,"y":13,"dx":-1,"dy":2},{"id":17,"x":1,"y":14,"dx":0,"dy":-1},{"id":16,"x":31,"y":14,"dx":1,"dy":-1},{"id":16,"x":36,"y":14,"dx":-2,"dy":-2},{"id":16,"x":0,"y":15,"dx":-3,"dy":1},{"id":15,"x":13,"y":15,"dx":1,"dy":2},{"id":17,"x":21,"y":15,"dx":-3,"dy":-2},{"id":16,"x":47,"y":15,"dx":0,"dy":-1},{"id":16,"x":35,"y":16,"dx":1,"dy":-1},{"id":16,"x":1,"y":17,"dx":-3,"dy":-1},{"id":17,"x":27,"y":17,"dx":2,"dy":1},{"id":16,"x":31,"y":17,"dx":4,"dy":1},{"id":16,"x":34,"y":17,"dx":2,"dy":2},{"id":16,"x":46,"y":17,"dx":2,"dy":1},{"id":15,"x":16,"y":18,"dx":4,"dy":2},{"id":15,"x":34,"y":18,"dx":-3,"dy":0},{"id":17,"x":48,"y":18,"dx":2,"dy":1},{"id":17,"x":54,"y":18,"dx":2,"dy":2},{"id":17,"x":1,"y":19,"dx":-3,"dy":0},{"id":16,"x":12,"y":19,"dx":1,"dy":0},{"id":16,"x":13,"y":19,"dx":-1,"dy":0},{"id":15,"x":21,"y":19,"dx":0,"dy":0},{"id":16,"x":29,"y":19,"dx":2,"dy":0},{"id":15,"x":44,"y":19,"dx":4,"dy":1},{"id":17,"x":11,"y":20,"dx":-3,"dy":1},{"id":15,"x":24,"y":20,"dx":-2,"dy":1},{"id":17,"x":36,"y":20,"dx":-2,"dy":-1},{"id":16,"x":7,"y":21,"dx":-1,"dy":1},{"id":17,"x":25,"y":21,"dx":-1,"dy":0},{"id":15,"x":37,"y":21,"dx":-4,"dy":2},{"id":16,"x":47,"y":21,"dx":-1,"dy":2},{"id":15,"x":3,"y":22,"dx":-4,"dy":1},{"id":15,"x":11,"y":22,"dx":0,"dy":-1},{"id":15,"x":13,"y":22,"dx":1,"dy":1},{"id":15,"x":20,"y":22,"dx":2,"dy":0},{"id":15,"x":55,"y":22,"dx":-4,"dy":0},{"id":17,"x":0,"y":23,"dx":-4,"dy":1},{"id":17,"x":2,"y":23,"dx":3,"dy":0},{"id":17,"x":33,"y":23,"dx":2,"dy":-1},{"id":16,"x":40,"y":23,"dx":-1,"dy":-1},{"id":16,"x":43,"y":23,"dx":2,"dy":1},{"id":15,"x":7,"y":24,"dx":1,"dy":-1},{"id":15,"x":26,"y":24,"dx":3,"dy":-2},{"id":15,"x":30,"y":24,"dx":4,"dy":-1},{"id":16,"x":37,"y":24,"dx":2,"dy":0},{"id":15,"x":55,"y":24,"dx":-3,"dy":1},{"id":15,"x":9,"y":25,"dx":-1,"dy":1},{"id":16,"x":21,"y":25,"dx":3,"dy":-1},{"id":17,"x":24,"y":25,"dx":2,"dy":-1},{"id":17,"x":27,"y":25,"dx":1,"dy":1},{"id":17,"x":31,"y":25,"dx":-3,"dy":1},{"id":16,"x":43,"y":25,"dx":-1,"dy":-1},{"id":15,"x":0,"y":26,"dx":-1,"dy":-2},{"id":17,"x":16,"y":26,"dx":2,"dy":-1},{"id":17,"x":17,"y":26,"dx":-4,"dy":2},{"id":15,"x":26,"y":26,"dx":-3,"dy":-1},{"id":17,"x":31,"y":26,"dx":-3,"dy":-2},{"id":15,"x":51,"y":26,"dx":0,"dy":0},{"id":15,"x":6,"y":27,"dx":-1,"dy":-1},{"id":16,"x":11,"y":27,"dx":3,"dy":0},{"id":17,"x":16,"y":27,"dx":3,"dy":1},{"id":15,"x":29,"y":27,"dx":2,"dy":0},{"id":16,"x":36,"y":27,"dx":4,"dy":-1},{"id":16,"x":38,"y":27,"dx":1,"dy":0},{"id":17,"x":50,"y":27,"dx":-3,"dy":-2},{"id":17,"x":53,"y":27,"dx":1,"dy":-1},{"id":15,"x":14,"y":28,"dx":-4,"dy":1},{"id":17,"x":16,"y":29,"dx":-3,"dy":-1},{"id":17,"x":20,"y":29,"dx":-1,"dy":-1},{"id":15,"x":29,"y":29,"dx":0,"dy":1},{"id":16,"x":33,"y":29,"dx":-2,"dy":2},{"id":16,"x":37,"y":29,"dx":0,"dy":2},{"id":15,"x":7,"y":30,"dx":2,"dy":-1},{"id":15,"x":9,"y":30,"dx":0,"dy":2},{"id":16,"x":21,"y":30,"dx":3,"dy":1},{"id":17,"x":41,"y":30,"dx":-4,"dy":0},{"id":17,"x":28,"y":32,"dx":1,"dy":1},{"id":15,"x":32,"y":32,"dx":-1,"dy":-1},{"id":17,"x":33,"y":32,"dx":0,"dy":-2},{"id":17,"x":41,"y":32,"dx":-3,"dy":0},{"id":16,"x":50,"y":32,"dx":0,"dy":-2},{"id":15,"x":11,"y":33,"dx":-3,"dy":2},{"id":17,"x":54,"y":33,"dx":-3,"dy":1},{"id":15,"x":2,"y":34,"dx":1,"dy":-2},{"id":16,"x":24,"y":34,"dx":3,"dy":0},{"id":15,"x":38,"y":34,"dx":3,"dy":0},{"id":15,"x":14,"y":35,"dx":1,"dy":0},{"id":16,"x":53,"y":35,"dx":2,"dy":-1},{"id":15,"x":4,"y":36,"dx":-2,"dy":1},{"id":17,"x":6,"y":36,"dx":1,"dy":-1},{"id":16,"x":10,"y":36,"dx":0,"dy":0},{"id":17,"x":18,"y":36,"dx":-1,"dy":-1},{"id":16,"x":24,"y":36,"dx":0,"dy":0},{"id":16,"x":26,"y":36,"dx":0,"dy":-2},{"id":17,"x":32,"y":36,"dx":-1,"dy":-2},{"id":15,"x":35,"y":36,"dx":-1,"dy":-1},{"id":17,"x":36,"y":36,"dx":-1,"dy":-1},{"id":15,"x":40,"y":36,"dx":0,"dy":0},{"id":15,"x":43,"y":36,"dx":1,"dy":1},{"id":17,"x":12,"y":37,"dx":-2,"dy":-1},{"id":16,"x":27,"y":37,"dx":0,"dy":0},{"id":15,"x":48,"y":37,"dx":-1,"dy":2},{"id":17,"x":51,"y":37,"dx":-1,"dy":0},{"id":17,"x":7,"y":38,"dx":2,"dy":0},{"id":16,"x":27,"y":38,"dx":-1,"dy":-1},{"id":15,"x":33,"y":38,"dx":0,"dy":0},{"id":17,"x":55,"y":38,"dx":-2,"dy":1},{"id":17,"x":23,"y":39,"dx":3,"dy":2},{"id":16,"x":27,"y":39,"dx":2,"dy":0},{"id":15,"x":32,"y":39,"dx":3,"dy":-2},{"id":16,"x":50,"y":39,"dx":-1,"dy":-1},{"id":16,"x":51,"y":39,"dx":-1,"dy":0},{"id":16,"x":52,"y":39,"dx":-2,"dy":0},{"id":16,"x":53,"y":39,"dx":-4,"dy":-2},{"id":16,"x":4,"y":40,"dx":-2,"dy":1},{"id":17,"x":41,"y":40,"dx":-2,"dy":-2},{"id":16,"x":52,"y":40,"dx":1,"dy":2},{"id":15,"x":6,"y":41,"dx":0,"dy":0},{"id":17,"x":9,"y":41,"dx":-3,"dy":2},{"id":15,"x":21,"y":41,"dx":0,"dy":0},{"id":15,"x":31,"y":41,"dx":1,"dy":1},{"id":15,"x":43,"y":41,"dx":2,"dy":-1},{"id":15,"x":47,"y":41,"dx":2,"dy":0},{"id":16,"x":53,"y":41,"dx":3,"dy":1},{"id":17,"x":1,"y":42,"dx":3,"dy":2},{"id":17,"x":7,"y":42,"dx":1,"dy":-1},{"id":17,"x":13,"y":42,"dx":0,"dy":-1},{"id":16,"x":17,"y":42,"dx":1,"dy":1},{"id":16,"x":22,"y":42,"dx":-2,"dy":1},{"id":15,"x":27,"y":42,"dx":3,"dy":-1},{"id":15,"x":34,"y":42,"dx":2,"dy":0},{"id":17,"x":39,"y":42,"dx":2,"dy":-2},{"id":15,"x":46,"y":42,"dx":0,"dy":1},{"id":16,"x":50,"y":42,"dx":-1,"dy":1},{"id":17,"x":6,"y":43,"dx":-2,"dy":0},{"id":16,"x":14,"y":43,"dx":-1,"dy":1},{"id":16,"x":15,"y":43,"dx":2,"dy":0},{"id":15,"x":28,"y":44,"dx":1,"dy":0},{"id":17,"x":41,"y":44,"dx":-1,"dy":0},{"id":15,"x":3,"y":45,"dx":1,"dy":-1},{"id":16,"x":11,"y":45,"dx":0,"dy":1},{"id":15,"x":28,"y":45,"dx":3,"dy":2},{"id":15,"x":34,"y":45,"dx":-2,"dy":2},{"id":15,"x":35,"y":45,"dx":1,"dy":1},{"id":15,"x":39,"y":45,"dx":-2,"dy":1},{"id":15,"x":43,"y":45,"dx":-2,"dy":-2},{"id":16,"x":13,"y":46,"dx":-2,"dy":-1},{"id":17,"x":27,"y":46,"dx":3,"dy":1},{"id":15,"x":39,"y":46,"dx":-1,"dy":0},{"id":17,"x":40,"y":46,"dx":4,"dy":-1},{"id":15,"x":42,"y":46,"dx":1,"dy":1},{"id":15,"x":53,"y":46,"dx":0,"dy":0},{"id":15,"x":2,"y":47,"dx":3,"dy":2},{"id":16,"x":13,"y":47,"dx":1,"dy":2},{"id":16,"x":20,"y":47,"dx":-3,"dy":-1},{"id":16,"x":22,"y":47,"dx":1,"dy":2},{"id":16,"x":25,"y":47,"dx":-4,"dy":1},{"id":17,"x":31,"y":47,"dx":-1,"dy":2},{"id":16,"x":35,"y":47,"dx":-2,"dy":-1},{"id":15,"x":49,"y":47,"dx":0,"dy":1},{"id":17,"x":34,"y":48,"dx":3,"dy":0},{"id":15,"x":38,"y":48,"dx":0,"dy":0},{"id":15,"x":42,"y":48,"dx":0,"dy":-2},{"id":17,"x":43,"y":48,"dx":-4,"dy":1},{"id":16,"x":31,"y":49,"dx":1,"dy":-1},{"id":17,"x":43,"y":49,"dx":-4,"dy":2},{"id":15,"x":46,"y":49,"dx":-3,"dy":-1},{"id":17,"x":1,"y":50,"dx":1,"dy":0},{"id":15,"x":3,"y":50,"dx":-4,"dy":-2},{"id":15,"x":4,"y":50,"dx":4,"dy":1},{"id":16,"x":17,"y":50,"dx":3,"dy":-1},{"id":15,"x":26,"y":50,"dx":1,"dy":-2},{"id":17,"x":27,"y":50,"dx":-2,"dy":1},{"id":15,"x":30,"y":50,"dx":-2,"dy":0},{"id":15,"x":47,"y":50,"dx":3,"dy":-1},{"id":16,"x":9,"y":51,"dx":-3,"dy":-1},{"id":15,"x":10,"y":51,"dx":-2,"dy":0},{"id":15,"x":1,"y":52,"dx":-1,"dy":0},{"id":16,"x":6,"y":52,"dx":2,"dy":2},{"id":16,"x":12,"y":52,"dx":0,"dy":1},{"id":15,"x":19,"y":52,"dx":3,"dy":-1},{"id":15,"x":20,"y":52,"dx":0,"dy":0},{"id":15,"x":23,"y":52,"dx":-4,"dy":0},{"id":17,"x":34,"y":52,"dx":3,"dy":-1},{"id":17,"x":46,"y":52,"dx":3,"dy":0},{"id":16,"x":54,"y":52,"dx":3,"dy":-1},{"id":15,"x":4,"y":53,"dx":1,"dy":1},{"id":15,"x":26,"y":53,"dx":-2,"dy":1},{"id":15,"x":43,"y":53,"dx":0,"dy":-1},{"id":15,"x":53,"y":53,"dx":0,"dy":-1},{"id":16,"x":5,"y":54,"dx":-1,"dy":1},{"id":17,"x":6,"y":54,"dx":0,"dy":1},{"id":15,"x":30,"y":54,"dx":-2,"dy":-1},{"id":15,"x":33,"y":54,"dx":1,"dy":-2},{"id":17,"x":50,"y":54,"dx":2,"dy":-2},{"id":16,"x":13,"y":55,"dx":-3,"dy":-1},{"id":15,"x":23,"y":55,"dx":1,"dy":-1}],"encoding":"rle","tiles":[[0,3],[3,1],[0,1],[4,1],[3,1],[4,1],[0,4],[4,8],[0,18],[4,4],[0,7],[3,2],[0,2],[3,1],[0,3],[1,1],[0,3],[4,2],[3,1],[4,3],[0,1],[4,1],[0,1],[4,7],[0,4],[4,1],[0,1],[4,1],[0,9],[4,5],[0,7],[4,2],[3,2],[0,2],[3,2],[1,2],[0,2],[4,1],[3,1],[4,1],[0,1],[4,1],[0,2],[4,10],[0,3],[4,1],[0,1],[4,5],[0,5],[4,4],[0,3],[4,7],[3,2],[0,2],[3,1],[0,2],[1,2],[0,1],[1,1],[0,2],[4,3],[0,1],[4,12],[0,1],[4,4],[0,1],[4,2],[0,5],[4,3],[0,4],[4,2],[0,1],[4,1],[0,2],[3,1],[0,1],[4,1],[0,6],[1,5],[0,4],[4,1],[0,1],[4,8],[0,1],[4,1],[0,3],[4,4],[0,6],[4,3],[0,3],[4,6],[3,1],[4,1],[3,1],[4,1],[0,3],[3,1],[0,3],[4,2],[0,1],[1,1],[0,4],[4,5],[0,1],[4,11],[0,2],[4,4],[0,2],[4,3],[0,4],[4,4],[3,1],[0,1],[4,1],[3,1],[4,1],[0,2],[3,1],[0,2],[3,2],[4,1],[0,1],[4,1],[1,1],[0,4],[4,5],[0,1],[4,17],[0,9],[4,1],[0,1],[4,2],[3,1],[0,1],[3,1],[0,2],[3,1],[0,4],[3,1],[4,1],[0,1],[4,2],[1,1],[0,5],[4,1],[0,1],[4,1],[0,2],[4,6],[0,1],[4,6],[0,1],[4,3],[0,2],[4,1],[0,11],[3,1],[0,2],[3,1],[0,5],[3,2],[0,1],[4,2],[1,1],[0,5],[4,2],[0,1],[4,1],[0,3],[4,1],[0,2],[4,1],[0,1],[4,1],[0,1],[4,6],[0,1],[28,1],[0,2],[4,2],[0,9],[3,1],[0,2],[3,1],[0,9],[3,1],[0,1],[1,1],[0,4],[4,5],[0,3],[4,3],[0,1],[4,9],[0,5],[4,2],[0,10],[4,5],[0,4],[4,1],[3,1],[0,1],[3,1],[1,1],[0,13],[4,2],[0,1],[29,1],[0,1],[4,7],[0,15],[3,1],[0,1],[3,1],[4,3],[0,5],[3,1],[0,3],[1,1],[0,18],[4,1],[29,1],[4,4],[0,3],[5,1],[0,14],[4,3],[0,1],[4,1],[0,1],[3,1],[0,1],[4,3],[0,2],[1,2],[0,14],[4,5],[0,2],[4,1],[0,2],[4,4],[0,1],[4,1],[0,10],[3,2],[4,1],[0,2],[4,1],[0,4],[3,1],[0,3],[3,1],[1,1],[0,9],[28,1],[0,4],[4,2],[0,4],[4,2],[0,2],[4,2],[0,1],[4,1],[29,1],[4,1],[0,2],[4,3],[0,2],[4,1],[0,3],[4,1],[0,1],[4,3],[3,1],[0,5],[3,1],[0,2],[1,1],[0,14],[4,1],[0,1],[4,1],[0,5],[4,2],[0,1],[4,4],[2,2],[0,1],[2,4],[0,2],[4,7],[0,2],[4,2],[3,2],[0,2],[3,1],[0,1],[1,1],[0,22],[4,6],[0,2],[2,6],[0,1],[4,8],[0,10],[1,2],[0,19],[4,8],[0,1],[2,4],[0,1],[2,2],[0,1],[5,1],[4,7],[0,2],[3,1],[4,2],[0,1],[4,1],[3,3],[0,1],[1,4],[0,16],[4,1],[0,1],[4,5],[0,2],[2,1],[0,1],[2,5],[0,1],[4,1],[0,1],[4,1],[3,1],[4,1],[0,1],[3,1],[4,1],[0,3],[3,2],[4,1],[3,1],[0,1],[3,1],[4,3],[0,1],[4,1],[1,4],[0,15],[4,3],[0,1],[4,1],[0,2],[2,4],[0,1],[2,1],[0,5],[3,1],[28,1],[0,1],[3,1],[0,5],[28,1],[3,1],[4,1],[3,1],[0,1],[3,1],[0,1],[4,1],[0,2],[4,2],[0,1],[1,1],[0,10],[4,4],[0,1],[4,2],[0,16],[3,1],[0,1],[3,1],[0,1],[3,1],[0,1],[3,1],[0,4],[3,1],[0,3],[4,3],[0,4],[1,1],[0,5],[4,1],[0,1],[4,1],[0,3],[4,2],[0,1],[4,1],[0,17],[3,1],[0,9],[3,1],[0,1],[3,1],[0,1],[3,1],[4,1],[28,1],[0,1],[4,1],[0,1],[4,3],[1,1],[0,5],[4,4],[0,2],[29,1],[4,3],[0,8],[4,3],[0,1],[4,1],[0,3],[4,1],[3,1],[4,2],[3,1],[0,1],[3,1],[0,6],[3,1],[0,2],[4,4],[0,1],[4,1],[0,1],[4,1],[1,1],[0,5],[4,3],[0,3],[4,1],[0,1],[4,2],[0,3],[4,2],[0,1],[4,2],[0,1],[4,4],[0,3],[4,2],[3,1],[4,1],[3,2],[0,16],[4,2],[1,2],[4,2],[0,1],[4,2],[0,6],[4,1],[0,5],[4,1],[0,1],[4,3],[28,1],[4,1],[0,2],[4,1],[0,3],[4,1],[3,2],[4,1],[3,1],[0,3],[3,1],[0,4],[3,1],[0,11],[1,1],[0,1],[4,6],[0,10],[4,8],[0,5],[4,1],[0,1],[3,1],[4,2],[0,7],[3,1],[0,12],[1,1],[0,1],[4,1],[0,1],[4,2],[0,11],[4,5],[29,1],[4,1],[0,1],[4,3],[0,3],[4,5],[0,1],[3,1],[0,8],[3,1],[0,12],[4,3],[0,2],[29,1],[0,9],[4,5],[0,2],[4,1],[0,1],[4,5],[0,5],[4,3],[0,7],[3,1],[0,3],[4,1],[0,1],[4,1],[0,5],[29,1],[0,1],[4,1],[0,2],[4,3],[0,1],[4,1],[0,4],[4,1],[0,2],[4,5],[0,2],[4,6],[0,2],[3,1],[0,3],[4,1],[0,1],[3,1],[0,3],[3,2],[0,1],[29,1],[0,2],[4,3],[0,5],[1,33],[0,1],[1,2],[0,1],[4,5],[0,1],[4,1],[0,4],[4,1],[0,1],[4,1],[0,8],[4,7],[0,3],[29,1],[4,3],[0,1],[4,4],[0,2],[4,5],[0,3],[4,1],[0,3],[3,2],[4,4],[3,1],[4,1],[0,12],[4,5],[0,1],[4,1],[0,2],[4,1],[0,4],[4,3],[0,4],[29,1],[0,2],[4,1],[0,1],[4,3],[0,2],[4,1],[0,1],[4,3],[0,1],[4,3],[0,2],[4,1],[3,1],[0,8],[4,4],[0,1],[4,7],[0,6],[4,3],[0,1],[4,2],[0,5],[4,3],[0,1],[4,1],[0,2],[3,1],[4,3],[0,1],[3,2],[4,2],[3,1],[4,1],[3,2],[0,4],[2,4],[4,1],[2,1],[0,1],[4,6],[0,9],[4,2],[0,1],[4,3],[0,7],[4,1],[0,1],[4,4],[0,1],[4,1],[0,1],[3,1],[4,4],[0,1],[4,1],[0,5],[2,3],[0,1],[2,3],[4,1],[0,1],[4,4],[0,5],[29,1],[0,6],[4,1],[0,1],[4,1],[0,7],[4,2],[0,6],[3,1],[0,4],[3,1],[0,2],[3,1],[29,1],[0,3],[2,4],[0,1],[2,2],[4,1],[5,1],[4,1],[0,1],[4,2],[0,19],[4,1],[0,2],[4,1],[3,2],[0,1],[3,1],[0,1],[4,1],[3,2],[0,1],[3,1],[0,2],[3,1],[0,1],[3,2],[0,1],[29,1],[4,2],[0,1],[2,1],[0,1],[2,4],[0,2],[4,2],[0,1],[4,5],[0,13],[4,1],[0,1],[4,1],[0,5],[3,1],[4,1],[0,1],[4,1],[0,2],[3,1],[0,6],[3,1],[0,1],[4,2],[5,1],[2,6],[0,6],[4,5],[0,15],[4,1],[0,6],[4,1],[0,1],[4,1],[3,1],[0,2],[4,1],[3,2],[4,1],[3,1],[0,4],[4,2],[0,4],[29,1],[0,9],[4,3],[0,21],[3,1],[0,2],[3,1],[0,3],[4,1],[3,1],[4,1],[3,1],[0,20],[4,4],[0,11],[4,1],[0,9],[4,4],[0,2],[3,1],[4,1],[3,1],[4,1],[0,1],[4,1],[0,8],[4,5],[0,5],[4,1],[0,1],[4,3],[0,10],[4,3],[0,6],[3,1],[0,1],[4,4],[0,3],[3,1],[4,4],[0,1],[3,1],[0,7],[4,2],[0,1],[4,1],[0,20],[4,2],[0,3],[10,1],[0,4],[3,1],[0,1],[4,3],[0,1],[3,2],[4,3],[0,1],[4,1],[0,8],[4,3],[0,1],[4,1],[0,3],[4,3],[0,1],[4,1],[0,22],[3,1],[4,1],[0,1],[4,4],[0,5],[3,1],[0,8],[4,2],[0,1],[4,2],[0,2],[4,6],[0,8],[4,2],[0,12],[3,1],[4,4],[3,2],[0,1],[3,3],[0,8],[28,1],[0,1],[4,2],[0,1],[4,2],[0,2],[4,6],[0,7],[4,3],[0,12],[4,1],[3,1],[4,2],[3,1],[0,1],[3,1],[0,1],[3,1],[0,1],[3,2],[0,1],[3,1],[0,4],[4,1],[0,1],[4,1],[0,7],[4,6],[0,7],[4,2],[0,12],[3,1],[4,1],[0,1],[4,1],[0,1],[4,2],[0,5],[3,3],[0,3],[4,5],[0,5],[4,6],[0,23],[4,1],[0,1],[4,1],[3,1],[4,1],[3,1],[4,1],[0,3],[3,1],[0,6],[4,2],[0,1],[4,1],[0,1],[4,1],[0,4],[4,6],[0,24],[3,1],[28,1],[0,2],[4,1],[0,6],[3,1],[0,4],[4,6],[0,4],[4,8],[0,5],[4,3],[0,15],[3,1],[0,1],[4,2],[3,1],[0,2],[3,1],[0,3],[3,2],[4,2],[0,1],[4,1],[0,1],[4,1],[0,1],[4,1],[0,4],[4,6],[0,1],[4,1],[0,3],[4,2],[0,2],[4,1],[0,14],[3,1],[0,2],[4,2],[0,1],[3,1],[0,1],[3,1],[0,2],[3,1],[0,1],[4,7],[0,1],[4,1],[0,6],[4,2],[0,2],[4,2],[0,3],[4,6],[0,17],[3,1],[4,1],[0,5],[3,2],[4,6],[0,2],[4,1],[0,1],[4,1],[0,4],[4,2],[0,7],[4,5],[0,14],[3,1],[4,1],[3,1],[4,2],[0,2],[3,1],[0,2],[3,1],[4,1],[0,1],[4,3],[0,1],[4,2],[0,3],[4,2],[0,13],[4,5],[0,13],[4,3],[3,2],[4,1],[0,3],[3,4],[4,5],[0,1],[4,2],[0,1],[4,3],[0,14],[4,1],[0,2],[4,2],[0,11],[3,1],[4,1],[3,1],[4,4],[0,1],[3,2],[0,3],[3,1],[4,12],[0,15],[4,3],[0,6],[4,1],[0,1],[4,3],[0,1],[3,2],[0,2],[4,1],[0,1],[4,1],[0,4],[4,3],[0,1],[3,1],[0,1],[4,1],[0,1],[4,2],[0,1],[4,4],[0,6],[28,1],[0,7],[28,1],[0,9],[4,5],[0,5],[3,2],[4,1],[0,2],[3,1],[0,1],[4,1],[0,3],[3,1],[0,1],[4,2],[0,1],[4,5],[0,25],[4,4],[0,8],[3,1],[0,1]]} \ No newline at end of file diff --git a/apps/game/assets/maps/old_siding.map b/apps/game/assets/maps/old_siding.map index 030d9a9..39ccb96 100644 --- a/apps/game/assets/maps/old_siding.map +++ b/apps/game/assets/maps/old_siding.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":24,"height":20,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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":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,18],[29,1],[4,6],[0,1],[4,30],[19,3],[4,6],[0,1],[4,11],[28,1],[4,2],[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,8],[29,1],[4,12],[19,2],[1,1],[4,21],[19,2],[1,1],[4,1],[28,1],[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,3],[29,1],[4,5],[3,1],[4,9],[0,1],[19,2],[4,1],[1,1],[20,1],[4,19],[19,2],[4,9],[3,3],[4,5],[28,1],[4,2],[0,1],[4,14],[3,1],[4,22],[3,1],[4,1],[3,1],[4,21],[3,1]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":48,"height":40,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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":24,"y":0,"dx":-2,"dy":-2},{"id":16,"x":28,"y":0,"dx":0,"dy":-1},{"id":16,"x":30,"y":0,"dx":-2,"dy":2},{"id":16,"x":13,"y":1,"dx":3,"dy":1},{"id":16,"x":17,"y":1,"dx":0,"dy":-2},{"id":16,"x":37,"y":1,"dx":1,"dy":1},{"id":16,"x":39,"y":1,"dx":1,"dy":1},{"id":16,"x":43,"y":1,"dx":-1,"dy":2},{"id":16,"x":2,"y":2,"dx":-2,"dy":-1},{"id":16,"x":8,"y":2,"dx":-3,"dy":-1},{"id":16,"x":12,"y":2,"dx":-1,"dy":-1},{"id":16,"x":22,"y":2,"dx":-3,"dy":-1},{"id":16,"x":43,"y":2,"dx":0,"dy":0},{"id":16,"x":46,"y":2,"dx":0,"dy":0},{"id":16,"x":19,"y":3,"dx":-3,"dy":1},{"id":16,"x":24,"y":3,"dx":1,"dy":-1},{"id":16,"x":17,"y":4,"dx":1,"dy":0},{"id":16,"x":19,"y":4,"dx":-1,"dy":-1},{"id":16,"x":22,"y":4,"dx":1,"dy":1},{"id":16,"x":29,"y":4,"dx":2,"dy":0},{"id":16,"x":1,"y":5,"dx":-3,"dy":0},{"id":16,"x":3,"y":5,"dx":-3,"dy":1},{"id":16,"x":41,"y":5,"dx":-2,"dy":1},{"id":16,"x":44,"y":5,"dx":-1,"dy":-1},{"id":16,"x":27,"y":6,"dx":2,"dy":0},{"id":16,"x":31,"y":6,"dx":-2,"dy":1},{"id":16,"x":17,"y":7,"dx":-2,"dy":-2},{"id":16,"x":27,"y":7,"dx":0,"dy":1},{"id":16,"x":32,"y":7,"dx":-3,"dy":1},{"id":16,"x":45,"y":7,"dx":-2,"dy":-1},{"id":16,"x":5,"y":8,"dx":-3,"dy":0},{"id":16,"x":27,"y":8,"dx":-3,"dy":-2},{"id":16,"x":28,"y":8,"dx":3,"dy":2},{"id":16,"x":8,"y":9,"dx":1,"dy":0},{"id":16,"x":14,"y":9,"dx":-4,"dy":-1},{"id":16,"x":31,"y":9,"dx":-1,"dy":1},{"id":16,"x":38,"y":9,"dx":0,"dy":1},{"id":16,"x":0,"y":10,"dx":3,"dy":-2},{"id":16,"x":2,"y":10,"dx":-4,"dy":0},{"id":16,"x":4,"y":10,"dx":0,"dy":0},{"id":16,"x":10,"y":10,"dx":-3,"dy":-1},{"id":16,"x":21,"y":10,"dx":-4,"dy":-1},{"id":16,"x":40,"y":10,"dx":-3,"dy":-2},{"id":16,"x":42,"y":10,"dx":3,"dy":1},{"id":16,"x":9,"y":11,"dx":-2,"dy":2},{"id":16,"x":12,"y":11,"dx":0,"dy":1},{"id":16,"x":13,"y":11,"dx":3,"dy":2},{"id":16,"x":31,"y":11,"dx":-3,"dy":-1},{"id":16,"x":41,"y":11,"dx":-4,"dy":-2},{"id":16,"x":42,"y":11,"dx":3,"dy":-1},{"id":16,"x":43,"y":11,"dx":-1,"dy":1},{"id":16,"x":1,"y":12,"dx":1,"dy":2},{"id":16,"x":4,"y":12,"dx":0,"dy":2},{"id":16,"x":7,"y":12,"dx":-1,"dy":2},{"id":16,"x":25,"y":12,"dx":1,"dy":0},{"id":16,"x":13,"y":13,"dx":-2,"dy":1},{"id":16,"x":16,"y":13,"dx":1,"dy":1},{"id":16,"x":20,"y":13,"dx":2,"dy":2},{"id":16,"x":4,"y":14,"dx":-3,"dy":-1},{"id":16,"x":44,"y":14,"dx":0,"dy":-2},{"id":16,"x":3,"y":15,"dx":3,"dy":1},{"id":16,"x":19,"y":15,"dx":-1,"dy":0},{"id":16,"x":20,"y":15,"dx":0,"dy":-2},{"id":16,"x":21,"y":15,"dx":-1,"dy":0},{"id":16,"x":28,"y":15,"dx":-2,"dy":-2},{"id":16,"x":35,"y":15,"dx":-1,"dy":1},{"id":16,"x":38,"y":15,"dx":0,"dy":2},{"id":16,"x":46,"y":15,"dx":-4,"dy":-1},{"id":16,"x":2,"y":16,"dx":4,"dy":1},{"id":16,"x":11,"y":16,"dx":3,"dy":0},{"id":16,"x":21,"y":16,"dx":3,"dy":0},{"id":16,"x":7,"y":17,"dx":-1,"dy":2},{"id":16,"x":31,"y":17,"dx":1,"dy":1},{"id":16,"x":32,"y":17,"dx":-4,"dy":1},{"id":16,"x":42,"y":17,"dx":3,"dy":0},{"id":16,"x":27,"y":18,"dx":-3,"dy":-1},{"id":16,"x":39,"y":18,"dx":-1,"dy":0},{"id":16,"x":40,"y":18,"dx":1,"dy":2},{"id":16,"x":41,"y":18,"dx":-3,"dy":-2},{"id":16,"x":21,"y":19,"dx":2,"dy":1},{"id":16,"x":30,"y":19,"dx":1,"dy":-1},{"id":16,"x":0,"y":21,"dx":3,"dy":-1},{"id":16,"x":35,"y":21,"dx":-2,"dy":1},{"id":16,"x":37,"y":21,"dx":3,"dy":-2},{"id":16,"x":29,"y":22,"dx":-3,"dy":-2},{"id":16,"x":38,"y":22,"dx":4,"dy":1},{"id":16,"x":42,"y":22,"dx":-1,"dy":1},{"id":16,"x":14,"y":23,"dx":-1,"dy":-2},{"id":16,"x":33,"y":23,"dx":0,"dy":2},{"id":16,"x":36,"y":23,"dx":-2,"dy":-1},{"id":16,"x":42,"y":23,"dx":-1,"dy":-2},{"id":16,"x":10,"y":24,"dx":-1,"dy":-1},{"id":16,"x":21,"y":24,"dx":1,"dy":1},{"id":16,"x":30,"y":24,"dx":3,"dy":1},{"id":16,"x":31,"y":24,"dx":2,"dy":2},{"id":16,"x":34,"y":24,"dx":-2,"dy":-1},{"id":16,"x":46,"y":24,"dx":3,"dy":1},{"id":16,"x":1,"y":25,"dx":0,"dy":0},{"id":16,"x":4,"y":25,"dx":2,"dy":2},{"id":16,"x":20,"y":25,"dx":-1,"dy":-2},{"id":16,"x":33,"y":25,"dx":-2,"dy":2},{"id":16,"x":1,"y":26,"dx":3,"dy":2},{"id":16,"x":25,"y":26,"dx":-3,"dy":1},{"id":16,"x":0,"y":27,"dx":3,"dy":1},{"id":16,"x":3,"y":27,"dx":4,"dy":0},{"id":16,"x":6,"y":27,"dx":3,"dy":0},{"id":16,"x":11,"y":27,"dx":-2,"dy":-1},{"id":16,"x":14,"y":27,"dx":2,"dy":-2},{"id":16,"x":20,"y":27,"dx":-4,"dy":-2},{"id":16,"x":25,"y":27,"dx":3,"dy":-2},{"id":16,"x":29,"y":27,"dx":1,"dy":0},{"id":16,"x":36,"y":27,"dx":-1,"dy":-2},{"id":16,"x":39,"y":27,"dx":-4,"dy":-1},{"id":16,"x":46,"y":27,"dx":-3,"dy":-1},{"id":16,"x":14,"y":28,"dx":-4,"dy":2},{"id":16,"x":29,"y":28,"dx":-1,"dy":1},{"id":16,"x":38,"y":28,"dx":0,"dy":2},{"id":16,"x":40,"y":28,"dx":0,"dy":1},{"id":16,"x":42,"y":29,"dx":0,"dy":-1},{"id":17,"x":1,"y":30,"dx":1,"dy":1},{"id":16,"x":4,"y":30,"dx":2,"dy":1},{"id":16,"x":7,"y":30,"dx":-1,"dy":1},{"id":15,"x":21,"y":30,"dx":0,"dy":1},{"id":16,"x":30,"y":30,"dx":-2,"dy":-1},{"id":16,"x":41,"y":30,"dx":-1,"dy":0},{"id":16,"x":8,"y":31,"dx":-1,"dy":1},{"id":16,"x":15,"y":31,"dx":-2,"dy":0},{"id":16,"x":36,"y":31,"dx":4,"dy":-1},{"id":16,"x":12,"y":32,"dx":2,"dy":2},{"id":16,"x":15,"y":32,"dx":3,"dy":-1},{"id":16,"x":17,"y":32,"dx":-3,"dy":-1},{"id":16,"x":24,"y":32,"dx":2,"dy":1},{"id":16,"x":32,"y":32,"dx":3,"dy":0},{"id":16,"x":36,"y":32,"dx":0,"dy":-2},{"id":16,"x":43,"y":32,"dx":2,"dy":1},{"id":16,"x":4,"y":33,"dx":-1,"dy":1},{"id":16,"x":16,"y":33,"dx":0,"dy":0},{"id":16,"x":26,"y":33,"dx":2,"dy":1},{"id":16,"x":43,"y":33,"dx":4,"dy":0},{"id":16,"x":17,"y":34,"dx":-2,"dy":-2},{"id":16,"x":22,"y":34,"dx":-4,"dy":1},{"id":16,"x":26,"y":34,"dx":2,"dy":1},{"id":16,"x":35,"y":34,"dx":2,"dy":2},{"id":16,"x":2,"y":35,"dx":3,"dy":2},{"id":16,"x":26,"y":35,"dx":3,"dy":1},{"id":16,"x":28,"y":35,"dx":-1,"dy":1},{"id":16,"x":43,"y":35,"dx":-3,"dy":1},{"id":16,"x":10,"y":36,"dx":0,"dy":1},{"id":16,"x":11,"y":36,"dx":2,"dy":1},{"id":16,"x":27,"y":36,"dx":-1,"dy":1},{"id":16,"x":28,"y":36,"dx":-4,"dy":2},{"id":16,"x":31,"y":36,"dx":-1,"dy":1},{"id":16,"x":33,"y":36,"dx":3,"dy":-2},{"id":16,"x":42,"y":36,"dx":-1,"dy":-1},{"id":16,"x":10,"y":37,"dx":-4,"dy":-1},{"id":16,"x":18,"y":37,"dx":2,"dy":1},{"id":16,"x":31,"y":37,"dx":-4,"dy":-1},{"id":16,"x":8,"y":38,"dx":3,"dy":1},{"id":16,"x":11,"y":38,"dx":-1,"dy":1},{"id":16,"x":14,"y":38,"dx":-2,"dy":0},{"id":16,"x":27,"y":38,"dx":-1,"dy":-1}],"encoding":"rle","tiles":[[4,10],[0,1],[4,89],[0,1],[4,42],[3,1],[4,1],[3,1],[4,43],[3,1],[4,11],[0,1],[4,24],[29,1],[4,4],[0,1],[4,4],[3,1],[4,7],[3,1],[4,19],[29,1],[4,24],[3,1],[4,11],[28,1],[4,8],[19,3],[4,16],[0,1],[4,7],[3,1],[4,20],[19,2],[4,1],[19,1],[4,44],[19,2],[4,2],[19,1],[4,8],[29,1],[4,11],[3,1],[4,1],[0,1],[4,1],[3,1],[4,1],[3,1],[4,16],[19,2],[4,3],[19,1],[4,7],[0,1],[4,7],[3,1],[4,26],[19,2],[4,4],[19,1],[4,20],[3,1],[4,20],[19,2],[4,5],[19,1],[28,1],[4,22],[3,1],[4,9],[0,1],[7,1],[4,5],[19,2],[4,6],[19,1],[4,39],[19,2],[4,7],[19,1],[4,4],[28,1],[4,10],[3,1],[4,22],[19,2],[4,8],[19,1],[4,20],[3,1],[4,16],[19,2],[4,3],[0,1],[4,5],[19,1],[4,10],[3,2],[4,2],[3,1],[4,2],[3,1],[4,18],[19,2],[4,10],[19,1],[4,12],[3,1],[4,3],[3,1],[4,18],[19,2],[4,11],[19,1],[4,1],[0,1],[4,11],[3,1],[4,20],[19,2],[4,11],[0,1],[19,1],[4,7],[3,1],[4,8],[3,1],[4,8],[0,1],[4,7],[19,2],[4,13],[19,1],[4,7],[0,1],[4,3],[1,20],[4,1],[19,2],[1,3],[4,11],[19,1],[4,7],[3,1],[4,23],[19,2],[4,2],[1,1],[4,43],[19,2],[4,2],[1,1],[4,43],[19,2],[4,2],[1,1],[4,17],[0,1],[4,25],[19,2],[4,2],[1,1],[4,5],[7,1],[4,2],[29,1],[4,7],[0,1],[4,7],[29,1],[4,3],[28,1],[4,14],[19,2],[4,2],[1,1],[4,17],[3,1],[4,13],[9,1],[4,11],[19,2],[4,2],[1,1],[4,22],[3,2],[4,19],[19,2],[4,2],[1,1],[4,43],[19,2],[4,2],[1,1],[4,25],[3,2],[4,16],[19,2],[4,2],[1,1],[4,22],[0,1],[4,19],[0,1],[19,2],[4,2],[1,2],[4,15],[3,1],[4,26],[19,2],[4,3],[1,1],[20,1],[4,41],[19,2],[4,27],[3,1],[4,11],[0,1],[4,69],[28,1],[4,29],[0,1],[4,24],[3,1],[4,6],[3,1],[4,42],[0,1],[4,21],[29,1],[4,22],[3,1],[4,2],[3,1],[4,4],[3,1],[4,40],[3,1],[4,5],[3,1],[4,40],[3,1],[4,4]]} \ No newline at end of file diff --git a/apps/game/assets/maps/ponds.map b/apps/game/assets/maps/ponds.map index 51504cc..df30899 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,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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":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":16,"x":15,"y":20,"dx":-2,"dy":-2},{"id":16,"x":20,"y":20,"dx":3,"dy":-1},{"id":16,"x":2,"y":21,"dx":-1,"dy":1},{"id":15,"x":11,"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],[28,1],[0,1],[4,1],[0,2],[4,8],[0,1],[3,1],[0,2],[3,1],[0,1],[29,1],[0,3],[4,1],[0,2],[29,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],[28,2],[0,1],[28,1],[0,4],[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,1],[29,1],[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],[29,1],[0,1],[4,4],[0,2],[4,10],[3,1],[4,7],[29,1],[4,3],[0,3],[4,21],[0,1],[4,10],[3,2]]} \ No newline at end of file +{"format":"rpg-map","version":1,"width":48,"height":48,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"decor":[{"id":15,"x":3,"y":0,"dx":-2,"dy":2},{"id":16,"x":13,"y":0,"dx":0,"dy":0},{"id":16,"x":25,"y":0,"dx":1,"dy":-1},{"id":16,"x":37,"y":0,"dx":-4,"dy":-2},{"id":16,"x":43,"y":0,"dx":-4,"dy":0},{"id":16,"x":47,"y":0,"dx":-2,"dy":1},{"id":16,"x":13,"y":1,"dx":2,"dy":1},{"id":16,"x":22,"y":1,"dx":3,"dy":1},{"id":16,"x":39,"y":1,"dx":-1,"dy":0},{"id":15,"x":34,"y":2,"dx":3,"dy":-2},{"id":16,"x":47,"y":2,"dx":-4,"dy":0},{"id":16,"x":6,"y":3,"dx":0,"dy":-1},{"id":16,"x":23,"y":3,"dx":-3,"dy":0},{"id":16,"x":12,"y":4,"dx":-1,"dy":-1},{"id":16,"x":15,"y":4,"dx":2,"dy":-1},{"id":16,"x":28,"y":4,"dx":2,"dy":-2},{"id":16,"x":32,"y":4,"dx":0,"dy":2},{"id":15,"x":36,"y":4,"dx":-2,"dy":-1},{"id":16,"x":37,"y":4,"dx":-3,"dy":1},{"id":16,"x":0,"y":5,"dx":1,"dy":-1},{"id":16,"x":23,"y":5,"dx":3,"dy":0},{"id":16,"x":26,"y":5,"dx":3,"dy":-1},{"id":17,"x":31,"y":5,"dx":1,"dy":-1},{"id":16,"x":11,"y":6,"dx":1,"dy":0},{"id":16,"x":18,"y":6,"dx":-3,"dy":0},{"id":16,"x":21,"y":6,"dx":-3,"dy":-2},{"id":16,"x":34,"y":6,"dx":3,"dy":-1},{"id":16,"x":37,"y":6,"dx":-4,"dy":-2},{"id":16,"x":47,"y":6,"dx":-1,"dy":1},{"id":16,"x":4,"y":7,"dx":2,"dy":-1},{"id":17,"x":7,"y":7,"dx":4,"dy":0},{"id":16,"x":11,"y":7,"dx":-4,"dy":0},{"id":16,"x":21,"y":7,"dx":1,"dy":2},{"id":16,"x":1,"y":8,"dx":2,"dy":1},{"id":16,"x":2,"y":8,"dx":1,"dy":-2},{"id":16,"x":14,"y":8,"dx":2,"dy":0},{"id":16,"x":28,"y":8,"dx":4,"dy":-1},{"id":17,"x":41,"y":8,"dx":3,"dy":2},{"id":16,"x":47,"y":8,"dx":-2,"dy":2},{"id":16,"x":17,"y":9,"dx":0,"dy":0},{"id":16,"x":28,"y":9,"dx":3,"dy":0},{"id":16,"x":33,"y":9,"dx":0,"dy":-1},{"id":16,"x":17,"y":10,"dx":-2,"dy":-2},{"id":16,"x":22,"y":10,"dx":3,"dy":-1},{"id":16,"x":28,"y":10,"dx":-1,"dy":1},{"id":16,"x":37,"y":10,"dx":2,"dy":1},{"id":16,"x":8,"y":11,"dx":1,"dy":1},{"id":16,"x":9,"y":11,"dx":-1,"dy":1},{"id":16,"x":17,"y":11,"dx":0,"dy":-1},{"id":16,"x":21,"y":11,"dx":0,"dy":-1},{"id":16,"x":22,"y":11,"dx":-1,"dy":-2},{"id":16,"x":25,"y":11,"dx":-4,"dy":-2},{"id":17,"x":34,"y":11,"dx":-2,"dy":-1},{"id":17,"x":41,"y":11,"dx":3,"dy":0},{"id":16,"x":1,"y":12,"dx":1,"dy":0},{"id":15,"x":9,"y":12,"dx":3,"dy":-2},{"id":16,"x":10,"y":12,"dx":4,"dy":1},{"id":16,"x":16,"y":12,"dx":-3,"dy":1},{"id":16,"x":19,"y":12,"dx":1,"dy":-2},{"id":16,"x":26,"y":12,"dx":4,"dy":1},{"id":16,"x":3,"y":13,"dx":0,"dy":1},{"id":16,"x":31,"y":13,"dx":-1,"dy":0},{"id":16,"x":33,"y":13,"dx":2,"dy":-1},{"id":16,"x":37,"y":13,"dx":1,"dy":1},{"id":17,"x":43,"y":13,"dx":0,"dy":-1},{"id":16,"x":1,"y":14,"dx":-1,"dy":0},{"id":16,"x":5,"y":14,"dx":2,"dy":-2},{"id":15,"x":41,"y":14,"dx":-3,"dy":1},{"id":16,"x":42,"y":14,"dx":-1,"dy":-1},{"id":16,"x":3,"y":15,"dx":4,"dy":-1},{"id":16,"x":13,"y":15,"dx":1,"dy":0},{"id":16,"x":16,"y":15,"dx":0,"dy":2},{"id":16,"x":44,"y":15,"dx":2,"dy":1},{"id":16,"x":41,"y":16,"dx":2,"dy":2},{"id":16,"x":45,"y":16,"dx":-2,"dy":-2},{"id":16,"x":46,"y":16,"dx":4,"dy":-1},{"id":16,"x":45,"y":17,"dx":-4,"dy":1},{"id":16,"x":47,"y":17,"dx":3,"dy":1},{"id":15,"x":38,"y":18,"dx":-2,"dy":0},{"id":16,"x":1,"y":19,"dx":2,"dy":0},{"id":16,"x":40,"y":19,"dx":-3,"dy":-1},{"id":16,"x":3,"y":21,"dx":1,"dy":-1},{"id":15,"x":6,"y":22,"dx":-2,"dy":2},{"id":15,"x":7,"y":22,"dx":2,"dy":-2},{"id":15,"x":9,"y":22,"dx":2,"dy":-1},{"id":16,"x":39,"y":23,"dx":-1,"dy":0},{"id":16,"x":46,"y":23,"dx":0,"dy":0},{"id":16,"x":1,"y":24,"dx":2,"dy":-2},{"id":16,"x":3,"y":24,"dx":-3,"dy":0},{"id":16,"x":2,"y":25,"dx":2,"dy":0},{"id":16,"x":46,"y":26,"dx":2,"dy":1},{"id":16,"x":4,"y":27,"dx":1,"dy":-2},{"id":16,"x":38,"y":27,"dx":-2,"dy":1},{"id":16,"x":41,"y":27,"dx":4,"dy":-1},{"id":16,"x":3,"y":28,"dx":2,"dy":-2},{"id":16,"x":47,"y":28,"dx":-2,"dy":2},{"id":16,"x":41,"y":29,"dx":0,"dy":0},{"id":15,"x":3,"y":30,"dx":-3,"dy":0},{"id":16,"x":9,"y":30,"dx":-3,"dy":1},{"id":16,"x":40,"y":30,"dx":-4,"dy":0},{"id":16,"x":41,"y":30,"dx":0,"dy":-2},{"id":16,"x":43,"y":30,"dx":0,"dy":-1},{"id":16,"x":41,"y":31,"dx":4,"dy":-2},{"id":16,"x":31,"y":32,"dx":-2,"dy":-2},{"id":16,"x":36,"y":32,"dx":-2,"dy":-2},{"id":16,"x":47,"y":32,"dx":-3,"dy":1},{"id":17,"x":36,"y":33,"dx":2,"dy":0},{"id":16,"x":39,"y":33,"dx":2,"dy":0},{"id":16,"x":45,"y":33,"dx":2,"dy":2},{"id":16,"x":7,"y":34,"dx":3,"dy":0},{"id":15,"x":27,"y":34,"dx":1,"dy":1},{"id":16,"x":35,"y":34,"dx":-3,"dy":1},{"id":16,"x":39,"y":34,"dx":1,"dy":0},{"id":16,"x":1,"y":35,"dx":-1,"dy":-1},{"id":16,"x":31,"y":35,"dx":2,"dy":-1},{"id":16,"x":8,"y":36,"dx":-1,"dy":1},{"id":16,"x":12,"y":36,"dx":-3,"dy":0},{"id":17,"x":17,"y":36,"dx":-1,"dy":-1},{"id":16,"x":40,"y":36,"dx":2,"dy":-2},{"id":16,"x":45,"y":36,"dx":-1,"dy":-1},{"id":16,"x":46,"y":36,"dx":3,"dy":2},{"id":16,"x":9,"y":37,"dx":2,"dy":-1},{"id":16,"x":13,"y":37,"dx":-2,"dy":1},{"id":15,"x":16,"y":37,"dx":2,"dy":-1},{"id":16,"x":33,"y":37,"dx":1,"dy":1},{"id":16,"x":39,"y":37,"dx":-1,"dy":0},{"id":16,"x":40,"y":37,"dx":-1,"dy":1},{"id":16,"x":41,"y":37,"dx":-4,"dy":1},{"id":16,"x":10,"y":38,"dx":-3,"dy":1},{"id":16,"x":15,"y":38,"dx":2,"dy":0},{"id":17,"x":18,"y":38,"dx":1,"dy":2},{"id":16,"x":44,"y":38,"dx":-3,"dy":-1},{"id":16,"x":45,"y":38,"dx":-3,"dy":0},{"id":16,"x":5,"y":39,"dx":1,"dy":-1},{"id":16,"x":17,"y":39,"dx":-3,"dy":1},{"id":16,"x":3,"y":40,"dx":-2,"dy":0},{"id":16,"x":16,"y":40,"dx":3,"dy":-2},{"id":16,"x":21,"y":40,"dx":-1,"dy":-1},{"id":16,"x":29,"y":40,"dx":-2,"dy":2},{"id":16,"x":41,"y":40,"dx":2,"dy":0},{"id":16,"x":5,"y":41,"dx":-1,"dy":-1},{"id":16,"x":2,"y":42,"dx":3,"dy":-2},{"id":15,"x":6,"y":42,"dx":3,"dy":0},{"id":16,"x":9,"y":42,"dx":-3,"dy":2},{"id":16,"x":42,"y":42,"dx":-2,"dy":1},{"id":16,"x":43,"y":42,"dx":-3,"dy":2},{"id":16,"x":47,"y":42,"dx":4,"dy":1},{"id":16,"x":5,"y":43,"dx":2,"dy":1},{"id":16,"x":8,"y":43,"dx":3,"dy":2},{"id":16,"x":21,"y":43,"dx":-1,"dy":0},{"id":17,"x":28,"y":43,"dx":2,"dy":-1},{"id":15,"x":32,"y":43,"dx":-1,"dy":-2},{"id":16,"x":38,"y":43,"dx":-2,"dy":-2},{"id":16,"x":41,"y":43,"dx":2,"dy":2},{"id":16,"x":42,"y":43,"dx":-3,"dy":-1},{"id":16,"x":46,"y":43,"dx":-1,"dy":0},{"id":16,"x":0,"y":44,"dx":-1,"dy":1},{"id":16,"x":2,"y":44,"dx":3,"dy":2},{"id":15,"x":30,"y":44,"dx":4,"dy":-1},{"id":16,"x":35,"y":44,"dx":1,"dy":0},{"id":16,"x":37,"y":44,"dx":3,"dy":-1},{"id":16,"x":42,"y":44,"dx":1,"dy":-1},{"id":16,"x":14,"y":45,"dx":1,"dy":0},{"id":16,"x":17,"y":45,"dx":-3,"dy":1},{"id":16,"x":25,"y":45,"dx":-4,"dy":0},{"id":15,"x":29,"y":45,"dx":4,"dy":1},{"id":16,"x":30,"y":45,"dx":-2,"dy":2},{"id":16,"x":36,"y":45,"dx":2,"dy":1},{"id":16,"x":39,"y":45,"dx":-1,"dy":0},{"id":16,"x":40,"y":45,"dx":0,"dy":1},{"id":16,"x":9,"y":46,"dx":-3,"dy":2},{"id":16,"x":11,"y":46,"dx":2,"dy":-2},{"id":16,"x":21,"y":46,"dx":1,"dy":-1},{"id":16,"x":22,"y":46,"dx":-3,"dy":2},{"id":16,"x":24,"y":46,"dx":3,"dy":0},{"id":16,"x":3,"y":47,"dx":-1,"dy":2},{"id":16,"x":18,"y":47,"dx":3,"dy":-1},{"id":16,"x":20,"y":47,"dx":1,"dy":1},{"id":15,"x":30,"y":47,"dx":3,"dy":1}],"encoding":"rle","tiles":[[4,1],[0,5],[4,26],[0,1],[4,1],[0,2],[4,8],[3,1],[4,4],[3,2],[0,3],[4,23],[0,1],[4,1],[0,4],[4,10],[3,1],[4,3],[0,1],[1,1],[0,3],[4,3],[0,2],[4,18],[0,2],[4,1],[0,4],[4,13],[3,2],[0,3],[4,3],[0,1],[4,1],[0,2],[4,16],[0,3],[4,1],[0,1],[4,1],[0,1],[4,8],[3,2],[4,6],[1,1],[0,1],[4,2],[28,1],[0,2],[4,5],[0,1],[4,2],[0,1],[4,4],[28,1],[4,4],[0,2],[4,2],[0,1],[4,1],[0,2],[4,15],[0,2],[1,3],[0,1],[4,6],[0,1],[4,2],[0,1],[4,5],[29,1],[4,3],[0,3],[4,4],[0,2],[4,8],[3,1],[4,6],[0,3],[1,3],[4,6],[0,1],[4,1],[0,2],[4,23],[3,1],[4,6],[3,1],[4,1],[3,1],[4,1],[0,2],[4,1],[1,1],[4,4],[0,3],[4,1],[0,2],[4,10],[29,1],[4,2],[0,1],[4,6],[0,1],[4,1],[0,3],[3,1],[4,4],[3,3],[4,1],[0,2],[4,1],[1,1],[4,1],[0,2],[4,1],[0,2],[4,1],[0,3],[4,12],[0,1],[4,2],[0,1],[4,4],[0,4],[4,3],[3,1],[4,4],[0,1],[4,2],[0,2],[1,2],[4,2],[0,2],[4,2],[29,1],[4,7],[0,1],[4,2],[0,2],[4,1],[0,1],[4,1],[0,2],[4,7],[0,5],[3,1],[4,2],[3,1],[4,7],[1,1],[0,1],[4,1],[0,3],[4,9],[0,2],[4,1],[0,1],[4,3],[0,4],[4,2],[0,1],[4,1],[0,5],[4,2],[3,1],[4,2],[3,1],[4,7],[1,1],[0,2],[4,1],[28,1],[4,10],[0,2],[4,1],[0,2],[4,2],[0,2],[4,4],[0,3],[3,1],[0,1],[4,1],[3,1],[4,11],[0,1],[4,1],[1,1],[0,1],[4,1],[0,2],[4,11],[0,2],[4,1],[0,1],[4,2],[0,1],[4,1],[0,1],[4,2],[5,1],[0,3],[4,1],[0,2],[3,2],[4,1],[3,1],[4,7],[0,1],[4,2],[1,2],[4,8],[2,2],[4,1],[2,1],[4,1],[0,1],[4,1],[0,1],[4,1],[2,1],[4,8],[0,1],[28,1],[0,3],[4,1],[0,1],[4,6],[3,1],[4,3],[0,2],[4,2],[1,1],[4,4],[2,1],[0,1],[2,2],[4,1],[2,3],[4,2],[0,1],[2,2],[4,6],[0,1],[4,1],[0,2],[4,1],[0,1],[4,7],[3,1],[4,3],[3,1],[4,3],[0,1],[4,2],[1,1],[4,4],[0,1],[2,13],[0,1],[2,1],[4,1],[2,1],[4,2],[0,1],[4,1],[0,2],[4,14],[0,1],[5,1],[4,1],[0,1],[4,1],[1,2],[4,2],[2,19],[4,2],[0,1],[4,1],[0,1],[4,3],[3,1],[4,4],[3,2],[4,5],[0,3],[2,3],[1,1],[2,21],[4,1],[2,2],[0,1],[4,1],[0,1],[4,3],[3,1],[4,9],[29,1],[4,1],[0,1],[4,1],[2,1],[4,1],[2,1],[1,3],[2,18],[4,2],[2,1],[4,1],[0,1],[2,1],[4,3],[3,1],[4,9],[0,4],[2,1],[0,1],[4,1],[2,3],[1,4],[2,17],[4,2],[2,1],[0,1],[4,5],[3,1],[4,4],[3,1],[4,3],[0,2],[4,1],[0,2],[2,7],[1,1],[2,21],[4,4],[3,3],[4,3],[3,1],[4,4],[0,2],[2,1],[4,1],[2,7],[1,1],[2,20],[4,1],[2,1],[4,2],[3,1],[4,2],[28,1],[4,5],[3,1],[4,1],[0,2],[4,1],[0,1],[2,8],[1,1],[2,19],[4,1],[2,1],[4,9],[3,1],[4,4],[0,2],[2,2],[4,1],[2,7],[1,1],[2,19],[4,2],[2,1],[4,2],[3,1],[4,11],[2,1],[4,1],[2,9],[1,3],[2,18],[4,18],[2,1],[4,1],[2,9],[1,3],[2,17],[4,3],[0,2],[4,3],[0,2],[3,1],[4,1],[3,1],[4,5],[2,12],[1,2],[2,14],[4,2],[28,1],[4,1],[0,1],[4,1],[3,1],[4,3],[3,1],[4,1],[0,1],[4,5],[2,1],[4,1],[2,13],[1,1],[2,14],[4,5],[3,1],[4,1],[3,2],[4,1],[0,2],[4,2],[3,1],[4,5],[2,1],[4,1],[2,11],[1,1],[2,15],[4,5],[3,1],[4,3],[0,4],[4,5],[2,1],[4,1],[2,12],[1,2],[2,12],[4,11],[0,1],[4,1],[0,2],[4,7],[2,2],[29,1],[2,10],[1,6],[2,7],[4,9],[3,1],[4,3],[3,1],[4,2],[3,1],[4,5],[2,2],[4,1],[2,23],[4,6],[3,1],[4,3],[3,1],[4,1],[0,2],[4,8],[2,1],[4,1],[2,2],[0,1],[2,1],[0,1],[2,13],[4,1],[2,3],[4,8],[3,1],[4,2],[3,1],[4,2],[0,1],[3,2],[4,8],[2,1],[4,2],[0,1],[2,1],[4,1],[2,13],[4,2],[2,1],[4,1],[2,1],[0,1],[4,1],[0,1],[4,4],[3,2],[4,4],[0,2],[3,1],[4,8],[5,1],[4,2],[0,1],[4,1],[0,2],[2,8],[0,1],[2,1],[4,1],[2,3],[4,1],[2,1],[4,1],[5,1],[0,2],[4,11],[3,1],[0,1],[4,11],[0,1],[4,1],[0,5],[2,1],[0,2],[2,1],[0,2],[4,1],[2,1],[4,3],[29,1],[4,2],[0,1],[4,1],[0,1],[4,10],[3,1],[4,2],[3,1],[4,11],[0,5],[4,1],[0,2],[4,2],[0,2],[4,24],[3,1],[4,1],[0,1],[4,9],[0,2],[4,1],[0,5],[4,1],[0,2],[4,22],[3,2],[4,15],[0,5],[4,13],[0,1],[4,15],[0,1],[4,1],[0,1],[4,13],[0,2],[4,1],[0,1],[4,11],[0,2],[4,6],[3,1],[4,5],[3,1],[4,7],[28,1],[4,9],[0,1],[29,1],[4,1],[0,1],[4,9],[0,1],[4,1],[0,3],[4,13],[3,1],[4,3],[0,2],[4,11],[0,1],[29,1],[0,5],[4,6],[0,2],[4,1],[0,2],[4,17],[0,3],[4,11],[0,1],[4,1],[0,2],[5,1],[4,7],[29,1],[4,1],[0,3],[4,9],[3,1],[4,2],[3,3],[4,2],[0,2],[4,15],[0,3],[4,1],[0,2],[4,1],[0,1],[4,1],[0,3],[4,1],[0,1],[4,12],[3,1],[4,1],[3,1],[4,15],[0,2],[4,6],[0,1],[4,2],[0,4],[4,2],[0,1],[4,9],[3,1],[4,21],[0,1],[4,6],[0,1],[4,1],[0,1],[4,1],[0,1],[4,17],[3,1],[4,1],[3,1],[4,3],[28,1],[4,2],[0,1],[4,7],[0,2],[4,8],[0,1],[4,1],[0,2],[4,6],[29,1],[4,6],[3,1],[4,10],[0,2],[4,17],[0,1],[4,1],[0,2],[4,12],[3,1],[4,4]]} \ No newline at end of file diff --git a/apps/game/assets/maps/rust_grove.map b/apps/game/assets/maps/rust_grove.map index b707dcf..7774b47 100644 --- a/apps/game/assets/maps/rust_grove.map +++ b/apps/game/assets/maps/rust_grove.map @@ -1 +1 @@ -{"format":"rpg-map","version":1,"width":24,"height":20,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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,1],[29,1],[3,2],[4,1],[3,3],[28,1],[4,2],[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],[28,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,4],[28,1],[4,1],[3,1],[4,1],[3,2],[29,1],[4,2],[3,1],[4,1],[3,4],[4,2],[3,1],[4,1],[3,1],[4,3],[3,1],[4,2],[1,1],[4,4],[29,1],[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],[29,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 +{"format":"rpg-map","version":1,"width":48,"height":40,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"decor":[{"id":16,"x":10,"y":0,"dx":1,"dy":1},{"id":16,"x":3,"y":1,"dx":3,"dy":2},{"id":16,"x":26,"y":1,"dx":-3,"dy":1},{"id":16,"x":42,"y":1,"dx":-2,"dy":1},{"id":16,"x":46,"y":1,"dx":3,"dy":0},{"id":16,"x":14,"y":2,"dx":3,"dy":1},{"id":16,"x":23,"y":2,"dx":-1,"dy":-2},{"id":16,"x":16,"y":5,"dx":0,"dy":-1},{"id":16,"x":9,"y":6,"dx":2,"dy":1},{"id":16,"x":12,"y":6,"dx":1,"dy":0},{"id":16,"x":20,"y":6,"dx":-2,"dy":-1},{"id":16,"x":47,"y":6,"dx":-3,"dy":1},{"id":16,"x":2,"y":7,"dx":-4,"dy":1},{"id":16,"x":10,"y":7,"dx":3,"dy":2},{"id":16,"x":16,"y":7,"dx":2,"dy":-1},{"id":16,"x":17,"y":7,"dx":-2,"dy":2},{"id":16,"x":20,"y":7,"dx":-2,"dy":0},{"id":16,"x":37,"y":8,"dx":1,"dy":1},{"id":16,"x":0,"y":9,"dx":-1,"dy":-1},{"id":16,"x":15,"y":9,"dx":-2,"dy":2},{"id":16,"x":27,"y":9,"dx":2,"dy":1},{"id":15,"x":38,"y":9,"dx":-3,"dy":-2},{"id":16,"x":23,"y":10,"dx":3,"dy":-1},{"id":16,"x":2,"y":11,"dx":3,"dy":2},{"id":16,"x":21,"y":11,"dx":-2,"dy":0},{"id":16,"x":31,"y":12,"dx":1,"dy":-2},{"id":16,"x":10,"y":13,"dx":-3,"dy":-1},{"id":16,"x":29,"y":13,"dx":-3,"dy":0},{"id":16,"x":36,"y":13,"dx":-3,"dy":1},{"id":16,"x":44,"y":13,"dx":2,"dy":2},{"id":16,"x":45,"y":13,"dx":-1,"dy":-2},{"id":16,"x":13,"y":15,"dx":-2,"dy":1},{"id":16,"x":30,"y":15,"dx":3,"dy":2},{"id":16,"x":33,"y":15,"dx":-2,"dy":0},{"id":16,"x":22,"y":16,"dx":2,"dy":-2},{"id":16,"x":26,"y":16,"dx":-3,"dy":0},{"id":16,"x":30,"y":16,"dx":4,"dy":1},{"id":16,"x":32,"y":16,"dx":3,"dy":0},{"id":16,"x":37,"y":16,"dx":0,"dy":-1},{"id":16,"x":12,"y":17,"dx":-4,"dy":0},{"id":16,"x":27,"y":17,"dx":-2,"dy":-1},{"id":16,"x":19,"y":18,"dx":-3,"dy":-2},{"id":16,"x":29,"y":18,"dx":3,"dy":-1},{"id":16,"x":19,"y":19,"dx":2,"dy":-1},{"id":16,"x":43,"y":19,"dx":2,"dy":-2},{"id":16,"x":44,"y":19,"dx":-2,"dy":1},{"id":16,"x":27,"y":20,"dx":0,"dy":-2},{"id":16,"x":20,"y":21,"dx":2,"dy":0},{"id":16,"x":21,"y":21,"dx":-2,"dy":-2},{"id":16,"x":24,"y":21,"dx":1,"dy":0},{"id":16,"x":1,"y":22,"dx":3,"dy":1},{"id":16,"x":16,"y":22,"dx":1,"dy":0},{"id":16,"x":19,"y":22,"dx":1,"dy":-2},{"id":16,"x":46,"y":22,"dx":0,"dy":1},{"id":16,"x":47,"y":22,"dx":0,"dy":0},{"id":16,"x":2,"y":23,"dx":-3,"dy":0},{"id":16,"x":20,"y":23,"dx":4,"dy":0},{"id":16,"x":33,"y":23,"dx":2,"dy":1},{"id":16,"x":41,"y":23,"dx":3,"dy":-1},{"id":16,"x":47,"y":23,"dx":-2,"dy":-2},{"id":15,"x":0,"y":24,"dx":-3,"dy":-1},{"id":16,"x":16,"y":24,"dx":1,"dy":2},{"id":16,"x":27,"y":24,"dx":0,"dy":0},{"id":16,"x":6,"y":25,"dx":-3,"dy":0},{"id":16,"x":38,"y":25,"dx":-2,"dy":-1},{"id":16,"x":2,"y":26,"dx":2,"dy":-1},{"id":16,"x":13,"y":26,"dx":1,"dy":1},{"id":16,"x":8,"y":28,"dx":0,"dy":2},{"id":16,"x":31,"y":28,"dx":-1,"dy":-1},{"id":16,"x":7,"y":30,"dx":2,"dy":0},{"id":16,"x":32,"y":30,"dx":2,"dy":-1},{"id":16,"x":43,"y":30,"dx":1,"dy":1},{"id":16,"x":23,"y":31,"dx":-2,"dy":2},{"id":16,"x":24,"y":31,"dx":0,"dy":1},{"id":16,"x":25,"y":31,"dx":1,"dy":1},{"id":16,"x":17,"y":32,"dx":-3,"dy":0},{"id":16,"x":21,"y":32,"dx":4,"dy":0},{"id":16,"x":14,"y":33,"dx":2,"dy":2},{"id":16,"x":16,"y":33,"dx":2,"dy":1},{"id":16,"x":22,"y":33,"dx":2,"dy":0},{"id":16,"x":14,"y":34,"dx":-1,"dy":1},{"id":16,"x":22,"y":34,"dx":2,"dy":1},{"id":16,"x":12,"y":35,"dx":-2,"dy":1},{"id":16,"x":21,"y":35,"dx":1,"dy":1},{"id":16,"x":11,"y":36,"dx":4,"dy":-1},{"id":16,"x":17,"y":37,"dx":-2,"dy":-2},{"id":16,"x":23,"y":37,"dx":-2,"dy":2},{"id":16,"x":24,"y":37,"dx":-3,"dy":-1},{"id":16,"x":34,"y":37,"dx":0,"dy":-1},{"id":16,"x":0,"y":38,"dx":1,"dy":2},{"id":16,"x":27,"y":38,"dx":1,"dy":0},{"id":16,"x":29,"y":38,"dx":-2,"dy":1},{"id":16,"x":34,"y":38,"dx":-2,"dy":-1}],"encoding":"rle","tiles":[[3,8],[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,7],[4,1],[3,4],[4,1],[3,3],[4,1],[3,3],[4,2],[3,5],[4,2],[3,1],[4,1],[3,2],[4,1],[3,6],[4,1],[3,2],[4,1],[3,1],[4,1],[3,5],[4,1],[3,7],[4,1],[3,3],[4,1],[3,7],[29,1],[3,2],[28,1],[3,1],[4,1],[3,2],[4,1],[3,1],[0,1],[3,4],[4,3],[3,10],[4,1],[3,6],[4,2],[3,11],[4,1],[3,1],[4,1],[3,2],[4,1],[3,4],[4,3],[3,1],[4,1],[3,4],[4,2],[3,1],[4,1],[3,1],[4,3],[3,2],[4,1],[3,4],[4,2],[3,15],[4,1],[3,4],[29,1],[3,4],[4,4],[3,4],[4,6],[3,3],[4,1],[3,3],[4,1],[3,3],[4,1],[3,6],[4,2],[3,1],[4,3],[3,5],[4,3],[3,2],[4,1],[3,3],[4,1],[3,6],[4,4],[3,1],[4,1],[3,1],[4,1],[3,6],[4,2],[3,6],[4,1],[3,3],[4,2],[3,2],[4,4],[3,4],[4,1],[3,2],[4,1],[3,8],[18,1],[4,2],[3,1],[0,1],[4,2],[3,3],[4,1],[3,4],[4,1],[3,2],[4,1],[3,2],[4,1],[3,4],[4,1],[3,2],[4,1],[3,2],[4,5],[3,1],[4,1],[3,3],[0,1],[3,3],[4,1],[3,1],[4,1],[3,1],[4,3],[3,3],[4,2],[3,1],[4,2],[3,1],[4,1],[3,5],[4,2],[3,1],[4,1],[3,1],[4,1],[3,2],[18,1],[4,1],[3,1],[4,1],[3,1],[4,1],[3,1],[4,2],[3,3],[4,1],[3,3],[4,3],[3,1],[4,2],[3,3],[4,2],[3,8],[4,4],[3,7],[4,1],[18,1],[3,3],[4,6],[3,1],[4,1],[3,1],[4,1],[3,2],[4,1],[3,2],[4,1],[3,3],[4,3],[3,1],[0,1],[3,3],[4,1],[3,6],[4,2],[3,3],[4,1],[3,2],[4,1],[3,1],[4,1],[18,1],[3,1],[0,1],[4,2],[3,2],[4,5],[18,1],[4,1],[3,1],[4,1],[3,2],[4,3],[3,1],[4,2],[3,1],[4,1],[3,2],[4,1],[3,1],[4,2],[3,6],[4,1],[3,4],[4,1],[3,2],[4,2],[3,2],[4,1],[3,3],[4,1],[3,1],[4,3],[3,1],[18,1],[3,1],[4,3],[3,1],[4,1],[3,1],[4,3],[3,4],[0,1],[3,4],[4,1],[3,1],[4,1],[3,1],[4,2],[0,1],[4,3],[3,1],[4,1],[3,1],[4,1],[3,1],[4,3],[3,1],[4,1],[3,3],[4,1],[29,1],[3,5],[4,2],[3,1],[4,1],[3,1],[4,5],[3,2],[4,1],[3,1],[4,1],[3,2],[4,4],[3,1],[4,2],[3,1],[4,1],[3,5],[4,5],[3,2],[4,2],[3,3],[4,3],[3,2],[4,4],[3,1],[4,1],[3,1],[4,4],[3,1],[4,1],[3,4],[4,4],[3,1],[4,1],[3,2],[4,3],[3,2],[4,7],[3,3],[4,4],[3,2],[4,4],[3,2],[4,1],[3,1],[4,5],[3,3],[4,6],[3,5],[4,1],[3,3],[4,3],[3,2],[4,2],[3,3],[4,1],[3,1],[4,15],[3,2],[4,2],[3,2],[4,1],[3,1],[4,2],[3,1],[4,2],[3,2],[4,2],[3,1],[4,5],[3,2],[4,1],[3,1],[4,3],[3,2],[4,11],[3,1],[4,5],[3,2],[4,1],[29,1],[3,1],[4,1],[3,2],[4,2],[3,1],[4,1],[3,6],[4,2],[3,1],[4,2],[3,2],[4,2],[3,1],[4,17],[3,5],[4,1],[3,1],[4,3],[3,4],[4,1],[3,2],[4,2],[3,2],[4,2],[3,1],[4,1],[3,1],[4,3],[3,1],[4,2],[3,2],[4,13],[3,1],[4,1],[3,1],[4,1],[3,1],[4,1],[3,2],[4,1],[3,2],[4,2],[3,1],[4,4],[3,2],[4,1],[3,3],[4,1],[3,1],[4,1],[3,1],[4,2],[3,1],[4,3],[3,1],[4,13],[3,1],[4,1],[3,1],[4,1],[28,1],[3,1],[4,1],[3,1],[4,1],[3,2],[29,1],[4,3],[3,3],[1,17],[4,13],[1,16],[4,3],[3,9],[4,1],[3,1],[4,1],[3,1],[4,2],[3,1],[4,13],[3,2],[4,1],[3,2],[4,3],[3,2],[4,1],[3,5],[4,3],[3,1],[4,1],[3,3],[28,1],[4,1],[3,3],[4,1],[3,2],[4,17],[3,2],[4,1],[3,1],[4,1],[3,3],[4,2],[3,4],[4,3],[3,1],[4,2],[3,4],[4,1],[3,1],[4,1],[3,1],[4,1],[3,1],[4,3],[3,1],[4,14],[3,1],[4,1],[3,1],[4,2],[3,1],[4,2],[3,1],[4,1],[3,3],[4,1],[3,1],[4,1],[0,1],[3,1],[4,1],[3,1],[4,1],[3,3],[4,1],[3,4],[4,1],[3,2],[4,1],[3,1],[4,1],[3,1],[4,9],[3,1],[4,3],[3,2],[4,1],[3,1],[4,1],[29,1],[4,3],[3,3],[4,1],[3,3],[4,1],[3,3],[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,4],[3,1],[4,1],[3,1],[4,2],[3,1],[4,1],[3,5],[4,1],[3,1],[4,4],[3,1],[4,1],[3,2],[4,1],[3,3],[4,1],[3,4],[4,3],[3,1],[4,3],[3,1],[4,4],[3,3],[4,3],[3,3],[4,3],[3,2],[4,3],[3,1],[4,1],[3,3],[4,2],[3,1],[4,2],[3,3],[4,1],[3,8],[0,1],[3,4],[4,1],[3,2],[4,3],[3,1],[4,3],[3,1],[4,2],[3,1],[4,1],[3,5],[4,4],[3,4],[4,3],[3,5],[4,1],[3,1],[4,2],[3,1],[4,1],[3,1],[4,1],[3,1],[4,5],[3,1],[4,2],[3,2],[4,6],[0,1],[3,1],[4,2],[3,1],[4,1],[18,1],[3,1],[18,1],[3,2],[4,2],[3,2],[4,2],[3,11],[4,2],[3,4],[4,1],[3,1],[4,1],[3,4],[4,3],[3,2],[4,2],[3,2],[4,3],[3,3],[4,1],[3,2],[4,1],[3,3],[4,1],[3,4],[4,2],[3,2],[4,1],[3,1],[4,2],[3,6],[4,2],[3,2],[18,1],[3,1],[18,1],[3,1],[4,1],[3,1],[4,3],[3,2],[4,4],[3,1],[4,2],[3,2],[4,1],[3,4],[4,2],[3,3],[4,1],[3,5],[4,1],[3,1],[4,1],[3,2],[4,1],[3,1],[4,2],[3,1],[4,1],[3,1],[4,1],[3,2],[4,1],[3,1],[4,3],[3,1],[4,2],[3,1],[4,3],[3,2],[4,1],[3,3],[4,1],[3,3],[4,1],[3,1],[4,1],[3,2],[4,1],[3,1],[4,3],[3,6],[4,1],[3,3],[4,1],[3,1],[4,1],[3,2],[4,2],[3,1],[4,1],[3,1],[4,2],[3,1],[4,6],[3,1],[4,2],[3,1],[4,1],[3,1],[4,4],[3,4],[4,1],[3,6],[28,1],[3,2],[4,1],[3,1],[4,1],[3,1],[4,4],[3,4],[4,3],[3,1],[4,1],[3,1],[4,2],[3,10],[4,1],[3,11],[4,1],[3,1],[4,1],[3,1],[4,2],[3,2],[4,1],[3,1],[4,4],[3,2],[4,4],[3,1],[4,2],[3,3],[4,1],[3,1],[4,4],[3,1],[4,2],[3,1],[4,1],[3,1],[28,1],[4,2],[3,4],[4,1],[3,7],[4,1],[3,2],[4,1],[3,2],[4,1],[3,1],[4,1],[3,1],[4,1],[3,1],[4,1],[3,2],[4,2],[3,2],[4,1],[3,1],[29,1],[3,1],[4,1],[3,1],[4,2],[3,2],[4,1],[3,3],[4,1],[3,4],[4,2],[3,7],[4,2],[3,1],[4,1],[3,1],[4,4],[3,2],[4,2],[3,1],[4,2],[3,3],[4,1],[3,5],[4,3],[3,2],[4,1],[3,5],[4,1],[3,4],[4,1],[3,4],[4,2],[3,1],[4,2],[3,1],[4,2],[3,3],[4,2],[3,1],[29,1],[3,2],[4,2],[3,1],[4,1],[3,1],[4,1],[3,1],[4,1],[3,1],[4,1],[3,1],[4,2],[3,4],[4,1],[3,7],[4,1],[3,7],[4,3],[3,4],[4,1],[3,2],[4,1],[3,5],[4,6],[3,1],[4,4],[3,2],[4,2],[3,3],[4,1],[3,8],[4,1],[3,6],[4,4],[3,3],[4,2],[3,2],[4,1],[3,1],[4,2],[3,2],[4,1],[3,1],[4,2],[3,4],[4,2],[3,3],[4,1],[3,1],[4,1],[3,5]]} \ No newline at end of file diff --git a/apps/game/assets/maps/zvenets.map b/apps/game/assets/maps/zvenets.map index 20d97d8..f6ea8df 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,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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],[29,1],[4,22],[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,1],[29,1],[4,6],[0,3],[28,1],[0,1],[4,1],[0,1],[4,3],[27,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],[26,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 +{"format":"rpg-map","version":1,"width":56,"height":40,"blocked":[2,3,6,7,24,25,26,27,9,10,18,21,28,29],"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},"22":{"height":1.5,"ground":0},"23":{"height":1.5,"ground":0},"24":{"height":1.75,"ground":4,"shadow":true},"25":{"height":1.75,"ground":4,"shadow":true},"26":{"height":2.5,"ground":4,"shadow":true},"27":{"height":2.5,"ground":4,"shadow":true},"28":{"height":1.05,"ground":4},"29":{"height":1.25,"ground":4}},"variants":{"0":[0,11,12],"1":[1,14],"3":[3,22,23],"4":[4,13],"7":[7,24,25,26,27]},"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":31,"y":0,"dx":0,"dy":0},{"id":16,"x":37,"y":0,"dx":3,"dy":0},{"id":16,"x":39,"y":0,"dx":3,"dy":2},{"id":16,"x":49,"y":0,"dx":-1,"dy":1},{"id":16,"x":3,"y":1,"dx":1,"dy":0},{"id":16,"x":5,"y":1,"dx":4,"dy":1},{"id":15,"x":13,"y":1,"dx":-1,"dy":-2},{"id":16,"x":39,"y":1,"dx":4,"dy":1},{"id":17,"x":45,"y":1,"dx":0,"dy":0},{"id":16,"x":55,"y":2,"dx":3,"dy":-1},{"id":16,"x":21,"y":3,"dx":1,"dy":-1},{"id":16,"x":27,"y":3,"dx":-2,"dy":-2},{"id":16,"x":34,"y":3,"dx":1,"dy":-2},{"id":16,"x":36,"y":3,"dx":0,"dy":0},{"id":16,"x":3,"y":4,"dx":1,"dy":-1},{"id":16,"x":4,"y":4,"dx":3,"dy":2},{"id":16,"x":11,"y":4,"dx":2,"dy":0},{"id":16,"x":13,"y":4,"dx":2,"dy":1},{"id":16,"x":18,"y":4,"dx":1,"dy":0},{"id":16,"x":51,"y":4,"dx":1,"dy":-1},{"id":16,"x":5,"y":5,"dx":0,"dy":2},{"id":16,"x":19,"y":5,"dx":0,"dy":1},{"id":16,"x":31,"y":5,"dx":-3,"dy":-1},{"id":15,"x":5,"y":6,"dx":4,"dy":0},{"id":16,"x":13,"y":6,"dx":2,"dy":2},{"id":16,"x":18,"y":6,"dx":-3,"dy":-1},{"id":16,"x":24,"y":6,"dx":-2,"dy":2},{"id":16,"x":41,"y":6,"dx":1,"dy":0},{"id":16,"x":48,"y":6,"dx":-2,"dy":1},{"id":15,"x":6,"y":7,"dx":-1,"dy":-1},{"id":16,"x":13,"y":7,"dx":3,"dy":1},{"id":16,"x":20,"y":7,"dx":-4,"dy":2},{"id":16,"x":26,"y":8,"dx":3,"dy":-2},{"id":16,"x":47,"y":8,"dx":3,"dy":-2},{"id":15,"x":9,"y":9,"dx":0,"dy":2},{"id":16,"x":17,"y":10,"dx":3,"dy":2},{"id":16,"x":20,"y":10,"dx":-3,"dy":-2},{"id":16,"x":38,"y":10,"dx":-3,"dy":1},{"id":16,"x":45,"y":10,"dx":0,"dy":-2},{"id":16,"x":12,"y":11,"dx":2,"dy":-1},{"id":16,"x":17,"y":11,"dx":-3,"dy":1},{"id":16,"x":46,"y":11,"dx":0,"dy":1},{"id":15,"x":51,"y":11,"dx":2,"dy":0},{"id":16,"x":8,"y":12,"dx":1,"dy":-1},{"id":16,"x":14,"y":12,"dx":-4,"dy":1},{"id":16,"x":41,"y":12,"dx":3,"dy":2},{"id":16,"x":45,"y":12,"dx":3,"dy":0},{"id":16,"x":0,"y":13,"dx":1,"dy":-2},{"id":16,"x":4,"y":13,"dx":-3,"dy":1},{"id":16,"x":8,"y":13,"dx":3,"dy":-1},{"id":16,"x":42,"y":13,"dx":3,"dy":2},{"id":16,"x":44,"y":13,"dx":0,"dy":2},{"id":16,"x":50,"y":13,"dx":-1,"dy":2},{"id":16,"x":54,"y":13,"dx":-1,"dy":2},{"id":16,"x":49,"y":14,"dx":-3,"dy":2},{"id":16,"x":55,"y":14,"dx":-2,"dy":-2},{"id":16,"x":6,"y":15,"dx":0,"dy":1},{"id":16,"x":8,"y":15,"dx":0,"dy":-1},{"id":16,"x":10,"y":15,"dx":-4,"dy":1},{"id":16,"x":30,"y":15,"dx":-1,"dy":-1},{"id":16,"x":47,"y":15,"dx":3,"dy":-1},{"id":16,"x":51,"y":15,"dx":-1,"dy":-1},{"id":16,"x":6,"y":16,"dx":-1,"dy":2},{"id":16,"x":8,"y":16,"dx":3,"dy":2},{"id":16,"x":11,"y":16,"dx":1,"dy":1},{"id":16,"x":38,"y":16,"dx":2,"dy":1},{"id":16,"x":44,"y":16,"dx":0,"dy":1},{"id":16,"x":47,"y":16,"dx":1,"dy":0},{"id":16,"x":3,"y":17,"dx":2,"dy":1},{"id":16,"x":11,"y":17,"dx":3,"dy":-2},{"id":16,"x":1,"y":18,"dx":2,"dy":-2},{"id":16,"x":14,"y":18,"dx":-2,"dy":-1},{"id":16,"x":48,"y":18,"dx":0,"dy":-1},{"id":16,"x":4,"y":19,"dx":-1,"dy":0},{"id":16,"x":6,"y":19,"dx":3,"dy":-1},{"id":17,"x":9,"y":19,"dx":3,"dy":0},{"id":16,"x":14,"y":19,"dx":-1,"dy":2},{"id":16,"x":54,"y":19,"dx":-1,"dy":2},{"id":16,"x":1,"y":20,"dx":-4,"dy":2},{"id":16,"x":29,"y":20,"dx":1,"dy":1},{"id":16,"x":40,"y":20,"dx":-1,"dy":0},{"id":16,"x":4,"y":21,"dx":-1,"dy":1},{"id":16,"x":8,"y":21,"dx":-1,"dy":-2},{"id":17,"x":16,"y":21,"dx":-4,"dy":1},{"id":16,"x":17,"y":21,"dx":4,"dy":-2},{"id":16,"x":13,"y":22,"dx":2,"dy":-1},{"id":16,"x":52,"y":22,"dx":0,"dy":-2},{"id":16,"x":5,"y":23,"dx":0,"dy":-1},{"id":16,"x":46,"y":23,"dx":1,"dy":-1},{"id":16,"x":55,"y":23,"dx":-3,"dy":1},{"id":16,"x":5,"y":24,"dx":-2,"dy":-1},{"id":16,"x":17,"y":24,"dx":-1,"dy":1},{"id":16,"x":49,"y":24,"dx":4,"dy":-1},{"id":15,"x":3,"y":25,"dx":-2,"dy":-1},{"id":15,"x":10,"y":25,"dx":2,"dy":-2},{"id":16,"x":17,"y":25,"dx":-3,"dy":-2},{"id":15,"x":34,"y":25,"dx":-1,"dy":-1},{"id":16,"x":41,"y":25,"dx":-3,"dy":-1},{"id":16,"x":42,"y":25,"dx":-2,"dy":0},{"id":16,"x":3,"y":26,"dx":2,"dy":0},{"id":17,"x":7,"y":26,"dx":-3,"dy":-1},{"id":16,"x":13,"y":26,"dx":-2,"dy":0},{"id":16,"x":45,"y":26,"dx":-4,"dy":0},{"id":16,"x":51,"y":26,"dx":-2,"dy":0},{"id":16,"x":13,"y":27,"dx":-1,"dy":-1},{"id":16,"x":16,"y":27,"dx":-3,"dy":1},{"id":16,"x":46,"y":27,"dx":3,"dy":-2},{"id":16,"x":53,"y":27,"dx":3,"dy":2},{"id":16,"x":12,"y":28,"dx":2,"dy":1},{"id":17,"x":19,"y":28,"dx":-2,"dy":-2},{"id":16,"x":40,"y":28,"dx":0,"dy":-2},{"id":16,"x":41,"y":28,"dx":2,"dy":1},{"id":15,"x":2,"y":29,"dx":0,"dy":-2},{"id":16,"x":6,"y":29,"dx":-4,"dy":-1},{"id":15,"x":20,"y":29,"dx":-2,"dy":-1},{"id":16,"x":46,"y":29,"dx":0,"dy":1},{"id":16,"x":52,"y":29,"dx":-1,"dy":1},{"id":16,"x":53,"y":29,"dx":-4,"dy":0},{"id":16,"x":54,"y":29,"dx":-3,"dy":1},{"id":16,"x":0,"y":30,"dx":3,"dy":-2},{"id":16,"x":1,"y":30,"dx":2,"dy":-2},{"id":16,"x":25,"y":30,"dx":1,"dy":0},{"id":16,"x":34,"y":30,"dx":-2,"dy":1},{"id":16,"x":36,"y":30,"dx":-2,"dy":1},{"id":16,"x":37,"y":30,"dx":0,"dy":-2},{"id":16,"x":41,"y":30,"dx":4,"dy":-1},{"id":16,"x":48,"y":30,"dx":2,"dy":1},{"id":15,"x":20,"y":31,"dx":2,"dy":1},{"id":16,"x":29,"y":31,"dx":0,"dy":-1},{"id":16,"x":36,"y":31,"dx":-1,"dy":-2},{"id":16,"x":48,"y":31,"dx":1,"dy":1},{"id":16,"x":49,"y":31,"dx":3,"dy":-1},{"id":16,"x":32,"y":32,"dx":0,"dy":0},{"id":16,"x":37,"y":32,"dx":-2,"dy":2},{"id":16,"x":41,"y":32,"dx":-1,"dy":-2},{"id":16,"x":52,"y":32,"dx":-1,"dy":-2},{"id":16,"x":54,"y":32,"dx":3,"dy":1},{"id":16,"x":7,"y":33,"dx":1,"dy":1},{"id":16,"x":10,"y":33,"dx":-1,"dy":0},{"id":16,"x":48,"y":33,"dx":-2,"dy":1},{"id":15,"x":0,"y":34,"dx":4,"dy":-1},{"id":16,"x":12,"y":34,"dx":0,"dy":-1},{"id":16,"x":33,"y":34,"dx":2,"dy":-2},{"id":16,"x":38,"y":34,"dx":3,"dy":1},{"id":16,"x":53,"y":34,"dx":0,"dy":-1},{"id":15,"x":20,"y":35,"dx":-1,"dy":1},{"id":16,"x":35,"y":35,"dx":2,"dy":-2},{"id":16,"x":39,"y":35,"dx":-2,"dy":1},{"id":16,"x":47,"y":35,"dx":-3,"dy":-1},{"id":16,"x":55,"y":35,"dx":-2,"dy":-2},{"id":16,"x":11,"y":36,"dx":1,"dy":-1},{"id":16,"x":14,"y":36,"dx":-2,"dy":0},{"id":16,"x":26,"y":36,"dx":0,"dy":2},{"id":16,"x":39,"y":36,"dx":0,"dy":0},{"id":16,"x":42,"y":36,"dx":0,"dy":-2},{"id":16,"x":45,"y":36,"dx":2,"dy":-1},{"id":16,"x":4,"y":37,"dx":-3,"dy":1},{"id":16,"x":10,"y":37,"dx":3,"dy":1},{"id":16,"x":15,"y":37,"dx":-3,"dy":1},{"id":16,"x":34,"y":37,"dx":0,"dy":-2},{"id":16,"x":47,"y":37,"dx":1,"dy":1},{"id":16,"x":49,"y":37,"dx":-2,"dy":1},{"id":16,"x":53,"y":37,"dx":3,"dy":-1},{"id":16,"x":55,"y":37,"dx":-1,"dy":0},{"id":16,"x":6,"y":38,"dx":-3,"dy":2},{"id":16,"x":7,"y":38,"dx":0,"dy":2},{"id":16,"x":38,"y":38,"dx":-3,"dy":-2},{"id":16,"x":41,"y":38,"dx":-1,"dy":-1},{"id":16,"x":45,"y":38,"dx":2,"dy":0},{"id":16,"x":7,"y":39,"dx":2,"dy":1},{"id":16,"x":16,"y":39,"dx":2,"dy":0},{"id":16,"x":19,"y":39,"dx":-3,"dy":0},{"id":16,"x":22,"y":39,"dx":0,"dy":0},{"id":16,"x":26,"y":39,"dx":2,"dy":-1},{"id":16,"x":38,"y":39,"dx":-4,"dy":-1},{"id":16,"x":43,"y":39,"dx":-2,"dy":-2},{"id":16,"x":44,"y":39,"dx":-3,"dy":-2},{"id":16,"x":46,"y":39,"dx":1,"dy":0},{"id":16,"x":52,"y":39,"dx":-1,"dy":1}],"encoding":"rle","tiles":[[4,10],[0,4],[4,5],[0,1],[4,12],[0,2],[4,11],[0,3],[4,17],[0,1],[4,3],[0,1],[4,4],[0,2],[4,10],[0,4],[4,11],[0,3],[4,4],[3,2],[4,7],[3,1],[4,3],[0,1],[4,8],[0,3],[4,10],[0,1],[4,10],[0,2],[4,1],[0,3],[4,18],[0,4],[4,16],[0,1],[4,12],[0,2],[4,11],[3,1],[4,41],[0,4],[4,12],[3,1],[0,1],[4,2],[0,5],[4,33],[0,2],[4,9],[3,1],[0,1],[4,1],[0,7],[4,34],[0,2],[4,1],[0,1],[4,7],[3,1],[4,1],[0,1],[4,4],[3,1],[0,3],[4,1],[0,1],[4,8],[29,1],[4,34],[3,1],[4,1],[0,2],[4,3],[0,5],[4,39],[0,1],[4,2],[0,2],[4,2],[0,1],[4,1],[3,1],[4,1],[3,1],[0,6],[4,39],[0,4],[4,6],[3,1],[0,1],[4,1],[0,2],[4,3],[0,1],[4,19],[0,1],[4,4],[27,1],[4,11],[0,4],[3,1],[4,8],[28,1],[4,3],[0,2],[4,19],[0,3],[4,15],[0,5],[4,6],[3,1],[4,5],[0,1],[4,1],[0,1],[7,1],[4,1],[0,3],[1,7],[4,1],[1,13],[4,10],[0,5],[3,1],[4,16],[0,1],[10,1],[0,1],[1,11],[4,1],[1,5],[4,1],[1,4],[4,9],[0,1],[4,1],[0,1],[4,1],[0,1],[4,6],[3,2],[4,9],[0,2],[4,1],[1,1],[0,1],[1,8],[6,1],[1,11],[4,10],[0,1],[4,1],[0,1],[4,17],[0,3],[4,1],[1,5],[4,1],[1,6],[4,1],[1,8],[4,1],[0,2],[4,28],[0,2],[4,1],[0,1],[1,3],[4,1],[1,16],[4,1],[1,1],[4,1],[0,3],[4,8],[3,1],[4,1],[3,1],[4,16],[0,3],[1,3],[4,1],[1,18],[0,1],[4,1],[0,1],[4,8],[3,2],[4,5],[3,1],[4,5],[0,4],[4,3],[0,2],[4,1],[1,22],[4,1],[0,3],[4,15],[3,1],[4,1],[3,1],[4,2],[0,2],[4,8],[1,5],[4,1],[1,16],[0,3],[26,1],[4,14],[1,21],[4,1],[1,4],[0,1],[4,1],[1,10],[4,11],[3,1],[4,1],[1,2],[4,10],[0,2],[4,5],[0,1],[4,1],[1,22],[4,3],[29,1],[4,12],[0,2],[4,2],[3,1],[4,3],[0,1],[4,2],[0,1],[4,6],[0,1],[1,12],[4,1],[1,2],[4,2],[1,4],[4,11],[3,1],[4,4],[0,2],[4,4],[0,1],[4,2],[0,1],[4,8],[1,12],[4,1],[1,1],[4,1],[1,7],[4,8],[0,3],[4,1],[0,3],[4,1],[0,2],[3,1],[4,4],[0,2],[4,9],[1,8],[4,1],[1,9],[4,1],[1,3],[4,10],[0,1],[3,1],[4,1],[3,1],[0,2],[4,1],[0,1],[4,1],[0,2],[3,1],[0,1],[4,3],[0,1],[4,7],[1,4],[4,1],[1,9],[0,1],[1,1],[0,1],[1,5],[4,8],[0,1],[4,1],[0,1],[3,2],[4,1],[0,1],[3,1],[4,1],[0,1],[3,1],[4,1],[3,1],[4,1],[0,2],[4,1],[0,2],[4,7],[1,16],[4,1],[1,4],[4,9],[0,2],[4,2],[0,2],[4,2],[0,1],[4,1],[0,2],[4,2],[0,1],[4,1],[0,2],[4,8],[0,1],[1,21],[4,9],[0,2],[4,1],[0,1],[4,1],[0,1],[3,1],[0,1],[4,1],[3,1],[0,2],[4,14],[0,4],[24,1],[4,1],[0,1],[4,5],[0,2],[25,1],[4,18],[3,1],[4,3],[0,4],[4,13],[0,1],[4,1],[0,5],[4,7],[0,3],[4,26],[3,1],[4,12],[0,7],[4,7],[0,1],[4,20],[3,1],[4,2],[3,1],[4,2],[3,1],[4,15],[0,1],[4,1],[0,4],[4,2],[0,1],[4,34],[3,1],[4,11],[0,10],[4,24],[3,1],[4,8],[3,1],[4,12],[0,2],[4,2],[0,2],[4,1],[0,1],[4,1],[0,1],[4,11],[29,1],[4,16],[3,1],[0,2],[4,7],[29,1],[4,11],[0,2],[4,1],[0,1],[4,1],[0,1],[4,27],[3,1],[4,1],[0,3],[4,2],[3,1],[4,14],[0,2],[4,1],[0,4],[4,29],[0,3],[4,19],[0,1],[4,34],[3,1],[4,50],[0,1],[4,6],[3,1],[4,9],[28,1],[4,19],[0,2],[4,15],[0,1],[4,1],[0,1],[3,2],[4,4],[3,1],[4,28],[0,3],[4,21]]} \ No newline at end of file diff --git a/apps/game/src/data/__tests__/validate.test.ts b/apps/game/src/data/__tests__/validate.test.ts index dc3b778..bc4115d 100644 --- a/apps/game/src/data/__tests__/validate.test.ts +++ b/apps/game/src/data/__tests__/validate.test.ts @@ -1,6 +1,14 @@ import { describe, expect, it } from 'vitest'; import type { DialogueGraph, TileMapData } from '@rpg/engine'; -import { TILES, buildMeadowsMap, buildPondsMap, buildZvenetsMap } from '../map'; +import { + TILES, + buildMeadowsMap, + buildPondsMap, + buildZvenetsMap, + buildRustGroveMap, + buildOldSidingMap, + buildMachineHallMap +} from '../map'; import { AREAS } from '../locations'; import { ROOM_TONES } from '../sfxSpecs'; import { NPCS } from '../npcs'; @@ -15,12 +23,15 @@ return { width: w, height: h, tiles, blocked: [TILES.WATER, TILES.TREE, TILES.TOWER, TILES.HOUSE] }; } -/** Карты всех локаций (как их грузит BootScene). */ +/** Карты всех локаций (как их грузит BootScene) — все области, не только акта 1. */ function realMaps(): Map { return new Map([ ['meadows', buildMeadowsMap()], ['ponds', buildPondsMap()], - ['zvenets', buildZvenetsMap()] + ['zvenets', buildZvenetsMap()], + ['rust_grove', buildRustGroveMap()], + ['old_siding', buildOldSidingMap()], + ['machine_hall', buildMachineHallMap()] ]); } @@ -94,7 +105,7 @@ describe('validateNpcs', () => { it('проходимая карта без NPC в стенах — чисто; стена под NPC ловится', () => { - const maps = new Map([['zvenets', flatMap(28, 20)]]); + const maps = new Map([['zvenets', flatMap(56, 40)]]); expect(validateNpcs(maps)).toEqual([]); // NPCS статичен — подменяем карту: стена на тайле Ирвина даст 'in-wall'. const elder = AREAS.zvenets.npcs[0]!; @@ -213,7 +224,7 @@ it('точка патруля вне карты — out-of-bounds', () => { const e = AREAS.meadows.enemies[2]!; const backup = e.patrol; - (e as { patrol?: typeof backup }).patrol = { points: [{ x: 19, y: 6 }, { x: 50, y: 0 }], pauseSec: 1 }; + (e as { patrol?: typeof backup }).patrol = { points: [{ x: 19, y: 6 }, { x: 500, y: 0 }], pauseSec: 1 }; try { const inv = validateLocations(realMaps()); expect(inv.some((i) => i.id === 'out-of-bounds' && i.message.includes('патруль#1'))).toBe(true); diff --git a/apps/game/src/data/interactables.ts b/apps/game/src/data/interactables.ts index e4527a2..ff7faa3 100644 --- a/apps/game/src/data/interactables.ts +++ b/apps/game/src/data/interactables.ts @@ -114,7 +114,7 @@ meadows: [ { id: 'sign_meadows_east', - pos: { x: 25.5, y: 13.5 }, + pos: { x: 48.5, y: 27.5 }, kind: 'signpost', label: 'Столб у тропы', responses: [ @@ -138,7 +138,7 @@ }, { id: 'mote_1', - pos: { x: 11.5, y: 14.5 }, + pos: { x: 13.5, y: 28.5 }, kind: 'pickup', label: 'Пепельный мот', once: true, @@ -153,7 +153,7 @@ }, { id: 'mote_2', - pos: { x: 14.5, y: 20.5 }, + pos: { x: 16.5, y: 38.5 }, kind: 'pickup', label: 'Пепельный мот', once: true, @@ -168,7 +168,7 @@ }, { id: 'mote_3', - pos: { x: 14.5, y: 6.5 }, + pos: { x: 16.5, y: 20.5 }, kind: 'pickup', label: 'Пепельный мот', once: true, @@ -218,7 +218,7 @@ }), { id: 'clint_resonator', - pos: { x: 12.5, y: 8.5 }, + pos: { x: 24.5, y: 16.5 }, kind: 'lever', label: 'Резонатор Клинта', responses: [ @@ -237,7 +237,7 @@ ponds: [ { id: 'sign_ponds', - pos: { x: 3.5, y: 2.5 }, + pos: { x: 5.5, y: 3.5 }, kind: 'signpost', label: 'Столб у берега', responses: [ @@ -251,7 +251,7 @@ zvenets: [ { id: 'sign_zvenets', - pos: { x: 3.5, y: 9.5 }, + pos: { x: 3.5, y: 19.5 }, kind: 'signpost', label: 'Столб у входа', responses: [ @@ -263,7 +263,7 @@ }, { id: 'bell_rope', - pos: { x: 13.5, y: 7.5 }, + pos: { x: 27.5, y: 13.5 }, kind: 'lever', label: 'Верёвка колокола', responses: [ @@ -348,7 +348,7 @@ machine_hall: [ { id: 'old_machine', - pos: { x: 6.5, y: 1.5 }, + pos: { x: 13.5, y: 1.5 }, kind: 'lever', label: 'Старая Машина', responses: [ diff --git a/apps/game/src/data/locations.ts b/apps/game/src/data/locations.ts index a40eb36..78333c5 100644 --- a/apps/game/src/data/locations.ts +++ b/apps/game/src/data/locations.ts @@ -137,35 +137,36 @@ name: 'Свежий накат', requiresItem: 'cloth', tiles: [ - { x: 5, y: 16 }, - { x: 6, y: 17 }, - { x: 7, y: 17 }, + { x: 10, y: 32 }, + { x: 12, y: 34 }, + { x: 14, y: 35 }, + { x: 16, y: 36 }, + { x: 18, y: 36 }, + { x: 20, y: 37 }, + { x: 22, y: 37 }, + { x: 24, y: 38 }, + { x: 26, y: 37 }, + { x: 28, y: 36 }, + { x: 30, y: 35 }, + { x: 32, y: 34 }, { x: 8, y: 18 }, - { x: 9, y: 18 }, - { x: 10, y: 18 }, - { x: 11, y: 19 }, - { x: 12, y: 19 }, - { x: 13, y: 18 }, - { x: 14, y: 18 }, - { x: 15, y: 17 }, - { x: 4, y: 9 }, - { x: 3, y: 8 }, - { x: 15, y: 6 }, - { x: 16, y: 4 } + { x: 6, y: 16 }, + { x: 30, y: 12 }, + { x: 32, y: 10 } ] }; -/** Зона наката разъезда (наметало у рельсов). */ +/** Зона наката разъезда (наметало у рельсов, у люка). */ const HAZARD_SIDING: HazardDef = { 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 } + { x: 26, y: 29 }, + { x: 27, y: 29 }, + { x: 29, y: 29 }, + { x: 28, y: 28 }, + { x: 29, y: 30 }, + { x: 30, y: 29 } ] }; @@ -175,35 +176,36 @@ name: 'Выжженные луга', ambience: 'ambience/meadows', theme: 'meadows', - spawn: { x: 14, y: 14 }, + spawn: { x: 16, y: 28 }, npcs: [], enemies: [ - { kind: 'crawler', tile: { x: 8, y: 9 } }, - { kind: 'crawler', tile: { x: 10, y: 7 } }, + { kind: 'crawler', tile: { x: 16, y: 18 } }, + { kind: 'crawler', tile: { x: 20, y: 14 } }, // Плевун кружит у северо-восточных бугров. { kind: 'spitter', - tile: { x: 19, y: 6 }, - patrol: { points: [{ x: 19, y: 6 }, { x: 22, y: 5 }], pauseSec: 1.2 } + tile: { x: 38, y: 12 }, + patrol: { points: [{ x: 38, y: 12 }, { x: 44, y: 10 }], pauseSec: 1.2 } }, - { kind: 'crawler', tile: { x: 22, y: 21 } }, + { kind: 'crawler', tile: { x: 44, y: 42 } }, + { kind: 'crawler', tile: { x: 36, y: 24 } }, // Тяжеловес бродит вдоль юго-западной низины. { kind: 'heavy', - tile: { x: 6, y: 22 }, - patrol: { points: [{ x: 6, y: 22 }, { x: 4, y: 20 }], pauseSec: 2 } + tile: { x: 12, y: 44 }, + patrol: { points: [{ x: 12, y: 44 }, { x: 8, y: 40 }], pauseSec: 2 } } ], transitions: [ // Северо-западный угол: тропа на Серые пруды. - { tile: { x: 2, y: 2 }, target: { kind: 'area', area: 'ponds', entry: { x: 3, y: 3 } } }, + { tile: { x: 2, y: 2 }, target: { kind: 'area', area: 'ponds', entry: { x: 4, y: 4 } } }, // Тропа в Звенец (деревня-мастерская). - { tile: { x: 26, y: 14 }, target: { kind: 'area', area: 'zvenets', entry: { x: 3, y: 10 } } }, + { tile: { x: 54, y: 28 }, target: { kind: 'area', area: 'zvenets', entry: { x: 3, y: 20 } } }, // Встречный колодец: звон в Звенец (клик по тайлу колодца). { - tile: { x: 22, y: 20 }, + tile: { x: 44, y: 40 }, label: 'Старый колодец', - target: { kind: 'area', area: 'zvenets', entry: { x: 9, y: 7 } }, + target: { kind: 'area', area: 'zvenets', entry: { x: 16, y: 14 } }, trigger: 'click', duration: 0.2 } @@ -231,22 +233,22 @@ ambienceLayers: [{ key: 'ambience/wind', volume: 0.3 }], // Безгласные олени у берегов прудов — подходят к звону. fauna: [ - { x: 9, y: 18 }, - { x: 12, y: 20 } + { x: 18, y: 36 }, + { x: 24, y: 40 } ] }, ponds: { id: 'ponds', name: 'Серые пруды', ambience: 'ambience/ponds', - spawn: { x: 3, y: 3 }, + spawn: { x: 4, y: 4 }, npcs: [], enemies: [ - { kind: 'crawler', tile: { x: 4, y: 11 } }, - { kind: 'crawler', tile: { x: 9, y: 18 } }, - { kind: 'spitter', tile: { x: 18, y: 10 } }, - { kind: 'spitter', tile: { x: 18, y: 18 } }, - { kind: 'heavy', tile: { x: 13, y: 17 } } + { kind: 'crawler', tile: { x: 8, y: 22 } }, + { kind: 'crawler', tile: { x: 18, y: 36 } }, + { kind: 'spitter', tile: { x: 40, y: 20 } }, + { kind: 'spitter', tile: { x: 36, y: 36 } }, + { kind: 'heavy', tile: { x: 28, y: 36 } } ], transitions: [ // Обратно на луга. @@ -271,43 +273,43 @@ // Лунные колокольчики собираются только у прудов (квест «Три цветка»). harvestTile: TILES.BELLFLOWER, // Один олень на северо-западном берегу. - fauna: [{ x: 4, y: 6 }] + fauna: [{ x: 8, y: 12 }] }, zvenets: { id: 'zvenets', name: 'Звенец', ambience: 'ambience/zvenets', - spawn: { x: 14, y: 10 }, + spawn: { x: 28, y: 20 }, npcs: NPCS, enemies: [], transitions: [ // Тропа обратно на луга. - { tile: { x: 2, y: 10 }, target: { kind: 'area', area: 'meadows', entry: { x: 25, y: 14 } } }, + { tile: { x: 2, y: 20 }, target: { kind: 'area', area: 'meadows', entry: { x: 53, y: 28 } } }, // Колодец у дома Ирвина: телепорт на луга (клик; встречный лугам). { - tile: { x: 9, y: 6 }, + tile: { x: 16, y: 13 }, label: 'Старый колодец', - target: { kind: 'area', area: 'meadows', entry: { x: 22, y: 21 } }, + target: { kind: 'area', area: 'meadows', entry: { x: 44, y: 41 } }, trigger: 'click', duration: 0.2 }, // Двери: клик по дому — внутрь (вход у проёма; выход — kind 'return'). { - tile: { x: 7, y: 6 }, + tile: { x: 13, y: 12 }, label: 'Дом Ирвина', target: { kind: 'area', area: 'house_elder', entry: { x: 5, y: 7 } }, trigger: 'click', duration: 0.2 }, { - tile: { x: 21, y: 9 }, + tile: { x: 43, y: 19 }, label: 'Лавка Милы', 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 } } } + { tile: { x: 54, y: 20 }, target: { kind: 'area', area: 'rust_grove', entry: { x: 2, y: 20 } } } ], interactables: INTERACTABLES.zvenets, atmosphere: 'ash', @@ -319,12 +321,12 @@ sources: [ // Окна — на теле спрайта дома (тело занимает тайл выше-левее базового); // днём не горят, зажигаются вечером. - { id: 'window_elder', at: { x: 6.5, y: 5.5 }, radius: 1.2, intensity: 0.65, flicker: 0.1, whenNight: true }, - { id: 'window_north', at: { x: 17.5, y: 4.5 }, radius: 1.2, intensity: 0.65, flicker: 0.1, whenNight: true }, - { id: 'window_shop', at: { x: 20.5, y: 8.5 }, radius: 1.2, intensity: 0.65, flicker: 0.1, whenNight: true }, + { id: 'window_elder', at: { x: 12.5, y: 11.5 }, radius: 1.2, intensity: 0.65, flicker: 0.1, whenNight: true }, + { id: 'window_north', at: { x: 36.5, y: 9.5 }, radius: 1.2, intensity: 0.65, flicker: 0.1, whenNight: true }, + { id: 'window_shop', at: { x: 42.5, y: 18.5 }, radius: 1.2, intensity: 0.65, flicker: 0.1, whenNight: true }, { id: 'tower_resonance', - at: { x: 14, y: 7 }, + at: { x: 28, y: 14 }, color: 0x4a737f, radius: 2.5, intensity: 0.6, @@ -335,8 +337,13 @@ }, // Гул колокола башни и скрипы вагонных щитов — слышны вблизи источников. ambienceLayers: [ - { key: 'ambience/tower_hum', at: { x: 14, y: 7 }, radius: 8, volume: 0.5 }, - { key: 'ambience/houses', tiles: [TILES.HOUSE, TILES.HOUSE_V1, TILES.HOUSE_V2], radius: 5, volume: 0.4 } + { key: 'ambience/tower_hum', at: { x: 28, y: 14 }, radius: 8, volume: 0.5 }, + { + key: 'ambience/houses', + tiles: [TILES.HOUSE, TILES.HOUSE_V1, TILES.HOUSE_V2, TILES.HOUSE_V3, TILES.HOUSE_V4], + radius: 5, + volume: 0.4 + } ] }, // --- акт 2: роща, разъезд, подземелье --- @@ -344,23 +351,23 @@ id: 'rust_grove', name: 'Ржавая роща', ambience: 'ambience/ponds', - spawn: { x: 2, y: 10 }, + spawn: { x: 2, y: 20 }, npcs: [], enemies: [ - { kind: 'crawler', tile: { x: 6, y: 6 } }, - { kind: 'crawler', tile: { x: 17, y: 7 } }, + { kind: 'crawler', tile: { x: 12, y: 12 } }, + { kind: 'crawler', tile: { x: 34, y: 14 } }, { kind: 'spitter', - tile: { x: 18, y: 16 }, - patrol: { points: [{ x: 18, y: 16 }, { x: 20, y: 14 }], pauseSec: 1.4 } + tile: { x: 36, y: 32 }, + patrol: { points: [{ x: 36, y: 32 }, { x: 40, y: 28 }], pauseSec: 1.4 } }, - { kind: 'heavy', tile: { x: 7, y: 15 } } + { kind: 'heavy', tile: { x: 14, y: 30 } } ], transitions: [ // Тропа обратно в Звенец. - { tile: { x: 1, y: 10 }, target: { kind: 'area', area: 'zvenets', entry: { x: 25, y: 10 } } }, + { tile: { x: 1, y: 20 }, target: { kind: 'area', area: 'zvenets', entry: { x: 53, y: 20 } } }, // Тропа на восток: к Старому разъезду. - { tile: { x: 22, y: 10 }, target: { kind: 'area', area: 'old_siding', entry: { x: 2, y: 10 } } } + { tile: { x: 46, y: 20 }, target: { kind: 'area', area: 'old_siding', entry: { x: 2, y: 20 } } } ], atmosphere: 'ash', interactables: INTERACTABLES.rust_grove, @@ -373,29 +380,29 @@ id: 'old_siding', name: 'Старый разъезд', ambience: 'ambience/ponds', - spawn: { x: 2, y: 10 }, + spawn: { x: 2, y: 20 }, npcs: [], enemies: [ - { kind: 'crawler', tile: { x: 7, y: 9 } }, + { kind: 'crawler', tile: { x: 14, y: 18 } }, { kind: 'spitter', - tile: { x: 18, y: 8 }, - patrol: { points: [{ x: 18, y: 8 }, { x: 19, y: 6 }], pauseSec: 1.2 } + tile: { x: 36, y: 16 }, + patrol: { points: [{ x: 36, y: 16 }, { x: 38, y: 12 }], pauseSec: 1.2 } }, { kind: 'heavy', - tile: { x: 18, y: 16 }, - patrol: { points: [{ x: 18, y: 16 }, { x: 15, y: 17 }], pauseSec: 2 } + tile: { x: 36, y: 32 }, + patrol: { points: [{ x: 36, y: 32 }, { x: 32, y: 33 }], pauseSec: 2 } } ], transitions: [ // Тропа обратно в рощу. - { tile: { x: 1, y: 10 }, target: { kind: 'area', area: 'rust_grove', entry: { x: 21, y: 10 } } }, + { tile: { x: 1, y: 20 }, target: { kind: 'area', area: 'rust_grove', entry: { x: 45, y: 20 } } }, // Люк-ступени вниз, в зал Старой Машины (наступил — спустился). { - tile: { x: 15, y: 15 }, + tile: { x: 28, y: 31 }, label: 'Люк в подземелье', - target: { kind: 'area', area: 'machine_hall', entry: { x: 6, y: 9 } }, + target: { kind: 'area', area: 'machine_hall', entry: { x: 13, y: 19 } }, duration: 0.6 } ], @@ -405,7 +412,7 @@ // Гул снизу: Машина дышит у люка (та же нота, что башня Звенца). ambienceLayers: [ { key: 'ambience/wind', volume: 0.25 }, - { key: 'ambience/tower_hum', at: { x: 15, y: 15 }, radius: 7, volume: 0.45 }, + { key: 'ambience/tower_hum', at: { x: 28, y: 31 }, radius: 7, volume: 0.45 }, // Накат у рельсов дышит пеплом. { key: 'ambience/ashflow', positions: HAZARD_SIDING.tiles, radius: 2.5, volume: 0.3 } ], @@ -415,12 +422,12 @@ machine_hall: { id: 'machine_hall', name: 'Зал Старой Машины', - spawn: { x: 6, y: 9 }, + spawn: { x: 13, y: 19 }, npcs: [], enemies: [], transitions: [ // Проём в нижней стене: шаг — назад наверх, к люку. - { tile: { x: 6, y: 10 }, target: { kind: 'return' }, duration: 0.2 } + { tile: { x: 13, y: 21 }, target: { kind: 'return' }, duration: 0.2 } ], atmosphere: 'none', interactables: INTERACTABLES.machine_hall, @@ -430,7 +437,7 @@ sources: [ { id: 'machine_mouth', - at: { x: 5.5, y: 1.5 }, + at: { x: 12.5, y: 1.5 }, color: 0x4a737f, radius: 3.5, intensity: 0.55, diff --git a/apps/game/src/data/map.ts b/apps/game/src/data/map.ts index 81b2d09..4410741 100644 --- a/apps/game/src/data/map.ts +++ b/apps/game/src/data/map.ts @@ -174,17 +174,18 @@ } /** - * Локация «Выжженные луга»: поляны травы, тропа через карту, - * пара прудов и рощи деревьев по краям. + * Локация «Выжженные луга»: поляны травы, тропа от северо-западного угла + * (пруды) через стартовую поляну на восток (Звенец), пара прудов и рощи + * деревьев по краям. */ -export function buildMeadowsMap(width = 28, height = 28): TileMapData { +export function buildMeadowsMap(width = 56, height = 56): TileMapData { const seed = 20260905; const rng = createRng(seed); const tiles: number[] = new Array(width * height).fill(TILES.GRASS); const at = (x: number, y: number) => y * width + x; // Пятна пепла (декоративные). - for (let i = 0; i < 40; i++) { + for (let i = 0; i < 110; i++) { const x = Math.floor(rng.next() * width); const y = Math.floor(rng.next() * height); const r = 1 + Math.floor(rng.next() * 2); @@ -199,23 +200,28 @@ } } - // Тропа: ломаная слева-сверху вниз-вправо. - let px = 2; - let py = 2; - while (px < width - 3 || py < height - 3) { - tiles[at(px, py)] = TILES.PATH; - if (rng.next() < 0.5 && px < width - 3) px++; - else if (py < height - 3) py++; - else px++; - } + // Тропа: монотонная ломаная к цели (случайный выбор оси) — детерминированно. + const walkPath = (sx: number, sy: number, tx: number, ty: number) => { + let px = sx; + let py = sy; + while (px !== tx || py !== ty) { + tiles[at(px, py)] = TILES.PATH; + if (px !== tx && (py === ty || rng.next() < 0.5)) px += Math.sign(tx - px); + else py += Math.sign(ty - py); + } + tiles[at(tx, ty)] = TILES.PATH; + }; + // От северо-западного перехода к стартовой поляне и от неё на восток к Звенцу. + walkPath(2, 2, 16, 28); + walkPath(16, 28, 52, 28); - // Пруды. + // Пруды (крупнее, с рваными краями). for (const [cx, cy] of [ - [6, 16], - [19, 7] + [12, 32], + [38, 14] ]) { - for (let dy = 0; dy < 3; dy++) { - for (let dx = 0; dx < 4; dx++) { + for (let dy = 0; dy < 5; dy++) { + for (let dx = 0; dx < 7; dx++) { if (rng.next() < 0.85) tiles[at(cx + dx, cy + dy)] = TILES.WATER; } } @@ -223,10 +229,10 @@ // Лунные колокольчики у берегов прудов (квестовый декор, проходимы). for (const [fx, fy] of [ - [10, 17], - [11, 19], - [18, 5], - [22, 9] + [20, 34], + [11, 36], + [46, 16], + [35, 11] ]) { if (tiles[at(fx, fy)] === TILES.GRASS || tiles[at(fx, fy)] === TILES.ASH) { tiles[at(fx, fy)] = TILES.BELLFLOWER; @@ -234,9 +240,9 @@ } // Рощи деревьев по краям. - for (let i = 0; i < 60; i++) { + for (let i = 0; i < 240; i++) { const edge = rng.next() < 0.5; - const x = edge ? Math.floor(rng.next() * 4) : width - 1 - Math.floor(rng.next() * 4); + const x = edge ? Math.floor(rng.next() * 8) : width - 1 - Math.floor(rng.next() * 8); const y = Math.floor(rng.next() * height); if (tiles[at(x, y)] === TILES.GRASS || tiles[at(x, y)] === TILES.ASH) { tiles[at(x, y)] = TILES.TREE; @@ -244,13 +250,13 @@ } // Валуны и кусты на полянах. - scatterRocksAndBushes(tiles, width, height, rng, 5, 7); + scatterRocksAndBushes(tiles, width, height, rng, 10, 14); - // Стартовая поляна вокруг центра всегда свободна. - const cx = Math.floor(width / 2); - const cy = Math.floor(height / 2); - for (let dy = -1; dy <= 1; dy++) { - for (let dx = -1; dx <= 1; dx++) { + // Стартовая поляна в центре-западе всегда свободна. + const cx = 16; + const cy = 28; + for (let dy = -2; dy <= 2; dy++) { + for (let dx = -2; dx <= 2; dx++) { tiles[at(cx + dx, cy + dy)] = TILES.GRASS; } } @@ -272,17 +278,21 @@ // Тропа в Звенец: восточный край, вокруг тайлов перехода тоже расчищаем. for (let dy = -1; dy <= 1; dy++) { for (let dx = -2; dx <= 0; dx++) { - const nx = 26 + dx; - const ny = 14 + dy; + const nx = 54 + dx; + const ny = 28 + dy; if (nx >= 0 && ny >= 0 && nx < width && ny < height) { tiles[at(nx, ny)] = dx === -1 && dy === 0 ? TILES.PATH : TILES.GRASS; } } } - tiles[at(26, 14)] = TILES.PATH; + tiles[at(54, 28)] = TILES.PATH; // Встречный колодец на лугах: телепорт обратно в Звенец (клик по тайлу). - tiles[at(22, 20)] = TILES.WELL; + tiles[at(44, 40)] = TILES.WELL; + + // Знак у восточной тропы (см. INTERACTABLES.meadows): scatter не должен + // ставить на его тайл дерево/куст. + tiles[at(48, 27)] = TILES.ASH; return { width, @@ -301,14 +311,14 @@ * тропа с запада (из Звенца) на восток (к разъезду) через поляну * мастерской Клинта в центре. */ -export function buildRustGroveMap(width = 24, height = 20): TileMapData { +export function buildRustGroveMap(width = 48, height = 40): 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++) { + for (let i = 0; i < 24; 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; @@ -326,11 +336,11 @@ // Бухты кабеля: короткие цепочки по 1–3 тайла (как протянутые шлейфы). for (const [bx, by, dir] of [ - [5, 4, 1], - [16, 3, -1], - [8, 15, 1], - [18, 14, -1], - [12, 5, 0] + [10, 8, 1], + [32, 6, -1], + [16, 30, 1], + [36, 28, -1], + [24, 10, 0] ] as [number, number, number][]) { for (let i = 0; i < 3; i++) { const nx = bx + i * dir; @@ -340,21 +350,30 @@ } } } + // Тон-деревья квеста резонатора (см. QUEST_TONE_TILES в data/quests.ts): + // гарантируем бухту кабеля на их тайлах — квест не должен зависеть от шума. + for (const [tx, ty] of [ + [32, 6], + [12, 10], + [20, 30] + ]) { + tiles[at(tx, ty)] = TILES.WIRE; + } // Валуны и кусты в прогалинах. - scatterRocksAndBushes(tiles, width, height, rng, 3, 4); + scatterRocksAndBushes(tiles, width, height, rng, 6, 8); // Тропа: с запада (вход из Звенца) на восток (к разъезду) — до самого - // тайла перехода (22,10), чтобы A* всегда доводил. - for (let x = 1; x <= 22; x++) tiles[at(x, 10)] = TILES.PATH; + // тайла перехода (46,20), чтобы A* всегда доводил. + for (let x = 1; x <= 46; x++) tiles[at(x, 20)] = TILES.PATH; // Спавны врагов расчищаем: роща плотная — дерево могло вырасти на тайле. for (const [ex, ey] of [ - [6, 6], - [17, 7], - [18, 16], - [20, 14], - [7, 15] + [12, 12], + [34, 14], + [36, 32], + [40, 28], + [14, 30] ]) { if (tiles[at(ex, ey)] === TILES.TREE || tiles[at(ex, ey)] === TILES.WIRE) { tiles[at(ex, ey)] = TILES.ASH; @@ -362,21 +381,21 @@ } // Поляна мастерской Клинта: расчистка и утоптанный пепел вокруг центра. - 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) { + for (let dy = -4; dy <= 4; dy++) { + for (let dx = -6; dx <= 6; dx++) { + const nx = 24 + dx; + const ny = 20 + dy; + if (nx >= 0 && ny >= 0 && nx < width && ny < height && Math.abs(dx) + Math.abs(dy) <= 8) { tiles[at(nx, ny)] = TILES.ASH; } } } - // Пятачок тропы у поляны (позже сюда встанет резонатор Клинта). - tiles[at(12, 8)] = TILES.PATH; + // Пятачок тропы у поляны (сюда встанет резонатор Клинта). + tiles[at(24, 16)] = TILES.ASH; // Входы/выходы: тайлы переходов всегда проходимы. - tiles[at(2, 10)] = TILES.PATH; - tiles[at(22, 10)] = TILES.PATH; + tiles[at(2, 20)] = TILES.PATH; + tiles[at(46, 20)] = TILES.PATH; return { width, @@ -394,36 +413,36 @@ * вдоль них — вагоны-времянки (HOUSE) и редкие сухие деревья. Южнее стрелки — * люк-ступени (STAIRS) вниз в зал Старой Машины. */ -export function buildOldSidingMap(width = 24, height = 20): TileMapData { +export function buildOldSidingMap(width = 48, height = 40): 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++) { + for (let i = 0; i < 20; 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 y = 6; y <= 32; y++) { + tiles[at(22, y)] = TILES.RAIL; + tiles[at(23, y)] = TILES.RAIL; } // Стрелка: боковая ветка к северо-востоку. - for (let x = 13; x <= 19; x++) tiles[at(x, 3 + (x - 13))] = TILES.RAIL; + for (let x = 24; x <= 38; x++) tiles[at(x, 6 + (x - 24))] = TILES.RAIL; // Руины станции: пара вагонов-времянок и останки стены. - tiles[at(8, 6)] = TILES.HOUSE; tiles[at(16, 12)] = TILES.HOUSE; - tiles[at(5, 13)] = TILES.WALL; + tiles[at(32, 24)] = TILES.HOUSE; + tiles[at(10, 26)] = TILES.WALL; // Редкие сухие деревья по краям. - for (let i = 0; i < 22; i++) { + for (let i = 0; i < 44; i++) { const edge = rng.next() < 0.5; - const x = edge ? Math.floor(rng.next() * 3) : width - 1 - Math.floor(rng.next() * 3); + const x = edge ? Math.floor(rng.next() * 6) : width - 1 - Math.floor(rng.next() * 6); 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; @@ -431,19 +450,22 @@ } // Валуны и кусты среди руин. - scatterRocksAndBushes(tiles, width, height, rng, 3, 3); + scatterRocksAndBushes(tiles, width, height, rng, 6, 6); - // Тропа от западного входа к рельсам, вдоль них и к люку. - 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; + // Тропа от западного входа к рельсам, через них и к люку. + for (let x = 1; x <= 20; x++) tiles[at(x, 20)] = TILES.PATH; + for (let x = 24; x <= 26; x++) tiles[at(x, 20)] = TILES.PATH; + for (let y = 21; y <= 30; y++) tiles[at(26, y)] = TILES.PATH; + tiles[at(27, 30)] = TILES.PATH; + tiles[at(27, 31)] = TILES.PATH; // Люк-ступени вниз (step-переход в зал Машины), рядом тропа. - tiles[at(15, 15)] = TILES.STAIRS; + tiles[at(28, 31)] = TILES.STAIRS; - // Вход всегда проходим. - tiles[at(2, 10)] = TILES.PATH; + // Вход всегда проходим; спавны врагов (см. AREAS.old_siding.enemies) + // scatter не должен закрывать валуном/кустом. + tiles[at(2, 20)] = TILES.PATH; + for (const [x, y] of [[14, 18], [36, 16], [36, 32]]) tiles[at(x, y)] = TILES.ASH; return { width, @@ -462,8 +484,8 @@ * со стороны входа. Дверной проём снизу (kind 'return' наверх). */ export function buildMachineHallMap(): TileMapData { - const width = 13; - const height = 11; + const width = 26; + const height = 22; 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++) { @@ -472,12 +494,12 @@ } } // Машина: корпус в два тайла у северной стены. - tiles[at(5, 1)] = TILES.MACHINE; - tiles[at(6, 1)] = TILES.MACHINE; + tiles[at(12, 1)] = TILES.MACHINE; + tiles[at(13, 1)] = TILES.MACHINE; // Рельсы подходят к Машине — её кормили составами. - for (let y = 3; y <= 9; y++) tiles[at(6, y)] = TILES.RAIL; + for (let y = 3; y <= 19; y++) tiles[at(13, y)] = TILES.RAIL; // Дверной проём в нижней стене (step-переход kind 'return'). - tiles[at(6, height - 1)] = TILES.FLOOR; + tiles[at(13, height - 1)] = TILES.FLOOR; return { width, height, @@ -492,14 +514,14 @@ * много пепла и сгустков. Тропа начинается в северо-западном углу * (обратный переход на луга). */ -export function buildPondsMap(width = 24, height = 24): TileMapData { +export function buildPondsMap(width = 48, height = 48): TileMapData { const seed = 20260906; 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 < 24; i++) { + for (let i = 0; i < 50; i++) { const x = Math.floor(rng.next() * width); const y = Math.floor(rng.next() * height); const r = 1 + Math.floor(rng.next() * 2); @@ -519,51 +541,51 @@ const cy = Math.floor(height / 2); for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { - const d = Math.hypot((x - cx) / 7.5, (y - cy) / 5.5); + const d = Math.hypot((x - cx) / 15, (y - cy) / 11); if (d + (rng.next() - 0.5) * 0.35 < 1) tiles[at(x, y)] = TILES.WATER; } } // Лунные колокольчики у берегов (квестовые цветы растут только здесь). for (const [fx, fy] of [ - [5, 8], - [16, 6], - [18, 16], - [7, 17], - [12, 20] + [8, 16], + [38, 12], + [36, 34], + [12, 34], + [24, 42] ]) { if (tiles[at(fx, fy)] !== TILES.WATER) tiles[at(fx, fy)] = TILES.BELLFLOWER; } - // Тропа от северо-западного угла к берегу. - let px = 3; - let py = 3; - while (py < height - 6 || px < width - 8) { + // Тропа от северо-западного входа к берегу. + let px = 4; + let py = 4; + while (py < 30 || px < 30) { tiles[at(px, py)] = TILES.PATH; - if (rng.next() < 0.45 && px < width - 8) px++; - else if (py < height - 6) py++; + if (rng.next() < 0.45 && px < 30) px++; + else if (py < 30) py++; else px++; } // Сухие деревья по краям. - for (let i = 0; i < 46; i++) { + for (let i = 0; i < 92; i++) { const edge = rng.next() < 0.5; - const x = edge ? Math.floor(rng.next() * 3) : width - 1 - Math.floor(rng.next() * 3); + const x = edge ? Math.floor(rng.next() * 6) : width - 1 - Math.floor(rng.next() * 6); const y = Math.floor(rng.next() * height); if (tiles[at(x, y)] !== TILES.WATER) tiles[at(x, y)] = TILES.TREE; } // Валуны и кусты у берегов. - scatterRocksAndBushes(tiles, width, height, rng, 4, 5); + scatterRocksAndBushes(tiles, width, height, rng, 8, 10); // Поляна у входа свободна; тайлы перехода — тропа. for (let dy = 0; dy <= 1; dy++) { for (let dx = 0; dx <= 1; dx++) { - tiles[at(3 + dx, 3 + dy)] = dy + dx === 0 ? TILES.PATH : TILES.GRASS; + tiles[at(4 + dx, 4 + dy)] = dy + dx === 0 ? TILES.PATH : TILES.GRASS; } } tiles[at(2, 2)] = TILES.PATH; - tiles[at(3, 3)] = TILES.PATH; + tiles[at(4, 4)] = TILES.PATH; return { width, @@ -616,14 +638,14 @@ * водонапорной башни с колоколом. Дома из вагонных щитов, крыши из * платформ, посреди площади — звонное место. Безопасный хаб (без врагов). */ -export function buildZvenetsMap(width = 28, height = 20): TileMapData { +export function buildZvenetsMap(width = 56, height = 40): TileMapData { const seed = 20260907; 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 < 18; i++) { + for (let i = 0; i < 40; i++) { const x = Math.floor(rng.next() * width); const y = Math.floor(rng.next() * height); const r = 1 + Math.floor(rng.next() * 2); @@ -639,26 +661,29 @@ } // Площадь: утоптанный пепел в центре карты. - for (let y = 6; y <= 13; y++) { - for (let x = 9; x <= 19; x++) { + for (let y = 12; y <= 27; y++) { + for (let x = 18; x <= 39; x++) { if (rng.next() < 0.9) tiles[at(x, y)] = TILES.PATH; } } + // Знак у входа (см. INTERACTABLES.zvenets): scatter не занял бы его деревом. + tiles[at(3, 19)] = TILES.ASH; + // Тропа: от западного края (переход на луга) к площади. let px = 2; - let py = 10; - while (px < 9 || py !== 10) { + let py = 20; + while (px < 18 || py !== 20) { tiles[at(px, py)] = TILES.PATH; - if (px < 9 && (py === 10 || rng.next() < 0.6)) px++; - else if (py !== 10) py += py < 10 ? 1 : -1; + if (px < 18 && (py === 20 || rng.next() < 0.6)) px++; + else if (py !== 20) py += py < 20 ? 1 : -1; else px++; } // Сухие деревья по краям. - for (let i = 0; i < 30; i++) { + for (let i = 0; i < 60; i++) { const edge = rng.next() < 0.5; - const x = edge ? Math.floor(rng.next() * 3) : width - 1 - Math.floor(rng.next() * 3); + const x = edge ? Math.floor(rng.next() * 6) : width - 1 - Math.floor(rng.next() * 6); 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; @@ -666,37 +691,39 @@ } // Пара кустов по краю деревни (валун один — у рощи за площадью). - scatterRocksAndBushes(tiles, width, height, rng, 1, 2); + scatterRocksAndBushes(tiles, width, height, rng, 2, 4); // Башня с колоколом — север площади. - tiles[at(14, 7)] = TILES.TOWER; + tiles[at(28, 14)] = TILES.TOWER; - // Дома: два вдоль тропы, лавка Милы — восток площади. Разные фасады - // (вариантные id прямо в тайлах — деревня должна показывать всё разнообразие): - // времянка у колодца, двухэтажный и амбар на востоке площади. - tiles[at(7, 6)] = TILES.HOUSE; - tiles[at(18, 5)] = TILES.HOUSE_V4; - tiles[at(21, 9)] = TILES.HOUSE_V3; + // Дома деревни: все фасады показаны намеренно (вариантные id прямо в + // тайлах — хэш-микс не гарантирует разнообразия). Дом Ирвина у колодца, + // двухэтажный на севере, амбар-лавка Милы на востоке, пара времянок югом. + tiles[at(13, 12)] = TILES.HOUSE; + tiles[at(37, 10)] = TILES.HOUSE_V4; + tiles[at(43, 19)] = TILES.HOUSE_V3; + tiles[at(23, 28)] = TILES.HOUSE_V1; + tiles[at(33, 28)] = TILES.HOUSE_V2; // Старый колодец у дома Ирвина: телепорт на луга (см. AREAS, transitions). - tiles[at(9, 6)] = TILES.WELL; + tiles[at(16, 13)] = TILES.WELL; // Стартовая поляна и тайл перехода всегда свободны. - tiles[at(14, 10)] = TILES.GRASS; - tiles[at(2, 10)] = TILES.PATH; - tiles[at(3, 10)] = TILES.PATH; + tiles[at(28, 20)] = TILES.GRASS; + tiles[at(2, 20)] = TILES.PATH; + tiles[at(3, 20)] = TILES.PATH; // Тропа в Ржавую рощу: восточный край (вокруг тоже расчищаем). for (let dy = -1; dy <= 1; dy++) { for (let dx = -2; dx <= 0; dx++) { - const nx = 26 + dx; - const ny = 10 + dy; + const nx = 54 + dx; + const ny = 20 + 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; + tiles[at(54, 20)] = TILES.PATH; return { width, diff --git a/apps/game/src/data/npcs.ts b/apps/game/src/data/npcs.ts index 726f313..ddb1042 100644 --- a/apps/game/src/data/npcs.ts +++ b/apps/game/src/data/npcs.ts @@ -29,7 +29,10 @@ { id: 'elder', name: 'Старейшина Ирвин', - pos: { x: 12.5, y: 9.5 }, + // Не вплотную ни к двери дома (13,12), ни к колодцу (16,13): кнопка + // действия берёт ближайшую цель, E у двери/колодца не должен звать + // Ирвина — он стоит юго-западнее, вне радиуса (1.5) их тайлов подхода. + pos: { x: 12.5, y: 15.5 }, sprite: 'elder_irwin', dialogueFirst: 'elder_first', dialogueRepeat: 'elder_repeat', @@ -38,7 +41,8 @@ { id: 'trader', name: 'Торговка Мила', - pos: { x: 17.5, y: 11.5 }, + // Не вплотную к двери лавки (43,19): E у двери не должен звать Милу. + pos: { x: 40.5, y: 20.5 }, sprite: 'trader_mila', dialogueFirst: 'trader_first', dialogueRepeat: 'trader_repeat', @@ -77,7 +81,7 @@ def: npcFrom({ id: 'clint', name: 'Клинт', - pos: { x: 11.5, y: 9.5 }, + pos: { x: 23.5, y: 17.5 }, sprite: 'clint', dialogueFirst: 'clint_first', dialogueRepeat: 'clint_repeat', diff --git a/apps/game/src/data/quests.ts b/apps/game/src/data/quests.ts index e9b24cc..963ef3a 100644 --- a/apps/game/src/data/quests.ts +++ b/apps/game/src/data/quests.ts @@ -15,19 +15,19 @@ /** Тайлы посадки поляны у тропы (Звенец): collectFlowers расползается от них. */ export const QUEST_PLANT_TILES: readonly (readonly [number, number])[] = [ - [15, 13], - [16, 14], - [15, 15] + [24, 22], + [25, 23], + [24, 24] ]; /** Башня Звенца: тайл (камера кат-сцены сдачи идёт сюда). */ -export const QUEST_TOWER_TILE = { x: 14, y: 7 }; +export const QUEST_TOWER_TILE = { x: 28, y: 14 }; /** Зелень у подножия башни: визуальный финал акта 1. */ export const QUEST_TOWER_GREEN: readonly (readonly [number, number])[] = [ - [13, 8], - [15, 8], - [14, 9] + [27, 15], + [29, 15], + [28, 16] ]; /** Квест резонатора (акт 2): сколько тонов собрать у деревьев-механизмов. */ @@ -35,9 +35,9 @@ /** WIRE-деревья рощи для звона (тайлы интерактивов tone_tree_1..3; достижимы от входа). */ export const QUEST_TONE_TILES: readonly (readonly [number, number])[] = [ - [16, 3], - [6, 5], - [10, 15] + [32, 6], + [12, 10], + [20, 30] ]; /** Одна стадия квеста. */ diff --git a/apps/game/src/systems/combat/__tests__/los.test.ts b/apps/game/src/systems/combat/__tests__/los.test.ts index 3601c4c..0502d96 100644 --- a/apps/game/src/systems/combat/__tests__/los.test.ts +++ b/apps/game/src/systems/combat/__tests__/los.test.ts @@ -30,11 +30,23 @@ describe('tileOpaque на реальной карте', () => { it('дерево/дом непрозрачны, трава/тропа/вода прозрачны', () => { - const map = { data: buildMeadowsMap() }; + const data = buildMeadowsMap(); + const map = { data }; const is = tileOpaque(map); - expect(is(2, 12)).toBe(true); // дерево - expect(is(1, 7)).toBe(true); // дерево - expect(is(14, 14)).toBe(false); // трава у спавна - expect(is(19, 7)).toBe(false); // вода прозрачна + // Дерево и воду ищем на карте: раскладка seeded, но не привязываем тест к координате. + let tree: { x: number; y: number } | null = null; + let water: { x: number; y: number } | null = null; + for (let y = 0; y < data.height; y++) { + for (let x = 0; x < data.width; x++) { + const t = data.tiles[y * data.width + x]; + if (t === 3 && !tree) tree = { x, y }; + if (t === 2 && !water) water = { x, y }; + } + } + expect(tree).not.toBeNull(); + expect(water).not.toBeNull(); + expect(is(tree!.x, tree!.y)).toBe(true); // дерево + expect(is(16, 28)).toBe(false); // трава у спавна + expect(is(water!.x, water!.y)).toBe(false); // вода прозрачна }); }); \ No newline at end of file diff --git a/apps/game/tools/checks/ai.mjs b/apps/game/tools/checks/ai.mjs index b716432..622c545 100644 --- a/apps/game/tools/checks/ai.mjs +++ b/apps/game/tools/checks/ai.mjs @@ -25,18 +25,19 @@ const s0 = await t.ctx.agent.snapshot(); const h0 = heavy(s0); c.expect(h0?.state === 'patrol', 'тяжеловес не в patrol на старте', h0); - // Спавн (6,22), патруль к (4,20): позиция меняется без участия героя. + // Спавн (12,44), патруль к (8,40): позиция меняется без участия + // героя; путь диагональный — с запасом по времени. const w = await t.ctx.agent.waitFor( - '(s.enemies.find((e) => e.kind === "heavy")?.pos.x ?? 9) < 6', - { timeoutTicks: 600 } + '(s.enemies.find((e) => e.kind === "heavy")?.pos.x ?? 9) < 10', + { timeoutTicks: 1800 } ); c.expect(w.ok, 'тяжеловес не сдвинулся с места в патруле', w.snapshot.enemies); return null; }); await c.run('тихий шум настораживает патрульного', async () => { - // Герой далеко (спавн 14,14), шум у маршрута тяжеловеса. - await t.ctx.agent.command('scene:noise', { x: 5, y: 21, level: 0.35 }); + // Герой далеко (спавн 16,28), шум у маршрута тяжеловеса. + await t.ctx.agent.command('scene:noise', { x: 10, y: 42, level: 0.35 }); const w = await t.ctx.agent.waitFor( 's.enemies.find((e) => e.kind === "heavy")?.state === "wary"', { timeoutTicks: 300 } @@ -56,7 +57,7 @@ await c.run('герой рядом — погоня', async () => { await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 300 }); - await t.ctx.agent.command('scene:teleport', { x: 5, y: 22 }); + await t.ctx.agent.command('scene:teleport', { x: 11, y: 44 }); const w = await t.ctx.agent.waitFor( 's.enemies.find((e) => e.kind === "heavy")?.state === "chase"', { timeoutTicks: 300 } @@ -66,7 +67,7 @@ }); await c.run('герой далеко — погоня гаснет и враг уходит домой', async () => { - await t.ctx.agent.command('scene:teleport', { x: 14, y: 14 }); + await t.ctx.agent.command('scene:teleport', { x: 16, y: 28 }); const w = await t.ctx.agent.waitFor( 's.enemies.find((e) => e.kind === "heavy")?.state === "patrol"', { timeoutTicks: 900 } @@ -76,7 +77,7 @@ }); await c.run('мало hp — отступление бегом', async () => { - await t.ctx.agent.command('scene:teleport', { x: 6, y: 21 }); + await t.ctx.agent.command('scene:teleport', { x: 11, y: 43 }); const dmg = await t.ctx.agent.command('scene:damageEnemy', { id: 'heavy', value: 6 }); c.expect(dmg === true, 'scene:damageEnemy не нашла тяжеловеса'); const w = await t.ctx.agent.waitFor( diff --git a/apps/game/tools/checks/audio.mjs b/apps/game/tools/checks/audio.mjs index 9188ae0..045ea17 100644 --- a/apps/game/tools/checks/audio.mjs +++ b/apps/game/tools/checks/audio.mjs @@ -26,7 +26,7 @@ await c.run('шаги: step_* в логе, боевых звуков нет', async () => { await t.sleepEnemies(); const before = (await t.readAudioLog()).filter((e) => e.key.startsWith('sfx/step_')).length; - await t.ctx.agent.walkTo(16, 14, { timeoutTicks: 1500 }); + await t.ctx.agent.walkTo(18, 28, { timeoutTicks: 1500 }); const log = await t.waitAudioLog( (l) => l.filter((e) => e.key.startsWith('sfx/step_')).length > before ); @@ -56,7 +56,7 @@ }); await c.run('лог ограничен 24 записями', async () => { // Прогулка туда-обратно — шагов больше, чем вмещает кольцевой буфер. - for (const [x, y] of [[17, 14], [15, 14], [17, 14], [15, 14], [17, 14], [15, 14]]) { + for (const [x, y] of [[18, 28], [14, 28], [18, 28], [14, 28], [18, 28], [14, 28]]) { await t.ctx.agent.walkTo(x, y, { timeoutTicks: 1500 }); } const log = await t.readAudioLog(); diff --git a/apps/game/tools/checks/collision.mjs b/apps/game/tools/checks/collision.mjs index 0ade8d1..73152de 100644 --- a/apps/game/tools/checks/collision.mjs +++ b/apps/game/tools/checks/collision.mjs @@ -43,16 +43,16 @@ const s = await t.ctx.agent.snapshot(); const heroWalk = await walk(s.hero.tile.x, s.hero.tile.y); c.expect(heroWalk === true, 'тайл героя непроходим', s.hero.tile); - c.expect((await walk(19, 8)) === false, 'вода проходима?'); - c.expect((await walk(0, 4)) === false, 'дерево проходимо?'); + c.expect((await walk(40, 16)) === false, 'вода проходима?'); + c.expect((await walk(7, 1)) === false, 'дерево проходимо?'); return null; }); await c.run('scene:raycast: дерево перекрывает, вода прозрачна', async () => { const ray = (from, to) => t.ctx.agent.command('scene:raycast', { from, to }); - // Вертикальный луч (3,8)->(3,10) задевает дерево (3,9). - c.expect((await ray({ x: 3, y: 8 }, { x: 3, y: 10 })) === false, 'дерево не перекрыло луч'); + // Вертикальный луч (7,0)->(7,2) задевает дерево (7,1). + c.expect((await ray({ x: 7, y: 0 }, { x: 7, y: 2 })) === false, 'дерево не перекрыло луч'); // Берег-берег через пруд: вода прозрачна, луч чист. - c.expect((await ray({ x: 18, y: 8 }, { x: 24, y: 8 })) === true, 'вода перекрыла луч'); + c.expect((await ray({ x: 37, y: 16 }, { x: 45, y: 16 })) === true, 'вода перекрыла луч'); return null; }); await c.run('scene:walk в непроходимый — false, approach — к соседу', async () => { @@ -61,11 +61,11 @@ // (сам (2,2) — тайл перехода на пруды, туда телепортировать нельзя). await t.ctx.agent.command('scene:teleport', { x: 2, y: 3 }); await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 60 }); - // Путь в дерево (0,4) не строится: scene:walk — false. - const walked = await t.ctx.agent.command('scene:walk', { x: 0, y: 4 }); + // Путь в дерево (7,1) не строится: scene:walk — false. + const walked = await t.ctx.agent.command('scene:walk', { x: 7, y: 1 }); c.expect(walked === false, 'scene:walk провёл героя в дерево', walked); // approach подводит к проходимому соседу дерева. - const dest = await t.ctx.agent.approach(0, 4); + const dest = await t.ctx.agent.approach(7, 1); c.expect(dest !== null, 'approach к дереву не нашёл соседа'); const s = await t.ctx.agent.snapshot(); c.expect( @@ -80,12 +80,12 @@ }); await c.run('расталкивание: враг выталкивает себя из героя', async () => { await t.sleepEnemies(); - // Ползун спит в (10.5,7.5); телепортируемся внутрь его тела. - await t.ctx.agent.command('scene:teleport', { x: 10, y: 7 }); + // Ползун спит в (20.5,14.5); телепортируемся внутрь его тела. + await t.ctx.agent.command('scene:teleport', { x: 20, y: 14 }); await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 60 }); const s = await t.ctx.agent.snapshot(); const en = (s.enemies ?? []).find( - (e) => !e.dead && Math.hypot(e.pos.x - 10.5, e.pos.y - 7.5) < 1.2 + (e) => !e.dead && Math.hypot(e.pos.x - 20.5, e.pos.y - 14.5) < 1.2 ); c.expect(!!en, 'ползун у тропы не найден', s.enemies); const gap = Math.hypot(en.pos.x - s.hero.pos.x, en.pos.y - s.hero.pos.y); diff --git a/apps/game/tools/checks/final.mjs b/apps/game/tools/checks/final.mjs index 648be6a..49ce0ff 100644 --- a/apps/game/tools/checks/final.mjs +++ b/apps/game/tools/checks/final.mjs @@ -18,14 +18,14 @@ await c.run('путь акта 2: спуск через люк в зал Машины', async () => { await t.boot(); await t.sleepEnemies(); - await t.goToArea('zvenets', { x: 26, y: 14 }); + await t.goToArea('zvenets', { x: 54, y: 28 }); await t.sleepEnemies(); - await t.ctx.agent.command('scene:teleport', { x: 25, y: 10 }); - await t.goToArea('rust_grove', { x: 26, y: 10 }); + await t.ctx.agent.command('scene:teleport', { x: 53, y: 20 }); + await t.goToArea('rust_grove', { x: 54, y: 20 }); await t.sleepEnemies(); - await t.goToArea('old_siding', { x: 22, y: 10 }); + await t.goToArea('old_siding', { x: 46, y: 20 }); await t.sleepEnemies(); - await t.goToArea('machine_hall', { x: 15, y: 15 }); + await t.goToArea('machine_hall', { x: 28, y: 31 }); const s = await t.ctx.agent.snapshot(); c.expect(s.area === 'machine_hall', 'герой не в зале Машины', s.area); return null; diff --git a/apps/game/tools/checks/interact-world.mjs b/apps/game/tools/checks/interact-world.mjs index 98212fa..0230a77 100644 --- a/apps/game/tools/checks/interact-world.mjs +++ b/apps/game/tools/checks/interact-world.mjs @@ -69,8 +69,8 @@ return null; }); await c.run('верёвка колокола: флаг + повтор с другим текстом', async () => { - // Звенец через тропу (26,14); верёвка у башни — подходим и звоним. - await t.goToArea('zvenets', { x: 26, y: 14 }); + // Звенец через тропу (54,28); верёвка у башни — подходим и звоним. + await t.goToArea('zvenets', { x: 54, y: 28 }); const opened = await t.useInteractable('bell_rope'); c.expect(opened, 'не подошли к верёвке колокола'); const wr = await t.ctx.agent.waitFor('s.flags.includes("rang_tower")', { diff --git a/apps/game/tools/checks/interact.mjs b/apps/game/tools/checks/interact.mjs index 49c9a86..9d680de 100644 --- a/apps/game/tools/checks/interact.mjs +++ b/apps/game/tools/checks/interact.mjs @@ -22,10 +22,10 @@ await c.run('дверь: дом Ирвина -> интерьер', async () => { await t.boot(); await t.sleepEnemies(); - // Добираемся до Звенца пешком (луга -> тропа (26,14)). - await t.goToArea('zvenets', { x: 26, y: 14 }); - // Подходим к дому (дверь (7,6)) и жмём действие. - const opened = await t.interactAt(7, 6); + // Добираемся до Звенца пешком (луга -> тропа (54,28)). + await t.goToArea('zvenets', { x: 54, y: 28 }); + // Подходим к дому (дверь (13,12)) и жмём действие. + const opened = await t.interactAt(13, 12); c.expect(opened, 'не подошли к дому Ирвина'); entryTile = (await t.ctx.agent.snapshot()).hero.tile; const w = await t.ctx.agent.waitFor('s.area === "house_elder"', { timeoutTicks: 1200 }); @@ -97,8 +97,8 @@ return null; }); await c.run('лавка Милы: прилавок меняет реакцию', async () => { - // Действие у двери лавки (21,9) — интерьер; прилавок внутри. - const opened = await t.interactAt(21, 9); + // Действие у двери лавки (43,19) — интерьер; прилавок внутри. + const opened = await t.interactAt(43, 19); c.expect(opened, 'не подошли к двери лавки'); const w = await t.ctx.agent.waitFor('s.area === "shop"', { timeoutTicks: 1200 }); c.expect(w.ok, 'лавка не открылась', { area: w.snapshot.area }); @@ -133,8 +133,8 @@ await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 600 }); // Флаг-крючок акта 2: после него Клинт стоит в Ржавой роще. await t.ctx.agent.command('scene:setFlag', { flag: 'act2_hook' }); - // Роща: Звенец (26,10) -> роща (2,10). - await t.goToArea('rust_grove', { x: 26, y: 10 }); + // Роща: Звенец (54,20) -> роща (2,20). + await t.goToArea('rust_grove', { x: 54, y: 20 }); await t.sleepEnemies(); const s = await t.ctx.agent.snapshot(); const clint = (s.npcs ?? []).find((n) => n.id === 'clint'); diff --git a/apps/game/tools/checks/lighting.mjs b/apps/game/tools/checks/lighting.mjs index 65fb32c..685a183 100644 --- a/apps/game/tools/checks/lighting.mjs +++ b/apps/game/tools/checks/lighting.mjs @@ -59,7 +59,7 @@ return null; }); await c.run('Звенец ночью: ночная цель, три окна, башня молчит', async () => { - await t.goToArea('zvenets', { x: 26, y: 14 }); + await t.goToArea('zvenets', { x: 54, y: 28 }); await t.ctx.agent.command('scene:setTime', { hours: 21 }); // пин: ходьба ест время const s = await t.ctx.agent.snapshot(); c.expect(s.lighting.ambient === AMB.zvenetsNight, 'ambient Звенца не ночной', s.lighting); @@ -70,7 +70,7 @@ return null; }); await c.run('дом Ирвина: тёмный интерьер, hearth_low, лампа героя', async () => { - const opened = await t.interactAt(7, 6); // дверь дома — действие E + const opened = await t.interactAt(13, 12); // дверь дома — действие E c.expect(opened, 'не подошли к двери дома Ирвина'); const w = await t.ctx.agent.waitFor('s.area === "house_elder"', { timeoutTicks: 1200 }); c.expect(w.ok, 'не вошли в дом Ирвина'); diff --git a/apps/game/tools/checks/music.mjs b/apps/game/tools/checks/music.mjs index 320700b..6d0079a 100644 --- a/apps/game/tools/checks/music.mjs +++ b/apps/game/tools/checks/music.mjs @@ -42,8 +42,8 @@ await c.run('возврат в ту же область: тема не перезапускается (guard)', async () => { const before = await countKey('music/meadows'); // Шагнуть туда-обратно мимо переходов, сцена не меняется — guard ключа. - await t.ctx.agent.walkTo(15, 14, { timeoutTicks: 1500 }); - await t.ctx.agent.walkTo(14, 14, { timeoutTicks: 1500 }); + await t.ctx.agent.walkTo(15, 28, { timeoutTicks: 1500 }); + await t.ctx.agent.walkTo(17, 28, { timeoutTicks: 1500 }); c.expect((await countKey('music/meadows')) === before, 'тема перезапустилась без смены ключа', { before, after: await countKey('music/meadows') @@ -51,10 +51,15 @@ return null; }); await c.run('уход в Звенец: слот темы снят, тема лугов не перезапускается', async () => { - const before = await countKey('music/meadows'); - // Пешком к тропе в Звенец (26,14) — честный step-переход. - const walked = await t.ctx.agent.walkTo(26, 14, { timeoutTicks: 3000 }); - c.expect(walked, 'walkTo(26,14) не дошёл до перехода'); + // Лог аудио — кольцевой на 24 записи: долгая пешая прогулка на + // картах ×2 вытесняет старые записи шагами, поэтому перед + // переходом лог чистится, и дальше смотрим только новые записи. + await t.ctx.page.evaluate(() => { + (window.__gameAudioLog ?? []).splice(0); + }); + // Пешком к тропе в Звенец (54,28) — честный step-переход. + const walked = await t.ctx.agent.walkTo(54, 28, { timeoutTicks: 6000 }); + c.expect(walked, 'walkTo(54,28) не дошёл до перехода'); // Слот темы освобождается (тема Звенца пуста; тема боя погони — // временный ключ, ждём его снятия после деаггро). for (let i = 0; i < 12 && (await themeKey()) !== ''; i++) { @@ -62,9 +67,9 @@ } c.expect((await themeKey()) === '', 'слот темы не снят при уходе из лугов'); c.expect( - (await countKey('music/meadows')) === before, + (await countKey('music/meadows')) === 0, 'тема лугов перезапустилась (guard ключа сломан)', - { before, after: await countKey('music/meadows') } + { after: await countKey('music/meadows') } ); return null; }); diff --git a/apps/game/tools/checks/perf.mjs b/apps/game/tools/checks/perf.mjs index 272be04..f44c73e 100644 --- a/apps/game/tools/checks/perf.mjs +++ b/apps/game/tools/checks/perf.mjs @@ -39,13 +39,13 @@ await c.run('путь: один A* (scene:route) и walkTo через луга', async () => { const t0 = Date.now(); - const route = await t.ctx.agent.command('scene:route', { x: 24, y: 14 }); + const route = await t.ctx.agent.command('scene:route', { x: 48, y: 28 }); const routeMs = Date.now() - t0; c.expect(Array.isArray(route) && route.length > 0, 'маршрут на восток лугов не найден', route); const t1 = Date.now(); - const walked = await t.ctx.agent.walkTo(24, 14, { timeoutTicks: 3000 }); + const walked = await t.ctx.agent.walkTo(48, 28, { timeoutTicks: 6000 }); const walkMs = Date.now() - t1; - c.expect(walked, 'walkTo(24,14) не дошёл', null); + c.expect(walked, 'walkTo(48,28) не дошёл', null); return { routeMs, routeLen: route.length, walkMs }; }); @@ -61,8 +61,8 @@ await c.run('бой: погоня, урон, эффекты — fps/heap под нагрузкой', async () => { await t.ctx.agent.command('scene:sleepAll'); // чистый старт сценария боя - await t.ctx.agent.command('scene:teleport', { x: 7, y: 9 }); // у сталкера (8,9) - await t.ctx.agent.command('scene:noise', { x: 8, y: 9, level: 1 }); // будим + await t.ctx.agent.command('scene:teleport', { x: 15, y: 18 }); // у сталкера (16,18) + await t.ctx.agent.command('scene:noise', { x: 16, y: 18, level: 1 }); // будим const w = await t.ctx.agent.waitFor( 's.enemies.some((e) => e.state === "chase")', { timeoutTicks: 300 } diff --git a/apps/game/tools/checks/quest-bells.mjs b/apps/game/tools/checks/quest-bells.mjs index b9b527f..56fe163 100644 --- a/apps/game/tools/checks/quest-bells.mjs +++ b/apps/game/tools/checks/quest-bells.mjs @@ -23,8 +23,8 @@ await c.run('Ирвин: elder_first, выбор по тексту, флаги квеста', async () => { await t.boot(); await t.sleepEnemies(); - // NPC в Звенце: тропа на востоке (26,14), затем Ирвин. - await t.goToArea('zvenets', { x: 26, y: 14 }); + // NPC в Звенце: тропа на востоке (54,28), затем Ирвин. + await t.goToArea('zvenets', { x: 54, y: 28 }); const talked = await t.talkTo('elder'); // подойти и нажать E c.expect(talked, 'не подошли к Ирвину'); const o = await t.ctx.agent.waitFor('s.dialogue?.id === "elder_first"', { timeoutTicks: 900 }); diff --git a/apps/game/tools/checks/resonator.mjs b/apps/game/tools/checks/resonator.mjs index 377a134..38621ac 100644 --- a/apps/game/tools/checks/resonator.mjs +++ b/apps/game/tools/checks/resonator.mjs @@ -22,13 +22,13 @@ await c.run('крючок акта 2: Клинт появляется в роще', async () => { await t.boot(); await t.sleepEnemies(); - await t.goToArea('zvenets', { x: 26, y: 14 }); + await t.goToArea('zvenets', { x: 54, y: 28 }); await t.sleepEnemies(); await t.ctx.agent.command('scene:setFlag', { flag: 'act2_hook' }); - // К восточному переходу — телепортом в Звенце: пешком из юго-восточного - // спавна маршрут уводит через город и мост не доживает. - await t.ctx.agent.command('scene:teleport', { x: 25, y: 10 }); - await t.goToArea('rust_grove', { x: 26, y: 10 }); + // К восточному переходу — телепортом в Звенце: пешком из центра + // маршрут уводит через город и мост не доживает. + await t.ctx.agent.command('scene:teleport', { x: 53, y: 20 }); + await t.goToArea('rust_grove', { x: 54, y: 20 }); await t.sleepEnemies(); const s = await t.ctx.agent.snapshot(); c.expect((s.npcs ?? []).some((n) => n.id === 'clint'), 'Клинта нет в роще после act2_hook', s.npcs); @@ -61,7 +61,7 @@ return null; }); await c.run('сдача: clint_tune, кат-сцена настройки, флаг done', async () => { - // Звон у деревьев шумит: краулер у (10,15) просыпается и может + // Звон у деревьев шумит: краулер у (12,10) просыпается и может // убить героя по дороге к Клинту — усыпляем перед сдачей. await t.sleepEnemies(); const talked = await t.talkTo('clint'); diff --git a/apps/game/tools/checks/transitions.mjs b/apps/game/tools/checks/transitions.mjs index 398bd3c..a2dc12c 100644 --- a/apps/game/tools/checks/transitions.mjs +++ b/apps/game/tools/checks/transitions.mjs @@ -16,32 +16,32 @@ const { c } = t; await c.run('step-переход: луга -> Звенец пешком', async () => { await t.boot(); - // Спим врагов, чтобы путь был безопасным; идём к тропе (26,14). + // Спим врагов, чтобы путь был безопасным; идём к тропе (54,28). await t.sleepEnemies(); - await t.goToArea('zvenets', { x: 26, y: 14 }); + await t.goToArea('zvenets', { x: 54, y: 28 }); return null; }); await c.run('клик-переход: колодец Звенца -> луга', async () => { - // Колодец (9,6) у дома Ирвина; entry на лугах — (22,21). + // Колодец (16,13) у дома Ирвина; entry на лугах — (44,41). // Подходим к колодцу и жмём действие E. - const used = await t.interactAt(9, 6); + const used = await t.interactAt(16, 13); c.expect(used, 'не подошли к колодцу Звенца'); const w = await t.ctx.agent.waitFor('s.area === "meadows"', { timeoutTicks: 1200 }); c.expect(w.ok, 'колодец не телепортировал на луга', { area: w.snapshot.area }); await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 600 }); const s = await t.ctx.agent.snapshot(); - c.expect(s.hero.tile.x === 22 && s.hero.tile.y === 21, 'герой не на entry (22,21)', s.hero.tile); + c.expect(s.hero.tile.x === 44 && s.hero.tile.y === 41, 'герой не на entry (44,41)', s.hero.tile); return null; }); await c.run('обратный колодец: луга -> Звенец', async () => { - // Луговой колодец (22,20) стоит рядом с entry — подходим и жмём E. - const used = await t.interactAt(22, 20); + // Луговой колодец (44,40) стоит рядом с entry — подходим и жмём E. + const used = await t.interactAt(44, 40); c.expect(used, 'не подошли к луговому колодцу'); const w = await t.ctx.agent.waitFor('s.area === "zvenets"', { timeoutTicks: 1200 }); c.expect(w.ok, 'луговой колодец не вернул в Звенец', { area: w.snapshot.area }); await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 600 }); const s = await t.ctx.agent.snapshot(); - c.expect(s.hero.tile.x === 9 && s.hero.tile.y === 7, 'герой не на entry (9,7) Звенца', s.hero.tile); + c.expect(s.hero.tile.x === 16 && s.hero.tile.y === 14, 'герой не на entry (16,14) Звенца', s.hero.tile); return null; }); await c.run('снапшот: переходы области с триггерами', async () => { @@ -57,16 +57,16 @@ }); await c.run('акт 2: Звенец -> роща -> разъезд -> зал Машины', async () => { // Цепочка step-переходов акта 2: восток Звенца -> роща -> разъезд, - // затем люк (15,15) вниз в зал Машины. Врагов спим на каждой + // затем люк (28,31) вниз в зал Машины. Врагов спим на каждой // области: бой сбивает маршрут (как в smoke-act1). await t.sleepEnemies(); - await t.goToArea('rust_grove', { x: 26, y: 10 }); + await t.goToArea('rust_grove', { x: 54, y: 20 }); await t.sleepEnemies(); - await t.goToArea('old_siding', { x: 22, y: 10 }); + await t.goToArea('old_siding', { x: 46, y: 20 }); await t.sleepEnemies(); - await t.goToArea('machine_hall', { x: 15, y: 15 }); + await t.goToArea('machine_hall', { x: 28, y: 31 }); // Обратно наверх: проём в нижней стене зала. - await t.goToArea('old_siding', { x: 6, y: 10 }); + await t.goToArea('old_siding', { x: 13, y: 21 }); return null; }); }, diff --git a/apps/game/tools/checks/zoom.mjs b/apps/game/tools/checks/zoom.mjs index 5618d4e..c81a83d 100644 --- a/apps/game/tools/checks/zoom.mjs +++ b/apps/game/tools/checks/zoom.mjs @@ -17,7 +17,7 @@ await c.run('включение зума: scale=2', async () => { await t.boot(); await t.sleepEnemies(); - await t.goToArea('zvenets', { x: 26, y: 14 }); + await t.goToArea('zvenets', { x: 54, y: 28 }); const before = await worldRoot(); c.expect(before.scale === 1, 'стартовый зум не 1', before.scale); await t.ctx.agent.press('debugZoom'); diff --git a/apps/game/tools/final-smoke.mjs b/apps/game/tools/final-smoke.mjs index 3d30c69..8eaa968 100644 --- a/apps/game/tools/final-smoke.mjs +++ b/apps/game/tools/final-smoke.mjs @@ -13,15 +13,15 @@ const { page, agent } = ctx; const fail = []; - /** Туда-обратно: пешком к тропе (26,14) -> Звенец -> колодец (9,6) -> луга. */ + /** Туда-обратно: пешком к тропе (54,28) -> Звенец -> колодец (16,13) -> луга. */ const roundTrip = async (n) => { await agent.command('scene:sleepAll'); - const w1 = await agent.walkTo(26, 14, { timeoutTicks: 3000 }); + const w1 = await agent.walkTo(54, 28, { timeoutTicks: 6000 }); if (!w1) fail.push(`поездка ${n}: не дошёл до тропы`); const z = await agent.waitFor('s.area === "zvenets"', { timeoutTicks: 1200 }); if (!z.ok) fail.push(`поездка ${n}: не в Звенце`); await agent.waitFor('!s.transitioning', { timeoutTicks: 600 }); - if (await agent.approach(9, 6)) agent.press('interact'); // колодец у дома Ирвина + if (await agent.approach(16, 13)) agent.press('interact'); // колодец у дома Ирвина else fail.push(`поездка ${n}: не подошли к колодцу`); const m = await agent.waitFor('s.area === "meadows"', { timeoutTicks: 1200 }); if (!m.ok) fail.push(`поездка ${n}: колодец не вернул на луга`); @@ -32,8 +32,8 @@ for (let n = 1; n <= 3; n++) await roundTrip(n); console.log('3 поездки туда-обратно: ок'); - // Тост знака у тропы (25,13): подходим и жмём действие. - if (await agent.approach(25, 13)) agent.press('interact'); + // Тост знака у тропы (48,27): подходим и жмём действие. + if (await agent.approach(48, 27)) agent.press('interact'); else fail.push('не подошли к знаку у тропы'); const t = await agent.waitFor('(s.lastToast?.text ?? "").includes("Звенец")', { timeoutTicks: 1500 }); console.log('тост знака:', t.ok ? t.snapshot.lastToast?.text : 'НЕ ПОКАЗАН'); diff --git a/apps/game/tools/lib.mjs b/apps/game/tools/lib.mjs index 6ddc5d3..8252230 100644 --- a/apps/game/tools/lib.mjs +++ b/apps/game/tools/lib.mjs @@ -106,7 +106,7 @@ * (двери-переходы — явным interactAt в сценарии). */ goToArea: async (area, via) => { - const walked = await h.ctx.agent.walkTo(via.x, via.y, { timeoutTicks: 3000 }); + const walked = await h.ctx.agent.walkTo(via.x, via.y, { timeoutTicks: 6000 }); c.expect(walked, `walkTo(${via.x},${via.y}) не дошёл до перехода`); const w = await h.ctx.agent.waitFor(`s.area === "${area}"`, { timeoutTicks: 1200 }); c.expect(w.ok, `после перехода не в «${area}»`, w.snapshot?.area); @@ -116,12 +116,14 @@ /** * Подойти к тайлу и нажать действие (E): walkTo на проходимый (цветок, * мот), approach на непроходимый (стены, объекты, NPC-тайлы — путь в - * занятый тайл не строится). Возврат — дошли ли. + * занятый тайл не строится). Таймаут с запасом: карты ×2, пешком + * бывает далеко. Возврат — дошли ли. */ interactAt: async (tx, ty) => { const a = h.ctx.agent; const ok = - (await a.walkTo(tx, ty)) || (await a.approach(tx, ty)) !== null; + (await a.walkTo(tx, ty, { timeoutTicks: 6000 })) || + (await a.approach(tx, ty, { timeoutTicks: 6000 })) !== null; if (ok) a.press('interact'); return ok; }, diff --git a/apps/game/tools/smoke-act1.mjs b/apps/game/tools/smoke-act1.mjs index c0cc64a..6b0ef4f 100644 --- a/apps/game/tools/smoke-act1.mjs +++ b/apps/game/tools/smoke-act1.mjs @@ -20,17 +20,17 @@ } await sleepAll(); -// 1) Луга -> тропа в Звенец (26,14) — триггер срабатывает на самом тайле. +// 1) Луга -> тропа в Звенец (54,28) — триггер срабатывает на самом тайле. console.log('шаг 1: луга -> Звенец'); -if (!(await agent.walkTo(26, 14))) console.log(' ! герой не дошёл до (26,14)'); +if (!(await agent.walkTo(54, 28, { timeoutTicks: 6000 }))) console.log(' ! герой не дошёл до (54,28)'); await agent.waitFor('s.area === "zvenets"', { timeoutTicks: 300 }); // Фаза «in» fade-перехода: сцена ещё игнорирует клики. await agent.waitFor('!s.transitioning', { timeoutTicks: 300 }); await sleepAll(); // переход мог вернуть героя в бой -// 2-3) Подойти к Ирвину (12,9) и нажать действие E — диалог откроется в радиусе. +// 2-3) Подойти к Ирвину (12,14) и нажать действие E — диалог откроется в радиусе. console.log('шаг 2: квест у Ирвина'); -if (await agent.approach(12, 9)) agent.press('interact'); +if (await agent.approach(12, 14)) agent.press('interact'); else console.log(' ! не подошли к Ирвину'); if (!(await agent.runDialogue())) console.log(' ! диалог с Ирвином не открылся'); @@ -40,7 +40,7 @@ // 5) Сдача Ирвину -> кат-сцена. console.log('шаг 5: сдача -> кат-сцена'); -if (await agent.approach(12, 9)) agent.press('interact'); +if (await agent.approach(12, 14)) agent.press('interact'); else console.log(' ! не подошли к Ирвину для сдачи'); if (!(await agent.runDialogue())) console.log(' ! диалог сдачи не открылся');