diff --git a/Godette-Tale/Assets/Art/Sprites/Papyrus_Speaking.png b/Godette-Tale/Assets/Art/Sprites/Papyrus_Speaking.png new file mode 100644 index 0000000..4893a14 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Papyrus_Speaking.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Papyrus_Speaking.png.import b/Godette-Tale/Assets/Art/Sprites/Papyrus_Speaking.png.import new file mode 100644 index 0000000..b104b4e --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Papyrus_Speaking.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Papyrus_Speaking.png-d994dbef5106303debfd55c2cd3d145a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Papyrus_Speaking.png" +dest_files=[ "res://.import/Papyrus_Speaking.png-d994dbef5106303debfd55c2cd3d145a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Player/SOUL.png b/Godette-Tale/Assets/Art/Sprites/Player/SOUL.png new file mode 100644 index 0000000..5c05bd4 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Player/SOUL.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Player/SOUL.png.import b/Godette-Tale/Assets/Art/Sprites/Player/SOUL.png.import new file mode 100644 index 0000000..6ef9c6e --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Player/SOUL.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/SOUL.png-f3f09ea3417fcc734bf325e33648fc80.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Player/SOUL.png" +dest_files=[ "res://.import/SOUL.png-f3f09ea3417fcc734bf325e33648fc80.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Player/SmolFrisk.png b/Godette-Tale/Assets/Art/Sprites/Player/SmolFrisk.png new file mode 100644 index 0000000..be7ddfa Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Player/SmolFrisk.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Player/SmolFrisk.png.import b/Godette-Tale/Assets/Art/Sprites/Player/SmolFrisk.png.import new file mode 100644 index 0000000..956febf --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Player/SmolFrisk.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/SmolFrisk.png-403d19d8d231f6b5b7d78539478058ce.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Player/SmolFrisk.png" +dest_files=[ "res://.import/SmolFrisk.png-403d19d8d231f6b5b7d78539478058ce.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Puzzles/Door.png b/Godette-Tale/Assets/Art/Sprites/Puzzles/Door.png new file mode 100644 index 0000000..60bbc90 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Puzzles/Door.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Puzzles/Door.png.import b/Godette-Tale/Assets/Art/Sprites/Puzzles/Door.png.import new file mode 100644 index 0000000..69d8f3c --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Puzzles/Door.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Door.png-f417b21366a443ece6fe06b9c4fcf0e8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Puzzles/Door.png" +dest_files=[ "res://.import/Door.png-f417b21366a443ece6fe06b9c4fcf0e8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Puzzles/SwiButSpike.png b/Godette-Tale/Assets/Art/Sprites/Puzzles/SwiButSpike.png new file mode 100644 index 0000000..6330c27 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Puzzles/SwiButSpike.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Puzzles/SwiButSpike.png.import b/Godette-Tale/Assets/Art/Sprites/Puzzles/SwiButSpike.png.import new file mode 100644 index 0000000..bb12b98 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Puzzles/SwiButSpike.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/SwiButSpike.png-2d9f7c1ad9b0825c2c1c0f6aa5c942ed.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Puzzles/SwiButSpike.png" +dest_files=[ "res://.import/SwiButSpike.png-2d9f7c1ad9b0825c2c1c0f6aa5c942ed.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Ruins.png b/Godette-Tale/Assets/Art/Sprites/Ruins.png new file mode 100644 index 0000000..c92302a Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Ruins.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Ruins.png.import b/Godette-Tale/Assets/Art/Sprites/Ruins.png.import new file mode 100644 index 0000000..922c6ad --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Ruins.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Ruins.png-24d3b2f8c2765ac7ca93d6ce5349c326.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Ruins.png" +dest_files=[ "res://.import/Ruins.png-24d3b2f8c2765ac7ca93d6ce5349c326.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Ruins.png.meta b/Godette-Tale/Assets/Art/Sprites/Ruins.png.meta new file mode 100644 index 0000000..5daa4f0 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Ruins.png.meta @@ -0,0 +1,13350 @@ +fileFormatVersion: 2 +guid: 6d67cdbf08d3f0c4e91ae2555de6d022 +TextureImporter: + fileIDToRecycleName: + 21300000: Ruins_0 + 21300002: Ruins_1 + 21300004: Ruins_2 + 21300006: Ruins_3 + 21300008: Ruins_4 + 21300010: Ruins_5 + 21300012: Ruins_6 + 21300014: Ruins_7 + 21300016: Ruins_8 + 21300018: Ruins_9 + 21300020: Ruins_10 + 21300022: Ruins_11 + 21300024: Ruins_12 + 21300026: Ruins_13 + 21300028: Ruins_14 + 21300030: Ruins_15 + 21300032: Ruins_16 + 21300034: Ruins_17 + 21300036: Ruins_18 + 21300038: Ruins_19 + 21300040: Ruins_20 + 21300042: Ruins_21 + 21300044: Ruins_22 + 21300046: Ruins_23 + 21300048: Ruins_24 + 21300050: Ruins_25 + 21300052: Ruins_26 + 21300054: Ruins_27 + 21300056: Ruins_28 + 21300058: Ruins_29 + 21300060: Ruins_30 + 21300062: Ruins_31 + 21300064: Ruins_32 + 21300066: Ruins_33 + 21300068: Ruins_34 + 21300070: Ruins_35 + 21300072: Ruins_36 + 21300074: Ruins_37 + 21300076: Ruins_38 + 21300078: Ruins_39 + 21300080: Ruins_40 + 21300082: Ruins_41 + 21300084: Ruins_42 + 21300086: Ruins_43 + 21300088: Ruins_44 + 21300090: Ruins_45 + 21300092: Ruins_46 + 21300094: Ruins_47 + 21300096: Ruins_48 + 21300098: Ruins_49 + 21300100: Ruins_50 + 21300102: Ruins_51 + 21300104: Ruins_52 + 21300106: Ruins_53 + 21300108: Ruins_54 + 21300110: Ruins_55 + 21300112: Ruins_56 + 21300114: Ruins_57 + 21300116: Ruins_58 + 21300118: Ruins_59 + 21300120: Ruins_60 + 21300122: Ruins_61 + 21300124: Ruins_62 + 21300126: Ruins_63 + 21300128: Ruins_64 + 21300130: Ruins_65 + 21300132: Ruins_66 + 21300134: Ruins_67 + 21300136: Ruins_68 + 21300138: Ruins_69 + 21300140: Ruins_70 + 21300142: Ruins_71 + 21300144: Ruins_72 + 21300146: Ruins_73 + 21300148: Ruins_74 + 21300150: Ruins_75 + 21300152: Ruins_76 + 21300154: Ruins_77 + 21300156: Ruins_78 + 21300158: Ruins_79 + 21300160: Ruins_80 + 21300162: Ruins_81 + 21300164: Ruins_82 + 21300166: Ruins_83 + 21300168: Ruins_84 + 21300170: Ruins_85 + 21300172: Ruins_86 + 21300174: Ruins_87 + 21300176: Ruins_88 + 21300178: Ruins_89 + 21300180: Ruins_90 + 21300182: Ruins_91 + 21300184: Ruins_92 + 21300186: Ruins_93 + 21300188: Ruins_94 + 21300190: Ruins_95 + 21300192: Ruins_96 + 21300194: Ruins_97 + 21300196: Ruins_98 + 21300198: Ruins_99 + 21300200: Ruins_100 + 21300202: Ruins_101 + 21300204: Ruins_102 + 21300206: Ruins_103 + 21300208: Ruins_104 + 21300210: Ruins_105 + 21300212: Ruins_106 + 21300214: Ruins_107 + 21300216: Ruins_108 + 21300218: Ruins_109 + 21300220: Ruins_110 + 21300222: Ruins_111 + 21300224: Ruins_112 + 21300226: Ruins_113 + 21300228: Ruins_114 + 21300230: Ruins_115 + 21300232: Ruins_116 + 21300234: Ruins_117 + 21300236: Ruins_118 + 21300238: Ruins_119 + 21300240: Ruins_120 + 21300242: Ruins_121 + 21300244: Ruins_122 + 21300246: Ruins_123 + 21300248: Ruins_124 + 21300250: Ruins_125 + 21300252: Ruins_126 + 21300254: Ruins_127 + 21300256: Ruins_128 + 21300258: Ruins_129 + 21300260: Ruins_130 + 21300262: Ruins_131 + 21300264: Ruins_132 + 21300266: Ruins_133 + 21300268: Ruins_134 + 21300270: Ruins_135 + 21300272: Ruins_136 + 21300274: Ruins_137 + 21300276: Ruins_138 + 21300278: Ruins_139 + 21300280: Ruins_140 + 21300282: Ruins_141 + 21300284: Ruins_142 + 21300286: Ruins_143 + 21300288: Ruins_144 + 21300290: Ruins_145 + 21300292: Ruins_146 + 21300294: Ruins_147 + 21300296: Ruins_148 + 21300298: Ruins_149 + 21300300: Ruins_150 + 21300302: Ruins_151 + 21300304: Ruins_152 + 21300306: Ruins_153 + 21300308: Ruins_154 + 21300310: Ruins_155 + 21300312: Ruins_156 + 21300314: Ruins_157 + 21300316: Ruins_158 + 21300318: Ruins_159 + 21300320: Ruins_160 + 21300322: Ruins_161 + 21300324: Ruins_162 + 21300326: Ruins_163 + 21300328: Ruins_164 + 21300330: Ruins_165 + 21300332: Ruins_166 + 21300334: Ruins_167 + 21300336: Ruins_168 + 21300338: Ruins_169 + 21300340: Ruins_170 + 21300342: Ruins_171 + 21300344: Ruins_172 + 21300346: Ruins_173 + 21300348: Ruins_174 + 21300350: Ruins_175 + 21300352: Ruins_176 + 21300354: Ruins_177 + 21300356: Ruins_178 + 21300358: Ruins_179 + 21300360: Ruins_180 + 21300362: Ruins_181 + 21300364: Ruins_182 + 21300366: Ruins_183 + 21300368: Ruins_184 + 21300370: Ruins_185 + 21300372: Ruins_186 + 21300374: Ruins_187 + 21300376: Ruins_188 + 21300378: Ruins_189 + 21300380: Ruins_190 + 21300382: Ruins_191 + 21300384: Ruins_192 + 21300386: Ruins_193 + 21300388: Ruins_194 + 21300390: Ruins_195 + 21300392: Ruins_196 + 21300394: Ruins_197 + 21300396: Ruins_198 + 21300398: Ruins_199 + 21300400: Ruins_200 + 21300402: Ruins_201 + 21300404: Ruins_202 + 21300406: Ruins_203 + 21300408: Ruins_204 + 21300410: Ruins_205 + 21300412: Ruins_206 + 21300414: Ruins_207 + 21300416: Ruins_208 + 21300418: Ruins_209 + 21300420: Ruins_210 + 21300422: Ruins_211 + 21300424: Ruins_212 + 21300426: Ruins_213 + 21300428: Ruins_214 + 21300430: Ruins_215 + 21300432: Ruins_216 + 21300434: Ruins_217 + 21300436: Ruins_218 + 21300438: Ruins_219 + 21300440: Ruins_220 + 21300442: Ruins_221 + 21300444: Ruins_222 + 21300446: Ruins_223 + 21300448: Ruins_224 + 21300450: Ruins_225 + 21300452: LeverIdle + 21300454: LeverActive + 21300456: Ruins_228 + 21300458: Ruins_229 + 21300460: Ruins_230 + 21300462: Ruins_231 + 21300464: Ruins_232 + 21300466: Ruins_233 + 21300468: Ruins_234 + 21300470: Ruins_235 + 21300472: Ruins_236 + 21300474: Ruins_237 + 21300476: Ruins_238 + 21300478: Ruins_239 + 21300480: Ruins_240 + 21300482: Ruins_241 + 21300484: Ruins_242 + 21300486: Ruins_243 + 21300488: Ruins_244 + 21300490: Ruins_245 + 21300492: Ruins_246 + 21300494: Ruins_247 + 21300496: Ruins_248 + 21300498: Ruins_249 + 21300500: Ruins_250 + 21300502: Ruins_251 + 21300504: Ruins_252 + 21300506: Ruins_253 + 21300508: Ruins_254 + 21300510: Ruins_255 + 21300512: Sign + 21300514: Ruins_257 + 21300516: Ruins_258 + 21300518: Ruins_259 + 21300520: Ruins_260 + 21300522: Ruins_261 + 21300524: Ruins_262 + 21300526: Ruins_263 + 21300528: Ruins_264 + 21300530: Ruins_265 + 21300532: Ruins_266 + 21300534: Ruins_267 + 21300536: Ruins_268 + 21300538: Ruins_269 + 21300540: Ruins_270 + 21300542: Ruins_271 + 21300544: Ruins_272 + 21300546: Ruins_273 + 21300548: Ruins_274 + 21300550: Ruins_275 + 21300552: Ruins_276 + 21300554: Ruins_277 + 21300556: Ruins_278 + 21300558: Ruins_279 + 21300560: Ruins_280 + 21300562: Ruins_281 + 21300564: Ruins_282 + 21300566: Ruins_283 + 21300568: Ruins_284 + 21300570: Ruins_285 + 21300572: Ruins_286 + 21300574: Ruins_287 + 21300576: Ruins_288 + 21300578: Ruins_289 + 21300580: Ruins_290 + 21300582: Ruins_291 + 21300584: Ruins_292 + 21300586: Ruins_293 + 21300588: Ruins_294 + 21300590: Ruins_295 + 21300592: Ruins_296 + 21300594: Ruins_297 + 21300596: Ruins_298 + 21300598: Ruins_299 + 21300600: Ruins_300 + 21300602: Ruins_301 + 21300604: Ruins_302 + 21300606: Ruins_303 + 21300608: Ruins_304 + 21300610: Ruins_305 + 21300612: Ruins_306 + 21300614: Ruins_307 + 21300616: Ruins_308 + 21300618: Ruins_309 + 21300620: Ruins_310 + 21300622: Ruins_311 + 21300624: Ruins_312 + 21300626: Ruins_313 + 21300628: Ruins_314 + 21300630: Ruins_315 + 21300632: Ruins_316 + 21300634: Ruins_317 + 21300636: Ruins_318 + 21300638: Ruins_319 + 21300640: Ruins_320 + 21300642: Ruins_321 + 21300644: Ruins_322 + 21300646: Ruins_323 + 21300648: Ruins_324 + 21300650: Ruins_325 + 21300652: Ruins_326 + 21300654: Ruins_327 + 21300656: Ruins_328 + 21300658: Ruins_329 + 21300660: Ruins_330 + 21300662: Ruins_331 + 21300664: Ruins_332 + 21300666: Ruins_333 + 21300668: Ruins_334 + 21300670: Ruins_335 + 21300672: Ruins_336 + 21300674: Ruins_337 + 21300676: Ruins_338 + 21300678: Ruins_339 + 21300680: Ruins_340 + 21300682: Ruins_341 + 21300684: Ruins_342 + 21300686: Ruins_343 + 21300688: Ruins_344 + 21300690: Ruins_345 + 21300692: Ruins_346 + 21300694: Ruins_347 + 21300696: Ruins_348 + 21300698: Ruins_349 + 21300700: Ruins_350 + 21300702: Ruins_351 + 21300704: Ruins_352 + 21300706: Ruins_353 + 21300708: Ruins_354 + 21300710: Ruins_355 + 21300712: Ruins_356 + 21300714: Ruins_357 + 21300716: Ruins_358 + 21300718: Ruins_359 + 21300720: Ruins_360 + 21300722: Ruins_361 + 21300724: Ruins_362 + 21300726: Ruins_363 + 21300728: Ruins_364 + 21300730: Ruins_365 + 21300732: Ruins_366 + 21300734: Ruins_367 + 21300736: Ruins_368 + 21300738: Ruins_369 + 21300740: Ruins_370 + 21300742: Ruins_371 + 21300744: Ruins_372 + 21300746: Ruins_373 + 21300748: Ruins_374 + 21300750: Ruins_375 + 21300752: Ruins_376 + 21300754: Ruins_377 + 21300756: Ruins_378 + 21300758: Ruins_379 + 21300760: Ruins_380 + 21300762: Ruins_381 + 21300764: Ruins_382 + 21300766: Ruins_383 + 21300768: Ruins_384 + 21300770: Ruins_385 + 21300772: Ruins_386 + 21300774: Ruins_387 + 21300776: Ruins_388 + 21300778: Ruins_389 + 21300780: Ruins_390 + 21300782: Ruins_391 + 21300784: Ruins_392 + 21300786: Ruins_393 + 21300788: Ruins_394 + 21300790: Ruins_395 + 21300792: Ruins_396 + 21300794: Ruins_397 + 21300796: Ruins_398 + 21300798: Ruins_399 + 21300800: Ruins_400 + 21300802: Ruins_401 + 21300804: Ruins_402 + 21300806: Ruins_403 + 21300808: Ruins_404 + 21300810: Ruins_405 + 21300812: Ruins_406 + 21300814: Ruins_407 + 21300816: Ruins_408 + 21300818: Ruins_409 + 21300820: Ruins_410 + 21300822: Ruins_411 + 21300824: Ruins_412 + 21300826: Ruins_413 + 21300828: Ruins_414 + 21300830: Ruins_415 + 21300832: Ruins_416 + 21300834: Ruins_417 + 21300836: Ruins_418 + 21300838: Ruins_419 + 21300840: Ruins_420 + 21300842: Ruins_421 + 21300844: Ruins_422 + 21300846: Ruins_423 + 21300848: Ruins_424 + 21300850: Ruins_425 + 21300852: Ruins_426 + 21300854: Ruins_427 + 21300856: Ruins_428 + 21300858: Ruins_429 + 21300860: Ruins_430 + 21300862: Ruins_431 + 21300864: Ruins_432 + 21300866: Ruins_433 + 21300868: Ruins_434 + 21300870: Ruins_435 + 21300872: Ruins_436 + 21300874: Ruins_437 + 21300876: Ruins_438 + 21300878: Ruins_439 + 21300880: Ruins_440 + 21300882: Ruins_441 + 21300884: Ruins_442 + 21300886: Ruins_443 + 21300888: Ruins_444 + 21300890: Ruins_445 + 21300892: Ruins_446 + 21300894: Ruins_447 + 21300896: Ruins_448 + 21300898: Ruins_449 + 21300900: Ruins_450 + 21300902: Ruins_451 + 21300904: Ruins_452 + 21300906: Ruins_453 + 21300908: Ruins_454 + 21300910: Ruins_455 + 21300912: Ruins_456 + 21300914: Ruins_457 + 21300916: Ruins_458 + 21300918: Ruins_459 + 21300920: Ruins_460 + 21300922: Ruins_461 + 21300924: Ruins_462 + 21300926: Ruins_463 + 21300928: Ruins_464 + 21300930: Ruins_465 + 21300932: Ruins_466 + 21300934: Ruins_467 + 21300936: Ruins_468 + 21300938: Ruins_469 + 21300940: Ruins_470 + 21300942: Ruins_471 + 21300944: Ruins_472 + 21300946: Ruins_473 + 21300948: Ruins_474 + 21300950: Ruins_475 + 21300952: Ruins_476 + 21300954: Ruins_477 + 21300956: Ruins_478 + 21300958: Ruins_479 + 21300960: Ruins_480 + 21300962: Ruins_481 + 21300964: Ruins_482 + 21300966: Ruins_483 + 21300968: Ruins_484 + 21300970: Ruins_485 + 21300972: Ruins_486 + 21300974: Ruins_487 + 21300976: Ruins_488 + 21300978: Ruins_489 + 21300980: Ruins_490 + 21300982: Ruins_491 + 21300984: Ruins_492 + 21300986: Ruins_493 + 21300988: Ruins_494 + 21300990: Ruins_495 + 21300992: Ruins_496 + 21300994: Ruins_497 + 21300996: Ruins_498 + 21300998: Ruins_499 + 21301000: Ruins_500 + 21301002: Ruins_501 + 21301004: Ruins_502 + 21301006: Ruins_503 + 21301008: Ruins_504 + 21301010: Ruins_505 + 21301012: Ruins_506 + 21301014: Ruins_507 + 21301016: Ruins_508 + 21301018: Ruins_509 + 21301020: Ruins_510 + 21301022: Ruins_511 + 21301024: Ruins_512 + 21301026: Ruins_513 + 21301028: Ruins_514 + 21301030: Ruins_515 + 21301032: Ruins_516 + 21301034: Ruins_517 + 21301036: Ruins_518 + 21301038: Ruins_519 + 21301040: Ruins_520 + 21301042: Ruins_521 + 21301044: Ruins_522 + 21301046: Ruins_523 + 21301048: Ruins_524 + 21301050: Ruins_525 + 21301052: Ruins_526 + 21301054: Ruins_527 + 21301056: Ruins_528 + 21301058: Ruins_529 + 21301060: Ruins_530 + 21301062: Ruins_531 + 21301064: Ruins_532 + 21301066: Ruins_533 + 21301068: Ruins_534 + 21301070: Ruins_535 + 21301072: Ruins_536 + 21301074: Ruins_537 + 21301076: Ruins_538 + 21301078: Ruins_539 + 21301080: Ruins_540 + 21301082: Ruins_541 + 21301084: Ruins_542 + 21301086: Ruins_543 + 21301088: Ruins_544 + 21301090: Ruins_545 + 21301092: Ruins_546 + 21301094: Ruins_547 + 21301096: Ruins_548 + 21301098: Ruins_549 + 21301100: Ruins_550 + 21301102: Ruins_551 + 21301104: Ruins_552 + 21301106: Ruins_553 + 21301108: Ruins_554 + 21301110: Ruins_555 + 21301112: Ruins_556 + 21301114: Ruins_557 + 21301116: Ruins_558 + 21301118: Ruins_559 + 21301120: Ruins_560 + 21301122: Ruins_561 + 21301124: Ruins_562 + 21301126: Ruins_563 + 21301128: Ruins_564 + 21301130: Ruins_565 + 21301132: Ruins_566 + 21301134: Ruins_567 + 21301136: Ruins_568 + 21301138: Ruins_569 + 21301140: Ruins_570 + 21301142: Ruins_571 + 21301144: Ruins_572 + 21301146: Ruins_573 + 21301148: Ruins_574 + 21301150: Ruins_575 + 21301152: Ruins_576 + 21301154: Ruins_577 + 21301156: Ruins_578 + 21301158: Ruins_579 + 21301160: Ruins_580 + 21301162: Ruins_581 + 21301164: Ruins_582 + 21301166: Ruins_583 + 21301168: Ruins_584 + 21301170: Ruins_585 + 21301172: Ruins_586 + 21301174: Ruins_587 + 21301176: Ruins_588 + 21301178: Ruins_589 + 21301180: Ruins_590 + 21301182: Ruins_591 + 21301184: Ruins_592 + 21301186: Ruins_593 + 21301188: Ruins_594 + 21301190: Ruins_595 + 21301192: Ruins_596 + 21301194: Ruins_597 + 21301196: Ruins_598 + 21301198: Ruins_599 + 21301200: Ruins_600 + 21301202: Ruins_601 + 21301204: Ruins_602 + 21301206: Ruins_603 + 21301208: Ruins_604 + 21301210: Ruins_605 + 21301212: Ruins_606 + 21301214: Ruins_607 + 21301216: Ruins_608 + 21301218: Ruins_609 + 21301220: Ruins_610 + 21301222: Ruins_611 + 21301224: Ruins_612 + 21301226: Ruins_613 + 21301228: Ruins_614 + 21301230: Ruins_615 + 21301232: Ruins_616 + 21301234: Ruins_617 + 21301236: Ruins_618 + 21301238: Ruins_619 + 21301240: Ruins_620 + 21301242: Ruins_621 + 21301244: Ruins_622 + 21301246: Ruins_623 + 21301248: Ruins_624 + 21301250: Ruins_625 + 21301252: Ruins_626 + 21301254: Ruins_627 + 21301256: Ruins_628 + 21301258: Ruins_629 + 21301260: Ruins_226 + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 20 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Ruins_0 + rect: + serializedVersion: 2 + x: 0 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5bb9f8499be0d584f936c8c537069c24 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_1 + rect: + serializedVersion: 2 + x: 20 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 222b468bf31cea0488514b574e851a2e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_2 + rect: + serializedVersion: 2 + x: 40 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 56ebce3509a473141b73e0d058af9e33 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_3 + rect: + serializedVersion: 2 + x: 60 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8816743291f55fa40aa60c81d78df51f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_4 + rect: + serializedVersion: 2 + x: 80 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8ecbdda555db45c4aa50260c0e9b2270 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_5 + rect: + serializedVersion: 2 + x: 100 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3f9fae40fff9c414a9c6b876006175e5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_6 + rect: + serializedVersion: 2 + x: 120 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 74e8c382923caae419a3645f6a723edd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_7 + rect: + serializedVersion: 2 + x: 140 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 468827937f7c5d544b0e987a4a509ad9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_8 + rect: + serializedVersion: 2 + x: 160 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cb662b1737ed0694995c49d70b86dccb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_9 + rect: + serializedVersion: 2 + x: 180 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 503ac90ab554b6848b14633e47d6c1bc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_10 + rect: + serializedVersion: 2 + x: 200 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 44c395e5fe69801408287912cefc5d4f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_11 + rect: + serializedVersion: 2 + x: 220 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5ab77f0b6cccb0f4795adfc6cd061ff0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_12 + rect: + serializedVersion: 2 + x: 240 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5a9332641a2b73b4fa80b92cf8d894c5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_13 + rect: + serializedVersion: 2 + x: 260 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 39e91d7eebb0b704db86684f6d8ab6db + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_14 + rect: + serializedVersion: 2 + x: 280 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 56ab7a5b2922baf419e54a205623bc44 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_15 + rect: + serializedVersion: 2 + x: 300 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa0563a19fda7584ea4c83ec536e145b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_16 + rect: + serializedVersion: 2 + x: 320 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3e3fd81e55eb71345a361a9a19abb09a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_17 + rect: + serializedVersion: 2 + x: 340 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3cec2cfd28a2a814083ef0fec8ea9da1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_18 + rect: + serializedVersion: 2 + x: 360 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e84a70e2b20bf444abc7eb6a7b5e7e0f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_19 + rect: + serializedVersion: 2 + x: 380 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1a3d3b3af2a73f24ba0a6d062f48bd8c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_20 + rect: + serializedVersion: 2 + x: 400 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5441068122c93be42a5d457441b7d093 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_21 + rect: + serializedVersion: 2 + x: 420 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6296c03117181c64a94a169178d3c2dc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_22 + rect: + serializedVersion: 2 + x: 440 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 35dd18c347d893e4fbaf26d238e1e1cb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_23 + rect: + serializedVersion: 2 + x: 460 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 77ba8bd92185f4746b96ab76f3f441ed + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_24 + rect: + serializedVersion: 2 + x: 480 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 348572f4193777a468a5d40e02684cf3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_25 + rect: + serializedVersion: 2 + x: 500 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8e782de0d5d64484284ac3bab594c88b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_26 + rect: + serializedVersion: 2 + x: 520 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0ab35905ca3d3e442a89c67dd2a8d692 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_27 + rect: + serializedVersion: 2 + x: 540 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 56251507055108c42a1e08be0f6ef988 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_28 + rect: + serializedVersion: 2 + x: 560 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2c2ae74573475b44b95568f8db8349bb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_29 + rect: + serializedVersion: 2 + x: 580 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6957fb86cab5e7243a9e397f00ba6028 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_30 + rect: + serializedVersion: 2 + x: 600 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 181b64f76f77a6646a6a0d266f75b2a8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_31 + rect: + serializedVersion: 2 + x: 620 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9f36c68b25256f74e820c372fac7a9b1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_32 + rect: + serializedVersion: 2 + x: 640 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 00580cae4c485c34f8f5fe7b8ad340c6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_33 + rect: + serializedVersion: 2 + x: 660 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5f5e870229ae661419185c47ee07fd56 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_34 + rect: + serializedVersion: 2 + x: 680 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1525eb191570e4648812e4ff84f7b1df + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_35 + rect: + serializedVersion: 2 + x: 700 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 92d12f88530eb1248bfa132043a6d234 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_36 + rect: + serializedVersion: 2 + x: 720 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3309375ed2505144681c83988341846f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_37 + rect: + serializedVersion: 2 + x: 740 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9bf49e6707f525b45bc78873ab8fe4a7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_38 + rect: + serializedVersion: 2 + x: 760 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 472e3efe6d2014048bd9d34946a80d21 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_39 + rect: + serializedVersion: 2 + x: 780 + y: 593 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0f412eb9e511fd24ba1f1b1f8b29cc94 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_40 + rect: + serializedVersion: 2 + x: 0 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5b7756f8640103b41bce3de9cb5384e2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_41 + rect: + serializedVersion: 2 + x: 20 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 771312f3ad59226488c7e2d9802a4b14 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_42 + rect: + serializedVersion: 2 + x: 40 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 703ee591561cfe64d9457128067840e5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_43 + rect: + serializedVersion: 2 + x: 60 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fa633f1dcc06ae646a7a86d2b8a089f7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_44 + rect: + serializedVersion: 2 + x: 80 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 50699c63b79b5754ab5134d364f084e5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_45 + rect: + serializedVersion: 2 + x: 100 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 23b791eedd2ca1c47bef5f5d78493058 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_46 + rect: + serializedVersion: 2 + x: 120 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 15dcea7b31454e741af1f2ff063291bb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_47 + rect: + serializedVersion: 2 + x: 140 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 50887d148cd2fe944804ef693561e6b4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_48 + rect: + serializedVersion: 2 + x: 160 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 600838e707075c8489801d2ca6cae3e6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_49 + rect: + serializedVersion: 2 + x: 180 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 681dd205bf3fbbd4cbf40de61ca2fac2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_50 + rect: + serializedVersion: 2 + x: 200 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3aa075a2c10b10d439001e6d807a08c3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_51 + rect: + serializedVersion: 2 + x: 220 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 558bcfa2659d95f4b891922a4ac5645f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_52 + rect: + serializedVersion: 2 + x: 240 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ff3b226c23048bd4ea1ee0c58687debf + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_53 + rect: + serializedVersion: 2 + x: 260 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 972da2bc43dbbb1498e2988c7d25d50e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_54 + rect: + serializedVersion: 2 + x: 280 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 027fb9fbfe3b8eb44a12f6edc65be823 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_55 + rect: + serializedVersion: 2 + x: 300 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b813cfa5c833b1a499027057c32a9dfa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_56 + rect: + serializedVersion: 2 + x: 320 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 059c21e421ab67148abaf8a914d30943 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_57 + rect: + serializedVersion: 2 + x: 340 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 779d8601b6b78c0499afba382ea12c47 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_58 + rect: + serializedVersion: 2 + x: 360 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6847bdf1b7adc044c9dbe36edc054c47 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_59 + rect: + serializedVersion: 2 + x: 380 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 66bf9a90683c9b743b6c647ee1fa7fec + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_60 + rect: + serializedVersion: 2 + x: 400 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3eaef7e3423c86e4aa3979ffd098ebb3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_61 + rect: + serializedVersion: 2 + x: 420 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3fb1d2b73d4cbe84487a3b139cc06aab + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_62 + rect: + serializedVersion: 2 + x: 440 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 11bf4a619363133438b9bed5fc57fbcc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_63 + rect: + serializedVersion: 2 + x: 460 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7d497029a1b54d54690371a96b8df503 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_64 + rect: + serializedVersion: 2 + x: 480 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a0fefd7d3e5cd8e448a800dfcd62f71e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_65 + rect: + serializedVersion: 2 + x: 500 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1fc061021772f0e42958c4de709fd5ab + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_66 + rect: + serializedVersion: 2 + x: 520 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 57c1a918a18af234a8a6043ccc9a16fd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_67 + rect: + serializedVersion: 2 + x: 540 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e1faadd0cbbb41c499edd27907fdaea5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_68 + rect: + serializedVersion: 2 + x: 560 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e703b2e0984409048abdd2e0ac05baf7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_69 + rect: + serializedVersion: 2 + x: 580 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: feb5a70895a41544587bf1d4acddad44 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_70 + rect: + serializedVersion: 2 + x: 600 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8f2428f98611e1a419d5c1f3ecde0fcd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_71 + rect: + serializedVersion: 2 + x: 620 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c2d59f4b35491ba4eb53cb2afc782809 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_72 + rect: + serializedVersion: 2 + x: 640 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bdb3905a2f177744aa989f567729ec40 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_73 + rect: + serializedVersion: 2 + x: 660 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7bad451dc112164448cfd061a086c0d7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_74 + rect: + serializedVersion: 2 + x: 680 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5b5fc38de5b58f84abeff25c5ee4475a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_75 + rect: + serializedVersion: 2 + x: 700 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bf8f4a03b8660b1479813c3698ab5997 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_76 + rect: + serializedVersion: 2 + x: 720 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d450bd5bea043424b872d49d402af9e9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_77 + rect: + serializedVersion: 2 + x: 740 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b3d9be6a7fa89fb43ae89de287910db8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_78 + rect: + serializedVersion: 2 + x: 760 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 973b92c9751db1d468dcf9f5b5f07d40 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_79 + rect: + serializedVersion: 2 + x: 780 + y: 573 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b5db2ab614d4b2e4c915215efe1834b7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_80 + rect: + serializedVersion: 2 + x: 0 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 91439fc7c7c404e4ab639bd81ff311bb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_81 + rect: + serializedVersion: 2 + x: 20 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e9f976fed8027ff4bbf7264580df9e99 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_82 + rect: + serializedVersion: 2 + x: 40 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3b4d0ffd6bdfac947a415f5dad525961 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_83 + rect: + serializedVersion: 2 + x: 60 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 773e52a462d561e488b58f39c97c237e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_84 + rect: + serializedVersion: 2 + x: 80 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a025f673b90f09c41a12acaa13c4e432 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_85 + rect: + serializedVersion: 2 + x: 100 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: de37955a9f458ff44897982b5b5b9576 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_86 + rect: + serializedVersion: 2 + x: 120 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 78b055874fd1836449855cf91616f6a9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_87 + rect: + serializedVersion: 2 + x: 140 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3ece113f174870f4eaa065b4ba9c9863 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_88 + rect: + serializedVersion: 2 + x: 160 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e788559c2e3ccc2459ed5ce1107c4a20 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_89 + rect: + serializedVersion: 2 + x: 180 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9f457c172372c7a4c8cb610872f7cd98 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_90 + rect: + serializedVersion: 2 + x: 200 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 84eabce8187c93a44ae2c25d72042326 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_91 + rect: + serializedVersion: 2 + x: 220 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 46bce8b7ec4fdde4f8c7414c748428d0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_92 + rect: + serializedVersion: 2 + x: 240 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0391d86417c6e964ca3b2ab8e56a6981 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_93 + rect: + serializedVersion: 2 + x: 260 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1eabc9760e09e684da5fceef524f1ef5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_94 + rect: + serializedVersion: 2 + x: 280 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 38f339a74db68db4eae27ab2d557f5e7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_95 + rect: + serializedVersion: 2 + x: 300 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 900e947661d87cd489aa1833900491ba + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_96 + rect: + serializedVersion: 2 + x: 320 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ed0a9317fee1dea459b93baf9392574e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_97 + rect: + serializedVersion: 2 + x: 340 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d321b417f682b454c81a5decac573913 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_98 + rect: + serializedVersion: 2 + x: 360 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9996b7226ffa2254c920d55292287784 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_99 + rect: + serializedVersion: 2 + x: 380 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5c30bd03da71a2d428ccd74f4b07b9ee + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_100 + rect: + serializedVersion: 2 + x: 400 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3bc407de3cd28ac43ad3e29c3eb958a3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_101 + rect: + serializedVersion: 2 + x: 420 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 351ddf9f297b4e845bc5918f6db88e68 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_102 + rect: + serializedVersion: 2 + x: 440 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 42a3db19a365da34e9793cfa3b721a8d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_103 + rect: + serializedVersion: 2 + x: 460 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5291c404478952d41982b0c2efffb2a3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_104 + rect: + serializedVersion: 2 + x: 480 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5d102d869e8f7284b926a045c410d247 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_105 + rect: + serializedVersion: 2 + x: 500 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6a719655ee658504399a6102548da8bd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_106 + rect: + serializedVersion: 2 + x: 520 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a2fc44e81b5da914d9d8b3f2dd4e4523 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_107 + rect: + serializedVersion: 2 + x: 540 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6e59ffbde1a15f14abb93ef1fc214c6d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_108 + rect: + serializedVersion: 2 + x: 560 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 704a752cf3371fd46a2365000545bb82 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_109 + rect: + serializedVersion: 2 + x: 580 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e16bd2f86e5cbe943bd5f760041628cf + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_110 + rect: + serializedVersion: 2 + x: 600 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a747a843e412e554d97ce994cc1f5a6a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_111 + rect: + serializedVersion: 2 + x: 620 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7dbeeed0cde02374f85f19b0dbe5f954 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_112 + rect: + serializedVersion: 2 + x: 640 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 68ef516967baf6c4b932988593208098 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_113 + rect: + serializedVersion: 2 + x: 660 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4087fda4a66f505438dffdd88eb7b409 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_114 + rect: + serializedVersion: 2 + x: 680 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bf5a866673a8d9f43a70b4017c3f34f5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_115 + rect: + serializedVersion: 2 + x: 700 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ea295f2df28afd148923ab097fd7e495 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_116 + rect: + serializedVersion: 2 + x: 720 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8730efebf163c3d4da53b554d463268c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_117 + rect: + serializedVersion: 2 + x: 740 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e167e4899d2ef974c833bf0d147eea62 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_118 + rect: + serializedVersion: 2 + x: 760 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e323cc69484d8ba4883c010363da2a07 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_119 + rect: + serializedVersion: 2 + x: 780 + y: 553 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 88d52ea17c38a9d4797fa869266809e5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_120 + rect: + serializedVersion: 2 + x: 0 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2ac1af9d2b07b4a4280982aebb066598 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_121 + rect: + serializedVersion: 2 + x: 20 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 82db3259706ecd84eb5563693e482bfa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_122 + rect: + serializedVersion: 2 + x: 40 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 820cd8f67636d464885de00a562a7afc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_123 + rect: + serializedVersion: 2 + x: 60 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7d2ff9746aa1a3d47a02dbdff0622621 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_124 + rect: + serializedVersion: 2 + x: 80 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ed5bf5c5084f2c3488aa86502657d0ff + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_125 + rect: + serializedVersion: 2 + x: 100 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 237adc07df51c494ba5c368555869cb6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_126 + rect: + serializedVersion: 2 + x: 120 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0917fe4ba4061b047a187a2379b7fdce + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_127 + rect: + serializedVersion: 2 + x: 140 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d0040225bd5793b4980e7486fa56d25a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_128 + rect: + serializedVersion: 2 + x: 160 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8c961daadc4bcd8438c73dcefe061ddc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_129 + rect: + serializedVersion: 2 + x: 180 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f1e8952fbfc73fc41ad90ea7ac46f1c7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_130 + rect: + serializedVersion: 2 + x: 200 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e73c528e091d9bd438119f49ef778686 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_131 + rect: + serializedVersion: 2 + x: 220 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1feb14fde117ef14fa0a17f6a2c33e15 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_132 + rect: + serializedVersion: 2 + x: 240 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fb60fbe9ffb9cd54f873a23df5a2e73f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_133 + rect: + serializedVersion: 2 + x: 260 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fc9db94cb5555db4e9688340575473b8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_134 + rect: + serializedVersion: 2 + x: 280 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 41192416482476e4097aa45907569d47 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_135 + rect: + serializedVersion: 2 + x: 300 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bd87e240f542e264abd699fb652ce965 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_136 + rect: + serializedVersion: 2 + x: 320 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cc32795f1399eef4f83729392b2ac1b6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_137 + rect: + serializedVersion: 2 + x: 340 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b3711ebdb05ebe74192a25d41c16be85 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_138 + rect: + serializedVersion: 2 + x: 360 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3ac8b33189b5b5c4ab15cc7a3a166cdd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_139 + rect: + serializedVersion: 2 + x: 380 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 301cce9f4cf2901408c6d0c06af67154 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_140 + rect: + serializedVersion: 2 + x: 400 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f947774681a28894881b8b7dcbc0cdbc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_141 + rect: + serializedVersion: 2 + x: 420 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8694ccb254bb22846bb33d709b5d2090 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_142 + rect: + serializedVersion: 2 + x: 440 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fa5348884f494bd42beaf245367ea7cd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_143 + rect: + serializedVersion: 2 + x: 460 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fbe6bc9336ce3a845bcf07c95177ef20 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_144 + rect: + serializedVersion: 2 + x: 480 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bbb50ef9229e52744b96df14d6914865 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_145 + rect: + serializedVersion: 2 + x: 500 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cc60b2b040230d54a9a701f6bdaae8ad + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_146 + rect: + serializedVersion: 2 + x: 520 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 44ed883d861d29347b7e7629c4f30ca4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_147 + rect: + serializedVersion: 2 + x: 540 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9fc5fd3e34afaba4bae0fde108f28571 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_148 + rect: + serializedVersion: 2 + x: 560 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c4e699a1560d68145a28f5fcb47d1c92 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_149 + rect: + serializedVersion: 2 + x: 580 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2eb18032ee92d44408571cb512933f4c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_150 + rect: + serializedVersion: 2 + x: 600 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 17d0c34d372720f428335b48a5a14f8c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_151 + rect: + serializedVersion: 2 + x: 620 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 097cd6657b71afe48a3881162e580f49 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_152 + rect: + serializedVersion: 2 + x: 640 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 96549936116579147bd77e5c113f60df + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_153 + rect: + serializedVersion: 2 + x: 660 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f733bbec0db93be4db3fb6f0f119f22c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_154 + rect: + serializedVersion: 2 + x: 680 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 480892b622ff6974f8cee5c6a2a75c61 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_155 + rect: + serializedVersion: 2 + x: 700 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1294b6a0be3d9d948a9708a68dd6b16b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_156 + rect: + serializedVersion: 2 + x: 720 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a1c58eac07fd7af4bad5c1a6c54c41f5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_157 + rect: + serializedVersion: 2 + x: 740 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a1c57ead8a042b041ab1aa78e03c3085 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_158 + rect: + serializedVersion: 2 + x: 760 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 98688fdc0f5638a42979aba2c89e683b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_159 + rect: + serializedVersion: 2 + x: 780 + y: 533 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 70b9121bde2c2f040ae427dc521ca677 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_160 + rect: + serializedVersion: 2 + x: 0 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4ddbe1e6358806e4eb9a9755775d2ca9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_161 + rect: + serializedVersion: 2 + x: 20 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0c75c5deece238d479ebb057867dd73f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_162 + rect: + serializedVersion: 2 + x: 40 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4eb05f65b747ca8429830d0cd11a8ec3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_163 + rect: + serializedVersion: 2 + x: 60 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e44db7fc6b601ea46bd92c7005d6313d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_164 + rect: + serializedVersion: 2 + x: 80 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: eea26f965b874b744a366b5cda0f6b75 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_165 + rect: + serializedVersion: 2 + x: 100 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bef9185cf43f1e946a38222252dea739 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_166 + rect: + serializedVersion: 2 + x: 120 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 58c8199712bd3b74caf08ece2a38eecd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_167 + rect: + serializedVersion: 2 + x: 140 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c1a2df6607942b04db067714bc08a3aa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_168 + rect: + serializedVersion: 2 + x: 160 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 79dd55da3b1e6f446bb99ca13eeaf35e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_169 + rect: + serializedVersion: 2 + x: 180 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e831f581a218495478cb9eb9ef378f90 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_170 + rect: + serializedVersion: 2 + x: 200 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c836ec253c823194aa3f4ff52112b0a8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_171 + rect: + serializedVersion: 2 + x: 220 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ff3129e76df5ef74ea4fbbff488b0e2f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_172 + rect: + serializedVersion: 2 + x: 240 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 36051bbc8c948f64ba894b8621153783 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_173 + rect: + serializedVersion: 2 + x: 260 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 180e5d8baf418e94db4ea8067958fb0e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_174 + rect: + serializedVersion: 2 + x: 280 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d6c1414db19b3414fb067c3e52f24050 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_175 + rect: + serializedVersion: 2 + x: 300 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f67c87d5bd2b42b44b3574703734ae35 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_176 + rect: + serializedVersion: 2 + x: 320 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a7e051c272118614580ce56e837431b4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_177 + rect: + serializedVersion: 2 + x: 340 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a525290cf7610254e99c0b4c1012a4ab + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_178 + rect: + serializedVersion: 2 + x: 360 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa542d42f3a077e42bfe9ec9690f2c33 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_179 + rect: + serializedVersion: 2 + x: 380 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 15f27849d9764c844a1cf6d47f05e9f2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_180 + rect: + serializedVersion: 2 + x: 400 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d426d3c7020f17a4782be4a875f6db43 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_181 + rect: + serializedVersion: 2 + x: 420 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cc6643895656e0e47b90c8b19f901ee2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_182 + rect: + serializedVersion: 2 + x: 440 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bced169ab89ec3d4a94d74adb7dbecc3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_183 + rect: + serializedVersion: 2 + x: 460 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 133e3b32075786b48a5a77a2181cf35a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_184 + rect: + serializedVersion: 2 + x: 480 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 74f2b62bd36e7c643ba88fffafca6166 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_185 + rect: + serializedVersion: 2 + x: 500 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6371e0fd0e1be9f4fb9e96d3b313e4fd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_186 + rect: + serializedVersion: 2 + x: 520 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7957bda1cd13dee4aa96fbf38354a047 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_187 + rect: + serializedVersion: 2 + x: 540 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2342838f748006c428d23c99d04b22db + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_188 + rect: + serializedVersion: 2 + x: 560 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b27568ba19676734d8be774ff2fad150 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_189 + rect: + serializedVersion: 2 + x: 580 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fb69a729f9c857841bcd91f468548d15 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_190 + rect: + serializedVersion: 2 + x: 600 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: efa63b230db8a2149b3b6f2d061751b3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_191 + rect: + serializedVersion: 2 + x: 620 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1a681fba826792740a995e803bfbba8c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_192 + rect: + serializedVersion: 2 + x: 640 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 20e8ce654dfc05d4f934bc71c924d9f8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_193 + rect: + serializedVersion: 2 + x: 660 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b769d7ae367e7a749af6fc466fc8bb89 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_194 + rect: + serializedVersion: 2 + x: 680 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0656bbba0de349345934fd65ac2174ed + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_195 + rect: + serializedVersion: 2 + x: 700 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f23b6a42aefc28a4ea1b4974a68da9a9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_196 + rect: + serializedVersion: 2 + x: 720 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 20e24db1ba901fa46abf441885287fc9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_197 + rect: + serializedVersion: 2 + x: 740 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 186f7f40c9fccf545855efce72dc4fa9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_198 + rect: + serializedVersion: 2 + x: 760 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3e6f6ebabda17ce4f9ada925df0b4346 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_199 + rect: + serializedVersion: 2 + x: 780 + y: 513 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 631b5a8ea3be3ab4083382c2be22745b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_200 + rect: + serializedVersion: 2 + x: 0 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8776db735d87bd34fa7a3428483f5378 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_201 + rect: + serializedVersion: 2 + x: 20 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: eec004a1bda8bb24eb9d054169bd6f33 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_202 + rect: + serializedVersion: 2 + x: 40 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ca786e8c6e64d7f46a533d9f17428032 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_203 + rect: + serializedVersion: 2 + x: 60 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bb53f9153488bba48bf3cc3ea6d36abb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_204 + rect: + serializedVersion: 2 + x: 80 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b20fc109e16b7af4cae49400a7ea6feb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_205 + rect: + serializedVersion: 2 + x: 100 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bcd10e3b6cb20d6469bfae0a3123fc8e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_206 + rect: + serializedVersion: 2 + x: 120 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: deb91770df03c4c4e9be2cf5bd76b26e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_207 + rect: + serializedVersion: 2 + x: 140 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 26774c6a1e6bd3745ab4594a78efb96f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_208 + rect: + serializedVersion: 2 + x: 160 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f43ae19a6ded9c94ca8b5e8528e0da65 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_209 + rect: + serializedVersion: 2 + x: 180 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d06ae34eafeac2f41a81ac74ff333ef6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_210 + rect: + serializedVersion: 2 + x: 200 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f99fac16929ffd44c963b1ea39e69d1b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_211 + rect: + serializedVersion: 2 + x: 220 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7781b6b55d9f93f489edacf921a5a5e3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_212 + rect: + serializedVersion: 2 + x: 240 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 21a76491d64aa0d49bd1065464bf1b30 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_213 + rect: + serializedVersion: 2 + x: 260 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 692a858a2643e264abe02c09449af3c4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_214 + rect: + serializedVersion: 2 + x: 280 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3e4974b721978ad41bad14f4c0a4b96e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_215 + rect: + serializedVersion: 2 + x: 300 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: dba9ded4dd4dd0343bd8773a567ba2be + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_216 + rect: + serializedVersion: 2 + x: 320 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa9d067dc30ea4b49a7f6e358835d744 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_217 + rect: + serializedVersion: 2 + x: 340 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c114bfb80f12a3149a6dd6bf190f875a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_218 + rect: + serializedVersion: 2 + x: 360 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8422b4def2e09444fa9a3386feab9bb0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_219 + rect: + serializedVersion: 2 + x: 380 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: be89db1b36d32f7479bf5c13d08abe7e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_220 + rect: + serializedVersion: 2 + x: 400 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: db761a21d95fc0940bbe32e59afede0d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_221 + rect: + serializedVersion: 2 + x: 420 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b08c48b110c67fc4292d460c59dd6596 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_222 + rect: + serializedVersion: 2 + x: 440 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c63faad91df07694788a7cdfbeb867bf + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_223 + rect: + serializedVersion: 2 + x: 460 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 811863c2c0256c34ab2a81535a002140 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_224 + rect: + serializedVersion: 2 + x: 480 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a32ea9c6311540349b83a7ef7970b5c6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_225 + rect: + serializedVersion: 2 + x: 500 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a4fea267d91f9d54b90f1b3584ded804 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeverIdle + rect: + serializedVersion: 2 + x: 520 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 576ae1ab6973020438fede1ac9ba68dd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeverActive + rect: + serializedVersion: 2 + x: 540 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0d52abfd823b28a44996997f9fbaa851 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_228 + rect: + serializedVersion: 2 + x: 640 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ce5831ee28b45a940943570af5c84f58 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_229 + rect: + serializedVersion: 2 + x: 660 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2443b492edabba14ba06c91a78b09797 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_230 + rect: + serializedVersion: 2 + x: 680 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 53c54700f841a1649b84ad1167e21f2e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_231 + rect: + serializedVersion: 2 + x: 700 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: db0e5280dc0f5044795bc055dd0cb3bf + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_232 + rect: + serializedVersion: 2 + x: 720 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a719b8220e4fd0e48bf0386caf8369cc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_233 + rect: + serializedVersion: 2 + x: 740 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a015d8824a45efb47b461a3af5e58d4e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_234 + rect: + serializedVersion: 2 + x: 760 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4ce1a8edb5f034e4d820049a61872ec1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_235 + rect: + serializedVersion: 2 + x: 780 + y: 493 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f5965d311e2970446884c79a758b4949 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_236 + rect: + serializedVersion: 2 + x: 0 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b70e5ee002478d740bd27cd3c95f10db + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_237 + rect: + serializedVersion: 2 + x: 20 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8b56cf3e7f2ba3b4d8d9929fb17e9327 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_238 + rect: + serializedVersion: 2 + x: 40 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 078210fd00870ba43beba60f25d81af0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_239 + rect: + serializedVersion: 2 + x: 60 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2643f41481915294f81254dcb67975e7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_240 + rect: + serializedVersion: 2 + x: 80 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f7e28228d02b8724b85d80b2b17b975b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_241 + rect: + serializedVersion: 2 + x: 100 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 80adb72ce3a4ec141b4e8ab815d472e0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_242 + rect: + serializedVersion: 2 + x: 120 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 24b6bb3d04682b74ba8c2bc7841416ec + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_243 + rect: + serializedVersion: 2 + x: 140 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4f8e200b2bb374f4e95cfc85ffdd1284 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_244 + rect: + serializedVersion: 2 + x: 160 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d991c58cb0051cf4dae43ead7a4fed78 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_245 + rect: + serializedVersion: 2 + x: 180 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 97152a7a64e012e49b9e17b63b8a79f1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_246 + rect: + serializedVersion: 2 + x: 200 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: db63b37c3a031284d8f901bfd44d7031 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_247 + rect: + serializedVersion: 2 + x: 220 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 54e48e74b8e4228408d593419ce3a3aa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_248 + rect: + serializedVersion: 2 + x: 240 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e2831c2ae9e813841afd0722ae6a7258 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_249 + rect: + serializedVersion: 2 + x: 260 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1081e529f370dfe468039407d0380ea9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_250 + rect: + serializedVersion: 2 + x: 280 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f7eb3102afa91f948b76c5c7ccd41b22 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_251 + rect: + serializedVersion: 2 + x: 300 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4b3cf6d0e957dd84cbade2d8fdd21e1d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_252 + rect: + serializedVersion: 2 + x: 320 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 396ecb6dd7e4d0741ae6fe7d9a5875d2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_253 + rect: + serializedVersion: 2 + x: 340 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 42c8cadbb197cab41b973696f723540c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_254 + rect: + serializedVersion: 2 + x: 360 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e61cc276262d60e49bb53d4b3ce1b20c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_255 + rect: + serializedVersion: 2 + x: 380 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3eb3152bc5908f4449c5f0943f7b0790 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Sign + rect: + serializedVersion: 2 + x: 400 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: beed486aea225ba4ca9c24221514b4e4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_257 + rect: + serializedVersion: 2 + x: 420 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e4656d52f0187fd4a8799d949b6ed52e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_258 + rect: + serializedVersion: 2 + x: 440 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 32361bdf87af94049b09f641ec953745 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_259 + rect: + serializedVersion: 2 + x: 460 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9f14bca82c1cd4247b7cc2486bb7425f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_260 + rect: + serializedVersion: 2 + x: 480 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 44dddba539139cf409c5d3a03d517c3d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_261 + rect: + serializedVersion: 2 + x: 500 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a5fa2849f35c008498219901f6f56654 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_262 + rect: + serializedVersion: 2 + x: 520 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 420067505f83c344fa9adfc4d4a672d4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_263 + rect: + serializedVersion: 2 + x: 540 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d019b378424cb6a4bbf8531c9b2965a2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_264 + rect: + serializedVersion: 2 + x: 640 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: babf2d87cb73e8b4d88eba93ea8360c9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_265 + rect: + serializedVersion: 2 + x: 660 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: dbab5623a7ec7b84ea44b96e53246b10 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_266 + rect: + serializedVersion: 2 + x: 680 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 268b07258bae05846821462c8fe02d52 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_267 + rect: + serializedVersion: 2 + x: 700 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4ccad921c7f66ce43a96b8e36219f087 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_268 + rect: + serializedVersion: 2 + x: 720 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2927b44343f29f043a7c14d8095c198b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_269 + rect: + serializedVersion: 2 + x: 740 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a5aca406521c0d94bb04a46303f0e9a3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_270 + rect: + serializedVersion: 2 + x: 760 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fd8db581209d3294680f96141d472141 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_271 + rect: + serializedVersion: 2 + x: 780 + y: 473 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 624d048eeef8383429bc97c08660ae56 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_272 + rect: + serializedVersion: 2 + x: 0 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ec7561e77d5ec1a4b98464ed62e819cc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_273 + rect: + serializedVersion: 2 + x: 20 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ba959f70efd148b48a22369ee2db0810 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_274 + rect: + serializedVersion: 2 + x: 40 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cf762932384f88a47a7a1d32c474b350 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_275 + rect: + serializedVersion: 2 + x: 60 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c992ceac702bc414eac7d2863ad55716 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_276 + rect: + serializedVersion: 2 + x: 80 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 50b28e6267c84fb4b9346547c92fa1c4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_277 + rect: + serializedVersion: 2 + x: 100 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 862b043333eaf4b41a1d5861f24baad9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_278 + rect: + serializedVersion: 2 + x: 120 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 690c002c7bf396f4fa51f6e2daa26886 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_279 + rect: + serializedVersion: 2 + x: 140 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 113748184dce7aa449f2d33e737d65b3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_280 + rect: + serializedVersion: 2 + x: 160 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3c84a00aa554dee41b313ea5f0f8832d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_281 + rect: + serializedVersion: 2 + x: 180 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 86a5147fcd6d0dd479b3c6f3a9d7b88f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_282 + rect: + serializedVersion: 2 + x: 200 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7f198673cdeae2540b21acacd072e823 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_283 + rect: + serializedVersion: 2 + x: 220 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ac1b63839e85b7641877b185148474ce + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_284 + rect: + serializedVersion: 2 + x: 240 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7612768e1d32d8e44b70a7f4a330b68e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_285 + rect: + serializedVersion: 2 + x: 260 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: edfba1e101eebb843a2c58c0823d538c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_286 + rect: + serializedVersion: 2 + x: 280 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c3c0ddf23be75d2429ee96ebe4072ebc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_287 + rect: + serializedVersion: 2 + x: 300 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 64377059a5c98354daf72b55a9a249ad + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_288 + rect: + serializedVersion: 2 + x: 320 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0962d47bb642141449979c3f7d5ee43b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_289 + rect: + serializedVersion: 2 + x: 340 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 494f39a3a677d8147995e7e70ba39f9d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_290 + rect: + serializedVersion: 2 + x: 360 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: edfa1e2c537dc7b47836d5869361491f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_291 + rect: + serializedVersion: 2 + x: 380 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b8471692b896b2642971dff5136ec6b6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_292 + rect: + serializedVersion: 2 + x: 400 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 637277a4d5b4fb84bbbf80038907d84d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_293 + rect: + serializedVersion: 2 + x: 420 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3bd9576006143e340b9b295ca29210dc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_294 + rect: + serializedVersion: 2 + x: 440 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fc8e9b28e774adc479da2b899c2ed578 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_295 + rect: + serializedVersion: 2 + x: 460 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fe97d933d9e80124fb75e2eb472a1c93 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_296 + rect: + serializedVersion: 2 + x: 640 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1f95cc4351b392849a0b846d787c750b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_297 + rect: + serializedVersion: 2 + x: 660 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 618c0bf439fab0c42ac1aa2df410acc9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_298 + rect: + serializedVersion: 2 + x: 680 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e48456089929c534990775814fbdc285 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_299 + rect: + serializedVersion: 2 + x: 700 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6086a0495f5665242b53a2cb5cdb509a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_300 + rect: + serializedVersion: 2 + x: 720 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cb3e2942f5424204ca835d194234a610 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_301 + rect: + serializedVersion: 2 + x: 740 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6b559e3035689bf4dae2f1a719bbb90e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_302 + rect: + serializedVersion: 2 + x: 760 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 046f5813e34f2af4a80d7427b431b8ad + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_303 + rect: + serializedVersion: 2 + x: 780 + y: 453 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6265fbc5e118c3c4fa8afca533edef1f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_304 + rect: + serializedVersion: 2 + x: 0 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 11ed17e35df4fd544aabe31a0a36ea3c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_305 + rect: + serializedVersion: 2 + x: 20 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 155b39945ce2edf44a12ba42feb3d158 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_306 + rect: + serializedVersion: 2 + x: 40 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 45b9f8236f0111946a1c4cb254ee3ab8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_307 + rect: + serializedVersion: 2 + x: 60 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ce682ce7f054abe4a9f2a88cab2ec2b6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_308 + rect: + serializedVersion: 2 + x: 80 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5255a24e4eaa3aa4e92f3a3763f984f9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_309 + rect: + serializedVersion: 2 + x: 100 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 75dd119891e97b04e9439fe78708746b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_310 + rect: + serializedVersion: 2 + x: 120 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b633f57426b63574fb00f3a2ea07db95 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_311 + rect: + serializedVersion: 2 + x: 140 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e8fdef9acd1340e48ba8194cfe1ee19b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_312 + rect: + serializedVersion: 2 + x: 160 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cdbeb56698e3cf5418f035d79c6cc642 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_313 + rect: + serializedVersion: 2 + x: 180 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 892e1d9ba14dced4992b77373047718b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_314 + rect: + serializedVersion: 2 + x: 200 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: edec701ccb9a17a4a859a283afa76c10 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_315 + rect: + serializedVersion: 2 + x: 220 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 048124545ed067a4ea884312873831c0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_316 + rect: + serializedVersion: 2 + x: 240 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9405f17ee283f1647955bc5c8996de19 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_317 + rect: + serializedVersion: 2 + x: 260 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1118e75b5cac09f49ac76b790a32bef8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_318 + rect: + serializedVersion: 2 + x: 280 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: dfabb2d6bf1a61446ba1a916e8ca735a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_319 + rect: + serializedVersion: 2 + x: 300 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9e2531eb706d2704b95448fd4aa22ce5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_320 + rect: + serializedVersion: 2 + x: 320 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8cdf633f33fdd094cb7aa56f9235d632 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_321 + rect: + serializedVersion: 2 + x: 340 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: def629c5948b8c64783e2dc9784f9ea8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_322 + rect: + serializedVersion: 2 + x: 360 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d22d99b3a1ae8df40b87e364a163fe0b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_323 + rect: + serializedVersion: 2 + x: 380 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 75aafa5014e415f4e815a198df501bcb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_324 + rect: + serializedVersion: 2 + x: 400 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 09848d9f66860c74aa0600a56ba1afed + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_325 + rect: + serializedVersion: 2 + x: 420 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e30a1f49876b69a43abc9f202c58eebe + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_326 + rect: + serializedVersion: 2 + x: 440 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8bea3e8f5842aa940bb7968d317b4d65 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_327 + rect: + serializedVersion: 2 + x: 460 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9c98adb8c36a1d1438727c9772a36f5c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_328 + rect: + serializedVersion: 2 + x: 640 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 52ac385adce9e7b4abf4a566e8945afb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_329 + rect: + serializedVersion: 2 + x: 660 + y: 433 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6cf66f1a5c78b394a944da474a09f132 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_330 + rect: + serializedVersion: 2 + x: 0 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 88e66fa3bd4c2784e980113e22cb6ba0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_331 + rect: + serializedVersion: 2 + x: 20 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a23b87e01eb230b4382c3a13900725d9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_332 + rect: + serializedVersion: 2 + x: 40 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fa748a77ea0dbc8408ca34eacb455144 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_333 + rect: + serializedVersion: 2 + x: 60 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 77854d4ca3a243244a152837de071afe + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_334 + rect: + serializedVersion: 2 + x: 80 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0195054acd0fa5f4690eeea4009f2da4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_335 + rect: + serializedVersion: 2 + x: 100 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 38cd3ba657940f6488a260585d62b64d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_336 + rect: + serializedVersion: 2 + x: 120 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa7956a95d675c747bae41cd39c7368d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_337 + rect: + serializedVersion: 2 + x: 140 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f232e5c16b0cca94e950508c9da00f49 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_338 + rect: + serializedVersion: 2 + x: 160 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a83fff1b4d5124447b3ca588a952f813 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_339 + rect: + serializedVersion: 2 + x: 180 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5c973dcfd482b5e4581340ca7e0ee9d1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_340 + rect: + serializedVersion: 2 + x: 200 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d1ce0540c615d2045a89ff68004e73d0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_341 + rect: + serializedVersion: 2 + x: 220 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d834647020efab74699e450a61f1856d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_342 + rect: + serializedVersion: 2 + x: 240 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c9ffffd048d375943846560d147909dd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_343 + rect: + serializedVersion: 2 + x: 260 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c030e4de4dc6cbd478467d4c6043c2b7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_344 + rect: + serializedVersion: 2 + x: 280 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0d72d54609b73f1408eb1dd12d3131bc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_345 + rect: + serializedVersion: 2 + x: 300 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 80dcb76af0e5845498fecb1a596b2259 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_346 + rect: + serializedVersion: 2 + x: 320 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8b1323e5a35824841b410def5fdce74e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_347 + rect: + serializedVersion: 2 + x: 340 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 47c49c6e79dfcca4f8f4f2be283973ec + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_348 + rect: + serializedVersion: 2 + x: 360 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 366da98e573691149b819404f8239004 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_349 + rect: + serializedVersion: 2 + x: 380 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a8fa69ffe0aa9b84fba929b1c62c6677 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_350 + rect: + serializedVersion: 2 + x: 400 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 456570421f357e84a8d18bc4ceb59ddb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_351 + rect: + serializedVersion: 2 + x: 420 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d13f23c8f7886004a8ab14e41d021b5f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_352 + rect: + serializedVersion: 2 + x: 440 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 88169470c540acb4a9ae8c65cd0a3b7a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_353 + rect: + serializedVersion: 2 + x: 640 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f88f79375ec37354096ab0e70660d39e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_354 + rect: + serializedVersion: 2 + x: 660 + y: 413 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 888c3d648982a0f42ae3bfc157c266ba + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_355 + rect: + serializedVersion: 2 + x: 0 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 869d78d0d56791947bf8a854755a88d8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_356 + rect: + serializedVersion: 2 + x: 20 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5f1c069306de4d44e99729333960f6a8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_357 + rect: + serializedVersion: 2 + x: 40 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6933719356698cd4d9083e68f86ab2ba + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_358 + rect: + serializedVersion: 2 + x: 60 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 046b71bdd225a1d43bee220c6995d94b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_359 + rect: + serializedVersion: 2 + x: 80 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 07abcd30478b53543b2d19b19fe72faa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_360 + rect: + serializedVersion: 2 + x: 100 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2c1acdf06f483a04c8869a2ab37fd25f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_361 + rect: + serializedVersion: 2 + x: 120 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8f482bef86fb66648b4c695ea346d8b6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_362 + rect: + serializedVersion: 2 + x: 160 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 94c4dbeeafbedde4eb66ff57065bfa7e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_363 + rect: + serializedVersion: 2 + x: 180 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 12ebe701b9ef25b4e8e7b6195059c762 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_364 + rect: + serializedVersion: 2 + x: 200 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ee7c383cf3bdeec4195f8abe3f592486 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_365 + rect: + serializedVersion: 2 + x: 220 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 19d2e42e834591848805e4b710647fb4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_366 + rect: + serializedVersion: 2 + x: 240 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa10ffacb4994b94593e064ef202fcc5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_367 + rect: + serializedVersion: 2 + x: 260 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3451f6cc8376eb74b89f634dff334117 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_368 + rect: + serializedVersion: 2 + x: 280 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c139b0d1e4f4f2c49a2397f206dac088 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_369 + rect: + serializedVersion: 2 + x: 300 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a10950f525935544a885e5c9d1d6d280 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_370 + rect: + serializedVersion: 2 + x: 320 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e40266f1e8a6621419627a9159581425 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_371 + rect: + serializedVersion: 2 + x: 340 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0ca22e315cc657a43bfbbddffbc02321 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_372 + rect: + serializedVersion: 2 + x: 360 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a14d972a6d780d8479d3248b7aa14ed9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_373 + rect: + serializedVersion: 2 + x: 380 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e0040e7cabb8ee74cac6a5f3bd77e3cb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_374 + rect: + serializedVersion: 2 + x: 400 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 98b3dedf35467f6429b081ae539dbc7d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_375 + rect: + serializedVersion: 2 + x: 420 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5ec3da7ab3f33a948913a7d747d117ff + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_376 + rect: + serializedVersion: 2 + x: 440 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cb127cbdd7dc5b84baa1f65109e39931 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_377 + rect: + serializedVersion: 2 + x: 640 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a5409801c3cd34349a16b5b8d64894bb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_378 + rect: + serializedVersion: 2 + x: 660 + y: 393 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 08704028943ae8e4a9c4538c43696411 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_379 + rect: + serializedVersion: 2 + x: 20 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e8be8379386f3e54eada5e5787cd4bc0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_380 + rect: + serializedVersion: 2 + x: 40 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 680befc7ed1a5f74591f464c1529bdb8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_381 + rect: + serializedVersion: 2 + x: 80 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c341affb0f8ce294db4ade4142077b68 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_382 + rect: + serializedVersion: 2 + x: 100 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 39e244e419d80fa45aeabbe313b76b5c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_383 + rect: + serializedVersion: 2 + x: 120 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 51d134baa94dae245be01fd5482d0c6e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_384 + rect: + serializedVersion: 2 + x: 140 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a7833aab98692d648b250664c569ae17 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_385 + rect: + serializedVersion: 2 + x: 160 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4363624b85af8d94bbda8e0359f4bb74 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_386 + rect: + serializedVersion: 2 + x: 180 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5540d4bf7b5f98e46bce9e457f999e0e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_387 + rect: + serializedVersion: 2 + x: 200 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6dca6a01c9486694691aa74293d00195 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_388 + rect: + serializedVersion: 2 + x: 220 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 03ec2afc37409864b95c6972438972d5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_389 + rect: + serializedVersion: 2 + x: 240 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e78434f80e9e5b44eb4c5b6e8b908195 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_390 + rect: + serializedVersion: 2 + x: 260 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9c65460a298cc9d4999b61c5d2130fcf + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_391 + rect: + serializedVersion: 2 + x: 280 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0c0282f6719cfc64c822a230b87bb0ac + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_392 + rect: + serializedVersion: 2 + x: 300 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fd9849b300dc84e4884f9b05b0c4bf09 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_393 + rect: + serializedVersion: 2 + x: 320 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 802c744086eb8b24589c6d1c16fa39f4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_394 + rect: + serializedVersion: 2 + x: 340 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a809b479abae7404dbafad8052f44e12 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_395 + rect: + serializedVersion: 2 + x: 360 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6ffe783c50d3ee84f90c105c6ca44bc5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_396 + rect: + serializedVersion: 2 + x: 380 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d8f773d6caacc7f41b97df5cbbe93e90 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_397 + rect: + serializedVersion: 2 + x: 400 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4d63d1aa53fe94c45ad7473116fa7304 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_398 + rect: + serializedVersion: 2 + x: 420 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f8c0ca581fd675b4ea5872a36f59cb68 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_399 + rect: + serializedVersion: 2 + x: 440 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b8c2e35c2f4db0642a7031a61dd44fd3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_400 + rect: + serializedVersion: 2 + x: 640 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c62d816cc58d1494ebb7546a04cb5a18 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_401 + rect: + serializedVersion: 2 + x: 660 + y: 373 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b358b71850c52da4a864ccd1c51de420 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_402 + rect: + serializedVersion: 2 + x: 0 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa1a93384cb3c5e4c9ef68247859b5e1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_403 + rect: + serializedVersion: 2 + x: 20 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 718aa6d27bc7db04abdaeec1f530c15b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_404 + rect: + serializedVersion: 2 + x: 40 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 79ad21384b5231143aadf4571d5e5349 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_405 + rect: + serializedVersion: 2 + x: 100 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3e6b3b090edaf8341b4941200efc956d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_406 + rect: + serializedVersion: 2 + x: 120 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4f4a602ebabfaf24989332f8dfedb8bd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_407 + rect: + serializedVersion: 2 + x: 140 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: da2eac6308ff2fa4a93d7f9f6a5ef195 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_408 + rect: + serializedVersion: 2 + x: 160 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8900bff1f861fe048b575fd6b00e1e85 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_409 + rect: + serializedVersion: 2 + x: 180 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 62e9d0a2bf3ffe34990416497f5f8164 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_410 + rect: + serializedVersion: 2 + x: 200 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f8701ee6d7014ce4b8eddae649961f6a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_411 + rect: + serializedVersion: 2 + x: 220 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0ce428504aad6c842abb9dc44282c98c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_412 + rect: + serializedVersion: 2 + x: 240 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f01a338fea6dcfa4794bf698ada43a54 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_413 + rect: + serializedVersion: 2 + x: 260 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a0220f6c9c0f95e4680062488f3646ea + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_414 + rect: + serializedVersion: 2 + x: 280 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a024653099dabdc47acdb141cd6b9435 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_415 + rect: + serializedVersion: 2 + x: 300 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 160f6129514fc6b429cc7f1f1972c928 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_416 + rect: + serializedVersion: 2 + x: 320 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2606449f401a52746b1ec78abbd1688c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_417 + rect: + serializedVersion: 2 + x: 340 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 17219bcbad952754499f798657266b01 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_418 + rect: + serializedVersion: 2 + x: 360 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ae6fe636f86aaa141a31214198b724aa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_419 + rect: + serializedVersion: 2 + x: 380 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9e6739f740c864d4dad446d5d2dd66b8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_420 + rect: + serializedVersion: 2 + x: 400 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9129161af5ed5964bb54dbf60c0e2e97 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_421 + rect: + serializedVersion: 2 + x: 420 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: db0da8acbef637d47b45a185b63fcfed + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_422 + rect: + serializedVersion: 2 + x: 640 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b9ea2e6431bf8dd46b34ce3c7f12e1d9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_423 + rect: + serializedVersion: 2 + x: 660 + y: 353 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2330649fd1559c24d9af8b2b510341ae + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_424 + rect: + serializedVersion: 2 + x: 0 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 04887d584766bd246b87b8f2b896cc9d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_425 + rect: + serializedVersion: 2 + x: 20 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bfc8198418f53b94f889a24e6f021623 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_426 + rect: + serializedVersion: 2 + x: 40 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1b49673fd47660042be7b34449cec5b6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_427 + rect: + serializedVersion: 2 + x: 100 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1a83f07be0df56e4599bc662368dd4e9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_428 + rect: + serializedVersion: 2 + x: 120 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 67c64ead183bc2043852d7d9fec53c1a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_429 + rect: + serializedVersion: 2 + x: 140 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1389c45940f4f2f4d94247905e325e01 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_430 + rect: + serializedVersion: 2 + x: 160 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 79fada4fcb1d83e438c33af1de5c5c34 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_431 + rect: + serializedVersion: 2 + x: 180 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: dc8fb9455a368c0448fca2c121617f7a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_432 + rect: + serializedVersion: 2 + x: 200 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: af7ea79f70faee8499242851a4f95060 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_433 + rect: + serializedVersion: 2 + x: 220 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b6c2671cee0c64f48b4571192493a7a7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_434 + rect: + serializedVersion: 2 + x: 240 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7b4ba09f7539897489186aa97632eb6a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_435 + rect: + serializedVersion: 2 + x: 260 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5aa9f092a9b9e574c9bf68c00a76fa45 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_436 + rect: + serializedVersion: 2 + x: 280 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c4b41df8be6dbd248a20958dbbe5438e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_437 + rect: + serializedVersion: 2 + x: 300 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2161aac4765a1a04a9751389490fc6e4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_438 + rect: + serializedVersion: 2 + x: 320 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a511918ca14ffe74cace647d38c745ff + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_439 + rect: + serializedVersion: 2 + x: 340 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e7b93c54a71dcad44a7146d2f5ffa8b0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_440 + rect: + serializedVersion: 2 + x: 360 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2bf5953086e16a042b648f22cece452b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_441 + rect: + serializedVersion: 2 + x: 380 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 12474a12b85db6e4e9b08e41fc0252ec + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_442 + rect: + serializedVersion: 2 + x: 400 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0bf0cd6473e01f341a6cc5b61c0b40e4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_443 + rect: + serializedVersion: 2 + x: 420 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 94ae4558e6284b24c9e223e54d91a79e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_444 + rect: + serializedVersion: 2 + x: 640 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa38e903d346d0d419f55463adec001c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_445 + rect: + serializedVersion: 2 + x: 660 + y: 333 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: abc350475da160448bffe45681335e87 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_446 + rect: + serializedVersion: 2 + x: 140 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 06fe0f304c4b2c741a3762bba43e629a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_447 + rect: + serializedVersion: 2 + x: 160 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c911dde422ba4f344b626271ae5d01a0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_448 + rect: + serializedVersion: 2 + x: 180 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6b407c146dabd244d9b6066fc2fc1111 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_449 + rect: + serializedVersion: 2 + x: 200 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8351ddde3f0ad3949b5ee637e2327a0a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_450 + rect: + serializedVersion: 2 + x: 220 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6fe4fd2ccfe1a7d4c9bc1f11f0b3bcd0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_451 + rect: + serializedVersion: 2 + x: 240 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 95320fb13eaaed34487b0da0c395fa67 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_452 + rect: + serializedVersion: 2 + x: 260 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 10f2a38dadc6d5741b97951c331a900a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_453 + rect: + serializedVersion: 2 + x: 280 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5074d229e091efb498c99262df3ddffb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_454 + rect: + serializedVersion: 2 + x: 300 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b0dd9040e17fb4b4c99f4861348b188b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_455 + rect: + serializedVersion: 2 + x: 320 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 42c10ded4cc6037488c35e70f57f60d9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_456 + rect: + serializedVersion: 2 + x: 340 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ef0eb820984a92243a0eea875ea85e9b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_457 + rect: + serializedVersion: 2 + x: 360 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4e4fc8cecb763624c9d944afdbd21d3f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_458 + rect: + serializedVersion: 2 + x: 380 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: da6c109756fbb9241a0ab5e904dc66d3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_459 + rect: + serializedVersion: 2 + x: 400 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c5bea156d2838724190b8a55c2922981 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_460 + rect: + serializedVersion: 2 + x: 420 + y: 313 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8827c189127c9374bb9e50abb3620413 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_461 + rect: + serializedVersion: 2 + x: 160 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c51a959761d76ea4cbfa193d21a244b5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_462 + rect: + serializedVersion: 2 + x: 180 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 71f0b6c0a69e4c04c90e5646bc100bfd + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_463 + rect: + serializedVersion: 2 + x: 200 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e483dde492c97c947ab310e6b10e7fc5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_464 + rect: + serializedVersion: 2 + x: 220 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 25bceca4cddc29549be44b1874ee2372 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_465 + rect: + serializedVersion: 2 + x: 240 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 434ed3da27fbaf64aaeacdb148a47bf7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_466 + rect: + serializedVersion: 2 + x: 260 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7db39bd5b3cdd3e4fa7dfbf1df256ace + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_467 + rect: + serializedVersion: 2 + x: 280 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 480c771554130894f9811d9aec91bf9c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_468 + rect: + serializedVersion: 2 + x: 300 + y: 293 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 434d658eabbb0f349bdfc893d4442a32 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_469 + rect: + serializedVersion: 2 + x: 100 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0e0145bd489e5cf43a78de09b36205a6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_470 + rect: + serializedVersion: 2 + x: 120 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2d398ff301ab9ea429043a0d3d1bc1f9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_471 + rect: + serializedVersion: 2 + x: 140 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2e73cb32a23780141b3f62b3d49c7fac + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_472 + rect: + serializedVersion: 2 + x: 160 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: db0fa44dc77346443869b495c910d762 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_473 + rect: + serializedVersion: 2 + x: 180 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0cf7c5f5b4990304b9a934001f84cd84 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_474 + rect: + serializedVersion: 2 + x: 200 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5da20bdb5ae84734b8a4793bbee6022c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_475 + rect: + serializedVersion: 2 + x: 220 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 38d86805cff74554b9883a1805b68239 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_476 + rect: + serializedVersion: 2 + x: 240 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 107ca7d0338c34941a834d3f66f73c65 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_477 + rect: + serializedVersion: 2 + x: 260 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8ef8b54f4b753954fa6fed27ce4fdb0a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_478 + rect: + serializedVersion: 2 + x: 280 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4546e4282ce338b4e8f9b9401de40ddc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_479 + rect: + serializedVersion: 2 + x: 300 + y: 273 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1cd00d9ce53041f4b8507a04d25d4329 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_480 + rect: + serializedVersion: 2 + x: 100 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: db33ad42d37cd9a4fb6dd35bbf29707f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_481 + rect: + serializedVersion: 2 + x: 120 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1ff647c4419d632488115dcf9694faf7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_482 + rect: + serializedVersion: 2 + x: 140 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8a6701a1db8fcc84f958986331322257 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_483 + rect: + serializedVersion: 2 + x: 160 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 16d6c582860c9194ead2398addd42b25 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_484 + rect: + serializedVersion: 2 + x: 180 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 45e358c9f7a613d4088f5185e481d0a9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_485 + rect: + serializedVersion: 2 + x: 200 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 78bc58f3ad79add4ba3e5179fd856f87 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_486 + rect: + serializedVersion: 2 + x: 220 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 76fbbd1a0d2b5c447b2b26bd7638c35f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_487 + rect: + serializedVersion: 2 + x: 240 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ccb235ad46330b245bc01e406c563983 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_488 + rect: + serializedVersion: 2 + x: 260 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b23d2b623eee6904b9e352f013437853 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_489 + rect: + serializedVersion: 2 + x: 280 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 271ac50ee192ca240addb45582c02ef5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_490 + rect: + serializedVersion: 2 + x: 300 + y: 253 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 75b0d14195c82004aaa47603c76bfe93 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_491 + rect: + serializedVersion: 2 + x: 100 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8c6ddda15021c214f9cd994b24d73d5f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_492 + rect: + serializedVersion: 2 + x: 120 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 75df98a8a7402fc4ab7e7322914390a5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_493 + rect: + serializedVersion: 2 + x: 140 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d21218cbf34b6f045afc1822df6d02ec + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_494 + rect: + serializedVersion: 2 + x: 160 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ac56b3faa722d524983c59a4f93ee864 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_495 + rect: + serializedVersion: 2 + x: 180 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e7fbbe389a805eb48923509283c4f652 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_496 + rect: + serializedVersion: 2 + x: 200 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4af678f97ad1afc4a8edb8db0d95a659 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_497 + rect: + serializedVersion: 2 + x: 220 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f786d376b3a13594c8295c678e3d3274 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_498 + rect: + serializedVersion: 2 + x: 240 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: faae23cb3fc3cde469ebce1e0fe31a78 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_499 + rect: + serializedVersion: 2 + x: 260 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e8916a4f6a36e7a45bf388eed0654f5a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_500 + rect: + serializedVersion: 2 + x: 280 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1a2aa5662b7db3e40b350e41a1d30a73 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_501 + rect: + serializedVersion: 2 + x: 300 + y: 233 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a9cc550c4f456ec48acf7cdcb7a8df09 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_502 + rect: + serializedVersion: 2 + x: 320 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3b473275b3c1b0a47805f8e302dc844e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_503 + rect: + serializedVersion: 2 + x: 340 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 17dc84d483c57334e914e97a16bce341 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_504 + rect: + serializedVersion: 2 + x: 360 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d4bc66b7bf51e554f891714488e95e0b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_505 + rect: + serializedVersion: 2 + x: 380 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e56afa20170b2a64bb410bb1fe044bd0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_506 + rect: + serializedVersion: 2 + x: 400 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cd54cdb80d974ac4d99b3b1f39566bd4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_507 + rect: + serializedVersion: 2 + x: 420 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: de766c4064b295549bb1d447f4651278 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_508 + rect: + serializedVersion: 2 + x: 440 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 80f9e512ff158d64a9438a0c26d6c974 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_509 + rect: + serializedVersion: 2 + x: 460 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5c26ca23cd5a0b74299a7f8ec909fd1e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_510 + rect: + serializedVersion: 2 + x: 480 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4f2266ab52c5dce4a85a7739c1e71bd8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_511 + rect: + serializedVersion: 2 + x: 500 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 248d90e9afe4c524fbcfec35b59d784f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_512 + rect: + serializedVersion: 2 + x: 520 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 97de6c6621437d448a22a9c7b174d0fb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_513 + rect: + serializedVersion: 2 + x: 540 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3f5821bc8bd1a6d45a83655a84fba61e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_514 + rect: + serializedVersion: 2 + x: 560 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3edf0971c014a3d4f8fafe930e613843 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_515 + rect: + serializedVersion: 2 + x: 580 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3c18af80219ce6f439adfc6de23a0993 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_516 + rect: + serializedVersion: 2 + x: 600 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7cc190683c5da8447ac82d3f466be5d7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_517 + rect: + serializedVersion: 2 + x: 620 + y: 153 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: aa97469b45d210947853a574949bf7e3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_518 + rect: + serializedVersion: 2 + x: 320 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c928764d6e18c1a4da71e67034a87570 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_519 + rect: + serializedVersion: 2 + x: 340 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 235cbbf4fa7c4c64da9317dd2d7969d7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_520 + rect: + serializedVersion: 2 + x: 360 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 50ca30821cf21fd4588b16b0b8e2e326 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_521 + rect: + serializedVersion: 2 + x: 380 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 74a4a132a97e7944388a4b7308dd424a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_522 + rect: + serializedVersion: 2 + x: 400 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e59325c905601954e92c5a32bdbe6253 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_523 + rect: + serializedVersion: 2 + x: 420 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0793aae29ff031b40b0625f280ccbab6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_524 + rect: + serializedVersion: 2 + x: 440 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8f4dfb96b58a79e43b4aaf4ec7f895d3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_525 + rect: + serializedVersion: 2 + x: 460 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 034f3534779992e4a9f0ca235d094e27 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_526 + rect: + serializedVersion: 2 + x: 480 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 06983110868e60748b61f6869af554a4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_527 + rect: + serializedVersion: 2 + x: 500 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 489efd0b752730e49a7530c43787fc9c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_528 + rect: + serializedVersion: 2 + x: 520 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: eed0820f50078b742a1400cedd3a0dad + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_529 + rect: + serializedVersion: 2 + x: 540 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 32d7c7f9ab691a041bbcd8db87e0e4a6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_530 + rect: + serializedVersion: 2 + x: 560 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: cf9d601f5543cb7499be78c68050a5cb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_531 + rect: + serializedVersion: 2 + x: 580 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e77f9eadf2cfbaa489943d0ab3c05422 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_532 + rect: + serializedVersion: 2 + x: 600 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: de68eaa8fff64dc4faf4d6c95b77aa02 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_533 + rect: + serializedVersion: 2 + x: 620 + y: 133 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2af514bb3c993fa4ca0fc155d8c3b43c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_534 + rect: + serializedVersion: 2 + x: 320 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e78373015a7389849aaa39d756663ffc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_535 + rect: + serializedVersion: 2 + x: 340 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 37a011595af7365419decbe03d497375 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_536 + rect: + serializedVersion: 2 + x: 360 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d8ac59830f480044682caf011c5ed2b2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_537 + rect: + serializedVersion: 2 + x: 380 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 409a3730cda931949a78bcb04be3cefa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_538 + rect: + serializedVersion: 2 + x: 400 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f8d090c4b05f3914498b0038d4f27657 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_539 + rect: + serializedVersion: 2 + x: 420 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: dcdc12ebe013466468286cc6f14d0216 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_540 + rect: + serializedVersion: 2 + x: 440 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6803bb18f8be49546a5f9ea82dfd3c4f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_541 + rect: + serializedVersion: 2 + x: 460 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 23295db12ee2b8b4ca1803ad9cf84ec3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_542 + rect: + serializedVersion: 2 + x: 480 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5dc0cddadad9d1b49b637c3abe89bea6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_543 + rect: + serializedVersion: 2 + x: 500 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b0fced7e508ba0c41a76c199d715fbf8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_544 + rect: + serializedVersion: 2 + x: 520 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 08e156f99b649924b88e73258a1341ef + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_545 + rect: + serializedVersion: 2 + x: 540 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: eb375d232be322e4282bafb86dcb30a5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_546 + rect: + serializedVersion: 2 + x: 560 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e1467bbb1e80bc443a719677d906d353 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_547 + rect: + serializedVersion: 2 + x: 580 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b7e41fe3b1f477842b38ca466131922c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_548 + rect: + serializedVersion: 2 + x: 600 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 44ebea8d157501c43ae20bca272f35d5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_549 + rect: + serializedVersion: 2 + x: 620 + y: 113 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c183203f585eb5f49817af1ecf3c8798 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_550 + rect: + serializedVersion: 2 + x: 320 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 16feaa3ca169b5f42849dec1d1164c40 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_551 + rect: + serializedVersion: 2 + x: 340 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 801319dec0eeaf740aebd9b3a2ad2a56 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_552 + rect: + serializedVersion: 2 + x: 360 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 58537701bb1fa9f4cb3cb9fac7c4bf4e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_553 + rect: + serializedVersion: 2 + x: 380 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 44bf5bf9fcdd26546b5ac9c3e453cb55 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_554 + rect: + serializedVersion: 2 + x: 400 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e91cee3a573a44548b86263c884c29ef + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_555 + rect: + serializedVersion: 2 + x: 420 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c5a0595db6dd469428e722cdfa3b0508 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_556 + rect: + serializedVersion: 2 + x: 440 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 00ec694ec2dcb4c4fba6a04c66f60e66 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_557 + rect: + serializedVersion: 2 + x: 460 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 33ada036734e89f4085acb2670e7a0f3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_558 + rect: + serializedVersion: 2 + x: 480 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9c3743f899b3e9d4b806d48dbfb289ee + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_559 + rect: + serializedVersion: 2 + x: 500 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1626096676ffb3f46896a3ae43e6ef58 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_560 + rect: + serializedVersion: 2 + x: 520 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e50c62fbcd4bb8346ad68e8fadc2cdae + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_561 + rect: + serializedVersion: 2 + x: 540 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ae9077ea9992e0b4ba5b75b6ef6d648e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_562 + rect: + serializedVersion: 2 + x: 560 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6f8a07deaef17b54faecd10509a8e763 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_563 + rect: + serializedVersion: 2 + x: 580 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2e0e7abece1f9264eabffc3fcac6a014 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_564 + rect: + serializedVersion: 2 + x: 600 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e6535f06af464e04b9ac391abc20be0f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_565 + rect: + serializedVersion: 2 + x: 620 + y: 93 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5ea508098af47274c9417ba4d092dbde + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_566 + rect: + serializedVersion: 2 + x: 320 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c6723f4d281dcea44b67592c537c6f69 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_567 + rect: + serializedVersion: 2 + x: 340 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ae97e4429c79103458f36c2a4efcb3e7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_568 + rect: + serializedVersion: 2 + x: 360 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a08a2f7e1f2389e4786ea383f146d3f4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_569 + rect: + serializedVersion: 2 + x: 380 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d01381744e703f244a390a1d95784515 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_570 + rect: + serializedVersion: 2 + x: 400 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b3d34696f58fe934da87a4c062a322d2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_571 + rect: + serializedVersion: 2 + x: 420 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 639a107a7c7f76c4aa28245d8e8f4957 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_572 + rect: + serializedVersion: 2 + x: 440 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3997b47a1ca3e0c44b7498236d55caf0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_573 + rect: + serializedVersion: 2 + x: 460 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d8f07727cb5fed2459d066c8be9f7a30 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_574 + rect: + serializedVersion: 2 + x: 480 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 437aaff9091da4c47a280d9c06e66b7a + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_575 + rect: + serializedVersion: 2 + x: 500 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f19c3c139ec02f946b3c2a793a5e2052 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_576 + rect: + serializedVersion: 2 + x: 520 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 860b7e1c22afedb42ba976eb8b3cb7d7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_577 + rect: + serializedVersion: 2 + x: 540 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0c54bab81672c904e8da371f6490aa02 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_578 + rect: + serializedVersion: 2 + x: 560 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6b2af32fd67ee5a4896dc4ae4b81dda1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_579 + rect: + serializedVersion: 2 + x: 580 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: efaf869e8aca8494da769d909de34ea0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_580 + rect: + serializedVersion: 2 + x: 600 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 205a75a4de0f52c4e8cea5b5ae7748e8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_581 + rect: + serializedVersion: 2 + x: 620 + y: 73 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3431910ed33a73e44bfe34c8d85fce9c + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_582 + rect: + serializedVersion: 2 + x: 320 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 998b1ac44036cde479d5144a6d971fd5 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_583 + rect: + serializedVersion: 2 + x: 340 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 49ad4fe11bf1065448df65195c7bc4da + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_584 + rect: + serializedVersion: 2 + x: 360 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ceba36ea798582f459981e78044b42a9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_585 + rect: + serializedVersion: 2 + x: 380 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b66fdc24df40b014580ef43eada4c980 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_586 + rect: + serializedVersion: 2 + x: 400 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4ba8f5444c746274da94083aea88bb84 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_587 + rect: + serializedVersion: 2 + x: 420 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f31f43d4a57e92a40be5c0927c823f76 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_588 + rect: + serializedVersion: 2 + x: 440 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0632355cee50ed142a6be06ce61dee10 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_589 + rect: + serializedVersion: 2 + x: 460 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0077a1ceafdc0e34fb2dd96f76c471e0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_590 + rect: + serializedVersion: 2 + x: 480 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 359c131fe48cf8b4abcb3f2ded36a322 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_591 + rect: + serializedVersion: 2 + x: 500 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4425600fe6ae5c8489406571ff1037e8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_592 + rect: + serializedVersion: 2 + x: 520 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e458ecf5b9865f64cbb34a07da1873ba + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_593 + rect: + serializedVersion: 2 + x: 540 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9538fcf2e7bc3104d81f47ad4b49aacc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_594 + rect: + serializedVersion: 2 + x: 560 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ac8f3205cf992de4c8dec2eef2bb583b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_595 + rect: + serializedVersion: 2 + x: 580 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 639eb2f404e77354790f89d00e6fcb24 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_596 + rect: + serializedVersion: 2 + x: 600 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b8bb9059cc69351478727136b3c0084e + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_597 + rect: + serializedVersion: 2 + x: 620 + y: 53 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7f2f3e759c9fd0a468e9fe81e92bd8dc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_598 + rect: + serializedVersion: 2 + x: 320 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 10dd43175596f3e42a8de0a8724252c8 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_599 + rect: + serializedVersion: 2 + x: 340 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fb4830f3a06aed64e883cdd3f48c437f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_600 + rect: + serializedVersion: 2 + x: 360 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 22b57e072db654a48aa2e4162d23cef1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_601 + rect: + serializedVersion: 2 + x: 380 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 05b53820bc158a248bc4cee28ebe8de9 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_602 + rect: + serializedVersion: 2 + x: 400 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f35771f19ce499441bb1e70280cf110f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_603 + rect: + serializedVersion: 2 + x: 420 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 955efd68a5adc85489566d5c875faf94 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_604 + rect: + serializedVersion: 2 + x: 440 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1e1454e2f7ea1f04db1aa0734eb65afa + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_605 + rect: + serializedVersion: 2 + x: 460 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 06b01316c9eeab848b6c77c4ae78f94f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_606 + rect: + serializedVersion: 2 + x: 480 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 85da88c9cbdafa347a605fd7af4850e6 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_607 + rect: + serializedVersion: 2 + x: 500 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0bca7dc94efd09a4aa5af312b58e0e7d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_608 + rect: + serializedVersion: 2 + x: 520 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5b30f3015f917a34ea15aa7180bb7d99 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_609 + rect: + serializedVersion: 2 + x: 540 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 883da264cc75b2149b795d29591c4632 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_610 + rect: + serializedVersion: 2 + x: 560 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3da164b40a9b86b4fa462c929e23bbc2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_611 + rect: + serializedVersion: 2 + x: 580 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1d218cfea497b784e838ab87a44d38a1 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_612 + rect: + serializedVersion: 2 + x: 600 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 02a25e4299261d84bb904174a5caf864 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_613 + rect: + serializedVersion: 2 + x: 620 + y: 33 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0c96351b536d1e1469b62e935b0f11a2 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_614 + rect: + serializedVersion: 2 + x: 320 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bb5fb8a98f52d4945a80286cb1b571c7 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_615 + rect: + serializedVersion: 2 + x: 340 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 0dec32c4c2f02e5449dc35fee70e9432 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_616 + rect: + serializedVersion: 2 + x: 360 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 242cf8a47b5fe414ba298bae2f4ba2b4 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_617 + rect: + serializedVersion: 2 + x: 380 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c03d7c61ded16c74ca48aedc2fb7c140 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_618 + rect: + serializedVersion: 2 + x: 400 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f118419a478823a49963a04af6fb532b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_619 + rect: + serializedVersion: 2 + x: 420 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b9ae87018e4db66428a052c553f86004 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_620 + rect: + serializedVersion: 2 + x: 440 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3aaa9355c2cdd594e816e94a1f6ea073 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_621 + rect: + serializedVersion: 2 + x: 460 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3887c0cb71b9d0847be6560879fb722d + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_622 + rect: + serializedVersion: 2 + x: 480 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 25b4e889fcfe143448425f70abeb207f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_623 + rect: + serializedVersion: 2 + x: 500 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e1aec484be359f1429b30d868fa8d8eb + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_624 + rect: + serializedVersion: 2 + x: 520 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 066dc1b232e7d614581914877e193fd3 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_625 + rect: + serializedVersion: 2 + x: 540 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 39b09b78ad612c845852b617a2fdae92 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_626 + rect: + serializedVersion: 2 + x: 560 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e004a9bb589e5b3459f62f57bd3ad65b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_627 + rect: + serializedVersion: 2 + x: 580 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b388d6bafe593ae47ac4160319d99b9f + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_628 + rect: + serializedVersion: 2 + x: 600 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4863b175607f04642acf573404b1204b + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_629 + rect: + serializedVersion: 2 + x: 620 + y: 13 + width: 20 + height: 20 + alignment: 1 + pivot: {x: 0, y: 1} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: f6b93996fd2b16f4ab34f2a844a25afc + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Ruins_226 + rect: + serializedVersion: 2 + x: 379 + y: 139 + width: 85 + height: 133 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 719cfbbb5be78e347910c573d655b74e + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 389d42e3cbfebad469e3c27e92e48011 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Godette-Tale/Assets/Art/Sprites/Ruins1.png b/Godette-Tale/Assets/Art/Sprites/Ruins1.png new file mode 100644 index 0000000..c2ed410 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Ruins1.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Ruins1.png.import b/Godette-Tale/Assets/Art/Sprites/Ruins1.png.import new file mode 100644 index 0000000..d339c33 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Ruins1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Ruins1.png-4573d5decb98f4d2d7237956fd8821f4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Ruins1.png" +dest_files=[ "res://.import/Ruins1.png-4573d5decb98f4d2d7237956fd8821f4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Ruins1.png.meta b/Godette-Tale/Assets/Art/Sprites/Ruins1.png.meta new file mode 100644 index 0000000..deb05d5 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Ruins1.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 72c2c457173286e41ac85db632df7af5 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 20 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 24bca33f731423b4397da292bf1a85c0 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Godette-Tale/Assets/Art/Sprites/SaveStar.png b/Godette-Tale/Assets/Art/Sprites/SaveStar.png new file mode 100644 index 0000000..1f595b8 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/SaveStar.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/SaveStar.png.import b/Godette-Tale/Assets/Art/Sprites/SaveStar.png.import new file mode 100644 index 0000000..8f5b1a0 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/SaveStar.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/SaveStar.png-7b746cdece6e8f728faed61e2b93aaef.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/SaveStar.png" +dest_files=[ "res://.import/SaveStar.png-7b746cdece6e8f728faed61e2b93aaef.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/SaveStar.png.meta b/Godette-Tale/Assets/Art/Sprites/SaveStar.png.meta new file mode 100644 index 0000000..0383383 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/SaveStar.png.meta @@ -0,0 +1,141 @@ +fileFormatVersion: 2 +guid: 61023bc4a9a8e1347a6b13a184e1f866 +TextureImporter: + fileIDToRecycleName: + 21300000: SaveStar_0 + 21300002: SaveStar_1 + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 20 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: SaveStar_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 20 + height: 20 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4867a8bbafa611b45a0c61595354bfd0 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: SaveStar_1 + rect: + serializedVersion: 2 + x: 20 + y: 0 + width: 20 + height: 20 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 7cb29af56594a3745a81e202e2bc57d8 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 350444367ad987947a22a4a77826c22a + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Godette-Tale/Assets/Art/Sprites/Shops/shop.png b/Godette-Tale/Assets/Art/Sprites/Shops/shop.png new file mode 100644 index 0000000..708bf61 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Shops/shop.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Shops/shop.png.import b/Godette-Tale/Assets/Art/Sprites/Shops/shop.png.import new file mode 100644 index 0000000..edc4a96 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Shops/shop.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/shop.png-8d980e6250e5fd0d00e3ead0d2189a80.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Shops/shop.png" +dest_files=[ "res://.import/shop.png-8d980e6250e5fd0d00e3ead0d2189a80.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Sign.png b/Godette-Tale/Assets/Art/Sprites/Sign.png new file mode 100644 index 0000000..a0c7892 Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/Sign.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/Sign.png.import b/Godette-Tale/Assets/Art/Sprites/Sign.png.import new file mode 100644 index 0000000..524f4af --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Sign.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Sign.png-b4de4c12c9a8054803d74d6ddf2eac52.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/Sign.png" +dest_files=[ "res://.import/Sign.png-b4de4c12c9a8054803d74d6ddf2eac52.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/Styles/MenuPanel.tres b/Godette-Tale/Assets/Art/Sprites/Styles/MenuPanel.tres new file mode 100644 index 0000000..8be2d4e --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/Styles/MenuPanel.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0, 0, 0, 1 ) +border_width_left = 7 +border_width_top = 7 +border_width_right = 7 +border_width_bottom = 7 +border_color = Color( 1, 1, 1, 1 ) diff --git a/Godette-Tale/Assets/Art/Sprites/textbox.png b/Godette-Tale/Assets/Art/Sprites/textbox.png new file mode 100644 index 0000000..3d8fbfe Binary files /dev/null and b/Godette-Tale/Assets/Art/Sprites/textbox.png differ diff --git a/Godette-Tale/Assets/Art/Sprites/textbox.png.import b/Godette-Tale/Assets/Art/Sprites/textbox.png.import new file mode 100644 index 0000000..9417d37 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/textbox.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/textbox.png-61b1c2a4e8e311fc9b9c084c92d757cf.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Art/Sprites/textbox.png" +dest_files=[ "res://.import/textbox.png-61b1c2a4e8e311fc9b9c084c92d757cf.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Art/Sprites/textbox.png.meta b/Godette-Tale/Assets/Art/Sprites/textbox.png.meta new file mode 100644 index 0000000..3b59937 --- /dev/null +++ b/Godette-Tale/Assets/Art/Sprites/textbox.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 3dc673c9a02e14642bf12d11a7ba6578 +TextureImporter: + fileIDToRecycleName: + 21300000: textbox_0 + 21300002: textbox_1 + 21300004: textbox_2 + 21300006: textbox_3 + 21300008: textbox_4 + 21300010: textbox_5 + 21300012: textbox_6 + 21300014: textbox_7 + 21300016: textbox_8 + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 20 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: textbox_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 60 + height: 60 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 20, y: 20, z: 20, w: 20} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4ee7b1ffb0ce47b48801e051e108e102 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 257b2f51636765d4aaf0feaadb4d4e2b + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Godette-Tale/Assets/Expressions/None.png b/Godette-Tale/Assets/Expressions/None.png new file mode 100644 index 0000000..c0451d5 Binary files /dev/null and b/Godette-Tale/Assets/Expressions/None.png differ diff --git a/Godette-Tale/Assets/Expressions/None.png.import b/Godette-Tale/Assets/Expressions/None.png.import new file mode 100644 index 0000000..a10e5ea --- /dev/null +++ b/Godette-Tale/Assets/Expressions/None.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/None.png-7eb238c7c96d0fd9f39ac48f2afb82b0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Expressions/None.png" +dest_files=[ "res://.import/None.png-7eb238c7c96d0fd9f39ac48f2afb82b0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Expressions/Papyrus/PapNormal.png b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal.png new file mode 100644 index 0000000..779a0b9 Binary files /dev/null and b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal.png differ diff --git a/Godette-Tale/Assets/Expressions/Papyrus/PapNormal.png.import b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal.png.import new file mode 100644 index 0000000..4860471 --- /dev/null +++ b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/PapNormal.png-6f7eb4658398c08394cf5d97ffba0c72.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Expressions/Papyrus/PapNormal.png" +dest_files=[ "res://.import/PapNormal.png-6f7eb4658398c08394cf5d97ffba0c72.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Expressions/Papyrus/PapNormal1.png b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal1.png new file mode 100644 index 0000000..5a86f43 Binary files /dev/null and b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal1.png differ diff --git a/Godette-Tale/Assets/Expressions/Papyrus/PapNormal1.png.import b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal1.png.import new file mode 100644 index 0000000..1c9991d --- /dev/null +++ b/Godette-Tale/Assets/Expressions/Papyrus/PapNormal1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/PapNormal1.png-023537a200f372400a9a81b6572d5af4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Expressions/Papyrus/PapNormal1.png" +dest_files=[ "res://.import/PapNormal1.png-023537a200f372400a9a81b6572d5af4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Expressions/Sans/Sans.png b/Godette-Tale/Assets/Expressions/Sans/Sans.png new file mode 100644 index 0000000..495573b Binary files /dev/null and b/Godette-Tale/Assets/Expressions/Sans/Sans.png differ diff --git a/Godette-Tale/Assets/Expressions/Sans/Sans.png.import b/Godette-Tale/Assets/Expressions/Sans/Sans.png.import new file mode 100644 index 0000000..e0c6f06 --- /dev/null +++ b/Godette-Tale/Assets/Expressions/Sans/Sans.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Sans.png-4617be1ef8357c7114e489f9c7500a6f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Expressions/Sans/Sans.png" +dest_files=[ "res://.import/Sans.png-4617be1ef8357c7114e489f9c7500a6f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Expressions/Sans/Sans1.png b/Godette-Tale/Assets/Expressions/Sans/Sans1.png new file mode 100644 index 0000000..5550c1a Binary files /dev/null and b/Godette-Tale/Assets/Expressions/Sans/Sans1.png differ diff --git a/Godette-Tale/Assets/Expressions/Sans/Sans1.png.import b/Godette-Tale/Assets/Expressions/Sans/Sans1.png.import new file mode 100644 index 0000000..6abfa8c --- /dev/null +++ b/Godette-Tale/Assets/Expressions/Sans/Sans1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Sans1.png-07069add9bf4f06adccb00c4237aa818.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Expressions/Sans/Sans1.png" +dest_files=[ "res://.import/Sans1.png-07069add9bf4f06adccb00c4237aa818.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Expressions/Shopkeeper/shopkeeper.png b/Godette-Tale/Assets/Expressions/Shopkeeper/shopkeeper.png new file mode 100644 index 0000000..629fb6f Binary files /dev/null and b/Godette-Tale/Assets/Expressions/Shopkeeper/shopkeeper.png differ diff --git a/Godette-Tale/Assets/Expressions/Shopkeeper/shopkeeper.png.import b/Godette-Tale/Assets/Expressions/Shopkeeper/shopkeeper.png.import new file mode 100644 index 0000000..89718c9 --- /dev/null +++ b/Godette-Tale/Assets/Expressions/Shopkeeper/shopkeeper.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/shopkeeper.png-e456156ef14d420a1e3818a5c6b454fc.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Expressions/Shopkeeper/shopkeeper.png" +dest_files=[ "res://.import/shopkeeper.png-e456156ef14d420a1e3818a5c6b454fc.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Godette-Tale/Assets/Fonts/Cave-Story.ttf b/Godette-Tale/Assets/Fonts/Cave-Story.ttf new file mode 100644 index 0000000..78412a0 Binary files /dev/null and b/Godette-Tale/Assets/Fonts/Cave-Story.ttf differ diff --git a/Godette-Tale/Assets/Fonts/DT-Mono-Small.tres b/Godette-Tale/Assets/Fonts/DT-Mono-Small.tres new file mode 100644 index 0000000..1d39271 --- /dev/null +++ b/Godette-Tale/Assets/Fonts/DT-Mono-Small.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=1] + +[resource] +size = 19 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/Assets/Fonts/crypt-of-tomorrow-ut-font-no-rus.otf b/Godette-Tale/Assets/Fonts/crypt-of-tomorrow-ut-font-no-rus.otf new file mode 100644 index 0000000..825f222 Binary files /dev/null and b/Godette-Tale/Assets/Fonts/crypt-of-tomorrow-ut-font-no-rus.otf differ diff --git a/Godette-Tale/Assets/Fonts/crypt-of-tomorrow.tres b/Godette-Tale/Assets/Fonts/crypt-of-tomorrow.tres new file mode 100644 index 0000000..8ce487e --- /dev/null +++ b/Godette-Tale/Assets/Fonts/crypt-of-tomorrow.tres @@ -0,0 +1,8 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://Assets/Fonts/crypt-of-tomorrow-ut-font-no-rus.otf" type="DynamicFontData" id=1] + +[resource] +size = 11 +extra_spacing_top = 6 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/Assets/Music/Amalgam.wav b/Godette-Tale/Assets/Music/Amalgam.wav new file mode 100644 index 0000000..6665edf Binary files /dev/null and b/Godette-Tale/Assets/Music/Amalgam.wav differ diff --git a/Godette-Tale/Assets/Music/Amalgam.wav.import b/Godette-Tale/Assets/Music/Amalgam.wav.import new file mode 100644 index 0000000..74769ab --- /dev/null +++ b/Godette-Tale/Assets/Music/Amalgam.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Amalgam.wav-6772463069b10d3428cbd32f00cf513b.sample" + +[deps] + +source_file="res://Assets/Music/Amalgam.wav" +dest_files=[ "res://.import/Amalgam.wav-6772463069b10d3428cbd32f00cf513b.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=true +compress/mode=0 diff --git a/Godette-Tale/Assets/Music/Empty.wav b/Godette-Tale/Assets/Music/Empty.wav new file mode 100644 index 0000000..878bf23 Binary files /dev/null and b/Godette-Tale/Assets/Music/Empty.wav differ diff --git a/Godette-Tale/Assets/Music/Empty.wav.import b/Godette-Tale/Assets/Music/Empty.wav.import new file mode 100644 index 0000000..67dd799 --- /dev/null +++ b/Godette-Tale/Assets/Music/Empty.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Empty.wav-24989f25274cc6d291429d054bb18cfd.sample" + +[deps] + +source_file="res://Assets/Music/Empty.wav" +dest_files=[ "res://.import/Empty.wav-24989f25274cc6d291429d054bb18cfd.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/Assets/Music/Ruins.wav b/Godette-Tale/Assets/Music/Ruins.wav new file mode 100644 index 0000000..1038984 Binary files /dev/null and b/Godette-Tale/Assets/Music/Ruins.wav differ diff --git a/Godette-Tale/Assets/Music/Ruins.wav.import b/Godette-Tale/Assets/Music/Ruins.wav.import new file mode 100644 index 0000000..ebef872 --- /dev/null +++ b/Godette-Tale/Assets/Music/Ruins.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Ruins.wav-6d80ffa9d290c132ddc59511e4109cda.sample" + +[deps] + +source_file="res://Assets/Music/Ruins.wav" +dest_files=[ "res://.import/Ruins.wav-6d80ffa9d290c132ddc59511e4109cda.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=true +compress/mode=0 diff --git a/Godette-Tale/Assets/Sound Effects/BuyItem.wav b/Godette-Tale/Assets/Sound Effects/BuyItem.wav new file mode 100644 index 0000000..21ce6d1 Binary files /dev/null and b/Godette-Tale/Assets/Sound Effects/BuyItem.wav differ diff --git a/Godette-Tale/Assets/Sound Effects/BuyItem.wav.import b/Godette-Tale/Assets/Sound Effects/BuyItem.wav.import new file mode 100644 index 0000000..00cf9ac --- /dev/null +++ b/Godette-Tale/Assets/Sound Effects/BuyItem.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/BuyItem.wav-7e4563514d9f64648fa1a1a977960cf3.sample" + +[deps] + +source_file="res://Assets/Sound Effects/BuyItem.wav" +dest_files=[ "res://.import/BuyItem.wav-7e4563514d9f64648fa1a1a977960cf3.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/Assets/Sound Effects/HealthRestored.wav b/Godette-Tale/Assets/Sound Effects/HealthRestored.wav new file mode 100644 index 0000000..2732a99 Binary files /dev/null and b/Godette-Tale/Assets/Sound Effects/HealthRestored.wav differ diff --git a/Godette-Tale/Assets/Sound Effects/HealthRestored.wav.import b/Godette-Tale/Assets/Sound Effects/HealthRestored.wav.import new file mode 100644 index 0000000..cd8b541 --- /dev/null +++ b/Godette-Tale/Assets/Sound Effects/HealthRestored.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/HealthRestored.wav-8379d05bf5804106c7a3492097c8d0a8.sample" + +[deps] + +source_file="res://Assets/Sound Effects/HealthRestored.wav" +dest_files=[ "res://.import/HealthRestored.wav-8379d05bf5804106c7a3492097c8d0a8.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/Assets/Sound Effects/PhoneRing.wav b/Godette-Tale/Assets/Sound Effects/PhoneRing.wav new file mode 100644 index 0000000..1db4930 Binary files /dev/null and b/Godette-Tale/Assets/Sound Effects/PhoneRing.wav differ diff --git a/Godette-Tale/Assets/Sound Effects/PhoneRing.wav.import b/Godette-Tale/Assets/Sound Effects/PhoneRing.wav.import new file mode 100644 index 0000000..ada9718 --- /dev/null +++ b/Godette-Tale/Assets/Sound Effects/PhoneRing.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/PhoneRing.wav-c927bec25c74e0293c0e5ae57cd5a21a.sample" + +[deps] + +source_file="res://Assets/Sound Effects/PhoneRing.wav" +dest_files=[ "res://.import/PhoneRing.wav-c927bec25c74e0293c0e5ae57cd5a21a.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/Assets/Sound Effects/SavePoint.wav b/Godette-Tale/Assets/Sound Effects/SavePoint.wav new file mode 100644 index 0000000..0c40ead Binary files /dev/null and b/Godette-Tale/Assets/Sound Effects/SavePoint.wav differ diff --git a/Godette-Tale/Assets/Sound Effects/SavePoint.wav.import b/Godette-Tale/Assets/Sound Effects/SavePoint.wav.import new file mode 100644 index 0000000..f0a531a --- /dev/null +++ b/Godette-Tale/Assets/Sound Effects/SavePoint.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/SavePoint.wav-854d1b158f372d71d3e7925b22ace53d.sample" + +[deps] + +source_file="res://Assets/Sound Effects/SavePoint.wav" +dest_files=[ "res://.import/SavePoint.wav-854d1b158f372d71d3e7925b22ace53d.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/Battle.tscn b/Godette-Tale/Battle.tscn new file mode 100644 index 0000000..c93e94d --- /dev/null +++ b/Godette-Tale/Battle.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="Root_Node" type="Node"] diff --git a/Godette-Tale/Example.tscn b/Godette-Tale/Example.tscn new file mode 100644 index 0000000..4e76134 --- /dev/null +++ b/Godette-Tale/Example.tscn @@ -0,0 +1,196 @@ +[gd_scene load_steps=19 format=2] + +[ext_resource path="res://Prefabs/Player/Camera2D.tscn" type="PackedScene" id=1] +[ext_resource path="res://Assets/Art/Sprites/Ruins.png" type="Texture" id=2] +[ext_resource path="res://Prefabs/Dialogue/DialogueInterface.tscn" type="PackedScene" id=3] +[ext_resource path="res://Prefabs/Player/Player.tscn" type="PackedScene" id=4] +[ext_resource path="res://Prefabs/Dialogue/Sign.tscn" type="PackedScene" id=5] +[ext_resource path="res://Scripts/Dialogue/Sign2.gd" type="Script" id=6] +[ext_resource path="res://Scripts/Dialogue/Sign3.gd" type="Script" id=7] +[ext_resource path="res://Prefabs/Dialogue/Papyrus.tscn" type="PackedScene" id=9] +[ext_resource path="res://Scripts/Dialogue/Sign4Choices.gd" type="Script" id=10] +[ext_resource path="res://Prefabs/Transition.tscn" type="PackedScene" id=12] +[ext_resource path="res://Prefabs/Puzzles/Lever.tscn" type="PackedScene" id=13] +[ext_resource path="res://Prefabs/Puzzles/Door.tscn" type="PackedScene" id=14] +[ext_resource path="res://Prefabs/Puzzles/Button.tscn" type="PackedScene" id=15] +[ext_resource path="res://Prefabs/Puzzles/Spikes.tscn" type="PackedScene" id=16] +[ext_resource path="res://Scripts/Music/Amalgam.gd" type="Script" id=17] +[ext_resource path="res://Prefabs/SaveStar.tscn" type="PackedScene" id=18] +[ext_resource path="res://Prefabs/MenuPanel.tscn" type="PackedScene" id=19] + +[sub_resource type="GDScript" id=3] +script/source = "extends Node + +var aryTest : Array = [\"String1\", \"String2\", \"String3\", \"String4\"] + +# Declare member variables here. Examples: +# var a = 2 +# var b = \"text\" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + #print(\"Initiated\") + if \"String5\" in aryTest: + print(\"Hi\") + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass +" + +[node name="Root_Node" type="Node2D"] +script = ExtResource( 17 ) + +[node name="Camera2D" parent="." instance=ExtResource( 1 )] +position = Vector2( 0, 0 ) +scale = Vector2( 2, 2 ) + +[node name="TopLeft" parent="Camera2D/Limits" index="0"] +position = Vector2( -400, -304 ) + +[node name="BottomRight" parent="Camera2D/Limits" index="1"] +position = Vector2( 1224, 864 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 408, 312 ) +scale = Vector2( 2, 2 ) +texture = ExtResource( 2 ) + +[node name="CanvasLayer" parent="." instance=ExtResource( 3 )] + +[node name="TypeSound" parent="CanvasLayer/panel/text_interface_engine" index="0"] +stream = null + +[node name="infoPanel" parent="CanvasLayer" instance=ExtResource( 19 )] + +[node name="Interactive" type="Node" parent="."] + +[node name="Sign" parent="Interactive" instance=ExtResource( 5 )] +scale = Vector2( 2, 2 ) +collision_layer = 2147483657 + +[node name="Sign2" parent="Interactive" instance=ExtResource( 5 )] +position = Vector2( 80, 0 ) +scale = Vector2( 2, 2 ) +collision_layer = 8 +script = ExtResource( 6 ) + +[node name="Sign3" parent="Interactive" instance=ExtResource( 5 )] +position = Vector2( 160, 0 ) +scale = Vector2( 2, 2 ) +collision_layer = 8 +script = ExtResource( 7 ) + +[node name="Sign4" parent="Interactive" instance=ExtResource( 5 )] +position = Vector2( 240, 0 ) +scale = Vector2( 2, 2 ) +collision_layer = 8 +script = ExtResource( 10 ) + +[node name="Papyrus" parent="Interactive" instance=ExtResource( 9 )] +position = Vector2( 344, 96 ) +collision_layer = 8 + +[node name="Button" parent="Interactive" instance=ExtResource( 15 )] +position = Vector2( 0, 168 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal1" + +[node name="Button2" parent="Interactive" instance=ExtResource( 15 )] +position = Vector2( -56, 168 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal2" + +[node name="Button3" parent="Interactive" instance=ExtResource( 15 )] +position = Vector2( -136, 168 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal3" + +[node name="Button4" parent="Interactive" instance=ExtResource( 15 )] +position = Vector2( -216, 168 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal4" + +[node name="Button5" parent="Interactive" instance=ExtResource( 15 )] +position = Vector2( -297.895, 168 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal5" + +[node name="Door" parent="Interactive" instance=ExtResource( 14 )] +position = Vector2( -120, -40 ) +scale = Vector2( 2, 2 ) +aryActivationPhrases = [ "Signal1", "Signal2", "Signal3", "Signal4", "Signal5" ] +intMaxActivationCount = 6 + +[node name="Door2" parent="Interactive" instance=ExtResource( 14 )] +position = Vector2( 520, -32 ) +scale = Vector2( 2, 2 ) +aryActivationPhrases = [ "otherScene", "otherScene1" ] +intMaxActivationCount = 3 + +[node name="Lever" parent="Interactive" instance=ExtResource( 13 )] +position = Vector2( -184, -16 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal5" + +[node name="Lever2" parent="Interactive" instance=ExtResource( 13 )] +position = Vector2( -224, -16 ) +scale = Vector2( 2, 2 ) +strSignal = "Signal5" + +[node name="Spikes" parent="Interactive" instance=ExtResource( 16 )] +position = Vector2( -264, -1.26202 ) +scale = Vector2( 2, 2 ) +aryActivationPhrases = [ "Signal1", "Signal2", "Signal3", "Signal4", "Signal5" ] +intMaxActivationCount = 6 + +[node name="Spikes2" parent="Interactive" instance=ExtResource( 16 )] +position = Vector2( -304, -0.594604 ) +scale = Vector2( 2, 2 ) +aryActivationPhrases = [ "Signal1", "Signal2", "Signal3", "Signal4", "Signal5" ] +intMaxActivationCount = 6 + +[node name="Spikes3" parent="Interactive" instance=ExtResource( 16 )] +position = Vector2( -344, -0.594604 ) +scale = Vector2( 2, 2 ) +aryActivationPhrases = [ "Signal1", "Signal2", "Signal3", "Signal4", "Signal5" ] +intMaxActivationCount = 6 + +[node name="Spikes4" parent="Interactive" instance=ExtResource( 16 )] +position = Vector2( -384, -0.594604 ) +scale = Vector2( 2, 2 ) +aryActivationPhrases = [ "Signal1", "Signal2", "Signal3", "Signal4", "Signal5" ] +intMaxActivationCount = 6 + +[node name="Node2" type="Node" parent="."] +script = SubResource( 3 ) + +[node name="Player" parent="." instance=ExtResource( 4 )] + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Player"] +remote_path = NodePath("../../Camera2D") + +[node name="Transition" parent="." instance=ExtResource( 12 )] +position = Vector2( -120, 0 ) +scale = Vector2( 3.64, 1 ) +new_scene = "res://Maps/Ruins/Ruins_Grave.tscn" +playerPosition = Vector2( 152, 96 ) + +[node name="Transition2" parent="." instance=ExtResource( 12 )] +position = Vector2( -119.947, 91.5558 ) +scale = Vector2( 3.64, 1 ) +new_scene = "res://Prefabs/Shops/ABC_123_A_ShopExample.tscn" +isShop = true + +[node name="SaveStar" parent="." instance=ExtResource( 18 )] +position = Vector2( 344, 0 ) +scale = Vector2( 2, 2 ) + +[editable path="Camera2D"] +[editable path="CanvasLayer"] +[editable path="CanvasLayer/savePanel"] +[editable path="Interactive/Papyrus"] +[editable path="Player"] diff --git a/Godette-Tale/Maps/Ruins/Ruins_Grave.tmx b/Godette-Tale/Maps/Ruins/Ruins_Grave.tmx new file mode 100644 index 0000000..e734344 --- /dev/null +++ b/Godette-Tale/Maps/Ruins/Ruins_Grave.tmx @@ -0,0 +1,38 @@ + + + + + +1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, +35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68, +69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102, +103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136, +137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170, +171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204, +205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272, +273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306, +307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340, +341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374, +375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408, +409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442 + + + + + + + + + + + + + + + + + + + + diff --git a/Godette-Tale/Maps/Ruins/Ruins_Grave.tmx.import b/Godette-Tale/Maps/Ruins/Ruins_Grave.tmx.import new file mode 100644 index 0000000..f7cb0be --- /dev/null +++ b/Godette-Tale/Maps/Ruins/Ruins_Grave.tmx.import @@ -0,0 +1,22 @@ +[remap] + +importer="vnen.tiled_importer" +type="PackedScene" +path="res://.import/Ruins_Grave.tmx-8e69d2053bbf0b5b89713b4df331434c.scn" + +[deps] + +source_file="res://Maps/Ruins/Ruins_Grave.tmx" +dest_files=[ "res://.import/Ruins_Grave.tmx-8e69d2053bbf0b5b89713b4df331434c.scn" ] + +[params] + +custom_properties=true +tile_metadata=false +uv_clip=true +image_flags=0 +collision_layer=1 +embed_internal_images=false +save_tiled_properties=false +add_background=true +post_import_script="" diff --git a/Godette-Tale/Maps/Ruins/Ruins_Grave.tscn b/Godette-Tale/Maps/Ruins/Ruins_Grave.tscn new file mode 100644 index 0000000..7843aa1 --- /dev/null +++ b/Godette-Tale/Maps/Ruins/Ruins_Grave.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://Maps/Ruins/Ruins_Grave.tmx" type="PackedScene" id=1] +[ext_resource path="res://Prefabs/Player/Player.tscn" type="PackedScene" id=2] +[ext_resource path="res://Prefabs/Player/Camera2D.tscn" type="PackedScene" id=3] +[ext_resource path="res://Prefabs/Dialogue/DialogueInterface.tscn" type="PackedScene" id=4] +[ext_resource path="res://Prefabs/Transition.tscn" type="PackedScene" id=5] +[ext_resource path="res://Scripts/Music/Ruins_Grave.gd" type="Script" id=6] +[ext_resource path="res://Prefabs/Puzzles/Button.tscn" type="PackedScene" id=7] +[ext_resource path="res://Prefabs/Puzzles/Lever.tscn" type="PackedScene" id=8] +[ext_resource path="res://Prefabs/SaveStar.tscn" type="PackedScene" id=9] +[ext_resource path="res://Scripts/Dialogue/SavePoints/SaveGrave.gd" type="Script" id=10] +[ext_resource path="res://Prefabs/MenuPanel.tscn" type="PackedScene" id=11] + +[node name="Root_Node" instance=ExtResource( 1 )] +scale = Vector2( 2, 2 ) +script = ExtResource( 6 ) + +[node name="Collisions" parent="." index="1"] +position = Vector2( 0, -20 ) + +[node name="Player" parent="." index="2" instance=ExtResource( 2 )] +position = Vector2( 151.251, 49.927 ) +scale = Vector2( 1, 1 ) + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Player" index="4"] +remote_path = NodePath("../../Camera2D") + +[node name="Camera2D" parent="." index="3" instance=ExtResource( 3 )] +position = Vector2( 151.251, 49.927 ) + +[node name="TopLeft" parent="Camera2D/Limits" index="0"] +position = Vector2( 0, -40 ) + +[node name="BottomRight" parent="Camera2D/Limits" index="1"] +position = Vector2( 1360, 480 ) + +[node name="CanvasLayer" parent="." index="4" instance=ExtResource( 4 )] + +[node name="infoPanel" parent="CanvasLayer" index="2" instance=ExtResource( 11 )] + +[node name="Transition" parent="." index="5" instance=ExtResource( 5 )] +position = Vector2( 148, 40 ) +scale = Vector2( 11.471, 0.158897 ) +new_scene = "res://Example.tscn" +playerPosition = Vector2( -121.6, -4.522 ) + +[node name="Button" parent="." index="6" instance=ExtResource( 7 )] +position = Vector2( 92, 67.685 ) +strSignal = "otherScene" +activationLocation = "res://Example.tscn" + +[node name="Button2" parent="." index="7" instance=ExtResource( 7 )] +position = Vector2( 211.625, 68 ) +strSignal = "otherScene" +activationLocation = "res://Example.tscn" + +[node name="Lever" parent="." index="8" instance=ExtResource( 8 )] +position = Vector2( 60, 92 ) +strSignal = "otherScene1" +activationLocation = "res://Example.tscn" + +[node name="savePoint" parent="." index="9" instance=ExtResource( 9 )] +position = Vector2( 150.539, 119.742 ) +script = ExtResource( 10 ) + +[editable path="Camera2D"] +[editable path="CanvasLayer"] +[editable path="CanvasLayer/savePanel"] diff --git a/Godette-Tale/Prefabs/Dialogue/DialogueInterface.tscn b/Godette-Tale/Prefabs/Dialogue/DialogueInterface.tscn new file mode 100644 index 0000000..1c7e860 --- /dev/null +++ b/Godette-Tale/Prefabs/Dialogue/DialogueInterface.tscn @@ -0,0 +1,203 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://addons/GodotTIE/GodotTIE_icon.png" type="Texture" id=1] +[ext_resource path="res://addons/GodotTIE/Sans.wav" type="AudioStream" id=3] +[ext_resource path="res://addons/GodotTIE/text_interface_engine.gd" type="Script" id=4] +[ext_resource path="res://addons/GodotTIE/Fonts/Cave-Story.tres" type="DynamicFont" id=5] +[ext_resource path="res://Assets/Art/Sprites/Player/SOUL.png" type="Texture" id=6] +[ext_resource path="res://addons/GodotTIE/Options.gd" type="Script" id=7] +[ext_resource path="res://Prefabs/SavePanel.tscn" type="PackedScene" id=8] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0, 0, 0, 1 ) +border_width_left = 7 +border_width_top = 7 +border_width_right = 7 +border_width_bottom = 7 +border_color = Color( 1, 1, 1, 1 ) + +[sub_resource type="DynamicFontData" id=4] +font_path = "res://Assets/Fonts/Cave-Story.ttf" + +[sub_resource type="DynamicFont" id=3] +size = 50 +font_data = SubResource( 4 ) + +[node name="CanvasLayer" type="CanvasLayer"] + +[node name="panel" type="Panel" parent="."] +visible = false +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -292.0 +margin_top = -164.0 +margin_right = 289.0 +margin_bottom = -16.0 +rect_min_size = Vector2( 10, 10 ) +custom_styles/panel = SubResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="text_interface_engine" type="ReferenceRect" parent="panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 24.0 +margin_top = 22.0 +margin_right = -16.0 +margin_bottom = 6.0 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 1 ) +} +BREAK_ON_MAX_LINES = false +FONT = SubResource( 3 ) + +[node name="TypeSound" type="AudioStreamPlayer" parent="panel/text_interface_engine"] +stream = ExtResource( 3 ) + +[node name="FacialTexture" type="TextureRect" parent="panel/text_interface_engine"] +margin_left = -108.0 +margin_top = 8.0 +margin_right = -12.0 +margin_bottom = 88.0 +expand = true +stretch_mode = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Options" type="HBoxContainer" parent="panel"] +visible = false +margin_left = 128.0 +margin_top = 64.0 +margin_right = 992.0 +margin_bottom = 240.0 +rect_scale = Vector2( 0.5, 0.5 ) +custom_constants/separation = 69 +alignment = 1 +script = ExtResource( 7 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 1" type="Label" parent="panel/Options"] +margin_left = 85.0 +margin_top = 37.0 +margin_right = 226.0 +margin_bottom = 139.0 +custom_colors/font_color = Color( 1, 1, 1, 1 ) +custom_fonts/font = ExtResource( 5 ) +text = "I want +to stay +with you" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="panel/Options/Option 1"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = -37.0 +margin_top = -33.0 +margin_right = 53.0 +margin_bottom = 57.0 +rect_scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 2" type="Label" parent="panel/Options"] +margin_left = 295.0 +margin_top = 37.0 +margin_right = 422.0 +margin_bottom = 139.0 +custom_colors/font_color = Color( 1, 1, 1, 1 ) +custom_fonts/font = ExtResource( 5 ) +text = " + +Forgive" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="panel/Options/Option 2"] +visible = false +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = -37.0 +margin_top = -33.0 +margin_right = 53.0 +margin_bottom = 57.0 +rect_scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 3" type="Label" parent="panel/Options"] +margin_left = 491.0 +margin_top = 37.0 +margin_right = 602.0 +margin_bottom = 139.0 +custom_fonts/font = ExtResource( 5 ) +text = " + +Do not" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="panel/Options/Option 3"] +visible = false +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = -37.0 +margin_top = -33.0 +margin_right = 53.0 +margin_bottom = 57.0 +rect_scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 4" type="Label" parent="panel/Options"] +margin_left = 671.0 +margin_top = 37.0 +margin_right = 779.0 +margin_bottom = 139.0 +custom_fonts/font = ExtResource( 5 ) +text = " +I'm +Ready" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="panel/Options/Option 4"] +visible = false +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = -35.0 +margin_top = -33.0 +margin_right = 55.0 +margin_bottom = 57.0 +rect_scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="savePanel" parent="." instance=ExtResource( 8 )] +anchor_top = -1.9 +anchor_bottom = -1.9 +margin_left = -203.0 +margin_top = 1021.0 +margin_right = 211.0 +margin_bottom = 1186.0 + +[editable path="savePanel"] diff --git a/Godette-Tale/Prefabs/Dialogue/Papyrus.tscn b/Godette-Tale/Prefabs/Dialogue/Papyrus.tscn new file mode 100644 index 0000000..2f356f1 --- /dev/null +++ b/Godette-Tale/Prefabs/Dialogue/Papyrus.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Papyrus_Speaking.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Dialogue/PapyrusDialogue.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 23.7485 ) + +[node name="Papyrus" type="StaticBody2D"] +scale = Vector2( 2, 2 ) +collision_layer = 9 +collision_mask = 9 +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +hframes = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, -0.5 ) +scale = Vector2( 0.966089, 0.883584 ) +shape = SubResource( 1 ) diff --git a/Godette-Tale/Prefabs/Dialogue/Sign.tscn b/Godette-Tale/Prefabs/Dialogue/Sign.tscn new file mode 100644 index 0000000..97677d5 --- /dev/null +++ b/Godette-Tale/Prefabs/Dialogue/Sign.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Sign.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Dialogue/Sign.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] + +[node name="Sign" type="StaticBody2D"] +collision_layer = 9 +collision_mask = 9 +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) diff --git a/Godette-Tale/Prefabs/MenuPanel.tscn b/Godette-Tale/Prefabs/MenuPanel.tscn new file mode 100644 index 0000000..98458d3 --- /dev/null +++ b/Godette-Tale/Prefabs/MenuPanel.tscn @@ -0,0 +1,290 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Player/SOUL.png" type="Texture" id=1] +[ext_resource path="res://addons/GodotTIE/Fonts/DT-Mono.tres" type="DynamicFont" id=2] +[ext_resource path="res://Assets/Fonts/crypt-of-tomorrow.tres" type="DynamicFont" id=3] +[ext_resource path="res://Assets/Art/Sprites/Styles/MenuPanel.tres" type="StyleBox" id=4] +[ext_resource path="res://Scripts/MenuPanel.gd" type="Script" id=5] + +[node name="infoPanel" type="Panel"] +visible = false +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -292.0 +margin_top = 47.0 +margin_right = -150.0 +margin_bottom = 164.0 +custom_styles/panel = ExtResource( 4 ) +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="menuPanel" type="Panel" parent="."] +margin_top = 126.0 +margin_right = 142.0 +margin_bottom = 263.0 +custom_styles/panel = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 1" type="Label" parent="menuPanel"] +margin_left = 55.1768 +margin_top = 20.0213 +margin_right = 111.177 +margin_bottom = 49.0213 +custom_fonts/font = ExtResource( 2 ) +text = "ITEM" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="menuPanel/Option 1"] +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 2" type="Label" parent="menuPanel"] +margin_left = 55.1315 +margin_top = 51.9704 +margin_right = 139.131 +margin_bottom = 80.9704 +custom_fonts/font = ExtResource( 2 ) +text = "STAT" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="menuPanel/Option 2"] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 3" type="Label" parent="menuPanel"] +margin_left = 54.7989 +margin_top = 81.7894 +margin_right = 138.799 +margin_bottom = 110.789 +custom_fonts/font = ExtResource( 2 ) +text = "CELL" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="menuPanel/Option 3"] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Name" type="Label" parent="."] +margin_left = 13.0931 +margin_top = 14.1501 +margin_right = 83.0931 +margin_bottom = 43.1501 +custom_fonts/font = ExtResource( 2 ) +text = "EMPTY" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Level" type="Label" parent="."] +margin_left = 15.4322 +margin_top = 43.0 +margin_right = 57.4322 +margin_bottom = 72.1862 +custom_fonts/font = ExtResource( 3 ) +text = "LV" + +[node name="LevelValue" type="Label" parent="Level"] +margin_left = 31.0 +margin_right = 73.0 +margin_bottom = 29.0 +custom_fonts/font = ExtResource( 3 ) +text = "1" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Hitpoints" type="Label" parent="."] +margin_left = 15.0 +margin_top = 62.3326 +margin_right = 57.0 +margin_bottom = 92.3326 +custom_fonts/font = ExtResource( 3 ) +text = "HP" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HitpointsValue" type="Label" parent="Hitpoints"] +margin_left = 31.0 +margin_right = 73.0 +margin_bottom = 30.0 +custom_fonts/font = ExtResource( 3 ) +text = "20\\20" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Gold" type="Label" parent="."] +margin_left = 14.8909 +margin_top = 80.0 +margin_right = 56.8909 +margin_bottom = 110.0 +custom_fonts/font = ExtResource( 3 ) +text = "G" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="GoldValue" type="Label" parent="Gold"] +margin_left = 31.0 +margin_right = 73.0 +margin_bottom = 30.0 +custom_fonts/font = ExtResource( 3 ) +text = "0" + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] + +[node name="itemMenu" type="Panel" parent="."] +visible = false +margin_left = 153.0 +margin_top = -1.0 +margin_right = 510.0 +margin_bottom = 355.0 +custom_styles/panel = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="itemMenu"] +margin_left = 49.0 +margin_top = 24.0 +margin_right = 254.0 +margin_bottom = 286.0 +custom_constants/separation = -1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 1" type="Label" parent="itemMenu"] +margin_left = 57.1768 +margin_top = 301.021 +margin_right = 113.177 +margin_bottom = 330.021 +custom_fonts/font = ExtResource( 2 ) +text = "USE" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="itemMenu/Option 1"] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 2" type="Label" parent="itemMenu"] +margin_left = 149.177 +margin_top = 301.021 +margin_right = 205.177 +margin_bottom = 330.021 +custom_fonts/font = ExtResource( 2 ) +text = "INFO" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="itemMenu/Option 2"] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 3" type="Label" parent="itemMenu"] +margin_left = 258.177 +margin_top = 301.021 +margin_right = 314.177 +margin_bottom = 330.021 +custom_fonts/font = ExtResource( 2 ) +text = "DROP" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="itemMenu/Option 3"] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="statMenu" type="Panel" parent="."] +visible = false +margin_left = 153.0 +margin_top = -1.0 +margin_right = 518.0 +margin_bottom = 410.0 +custom_styles/panel = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="cellMenu" type="Panel" parent="."] +visible = false +margin_left = 153.0 +margin_top = -1.0 +margin_right = 518.0 +margin_bottom = 271.0 +custom_styles/panel = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="cellMenu"] +margin_left = 49.0 +margin_top = 24.0 +margin_right = 254.0 +margin_bottom = 249.0 +custom_constants/separation = -1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/Godette-Tale/Prefabs/Player/Camera2D.tscn b/Godette-Tale/Prefabs/Player/Camera2D.tscn new file mode 100644 index 0000000..a84024f --- /dev/null +++ b/Godette-Tale/Prefabs/Player/Camera2D.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Scripts/Player/Camera2D.gd" type="Script" id=1] + + + +[node name="Camera2D" type="Camera2D"] +position = Vector2( 320, 240 ) +current = true +script = ExtResource( 1 ) + +[node name="Limits" type="Node" parent="."] + +[node name="TopLeft" type="Position2D" parent="Limits"] +__meta__ = { +"_gizmo_extents_": 116.8 +} + +[node name="BottomRight" type="Position2D" parent="Limits"] +position = Vector2( 640, 480 ) +__meta__ = { +"_gizmo_extents_": 116.8 +} diff --git a/Godette-Tale/Prefabs/Player/InteractionComponent.tscn b/Godette-Tale/Prefabs/Player/InteractionComponent.tscn new file mode 100644 index 0000000..076ca85 --- /dev/null +++ b/Godette-Tale/Prefabs/Player/InteractionComponent.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Scripts/Player/InteractionComponent.gd" type="Script" id=1] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 16, 10 ) + +[node name="InteractionComponent" type="Area2D"] +collision_layer = 0 +collision_mask = 8 +script = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) +[connection signal="body_entered" from="." to="." method="_on_InteractionComponent_body_entered"] +[connection signal="body_exited" from="." to="." method="_on_InteractionComponent_body_exited"] diff --git a/Godette-Tale/Prefabs/Player/Player.tscn b/Godette-Tale/Prefabs/Player/Player.tscn new file mode 100644 index 0000000..9ba4f39 --- /dev/null +++ b/Godette-Tale/Prefabs/Player/Player.tscn @@ -0,0 +1,167 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Player/SmolFrisk.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Player/Player.gd" type="Script" id=2] +[ext_resource path="res://Prefabs/Player/InteractionComponent.tscn" type="PackedScene" id=3] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 8 ) + +[sub_resource type="Animation" id=2] +resource_name = "Down" +length = 0.8 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2, 0.4, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ 5, 6, 7, 4 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("InteractionComponent:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 24 ) ] +} + +[sub_resource type="Animation" id=3] +resource_name = "Left" +length = 0.8 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2, 0.4, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ 9, 10, 11, 8 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("InteractionComponent:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0.1 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -5, 20 ) ] +} + +[sub_resource type="Animation" id=4] +resource_name = "Right" +length = 0.8 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2, 0.4, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ 13, 14, 15, 12 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("InteractionComponent:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 5, 20 ) ] +} + +[sub_resource type="Animation" id=5] +resource_name = "StartUp" +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 4 ] +} + +[sub_resource type="Animation" id=6] +resource_name = "Up" +length = 0.8 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2, 0.4, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ 1, 2, 3, 0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("InteractionComponent:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 16 ) ] +} + +[node name="Player" type="KinematicBody2D"] +scale = Vector2( 2, 2 ) +z_index = 1 +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +vframes = 2 +hframes = 8 +frame = 5 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, 20 ) +shape = SubResource( 1 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "StartUp" +anims/Down = SubResource( 2 ) +anims/Left = SubResource( 3 ) +anims/Right = SubResource( 4 ) +anims/StartUp = SubResource( 5 ) +anims/Up = SubResource( 6 ) + +[node name="InteractionComponent" parent="." instance=ExtResource( 3 )] +position = Vector2( 0, 24 ) +scale = Vector2( 0.596661, 0.646441 ) +interaction_parent = NodePath("..") diff --git a/Godette-Tale/Prefabs/Puzzles/Button.tscn b/Godette-Tale/Prefabs/Puzzles/Button.tscn new file mode 100644 index 0000000..cb67a66 --- /dev/null +++ b/Godette-Tale/Prefabs/Puzzles/Button.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Puzzles/SwiButSpike.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Puzzles/Button.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 8 ) + +[node name="Button" type="Area2D"] +script = ExtResource( 2 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, -2 ) +shape = SubResource( 1 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +hframes = 6 +[connection signal="body_entered" from="." to="." method="_on_Button_body_entered"] diff --git a/Godette-Tale/Prefabs/Puzzles/Door.tscn b/Godette-Tale/Prefabs/Puzzles/Door.tscn new file mode 100644 index 0000000..2b90ae8 --- /dev/null +++ b/Godette-Tale/Prefabs/Puzzles/Door.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Puzzles/Door.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Puzzles/Door.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 16, 32 ) + +[node name="Door" type="StaticBody2D"] +collision_layer = 9 +collision_mask = 9 +script = ExtResource( 2 ) +aryActivationPhrases = [ "Your", "Mom", "Gay", "Noobs" ] + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +scale = Vector2( 1.07839, 0.878088 ) +shape = SubResource( 1 ) diff --git a/Godette-Tale/Prefabs/Puzzles/Lever.tscn b/Godette-Tale/Prefabs/Puzzles/Lever.tscn new file mode 100644 index 0000000..50b57a4 --- /dev/null +++ b/Godette-Tale/Prefabs/Puzzles/Lever.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Puzzles/SwiButSpike.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Puzzles/Lever.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 8 ) + +[node name="Lever" type="StaticBody2D"] +collision_layer = 9 +collision_mask = 9 +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +hframes = 6 +frame = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, -2 ) +shape = SubResource( 1 ) diff --git a/Godette-Tale/Prefabs/Puzzles/Spikes.tscn b/Godette-Tale/Prefabs/Puzzles/Spikes.tscn new file mode 100644 index 0000000..b9f5db0 --- /dev/null +++ b/Godette-Tale/Prefabs/Puzzles/Spikes.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Puzzles/SwiButSpike.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Puzzles/Spikes.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 8 ) + +[node name="Spikes" type="StaticBody2D"] +collision_layer = 9 +collision_mask = 9 +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +hframes = 6 +frame = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +scale = Vector2( 1.16, 1.2 ) +shape = SubResource( 1 ) diff --git a/Godette-Tale/Prefabs/SavePanel.tscn b/Godette-Tale/Prefabs/SavePanel.tscn new file mode 100644 index 0000000..10b028c --- /dev/null +++ b/Godette-Tale/Prefabs/SavePanel.tscn @@ -0,0 +1,151 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://Assets/Art/Sprites/Player/SOUL.png" type="Texture" id=1] +[ext_resource path="res://addons/GodotTIE/Fonts/DT-Mono.tres" type="DynamicFont" id=2] +[ext_resource path="res://Scripts/Save.gd" type="Script" id=3] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0, 0, 0, 1 ) +border_width_left = 7 +border_width_top = 7 +border_width_right = 7 +border_width_bottom = 7 +border_color = Color( 1, 1, 1, 1 ) + +[node name="Panel" type="Panel"] +visible = false +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -207.0 +margin_top = 114.0 +margin_right = 207.0 +margin_bottom = 279.0 +custom_styles/panel = SubResource( 1 ) +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +anchor_left = 0.065 +anchor_top = 0.121 +anchor_right = 0.065 +anchor_bottom = 0.121 +margin_left = 0.0899982 +margin_top = 0.0349979 +margin_right = 80.09 +margin_bottom = 32.035 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Name" type="Label" parent="HBoxContainer"] +margin_left = 5.0 +margin_top = 1.0 +margin_right = 75.0 +margin_bottom = 30.0 +custom_fonts/font = ExtResource( 2 ) +text = "EMPTY" + +[node name="HBoxContainer2" type="HBoxContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.121 +anchor_right = 0.5 +anchor_bottom = 0.121 +margin_left = -25.0 +margin_top = 0.0349979 +margin_right = 23.0 +margin_bottom = 32.035 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Level" type="Label" parent="HBoxContainer2"] +margin_left = 3.0 +margin_top = 1.0 +margin_right = 45.0 +margin_bottom = 30.0 +custom_fonts/font = ExtResource( 2 ) +text = "LV0" + +[node name="HBoxContainer3" type="HBoxContainer" parent="."] +anchor_left = 0.915 +anchor_top = 0.121 +anchor_right = 0.915 +anchor_bottom = 0.121 +margin_left = -82.81 +margin_top = 0.0349979 +margin_right = 0.190002 +margin_bottom = 34.035 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Time" type="Label" parent="HBoxContainer3"] +margin_left = 13.0 +margin_top = 2.0 +margin_right = 69.0 +margin_bottom = 31.0 +custom_fonts/font = ExtResource( 2 ) +text = "0:00" + +[node name="Description" type="Label" parent="."] +margin_left = 32.0 +margin_top = 60.0 +margin_right = 184.0 +margin_bottom = 89.0 +custom_fonts/font = ExtResource( 2 ) +text = "--" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 1" type="Label" parent="."] +margin_left = 60.0 +margin_top = 117.0 +margin_right = 116.0 +margin_bottom = 146.0 +custom_fonts/font = ExtResource( 2 ) +text = "Save" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="Option 1"] +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 2" type="Label" parent="."] +margin_left = 222.0 +margin_top = 117.0 +margin_right = 305.0 +margin_bottom = 146.0 +custom_fonts/font = ExtResource( 2 ) +text = "Return" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="Option 2"] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] diff --git a/Godette-Tale/Prefabs/SaveStar.tscn b/Godette-Tale/Prefabs/SaveStar.tscn new file mode 100644 index 0000000..3069a2b --- /dev/null +++ b/Godette-Tale/Prefabs/SaveStar.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://Assets/Art/Sprites/SaveStar.png" type="Texture" id=1] +[ext_resource path="res://Scripts/Dialogue/SavePoints/SaveVoid.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] + +[sub_resource type="Animation" id=2] +resource_name = "Loop" +length = 0.5 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.25 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ 0, 1 ] +} + +[node name="savePoint" type="StaticBody2D"] +collision_layer = 9 +collision_mask = 9 +script = ExtResource( 2 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +hframes = 2 +frame = 1 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "Loop" +anims/Loop = SubResource( 2 ) + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] diff --git a/Godette-Tale/Prefabs/ShopTransition.tscn b/Godette-Tale/Prefabs/ShopTransition.tscn new file mode 100644 index 0000000..606488a --- /dev/null +++ b/Godette-Tale/Prefabs/ShopTransition.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Scripts/Transition.gd" type="Script" id=1] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 8 ) + +[node name="Transition" type="Area2D"] +script = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, -2 ) +shape = SubResource( 1 ) + +[connection signal="body_entered" from="." to="." method="_on_Button_body_entered"] +[connection signal="body_entered" from="." to="." method="_on_Transition_body_entered"] diff --git a/Godette-Tale/Prefabs/Shops/ABC_123_A_ShopExample.tscn b/Godette-Tale/Prefabs/Shops/ABC_123_A_ShopExample.tscn new file mode 100644 index 0000000..98c8f0f --- /dev/null +++ b/Godette-Tale/Prefabs/Shops/ABC_123_A_ShopExample.tscn @@ -0,0 +1,465 @@ +[gd_scene load_steps=22 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DT-Mono.tres" type="DynamicFont" id=1] +[ext_resource path="res://Assets/Art/Sprites/Player/SOUL.png" type="Texture" id=2] +[ext_resource path="res://Assets/Art/Sprites/Styles/MenuPanel.tres" type="StyleBox" id=3] +[ext_resource path="res://Assets/Art/Sprites/Shops/shop.png" type="Texture" id=4] +[ext_resource path="res://addons/GodotTIE/Fonts/DT-Mono-Text.tres" type="DynamicFont" id=5] +[ext_resource path="res://Assets/Sound Effects/BuyItem.wav" type="AudioStream" id=6] +[ext_resource path="res://Assets/Expressions/Shopkeeper/shopkeeper.png" type="Texture" id=7] +[ext_resource path="res://Scripts/Shops/ShopLogic.gd" type="Script" id=8] +[ext_resource path="res://Scripts/Shops/ABC_123_A_ShopExample.gd" type="Script" id=9] +[ext_resource path="res://addons/GodotTIE/Sans.wav" type="AudioStream" id=10] +[ext_resource path="res://addons/GodotTIE/text_interface_engine.gd" type="Script" id=11] +[ext_resource path="res://addons/GodotTIE/GodotTIE_icon.png" type="Texture" id=12] +[ext_resource path="res://Scripts/Shops/InfoTween.gd" type="Script" id=13] +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=14] + +[sub_resource type="Animation" id=7] +resource_name = "Idle" +tracks/0/type = "value" +tracks/0/path = NodePath("Shopkeeper:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 0 ] +} + +[sub_resource type="Animation" id=8] +resource_name = "Speaking" +length = 0.4 +tracks/0/type = "value" +tracks/0/path = NodePath("Shopkeeper:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ 1, 0 ] +} + +[sub_resource type="DynamicFontData" id=2] +font_path = "res://Assets/Fonts/Cave-Story.ttf" + +[sub_resource type="DynamicFont" id=3] +size = 50 +font_data = SubResource( 2 ) + +[sub_resource type="DynamicFont" id=4] +size = 30 +extra_spacing_top = -6 +extra_spacing_char = -2 +extra_spacing_space = -11 +font_data = ExtResource( 14 ) + +[sub_resource type="DynamicFont" id=5] +size = 27 +font_data = ExtResource( 14 ) + +[sub_resource type="DynamicFont" id=6] +size = 27 +font_data = ExtResource( 14 ) + +[node name="Root_Node" type="Node2D"] +script = ExtResource( 9 ) + +[node name="ShopBackground" type="Sprite" parent="."] +position = Vector2( 319.999, 122.469 ) +scale = Vector2( 1.97522, 1.97522 ) +texture = ExtResource( 4 ) + +[node name="Shopkeeper" type="Sprite" parent="."] +position = Vector2( 319.936, 273.164 ) +scale = Vector2( 2.3625, 2.3625 ) +texture = ExtResource( 7 ) +hframes = 2 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Shopkeeper"] +root_node = NodePath("../..") +anims/Idle = SubResource( 7 ) +anims/Speaking = SubResource( 8 ) + +[node name="InterPanel" type="Panel" parent="."] +margin_top = 240.0 +margin_right = 640.0 +margin_bottom = 480.0 +custom_styles/panel = ExtResource( 3 ) + +[node name="InterPanelText" type="ReferenceRect" parent="InterPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 39.0 +margin_top = 17.0 +margin_right = 43.0 +margin_bottom = 10.0 +rect_scale = Vector2( 0.92, 0.92 ) +script = ExtResource( 11 ) +__meta__ = { +"_editor_icon": ExtResource( 12 ) +} +BREAK_ON_MAX_LINES = false +FONT = SubResource( 3 ) + +[node name="TypeSound" type="AudioStreamPlayer" parent="InterPanel/InterPanelText"] +stream = ExtResource( 10 ) + +[node name="FacialTexture" type="TextureRect" parent="InterPanel/InterPanelText"] +margin_left = 229.199 +margin_top = -113.089 +margin_right = 325.199 +margin_bottom = -33.0891 +expand = true +stretch_mode = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="InterPanel"] +visible = false +margin_left = 57.4069 +margin_top = 59.9391 +margin_right = 147.407 +margin_bottom = 149.939 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="InterPanel"] +visible = false +margin_left = 82.4069 +margin_top = 53.9391 +margin_right = 138.407 +margin_bottom = 82.9391 +custom_fonts/font = ExtResource( 1 ) +text = "Test" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="talkOptions" type="VBoxContainer" parent="InterPanel"] +visible = false +margin_left = 49.0 +margin_top = 24.0 +margin_right = 402.0 +margin_bottom = 227.0 + +[node name="buyOptions" type="VBoxContainer" parent="InterPanel"] +visible = false +margin_left = 49.0 +margin_top = 24.0 +margin_right = 402.0 +margin_bottom = 227.0 +custom_constants/separation = 6 + +[node name="sellGrid" type="GridContainer" parent="InterPanel"] +visible = false +margin_left = 49.0 +margin_top = 24.0 +margin_right = 402.0 +margin_bottom = 227.0 +custom_constants/hseparation = 103 + +[node name="SellLabelHBox" type="HBoxContainer" parent="InterPanel"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_top = -83.0 +margin_right = 1.0 +alignment = 1 + +[node name="SellConfirmLabel" type="Label" parent="InterPanel/SellLabelHBox"] +margin_left = 192.0 +margin_top = 146.0 +margin_right = 449.0 +margin_bottom = 177.0 +custom_fonts/font = SubResource( 4 ) +text = "Sell item for 50G?" +align = 1 + +[node name="SellOptionHBox" type="HBoxContainer" parent="InterPanel"] +visible = false +margin_left = 1.0 +margin_top = 33.0 +margin_right = 640.0 +margin_bottom = 240.0 +custom_constants/separation = 160 +alignment = 1 + +[node name="Option 1" type="Label" parent="InterPanel/SellOptionHBox"] +margin_left = 199.0 +margin_top = 86.0 +margin_right = 247.0 +margin_bottom = 120.0 +custom_fonts/font = SubResource( 5 ) +text = "Yes" + +[node name="Cursor" type="TextureRect" parent="InterPanel/SellOptionHBox/Option 1"] +margin_left = -25.0 +margin_top = 10.0 +margin_right = 72.0 +margin_bottom = 107.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true + +[node name="Option 2" type="Label" parent="InterPanel/SellOptionHBox"] +margin_left = 407.0 +margin_top = 86.0 +margin_right = 439.0 +margin_bottom = 120.0 +custom_fonts/font = SubResource( 6 ) +text = "No" + +[node name="Cursor" type="TextureRect" parent="InterPanel/SellOptionHBox/Option 2"] +visible = false +margin_left = -25.0 +margin_top = 10.0 +margin_right = 73.0 +margin_bottom = 108.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BuyPanel" type="Panel" parent="."] +margin_left = 417.0 +margin_top = 240.0 +margin_right = 640.0 +margin_bottom = 480.0 +custom_styles/panel = ExtResource( 3 ) +script = ExtResource( 8 ) + +[node name="BuySound" type="AudioStreamPlayer" parent="BuyPanel"] +stream = ExtResource( 6 ) +volume_db = -10.0 + +[node name="InfoPanel" type="Panel" parent="BuyPanel"] +show_behind_parent = true +margin_right = 223.0 +margin_bottom = 169.0 +custom_styles/panel = ExtResource( 3 ) +script = ExtResource( 13 ) + +[node name="InfoPanelText" type="ReferenceRect" parent="BuyPanel/InfoPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 27.0 +margin_top = 23.0 +margin_right = 9.0 +margin_bottom = 13.0 +rect_scale = Vector2( 0.92, 0.92 ) +script = ExtResource( 11 ) +__meta__ = { +"_editor_icon": ExtResource( 12 ) +} + +[node name="TypeSound" type="AudioStreamPlayer" parent="BuyPanel/InfoPanel/InfoPanelText"] +stream = ExtResource( 10 ) + +[node name="FacialTexture" type="TextureRect" parent="BuyPanel/InfoPanel/InfoPanelText"] +margin_left = -157.613 +margin_top = -107.203 +margin_right = -61.6129 +margin_bottom = -27.2028 +expand = true +stretch_mode = 5 + +[node name="Tween" type="Tween" parent="BuyPanel/InfoPanel"] + +[node name="BuyPanelText" type="ReferenceRect" parent="BuyPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 27.0 +margin_top = 23.0 +margin_right = -19.0 +margin_bottom = -40.0 +rect_scale = Vector2( 0.92, 0.92 ) +script = ExtResource( 11 ) +__meta__ = { +"_editor_icon": ExtResource( 12 ) +} +BREAK_ON_MAX_LINES = false +FONT = SubResource( 3 ) + +[node name="TypeSound" type="AudioStreamPlayer" parent="BuyPanel/BuyPanelText"] +stream = ExtResource( 10 ) + +[node name="FacialTexture" type="TextureRect" parent="BuyPanel/BuyPanelText"] +margin_left = -157.613 +margin_top = -107.203 +margin_right = -61.6129 +margin_bottom = -27.2028 +expand = true +stretch_mode = 5 + +[node name="Option 1" type="Label" parent="BuyPanel"] +margin_left = 57.4069 +margin_top = 19.9391 +margin_right = 113.407 +margin_bottom = 55.9391 +custom_fonts/font = ExtResource( 5 ) +text = "Buy" + +[node name="Cursor" type="TextureRect" parent="BuyPanel/Option 1"] +margin_left = -28.0 +margin_top = 11.0 +margin_right = 83.0 +margin_bottom = 122.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 2" type="Label" parent="BuyPanel"] +margin_left = 57.4069 +margin_top = 60.9391 +margin_right = 125.407 +margin_bottom = 96.9391 +custom_fonts/font = ExtResource( 5 ) +text = "Sell" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="BuyPanel/Option 2"] +visible = false +margin_left = -28.0 +margin_top = 11.0 +margin_right = 83.0 +margin_bottom = 122.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 3" type="Label" parent="BuyPanel"] +margin_left = 57.4069 +margin_top = 100.939 +margin_right = 125.407 +margin_bottom = 136.939 +custom_fonts/font = ExtResource( 5 ) +text = "Talk" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="BuyPanel/Option 3"] +visible = false +margin_left = -28.0 +margin_top = 11.0 +margin_right = 83.0 +margin_bottom = 122.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Option 4" type="Label" parent="BuyPanel"] +margin_left = 57.4069 +margin_top = 140.939 +margin_right = 125.407 +margin_bottom = 176.939 +custom_fonts/font = ExtResource( 5 ) +text = "Exit" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Cursor" type="TextureRect" parent="BuyPanel/Option 4"] +visible = false +margin_left = -28.0 +margin_top = 11.0 +margin_right = 83.0 +margin_bottom = 122.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Gold" type="Label" parent="BuyPanel"] +margin_left = 27.0 +margin_top = 184.0 +margin_right = 95.0 +margin_bottom = 259.0 +custom_fonts/font = ExtResource( 5 ) +text = "100G +" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Space" type="Label" parent="BuyPanel"] +margin_left = 144.0 +margin_top = 184.0 +margin_right = 212.0 +margin_bottom = 259.0 +custom_fonts/font = ExtResource( 5 ) +text = "1/8" + +[node name="ConfirmPrompt" type="Label" parent="BuyPanel"] +visible = false +margin_left = 40.4069 +margin_top = 26.9391 +margin_right = 210.407 +margin_bottom = 101.939 +custom_fonts/font = SubResource( 4 ) +text = "Buy it for +50G?" + +[node name="Option 1" type="Label" parent="BuyPanel/ConfirmPrompt"] +margin_left = 14.0 +margin_top = 83.0 +margin_right = 70.0001 +margin_bottom = 119.0 +custom_fonts/font = SubResource( 5 ) +text = "Yes" + +[node name="Cursor" type="TextureRect" parent="BuyPanel/ConfirmPrompt/Option 1"] +margin_left = -25.0 +margin_top = 10.0 +margin_right = 72.0 +margin_bottom = 107.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true + +[node name="Option 2" type="Label" parent="BuyPanel/ConfirmPrompt"] +margin_left = 14.0 +margin_top = 114.0 +margin_right = 82.0001 +margin_bottom = 150.0 +custom_fonts/font = SubResource( 6 ) +text = "No" + +[node name="Cursor" type="TextureRect" parent="BuyPanel/ConfirmPrompt/Option 2"] +visible = false +margin_left = -25.0 +margin_top = 10.0 +margin_right = 73.0 +margin_bottom = 108.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/Godette-Tale/Prefabs/Transition.tscn b/Godette-Tale/Prefabs/Transition.tscn new file mode 100644 index 0000000..606488a --- /dev/null +++ b/Godette-Tale/Prefabs/Transition.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Scripts/Transition.gd" type="Script" id=1] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 8, 8 ) + +[node name="Transition" type="Area2D"] +script = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, -2 ) +shape = SubResource( 1 ) + +[connection signal="body_entered" from="." to="." method="_on_Button_body_entered"] +[connection signal="body_entered" from="." to="." method="_on_Transition_body_entered"] diff --git a/Godette-Tale/Prefabs/_MenuEntry.tscn b/Godette-Tale/Prefabs/_MenuEntry.tscn new file mode 100644 index 0000000..dfc313c --- /dev/null +++ b/Godette-Tale/Prefabs/_MenuEntry.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=1] +[ext_resource path="res://Assets/Art/Sprites/Player/SOUL.png" type="Texture" id=2] + +[sub_resource type="DynamicFont" id=1] +size = 27 +extra_spacing_char = -2 +extra_spacing_space = -10 +font_data = ExtResource( 1 ) + +[node name="Option 1" type="Label"] +margin_right = 205.0 +custom_fonts/font = SubResource( 1 ) +text = "Error" + +[node name="Cursor" type="TextureRect" parent="."] +visible = false +margin_left = -25.0 +margin_top = 6.0 +margin_right = 65.0 +margin_bottom = 96.0 +rect_scale = Vector2( 0.18868, 0.18868 ) +texture = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/Godette-Tale/Prefabs/_SellOptions.tscn b/Godette-Tale/Prefabs/_SellOptions.tscn new file mode 100644 index 0000000..75820c1 --- /dev/null +++ b/Godette-Tale/Prefabs/_SellOptions.tscn @@ -0,0 +1,8 @@ +[gd_scene format=2] + +[node name="sellOptions 1" type="VBoxContainer"] +margin_right = 176.0 +margin_bottom = 203.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 7 diff --git a/Godette-Tale/Scripts/Dialogue/PapyrusDialogue.gd b/Godette-Tale/Scripts/Dialogue/PapyrusDialogue.gd new file mode 100644 index 0000000..78fa598 --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/PapyrusDialogue.gd @@ -0,0 +1,72 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var FacialTexture = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine/FacialTexture") +onready var dialogue = tie.get_parent() + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible(): + tie.reset() + tie.portrait_visible(true) + tie.set_color(Color(1,1,1)) + tie.NPCid("Papyrus") + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Papyrus-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Papyrus.wav") + tie.buff_face("res://Assets/Expressions/Papyrus/PapNormal.png") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("NYEH", 0.065) + tie.buff_silence(0.10) + tie.buff_text(" HEH ", 0.065) + tie.buff_silence(0.10) + tie.buff_text("HEH!!!", 0.065) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + +func _ready(): + # Connect every signal to check them using the "print()" method + tie.connect("buff_end", self, "_on_buff_end") + tie.connect("enter_break", self, "_on_enter_break") + #tie.connect("resume_break", self, "_on_resume_break") + tie.connect("typesound", self, "_on_Typesound") + pass + +func _on_buff_end(): + print("Buff End") + #$AnimationPlayer.play("Idle") + $Sprite.set_frame(0) + pass + +func _on_enter_break(): + print("Enter Break") + #$AnimationPlayer.play("Idle") + $Sprite.set_frame(0) + pass + +#func _on_resume_break(): +# print("Resume Break") + #$AnimationPlayer.play("Speaking") +# pass + +func _on_Typesound(s): + if s == "Papyrus": + #print("Typesound") + #$AnimationPlayer.play("Speaking") + if $Sprite.get_frame() == 0: + FacialTexture.set_texture(load("res://Assets/Expressions/Papyrus/PapNormal1.png")) + $Sprite.set_frame(1) + #print("1") + else: + FacialTexture.set_texture(load("res://Assets/Expressions/Papyrus/PapNormal.png")) + $Sprite.set_frame(0) + #print("0") + pass + diff --git a/Godette-Tale/Scripts/Dialogue/SavePoints/SaveGrave.gd b/Godette-Tale/Scripts/Dialogue/SavePoints/SaveGrave.gd new file mode 100644 index 0000000..db8c9c2 --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/SavePoints/SaveGrave.gd @@ -0,0 +1,38 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var dialogue = tie.get_parent() +onready var save = get_node("/root/Root_Node/CanvasLayer/savePanel") +onready var toggle = true + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible() && !save.is_visible() && toggle: + $AudioStreamPlayer.stream = load("res://Assets/Sound Effects/HealthRestored.wav") + $AudioStreamPlayer.play() + tie.reset() + tie.portrait_visible(false) + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_face("res://Assets/Expressions/None.png") + tie.NPCid("save") + tie.buff_panel("show") + tie.buff_text("* This place...\n", 0.035) + tie.buff_break() + tie.buff_clear() + tie.buff_text("* (HP fully restored.)", 0.035) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_signal("openSavePanel") + tie.set_state(tie.STATE_OUTPUT) + globalVariables.disableMenu = true + toggle = false + elif !dialogue.is_visible() && !save.is_visible() && !toggle: + globalVariables.disableMenu = false + toggle = true diff --git a/Godette-Tale/Scripts/Dialogue/SavePoints/SaveVoid.gd b/Godette-Tale/Scripts/Dialogue/SavePoints/SaveVoid.gd new file mode 100644 index 0000000..1e5f98f --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/SavePoints/SaveVoid.gd @@ -0,0 +1,48 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var dialogue = tie.get_parent() +onready var save = get_node("/root/Root_Node/CanvasLayer/savePanel") +onready var toggle = true + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible() && !save.is_visible() && toggle: + $AudioStreamPlayer.stream = load("res://Assets/Sound Effects/HealthRestored.wav") + $AudioStreamPlayer.play() + tie.reset() + tie.portrait_visible(false) + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_face("res://Assets/Expressions/None.png") + tie.NPCid("save") + tie.buff_panel("show") + tie.buff_text("* Where...\n", 0.035) + tie.buff_text("* Are you..?", 0.065) + tie.buff_break() + tie.buff_clear() + tie.set_color(Color(1,0,0)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Comic-Sans-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Sans.wav") + tie.buff_text("* You dirty hacker", 0.035) + tie.buff_silence(0.1) + tie.buff_clear() + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.set_color(Color(1,1,1)) + tie.buff_text("* (HP fully restored.)", 0.035) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_signal("openSavePanel") + tie.set_state(tie.STATE_OUTPUT) + globalVariables.disableMenu = true + toggle = false + elif !dialogue.is_visible() && !save.is_visible() && !toggle: + globalVariables.disableMenu = false + toggle = true diff --git a/Godette-Tale/Scripts/Dialogue/Sign.gd b/Godette-Tale/Scripts/Dialogue/Sign.gd new file mode 100644 index 0000000..d255ec5 --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/Sign.gd @@ -0,0 +1,79 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var dialogue = tie.get_parent() + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible(): + tie.reset() + tie.portrait_visible(true) + tie.NPCid("Sans") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Comic-Sans-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Sans.wav") + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("* This is a song, ", 0.1) + tie.buff_text("lalala\n", 0.2) + # Buff silence: Duration of the silence (in seconds) + tie.buff_silence(1) + tie.buff_face("res://Assets/Expressions/Sans/Sans1.png") + tie.buff_text("* It is so beautiful,\n", 0.1) + tie.buff_text(" lalala", 0.2) + tie.buff_break() + tie.buff_clear() + tie.buff_text("* Turn around and shake\n", 0.15) + tie.buff_text(" my hand.", 0.15) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + +func _ready(): + # Connect every signal to check them using the "print()" method + tie.connect("input_enter", self, "_on_input_enter") + tie.connect("buff_end", self, "_on_buff_end") + tie.connect("state_change", self, "_on_state_change") + tie.connect("enter_break", self, "_on_enter_break") + tie.connect("resume_break", self, "_on_resume_break") + tie.connect("tag_buff", self, "_on_tag_buff") + #tie.connect("typesound", self, "_on_Typesound") + pass + +func _on_input_enter(s): + print("Input Enter ",s) + + tie.add_newline() + tie.buff_text("Oooh, so your name is " + s + "? What a beautiful name!", 0.01) + pass + +func _on_buff_end(): + print("Buff End") + pass + +func _on_state_change(i): + print("New state: ", i) + pass + +func _on_enter_break(): + print("Enter Break") + pass + +func _on_resume_break(): + print("Resume Break") + pass + +func _on_tag_buff(s): + print("Tag Buff ",s) + pass + +#func _on_Typesound(): +# print("Typesound") +# pass diff --git a/Godette-Tale/Scripts/Dialogue/Sign2.gd b/Godette-Tale/Scripts/Dialogue/Sign2.gd new file mode 100644 index 0000000..939e3ee --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/Sign2.gd @@ -0,0 +1,30 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var dialogue = tie.get_parent() + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible(): + tie.reset() + tie.portrait_visible(true) + tie.NPCid("Sans") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Papyrus-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("I,\nTHE GREAT PAPYRUS\n", 0.1) + tie.buff_text("WILL STOP YOU!", 0.2) + # Buff silence: Duration of the silence (in seconds) + #tie.buff_silence(1) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) diff --git a/Godette-Tale/Scripts/Dialogue/Sign3.gd b/Godette-Tale/Scripts/Dialogue/Sign3.gd new file mode 100644 index 0000000..2e768b9 --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/Sign3.gd @@ -0,0 +1,28 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var dialogue = tie.get_parent() + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible(): + tie.reset() + tie.portrait_visible(true) + tie.NPCid("Sans") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Comic-Sans-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Sans.wav") + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("* Turn around and shake\n", 0.15) + tie.buff_text(" my hand.", 0.15) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) diff --git a/Godette-Tale/Scripts/Dialogue/Sign4Choices.gd b/Godette-Tale/Scripts/Dialogue/Sign4Choices.gd new file mode 100644 index 0000000..74b89e9 --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/Sign4Choices.gd @@ -0,0 +1,106 @@ +extends StaticBody2D +#class_name InteractableItem + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var options_script = get_node("/root/Root_Node/CanvasLayer/panel/Options") +onready var dialogue = tie.get_parent() + +# By default interactable items are only availble to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: + if !dialogue.is_visible(): + tie.reset() + tie.portrait_visible(true) + tie.NPCid("Sans") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Comic-Sans-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Sans.wav") + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("* I'm real, right?", 0.09) + tie.buff_choice("BranchTest1", 2, 1, true, "\nYes", "\nNo", "Anime is\nReal", "") + tie.set_state(tie.STATE_OUTPUT) + +func _ready(): + # Connect every signal to check them using the "print()" method + tie.connect("input_enter", self, "_on_input_enter") + tie.connect("buff_end", self, "_on_buff_end") + tie.connect("state_change", self, "_on_state_change") + tie.connect("enter_break", self, "_on_enter_break") + tie.connect("resume_break", self, "_on_resume_break") + tie.connect("tag_buff", self, "_on_tag_buff") + #tie.connect("typesound", self, "_on_Typesound") + options_script.connect("player_choice", self, "_on_choice") + pass + +func _on_input_enter(s): + print("Input Enter ",s) + + tie.add_newline() + tie.buff_text("Oooh, so your name is " + s + "? What a beautiful name!", 0.01) + pass + +func _on_buff_end(): + print("Buff End") + pass + +func _on_state_change(i): + print("New state: ", i) + pass + +func _on_enter_break(): + print("Enter Break") + pass + +func _on_resume_break(): + print("Resume Break") + pass + +func _on_tag_buff(s): + print("Tag Buff ",s) + pass + +#func _on_Typesound(): +# print("Typesound") +# pass + +func _on_choice(outputBranch, s): + print(s) + + + if outputBranch == "BranchTest1": + if s == "\nYes": + tie.reset() + tie.buff_text("* My sources say\n otherwise.", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + elif s == "\nNo": + tie.reset() + tie.buff_text("* What about Papyrus?", 0.1) + tie.buff_choice("BranchTest2", 2, 0, true, "Yes", "No", "", "") + tie.set_state(tie.STATE_OUTPUT) + elif outputBranch == "BranchTest2": + if s == "Yes": + tie.reset() + tie.buff_text("* I really want\n to believe you\n kid.", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + elif s == "No": + print("It works") + tie.reset() + tie.buff_text("* That explains alot.", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + diff --git a/Godette-Tale/Scripts/Dialogue/main.gd b/Godette-Tale/Scripts/Dialogue/main.gd new file mode 100644 index 0000000..fdc8a0c --- /dev/null +++ b/Godette-Tale/Scripts/Dialogue/main.gd @@ -0,0 +1,85 @@ +extends Control + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") + +func _ready(): + # "A Beautiful Song" + # by Henrique Alves + tie.set_color(Color(1,1,1)) + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_asterisk("show") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("This is a song, ", 0.1) + tie.buff_text("lalala\n", 0.2) + # Buff silence: Duration of the silence (in seconds) + tie.buff_silence(1) + tie.buff_face("res://Assets/Expressions/Sans/Sans1.png") + tie.buff_asterisk2("show") + tie.buff_text("It is so beautiful, ", 0.1) + tie.buff_text("lalala", 0.2) + tie.buff_break() + tie.buff_clear() + tie.buff_asterisk("hide") + tie.buff_asterisk2("hide") + tie.buff_silence(1) + tie.buff_asterisk("show") + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_text("I love this song, ", 0.1) + tie.buff_text("lalala", 0.2) + tie.buff_break() + tie.buff_clear() + tie.buff_text("But now I'll ", 0.1) # WAIT FOR THE DROP + tie.buff_text("DROP ", 0.02) # ????? + tie.buff_silence(0.4) + tie.buff_text("THE BASS\n", 0.02) # !!!!! + tie.buff_silence(0.4) + tie.buff_face("res://Assets/Expressions/Sans/Sans1.png") + tie.buff_text("TVUVTUVUTUVU", 0.04) # I firmly believe this particular verse is my Magna Opus. + tie.buff_asterisk("hide") + tie.buff_text("WOODBODBOWBDODBO TUUVUTVU WODWVDOOWDV WODOWVOOWDVOWVD DUBDUBDUBUDUDB OWVDOWVWDOWVDOWVDOWVDWVDOWVDOWVODV", 0.04) # I firmly believe this particular verse is my Magna Opus. + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_asterisk("hide") + tie.buff_face("res://Assets/Expressions/None.png") + + # Connect every signal to check them using the "print()" method + tie.connect("input_enter", self, "_on_input_enter") + tie.connect("buff_end", self, "_on_buff_end") + tie.connect("state_change", self, "_on_state_change") + tie.connect("enter_break", self, "_on_enter_break") + tie.connect("resume_break", self, "_on_resume_break") + tie.connect("tag_buff", self, "_on_tag_buff") + pass + +func _on_input_enter(s): + print("Input Enter ",s) + + tie.add_newline() + tie.buff_text("Oooh, so your name is " + s + "? What a beautiful name!", 0.01) + tie.buff_break() + tie.buff_panel("hide") + tie.buff_asterisk("hide") + tie.buff_face("res://Assets/None.png") + pass + +func _on_buff_end(): + print("Buff End") + pass + +func _on_state_change(i): + print("New state: ", i) + pass + +func _on_enter_break(): + print("Enter Break") + pass + +func _on_resume_break(): + print("Resume Break") + pass + +func _on_tag_buff(s): + print("Tag Buff ",s) + pass diff --git a/Godette-Tale/Scripts/MenuPanel.gd b/Godette-Tale/Scripts/MenuPanel.gd new file mode 100644 index 0000000..60cba6c --- /dev/null +++ b/Godette-Tale/Scripts/MenuPanel.gd @@ -0,0 +1,459 @@ +extends Panel + +onready var choice : int = 1 +onready var mainMenuchoice : int = 1 +onready var currentChoice = get_node("menuPanel/Option " + str(choice) + "/Cursor") +onready var isActive : bool = false +onready var ranOnce : bool = false +onready var cellisActive : bool = false +onready var itemisActive : bool = false +onready var itempromptisActive : bool = false +onready var statisActive : bool = false +onready var menuEntryScene = load("res://Prefabs/_MenuEntry.tscn") +onready var cellCount : int = 0 +onready var itemCount: int = 0 +onready var tempSlot: int = 0 +onready var tempItemID: int = 0 +onready var tempNodeItem +onready var tempNodeCell + +func _ready(): + signalManager.connect("buff_signal", self, "_on_buff_signal_activated") + $Name.text = globalVariables.Name + $Level/LevelValue.text = str(globalVariables.Love) + $Gold/GoldValue.text = str(globalVariables.Gold) + for item in globalVariables.cellList: #Initialize cellphone + cellCount += 1 + var menuEntry = menuEntryScene.instance() + $cellMenu/VBoxContainer.add_child(menuEntry, true) + tempNodeCell = get_node("cellMenu/VBoxContainer/Option " + str(cellCount)) + #print(tempNodeCell) + tempNodeCell.text = item + #print(globalVariables.cellList) + for item in globalVariables.Items: #Initialize inventory + itemCount += 1 + var menuEntry = menuEntryScene.instance() + $itemMenu/VBoxContainer.add_child(menuEntry, true) + tempNodeItem = get_node("itemMenu/VBoxContainer/Option " + str(itemCount)) + #print(tempNodeItem) + tempNodeItem.text = itemLibrary.itemDictionary[item].itemName + #print(globalVariables.Items) + if globalVariables.Items.size() == 0: #color menu text gray + $"menuPanel/Option 1".add_color_override("font_color", Color(0.35,0.35,0.35)) + elif globalVariables.Items.size() > 0: #color menu text white + $"menuPanel/Option 1".add_color_override("font_color", Color(1,1,1)) + +func UpdateMenuInformation(): + $Name.text = globalVariables.Name + $Level/LevelValue.text = str(globalVariables.Love) + #$Hitpoints/HitpointsValue = globalVariables.Hitpoints + $Gold/GoldValue.text = str(globalVariables.Gold) + itemCount = 0 + for child in $itemMenu/VBoxContainer.get_children(): + $itemMenu/VBoxContainer.remove_child(child) + child.queue_free() + for item in globalVariables.Items: #Update inventory + itemCount += 1 + var menuEntry = menuEntryScene.instance() + #menuEntry.set_name("Option " + str(itemCount)) + $itemMenu/VBoxContainer.add_child(menuEntry, true) + tempNodeItem = get_node("itemMenu/VBoxContainer/Option " + str(itemCount)) + print(tempNodeItem) + tempNodeItem.text = itemLibrary.itemDictionary[item].itemName + print(globalVariables.Items) + if globalVariables.Items.size() == 0: #color menu text gray + $"menuPanel/Option 1".add_color_override("font_color", Color(0.35,0.35,0.35)) + elif globalVariables.Items.size() > 0: #color menu text white + $"menuPanel/Option 1".add_color_override("font_color", Color(1,1,1)) + + +func _on_buff_signal_activated(s): + print(s) + if s == "openSavePanel": + UpdateMenuInformation() + if s == "closeMenuPanel": + self.hide() #close the main menu + isActive = false + globalVariables.menuOpen = false + globalVariables.disableMenu = false + +func _on_save_update_activated(): + UpdateMenuInformation() + +func _input(ev): + if Input.is_action_just_pressed("open_menu") && isActive && !cellisActive && !itemisActive && !statisActive: #if the main menu is all that is open close the main menu + self.hide() #close the main menu + isActive = false + globalVariables.menuOpen = false + elif Input.is_action_just_pressed("open_menu") && isActive && cellisActive && !itemisActive && !statisActive: #if the cellphone menu is open close it + ranOnce = false + $cellMenu.hide() #close the cellphone menu + cellisActive = false + choice = 1 + get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor").show() + elif Input.is_action_just_pressed("open_menu") && isActive && !cellisActive && itemisActive && !itempromptisActive && !statisActive: #if the item menu is open close it + $itemMenu.hide() #close the item menu + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.hide() + itemisActive = false + choice = 1 + get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor").show() + ranOnce = false + elif Input.is_action_just_pressed("open_menu") && isActive && !cellisActive && itemisActive && itempromptisActive && !statisActive: #if the item menu is open close it + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.hide() #back out of the item prompt + itempromptisActive = false + if globalVariables.Items.size() != 0: + print("item menu shown") + print("item array size: " + str(globalVariables.Items.size())) + $itemMenu.show() + choice = 1 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + itemisActive = true + if tempNodeItem != null: + get_node("itemMenu/VBoxContainer/Option 1/Cursor").show() + + elif Input.is_action_just_pressed("open_menu") && isActive && !cellisActive && !itemisActive && statisActive: #if the stats menu is open close it + $statMenu.hide() #close the stats menu + statisActive = false + choice = 1 + get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor").show() + elif Input.is_action_just_pressed("open_menu") && !isActive && !cellisActive && !itemisActive && !statisActive && !globalVariables.disableMenu: #if no menus are open open the main menu + mainMenuchoice = 1 + choice = 1 + $"menuPanel/Option 1/Cursor".show() + $"menuPanel/Option 2/Cursor".hide() + $"menuPanel/Option 3/Cursor".hide() + self.show() #open the menu + isActive = true + ranOnce = false + globalVariables.menuOpen = true + if Input.is_action_just_pressed("move_up") && isActive && !cellisActive && !itemisActive && !statisActive || Input.is_action_just_pressed("move_down") && isActive && !cellisActive && !itemisActive && !statisActive || Input.is_action_just_pressed("interact") && isActive && !cellisActive && !itemisActive && !statisActive: #main menu interactions + currentChoice = get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor") + if ev.scancode == KEY_UP: # If up arrow is pressed + if mainMenuchoice != 1: + currentChoice.hide() + mainMenuchoice -= 1 + currentChoice = get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + mainMenuchoice = 3 + currentChoice = get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_DOWN: # If down arrow is pressed + if mainMenuchoice != 3: + currentChoice.hide() + mainMenuchoice += 1 + currentChoice = get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + mainMenuchoice = 1 + currentChoice = get_node("menuPanel/Option " + str(mainMenuchoice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_C: + print("You chose: nothing") + isActive = false + self.hide() + pass + else: # If Enter is pressed + if mainMenuchoice == 1 && globalVariables.Items.size() != 0 && !globalVariables.disableMenu: + print("item menu shown") + print("item array size: " + str(globalVariables.Items.size())) + $itemMenu.show() + choice = 1 + currentChoice.hide() + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(mainMenuchoice) + "/Cursor") + currentChoice.show() + itemisActive = true + if tempNodeItem != null: + get_node("itemMenu/VBoxContainer/Option 1/Cursor").show() + if mainMenuchoice == 2 && !globalVariables.disableMenu: + print("You chose: " + str(mainMenuchoice)) + isActive = false + self.hide() + if mainMenuchoice == 3 && !globalVariables.disableMenu: + print("cell menu shown") + $cellMenu.show() + choice = 1 + currentChoice.hide() + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(mainMenuchoice) + "/Cursor") + cellisActive = true + if tempNodeCell != null: + get_node("cellMenu/VBoxContainer/Option 1/Cursor").show() + if Input.is_action_just_pressed("move_up") && isActive && cellisActive && !itemisActive && !statisActive || Input.is_action_just_pressed("move_down") && isActive && cellisActive && !itemisActive && !statisActive || Input.is_action_just_pressed("interact") && isActive && cellisActive && !itemisActive && !statisActive: #cell menu interactions + if globalVariables.cellList.size() >= 3: + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_UP: # If up arrow is pressed + if choice != 1: + currentChoice.hide() + choice -= 1 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = globalVariables.cellList.size() + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_DOWN: # If down arrow is pressed + if choice != globalVariables.cellList.size(): + currentChoice.hide() + choice += 1 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_ENTER: # If enter is pressed + if ranOnce == true: + currentChoice.hide() + choice -= 1 + signalManager.emit_signal("cell",globalVariables.cellList[choice])#emit cellphone label name + $cellMenu.hide() + cellisActive = false + isActive = false + print(globalVariables.cellList[choice]) + choice = 1 + ranOnce = false + else: + ranOnce = true + elif globalVariables.cellList.size() == 2: + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_UP: # If up arrow is pressed + if choice == 1: + currentChoice.hide() + choice = 2 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_DOWN: # If down arrow is pressed + if choice == 2: + currentChoice.hide() + choice = 1 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 2 + currentChoice = get_node("cellMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_ENTER: # If enter is pressed + if ranOnce == true: + currentChoice.hide() + choice -= 1 + signalManager.emit_signal("cell",globalVariables.cellList[choice])#emit cellphone label name + $cellMenu.hide() + cellisActive = false + isActive = false + print(globalVariables.cellList[choice]) + choice = 1 + ranOnce = false + else: + ranOnce = true + elif globalVariables.cellList.size() == 1: + if ev.scancode == KEY_ENTER: # If enter is pressed + if ranOnce == true: + currentChoice.hide() + signalManager.emit_signal("cell",globalVariables.cellList[0])#emit cellphone label name + $cellMenu.hide() + cellisActive = false + isActive = false + print(globalVariables.cellList[choice]) + choice = 1 + ranOnce = false + else: + ranOnce = true + elif globalVariables.cellList.size() == 0: + pass + if Input.is_action_just_pressed("move_up") && isActive && !cellisActive && itemisActive && !itempromptisActive && !statisActive || Input.is_action_just_pressed("move_down") && isActive && !cellisActive && itemisActive && !itempromptisActive && !statisActive || Input.is_action_just_pressed("interact") && isActive && !cellisActive && itemisActive && !itempromptisActive && !statisActive: #item menu interactions + if globalVariables.Items.size() >= 3: + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_UP: # If up arrow is pressed + if choice != 1: + currentChoice.hide() + choice -= 1 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = globalVariables.Items.size() + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_DOWN: # If down arrow is pressed + if choice != globalVariables.Items.size(): + currentChoice.hide() + choice += 1 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_ENTER: # If enter is pressed + if ranOnce == true: + currentChoice.hide() + tempSlot = choice + choice -= 1 + tempItemID = globalVariables.Items[choice] + #$itemMenu.hide() + #itemisActive = false + itempromptisActive = true + #isActive = false + print("ItemID: " + str(globalVariables.Items[choice]) + "\nInventory slot: " + str(tempSlot)) + choice = 1 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + ranOnce = false + else: + ranOnce = true + elif globalVariables.Items.size() == 2: + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_UP: # If up arrow is pressed + if choice == 1: + currentChoice.hide() + choice = 2 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_DOWN: # If down arrow is pressed + if choice == 2: + currentChoice.hide() + choice = 1 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 2 + currentChoice = get_node("itemMenu/VBoxContainer/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_ENTER: # If enter is pressed + if ranOnce == true: + currentChoice.hide() + tempSlot = choice + choice -= 1 + tempItemID = globalVariables.Items[choice] + #$itemMenu.hide() + #itemisActive = false + itempromptisActive = true + #isActive = false + print("ItemID: " + str(globalVariables.Items[choice]) + "\nInventory slot: " + str(tempSlot)) + choice = 1 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + ranOnce = false + else: + ranOnce = true + elif globalVariables.Items.size() == 1: + if ev.scancode == KEY_ENTER: # If enter is pressed + if ranOnce == true: + currentChoice.hide() + tempSlot = choice + choice -= 1 + tempItemID = globalVariables.Items[choice] + #$itemMenu.hide() + #itemisActive = false + itempromptisActive = true + #isActive = false + print("ItemID: " + str(globalVariables.Items[choice]) + "\nInventory slot: " + str(tempSlot)) + choice = 1 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + ranOnce = false + else: + ranOnce = true + elif globalVariables.Items.size() == 0: + pass +#################################################################################################################################### EXPERIMENTAL + if Input.is_action_just_pressed("move_left") && isActive && !cellisActive && itemisActive && itempromptisActive && !statisActive || Input.is_action_just_pressed("move_right") && isActive && !cellisActive && itemisActive && itempromptisActive && !statisActive || Input.is_action_just_pressed("interact") && isActive && !cellisActive && itemisActive && itempromptisActive && !statisActive: #item prompt interactions + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_LEFT: # If left arrow is pressed + if choice != 1: + currentChoice.hide() + choice -= 1 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 3 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_RIGHT: # If right arrow is pressed + if choice != 3: + currentChoice.hide() + choice += 1 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("itemMenu/Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_ENTER && choice == 1: # USE + if ranOnce == true: + print("Item use") + print(str(itemLibrary.itemDictionary[tempItemID].itemDescription)) + globalVariables.disableMenu = true + itemLibrary.itemFunction(itemLibrary.itemDictionary[tempItemID].itemDescription) #add use code here + $itemMenu.hide() + isActive = false + itemisActive = false + itempromptisActive = false + currentChoice.hide() + ranOnce = false + else: + ranOnce = true + elif ev.scancode == KEY_ENTER && choice == 2: # INFO + if ranOnce == true: + print("Item info") + print(str(itemLibrary.itemDictionary[tempItemID].itemDescription)) + globalVariables.disableMenu = true + itemLibrary.itemFunction(itemLibrary.itemDictionary[tempItemID].itemDescription) #add use code here + $itemMenu.hide() + isActive = false + itemisActive = false + itempromptisActive = false + currentChoice.hide() + ranOnce = false + else: + ranOnce = true + elif ev.scancode == KEY_ENTER && choice == 3: # DROP + if ranOnce == true: + print("Item drop") + print(str(itemLibrary.itemDictionary[tempItemID].itemDescription)) + globalVariables.Items.remove(tempSlot-1) + UpdateMenuInformation() + globalVariables.disableMenu = true + if itemLibrary.itemDictionary[tempItemID].has("itemDropText"): + itemLibrary.itemFunction(itemLibrary.itemDictionary[tempItemID].itemDropText) + else: + itemLibrary.itemFunction(["The " + itemLibrary.itemDictionary[tempItemID].itemName + " was thrown away."]) + $itemMenu.hide() + isActive = false + itemisActive = false + itempromptisActive = false + currentChoice.hide() + ranOnce = false + else: + ranOnce = true + + #$"menuPanel/Option 1".hide() #ITEM + #$"menuPanel/Option 2".hide() #STAT + #$"menuPanel/Option 3".hide() #CELL + #pass + #emit_signal("player_choice", outputBranch, get_node("Option " + str(choice)).text) + #send signal + #print("Active: " + str(optionsActive) + "\nDisabled: " + str(optionsDisabled)) + #called everytime enter/left/right is pressed while isActive diff --git a/Godette-Tale/Scripts/Music/Amalgam.gd b/Godette-Tale/Scripts/Music/Amalgam.gd new file mode 100644 index 0000000..89c1e76 --- /dev/null +++ b/Godette-Tale/Scripts/Music/Amalgam.gd @@ -0,0 +1,160 @@ +extends Node2D + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var FacialTexture = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine/FacialTexture") +onready var dialogue = tie.get_parent() +onready var lastTypesound : String + +func _init(): + globalVariables.cellList = ["sans' Phone","Gaster","Papyrus"] #When you add a string entry that same string will be called below + +func _ready(): + globalVariables.currentRoomDesc = "The void" + MusicController.play_music("res://Assets/Music/Amalgam.wav") + signalManager.connect("cell", self, "_on_cellphone_activated") + tie.connect("buff_end", self, "_on_buff_end") + tie.connect("enter_break", self, "_on_enter_break") + tie.connect("typesound", self, "_on_Typesound") + signalManager.connect("buff_signal", self, "_on_buff_signal_activated") + globalVariables.tie = tie + globalVariables.dialogue = dialogue + #print(globalVariables.cellList.join("\n")) + +func _on_cellphone_activated(s): #cellphone entry string is called here + if s == "sans' Phone": #catch cellphone string and start a function + sans01() + if s == "Gaster": + mysteryman01() + if s == "Papyrus": + papyrus() +#signalManager.emit_signal("cell", [cellList entry here]) #the MenuPanel lists and emits the chosen cellphone entry in the rootNode using the signal manager and the rootNode receives the signal. + +func _on_buff_signal_activated(s): + if s == "portrait hidden": + tie.rect_position = Vector2( 24, 22 ) + tie.rect_size = Vector2( 560, 144 ) + if s == "portrait visible": + tie.rect_position = Vector2( 128, 22 ) + tie.rect_size = Vector2( 432, 144 ) + if s == "comic sans": + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Comic-Sans-UT.tres") + pass + +var sans01 = false +func sans01(): + if !dialogue.is_visible() && !sans01: + $"/root/Root_Node/CanvasLayer/infoPanel/AudioStreamPlayer".stream = load("res://Assets/Sound Effects/PhoneRing.wav") + $"/root/Root_Node/CanvasLayer/infoPanel/AudioStreamPlayer".play() + tie.reset() + tie.portrait_visible(false) + tie.NPCid("Sans") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tie.buff_face("res://Assets/Expressions/None.png") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_panel("show") + tie.buff_text("* Ring...", 0.1) + tie.buff_silence(1) + tie.buff_text(" Ring...", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_signal("portrait visible") + tie.buff_face("res://Assets/Expressions/Sans/Sans.png") + tie.buff_signal("comic sans") #you gotta add in the font above + tie.buff_typesound("res://addons/GodotTIE/Sans.wav") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("* what's up kid.\n", 0.08) + # Buff silence: Duration of the silence (in seconds) + tie.buff_silence(1) + tie.buff_face("res://Assets/Expressions/Sans/Sans1.png") + tie.buff_text("* wanna go to grillbys?", 0.08) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + sans01 = true + elif !dialogue.is_visible() && sans01: + $"/root/Root_Node/CanvasLayer/infoPanel/AudioStreamPlayer".stream = load("res://Assets/Sound Effects/PhoneRing.wav") + $"/root/Root_Node/CanvasLayer/infoPanel/AudioStreamPlayer".play() + tie.reset() + tie.portrait_visible(false) + tie.NPCid("Sans") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_panel("show") + tie.buff_text("* Ring...", 0.1) + tie.buff_silence(1) + tie.buff_text(" Ring...", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_text("No answer.\nIt's not like the first call\nwas real anyway.", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + +func mysteryman01(): + $"/root/Root_Node/CanvasLayer/infoPanel/AudioStreamPlayer".stream = load("res://Assets/Sound Effects/PhoneRing.wav") + $"/root/Root_Node/CanvasLayer/infoPanel/AudioStreamPlayer".play() + tie.reset() + tie.portrait_visible(false) + tie.NPCid("Gaster") + tie.set_color(Color(1,1,1)) + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_panel("show") + tie.buff_text("* Ring...", 0.1) + tie.buff_silence(1) + tie.buff_text(" Ring...", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_text("No response.", 0.1) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + +func papyrus(): + tie.reset() + tie.portrait_visible(true) + tie.set_color(Color(1,1,1)) + tie.NPCid("PapyrusCell") + tie.set_font_bypath("res://addons/GodotTIE/Fonts/Papyrus-UT.tres") + tie.buff_typesound("res://addons/GodotTIE/Papyrus.wav") + tie.buff_face("res://Assets/Expressions/Papyrus/PapNormal.png") + tie.buff_panel("show") + # Buff text: "Text", duration (in seconds) of each letter + tie.buff_text("NYEH", 0.065) + tie.buff_silence(0.10) + tie.buff_text(" HEH ", 0.065) + tie.buff_silence(0.10) + tie.buff_text("HEH!!!", 0.065) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) + +func _on_Typesound(s): + lastTypesound = s + if s == "PapyrusCell": + if FacialTexture.texture.resource_path == "res://Assets/Expressions/Papyrus/PapNormal.png": + FacialTexture.set_texture(load("res://Assets/Expressions/Papyrus/PapNormal1.png")) + else: + FacialTexture.set_texture(load("res://Assets/Expressions/Papyrus/PapNormal.png")) + +func _on_buff_end(): + $"/root/Root_Node/CanvasLayer/infoPanel".hide() + globalVariables.menuOpen = false + if lastTypesound == "PapyrusCell": + FacialTexture.set_texture(load("res://Assets/Expressions/Papyrus/PapNormal.png")) + +func _on_enter_break(): + print("Enter Break") + if lastTypesound == "PapyrusCell": + FacialTexture.set_texture(load("res://Assets/Expressions/Papyrus/PapNormal.png")) + diff --git a/Godette-Tale/Scripts/Music/Ruins.gd b/Godette-Tale/Scripts/Music/Ruins.gd new file mode 100644 index 0000000..46cd252 --- /dev/null +++ b/Godette-Tale/Scripts/Music/Ruins.gd @@ -0,0 +1,4 @@ +extends Node2D + +func _ready(): + MusicController.play_music("res://Assets/Music/Ruins.wav") diff --git a/Godette-Tale/Scripts/Music/Ruins_Grave.gd b/Godette-Tale/Scripts/Music/Ruins_Grave.gd new file mode 100644 index 0000000..06f099f --- /dev/null +++ b/Godette-Tale/Scripts/Music/Ruins_Grave.gd @@ -0,0 +1,14 @@ +extends Node2D + +onready var tie = get_node("/root/Root_Node/CanvasLayer/panel/text_interface_engine") +onready var dialogue = tie.get_parent() + +func _init(): + globalVariables.cellList = [] + +func _ready(): + globalVariables.currentRoomDesc = "It's me" + MusicController.play_music("res://Assets/Music/Empty.wav") + globalVariables.tie = tie + globalVariables.dialogue = dialogue + print(tie) diff --git a/Godette-Tale/Scripts/Player/Camera2D.gd b/Godette-Tale/Scripts/Player/Camera2D.gd new file mode 100644 index 0000000..9bf2a69 --- /dev/null +++ b/Godette-Tale/Scripts/Player/Camera2D.gd @@ -0,0 +1,11 @@ +extends Camera2D + +onready var topLeft = $Limits/TopLeft +onready var bottomRight = $Limits/BottomRight + +func _ready(): + limit_top = topLeft.position.y + limit_left = topLeft.position.x + limit_bottom = bottomRight.position.y + limit_right = bottomRight.position.x + diff --git a/Godette-Tale/Scripts/Player/InteractionComponent.gd b/Godette-Tale/Scripts/Player/InteractionComponent.gd new file mode 100644 index 0000000..95d34bd --- /dev/null +++ b/Godette-Tale/Scripts/Player/InteractionComponent.gd @@ -0,0 +1,40 @@ +extends Area2D + +export var interaction_parent : NodePath + +signal on_interactable_changed(newInteractable) + +var interaction_target : Node + +# Called every frame +func _process(delta): + # Check whether the player is trying to interact + if (interaction_target != null and Input.is_action_just_pressed("interact") && globalVariables.menuOpen == false): + # If so, we'll call interaction_interact() if our target supports it + if (interaction_target.has_method("interaction_interact")): + interaction_target.interaction_interact(self) + + +# Signal triggered when our collider collides with something on the interaction layer +func _on_InteractionComponent_body_entered(body): + + var canInteract := false + + # GDScript lacks the concept of interfaces, so we can't check whether the body implements an interface + # Instead, we'll see if it has the methods we need + if (body.has_method("interaction_can_interact")): + # Interactables tell us whether we're allowed to interact with them. + canInteract = body.interaction_can_interact(get_node(interaction_parent)) + + if not canInteract: + return + + # Store the thing we'll be interacting with, so we can trigger it from _process + interaction_target = body + emit_signal("on_interactable_changed", interaction_target) + + +func _on_InteractionComponent_body_exited(body): + if (body == interaction_target): + interaction_target = null + emit_signal("on_interactable_changed", null) diff --git a/Godette-Tale/Scripts/Player/Player.gd b/Godette-Tale/Scripts/Player/Player.gd new file mode 100644 index 0000000..934dee4 --- /dev/null +++ b/Godette-Tale/Scripts/Player/Player.gd @@ -0,0 +1,135 @@ +extends KinematicBody2D +class_name Player + +#var curHp : int = 10 +#var maxHp : int = 10 +var moveSpeed : int = 192 +#var damage : int = 1 + +#var gold : int = 0 + +#var curLevel : int = 0 +#var curXp : int = 0 +#var xpToNextLevel : int = 50 +#var xpToLevelIncreaseRate : float = 1.2 + +var vel : Vector2 = Vector2() +var facingDir : Vector2 = Vector2() + +onready var dialogue = get_node("/root/Root_Node/CanvasLayer/panel") +onready var save = get_node("/root/Root_Node/CanvasLayer/savePanel") +onready var menu = get_node("/root/Root_Node/CanvasLayer/infoPanel") + +func _ready(): + self.set_position(SceneChanger._playerPosition) #After transitioning to a new scene go to the preset position for that transition mask + +func _physics_process (delta): + + vel = Vector2() + + # inputs + var isMoving : bool = false + if !dialogue.is_visible() && !save.is_visible() && !menu.is_visible(): + var isDiagonal: bool = false + if Input.is_action_pressed("move_up"): + vel.y -= 1 + facingDir = Vector2(0, -1) + isMoving = true + if Input.is_action_pressed("move_down"): + vel.y += 1 + facingDir = Vector2(0, 1) + isMoving = true + if Input.is_action_pressed("move_left"): + vel.x -= 1 + facingDir = Vector2(-1, 0) + isMoving = true + if Input.is_action_pressed("move_right"): + vel.x += 1 + facingDir = Vector2(1, 0) + isMoving = true + + # Direction Conflict Handling + if Input.is_action_pressed("move_up") && Input.is_action_pressed("move_down") && vel.x == 1: #player velocity is right + vel.y -= 1 + facingDir = Vector2(1, 0) + isMoving = true + elif Input.is_action_pressed("move_up") && Input.is_action_pressed("move_down") && vel.x == -1: #player velocity is left + vel.y -= 1 + facingDir = Vector2(-1, 0) + isMoving = true + elif Input.is_action_pressed("move_up") && Input.is_action_pressed("move_down"): + vel.y -= 1 + facingDir = Vector2(0, -1) + isMoving = true + + if Input.is_action_pressed("move_left") && Input.is_action_pressed("move_right") && vel.y == 1: #player velocity is down + vel.x -= 1 + facingDir = Vector2(0, 1) #face up + isMoving = true + elif Input.is_action_pressed("move_left") && Input.is_action_pressed("move_right") && vel.y == -1: #player velocity is up + vel.x -= 1 + facingDir = Vector2(0, -1) #face down + isMoving = true + elif Input.is_action_pressed("move_left") && Input.is_action_pressed("move_right"): + vel.x -= 1 + facingDir = Vector2(-1, 0) + isMoving = true + + + if isMoving: + var currentAnim = $AnimationPlayer.current_animation + if Input.is_action_pressed("move_up") && Input.is_action_pressed("move_left") && !Input.is_action_pressed("move_down") && !Input.is_action_pressed("move_right"): #Up Left + isDiagonal = true + if currentAnim != "Left" and currentAnim != "Up": + $AnimationPlayer.play("Up") + if $AnimationPlayer.current_animation == "Up": + $AnimationPlayer.play("Up") + if $AnimationPlayer.current_animation == "Left": + $AnimationPlayer.play("Left") + if Input.is_action_pressed("move_up") && Input.is_action_pressed("move_right") && !Input.is_action_pressed("move_down") && !Input.is_action_pressed("move_left"): #Up Right + isDiagonal = true + if currentAnim != "Right" and currentAnim != "Up": + $AnimationPlayer.play("Up") + if $AnimationPlayer.current_animation == "Up": + $AnimationPlayer.play("Up") + if $AnimationPlayer.current_animation == "Right": + $AnimationPlayer.play("Right") + if Input.is_action_pressed("move_down") && Input.is_action_pressed("move_left") && !Input.is_action_pressed("move_up") && !Input.is_action_pressed("move_right"): #Down Left + isDiagonal = true + if currentAnim != "Down" and currentAnim != "Left": + $AnimationPlayer.play("Down") + if $AnimationPlayer.current_animation == "Down": + $AnimationPlayer.play("Down") + if $AnimationPlayer.current_animation == "Left": + $AnimationPlayer.play("Left") + if Input.is_action_pressed("move_down") && Input.is_action_pressed("move_right") && !Input.is_action_pressed("move_up") && !Input.is_action_pressed("move_left"): #Down Right + isDiagonal = true + if currentAnim != "Down" and currentAnim != "Right": + $AnimationPlayer.play("Down") + if $AnimationPlayer.current_animation == "Down": + $AnimationPlayer.play("Down") + if $AnimationPlayer.current_animation == "Right": + $AnimationPlayer.play("Right") + if !isDiagonal: + if facingDir == Vector2(0, -1): #Up + if $AnimationPlayer.current_animation != "Up": + $AnimationPlayer.play("Up") + if facingDir == Vector2(0, 1): #Down + if $AnimationPlayer.current_animation != "Down": + $AnimationPlayer.play("Down") + if facingDir == Vector2(-1, 0): #Left + if $AnimationPlayer.current_animation != "Left": + $AnimationPlayer.play("Left") + if facingDir == Vector2(1, 0): #Right + if $AnimationPlayer.current_animation != "Right": + $AnimationPlayer.play("Right") + #normalize the velocity to prevent faster diagonal movement + vel = vel.normalized() + + # move the player + move_and_slide(vel * moveSpeed) + + # stop walk animation when standing still + if(!isMoving): + $AnimationPlayer.stop() + $AnimationPlayer.seek(0.8, true) diff --git a/Godette-Tale/Scripts/Puzzles/Button.gd b/Godette-Tale/Scripts/Puzzles/Button.gd new file mode 100644 index 0000000..a712d5d --- /dev/null +++ b/Godette-Tale/Scripts/Puzzles/Button.gd @@ -0,0 +1,28 @@ +extends Area2D +export var strSignal : String #String ID and activationLocation can be set in the inspector +export(String, FILE, "*.tscn") var activationLocation #Default_Value: "Current Scene" #A button can trigger something in a different scene with this setting +var is_pressed := false +var aryDump : Array + +func _ready(): + if !activationLocation: #if there's no alternate location set + activationLocation = get_tree().current_scene.filename #set it to the current scene + if globalVariables.objectList.has(str(get_tree().current_scene.filename)): #continue if there are pressed buttons found in this scene + aryDump = globalVariables.objectList[str(get_tree().current_scene.filename)].split(", ") #turn the array into a string + if aryDump.find(self.name) != -1: #check if the array contains the current node's name + $Sprite.set_frame(1) #button is visibly pressed + is_pressed = !is_pressed #is_pressed = true + +func _on_Button_body_entered(body): #on button pressed + if body is Player && !is_pressed: + signalManager.emit_signal("object_activated", strSignal) #send signal with unique stringID + $Sprite.set_frame(1) #button is visibly pressed + is_pressed = !is_pressed #is_prssed = true + if !globalVariables.activationList.has(str(activationLocation)): #if there are no activations found in this scene + globalVariables.activationList[str(activationLocation)] = strSignal #save new scene with new activation + else: #if there are previous activations found in this scene + globalVariables.activationList[str(activationLocation)] += ", " + strSignal #save this activation along with all previous activations found in this scene + if !globalVariables.objectList.has(str(get_tree().current_scene.filename)): #if there are no activated objects found in this scene + globalVariables.objectList[str(get_tree().current_scene.filename)] = self.name #save new scene with new activated object name + else: #if there are previously activated objects found in this scene + globalVariables.objectList[str(get_tree().current_scene.filename)] += ", " + self.name #save this object along with all previous objects found in this scene diff --git a/Godette-Tale/Scripts/Puzzles/Door.gd b/Godette-Tale/Scripts/Puzzles/Door.gd new file mode 100644 index 0000000..1a6aa9f --- /dev/null +++ b/Godette-Tale/Scripts/Puzzles/Door.gd @@ -0,0 +1,18 @@ +extends StaticBody2D +export(Array, String) var aryActivationPhrases #Strings that'll be accepted as one of the 'activation(s)' +export var intMaxActivationCount : int #Amount of signals required before opening +var intActivationCount : int = 0 #Amount of acceptable signals receieved + +func _ready(): + signalManager.connect("object_activated", self, "_on_object_activated") + if globalVariables.activationList.has(str(get_tree().current_scene.filename)): #Check if there are any objects already activated in this scene + for item in globalVariables.activationList[str(get_tree().current_scene.filename)].split(", "): #Loop through all saved activation phrases + _on_object_activated(str(item)) #Send saved phrases through function + +func _on_object_activated(s): + #print(s) + if str(s) in aryActivationPhrases: #Check if received signal is acceptable + intActivationCount += 1 #Count the activation + if intMaxActivationCount == intActivationCount: + self.hide() #Hide the door + $CollisionShape2D.set_deferred("disabled", true) #Turn off the collider diff --git a/Godette-Tale/Scripts/Puzzles/Lever.gd b/Godette-Tale/Scripts/Puzzles/Lever.gd new file mode 100644 index 0000000..35a728e --- /dev/null +++ b/Godette-Tale/Scripts/Puzzles/Lever.gd @@ -0,0 +1,32 @@ +extends StaticBody2D +export var strSignal : String #String ID and activationLocation can be set in the inspector +export(String, FILE, "*.tscn") var activationLocation #Default_Value: "Current Scene" #A button can trigger something in a different scene with this setting +var is_pulled := false +var aryDump : Array + +func _ready(): + if !activationLocation: #if there's no alternate location set + activationLocation = get_tree().current_scene.filename #set it to the current scene + if globalVariables.objectList.has(str(get_tree().current_scene.filename)): #contiune if there are pulled levers found in this scene + aryDump = globalVariables.objectList[str(get_tree().current_scene.filename)].split(", ") + if aryDump.find(self.name) != -1: #check if self is one of the pulled levers + $Sprite.set_frame(3) #lever is visibly pulled + is_pulled = !is_pulled #is_pulled = true + +# By default interactable items are only available to the Player class +func interaction_can_interact(interactionComponentParent : Node) -> bool: + return interactionComponentParent is Player + +func interaction_interact(interactionComponentParent : Node) -> void: #on lever pull attempt + if !is_pulled: #if lever hasn't been pulled yet + signalManager.emit_signal("object_activated", strSignal) #send signal with unique stringID + $Sprite.set_frame(3) #lever is visibly pulled, frame 2 is the "unpulled" variant + is_pulled = !is_pulled #is_pulled = true + if !globalVariables.activationList.has(str(activationLocation)): #if there are no activations found in this scene + globalVariables.activationList[str(activationLocation)] = strSignal #save new scene with new activation + else: #if there are previous activations found in this scene + globalVariables.activationList[str(activationLocation)] += ", " + strSignal #save this activation along with all previous activations found in this scene + if !globalVariables.objectList.has(str(get_tree().current_scene.filename)): #if there are no activated objects found in this scene + globalVariables.objectList[str(get_tree().current_scene.filename)] = self.name #save new scene with new activated object name + else: #if there are previously activated objects found in this scene + globalVariables.objectList[str(get_tree().current_scene.filename)] += ", " + self.name #save this object along with all previous objects found in this scene diff --git a/Godette-Tale/Scripts/Puzzles/Spikes.gd b/Godette-Tale/Scripts/Puzzles/Spikes.gd new file mode 100644 index 0000000..f5a40d1 --- /dev/null +++ b/Godette-Tale/Scripts/Puzzles/Spikes.gd @@ -0,0 +1,17 @@ +extends StaticBody2D +export(Array, String) var aryActivationPhrases #Strings that'll be accepted one of the 'activation(s)' +export var intMaxActivationCount : int #Amount of signals required before opening +var intActivationCount : int = 0 #Amount of signals recieved + +func _ready(): + signalManager.connect("object_activated", self, "_on_object_activated") + if globalVariables.activationList.has(str(get_tree().current_scene.filename)): #Check if there are any objects already activated in this scene + for item in globalVariables.activationList[str(get_tree().current_scene.filename)].split(", "): #Loop through all saved activation phrases + _on_object_activated(str(item)) #Send saved phrases through function + +func _on_object_activated(s): + if str(s) in aryActivationPhrases: #Check if received signal is acceptable + intActivationCount += 1 #Count the activation + if intMaxActivationCount == intActivationCount: + $Sprite.set_frame(5) #Visually retract spikes + $CollisionShape2D.set_deferred("disabled", true) #Turn off the collider diff --git a/Godette-Tale/Scripts/Save.gd b/Godette-Tale/Scripts/Save.gd new file mode 100644 index 0000000..27941a1 --- /dev/null +++ b/Godette-Tale/Scripts/Save.gd @@ -0,0 +1,81 @@ +extends Panel + +onready var choice : int = 1 +onready var currentChoice = get_node("Option " + str(choice) + "/Cursor") +onready var isActive : bool = false + +func _ready(): + signalManager.connect("buff_signal", self, "_on_buff_signal_activated") + signalManager.connect("save_update", self, "_on_save_update_activated") + +func ShowSavePanelWithSelector(): + $HBoxContainer/Name.text = globalVariables.Name + $HBoxContainer2/Level.text = "LV"+str(globalVariables.Love) + $HBoxContainer3/Time.text = globalVariables.previousTimeFormatted + $Description.text = globalVariables.roomDescription + $HBoxContainer/Name.add_color_override("font_color", Color(1,1,1)) + $HBoxContainer2/Level.add_color_override("font_color", Color(1,1,1)) + $HBoxContainer3/Time.add_color_override("font_color", Color(1,1,1)) + $Description.add_color_override("font_color", Color(1,1,1)) + $"Option 1".add_color_override("font_color", Color(1,1,1)) + $"Option 1".text = "Save" + $"Option 1/Cursor".show() + $"Option 2".show() + $"Option 2/Cursor".hide() + self.show() + isActive = true + +func _on_buff_signal_activated(s): + if s == "openSavePanel": + ShowSavePanelWithSelector() + +func _on_save_update_activated(): + ShowSavePanelWithSelector() + +func _input(ev): + if !isActive && self.is_visible() && Input.is_action_just_pressed("interact"): + self.hide() + if isActive && Input.is_action_just_pressed("move_left") || isActive && Input.is_action_just_pressed("move_right") || isActive && Input.is_action_just_pressed("interact"): + currentChoice = get_node("Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_LEFT: # If left arrow is pressed + if choice != 1: + currentChoice.hide() + choice -= 1 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 2 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_RIGHT: # If right arrow is pressed + if choice != 2: + currentChoice.hide() + choice += 1 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + else: # If Enter is pressed + if choice == 1: #Save + globalVariables.funcSave() + $AudioStreamPlayer.stream = load("res://Assets/Sound Effects/SavePoint.wav") + $AudioStreamPlayer.play() + $HBoxContainer/Name.add_color_override("font_color", Color(1,1,0)) + $HBoxContainer2/Level.add_color_override("font_color", Color(1,1,0)) + $HBoxContainer3/Time.add_color_override("font_color", Color(1,1,0)) + $Description.add_color_override("font_color", Color(1,1,0)) + $"Option 1".add_color_override("font_color", Color(1,1,0)) + $"Option 1".text = "File saved." + $"Option 1/Cursor".hide() + $"Option 2".hide() + $"Option 2/Cursor".hide() + isActive = false + if choice == 2: #Return + self.hide() + isActive = false + pass + #send signal diff --git a/Godette-Tale/Scripts/Shops/ABC_123_A_ShopExample.gd b/Godette-Tale/Scripts/Shops/ABC_123_A_ShopExample.gd new file mode 100644 index 0000000..029b62d --- /dev/null +++ b/Godette-Tale/Scripts/Shops/ABC_123_A_ShopExample.gd @@ -0,0 +1,209 @@ +extends Node2D + +onready var tieInter = get_node("/root/Root_Node/InterPanel/InterPanelText") +onready var tieBuy = get_node("/root/Root_Node/BuyPanel/BuyPanelText") +onready var tieInfo = get_node("/root/Root_Node/BuyPanel/InfoPanel/InfoPanelText") +onready var shopkeeperSprite : Sprite = get_node("Shopkeeper") +onready var shopkeeperAnim = get_node("Shopkeeper/AnimationPlayer") +onready var lastTypesound : String + +# I coded it so you can change max inventory size in globalVariables.gd and +# everything will still work, you might need to change the font-size, and +# change the sellElementPerColumn or make the menu panel bigger for it to +# look good but no errors/crashes will occur if you make the inventory larger. + +# Shop Variables +var isSelling : bool = true # Does this shopkeeper buy player items? +var soldLabel : String = "SOLD" #What is displayed in lieu of an item after you sell it +var sellElementPerColumn : int = 4 # This changes how many inventory items are displayed per colunm in the sell menu +func _init(): # More shop variables + globalVariables.talkList = ["The void","The strange man"] + globalVariables.shopInventory = [2, 3, 0, 1] # ItemIDs for items the shopkeeper will sell + +func _on_talk_choice(s): # You link your talkList strings to functions that contain your dialogue here. + if s == "The void": + example() + if s == "The strange man": + example() + +func example(): # This is a function that displays dialogue + if get_node("/root/Root_Node/InterPanel/talkOptions").is_visible(): + get_node("/root/Root_Node/InterPanel/talkOptions").hide() + tieInter.reset() + tieInter.NPCid("Example") + tieInter.set_color(Color(1,1,1)) + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieInter.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInter.buff_text("* ...", 0.1) + tieInter.buff_silence(1) + tieInter.buff_text(" you wouldn't want to know.", 0.1) + tieInter.buff_break() + tieInter.buff_clear() + tieInter.buff_signal("talkEnd") + tieInter.buff_face("res://Assets/Expressions/None.png") + tieInter.set_state(tieInter.STATE_OUTPUT) + +func _ready() -> void: + signalManager.connect("talk", self, "_on_talk_choice") + signalManager.connect("buff_signal", self, "_on_buff_signal_activated") + tieInter.connect("buff_end", self, "_on_buff_end") + tieInter.connect("typesound", self, "_on_Typesound") + tieBuy.connect("typesound", self, "_on_Typesound") + tieInter.connect("buff_end", self, "_on_stop_type") + tieInter.connect("enter_break", self, "_on_stop_type") + tieBuy.connect("buff_end", self, "_on_stop_type") + tieBuy.connect("enter_break", self, "_on_stop_type") + greeting() + +func _on_Typesound(s): #when shopkeeper is talking, filtered by npcid + if s == "Example": # This is the NPC ID, it's used to differentiate who is currently speaking. + #lastTypesound = s + shopkeeperAnim.play("Speaking", 0) + #if shopkeeperSprite.get_frame() == 0: + # shopkeeperSprite.set_frame(1) + #else: + # shopkeeperSprite.set_frame(0) + +func _on_stop_type(): #when shopkeeper stops talking + print("stop") + #if lastTypesound == "Example": + #pass + #shopkeeperSprite.set_frame(0) + +func infoText(x): + tieInfo.reset() + tieInfo.set_color(Color(1,1,1)) + tieInfo.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Shop.tres") + tieInfo.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInfo.buff_text(x, 0) + tieInfo.set_state(tieInter.STATE_OUTPUT) + +func greeting(): + tieInter.reset() + tieInter.NPCid("Example") + tieInter.set_color(Color(1,1,1)) + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieInter.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInter.buff_text("* Greetings", 0.05) + tieInter.set_state(tieInter.STATE_OUTPUT) + +func rtrnGreeting(): + tieInter.reset() + tieInter.NPCid("Example") + tieInter.set_color(Color(1,1,1)) + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieInter.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInter.buff_text("* Go on", 0.05) + tieInter.set_state(tieInter.STATE_OUTPUT) + +func buyGreet(): + tieBuy.reset() + tieBuy.NPCid("Example") + tieBuy.set_color(Color(1,1,1)) + tieBuy.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieBuy.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieBuy.buff_text("What would\nyou like?", 0.05) + tieBuy.set_state(tieInter.STATE_OUTPUT) + +func rtrnBuyGreet(): + tieBuy.reset() + tieBuy.NPCid("Example") + tieBuy.set_color(Color(1,1,1)) + tieBuy.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieBuy.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieBuy.buff_text("Just\nbrowsing?", 0.05) + tieBuy.set_state(tieInter.STATE_OUTPUT) + +func buyReact(x): + tieBuy.reset() + tieBuy.NPCid("Example") + tieBuy.set_color(Color(1,1,1)) + tieBuy.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieBuy.buff_typesound("res://addons/GodotTIE/Generic.wav") + match(x): + "Not enough gold": + tieBuy.buff_text("That's not\nenough\nmoney.", 0.05) + "Not enough inventory": + tieBuy.buff_text("Your\ninventory\nis full.", 0.05) + "Item purchased": + tieBuy.buff_text("Come\nagain!", 0.05) + tieBuy.set_state(tieInter.STATE_OUTPUT) + + # Check gold + # > Not enough gold message + # Check inventory space + # > Not space message + # Subtract gold + # > Item purchased message + # Add item + +func notSelling(): + tieInter.reset() + tieInter.NPCid("Example") + tieInter.set_color(Color(1,1,1)) + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieInter.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInter.buff_text("* I'm not buying.", 0.05) + tieInter.set_state(tieInter.STATE_OUTPUT) + +func noItemsToSell(): + tieInter.reset() + tieInter.NPCid("Example") + tieInter.set_color(Color(1,1,1)) + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieInter.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInter.buff_text("* You don't have any\n items.", 0.05) + tieInter.set_state(tieInter.STATE_OUTPUT) + +func talkGreet(): + tieBuy.reset() + tieBuy.NPCid("Example") + tieBuy.set_color(Color(1,1,1)) + tieBuy.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieBuy.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieBuy.buff_text("Care to\nchat?", 0.05) + tieBuy.set_state(tieBuy.STATE_OUTPUT) + +func _on_buff_signal_activated(s): + if s == "comic sans": + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/Comic-Sans-UT.tres") + if s == "talkEnd": + get_node("/root/Root_Node/InterPanel/talkOptions").show() + tieBuy.reset() + tieBuy.NPCid("Example") + tieBuy.set_color(Color(1,1,1)) + tieBuy.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieBuy.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieBuy.buff_text("Anything\nelse?", 0.05) + tieBuy.set_state(tieBuy.STATE_OUTPUT) + pass + +func _on_buff_end(): + get_node("/root/Root_Node/BuyPanel").disableMenu = false + get_node("/root/Root_Node/BuyPanel").show() + +func clear(): + tieInter.reset() + tieInter.buff_clear() + tieInter.set_state(tieInter.STATE_OUTPUT) + tieBuy.reset() + tieBuy.buff_clear() + tieBuy.set_state(tieInter.STATE_OUTPUT) + +func buyTalk(x): + tieBuy.reset() + tieBuy.NPCid("Example") + tieBuy.set_color(Color(1,1,1)) + tieBuy.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieBuy.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieBuy.buff_text(x, 0.1) + tieBuy.set_state(tieInter.STATE_OUTPUT) + +func interTalk(x): + tieInter.reset() + tieInter.NPCid("Example") + tieInter.set_color(Color(1,1,1)) + tieInter.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + tieInter.buff_typesound("res://addons/GodotTIE/Generic.wav") + tieInter.buff_text(x, 0.1) + tieInter.set_state(tieInter.STATE_OUTPUT) diff --git a/Godette-Tale/Scripts/Shops/InfoTween.gd b/Godette-Tale/Scripts/Shops/InfoTween.gd new file mode 100644 index 0000000..41040ac --- /dev/null +++ b/Godette-Tale/Scripts/Shops/InfoTween.gd @@ -0,0 +1,14 @@ +extends Panel + +onready var tween = $Tween + +func appear(): + print("appear") + tween.interpolate_property(self, "rect_position:y", 0, -162, + 0.5, Tween.TRANS_QUART, Tween.EASE_IN_OUT) + tween.start() + +func disappear(): + tween.interpolate_property(self, "rect_position:y", -162, 0, + 0.5, Tween.TRANS_QUART, Tween.EASE_IN_OUT) + tween.start() diff --git a/Godette-Tale/Scripts/Shops/ShopLogic.gd b/Godette-Tale/Scripts/Shops/ShopLogic.gd new file mode 100644 index 0000000..9b800f4 --- /dev/null +++ b/Godette-Tale/Scripts/Shops/ShopLogic.gd @@ -0,0 +1,326 @@ +extends Panel + +# I coded it so you can change max inventory size in globalVariables and +# everything will work, you might need to change font-size, change the +# sellElementPerColumn or make the menu panel bigger for it to look good +# but no errors/crashes will occur if you make the inventory larger. + +# Don't change any of these variables unless you know what you're doing +onready var disableMenu : bool = false # Used by the shop talk menu during dialogue +onready var choice : int = 1 +onready var choiceRtn : int +onready var choiceSize : int = 4 +onready var loopCount : int = 0 +onready var tempNode +onready var currentChoice = get_node("Option " + str(choice) + "/Cursor") +onready var menuEntryScene = load("res://Prefabs/_MenuEntry.tscn") +onready var sellOptionsScene = load("res://Prefabs/_SellOptions.tscn") +onready var maxInventorySize = globalVariables.inventorySize + +# Sell Variables +# You can change soldLabel and SellElementPerColumn in the root node of the shop, the rest are used by the code. +onready var soldLabel : String = get_node("/root/Root_Node").soldLabel #What is displayed in lieu of an item after you sell it +onready var sellElementPerColumn : int = get_node("/root/Root_Node").sellElementPerColumn # This changes many inventory items are displayed per colunm in the sell menu +onready var sellColumnsSize : int +onready var sellColumnsChoice : int = 1 +onready var sellChoice : int = 0 # This gives you a number that is compatible with the index of the globalVariables.Items[] array +onready var sellElementsPerColumnSize : float +onready var lastSellColumnSize : int +onready var soldItems : Array = globalVariables.Items.duplicate() + +# Menu Variables +# You can change the isSelling variable in the root node of the shop to Disable or Enable the sell menu. +onready var choiceExtend : String = "" +onready var choiceExtendCopy : String = "" +onready var talkActive : bool = false +onready var isSelling : bool = get_node("/root/Root_Node").isSelling + +func _ready(): + $"../InterPanel/sellGrid".columns = int(ceil(float(maxInventorySize)/sellElementPerColumn)) + get_node("Gold").text = str(globalVariables.Gold) + "G" + get_node("Space").text = str(globalVariables.Items.size()) + "/" + str(maxInventorySize) + for item in globalVariables.talkList: #Initialize talk choices + loopCount += 1 + var menuEntry = menuEntryScene.instance() + $"../InterPanel/talkOptions".add_child(menuEntry, true) + tempNode = get_node("../InterPanel/talkOptions/Option " + str(loopCount)) + tempNode.text = item + loopCount = 0 + for item in globalVariables.shopInventory: #Initialize buy choices + loopCount += 1 + var menuEntry = menuEntryScene.instance() + $"../InterPanel/buyOptions".add_child(menuEntry, true) + tempNode = get_node("../InterPanel/buyOptions/Option " + str(loopCount)) + tempNode.text = str(itemLibrary.itemDictionary[item].buyPrice) + "G - " + itemLibrary.itemDictionary[item].itemName + +func updateSellMenu(): + if globalVariables.Items.size() > 0: # If you have more than 0 items + loopCount = soldItems.size()-1 + while loopCount != -1: + if str(soldItems[loopCount]) == "SOLD_ITEM": + globalVariables.Items.remove(loopCount) # remove sold items from inventory + loopCount -= 1 + soldItems = globalVariables.Items.duplicate() + loopCount = 0 + var loopCountToFive = 0 + for item in soldItems: #Initialize buy choices + loopCount += 1 + loopCountToFive += 1 + if get_node_or_null("../InterPanel/sellGrid/sellOptions " + str(ceil(float(loopCount)/sellElementPerColumn))) == null: + var sellOptionsEntry = sellOptionsScene.instance() + get_node("../InterPanel/sellGrid").add_child(sellOptionsEntry, true) + loopCountToFive = 1 + var menuEntry = menuEntryScene.instance() + get_node("../InterPanel/sellGrid/sellOptions " + str(ceil(float(loopCount)/sellElementPerColumn))).add_child(menuEntry, true) + tempNode = get_node("../InterPanel/sellGrid/sellOptions " + str(ceil(float(loopCount)/sellElementPerColumn)) + "/Option " + str(loopCountToFive)) + if str(item) != "SOLD_ITEM": #item isn't sold + tempNode.text = str(itemLibrary.itemDictionary[item].sellPrice) + "G - " + itemLibrary.itemDictionary[item].itemName + else: #item is sold + tempNode.text = soldLabel + tempNode.add_color_override("font_color", Color(0.35,0.35,0.35)) + sellColumnsSize = get_node("../InterPanel/sellGrid").get_child_count() + sellElementsPerColumnSize = floor(globalVariables.Items.size()/sellElementPerColumn) + lastSellColumnSize = globalVariables.Items.size()-(sellElementPerColumn*sellElementsPerColumnSize) + +func updateChoice(upDownLeftRight, maxOptions): + if currentChoice != null: + currentChoice.hide() + if sellColumnsChoice == sellColumnsSize && "sellGrid" in choiceExtend: + if upDownLeftRight == "up": + if choice == 1: + choice = lastSellColumnSize + else: + choice -= 1 + if upDownLeftRight == "down": + if choice == lastSellColumnSize: + choice = 1 + else: + choice += 1 + else: + if upDownLeftRight == "up": + if choice == 1: + choice = maxOptions + else: + choice -= 1 + if upDownLeftRight == "down": + if choice == maxOptions: + choice = 1 + else: + choice += 1 + #changeMenu(choiceRtn, globalVariables.Items.size(), "../InterPanel/sellGrid/sellOptions " + str(sellColumnsChoice) + "/") + if upDownLeftRight == "left" && choiceExtend == "../InterPanel/SellOptionHBox/": + if choice == 1: + choice = 2 + else: + choice -= 1 + if upDownLeftRight == "right" && choiceExtend == "../InterPanel/SellOptionHBox/": + if choice == 2: + choice = 1 + else: + choice += 1 + if upDownLeftRight == "left" && choiceExtendCopy == "../InterPanel/sellGrid/sellOptions ": + if sellColumnsChoice == 1: + sellColumnsChoice = sellColumnsSize + else: + sellColumnsChoice -= 1 + choiceExtend = choiceExtendCopy + str(sellColumnsChoice) + "/" + if upDownLeftRight == "right" && choiceExtendCopy == "../InterPanel/sellGrid/sellOptions ": + if sellColumnsChoice == sellColumnsSize: + sellColumnsChoice = 1 + else: + sellColumnsChoice += 1 + choiceExtend = choiceExtendCopy + str(sellColumnsChoice) + "/" + currentChoice = get_node_or_null(choiceExtend + "Option " + str(choice) + "/Cursor") + if currentChoice != null: + currentChoice.show() + else: + sellColumnsChoice -= 1 + choiceExtend = choiceExtendCopy + str(sellColumnsChoice) + "/" + currentChoice = get_node_or_null(choiceExtend + "Option " + str(choice) + "/Cursor") + if currentChoice != null: + currentChoice.show() + +func shopButtonVisiblity(x): + if x == false: + get_node("Option 1").hide() + get_node("Option 2").hide() + get_node("Option 3").hide() + get_node("Option 4").hide() + if x == true: + get_node("Option 1").show() + get_node("Option 2").show() + get_node("Option 3").show() + get_node("Option 4").show() + +func changeMenu(goToChoice, choiceSizeInt, choiceNode): + currentChoice.hide() + choiceSize = choiceSizeInt + choiceExtend = choiceNode + choiceExtendCopy = choiceNode.rstrip("0123456789/") + choice = goToChoice + currentChoice = get_node(choiceExtend + "Option " + str(choice) + "/Cursor") + get_node(choiceExtend + "Option " + str(choice) + "/Cursor").show() + +func infoTextGen(): + var infoTextData : String = "" + var currentItem = itemLibrary.itemDictionary[globalVariables.shopInventory[(choice-1)]] + match(itemLibrary.itemDictionary[globalVariables.shopInventory[(choice-1)]].itemType): + 0: # Key item + infoTextData = currentItem.shopDescription + 1: # Consumable Item + infoTextData = currentItem.shopDescription + 2: # Weapon + infoTextData = "Weapon: " + str(currentItem.itemAttack) + "AT\n(" + str(currentItem.itemAttack-globalVariables.PlayerAT) + "AT)\n" + currentItem.shopDescription + 3: # Armor + infoTextData = "Armor: " + str(currentItem.itemDefence) + "DF\n(" + str(currentItem.itemDefence-globalVariables.PlayerDF) + "DF)\n" + currentItem.shopDescription + return infoTextData +# Buy +# Sell +# Talk +# Exit + +func _input(ev): + if !disableMenu: + if Input.is_action_just_pressed("move_up") || Input.is_action_just_pressed("move_down") || Input.is_action_just_pressed("move_right") || Input.is_action_just_pressed("move_left") || Input.is_action_just_pressed("interact") || Input.is_action_just_pressed("open_menu"): # menu interactions + if ev.scancode == KEY_UP && choiceExtendCopy != "../InterPanel/SellOptionHBox": # If up arrow is pressed + updateChoice("up", choiceSize) + if choiceExtend == "../InterPanel/buyOptions/": + get_node("../../Root_Node").infoText(infoTextGen()) + elif ev.scancode == KEY_DOWN && choiceExtendCopy != "../InterPanel/SellOptionHBox": # If down arrow is pressed + updateChoice("down", choiceSize) + if choiceExtend == "../InterPanel/buyOptions/": + get_node("../../Root_Node").infoText(infoTextGen()) + elif ev.scancode == KEY_DOWN: + pass + elif ev.scancode == KEY_UP: + pass + elif ev.scancode == KEY_LEFT: # If left arrow is pressed + if choiceExtendCopy == "../InterPanel/sellGrid/sellOptions " || choiceExtendCopy == "../InterPanel/SellOptionHBox": + updateChoice("left", sellColumnsSize) + elif ev.scancode == KEY_RIGHT: # If right arrow is pressed + if choiceExtendCopy == "../InterPanel/sellGrid/sellOptions " || choiceExtendCopy == "../InterPanel/SellOptionHBox": + updateChoice("right", sellColumnsSize) + elif ev.scancode == KEY_C: # kind of like a back button + if choiceExtend != "": + get_node("../../Root_Node").clear() + if choiceExtend == "../InterPanel/buyOptions/": # Exit Buy Menu + $InfoPanel.disappear() + shopButtonVisiblity(true) + get_node("../InterPanel/buyOptions").hide() + changeMenu(1, 4, "") + get_node("../../Root_Node").rtrnGreeting() + elif choiceExtendCopy == "../InterPanel/sellGrid/sellOptions ": # Exit Sell Menu + shopButtonVisiblity(true) + self.show_behind_parent = false + sellChoice = 0 + sellColumnsChoice = 1 + lastSellColumnSize = 0 + sellColumnsSize = 0 + get_node("../InterPanel/sellGrid").hide() + changeMenu(2, 4, "") + get_node("../../Root_Node").rtrnGreeting() + for n in get_node("../InterPanel/sellGrid").get_children(): + get_node("../InterPanel/sellGrid").remove_child(n) + n.queue_free() + updateSellMenu() + get_node("Space").text = str(globalVariables.Items.size()) + "/" + str(maxInventorySize) + elif choiceExtend == "../InterPanel/talkOptions/": # Exit Talk Menu + shopButtonVisiblity(true) + get_node("../InterPanel/talkOptions").hide() + changeMenu(3, 4, "") + get_node("../../Root_Node").rtrnGreeting() + elif choiceExtend == "ConfirmPrompt/": # Exit confirmprompt Menu + changeMenu(choiceRtn, globalVariables.shopInventory.size(), "../InterPanel/buyOptions/") + choiceRtn = 0 + get_node("ConfirmPrompt").hide() + get_node("../../Root_Node").rtrnBuyGreet() + else: #enter is pressed + get_node("../../Root_Node").clear() + if choice == 1 && choiceExtend == "": # Buy Menu + $InfoPanel.appear() + get_node("../InterPanel/buyOptions").show() + shopButtonVisiblity(false) + changeMenu(1, globalVariables.shopInventory.size(), "../InterPanel/buyOptions/") + get_node("../../Root_Node").infoText(infoTextGen()) + get_node("../../Root_Node").buyGreet() + elif choice == 2 && choiceExtend == "": # Sell Menu + if isSelling && globalVariables.Items.size() > 0: # if selliing and has items + for n in get_node("../InterPanel/sellGrid").get_children(): + get_node("../InterPanel/sellGrid").remove_child(n) + n.queue_free() + updateSellMenu() + get_node("../InterPanel/sellGrid").show() + shopButtonVisiblity(false) + if sellElementPerColumn <= globalVariables.Items.size(): + changeMenu(1, sellElementPerColumn, "../InterPanel/sellGrid/sellOptions 1/") + else: + changeMenu(1, globalVariables.Items.size(), "../InterPanel/sellGrid/sellOptions 1/") + sellChoice = 0 + self.show_behind_parent = true + elif isSelling && globalVariables.Items.size() == 0: # if selling but inventory empty + get_node("../../Root_Node").noItemsToSell() # dialogue saying inventory empty + else: # if not selling + get_node("../../Root_Node").notSelling() # dialogue saying not selling + elif choice == 3 && choiceExtend == "": # Talk Menu + get_node("../InterPanel/talkOptions").show() + shopButtonVisiblity(false) + changeMenu(1, globalVariables.talkList.size(), "../InterPanel/talkOptions/") + get_node("../../Root_Node").talkGreet() + elif choice == 4 && choiceExtend == "": # Exit Menu + SceneChanger.change_scene(globalVariables.exitShopScene, globalVariables.exitShopPosition, "fade") + globalVariables.exitingShop = true + elif choiceExtend == "../InterPanel/talkOptions/": # Initiate dialogue + choice -= 1 + signalManager.emit_signal("talk",globalVariables.talkList[choice]) + choice += 1 + disableMenu = true + self.hide() + elif choiceExtend == "../InterPanel/buyOptions/": # Open Buy confirm prompt + choiceRtn = choice + get_node("ConfirmPrompt").text = "Buy it for\n" + str(itemLibrary.itemDictionary[globalVariables.shopInventory[(choice-1)]].buyPrice) + "G?" + changeMenu(1, 2, "ConfirmPrompt/") + get_node("ConfirmPrompt").show() + elif choiceExtend == "ConfirmPrompt/": # Buy confirmprompt yes or no selected + if choice == 1: # Buy confirmprompt Yes selected + if itemLibrary.itemDictionary[globalVariables.shopInventory[(choiceRtn-1)]].buyPrice <= globalVariables.Gold: + if globalVariables.Items.size() < globalVariables.inventorySize: # If you have enough gold and inventory space + get_node("../../Root_Node").buyReact("Item purchased") + globalVariables.Items.append(globalVariables.shopInventory[(choiceRtn-1)]) + soldItems.append(globalVariables.shopInventory[(choiceRtn-1)]) + globalVariables.Gold -= itemLibrary.itemDictionary[globalVariables.shopInventory[(choiceRtn-1)]].buyPrice + get_node("BuySound").play() + get_node("Gold").text = str(globalVariables.Gold) + "G" + get_node("Space").text = str(globalVariables.Items.size()) + "/" + str(globalVariables.inventorySize) + else: # Not enough inventory + get_node("../../Root_Node").buyReact("Not enough inventory") + else: # Not enough gold + get_node("../../Root_Node").buyReact("Not enough gold") + if choice == 2: # Buy confirmprompt No selected + get_node("../../Root_Node").rtrnBuyGreet() + get_node("ConfirmPrompt").hide() + changeMenu(choiceRtn, globalVariables.shopInventory.size(), "../InterPanel/buyOptions/") + elif choiceExtendCopy == "../InterPanel/sellGrid/sellOptions ": # Sell confirm prompt + if get_node_or_null(choiceExtend + "Option " + str(choice)).text != soldLabel: # If item not sold + choiceRtn = choice + sellChoice = (sellColumnsChoice - 1) * sellElementPerColumn + choiceRtn-1 # generate index of current sell choice + get_node("../InterPanel/SellLabelHBox/SellConfirmLabel").text = "Sell " + str(itemLibrary.itemDictionary[globalVariables.Items[sellChoice]].itemName) + " for " + str(itemLibrary.itemDictionary[globalVariables.Items[sellChoice]].sellPrice) + "G?" + changeMenu(1, 2, "../InterPanel/SellOptionHBox/") + get_node("../InterPanel/SellOptionHBox").show() + get_node("../InterPanel/SellLabelHBox").show() + get_node("../InterPanel/sellGrid").hide() + elif choiceExtend == "../InterPanel/SellOptionHBox/": # Sell rompt yes or no selected + if choice == 1: # sell confirmprompt Yes selected + get_node("BuySound").play() + soldItems[sellChoice] = "SOLD_ITEM" + globalVariables.Gold += itemLibrary.itemDictionary[globalVariables.Items[sellChoice]].sellPrice + get_node("Gold").text = str(globalVariables.Gold) + "G" + get_node("../InterPanel/sellGrid/sellOptions " + str(sellColumnsChoice) + "/Option " + str(choiceRtn)).text = soldLabel + get_node("../InterPanel/sellGrid/sellOptions " + str(sellColumnsChoice) + "/Option " + str(choiceRtn)).add_color_override("font_color", Color(0.35,0.35,0.35)) + #if choice == 2: # sell confirmprompt No selected (haggle code here) + get_node("../InterPanel/SellOptionHBox").hide() + get_node("../InterPanel/SellLabelHBox").hide() + get_node("../InterPanel/sellGrid").show() + shopButtonVisiblity(false) + changeMenu(choiceRtn, sellElementPerColumn, "../InterPanel/sellGrid/sellOptions " + str(sellColumnsChoice) + "/") + choiceRtn = 0 + self.show_behind_parent = true diff --git a/Godette-Tale/Scripts/Transition.gd b/Godette-Tale/Scripts/Transition.gd new file mode 100644 index 0000000..1712ece --- /dev/null +++ b/Godette-Tale/Scripts/Transition.gd @@ -0,0 +1,15 @@ +extends Area2D +export(String, FILE) var new_scene +export(Vector2) var playerPosition +export(bool) var isShop +#export(Vector2) var shopExitPosition + +func _on_Transition_body_entered(body): + if body is Player: + #print(str(get_tree().current_scene.filename)) + #print(str(new_scene)) + if isShop: + globalVariables.exitShopPosition = body.get_position() + #globalVariables.exitShopPosition = shopExitPosition + globalVariables.exitShopScene = get_tree().get_current_scene().filename + SceneChanger.change_scene(new_scene, playerPosition, "fade") diff --git a/Godette-Tale/addons/GodotTIE/Fonts/Cave-Story.tres b/Godette-Tale/addons/GodotTIE/Fonts/Cave-Story.tres new file mode 100644 index 0000000..c6dabe1 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/Cave-Story.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/Cave-Story.ttf" type="DynamicFontData" id=1] + +[resource] +size = 50 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Fonts/Cave-Story.ttf b/Godette-Tale/addons/GodotTIE/Fonts/Cave-Story.ttf new file mode 100644 index 0000000..78412a0 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Fonts/Cave-Story.ttf differ diff --git a/Godette-Tale/addons/GodotTIE/Fonts/Comic Sans UT.ttf b/Godette-Tale/addons/GodotTIE/Fonts/Comic Sans UT.ttf new file mode 100644 index 0000000..270c334 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Fonts/Comic Sans UT.ttf differ diff --git a/Godette-Tale/addons/GodotTIE/Fonts/Comic-Sans-UT.tres b/Godette-Tale/addons/GodotTIE/Fonts/Comic-Sans-UT.tres new file mode 100644 index 0000000..aa708d6 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/Comic-Sans-UT.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/Comic Sans UT.ttf" type="DynamicFontData" id=1] + +[resource] +size = 36 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Dialogue.tres b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Dialogue.tres new file mode 100644 index 0000000..cddf9cc --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Dialogue.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=1] + +[resource] +size = 27 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Shop.tres b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Shop.tres new file mode 100644 index 0000000..60980e6 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Shop.tres @@ -0,0 +1,9 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=1] + +[resource] +size = 30 +extra_spacing_char = -2 +extra_spacing_space = -10 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Text.tres b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Text.tres new file mode 100644 index 0000000..2829ad5 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono-Text.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=1] + +[resource] +size = 29 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono.tres b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono.tres new file mode 100644 index 0000000..f3b5ca3 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/DT-Mono.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/DTM-Mono.otf" type="DynamicFontData" id=1] + +[resource] +size = 23 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Fonts/DTM-Mono.otf b/Godette-Tale/addons/GodotTIE/Fonts/DTM-Mono.otf new file mode 100644 index 0000000..4135289 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Fonts/DTM-Mono.otf differ diff --git a/Godette-Tale/addons/GodotTIE/Fonts/PAPYRUS.TTF b/Godette-Tale/addons/GodotTIE/Fonts/PAPYRUS.TTF new file mode 100644 index 0000000..b530afb Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Fonts/PAPYRUS.TTF differ diff --git a/Godette-Tale/addons/GodotTIE/Fonts/Papyrus UT.ttf b/Godette-Tale/addons/GodotTIE/Fonts/Papyrus UT.ttf new file mode 100644 index 0000000..1c82208 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Fonts/Papyrus UT.ttf differ diff --git a/Godette-Tale/addons/GodotTIE/Fonts/Papyrus-UT.tres b/Godette-Tale/addons/GodotTIE/Fonts/Papyrus-UT.tres new file mode 100644 index 0000000..24c2a48 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Fonts/Papyrus-UT.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/GodotTIE/Fonts/Papyrus UT.ttf" type="DynamicFontData" id=1] + +[resource] +size = 35 +font_data = ExtResource( 1 ) diff --git a/Godette-Tale/addons/GodotTIE/Generic.wav b/Godette-Tale/addons/GodotTIE/Generic.wav new file mode 100644 index 0000000..74d3b0e Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Generic.wav differ diff --git a/Godette-Tale/addons/GodotTIE/Generic.wav.import b/Godette-Tale/addons/GodotTIE/Generic.wav.import new file mode 100644 index 0000000..2d805b1 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Generic.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Generic.wav-1a53642fc2feb44d0193e195b74ac8ea.sample" + +[deps] + +source_file="res://addons/GodotTIE/Generic.wav" +dest_files=[ "res://.import/Generic.wav-1a53642fc2feb44d0193e195b74ac8ea.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/addons/GodotTIE/GodotTIELicense b/Godette-Tale/addons/GodotTIE/GodotTIELicense new file mode 100644 index 0000000..7e91581 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/GodotTIELicense @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Henrique Lacreta Alves + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Godette-Tale/addons/GodotTIE/GodotTIE_icon.png b/Godette-Tale/addons/GodotTIE/GodotTIE_icon.png new file mode 100644 index 0000000..8edb784 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/GodotTIE_icon.png differ diff --git a/Godette-Tale/addons/GodotTIE/GodotTIE_icon.png.import b/Godette-Tale/addons/GodotTIE/GodotTIE_icon.png.import new file mode 100644 index 0000000..d8e79d7 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/GodotTIE_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/GodotTIE_icon.png-06c5755e573090fa68219dcd4c5b75cc.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/GodotTIE/GodotTIE_icon.png" +dest_files=[ "res://.import/GodotTIE_icon.png-06c5755e573090fa68219dcd4c5b75cc.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/addons/GodotTIE/GodotTIE_plugin.gd b/Godette-Tale/addons/GodotTIE/GodotTIE_plugin.gd new file mode 100644 index 0000000..7c8a4e1 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/GodotTIE_plugin.gd @@ -0,0 +1,17 @@ +tool +extends EditorPlugin + +func _enter_tree(): + # When this plugin node enters tree, add the custom type + + add_custom_type("TextInterfaceEngine","ReferenceRect",preload("res://addons/GodotTIE/text_interface_engine.gd"),preload("res://addons/GodotTIE/GodotTIE_icon.png")) + +func _exit_tree(): + # When the plugin node exits the tree, remove the custom type + + remove_custom_type("TextInterfaceEngine") + + + + + diff --git a/Godette-Tale/addons/GodotTIE/Options.gd b/Godette-Tale/addons/GodotTIE/Options.gd new file mode 100644 index 0000000..6889071 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Options.gd @@ -0,0 +1,216 @@ +extends HBoxContainer + +onready var isActive : bool = false + +onready var choice : int = 1 +onready var currentChoice = get_node("Option " + str(choice) + "/Cursor") +onready var optionsActive : int +onready var optionsDisabled : int +onready var outputBranch : String + +signal player_choice(input) + +#func _ready(): + #self.show() + #ShowOptionsWithSelector(4, 0, false, "\n\nForgive", "\n\nDo not", "I've got\nplaces to\nbe", "\nI'm\nReady") + +# Show options menu +# outputBranchFunc = This string is output after a choice is made, it's sort of like ID proof that this choice occured. +# OptionsActive = How many selectable options there are +# OptionsDisabled = How many unselectable options there are +# PortraitVisible = Is a character portrait visible or not +func ShowOptionsWithSelector(outputBranchFunc, optionsActiveFunc, optionsDisabledFunc, portraitVisible, option1Text, option2Text, option3Text, option4Text): + optionsActive = optionsActiveFunc + optionsDisabled = optionsDisabledFunc + outputBranch = outputBranchFunc + var funcchoice : int + var funcisActive : bool + if portraitVisible: #changes size based on whether a portrait is visible or not + self.rect_position = Vector2( 128, 64 ) + self.rect_size = Vector2( 864, 176 ) + else: + self.rect_position = Vector2( 40, 8 ) + self.rect_size = Vector2( 1040, 288 ) + $"Option 1/Cursor".show() + $"Option 2/Cursor".hide() + $"Option 3/Cursor".hide() + $"Option 4/Cursor".hide() + self.show() + if optionsActive == 3 && optionsDisabled == 1: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + $"Option 4".text = option4Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".show() + $"Option 4".add_color_override("font_color", Color(0.35,0.35,0.35)) + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 2 && optionsDisabled == 2: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + $"Option 4".text = option4Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".show() + $"Option 3".add_color_override("font_color", Color(0.35,0.35,0.35)) + $"Option 4".add_color_override("font_color", Color(0.35,0.35,0.35)) + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 2 && optionsDisabled == 1: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".hide() + $"Option 3".add_color_override("font_color", Color(0.35,0.35,0.35)) + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 1 && optionsDisabled == 3: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + $"Option 4".text = option4Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".show() + $"Option 2".add_color_override("font_color", Color(0.35,0.35,0.35)) + $"Option 3".add_color_override("font_color", Color(0.35,0.35,0.35)) + $"Option 4".add_color_override("font_color", Color(0.35,0.35,0.35)) + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 1 && optionsDisabled == 2: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".hide() + $"Option 2".add_color_override("font_color", Color(0.35,0.35,0.35)) + $"Option 3".add_color_override("font_color", Color(0.35,0.35,0.35)) + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 1 && optionsDisabled == 1: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".hide() + $"Option 4".hide() + $"Option 2".add_color_override("font_color", Color(0.35,0.35,0.35)) + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 4: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + $"Option 4".text = option4Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".show() + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 3: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + $"Option 3".text = option3Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".show() + $"Option 4".hide() + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 2: + $"Option 1".text = option1Text + $"Option 2".text = option2Text + get_parent().show() + $"Option 1".show() + $"Option 2".show() + $"Option 3".hide() + $"Option 4".hide() + funcisActive = true + funcchoice = 1 + pass + elif optionsActive == 1: + $"Option 1".text = option1Text + get_parent().show() + $"Option 1".show() + $"Option 2".hide() + $"Option 3".hide() + $"Option 4".hide() + funcisActive = true + funcchoice = 1 + pass + else: + print("Error, no elif statement for this option combo:") + print(optionsActive) + print(optionsDisabled) + choice = funcchoice + isActive = funcisActive + +func _input(ev): + if isActive && Input.is_action_just_pressed("move_left") || isActive && Input.is_action_just_pressed("move_right") || isActive && Input.is_action_just_pressed("interact"): + currentChoice = get_node("Option " + str(choice) + "/Cursor") + if ev.scancode == KEY_LEFT: # If left arrow is pressed + if choice != 1: + currentChoice.hide() + choice -= 1 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = optionsActive + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + elif ev.scancode == KEY_RIGHT: # If right arrow is pressed + if choice != optionsActive: + currentChoice.hide() + choice += 1 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + else: + currentChoice.hide() + choice = 1 + currentChoice = get_node("Option " + str(choice) + "/Cursor") + currentChoice.show() + else: # If Enter is pressed + print("You chose: " + str(choice)) + isActive = false + self.hide() + $"Option 1".hide() + $"Option 2".hide() + $"Option 3".hide() + $"Option 4".hide() + $"Option 1".add_color_override("font_color", Color(1,1,1)) + $"Option 2".add_color_override("font_color", Color(1,1,1)) + $"Option 3".add_color_override("font_color", Color(1,1,1)) + $"Option 4".add_color_override("font_color", Color(1,1,1)) + emit_signal("player_choice", outputBranch, get_node("Option " + str(choice)).text) + #send signal + #print("Active: " + str(optionsActive) + "\nDisabled: " + str(optionsDisabled)) + #called everytime enter/left/right is pressed while isActive diff --git a/Godette-Tale/addons/GodotTIE/Papyrus.wav b/Godette-Tale/addons/GodotTIE/Papyrus.wav new file mode 100644 index 0000000..256dcf7 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Papyrus.wav differ diff --git a/Godette-Tale/addons/GodotTIE/Papyrus.wav.import b/Godette-Tale/addons/GodotTIE/Papyrus.wav.import new file mode 100644 index 0000000..5f76c20 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Papyrus.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Papyrus.wav-b1a8ff7b743a64c6da4e56ebece7c3a6.sample" + +[deps] + +source_file="res://addons/GodotTIE/Papyrus.wav" +dest_files=[ "res://.import/Papyrus.wav-b1a8ff7b743a64c6da4e56ebece7c3a6.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/addons/GodotTIE/Sans.wav b/Godette-Tale/addons/GodotTIE/Sans.wav new file mode 100644 index 0000000..de43a17 Binary files /dev/null and b/Godette-Tale/addons/GodotTIE/Sans.wav differ diff --git a/Godette-Tale/addons/GodotTIE/Sans.wav.import b/Godette-Tale/addons/GodotTIE/Sans.wav.import new file mode 100644 index 0000000..c4661c2 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/Sans.wav.import @@ -0,0 +1,21 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Sans.wav-9b8ff1cf5c16e1f8d5fbe859bb54a58d.sample" + +[deps] + +source_file="res://addons/GodotTIE/Sans.wav" +dest_files=[ "res://.import/Sans.wav-9b8ff1cf5c16e1f8d5fbe859bb54a58d.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Godette-Tale/addons/GodotTIE/plugin.cfg b/Godette-Tale/addons/GodotTIE/plugin.cfg new file mode 100644 index 0000000..77a4427 --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/plugin.cfg @@ -0,0 +1,8 @@ +[plugin] + +name="GodotTIE" +description="Adds a Text Interface Engine node to Godot." +author="Henrique Alves" +version="1.1" +script="GodotTIE_plugin.gd" + diff --git a/Godette-Tale/addons/GodotTIE/text_interface_engine.gd b/Godette-Tale/addons/GodotTIE/text_interface_engine.gd new file mode 100644 index 0000000..a2728ce --- /dev/null +++ b/Godette-Tale/addons/GodotTIE/text_interface_engine.gd @@ -0,0 +1,587 @@ +#MADE BY HENRIQUE ALVES +#LICENSE STUFF BLABLABLA +#(MIT License) + +# Intern initializations +extends ReferenceRect # Extends from ReferenceFrame + +const _ARRAY_CHARS = [" ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~"] + +const STATE_WAITING = 0 +const STATE_OUTPUT = 1 +const STATE_INPUT = 2 + +const BUFF_TYPESOUND = -3 +const BUFF_CHOICE = -4 +const BUFF_SIGNAL = -5 +#const BUFF_ASTERISK = -4 +#const BUFF_ASTERISK2 = -5 +#const BUFF_ASTERISK3 = -6 +const BUFF_PANEL = -2 +const BUFF_FACE = -1 +const BUFF_DEBUG = 0 +const BUFF_TEXT = 1 +const BUFF_SILENCE = 2 +const BUFF_BREAK = 3 +const BUFF_INPUT = 4 +const BUFF_CLEAR = 5 + +onready var face = get_node("FacialTexture") +onready var typesound = get_node("TypeSound") +onready var options = get_node("../Options") +onready var savePanel = get_node("../../savePanel") +onready var panel = get_parent() +onready var NPCid : String = "None" +onready var skip : bool = false + +onready var outputBranchFunc : String +onready var optionsActiveFunc : int +onready var optionsDisabledFunc : int +onready var portraitVisible : bool +onready var option1Text : String +onready var option2Text : String +onready var option3Text : String +onready var option4Text : String + +onready var _buffer = [] # 0 = Debug; 1 = Text; 2 = Silence; 3 = Break; 4 = Input +onready var _label = Label.new() # The Label in which the text is going to be displayed +onready var _state = 0 # 0 = Waiting; 1 = Output; 2 = Input + +onready var _output_delay = 0 +onready var _output_delay_limit = 0 +onready var _on_break = false +onready var _max_lines_reached = false +onready var _buff_beginning = false +onready var _turbo = false +onready var _max_lines = 0 +onready var _break_key = KEY_ENTER + +onready var _blink_input_visible = false +onready var _blink_input_timer = 0 +onready var _input_timer_limit = 1 +onready var _input_index = 0 + +# =============================================== +# Text display properties! +export(bool) var SCROLL_ON_MAX_LINES = true # If this is true, the text buffer update will stop after reaching the maximum number of lines; else, it will stop to wait for user input, and than clear the text. +export(bool) var BREAK_ON_MAX_LINES = true # If the text output pauses waiting for the user when reaching the maximum number of lines +export(bool) var AUTO_SKIP_WORDS = true # If words that dont fit the line only start to be printed on next line +export(bool) var LOG_SKIPPED_LINES = true # false = delete every line that is not showing on screen +export(bool) var SCROLL_SKIPPED_LINES = false # if the user will be able to scroll through the skipped lines; weird stuff can happen if this and BREAK_ON_MAX_LINE/LOG_SKIPPED_LINES +export(Font) var FONT +# Text input properties! +export(bool) var PRINT_INPUT = true # If the input is going to be printed +export(bool) var BLINKING_INPUT = true # If there is a _ blinking when input is appropriate +export(int) var INPUT_CHARACTERS_LIMIT = -1 # If -1, there'll be no limits in the number of characters +# Signals! +signal input_enter(input) # When user finished an input +signal buff_end() # When there is no more outputs in _buffer +signal typesound() # When a typesound is played +signal state_change(state) # When the state of the engine changes +signal enter_break() # When the engine stops on a break +signal resume_break() # When the engine resumes from a break +signal tag_buff(tag) # When the _buffer reaches a buff which is tagged +signal buff_cleared() # When the buffer's been cleared of text +# =============================================== + +func NPCid(s, push_front = false): # The text for the output, and its printing velocity (per character) + NPCid = s + +func buff_choice(s1, s2, s3, s4, s5, s6, s7, s8): # For simple debug purposes; use with care + var b = {"buff_type":BUFF_CHOICE} + outputBranchFunc = s1 + optionsActiveFunc = s2 + optionsDisabledFunc = s3 + portraitVisible = s4 + option1Text = s5 + option2Text = s6 + option3Text = s7 + option4Text = s8 + _buffer.append(b) + +func buff_signal(f, push_front = false): # For simple debug purposes; use with care + var b = {"buff_type":BUFF_SIGNAL,"signal_function":f} + if(! push_front): + _buffer.append(b) + else: + _buffer.push_front(b) + +#func buff_asterisk(f, push_front = false): # For simple debug purposes; use with care +# var b = {"buff_type":BUFF_ASTERISK,"asterisk_function":f} +# if(! push_front): +# _buffer.append(b) +# else: +# _buffer.push_front(b) + +#func buff_asterisk2(f, push_front = false): # For simple debug purposes; use with care +# var b = {"buff_type":BUFF_ASTERISK2,"asterisk_function2":f} +# if(! push_front): +# _buffer.append(b) +# else: +# _buffer.push_front(b) + +#func buff_asterisk3(f, push_front = false): # For simple debug purposes; use with care +# var b = {"buff_type":BUFF_ASTERISK3,"asterisk_function3":f} +# if(! push_front): +# _buffer.append(b) +# else: +# _buffer.push_front(b) + +func buff_panel(f, push_front = false): # For simple debug purposes; use with care + var b = {"buff_type":BUFF_PANEL,"panel_function":f} + if(! push_front): + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_face(f, push_front = false): # For simple debug purposes; use with care + var b = {"buff_type":BUFF_FACE,"face_function":f} + if(! push_front): + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_typesound(f, push_front = false): # For simple debug purposes; use with care + var b = {"buff_type":BUFF_TYPESOUND,"typesound_function":f} + if(! push_front): + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_debug(f, lab = false, arg0 = null, push_front = false): # For simple debug purposes; use with care + var b = {"buff_type":BUFF_DEBUG,"debug_function":f,"debug_label":lab,"debug_arg":arg0} + if(! push_front): + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_text(text, vel = 0, tag = "", push_front = false): # The text for the output, and its printing velocity (per character) + var b = {"buff_type":BUFF_TEXT, "buff_text":text, "buff_vel":vel, "buff_tag":tag} + if !push_front: + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_silence(length, tag = "", push_front = false): # A duration without output + var b = {"buff_type":BUFF_SILENCE, "buff_length":length, "buff_tag":tag} + if !push_front: + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_break(tag = "", push_front = false): # Stop output until the player hits enter + var b = {"buff_type":BUFF_BREAK, "buff_tag":tag} + if !push_front: + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_input(tag = "", push_front = false): # 'Schedule' a change state to Input in the buffer + var b = {"buff_type":BUFF_INPUT, "buff_tag":tag} + if !push_front: + _buffer.append(b) + else: + _buffer.push_front(b) + +func buff_clear(tag = "", push_front = false): # Clear the text buffer when this buffer command is run. + var b = {"buff_type":BUFF_CLEAR, "buff_tag":tag} + if !push_front: + _buffer.append(b) + else: + _buffer.push_front(b) + +func clear_text(): # Deletes ALL the text on the label + _label.set_lines_skipped(0) + _label.set_text("") + +func clear_buffer(): # Clears all buffs in _buffer + _on_break = false + set_state(STATE_WAITING) + _buffer.clear() + + _output_delay = 0 + _output_delay_limit = 0 + _buff_beginning = true + _turbo = false + _max_lines_reached = false + +func reset(): # Reset TIE to its initial 100% cleared state + clear_text() + clear_buffer() + +func clear_skipped_lines(): # Deletes only the 'hidden' lines, if LOG_SKIPPED_LINES is false + if(LOG_SKIPPED_LINES == true): + _clear_skipped_lines() + +func add_newline(): # Add a new line to the label text + _label_print("\n") + +func get_text(): # Get current text on Label + return _label.get_text() + +func set_turbomode(s): # Print stuff in the maximum velocity and ignore breaks + _turbo = s; + +# Careful when changing fonts on-the-fly! It might break the text if there is something +# already printed! +func set_font_bypath(str_path): # Changes the font of the text; weird stuff will happen if you use this function after text has been printed + _label.add_font_override("font",load(str_path)) + _max_lines = floor(get_size().y/(_label.get_line_height()+_label.get_constant("line_spacing"))) + +func set_font_byresource(font): # Changes font of the text (uses the resource) + _label.add_font_override("font", font) + _max_lines = floor(get_size().y/(_label.get_line_height()+_label.get_constant("line_spacing"))) + +func portrait_visible(boolean): + if boolean: #changes size based on whether a portrait is visible or not + self.rect_position = Vector2( 128, 22 ) + self.rect_size = Vector2( 432, 144 ) + else: + self.rect_position = Vector2( 24, 22 ) + self.rect_size = Vector2( 560, 144 ) + +func set_color(c): # Changes the color of the text + _label.add_color_override("font_color", c) + +func set_state(i): # Changes the state of the Text Interface Engine + emit_signal("state_change", int(i)) + if _state == STATE_INPUT: + _blink_input(true) + _state = i + if(i == 2): # Set input index to last character on the label + _input_index = _label.get_text().length() + +func set_break_key_by_scancode(i): # Set a new key to resume breaks (uses scancode!) + _break_key = i + +func set_buff_speed(v): # Changes the velocity of the text being printed + if (_buffer[0]["buff_type"] == BUFF_TEXT): + _buffer[0]["buff_vel"] = v + +# ============================================== +# Reserved methods + +# Override +func _ready(): + set_physics_process(true) + set_process_input(true) + + add_child(_label) + + # Setting font of the text + if(FONT != null): + _label.add_font_override("font", FONT) + + # Setting size of the frame + _max_lines = floor(get_size().y/(_label.get_line_height()+_label.get_constant("line_spacing"))) + _label.set_size(Vector2(get_size().x,get_size().y)) + _label.set_autowrap(true) + +func _physics_process(delta): + if(_state == STATE_OUTPUT): # Output + if(_buffer.size() == 0): + set_state(STATE_WAITING) + emit_signal("buff_end") + return + + var o = _buffer[0] # Calling this var 'o' was one of my biggest mistakes during the development of this code. I'm sorry about this. + +# if (o["buff_type"] == BUFF_ASTERISK): # ---- It's a face! ---- +# if (o["asterisk_function"] == "show"): +# $Asterisk.show() +# _buffer.pop_front() + +# if (o["buff_type"] == BUFF_ASTERISK2): # ---- It's a face! ---- +# if (o["asterisk_function2"] == "show"): +# $Asterisk2.show() +# elif (o["asterisk_function2"] == "hide"): +# $Asterisk2.hide() +# _buffer.pop_front() + +# if (o["buff_type"] == BUFF_ASTERISK3): # ---- It's a face! ---- +# if (o["asterisk_function3"] == "show"): +# $Asterisk3.show() +# elif (o["asterisk_function3"] == "hide"): +# $Asterisk3.hide() +# _buffer.pop_front() + + if (o["buff_type"] == BUFF_CHOICE): # ---- It's a face! ---- + options.ShowOptionsWithSelector(outputBranchFunc, optionsActiveFunc, optionsDisabledFunc, portraitVisible, option1Text, option2Text, option3Text, option4Text) + _buffer.pop_front() + + if (o["buff_type"] == BUFF_SIGNAL): # ---- It's a face! ---- + signalManager.emit_signal("buff_signal", o["signal_function"]) + _buffer.pop_front() + + if (o["buff_type"] == BUFF_PANEL): # ---- It's a face! ---- + if (o["panel_function"] == "show"): + panel.show() + elif (o["panel_function"] == "hide"): + panel.hide() + #skipFirstSkip = true + _buffer.pop_front() + + if (o["buff_type"] == BUFF_FACE): # ---- It's a face! ---- + face.set_texture(load(o["face_function"])) + _buffer.pop_front() + + if (o["buff_type"] == BUFF_TYPESOUND): # ---- It's a face! ---- + typesound.set_stream(load(o["typesound_function"])) + _buffer.pop_front() + + if (o["buff_type"] == BUFF_DEBUG): # ---- It's a debug! ---- + if(o["debug_label"] == false): + if(o["debug_arg"] == null): + print(self.call(o["debug_function"])) + else: + print(self.call(o["debug_function"],o["debug_arg"])) + else: + if(o["debug_arg"] == null): + print(_label.call(o["debug_function"])) + else: + print(_label.call(o["debug_function"],o["debug_arg"])) + _buffer.pop_front() + elif (o["buff_type"] == BUFF_TEXT): # ---- It's a text! ---- + # -- Print Text -- + + if(o["buff_tag"] != "" and _buff_beginning == true): + emit_signal("tag_buff", o["buff_tag"]) + + if (_turbo): # In case of turbo, print everything on this buff + o["buff_vel"] = 0 + + if(o["buff_vel"] == 0 || skip == true && Input.is_action_just_pressed("interact")): # If the velocity is 0, than just print everything + var i = 0 + while(o["buff_text"] != ""): # Not optimal (not really printing everything at the same time); but is the only way to work with line break + if(AUTO_SKIP_WORDS and (o["buff_text"][0] == " " or _buff_beginning or o["buff_text"][0] == null or o["buff_text"][0] == " ")): + _skip_word() + if(o["buff_text"][0] == " "): + _skip_word() + _label_print(o["buff_text"][0]) + _buff_beginning = false + o["buff_text"] = o["buff_text"].right(1) + i = i + 1 + if(skip == true && i == 7): + if (skip == true): + skip = false + break + if(_max_lines_reached == true): + if (skip == true): + skip = false + break + + else: # Else, print each character according to velocity + _output_delay_limit = o["buff_vel"] + if(_buff_beginning): + _output_delay = _output_delay_limit + delta + else: + _output_delay += delta + if(_output_delay > _output_delay_limit or o["buff_text"][0] == " "): + if(AUTO_SKIP_WORDS and (o["buff_text"][0] == " " or _buff_beginning)): + _skip_word() + _label_print(o["buff_text"][0]) + if (o["buff_text"][0] != null && o["buff_text"][0] != " " && o["buff_text"][0] != " " && o["buff_text"][0] != "\n" && o["buff_text"][0] != "\r" && o["buff_text"][0] != "*"): # Play a sound effect if the text doesn't equal a space or newline + #print(o["buff_text"][0]) + $TypeSound.play() + emit_signal("typesound", str(NPCid)) + #$AnimationPlayer.play("Speaking") + _buff_beginning = false + _output_delay -= _output_delay_limit + o["buff_text"] = o["buff_text"].right(1) + # -- Popout Buff -- + if (o["buff_text"] == ""): # This buff finished, so pop it out of the array + _buffer.pop_front() + _buff_beginning = true + _output_delay = 0 + elif (o["buff_type"] == BUFF_SILENCE): # ---- It's a silence! ---- + if(o["buff_tag"] != "" and _buff_beginning == true): + emit_signal("tag_buff", o["buff_tag"]) + _buff_beginning = false + _output_delay_limit = o["buff_length"] # Length of the silence + _output_delay += delta + if(_output_delay > _output_delay_limit): + _output_delay = 0 + _buff_beginning = true + _buffer.pop_front() + elif (o["buff_type"] == BUFF_BREAK): # ---- It's a break! ---- + if(o["buff_tag"] != "" and _buff_beginning == true): + #skipFirstSkip = true + emit_signal("tag_buff", o["buff_tag"]) + _buff_beginning = false + if(_turbo): # Ignore this break + _buffer.pop_front() + elif(!_on_break): + emit_signal("enter_break") + _on_break = true + elif (o["buff_type"] == BUFF_INPUT): # ---- It's an Input! ---- + if(o["buff_tag"] != "" and _buff_beginning == true): + emit_signal("tag_buff", o["buff_tag"]) + _buff_beginning = false + set_state(STATE_INPUT) + _buffer.pop_front() + elif (o["buff_type"] == BUFF_CLEAR): # ---- It's a clear command! ---- + if(o["buff_tag"] != ""and _buff_beginning == true): + emit_signal("tag_buff", o["buff_tag"]) + _buff_beginning = false + _label.set_text("") + _buffer.pop_front() + emit_signal("buff_cleared") + elif(_state == STATE_INPUT): + if BLINKING_INPUT: + _blink_input_timer += delta + if(_blink_input_timer > _input_timer_limit): + _blink_input_timer -= _input_timer_limit + _blink_input() + + pass + +func _input(event): + if is_instance_valid(savePanel): #Used for instances where the save panel isn't in the scene + if event is InputEventKey && !savePanel.is_visible(): + if (_state == 0): + skip = false + #print(OS.get_scancode_string(event.scancode)) + if OS.get_scancode_string(event.scancode) == 'Space' || OS.get_scancode_string(event.scancode) == 'Enter' && _state == 1 and !_on_break: + #if !skipFirstSkip: + skip = true + #skipFirstSkip = false + else: + if event is InputEventKey: + if (_state == 0): + skip = false + #print(OS.get_scancode_string(event.scancode)) + if OS.get_scancode_string(event.scancode) == 'Space' || OS.get_scancode_string(event.scancode) == 'Enter' && _state == 1 and !_on_break: + #if !skipFirstSkip: + skip = true + #skipFirstSkip = false + if(event is InputEventKey and event.is_pressed() == true ): + if(SCROLL_SKIPPED_LINES and event.scancode == KEY_UP or event.scancode == KEY_DOWN): # User is just scrolling the text + if(event.scancode == KEY_UP): + if(_label.get_lines_skipped() > 0): + _label.set_lines_skipped(_label.get_lines_skipped()-1) + else: + if(_label.get_lines_skipped() < _label.get_line_count()-_max_lines): + _label.set_lines_skipped(_label.get_lines_skipped()+1) + elif(_state == 1 and _on_break): # If its on a break + if(event.scancode == _break_key): + emit_signal("resume_break") + _buffer.pop_front() # Pop out break buff + _on_break = false + elif(_state == 2): # If its on the input state + if(BLINKING_INPUT): # Stop blinking line while inputing + _blink_input(true) + + var input = _label.get_text().right(_input_index) # Get Input + input = input.replace("\n","") + + if(event.scancode == KEY_BACKSPACE): # Delete last character + _delete_last_character(true) + elif(event.scancode == KEY_ENTER): # Finish input + emit_signal("input_enter", input) + if(!PRINT_INPUT): # Delete input + var i = _label.get_text().length() - _input_index + while(i > 0): + _delete_last_character() + i-=1 + set_state(STATE_OUTPUT) + + elif(event.unicode >= 32 and event.unicode <= 126): # Add character + if(INPUT_CHARACTERS_LIMIT < 0 or input.length() < INPUT_CHARACTERS_LIMIT): + _label_print(_ARRAY_CHARS[event.unicode-32]) + +# Private +func _clear_skipped_lines(): + var i = 0 + var n = 0 + while i < _label.get_lines_skipped(): + n = _label.get_text().findn("\n", n)+1 + i+=1 + _label.set_text(_label.get_text().right(n)) + _label.set_lines_skipped(0) + +func _blink_input(reset = false): + if(reset == true): + if(_blink_input_visible): + _delete_last_character() + _blink_input_visible = false + _blink_input_timer = 0 + return + if(_blink_input_visible): + _delete_last_character() + _blink_input_visible = false + else: + _blink_input_visible = true + _label_print("_") + +func _delete_last_character(scrollup = false): + var n = _label.get_line_count() + _label.set_text(_label.get_text().left(_label.get_text().length()-1)) + if( scrollup and n > _label.get_line_count() and _label.get_lines_skipped() > 0 and _blink_input_visible == false): + _label.set_lines_skipped(_label.get_lines_skipped()-1) + +func _get_last_line(): + var i = _label.get_text().rfind("\n") + if (i == -1): + return _label.get_text() + return _label.get_text().substr(i,_label.get_text().length()-i) + +func _has_to_skip_word(word): # what an awful name + var ret = false + var n = _label.get_line_count() + _label.set_text(_label.get_text() + word) + if(_label.get_line_count() > n): + ret = true + _label.set_text(_label.get_text().left(_label.get_text().length()-word.length())) #omg + return ret + +func _skip_word(): + var ot = _buffer[0]["buff_text"] + + # which comes first, a space or a new line (else, till the end) + var f_space = ot.findn(" ",1) + if f_space == -1: + f_space = ot.length() + var f_newline = ot.findn("\n",1) + if f_newline == -1: + f_newline = ot.length() + var length = min(f_space, f_newline) + + if(_has_to_skip_word(ot.substr(0,length))): + + if(_buffer[0]["buff_text"][0] == " "): + + _buffer[0]["buff_text"][0] = " " + else: + _buffer[0]["buff_text"] = _buffer[0]["buff_text"].insert(0,"\n") + +func _label_print(t): # Add text to the label + var n = _label.get_line_count() + _label.set_text(_label.get_text() + t) + if(_label.get_line_count() > n): # If number of lines increased + if(_label.get_line_count()-_label.get_lines_skipped() > _max_lines): # If it exceeds _max_lines + # Check if it is a rogue blinking input + if(_blink_input_visible == true): + _blink_input(true) + return + + if(_state == 1 and BREAK_ON_MAX_LINES and _max_lines_reached == false): # Add a break when maximum lines are reached + _delete_last_character() + _max_lines_reached = true + _buffer[0]["buff_text"] = t + _buffer[0]["buff_text"] + buff_break("", true) + return t + + if(_max_lines_reached): # Reset maximum lines break + _max_lines_reached = false + + if(SCROLL_ON_MAX_LINES): # Scroll text, or clear everything + _label.set_lines_skipped(_label.get_lines_skipped()+1) + else: + _label.set_lines_skipped(_label.get_lines_skipped()+_max_lines) + + if (t != "\n" and n > 0): # Add a line breaker, so the engine will be able to get each line + _label.set_text(_label.get_text().insert( _label.get_text().length()-1,"\n")) + + if(LOG_SKIPPED_LINES == false): # Delete skipped lines + _clear_skipped_lines() + return t diff --git a/Godette-Tale/addons/vnen.tiled_importer/plugin.cfg b/Godette-Tale/addons/vnen.tiled_importer/plugin.cfg new file mode 100644 index 0000000..40a544f --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/plugin.cfg @@ -0,0 +1,8 @@ +config_version=3 +[plugin] + +name="Tiled Map Importer" +description="Importer for TileMaps and TileSets made on Tiled Map Editor" +version="2.3" +author="George Marques" +script="vnen.tiled_importer.gd" diff --git a/Godette-Tale/addons/vnen.tiled_importer/polygon_sorter.gd b/Godette-Tale/addons/vnen.tiled_importer/polygon_sorter.gd new file mode 100644 index 0000000..7a6f9b1 --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/polygon_sorter.gd @@ -0,0 +1,67 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 George Marques +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Sorter for polygon vertices +tool +extends Reference + +var center + +# Sort the vertices of a convex polygon to clockwise order +# Receives a PoolVector2Array and returns a new one +func sort_polygon(vertices): + vertices = Array(vertices) + + var centroid = Vector2() + var size = vertices.size() + + for i in range(0, size): + centroid += vertices[i] + + centroid /= size + + center = centroid + vertices.sort_custom(self, "is_less") + + return PoolVector2Array(vertices) + +# Sorter function, determines which of the poins should come first +func is_less(a, b): + if a.x - center.x >= 0 and b.x - center.x < 0: + return false + elif a.x - center.x < 0 and b.x - center.x >= 0: + return true + elif a.x - center.x == 0 and b.x - center.x == 0: + if a.y - center.y >= 0 or b.y - center.y >= 0: + return a.y < b.y + return a.y > b.y + + var det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y) + if det > 0: + return true + elif det < 0: + return false + + var d1 = (a - center).length_squared() + var d2 = (b - center).length_squared() + + return d1 < d2 \ No newline at end of file diff --git a/Godette-Tale/addons/vnen.tiled_importer/tiled.png b/Godette-Tale/addons/vnen.tiled_importer/tiled.png new file mode 100644 index 0000000..17d7d49 Binary files /dev/null and b/Godette-Tale/addons/vnen.tiled_importer/tiled.png differ diff --git a/Godette-Tale/addons/vnen.tiled_importer/tiled.png.import b/Godette-Tale/addons/vnen.tiled_importer/tiled.png.import new file mode 100644 index 0000000..56cc40b --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/tiled.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/tiled.png-dbbabe58e4f927769540a522a2073689.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/vnen.tiled_importer/tiled.png" +dest_files=[ "res://.import/tiled.png-dbbabe58e4f927769540a522a2073689.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Godette-Tale/addons/vnen.tiled_importer/tiled_import_plugin.gd b/Godette-Tale/addons/vnen.tiled_importer/tiled_import_plugin.gd new file mode 100644 index 0000000..4c5ee10 --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/tiled_import_plugin.gd @@ -0,0 +1,141 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 George Marques +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +tool +extends EditorImportPlugin + +enum { PRESET_DEFAULT, PRESET_PIXEL_ART } + +const TiledMapReader = preload("tiled_map_reader.gd") + +func get_importer_name(): + return "vnen.tiled_importer" + +func get_visible_name(): + return "Scene from Tiled" + +func get_recognized_extensions(): + if ProjectSettings.get_setting("tiled_importer/enable_json_format"): + return ["json", "tmx"] + else: + return ["tmx"] + +func get_save_extension(): + return "scn" + +func get_priority(): + return 1 + +func get_import_order(): + return 100 + +func get_resource_type(): + return "PackedScene" + +func get_preset_count(): + return 2 + +func get_preset_name(preset): + match preset: + PRESET_DEFAULT: return "Default" + PRESET_PIXEL_ART: return "Pixel Art" + +func get_import_options(preset): + return [ + { + "name": "custom_properties", + "default_value": true + }, + { + "name": "tile_metadata", + "default_value": false + }, + { + "name": "uv_clip", + "default_value": true + }, + { + "name": "image_flags", + "default_value": 0 if preset == PRESET_PIXEL_ART else Texture.FLAGS_DEFAULT, + "property_hint": PROPERTY_HINT_FLAGS, + "hint_string": "Mipmaps,Repeat,Filter,Anisotropic,sRGB,Mirrored Repeat" + }, + { + "name": "collision_layer", + "default_value": 1, + "property_hint": PROPERTY_HINT_LAYERS_2D_PHYSICS + }, + { + "name": "embed_internal_images", + "default_value": true if preset == PRESET_PIXEL_ART else false + }, + { + "name": "save_tiled_properties", + "default_value": false + }, + { + "name": "add_background", + "default_value": true + }, + { + "name": "post_import_script", + "default_value": "", + "property_hint": PROPERTY_HINT_FILE, + "hint_string": "*.gd;GDScript" + } + ] + +func get_option_visibility(option, options): + return true + +func import(source_file, save_path, options, r_platform_variants, r_gen_files): + var map_reader = TiledMapReader.new() + + # Offset is only optional for importing TileSets + options.apply_offset = true + var scene = map_reader.build(source_file, options) + + if typeof(scene) != TYPE_OBJECT: + # Error happened + return scene + + # Post imports script + if not options.post_import_script.empty(): + var script = load(options.post_import_script) + if not script or not script is GDScript: + printerr("Post import script is not a GDScript.") + return ERR_INVALID_PARAMETER + + script = script.new() + if not script.has_method("post_import"): + printerr("Post import script does not have a 'post_import' method.") + return ERR_INVALID_PARAMETER + + scene = script.post_import(scene) + + if not scene or not scene is Node2D: + printerr("Invalid scene returned from post import script.") + return ERR_INVALID_DATA + + var packed_scene = PackedScene.new() + packed_scene.pack(scene) + return ResourceSaver.save("%s.%s" % [save_path, get_save_extension()], packed_scene) diff --git a/Godette-Tale/addons/vnen.tiled_importer/tiled_map_reader.gd b/Godette-Tale/addons/vnen.tiled_importer/tiled_map_reader.gd new file mode 100644 index 0000000..9f3a57f --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/tiled_map_reader.gd @@ -0,0 +1,1329 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 George Marques +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +tool +extends Reference + +# Constants for tile flipping +# http://doc.mapeditor.org/reference/tmx-map-format/#tile-flipping +const FLIPPED_HORIZONTALLY_FLAG = 0x80000000 +const FLIPPED_VERTICALLY_FLAG = 0x40000000 +const FLIPPED_DIAGONALLY_FLAG = 0x20000000 + +# XML Format reader +const TiledXMLToDictionary = preload("tiled_xml_to_dict.gd") + +# Polygon vertices sorter +const PolygonSorter = preload("polygon_sorter.gd") + +# Prefix for error messages, make easier to identify the source +const error_prefix = "Tiled Importer: " + +# Properties to save the value in the metadata +const whitelist_properties = [ + "backgroundcolor", + "compression", + "draworder", + "gid", + "height", + "imageheight", + "imagewidth", + "infinite", + "margin", + "name", + "orientation", + "probability", + "spacing", + "tilecount", + "tiledversion", + "tileheight", + "tilewidth", + "type", + "version", + "visible", + "width", +] + +# All templates loaded, can be looked up by path name +var _loaded_templates = {} +# Maps each tileset file used by the map to it's first gid; Used for template parsing +var _tileset_path_to_first_gid = {} + +func reset_global_memebers(): + _loaded_templates = {} + _tileset_path_to_first_gid = {} + +# Main function +# Reads a source file and gives back a scene +func build(source_path, options): + reset_global_memebers() + var map = read_file(source_path) + if typeof(map) == TYPE_INT: + return map + if typeof(map) != TYPE_DICTIONARY: + return ERR_INVALID_DATA + + var err = validate_map(map) + if err != OK: + return err + + var cell_size = Vector2(int(map.tilewidth), int(map.tileheight)) + var map_mode = TileMap.MODE_SQUARE + var map_offset = TileMap.HALF_OFFSET_DISABLED + var map_pos_offset = Vector2() + var map_background = Color() + var cell_offset = Vector2() + if "orientation" in map: + match map.orientation: + "isometric": + map_mode = TileMap.MODE_ISOMETRIC + "staggered": + map_pos_offset.y -= cell_size.y / 2 + match map.staggeraxis: + "x": + map_offset = TileMap.HALF_OFFSET_Y + cell_size.x /= 2.0 + if map.staggerindex == "even": + cell_offset.x += 1 + map_pos_offset.x -= cell_size.x + "y": + map_offset = TileMap.HALF_OFFSET_X + cell_size.y /= 2.0 + if map.staggerindex == "even": + cell_offset.y += 1 + map_pos_offset.y -= cell_size.y + "hexagonal": + # Godot maps are always odd and don't have an "even" setting. To + # imitate even staggering we simply start one row/column late and + # adjust the position of the whole map. + match map.staggeraxis: + "x": + map_offset = TileMap.HALF_OFFSET_Y + cell_size.x = int((cell_size.x + map.hexsidelength) / 2) + if map.staggerindex == "even": + cell_offset.x += 1 + map_pos_offset.x -= cell_size.x + "y": + map_offset = TileMap.HALF_OFFSET_X + cell_size.y = int((cell_size.y + map.hexsidelength) / 2) + if map.staggerindex == "even": + cell_offset.y += 1 + map_pos_offset.y -= cell_size.y + + var tileset = build_tileset_for_scene(map.tilesets, source_path, options) + if typeof(tileset) != TYPE_OBJECT: + # Error happened + return tileset + + var root = Node2D.new() + root.set_name(source_path.get_file().get_basename()) + if options.save_tiled_properties: + set_tiled_properties_as_meta(root, map) + if options.custom_properties: + set_custom_properties(root, map) + + var map_data = { + "options": options, + "map_mode": map_mode, + "map_offset": map_offset, + "map_pos_offset": map_pos_offset, + "map_background": map_background, + "cell_size": cell_size, + "cell_offset": cell_offset, + "tileset": tileset, + "source_path": source_path, + "infinite": bool(map.infinite) if "infinite" in map else false + } + + for layer in map.layers: + err = make_layer(layer, root, root, map_data) + if err != OK: + return err + + if options.add_background and "backgroundcolor" in map: + var bg_color = str(map.backgroundcolor) + if (!bg_color.is_valid_html_color()): + print_error("Invalid background color format: " + bg_color) + return root + + map_background = Color(bg_color) + + var viewport_size = Vector2(ProjectSettings.get("display/window/size/width"), ProjectSettings.get("display/window/size/height")) + var parbg = ParallaxBackground.new() + var parlayer = ParallaxLayer.new() + var colorizer = ColorRect.new() + + parbg.scroll_ignore_camera_zoom = true + parlayer.motion_mirroring = viewport_size + colorizer.color = map_background + colorizer.rect_size = viewport_size + colorizer.rect_min_size = viewport_size + + parbg.name = "Background" + root.add_child(parbg) + parbg.owner = root + parlayer.name = "BackgroundLayer" + parbg.add_child(parlayer) + parlayer.owner = root + colorizer.name = "BackgroundColor" + parlayer.add_child(colorizer) + colorizer.owner = root + + return root + +# Creates a layer node from the data +# Returns an error code +func make_layer(layer, parent, root, data): + var err = validate_layer(layer) + if err != OK: + return err + + # Main map data + var map_mode = data.map_mode + var map_offset = data.map_offset + var map_pos_offset = data.map_pos_offset + var cell_size = data.cell_size + var cell_offset = data.cell_offset + var options = data.options + var tileset = data.tileset + var source_path = data.source_path + var infinite = data.infinite + + var opacity = float(layer.opacity) if "opacity" in layer else 1.0 + var visible = bool(layer.visible) if "visible" in layer else true + + if layer.type == "tilelayer": + var layer_size = Vector2(int(layer.width), int(layer.height)) + var tilemap = TileMap.new() + tilemap.set_name(str(layer.name)) + tilemap.cell_size = cell_size + tilemap.modulate = Color(1.0, 1.0, 1.0, opacity); + tilemap.visible = visible + tilemap.mode = map_mode + tilemap.cell_half_offset = map_offset + tilemap.format = 1 + tilemap.cell_clip_uv = options.uv_clip + tilemap.cell_y_sort = true + tilemap.cell_tile_origin = TileMap.TILE_ORIGIN_BOTTOM_LEFT + tilemap.collision_layer = options.collision_layer + + var offset = Vector2() + if "offsetx" in layer: + offset.x = int(layer.offsetx) + if "offsety" in layer: + offset.y = int(layer.offsety) + + tilemap.position = offset + map_pos_offset + tilemap.tile_set = tileset + + var chunks = [] + + if infinite: + chunks = layer.chunks + else: + chunks = [layer] + + for chunk in chunks: + err = validate_chunk(chunk) + if err != OK: + return err + + var chunk_data = chunk.data + + if "encoding" in layer and layer.encoding == "base64": + if "compression" in layer: + chunk_data = decompress_layer_data(chunk.data, layer.compression, layer_size) + if typeof(chunk_data) == TYPE_INT: + # Error happened + return chunk_data + else: + chunk_data = read_base64_layer_data(chunk.data) + + var count = 0 + for tile_id in chunk_data: + var int_id = int(str(tile_id)) & 0xFFFFFFFF + + if int_id == 0: + count += 1 + continue + + var flipped_h = bool(int_id & FLIPPED_HORIZONTALLY_FLAG) + var flipped_v = bool(int_id & FLIPPED_VERTICALLY_FLAG) + var flipped_d = bool(int_id & FLIPPED_DIAGONALLY_FLAG) + + var gid = int_id & ~(FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG) + + var cell_x = cell_offset.x + chunk.x + (count % int(chunk.width)) + var cell_y = cell_offset.y + chunk.y + int(count / chunk.width) + tilemap.set_cell(cell_x, cell_y, gid, flipped_h, flipped_v, flipped_d) + + count += 1 + + if options.save_tiled_properties: + set_tiled_properties_as_meta(tilemap, layer) + if options.custom_properties: + set_custom_properties(tilemap, layer) + + tilemap.set("editor/display_folded", true) + parent.add_child(tilemap) + tilemap.set_owner(root) + elif layer.type == "imagelayer": + var image = null + if layer.image != "": + image = load_image(layer.image, source_path, options) + if typeof(image) != TYPE_OBJECT: + # Error happened + return image + + var pos = Vector2() + var offset = Vector2() + + if "x" in layer: + pos.x = float(layer.x) + if "y" in layer: + pos.y = float(layer.y) + if "offsetx" in layer: + offset.x = float(layer.offsetx) + if "offsety" in layer: + offset.y = float(layer.offsety) + + var sprite = Sprite.new() + sprite.set_name(str(layer.name)) + sprite.centered = false + sprite.texture = image + sprite.visible = visible + sprite.modulate = Color(1.0, 1.0, 1.0, opacity) + if options.save_tiled_properties: + set_tiled_properties_as_meta(sprite, layer) + if options.custom_properties: + set_custom_properties(sprite, layer) + + sprite.set("editor/display_folded", true) + parent.add_child(sprite) + sprite.position = pos + offset + sprite.set_owner(root) + elif layer.type == "objectgroup": + var object_layer = Node2D.new() + if options.save_tiled_properties: + set_tiled_properties_as_meta(object_layer, layer) + if options.custom_properties: + set_custom_properties(object_layer, layer) + object_layer.modulate = Color(1.0, 1.0, 1.0, opacity) + object_layer.visible = visible + object_layer.set("editor/display_folded", true) + parent.add_child(object_layer) + object_layer.set_owner(root) + if "name" in layer and not str(layer.name).empty(): + object_layer.set_name(str(layer.name)) + + if not "draworder" in layer or layer.draworder == "topdown": + layer.objects.sort_custom(self, "object_sorter") + + for object in layer.objects: + if "template" in object: + var template_file = object["template"] + var template_data_immutable = get_template(remove_filename_from_path(data["source_path"]) + template_file) + if typeof(template_data_immutable) != TYPE_DICTIONARY: + # Error happened + print("Error getting template for object with id " + str(data["id"])) + continue + + # Overwrite template data with current object data + apply_template(object, template_data_immutable) + + set_default_obj_params(object) + + if "point" in object and object.point: + var point = Position2D.new() + if not "x" in object or not "y" in object: + print_error("Missing coordinates for point in object layer.") + continue + point.position = Vector2(float(object.x), float(object.y)) + point.visible = bool(object.visible) if "visible" in object else true + object_layer.add_child(point) + point.set_owner(root) + if "name" in object and not str(object.name).empty(): + point.set_name(str(object.name)) + elif "id" in object and not str(object.id).empty(): + point.set_name(str(object.id)) + if options.save_tiled_properties: + set_tiled_properties_as_meta(point, object) + if options.custom_properties: + set_custom_properties(point, object) + + elif not "gid" in object: + # Not a tile object + if "type" in object and object.type == "navigation": + # Can't make navigation objects right now + print_error("Navigation polygons aren't supported in an object layer.") + continue # Non-fatal error + var shape = shape_from_object(object) + + if typeof(shape) != TYPE_OBJECT: + # Error happened + return shape + + if "type" in object and object.type == "occluder": + var occluder = LightOccluder2D.new() + var pos = Vector2() + var rot = 0 + + if "x" in object: + pos.x = float(object.x) + if "y" in object: + pos.y = float(object.y) + if "rotation" in object: + rot = float(object.rotation) + + occluder.visible = bool(object.visible) if "visible" in object else true + occluder.position = pos + occluder.rotation_degrees = rot + occluder.occluder = shape + if "name" in object and not str(object.name).empty(): + occluder.set_name(str(object.name)) + elif "id" in object and not str(object.id).empty(): + occluder.set_name(str(object.id)) + + if options.save_tiled_properties: + set_tiled_properties_as_meta(occluder, object) + if options.custom_properties: + set_custom_properties(occluder, object) + + object_layer.add_child(occluder) + occluder.set_owner(root) + + else: + var body = Area2D.new() if object.type == "area" else StaticBody2D.new() + + var offset = Vector2() + var collision + var pos = Vector2() + var rot = 0 + + if not ("polygon" in object or "polyline" in object): + # Regular shape + collision = CollisionShape2D.new() + collision.shape = shape + if shape is RectangleShape2D: + offset = shape.extents + elif shape is CircleShape2D: + offset = Vector2(shape.radius, shape.radius) + elif shape is CapsuleShape2D: + offset = Vector2(shape.radius, shape.height) + if shape.radius > shape.height: + var temp = shape.radius + shape.radius = shape.height + shape.height = temp + collision.rotation_degrees = 90 + shape.height *= 2 + collision.position = offset + else: + collision = CollisionPolygon2D.new() + var points = null + if shape is ConcavePolygonShape2D: + points = [] + var segments = shape.segments + for i in range(0, segments.size()): + if i % 2 != 0: + continue + points.push_back(segments[i]) + collision.build_mode = CollisionPolygon2D.BUILD_SEGMENTS + else: + points = shape.points + collision.build_mode = CollisionPolygon2D.BUILD_SOLIDS + collision.polygon = points + + collision.one_way_collision = object.type == "one-way" + + if "x" in object: + pos.x = float(object.x) + if "y" in object: + pos.y = float(object.y) + if "rotation" in object: + rot = float(object.rotation) + + body.set("editor/display_folded", true) + object_layer.add_child(body) + body.set_owner(root) + body.add_child(collision) + collision.set_owner(root) + + if options.save_tiled_properties: + set_tiled_properties_as_meta(body, object) + if options.custom_properties: + set_custom_properties(body, object) + + if "name" in object and not str(object.name).empty(): + body.set_name(str(object.name)) + elif "id" in object and not str(object.id).empty(): + body.set_name(str(object.id)) + body.visible = bool(object.visible) if "visible" in object else true + body.position = pos + body.rotation_degrees = rot + + else: # "gid" in object + var tile_raw_id = int(str(object.gid)) & 0xFFFFFFFF + var tile_id = tile_raw_id & ~(FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG) + + var is_tile_object = tileset.tile_get_region(tile_id).get_area() == 0 + var collisions = tileset.tile_get_shape_count(tile_id) + var has_collisions = collisions > 0 && object.has("type") && object.type != "sprite" + var sprite = Sprite.new() + var pos = Vector2() + var rot = 0 + var scale = Vector2(1, 1) + sprite.texture = tileset.tile_get_texture(tile_id) + var texture_size = sprite.texture.get_size() if sprite.texture != null else Vector2() + + if not is_tile_object: + sprite.region_enabled = true + sprite.region_rect = tileset.tile_get_region(tile_id) + texture_size = tileset.tile_get_region(tile_id).size + + sprite.flip_h = bool(tile_raw_id & FLIPPED_HORIZONTALLY_FLAG) + sprite.flip_v = bool(tile_raw_id & FLIPPED_VERTICALLY_FLAG) + + if "x" in object: + pos.x = float(object.x) + if "y" in object: + pos.y = float(object.y) + if "rotation" in object: + rot = float(object.rotation) + if texture_size != Vector2(): + if "width" in object and float(object.width) != texture_size.x: + scale.x = float(object.width) / texture_size.x + if "height" in object and float(object.height) != texture_size.y: + scale.y = float(object.height) / texture_size.y + + var obj_root = sprite + if has_collisions: + match object.type: + "area": obj_root = Area2D.new() + "kinematic": obj_root = KinematicBody2D.new() + "rigid": obj_root = RigidBody2D.new() + _: obj_root = StaticBody2D.new() + + object_layer.add_child(obj_root) + obj_root.owner = root + + obj_root.add_child(sprite) + sprite.owner = root + + var shapes = tileset.tile_get_shapes(tile_id) + for s in shapes: + var collision_node = CollisionShape2D.new() + collision_node.shape = s.shape + + collision_node.transform = s.shape_transform + if sprite.flip_h: + collision_node.position.x *= -1 + collision_node.position.x -= cell_size.x + collision_node.scale.x *= -1 + if sprite.flip_v: + collision_node.scale.y *= -1 + collision_node.position.y *= -1 + collision_node.position.y -= cell_size.y + obj_root.add_child(collision_node) + collision_node.owner = root + + if "name" in object and not str(object.name).empty(): + obj_root.set_name(str(object.name)) + elif "id" in object and not str(object.id).empty(): + obj_root.set_name(str(object.id)) + + obj_root.position = pos + obj_root.rotation_degrees = rot + obj_root.visible = bool(object.visible) if "visible" in object else true + obj_root.scale = scale + # Translate from Tiled bottom-left position to Godot top-left + sprite.centered = false + sprite.region_filter_clip = options.uv_clip + sprite.offset = Vector2(0, -texture_size.y) + + if not has_collisions: + object_layer.add_child(sprite) + sprite.set_owner(root) + + if options.save_tiled_properties: + set_tiled_properties_as_meta(obj_root, object) + if options.custom_properties: + if options.tile_metadata: + var tile_meta = tileset.get_meta("tile_meta") + if typeof(tile_meta) == TYPE_DICTIONARY and tile_id in tile_meta: + for prop in tile_meta[tile_id]: + obj_root.set_meta(prop, tile_meta[tile_id][prop]) + set_custom_properties(obj_root, object) + + elif layer.type == "group": + var group = Node2D.new() + var pos = Vector2() + if "x" in layer: + pos.x = float(layer.x) + if "y" in layer: + pos.y = float(layer.y) + group.modulate = Color(1.0, 1.0, 1.0, opacity) + group.visible = visible + group.position = pos + + if options.save_tiled_properties: + set_tiled_properties_as_meta(group, layer) + if options.custom_properties: + set_custom_properties(group, layer) + + if "name" in layer and not str(layer.name).empty(): + group.set_name(str(layer.name)) + + group.set("editor/display_folded", true) + parent.add_child(group) + group.set_owner(root) + + for sub_layer in layer.layers: + make_layer(sub_layer, group, root, data) + + else: + print_error("Unknown layer type ('%s') in '%s'" % [str(layer.type), str(layer.name) if "name" in layer else "[unnamed layer]"]) + return ERR_INVALID_DATA + + return OK + +func set_default_obj_params(object): + # Set default values for object + for attr in ["width", "height", "rotation", "x", "y"]: + if not attr in object: + object[attr] = 0 + if not "type" in object: + object.type = "" + if not "visible" in object: + object.visible = true + +# Makes a tileset from a array of tilesets data +# Since Godot supports only one TileSet per TileMap, all tilesets from Tiled are combined +func build_tileset_for_scene(tilesets, source_path, options): + var result = TileSet.new() + var err = ERR_INVALID_DATA + var tile_meta = {} + + for tileset in tilesets: + var ts = tileset + var ts_source_path = source_path + if "source" in ts: + if not "firstgid" in tileset or not str(tileset.firstgid).is_valid_integer(): + print_error("Missing or invalid firstgid tileset property.") + return ERR_INVALID_DATA + + ts_source_path = source_path.get_base_dir().plus_file(ts.source) + # Used later for templates + _tileset_path_to_first_gid[ts_source_path] = tileset.firstgid + + if ts.source.get_extension().to_lower() == "tsx": + var tsx_reader = TiledXMLToDictionary.new() + ts = tsx_reader.read_tsx(ts_source_path) + if typeof(ts) != TYPE_DICTIONARY: + # Error happened + return ts + else: # JSON Tileset + var f = File.new() + err = f.open(ts_source_path, File.READ) + if err != OK: + print_error("Error opening tileset '%s'." % [ts.source]) + return err + + var json_res = JSON.parse(f.get_as_text()) + if json_res.error != OK: + print_error("Error parsing tileset '%s' JSON: %s" % [ts.source, json_res.error_string]) + return ERR_INVALID_DATA + + ts = json_res.result + if typeof(ts) != TYPE_DICTIONARY: + print_error("Tileset '%s' is not a dictionary." % [ts.source]) + return ERR_INVALID_DATA + + ts.firstgid = tileset.firstgid + + err = validate_tileset(ts) + if err != OK: + return err + + var has_global_image = "image" in ts + + var spacing = int(ts.spacing) if "spacing" in ts and str(ts.spacing).is_valid_integer() else 0 + var margin = int(ts.margin) if "margin" in ts and str(ts.margin).is_valid_integer() else 0 + var firstgid = int(ts.firstgid) + var columns = int(ts.columns) if "columns" in ts and str(ts.columns).is_valid_integer() else -1 + + var image = null + var imagesize = Vector2() + + if has_global_image: + image = load_image(ts.image, ts_source_path, options) + if typeof(image) != TYPE_OBJECT: + # Error happened + return image + imagesize = Vector2(int(ts.imagewidth), int(ts.imageheight)) + + var tilesize = Vector2(int(ts.tilewidth), int(ts.tileheight)) + var tilecount = int(ts.tilecount) + + var gid = firstgid + + var x = margin + var y = margin + + var i = 0 + var column = 0 + while i < tilecount: + var tilepos = Vector2(x, y) + var region = Rect2(tilepos, tilesize) + + var rel_id = str(gid - firstgid) + + result.create_tile(gid) + + if has_global_image: + result.tile_set_texture(gid, image) + result.tile_set_region(gid, region) + if options.apply_offset: + result.tile_set_texture_offset(gid, Vector2(0, -tilesize.y)) + elif not rel_id in ts.tiles: + gid += 1 + continue + else: + var image_path = ts.tiles[rel_id].image + image = load_image(image_path, ts_source_path, options) + if typeof(image) != TYPE_OBJECT: + # Error happened + return image + result.tile_set_texture(gid, image) + if options.apply_offset: + result.tile_set_texture_offset(gid, Vector2(0, -image.get_height())) + + if "tiles" in ts and rel_id in ts.tiles and "objectgroup" in ts.tiles[rel_id] \ + and "objects" in ts.tiles[rel_id].objectgroup: + for object in ts.tiles[rel_id].objectgroup.objects: + + var shape = shape_from_object(object) + + if typeof(shape) != TYPE_OBJECT: + # Error happened + return shape + + var offset = Vector2(float(object.x), float(object.y)) + if options.apply_offset: + offset += result.tile_get_texture_offset(gid) + if "width" in object and "height" in object: + offset += Vector2(float(object.width) / 2, float(object.height) / 2) + + if object.type == "navigation": + result.tile_set_navigation_polygon(gid, shape) + result.tile_set_navigation_polygon_offset(gid, offset) + elif object.type == "occluder": + result.tile_set_light_occluder(gid, shape) + result.tile_set_occluder_offset(gid, offset) + else: + result.tile_add_shape(gid, shape, Transform2D(0, offset), object.type == "one-way") + + if options.custom_properties and options.tile_metadata and "tileproperties" in ts \ + and "tilepropertytypes" in ts and rel_id in ts.tileproperties and rel_id in ts.tilepropertytypes: + tile_meta[gid] = get_custom_properties(ts.tileproperties[rel_id], ts.tilepropertytypes[rel_id]) + if options.save_tiled_properties and rel_id in ts.tiles: + for property in whitelist_properties: + if property in ts.tiles[rel_id]: + if not gid in tile_meta: tile_meta[gid] = {} + tile_meta[gid][property] = ts.tiles[rel_id][property] + + gid += 1 + column += 1 + i += 1 + x += int(tilesize.x) + spacing + if (columns > 0 and column >= columns) or x >= int(imagesize.x) - margin or (x + int(tilesize.x)) > int(imagesize.x): + x = margin + y += int(tilesize.y) + spacing + column = 0 + + if str(ts.name) != "": + result.resource_name = str(ts.name) + + if options.save_tiled_properties: + set_tiled_properties_as_meta(result, ts) + if options.custom_properties: + if "properties" in ts and "propertytypes" in ts: + set_custom_properties(result, ts) + + if options.custom_properties and options.tile_metadata: + result.set_meta("tile_meta", tile_meta) + + return result + +# Makes a standalone TileSet. Useful for importing TileSets from Tiled +# Returns an error code if fails +func build_tileset(source_path, options): + var set = read_tileset_file(source_path) + if typeof(set) == TYPE_INT: + return set + if typeof(set) != TYPE_DICTIONARY: + return ERR_INVALID_DATA + + # Just to validate and build correctly using the existing builder + set["firstgid"] = 0 + + return build_tileset_for_scene([set], source_path, options) + +# Loads an image from a given path +# Returns a Texture +func load_image(rel_path, source_path, options): + var flags = options.image_flags if "image_flags" in options else Texture.FLAGS_DEFAULT + var embed = options.embed_internal_images if "embed_internal_images" in options else false + + var ext = rel_path.get_extension().to_lower() + if ext != "png" and ext != "jpg": + print_error("Unsupported image format: %s. Use PNG or JPG instead." % [ext]) + return ERR_FILE_UNRECOGNIZED + + var total_path = rel_path + if rel_path.is_rel_path(): + total_path = ProjectSettings.globalize_path(source_path.get_base_dir()).plus_file(rel_path) + total_path = ProjectSettings.localize_path(total_path) + + var dir = Directory.new() + if not dir.file_exists(total_path): + print_error("Image not found: %s" % [total_path]) + return ERR_FILE_NOT_FOUND + + if not total_path.begins_with("res://"): + # External images need to be embedded + embed = true + + var image = null + if embed: + image = ImageTexture.new() + image.load(total_path) + else: + image = ResourceLoader.load(total_path, "ImageTexture") + + if image != null: + image.set_flags(flags) + + return image + +# Reads a file and returns its contents as a dictionary +# Returns an error code if fails +func read_file(path): + if path.get_extension().to_lower() == "tmx": + var tmx_to_dict = TiledXMLToDictionary.new() + var data = tmx_to_dict.read_tmx(path) + if typeof(data) != TYPE_DICTIONARY: + # Error happened + print_error("Error parsing map file '%s'." % [path]) + # Return error or result + return data + + # Not TMX, must be JSON + var file = File.new() + var err = file.open(path, File.READ) + if err != OK: + return err + + var content = JSON.parse(file.get_as_text()) + if content.error != OK: + print_error("Error parsing JSON: " + content.error_string) + return content.error + + return content.result + +# Reads a tileset file and return its contents as a dictionary +# Returns an error code if fails +func read_tileset_file(path): + if path.get_extension().to_lower() == "tsx": + var tmx_to_dict = TiledXMLToDictionary.new() + var data = tmx_to_dict.read_tsx(path) + if typeof(data) != TYPE_DICTIONARY: + # Error happened + print_error("Error parsing map file '%s'." % [path]) + # Return error or result + return data + + # Not TSX, must be JSON + var file = File.new() + var err = file.open(path, File.READ) + if err != OK: + return err + + var content = JSON.parse(file.get_as_text()) + if content.error != OK: + print_error("Error parsing JSON: " + content.error_string) + return content.error + + return content.result + +# Creates a shape from an object data +# Returns a valid shape depending on the object type (collision/occluder/navigation) +func shape_from_object(object): + var shape = ERR_INVALID_DATA + set_default_obj_params(object) + + if "polygon" in object or "polyline" in object: + var vertices = PoolVector2Array() + + if "polygon" in object: + for point in object.polygon: + vertices.push_back(Vector2(float(point.x), float(point.y))) + else: + for point in object.polyline: + vertices.push_back(Vector2(float(point.x), float(point.y))) + + if object.type == "navigation": + shape = NavigationPolygon.new() + shape.vertices = vertices + shape.add_outline(vertices) + shape.make_polygons_from_outlines() + elif object.type == "occluder": + shape = OccluderPolygon2D.new() + shape.polygon = vertices + shape.closed = "polygon" in object + else: + if is_convex(vertices): + var sorter = PolygonSorter.new() + vertices = sorter.sort_polygon(vertices) + shape = ConvexPolygonShape2D.new() + shape.points = vertices + else: + shape = ConcavePolygonShape2D.new() + var segments = [vertices[0]] + for x in range(1, vertices.size()): + segments.push_back(vertices[x]) + segments.push_back(vertices[x]) + segments.push_back(vertices[0]) + shape.segments = PoolVector2Array(segments) + + elif "ellipse" in object: + if object.type == "navigation" or object.type == "occluder": + print_error("Ellipse shapes are not supported as navigation or occluder. Use polygon/polyline instead.") + return ERR_INVALID_DATA + + if not "width" in object or not "height" in object: + print_error("Missing width or height in ellipse shape.") + return ERR_INVALID_DATA + + var w = abs(float(object.width)) + var h = abs(float(object.height)) + + if w == h: + shape = CircleShape2D.new() + shape.radius = w / 2.0 + else: + # Using a capsule since it's the closest from an ellipse + shape = CapsuleShape2D.new() + shape.radius = w / 2.0 + shape.height = h / 2.0 + + else: # Rectangle + if not "width" in object or not "height" in object: + print_error("Missing width or height in rectangle shape.") + return ERR_INVALID_DATA + + var size = Vector2(float(object.width), float(object.height)) + + if object.type == "navigation" or object.type == "occluder": + # Those types only accept polygons, so make one from the rectangle + var vertices = PoolVector2Array([ + Vector2(0, 0), + Vector2(size.x, 0), + size, + Vector2(0, size.y) + ]) + if object.type == "navigation": + shape = NavigationPolygon.new() + shape.vertices = vertices + shape.add_outline(vertices) + shape.make_polygons_from_outlines() + else: + shape = OccluderPolygon2D.new() + shape.polygon = vertices + else: + shape = RectangleShape2D.new() + shape.extents = size / 2.0 + + return shape + +# Determines if the set of vertices is convex or not +# Returns a boolean +func is_convex(vertices): + var size = vertices.size() + if size <= 3: + # Less than 3 verices can't be concave + return true + + var cp = 0 + + for i in range(0, size + 2): + var p1 = vertices[(i + 0) % size] + var p2 = vertices[(i + 1) % size] + var p3 = vertices[(i + 2) % size] + + var prev_cp = cp + cp = (p2.x - p1.x) * (p3.y - p2.y) - (p2.y - p1.y) * (p3.x - p2.x) + if i > 0 and sign(cp) != sign(prev_cp): + return false + + return true + +# Decompress the data of the layer +# Compression argument is a string, either "gzip" or "zlib" +func decompress_layer_data(layer_data, compression, map_size): + if compression != "gzip" and compression != "zlib": + print_error("Unrecognized compression format: %s" % [compression]) + return ERR_INVALID_DATA + + var compression_type = File.COMPRESSION_DEFLATE if compression == "zlib" else File.COMPRESSION_GZIP + var expected_size = int(map_size.x) * int(map_size.y) * 4 + var raw_data = Marshalls.base64_to_raw(layer_data).decompress(expected_size, compression_type) + + return decode_layer(raw_data) + +# Reads the layer as a base64 data +# Returns an array of ints as the decoded layer would be +func read_base64_layer_data(layer_data): + var decoded = Marshalls.base64_to_raw(layer_data) + return decode_layer(decoded) + +# Reads a PoolByteArray and returns the layer array +# Used for base64 encoded and compressed layers +func decode_layer(layer_data): + var result = [] + for i in range(0, layer_data.size(), 4): + var num = (layer_data[i]) | \ + (layer_data[i + 1] << 8) | \ + (layer_data[i + 2] << 16) | \ + (layer_data[i + 3] << 24) + result.push_back(num) + return result + +# Set the custom properties into the metadata of the object +func set_custom_properties(object, tiled_object): + if not "properties" in tiled_object or not "propertytypes" in tiled_object: + return + + var properties = get_custom_properties(tiled_object.properties, tiled_object.propertytypes) + for property in properties: + object.set_meta(property, properties[property]) + +# Get the custom properties as a dictionary +# Useful for tile meta, which is not stored directly +func get_custom_properties(properties, types): + var result = {} + + for property in properties: + var value = null + if str(types[property]).to_lower() == "bool": + value = bool(properties[property]) + elif str(types[property]).to_lower() == "int": + value = int(properties[property]) + elif str(types[property]).to_lower() == "float": + value = float(properties[property]) + elif str(types[property]).to_lower() == "color": + value = Color(properties[property]) + else: + value = str(properties[property]) + result[property] = value + return result + +# Get the available whitelisted properties from the Tiled object +# And them as metadata in the Godot object +func set_tiled_properties_as_meta(object, tiled_object): + for property in whitelist_properties: + if property in tiled_object: + object.set_meta(property, tiled_object[property]) + +# Custom function to sort objects in an object layer +# This is done to support the "topdown" draw order, which sorts by 'y' coordinate +func object_sorter(first, second): + if first.y == second.y: + return first.id < second.id + return first.y < second.y + +# Validates the map dictionary content for missing or invalid keys +# Returns an error code +func validate_map(map): + if not "type" in map or map.type != "map": + print_error("Missing or invalid type property.") + return ERR_INVALID_DATA + elif not "version" in map or int(map.version) != 1: + print_error("Missing or invalid map version.") + return ERR_INVALID_DATA + elif not "tileheight" in map or not str(map.tileheight).is_valid_integer(): + print_error("Missing or invalid tileheight property.") + return ERR_INVALID_DATA + elif not "tilewidth" in map or not str(map.tilewidth).is_valid_integer(): + print_error("Missing or invalid tilewidth property.") + return ERR_INVALID_DATA + elif not "layers" in map or typeof(map.layers) != TYPE_ARRAY: + print_error("Missing or invalid layers property.") + return ERR_INVALID_DATA + elif not "tilesets" in map or typeof(map.tilesets) != TYPE_ARRAY: + print_error("Missing or invalid tilesets property.") + return ERR_INVALID_DATA + if "orientation" in map and (map.orientation == "staggered" or map.orientation == "hexagonal"): + if not "staggeraxis" in map: + print_error("Missing stagger axis property.") + return ERR_INVALID_DATA + elif not "staggerindex" in map: + print_error("Missing stagger axis property.") + return ERR_INVALID_DATA + return OK + +# Validates the tileset dictionary content for missing or invalid keys +# Returns an error code +func validate_tileset(tileset): + if not "firstgid" in tileset or not str(tileset.firstgid).is_valid_integer(): + print_error("Missing or invalid firstgid tileset property.") + return ERR_INVALID_DATA + elif not "tilewidth" in tileset or not str(tileset.tilewidth).is_valid_integer(): + print_error("Missing or invalid tilewidth tileset property.") + return ERR_INVALID_DATA + elif not "tileheight" in tileset or not str(tileset.tileheight).is_valid_integer(): + print_error("Missing or invalid tileheight tileset property.") + return ERR_INVALID_DATA + elif not "tilecount" in tileset or not str(tileset.tilecount).is_valid_integer(): + print_error("Missing or invalid tilecount tileset property.") + return ERR_INVALID_DATA + if not "image" in tileset: + for tile in tileset.tiles: + if not "image" in tileset.tiles[tile]: + print_error("Missing or invalid image in tileset property.") + return ERR_INVALID_DATA + elif not "imagewidth" in tileset.tiles[tile] or not str(tileset.tiles[tile].imagewidth).is_valid_integer(): + print_error("Missing or invalid imagewidth tileset property 1.") + return ERR_INVALID_DATA + elif not "imageheight" in tileset.tiles[tile] or not str(tileset.tiles[tile].imageheight).is_valid_integer(): + print_error("Missing or invalid imageheight tileset property.") + return ERR_INVALID_DATA + else: + if not "imagewidth" in tileset or not str(tileset.imagewidth).is_valid_integer(): + print_error("Missing or invalid imagewidth tileset property 2.") + return ERR_INVALID_DATA + elif not "imageheight" in tileset or not str(tileset.imageheight).is_valid_integer(): + print_error("Missing or invalid imageheight tileset property.") + return ERR_INVALID_DATA + return OK + +# Validates the layer dictionary content for missing or invalid keys +# Returns an error code +func validate_layer(layer): + if not "type" in layer: + print_error("Missing or invalid type layer property.") + return ERR_INVALID_DATA + elif not "name" in layer: + print_error("Missing or invalid name layer property.") + return ERR_INVALID_DATA + match layer.type: + "tilelayer": + if not "height" in layer or not str(layer.height).is_valid_integer(): + print_error("Missing or invalid layer height property.") + return ERR_INVALID_DATA + elif not "width" in layer or not str(layer.width).is_valid_integer(): + print_error("Missing or invalid layer width property.") + return ERR_INVALID_DATA + elif not "data" in layer: + if not "chunks" in layer: + print_error("Missing data or chunks layer properties.") + return ERR_INVALID_DATA + elif typeof(layer.chunks) != TYPE_ARRAY: + print_error("Invalid chunks layer property.") + return ERR_INVALID_DATA + elif "encoding" in layer: + if layer.encoding == "base64" and typeof(layer.data) != TYPE_STRING: + print_error("Invalid data layer property.") + return ERR_INVALID_DATA + if layer.encoding != "base64" and typeof(layer.data) != TYPE_ARRAY: + print_error("Invalid data layer property.") + return ERR_INVALID_DATA + elif typeof(layer.data) != TYPE_ARRAY: + print_error("Invalid data layer property.") + return ERR_INVALID_DATA + if "compression" in layer: + if layer.compression != "gzip" and layer.compression != "zlib": + print_error("Invalid compression type.") + return ERR_INVALID_DATA + "imagelayer": + if not "image" in layer or typeof(layer.image) != TYPE_STRING: + print_error("Missing or invalid image path for layer.") + return ERR_INVALID_DATA + "objectgroup": + if not "objects" in layer or typeof(layer.objects) != TYPE_ARRAY: + print_error("Missing or invalid objects array for layer.") + return ERR_INVALID_DATA + "group": + if not "layers" in layer or typeof(layer.layers) != TYPE_ARRAY: + print_error("Missing or invalid layer array for group layer.") + return ERR_INVALID_DATA + return OK + +func validate_chunk(chunk): + if not "data" in chunk: + print_error("Missing data chunk property.") + return ERR_INVALID_DATA + elif not "height" in chunk or not str(chunk.height).is_valid_integer(): + print_error("Missing or invalid height chunk property.") + return ERR_INVALID_DATA + elif not "width" in chunk or not str(chunk.width).is_valid_integer(): + print_error("Missing or invalid width chunk property.") + return ERR_INVALID_DATA + elif not "x" in chunk or not str(chunk.x).is_valid_integer(): + print_error("Missing or invalid x chunk property.") + return ERR_INVALID_DATA + elif not "y" in chunk or not str(chunk.y).is_valid_integer(): + print_error("Missing or invalid y chunk property.") + return ERR_INVALID_DATA + return OK + +# Custom function to print error, to centralize the prefix addition +func print_error(err): + printerr(error_prefix + err) + +func get_template(path): + # If this template has not yet been loaded + if not _loaded_templates.has(path): + # IS XML + if path.get_extension().to_lower() == "tx": + var parser = XMLParser.new() + var err = parser.open(path) + if err != OK: + print_error("Error opening TX file '%s'." % [path]) + return err + var content = parse_template(parser, path) + if typeof(content) != TYPE_DICTIONARY: + # Error happened + print_error("Error parsing template map file '%s'." % [path]) + return false + _loaded_templates[path] = content + + # IS JSON + else: + var file = File.new() + var err = file.open(path, File.READ) + if err != OK: + return err + + var json_res = JSON.parse(file.get_as_text()) + if json_res.error != OK: + print_error("Error parsing JSON template map file '%s'." % [path]) + return json_res.error + + var result = json_res.result + if typeof(result) != TYPE_DICTIONARY: + print_error("Error parsing JSON template map file '%s'." % [path]) + return ERR_INVALID_DATA + + var object = result.object + if object.has("gid"): + if result.has("tileset"): + var ts_path = remove_filename_from_path(path) + result.tileset.source + var tileset_gid_increment = get_first_gid_from_tileset_path(ts_path) - 1 + object.gid += tileset_gid_increment + + _loaded_templates[path] = object + + var dict = _loaded_templates[path] + var dictCopy = {} + for k in dict: + dictCopy[k] = dict[k] + + return dictCopy + +func parse_template(parser, path): + var err = OK + # Template root node shouldn't have attributes + var data = {} + var tileset_gid_increment = 0 + data.id = 0 + + err = parser.read() + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "template": + break + + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "tileset": + var ts_path = remove_filename_from_path(path) + parser.get_named_attribute_value_safe("source") + tileset_gid_increment = get_first_gid_from_tileset_path(ts_path) - 1 + data.tileset = ts_path + + if parser.get_node_name() == "object": + var object = TiledXMLToDictionary.parse_object(parser) + for k in object: + data[k] = object[k] + + err = parser.read() + + if data.has("gid"): + data["gid"] += tileset_gid_increment + + return data + +func get_first_gid_from_tileset_path(path): + for t in _tileset_path_to_first_gid: + if is_same_file(path, t): + return _tileset_path_to_first_gid[t] + + return 0 + +static func get_filename_from_path(path): + var substrings = path.split("/", false) + var file_name = substrings[substrings.size() - 1] + return file_name + +static func remove_filename_from_path(path): + var file_name = get_filename_from_path(path) + var stringSize = path.length() - file_name.length() + var file_path = path.substr(0,stringSize) + return file_path + +static func is_same_file(path1, path2): + var file1 = File.new() + var err = file1.open(path1, File.READ) + if err != OK: + return err + + var file2 = File.new() + err = file2.open(path2, File.READ) + if err != OK: + return err + + var file1_str = file1.get_as_text() + var file2_str = file2.get_as_text() + + if file1_str == file2_str: + return true + + return false + +static func apply_template(object, template_immutable): + for k in template_immutable: + # Do not overwrite any object data + if typeof(template_immutable[k]) == TYPE_DICTIONARY: + if not object.has(k): + object[k] = {} + apply_template(object[k], template_immutable[k]) + + elif not object.has(k): + object[k] = template_immutable[k] diff --git a/Godette-Tale/addons/vnen.tiled_importer/tiled_tileset_import_plugin.gd b/Godette-Tale/addons/vnen.tiled_importer/tiled_tileset_import_plugin.gd new file mode 100644 index 0000000..c7f4561 --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/tiled_tileset_import_plugin.gd @@ -0,0 +1,122 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 George Marques +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +tool +extends EditorImportPlugin + +enum { PRESET_DEFAULT, PRESET_PIXEL_ART } + +const TiledMapReader = preload("tiled_map_reader.gd") + +func get_importer_name(): + return "vnen.tiled_tileset_importer" + +func get_visible_name(): + return "TileSet from Tiled" + +func get_recognized_extensions(): + if ProjectSettings.get_setting("tiled_importer/enable_json_format"): + return ["json", "tsx"] + else: + return ["tsx"] + +func get_save_extension(): + return "res" + +func get_resource_type(): + return "TileSet" + +func get_preset_count(): + return 2 + +func get_preset_name(preset): + match preset: + PRESET_DEFAULT: return "Default" + PRESET_PIXEL_ART: return "Pixel Art" + +func get_import_options(preset): + return [ + { + "name": "custom_properties", + "default_value": true + }, + { + "name": "tile_metadata", + "default_value": false + }, + { + "name": "image_flags", + "default_value": 0 if preset == PRESET_PIXEL_ART else Texture.FLAGS_DEFAULT, + "property_hint": PROPERTY_HINT_FLAGS, + "hint_string": "Mipmaps,Repeat,Filter,Anisotropic,sRGB,Mirrored Repeat" + }, + { + "name": "embed_internal_images", + "default_value": true if preset == PRESET_PIXEL_ART else false + }, + { + "name": "save_tiled_properties", + "default_value": false + }, + { + "name": "apply_offset", + "default_value": false + }, + { + "name": "post_import_script", + "default_value": "", + "property_hint": PROPERTY_HINT_FILE, + "hint_string": "*.gd;GDScript" + } + ] + +func get_option_visibility(option, options): + return true + +func import(source_file, save_path, options, r_platform_variants, r_gen_files): + var map_reader = TiledMapReader.new() + + var tileset = map_reader.build_tileset(source_file, options) + + if typeof(tileset) != TYPE_OBJECT: + # Error happened + return tileset + + # Post imports script + if not options.post_import_script.empty(): + var script = load(options.post_import_script) + if not script or not script is GDScript: + printerr("Post import script is not a GDScript.") + return ERR_INVALID_PARAMETER + + script = script.new() + if not script.has_method("post_import"): + printerr("Post import script does not have a 'post_import' method.") + return ERR_INVALID_PARAMETER + + tileset = script.post_import(tileset) + + if not tileset or not tileset is TileSet: + printerr("Invalid TileSet returned from post import script.") + return ERR_INVALID_DATA + + return ResourceSaver.save("%s.%s" % [save_path, get_save_extension()], tileset) diff --git a/Godette-Tale/addons/vnen.tiled_importer/tiled_xml_to_dict.gd b/Godette-Tale/addons/vnen.tiled_importer/tiled_xml_to_dict.gd new file mode 100644 index 0000000..3882de6 --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/tiled_xml_to_dict.gd @@ -0,0 +1,551 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 George Marques +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +tool +extends Reference + +# Reads a TMX file from a path and return a Dictionary with the same structure +# as the JSON map format +# Returns an error code if failed +func read_tmx(path): + var parser = XMLParser.new() + var err = parser.open(path) + if err != OK: + printerr("Error opening TMX file '%s'." % [path]) + return err + + while parser.get_node_type() != XMLParser.NODE_ELEMENT: + err = parser.read() + if err != OK: + printerr("Error parsing TMX file '%s' (around line %d)." % [path, parser.get_current_line()]) + return err + + if parser.get_node_name().to_lower() != "map": + printerr("Error parsing TMX file '%s'. Expected 'map' element.") + return ERR_INVALID_DATA + + var data = attributes_to_dict(parser) + if not "infinite" in data: + data.infinite = false + data.type = "map" + data.tilesets = [] + data.layers = [] + + err = parser.read() + if err != OK: + printerr("Error parsing TMX file '%s' (around line %d)." % [path, parser.get_current_line()]) + return err + + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "map": + break + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "tileset": + # Empty element means external tileset + if not parser.is_empty(): + var tileset = parse_tileset(parser) + if typeof(tileset) != TYPE_DICTIONARY: + # Error happened + return err + data.tilesets.push_back(tileset) + else: + var tileset_data = attributes_to_dict(parser) + if not "source" in tileset_data: + printerr("Error parsing TMX file '%s'. Missing tileset source (around line %d)." % [path, parser.get_current_line()]) + return ERR_INVALID_DATA + data.tilesets.push_back(tileset_data) + + elif parser.get_node_name() == "layer": + var layer = parse_tile_layer(parser, data.infinite) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file '%s'. Invalid tile layer data (around line %d)." % [path, parser.get_current_line()]) + return ERR_INVALID_DATA + data.layers.push_back(layer) + + elif parser.get_node_name() == "imagelayer": + var layer = parse_image_layer(parser) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file '%s'. Invalid image layer data (around line %d)." % [path, parser.get_current_line()]) + return ERR_INVALID_DATA + data.layers.push_back(layer) + + elif parser.get_node_name() == "objectgroup": + var layer = parse_object_layer(parser) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file '%s'. Invalid object layer data (around line %d)." % [path, parser.get_current_line()]) + return ERR_INVALID_DATA + data.layers.push_back(layer) + + elif parser.get_node_name() == "group": + var layer = parse_group_layer(parser, data.infinite) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file '%s'. Invalid group layer data (around line %d)." % [path, parser.get_current_line()]) + return ERR_INVALID_DATA + data.layers.push_back(layer) + + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + if typeof(prop_data) == TYPE_STRING: + return prop_data + + data.properties = prop_data.properties + data.propertytypes = prop_data.propertytypes + + err = parser.read() + + return data + +# Reads a TSX and return a tileset dictionary +# Returns an error code if fails +func read_tsx(path): + var parser = XMLParser.new() + var err = parser.open(path) + if err != OK: + printerr("Error opening TSX file '%s'." % [path]) + return err + + while parser.get_node_type() != XMLParser.NODE_ELEMENT: + err = parser.read() + if err != OK: + printerr("Error parsing TSX file '%s' (around line %d)." % [path, parser.get_current_line()]) + return err + + if parser.get_node_name().to_lower() != "tileset": + printerr("Error parsing TMX file '%s'. Expected 'map' element.") + return ERR_INVALID_DATA + + var tileset = parse_tileset(parser) + + return tileset + +# Parses a tileset element from the XML and return a dictionary +# Return an error code if fails +func parse_tileset(parser): + var err = OK + var data = attributes_to_dict(parser) + data.tiles = {} + + err = parser.read() + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "tileset": + break + + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "tile": + var attr = attributes_to_dict(parser) + var tile_data = parse_tile_data(parser) + if typeof(tile_data) != TYPE_DICTIONARY: + # Error happened + return tile_data + if "properties" in tile_data and "propertytypes" in tile_data: + if not "tileproperties" in data: + data.tileproperties = {} + data.tilepropertytypes = {} + data.tileproperties[str(attr.id)] = tile_data.properties + data.tilepropertytypes[str(attr.id)] = tile_data.propertytypes + tile_data.erase("tileproperties") + tile_data.erase("tilepropertytypes") + data.tiles[str(attr.id)] = tile_data + + elif parser.get_node_name() == "image": + var attr = attributes_to_dict(parser) + if not "source" in attr: + printerr("Error loading image tag. No source attribute found (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + data.image = attr.source + if "width" in attr: + data.imagewidth = attr.width + if "height" in attr: + data.imageheight = attr.height + + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + if typeof(prop_data) != TYPE_DICTIONARY: + # Error happened + return prop_data + + data.properties = prop_data.properties + data.propertytypes = prop_data.propertytypes + + err = parser.read() + + return data + + +# Parses the data of a single tile from the XML and return a dictionary +# Returns an error code if fails +func parse_tile_data(parser): + var err = OK + var data = {} + var obj_group = {} + if parser.is_empty(): + return data + + err = parser.read() + while err == OK: + + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "tile": + return data + elif parser.get_node_name() == "objectgroup": + data.objectgroup = obj_group + + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "image": + # If there are multiple images in one tile we only use the last one. + var attr = attributes_to_dict(parser) + if not "source" in attr: + printerr("Error loading image tag. No source attribute found (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + data.image = attr.source + data.imagewidth = attr.width + data.imageheight = attr.height + + elif parser.get_node_name() == "objectgroup": + obj_group = attributes_to_dict(parser) + for attr in ["width", "height", "offsetx", "offsety"]: + if not attr in obj_group: + data[attr] = 0 + if not "opacity" in data: + data.opacity = 1 + if not "visible" in data: + data.visible = true + if parser.is_empty(): + data.objectgroup = obj_group + + elif parser.get_node_name() == "object": + if not "objects" in obj_group: + obj_group.objects = [] + var obj = parse_object(parser) + if typeof(obj) != TYPE_DICTIONARY: + # Error happened + return obj + obj_group.objects.push_back(obj) + + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + data["properties"] = prop_data.properties + data["propertytypes"] = prop_data.propertytypes + + err = parser.read() + + return data + +# Parses the data of a single object from the XML and return a dictionary +# Returns an error code if fails +static func parse_object(parser): + var err = OK + var data = attributes_to_dict(parser) + + if not parser.is_empty(): + err = parser.read() + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "object": + break + + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + data["properties"] = prop_data.properties + data["propertytypes"] = prop_data.propertytypes + + elif parser.get_node_name() == "point": + data.point = true + + elif parser.get_node_name() == "ellipse": + data.ellipse = true + + elif parser.get_node_name() == "polygon" or parser.get_node_name() == "polyline": + var points = [] + var points_raw = parser.get_named_attribute_value("points").split(" ", false, 0) + + for pr in points_raw: + points.push_back({ + "x": float(pr.split(",")[0]), + "y": float(pr.split(",")[1]), + }) + + data[parser.get_node_name()] = points + + err = parser.read() + + return data + + +# Parses a tile layer from the XML and return a dictionary +# Returns an error code if fails +func parse_tile_layer(parser, infinite): + var err = OK + var data = attributes_to_dict(parser) + data.type = "tilelayer" + if not "x" in data: + data.x = 0 + if not "y" in data: + data.y = 0 + if infinite: + data.chunks = [] + else: + data.data = [] + + var current_chunk = null + var encoding = "" + + if not parser.is_empty(): + err = parser.read() + + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "layer": + break + elif parser.get_node_name() == "chunk": + data.chunks.push_back(current_chunk) + current_chunk = null + + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "data": + var attr = attributes_to_dict(parser) + + if "compression" in attr: + data.compression = attr.compression + + if "encoding" in attr: + encoding = attr.encoding + if attr.encoding != "csv": + data.encoding = attr.encoding + + if not infinite: + err = parser.read() + if err != OK: + return err + + if attr.encoding != "csv": + data.data = parser.get_node_data().strip_edges() + else: + var csv = parser.get_node_data().split(",", false) + + for v in csv: + data.data.push_back(int(v.strip_edges())) + + elif parser.get_node_name() == "tile": + var gid = int(parser.get_named_attribute_value_safe("gid")) + if infinite: + current_chunk.data.push_back(gid) + else: + data.data.push_back(gid) + + elif parser.get_node_name() == "chunk": + current_chunk = attributes_to_dict(parser) + current_chunk.data = [] + if encoding != "": + err = parser.read() + if err != OK: + return err + if encoding != "csv": + current_chunk.data = parser.get_node_data().strip_edges() + else: + var csv = parser.get_node_data().split(",", false) + for v in csv: + current_chunk.data.push_back(int(v.strip_edges())) + + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + if typeof(prop_data) == TYPE_STRING: + return prop_data + + data.properties = prop_data.properties + data.propertytypes = prop_data.propertytypes + + err = parser.read() + + return data + +# Parses an object layer from the XML and return a dictionary +# Returns an error code if fails +func parse_object_layer(parser): + var err = OK + var data = attributes_to_dict(parser) + data.type = "objectgroup" + data.objects = [] + + if not parser.is_empty(): + err = parser.read() + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "objectgroup": + break + if parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "object": + data.objects.push_back(parse_object(parser)) + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + if typeof(prop_data) != TYPE_DICTIONARY: + # Error happened + return prop_data + data.properties = prop_data.properties + data.propertytypes = prop_data.propertytypes + + err = parser.read() + + return data + +# Parses an image layer from the XML and return a dictionary +# Returns an error code if fails +func parse_image_layer(parser): + var err = OK + var data = attributes_to_dict(parser) + data.type = "imagelayer" + data.image = "" + + if not parser.is_empty(): + err = parser.read() + + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name().to_lower() == "imagelayer": + break + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name().to_lower() == "image": + var image = attributes_to_dict(parser) + if not image.has("source"): + printerr("Missing source attribute in imagelayer (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + data.image = image.source + + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + if typeof(prop_data) != TYPE_DICTIONARY: + # Error happened + return prop_data + data.properties = prop_data.properties + data.propertytypes = prop_data.propertytypes + + err = parser.read() + + return data + +# Parses a group layer from the XML and return a dictionary +# Returns an error code if fails +func parse_group_layer(parser, infinite): + var err = OK + var result = attributes_to_dict(parser) + result.type = "group" + result.layers = [] + + if not parser.is_empty(): + err = parser.read() + + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name().to_lower() == "group": + break + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "layer": + var layer = parse_tile_layer(parser, infinite) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file. Invalid tile layer data (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + result.layers.push_back(layer) + + elif parser.get_node_name() == "imagelayer": + var layer = parse_image_layer(parser) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file. Invalid image layer data (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + result.layers.push_back(layer) + + elif parser.get_node_name() == "objectgroup": + var layer = parse_object_layer(parser) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file. Invalid object layer data (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + result.layers.push_back(layer) + + elif parser.get_node_name() == "group": + var layer = parse_group_layer(parser, infinite) + if typeof(layer) != TYPE_DICTIONARY: + printerr("Error parsing TMX file. Invalid group layer data (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + result.layers.push_back(layer) + + elif parser.get_node_name() == "properties": + var prop_data = parse_properties(parser) + if typeof(prop_data) == TYPE_STRING: + return prop_data + + result.properties = prop_data.properties + result.propertytypes = prop_data.propertytypes + + err = parser.read() + return result + +# Parses properties data from the XML and return a dictionary +# Returns an error code if fails +static func parse_properties(parser): + var err = OK + var data = { + "properties": {}, + "propertytypes": {}, + } + + if not parser.is_empty(): + err = parser.read() + + while err == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "properties": + break + elif parser.get_node_type() == XMLParser.NODE_ELEMENT: + if parser.get_node_name() == "property": + var prop_data = attributes_to_dict(parser) + if not (prop_data.has("name") and prop_data.has("value")): + printerr("Missing information in custom properties (around line %d)." % [parser.get_current_line()]) + return ERR_INVALID_DATA + + data.properties[prop_data.name] = prop_data.value + if prop_data.has("type"): + data.propertytypes[prop_data.name] = prop_data.type + else: + data.propertytypes[prop_data.name] = "string" + + err = parser.read() + + return data + +# Reads the attributes of the current element and return them as a dictionary +static func attributes_to_dict(parser): + var data = {} + for i in range(parser.get_attribute_count()): + var attr = parser.get_attribute_name(i) + var val = parser.get_attribute_value(i) + if val.is_valid_integer(): + val = int(val) + elif val.is_valid_float(): + val = float(val) + elif val == "true": + val = true + elif val == "false": + val = false + data[attr] = val + return data diff --git a/Godette-Tale/addons/vnen.tiled_importer/vnen.tiled_importer.gd b/Godette-Tale/addons/vnen.tiled_importer/vnen.tiled_importer.gd new file mode 100644 index 0000000..6f70315 --- /dev/null +++ b/Godette-Tale/addons/vnen.tiled_importer/vnen.tiled_importer.gd @@ -0,0 +1,45 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 George Marques +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +tool +extends EditorPlugin + +var import_plugin = null +var tileset_import_plugin = null + +func get_name(): + return "Tiled Map Importer" + +func _enter_tree(): + if not ProjectSettings.has_setting("tiled_importer/enable_json_format"): + ProjectSettings.set_setting("tiled_importer/enable_json_format", true) + + import_plugin = preload("tiled_import_plugin.gd").new() + tileset_import_plugin = preload("tiled_tileset_import_plugin.gd").new() + add_import_plugin(import_plugin) + add_import_plugin(tileset_import_plugin) + +func _exit_tree(): + remove_import_plugin(import_plugin) + remove_import_plugin(tileset_import_plugin) + import_plugin = null + tileset_import_plugin = null diff --git a/Godette-Tale/autoloads/MusicController.gd b/Godette-Tale/autoloads/MusicController.gd new file mode 100644 index 0000000..fa3b3b0 --- /dev/null +++ b/Godette-Tale/autoloads/MusicController.gd @@ -0,0 +1,13 @@ +extends Node + +func play_music(s): #Input is a file location: play_music("res://Assets/Music/Ruins.wav") + if $Music.stream.resource_path != s: + $Music.stream = load(s) + $Music.play() + +func pause_music(s): #true to pause, false to play + $Music.set_stream_paused(s) + +func stop_music(): + $Music.stream = load("res://Assets/Music/Empty.wav") + $Music.play() diff --git a/Godette-Tale/autoloads/MusicController.tscn b/Godette-Tale/autoloads/MusicController.tscn new file mode 100644 index 0000000..7ded13c --- /dev/null +++ b/Godette-Tale/autoloads/MusicController.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://autoloads/MusicController.gd" type="Script" id=1] +[ext_resource path="res://Assets/Music/Empty.wav" type="AudioStream" id=2] + +[node name="Node" type="Node"] +script = ExtResource( 1 ) + +[node name="Music" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 2 ) +volume_db = -10.0 diff --git a/Godette-Tale/autoloads/SceneChanger.gd b/Godette-Tale/autoloads/SceneChanger.gd new file mode 100644 index 0000000..0c1b70a --- /dev/null +++ b/Godette-Tale/autoloads/SceneChanger.gd @@ -0,0 +1,24 @@ +extends CanvasLayer + +onready var nodeAnimation = $Control/AnimationPlayer +var scene : String +var _playerPosition : Vector2 + +func change_scene(new_scene, playerPosition, anim): + if !globalVariables.exitingShop: # This is to fix a bug where the menu is disabled when you leave a shop due to the transition to enter the shop being called immediately upon exiting the shop. + globalVariables.disableMenu = true #Disable menu so the player can't open it during fade out + scene = new_scene + _playerPosition = playerPosition #Save temporary variables to script + nodeAnimation.play(anim) + else: # Disable it after the false positive is detected. + globalVariables.exitingShop = false + +func change_scene_fast(new_scene, playerPosition): + globalVariables.disableMenu = true #Disable menu so the player can't open it during fade out + scene = new_scene + _playerPosition = playerPosition #Save temporary variables to script + _new_scene() + +func _new_scene(): + get_tree().change_scene(scene) + globalVariables.disableMenu = false #Re-enable menu diff --git a/Godette-Tale/autoloads/SceneChanger.tscn b/Godette-Tale/autoloads/SceneChanger.tscn new file mode 100644 index 0000000..2b95a31 --- /dev/null +++ b/Godette-Tale/autoloads/SceneChanger.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://autoloads/SceneChanger.gd" type="Script" id=1] + +[sub_resource type="Animation" id=1] +resource_name = "fade" +length = 0.8 +tracks/0/type = "value" +tracks/0/path = NodePath("ColorRect:color") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.3, 0.5, 0.8 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Color( 0, 0, 0, 0 ), Color( 0, 0, 0, 1 ), Color( 0, 0, 0, 1 ), Color( 0, 0, 0, 0 ) ] +} +tracks/1/type = "method" +tracks/1/path = NodePath("..") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0.4 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "_new_scene" +} ] +} + +[node name="SceneChanger" type="CanvasLayer"] +script = ExtResource( 1 ) + +[node name="Control" type="Control" parent="."] +margin_right = 640.0 +margin_bottom = 480.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect" type="ColorRect" parent="Control"] +margin_right = 640.0 +margin_bottom = 480.0 +color = Color( 0, 0, 0, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Control"] +anims/fade = SubResource( 1 ) diff --git a/Godette-Tale/autoloads/globalVariables.gd b/Godette-Tale/autoloads/globalVariables.gd new file mode 100644 index 0000000..9aeed77 --- /dev/null +++ b/Godette-Tale/autoloads/globalVariables.gd @@ -0,0 +1,104 @@ +extends Node + +onready var currentRoom : String +var Name : String = "EMPTY" +var Love : int = 0 +var Gold : int = 0 +var PlayerAT : int = 0 +var PlayerDF : int = 0 +var inventorySize : int = 8 +var Items : Array = [] +var ItemBoxA : Array = [] +var ItemBoxB : Array = [] +var previousTime : int = 0 +var previousTimeFormatted : String = "0:00" +var roomDescription : String = "--" +var currentRoomDesc : String = "--" +var save_path = "user://save.dat" + +var time_start = 0 +var time_now = 0 + +var activationList : Dictionary +var objectList : Dictionary + +var cellList : PoolStringArray +var talkList : PoolStringArray +var shopInventory : Array + +var exitShopPosition : Vector2 +var exitShopScene : String +var exitingShop : bool = false + +var tie : Node +var dialogue : Node + +var menuOpen : bool = false +var disableMenu : bool = false #Enable this if you want to disable the ability to open the menu, if it's already opened this only disables subsequent openings. + +func _ready(): + time_start = OS.get_unix_time() + funcLoad() + print(Items) + +func _process(delta): + time_now = OS.get_unix_time() + var _time_elapsed = (time_now + previousTime) - time_start + #print(str(floor(time_elapsed / 60)) + ":" + '%02d' % (time_elapsed % 60)) + +func funcSave(): + var time_elapsed = (time_now + previousTime) - time_start + var file = File.new() + var error = file.open(save_path, File.WRITE) + if error == OK: + if Love == 0: + Name = "Chara" + Love = 1 + file.store_var(Name) + file.store_var(Love) + file.store_var(Gold) + file.store_var(Items) + file.store_var(ItemBoxA) + file.store_var(ItemBoxB) + file.store_var(time_elapsed) + file.store_var(str(get_tree().current_scene.filename)) + file.store_var(currentRoomDesc) + file.store_var($"/root/Root_Node/Player".get_position()) + if activationList.size() != 0 && objectList.size() != 0: + print("saved") + file.store_var(activationList) + file.store_var(objectList) + file.close() + previousTimeFormatted = str(floor(time_elapsed / 60)) + ":" + '%02d' % (time_elapsed % 60) + roomDescription = currentRoomDesc + signalManager.emit_signal("save_update") + +func funcLoad(): + var file = File.new() + var activationListTemp + var objectListTemp + var savedRoom : String + var savedPosition : Vector2 = Vector2(0,0) + if file.file_exists(save_path): + var error = file.open(save_path, file.READ) + if error == OK: + Name = file.get_var() + Love = file.get_var() + Gold = file.get_var() + Items = file.get_var() + ItemBoxA = file.get_var() + ItemBoxB = file.get_var() + previousTime = file.get_var() + savedRoom = file.get_var() + roomDescription = file.get_var() + savedPosition = file.get_var() + activationListTemp = file.get_var() + objectListTemp = file.get_var() + if str(activationListTemp) != "Null": + if activationListTemp.size() != 0: + activationList = activationListTemp + objectList = objectListTemp + file.close() + previousTimeFormatted = str(floor(previousTime / 60)) + ":" + '%02d' % (previousTime % 60) + signalManager.emit_signal("save_update") + SceneChanger.change_scene_fast(savedRoom, savedPosition) diff --git a/Godette-Tale/autoloads/itemLibrary.gd b/Godette-Tale/autoloads/itemLibrary.gd new file mode 100644 index 0000000..a4cb45d --- /dev/null +++ b/Godette-Tale/autoloads/itemLibrary.gd @@ -0,0 +1,79 @@ +extends Node +var tie : Node +var dialogue : Node +# This node exists solely to list all possible items in the game +# Having an item dictionary system reduces game size and complexity +# by referencing the same code instead of every new item entry being +# considered completely unique + +#itemType +#0 = key +#1 = consumable +#2 = weapon +#3 = armor + +const itemDictionary = { + 0: { + "itemType": 1, + "itemName": "Bisicle", + "itemDescription": ["* \"Bisicle\" Heals 11 HP\n* It's a two-pronged popsicle,\nso you can eat it twice."], + "shopDescription": "Heals 11HP x 2\nEat it twice!", + "nShort": "Bisicle", + "Heal": 11, + "buyPrice": 15, + "sellPrice": 5 + }, + 1: { + "itemType": 1, + "itemName": "Unisicle", + "itemDescription": ["* \"Unisicle\" Heals 11 HP\n* It's a SINGLE-pronged popsicle. Wait, that's just normal..."], + "shopDescription": "Heals 11HP x 1\nOne and done!", + "nShort": "Unisicle", + "nSerious": "Popsicle", + "Heal": 11, + "buyPrice": 8, + "sellPrice": 3 + }, + 2: { + "itemType": 2, + "itemName": "Stick", + "itemDescription": ["* Stick","(happy dog noises)"], + "shopDescription": "A stick.", + "itemDropText": ["* Fetch","(happy dog noises)"], + "itemAttack": 0, + "buyPrice": 0, + "sellPrice": 150 + }, + 3: { + "itemType": 1, + "itemName": "Bandage", + "itemDescription": ["* Bandage"], + "shopDescription": "Heals 10HP\nFirst-aid\nessential", + "itemDefence": 0, + "buyPrice": 5, + "sellPrice": 150 + } +}; + +func itemFunction(inputText): #add support for playing different item sounds when an item is used #add health and remove item, and update inv when an item is used + if tie != globalVariables.tie: + tie = globalVariables.tie + dialogue = globalVariables.dialogue + if !dialogue.is_visible(): + tie.reset() + tie.NPCid("") + tie.portrait_visible(false) + tie.set_color(Color(1,1,1)) + #tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Text.tres") + #tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono.tres") + tie.set_font_bypath("res://addons/GodotTIE/Fonts/DT-Mono-Dialogue.tres") + tie.buff_typesound("res://addons/GodotTIE/Generic.wav") + tie.buff_panel("show") + for item in inputText: + tie.buff_text(item, 0.055) + tie.buff_break() + tie.buff_clear() + tie.buff_panel("hide") + tie.buff_signal("closeMenuPanel") + tie.buff_face("res://Assets/Expressions/None.png") + tie.set_state(tie.STATE_OUTPUT) diff --git a/Godette-Tale/autoloads/signalManager.gd b/Godette-Tale/autoloads/signalManager.gd new file mode 100644 index 0000000..04c7d5a --- /dev/null +++ b/Godette-Tale/autoloads/signalManager.gd @@ -0,0 +1,37 @@ +extends Node +# This node exists solely to collect and send signals to other parts of the application +# So any signal needing to be retrieved can simply come here to get the data. +# This is a singleton. +# +# in the signal manager +# signal example_signal(s) +# +# in emitting script +# signalManager.emit_signal("example_signal", strExampleString) +# +# in receiving script +# signalManager.connect("example_signal", self, "_on_example_signal") +# func _on_object_activated(s): +# pass + +signal object_activated(s) #Used by all puzzle objects and the saving system to read and write activations +signal save_update() #Used by globalVariables.gd to update the UI in Save.gd when save button is pushed in the UI +signal buff_signal(s) #Used by the dialogue system to send any string you want at a specific time while text is being typed, it's currently used to make the save panel appear at the right time in Save.gd +signal cell(s) #Used by the menu to start a cellphone conversation, these are stored in the Root_Node of the level. +signal talk(s) #Used by the menu to start a shop conversation, these are stored in the Root_Node of the shop. +signal battle_started(character_name) +signal battle_finished() + +#Save.gd handles the save star UI + +#globalVariables.gd handles the actual saving of all global variables + +#Every room can have a separate music track, if one isn't provided it will continue using the song from the last room + +#Every room with a save star must have a description provided in the root node + +#Every level requires a Camera and a Player with a remote transform attached to the Camera + +#Every level requires the root node to be named "Root_Node" + +#The Camera2D comes with "Limits", these two nodes handle the boundaries that the Camera is allowed to track the player in diff --git a/Godette-Tale/project.godot b/Godette-Tale/project.godot new file mode 100644 index 0000000..5b65c96 --- /dev/null +++ b/Godette-Tale/project.godot @@ -0,0 +1,99 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ { +"base": "KinematicBody2D", +"class": "Player", +"language": "GDScript", +"path": "res://Scripts/Player/Player.gd" +} ] +_global_script_class_icons={ +"Player": "" +} + +[application] + +config/name="Godette-Tale" +run/main_scene="res://Example.tscn" + +[autoload] + +signalManager="*res://autoloads/signalManager.gd" +MusicController="*res://autoloads/MusicController.tscn" +SceneChanger="*res://autoloads/SceneChanger.tscn" +globalVariables="*res://autoloads/globalVariables.gd" +itemLibrary="*res://autoloads/itemLibrary.gd" + +[display] + +window/size/width=640 +window/size/height=480 +window/size/always_on_top=true +window/stretch/mode="2d" +window/stretch/aspect="keep" + +[editor_plugins] + +enabled=PoolStringArray( "GodotTIE", "vnen.tiled_importer" ) + +[global] + +width=false +window=false + +[input] + +move_up={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +move_down={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +move_left={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +move_right={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +interact={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +shift={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777237,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +open_menu={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":67,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} + +[layer_names] + +2d_physics/layer_1="default" +2d_physics/layer_2="enviroment" +2d_physics/layer_3="climbable" +2d_physics/layer_4="interactable" +2d_physics/interactable=false + +[tiled_importer] + +enable_json_format=true diff --git a/README.md b/README.md new file mode 100644 index 0000000..825422d --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# Godette-Tale +This is an Undertale game template for Godot, it tries to stay as true to the original IP while also being as plug and play as possible. + +This project currently does not contain a FIGHT system, any help implementing one would be much obliged. + +Any other help, bug fixes, etc, would also be much appreciated. + +## Features: +### Player Controller +* Player animates exactly how it does in Undertale +* Easy Camera Boundaries +* Ability to interact +### Puzzles +* Fully functional Door with customizable whitelisted passphrases and object activation count to open +* Fully functional Spikes with customizable whitelisted passphrases and object activation count to open +* Lever with customizable scene activation location (to open doors/spikes in other levels) and passphrase string +* Button with customizable scene activation location (to open doors/spikes in other levels) and passphrase string +* Do not worry! All puzzle objects (doors, spikes, levers, buttons) remember their state, they will not reset if you leave the room and come back +### Dialogue +* NPCs can speak dialogue +* NPCs can have custom portraits, fonts, and typing sounds +* NPCs can change their portraits on the fly, this allows for different emotions and for an animated talking portrait (examples **are provided** in the project) +* A fully functional Cell menu with dialogue system integration +### Saving +* Undertale is a modern game! You do not need to play the entire thing in one sitting, and the same goes for games created with the Godette-Tale project template +* Save stars can be placed and given unique dialogue +* Save stars save the Player's location, LOVE, NAME, Playtime, the current location's room description, and all puzzle object states +* Room descriptions are set in the Root_Node of the current scene the player is in +### Inventory +* Item dictionary based inventory system +* You can view your items just how you expect +### Shops +* You can buy items +* You can view the item's stats in the infobox +* The infobox visually tweens away when not used (an improvement on the original) +* You can exit and enter shops as expected +* You can sell items +* You can talk to the shopkeeper and get L O R E and W O R L D B U I L D I N G +* The shopkeeper is animated +* All shopkeeper dialogue is easily changeable in the root node of the shopkeeper scene +* Multiple shopkeepers are supported, just duplicate the example shop and the root node script and change whatever you need to +### Music +* Music does not restart upon entering a different scene and instead continues playing +* Music can be stopped, changed, or paused on the fly +* Music is generally set in the Root_Node of the scene + +# To do +* Intro Sequence +* Name the fallen human screen +* Load/Reset screen +* Fight System +* Storage Boxes +* Using items +* Equipping items +* Stats menu + +# Notice of Non-Affiliation and Disclaimers +We are not affiliated, associated, authorized, endorsed by, or in any way officially connected with Toby Fox, or any of his subsidiaries or his affiliates. The official Undertale website can be found at https://undertale.com/. + +This project is not meant to be a recreation of Undertale the game, it's meant to be used as a platform for fangames, if you want to play Undertale, buy Undertale. + +Anything not owned by Toby Fox is licensed under the MIT License. + +This template uses a modified version of [GodotTIE](https://github.com/henriquelalves/GodotTIE) (MIT).