diff --git a/apps/game/assets/audio/ambience/meadows.wav b/apps/game/assets/audio/ambience/meadows.wav index ea119cd..1738876 100644 --- a/apps/game/assets/audio/ambience/meadows.wav +++ b/apps/game/assets/audio/ambience/meadows.wav Binary files differ diff --git a/apps/game/assets/audio/ambience/meadows_night.wav b/apps/game/assets/audio/ambience/meadows_night.wav index 451606c..b748938 100644 --- a/apps/game/assets/audio/ambience/meadows_night.wav +++ b/apps/game/assets/audio/ambience/meadows_night.wav Binary files differ diff --git a/apps/game/assets/maps/meadows.map b/apps/game/assets/maps/meadows.map index d82d370..7e4bd7f 100644 --- a/apps/game/assets/maps/meadows.map +++ b/apps/game/assets/maps/meadows.map @@ -1 +1 @@ -{"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 +{"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":51,"y":4,"dx":-3,"dy":1},{"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":51,"y":5,"dx":-2,"dy":1},{"id":16,"x":52,"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":55,"y":19,"dx":0,"dy":-1},{"id":16,"x":10,"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":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":16,"x":21,"y":22,"dx":2,"dy":0},{"id":16,"x":22,"y":22,"dx":2,"dy":-1},{"id":15,"x":55,"y":22,"dx":-4,"dy":0},{"id":17,"x":3,"y":23,"dx":3,"dy":0},{"id":16,"x":34,"y":23,"dx":2,"dy":-1},{"id":15,"x":41,"y":23,"dx":-2,"dy":-2},{"id":15,"x":46,"y":23,"dx":2,"dy":1},{"id":16,"x":50,"y":23,"dx":2,"dy":0},{"id":15,"x":9,"y":24,"dx":1,"dy":-1},{"id":15,"x":28,"y":24,"dx":3,"dy":-2},{"id":15,"x":32,"y":24,"dx":4,"dy":-1},{"id":16,"x":39,"y":24,"dx":2,"dy":0},{"id":15,"x":1,"y":25,"dx":-3,"dy":1},{"id":15,"x":11,"y":25,"dx":-1,"dy":1},{"id":15,"x":23,"y":25,"dx":3,"dy":-1},{"id":17,"x":25,"y":25,"dx":2,"dy":-1},{"id":17,"x":28,"y":25,"dx":1,"dy":1},{"id":17,"x":32,"y":25,"dx":-3,"dy":1},{"id":15,"x":44,"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":15,"x":50,"y":37,"dx":4,"dy":2},{"id":15,"x":55,"y":37,"dx":2,"dy":1},{"id":16,"x":3,"y":38,"dx":-3,"dy":2},{"id":17,"x":8,"y":38,"dx":2,"dy":0},{"id":16,"x":28,"y":38,"dx":-1,"dy":-1},{"id":15,"x":34,"y":38,"dx":0,"dy":0},{"id":17,"x":25,"y":39,"dx":3,"dy":2},{"id":17,"x":29,"y":39,"dx":2,"dy":0},{"id":15,"x":33,"y":39,"dx":3,"dy":-2},{"id":16,"x":51,"y":39,"dx":-1,"dy":-1},{"id":16,"x":52,"y":39,"dx":-1,"dy":0},{"id":16,"x":53,"y":39,"dx":-2,"dy":0},{"id":15,"x":54,"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":17,"x":10,"y":41,"dx":-3,"dy":2},{"id":16,"x":22,"y":41,"dx":0,"dy":0},{"id":16,"x":23,"y":41,"dx":-3,"dy":-1},{"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":8,"y":42,"dx":1,"dy":-1},{"id":16,"x":14,"y":42,"dx":0,"dy":-1},{"id":17,"x":19,"y":42,"dx":1,"dy":1},{"id":16,"x":23,"y":42,"dx":-2,"dy":1},{"id":15,"x":28,"y":42,"dx":3,"dy":-1},{"id":16,"x":35,"y":42,"dx":2,"dy":0},{"id":17,"x":41,"y":42,"dx":2,"dy":-2},{"id":15,"x":48,"y":42,"dx":0,"dy":1},{"id":16,"x":52,"y":42,"dx":-1,"dy":1},{"id":17,"x":8,"y":43,"dx":-2,"dy":0},{"id":15,"x":16,"y":43,"dx":-1,"dy":1},{"id":15,"x":0,"y":44,"dx":2,"dy":2},{"id":15,"x":30,"y":44,"dx":1,"dy":0},{"id":17,"x":43,"y":44,"dx":-1,"dy":0},{"id":16,"x":14,"y":45,"dx":0,"dy":1},{"id":15,"x":31,"y":45,"dx":3,"dy":2},{"id":15,"x":37,"y":45,"dx":-2,"dy":2},{"id":15,"x":38,"y":45,"dx":1,"dy":1},{"id":15,"x":42,"y":45,"dx":-2,"dy":1},{"id":15,"x":46,"y":45,"dx":-2,"dy":-2},{"id":15,"x":1,"y":46,"dx":-1,"dy":2},{"id":16,"x":15,"y":46,"dx":-2,"dy":-1},{"id":17,"x":29,"y":46,"dx":3,"dy":1},{"id":15,"x":41,"y":46,"dx":-1,"dy":0},{"id":17,"x":42,"y":46,"dx":4,"dy":-1},{"id":15,"x":44,"y":46,"dx":1,"dy":1},{"id":15,"x":52,"y":46,"dx":-3,"dy":-2},{"id":16,"x":54,"y":46,"dx":0,"dy":0},{"id":15,"x":4,"y":47,"dx":3,"dy":2},{"id":16,"x":15,"y":47,"dx":1,"dy":2},{"id":16,"x":22,"y":47,"dx":-3,"dy":-1},{"id":16,"x":24,"y":47,"dx":1,"dy":2},{"id":16,"x":27,"y":47,"dx":-4,"dy":1},{"id":16,"x":33,"y":47,"dx":-1,"dy":2},{"id":15,"x":38,"y":47,"dx":-2,"dy":-1},{"id":17,"x":37,"y":48,"dx":3,"dy":0},{"id":15,"x":41,"y":48,"dx":0,"dy":0},{"id":15,"x":45,"y":48,"dx":0,"dy":-2},{"id":17,"x":46,"y":48,"dx":-4,"dy":1},{"id":16,"x":34,"y":49,"dx":1,"dy":-1},{"id":17,"x":46,"y":49,"dx":-4,"dy":2},{"id":15,"x":49,"y":49,"dx":-3,"dy":-1},{"id":17,"x":1,"y":50,"dx":-1,"dy":1},{"id":16,"x":8,"y":50,"dx":4,"dy":1},{"id":16,"x":22,"y":50,"dx":3,"dy":-1},{"id":16,"x":31,"y":50,"dx":1,"dy":-2},{"id":16,"x":32,"y":50,"dx":-4,"dy":-1},{"id":15,"x":37,"y":50,"dx":-2,"dy":0},{"id":16,"x":54,"y":50,"dx":3,"dy":-1},{"id":16,"x":17,"y":51,"dx":-3,"dy":-1},{"id":15,"x":18,"y":51,"dx":-2,"dy":0},{"id":16,"x":9,"y":52,"dx":-1,"dy":0},{"id":16,"x":10,"y":52,"dx":-1,"dy":0},{"id":16,"x":13,"y":52,"dx":2,"dy":2},{"id":15,"x":19,"y":52,"dx":0,"dy":1},{"id":15,"x":25,"y":52,"dx":3,"dy":-1},{"id":15,"x":26,"y":52,"dx":0,"dy":0},{"id":15,"x":29,"y":52,"dx":-4,"dy":0},{"id":17,"x":40,"y":52,"dx":3,"dy":-1},{"id":16,"x":52,"y":52,"dx":3,"dy":0},{"id":16,"x":11,"y":53,"dx":1,"dy":1},{"id":16,"x":13,"y":53,"dx":-2,"dy":-1},{"id":16,"x":34,"y":53,"dx":-2,"dy":1},{"id":16,"x":52,"y":53,"dx":0,"dy":-1},{"id":16,"x":16,"y":54,"dx":-1,"dy":1},{"id":16,"x":17,"y":54,"dx":0,"dy":1},{"id":15,"x":19,"y":54,"dx":3,"dy":-1},{"id":15,"x":41,"y":54,"dx":-2,"dy":-1},{"id":16,"x":44,"y":54,"dx":1,"dy":-2},{"id":17,"x":6,"y":55,"dx":2,"dy":-2},{"id":15,"x":25,"y":55,"dx":-3,"dy":-1},{"id":15,"x":34,"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,1],[0,3],[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,8],[0,3],[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,10],[0,3],[3,1],[0,3],[3,1],[4,1],[0,1],[1,1],[0,4],[4,5],[0,1],[4,11],[0,2],[4,4],[0,2],[4,3],[0,4],[4,5],[0,1],[4,1],[0,1],[4,1],[0,2],[3,1],[0,2],[3,2],[4,1],[3,1],[4,1],[1,1],[0,4],[4,5],[0,1],[4,17],[0,9],[4,1],[0,1],[4,3],[0,9],[3,1],[4,1],[0,1],[4,1],[3,1],[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,14],[3,1],[0,5],[3,3],[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,12],[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,3],[1,1],[0,13],[4,2],[0,1],[29,1],[0,1],[4,7],[0,15],[3,1],[0,2],[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],[3,1],[0,1],[1,2],[0,14],[4,5],[0,2],[4,1],[0,2],[4,4],[0,1],[4,1],[0,10],[3,1],[0,1],[4,1],[0,2],[4,1],[0,1],[3,1],[0,2],[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],[0,6],[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],[3,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,3],[0,2],[4,1],[0,3],[3,4],[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,5],[3,1],[0,1],[3,6],[0,1],[4,1],[0,2],[4,2],[0,1],[1,1],[0,10],[4,4],[0,1],[4,2],[0,27],[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,2],[28,1],[0,1],[4,1],[0,1],[3,1],[4,2],[1,1],[0,5],[4,4],[0,2],[29,1],[4,3],[0,8],[4,3],[0,1],[4,1],[0,3],[4,4],[0,9],[3,1],[0,1],[3,1],[4,4],[0,1],[4,1],[3,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,4],[3,2],[0,3],[3,1],[0,3],[3,1],[0,1],[3,1],[0,6],[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,1],[0,1],[4,2],[0,8],[3,1],[0,1],[3,1],[0,9],[1,1],[0,1],[4,1],[29,1],[4,4],[0,10],[4,8],[0,5],[4,1],[0,1],[4,3],[0,7],[3,1],[0,9],[28,1],[0,2],[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,2],[3,1],[0,2],[28,1],[0,9],[4,5],[0,2],[4,1],[0,1],[4,5],[0,5],[4,3],[0,4],[3,1],[0,2],[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,6],[4,1],[0,1],[3,1],[0,2],[3,3],[0,1],[29,1],[0,2],[4,3],[0,5],[1,33],[0,1],[1,2],[0,1],[3,1],[4,4],[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,4],[29,1],[0,7],[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,1],[3,1],[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,1],[28,1],[4,4],[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,2],[0,3],[3,1],[0,1],[3,2],[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,3],[0,1],[3,1],[0,1],[4,1],[3,1],[0,2],[3,1],[0,2],[3,4],[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,2],[0,5],[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,28],[4,1],[3,1],[4,1],[3,1],[0,20],[4,4],[0,9],[29,1],[0,1],[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],[3,2],[0,7],[4,2],[0,1],[4,1],[0,20],[4,2],[0,3],[10,1],[0,6],[4,3],[0,1],[3,2],[4,3],[0,1],[4,1],[3,1],[0,7],[4,3],[0,1],[4,1],[0,3],[4,3],[0,1],[4,1],[0,22],[4,2],[0,1],[4,4],[0,1],[3,1],[0,3],[3,1],[0,8],[4,2],[0,1],[4,2],[0,2],[4,6],[0,8],[4,2],[0,12],[3,1],[4,5],[3,5],[0,1],[3,1],[0,6],[28,1],[0,1],[4,2],[0,1],[4,2],[0,2],[4,6],[0,7],[4,3],[0,12],[4,5],[0,1],[4,1],[0,1],[3,1],[0,1],[3,2],[0,1],[3,2],[0,3],[4,1],[0,1],[4,1],[0,7],[4,6],[0,7],[4,2],[0,13],[4,1],[0,1],[4,1],[0,1],[4,2],[0,2],[3,1],[0,2],[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,1],[3,1],[0,4],[3,1],[0,4],[4,6],[0,4],[4,8],[0,5],[4,3],[0,15],[3,1],[0,1],[4,2],[0,3],[3,1],[0,2],[3,3],[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,17],[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,3],[3,1],[0,1],[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,4],[0,2],[3,4],[4,1],[0,1],[4,3],[0,1],[4,2],[0,3],[4,2],[0,13],[4,5],[0,13],[4,3],[3,1],[4,2],[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,6],[0,1],[3,2],[0,3],[3,3],[4,10],[0,15],[4,3],[0,6],[4,1],[0,1],[4,3],[0,1],[3,1],[0,3],[4,1],[0,1],[4,1],[0,3],[3,2],[4,2],[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],[4,1],[3,1],[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,10]]} \ No newline at end of file diff --git a/apps/game/assets/tiles/boulder.png b/apps/game/assets/tiles/boulder.png index 73587b8..7f862e9 100644 --- a/apps/game/assets/tiles/boulder.png +++ b/apps/game/assets/tiles/boulder.png Binary files differ diff --git a/apps/game/assets/tiles/bush.png b/apps/game/assets/tiles/bush.png index df32cd1..ad52b4c 100644 --- a/apps/game/assets/tiles/bush.png +++ b/apps/game/assets/tiles/bush.png Binary files differ diff --git a/apps/game/src/data/map.ts b/apps/game/src/data/map.ts index 4410741..497c11e 100644 --- a/apps/game/src/data/map.ts +++ b/apps/game/src/data/map.ts @@ -239,9 +239,9 @@ } } - // Рощи деревьев по краям. + // Рощи по краям (в основном) и одинокие деревья на полянах. for (let i = 0; i < 240; i++) { - const edge = rng.next() < 0.5; + const edge = rng.next() < 0.8; 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) { @@ -261,6 +261,19 @@ } } + // Пробуждение стартовой поляны: валун, кусты и деревья в первом кадре от + // спавна — новое сразу видно. Ставим с проверкой: не затирать тропу/воду. + const safePlace = (x: number, y: number, id: number) => { + if (tiles[at(x, y)] !== TILES.PATH && tiles[at(x, y)] !== TILES.WATER) tiles[at(x, y)] = id; + }; + safePlace(13, 25, TILES.BOULDER); // у северо-западной тропы + safePlace(20, 32, TILES.BOULDER); + safePlace(11, 30, TILES.BUSH); // южнее поляны + safePlace(19, 24, TILES.BUSH); // восточнее, не на тропе (x>16) + safePlace(12, 21, TILES.TREE); // деревца-ориентиры у поляны + safePlace(13, 22, TILES.TREE); + safePlace(21, 26, TILES.TREE); + // Тропа к Серым прудам: северо-западный угол (переход между локациями). // Вокруг тайлов перехода расчищаем поляну — рощи не должны запирать выход. for (let dy = -1; dy <= 2; dy++) { diff --git a/apps/game/tools/audio/gen.mjs b/apps/game/tools/audio/gen.mjs index 23dc1f8..66986fb 100644 --- a/apps/game/tools/audio/gen.mjs +++ b/apps/game/tools/audio/gen.mjs @@ -177,37 +177,65 @@ /** Амбиент лугов: настоящий ветер — воздушная полоса, порывы шумом, зациклен. */ /** - * Фактура ветра лугов: мягкий низкий шум (120–600 Гц) с «дыханием» — суммой - * медленных волн — и порывами. Возвращает замыкание t → вклад ветра. + * Циклический value-noise: плавная случайная кривая, замкнутая на границе + * лупа (u = t/dur). Сумма двух-трёх кривых с несоизмеримыми шагами — + * огибающая ветра без слышимого периода. */ -function meadowsWind(seed, dur, { gustCount, gustAmp, breathAmp }) { - const air = bandNoise(seed, 120, 600, dur); - const r = makeRng(seed * 31 + 5); - const gusts = []; - for (let i = 0; i < gustCount; i++) { - gusts.push({ at: r() * dur, len: 0.8 + r() * 1.6, amp: (0.5 + r() * 0.5) * gustAmp }); - } - return (t) => { - const breath = - 0.5 + - 0.28 * Math.sin((2 * Math.PI * t) / dur + 1) + - 0.14 * Math.sin((4 * Math.PI * t) / dur + 3.1) + - 0.08 * Math.sin((9 * Math.PI * t) / dur + 5.2); - let v = air() * breathAmp * breath; - for (const g of gusts) { - const d = t - g.at + (t < g.at ? dur : 0); // зациклить порывы - if (d >= 0 && d < g.len) v += air() * g.amp * decay(d, g.len, 1.4); - } - return v; +function slowNoise(seed, steps, phase = 0) { + const r = makeRng(seed); + const v = []; + for (let i = 0; i < steps; i++) v.push(r()); + return (u) => { + const x = (u * steps + phase) % steps; + const i = Math.floor(x); + const k = x - i; + const a = v[i]; + const b = v[(i + 1) % steps]; + const c = (1 - Math.cos(Math.PI * k)) / 2; + return a + (b - a) * c; }; } -/** Шуршание сухой травы: короткие всплески узкой полосы 1.5–3 кГц. */ +/** + * Фактура ветра лугов: широкий «шёпот» воздуха (150–1200 Гц) с плавной + * непериодической огибающей (value-noise), плюс «толща» (60–300 Гц) и тихий + * свист листвы (1.8–3.6 кГц), приходящие только внутри порывов — свист с + * задержкой, как у настоящего шквала. Возвращает замыкание t → вклад ветра. + */ +function meadowsWind(seed, dur, { gustCount, gustAmp, baseAmp }) { + const air = bandNoise(seed, 150, 1200, dur); + const low = bandNoise(seed + 1, 60, 300, dur); + const hiss = bandNoise(seed + 2, 1800, 3600, dur); + const n1 = slowNoise(seed + 3, 4); + const n2 = slowNoise(seed + 4, 9, 3.2); + const r = makeRng(seed * 31 + 5); + const gusts = []; + for (let i = 0; i < gustCount; i++) { + gusts.push({ at: r() * dur, len: 1.5 + r() * 2.5, amp: (0.4 + r() * 0.6) * gustAmp }); + } + return (t) => { + const u = t / dur; + const base = 0.35 + 0.45 * n1(u) + 0.2 * n2(u); + let g = 0; + let hg = 0; + for (const gu of gusts) { + const d = t - gu.at + (t < gu.at ? dur : 0); // зациклить порывы + if (d >= 0 && d < gu.len) { + g += gu.amp * Math.pow(Math.sin(Math.PI * (d / gu.len)), 1.4); + const d2 = d - 0.5; // свист догоняет порыв + if (d2 > 0) hg += gu.amp * Math.pow(Math.sin(Math.PI * Math.min(1, d2 / (gu.len - 0.5))), 1.4); + } + } + return air() * base * baseAmp + low() * g * 0.5 + hiss() * hg * 0.06; + }; +} + +/** Шуршание сухой травы: короткие всплески широкой полосы 1.2–4 кГц. */ function grassRustle(seed, dur, count, amp) { - const rustle = bandNoise(seed, 1500, 3000, dur); + const rustle = bandNoise(seed, 1200, 4000, dur); const r = makeRng(seed * 17 + 3); const bursts = []; - for (let i = 0; i < count; i++) bursts.push({ at: r() * dur, len: 0.1 + r() * 0.25, amp: 0.5 + r() * 0.5 }); + for (let i = 0; i < count; i++) bursts.push({ at: r() * dur, len: 0.08 + r() * 0.2, amp: 0.5 + r() * 0.5 }); return (t) => { let v = 0; for (const b of bursts) { @@ -230,29 +258,25 @@ } /** - * Амбиент лугов: тихий «дыхательный» ветер (мягкий низкий шум с порывами), - * шуршание сухой травы и редкие события — скрипы деревьев, далёкий звон - * Звенца. События распределены неравномерно, луп не «пульсирует». + * Амбиент лугов: настоящий ветер — широкий воздух с непериодической + * огибающей, «толща» и свист только в порывах; шуршание сухой травы и редкие + * события (скрип, далёкий звон Звенца). Луп 12 с — повторы не слышны. */ function ambienceMeadows() { - const dur = 8; - const wind = meadowsWind(62, dur, { gustCount: 5, gustAmp: 0.22, breathAmp: 0.3 }); - const rustle = grassRustle(63, dur, 7, 0.12); - const creaks = [ - woodCreak(0.8, 0.5, 140, 0.1), - woodCreak(3.4, 0.7, 95, 0.12), - woodCreak(6.1, 0.4, 180, 0.08) - ]; + const dur = 12; + const wind = meadowsWind(62, dur, { gustCount: 4, gustAmp: 0.5, baseAmp: 0.5 }); + const rustle = grassRustle(63, dur, 6, 0.08); + const creaks = [woodCreak(2.1, 0.5, 120, 0.06), woodCreak(8.7, 0.6, 90, 0.05)]; const s = synth(dur, (t) => { let v = wind(t) + rustle(t); for (const creak of creaks) v += creak(t); // Далёкий звон Звенца (111 Гц), один за цикл, глухо — сквозь ветер. - const db = t - 5.3; - if (db >= 0 && db < 2) - v += (Math.sin(2 * Math.PI * 111 * db) * 0.05 + Math.sin(2 * Math.PI * 111 * 2.76 * db) * 0.015) * decay(db, 2, 3); + const db = t - 7.2; + if (db >= 0 && db < 1.6) + v += (Math.sin(2 * Math.PI * 111 * db) * 0.04 + Math.sin(2 * Math.PI * 111 * 2.76 * db) * 0.012) * decay(db, 1.6, 3); return v; }); - return loopify(normalize(s, 0.32)); + return loopify(normalize(s, 0.28)); } /** Амбиент прудов: ниже, влажнее, с редкой капелью. */ @@ -302,28 +326,28 @@ } /** - * Ночь на лугах: воздух ниже и плотнее, свиста нет; вдалеке гудит машина - * (Ржавая роща не спит) и изредка доходит колокол Звенца. + * Ночь на лугах: та же фактура ветра, что днём, но глубже, тише и с меньшими + * порывами; вдалеке гудит машина (Ржавая роща не спит) и изредка доходит + * колокол Звенца. */ function ambienceMeadowsNight() { - const dur = 8; - // Та же фактура ветра, что днём, но глубже, тише и с меньшими порывами. - const wind = meadowsWind(72, dur, { gustCount: 3, gustAmp: 0.12, breathAmp: 0.32 }); - const rustle = grassRustle(73, dur, 3, 0.06); + const dur = 12; + const wind = meadowsWind(72, dur, { gustCount: 2, gustAmp: 0.3, baseAmp: 0.32 }); + const rustle = grassRustle(73, dur, 3, 0.05); const hum = bandNoise(74, 40, 160, dur); - const creaks = [woodCreak(2.2, 0.6, 110, 0.07), woodCreak(6.8, 0.5, 90, 0.05)]; + const creaks = [woodCreak(5.4, 0.6, 110, 0.04)]; const s = synth(dur, (t) => { let v = wind(t) + rustle(t); for (const creak of creaks) v += creak(t); // Дальний гул машины: 55 Гц с медленным тремоло, как будто земля дышит. - v += (Math.sin(2 * Math.PI * 55 * t) * 0.08 + hum() * 0.1) * (0.7 + 0.3 * Math.sin(2 * Math.PI * t / 3)); + v += (Math.sin(2 * Math.PI * 55 * t) * 0.07 + hum() * 0.09) * (0.7 + 0.3 * Math.sin(2 * Math.PI * t / 3)); // Далёкий колокол: глухой удар, приходящий сквозь ветер. - const dt = t - 4.6; - if (dt >= 0 && dt < 2) - v += (Math.sin(2 * Math.PI * 111 * dt) * 0.08 + Math.sin(2 * Math.PI * 111 * 2.76 * dt) * 0.025) * decay(dt, 2, 3); + const dt = t - 9.8; + if (dt >= 0 && dt < 1.6) + v += (Math.sin(2 * Math.PI * 111 * dt) * 0.06 + Math.sin(2 * Math.PI * 111 * 2.76 * dt) * 0.02) * decay(dt, 1.6, 3); return v; }); - return loopify(normalize(s, 0.3)); + return loopify(normalize(s, 0.26)); } /** Ночь у прудов: ветер почти стих, вода слышна громче, капли чаще. */ diff --git a/apps/game/tools/pixelart/gen.mjs b/apps/game/tools/pixelart/gen.mjs index b31a9e5..d4fc603 100644 --- a/apps/game/tools/pixelart/gen.mjs +++ b/apps/game/tools/pixelart/gen.mjs @@ -455,10 +455,25 @@ const c = new Canvas(...SIZES.tall.boulder); const r = rng(seed); - // Неровный камень: верхняя грань + две видимые боковые, общий контур. - const top = [[5, 19], [10, 12], [20, 11], [27, 18], [19, 25], [9, 24]]; - const sw = [[5, 19], [9, 24], [12, 30], [3, 24]]; - const se = [[9, 24], [19, 25], [27, 18], [27, 23], [18, 30], [12, 30]]; + // Тень-подошва: тёмный эллипс накрывает центр ground-ромба — камень «стоит». + const ellipse = (cx, cy, rx2, ry2, color) => { + for (let y = -ry2; y <= ry2; y++) { + for (let x = -rx2; x <= rx2; x++) { + if ((x * x) / (rx2 * rx2) + (y * y) / (ry2 * ry2) <= 1) c.set(cx + x, cy + y, color); + } + } + }; + ellipse(16, 28, 14, 4, 'P1'); + for (let i = 0; i < 10; i++) { + const x = 4 + Math.floor(r() * 25); + const y = 25 + Math.floor(r() * 6); + if (c.get(x, y) && r() < 0.5) c.set(x, y, 'P2'); + } + + // Неровный камень: верхняя грань + две видимые боковые, низ до пола слота. + const top = [[4, 18], [10, 10], [22, 9], [28, 17], [20, 24], [8, 23]]; + const sw = [[4, 18], [8, 23], [12, 31], [2, 25]]; + const se = [[8, 23], [20, 24], [28, 17], [28, 22], [18, 31], [12, 31]]; fillPolyRows(c, sw, (y, lx, rx) => { for (let x = lx; x <= rx; x++) c.set(x, y, r() < 0.8 ? 'P4' : 'P5'); }); @@ -469,31 +484,31 @@ for (let x = lx; x <= rx; x++) c.set(x, y, r() < 0.75 ? 'P5' : 'P4'); }); // Блик на верхне-левом склоне и пепел на верхней грани. - c.set(11, 13, 'P5H'); - c.set(12, 12, 'P5H'); - c.set(16, 15, 'P6'); + c.set(11, 11, 'P5H'); + c.set(12, 10, 'P5H'); + c.set(16, 13, 'P6'); for (let i = 0; i < 7; i++) { const x = 10 + Math.floor(r() * 13); - const y = 13 + Math.floor(r() * 9); + const y = 11 + Math.floor(r() * 9); if (c.get(x, y)) c.set(x, y, r() < 0.5 ? 'P6' : 'P4'); } // Трещины: тёмные ломаные по верхней и теневой граням. - line(c, 17, 12, 21, 17, 'P1'); - line(c, 21, 17, 19, 22, 'P1'); - line(c, 9, 24, 13, 28, 'P1'); + line(c, 17, 10, 21, 15, 'P1'); + line(c, 21, 15, 19, 20, 'P1'); + line(c, 9, 23, 13, 28, 'P1'); // Контур по нижнему силуэту и рёбрам граней. - line(c, 3, 24, 12, 30, 'P0'); - line(c, 12, 30, 18, 30, 'P0'); - line(c, 18, 30, 27, 23, 'P0'); - line(c, 5, 19, 9, 24, 'P0'); - line(c, 9, 24, 19, 25, 'P0'); - line(c, 19, 25, 27, 18, 'P0'); + line(c, 2, 25, 12, 31, 'P0'); + line(c, 12, 31, 18, 31, 'P0'); + line(c, 18, 31, 28, 22, 'P0'); + line(c, 4, 18, 8, 23, 'P0'); + line(c, 8, 23, 20, 24, 'P0'); + line(c, 20, 24, 28, 17, 'P0'); return c; } /** - * Большой мёртвый куст 32x40: облако сухих ветвей из эллипсов G0/G1/G2 - * (техника treeTile), стебли G2H наружу, тёплых нет (куст мёртв). + * Большой мёртвый куст 32x40: объёмный — тёмная «нога» ветвей от земли и + * крона-облако над ней (техника treeTile), тень-подошва под основанием. * Tall-объект ~1.25 юнита, непроходим. */ function bushTile(seed = 656) { @@ -506,28 +521,39 @@ } } }; - // Облако: большой центр + два бока, низ гуще (G0). - for (const [cx, cy, rx, ry] of [[16, 24, 11, 9], [8, 28, 6, 5], [24, 27, 6, 5]]) ellipse(cx, cy, rx, ry, 'G0'); - for (const [cx, cy, rx, ry] of [[16, 23, 8, 6], [9, 27, 4, 3], [23, 26, 4, 3]]) ellipse(cx, cy, rx - 1, ry - 1, 'G1'); + // Тень-подошва: накрывает центр ground-ромба — куст «стоит», а не лежит. + ellipse(16, 35, 12, 4, 'P1'); + for (let i = 0; i < 8; i++) { + const x = 5 + Math.floor(r() * 23); + const y = 32 + Math.floor(r() * 6); + if (c.get(x, y) && r() < 0.5) c.set(x, y, 'P2'); + } + + // Нога ветвей: сужается от земли (y=38, half 5) к кроне (y=27, half 1). + for (let y = 27; y <= 38; y++) { + const half = Math.max(1, Math.round((38 - y) * 0.36)); + for (let dx = -half; dx <= half; dx++) c.set(16 + dx, y, r() < 0.75 ? 'G0' : 'G1'); + } + // Крона-облако: центр приподнят, два боковых пучка ниже. + for (const [cx, cy, rx, ry] of [[16, 18, 11, 8], [8, 23, 6, 5], [24, 22, 6, 5]]) ellipse(cx, cy, rx, ry, 'G0'); + for (const [cx, cy, rx, ry] of [[16, 17, 8, 5], [9, 22, 4, 3], [23, 21, 4, 3]]) ellipse(cx, cy, rx - 1, ry - 1, 'G1'); for (let i = 0; i < 22; i++) { const x = 6 + Math.floor(r() * 20); - const y = 17 + Math.floor(r() * 15); + const y = 11 + Math.floor(r() * 15); if (c.get(x, y) && r() < 0.5) c.set(x, y, 'G2'); } // Прорехи (сухой куст) и стебли наружу. - for (const [x, y] of [[12, 20], [21, 26], [9, 29]]) { + for (const [x, y] of [[12, 15], [21, 20], [9, 24]]) { c.set(x, y, null); c.set(x + 1, y, null); } - for (const [x, y] of [[7, 22], [13, 16], [19, 15], [25, 21]]) { + for (const [x, y] of [[7, 17], [13, 10], [19, 9], [25, 16]]) { c.set(x, y, 'G2H'); c.set(x, y + 1, 'G2'); } - // Основание: тень и пепел у корней. - for (let x = 9; x <= 23; x++) c.set(x, 37, 'G0'); - c.set(6, 37, 'P5'); - c.set(26, 37, 'P5'); - c.set(11, 38, 'P4'); + // Пепел у корней по краям тени. + c.set(5, 37, 'P5'); + c.set(27, 37, 'P5'); return c; }