From dcf31e46ed2397b35a7cf32d4903017b35ad0574 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 28 Mar 2024 19:41:20 +0100 Subject: [PATCH] fixes+changes: - fixed windows build, using path, instead of path/filepath - added switch + door, implemented relation (pair_system missing yet) - fixed ldtk map loading, now using correct entitymap.png tileset --- Makefile | 3 + TODO.md | 2 + assets/levels/openquell.ldtk | 433 ++++++++++++++++++++++++++++++++--- assets/loader-levels.go | 75 ++++-- assets/loader-shaders.go | 4 +- assets/loader-sprites.go | 4 +- assets/sprites/entitymap.png | Bin 31771 -> 32219 bytes components/pairs.go | 3 + config/static.go | 2 +- game/levels.go | 11 +- grid/grid.go | 64 +++++- src/entitymap.xcf | Bin 60645 -> 63094 bytes 12 files changed, 541 insertions(+), 60 deletions(-) diff --git a/Makefile b/Makefile index 09cf843..95ce9b4 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,9 @@ build: buildwasm: env GOOS=js GOARCH=wasm go build -o openquell.wasm $(LDFLAGS) . +buildwindows: + GOOS=windows GOARCH=amd64 go build $(LDFLAGS) -o openquell.exe + zipwasm: zip -r openquell-$(SHORTVERSION).zip index.html openquell.wasm wasm_exec.js diff --git a/TODO.md b/TODO.md index 834e3cc..b9559db 100644 --- a/TODO.md +++ b/TODO.md @@ -31,6 +31,8 @@ - Remove Sprite from Tile{}, not used anymore +- Implement pair_system using switch+door, relation is already setup, see grid:189 + ## Collider Rework [abandoned: see branch collider-system, fails] - do not use the map anymore for collision detection diff --git a/assets/levels/openquell.ldtk b/assets/levels/openquell.ldtk index d5484d1..fdb99a6 100644 --- a/assets/levels/openquell.ldtk +++ b/assets/levels/openquell.ldtk @@ -11,7 +11,7 @@ "iid": "267e9380-d7b0-11ee-a97e-35bec9c19d52", "jsonVersion": "1.5.3", "appBuildId": 473703, - "nextUid": 64, + "nextUid": 70, "identifierStyle": "Capitalize", "toc": [], "worldLayout": "Free", @@ -427,6 +427,152 @@ "pivotY": 0, "fieldDefs": [] }, + { + "identifier": "Switch", + "uid": 66, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 32, + "height": 32, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#63C74D", + "renderMode": "Tile", + "showName": true, + "tilesetId": 57, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 57, "x": 96, "y": 160, "w": 32, "h": 32 }, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0, + "pivotY": 0, + "fieldDefs": [ + { + "identifier": "Entity_ref", + "doc": null, + "__type": "EntityRef", + "uid": 69, + "type": "F_EntityRef", + "isArray": false, + "canBeNull": true, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "RefLinkBetweenCenters", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "CurvedArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": null, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySpecificEntity", + "allowedRefsEntityUid": 65, + "allowedRefTags": [], + "tilesetUid": null + } + ] + }, + { + "identifier": "Door", + "uid": 65, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 32, + "height": 32, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#B1EAAA", + "renderMode": "Tile", + "showName": true, + "tilesetId": 57, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 57, "x": 64, "y": 160, "w": 32, "h": 32 }, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0, + "pivotY": 0, + "fieldDefs": [ + { + "identifier": "Entity_ref", + "doc": null, + "__type": "EntityRef", + "uid": 68, + "type": "F_EntityRef", + "isArray": false, + "canBeNull": true, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "RefLinkBetweenCenters", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "CurvedArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": null, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySpecificEntity", + "allowedRefsEntityUid": 66, + "allowedRefTags": [], + "tilesetUid": null + } + ] + }, { "identifier": "HiddenDoor", "uid": 23, @@ -1223,11 +1369,11 @@ "seed": 4985586, "overrideTilesetUid": null, "gridTiles": [ - { "px": [192,128], "src": [128,0], "f": 0, "t": 4, "d": [86], "a": 1 }, + { "px": [192,128], "src": [96,0], "f": 0, "t": 3, "d": [86], "a": 1 }, { "px": [224,128], "src": [64,0], "f": 0, "t": 2, "d": [87], "a": 1 }, { "px": [256,128], "src": [0,0], "f": 0, "t": 0, "d": [88], "a": 1 }, { "px": [288,128], "src": [64,0], "f": 0, "t": 2, "d": [89], "a": 1 }, - { "px": [320,128], "src": [128,0], "f": 0, "t": 4, "d": [90], "a": 1 }, + { "px": [320,128], "src": [96,0], "f": 0, "t": 3, "d": [90], "a": 1 }, { "px": [352,128], "src": [96,0], "f": 0, "t": 3, "d": [91], "a": 1 }, { "px": [384,128], "src": [0,0], "f": 0, "t": 0, "d": [92], "a": 1 }, { "px": [416,128], "src": [0,0], "f": 0, "t": 0, "d": [93], "a": 1 }, @@ -1252,12 +1398,12 @@ { "px": [320,288], "src": [64,0], "f": 0, "t": 2, "d": [190], "a": 1 }, { "px": [416,288], "src": [64,0], "f": 0, "t": 2, "d": [193], "a": 1 }, { "px": [192,320], "src": [64,0], "f": 0, "t": 2, "d": [206], "a": 1 }, - { "px": [224,320], "src": [128,0], "f": 0, "t": 4, "d": [207], "a": 1 }, + { "px": [224,320], "src": [96,0], "f": 0, "t": 3, "d": [207], "a": 1 }, { "px": [256,320], "src": [64,0], "f": 0, "t": 2, "d": [208], "a": 1 }, { "px": [288,320], "src": [0,0], "f": 0, "t": 0, "d": [209], "a": 1 }, { "px": [320,320], "src": [64,0], "f": 0, "t": 2, "d": [210], "a": 1 }, { "px": [352,320], "src": [64,0], "f": 0, "t": 2, "d": [211], "a": 1 }, - { "px": [384,320], "src": [128,0], "f": 0, "t": 4, "d": [212], "a": 1 }, + { "px": [384,320], "src": [96,0], "f": 0, "t": 3, "d": [212], "a": 1 }, { "px": [416,320], "src": [64,0], "f": 0, "t": 2, "d": [213], "a": 1 } ], "entityInstances": [] @@ -1399,10 +1545,10 @@ { "px": [384,128], "src": [64,224], "f": 0, "t": 58, "d": [92], "a": 1 }, { "px": [416,128], "src": [192,192], "f": 0, "t": 54, "d": [93], "a": 1 }, { "px": [448,128], "src": [192,192], "f": 0, "t": 54, "d": [94], "a": 1 }, - { "px": [480,128], "src": [0,224], "f": 0, "t": 56, "d": [95], "a": 1 }, + { "px": [480,128], "src": [128,192], "f": 0, "t": 52, "d": [95], "a": 1 }, { "px": [512,128], "src": [192,192], "f": 0, "t": 54, "d": [96], "a": 1 }, { "px": [96,160], "src": [192,192], "f": 0, "t": 54, "d": [103], "a": 1 }, - { "px": [224,160], "src": [0,224], "f": 0, "t": 56, "d": [107], "a": 1 }, + { "px": [224,160], "src": [128,192], "f": 0, "t": 52, "d": [107], "a": 1 }, { "px": [384,160], "src": [192,192], "f": 0, "t": 54, "d": [112], "a": 1 }, { "px": [512,160], "src": [192,192], "f": 0, "t": 54, "d": [116], "a": 1 }, { "px": [96,192], "src": [192,192], "f": 0, "t": 54, "d": [123], "a": 1 }, @@ -1410,9 +1556,9 @@ { "px": [384,192], "src": [192,192], "f": 0, "t": 54, "d": [132], "a": 1 }, { "px": [512,192], "src": [192,192], "f": 0, "t": 54, "d": [136], "a": 1 }, { "px": [224,224], "src": [192,192], "f": 0, "t": 54, "d": [147], "a": 1 }, - { "px": [384,224], "src": [0,224], "f": 0, "t": 56, "d": [152], "a": 1 }, + { "px": [384,224], "src": [128,192], "f": 0, "t": 52, "d": [152], "a": 1 }, { "px": [96,256], "src": [224,192], "f": 0, "t": 55, "d": [163], "a": 1 }, - { "px": [128,256], "src": [0,224], "f": 0, "t": 56, "d": [164], "a": 1 }, + { "px": [128,256], "src": [128,192], "f": 0, "t": 52, "d": [164], "a": 1 }, { "px": [160,256], "src": [192,192], "f": 0, "t": 54, "d": [165], "a": 1 }, { "px": [192,256], "src": [192,192], "f": 0, "t": 54, "d": [166], "a": 1 }, { "px": [224,256], "src": [192,192], "f": 0, "t": 54, "d": [167], "a": 1 }, @@ -1423,10 +1569,10 @@ { "px": [128,320], "src": [192,192], "f": 0, "t": 54, "d": [204], "a": 1 }, { "px": [160,320], "src": [64,224], "f": 0, "t": 58, "d": [205], "a": 1 }, { "px": [192,320], "src": [192,192], "f": 0, "t": 54, "d": [206], "a": 1 }, - { "px": [224,320], "src": [0,224], "f": 0, "t": 56, "d": [207], "a": 1 }, + { "px": [224,320], "src": [128,192], "f": 0, "t": 52, "d": [207], "a": 1 }, { "px": [384,320], "src": [192,192], "f": 0, "t": 54, "d": [212], "a": 1 }, { "px": [416,320], "src": [192,192], "f": 0, "t": 54, "d": [213], "a": 1 }, - { "px": [448,320], "src": [0,224], "f": 0, "t": 56, "d": [214], "a": 1 }, + { "px": [448,320], "src": [128,192], "f": 0, "t": 52, "d": [214], "a": 1 }, { "px": [480,320], "src": [224,192], "f": 0, "t": 55, "d": [215], "a": 1 }, { "px": [512,320], "src": [192,192], "f": 0, "t": 54, "d": [216], "a": 1 } ], @@ -2154,14 +2300,14 @@ { "px": [288,128], "src": [32,0], "f": 0, "t": 1, "d": [89], "a": 1 }, { "px": [320,128], "src": [64,0], "f": 0, "t": 2, "d": [90], "a": 1 }, { "px": [352,128], "src": [0,0], "f": 0, "t": 0, "d": [91], "a": 1 }, - { "px": [384,128], "src": [128,0], "f": 0, "t": 4, "d": [92], "a": 1 }, + { "px": [384,128], "src": [96,0], "f": 0, "t": 3, "d": [92], "a": 1 }, { "px": [192,160], "src": [64,0], "f": 0, "t": 2, "d": [106], "a": 1 }, { "px": [416,160], "src": [32,0], "f": 0, "t": 1, "d": [113], "a": 1 }, { "px": [160,192], "src": [64,0], "f": 0, "t": 2, "d": [125], "a": 1 }, { "px": [192,192], "src": [96,0], "f": 0, "t": 3, "d": [126], "a": 1 }, - { "px": [416,192], "src": [128,0], "f": 0, "t": 4, "d": [133], "a": 1 }, + { "px": [416,192], "src": [96,0], "f": 0, "t": 3, "d": [133], "a": 1 }, { "px": [448,192], "src": [0,0], "f": 0, "t": 0, "d": [134], "a": 1 }, - { "px": [128,224], "src": [128,0], "f": 0, "t": 4, "d": [144], "a": 1 }, + { "px": [128,224], "src": [96,0], "f": 0, "t": 3, "d": [144], "a": 1 }, { "px": [160,224], "src": [0,0], "f": 0, "t": 0, "d": [145], "a": 1 }, { "px": [192,224], "src": [32,0], "f": 0, "t": 1, "d": [146], "a": 1 }, { "px": [416,224], "src": [0,0], "f": 0, "t": 0, "d": [153], "a": 1 }, @@ -2181,7 +2327,7 @@ { "px": [384,320], "src": [64,0], "f": 0, "t": 2, "d": [212], "a": 1 }, { "px": [256,352], "src": [64,0], "f": 0, "t": 2, "d": [228], "a": 1 }, { "px": [288,352], "src": [0,0], "f": 0, "t": 0, "d": [229], "a": 1 }, - { "px": [320,352], "src": [128,0], "f": 0, "t": 4, "d": [230], "a": 1 }, + { "px": [320,352], "src": [96,0], "f": 0, "t": 3, "d": [230], "a": 1 }, { "px": [352,352], "src": [32,0], "f": 0, "t": 1, "d": [231], "a": 1 }, { "px": [288,384], "src": [64,0], "f": 0, "t": 2, "d": [249], "a": 1 }, { "px": [320,384], "src": [0,0], "f": 0, "t": 0, "d": [250], "a": 1 } @@ -2447,7 +2593,7 @@ "gridTiles": [ { "px": [160,64], "src": [224,160], "f": 0, "t": 47, "d": [45], "a": 1 }, { "px": [288,64], "src": [224,160], "f": 0, "t": 47, "d": [49], "a": 1 }, - { "px": [128,96], "src": [96,192], "f": 0, "t": 51, "d": [64], "a": 1 }, + { "px": [128,96], "src": [224,160], "f": 0, "t": 47, "d": [64], "a": 1 }, { "px": [256,96], "src": [224,160], "f": 0, "t": 47, "d": [68], "a": 1 }, { "px": [96,128], "src": [224,160], "f": 0, "t": 47, "d": [83], "a": 1 }, { "px": [224,128], "src": [224,160], "f": 0, "t": 47, "d": [87], "a": 1 }, @@ -2458,7 +2604,7 @@ { "px": [32,256], "src": [224,160], "f": 0, "t": 47, "d": [161], "a": 1 }, { "px": [64,288], "src": [224,160], "f": 0, "t": 47, "d": [182], "a": 1 }, { "px": [256,320], "src": [224,160], "f": 0, "t": 47, "d": [208], "a": 1 }, - { "px": [288,352], "src": [128,192], "f": 0, "t": 52, "d": [229], "a": 1 }, + { "px": [288,352], "src": [224,160], "f": 0, "t": 47, "d": [229], "a": 1 }, { "px": [320,384], "src": [224,160], "f": 0, "t": 47, "d": [250], "a": 1 }, { "px": [352,416], "src": [224,160], "f": 0, "t": 47, "d": [271], "a": 1 } ], @@ -2692,19 +2838,19 @@ { "px": [128,96], "src": [64,0], "f": 0, "t": 2, "d": [64], "a": 1 }, { "px": [192,96], "src": [64,0], "f": 0, "t": 2, "d": [66], "a": 1 }, { "px": [224,96], "src": [64,0], "f": 0, "t": 2, "d": [67], "a": 1 }, - { "px": [256,96], "src": [128,0], "f": 0, "t": 4, "d": [68], "a": 1 }, + { "px": [256,96], "src": [96,0], "f": 0, "t": 3, "d": [68], "a": 1 }, { "px": [288,96], "src": [64,0], "f": 0, "t": 2, "d": [69], "a": 1 }, { "px": [320,96], "src": [96,0], "f": 0, "t": 3, "d": [70], "a": 1 }, { "px": [352,96], "src": [64,0], "f": 0, "t": 2, "d": [71], "a": 1 }, { "px": [384,96], "src": [64,0], "f": 0, "t": 2, "d": [72], "a": 1 }, - { "px": [416,96], "src": [128,0], "f": 0, "t": 4, "d": [73], "a": 1 }, + { "px": [416,96], "src": [96,0], "f": 0, "t": 3, "d": [73], "a": 1 }, { "px": [448,96], "src": [96,0], "f": 0, "t": 3, "d": [74], "a": 1 }, { "px": [480,96], "src": [64,0], "f": 0, "t": 2, "d": [75], "a": 1 }, { "px": [128,128], "src": [64,0], "f": 0, "t": 2, "d": [84], "a": 1 }, { "px": [480,128], "src": [64,0], "f": 0, "t": 2, "d": [95], "a": 1 }, - { "px": [128,160], "src": [128,0], "f": 0, "t": 4, "d": [104], "a": 1 }, + { "px": [128,160], "src": [96,0], "f": 0, "t": 3, "d": [104], "a": 1 }, { "px": [352,160], "src": [96,0], "f": 0, "t": 3, "d": [111], "a": 1 }, - { "px": [480,160], "src": [128,0], "f": 0, "t": 4, "d": [115], "a": 1 }, + { "px": [480,160], "src": [96,0], "f": 0, "t": 3, "d": [115], "a": 1 }, { "px": [256,192], "src": [64,0], "f": 0, "t": 2, "d": [128], "a": 1 }, { "px": [480,192], "src": [64,0], "f": 0, "t": 2, "d": [135], "a": 1 }, { "px": [128,224], "src": [64,0], "f": 0, "t": 2, "d": [144], "a": 1 }, @@ -2713,11 +2859,11 @@ { "px": [224,224], "src": [64,0], "f": 0, "t": 2, "d": [147], "a": 1 }, { "px": [256,224], "src": [64,0], "f": 0, "t": 2, "d": [148], "a": 1 }, { "px": [288,224], "src": [64,0], "f": 0, "t": 2, "d": [149], "a": 1 }, - { "px": [320,224], "src": [128,0], "f": 0, "t": 4, "d": [150], "a": 1 }, + { "px": [320,224], "src": [96,0], "f": 0, "t": 3, "d": [150], "a": 1 }, { "px": [352,224], "src": [64,0], "f": 0, "t": 2, "d": [151], "a": 1 }, { "px": [480,224], "src": [64,0], "f": 0, "t": 2, "d": [155], "a": 1 }, - { "px": [128,256], "src": [128,0], "f": 0, "t": 4, "d": [164], "a": 1 }, - { "px": [480,256], "src": [128,0], "f": 0, "t": 4, "d": [175], "a": 1 }, + { "px": [128,256], "src": [96,0], "f": 0, "t": 3, "d": [164], "a": 1 }, + { "px": [480,256], "src": [96,0], "f": 0, "t": 3, "d": [175], "a": 1 }, { "px": [128,288], "src": [64,0], "f": 0, "t": 2, "d": [184], "a": 1 }, { "px": [192,288], "src": [64,0], "f": 0, "t": 2, "d": [186], "a": 1 }, { "px": [480,288], "src": [64,0], "f": 0, "t": 2, "d": [195], "a": 1 }, @@ -2726,11 +2872,11 @@ { "px": [480,320], "src": [64,0], "f": 0, "t": 2, "d": [215], "a": 1 }, { "px": [128,352], "src": [64,0], "f": 0, "t": 2, "d": [224], "a": 1 }, { "px": [192,352], "src": [64,0], "f": 0, "t": 2, "d": [226], "a": 1 }, - { "px": [224,352], "src": [128,0], "f": 0, "t": 4, "d": [227], "a": 1 }, + { "px": [224,352], "src": [96,0], "f": 0, "t": 3, "d": [227], "a": 1 }, { "px": [256,352], "src": [64,0], "f": 0, "t": 2, "d": [228], "a": 1 }, - { "px": [288,352], "src": [128,0], "f": 0, "t": 4, "d": [229], "a": 1 }, + { "px": [288,352], "src": [96,0], "f": 0, "t": 3, "d": [229], "a": 1 }, { "px": [320,352], "src": [64,0], "f": 0, "t": 2, "d": [230], "a": 1 }, - { "px": [352,352], "src": [128,0], "f": 0, "t": 4, "d": [231], "a": 1 }, + { "px": [352,352], "src": [96,0], "f": 0, "t": 3, "d": [231], "a": 1 }, { "px": [384,352], "src": [64,0], "f": 0, "t": 2, "d": [232], "a": 1 }, { "px": [416,352], "src": [96,0], "f": 0, "t": 3, "d": [233], "a": 1 }, { "px": [448,352], "src": [64,0], "f": 0, "t": 2, "d": [234], "a": 1 }, @@ -5621,7 +5767,7 @@ "__bgPos": { "topLeftPx": [0,0], "scale": [1,1], "cropRect": [0,0,640,480] }, "externalRelPath": null, "fieldInstances": [ - { "__identifier": "level", "__type": "Int", "__value": 12, "__tile": null, "defUid": 11, "realEditorValues": [{ "id": "V_Int", "params": [12] }] }, + { "__identifier": "level", "__type": "Int", "__value": 20, "__tile": null, "defUid": 11, "realEditorValues": [{ "id": "V_Int", "params": [20] }] }, { "__identifier": "description", "__type": "String", "__value": "Take care of each other", "__tile": null, "defUid": 12, "realEditorValues": [{ "id": "V_String", "params": ["Take care of each other"] @@ -5828,6 +5974,237 @@ } ], "__neighbours": [] + }, + { + "identifier": "Machines", + "iid": "50621a80-d7b0-11ee-968e-a98c2d35fbdb", + "uid": 64, + "worldX": -224, + "worldY": 2752, + "worldDepth": 0, + "pxWid": 640, + "pxHei": 480, + "__bgColor": "#696A79", + "bgColor": null, + "useAutoIdentifier": false, + "bgRelPath": "../sprites/background-lila.png", + "bgPos": "Cover", + "bgPivotX": 0.5, + "bgPivotY": 0.5, + "__smartColor": "#ADADB5", + "__bgPos": { "topLeftPx": [0,0], "scale": [1,1], "cropRect": [0,0,640,480] }, + "externalRelPath": null, + "fieldInstances": [ + { "__identifier": "level", "__type": "Int", "__value": 21, "__tile": null, "defUid": 11, "realEditorValues": [{ "id": "V_Int", "params": [21] }] }, + { "__identifier": "description", "__type": "String", "__value": "Use the switch to open the door", "__tile": null, "defUid": 12, "realEditorValues": [{ + "id": "V_String", + "params": ["Use the switch to open the door"] + }] }, + { "__identifier": "background", "__type": "String", "__value": "background-lila", "__tile": null, "defUid": 13, "realEditorValues": [] }, + { "__identifier": "minmoves", "__type": "Int", "__value": 7, "__tile": null, "defUid": 14, "realEditorValues": [] } + ], + "layerInstances": [ + { + "__identifier": "Entities", + "__type": "Entities", + "__cWid": 20, + "__cHei": 15, + "__gridSize": 32, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": null, + "__tilesetRelPath": null, + "iid": "50624190-d7b0-11ee-968e-3dbcbdc42f40", + "levelId": 64, + "layerDefUid": 5, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 4917353, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [ + { + "__identifier": "PlayerSecondary", + "__grid": [9,5], + "__pivot": [0,0], + "__tags": [], + "__tile": { "tilesetUid": 57, "x": 64, "y": 0, "w": 32, "h": 32 }, + "__smartColor": "#272DC5", + "iid": "758dd4b0-d7b0-11ee-9add-dbfe89124029", + "width": 32, + "height": 32, + "defUid": 36, + "px": [288,160], + "fieldInstances": [], + "__worldX": 64, + "__worldY": 2912 + }, + { + "__identifier": "PlayerPrimary", + "__grid": [14,9], + "__pivot": [0,0], + "__tags": [], + "__tile": { "tilesetUid": 57, "x": 32, "y": 0, "w": 32, "h": 32 }, + "__smartColor": "#2F3BBE", + "iid": "78ccac00-d7b0-11ee-9add-f91552f3c021", + "width": 32, + "height": 32, + "defUid": 3, + "px": [448,288], + "fieldInstances": [], + "__worldX": 224, + "__worldY": 3040 + }, + { + "__identifier": "Switch", + "__grid": [11,5], + "__pivot": [0,0], + "__tags": [], + "__tile": { "tilesetUid": 57, "x": 96, "y": 160, "w": 32, "h": 32 }, + "__smartColor": "#63C74D", + "iid": "7d975370-d7b0-11ee-9add-971995295000", + "width": 32, + "height": 32, + "defUid": 66, + "px": [352,160], + "fieldInstances": [{ "__identifier": "Entity_ref", "__type": "EntityRef", "__value": { + "entityIid": "81e502b0-d7b0-11ee-9add-6193c766edeb", + "layerIid": "50624190-d7b0-11ee-968e-3dbcbdc42f40", + "levelIid": "50621a80-d7b0-11ee-968e-a98c2d35fbdb", + "worldIid": "267ee1a0-d7b0-11ee-a97e-53f0a359eae1" + }, "__tile": null, "defUid": 69, "realEditorValues": [{ + "id": "V_String", + "params": ["81e502b0-d7b0-11ee-9add-6193c766edeb"] + }] }], + "__worldX": 128, + "__worldY": 2912 + }, + { + "__identifier": "Door", + "__grid": [7,7], + "__pivot": [0,0], + "__tags": [], + "__tile": { "tilesetUid": 57, "x": 64, "y": 160, "w": 32, "h": 32 }, + "__smartColor": "#B1EAAA", + "iid": "81e502b0-d7b0-11ee-9add-6193c766edeb", + "width": 32, + "height": 32, + "defUid": 65, + "px": [224,224], + "fieldInstances": [{ "__identifier": "Entity_ref", "__type": "EntityRef", "__value": null, "__tile": null, "defUid": 68, "realEditorValues": [] }], + "__worldX": 0, + "__worldY": 2976 + }, + { + "__identifier": "ObstacleNorth", + "__grid": [8,6], + "__pivot": [0,0], + "__tags": [], + "__tile": { "tilesetUid": 57, "x": 64, "y": 32, "w": 32, "h": 32 }, + "__smartColor": "#F77622", + "iid": "9b781960-d7b0-11ee-9add-e1d2013b29e2", + "width": 32, + "height": 32, + "defUid": 9, + "px": [256,192], + "fieldInstances": [], + "__worldX": 32, + "__worldY": 2944 + }, + { + "__identifier": "Collectible", + "__grid": [5,5], + "__pivot": [0,0], + "__tags": [], + "__tile": { "tilesetUid": 57, "x": 0, "y": 64, "w": 32, "h": 32 }, + "__smartColor": "#FEAE34", + "iid": "a056be00-d7b0-11ee-9add-01e4d4e8f475", + "width": 32, + "height": 32, + "defUid": 4, + "px": [160,160], + "fieldInstances": [], + "__worldX": -64, + "__worldY": 2912 + } + ] + }, + { + "__identifier": "Tiles", + "__type": "Tiles", + "__cWid": 20, + "__cHei": 15, + "__gridSize": 32, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 50, + "__tilesetRelPath": "../sprites/primarymap.png", + "iid": "50624191-d7b0-11ee-968e-b9865cb1b5c1", + "levelId": 64, + "layerDefUid": 2, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 6697541, + "overrideTilesetUid": null, + "gridTiles": [ + { "px": [128,128], "src": [224,352], "f": 0, "t": 95, "d": [84], "a": 1 }, + { "px": [160,128], "src": [224,352], "f": 0, "t": 95, "d": [85], "a": 1 }, + { "px": [192,128], "src": [224,352], "f": 0, "t": 95, "d": [86], "a": 1 }, + { "px": [224,128], "src": [224,352], "f": 0, "t": 95, "d": [87], "a": 1 }, + { "px": [256,128], "src": [224,352], "f": 0, "t": 95, "d": [88], "a": 1 }, + { "px": [288,128], "src": [224,352], "f": 0, "t": 95, "d": [89], "a": 1 }, + { "px": [320,128], "src": [224,352], "f": 0, "t": 95, "d": [90], "a": 1 }, + { "px": [352,128], "src": [224,352], "f": 0, "t": 95, "d": [91], "a": 1 }, + { "px": [384,128], "src": [224,352], "f": 0, "t": 95, "d": [92], "a": 1 }, + { "px": [416,128], "src": [224,352], "f": 0, "t": 95, "d": [93], "a": 1 }, + { "px": [448,128], "src": [224,352], "f": 0, "t": 95, "d": [94], "a": 1 }, + { "px": [480,128], "src": [224,352], "f": 0, "t": 95, "d": [95], "a": 1 }, + { "px": [128,160], "src": [224,352], "f": 0, "t": 95, "d": [104], "a": 1 }, + { "px": [224,160], "src": [224,352], "f": 0, "t": 95, "d": [107], "a": 1 }, + { "px": [320,160], "src": [224,352], "f": 0, "t": 95, "d": [110], "a": 1 }, + { "px": [480,160], "src": [224,352], "f": 0, "t": 95, "d": [115], "a": 1 }, + { "px": [128,192], "src": [224,352], "f": 0, "t": 95, "d": [124], "a": 1 }, + { "px": [224,192], "src": [224,352], "f": 0, "t": 95, "d": [127], "a": 1 }, + { "px": [320,192], "src": [224,352], "f": 0, "t": 95, "d": [130], "a": 1 }, + { "px": [480,192], "src": [224,352], "f": 0, "t": 95, "d": [135], "a": 1 }, + { "px": [128,224], "src": [224,352], "f": 0, "t": 95, "d": [144], "a": 1 }, + { "px": [320,224], "src": [224,352], "f": 0, "t": 95, "d": [150], "a": 1 }, + { "px": [480,224], "src": [224,352], "f": 0, "t": 95, "d": [155], "a": 1 }, + { "px": [128,256], "src": [224,352], "f": 0, "t": 95, "d": [164], "a": 1 }, + { "px": [224,256], "src": [224,352], "f": 0, "t": 95, "d": [167], "a": 1 }, + { "px": [320,256], "src": [224,352], "f": 0, "t": 95, "d": [170], "a": 1 }, + { "px": [480,256], "src": [224,352], "f": 0, "t": 95, "d": [175], "a": 1 }, + { "px": [128,288], "src": [224,352], "f": 0, "t": 95, "d": [184], "a": 1 }, + { "px": [224,288], "src": [224,352], "f": 0, "t": 95, "d": [187], "a": 1 }, + { "px": [320,288], "src": [224,352], "f": 0, "t": 95, "d": [190], "a": 1 }, + { "px": [480,288], "src": [224,352], "f": 0, "t": 95, "d": [195], "a": 1 }, + { "px": [128,320], "src": [224,352], "f": 0, "t": 95, "d": [204], "a": 1 }, + { "px": [160,320], "src": [224,352], "f": 0, "t": 95, "d": [205], "a": 1 }, + { "px": [192,320], "src": [224,352], "f": 0, "t": 95, "d": [206], "a": 1 }, + { "px": [224,320], "src": [224,352], "f": 0, "t": 95, "d": [207], "a": 1 }, + { "px": [256,320], "src": [224,352], "f": 0, "t": 95, "d": [208], "a": 1 }, + { "px": [288,320], "src": [224,352], "f": 0, "t": 95, "d": [209], "a": 1 }, + { "px": [320,320], "src": [224,352], "f": 0, "t": 95, "d": [210], "a": 1 }, + { "px": [352,320], "src": [224,352], "f": 0, "t": 95, "d": [211], "a": 1 }, + { "px": [384,320], "src": [224,352], "f": 0, "t": 95, "d": [212], "a": 1 }, + { "px": [416,320], "src": [224,352], "f": 0, "t": 95, "d": [213], "a": 1 }, + { "px": [448,320], "src": [224,352], "f": 0, "t": 95, "d": [214], "a": 1 }, + { "px": [480,320], "src": [224,352], "f": 0, "t": 95, "d": [215], "a": 1 } + ], + "entityInstances": [] + } + ], + "__neighbours": [] } ], "worlds": [], diff --git a/assets/loader-levels.go b/assets/loader-levels.go index 163cfbe..e44b982 100644 --- a/assets/loader-levels.go +++ b/assets/loader-levels.go @@ -17,7 +17,7 @@ var Tiles = InitTiles() // Tile: contains image, identifier (as used in level data) and // additional properties type Tile struct { - Id byte + Id, Ref string Sprite *ebiten.Image Class string Solid bool // wall brick @@ -35,11 +35,15 @@ type Tile struct { Direction int // obstacle business end shows into this direction Shader *ebiten.Shader Alpha *ebiten.Image + Bond bool // denotes an entity which can have a relation to another + Door bool // a door, can be manipulated by a switch + Switch bool // opens|closes a door } func (tile *Tile) Clone() *Tile { newtile := &Tile{ Id: tile.Id, + Ref: tile.Ref, Sprite: tile.Sprite, Class: tile.Class, Solid: tile.Solid, @@ -57,6 +61,9 @@ func (tile *Tile) Clone() *Tile { Direction: tile.Direction, Alpha: tile.Alpha, Shader: tile.Shader, + Bond: tile.Bond, + Door: tile.Door, + Switch: tile.Switch, } return newtile @@ -67,9 +74,18 @@ const ( Secondary bool = false ) +func GetSprites(class []string) []*ebiten.Image { + sprites := []*ebiten.Image{} + + for _, sprite := range class { + sprites = append(sprites, Assets[sprite]) + } + + return sprites +} + func NewTilePlayer(isprimary bool) *Tile { tile := &Tile{ - Id: 'S', Class: "sphere", Renderable: true, Player: true, @@ -82,7 +98,6 @@ func NewTilePlayer(isprimary bool) *Tile { tile.Sprite = Assets["sphere-blue"] case Secondary: tile.Sprite = Assets["sphere-blue-secondary"] - tile.Id = 's' } // primary sprite is always the first one @@ -92,7 +107,6 @@ func NewTilePlayer(isprimary bool) *Tile { func NewTileBlock(class string) *Tile { return &Tile{ - Id: '#', Sprite: Assets[class], Class: class, Solid: true, @@ -102,7 +116,6 @@ func NewTileBlock(class string) *Tile { func NewTileCollectible(class string) *Tile { return &Tile{ - Id: 'o', Sprite: Assets[class], Class: class, Solid: false, @@ -113,7 +126,6 @@ func NewTileCollectible(class string) *Tile { func NewTileObstacle(class string, direction int) *Tile { return &Tile{ - Id: '+', Sprite: Assets[class], Class: class, Solid: false, @@ -125,14 +137,9 @@ func NewTileObstacle(class string, direction int) *Tile { } func NewTileParticle(class []string) *Tile { - sprites := []*ebiten.Image{} - - for _, sprite := range class { - sprites = append(sprites, Assets[sprite]) - } + sprites := GetSprites(class) return &Tile{ - Id: '*', Class: "particle", Solid: false, Renderable: false, @@ -142,29 +149,21 @@ func NewTileParticle(class []string) *Tile { } func NewTileTranswall(class []string) *Tile { - sprites := []*ebiten.Image{} - names := []string{} - - for _, sprite := range class { - sprites = append(sprites, Assets[sprite]) - names = append(names, sprite) - } + sprites := GetSprites(class) return &Tile{ - Id: 't', Class: "transwall", Solid: false, Renderable: true, Transient: true, Tiles: sprites, Sprite: sprites[0], // initially use the first - TileNames: names, + TileNames: class, } } func NewTileHiddenDoor(class, alpha string) *Tile { return &Tile{ - Id: 'W', Class: "hiddendoor", Solid: false, Renderable: true, @@ -175,12 +174,40 @@ func NewTileHiddenDoor(class, alpha string) *Tile { } } +func NewTileSwitch(class []string) *Tile { + sprites := GetSprites(class) + + return &Tile{ + Class: "switch", + Solid: false, + Renderable: true, + Bond: true, + Switch: true, + Tiles: sprites, + Sprite: sprites[0], // initially use the first + } +} + +func NewTileDoor(class []string) *Tile { + sprites := GetSprites(class) + + return &Tile{ + Class: "door", + Solid: false, + Renderable: true, + Bond: true, + Door: true, + Tiles: sprites, + Sprite: sprites[0], // initially use the first + } +} + // used to map level data bytes to actual tiles type TileRegistry map[string]*Tile func InitTiles() TileRegistry { return TileRegistry{ - "floor": {Id: ' ', Class: "floor", Renderable: false}, + "floor": {Class: "floor", Renderable: false}, "default": NewTileBlock("block-greycolored"), "solidorange": NewTileBlock("block-orange-32"), "PlayerPrimary": NewTilePlayer(Primary), @@ -213,6 +240,8 @@ func InitTiles() TileRegistry { "HiddenDoor11": NewTileHiddenDoor("block-greycolored", "damage"), "HiddenDoor12": NewTileHiddenDoor("block-greycolored", "damage"), "HiddenDoor13": NewTileHiddenDoor("block-greycolored", "damage"), + "Switch": NewTileSwitch([]string{"switch-open.png", "switch-closed.png"}), + "Door": NewTileDoor([]string{"door-open.png", "door-closed.png"}), } } diff --git a/assets/loader-shaders.go b/assets/loader-shaders.go index ea786fe..1281263 100644 --- a/assets/loader-shaders.go +++ b/assets/loader-shaders.go @@ -4,7 +4,7 @@ import ( "bytes" "log" "log/slog" - "path/filepath" + "path" "strings" "github.com/hajimehoshi/ebiten/v2" @@ -23,7 +23,7 @@ func LoadShaders(dir string) ShaderRegistry { } for _, file := range entries { - path := filepath.Join(dir, file.Name()) + path := path.Join(dir, file.Name()) fd, err := assetfs.Open(path) if err != nil { log.Fatalf("failed to open shader file %s: %s", file.Name(), err) diff --git a/assets/loader-sprites.go b/assets/loader-sprites.go index 90735a3..933484c 100644 --- a/assets/loader-sprites.go +++ b/assets/loader-sprites.go @@ -6,7 +6,7 @@ import ( _ "image/png" "log" "log/slog" - "path/filepath" + "path" "strings" "github.com/hajimehoshi/ebiten/v2" @@ -30,7 +30,7 @@ func LoadImages(dir string) AssetRegistry { } for _, imagefile := range entries { - path := filepath.Join(dir, imagefile.Name()) + path := path.Join(dir, imagefile.Name()) fd, err := assetfs.Open(path) if err != nil { log.Fatalf("failed to open image file %s: %s", imagefile.Name(), err) diff --git a/assets/sprites/entitymap.png b/assets/sprites/entitymap.png index 25ce9b7ca586662e68df6bb2090a02af32749959..aa7aa952af0aaef4720184dd769fff4c181a2a9b 100644 GIT binary patch delta 16374 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 delta 15923 zcmXwg1y~ea*!I#5OE*isup%NQ-6@KcfS`hOiG(yP3|-PHB_SaosI-7|cZo=MmozN> zAHM(lxVX4xch1b5^Td7M&vS;U3ye=_j5sCe9=ki-txGF?JDYt`w@53PFiYQNw0ZgW zeVgBLxz%EXKXCA5X^Kes27XCY69&%Xg_j4t&wlp--IzPX-VwCqS66#l?SqGAq|Qq< za+VwA#B6+6hg=1+Um_NsF~Kzv0A#p1DVq`{JUQ7F=PV723%Vq z_F2}9*$UTzi#Bro1gb@sMdu*ChnHP$6Dy(v%3)VhLS`1f58KGivc{X=;*}?4QD~B@ zQtRcQpud(OhcwoeI_BSf4roIUCVK?OY-3m>lzHWYVe}6^Xa|JQeP_7C^}8Z-Z;wpe zFaD)qO^?a4fgCjtXD8V;USsV8qW6>zjygyT*T(UaP9%I9C)I80TIT1@DgoRR_eaIg z#z~l!j9PJ3Q7eD%_cJII3Ty_cp{o=#H2FP#L-uSL>N3wg|^GjQ$7rs%5cFW75eF(fw|$Ti=8 z_dpAa@uG}>sP-Ms$(LFjANR=%{uzd0N1h{!G0}5O0+Zr}XZ;b_ zb*5*&8l28=VWN107WRTN(JwP7hr}&x{45UPnw>P&jX@rm++^_o{ zZ790laZ>QoG`4qSg>6kbTI{V^+8%6{3s@Lq-Y8;jqyo?eS|1Hlwd?+Cr!Aq1bA zverq{dJ3Fv{@o@`-%AqadII^6Y`>^P&gX6#ub<&wSfKolVgzNFmrfBeCv+qDmO_F4g@od(?udDhf17fbsY~+4Z+(7otCG>5F12pS7w``Ij zTJ7=y(aw=JxA0dunPahv5+|+W3*De3sc#;9!IdyWD@@_#krW%}$ zNAPm6(!~}AV}+?H$?M9<`boZJdYXY82#YnfvSSEjZIYx7C7ZZ% z)mT!(Pet0s=UrWa7Q~FiyNIT+pX%tHWY@nO@zj}9{M}`Czluyd9x^x^pl0U3@yjPu zgAZ?4mHu$dvKV!)N(g4}F}Uw&l5Z#%WHmo7awIvmUL{%LDv8YyGdXVLk!k9Ej`>C{gol)M?%M-4ylFTa>-N6+G_^v`>y~>w z$p_JF-*8LT-HAkm z3p(mURc6`m$Ig%@ZA$K%FrDL{QS#h>$TAOIE^-el3w0yw6j8q@K>|8 z#*!;bsoCGX8~eIa0{W@rnRjPkA|EwXPa{5do^GAt?yS0ca43o(X@uxhOpbu8ti)Und}{iwE} z*#bo6{yv1y<{JMcz_1g4jl8)VJ-0x2gKX~HP?x$``zT+P*X+8ye;K}FF4^uoyQdo8 zHaa?*b+Mm2RP$;?INaG0o4bS3(`Az)bw-3?hDHhBDGa5BO@HeA^6afVh0@EY zjHX;!!Y9W$j#Kzu#x{kB1Xi<2%64EzXmF+j@yt&Uh7>%sS=)+}4obcsCZ)w8 zb2MetB|~e`_&OZM^6{_q{bIy}1KU4`IhnJWf6o=y8U~|R?Rnbi8s2y9;~E(mG@S>? zk3p)r9{U_^*?M@|QiX9#m!dpjYsG7=FlP+oQ;%#MgkW3j)+4s?{1_KJ!Y|Tx~>;u zO8a~Mt*)vkLPE-3@>O}vuq+RD)FZq*u3~Qft$wklU5Jl8-+%mwamBP|4rt6Tr)iQL z_{`DuGbR%@*{-ET?iqp(0ga4MSeGq0ScHE=__J5=~lLBx(tP<$l z2pJgsDP)k1fZh8$X`emyKTrHKNi|oyd!AM;;Vhq8x*=zp{u#pa85Yh=BK_h+_5XIg zhM*6NqCNEJKe4kTTN^2Kih?0P`_z6rWNa(H&7@o+6#J(PQCq(-e05>6X= zobLziuM0~BuT`l7=?J9gYU+jy^mlpZ#cEMqaiU}mQ(qBcAz9j$5QbN6O4!gY@#^xa zWO$9R(g#?X70!+y-fROAOLs__o@}y~fC0RRqh{!zN1Wa2o{0xmeIm|d$82kZ^%v3) zS*T}zMYNq!?)C85TNK8jc+S6*N{~=$KZCz=Wk^2TaU{7DpsM$;AbzPO!8*6EHw-(U za&N$Sa@dSkv)^3$0n|5irt9=!v(p28$;EMnG;03i#)TWt(A9aV?RAZm@9M@;v7{MD z<0IVaxl!&<*v5&Q&ZiUg^)6JI^e@FW1*< znhq<1)+&RU-B7y2>jju`lsFFwxt0#Ed{grl4pw>xOMI-q&qWZ|m5UW~a4$SngTZkO zgJ0$!BbGIgBN z(Q_J!(Z8QJxg+^q+~~xaUm#|}wmsN91!FWSaZZ)s9wVCL%VgH)9=ffaNfFXHiw#1& zV$8f5sR+RYp~PD%Bv13jQf2FbcT0Kxhh8HQDa=U{VTsT_yQ=4v4=GR&u6_UBm z>u~kqO6(w~@ROkGf;RpYdc|_bW{w&y`!S#t7oDY}fjiwBgRBOXrkUk+nbnJbo-+eD z|NWi)xinFw17+D9&hUSV5$Mkp{m0CU_69ZN+xqR8L> z!)Lt8k#I{R&P-cCDoVQfYoEiuKme6S|=Di8GER?ahQ z3BDUuz~KL83Lp|)NHg?^sdP+JZnO^H2IH~_?G;Rgkf@ZG^c>v&JY_?cX8N)<5=uR$ zm$-msKAV;18Ibg9O8OYwO@NP)7W&GgtI=Y}gVY3?VIz@^-I1K?UL?g9E3A|3q3=q@ zJ{-so@!>Yv@n;HRx zWQP%(>$#Dz&yKup^_c4V5fzt$IVhi^l(UhEkI@lsSXUZkg{#W>QvnPI*;951S1hvJ zMg5;WT&|bst7eoxqOtLc@qrtvY=WWbEUr!R@~i^-i%9U__5I6Ih<%{LAOCB#Hz|`X zFlQAvj*_^aMZyVFhIp?&7-cX-L-RQ{eAt4{dMCq!(C*yH{c3NZO*B5PgTK(7_1VRf z?Uj?#GO6ge#daXI)r*4FJg7tuwvzFqlVEj&ofDHQxv9{UBKc@^2~~Q#xjCh8(YwtVX;+>nyy+LrA`-U0JGA>V zfjD?}bnU4$#|mBH@Ku1N?I_+EAMR^zJ>SG%l5B0;439u)aI>z_jZ)c3%=`S|WzA0& zwfmi4p1sb?8vQm-mj`EIZuh!t_VE{T$Q{Q?<3&gC3rSYU2$kh{TZXsLhRxa%|J|YF zjH*>IICx^#B8^_Wsqn@6@`#@NUR0!ZNI_4WGJ%Rl7=>$&Bgt>+;s1b^G&w!*x^AUK zUM}9bKD?_9YXTjOs~g+Z!vb=tO(yF#GMD5-zDsnuh~L_G*;a3!b`=h4n*zv^2)0-h z_TzKDj^Y(+;9BNd2)e)KH<@2tytGp_*KxcxraEx##@4!e-_&vt@Xl-nQ5O->yz%DzOgLZ(X`%=KR{KI|Ie7zz?`GvCs~6pxd7%fNL-9};>!r5O>#{Pe=jZ;Qsc==&ZEjcyN;lY-!dHtAG_ zWO^%(47D=-d7tBDsrK$hM$YVEaT1?V%gKod7Z;bwl*rGjs^JaSp)Kfm@3v?0UdL&Z_u1gzH4=4 z*H>HF-(N7o_G>tmE_qnCAHd1J@=r8{pNs}C=977V3hoi zGC%LivqaQD`0jk-yo(wbjZZ{G%OT{7?fGK2m7Stnkvd-k_^$mt?1tD-n<`BfVyUgIg=1rY zfVsfaY#E=KY47VJ_S-%6Bg;lEUSC~|PffLMZ}SqjHeFxK04smCW#IWp2o_}pSzEL9 z3TmWFg!na*8I8sFuJAv25E30tGX69AX}-n+;$|OFT2+NtJSOR>($tL9rNW8KmK$^P ztT(Qhdb9oSA3GeM6^{RT*rutBH#slDN$fHzUNH;q?(UwfIOO*hc7C}&%rX7T?RDIu zd+oZb1m4}G+WEINL-r!%#JI!ukjSlPm2$MBqNB53^0f*-p$iQF0bupVfVU&c_w?UP z03XFWfu*%Wub;6|(CI&;v?!AM`f9kvdTxFHC1SwH8qvh>g$@;CN*imVyHmWZ{>-C^ zg-)*j`oiR#P@(jV`s0=tU1)?Knl1S3%p^7M}H$;hDfGQ|^80l&hHnr0+JtXA=u^UbxdyK$D5T;+3RnM~`LsxmYb^Tb!wv7yZXaIA3%KcHBRSs{k}OIA{t7okj9#hpPSGkMA%1o2gwty$JWV zue8WHu|TA3s{8n%qfFcO zZ#CUsoIgCuf3`@}2T26upMMFT`0{>RCTK1<;As)<-a;56+teNJof3IP{)nv-JNX~G z2XvtrhKcbS`NKQzSx7>FY;0;26cN}A(YTMkPyn4@SU4n10@4Gh#x+KpODeprV+lr# ze9cUi%I6R>@6zN3E65^#Vh}#Y#bG*Mv0M4)56||NyD9qy1{B8Jc<C zAhbws)ACdQVoQiT`^K^NKDhVMg>QIvIOHi615SfjKDk+n*6e)AM|**~wZHUGkTGAj z{;2ldZ8ON4a`Y`mR+kvdHz;tU24{OG*J)wYk@UJD=&It$;62v*Gx+hjJcvs=+{bt6Kwnl^2<8fYfenUjsJ`e#guocucib88-n|>Hk^>=W-VM1iQ&Lg_ zJhG{p0!0cq@i2d+5Bc=z(;#JhC30Z4-BU$4Hb}OXtz!i}Juq_s)Kyc_DmelcsL8y% zyuFS5OfxI1Q2K`F-xU%q3krLPneefJ5l!fV1j|k7KoEjV`=rbY_Y55pVIV945f<6y*DCx4+(FH{f zXEj-Jc1@*@#3GdK?Ag83i# zn|H(b#l;Dxerog5lvY;aO#O7eL_4qlih)ovu^RbU^6--K^49C>_IBl5ojWI;j}w9; zA_#IvY%R(SJ*8Oi1O4@jLiCGpG6%y{asq&W0m&f8>i_(ED7d0}#sQ2G{`5peB4-%s zFxL=$ItL-*9|n_mJmhTooeAy)&VyJI#8S@D7QuYi&K`r1jd`5JC$I!j3dXTn7>3U6 zT5I6IJa%V8kdXkTfCB)EDi@C_a=i~=#Rrim>#6g#ovGBgxRsw6ctY@~Xl&~iXj6o& zL!%n&>iQJqn(ndD{r;@np;biMG8cyM!|yLLx$8LJn(qO)vP=Koye-atT;%slUyC9d z%zq51PvT0K5YN9nA^Z!%z1mFDw8`!41JyNI0 z=YwUnHZuX>6u{^Pytq?8>2qsd@);zyCtm_#K|@PR9@|My8g^@1)Lt{5jmW1xPbo!1 zC4M@KoNva(=9ZQ?{Z^EPg@Wv3c9rwT-r7Z@5UU!640;}G`Opg_^M~G*tav@XBmm98 zQ35hDF(83TO9eVqyU^z5=GCqn6kOcgVP!CdaKFaE$!P$33R&>lFiXSj>Nit(L{C^` zWSS~xt@DjF>T2&pM^hTV9%a)05Nlq(rP#=>m95AO?n+@R!7pA^6Ax3<5d1(Db8 zhu+zF<0%!y{-o3(cx(%5-x$f?AH2C71Smas{hKvDb z1G8RVdSPQ?07X(}?=PlMZ>(B829(TgkN^WOi%=1o0u4sSA_a;&r`j3bLGJJV#F`5# z+8@}K7Zh7c%{$@m+Cyc~ z{;c>wE&_!D$ma3m$K$iJR$k|S|I%ETDrqa_3^%Q1LZsSM^q3&ELH+~&lY|9n&N{2l-os&~pDSz3176%#FWi}cbY+z5d+0_0#oT!Q!sH3fvvKQMoK0dRI4 zq2inwrI~_hNdOSuxHu_7WSJ^N0V6=pKjOiaA0k2t6MO=(L;M8a4cS1c6Hf_8eAbPt zhFKC!O-;ceWpW@I6=5*m4k4q@6U~pgW3u$`umh{;E@DU7MYOwlfBEJwvWWG8kb?Fz zZ&qDO5YIa-Qm4hXh#*@9!M8O`dHMOJ<>f&D=ItsaK6J#(EgpM2?=LD(S36^Y2{fC; zHJ@ExN^KrXjNoC*%L%3gXCn(n?G$D8f#XUcgW%33)7^;Vd-v{{y1UbWB_?pP0dh_z z!N%OXxQg1|FSf9MG=YBtNDIU|$LH1N$@&df2ERr``oMfmNLvu6ngT!FE#X@jb^u#* zID*wi#qQ;j!GumaI&j(J@ej_V9#b0e(F#9l9T*^0q@i%{njaTOa)#*kK^nmVAH@Q+ za)p(MyVsRY(9ZOGKvJ94&U7qw#tMjwN1$ZLw5hUe87M=Z zf2T?4=KQ@Oe9;UJfw%)tyY!Q_FjQfWm#cZ%5kf?3z~uxa)5CJ zXK9(dY}q_XDLe&qh`YnNo99BExT^^WlZxKDgNw63FB0lQyQaaH#vfb9_tKVl%2kDQhG;Pr`&!{C)>Y z^a7M~w~9F>g+39-Cbgp>iQ6;4ACa$rpT7kF-cTKQ6!ux=qj)wsq~JizD33B)K^sV{ zpM$jcrtBgy5RemzIKk{o-$Gdn3wy4yJ}d&|{kA5`Q;PJ-h!$TG@H9#W0i-1e9^gLg~WZBfuTMRcV4F~Mm z-K{3fKmw+S%_JxzkK#)*?_qwE3ssZzfUg0lwUqHD;_Ru=Vq*Yx`SXprpC5~)q-0d{ zQ`4|NQs9cq)m5$wnMs*zw0S5jm;$JjD51)!H#8ju{E8b0dC}&^;eP@cVJgyJoPk(M zS?0*w8$MY-!6U{fT)~X;rhfnKe(BQk%P8ywLHB>t;?p%QcwiCG&o@h>&t8F0p{pQ$ z#}1MO#52I$4GQ{)Bf@}av-OLzrgqG%t?`zYmJE!ISs3=gw7{ynECh+QLGpuu1i~|= z;orVzNkc;n0D*Ne8CLIaO$+G0#{78A3rj+>=EiezUdc<`JC`FLiC?LeTsSjpplhJ-x%veNkMk=Tj&va*A)qIDRo-&| zg#h$Xtn4)%z~q%vSJG(L{7KaXf0Im^kp@sa1EF1CFMT2j!FzO0DjI7^UaWT&57yiZt<@n|j#h6qNCBFR?#v%voCa%_eZa#!TC5KnY)U zBd;Px8W5u$ff%8_5u;S?JdX|-J+0nEBZj0ppd|+-@)a}$wX@I<#m>#C8wbj zE{8HPHxEh|0-{n+Z`fXB;+V=C*0gy7xjikB`qouJ_w`tF@1i?H8AagNEBA9^i;_5~^$Xl)>TfK&!xNEh0y`^!^m z0GpWsGSxWIyt&VP#-2kd&~H@^Dg}U|duJ#uJ!;TYP-pynG4->*XSTPuS3QSSe60IA zVuf;INwh(~w6ru}WyO+;5C;g-+h+*U+uPf-0s#8?=IG)|p22fyNTAj=fk1*fCn$8n zH}s0KH(#sSu}&lo)SzG62>ujGRCGaffa*@%b-tnOD}4AT>*X2HK+?#=u@g@KEP(=T zV!|+Q1ssNiCRSf;2 z+E4lahsQs}1`0|MDW`mwkOVM&z<9JuklGk$j5b4;$8nsgbxsDG$l%xs!MSf1GLM2g zRLlPyCvZW4Zj@pPrc&9KyL7bL+6w<%$YW(~?YuoM0GdT0UhEwmbB1k75UCZO4X^VJ zcp-(vl`QR7-}Rl>2AF9GLD}p=wOO`*h5{WbCxn#RyD%?yuL=9atFAgOxqJG$Yx&v$ zqlSW*vM21bLF?gtcL}_$>YX+(S2DLlNoi@bPP2Qhw8dqA{}cVO{~H^K?gwxNvLt2X z@CB$+lI|0iqCqa`7w1D2(NURdGG=bR^W^WY8nixS;qAgJTlm})*toFXceN>ewlus| z@Uzg3FPJ+AOKiFD22l0Yp8M>-X87!K*Sw7R>UOCTmFkMh7}pk0iM;}CG4Q1x(;ZYhWG2u-gs*2q^`7d9-OLb~i`L8% zqd1y>z7H39m}QKyc@J=06m8wnZ&MkKMvfLBB#|9=DCTGG=8>jmK zG8zMYLMihD%WE&$GL`ne4zYWfp`QvB%l`qR6cXVKw1Xe|F@i= zn6G<>&o2i6LSKRaGY$SB45uY#c`7=8M;B*Bjfo8wLioR9V!Y`=ALMlw<0z{_7roQt zDA>Vr^zA+Lr^V6GcGRisOwJU7c=YP)La-zJ>lkAgo18Y4x~Aq*M>HcoHl}?r*L$_U z)Joqn9c#+od}==fSvTF_%Q)lUQF0zO75(T-OJO(_MbC;LAUG|c??7RPq}tmoDkjas zxWB1Yw^k05*~No3&JCWE&p3#J4l@{Km>D>>Wyu4rfF3I7IpMwI=oVbu7t4_G?OBv< zcl2|y!a&WE!9W^BW}CcyO99fy#l@v-?GSMAZ37LoL&5OXwYB}NS2qlxt#M3$o2><5 z?KhHm`xjn@O{|0WrCZOr*Ahv^noX0F(_WZGf8oRi3TVBbv{zc%1OhcaSj?x& z;8%5?&Lw7D0e!Xg^(6A}aU^#EkXhr?(-zo8BlO=yEevUN^(?hipD=@(Vry&b8%Y#) zsuoh1a~)JOFMqj4=<%edH@Ze=BS8uD^G)m8p}^XR8#Cyj^FN_1?xl3dHy#8z8kC;51UsM!tL>M#;>GMHC*+ZtL7@%E4Cn)l&B5M}Yj%e%H8xUrkr5FFs z8EX!}4bV&i)yez!@71Gy_U18yyaoB^`V4tK?nOJIf{xLL_1AySzat56n+2f%x&gVG z(BT5RJ`Y7k;)k_@KGp5)UU)h?$M*|;=3^nm!k#IoRQ}d*P^;dxfWzEy?88^u$MC2i z--NGJO1RjByQaA?pbf{}@p2K4p|7tG8u*>7Nk(;^@n1qg@N`>HWFy(rHOzf{7_A30 z+5tqoCc^RutiCv+DQo!!dTBI9j*kt5?u7cN7BU!c6re27tph!;+iO4}d+eRAceQ?e zE5>+k4oq2DV$EG#DD!L;Mud@(Eio5YexL&~Ir8E=%@R??$6m{**w~z@9rnz@99^E$ zLPY)b)!faM)>#r679cV7(TFCXba-qhD1$=bxzL2YAl0|At-%s#lc(^L^dG|7t`(wh zo2tdTH&>dWJ&h>3WYC7$RBdb{vSDrcM@I^{MxENKrH0KpU%zAg=Hgcgc*S91%KC%y}zBt z4Sfa;^Pg`%Jo@ipLNI7z)}2hg2Ehw{_Pp!ARYpsAZCsq5obXFad-_rI$7TO51I1Yr zC=Yab7J&E#472VEN!S}>sr3K_1X{+RVFY#&1RBE~>(7{x3S?7^vGWI>3kRNtsI?;B zkUmngk;B0{4<8h06$f{2DOSF0GCm-Wyub?h@q>2Z1U-I5n9_W0-{6{z1C+a&hX*Z4 zB!1!}Z)vd9k_pfU09hOB{-O&4P zi}5+-ekP5M!787ssW(86@VkCiyX%^!>DbxXY1m7zcNw@Oq^K}Bs}V^q&C=l20fCY4 zn_A0n>eK%SX|z2fx^ke`;id7p0325^wq?(*Qg3X{(OJfe9VDNqbL=gR+IjsdsIbuf zZxqHIFeiPd{a3bbNW7bSoQaZuhfH`0))BOB)*ppI3rv z5%k?auiWsz(z#v55n)JQGLDlV&z2n!xoaZVchG?Wtyj>T`HSnmJ9}%lCQy&#Z13)Z zitcZz(twDpY^(`?IPhdivSv!mk1f!o(4q%vA`|jqJGorWKtOtS>Iq)zlHp zbKaM*Jnf*~C1tkqAhSvWJsP%e-@c6>9v-6eq4WIsa{vF-6n0I-MU7caNpSEI?#K=Y zoE$!FODhiqxj?1d3^tpt5ANSkTwGjKyKT{YN*uMT1e;ETA()^+vDM0LuycCB%LKF| zDz({jfV8nx9?1xdgsx(ykyT<*VbgB0r zLYjdPLbPRnjJLb=J*y+ULoaMHnxr2O?wufv!q4J+MB)2I<2?^bQo~D@E)j}jc?Tr= ziuqe-KDhNfc2C~b&(892q=-6Q(5sZFG{)irF_ESVl_Qj% z)z4aAIA#Q|LQg05q0@`IVh<==YTEHBD1%B&+|QlvvSY)nNMj}G>)&yTnI z3WVR2e<8 z`dn>%XI>8t85<;a4QMBjovlq$6nqx8`gFfM_V+_*brU_y__(@Wuj6$-_ugzhld+_9 zK;wCBm{=8^{Fh-XUa=HWy8E{u#`9UXJr>$=!%>$F-p4!~HXwo+pF4b5BS_6Nee)(- z`fH$m3702yu~U`F=09LLgnX%W`4`1A>wU=S+S-zCfg_9ZcrSkj4n+T1;RzXE@!7~g z)N?h$VT>Mln1f*X;MvXL^O-lxhivK6%X$XkrpMU33-*)1{bIDNb#GS)eM~S)A%>Zx z`>(9D{B|ZQv%;tj7XlK6Jl+Pp9{V9(&U2#B2f=Qz%%R=r|7>Kai_(}#& zSmGEVfp?$%ApWkX8oH7si05DQte8|f7i?7tSS+OHOp93@!S?WytimR+ik9Oz7~_oJFWNh&r&1J2}Y!{(_fKKpT$F=$G&jIsrVqMfeG*Gk2kzi*34l@`?j0 z)KW%c`_cd12WBot(C%+_Do?BF$MrFy$JX-b1yI#5f+jW=$oTr3E4YDH$=iLI~$u9lpU7M@&kH!NgHslZQ4B^G>edG!# z6FO}~ogKjCIXHd`+5a6IGi*dO?&qWr-b8Rp5U}|=4%PCvVF5o1Q7$gzv>-)BG|%2;kf7 zGLyO7&JphA_tf%zRGR?a`FFm~59Q#FhYw#6so zvyvaOZ9m<62A#r*1Y~)lPl#4UAK}ffJnvaiTX&ZEg9Z@6%bXi!0xSkZy}DHPpZKJ3 zubLDESS*Zl472Ig<#4b1I$KUi9UD=j7xh{J9vy zUk*DiY^@QUlLXkppgm@2zTQV1wf1`&{uRsL;>SQ5+sFUOM9FSKKkwIgAn`rIAsRp0 zCF)$+I@SO>KPR?bd=$OGi1016-J**(7c(0Ueda$!GkCp+ADJd*H^IYh4%LUNBxx_A zN_yr%mbH-0&9qG@CDR|>hQal6w51h_J)9Hw%K=F!VK8TRU4UKrAtnZ_>%%0uz2xg_ z;Z0lJLn;3-AL|~mLiR4mnz)YQp+(HH@yS(a2*3#RNxLDqIseSfZRT!2HTVuzQDd#s zp(I=$^3I_nwD0=wVSFP$wJ=rz(wHZfPt*=G9x__eRP4V! zd}fTl7_C%x?~3ubjYoly!l!_s&DKDNK#hrAcRoHeRU$y1IWtvc;GT+;2sumSh_JWX z9n{VdHUQ%5&0UtVzNYT&Mqg(dfbSe19r?jEtI7=P{0z}A1>q0;Ag$?q@?F$Rda^BD z7A}gKU+3E#bY7i{syPk@>X&N3bO1+2F6RJ;nO|B+&CZ)PzB?x5ZM(dU6D|hvD%zEK zas_y_)mzL>_@ZPGI*<&y7mK;f`sa@8&g6qcHL+HbV(i~Gc|Shi27+CAtByn=rB-~H zD0?hs?wvFUgxVRparzONC5)~3KmpI`Eo|14s@zMb>%GV|-3B(w$p3>}L$VUJ@|uUl zXp_aPiNL2gIZ@Jb96|nA3Tw)RERnZ5n0KQ^wy^$?5JCH@_Z#J4+;~nhL5brMh++(W z>NtG1VzhR_yte-)7AHpI)yb4%o7RXhc0G>}E-9 z*2tCT(R_UN-wL>dCq)N{c9Q052Ls-noIkP43rc;RxwF90-^hUlaslY6vEYksqHV3RKO2!Y2;B(f1E!V zZJjgls=Ez>fBnJdVZ_Oupo9Y=Y=764o{v?IGr!smuI8?H=E@{wjxUFmNWH(n{;_%H`+_PsD;S#Ev6>EGGTV7cRh2;%FV!`Cb9n!$LE4@<+bZJd^1r+M z-&v#zvCBuoR6oWi?{TCssxvqjQE2oB&ud#+nP4<^r@*HpgRdSD0iM{M>21z=g!RwF z)yYpFaH_lKU51=r@S!rBamB(^WBT`(!T1AbfghfTd9@>dtHGbN^hZOr6Io2sDVM-=}`MtWpe`ndaPSpg@ij6DP!2fY&9g0qP{0Safd%})`dq{qRenl+dsbFmR zkZhhC3q@ zb06pX(&^rdXN;b!#=6P0VEvTK7IPDM4SqtgAWO0MRmBNg6{nn5eBqMf%r_KYuT@;Q zRB>sxqVT-KTlKqZII&mUlcEYulUa` z#r|g(vFW^Qo3U={w?EyU$BZ#Z3}?nvXN+;hOP`iWf0<1BtDG|belN|Jb7rk_vp|U~ z1ZFuUfgwIxnJffX$U^XAXGJjEM|UO*B`0K|`y;U{V zT(VH~#&FwTOju{n-tMyBn>s10KxFS;Q!mQKrctq)H7&QlQrH}*?ki1s_)G6JpFQg- z%_6;EX#t_d1*G@G;^L9{Nz@>^Z$S@xSlzli;I^1DGLPI6BqMWEUc?}R5-p~Lqte@4 zU0s?%hBVV^Ug}9{St=M&TDT)n*B4EB_@j4roIB@l;n%pgrGzNkdl*Yp`p6ED75ULbv)`x=~+q`5iM*9Z0d`pJp8dc zEgc=67_@*fbR2?~S3;qDXwaxabl<|gb?iTI=Dh>RZJB`;+wIX}J3iH+T>jZHyaDxZ7w$26_XzyNR|MZCu6-aYhrZ zVTjW)9^{!#95HQhW4x$mqHc)+D#5u=4tP|t+CZ&8uz_^l02;Jphgv}^6x1jMQeh1g zBBny|VaTs>;oVDM0X%6KL|6knYRCfNS;J7`Zm>urfsYCJm`IBo3HX@s#AyOPCVX*P z3m+4%cv^)k-d7vJstL=8vkD`KJ5D2LBLP;pgLIq`=Q3u9GlH~;A%>9&up%?a5z`2K zLrf8?x{7&)Pu97vKQOlBf)AdMy1~E(V5DrIzd3^9B(!TL;-TS(9_j6;GVp$4d!*ZWK^Cp?-s zb^ZPZEU^JaN2-DT4z+@1P*9~5NQG5Uh?ok+m5^WM!aIzt48xN!dZGpkUL#Z5aT^qz>9?jVZkgcjE%V1$UZ)0 zw4Kiy?Y#-{13iP4*Cc=A%iov3@#UKx*R&tKY)+m0Cp2fZ%+6_cJQZiWtXiB9vTd9q zXtlk*WM~@xH&uV>*@6ACaNq}L{GM%@?3h~Qm|El*7CCst z%~}`8MOxpLV_QFQ=+S*{c51fFo?0xkr&c*vPTFqPo-4EM<7KvernB#-kKF9SA2NI4 zj?Df!%vt{HaW}itF0)r|%IsCYQ-A)Fi(R{E&-*LSx;{qz>%Y;i*`e8`D4ycyg&q-a zgmmijR;QlVIZ5ZsH0NqA)?BXHsM(~sThbz(hjgMJ@xU)1#>m^F5FuuAbqVd72|M jM`@1M3~G+md`5GE=0weB3-!xn&F3|zYnI#5t4;p_oK&&3 delta 1364 zcmYk+ZAep57{Kv+&x~oiqcwwKD%gjJCP5!U35~#M2GUX~q8BrXQd=+d!7M6fHKQC_ zdL|WWY2?79ERIRORB9Qe6)72QTA7(I+YKz!BKwd#&vU|kxWAp}zjOD(y_;4wUp<;j z@v^DJ;q^i7z~%e6&t|li=d?wO!0u}U%>rmz}yM&>>9AJ6{J_dD%@9d8P<2; zeJoN_9}L>N!50l+&neKe9{d~!j^u#i=sQd^t)bLNreujO954}0cwjJZwrf_iIE`PC zBl+AAC+3FDY^R}7k#(~J6Ny+Z<`L^yQiM@2r}4S@keHj#v0`(mo|a@UqJu?R64NM3 z%xm^8X1+pmHipsP78f;GH<5(*e0#!A@uEb9m08~?B=sZz9I1aqNHenX9Ug`3`o?!; zgou!_l-=wasjLF4TEpa~Q z!8t5~^DiqXyBYis1gh_T4oH zlll-I>X(U7zm`3FP^BZyaH{72r)rr!)zdaD>FDD-I=+h?PeNGf%LXm!ddx#tzX)BE z?BrXjCB5f)=)EaIZ!1e2DAf{g3J=}`B6uB4KisJ$L&-c0Wr;9kXTj=75E;#)6B8!; zXgOR;zGQSOx(5s#0~f2@7I-E}V@?$Jjn(101;q<_tRL5YbOs#Pp(Cao8|_E^=nUx7p8Lp0UR>i%t{#-^e4-w~kc%Ei@n1qcjq3vR0$PNY epk?S)v=XgGYtUNsb|gNzhu%k<(1+AJRq+p67E9Iu