Replace map system

This commit is contained in:
Pyrex 2025-02-09 22:37:33 -08:00
parent 2361b880eb
commit 841031573c
32 changed files with 888 additions and 1043 deletions

View File

@ -1,779 +0,0 @@
{
"__header__": {
"fileType": "LDtk Project JSON",
"app": "LDtk",
"doc": "https://ldtk.io/json",
"schema": "https://ldtk.io/files/JSON_SCHEMA.json",
"appAuthor": "Sebastien 'deepnight' Benard",
"appVersion": "1.5.3",
"url": "https://ldtk.io"
},
"iid": "f7ed7e70-c210-11ef-bffb-911ba1dc425d",
"jsonVersion": "1.5.3",
"appBuildId": 473703,
"nextUid": 9,
"identifierStyle": "Capitalize",
"toc": [],
"worldLayout": "Free",
"worldGridWidth": 256,
"worldGridHeight": 256,
"defaultLevelWidth": 256,
"defaultLevelHeight": 256,
"defaultPivotX": 0,
"defaultPivotY": 0,
"defaultGridSize": 16,
"defaultEntityWidth": 16,
"defaultEntityHeight": 16,
"bgColor": "#40465B",
"defaultLevelBgColor": "#696A79",
"minifyJson": false,
"externalLevels": false,
"exportTiled": false,
"simplifiedExport": false,
"imageExportMode": "None",
"exportLevelBg": true,
"pngFilePattern": null,
"backupOnSave": false,
"backupLimit": 10,
"backupRelPath": null,
"levelNamePattern": "Level_%idx",
"tutorialDesc": null,
"customCommands": [],
"flags": [],
"defs": { "layers": [
{
"__type": "Tiles",
"identifier": "Floor_2",
"type": "Tiles",
"uid": 7,
"doc": null,
"uiColor": null,
"gridSize": 32,
"guideGridWid": 0,
"guideGridHei": 0,
"displayOpacity": 1,
"inactiveOpacity": 1,
"hideInList": false,
"hideFieldsWhenInactive": false,
"canSelectWhenInactive": true,
"renderInWorldView": true,
"pxOffsetX": 0,
"pxOffsetY": 0,
"parallaxFactorX": 0,
"parallaxFactorY": 0,
"parallaxScaling": true,
"requiredTags": [],
"excludedTags": [],
"autoTilesKilledByOtherLayerUid": null,
"uiFilterTags": [],
"useAsyncRender": false,
"intGridValues": [],
"intGridValuesGroups": [],
"autoRuleGroups": [],
"autoSourceLayerDefUid": null,
"tilesetDefUid": 1,
"tilePivotX": 0,
"tilePivotY": 0,
"biomeFieldUid": null
},
{
"__type": "Tiles",
"identifier": "Walls",
"type": "Tiles",
"uid": 6,
"doc": null,
"uiColor": null,
"gridSize": 32,
"guideGridWid": 0,
"guideGridHei": 0,
"displayOpacity": 1,
"inactiveOpacity": 1,
"hideInList": false,
"hideFieldsWhenInactive": false,
"canSelectWhenInactive": true,
"renderInWorldView": true,
"pxOffsetX": 0,
"pxOffsetY": 0,
"parallaxFactorX": 0,
"parallaxFactorY": 0,
"parallaxScaling": true,
"requiredTags": [],
"excludedTags": [],
"autoTilesKilledByOtherLayerUid": null,
"uiFilterTags": [],
"useAsyncRender": false,
"intGridValues": [],
"intGridValuesGroups": [],
"autoRuleGroups": [],
"autoSourceLayerDefUid": null,
"tilesetDefUid": 3,
"tilePivotX": 0,
"tilePivotY": 0,
"biomeFieldUid": null
},
{
"__type": "Tiles",
"identifier": "Floor",
"type": "Tiles",
"uid": 5,
"doc": null,
"uiColor": null,
"gridSize": 32,
"guideGridWid": 0,
"guideGridHei": 0,
"displayOpacity": 1,
"inactiveOpacity": 1,
"hideInList": false,
"hideFieldsWhenInactive": false,
"canSelectWhenInactive": true,
"renderInWorldView": true,
"pxOffsetX": 0,
"pxOffsetY": 0,
"parallaxFactorX": 0,
"parallaxFactorY": 0,
"parallaxScaling": true,
"requiredTags": [],
"excludedTags": [],
"autoTilesKilledByOtherLayerUid": null,
"uiFilterTags": [],
"useAsyncRender": false,
"intGridValues": [],
"intGridValuesGroups": [],
"autoRuleGroups": [],
"autoSourceLayerDefUid": null,
"tilesetDefUid": 2,
"tilePivotX": 0,
"tilePivotY": 0,
"biomeFieldUid": null
}
], "entities": [], "tilesets": [
{
"__cWid": 3,
"__cHei": 3,
"identifier": "Intercut",
"uid": 1,
"relPath": "../tilesets/intercut.png",
"embedAtlas": null,
"pxWid": 96,
"pxHei": 96,
"tileGridSize": 32,
"spacing": 0,
"padding": 0,
"tags": [],
"tagsSourceEnumUid": null,
"enumTags": [],
"customData": [],
"savedSelections": [],
"cachedPixelData": { "opaqueTiles": "111111111", "averageColors": "f223f223f223f223f223f223f223f223f223" }
},
{
"__cWid": 1,
"__cHei": 1,
"identifier": "Base",
"uid": 2,
"relPath": "../tilesets/base.png",
"embedAtlas": null,
"pxWid": 32,
"pxHei": 32,
"tileGridSize": 32,
"spacing": 0,
"padding": 0,
"tags": [],
"tagsSourceEnumUid": null,
"enumTags": [],
"customData": [],
"savedSelections": [],
"cachedPixelData": { "opaqueTiles": "1", "averageColors": "f111" }
},
{
"__cWid": 3,
"__cHei": 3,
"identifier": "Walls",
"uid": 3,
"relPath": "../tilesets/walls.png",
"embedAtlas": null,
"pxWid": 96,
"pxHei": 96,
"tileGridSize": 32,
"spacing": 0,
"padding": 0,
"tags": [],
"tagsSourceEnumUid": null,
"enumTags": [],
"customData": [],
"savedSelections": [],
"cachedPixelData": { "opaqueTiles": "111111111", "averageColors": "f88af89af88af89af89af89af88af89af88a" }
},
{
"__cWid": 1,
"__cHei": 1,
"identifier": "Block",
"uid": 4,
"relPath": "../tilesets/block.png",
"embedAtlas": null,
"pxWid": 32,
"pxHei": 32,
"tileGridSize": 32,
"spacing": 0,
"padding": 0,
"tags": [],
"tagsSourceEnumUid": null,
"enumTags": [],
"customData": [],
"savedSelections": [],
"cachedPixelData": { "opaqueTiles": "1", "averageColors": "f88a" }
}
], "enums": [], "externalEnums": [], "levelFields": [] },
"levels": [
{
"identifier": "Level_0",
"iid": "f7eda580-c210-11ef-bffb-6b05aa089ccc",
"uid": 0,
"worldX": 0,
"worldY": 0,
"worldDepth": 0,
"pxWid": 384,
"pxHei": 288,
"__bgColor": "#696A79",
"bgColor": null,
"useAutoIdentifier": true,
"bgRelPath": null,
"bgPos": null,
"bgPivotX": 0.5,
"bgPivotY": 0.5,
"__smartColor": "#ADADB5",
"__bgPos": null,
"externalRelPath": null,
"fieldInstances": [],
"layerInstances": [
{
"__identifier": "Floor_2",
"__type": "Tiles",
"__cWid": 12,
"__cHei": 9,
"__gridSize": 32,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
"__tilesetDefUid": 1,
"__tilesetRelPath": "../tilesets/intercut.png",
"iid": "22e79470-c210-11ef-bffb-f789fe121d9f",
"levelId": 0,
"layerDefUid": 7,
"pxOffsetX": 0,
"pxOffsetY": 0,
"visible": true,
"optionalRules": [],
"intGridCsv": [],
"autoLayerTiles": [],
"seed": 7519619,
"overrideTilesetUid": null,
"gridTiles": [
{ "px": [32,32], "src": [0,0], "f": 0, "t": 0, "d": [13], "a": 1 },
{ "px": [64,32], "src": [64,0], "f": 0, "t": 2, "d": [14], "a": 1 },
{ "px": [288,32], "src": [0,0], "f": 0, "t": 0, "d": [21], "a": 1 },
{ "px": [320,32], "src": [64,0], "f": 0, "t": 2, "d": [22], "a": 1 },
{ "px": [32,64], "src": [0,64], "f": 0, "t": 6, "d": [25], "a": 1 },
{ "px": [64,64], "src": [32,32], "f": 0, "t": 4, "d": [26], "a": 1 },
{ "px": [96,64], "src": [32,0], "f": 0, "t": 1, "d": [27], "a": 1 },
{ "px": [128,64], "src": [32,0], "f": 0, "t": 1, "d": [28], "a": 1 },
{ "px": [160,64], "src": [32,0], "f": 0, "t": 1, "d": [29], "a": 1 },
{ "px": [192,64], "src": [32,0], "f": 0, "t": 1, "d": [30], "a": 1 },
{ "px": [224,64], "src": [32,0], "f": 0, "t": 1, "d": [31], "a": 1 },
{ "px": [256,64], "src": [32,0], "f": 0, "t": 1, "d": [32], "a": 1 },
{ "px": [288,64], "src": [32,32], "f": 0, "t": 4, "d": [33], "a": 1 },
{ "px": [320,64], "src": [64,64], "f": 0, "t": 8, "d": [34], "a": 1 },
{ "px": [64,96], "src": [0,32], "f": 0, "t": 3, "d": [38], "a": 1 },
{ "px": [96,96], "src": [32,32], "f": 0, "t": 4, "d": [39], "a": 1 },
{ "px": [128,96], "src": [32,64], "f": 0, "t": 7, "d": [40], "a": 1 },
{ "px": [160,96], "src": [32,64], "f": 0, "t": 7, "d": [41], "a": 1 },
{ "px": [192,96], "src": [32,64], "f": 0, "t": 7, "d": [42], "a": 1 },
{ "px": [224,96], "src": [32,64], "f": 0, "t": 7, "d": [43], "a": 1 },
{ "px": [256,96], "src": [32,32], "f": 0, "t": 4, "d": [44], "a": 1 },
{ "px": [288,96], "src": [64,32], "f": 0, "t": 5, "d": [45], "a": 1 },
{ "px": [64,128], "src": [0,32], "f": 0, "t": 3, "d": [50], "a": 1 },
{ "px": [96,128], "src": [64,32], "f": 0, "t": 5, "d": [51], "a": 1 },
{ "px": [256,128], "src": [0,32], "f": 0, "t": 3, "d": [56], "a": 1 },
{ "px": [288,128], "src": [64,32], "f": 0, "t": 5, "d": [57], "a": 1 },
{ "px": [64,160], "src": [0,32], "f": 0, "t": 3, "d": [62], "a": 1 },
{ "px": [96,160], "src": [32,32], "f": 0, "t": 4, "d": [63], "a": 1 },
{ "px": [128,160], "src": [32,0], "f": 0, "t": 1, "d": [64], "a": 1 },
{ "px": [160,160], "src": [32,0], "f": 0, "t": 1, "d": [65], "a": 1 },
{ "px": [192,160], "src": [32,0], "f": 0, "t": 1, "d": [66], "a": 1 },
{ "px": [224,160], "src": [32,0], "f": 0, "t": 1, "d": [67], "a": 1 },
{ "px": [256,160], "src": [32,32], "f": 0, "t": 4, "d": [68], "a": 1 },
{ "px": [288,160], "src": [64,32], "f": 0, "t": 5, "d": [69], "a": 1 },
{ "px": [32,192], "src": [0,0], "f": 0, "t": 0, "d": [73], "a": 1 },
{ "px": [64,192], "src": [32,32], "f": 0, "t": 4, "d": [74], "a": 1 },
{ "px": [96,192], "src": [32,64], "f": 0, "t": 7, "d": [75], "a": 1 },
{ "px": [128,192], "src": [32,64], "f": 0, "t": 7, "d": [76], "a": 1 },
{ "px": [160,192], "src": [32,64], "f": 0, "t": 7, "d": [77], "a": 1 },
{ "px": [192,192], "src": [32,64], "f": 0, "t": 7, "d": [78], "a": 1 },
{ "px": [224,192], "src": [32,64], "f": 0, "t": 7, "d": [79], "a": 1 },
{ "px": [256,192], "src": [32,64], "f": 0, "t": 7, "d": [80], "a": 1 },
{ "px": [288,192], "src": [32,32], "f": 0, "t": 4, "d": [81], "a": 1 },
{ "px": [320,192], "src": [64,0], "f": 0, "t": 2, "d": [82], "a": 1 },
{ "px": [32,224], "src": [0,64], "f": 0, "t": 6, "d": [85], "a": 1 },
{ "px": [64,224], "src": [64,64], "f": 0, "t": 8, "d": [86], "a": 1 },
{ "px": [288,224], "src": [0,64], "f": 0, "t": 6, "d": [93], "a": 1 },
{ "px": [320,224], "src": [64,64], "f": 0, "t": 8, "d": [94], "a": 1 }
],
"entityInstances": []
},
{
"__identifier": "Walls",
"__type": "Tiles",
"__cWid": 12,
"__cHei": 9,
"__gridSize": 32,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
"__tilesetDefUid": 3,
"__tilesetRelPath": "../tilesets/walls.png",
"iid": "857a8620-c210-11ef-bffb-8318132dc9ca",
"levelId": 0,
"layerDefUid": 6,
"pxOffsetX": 0,
"pxOffsetY": 0,
"visible": true,
"optionalRules": [],
"intGridCsv": [],
"autoLayerTiles": [],
"seed": 8442990,
"overrideTilesetUid": null,
"gridTiles": [
{ "px": [0,0], "src": [64,64], "f": 0, "t": 8, "d": [0], "a": 1 },
{ "px": [128,0], "src": [0,64], "f": 0, "t": 6, "d": [4], "a": 1 },
{ "px": [160,0], "src": [32,64], "f": 0, "t": 7, "d": [5], "a": 1 },
{ "px": [192,0], "src": [32,64], "f": 0, "t": 7, "d": [6], "a": 1 },
{ "px": [224,0], "src": [64,64], "f": 0, "t": 8, "d": [7], "a": 1 },
{ "px": [352,0], "src": [0,64], "f": 0, "t": 6, "d": [11], "a": 1 },
{ "px": [64,64], "src": [0,0], "f": 0, "t": 0, "d": [26], "a": 1 },
{ "px": [96,64], "src": [64,0], "f": 0, "t": 2, "d": [27], "a": 1 },
{ "px": [160,64], "src": [0,0], "f": 0, "t": 0, "d": [29], "a": 1 },
{ "px": [256,64], "src": [0,0], "f": 0, "t": 0, "d": [32], "a": 1 },
{ "px": [64,96], "src": [0,64], "f": 0, "t": 6, "d": [38], "a": 1 },
{ "px": [96,96], "src": [64,64], "f": 0, "t": 8, "d": [39], "a": 1 },
{ "px": [160,96], "src": [0,64], "f": 0, "t": 6, "d": [41], "a": 1 },
{ "px": [256,96], "src": [0,64], "f": 0, "t": 6, "d": [44], "a": 1 },
{ "px": [0,256], "src": [64,0], "f": 0, "t": 2, "d": [96], "a": 1 },
{ "px": [128,256], "src": [0,0], "f": 0, "t": 0, "d": [100], "a": 1 },
{ "px": [160,256], "src": [32,0], "f": 0, "t": 1, "d": [101], "a": 1 },
{ "px": [192,256], "src": [32,0], "f": 0, "t": 1, "d": [102], "a": 1 },
{ "px": [224,256], "src": [64,0], "f": 0, "t": 2, "d": [103], "a": 1 },
{ "px": [352,256], "src": [0,0], "f": 0, "t": 0, "d": [107], "a": 1 }
],
"entityInstances": []
},
{
"__identifier": "Floor",
"__type": "Tiles",
"__cWid": 12,
"__cHei": 9,
"__gridSize": 32,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
"__tilesetDefUid": 2,
"__tilesetRelPath": "../tilesets/base.png",
"iid": "3c7c9c60-c210-11ef-bffb-dd5644ced100",
"levelId": 0,
"layerDefUid": 5,
"pxOffsetX": 0,
"pxOffsetY": 0,
"visible": true,
"optionalRules": [],
"intGridCsv": [],
"autoLayerTiles": [],
"seed": 8173604,
"overrideTilesetUid": null,
"gridTiles": [
{ "px": [0,0], "src": [0,0], "f": 0, "t": 0, "d": [0], "a": 1 },
{ "px": [32,0], "src": [0,0], "f": 0, "t": 0, "d": [1], "a": 1 },
{ "px": [64,0], "src": [0,0], "f": 0, "t": 0, "d": [2], "a": 1 },
{ "px": [96,0], "src": [0,0], "f": 0, "t": 0, "d": [3], "a": 1 },
{ "px": [128,0], "src": [0,0], "f": 0, "t": 0, "d": [4], "a": 1 },
{ "px": [160,0], "src": [0,0], "f": 0, "t": 0, "d": [5], "a": 1 },
{ "px": [192,0], "src": [0,0], "f": 0, "t": 0, "d": [6], "a": 1 },
{ "px": [224,0], "src": [0,0], "f": 0, "t": 0, "d": [7], "a": 1 },
{ "px": [256,0], "src": [0,0], "f": 0, "t": 0, "d": [8], "a": 1 },
{ "px": [288,0], "src": [0,0], "f": 0, "t": 0, "d": [9], "a": 1 },
{ "px": [320,0], "src": [0,0], "f": 0, "t": 0, "d": [10], "a": 1 },
{ "px": [352,0], "src": [0,0], "f": 0, "t": 0, "d": [11], "a": 1 },
{ "px": [0,32], "src": [0,0], "f": 0, "t": 0, "d": [12], "a": 1 },
{ "px": [32,32], "src": [0,0], "f": 0, "t": 0, "d": [13], "a": 1 },
{ "px": [64,32], "src": [0,0], "f": 0, "t": 0, "d": [14], "a": 1 },
{ "px": [96,32], "src": [0,0], "f": 0, "t": 0, "d": [15], "a": 1 },
{ "px": [128,32], "src": [0,0], "f": 0, "t": 0, "d": [16], "a": 1 },
{ "px": [160,32], "src": [0,0], "f": 0, "t": 0, "d": [17], "a": 1 },
{ "px": [192,32], "src": [0,0], "f": 0, "t": 0, "d": [18], "a": 1 },
{ "px": [224,32], "src": [0,0], "f": 0, "t": 0, "d": [19], "a": 1 },
{ "px": [256,32], "src": [0,0], "f": 0, "t": 0, "d": [20], "a": 1 },
{ "px": [288,32], "src": [0,0], "f": 0, "t": 0, "d": [21], "a": 1 },
{ "px": [320,32], "src": [0,0], "f": 0, "t": 0, "d": [22], "a": 1 },
{ "px": [352,32], "src": [0,0], "f": 0, "t": 0, "d": [23], "a": 1 },
{ "px": [0,64], "src": [0,0], "f": 0, "t": 0, "d": [24], "a": 1 },
{ "px": [32,64], "src": [0,0], "f": 0, "t": 0, "d": [25], "a": 1 },
{ "px": [64,64], "src": [0,0], "f": 0, "t": 0, "d": [26], "a": 1 },
{ "px": [96,64], "src": [0,0], "f": 0, "t": 0, "d": [27], "a": 1 },
{ "px": [128,64], "src": [0,0], "f": 0, "t": 0, "d": [28], "a": 1 },
{ "px": [160,64], "src": [0,0], "f": 0, "t": 0, "d": [29], "a": 1 },
{ "px": [192,64], "src": [0,0], "f": 0, "t": 0, "d": [30], "a": 1 },
{ "px": [224,64], "src": [0,0], "f": 0, "t": 0, "d": [31], "a": 1 },
{ "px": [256,64], "src": [0,0], "f": 0, "t": 0, "d": [32], "a": 1 },
{ "px": [288,64], "src": [0,0], "f": 0, "t": 0, "d": [33], "a": 1 },
{ "px": [320,64], "src": [0,0], "f": 0, "t": 0, "d": [34], "a": 1 },
{ "px": [352,64], "src": [0,0], "f": 0, "t": 0, "d": [35], "a": 1 },
{ "px": [0,96], "src": [0,0], "f": 0, "t": 0, "d": [36], "a": 1 },
{ "px": [32,96], "src": [0,0], "f": 0, "t": 0, "d": [37], "a": 1 },
{ "px": [64,96], "src": [0,0], "f": 0, "t": 0, "d": [38], "a": 1 },
{ "px": [96,96], "src": [0,0], "f": 0, "t": 0, "d": [39], "a": 1 },
{ "px": [128,96], "src": [0,0], "f": 0, "t": 0, "d": [40], "a": 1 },
{ "px": [160,96], "src": [0,0], "f": 0, "t": 0, "d": [41], "a": 1 },
{ "px": [192,96], "src": [0,0], "f": 0, "t": 0, "d": [42], "a": 1 },
{ "px": [224,96], "src": [0,0], "f": 0, "t": 0, "d": [43], "a": 1 },
{ "px": [256,96], "src": [0,0], "f": 0, "t": 0, "d": [44], "a": 1 },
{ "px": [288,96], "src": [0,0], "f": 0, "t": 0, "d": [45], "a": 1 },
{ "px": [320,96], "src": [0,0], "f": 0, "t": 0, "d": [46], "a": 1 },
{ "px": [352,96], "src": [0,0], "f": 0, "t": 0, "d": [47], "a": 1 },
{ "px": [0,128], "src": [0,0], "f": 0, "t": 0, "d": [48], "a": 1 },
{ "px": [32,128], "src": [0,0], "f": 0, "t": 0, "d": [49], "a": 1 },
{ "px": [64,128], "src": [0,0], "f": 0, "t": 0, "d": [50], "a": 1 },
{ "px": [96,128], "src": [0,0], "f": 0, "t": 0, "d": [51], "a": 1 },
{ "px": [128,128], "src": [0,0], "f": 0, "t": 0, "d": [52], "a": 1 },
{ "px": [160,128], "src": [0,0], "f": 0, "t": 0, "d": [53], "a": 1 },
{ "px": [192,128], "src": [0,0], "f": 0, "t": 0, "d": [54], "a": 1 },
{ "px": [224,128], "src": [0,0], "f": 0, "t": 0, "d": [55], "a": 1 },
{ "px": [256,128], "src": [0,0], "f": 0, "t": 0, "d": [56], "a": 1 },
{ "px": [288,128], "src": [0,0], "f": 0, "t": 0, "d": [57], "a": 1 },
{ "px": [320,128], "src": [0,0], "f": 0, "t": 0, "d": [58], "a": 1 },
{ "px": [352,128], "src": [0,0], "f": 0, "t": 0, "d": [59], "a": 1 },
{ "px": [0,160], "src": [0,0], "f": 0, "t": 0, "d": [60], "a": 1 },
{ "px": [32,160], "src": [0,0], "f": 0, "t": 0, "d": [61], "a": 1 },
{ "px": [64,160], "src": [0,0], "f": 0, "t": 0, "d": [62], "a": 1 },
{ "px": [96,160], "src": [0,0], "f": 0, "t": 0, "d": [63], "a": 1 },
{ "px": [128,160], "src": [0,0], "f": 0, "t": 0, "d": [64], "a": 1 },
{ "px": [160,160], "src": [0,0], "f": 0, "t": 0, "d": [65], "a": 1 },
{ "px": [192,160], "src": [0,0], "f": 0, "t": 0, "d": [66], "a": 1 },
{ "px": [224,160], "src": [0,0], "f": 0, "t": 0, "d": [67], "a": 1 },
{ "px": [256,160], "src": [0,0], "f": 0, "t": 0, "d": [68], "a": 1 },
{ "px": [288,160], "src": [0,0], "f": 0, "t": 0, "d": [69], "a": 1 },
{ "px": [320,160], "src": [0,0], "f": 0, "t": 0, "d": [70], "a": 1 },
{ "px": [352,160], "src": [0,0], "f": 0, "t": 0, "d": [71], "a": 1 },
{ "px": [0,192], "src": [0,0], "f": 0, "t": 0, "d": [72], "a": 1 },
{ "px": [32,192], "src": [0,0], "f": 0, "t": 0, "d": [73], "a": 1 },
{ "px": [64,192], "src": [0,0], "f": 0, "t": 0, "d": [74], "a": 1 },
{ "px": [96,192], "src": [0,0], "f": 0, "t": 0, "d": [75], "a": 1 },
{ "px": [128,192], "src": [0,0], "f": 0, "t": 0, "d": [76], "a": 1 },
{ "px": [160,192], "src": [0,0], "f": 0, "t": 0, "d": [77], "a": 1 },
{ "px": [192,192], "src": [0,0], "f": 0, "t": 0, "d": [78], "a": 1 },
{ "px": [224,192], "src": [0,0], "f": 0, "t": 0, "d": [79], "a": 1 },
{ "px": [256,192], "src": [0,0], "f": 0, "t": 0, "d": [80], "a": 1 },
{ "px": [288,192], "src": [0,0], "f": 0, "t": 0, "d": [81], "a": 1 },
{ "px": [320,192], "src": [0,0], "f": 0, "t": 0, "d": [82], "a": 1 },
{ "px": [352,192], "src": [0,0], "f": 0, "t": 0, "d": [83], "a": 1 },
{ "px": [0,224], "src": [0,0], "f": 0, "t": 0, "d": [84], "a": 1 },
{ "px": [32,224], "src": [0,0], "f": 0, "t": 0, "d": [85], "a": 1 },
{ "px": [64,224], "src": [0,0], "f": 0, "t": 0, "d": [86], "a": 1 },
{ "px": [96,224], "src": [0,0], "f": 0, "t": 0, "d": [87], "a": 1 },
{ "px": [128,224], "src": [0,0], "f": 0, "t": 0, "d": [88], "a": 1 },
{ "px": [160,224], "src": [0,0], "f": 0, "t": 0, "d": [89], "a": 1 },
{ "px": [192,224], "src": [0,0], "f": 0, "t": 0, "d": [90], "a": 1 },
{ "px": [224,224], "src": [0,0], "f": 0, "t": 0, "d": [91], "a": 1 },
{ "px": [256,224], "src": [0,0], "f": 0, "t": 0, "d": [92], "a": 1 },
{ "px": [288,224], "src": [0,0], "f": 0, "t": 0, "d": [93], "a": 1 },
{ "px": [320,224], "src": [0,0], "f": 0, "t": 0, "d": [94], "a": 1 },
{ "px": [352,224], "src": [0,0], "f": 0, "t": 0, "d": [95], "a": 1 },
{ "px": [0,256], "src": [0,0], "f": 0, "t": 0, "d": [96], "a": 1 },
{ "px": [32,256], "src": [0,0], "f": 0, "t": 0, "d": [97], "a": 1 },
{ "px": [64,256], "src": [0,0], "f": 0, "t": 0, "d": [98], "a": 1 },
{ "px": [96,256], "src": [0,0], "f": 0, "t": 0, "d": [99], "a": 1 },
{ "px": [128,256], "src": [0,0], "f": 0, "t": 0, "d": [100], "a": 1 },
{ "px": [160,256], "src": [0,0], "f": 0, "t": 0, "d": [101], "a": 1 },
{ "px": [192,256], "src": [0,0], "f": 0, "t": 0, "d": [102], "a": 1 },
{ "px": [224,256], "src": [0,0], "f": 0, "t": 0, "d": [103], "a": 1 },
{ "px": [256,256], "src": [0,0], "f": 0, "t": 0, "d": [104], "a": 1 },
{ "px": [288,256], "src": [0,0], "f": 0, "t": 0, "d": [105], "a": 1 },
{ "px": [320,256], "src": [0,0], "f": 0, "t": 0, "d": [106], "a": 1 },
{ "px": [352,256], "src": [0,0], "f": 0, "t": 0, "d": [107], "a": 1 }
],
"entityInstances": []
}
],
"__neighbours": [{ "levelIid": "f2e8f060-c210-11ef-bffb-31fe7a15090b", "dir": "e" }]
},
{
"identifier": "Level_1",
"iid": "f2e8f060-c210-11ef-bffb-31fe7a15090b",
"uid": 8,
"worldX": 384,
"worldY": 0,
"worldDepth": 0,
"pxWid": 384,
"pxHei": 288,
"__bgColor": "#696A79",
"bgColor": null,
"useAutoIdentifier": true,
"bgRelPath": null,
"bgPos": null,
"bgPivotX": 0.5,
"bgPivotY": 0.5,
"__smartColor": "#ADADB5",
"__bgPos": null,
"externalRelPath": null,
"fieldInstances": [],
"layerInstances": [
{
"__identifier": "Floor_2",
"__type": "Tiles",
"__cWid": 12,
"__cHei": 9,
"__gridSize": 32,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
"__tilesetDefUid": 1,
"__tilesetRelPath": "../tilesets/intercut.png",
"iid": "f2e8f061-c210-11ef-bffb-6f89236d491a",
"levelId": 8,
"layerDefUid": 7,
"pxOffsetX": 0,
"pxOffsetY": 0,
"visible": true,
"optionalRules": [],
"intGridCsv": [],
"autoLayerTiles": [],
"seed": 9573822,
"overrideTilesetUid": null,
"gridTiles": [
{ "px": [32,32], "src": [0,0], "f": 0, "t": 0, "d": [13], "a": 1 },
{ "px": [64,32], "src": [32,0], "f": 0, "t": 1, "d": [14], "a": 1 },
{ "px": [96,32], "src": [64,0], "f": 0, "t": 2, "d": [15], "a": 1 },
{ "px": [256,32], "src": [0,0], "f": 0, "t": 0, "d": [20], "a": 1 },
{ "px": [288,32], "src": [32,0], "f": 0, "t": 1, "d": [21], "a": 1 },
{ "px": [320,32], "src": [64,0], "f": 0, "t": 2, "d": [22], "a": 1 },
{ "px": [32,64], "src": [32,32], "f": 0, "t": 4, "d": [25], "a": 1 },
{ "px": [64,64], "src": [32,32], "f": 0, "t": 4, "d": [26], "a": 1 },
{ "px": [96,64], "src": [32,32], "f": 0, "t": 4, "d": [27], "a": 1 },
{ "px": [256,64], "src": [0,32], "f": 0, "t": 3, "d": [32], "a": 1 },
{ "px": [288,64], "src": [32,32], "f": 0, "t": 4, "d": [33], "a": 1 },
{ "px": [320,64], "src": [64,32], "f": 0, "t": 5, "d": [34], "a": 1 },
{ "px": [32,192], "src": [0,32], "f": 0, "t": 3, "d": [73], "a": 1 },
{ "px": [64,192], "src": [32,32], "f": 0, "t": 4, "d": [74], "a": 1 },
{ "px": [96,192], "src": [64,32], "f": 0, "t": 5, "d": [75], "a": 1 },
{ "px": [256,192], "src": [0,32], "f": 0, "t": 3, "d": [80], "a": 1 },
{ "px": [288,192], "src": [32,32], "f": 0, "t": 4, "d": [81], "a": 1 },
{ "px": [320,192], "src": [64,0], "f": 0, "t": 2, "d": [82], "a": 1 },
{ "px": [32,224], "src": [0,64], "f": 0, "t": 6, "d": [85], "a": 1 },
{ "px": [64,224], "src": [32,64], "f": 0, "t": 7, "d": [86], "a": 1 },
{ "px": [96,224], "src": [64,64], "f": 0, "t": 8, "d": [87], "a": 1 },
{ "px": [256,224], "src": [0,32], "f": 0, "t": 3, "d": [92], "a": 1 },
{ "px": [288,224], "src": [32,64], "f": 0, "t": 7, "d": [93], "a": 1 },
{ "px": [320,224], "src": [64,64], "f": 0, "t": 8, "d": [94], "a": 1 }
],
"entityInstances": []
},
{
"__identifier": "Walls",
"__type": "Tiles",
"__cWid": 12,
"__cHei": 9,
"__gridSize": 32,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
"__tilesetDefUid": 3,
"__tilesetRelPath": "../tilesets/walls.png",
"iid": "f2e8f062-c210-11ef-bffb-b3126f971752",
"levelId": 8,
"layerDefUid": 6,
"pxOffsetX": 0,
"pxOffsetY": 0,
"visible": true,
"optionalRules": [],
"intGridCsv": [],
"autoLayerTiles": [],
"seed": 1645397,
"overrideTilesetUid": null,
"gridTiles": [
{ "px": [160,0], "src": [0,32], "f": 0, "t": 3, "d": [5], "a": 1 },
{ "px": [192,0], "src": [64,32], "f": 0, "t": 5, "d": [6], "a": 1 },
{ "px": [160,32], "src": [0,32], "f": 0, "t": 3, "d": [17], "a": 1 },
{ "px": [192,32], "src": [64,32], "f": 0, "t": 5, "d": [18], "a": 1 },
{ "px": [160,64], "src": [0,64], "f": 0, "t": 6, "d": [29], "a": 1 },
{ "px": [192,64], "src": [64,64], "f": 0, "t": 8, "d": [30], "a": 1 },
{ "px": [0,96], "src": [32,0], "f": 0, "t": 1, "d": [36], "a": 1 },
{ "px": [32,96], "src": [32,0], "f": 0, "t": 1, "d": [37], "a": 1 },
{ "px": [64,96], "src": [32,0], "f": 0, "t": 1, "d": [38], "a": 1 },
{ "px": [96,96], "src": [64,0], "f": 0, "t": 2, "d": [39], "a": 1 },
{ "px": [256,96], "src": [0,0], "f": 0, "t": 0, "d": [44], "a": 1 },
{ "px": [288,96], "src": [32,0], "f": 0, "t": 1, "d": [45], "a": 1 },
{ "px": [320,96], "src": [32,0], "f": 0, "t": 1, "d": [46], "a": 1 },
{ "px": [352,96], "src": [32,0], "f": 0, "t": 1, "d": [47], "a": 1 },
{ "px": [0,128], "src": [32,32], "f": 0, "t": 4, "d": [48], "a": 1 },
{ "px": [32,128], "src": [32,32], "f": 0, "t": 4, "d": [49], "a": 1 },
{ "px": [64,128], "src": [32,32], "f": 0, "t": 4, "d": [50], "a": 1 },
{ "px": [96,128], "src": [64,32], "f": 0, "t": 5, "d": [51], "a": 1 },
{ "px": [256,128], "src": [32,32], "f": 0, "t": 4, "d": [56], "a": 1 },
{ "px": [288,128], "src": [32,32], "f": 0, "t": 4, "d": [57], "a": 1 },
{ "px": [320,128], "src": [32,32], "f": 0, "t": 4, "d": [58], "a": 1 },
{ "px": [352,128], "src": [32,32], "f": 0, "t": 4, "d": [59], "a": 1 },
{ "px": [0,160], "src": [32,64], "f": 0, "t": 7, "d": [60], "a": 1 },
{ "px": [32,160], "src": [32,64], "f": 0, "t": 7, "d": [61], "a": 1 },
{ "px": [64,160], "src": [32,64], "f": 0, "t": 7, "d": [62], "a": 1 },
{ "px": [96,160], "src": [64,64], "f": 0, "t": 8, "d": [63], "a": 1 },
{ "px": [256,160], "src": [0,64], "f": 0, "t": 6, "d": [68], "a": 1 },
{ "px": [288,160], "src": [32,64], "f": 0, "t": 7, "d": [69], "a": 1 },
{ "px": [320,160], "src": [32,64], "f": 0, "t": 7, "d": [70], "a": 1 },
{ "px": [352,160], "src": [32,64], "f": 0, "t": 7, "d": [71], "a": 1 },
{ "px": [160,192], "src": [0,0], "f": 0, "t": 0, "d": [77], "a": 1 },
{ "px": [192,192], "src": [64,0], "f": 0, "t": 2, "d": [78], "a": 1 },
{ "px": [160,224], "src": [0,32], "f": 0, "t": 3, "d": [89], "a": 1 },
{ "px": [192,224], "src": [64,32], "f": 0, "t": 5, "d": [90], "a": 1 },
{ "px": [160,256], "src": [0,32], "f": 0, "t": 3, "d": [101], "a": 1 },
{ "px": [192,256], "src": [64,32], "f": 0, "t": 5, "d": [102], "a": 1 }
],
"entityInstances": []
},
{
"__identifier": "Floor",
"__type": "Tiles",
"__cWid": 12,
"__cHei": 9,
"__gridSize": 32,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
"__tilesetDefUid": 2,
"__tilesetRelPath": "../tilesets/base.png",
"iid": "f2e8f063-c210-11ef-bffb-a76072bfa5d6",
"levelId": 8,
"layerDefUid": 5,
"pxOffsetX": 0,
"pxOffsetY": 0,
"visible": true,
"optionalRules": [],
"intGridCsv": [],
"autoLayerTiles": [],
"seed": 1336393,
"overrideTilesetUid": null,
"gridTiles": [
{ "px": [0,0], "src": [0,0], "f": 0, "t": 0, "d": [0], "a": 1 },
{ "px": [32,0], "src": [0,0], "f": 0, "t": 0, "d": [1], "a": 1 },
{ "px": [64,0], "src": [0,0], "f": 0, "t": 0, "d": [2], "a": 1 },
{ "px": [96,0], "src": [0,0], "f": 0, "t": 0, "d": [3], "a": 1 },
{ "px": [128,0], "src": [0,0], "f": 0, "t": 0, "d": [4], "a": 1 },
{ "px": [160,0], "src": [0,0], "f": 0, "t": 0, "d": [5], "a": 1 },
{ "px": [192,0], "src": [0,0], "f": 0, "t": 0, "d": [6], "a": 1 },
{ "px": [224,0], "src": [0,0], "f": 0, "t": 0, "d": [7], "a": 1 },
{ "px": [256,0], "src": [0,0], "f": 0, "t": 0, "d": [8], "a": 1 },
{ "px": [288,0], "src": [0,0], "f": 0, "t": 0, "d": [9], "a": 1 },
{ "px": [320,0], "src": [0,0], "f": 0, "t": 0, "d": [10], "a": 1 },
{ "px": [352,0], "src": [0,0], "f": 0, "t": 0, "d": [11], "a": 1 },
{ "px": [0,32], "src": [0,0], "f": 0, "t": 0, "d": [12], "a": 1 },
{ "px": [32,32], "src": [0,0], "f": 0, "t": 0, "d": [13], "a": 1 },
{ "px": [64,32], "src": [0,0], "f": 0, "t": 0, "d": [14], "a": 1 },
{ "px": [96,32], "src": [0,0], "f": 0, "t": 0, "d": [15], "a": 1 },
{ "px": [128,32], "src": [0,0], "f": 0, "t": 0, "d": [16], "a": 1 },
{ "px": [160,32], "src": [0,0], "f": 0, "t": 0, "d": [17], "a": 1 },
{ "px": [192,32], "src": [0,0], "f": 0, "t": 0, "d": [18], "a": 1 },
{ "px": [224,32], "src": [0,0], "f": 0, "t": 0, "d": [19], "a": 1 },
{ "px": [256,32], "src": [0,0], "f": 0, "t": 0, "d": [20], "a": 1 },
{ "px": [288,32], "src": [0,0], "f": 0, "t": 0, "d": [21], "a": 1 },
{ "px": [320,32], "src": [0,0], "f": 0, "t": 0, "d": [22], "a": 1 },
{ "px": [352,32], "src": [0,0], "f": 0, "t": 0, "d": [23], "a": 1 },
{ "px": [0,64], "src": [0,0], "f": 0, "t": 0, "d": [24], "a": 1 },
{ "px": [32,64], "src": [0,0], "f": 0, "t": 0, "d": [25], "a": 1 },
{ "px": [64,64], "src": [0,0], "f": 0, "t": 0, "d": [26], "a": 1 },
{ "px": [96,64], "src": [0,0], "f": 0, "t": 0, "d": [27], "a": 1 },
{ "px": [128,64], "src": [0,0], "f": 0, "t": 0, "d": [28], "a": 1 },
{ "px": [160,64], "src": [0,0], "f": 0, "t": 0, "d": [29], "a": 1 },
{ "px": [192,64], "src": [0,0], "f": 0, "t": 0, "d": [30], "a": 1 },
{ "px": [224,64], "src": [0,0], "f": 0, "t": 0, "d": [31], "a": 1 },
{ "px": [256,64], "src": [0,0], "f": 0, "t": 0, "d": [32], "a": 1 },
{ "px": [288,64], "src": [0,0], "f": 0, "t": 0, "d": [33], "a": 1 },
{ "px": [320,64], "src": [0,0], "f": 0, "t": 0, "d": [34], "a": 1 },
{ "px": [352,64], "src": [0,0], "f": 0, "t": 0, "d": [35], "a": 1 },
{ "px": [0,96], "src": [0,0], "f": 0, "t": 0, "d": [36], "a": 1 },
{ "px": [32,96], "src": [0,0], "f": 0, "t": 0, "d": [37], "a": 1 },
{ "px": [64,96], "src": [0,0], "f": 0, "t": 0, "d": [38], "a": 1 },
{ "px": [96,96], "src": [0,0], "f": 0, "t": 0, "d": [39], "a": 1 },
{ "px": [128,96], "src": [0,0], "f": 0, "t": 0, "d": [40], "a": 1 },
{ "px": [160,96], "src": [0,0], "f": 0, "t": 0, "d": [41], "a": 1 },
{ "px": [192,96], "src": [0,0], "f": 0, "t": 0, "d": [42], "a": 1 },
{ "px": [224,96], "src": [0,0], "f": 0, "t": 0, "d": [43], "a": 1 },
{ "px": [256,96], "src": [0,0], "f": 0, "t": 0, "d": [44], "a": 1 },
{ "px": [288,96], "src": [0,0], "f": 0, "t": 0, "d": [45], "a": 1 },
{ "px": [320,96], "src": [0,0], "f": 0, "t": 0, "d": [46], "a": 1 },
{ "px": [352,96], "src": [0,0], "f": 0, "t": 0, "d": [47], "a": 1 },
{ "px": [0,128], "src": [0,0], "f": 0, "t": 0, "d": [48], "a": 1 },
{ "px": [32,128], "src": [0,0], "f": 0, "t": 0, "d": [49], "a": 1 },
{ "px": [64,128], "src": [0,0], "f": 0, "t": 0, "d": [50], "a": 1 },
{ "px": [96,128], "src": [0,0], "f": 0, "t": 0, "d": [51], "a": 1 },
{ "px": [128,128], "src": [0,0], "f": 0, "t": 0, "d": [52], "a": 1 },
{ "px": [160,128], "src": [0,0], "f": 0, "t": 0, "d": [53], "a": 1 },
{ "px": [192,128], "src": [0,0], "f": 0, "t": 0, "d": [54], "a": 1 },
{ "px": [224,128], "src": [0,0], "f": 0, "t": 0, "d": [55], "a": 1 },
{ "px": [256,128], "src": [0,0], "f": 0, "t": 0, "d": [56], "a": 1 },
{ "px": [288,128], "src": [0,0], "f": 0, "t": 0, "d": [57], "a": 1 },
{ "px": [320,128], "src": [0,0], "f": 0, "t": 0, "d": [58], "a": 1 },
{ "px": [352,128], "src": [0,0], "f": 0, "t": 0, "d": [59], "a": 1 },
{ "px": [0,160], "src": [0,0], "f": 0, "t": 0, "d": [60], "a": 1 },
{ "px": [32,160], "src": [0,0], "f": 0, "t": 0, "d": [61], "a": 1 },
{ "px": [64,160], "src": [0,0], "f": 0, "t": 0, "d": [62], "a": 1 },
{ "px": [96,160], "src": [0,0], "f": 0, "t": 0, "d": [63], "a": 1 },
{ "px": [128,160], "src": [0,0], "f": 0, "t": 0, "d": [64], "a": 1 },
{ "px": [160,160], "src": [0,0], "f": 0, "t": 0, "d": [65], "a": 1 },
{ "px": [192,160], "src": [0,0], "f": 0, "t": 0, "d": [66], "a": 1 },
{ "px": [224,160], "src": [0,0], "f": 0, "t": 0, "d": [67], "a": 1 },
{ "px": [256,160], "src": [0,0], "f": 0, "t": 0, "d": [68], "a": 1 },
{ "px": [288,160], "src": [0,0], "f": 0, "t": 0, "d": [69], "a": 1 },
{ "px": [320,160], "src": [0,0], "f": 0, "t": 0, "d": [70], "a": 1 },
{ "px": [352,160], "src": [0,0], "f": 0, "t": 0, "d": [71], "a": 1 },
{ "px": [0,192], "src": [0,0], "f": 0, "t": 0, "d": [72], "a": 1 },
{ "px": [32,192], "src": [0,0], "f": 0, "t": 0, "d": [73], "a": 1 },
{ "px": [64,192], "src": [0,0], "f": 0, "t": 0, "d": [74], "a": 1 },
{ "px": [96,192], "src": [0,0], "f": 0, "t": 0, "d": [75], "a": 1 },
{ "px": [128,192], "src": [0,0], "f": 0, "t": 0, "d": [76], "a": 1 },
{ "px": [160,192], "src": [0,0], "f": 0, "t": 0, "d": [77], "a": 1 },
{ "px": [192,192], "src": [0,0], "f": 0, "t": 0, "d": [78], "a": 1 },
{ "px": [224,192], "src": [0,0], "f": 0, "t": 0, "d": [79], "a": 1 },
{ "px": [256,192], "src": [0,0], "f": 0, "t": 0, "d": [80], "a": 1 },
{ "px": [288,192], "src": [0,0], "f": 0, "t": 0, "d": [81], "a": 1 },
{ "px": [320,192], "src": [0,0], "f": 0, "t": 0, "d": [82], "a": 1 },
{ "px": [352,192], "src": [0,0], "f": 0, "t": 0, "d": [83], "a": 1 },
{ "px": [0,224], "src": [0,0], "f": 0, "t": 0, "d": [84], "a": 1 },
{ "px": [32,224], "src": [0,0], "f": 0, "t": 0, "d": [85], "a": 1 },
{ "px": [64,224], "src": [0,0], "f": 0, "t": 0, "d": [86], "a": 1 },
{ "px": [96,224], "src": [0,0], "f": 0, "t": 0, "d": [87], "a": 1 },
{ "px": [128,224], "src": [0,0], "f": 0, "t": 0, "d": [88], "a": 1 },
{ "px": [160,224], "src": [0,0], "f": 0, "t": 0, "d": [89], "a": 1 },
{ "px": [192,224], "src": [0,0], "f": 0, "t": 0, "d": [90], "a": 1 },
{ "px": [224,224], "src": [0,0], "f": 0, "t": 0, "d": [91], "a": 1 },
{ "px": [256,224], "src": [0,0], "f": 0, "t": 0, "d": [92], "a": 1 },
{ "px": [288,224], "src": [0,0], "f": 0, "t": 0, "d": [93], "a": 1 },
{ "px": [320,224], "src": [0,0], "f": 0, "t": 0, "d": [94], "a": 1 },
{ "px": [352,224], "src": [0,0], "f": 0, "t": 0, "d": [95], "a": 1 },
{ "px": [0,256], "src": [0,0], "f": 0, "t": 0, "d": [96], "a": 1 },
{ "px": [32,256], "src": [0,0], "f": 0, "t": 0, "d": [97], "a": 1 },
{ "px": [64,256], "src": [0,0], "f": 0, "t": 0, "d": [98], "a": 1 },
{ "px": [96,256], "src": [0,0], "f": 0, "t": 0, "d": [99], "a": 1 },
{ "px": [128,256], "src": [0,0], "f": 0, "t": 0, "d": [100], "a": 1 },
{ "px": [160,256], "src": [0,0], "f": 0, "t": 0, "d": [101], "a": 1 },
{ "px": [192,256], "src": [0,0], "f": 0, "t": 0, "d": [102], "a": 1 },
{ "px": [224,256], "src": [0,0], "f": 0, "t": 0, "d": [103], "a": 1 },
{ "px": [256,256], "src": [0,0], "f": 0, "t": 0, "d": [104], "a": 1 },
{ "px": [288,256], "src": [0,0], "f": 0, "t": 0, "d": [105], "a": 1 },
{ "px": [320,256], "src": [0,0], "f": 0, "t": 0, "d": [106], "a": 1 },
{ "px": [352,256], "src": [0,0], "f": 0, "t": 0, "d": [107], "a": 1 }
],
"entityInstances": []
}
],
"__neighbours": [{ "levelIid": "f7eda580-c210-11ef-bffb-6b05aa089ccc", "dir": "w" }]
}
],
"worlds": [],
"dummyWorldIid": "f7ed7e71-c210-11ef-bffb-e5502bfa23c6"
}

View File

@ -0,0 +1,61 @@
architecture:
--------------
provinces:
--------------
{
"provinces": {
"a": "Zoo",
"b": "Gator Pen",
"c": "Food Storage"
},
"architecture": {
"@": "entrance",
"#": "wall",
" ": "floor",
"*": { "item": "gecko" },
".": {
"pickup": [
"AGI", "AGI", "AGI", "AGI",
"PSI", "PSI",
"EXP"
]
},
"!": { "item": "colonialGoose" },
"1": {
"label": "The gator pen appears to be locked. Some bats behind the barred gate are amusing themselves by swooping and darting just out of the alligators' reach.",
"checks": [
{
"skills": ["lore1"],
"locked": "That wall sure does look impenetrable.",
"unlockable": "Notice a failure in the construction.",
"unlockScene": [
"I dig my clawed fingers into a crack between the bricks and feel the concrete give way.",
"This structure, built by mortals, is impermanent. Soon none of it will exist.",
"I rip another clump of brittle earth from the crack, no longer invisible.",
"And another. When the gap's wide enough to crawl through, I climb in."
]
},
{
"skills": ["stare0"],
"locked": "The bats are happy by themselves.",
"unlockable": "These bats could be enjoying themselves so much more.",
"unlockScene": [
"I hold my face to the bars. One bat looks at me.",
"\"Here, little bat\" -- I think before I say it. No, relate to it as an equal.",
"What does it really want?",
"What does any mortal want? It wants to feel good --"",
"So stare --",
"...",
"... Now it breaks. Like any mortal.",
"Still dripping, it flaps unsurely to the door and -- with only a little coaxing -- it opens the lock."
]
}
]
},
"2": {
"label":
}
}
}

View File

@ -84,6 +84,14 @@ export class Size {
add(other: Size) { add(other: Size) {
return new Size(this.w + other.w, this.h + other.h); return new Size(this.w + other.w, this.h + other.h);
} }
equals(other: Size) {
return this.w == other.w && this.h == other.h;
}
toString(): string {
return `${this.w}x${this.h}`
}
} }
export class Rect { export class Rect {
@ -121,6 +129,18 @@ export class Grid<T> {
} }
} }
static createGridFromMultilineString(multiline: string): Grid<string> {
let lines = []
for (let line of multiline.split("\n")) {
let trimmedLine = line.trim();
if (trimmedLine == "") {
continue;
}
lines.push(trimmedLine)
}
return this.createGridFromStringArray(lines);
}
static createGridFromStringArray(ary: Array<string>): Grid<string> { static createGridFromStringArray(ary: Array<string>): Grid<string> {
let w = 0; let w = 0;
let h = ary.length; let h = ary.length;

View File

@ -1,39 +1,24 @@
import {Grid, Point, Rect, Size} from "./engine/datatypes.ts"; import {Point, Rect, Size} from "./engine/datatypes.ts";
import {ALL_STATS, Resource, Stat} from "./datatypes.ts"; import {ALL_STATS, Stat} from "./datatypes.ts";
import {DrawPile} from "./drawpile.ts"; import {DrawPile} from "./drawpile.ts";
import {D} from "./engine/public.ts"; import {D} from "./engine/public.ts";
import {sprDrips, sprLadder, sprRaccoonWalking, sprResourcePickup, sprStatPickup} from "./sprites.ts"; import {sprDrips, sprRaccoonWalking, sprResourcePickup, sprStatPickup} from "./sprites.ts";
import {BG_INSET, FG_TEXT} from "./colors.ts"; import {BG_INSET, FG_TEXT} from "./colors.ts";
import {getPlayerProgress} from "./playerprogress.ts"; import {getPlayerProgress} from "./playerprogress.ts";
import {generate} from "./mapgen.ts"; import {Architecture, CellView, LoadedNewMap} from "./newmap.ts";
export type MapCellContent =
{type: "statPickup", stat: Stat} |
{type: "resourcePickup", resource: Resource} |
{type: "stairs"} |
{type: "empty"} |
{type: "block"}
export type MapCell = {
content: MapCellContent,
isValidSpawn: boolean,
revealed: boolean,
nextMoveAccessible: boolean,
}
export type LoadedMap = {
cells: Grid<MapCell>,
player: Point
}
export class HuntMode { export class HuntMode {
map: LoadedMap map: LoadedNewMap
player: Point
drawpile: DrawPile drawpile: DrawPile
frame: number frame: number
depth: number depth: number
constructor(depth: number) { constructor(depth: number, map: LoadedNewMap) {
this.map = generate(); // initialized in replaceMap when the game is started this.map = map;
this.player = map.entrance;
this.drawpile = new DrawPile(); this.drawpile = new DrawPile();
this.frame = 0; this.frame = 0;
@ -47,73 +32,76 @@ export class HuntMode {
// == update logic == // == update logic ==
#updateVisibilityAndPossibleMoves() { #updateVisibilityAndPossibleMoves() {
for (let x = 0; x < this.map.cells.size.w; x++) { let revealAt = (depth: number, xStart: number, yStart: number) => {
for (let y = 0; y < this.map.cells.size.h; y++) { let cell = this.map.get(new Point(xStart, yStart));
let position = new Point(x, y); cell.revealed = true;
let data = this.map.cells.get(position); if (depth <= 0 || cell.architecture == Architecture.Wall) {
return;
data.nextMoveAccessible = false;
if (
Math.abs(x - this.map.player.x) <= 1 &&
Math.abs(y - this.map.player.y) <= 1
) {
data.revealed = true;
if (!this.map.player.equals(position)) {
data.nextMoveAccessible = true;
} }
for (let dx = -1; dx <= 1; dx++) {
for (let dy = -1; dy <= 1; dy++) {
let position = new Point(xStart + dx, yStart + dy);
revealAt(depth - 1, position.x, position.y);
} }
} }
} }
// NOTE: Depth 1 to reveal slightly less
revealAt(2, this.player.x, this.player.y);
} }
#collectResources() { #collectResources() {
let present = this.map.cells.get(this.map.player); let cell = this.map.get(this.player);
/*
if (present.content.type == "stairs") { if (present.content.type == "stairs") {
getPlayerProgress().addBlood(1000); getPlayerProgress().addBlood(1000);
initHuntMode(new HuntMode(this.depth + 1)); initHuntMode(new HuntMode(this.depth + 1));
} }
*/
if (present.content.type == "statPickup") { let pickup = cell.pickup;
let stat = present.content.stat; if (pickup != null) {
let amount = 1; switch (pickup) {
present.content = {type: "empty"}; case "AGI":
getPlayerProgress().add(stat, amount); case "INT":
case "CHA":
case "PSI":
getPlayerProgress().add(pickup, 1);
getPlayerProgress().purloinItem(); getPlayerProgress().purloinItem();
} break;
if (present.content.type == "resourcePickup") {
let resource = present.content.resource;
switch(resource) {
case "EXP": case "EXP":
getPlayerProgress().addExperience(25); getPlayerProgress().addExperience(25);
getPlayerProgress().purloinItem(); getPlayerProgress().purloinItem();
break; break;
default: default:
throw `not sure how to add ${resource}` throw `not sure how to handle ${pickup}`
} }
cell.pickup = null;
} }
present.content = {type: "empty"};
} }
#computeCostToMoveTo(mapPosition: Point): number | null { #computeCostToMoveTo(mapPosition: Point): number | null {
let present = this.map.cells.get(mapPosition); let present = this.map.get(mapPosition);
if (present.content.type == "statPickup" || present.content.type == "resourcePickup") {
return 100; if (present.architecture != Architecture.Floor) {
}
if (present.content.type == "stairs") {
return 0;
}
if (present.content.type == "empty") {
return 10;
}
return null; return null;
} }
let dist = Math.max(
Math.abs(mapPosition.x - this.player.x),
Math.abs(mapPosition.y - this.player.y)
);
if (dist != 1) { return null; }
let pickup = present.pickup;
if (pickup == null) { return 10; }
return 100; // any other pickup (EXP, stats, etc)
}
movePlayerTo(newPosition: Point) { movePlayerTo(newPosition: Point) {
this.map.player = newPosition; this.player = newPosition;
this.#updateVisibilityAndPossibleMoves(); this.#updateVisibilityAndPossibleMoves();
this.#collectResources(); this.#collectResources();
} }
@ -124,22 +112,21 @@ export class HuntMode {
this.drawpile.clear(); this.drawpile.clear();
let globalOffset = let globalOffset =
new Point(this.map.player.x * MAP_CELL_ONSCREEN_SIZE.w, this.map.player.y * MAP_CELL_ONSCREEN_SIZE.h).offset( new Point(this.player.x * MAP_CELL_ONSCREEN_SIZE.w, this.player.y * MAP_CELL_ONSCREEN_SIZE.h).offset(
new Point(-192, -192) new Point(-192, -192)
) )
let map = this.map.cells; for (let y = 0; y < this.map.size.h; y += 1) {
for (let y = 0; y < map.size.h; y += 1) { for (let x = 0; x < this.map.size.w; x += 1) {
for (let x = 0; x < map.size.w; x += 1) {
let cellOffset = new Point(x * MAP_CELL_ONSCREEN_SIZE.w, y * MAP_CELL_ONSCREEN_SIZE.h).offset(globalOffset.negate()); let cellOffset = new Point(x * MAP_CELL_ONSCREEN_SIZE.w, y * MAP_CELL_ONSCREEN_SIZE.h).offset(globalOffset.negate());
let cellData = this.map.cells.get(new Point(x, y)) let cell = this.map.get(new Point(x, y))
let belowIsBlock = true; let belowIsBlock = true;
if (y < map.size.h - 1) { if (y < this.map.size.h - 1) {
let below = this.map.cells.get(new Point(x, y + 1)); let below = this.map.get(new Point(x, y + 1));
belowIsBlock = !below.revealed || below.content.type == "block"; belowIsBlock = !below.revealed || below.architecture == Architecture.Wall;
} }
this.#drawMapCell(cellOffset, new Point(x, y), cellData, belowIsBlock); this.#drawMapCell(cellOffset, new Point(x, y), cell, belowIsBlock);
} }
} }
this.#drawPlayer(globalOffset); this.#drawPlayer(globalOffset);
@ -154,7 +141,7 @@ export class HuntMode {
#drawMapCell( #drawMapCell(
cellOffset: Point, cellOffset: Point,
mapPosition: Point, mapPosition: Point,
cellData: MapCell, cellData: CellView,
belowIsBlock: boolean belowIsBlock: boolean
) { ) {
const OFFSET_FLOOR = -256; const OFFSET_FLOOR = -256;
@ -170,7 +157,7 @@ export class HuntMode {
let cellTopLeft = cellOffset.offset(new Size(-MAP_CELL_ONSCREEN_SIZE.w / 2, -MAP_CELL_ONSCREEN_SIZE.h / 2)); let cellTopLeft = cellOffset.offset(new Size(-MAP_CELL_ONSCREEN_SIZE.w / 2, -MAP_CELL_ONSCREEN_SIZE.h / 2));
let cellSize = MAP_CELL_ONSCREEN_SIZE; let cellSize = MAP_CELL_ONSCREEN_SIZE;
if (cellData.content.type == "block") { if (cellData.architecture == Architecture.Wall) {
if (!belowIsBlock) { if (!belowIsBlock) {
this.drawpile.add(inAir, () => { this.drawpile.add(inAir, () => {
D.drawSprite(sprDrips, cellOffset.offset(new Point(0, -cellSize.h / 2)), 1, {xScale: 3, yScale: 3}) D.drawSprite(sprDrips, cellOffset.offset(new Point(0, -cellSize.h / 2)), 1, {xScale: 3, yScale: 3})
@ -185,13 +172,16 @@ export class HuntMode {
(hover: boolean) => { (hover: boolean) => {
D.fillRect(cellTopLeft, cellSize, hover ? FG_TEXT : BG_INSET) D.fillRect(cellTopLeft, cellSize, hover ? FG_TEXT : BG_INSET)
/*
// TODO: Stairs
if (cellData.content.type == "stairs") { if (cellData.content.type == "stairs") {
// draw ladder if applicable // draw ladder if applicable
D.drawSprite(sprLadder, cellTopLeft, 0, {xScale: 3, yScale: 3}); D.drawSprite(sprLadder, cellTopLeft, 0, {xScale: 3, yScale: 3});
} }
*/
}, },
new Rect(cellTopLeft, cellSize), new Rect(cellTopLeft, cellSize),
cellData.nextMoveAccessible && cost != null && cost <= getPlayerProgress().getBlood(), cost != null && cost <= getPlayerProgress().getBlood(),
() => { () => {
if (cost != null) { if (cost != null) {
getPlayerProgress().spendBlood(cost); getPlayerProgress().spendBlood(cost);
@ -208,15 +198,17 @@ export class HuntMode {
}) })
} }
if (cellData.content.type == "statPickup") { let pickup = cellData.pickup;
let content = cellData.content; if (pickup != null) {
let statIndex = ALL_STATS.indexOf(pickup as Stat);
if (statIndex != -1) {
let extraXOffset = 0; // Math.cos(this.frame / 80 + mapPosition.x + mapPosition.y) * 1; let extraXOffset = 0; // Math.cos(this.frame / 80 + mapPosition.x + mapPosition.y) * 1;
let extraYOffset = Math.sin(this.frame / 50 + mapPosition.x * 2+ mapPosition.y * 0.75) * 6 - 18; let extraYOffset = Math.sin(this.frame / 50 + mapPosition.x * 2 + mapPosition.y * 0.75) * 6 - 18;
this.drawpile.add(inAir, () => { this.drawpile.add(inAir, () => {
D.drawSprite( D.drawSprite(
sprStatPickup, sprStatPickup,
cellOffset.offset(new Point(extraXOffset, extraYOffset)), cellOffset.offset(new Point(extraXOffset, extraYOffset)),
ALL_STATS.indexOf(content.stat), statIndex,
{ {
xScale: 3, xScale: 3,
yScale: 3, yScale: 3,
@ -225,7 +217,7 @@ export class HuntMode {
}); });
} }
if (cellData.content.type == "resourcePickup" && cellData.content.resource == "EXP") { if (pickup == "EXP") {
this.drawpile.add(inAir, () => { this.drawpile.add(inAir, () => {
D.drawSprite( D.drawSprite(
sprResourcePickup, sprResourcePickup,
@ -239,13 +231,14 @@ export class HuntMode {
}); });
} }
} }
}
#drawPlayer(globalOffset: Point) { #drawPlayer(globalOffset: Point) {
let cellOffset = new Point( let cellOffset = new Point(
this.map.player.x * MAP_CELL_ONSCREEN_SIZE.w, this.player.x * MAP_CELL_ONSCREEN_SIZE.w,
this.map.player.y * MAP_CELL_ONSCREEN_SIZE.h this.player.y * MAP_CELL_ONSCREEN_SIZE.h
).offset(globalOffset.negate()) ).offset(globalOffset.negate())
this.drawpile.add(this.map.player.y, () => { this.drawpile.add(this.player.y, () => {
D.drawSprite( D.drawSprite(
sprRaccoonWalking, sprRaccoonWalking,
cellOffset.offset(new Point(0, 22)), cellOffset.offset(new Point(0, 22)),

View File

@ -1,92 +0,0 @@
import {ConceptualCell, maps} from "./maps.ts";
import {Grid, Point, Size} from "./engine/datatypes.ts";
import {ALL_STATS} from "./datatypes.ts";
import {LoadedMap, MapCell, MapCellContent} from "./huntmode.ts";
import {choose} from "./utils.ts";
export function generate(): LoadedMap {
let mapNames: Array<string> = Object.keys(maps);
let mapName = mapNames[Math.floor(Math.random() * mapNames.length)];
let map = maps[mapName];
let baseCells = map.map((ccell, _xy) => {
return generateCell(ccell);
})
let cells = new Grid(
new Size(baseCells.size.w + 2, baseCells.size.h + 2), (xy) => {
let offset = xy.offset(new Point(-1, -1));
if (offset.x == -1 || offset.y == -1 || offset.x == baseCells.size.w || offset.y == baseCells.size.h) {
return generateBoundaryCell();
}
return baseCells.get(offset)
}
)
let validSpawns = [];
for (let x = 0; x < cells.size.w; x++) {
for (let y = 0; y < cells.size.h; y++) {
let position = new Point(x, y);
if (cells.get(position).isValidSpawn) {
validSpawns.push(position);
}
}
}
let player = choose(validSpawns);
cells.get(player).content = {type: "empty"};
let nStairs = choose([1, 1, 1, 0]);
for (let i = 0; i < nStairs; i++) {
while (true) {
let x = Math.floor(Math.random() * cells.size.w);
let y = Math.floor(Math.random() * cells.size.h);
let xy = new Point(x, y);
let item = cells.get(new Point(x, y));
if (player.equals(xy)) {
continue;
}
if (item.content.type == "block" || item.content.type == "stairs") {
continue;
}
item.content = {type: "stairs"}
break;
}
}
return {
cells,
player,
}
}
function generateCell(conceptual: ConceptualCell): MapCell {
switch (conceptual) {
case "X":
return { content: {type: "block"}, revealed: false, isValidSpawn: false, nextMoveAccessible: false};
case " ":
return { content: generateContent(), revealed: false, isValidSpawn: false, nextMoveAccessible: false };
case ".":
return { content: generateContent(), revealed: false, isValidSpawn: true, nextMoveAccessible: false };
}
}
function generateBoundaryCell() {
return generateCell("X");
}
function generateContent(): MapCellContent {
// stat pickup
let gsp = (): MapCellContent => {
return {type: "statPickup", stat: choose(ALL_STATS)}
};
let exp = (): MapCellContent => {
return {type: "resourcePickup", resource: "EXP"}
}
// TODO: Other objects?
return choose([
gsp, gsp, gsp, gsp,
exp,
])();
}

View File

@ -1,62 +0,0 @@
import {Grid} from "./engine/datatypes.ts";
export type ConceptualCell = "X" | "." | " ";
function loadMap(map: Array<string>): Grid<ConceptualCell> {
let src = Grid.createGridFromStringArray(map);
return src.map((char: string): ConceptualCell => {
switch(char) {
case "X": return "X";
case ".": return ".";
case " ": return " ";
default:
throw `map element not valid: ${char}`
}});
}
export let maps: Record<string, Grid<ConceptualCell>> = {
map0: loadMap([
"XX XX",
"X. .X",
" ",
" ",
" ",
" ",
" ",
"X. .X",
"XX XX",
]),
map1: loadMap([
"XX. XX",
"XXX X .X",
".XX XX ",
" .XX ",
" ",
" XX. ",
" XX XX.",
"X. X XXX",
"XX .XX",
]),
map2: loadMap([
"XX XXXX XX",
"X. XXXXXX .X",
" XX..XX ",
" ",
" ",
" ",
" XX..XX ",
"X. XXXXXX .X",
"XX XXXX XX",
]),
map3: loadMap([
"X XXXX X",
" . . ",
" . . ",
"X XXXX X",
"X XXXX X",
"X XXXX X",
" . . ",
" . . ",
"X XXXX X",
]),
}

211
src/newmap.ts Normal file
View File

@ -0,0 +1,211 @@
import {Resource, Skill, Stat} from "./datatypes.ts";
import {Grid, Point, Size} from "./engine/datatypes.ts";
import {choose} from "./utils.ts";
import {VNScene} from "./vnscene.ts";
export type Province = "a" | "b" | "c";
export type Check = "1" | "2";
export type Progress = Stat | Resource
export type Pickup = Progress; // TODO: Items
export type NewMapInput = {
id: string,
data: {
architecture: string,
provinces: string,
}
pickups: {
"*"?: string,
stat: {primary: Stat, secondary: Stat},
"!"?: string,
},
provinces: Record<Province, string>,
checks: Record<Check, CheckData>,
}
export type CheckData = {
label: string,
options: CheckDataOption[],
}
export type CheckDataOption = {
skills: () => Skill[],
locked: string,
unlockable: string,
unlockScene: VNScene,
}
export enum Architecture { Wall, Floor }
export class LoadedNewMap {
#id: string
#size: Size
#entrance: Point | null
#architecture: Grid<Architecture>
#pickups: Grid<Pickup | null>
#provinces: Grid<string | null>
#checks: Grid<CheckData | null>
#revealed: Grid<boolean>
constructor(id: string, size: Size) {
this.#id = id;
this.#size = size;
this.#entrance = null;
this.#architecture = new Grid<Architecture>(size, () => Architecture.Wall);
this.#pickups = new Grid<Pickup | null>(size, () => null);
this.#provinces = new Grid<string | null>(size, () => null);
this.#checks = new Grid<CheckData | null>(size, () => null);
this.#revealed = new Grid<boolean>(size, () => false);
}
set entrance(point: Point) {
this.#entrance = point;
}
get entrance(): Point {
if (this.#entrance == null) {
throw `${this.#id}: this.#entrance was never initialized`
}
return this.#entrance;
}
get size(): Size {
return this.#size;
}
get(point: Point): CellView {
return new CellView(this, point)
}
setArchitecture(point: Point, value: Architecture) {
this.#architecture.set(point, value);
}
getArchitecture(point: Point): Architecture {
return this.#architecture.get(point);
}
setPickup(point: Point, value: Pickup | null) {
this.#pickups.set(point, value);
}
getPickup(point: Point): Pickup | null {
return this.#pickups.get(point);
}
setProvince(point: Point, value: string | null) {
this.#provinces.set(point, value);
}
getProvince(point: Point): string | null {
return this.#provinces.get(point);
}
setCheck(point: Point, value: CheckData | null) {
this.#checks.set(point, value);
}
getCheck(point: Point): CheckData | null {
return this.#checks.get(point);
}
setRevealed(point: Point, value: boolean) {
this.#revealed.set(point, value)
}
getRevealed(point: Point): boolean {
return this.#revealed.get(point);
}
}
export class CellView {
#map: LoadedNewMap
#point: Point
constructor(map: LoadedNewMap, point: Point) {
this.#map = map;
this.#point = point;
}
set architecture(value: Architecture) { this.#map.setArchitecture(this.#point, value) }
get architecture(): Architecture { return this.#map.getArchitecture(this.#point) }
set pickup(value: Pickup | null) { this.#map.setPickup(this.#point, value) }
get pickup(): Pickup | null { return this.#map.getPickup(this.#point) }
set province(value: string | null) { this.#map.setProvince(this.#point, value) }
get province(): string | null { return this.#map.getProvince(this.#point) }
set check(value: CheckData | null) { this.#map.setCheck(this.#point, value) }
get check(): CheckData | null { return this.#map.getCheck(this.#point) }
set revealed(value: boolean) { this.#map.setRevealed(this.#point, value) }
get revealed(): boolean { return this.#map.getRevealed(this.#point) }
copyFrom(cell: CellView) {
this.architecture = cell.architecture;
this.pickup = cell.pickup;
this.province = cell.province;
this.check = cell.check;
this.revealed = cell.revealed;
}
}
export type NewMap = () => LoadedNewMap;
export function compileNewMap(input: NewMapInput): NewMap {
let {architecture: architectureInput, provinces: provincesInput} = input.data;
let architecture = Grid.createGridFromMultilineString(architectureInput);
let provinces = Grid.createGridFromMultilineString(provincesInput);
let size = architecture.size;
if (!size.equals(provinces.size)) {
throw `${input.id}: malformed, wrong province size (${provinces.size})`;
}
return () => {
let map = new LoadedNewMap(input.id, size);
for (let y = 0; y < size.h; y++) {
for (let x = 0; x < size.w; x++) {
let xy = new Point(x, y);
let cell = map.get(xy);
// set up the wall
let arch = architecture.get(xy);
cell.architecture = Architecture.Floor;
if (arch == "#") {
cell.architecture = Architecture.Wall;
} else if (arch == "@") {
map.entrance = xy;
} else if (arch == " " || arch == "-") {
}
// player resources: pickups
else if (arch == ".") {
let stat = choose([
input.pickups.stat.primary,
input.pickups.stat.primary,
input.pickups.stat.secondary
])
cell.pickup = choose<Progress>([stat, stat, stat, "EXP"]);
} else if (arch == "*") {
// TODO: Common item
} else if (arch == "!") {
// TODO: Artifact
}
// stat checks
else if (input.checks.hasOwnProperty(arch)) {
cell.check = input.checks[arch as Check];
} else {
throw `${input.id}: unrecognized architecture cell: ${arch}`
}
// set province
let provinceId = provinces.get(xy);
if (input.provinces.hasOwnProperty(provinceId)) {
cell.province = input.provinces[provinceId as Province];
}
}
}
return map;
}
}

View File

@ -0,0 +1,11 @@
###########
# # # #
# # 2 #
- # # #
# # # #
# ##### #
# 1 #
# #####
# #
##### #
###########

View File

@ -0,0 +1,27 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {compileNewMap} from "../../newmap.ts";
const mapBloodBank = compileNewMap({
id: "mapBloodBank",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "AGI", secondary: "INT"},
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Blood Bank",
b: "Special Reserve",
c: "Freezer",
},
checks: {
1: null!,
2: null!,
}
})
export default mapBloodBank;

View File

@ -0,0 +1,11 @@
###########
#aa#ccc#bb#
#aa#ccc bb#
-aa#ccc#bb#
#aa#ccc#bb#
#aa#####bb#
#aaaaaa bb#
#aaaaa#####
#aaaaaaaaa#
#####aaaaa#
###########

View File

@ -0,0 +1,11 @@
###########
# #
# #
######## #
# 1 #
# ##### -
# # # #
# # # #
# 2 # #
# # # #
###########

27
src/newmaps/club/map.ts Normal file
View File

@ -0,0 +1,27 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {compileNewMap} from "../../newmap.ts";
const mapClub = compileNewMap({
id: "mapClub",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "CHA", secondary: "PSI"},
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Club",
b: "Poker Game",
c: "Trophy Collection",
},
checks: {
1: null!,
2: null!,
}
})
export default mapClub;

View File

@ -0,0 +1,11 @@
###########
#aaaaaaaaa#
#aaaaaaaaa#
########aa#
#bbbbbb aa#
#bb#####aa-
#bb#ccc#aa#
#bb#ccc#aa#
#bb ccc#aa#
#bb#ccc#aa#
###########

View File

@ -0,0 +1,11 @@
###########
# # #
# 2 #
# # #
# #####1#
# # #
# # #
###### #
# #
# #
###### ####

View File

@ -0,0 +1,27 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {compileNewMap} from "../../newmap.ts";
const mapCoffeeShop = compileNewMap({
id: "mapCoffeeShop",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "PSI", secondary: "CHA"},
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Coffee Shop",
b: "Studio",
c: "Personal Photo Room",
},
checks: {
1: null!,
2: null!,
}
})
export default mapCoffeeShop;

View File

@ -0,0 +1,11 @@
###########
#ccc#bbbbb#
#ccc bbbbb#
#ccc#bbbbb#
#ccc##### #
#cccc#aaaa#
#cccc#aaaa#
######aaaa#
#aaaaaaaaa#
#aaaaaaaaa#
###### ####

59
src/newmaps/hub/map.ts Normal file
View File

@ -0,0 +1,59 @@
import metamap from "./metamap.txt?raw";
import {Architecture, LoadedNewMap, NewMap} from "../../newmap.ts";
import {Grid, Point} from "../../engine/datatypes.ts";
import mapZoo from "../zoo/map.ts";
import mapOptometrist from "../optometrist/map.ts";
import mapBloodBank from "../bloodBank/map.ts";
import mapCoffeeShop from "../coffeeShop/map.ts";
import mapClub from "../club/map.ts";
import mapManor from "../manor/map.ts";
import mapLibrary from "../library/map.ts";
const mapHub: NewMap = () => {
let metamapLayer = Grid.createGridFromMultilineString(metamap);
// NOTE: We could deduce this from the file --
// BUT, for now, let's just use the maps directly
let blits = [
{at: new Point(2, 0), map: mapOptometrist()},
{at: new Point(0, 12), map: mapZoo()},
{at: new Point(13, 9), map: mapBloodBank()},
{at: new Point(24, 9), map: mapCoffeeShop()},
{at: new Point(0, 22), map: mapClub()},
{at: new Point(13, 22), map: mapManor(), useEntrance: true},
{at: new Point(26, 22), map: mapLibrary()},
];
let metamapContent = new LoadedNewMap("hub", metamapLayer.size);
for (let y = 0; y < metamapLayer.size.h; y++) {
for (let x = 0; x < metamapLayer.size.w; x++) {
let src = new Point(x, y);
let cell = metamapContent.get(src);
if (metamapLayer.get(src) == "#") {
cell.architecture = Architecture.Wall;
} else if (metamapLayer.get(src) == " ") {
cell.architecture = Architecture.Floor;
}
}
}
for (let {at, map, useEntrance} of blits.values()) {
for (let srcY = 0; srcY < map.size.h; srcY++) {
for (let srcX = 0; srcX < map.size.w; srcX++) {
let src = new Point(srcX, srcY);
let dst = at.offset(new Point(srcX, srcY));
metamapContent.get(dst).copyFrom(map.get(src))
}
}
if (useEntrance ?? false) {
console.log("beep");
metamapContent.entrance = at.offset(map.entrance);
}
}
return metamapContent;
}
export default mapHub;

View File

@ -0,0 +1,33 @@
##11111111111########################
##11111111111########################
##11111111111########################
##11111111111########################
##11111111111########################
##11111111111########################
##11111111111########################
##11111111111########################
##11111111111########################
##111111111113333333333344444444444##
##111111111113333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 3333333333344444444444##
22222222222 ######
22222222222 ######
55555555555 66666666666 77777777777
55555555555 66666666666 77777777777
55555555555 66666666666 77777777777
55555555555 66666666666 77777777777
55555555555 66666666666##77777777777
55555555555##66666666666##77777777777
55555555555##66666666666##77777777777
55555555555##66666666666##77777777777
55555555555##66666666666##77777777777
55555555555##66666666666##77777777777
55555555555##66666666666##77777777777

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

View File

@ -0,0 +1,11 @@
###########
# # #
# # #
- # #
# ######2##
# 1 #
# # #
# # #
# # #
# # #
###########

View File

@ -0,0 +1,27 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {compileNewMap} from "../../newmap.ts";
const mapLibrary = compileNewMap({
id: "mapLibrary",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "INT", secondary: "CHA"},
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Library",
b: "Computer Room",
c: "Special Collection",
},
checks: {
1: null!,
2: null!,
}
})
export default mapLibrary;

View File

@ -0,0 +1,11 @@
###########
#aa#cccccc#
#aa#cccccc#
-aa#cccccc#
#a###### ##
#aa bbbbbb#
#aa#bbbbbb#
#aa#bbbbbb#
#aa#bbbbbb#
#aa#bbbbbb#
###########

View File

@ -0,0 +1,11 @@
#### ####
# # # #
# ## ## #
# # # #
# #
##### #####
# # # #
# #
# @ #
# #
###########

27
src/newmaps/manor/map.ts Normal file
View File

@ -0,0 +1,27 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {compileNewMap} from "../../newmap.ts";
const mapManor = compileNewMap({
id: "mapManor",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "AGI", secondary: "PSI"}, // doesn't matter
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Bedroom",
b: "Thrall Bedroom",
c: "Thrall Bedroom",
},
checks: {
1: null!,
2: null!,
}
})
export default mapManor;

View File

@ -0,0 +1,11 @@
#### ####
#bb# #cc#
#bb## ##cc#
#bbb# #ccc#
#bbb ccc#
##### #####
#aaa# #aaa#
#aaaaaaaaa#
#aaaaaaaaa#
#aaaaaaaaa#
###########

View File

@ -0,0 +1,11 @@
###########
# #
# #
# #
# ### #
##2## #####
# # #
# # #
# ##1# # #
# # # #
######### #

View File

@ -0,0 +1,27 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {compileNewMap} from "../../newmap.ts";
const mapOptometrist = compileNewMap({
id: "mapOptometrist",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "PSI", secondary: "PSI"},
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Optometrist's Office",
b: "Glasses Fitting",
c: "Eyeball Machine",
},
checks: {
1: null!,
2: null!,
}
})
export default mapOptometrist;

View File

@ -0,0 +1,11 @@
###########
#ccccccccc#
#ccccccccc#
#ccccccccc#
#ccc###ccc#
## ## #####
#bbbbb#aaa#
#bbbbb#aaa#
#bb## #a#a#
#bb#aaaa#a#
######### #

View File

@ -0,0 +1,11 @@
###########
# # ** #
# ! # .. #
# # .. #
##2### ## -
# #* .. -
# . ## ## -
# .. # .. #
# .. 1 .. #
# .. # ** #
###########

83
src/newmaps/zoo/map.ts Normal file
View File

@ -0,0 +1,83 @@
import architecture from "./architecture.txt?raw";
import provinces from "./provinces.txt?raw";
import {bat2, lore1, stare0} from "../../skills.ts";
import {compileNewMap} from "../../newmap.ts";
import {compile} from "../../vnscene.ts";
const mapZoo = compileNewMap({
id: "mapZoo",
data: {
architecture: architecture,
provinces: provinces,
},
pickups: {
// "*": itemGecko,
stat: {primary: "AGI", secondary: "PSI"},
// "!": {"item": "colonialGoose"},
},
provinces: {
a: "Zoo",
b: "Gator Pen",
c: "Food Storage"
},
checks: {
1: {
label:
"The gator pen appears to be locked. " +
"Some bats behind the barred gate are amusing " +
"themselves by swooping and darting just out of the alligators' reach.",
options: [
{
skills: () => [lore1],
locked: "That wall sure does look impenetrable.",
unlockable: "I see a failure in the construction.",
unlockScene: compile([
"I dig my clawed fingers into a crack between the bricks and feel the concrete give way.",
"This structure, built by mortals, is impermanent. Soon none of it will exist.",
"I rip another clump of brittle earth from the crack, no longer invisible.",
"And another. When the gap's wide enough to crawl through, I climb in."
])
},
{
skills: () => [stare0],
locked: "The bats are happy by themselves.",
unlockable: "These bats could be enjoying themselves so much more.",
unlockScene: compile([
"I hold my face to the bars. One bat looks at me.",
"\"Here, little bat\" -- I think before I say it. No, relate to it as an equal.",
"What does it really want?",
"What does any mortal want? It wants to feel a whole lot better --",
"So stare --",
"...",
"... Now it breaks. Like any mortal, but with a loud, high-pitched squeal.",
"Still dripping, it flaps unsurely to the door and -- with only a little coaxing -- it opens the lock."
])
}
]
},
2: {
label:
"The unattended food storage cabinet is secure. " +
"The shiny surface, which I lack a reflection in, repels direct attack. " +
"Through the keyhole I can see something delicious.",
options: [
{
skills: () => [bat2],
locked: "If only were smaller...",
unlockable: "I am small enough to crawl through.",
unlockScene: compile([
"There's a bat inside me. I guess it's like that with every vampire.",
"I can fight, if I try, to keep it inside. But that's not how we want it.",
"And in the second before I let it out -- as the soft fur behind my ears begins to sprout -- I feel a sense of relief.",
"A sense of gratitude.",
"I can't resist it now. It's urgent. I shed the rest of my mass.",
"Now I'm as sleek and narrow as a dart --",
"I'm inside."
])
}
]
}
}
})
export default mapZoo;

View File

@ -0,0 +1,11 @@
###########
#cccc#aaaa#
#cccc#aaaa#
#cccc#aaaa#
## ###a##a-
#bbb#aaaaa-
#bbb##a##a-
#bbbb#aaaa#
#bbbb aaaa#
#bbbb#aaaa#
###########

View File

@ -5,6 +5,8 @@ import {getVNModal} from "./vnmodal.ts";
import {getScorer} from "./scorer.ts"; import {getScorer} from "./scorer.ts";
import {getEndgameModal} from "./endgamemodal.ts"; import {getEndgameModal} from "./endgamemodal.ts";
import {SuccessorOption, Wish} from "./datatypes.ts"; import {SuccessorOption, Wish} from "./datatypes.ts";
import mapZoo from "./newmaps/zoo/map.ts";
import mapHub from "./newmaps/hub/map.ts";
const N_TURNS: number = 9; const N_TURNS: number = 9;
@ -21,7 +23,7 @@ export class StateManager {
startGame(asSuccessor: SuccessorOption, withWish: Wish | null) { startGame(asSuccessor: SuccessorOption, withWish: Wish | null) {
this.#turn = 1; this.#turn = 1;
initHuntMode(new HuntMode(1)); initHuntMode(new HuntMode(1, mapHub()));
initPlayerProgress(asSuccessor, withWish); initPlayerProgress(asSuccessor, withWish);
} }
@ -32,7 +34,7 @@ export class StateManager {
this.#turn += 1; this.#turn += 1;
getPlayerProgress().applyEndOfTurn(); getPlayerProgress().applyEndOfTurn();
getPlayerProgress().refill(); getPlayerProgress().refill();
initHuntMode(new HuntMode(getHuntMode().depth)); initHuntMode(new HuntMode(getHuntMode().depth, mapHub()));
} else { } else {
// TODO: Play a specific scene // TODO: Play a specific scene
let ending = getScorer().pickEnding(); let ending = getScorer().pickEnding();