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
This commit is contained in:
Thomas von Dein 2024-03-28 19:41:20 +01:00
parent f6d5385d35
commit dcf31e46ed
12 changed files with 541 additions and 60 deletions

View File

@ -19,6 +19,9 @@ build:
buildwasm: buildwasm:
env GOOS=js GOARCH=wasm go build -o openquell.wasm $(LDFLAGS) . env GOOS=js GOARCH=wasm go build -o openquell.wasm $(LDFLAGS) .
buildwindows:
GOOS=windows GOARCH=amd64 go build $(LDFLAGS) -o openquell.exe
zipwasm: zipwasm:
zip -r openquell-$(SHORTVERSION).zip index.html openquell.wasm wasm_exec.js zip -r openquell-$(SHORTVERSION).zip index.html openquell.wasm wasm_exec.js

View File

@ -31,6 +31,8 @@
- Remove Sprite from Tile{}, not used anymore - 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] ## Collider Rework [abandoned: see branch collider-system, fails]
- do not use the map anymore for collision detection - do not use the map anymore for collision detection

View File

@ -11,7 +11,7 @@
"iid": "267e9380-d7b0-11ee-a97e-35bec9c19d52", "iid": "267e9380-d7b0-11ee-a97e-35bec9c19d52",
"jsonVersion": "1.5.3", "jsonVersion": "1.5.3",
"appBuildId": 473703, "appBuildId": 473703,
"nextUid": 64, "nextUid": 70,
"identifierStyle": "Capitalize", "identifierStyle": "Capitalize",
"toc": [], "toc": [],
"worldLayout": "Free", "worldLayout": "Free",
@ -427,6 +427,152 @@
"pivotY": 0, "pivotY": 0,
"fieldDefs": [] "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", "identifier": "HiddenDoor",
"uid": 23, "uid": 23,
@ -1223,11 +1369,11 @@
"seed": 4985586, "seed": 4985586,
"overrideTilesetUid": null, "overrideTilesetUid": null,
"gridTiles": [ "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": [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": [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": [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": [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": [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 }, { "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": [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": [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": [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": [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": [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": [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": [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 } { "px": [416,320], "src": [64,0], "f": 0, "t": 2, "d": [213], "a": 1 }
], ],
"entityInstances": [] "entityInstances": []
@ -1399,10 +1545,10 @@
{ "px": [384,128], "src": [64,224], "f": 0, "t": 58, "d": [92], "a": 1 }, { "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": [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": [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": [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": [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": [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": [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 }, { "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": [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": [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": [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": [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": [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": [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 }, { "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": [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": [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": [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": [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": [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": [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 } { "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": [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": [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": [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": [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": [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": [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": [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": [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": [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": [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 }, { "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": [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": [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": [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": [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": [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 } { "px": [320,384], "src": [0,0], "f": 0, "t": 0, "d": [250], "a": 1 }
@ -2447,7 +2593,7 @@
"gridTiles": [ "gridTiles": [
{ "px": [160,64], "src": [224,160], "f": 0, "t": 47, "d": [45], "a": 1 }, { "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": [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": [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": [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 }, { "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": [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": [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": [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": [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 } { "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": [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": [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": [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": [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": [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": [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": [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": [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": [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": [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": [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": [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": [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": [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 }, { "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": [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": [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": [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": [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": [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": [128,256], "src": [96,0], "f": 0, "t": 3, "d": [164], "a": 1 },
{ "px": [480,256], "src": [128,0], "f": 0, "t": 4, "d": [175], "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": [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": [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 }, { "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": [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": [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": [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": [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": [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": [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": [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 }, { "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] }, "__bgPos": { "topLeftPx": [0,0], "scale": [1,1], "cropRect": [0,0,640,480] },
"externalRelPath": null, "externalRelPath": null,
"fieldInstances": [ "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": [{ { "__identifier": "description", "__type": "String", "__value": "Take care of each other", "__tile": null, "defUid": 12, "realEditorValues": [{
"id": "V_String", "id": "V_String",
"params": ["Take care of each other"] "params": ["Take care of each other"]
@ -5828,6 +5974,237 @@
} }
], ],
"__neighbours": [] "__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": [], "worlds": [],

View File

@ -17,7 +17,7 @@ var Tiles = InitTiles()
// Tile: contains image, identifier (as used in level data) and // Tile: contains image, identifier (as used in level data) and
// additional properties // additional properties
type Tile struct { type Tile struct {
Id byte Id, Ref string
Sprite *ebiten.Image Sprite *ebiten.Image
Class string Class string
Solid bool // wall brick Solid bool // wall brick
@ -35,11 +35,15 @@ type Tile struct {
Direction int // obstacle business end shows into this direction Direction int // obstacle business end shows into this direction
Shader *ebiten.Shader Shader *ebiten.Shader
Alpha *ebiten.Image 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 { func (tile *Tile) Clone() *Tile {
newtile := &Tile{ newtile := &Tile{
Id: tile.Id, Id: tile.Id,
Ref: tile.Ref,
Sprite: tile.Sprite, Sprite: tile.Sprite,
Class: tile.Class, Class: tile.Class,
Solid: tile.Solid, Solid: tile.Solid,
@ -57,6 +61,9 @@ func (tile *Tile) Clone() *Tile {
Direction: tile.Direction, Direction: tile.Direction,
Alpha: tile.Alpha, Alpha: tile.Alpha,
Shader: tile.Shader, Shader: tile.Shader,
Bond: tile.Bond,
Door: tile.Door,
Switch: tile.Switch,
} }
return newtile return newtile
@ -67,9 +74,18 @@ const (
Secondary bool = false 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 { func NewTilePlayer(isprimary bool) *Tile {
tile := &Tile{ tile := &Tile{
Id: 'S',
Class: "sphere", Class: "sphere",
Renderable: true, Renderable: true,
Player: true, Player: true,
@ -82,7 +98,6 @@ func NewTilePlayer(isprimary bool) *Tile {
tile.Sprite = Assets["sphere-blue"] tile.Sprite = Assets["sphere-blue"]
case Secondary: case Secondary:
tile.Sprite = Assets["sphere-blue-secondary"] tile.Sprite = Assets["sphere-blue-secondary"]
tile.Id = 's'
} }
// primary sprite is always the first one // primary sprite is always the first one
@ -92,7 +107,6 @@ func NewTilePlayer(isprimary bool) *Tile {
func NewTileBlock(class string) *Tile { func NewTileBlock(class string) *Tile {
return &Tile{ return &Tile{
Id: '#',
Sprite: Assets[class], Sprite: Assets[class],
Class: class, Class: class,
Solid: true, Solid: true,
@ -102,7 +116,6 @@ func NewTileBlock(class string) *Tile {
func NewTileCollectible(class string) *Tile { func NewTileCollectible(class string) *Tile {
return &Tile{ return &Tile{
Id: 'o',
Sprite: Assets[class], Sprite: Assets[class],
Class: class, Class: class,
Solid: false, Solid: false,
@ -113,7 +126,6 @@ func NewTileCollectible(class string) *Tile {
func NewTileObstacle(class string, direction int) *Tile { func NewTileObstacle(class string, direction int) *Tile {
return &Tile{ return &Tile{
Id: '+',
Sprite: Assets[class], Sprite: Assets[class],
Class: class, Class: class,
Solid: false, Solid: false,
@ -125,14 +137,9 @@ func NewTileObstacle(class string, direction int) *Tile {
} }
func NewTileParticle(class []string) *Tile { func NewTileParticle(class []string) *Tile {
sprites := []*ebiten.Image{} sprites := GetSprites(class)
for _, sprite := range class {
sprites = append(sprites, Assets[sprite])
}
return &Tile{ return &Tile{
Id: '*',
Class: "particle", Class: "particle",
Solid: false, Solid: false,
Renderable: false, Renderable: false,
@ -142,29 +149,21 @@ func NewTileParticle(class []string) *Tile {
} }
func NewTileTranswall(class []string) *Tile { func NewTileTranswall(class []string) *Tile {
sprites := []*ebiten.Image{} sprites := GetSprites(class)
names := []string{}
for _, sprite := range class {
sprites = append(sprites, Assets[sprite])
names = append(names, sprite)
}
return &Tile{ return &Tile{
Id: 't',
Class: "transwall", Class: "transwall",
Solid: false, Solid: false,
Renderable: true, Renderable: true,
Transient: true, Transient: true,
Tiles: sprites, Tiles: sprites,
Sprite: sprites[0], // initially use the first Sprite: sprites[0], // initially use the first
TileNames: names, TileNames: class,
} }
} }
func NewTileHiddenDoor(class, alpha string) *Tile { func NewTileHiddenDoor(class, alpha string) *Tile {
return &Tile{ return &Tile{
Id: 'W',
Class: "hiddendoor", Class: "hiddendoor",
Solid: false, Solid: false,
Renderable: true, 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 // used to map level data bytes to actual tiles
type TileRegistry map[string]*Tile type TileRegistry map[string]*Tile
func InitTiles() TileRegistry { func InitTiles() TileRegistry {
return TileRegistry{ return TileRegistry{
"floor": {Id: ' ', Class: "floor", Renderable: false}, "floor": {Class: "floor", Renderable: false},
"default": NewTileBlock("block-greycolored"), "default": NewTileBlock("block-greycolored"),
"solidorange": NewTileBlock("block-orange-32"), "solidorange": NewTileBlock("block-orange-32"),
"PlayerPrimary": NewTilePlayer(Primary), "PlayerPrimary": NewTilePlayer(Primary),
@ -213,6 +240,8 @@ func InitTiles() TileRegistry {
"HiddenDoor11": NewTileHiddenDoor("block-greycolored", "damage"), "HiddenDoor11": NewTileHiddenDoor("block-greycolored", "damage"),
"HiddenDoor12": NewTileHiddenDoor("block-greycolored", "damage"), "HiddenDoor12": NewTileHiddenDoor("block-greycolored", "damage"),
"HiddenDoor13": 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"}),
} }
} }

View File

@ -4,7 +4,7 @@ import (
"bytes" "bytes"
"log" "log"
"log/slog" "log/slog"
"path/filepath" "path"
"strings" "strings"
"github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2"
@ -23,7 +23,7 @@ func LoadShaders(dir string) ShaderRegistry {
} }
for _, file := range entries { for _, file := range entries {
path := filepath.Join(dir, file.Name()) path := path.Join(dir, file.Name())
fd, err := assetfs.Open(path) fd, err := assetfs.Open(path)
if err != nil { if err != nil {
log.Fatalf("failed to open shader file %s: %s", file.Name(), err) log.Fatalf("failed to open shader file %s: %s", file.Name(), err)

View File

@ -6,7 +6,7 @@ import (
_ "image/png" _ "image/png"
"log" "log"
"log/slog" "log/slog"
"path/filepath" "path"
"strings" "strings"
"github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2"
@ -30,7 +30,7 @@ func LoadImages(dir string) AssetRegistry {
} }
for _, imagefile := range entries { for _, imagefile := range entries {
path := filepath.Join(dir, imagefile.Name()) path := path.Join(dir, imagefile.Name())
fd, err := assetfs.Open(path) fd, err := assetfs.Open(path)
if err != nil { if err != nil {
log.Fatalf("failed to open image file %s: %s", imagefile.Name(), err) log.Fatalf("failed to open image file %s: %s", imagefile.Name(), err)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -9,6 +9,7 @@ import (
// manipulates the other // manipulates the other
type Bond struct { type Bond struct {
ecs.Relation ecs.Relation
Id, Ref string
} }
// A door has a relation to a switch using the Bond component. The // A door has a relation to a switch using the Bond component. The
@ -19,6 +20,7 @@ type Door struct {
IsOpen bool IsOpen bool
OpenSprite *ebiten.Image OpenSprite *ebiten.Image
CloseSprite *ebiten.Image CloseSprite *ebiten.Image
Id string
} }
func (door *Door) Open() *ebiten.Image { func (door *Door) Open() *ebiten.Image {
@ -35,4 +37,5 @@ type Switch struct {
IsOpen bool IsOpen bool
OpenSprite *ebiten.Image OpenSprite *ebiten.Image
CloseSprite *ebiten.Image CloseSprite *ebiten.Image
Ref string // the IId of the door
} }

View File

@ -16,7 +16,7 @@ const (
const PLAYERSPEED int = 5 const PLAYERSPEED int = 5
const PARTICLE_LOOPWAIT time.Duration = 250 * time.Millisecond const PARTICLE_LOOPWAIT time.Duration = 250 * time.Millisecond
const LEVEL_END_WAIT time.Duration = 500 * time.Millisecond const LEVEL_END_WAIT time.Duration = 500 * time.Millisecond
const version string = "1.2.1" const version string = "1.2.2"
const MenuRectX int = 600 const MenuRectX int = 600
const MenuRectY int = 0 const MenuRectY int = 0

View File

@ -164,11 +164,20 @@ func LevelToSlice(game *Game, level *ldtkgo.Level, tilesize int) (Map, Map) {
case ldtkgo.LayerTypeEntity: case ldtkgo.LayerTypeEntity:
// load mobile tiles (they call them entities) using static map map.png. // load mobile tiles (they call them entities) using static map map.png.
tileset := assets.Assets["primarymap"] tileset := assets.Assets["entitymap"]
for _, entity := range layer.Entities { for _, entity := range layer.Entities {
if entity.TileRect != nil { if entity.TileRect != nil {
tile := assets.Tiles[entity.Identifier] tile := assets.Tiles[entity.Identifier]
tile.Id = entity.IID
ref := entity.PropertyByIdentifier("Entity_ref")
if ref != nil {
if ref.Value != nil {
refid := ref.Value.(map[string]interface{})
tile.Ref = refid["entityIid"].(string)
}
}
slog.Debug("LOAD TILE", "tile", entity.TileRect) slog.Debug("LOAD TILE", "tile", entity.TileRect)

View File

@ -8,6 +8,8 @@ import (
"openquell/config" "openquell/config"
"openquell/observers" "openquell/observers"
"log/slog"
"github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/ecs"
"github.com/mlange-42/arche/generic" "github.com/mlange-42/arche/generic"
) )
@ -59,23 +61,41 @@ func NewGrid(world *ecs.World,
components.Renderable, components.Renderable,
components.Transient](world) components.Transient](world)
doormapper := generic.NewMap3[ destructiblemapper := generic.NewMap3[
components.Position, components.Position,
components.Renderable, components.Renderable,
components.Destroyable](world) components.Destroyable](world)
switchmapper := generic.NewMap4[
components.Position,
components.Renderable,
components.Bond,
components.Switch](world)
doormapper := generic.NewMap4[
components.Position,
components.Renderable,
components.Bond,
components.Door](world)
var pos *components.Position var pos *components.Position
var vel *components.Velocity var vel *components.Velocity
var render *components.Renderable var render *components.Renderable
var transient *components.Transient var transient *components.Transient
var player *components.Player var player *components.Player
var destroyable *components.Destroyable var destroyable *components.Destroyable
var switcher *components.Switch
var door *components.Door
var bond *components.Bond
playerID := ecs.ComponentID[components.Player](world) playerID := ecs.ComponentID[components.Player](world)
obstacleID := ecs.ComponentID[components.Obstacle](world) obstacleID := ecs.ComponentID[components.Obstacle](world)
observer := observers.GetGameObserver(world) observer := observers.GetGameObserver(world)
switches := []ecs.Entity{}
doors := []ecs.Entity{}
for point, tile := range mapslice { for point, tile := range mapslice {
switch tile.Renderable { switch tile.Renderable {
case true: case true:
@ -83,6 +103,7 @@ func NewGrid(world *ecs.World,
case tile.Solid: case tile.Solid:
entity := solidmapper.New() entity := solidmapper.New()
pos, render, _, _ = solidmapper.Get(entity) pos, render, _, _ = solidmapper.Get(entity)
case tile.Player: case tile.Player:
entity := playermapper.New() entity := playermapper.New()
pos, vel, render, player = playermapper.Get(entity) pos, vel, render, player = playermapper.Get(entity)
@ -91,9 +112,11 @@ func NewGrid(world *ecs.World,
player.IsPrimary = tile.IsPrimary player.IsPrimary = tile.IsPrimary
player.Sprites = tile.Tiles player.Sprites = tile.Tiles
player.LoopPos = &components.Position{Cellsize: tilesize} player.LoopPos = &components.Position{Cellsize: tilesize}
case tile.Collectible: case tile.Collectible:
entity := colmapper.New() entity := colmapper.New()
pos, render, _ = colmapper.Get(entity) pos, render, _ = colmapper.Get(entity)
case tile.Obstacle: case tile.Obstacle:
entity := obsmapper.New() entity := obsmapper.New()
pos, vel, render, _ = obsmapper.Get(entity) pos, vel, render, _ = obsmapper.Get(entity)
@ -101,17 +124,36 @@ func NewGrid(world *ecs.World,
vel.PointingAt = tile.Direction vel.PointingAt = tile.Direction
vel.Speed = config.PLAYERSPEED vel.Speed = config.PLAYERSPEED
observer.AddEntity(entity, obstacleID) observer.AddEntity(entity, obstacleID)
case tile.Transient: case tile.Transient:
entity := transmapper.New() entity := transmapper.New()
pos, render, transient = transmapper.Get(entity) pos, render, transient = transmapper.Get(entity)
transient.Sprites = tile.TileNames transient.Sprites = tile.TileNames
case tile.Destroyable: case tile.Destroyable:
entity := doormapper.New() entity := destructiblemapper.New()
pos, render, destroyable = doormapper.Get(entity) pos, render, destroyable = destructiblemapper.Get(entity)
destroyable.Sprites = tile.Tiles destroyable.Sprites = tile.Tiles
render.DamageImage = tile.Alpha render.DamageImage = tile.Alpha
render.Shader = tile.Shader render.Shader = tile.Shader
render.Damaged = 0 render.Damaged = 0
case tile.Switch:
entity := switchmapper.New()
pos, render, _, switcher = switchmapper.Get(entity)
switcher.OpenSprite = tile.Tiles[0]
switcher.CloseSprite = tile.Tiles[0]
switcher.Ref = tile.Ref
switches = append(switches, entity)
case tile.Door:
entity := doormapper.New()
pos, render, _, door = doormapper.Get(entity)
door.OpenSprite = tile.Tiles[0]
door.CloseSprite = tile.Tiles[0]
door.Id = tile.Id
doors = append(doors, entity)
default: default:
log.Fatalln("unsupported tile type encountered") log.Fatalln("unsupported tile type encountered")
} }
@ -134,6 +176,22 @@ func NewGrid(world *ecs.World,
pos.Update(point.X*tilesize, point.Y*tilesize, tilesize) pos.Update(point.X*tilesize, point.Y*tilesize, tilesize)
} }
for _, switchentity := range switches {
_, _, bond, switcher = switchmapper.Get(switchentity)
if switcher.Ref != "" {
for _, doorentity := range doors {
_, _, _, door = doormapper.Get(doorentity)
if door.Id == switcher.Ref {
bond.Ref = switcher.Ref
relID := ecs.ComponentID[components.Bond](world)
world.Relations().Set(doorentity, relID, switchentity)
slog.Debug("setup switch/door reference")
}
}
}
}
return &Grid{ return &Grid{
Size: len(mapslice), Size: len(mapslice),
Tilesize: tilesize, Tilesize: tilesize,

Binary file not shown.