From daa66d5b54d0549ad9487f018b807d165dde3812 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sun, 17 May 2026 11:28:40 +0200 Subject: [PATCH] init --- .editorconfig | 4 + .gitattributes | 2 + .gitignore | 18 + addons/ez_tiles/ColorPick.svg | 1 + addons/ez_tiles/ColorPick.svg.import | 43 ++ addons/ez_tiles/Edit.svg | 1 + addons/ez_tiles/Edit.svg.import | 43 ++ addons/ez_tiles/LICENSE | 21 + addons/ez_tiles/README.md | 29 + addons/ez_tiles/Remove.svg | 1 + addons/ez_tiles/Remove.svg.import | 43 ++ addons/ez_tiles/Save.svg | 1 + addons/ez_tiles/Save.svg.import | 43 ++ addons/ez_tiles/ZoomLess.svg | 1 + addons/ez_tiles/ZoomLess.svg.import | 43 ++ addons/ez_tiles/ZoomMore.svg | 1 + addons/ez_tiles/ZoomMore.svg.import | 43 ++ .../collision_polygon_templates/cactus.tscn | 100 +++ .../inverse_rounded_corners.tscn | 100 +++ .../rectangles.tscn | 100 +++ .../rounded_corners.tscn | 100 +++ .../collision_polygon_templates/slopes.tscn | 100 +++ .../slopes_bottom.tscn | 100 +++ .../slopes_top.tscn | 100 +++ .../collision_polygon_templates/tree.tscn | 101 +++ addons/ez_tiles/examples/15x15/big_brick.png | Bin 0 -> 19772 bytes .../examples/15x15/big_brick.png.import | 40 + addons/ez_tiles/examples/15x15/brick_face.png | Bin 0 -> 26581 bytes .../examples/15x15/brick_face.png.import | 40 + addons/ez_tiles/examples/15x15/cactus.png | Bin 0 -> 20149 bytes .../ez_tiles/examples/15x15/cactus.png.import | 40 + addons/ez_tiles/examples/15x15/gold_tiles.png | Bin 0 -> 27121 bytes .../examples/15x15/gold_tiles.png.import | 40 + .../examples/15x15/grass_and_dirt.png | Bin 0 -> 18747 bytes .../examples/15x15/grass_and_dirt.png.import | 40 + .../ez_tiles/examples/15x15/mossy_bricks.png | Bin 0 -> 18761 bytes .../examples/15x15/mossy_bricks.png.import | 40 + addons/ez_tiles/examples/15x15/sand.png | Bin 0 -> 20685 bytes .../ez_tiles/examples/15x15/sand.png.import | 40 + addons/ez_tiles/examples/15x15/spikes.png | Bin 0 -> 21525 bytes .../ez_tiles/examples/15x15/spikes.png.import | 40 + addons/ez_tiles/examples/15x15/stonewall.png | Bin 0 -> 19057 bytes .../examples/15x15/stonewall.png.import | 40 + addons/ez_tiles/examples/15x15/tree_trunk.png | Bin 0 -> 18855 bytes .../examples/15x15/tree_trunk.png.import | 40 + ...tinyworlds-tileset-floating-dirt-isles.png | Bin 0 -> 17143 bytes ...lds-tileset-floating-dirt-isles.png.import | 40 + ...tinyworlds-tileset-floating-dirt-isles.xcf | Bin 0 -> 16713 bytes .../examples/16x16/zelda_like_dark_grass.png | Bin 0 -> 11765 bytes .../16x16/zelda_like_dark_grass.png.import | 40 + .../examples/16x16/zelda_like_grass.png | Bin 0 -> 10021 bytes .../16x16/zelda_like_grass.png.import | 40 + .../16x16/zelda_like_grass_over_water.png | Bin 0 -> 17576 bytes .../zelda_like_grass_over_water.png.import | 40 + .../examples/16x16/zelda_like_hedge.png | Bin 0 -> 17727 bytes .../16x16/zelda_like_hedge.png.import | 40 + .../examples/16x16/zelda_like_water.png | Bin 0 -> 6334 bytes .../16x16/zelda_like_water.png.import | 40 + .../examples/64x64/plains_1.png.import | 34 + addons/ez_tiles/examples/64x64/plains_1.svg | 114 +++ .../examples/64x64/plains_1.svg.import | 43 ++ addons/ez_tiles/examples/64x64/plains_2.svg | 136 ++++ .../examples/64x64/plains_2.svg.import | 43 ++ addons/ez_tiles/examples/64x64/spikes.svg | 523 +++++++++++++ .../ez_tiles/examples/64x64/spikes.svg.import | 43 ++ .../exclamation-warning-triangle-icon.svg | 51 ++ ...clamation-warning-triangle-icon.svg.import | 43 ++ addons/ez_tiles/ez_tiles.gd | 212 ++++++ addons/ez_tiles/ez_tiles.gd.uid | 1 + addons/ez_tiles/ez_tiles_dock.gd | 408 ++++++++++ addons/ez_tiles/ez_tiles_dock.gd.uid | 1 + addons/ez_tiles/ez_tiles_dock.tscn | 211 ++++++ addons/ez_tiles/ez_tiles_draw/area_draw.gd | 381 ++++++++++ .../ez_tiles/ez_tiles_draw/area_draw.gd.uid | 1 + addons/ez_tiles/ez_tiles_draw/area_draw.tscn | 389 ++++++++++ addons/ez_tiles/ez_tiles_draw/brush_draw.gd | 64 ++ .../ez_tiles/ez_tiles_draw/brush_draw.gd.uid | 1 + addons/ez_tiles/ez_tiles_draw/brush_draw.tscn | 110 +++ .../brush_tile_button_group.tres | 5 + .../ez_tiles_draw/ez_tiles_draw_dock.gd | 694 ++++++++++++++++++ .../ez_tiles_draw/ez_tiles_draw_dock.gd.uid | 1 + .../ez_tiles_draw/ez_tiles_draw_dock.tscn | 169 +++++ .../ez_tiles/ez_tiles_draw/icons/Circle.svg | 61 ++ .../ez_tiles_draw/icons/Circle.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/Connect1.svg | 75 ++ .../ez_tiles_draw/icons/Connect1.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/Connect2.svg | 80 ++ .../ez_tiles_draw/icons/Connect2.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/icons/Edit.svg | 1 + .../ez_tiles_draw/icons/Edit.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/Eraser.svg | 1 + .../ez_tiles_draw/icons/Eraser.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/icons/HillB.svg | 48 ++ .../ez_tiles_draw/icons/HillB.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/icons/HillL.svg | 48 ++ .../ez_tiles_draw/icons/HillL.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/icons/HillR.svg | 48 ++ .../ez_tiles_draw/icons/HillR.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/icons/HillT.svg | 48 ++ .../ez_tiles_draw/icons/HillT.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/Island.svg | 46 ++ .../ez_tiles_draw/icons/Island.svg.import | 43 ++ .../ez_tiles_draw/icons/Rectangle.svg | 1 + .../ez_tiles_draw/icons/Rectangle.svg.import | 43 ++ .../ez_tiles_draw/icons/RectangleSoft.svg | 78 ++ .../icons/RectangleSoft.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/Remove.svg | 1 + .../ez_tiles_draw/icons/Remove.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/SlopeBL.svg | 43 ++ .../ez_tiles_draw/icons/SlopeBL.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/SlopeBR.svg | 43 ++ .../ez_tiles_draw/icons/SlopeBR.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/SlopeTL.svg | 43 ++ .../ez_tiles_draw/icons/SlopeTL.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/SlopeTR.svg | 43 ++ .../ez_tiles_draw/icons/SlopeTR.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/SnapShot.svg | 57 ++ .../ez_tiles_draw/icons/SnapShot.svg.import | 43 ++ .../ez_tiles_draw/icons/SnapShotSmall.svg | 57 ++ .../icons/SnapShotSmall.svg.import | 43 ++ .../ez_tiles/ez_tiles_draw/icons/Square.svg | 62 ++ .../ez_tiles_draw/icons/Square.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg | 34 + .../ez_tiles_draw/icons/Stamp.svg.import | 43 ++ .../ez_tiles_draw/icons/TerrainConnect.svg | 1 + .../icons/TerrainConnect.svg.import | 43 ++ addons/ez_tiles/ez_tiles_draw/plugin.cfg | 7 + .../range_slider_with_line_edit.gd | 51 ++ .../range_slider_with_line_edit.gd.uid | 1 + .../range_slider_with_line_edit.tscn | 29 + addons/ez_tiles/ez_tiles_draw/stamp.gd | 56 ++ addons/ez_tiles/ez_tiles_draw/stamp.gd.uid | 1 + addons/ez_tiles/ez_tiles_draw/stamp.stylebox | Bin 0 -> 468 bytes addons/ez_tiles/ez_tiles_draw/stamp.tscn | 36 + .../ez_tiles_draw/stamp_hover.stylebox | Bin 0 -> 483 bytes .../ez_tiles_draw/stamp_selected.stylebox | Bin 0 -> 497 bytes addons/ez_tiles/ez_tiles_draw/stamp_tab.gd | 58 ++ .../ez_tiles/ez_tiles_draw/stamp_tab.gd.uid | 1 + addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn | 40 + addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn | 10 + .../terrain_picker_button_group.tres | 5 + .../ez_tiles_draw/terrain_picker_entry.gd | 34 + .../ez_tiles_draw/terrain_picker_entry.gd.uid | 1 + .../ez_tiles_draw/terrain_picker_entry.tscn | 36 + addons/ez_tiles/ez_tiles_draw/tile_button.gd | 11 + .../ez_tiles/ez_tiles_draw/tile_button.gd.uid | 1 + .../ez_tiles/ez_tiles_draw/tile_button.tscn | 18 + addons/ez_tiles/guide.png | Bin 0 -> 43866 bytes addons/ez_tiles/guide.png.import | 40 + addons/ez_tiles/images_container.gd | 69 ++ addons/ez_tiles/images_container.gd.uid | 1 + addons/ez_tiles/images_container.tscn | 50 ++ addons/ez_tiles/load_files_button.gd | 27 + addons/ez_tiles/load_files_button.gd.uid | 1 + addons/ez_tiles/plugin.cfg | 7 + addons/ez_tiles/preview_panel_container.gd | 21 + .../ez_tiles/preview_panel_container.gd.uid | 1 + .../ez_tiles/select_terrain_button_group.tres | 5 + addons/ez_tiles/terrain_list_entry.gd | 88 +++ addons/ez_tiles/terrain_list_entry.gd.uid | 1 + addons/ez_tiles/terrain_list_entry.tscn | 105 +++ coin.gd | 6 + coin.gd.uid | 1 + coin.tscn | 65 ++ dino.gd | 25 + dino.gd.uid | 1 + dino.tscn | 135 ++++ game.tscn | 364 +++++++++ icon.svg | 1 + icon.svg.import | 43 ++ project.godot | 29 + sprites/coin/MonedaD.png | Bin 0 -> 663 bytes sprites/coin/MonedaD.png.import | 40 + sprites/coin/MonedaP.png | Bin 0 -> 579 bytes sprites/coin/MonedaP.png.import | 40 + sprites/coin/MonedaR.png | Bin 0 -> 645 bytes sprites/coin/MonedaR.png.import | 40 + sprites/coin/spr_coin_ama.png | Bin 0 -> 522 bytes sprites/coin/spr_coin_ama.png.import | 40 + sprites/coin/spr_coin_azu.png | Bin 0 -> 525 bytes sprites/coin/spr_coin_azu.png.import | 40 + sprites/coin/spr_coin_gri.png | Bin 0 -> 528 bytes sprites/coin/spr_coin_gri.png.import | 40 + sprites/coin/spr_coin_roj.png | Bin 0 -> 540 bytes sprites/coin/spr_coin_roj.png.import | 40 + sprites/coin/spr_coin_strip4.png | Bin 0 -> 459 bytes sprites/coin/spr_coin_strip4.png.import | 40 + sprites/dino/DinoSprites - doux.png | Bin 0 -> 1899 bytes sprites/dino/DinoSprites - doux.png.import | 40 + sprites/dino/DinoSprites - mort.png | Bin 0 -> 1906 bytes sprites/dino/DinoSprites - mort.png.import | 40 + sprites/dino/DinoSprites - tard.png | Bin 0 -> 1920 bytes sprites/dino/DinoSprites - tard.png.import | 40 + sprites/dino/DinoSprites - vita.png | Bin 0 -> 1957 bytes sprites/dino/DinoSprites - vita.png.import | 40 + 195 files changed, 9284 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 addons/ez_tiles/ColorPick.svg create mode 100644 addons/ez_tiles/ColorPick.svg.import create mode 100644 addons/ez_tiles/Edit.svg create mode 100644 addons/ez_tiles/Edit.svg.import create mode 100644 addons/ez_tiles/LICENSE create mode 100644 addons/ez_tiles/README.md create mode 100644 addons/ez_tiles/Remove.svg create mode 100644 addons/ez_tiles/Remove.svg.import create mode 100644 addons/ez_tiles/Save.svg create mode 100644 addons/ez_tiles/Save.svg.import create mode 100644 addons/ez_tiles/ZoomLess.svg create mode 100644 addons/ez_tiles/ZoomLess.svg.import create mode 100644 addons/ez_tiles/ZoomMore.svg create mode 100644 addons/ez_tiles/ZoomMore.svg.import create mode 100644 addons/ez_tiles/collision_polygon_templates/cactus.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/inverse_rounded_corners.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/rectangles.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/rounded_corners.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/slopes.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/slopes_bottom.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/slopes_top.tscn create mode 100644 addons/ez_tiles/collision_polygon_templates/tree.tscn create mode 100644 addons/ez_tiles/examples/15x15/big_brick.png create mode 100644 addons/ez_tiles/examples/15x15/big_brick.png.import create mode 100644 addons/ez_tiles/examples/15x15/brick_face.png create mode 100644 addons/ez_tiles/examples/15x15/brick_face.png.import create mode 100644 addons/ez_tiles/examples/15x15/cactus.png create mode 100644 addons/ez_tiles/examples/15x15/cactus.png.import create mode 100644 addons/ez_tiles/examples/15x15/gold_tiles.png create mode 100644 addons/ez_tiles/examples/15x15/gold_tiles.png.import create mode 100644 addons/ez_tiles/examples/15x15/grass_and_dirt.png create mode 100644 addons/ez_tiles/examples/15x15/grass_and_dirt.png.import create mode 100644 addons/ez_tiles/examples/15x15/mossy_bricks.png create mode 100644 addons/ez_tiles/examples/15x15/mossy_bricks.png.import create mode 100644 addons/ez_tiles/examples/15x15/sand.png create mode 100644 addons/ez_tiles/examples/15x15/sand.png.import create mode 100644 addons/ez_tiles/examples/15x15/spikes.png create mode 100644 addons/ez_tiles/examples/15x15/spikes.png.import create mode 100644 addons/ez_tiles/examples/15x15/stonewall.png create mode 100644 addons/ez_tiles/examples/15x15/stonewall.png.import create mode 100644 addons/ez_tiles/examples/15x15/tree_trunk.png create mode 100644 addons/ez_tiles/examples/15x15/tree_trunk.png.import create mode 100644 addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png create mode 100644 addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png.import create mode 100644 addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.xcf create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png.import create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_grass.png create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_grass.png.import create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_grass_over_water.png create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_grass_over_water.png.import create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_hedge.png create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_hedge.png.import create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_water.png create mode 100644 addons/ez_tiles/examples/16x16/zelda_like_water.png.import create mode 100644 addons/ez_tiles/examples/64x64/plains_1.png.import create mode 100644 addons/ez_tiles/examples/64x64/plains_1.svg create mode 100644 addons/ez_tiles/examples/64x64/plains_1.svg.import create mode 100644 addons/ez_tiles/examples/64x64/plains_2.svg create mode 100644 addons/ez_tiles/examples/64x64/plains_2.svg.import create mode 100644 addons/ez_tiles/examples/64x64/spikes.svg create mode 100644 addons/ez_tiles/examples/64x64/spikes.svg.import create mode 100644 addons/ez_tiles/exclamation-warning-triangle-icon.svg create mode 100644 addons/ez_tiles/exclamation-warning-triangle-icon.svg.import create mode 100644 addons/ez_tiles/ez_tiles.gd create mode 100644 addons/ez_tiles/ez_tiles.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_dock.gd create mode 100644 addons/ez_tiles/ez_tiles_dock.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_dock.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/area_draw.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/area_draw.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/area_draw.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/brush_draw.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/brush_draw.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/brush_draw.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres create mode 100644 addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Circle.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Circle.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Edit.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Edit.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillB.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillB.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillL.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillL.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillR.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillR.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillT.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/HillT.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Island.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Island.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Remove.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Remove.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Square.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Square.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg create mode 100644 addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg.import create mode 100644 addons/ez_tiles/ez_tiles_draw/plugin.cfg create mode 100644 addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp.stylebox create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp_hover.stylebox create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp_selected.stylebox create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp_tab.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp_tab.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/terrain_picker_button_group.tres create mode 100644 addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.tscn create mode 100644 addons/ez_tiles/ez_tiles_draw/tile_button.gd create mode 100644 addons/ez_tiles/ez_tiles_draw/tile_button.gd.uid create mode 100644 addons/ez_tiles/ez_tiles_draw/tile_button.tscn create mode 100644 addons/ez_tiles/guide.png create mode 100644 addons/ez_tiles/guide.png.import create mode 100644 addons/ez_tiles/images_container.gd create mode 100644 addons/ez_tiles/images_container.gd.uid create mode 100644 addons/ez_tiles/images_container.tscn create mode 100644 addons/ez_tiles/load_files_button.gd create mode 100644 addons/ez_tiles/load_files_button.gd.uid create mode 100644 addons/ez_tiles/plugin.cfg create mode 100644 addons/ez_tiles/preview_panel_container.gd create mode 100644 addons/ez_tiles/preview_panel_container.gd.uid create mode 100644 addons/ez_tiles/select_terrain_button_group.tres create mode 100644 addons/ez_tiles/terrain_list_entry.gd create mode 100644 addons/ez_tiles/terrain_list_entry.gd.uid create mode 100644 addons/ez_tiles/terrain_list_entry.tscn create mode 100644 coin.gd create mode 100644 coin.gd.uid create mode 100644 coin.tscn create mode 100644 dino.gd create mode 100644 dino.gd.uid create mode 100644 dino.tscn create mode 100644 game.tscn create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 sprites/coin/MonedaD.png create mode 100644 sprites/coin/MonedaD.png.import create mode 100644 sprites/coin/MonedaP.png create mode 100644 sprites/coin/MonedaP.png.import create mode 100644 sprites/coin/MonedaR.png create mode 100644 sprites/coin/MonedaR.png.import create mode 100644 sprites/coin/spr_coin_ama.png create mode 100644 sprites/coin/spr_coin_ama.png.import create mode 100644 sprites/coin/spr_coin_azu.png create mode 100644 sprites/coin/spr_coin_azu.png.import create mode 100644 sprites/coin/spr_coin_gri.png create mode 100644 sprites/coin/spr_coin_gri.png.import create mode 100644 sprites/coin/spr_coin_roj.png create mode 100644 sprites/coin/spr_coin_roj.png.import create mode 100644 sprites/coin/spr_coin_strip4.png create mode 100644 sprites/coin/spr_coin_strip4.png.import create mode 100644 sprites/dino/DinoSprites - doux.png create mode 100644 sprites/dino/DinoSprites - doux.png.import create mode 100644 sprites/dino/DinoSprites - mort.png create mode 100644 sprites/dino/DinoSprites - mort.png.import create mode 100644 sprites/dino/DinoSprites - tard.png create mode 100644 sprites/dino/DinoSprites - tard.png.import create mode 100644 sprites/dino/DinoSprites - vita.png create mode 100644 sprites/dino/DinoSprites - vita.png.import diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c81639 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Godot 4+ specific ignores +.godot/ +/android/ +.nomedia + +# Godot-specific ignores +.import/ +export.cfg +export_credentials.cfg +*.tmp + +# Imported translations (automatically generated from CSV files) +*.translation + +# Mono-specific ignores +.mono/ +data_*/ +mono_crash.*.json \ No newline at end of file diff --git a/addons/ez_tiles/ColorPick.svg b/addons/ez_tiles/ColorPick.svg new file mode 100644 index 0000000..741bd7a --- /dev/null +++ b/addons/ez_tiles/ColorPick.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ColorPick.svg.import b/addons/ez_tiles/ColorPick.svg.import new file mode 100644 index 0000000..67032d1 --- /dev/null +++ b/addons/ez_tiles/ColorPick.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://caun3agmbmgps" +path="res://.godot/imported/ColorPick.svg-3d1404ee7ad6e6f63eea544098a69601.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ColorPick.svg" +dest_files=["res://.godot/imported/ColorPick.svg-3d1404ee7ad6e6f63eea544098a69601.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/Edit.svg b/addons/ez_tiles/Edit.svg new file mode 100644 index 0000000..7963e54 --- /dev/null +++ b/addons/ez_tiles/Edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/Edit.svg.import b/addons/ez_tiles/Edit.svg.import new file mode 100644 index 0000000..1820d54 --- /dev/null +++ b/addons/ez_tiles/Edit.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwo07c1odx7ob" +path="res://.godot/imported/Edit.svg-82304c6fcb6a1b25af7fee4a258df268.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/Edit.svg" +dest_files=["res://.godot/imported/Edit.svg-82304c6fcb6a1b25af7fee4a258df268.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/LICENSE b/addons/ez_tiles/LICENSE new file mode 100644 index 0000000..ea9dd06 --- /dev/null +++ b/addons/ez_tiles/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 René and Chris van der Ark + +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/addons/ez_tiles/README.md b/addons/ez_tiles/README.md new file mode 100644 index 0000000..d29a68c --- /dev/null +++ b/addons/ez_tiles/README.md @@ -0,0 +1,29 @@ +# EZ Tiles plugin for Godot 4.3 + +This plugin attempts to make it easy to start drawing terrains with tilesheets via a basic Tileset importer and TileMapLayer nodes. + +For a complete showcase, please take a look at these youtube explainers. + +## Basic introduction to EZ Tiles + +[![link to explainer](https://raw.githubusercontent.com/Teaching-myself-Godot/ez-tiles/refs/tags/1.0.3/yt-thumnail-2.jpg)](https://youtu.be/cvx-chwh1Ds) + +## Top down RPG tiles with EZ Tiles + +[![link to RPG tiles example](https://raw.githubusercontent.com/Teaching-myself-Godot/ez-tiles/refs/tags/1.0.3/yt-thumnail-1.jpg)](https://youtu.be/gBNtqvF5T_Y) + +## Importer Features + +- importing tilesheets in a preset format to automatically generate connected terrains (4 sides) + +![example of template](https://raw.githubusercontent.com/Teaching-myself-Godot/ez-tiles/refs/tags/1.0.0/template_32x32.png) + +- a couple of preset collision polygons to use with these templates +- generation of a navigation layer + +## Drawing Features + +- Square and circle brush +- Draggable area draw +- Stamps (fast copy/paste) +- Several modes of terrain-connecting diff --git a/addons/ez_tiles/Remove.svg b/addons/ez_tiles/Remove.svg new file mode 100644 index 0000000..d2eb0f9 --- /dev/null +++ b/addons/ez_tiles/Remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/Remove.svg.import b/addons/ez_tiles/Remove.svg.import new file mode 100644 index 0000000..ad6e54e --- /dev/null +++ b/addons/ez_tiles/Remove.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://smg4iofcineo" +path="res://.godot/imported/Remove.svg-a5d55465b9350d5f0321a6a209a66676.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/Remove.svg" +dest_files=["res://.godot/imported/Remove.svg-a5d55465b9350d5f0321a6a209a66676.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/Save.svg b/addons/ez_tiles/Save.svg new file mode 100644 index 0000000..ab8ffff --- /dev/null +++ b/addons/ez_tiles/Save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/Save.svg.import b/addons/ez_tiles/Save.svg.import new file mode 100644 index 0000000..cd32e58 --- /dev/null +++ b/addons/ez_tiles/Save.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxl4w251e8xgf" +path="res://.godot/imported/Save.svg-cccadde19daf996f4fd509bf2315f230.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/Save.svg" +dest_files=["res://.godot/imported/Save.svg-cccadde19daf996f4fd509bf2315f230.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ZoomLess.svg b/addons/ez_tiles/ZoomLess.svg new file mode 100644 index 0000000..83d964f --- /dev/null +++ b/addons/ez_tiles/ZoomLess.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ZoomLess.svg.import b/addons/ez_tiles/ZoomLess.svg.import new file mode 100644 index 0000000..c11188e --- /dev/null +++ b/addons/ez_tiles/ZoomLess.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://njliaygubc5c" +path="res://.godot/imported/ZoomLess.svg-1ac10bf8c27b37875d4fb511a1a711f8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ZoomLess.svg" +dest_files=["res://.godot/imported/ZoomLess.svg-1ac10bf8c27b37875d4fb511a1a711f8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ZoomMore.svg b/addons/ez_tiles/ZoomMore.svg new file mode 100644 index 0000000..63250ed --- /dev/null +++ b/addons/ez_tiles/ZoomMore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ZoomMore.svg.import b/addons/ez_tiles/ZoomMore.svg.import new file mode 100644 index 0000000..464dc11 --- /dev/null +++ b/addons/ez_tiles/ZoomMore.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvwx6xu0hp7mv" +path="res://.godot/imported/ZoomMore.svg-1d933b2c818365668806650c495f37a9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ZoomMore.svg" +dest_files=["res://.godot/imported/ZoomMore.svg-1d933b2c818365668806650c495f37a9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/collision_polygon_templates/cactus.tscn b/addons/ez_tiles/collision_polygon_templates/cactus.tscn new file mode 100644 index 0000000..163a0f0 --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/cactus.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://ywxhlehtt18d"] + +[node name="Cactus" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0.210938, 0.09375, 0.0390625, 0.289063, 0, 0.71875, 0, 0.882813, 0.078125, 1, 0.289063, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0.226563, 0.132813, 0.0703125, 0.359375, 0, 0.640625, 0, 0.820313, 0.0859375, 0.992188, 0.304688, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0, 0.25, 0, 0, 1, 0, 1, 0.242188) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0.53125, 0.460938, 0.476563, 0.171875, 0.625, 0, 0.765625, 0.0390625, 0.835938, 0.328125, 1, 0.414063, 1, 0.734375, 0.703125, 0.625) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 0.71875, 0, 0.398438, 1, 0.390625, 1, 0.71875) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 0.703125, 0, 0.390625, 0.195313, 0.34375, 0.226563, 0.03125, 0.382813, 0.015625, 0.515625, 0.164063, 0.523438, 0.445313, 0.296875, 0.640625) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/inverse_rounded_corners.tscn b/addons/ez_tiles/collision_polygon_templates/inverse_rounded_corners.tscn new file mode 100644 index 0000000..7842f0c --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/inverse_rounded_corners.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://cxnhqxx237lix"] + +[node name="Rounded Corners (Inverse)" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0.03125, 0.734375, 0.15625, 0.476563, 0.3125, 0.273438, 0.515625, 0.125, 0.773438, 0.03125, 1, 0, 0, 0) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(1, 0, 0, 0, 0.273438, 0.0390625, 0.5, 0.125, 0.71875, 0.289063, 0.859375, 0.484375, 0.953125, 0.695313, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 1, 1, 1, 0, 0.960938, 0.257813, 0.867188, 0.492188, 0.726563, 0.703125, 0.523438, 0.867188, 0.28125, 0.960938) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0.28125, 0.71875, 0.140625, 0.507813, 0.046875, 0.304688, 0, 0, 0, 1, 1, 1, 1, 1, 0.703125, 0.953125, 0.492188, 0.859375) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/rectangles.tscn b/addons/ez_tiles/collision_polygon_templates/rectangles.tscn new file mode 100644 index 0000000..3f12c62 --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/rectangles.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://bdtlwd7f6ojk0"] + +[node name="Rectangles" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/rounded_corners.tscn b/addons/ez_tiles/collision_polygon_templates/rounded_corners.tscn new file mode 100644 index 0000000..deca0a9 --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/rounded_corners.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://cm4063l3dfehn"] + +[node name="Rounded Corners" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0.140209, 0.880727, 0.0546875, 0.75, 0, 0.515625, 0.0326076, 0.30961, 0.125, 0.15625, 0.3125, 0.03125, 0.5, 0, 0.671875, 0.03125, 0.835938, 0.125, 0.960938, 0.28125, 1, 0.507813, 0.945313, 0.710938, 0.84375, 0.859375, 0.695313, 0.96875, 0.507813, 1, 0.30575, 0.971775) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0.140209, 0.880727, 0.0546875, 0.75, 0, 0.515625, 0, 0, 1, 0, 1, 0.507813, 0.945313, 0.710938, 0.84375, 0.859375, 0.695313, 0.96875, 0.507813, 1, 0.30575, 0.971775) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0.515625, 0.015625, 0.328125, 0.125, 0.15625, 0.3125, 0.03125, 0.5, 0, 0.671875, 0.03125, 0.835938, 0.125, 0.960938, 0.28125, 1, 0.507813, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0.117188, 0.8125, 0.0234375, 0.65625, 0, 0.492188, 0.0390625, 0.28125, 0.148438, 0.132813, 0.34375, 0.0234375, 0.515625, 0, 1, 0, 1, 1, 1, 1, 0.523438, 1, 0.304688, 0.953125) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 0.554688, 0, 0.820313, 0.09375, 0.960938, 0.296875, 1, 0.460938, 0.96875, 0.671875, 0.804688, 0.90625, 0.5625, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 0.03125, 0.734375, 0.15625, 0.476563, 0.3125, 0.273438, 0.515625, 0.125, 0.773438, 0.03125, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 0.273438, 0.0390625, 0.5, 0.125, 0.71875, 0.289063, 0.859375, 0.484375, 0.953125, 0.695313, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 0.960938, 0.257813, 0.867188, 0.492188, 0.726563, 0.703125, 0.523438, 0.867188, 0.28125, 0.960938) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(0.28125, 0.71875, 0.140625, 0.507813, 0.046875, 0.304688, 0, 0, 1, 0, 1, 1, 1, 1, 0.703125, 0.953125, 0.492188, 0.859375) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/slopes.tscn b/addons/ez_tiles/collision_polygon_templates/slopes.tscn new file mode 100644 index 0000000..d6b5824 --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/slopes.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://lfnyjmnayoqe"] + +[node name="Sloped (All Corners)" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/slopes_bottom.tscn b/addons/ez_tiles/collision_polygon_templates/slopes_bottom.tscn new file mode 100644 index 0000000..fa7c83d --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/slopes_bottom.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://ckfu3f4u350bg"] + +[node name="Sloped (Bottom Corners)" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/slopes_top.tscn b/addons/ez_tiles/collision_polygon_templates/slopes_top.tscn new file mode 100644 index 0000000..2d7f483 --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/slopes_top.tscn @@ -0,0 +1,100 @@ +[gd_scene format=3 uid="uid://3gmoem8hi2hi"] + +[node name="Sloped (Top Corners)" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/collision_polygon_templates/tree.tscn b/addons/ez_tiles/collision_polygon_templates/tree.tscn new file mode 100644 index 0000000..edbbbc0 --- /dev/null +++ b/addons/ez_tiles/collision_polygon_templates/tree.tscn @@ -0,0 +1,101 @@ +[gd_scene format=3 uid="uid://bp35luh5na8o7"] + +[node name="Tree" type="Node2D"] +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0] + +[node name="MC" type="Polygon2D" parent="."] +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VT" type="Polygon2D" parent="."] +position = Vector2(1, 0) +polygon = PackedVector2Array(0, 1, 0.492188, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VM" type="Polygon2D" parent="."] +position = Vector2(1, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="VB" type="Polygon2D" parent="."] +position = Vector2(1, 2) +polygon = PackedVector2Array(0.1875, 0.820313, 0, 0, 1, 0, 0.8125, 0.570313) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HL" type="Polygon2D" parent="."] +position = Vector2(0, 3) +polygon = PackedVector2Array(0.478268, 0.299531, 0, 0, 1, 0, 1, 0, 0.992188, 0.398438) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HM" type="Polygon2D" parent="."] +position = Vector2(1, 3) +polygon = PackedVector2Array(0.0078125, 0.421875, 0, 0, 1, 0, 1, 0.421875) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="HR" type="Polygon2D" parent="."] +position = Vector2(2, 3) +scale = Vector2(1, 1.1) +polygon = PackedVector2Array(0, 0.411932, 0, 0, 1, 0, 0.78125, 0.191761) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BR" type="Polygon2D" parent="."] +position = Vector2(5, 2) +polygon = PackedVector2Array(0, 1, 1, 1, 1, 0, 0, 0) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BL" type="Polygon2D" parent="."] +position = Vector2(3, 2) +polygon = PackedVector2Array(1, 0, 0, 0, 0, 1, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TM" type="Polygon2D" parent="."] +position = Vector2(4, 0) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="LM" type="Polygon2D" parent="."] +position = Vector2(3, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="CM" type="Polygon2D" parent="."] +position = Vector2(4, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="RM" type="Polygon2D" parent="."] +position = Vector2(5, 1) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TL" type="Polygon2D" parent="."] +position = Vector2(3, 0) +polygon = PackedVector2Array(0, 1, 1, 1, 1, 0, 0.960938, 0.257813, 0.867188, 0.492188, 0.726563, 0.703125, 0.523438, 0.867188, 0.28125, 0.960938) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="BC" type="Polygon2D" parent="."] +position = Vector2(4, 2) +polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] + +[node name="TR" type="Polygon2D" parent="."] +position = Vector2(5, 0) +polygon = PackedVector2Array(0.28125, 0.71875, 0.140625, 0.507813, 0.046875, 0.304688, 0, 0, 0, 1, 1, 1, 1, 1, 0.703125, 0.953125, 0.492188, 0.859375) +metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0] diff --git a/addons/ez_tiles/examples/15x15/big_brick.png b/addons/ez_tiles/examples/15x15/big_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..86c0e0adc6c8d7d86ae636f73d3a44713bff4560 GIT binary patch literal 19772 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 QLjV8(07*qoM6N<$f>MpWIsgCw literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/15x15/brick_face.png.import b/addons/ez_tiles/examples/15x15/brick_face.png.import new file mode 100644 index 0000000..6f3fbbc --- /dev/null +++ b/addons/ez_tiles/examples/15x15/brick_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm3oo83wmpa7t" +path="res://.godot/imported/brick_face.png-be3d3f48b608d1194504c80b008847cb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/15x15/brick_face.png" +dest_files=["res://.godot/imported/brick_face.png-be3d3f48b608d1194504c80b008847cb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/15x15/cactus.png b/addons/ez_tiles/examples/15x15/cactus.png new file mode 100644 index 0000000000000000000000000000000000000000..f55bc26d792edeb0bd5bdac48a85e5fe5c1a15d7 GIT binary patch literal 20149 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 bPxSu{LU2EnX+&;d00000NkvXXu0mjfa|>B& literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/15x15/gold_tiles.png.import b/addons/ez_tiles/examples/15x15/gold_tiles.png.import new file mode 100644 index 0000000..8e7818e --- /dev/null +++ b/addons/ez_tiles/examples/15x15/gold_tiles.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7ab600twsy17" +path="res://.godot/imported/gold_tiles.png-22f1bb38d765445d923d8f50d6c55c69.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/15x15/gold_tiles.png" +dest_files=["res://.godot/imported/gold_tiles.png-22f1bb38d765445d923d8f50d6c55c69.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/15x15/grass_and_dirt.png b/addons/ez_tiles/examples/15x15/grass_and_dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..42e347fc2c37e8dcaaf7b0cb59383751395a395e GIT binary patch literal 18747 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 literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/15x15/grass_and_dirt.png.import b/addons/ez_tiles/examples/15x15/grass_and_dirt.png.import new file mode 100644 index 0000000..b36c3a7 --- /dev/null +++ b/addons/ez_tiles/examples/15x15/grass_and_dirt.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qkgb300aqju0" +path="res://.godot/imported/grass_and_dirt.png-eda66079d258f21e83b1bbc5af195e0a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/15x15/grass_and_dirt.png" +dest_files=["res://.godot/imported/grass_and_dirt.png-eda66079d258f21e83b1bbc5af195e0a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/15x15/mossy_bricks.png b/addons/ez_tiles/examples/15x15/mossy_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..46dd260858d717edbc6a04c3934a09f26ac6a464 GIT binary patch literal 18761 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 qcj!MAB&i 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 T26#JM0VOM`BvB=19Q^+Px`-ho literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/15x15/stonewall.png.import b/addons/ez_tiles/examples/15x15/stonewall.png.import new file mode 100644 index 0000000..3564121 --- /dev/null +++ b/addons/ez_tiles/examples/15x15/stonewall.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4ibyc7vv0cqd" +path="res://.godot/imported/stonewall.png-165313e5941503a3dd613b03b79bddd7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/15x15/stonewall.png" +dest_files=["res://.godot/imported/stonewall.png-165313e5941503a3dd613b03b79bddd7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/15x15/tree_trunk.png b/addons/ez_tiles/examples/15x15/tree_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..b66ac291f3b974511f7efd7969ffcaf1845f0af7 GIT binary patch literal 18855 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�bt^6JJ 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 XYdC#izvlgU7?`xU0;opRAn5-A2mY_{ literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/15x15/tree_trunk.png.import b/addons/ez_tiles/examples/15x15/tree_trunk.png.import new file mode 100644 index 0000000..57daeb9 --- /dev/null +++ b/addons/ez_tiles/examples/15x15/tree_trunk.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://f0usrkn63hv0" +path="res://.godot/imported/tree_trunk.png-9704d95a015e91b197256a3aedfee62d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/15x15/tree_trunk.png" +dest_files=["res://.godot/imported/tree_trunk.png-9704d95a015e91b197256a3aedfee62d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png b/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb79a463fb1b179477f80d887531dfd3bc3e50b GIT binary patch literal 17143 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 literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png.import b/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png.import new file mode 100644 index 0000000..abe46d3 --- /dev/null +++ b/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0t85l7oiep61" +path="res://.godot/imported/tinyworlds-tileset-floating-dirt-isles.png-dd7c959e0deee039b2957f496e6c51b4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png" +dest_files=["res://.godot/imported/tinyworlds-tileset-floating-dirt-isles.png-dd7c959e0deee039b2957f496e6c51b4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.xcf b/addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.xcf new file mode 100644 index 0000000000000000000000000000000000000000..9e13a355084cae64c71cc8d3d95b1720d8b70e31 GIT binary patch literal 16713 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 F{ufKV#gza6 literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png b/addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8d795158236055331c7cf9c8cf6afc74edc567 GIT binary patch literal 11765 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 literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png.import b/addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png.import new file mode 100644 index 0000000..f71b743 --- /dev/null +++ b/addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jhqreh71nv5o" +path="res://.godot/imported/zelda_like_dark_grass.png-e14eb21d78bf0a5e0209525e40e749cd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png" +dest_files=["res://.godot/imported/zelda_like_dark_grass.png-e14eb21d78bf0a5e0209525e40e749cd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/examples/16x16/zelda_like_grass.png b/addons/ez_tiles/examples/16x16/zelda_like_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..432025092014194831fec6f7027ae779d644e7ec GIT binary patch literal 10021 zcmeHrbyQSc^!CslQqrw}GB6B1bUJiONXRe@FmwzpjevA34N55`-3@|DNeU7Y5&}{x z4d39~>-(+st#_^O_uo6S?wxb?dG2%ee)c|R%{@=FHSduS(h~vz01_3bqAvQ^0)5Hi z&-biZzzg-ClDP_YVA|zOAuGTx^Px#w)-KKi=?VQ9-+AX7p zymIu<9{o7`G~*q(Sb6Rn-O^ z+sYe{E<8D|B(aB}Bhy>TJ034S=Zem4;kI?8joF>FhE?VE|1eka4~PlqJN20DI5&%2 zP>rE%UF^bnze|1~7@U`DCBOb;rGf0jmhqC$=Q?If?~$;ebE@L_$~Q4_Mf8EK8)^p9 zIsWgbB(T@~>YoRiQMBWT2TEQZH@j|rVpxJdy7E~ydN^`EJ+0tB2H$Sj*jmrJKVl|W zx*8Kwhm|hq&@F9onxw>L4LDMO?HHH})(c%1&8qE-H&H%5l@@{|2+fYB7{J2Zgf6=(qD{gW?acY&K|C*{sspuJ7o&xlQ3!JAHFf58UoQX93lpP);)+; zIfeQpW_}eGV&VB_{xx|W(X*96mkwpqvq>fPNTP;g%G@#lP3S=d3RCn{gzF~U2Ly_< z+~2bInae*ZDo9e}sjD5cFR3cZuzy)sKbz@{F{Tb|7_+l4_j;weO60G$mYf68a z7}vZSn7v!x@#reLtjTcdd?JRwBsxIme0;4`9?>yk^4v`@1YR z>&)UiNj6C;;wGAO9HFifxp98$!^d1N-pyU{I2ZNu`y5^&*J5;!_yv#b7XseRQs9kb zRuvOc>ob(JFIl<`N|UI9MP9L12+q^Cg!!xQ6#p1(Je*)U(`-MpUa5ACNK$s>wEZ;x zAiIU}eN^+1f4HEZG-x8jBUYeVd~USPoE=`QBF1-yR}qO=pHY6s+elteH*DVYy;^S@ zIM_4xuGY%;DgEH>gNmHZrrL@LuYtO=*~fg9HmF7qI}F=}s?(Z&)${xS%CjeJxe4Bj z=Sv~P6m)Fc5XqVj4|XrC~K3!1~l0)m$(9 zq8XEwh2%08FnJFz3by=^n8?nlK=p9u$e@srQSfO!esgp8{u5e^Jpm|L{(aAPbN*S_ zsk-2Ss zVY!!1q8GyU#I3rWd$yTi*t5s&u;t(!f9GDR=~oh{^(iOVwpqGcK|iTe-SmSM0Go8X z;VqFt=}}`p$rlA0Mhb76!x+k|w#{o2zRu&urYa6`K4OyK$;PQp`^2#POcY<&ls{%> z0bGmao-rf!AxPJ=s4R1S-lrCbBgsk%FtFK%QCZYNQe5-yjI^@Re)IX7SHZJ~pwUB3 zFc+qj#;;PDhx6Iz*M?;$S2N!v7ERlQR~(E}uZ`a-)#!Kox*0$^wW>KV@<7$DW%fIV z=3`v|Lb~T1FXgUw&zYu2&f^juLd{L2r;$UYMtXOExR{=t4FslbF8`7x^;UD*^gEEd zxwv+HgY0ZL45DA97Je63FBd3>qlnP5#fE%rA~`+Gui|b4q!VphZIa7KDq@fC5Tz&r z@}CSSuO+cx1ow3{TN_{-JHCW0+Vhaos(*TK6p;_dm5MG3{b};~qlN+2uCEgU)s3@UXjEzgX=juC$lINK;Bem+dfgnV>k3Zm82s z*ETaiX}oVYPnqBy${e}ijrZ^yDiEBwdC{CYLL9xnlh5gVYiv#bFp|C-YO--e zco?CkT#_@_MEQYTRBP|5HD>B4=vZglC4&MMs&d)KLylF;tQ&lG*!bkla)^H2a2B(s zrCG9{O>MGm5eJV}t47bG9eVuW0Y;{6{Ec?e1XW%Jk9sI%+3&ght65dI(v0&cW&a}H zz)RnPnQ|t)x!B;SE&*iOF&|B7t>(i~3^U6uJZ1scq#ACk25sxaZ_h@rWRG_AN@5!E zwas3C31;84zV|N5c5}Y9GT_i7Q~yHsnG0LSFv*Vk*Qu4hPX@wT8KT&!YX=R%LCFHrYH%1K6BlD7l>IX^A_sof}NM`N+1i?LZ|~Z|R3bSd|z?y&_d44{km&4gbdT zY&;fUcs`7bIYwr7D=MavUV*UZ;ydn|(QfeC67HI?&ArSlcGxm*SK9cVW{nR<`>3L} zKu?Z^pxi9hMowQ8AyA^++m?I7GjO*-y8#-Z&)U>VS}4H3>U#_H`jTf@O*3%Xb~{cQnoTUBLB^X>87?ICm|wC7Dvxso3UVRPsH=W9&aKXBO9MadO>%R`z*G(#AKd) zVX=m+^ApY5C4svmgF_~ESqTN|veN`$6#`HrYe~FVEzoPi;f-F^QGl{Q?{K~o0nR*s z7P|UK^uC>UKKH?G;Af$WkG8oYM3JM&Q0&plO}5TBQi2)N8v@2!$D2}Zawmd!cy0Y7 zAV4PU?C|kY)qv6G%Qz7yKnVRepOs3>hl43#-kc|KIE=B5SefhY;pa;eIZk2yCeY zI=!2TA6`{FbS+!b#{C0R>~s=MH~-O~v&ZexiAkncMQH`n zw!CHh^NlPOR8j13nJf^rdX`C++LOU~yHNrmK4nR^+=0i6>d*Ly{P=49*r!a(v3KA}t|8?I zT;l17&}3z7?F4=6K9Vy6RsOhWTg*pcVhO%OOq?F1k=E)%r{ZTD)B`M7CZeV|p-P#e z3tYGbzyrKXritk|$1S2@gd|`&-b9Q=f@23|pXG>TJx`wNE$-ishW8vN2uV(^aMAE)UA*U(D{nAP&uyl* z$ZH3yp4}>Z(A1jEBK8KGt#Ob`hk=OdLwu7?Nax9hvA%4Av}Ix%Ij}cHq+Z92U~7pe zHL7~m-8B`LgnXPsW?KLQkS%)`U*~+>!zq@craNK$H>_P=bva86aM}^Rj!1j%eYK4$xzm`CBin^i zzb*EF+?=*EK|i`$WmO~fgw4=m(u1*o)U(`dgPYKLX3&H3TgL3#dR!_^IDqXnT@QBb zD5JmFv-6EF9P~h_qTw18s7;Q29;Pc=CfQkTN% zGV5UO_trC?u5I}E^VLkZ{^0AujUIz}JO7hs8zeR>XOFc9d%scL82*HGCy9-K@CIeZ zWzdTcr`#s2+xC;0Sj>x&es6U+^_HAwQi@9|&}Lbg!B#0-+or|#TL|HPJg*8x^DVEN z^Sow`KB=||pSgG9;*>u2^<#3F^37QsyBu=^o$WFKF7^Gl4e#aJ$m7{EJ+Qe^ji+4O zi~Z9V7{uPd+QGzPrDd|a^Oj@M|Hv4kkJl<%_`*@u%NfCXf7ikobS#p@&w$(!PKu9p z*p&JbPardXi~cbPR}kxT{!r95XmucXJ9qd7LH5x>!*klP8WWZ!et!m7(P=9tG=r^Y z(8as)&W4bP$Vne%gFdytan%5|Ru^`Tm-V|@ab>k7!=f`Az+p7jEt z>?Ub+%8jC@z%5@*LZUE_cMZlF0n-(r_wFeJ8_X(kRj+5M)GD8Lv=VYadhwd0ek>n2 zdM#e^iPOfbCJUV~l$SG258C_X6aZpH?wGNKtGB&uqjRMk1l4SuIsq@30g)`F-()M5 zelo6+sK2;ZbsPJPLZ+RKefW$pNe1A7I%kD^-M`S6_!3icl0AEjRpE+-WP5V7@!mU7 zf77I2oLl;sygSu;dY^8neDQEbcKOpAo6^p@%$pwDFE~&syd(BteQxKIorD9Bs>&Wo zMQY#dbeeYq5-G9rPBx;LtRIQ+j(t6REoKc`QZ*;GB#q46b+G2y~^m zqXQa7t6S(|J!5`wV!?Ra9nSjqD!Y*K{B=gRB=%07wC*q#s#G@w#eTA9N0eS5Nh|_H zyBA6Jc)Q00>F~;(SIPP(I(S(jQBuIWWgo_9JhJe)GaliAiTl5|Mm!F=)zhVu7v9{5 zWGU8oc+WfI=R+%sn@nyV>ta3Xe_0OB0gx#t#@vys^nT*#!M($x5L&j3F8FKJag>$u{&6ENA>mwmhU-c(Y;lPTp} ztL(}S_apHY`JV;*8>=}l`R5h(G#%y7O$#*E`l0U`G9}F~ zo1>qMD7t<*N<=iyMht0+2`ZP9$yd?AiXi29%#of4zocVzKPUDqIMStiS2v1kjbwlB zp!ke#O__sQ=pO%{dS{YgFrg&Lw73-bni{BS2m?X)dQ;cQ=qh+rQ|XI9ldK z_d;kgmSFcfo2VlzRij(%-57p-ZGl%@Owz2(pWU1N1A zrl%x=K_`WJVvYu6##ChPAEkp{c!>{T5+o$mI=i%2>t}3Wm&w#=U8<`IBI0>qUUE7@ zZTRDgKI29?_1m@|DsxyjSA(V$lvlp{f_X-tm`!!q!1nR?cYnqi(h#kzl7EK0-8y9v zI;Hqg=T^2xQeve1NOJB8ZQ8-fBEjX`7d|qsce-0fgsQM<*E^!Vi^fwcQ@jpwxG#j$ zD2mT!8f5X|=100%Wi0NUgenF7iJ*@dLOMLJ+)25H?31!Qyyr8Eb~_X5H}W=T~PA?q>8Cg(Lun@hmUiy&El@~h;*M6Y$a5*R z=umRY_bT4=b-40L@a_#JB)%V{jEL-WBYQ73cqd$ykt2@#mGX)F0^;!@jZNK@MYi9; zP2A{N)wHeJH;KIzx=@9%7~EGSUGgcOu~d|F5H0WHe#XEIQ*hHOi&Z08raPSdWS4jy zHuh=OMe_v~m>YprJMjdpuZe0i>o5ErKJ8F;UJ;uj%>vtS2K|#3w(Sx*EW8;S8^75d zFuOEih2^5&CNRF$QsYhyIublB!UXve5mz+1Z)L4~#~AofmgXE3s$fyAKC{KV%e;~O zsY5FJ`l3H-w(Aras))9xiUhE+b7S=?y^>I3iFm zR&PfKCwGXq6#Fk;2)cc3=4WU91wq+Mu^VY%YYMhi}&-zry*uBk1Y=>qaI|4tmqkR=$1 z5D`RYP!I+OiX#L>fCxcLYcUZ)usB@6`k(CX&ekX|m>WXQ2CXAnD|CVW(u$S)_Z;&4 z6Yphu;a@LP z2q*MEATRW*5^r;FCHgfB*HZ1CBH-%!o7YyHjJ6QCK#ko203yok3j>gmMT<7#p;R=K z@HR1M$(i}&R=89F04x?2MLB)%*&Wk1r*05AUok$LNKQ~9wa2zH%j@0lciQz)iFNSY zJav4Jd_7Le?cSdkCs|oxR7xM4j$0%a{XHf9&gSMHQhnLF5bLR(o?^MX2PTMin0{a4 zC;OqP629{^)nPYz{PJ{S_hcR76O_VR?+Q>Dpg5&xB74eJD~xmYi0=Y^`Zz(&6K^JU z(wbS(OBA{$-Q@RKKHX-D1f^z!ie+M{FvK= z42X3bfRXIx4{s-x2P3Wuh8xYPMU_1-X`n}0eE1cjCz7R4G}0Saej3?_SZ_aSt=E4a z{^nr+1-7gutL2F|;f27iUO8Ux!Tx<8*>Aofs9WmgGIR{81d8u`F%6;7ODjCz`>C89 z*r2b%I}i3}Pm?k8>T-gXR_cD>k(MTwZ#UJx83{x@y6iidP9eX=oFboeD{@$FaVcnebt@1xlt&oub(ANdu zx|jjH?(VnW8o>o{vG5CkUY@Rh?ZgeDmS!%!(%#93;6eRG^O`zj>do=zZ3@}lPP}94 zRJV5DC(UiKks-NpuWCDJRH9TiI%WrRWjCzV{h2Z8X^dvGf+hp&(q+ycF;g6*(HWdf z$ImmtFS5>(>bJgF9Jgej@a!z^c33=~hnmFe8$HSP;{3jQclp)1ESx(!e{OO2EKv1o z`;)E^H}dVpg;St_u$)&vj?06NG%o13-FU}c^A9RM=#G;mppXwS{X@mi_x|@Jxs!X(p1t;*>zv(WXLb{-rXq)dN`eXi05BBfr8QnY&0a2XWW<;EEgm;a z0DyhMPfO23!`vI_;^u4(b$|dpd|ea)7P3Z*mj^iyzLuDJ!s_C}u{J{&y#{_qUHQr(tr&(eiICRR~Kfn>__ zd~4IW60Ul3eXV+XNBI2wW2NI_gEXaw>#1?jqQv*ZYV75h?T8q++Q|7 zUp>E_So9g)r<38y5=C@GU)ur~spKFc>RCs;ueJw~BKi;AnWxLm z_gl*yyvx2wCM0k~Xb(d@Pg_q%SW8tJ$P)H~Ukq7}S!CJxS_+2tyiH`K`yUOa9|&*0 z)~!6N8zmrH*EA>=fBN{_JvQsJsk|A-_!l(p;2=BD^rI(CMoi1-(rXa4_;lEo8tg5$ zJu<5mjd-}B?#OFuY`4UmocP#tYCg98n%fkTWhKkRho+4a7;fs68a0~)WQ?%48uY<- zcAMiv8JeSQo7slPzW6K^n;MF2u!HI~^t$eBO|v@w%wKrNxw=X`ZEmL0EN!z=tF!*j z7(5D3tieawl+hjxa+8%b#jQVRqYYMUww85-vV!p40ql1TnPV-rn%nQI@Hd>K zYTc83eR>t(EwcjCKV@UTTi6IbnF*X#KltT6gGN3mAc6+x)!bIMVt?^bHG3 z$opve!^@@7oE-@YZI-po6d~2VRQJyl1~&R~U417K%ZF3$0)DL^e@3)cCh5j6Ms2tp zZN1$c1vM6FA(5RrwWL18-0^##n)+LY#;t$XJSoGsEOU-l(=d=ajt#G)RTv4f+BGV4 zHR38vWH{F45+xBNI;ZWF!OvwEE73yjX>|e}`qeU0^c{Z+&W&{2(@>6Xvo*Z8)x@e< zaR?l&=gTJnr(jYmz#3cTJuOvtR<~D_52?uYz3vvsqvL$<(Esu1*yvk3_qMz*`mtIM zm{k&{KIScK(-#6c8V$LVlTpmAc(=!54{9+k1EJ|zU<1{_=Y!rX@SDpGcjE3?>uYdM z=l5~8YhTBZpI_+M(cIkL!S|t_YJSaoFlG-jaBg$?{Zpgf(9UASch0Yw`fw_i_YC6R zlIhRl*DLuRTGY+g)S2 zXx#g`;SH~9`#Se+=E%3OdTIMNiK=BZNr7pe~#jGX?4})P|IsPXmHgN%r9{HPcK|-{C#Z?kvdOMkvE& zl))7jCOvd$!u?F)7Jg+7+`x(35nxUj-1mO(b{$LFnqNMrJk^Tto$X;*jZP-0yWRpj zIh+bW-#@qZB?!)^akkM|`XuT!-!0A))NfND8CFetk-o6T*>}~KV66eq8g(5bVYCw# zq1G%>jKV}Fhl)l5BAckZ$&xuPvi*9B&&@K0i@FTwWK|208+0tefdQic8 zpKT#wHPH5QI#>Q^-Y>c%ld=4FZ8bbCZySEEw)x%xroxj4g`5x*F_UuxUyMyzC1XyT zS%g+=A%do0b_e>6`}5EMn_?S>VPE7oPn#Hv=n}4*i-2E!BI~``U}Bi)}A4-Hc8}simJT&w=>%0-6q= zulV>ez|s?jlv4?(VH<^??49po*6J5cJ*NB)BLMl}l#-nz-Cz_Cs~R)D4gWrU8Jw6J zQj-&uEje!oRxTutS{*Kf_6$uB;WW9TS7;Jg7t~0xrX3dgVG0VBufEa7*u_Z2g@^40 zbZW(}Q%lGp*s`E`whF|B{ZM>0UqW3_kh;cO9CoO@NMLMgPc%>Z3f>)Y=&6^@2saf- zP2PZT!KZCDgmdvV7R}aPvs;YEZk}&Io8LPrXw3;}4OoCUnq*OBiO_ooOITj{M4_43@|1Bw;~o2?JHfhCqMo4!s$v>iCVT zF5FK}J~lU*{bqQFA=LS)vc^E(&ra#)>u2L3bnaA**snz);#BOqaV$~uQeD;=PV-A8 z)~Tpwv^_u#5T<#^ct@phKim*AG{ux5vXE8Wkn9-Q7|b6Z2ZlwR&`L&+$7n$Gq4ZWm zhI5W{Uhk7Nw&wt}zzu)l)<7HZN9ajmYTHD*-OzyIM%WU*BC>e{3g>sV4k1hmDi2fuQzY7M#_!W;Bx$Ihr#^@a zIFY-*W*$|cl38^1c`L-@ms0M12t)Xm2@n=WXNhAJLY&{EMQX@Q*(jMv#NWz3=H=*r zF$Wr=I6XuWG!RmBMlCGyt=~gSNt!NlvKyO%V+$-&src5FcT~1cZI|09S|&B7bbjU{ zV?`{TUfyV0Sz5luzUCyJ1 zYe(%46saC$p+nK_PpnP|p_5f3Au+V7bvLdHQ*j%prp67E{QLm`&=RyL2@@>-x{cyu zhc7DQf^%J1?1`;0ee1cZcpbm%RcqN%S;xyr_msy zXiy`Bo25q>nGqbQ!f4nc_%F6%XCq-Fz^x9)I1Lb<%`Z{3BJ%-@#uu29IkseP2t_z_ zVIk&vh-ef5QDirz2Z?KJX$?;aMq9<=w@5q^k*=*PxWnjgVU?7ahVaGjD1$TK4sV~E zW29)azEN1mCMZW|n&@bST|v>cs1-+({6KR9gH2=J3nv|oUMivfgH0pi>n3zIB!DwH z?@|dHJ|smCLwK_yXJ=4O`~j^utiDf!Njm^D#DB5fMXc}+eG?BU^2z(2U zU^wEbYqhC;!xpzwKpv!6gQbDM0LKvrUuc4?1bhV9;EQ;KeyG8FN+aO#0S6sR#7zri z*J3$*R%4^E!}$gWyBfAuJq?W68#h-wCFBm-F*9Kx6?T)A!5^=;(f>)AK6x?^O1r0q zx^`=ip>^Rrv3WXA7yX1!EfBIp%D7*`sLn=^MmF$_P|Hq%)p3P&2*KrJA-*I3K1-l} zgN-cT8Eeq4er=*&DvCEzb`OXr@j<{}Zd)vk`l?+{X=j#hj`P}ZUpG=;&2>^g&&|1H z2%(V1p|A)a?t8H;nWnV(+jSPt*!4}4+xHsAg<9(pgz=aGnoz4ubqDRvQ07l$Nd4`% z^dmErZd;*Vk?PoD`y|q=)1EO|w5LCZOgh1cvV`gAT3F&0m3|{4HgO9pQO!KLb~G`? zgz(`M)SM22^GE0#HD^Nd<>8+P_i})kRm*)h2)Rzxa_eyLZ_U#Y!HDG@dUUhW(&9#6na5#Mi1uYAy+ail_H85NTX`|(t4j^P zL3tor4o+*o)VH&J8OYrA#qf+l`4IPtq{-m;2LS=su zkkGfSimm?^*!CdFn8p8!gAc=1HUl@XQdR6PP%44*yr^o%+J4h zakTlqC87Q-aD>}DSXF0^LXu$Ok>$`n0+R8r!ctw4n?*vuc}?2%{q`(oqY}Vb*DH~~ za3zWoSpBNiFG_}_d7}tE{zoiBzWQYy%waxs!U#07_UH*=C_kH!aGqq zsaMnHSZ}2Hdt^xCWRS5Vh03wAFzh+0O%{G9Nfy z(ffI~HpgR6@71vIK-9<42+R9zeZM+|h(niY3OZxpB%)iwtMuP@CX`&Iqa0(r;za*G zUE||Bvg*zfl21Y~Bs{F3or#HuiFW=2lK_OpjQffq0wZP==JO9pGx5N~M#4hFSh+Sd97&h##i_?dhnRW{b(cp3{j0-B;>kYI`h46E#OvUzs#b$y>k?9Jyj`>BzU|^HOiCq4+Y3oSr z(v!avsTbs+FC0-qJ9+@KPdG!{E2O$`p8T}<5c$E#~(m&&5Pnl@U;jPg%y>THY9I#td)}#(hFBYObkyMDsUQVz+PEdex-{IPl&%LJNKIG@ncHn z5Lx0CN)t?MKDpex6bIA>jvr|s>v!<5e`v8D%qJS$8s=o-f10FbyyyOiRwCm;cQR}# z8O(ilgko>HuYK2?S!6Po`oRQ1EN!vO*0gs9?;lbvbJ*SkFbW&<(g%3W6)R1a8hh4YFx@Kes54K7^o3dI#*g|-+Tb zg^feqZdO;k>rrL`mQFcYs(8KnRr4gbJP#r5$v*5{^gas(Ql|ql{~DWt9j&tMpI%GB zpIzNjFy~Ljj-1#i5|_@>s2pi40ys5V^QHRqkK#@BYG9JI_S6X|GHlH7*CBLjLHLf5 zrgM=U4ZmsG+u216P2S5T+olIa#x{S|SepERiCSKqq+IwOC@j6FFS*tN7h=Yt>!)>> zbq;qoy*3QzM2F>TQOA*EmnPFIzphw+XoP1D2j5^7Yws8xzdfO^6G6P7{#Y}meY79` z_GeCvS7xM!|7=|xLW=GK*!X<}8Nd)GIE&SQwWKG1Y(}tcRfFqifKebwHHk@KB#%m1#P#t>+iZ?L<*KE1 zJI6#qI=@5l%Pwrmqa9Y72Vh4z@QpZv>g7)+?^gs|YQcEVXcFq5vpOJoYgKCF$qlU2 z&>2JtT}uy}WV)&iG_?&y38r~xfZcR~-vNPr;SmuTmG-cEsw!q*Xxv=scyaT&aYb0K z83nV4H!pk)J&dKia>j0;JcT3dOZXW5%og*n z5jy~F74hpzZU3lhtpb%x*a5*fpd5u6eIKFsSU8pO+HM=hO}SaoCt2YSoem<@j+z=Mc&TFDi4R<$UC2A&FV(7%QDEASV@tS|I{% z=2w6-6%$2#J||WD?5O4c>$(>ONOv!vZG1sX*V`?qmP_n(}j#w&)g<7B3;Fe1gL zl1-wI8{-+UvEoz3gv@5@AoUU4uG9Tkde3slM3%xn@~voIY*Cqrke@`F!9HkE{Mc8) z$&hrwvxN|dFDNYo%l9%SwfEAIE-rRlni;3gK#k z36e5_OgcDL`nwr*uw?LU&>=(;cBPiBFl^>K@}#vN9k@ke_K$%1T9iIU7?Pd=WZ4X@v3f^UhfCPLXuD!btC1Tx2cy7O&Hz_iK)!bf~|DN#tT4*3-K1uhMFRu9X>7GYvYDCl)q0t!?n_fw;M7Z z@qUn@q{b?jl34sGmMsd1_*L<3BcNzqKIweAlAUppb z+68#NyYBTN6HO6&2Ans2g&I3DF-)OR5>k(;FbIOl^(~|`cRhe>cN=h?+a=hyAa-SGghmhDbTkJ0+>0T{V6(_1(%=W1X|U6?rLeR zy|?XA$%?qdW018<2IQ$c2^IR`*KmumzRwkHyFth7UJn?NCH)KuwO$M%*t=+VCHuX& zfTdQb;|JSkYul5|xsN)DRu?Y6Cl6QK=Fz^t;T?4ELHj}|X+?msNapA<;#~8zhmbEv zZ3~(Xsu~qeqKE*c7%kXYS2(}r4_Gi6cz+$uJ)Ns874EgrN1F>zSU+_--5Kd0PGKCb zX(w)GogvJ-Jz4hJv5SDgXXG>D8~&z9#w;VeOAKwI3OI2wa15xhpBW@%KT~}uiB{>` zb1L|;a4ntgcfjj(o z0xemtJxNDs-6LNOYwH42)G^`Py02+v4*O!4Hm+ODe_z8ot^N+%=D~npZ+WvFPcj=q zP}j)oe9xZTA+OKYef_+Y)a>hX?0Pl*UMTqlr$`qM_-%hlHM=SWXM?(X%h zpzpzpk+4T-u;d>yGvNl1Zg%T+9)U14-|X?+8=FXpv+2{PkT|PYX(-46@TO~}kx`RB z)MS2)L|JQIs?nAczCtQfkfb5~PKlI!7Yo1{a8{^=)#D#{@-kCJ*bAX7H%ouG@79#z zka>Wx&66mrP-3{mhVR4Wji|DNuUSvRePvEMuav&3usJZ> zPlq4s-o8RK5hlY;ScSW7a_D1u6VqcWV>eqx9v690U4)gDJy2WGLB~T@PNrs}#ib)MsaYE%HsW%ZoRtk2t8>QfE^*E=3PW^Sa9z2$}i}Z$-^` z(>)6VpKg`9Af!d%E6GH3*2+WbphAVm+b@txIClD&KPz&HBZU;J{tVKe$R}E$3pHy1 zmtR!%X$v>X=bs^)B;;b$k@Xkxf)@zBx>vl;*yW`zG!TzW?$pAIkE6Uu*BZ({5<82f zIhecWAk@)K>(%DA!OhlciJmGYVI{$kj)#;_PtHoCcp`eY6f?H3*QpFt)#nU~t zo%=}H@Eh5?Y=tFMLfEB+1$Vy(X<(@Kx1CstUt0mH&GS&?e zI@3oSkZr%^*nW{YYA9ShFi)!Q{1Dpi##0C9Mk<;9&Z5E!<^%SeLLxovT*SM%FI=7P zQ74wtRmW!AiWpA4y?z8xW#^9!mfN(MHy za@r+hKGCT<1==R3)Kx^?jCQzG!CFLs#Ze!e)2U5zh_a@p*;fK%meb^rC*?^PuccMdkEoMP7K3KI!EuC(w02N7} zqO`z?R{%`iNEzt0(DYciLR$VzgH&eG`)G&9#zs&y$v}22nTm4&2`t5_`IqCOBKhvm zQ`J0iMuT#Ml@*8mHiwn+MC6TiS=AM<3=bQvT%!#16_%nbzCpuvzxJ%G1!S;B^^zD5 zM{N!-9+!uF>~*%c%OIG=#55z_>_{OHKA&vWzA!Nogx_B%(dKjIv&Bs+gc>64I%n<{W`}wS-LJu!%RX59=6{ClQ}DK zg-I3oPIf9JvmQSAyOz^uoEJV2E7@>#BCK-r3yYIV#N_Ei4)9-tEeUrycQ%^&c?h1p}u`R89ghHsf3|j zHDzulKK)L9qS2HAf*mwa>)4Clyut5+(XflwRgQtpIcex|h1ydmRbcx`v9qMX6|_2-W>k5hw7b3!Bh6ok{}TP92od>Kptit+SVaink#67ok1G0*y{$tbp3Cp1Hy2-uBmwVyqUpqfIcr;MF#aZ#$% zyLQ5_-W^QHl`o)SXVHJ>eK6wLZPfRg5KV=#nIjFmbnQyyl(an^=5=(@s=!>e7Fbz* zJyJV6$s|bz*R7q?OOm`}ou+70SyvDWp>X;nY*^#bNV-Wwfc~AnY^{I7V|atRv#-Hv z#Ls@SGq9NxFv^tGH-_$+-hs*0^gdXWAl+Em?yGB#9%pIUH0mRRG2h9&xOeh4mpcwg926%1A~a>aMr^Ek~D^_8l2{1 zylr~V*p)1oF4zaDNou#vrZ8T(_)+Y(;3LLsYc8#$1AFR)@tuAI`!tIDtAfdJf8_qb z@JQT_I077P35Eq$Kv~I=BSsxGt^!J}_-UZ@O!;z}V^!4{$ZJzLYcLAFLJWd&2jc+W zWm2OUW7uioGU9=0s}|Kwjnok73n)V?N?>pU7Zb7-VvCor_Vc+hclTL|U=Qs!taX%U ztNi0JW8PgCqpa-mX38y7DKI+?*zjk9?RP1M5Q`QRS{N%sqho*ZWPq;~sCg2;!u#5a z(TIhfOr*C3H&dWV^am`^wscaUn6Q**y!I|L4}M4$dlwyEZhFgm+Y~i^z=}pc0aP`8 zXNhsx_oc@*xWm?ef2q+BU6Pv4Lxsii%?#Tdz4n0Ucf9VYaEww%TX#pPtBO9~k-dg5 zO9hA677eJ^V3xDdq`rcE6|0diT4*Qm>0YX06jXLA65X4RJ;P^r3ztUv-`Hki ziYKR;-+$cijo^!i^M)1oC*PYOlgnLjYiDIv;kI#SgWBe?!khJhU;qb{L)7O{UpvaR zwOZRz-Mgi<_AmAt@BH11&!ON;DQo*?e}@{U6P!tLBWxAc3X)(H)DY#B+v8HWq-ft6L{kMyPf6*uqcny@{wrKDM@ zqM9YBR3C7{Wb@n|ouP(t*xQUpPqKc^-us>4mV4x2=Ow6JP8tq#+q+O3}O{5Rld>|`T?T#a>n`E!tMHCY2C;>ol<3ywe_US6K z&gX2C9Y+mVz@64J#JGjCY7; zEZPeGxjgr$-E3;dPcDKH=&85Dg6Hnr@6#|pn7K^%OK1S>)pE;R_D{j$(~k&Aaek*@ z8iEy`W8;(72U|B5ALg=7}Yhhxe5EO&SD6tNvwTU^ix1&5&%5~hBx<@v$f*$~sSlw49QAop5idJQx{L0;=o3#PfC&5rs)9bJFT#ff4U_HrB-QFui-ov4YPZ zb^|a)TZ=%;5DtMAPvP+RaT6Sawo(1*L8LJe-vHx@HKIH>S!4KE@?5LgM$X0$#Ur7V z2w<19Qsdv&;25uINIG*2Y1PQ0U?bj}cx&!&g~fOm3x%05*!D&lOg zV|P9P?Y`N8x~u!NL_ip=jGb{?-aTxr$2c4(M%1p)4cpTQ63vnK_kAD2rs`C9Eo$`D zoGBDU>;U{gO5AbIdiqMX&-C>J`cxL-;E*a6YEY`Rqfc@LxxeFAM!{@N8c}@53XLTg zk82h!ilm*a{f3Q&7C%aVtQlH?h}abO?JV=*;RD{?k4s1Z%~`J0<($KTW;W%K!Y$l0 zD#0o06lCX2%_uwUsqn^bXQB$Gxz}*6+8-3vrfhQYHKtqu1O}jrpoY@3gd^JxZy=|> znAP-CZtqOg-DJRkO41{1la9sJDjl0EH-RB=koKE4gF4M7a4Y zf4zaUit_W4ED!Q5I4(6BRlZe!-MIo&_>;%tN*7Kj7{D&6ddm3IIgjdjoi9Vre~ohOGJ1dJ33+y(C|+2K$(9{Ezn7e;)ry@iYxRrdu0les29aeEQd zH4CD1Um!A@=*kj<1fV|Wu(R&au%_NRDveF$L^M6PI`YHX4Mby+HEj<<{LAE$HT{q= zdhJYIhug0Tg)2`U&ld@l8}37g?bMzHSSx}tGq+@NTvnnNIiAA&4Z`IMJBB!ecLHG} zm6}B^;Zepb0aU0ED1(IMnh8VS8(N*Il2rP`?Sc6ZtLyzu09xaOs69?!vx|vzftb11 zQb=mCdmaV|nmm-h+H}cxCppy{n6w?U4~A|NKvbhD+>vsI+nEsNh2D+@g=n4n_HtVI zR8!=E05Q3qPEk)dVeW5aM5Tw_b+2~#0)&?<4RR^S9E6Ex8Ek(i>RBZdmxVPQu!etB zrJN9NhbA+&PRnYFb(~Rn2eg-gTe9=@tdL5I6GzCvd@=;G7@4`oasW`y#61BOVyogEH>w7T5#8x#8y*4G)XN=Tu z%Bh|T^hEmHDCyO+8gjA7b3og`^z^yckx^wo#;x?dry=7C(vBrX`n03c!3v!idm4Vb zgAw;pjCg3MKd}O{RrW@dY`;dW|8@~W)w1B++hCXOOHUP5g3q3&<TQLYi;JWGWoMR#qByDNhp?rQ||T*njQK{W>D5m^%U@D$c=zln1FE z6Jr*OUR>iQ&G5A4kj?wjy3YuhC^a^4bo@LI6UmlKm9<<(5Mnmy49`Q)x`D_ynbi4v zlNPM-LAW0NOhQtzgMsK`g57pP8jQAhX>H`~eJ)2Cig#HcO}jfQJ&ij1`W^<%;bFB* zCH&FQrrp(fNqvTjxVvJE7w&{cl@_h5MLKmmI7g5jNMO(y_$DGG#DyYev@oi9q>hR# z@5(ornzPuY)~hz!pggK>P@X`SsGPCJQ$oe=l-{-48tdMlg^+s2CY|T-(Exvk!f}<( zaULme=ggB9X;U2el;sU4ZyS-vu)Af|L#QWEn@h{a?UM!eK3rRQLH&vH>~-1w+2Hfz zSk)M^AA=VRd!DWh6@GZJa@+>}aGIWu8`C>kH9PK@(4RlfMEpR_sn zubfz1Wdb*)dsHN~Y>bW<1pyj;oM`)ux7oe^YIRAql>=@qk7O@cDg}m4xrNG-Gtv32iq75XERJk*>LvAP z9UO!EZ=6Tlnwusa{q_hok+R!yaB0@?3yhW+0S85h*aq4g%&owY zy8WflQAJI#F2h`9yQm=&o<43Ke>As-dp2=FWru)z*_ecYo@DqN7@MkaZSVw-XEG7* z0%SCC6qu`5HEQ0Yy3;q<#`a2@%rS45A9dA{?0^PFZ>>o6%THP$t`r1jb-ReuG=WUH zuuzK0?gKi8PN{bcdfWNcRVMTS0#B;prFE6 zWrgLcaccOyeRT==m5P*U^7!g2f%fTX$o4Upn1R;6X7=9YyJPH|O9uh~DN|oh$|2?I zBAda28c__nA$nR3cyyD-a`LB%E$!kadqrdWlhLHR({%x!Q%ECFs?sZ|PCxJLYTpu$ zCdZwl?B%4rsjn&mDN;dSoviMJLnyIv7apZ@5JX7$RU{#KN*-N9grAR$fq^H;caM?>Dz9NghAf3WwsvJ0`E4kxGl7{-f^ z8Fa(?Au`MyrAS7T$XF?RE4d7b{7q=nG;5aUe@=w>Wo`|9x+(e=jJO}aJCUwTcz2io;W!(?N_WPq#hgl4C~Tg#b&U(!SzQ;D8P?sjXBMa zfewpDc)ic)Mo{D6E`;I0)a66F6dE%h($>~vyK@ScHn@ln9^aD5zNsoPz74tNzAJ?V z`JtiLwz(hVZd||&O;l$%hlER+HN5_LKygB`o442_l6U(ED35UKEM|OadO3vP1${Ye zpr`yAZ0YRCZf@ml0b%!Xba^?9000P!`M8){+Cw~m77!b#lL+-mM-Md+Y9&Ig%c~4h zc9DYELgoG3Aew$ET9$tHmV#E)Vxp+RKHwJsM~H_x(8tli$sOz?Lj4ym_~rhOn1dSl zmx_nI2(_NF8c@pF4Fcq0=V1r2$@oCMxTr-@fx>Q9)?f{3*}p@)ltid)Jv>~%930-> z-t6Ao?9OgB9GrrJf*c?&4lXXX7Y#OdUndW9A2uglT6xO>QWy@34Pp#NhF zcdeH*8yp%CcV|yGONfjY#L0u^-y!4_l-2%;@W&+^sH4kYPQ8%#ADvlQ{!`Dz)6L;8 z9V<%?hy%p&1=Rh;KF&{!?N7~L?)g^;e_ykKp-{<#7cmThs)ZMO@NoroDF2fD`+jqYi(}D zZ}D$X3Qq1G=1!K7KTt2=?9dk+5Wl6hrIjTo8y^>!1se|^uLYYRKMxNZNRZEhhtpcn zir1R+-yl@opf6cz?(pwc{eiN2f#R`(Sn*hatk@vjJP3qF1}3$B+p0SK2M2*e4o z2Ju4vg8CB&u!Nd|2sIZw=wA{w2XhZ=XE(=}REIiQIeWYRt4a&%2+{N~|3e!mKR5r& ziyOqp!zakY&HXPW9f+IzOUnI0y($KY;>xt@$6DYY$bVKVzYHiVa}RTAa}UT%Zy+vS zFo+Y(#iPZ^59SegxnX%Jg8oh4*$Qgy`~Ri=XZQex{}yz4sQXL*zJH1SHl{Qou74~2 zt>^&#YcK(Ue+>(;x#izna5wjYSp8+^3)bJNEN#u5Y#=Z5$KMn7A9CpbAsIL=xFD81 z5C|K$1-JR1e0m9uh@-Pzj1+uRKzVe`V{3s)}*`WII~ z#=pmq=|8RUwuSr&&&Kv@K%`P|HX&!Ukd*=#k{opo9t!k zdYK7dHY&cf`7`JJov#;L|8GA29*6&%T>ydq>*T-U_kVQ#kFNiUf&WVRf7$gvy8bH$ z{wwAGW!L|2bfNxhF$HmY`32W+7TA$w>pA|2*@%%FX6#)QH!D9GW-vnD0o#rd%`w0dEyYiusO7&?N*UEAkf0@AyIjD+TQy5me z+nL^FPZz`YoM9V(?R87?N`Rw5-k~X@%kD;bJo$`)Fumx(JaQysxnd~YJz8e%w8ZI| za~_N+{2U`G`q!+47+7Nq7ra!E>RAfX!^U{shTNBJot5y%tf$h>hKzUCvkz*Y3165WLEVguJ)bmYulyY}l1Kj>AW`AbYX zh@1y5ew>#&JS>Xxk3c)UmP1Wix_~iCXA&m8Smv$e4|6-t=6+fIb4c8SN*U>u#@d=s z^yCs#Kk!R4naG}5a;Mq}3pnAEFrv<3IkbY1AGy*wl#6&A_dRXqC&B&CElGR)a!u7pYPT|%fDh-qe7)~P zc{W10s8ZT(yPSj;uzIdtiW0KDUYHpO%MD7Z*IqsvUnP4C1+ybTK!&i-C;-A7>5mO zePqi2Xh+c7Ca*uoo`;nvlY~frC(w>&r^cI0m^Je|n#w737$MiI;@%-#%BY$~n z)1D^X&KZCMVaBRtmFEBsS7tZq`V+tL^Rz?v&1rM5busAhXR#5$|CpH9T-G z1}{VAFZDVofR}Z=2QVa0A}tia?+7KjX}c5D`qVE;Tlph=x`U+aF27sYS5;=9I(iyw z?kcWvSE;KC+gY9r#l9xm;4)-Agoh7%4(@3;iG&kM-`2;>a(nb7ZG&q3A0);re(q zDuHv;)&|6&iCE$Q1*gr@v|f}!o1GVyXLU$dB4n%k&ob!viET`#20qDn2j5YMJ|E8- zt@)6@HBpl3+rtf!!?R2a-R7MtJXOA(>CE2<4}8@-nv0W$@<5T)X2}k3%q4t~irhUAm|>!9U`^jm6o^64}ud~)P&=_ z;k%td7k}Fuo9!rYO>qoQDlXY`&V!WFqc8n6^&Y{8lXf<9XMBf|_EQ!jIwNIwjd9Wb zb(qCkooTScbk?)#34%7d#0f&+>yx8ta>5MYiNBDn%IB>p!IednUhgKu3_AG>lVpy& z>iw>~5>9dBl|}tZ<<`VM+5;yDkyfOBO%uq>&)+#)4qUO*5rp=nBlgme?|R=?YBi(2WihTwFrCK8`HrDB_tNO)pDsqq xIJ9Yvz6SXH!T|bl#1thDTN_A?(XicArRaNP67l88Z0;jw*dKg-*fIc z=hpYD`s!AFzyIz`^>p{ztDn8rv)0-@UA=d-x~d!oDk&-e0Kia?m)3mUo4#)1$cV4M zKe=5o0RYyYzS{cknqV)Wv#XP(jXebD?&AyrLcDD(0RZon@;sXiy0%gS~1Z z>)*`VkYMlYn~WXPESuLUKT~Ej_uWbeT_#80>A3pw$75aWTRO% z_HOE#SkT^YzWb+_fS{wL#QVq5JENBuiQV_niHBE^KacU}&(G(_u!UHuUneNp=I@rU z7Qa%)H3|*CtcGvzOU*@HcLW$&`x`NQ{)#oYgs}JIn>M>jNeRyXD)&1u<>leWVc}X3 z=5I9&JIF9yFCSL(p$cQmh(i zBYuypY+)5lFQxZ|MHiTc8!s`U?E8UN0h%D>653>l!)S@GP!{ef`pP(z$x(cVaV}5=^OEZ_oz53X@{U z_n)Y)%nuyN&Q$LjU-zG^Z(9!>&F|AawKMp0edkp7?*3ity{;m=eV=apuTQrD(LjF2 zcU*+%geZ01-*B;KH0<{L#sqACwpa#AH0SEr`D={r&li*9 zy>~Ak954QKx~eMO@#&p?J-*eewH(}h);&oL&(SU%>s?S)aDZn^s?DyqrB`G;)(T%`2* zezr~SX!;yK+Nr$aVRtez@2-@b9=G$Iem_?XOy@}X$o3&^C$Uv@?gJOwS3Su?79-1u zv%JH&Q`77MuexbZp*B}?$&{snSs=U^b6j5GT##wC+P3_rQVSvc;coG zhsRBRfe7U{fIf2iQ7NyVJu%tf_a9g=li_BCuL!Uc`Zu$5rPyitsJ}sW)`wK^lV~Bs zuGc5FwR1gufyY^4G4$CG>)G9B-aEJ`z)o0b-sC5o|N1=`hx5jg(yB4mL-NVM_>RR` zZrf)rU7XSFD-4biHrqLWBtXG)C&V{NZ^MZ1 z)$e|~EpoyVZ0i9CHCDe)yBIs+j4i%(I6dKQ*AA9;x<_tGYofl)#%^LEK_dvxYyE2c zRt+}(81E%_X<>pj!j*B&29v>Tk4A}ShYA*sZ^vK?TDA7H=neBQ#-+POAH8u2!TDu2 zmYNQS=(s0|i1EAk3$V_e zWR@;!x@+KvMCvC^am(eiW!O7N1woKE+l|_@*NCogrgKVvw!-35c;Sl96@Z@WOYMIN zYyawZ>msp8(e~>Qlqt@QB0pk)_JDa$uU)Lsl8r1c9ZgvY`?cte637nWlE&G<7rS<2 z0a?JJdAkT$bJQchH}Dl)PBGYIrx!4I(klE|29Kxi0e&3l88r3rKJW2I zlN7P!<(*-~sg0<~pIWsgD$7q^FbnI#i;v{z->d@=^*aXAg|Gx;tivfk$wm&368I=u z!G%;`Gq!{aCx1&~IIgx3s>Y6LQ%gzmCn{@5Cn3R`n1(@`V;*rt^EF>cLmO}VnD!m# z`Y!+TK^UaBEr}myWoty54og#?CjCVN&2lA?No!FW_&9xQrwz(Au6jRl)twcmr&z@bi*ZJTGI}_l z=CUQuTL21SgI!8(d%70mmgB|g_*NF}P@7C~p<*`$YYW_nxZ?R1P2tb%;_hd<7>W$b z;<2fC$PX09pAU_MpGeSPRpbTd&YLx1X{t(|1Up7nk(J8&m!aqiMz||$ zO0NX7gWQG9MiDpmb1v9JD5{I`r8z8LYGom$hCD@ZG*wsGg;bimWvb+NSVWxgFu8GT zk|1+S@bu6}YTPgxcpsk`M`X{I0mn@QrBHo3?-4V9R8IPcT$)~9sAqZ3Ea$|-XLI1{ z;${TA+fFsPw)2?U15w#xO2W@Yl`WXrT>w#x{#%lUj<{_sAKB#*T3sX2=ppiII0$PC zOET7RsMhI7ls#mYi-GwN*>@@y;|LdYQxd~59mmIaX*s2OAmC1=9fc_y5T!fY_h#Jd z9#1XI1vO@s5{l@DhDh(-SfYP1-49c=AXt}KOGA;-{G=@v<}rDrT|hZ&WLC4O7Dk4{ zTgTiOh4FKu5w@Q}P~puQSzmJIWY`xSO^EPi$_5>@K297TW(FSNm}Z<8D+|G>#q_PN zDT!ELirj{|h&MO&7v$x9S_0<7IUs&7sxsD}43Z@5q*d#Ce94CtQt{hxU9eARf5+88 zgA;3aI#k9cStrz=)0Kh*=UQ++j3ajVN?^uwpAb1R47sZ^0{xsY51ws2-IO3Q8Bl7- zf>1?PPgS4h9Dxl(rCes{tU(dYAQ^)-h{_+V1XYL_Nh0$M5&x`EeDW!2Z9d5?)L1Ac`KPPZ>*%I=?yRoo`QycrYyYjecS%3 zc#}C%-pEoJbO<)bnL!!`{-iTPS~e-oyF`+$EqP4q0}BO~>nFirYuYhn5@9J9E=}x% zlo7d@Lu$-onilv;{9Q9nJ<0D5DU|91iDcTkNkhvB7Q0JrfmlWKi`f$HlW8MTB+7DO zDTQTYM2=Fj<>hhoLhu)oKUgBL9)Qm8d?dY!*%hb{&uFfaF-$#>e3%skykA_ocIKR0 z=1AscTv%wa$7Bln$L1WWfIBWd`Q3ODJSh7~M*9jKI80B5v}NlIRh<^Bos`5x6R=LW zs5svx5`1PVCjIc{iLt$(h7ZY+5rr<~;nqKuqC4nwddS;ZY=XmgyB`$n&@OVN4X$93 z2;aE6gwa!AV*0P7Yf!1SXVqEPBpAdR;~1U!wun7$dZNLRY<6_!aHd`5ABGv z_fk%Nrp3&~Ft&B_y?6+=OJB(-Q=(`>pyZThr5k9~m{o_6C^Kdc<=y^lzvwMu1jl=) zxYH0%W%<^r$$pS}j)4s{hq={&#vn+vU?alA4jO8ktP5mm+JuG&+J!M)y&Xubp zl%dmcxPuJ&Y$unjWAai8H1@WFOZZMcLDY6+3TRmTEg!^N21|{PPj8Bf;>vCa|5+Xz z)?Q8%F(zUX8CM?;see10&h>^v6pTTFef|BN^fL}GHeP0tv~nCh#`*=dJYF5*a#X=I z@GA{Fy*SYY`8u?l|GBhIj{k>wfU6`!Q!z9*KWKSaIS`A$QiKUPoj!R*gmEL7?LMxl z(?7H8bTVce5t;PTI~lNm;jE9>mK{Q~Nv%FZp7EBq_-dYFfA1W*SNF`zX= zlO@AGio$wY6e+`^5eUk1go#lc)EaLvh0{`H5%IILej?eq#LT>%@A&+yJqf+iGzuzE zCz+^-G0Y>%HXUwDhf-VyC2oxhQR8vps@90JmcDY^KYB}TR?^vYGlP#uy_%HzsfPDy zUI))?)A+Mu<>%nLMOoRByE5@330xCd=P))y-(aFQ6VRxR&vG^1gbCvGsh<>E#)~zu z--w)-$OZyU+cS16w~AGSVZ^zTCGi3-n3!;~VcP#_RJQ*JLp}SY<=`Xa8dTM0Er;;~ zW*0DlkQ}*;6`5p+O<=#N$mukN*R6p(J7Hng$`=-Knt*H%A~IB%@fV*o*Q8YviBjPw zC_-__R;OoET&Ft4fx~7#gwZlAw|mRsiUCtCQ%7p2@;$llz?V2vniE)DQXOz^N02$h z+=G&flN4}yqiX~LW)#x|g7+7?V*uW03)MKa`PgeV;^zdzY(B&;*Qfw*jWPi*Q-=<@ z)FtYHZ8|_16wY6njBfU8dba{ZV%_y~l^(H27Yl}Ux3ronEY5}IWv2)5*Rqp9o`!cdHAa(5CKq_4D?!zU@#2kg3drqM6 zENl`;u_kus8&&c*WHd>9IZchDDb^(DmAW*7>G!N{`3!9z{E?sPh3qKix*Zfw)pO>O zoY=_FFGh8xPM#{MTne?S2~|#H-C$e!X1|BNiLgW`zI#wrz~aSgt&}p z6u{}IRqzZJT1Th)0bc6(wYEUa-gE~UWYU9sliGS6FA3&wDLZ?EfyGoIH4>fTN{#d! zLe&eBgMgxwq)}I=fa=aDcR9{lWr{b5E!erZMNhzzu%_B6qXqPR>S#_FVIcPG>M@Kg zXh82Kyqwd8@lp%T2%$>Wozjgs3f5r-`gKXHQPLIMAW!--=9y-&u4qQ6OHBo$u!51r zg(YU(+)5|<^eJNoYuI=v8kP}p`%^LuQ=Zryx8GZR)XZ|k(H4Ii?rr@& za8^wIWN?y(J$mUT8yc9#g~*gTiDOlyNJBIwGzSK1@!AaUGV_1$D& z>gcT2@)9IA9H^8Z`aI?~lpkM-|CCVj%SsuLg@h;j?T8~21#wy;#Izgw^EeWKYFutZ z@3SAm$wZV(6J|jtq|iC4Z^h@0!*VTgf9vAh2pVMGU!^nLO+p{`ee*cxn_^`bY`_Bu zdJOtm{)Z;UwU7TO1#1Owji2ux+HPm`({dJ-*8=bW9$FxZOTkNGT;_Z)t2kYsPimTB zK)x@6x`C}sGwdQF&$8eTH`9u=3sfW3W1e$zzM-<`8*7F%AJb+n=0I~ACi3$~ z)OC7Hn4gJ%GKO`lO>SI59AYhEqwa>uowmoLs0z2ybySJ2>Zjk+)Z7zi9ti~qBC?E| znKC1WTqp^Xq1fmuNg9bq?P9Ftb=Fi~G}Yu{8yvg?=0uy?7zM6&az5SYXemr$qEja- zA&toE<<$wkai-in|5;J>fh7C+UGfbFRUR))wPb;8^0xU2-FSnfR0JxzPn%TGDqEP^ z($n@D5qFGJD(8gd7@E&}IsQb+`SUV@Ex{51%AC0?TLbKh|ka;Guv9GsA;J@ zvq%py(YXQU-4B~Y@qt=wq~D|J7=sZT@Zj3+W0a_gKE&KN!0m!*?tSp=Fcp+iK6ww% zM^p;MoqRCK!XF+z+%^|g6>qGmz?M<0 zLIQ4KugZrP&!w5c5n|dd%{7eGmMT|gB5Q7S!KJRZ%6W>Gu$s}A$i($33ita|6ATjn zl)jWD1XwIJe4FEyrRLQau_n(gFEI@#fXG`obP=bIrGNbVWNeo5Bs<5tNi-r;sqFAk zaiO~NQ=k0QGhHl+W1_-%5z~sXUO|+JHX#+Vw zz88*uxVJWxcO?5$%_h{c|0YUaTARM&};;rTv ze?8G8k_1hjB7i>(#?Go+@pE_VpOlX+$1(yu2I}oG*LUQib}qkpKG?`*|;%V|CqDNmB5w6+3<@irAo z%f9{nIT(xeY;F%i#!?r_>>~73H&V1WUMwQICP_G-vSC?^t$d&pp@eGsq&QTs7|Me{ z=xz+d)}nf(tULQu#1gZ{T6$tz$2cWAyThehaya|*2U!D*S9XaaM&}Mty)vwL@u_Mh ziV=v~aJ1!S!+fsX+`KX}YgW79sYKmTvOYnVAO8)ftr(@K;|VDT?Pp3@6*;y3WsJ2F zqutf@Lzd)O-F8^EE$U{YAPM_Hcn+!*MHEQA4V}{g&7D*og>j+_n75P}B&CuZu)3h9 zJ;I2v6X^{o$($=5OPhekwkf(dH0?B3;U)_wk9;UkUdFqPeo3 zYutcJggo$vvhCNGAz(}z_~xUMMufOZ*24D<`^TU~>{tS#;-PL+J_k$6Q!TC^JI5}8 z%t9M2Iz1zKTsCVZ#Zdi|ignA=SosEJs%exm=DILWKR{x100B3wR|z_W-gq3Y=bNhr z`tw>#&TAW&?=cZ>1uJF7TX_x7Ppti-FFe6D__v^)no%t0q`)d?iHKd!>;lfLjCI<{ zIcN=S>q4b_nGZ6P@x<2wSbIiiZ|ziZ}`(l^t|w%l7{!DLsCbkaE~?5pU=IKDYfxaRjV4ss%3g-NjCG_a4{OB+`L|;8>Cat_kGF?_J7E10 z&QFM~4Y8hCfN=XTnXi4_D5_k^`#G!OHUxb1#3L)W8n-RcO0x8BHejgX`xV2gP!9`v zNKLFlI>f#*f#5{=qc6ciXW4W%|Frx&p5@Eb5;lQBIARThG_rIiOP`rpxyf!^LG*>x z`JO0yMRJ7D4+E~nreywO`PjOCwd!Ria*h{CF7^C8F`9I9HDujl7UoO6mA;Ba&$YMO z9@nNzzlX_hRfe1KqcD`cZ;Vc3&TRQ*TXlARXUmm+)!mQttW%q)Bucj-|GsN- zwU%1){=KMz(5NuEyR7V`5d}!0B9&3fPHdj3|vKw$24t%YmN`Fhx{T9p7hB}wD5qSA9L3xw>_XMLRn@wk>2I1XF>=t$`g zIv|aJDDs%zi00%FK=z4;4*%FY^|6}TH@}Oi6A+pt)AnofhkZk1!iL)q24KbRuRS>8 zZ4sSn&s`&n7~exgv#~Yd565Gl!PHCMx9lxp$B*{*qIXt}!v?9H2E^Y-yE`b)PQUJ9 z*s$HNad^*2cJbbv=ZDkME8_qe8Zy9GUNdl21#2#KiThmm^D&)PkVolZgZ!{$Q`#mG zQlk(|daRm-iS-0odf@j;QZeFMQl!BJPwwElu;B{_*r=ZX+18crpJ0|S3>I5FK$q{(6AX?3^u?uk#L_ukZeonz zwC$m+T`O7(3PneIe0pYZj#?N7iFeB`O2+TG0&aW?oLmnl5mJgCviprsxCVqVBo(_W zEzQ1?d0DIy=>>BAjC>1L(4m&^LBRfmQR0_wsIgM@v-Xsn&@a_=hD(NgS1C! zf)>n4z^;S*={^$DrX@OW0c)N7{+U5_^h|aJP3n_#DN*+ z$W5QblH;6MYr6LHF4qF9_Cx85F?!=@-xhoFm=Q2|m=u;KE6OU8ZI5NPSUvjdlA)^( zhh`&M3DGy>UqViy%1HDde#!S$4z&N=y4L z*jYp3-m*^S9Vub3Ysy3!%QcXmk9Y#NqfR|rjBmYVAMs_^o`Lt2aBDu~sCM|y&N*w) zWD#0@qH!8P9zeT;-%d1Rl8H{*N!)f1^lIF}F>AMSrtd)*p&n6*=-z|DVNlhc8wn&F#y(YZ`J;f17-$Ib z3^!mVg!)?>ta8M#>wZySudxxq?8+pff+$z=Zye%(pMk1>XRt6JB3IW;R}!+&lEd5% zi`DL^!dy0fItIb=>ZsBTYZuE&$+#yB)6c14>`yy|Es|B%WUKsk;XubHVhneYUZ8;Q zNWhs#ZZTEtn($XP(j?C{)grPOT4I5sai&Dff*Z@v)V`bOaEB~&xDlhdqg4Pj7iBBH zi~u~5-M{hPR(9%aM^5`|f3EYS9s7h-{GA*7OYw+2T=*EwL{WFKCsiy=)*{8GF?j_U zKlv#rG?VB?L&kZHxAqyVAJ<0H($r9CBUN{lG-KzESiM_fLE7w$9iEnvv(1;N4Lko{ z)e;e(N!h*aEWcX0n%>WE(^7#){~GY^KjW*Np2)Ztx6s_U7YVy1+JatUTk|% z+?6wsA5IgnMFSzLa+szXa4p@xql(%^!=Hywl95$!?6yLcvn1oUQ1*2{>S~ zkIGX}q1M#ian2jg=Pe*8boy=nt1jLt|2yz8SRx9Lr(;>IJf8mAq0-P-!Q=LZ$uXP1v()o6Kd=12dv=oB zdkzc7!rUp%G(b)iVBI%Q4mEgyS28VwVbn@ds&djkp?Q-e&WaESbeR#x7MT3~DPn=! z)4e+hAq1KnD;}3%yUTI{yS%peXpS8KJpS=eL3M{lWSK7z=B4}XLk332K|6EQ#uu7^ zZDdVAcmc*EALL+|)~KS*lmw2ZhWG+8z(T?kHY$uF89n%;f=ga%w*{5=kDnTCe_?p!jqJ zOC$`u1=~gn22)u!6Or>CFumI>6-FKM4=Sf06iv4%By3bU$%@R!E&8CS8Q6BU3eH(U zA{c&vG>bnP8f|Sn2~bWG@56keq<6eGgastd7~%&YP-er}YOw9=geuxbE?Y%-m`y~k ziJl6Ci2=X4t7FcG%1}Q-$4v&R;p}=;GdV153Z1`C$XN5QQaV-FOZtR4}-N!tsy z?k~@uojeJ$iKTSXM53Y$2m79kfrYg+W$MTM;?d?Bz5KV#s^*!z@(yAU;16S7j1TS2 z+T=Uo9h5hPM&(nTeDjYs3lxxKKzjk!^Tr5Y>iM+zMF8DYHR8m!U*g1tE+bf3CH*}n z>_+!|$vLgFI+E0>>a9pJ6)BRY_q2m7pwh8l5V_|gVpI<*l|ynib@LkOt#LK>b5E)` zlAYl}U-oC{b`TObGH52I^!>GhKy&gRhMExcqGN1I(71zJgJEHwm<@7Ipxevw%) zf~;7tkbeA<%#m`sU|ZWv%@*8B!{sM6Z+bqQs1MI)?vp?g+{k30UX3)Jm29l9OTfw_ z<~-(%*YSUC=PCoZ%=4rjIy0ZD~|Kbj0H2_`2uW zUor8}B3DqqLHzC}-lFS%gpJ4?MU~{p#V$uD(rWX8Si?beeM>5-y(+D2y_8>RA%bA3 z+AP~3I;LiXXS2noGN<+Mu2sdaAeLWmxpe=;S$h{w5?yjF#mVr9v^o~xa5P0Vu~9_0u3~8pOj6z})xFVOdW67y_!Drkd;dOv%LunfPh?MF6_*Pe$%CIq_{g18qn@)W4N0S_ zQZas*EC0LcBFS2=-VAB#Lyq-g$B~W<@5G1@eHoPUUf+oAg4s5fF0NCpu->wX9BvmQ zw2BDg;r9`LrD(7P2W6#;SQS%7sHwT+F}o_zh{HCMQBE^BN8W;*yE&?1n38(+Bc^-G zp^wbw=ewN@!BVpzc0pe&Xc!FKQ_II_d}b`sE@3Q|c8z@*BWWi3Eq9ptqStp{=g*(C zbuDh9DNg6B4Zp*u8T^_9vgI<2m&@x5vIgOERH0=^#Yl)rZ1J;W0Q&czJDcXA*$%Ss zoG&QcJzC|?Pd(-Jcw671K9#N1JeuLJI%y;brSuHSSQb|un%1;qUz_NallDaGni+R- z4=qRxUSWbjym20Q1yB}!4MP&s_zm^Ys7w<%bcC=EQ5cfnL}3&!bohj|gL`H(;JHJG zLvR-BqLvTLH1&|U!W-xOB+ySg+g@t4k3dvKVqJ20B_c-!-eOc4d(1B!PAoTDvp~~5 zM4a1d`{h-T|7o_C)5&#VpnIX3ylguEl2B2_5K^3F_cEGb<^{JHp6EhqY7Qm}-p^k% zZ0vHn(>vmde$z#BA^nm)RMtV6(Q7NvDuqgkUFMBXV#{bqVPL^cv4oh9aDmh0RrNI< zJoN8>9bb9VOrEuRZ92!6&c4VP4ZY9_4>tF?)hHKiG?~AXQt$YLJM!K>JVF6ysW9%kEXZEWck~^sAg4JFx8_zo&%?S!Sc8G@~`5uA(DDdrY%&W(J4M zbf3XJ>Aj#rAsC}T*CB#@K-~h=P2HuFA4p@D<#=wentgPyF4QH6L2LBWrzJidk817W zVVP#pbBSY`hwjX9PQdB|4ZXCSyoStHJnTECRV#F-%V%=#xRg?gw``iG>I@WOP5e=^ z{e?2QSE;kOhwqUvKiVD&p1(YPF}o79f{oibZ|W=2WFU{Ps^B>1)ImH&1*3W$V#uXz zP#~h@C)KQhj?{1VLA0dKB|PDrHD_emtDl(nPP?`%0ww@8flZ!8gpclK30TXKV;HbNWy3`7SzIzdvb*9w8; z`GjJPFeyzk@5n!obqHp~{s~{&-vOQS(2<*~tibBkZ-7?nI8g?!s-vaom>+ED;q85N zDUv>%D*N$Y7Su$ZTqP9HAe7a78S?yPF<+w^UTX_gkt+5`PS`RQN=(=PToNIE zS!=;F$JYwMW19+BHet7Y`#s@@*(}|52yti4k51!~$DTwSDC4I0scdR+X?4HZvewYJ zw*#Q)us@h7HyofMs04-U1oo{!f7%)lC{^5QmNJTUuPv;G zbqikD)tNT^E);3;V^*VbuwgD9jgWMawB?SR13KZBQMe{!6+jQ~(@8^&UfVfTY>s zczwL{lVKrB@|vCx_L_tibX!4%PmpfJ^(<_c1Gl55Y-2&IE>Q1!Hju97S_22-t!^Nf z*y=%TXSEX8qgVNIHhKUm{9TI5o4GK{ijA`4mBi+|6O+3@@%=m{|HLo}X8fIVvuMp! z+kEeb>waJgQhR_7JI47oQ7`HbwUO(x{^a*OEo^Q5&b4~WlA5ItLccVWt?oepj>{yd z!z@Lfa2KYCBRB0m3_k6P1pnb?e)a}xtc7I;m5fJskvVjM>E!XKWxrN$zw^iTs7;$< z$N9z{gH0szh6J&^uVD`Xnynh^w(&l+=azd<$U@HpF%dL7Ks;6>*gCOEEb1h7<=Zdn zg#jD$)T&d&>Upi4%&b{xkwO)g9lCLBTa#WXfI{xi0e9$Y&apP3=|_$hfpaN)bWm@G zEesWQO!qg#TmruX8))&^V)k4lXdyL!$u&vAl}2itFH5`Dh51l4wZK=whg6%SPUg|q zEEULVLffm#OzthJg5;5)Isd0|wK}Qch4!Z1#Dk{RVgv~7{ODeFux#P6j=QOl>m#U) z?5D#=z_eKxT<~0oYje`an7r2L1o~XT7xzSogxYwBUt%*00KkOVNJ*(HNJ;(IgzwjB z-gyDZBJxA(_~B|=<iH)nGGs~wv8Kf>1n)dRK8KXtHu9Q=WC%+kp<=N* zNJLgf!NAC z-z5=Z?22N>amz^ZFs`P&R9GBhP1S&8nrA#d9*Llu_x&hYP>vyIM~&&OzBoA(?I_j@ zQlFJwhGoTinJMf+(1+7R6krotOYW!V0Q=Qby#7DvhBih)JqS|)DH|uY$uy?kZ`#|> zY%eLCJK(|!-N%#2#?_P<(xG=;j}@>WUo`ZF4!7gHookq}*}4oTXsDEFv-0vW#V?A3 z{M9~@{D)^iRhVmc8N*BK>%@Fdo7V~W`YOtT=1vZ5U<)TR2%EQq^XmkC06XMW}yu^-%+DEJUdFcvL_t&QcI-8+l(>h?cLawz;pJxqt<=m?)~Sx8N&) z1H>H+^med!bQAOzq5d0J@b&mFF*`NzZxwet5o&!Eb)b}!D+I{R#?1y|mGQRm@$i$E>loNIA#P3{uI3OKPl%&C&3{73DX6Ib z3*j%9tZW>d|90w?y#Lmjh55hqoIPCa|JJcEXNTBB99}`)UhU)fZ~E>wmj5Q}zuERz z%ir$&ry;N1{R{uUY5$k+e=EOgsi+7_JDGd@)v1EC2=!m~3R*as+gJ$x;}8OdfOuY` zzzOEzW#zU6S+aupcr92hI3Qq<1t*Bt5)A$iCwQgZa5x!MvOntPm~^h&hj$1^9LMH`HHo5R_0?5TWK|1N~c~ZVz_1baHig zO?4Yb3nwqPe>Z8{I6$=A!GF=l!NQ1%rQ{F*v84qz(?yR)O!-wl5SM)1|0S8Bn3W$G*P-||;)1f^UdV0R~1Z6_yt z5$eCJ1^xy3uV$6kg0cX+gQdalkk{TooIHXc4naM4nn^S;;)r`xGmz5U;<}nBH zy`~D+KS=r)x|@@wyBF9MB4PE)<11IM3HmozK!$(Dknz7;<7Ex`D?qQ5v4S{Q|4kV` zHTyrEW&dl$_%CmT+5caB2>-3{A4AORb^nmP4qdM!A^X3E!hiDhYU}^a&p+evf3pi9 z@P9k`AMyLYbp0<~|04$eN6P=3UH?nh|A>MAk@Ej$*Z*&Hq5k_}3gY#kvNS4Uc^+ z&(rT6D!HfxsN>IX+8KFmlv~VB)B07)#O>ayLn{@Sc;b*j03ZwCNwkxnB>m?izNbNT z>f3Qwdg7u7j%yp_g!?wNg7QnJ(3^-~j5*nAsn@|61Phd8^Jmt*_WpGdqkOlVhp{n$ z#rymTB*4ewPd_J_6FW1@o;d+|!i|pw`NEYlqEJGL^aJM<9Wgbt(Vt~METv9ut0uyNLytLg^lm=Qe63-(Jy6gLoMm+Q4Ke2TQH{MWSym6g8V!HcRd8N*DlS z0Z=pu--OsRU2Ct85ROEktBaw})m*sr4TDtX*Q}y?fZnIDFp>9x^X>fszSXRBTb2g4eRP)7m3);W#iy% zy|}-}s%~S7moC|QRJD-HhxN8#bKscwn5$I-CkF!j6fu0htSo4dEU1&*{@J?M;}guOhnc-%1)d zQXUw;(TwTucvnVh7~Xnt0!)D9a5icHtJp1O3d?J$E=3MOybV_(Hymdi<_^tUqAhTR}ZK80%KrW^;{o!lr{Fj zP-Py*yM<7OZ&XH);uVA?jbIzf0!qtE*C5gG#gwvfs^~KyReRrK1pLCkpuODpC{|opnP3)Enk6qFjQj6DXoaM{szJt24~c7H{4bEu_~H7IoOX zcqrozC}!VcIfmIK5toe#F7Da9x;mPyL<=caXoIu|wa+ZEre#kUVih4bX%jOon}NhL z;=zE;DZilGv=z62Vy>+^(7X=IH506l>O{dMp=M3JU9&Q*?#JR0v-`S7``-rc+DE?7 zTSgoT8@X4zT(v@b(r_cbe8@GFmfplM!YaZ}Yt+ZZH|-r0gH1?WXo3~NK_?r#0sQv( zbOQiX8DrzYe7jRC4+(~Ar6`Jrn~+B&3q*8|d&2whTFH-;kz~s^P!>FnJ6-_H@8<98 zvws?q%AQ2~Z3M$_KhgA2%s2#f_b^+UXEfX1r=71M3QQt``)fC#wAp2yOvXl@d^4n)dao zb@uey`%vK|jQ{{ZtY|+31+;+%$9IYCvYD(_UfGk>7&FoASn+;*1Pnu{Kx}x71s*cP zOpQLB`106tgd(5im~=k&_eMAQ58i?+*;uPoiiPP|3$0J`c_OvJflULq!whee@lez5 zgpr;^?{a58QhV~Ee`gPkp#05ml=SDfRaUV|ZDGX_GG$1Lzey1~Gw>}+S&X*)kZOS* zjHRor5Q53*J#Wi#*=!=y$J7FRuMJEi3(8(#f=1rDlmDYQKM*Z{ zN-e{ewXipc$=%T4$Ja0)ZLnH(GX60*dC5t~Wp9w<>3Y0pAPeOVuh6*fbuCbR=zuR0 ztw6&_&Xs4&c%SrSzEA%$;#iN_^#f0>H{=n~87Ldx+`+Sl@%%&|6PQ=9Vot@!eE{ zuKqmu`x`&nzXZ-NrKN3)h}(9 zB1wv@k7!Z$RA?bozfj5Z9qsS?yRP@@y58r%X0Dm}p8Nis&$;iK&0q$D2!137M1TS&0|pax z7kX|zuAFrCs;09;%`wNe%ok(`N8+rd#D(CEyDOm^S&<0=9 z-RR}rC-c44&3C@k%8LuO3^zHS*8D)Oo+i0jqI{d3wvO+=+K06pLNubH+w^QyPtA^P ziS74Gpj>RqLinbOs6KFKFm0{En@Q0hVX&5l)UyU174Je+wdOFuHyG+ zyzYnW{U|%uZc~!~00``oj!w~|$4Fn7a*wbE1S>8LUQdv`>R}BesCZ;ojpoymwH=hj z46yI5t6XfTdw1dwkFM}g)FD{cf&*om$y1dHiMJH>R^vFw47^hsO4{W2ggL&UG=#fi{qg+&1h_5qDr z=}W|yZDdH}&l(+O_M(N{O}06?&z61IqFzlN0&~ zT=Q}YIc|BjU-JZBi~^?@*0rav*`27Ppvh>{E%vTpG;8zPwv>p~>#S*7WTzx|2 zfF~B8m!wPkC|i!_1-%NoJa|T0C*@H=+>xdd52>yP76GY^5})z*bp?A7>#E12FUba~ zyvj+cejgR^@A21nc*(n5iKV3tVO`jBeImq8v%5#=&rmXF6T5DBo8HArdL>$p)?Oa= zA_PlYlG6Uq>^_0-T9@nTnr3w9o#cB`swOwY!p$|)KcFinE`kJOnCF`-WC^^G+ zRASDJG5-&?wmNTpe=@ZDmv%3(opa0Biy>T7u zK&@8<=eYOC%X6qrA??)1af>?vum9*$ORUTrr; zX_OzcQdwt)S=yj4Sg3=xw_5An-I;mMP9ri~;*D;IxTkGnC3~L)@)3Uv{m45{M7Gra z!JAt%W4%3^Wmkou>_ud@XnOaG#GGP_o~epJJn#K<>ph3kwxa-b58%rjHJQkZQv?^lOuaLzx1B#4 zHuLc~UNytSy0?VBqJ3j&)7)cZqeJ*xnCAPQ*_$Uy+Y#>mu#=B5BIQZ2E-(9 z?=veDxHAIQYX~+U6Y~)>uv!d5KB$@Qy*&hOex&N5nUK+s8%~-|k@0OPkk?(7n88WR zi7SS&)wVA(1QEkqowPaj39fe&6-<4%@8KSw4R%h>oU<>fF7?^)n%7ep$A3mJgfHfe zCdd1p$|j|W8S)Hrl5j6hpQN0~jgCDwhH%!Fx{_ItDx!S&(vy@9DzNWFi*cgE1l%-z zjSYVFVC}f>ex{N{oyLVk$@otr)psO54isjU8spCSIcnzkWv}zJy;a^te{8(EurL-?CSER{L2!a#^_+1K0jO(oB)-5%7mcky70VX%*KY^re?k`ap)9UD~8A~)f@ zRWl~4hg$bqZnU(OYqkvU@My{W0EoWZr%^Wi;!*o^&7K=CuACw0v~h z{cYCSNm7po#qsh5`1B{R?`VG_Z`H>v;LJ#p+|+wow91U_Wv*H4)ZZ)BJ~cFTYQ62Q zk@|P0!|+^_xQ88UkR&!LSmZv$Jx1u(#U%5 zYszW4>vG5D#H>YAm-3H3GK9evBrquyCmRao+YtpinB?rtAY0#ZQrzw6T8M;;tyc_f zbjlq)VX@KIf?HCWO z-y7ZW>n1_g+D8^o?5zteTA?&4J~>)c$m`dXy_8(A^q7LrS-p z&uD2?*ppPxUD85s)k(Bnsh+0wm*tFEKe+p?l7D%pU+(rd%HsRFZL?mL-Oi|!cd@1< zq=^4@y4EZ+JXKL)ImuBl-LNv|h&QhCFTZD=rmJ+;G%WcnQR5$!#VG14@Dq6+b7?Gn z5#pkB+0o0hJA-@16mHBd_GbFTRExFlJkUQHn4#_`SW!{&I`GYEPUXUcWBjK5E1Mkc zv<}5i;Xf3KV4|cKpReS-%6a;3L1Ra87CSbc;#ab%>(%P<)z5Q#YRI`Wv#`?%+-n6| zpUa`6WH=K#GJ4u?BGK3(dH|hG1@#0W9Oy_1gBhC$H~=jOvFA|00H$>m7j%tsaHB;9(TwOwlMPbF0un?J0`dWbAS9T@BMHdJd0rCqEHtB$ zhY~KcS2CuTo6IfBj{mJ76N8C4!J=JVa%m7NG|4Bp$Nb!Zk9OTisOb(yPW+8-}0F@oaCnJ%N zAMq`|5RSe5cX}4@s|t`FXaT@MWA!lTkP!6GJ$QVJaERnyf-=LVg;(Jmm59mb`B z7U3X^ul_TIm5sgAcLrff{>%{0d{U5jzYIpFeaCUaxWV%nIt>j5gCP(p4~h@_3!cwp z{1EGx*o2<>bbby58tyy)FX(T%&x0Y9y*n z`G8P1tO4G@08ca`67WQV0p?3^^Nb!Kmj{)ckQIy3!|Ts?r_)H55GMeY4l@Ms2hkjs z|GYyuF(fD*NLoNxsSxwL9m3)2|M*(4-|WnPCmwok0bsqkk zLm&`;2Kg<0|H$=6uHRDNx4?g@>yKQ&rND22|5Vrin_N;qE>j>2IsrvMSEV=2YjMyu zOPp$FWe%GYzK>U*ItW=7ajduSU@&O~;b#HtNX|0ID8aX}w~%C8;NoJ}M^+?ntt%K6YX8Xvk)IXL^6k z<&%=oEgXh`!9-!PFxXNUOax|H6Y)A)l`R7M2N(3O!vDlyG{t`W_<3|rT;Z{#{CxkP cKz{M0Jy_YhX_&G~C_ + + + + + + + + + + + + + + + diff --git a/addons/ez_tiles/examples/64x64/plains_1.svg.import b/addons/ez_tiles/examples/64x64/plains_1.svg.import new file mode 100644 index 0000000..2be37c3 --- /dev/null +++ b/addons/ez_tiles/examples/64x64/plains_1.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://82nd1ajjv633" +path="res://.godot/imported/plains_1.svg-5e57b110d812f8b73a3f571ca1f55b4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/64x64/plains_1.svg" +dest_files=["res://.godot/imported/plains_1.svg-5e57b110d812f8b73a3f571ca1f55b4c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/examples/64x64/plains_2.svg b/addons/ez_tiles/examples/64x64/plains_2.svg new file mode 100644 index 0000000..3819e20 --- /dev/null +++ b/addons/ez_tiles/examples/64x64/plains_2.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/ez_tiles/examples/64x64/plains_2.svg.import b/addons/ez_tiles/examples/64x64/plains_2.svg.import new file mode 100644 index 0000000..ee885c6 --- /dev/null +++ b/addons/ez_tiles/examples/64x64/plains_2.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbr3esj1mxpl0" +path="res://.godot/imported/plains_2.svg-b406f7a8bb22df8238488c2c4608aec9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/64x64/plains_2.svg" +dest_files=["res://.godot/imported/plains_2.svg-b406f7a8bb22df8238488c2c4608aec9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/examples/64x64/spikes.svg b/addons/ez_tiles/examples/64x64/spikes.svg new file mode 100644 index 0000000..2d3444c --- /dev/null +++ b/addons/ez_tiles/examples/64x64/spikes.svg @@ -0,0 +1,523 @@ + + diff --git a/addons/ez_tiles/examples/64x64/spikes.svg.import b/addons/ez_tiles/examples/64x64/spikes.svg.import new file mode 100644 index 0000000..5ed9f27 --- /dev/null +++ b/addons/ez_tiles/examples/64x64/spikes.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxc264vu06a4x" +path="res://.godot/imported/spikes.svg-b0aa9d0afa9f87737835a3d0db5b9908.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/examples/64x64/spikes.svg" +dest_files=["res://.godot/imported/spikes.svg-b0aa9d0afa9f87737835a3d0db5b9908.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/exclamation-warning-triangle-icon.svg b/addons/ez_tiles/exclamation-warning-triangle-icon.svg new file mode 100644 index 0000000..7556063 --- /dev/null +++ b/addons/ez_tiles/exclamation-warning-triangle-icon.svg @@ -0,0 +1,51 @@ + + + + + + + diff --git a/addons/ez_tiles/exclamation-warning-triangle-icon.svg.import b/addons/ez_tiles/exclamation-warning-triangle-icon.svg.import new file mode 100644 index 0000000..c5a5721 --- /dev/null +++ b/addons/ez_tiles/exclamation-warning-triangle-icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfrwoh80yb3se" +path="res://.godot/imported/exclamation-warning-triangle-icon.svg-5a6d8876361b1164bbf2243119cc81cb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/exclamation-warning-triangle-icon.svg" +dest_files=["res://.godot/imported/exclamation-warning-triangle-icon.svg-5a6d8876361b1164bbf2243119cc81cb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles.gd b/addons/ez_tiles/ez_tiles.gd new file mode 100644 index 0000000..5d6dece --- /dev/null +++ b/addons/ez_tiles/ez_tiles.gd @@ -0,0 +1,212 @@ +@tool +extends EditorPlugin +class_name EZTiles + +# importer +var dock : EZTilesDock +var alert_dialog : AcceptDialog + +# draw +var selection : EditorSelection +var draw_dock : EZTilesDrawDock +var select_2D_viewport_button : Button +var select_mode_button : Button +var prev_tile_pos := Vector2i.ZERO +var lmb_is_down_outside_2d_viewport := false +var hint_polygon : Polygon2D +var prev_pos := Vector2i.ZERO + +func _enter_tree() -> void: + # importer + dock = preload("res://addons/ez_tiles/ez_tiles_dock.tscn").instantiate() + add_control_to_bottom_panel(dock as Control, "EZ Tiles") + dock.request_tile_map_layer.connect(create_tile_map_layer_for_tile_set) + alert_dialog = AcceptDialog.new() + EditorInterface.get_base_control().add_child(alert_dialog) + # draw + draw_dock = preload("res://addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.tscn").instantiate() + selection = EditorInterface.get_selection() + selection.selection_changed.connect(handle_selected_node) + add_control_to_bottom_panel(draw_dock as Control, "EZ Tiles Draw") + handle_selected_node() + select_2D_viewport_button = EditorInterface.get_base_control().find_child("2D", true, false) + draw_dock.undo_redo = get_undo_redo() + +# IMPORTER +func create_tile_map_layer_for_tile_set(tile_set : TileSet) -> void: + var root := EditorInterface.get_edited_scene_root() + if is_instance_valid(root) and root is Node2D: + var tile_map_layer := TileMapLayer.new() + tile_map_layer.tile_set = tile_set + tile_map_layer.name = "EZTilesTileMapLayer" + root.add_child(tile_map_layer, true) + tile_map_layer.set_owner(root) + tile_map_layer.set_meta("_is_ez_tiles_generated", true) + EditorInterface.edit_node(tile_map_layer) + else: + alert_dialog.title = "Warning!" + alert_dialog.dialog_text = """Cannot create TileMapLayer for this scene. + Please try again when editing a Node2D scene.""" + alert_dialog.popup_centered() + +# DRAW +func _handles(object: Object) -> bool: + return is_instance_valid(object) and object is TileMapLayer + + +func _dump_interface(n : Node, max_d : int = 2, d : int = 0) -> void: + if n.name.contains("Dialog") or n.name.contains("Popup"): + return + print(n.name.lpad(d + n.name.length(), "-") + " (%d)" % [n.get_child_count()]) + for c in n.get_children(): + if d < max_d: + _dump_interface(c, max_d, d + 1) + + +func _get_select_mode_button() -> Button: + if is_instance_valid(select_mode_button): + return select_mode_button + else: + select_mode_button = ( + EditorInterface.get_editor_viewport_2d().find_parent("*CanvasItemEditor*") + .find_child("*Button*", true, false) + ) + return select_mode_button + + +func _tile_pos_from_mouse_pos() -> Vector2i: + if not is_instance_valid(draw_dock.under_edit): + return Vector2i.ZERO + var mouse_pos := EditorInterface.get_editor_viewport_2d().get_mouse_position() + var cursor_pos_on_tilemaplayer := (mouse_pos - draw_dock.under_edit.global_position).rotated(-draw_dock.under_edit.global_rotation) + + var tile_pos := Vector2i(cursor_pos_on_tilemaplayer / (Vector2(draw_dock.under_edit.tile_set.tile_size) * draw_dock.under_edit.global_scale)) + if cursor_pos_on_tilemaplayer.x < 0: + tile_pos.x -= 1 + if cursor_pos_on_tilemaplayer.y < 0: + tile_pos.y -= 1 + return tile_pos + + +func _tile_pos_to_overlay_pos(tile_pos : Vector2i) -> Vector2: + if not(draw_dock.visible and is_instance_valid(draw_dock.under_edit) and _get_select_mode_button().button_pressed): + return Vector2i.ZERO + return ( + ( + ( + (Vector2(tile_pos) * (Vector2(draw_dock.under_edit.tile_set.tile_size) * draw_dock.under_edit.global_scale)).rotated(draw_dock.under_edit.global_rotation) + draw_dock.under_edit.global_position + ) * EditorInterface.get_editor_viewport_2d().get_final_transform().get_scale() + ) + EditorInterface.get_editor_viewport_2d().get_final_transform().get_origin() + ) + + +func _forward_canvas_draw_over_viewport(overlay): + if lmb_is_down_outside_2d_viewport: + return + + var viewport_2d := EditorInterface.get_editor_viewport_2d() + var g_mouse_pos = ( + EditorInterface.get_base_control().get_global_mouse_position() + - viewport_2d.get_parent().global_position + ) + if not viewport_2d.get_visible_rect().has_point(g_mouse_pos): + return + + var fill := Color(1.0, 0.0, 0.0, 0.2) if draw_dock.rmb_is_down or draw_dock.using_eraser else Color(Color.WHITE, 0.2) + var stroke := Color.RED if draw_dock.rmb_is_down or draw_dock.using_eraser else Color.WHITE + var draw_rect := draw_dock.get_draw_rect(_tile_pos_from_mouse_pos()) + var tl_corner := _tile_pos_to_overlay_pos(draw_rect.position) + var tr_corner := _tile_pos_to_overlay_pos(draw_rect.position + draw_rect.size * Vector2i.RIGHT) + var br_corner := _tile_pos_to_overlay_pos(draw_rect.position + draw_rect.size) + var bl_corner := _tile_pos_to_overlay_pos(draw_rect.position + draw_rect.size * Vector2i.DOWN) + overlay.draw_polyline(PackedVector2Array([tl_corner, tr_corner, br_corner, bl_corner, tl_corner]), stroke, 0.5, true) + + if draw_dock.rmb_is_down or draw_dock.using_eraser: + overlay.draw_polygon(PackedVector2Array([tl_corner, tr_corner, br_corner, bl_corner, tl_corner]), [fill]) + if draw_dock.drag_mode == EZTilesDrawDock.DragMode.BRUSH: + var draw_area := draw_dock.get_draw_area(_tile_pos_from_mouse_pos()) + for tile in draw_area: + var tl := _tile_pos_to_overlay_pos(tile) + var tr := _tile_pos_to_overlay_pos(tile + Vector2i.RIGHT) + var br := _tile_pos_to_overlay_pos(tile + Vector2i.ONE) + var bl := _tile_pos_to_overlay_pos(tile + Vector2i.DOWN) + overlay.draw_polygon(PackedVector2Array([tl, tr, br, bl]), [fill]) + else: + var draw_area := draw_dock.get_draw_area(_tile_pos_from_mouse_pos()) + for tile in draw_area: + var tl := _tile_pos_to_overlay_pos(tile) + var tr := _tile_pos_to_overlay_pos(tile + Vector2i.RIGHT) + var br := _tile_pos_to_overlay_pos(tile + Vector2i.ONE) + var bl := _tile_pos_to_overlay_pos(tile + Vector2i.DOWN) + overlay.draw_polygon(PackedVector2Array([tl, tr, br, bl]), [fill]) + + + +func _input(_event) -> void: + update_overlays() + + if is_instance_valid(draw_dock.under_edit) and select_2D_viewport_button.button_pressed and _get_select_mode_button().button_pressed and draw_dock.visible: + var viewport_2d := EditorInterface.get_editor_viewport_2d() + var g_mouse_pos = ( + EditorInterface.get_base_control().get_global_mouse_position() + - viewport_2d.get_parent().global_position + ) + + if ((viewport_2d.get_visible_rect().has_point(g_mouse_pos) + and not lmb_is_down_outside_2d_viewport + and not (g_mouse_pos.x <= 164 and g_mouse_pos.y <= 40)) + or draw_dock.lmb_is_down or draw_dock.rmb_is_down): + + var tile_pos := _tile_pos_from_mouse_pos() + if (Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) + and not draw_dock.lmb_is_down + and not lmb_is_down_outside_2d_viewport): + draw_dock.handle_mouse_down(MOUSE_BUTTON_LEFT, tile_pos) + + if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT) and not draw_dock.rmb_is_down: + draw_dock.handle_mouse_down(MOUSE_BUTTON_RIGHT, tile_pos) + + if draw_dock.lmb_is_down and not Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): + draw_dock.handle_mouse_up(MOUSE_BUTTON_LEFT, tile_pos) + + if draw_dock.rmb_is_down and not Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): + draw_dock.handle_mouse_up(MOUSE_BUTTON_RIGHT, tile_pos) + + if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and draw_dock.lmb_is_down: + viewport_2d.set_input_as_handled() + elif Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): + viewport_2d.set_input_as_handled() + + if Input.is_key_pressed(KEY_CTRL): + draw_dock._place_back_remembered_cells() + draw_dock.suppress_preview = true + else: + draw_dock.suppress_preview = false + + if not draw_dock.viewport_has_mouse: + draw_dock.handle_mouse_entered() + if prev_pos != tile_pos: + draw_dock.handle_mouse_move(tile_pos) + prev_pos = tile_pos + else: + lmb_is_down_outside_2d_viewport = Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) + if draw_dock.viewport_has_mouse: + draw_dock.handle_mouse_out() + + +func handle_selected_node(): + var selected_node : Node = selection.get_selected_nodes().pop_back() + if is_instance_valid(selected_node) and selected_node is TileMapLayer and is_instance_valid(selected_node.tile_set): + draw_dock.activate(selected_node) + if selected_node.has_meta("_is_ez_tiles_generated"): + await get_tree().create_timer(0.5).timeout + make_bottom_panel_item_visible(draw_dock) + else: + draw_dock.deactivate() + + +func _exit_tree() -> void: + remove_control_from_bottom_panel(dock) + dock.free() + remove_control_from_bottom_panel(draw_dock) + draw_dock.free() diff --git a/addons/ez_tiles/ez_tiles.gd.uid b/addons/ez_tiles/ez_tiles.gd.uid new file mode 100644 index 0000000..6eb13e3 --- /dev/null +++ b/addons/ez_tiles/ez_tiles.gd.uid @@ -0,0 +1 @@ +uid://brinsj5s31qgh diff --git a/addons/ez_tiles/ez_tiles_dock.gd b/addons/ez_tiles/ez_tiles_dock.gd new file mode 100644 index 0000000..7644ba2 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_dock.gd @@ -0,0 +1,408 @@ +@tool +class_name EZTilesDock + +extends HBoxContainer + +signal request_tile_map_layer(tile_set : TileSet) + +enum CollisionType { + RECT, + TOP_SLOPES, + NONE, + ALL_SLOPES, + BOTTOM_SLOPES, + ROUNDED, + INVERSE_ROUNDED, + TREE, + CACTUS, + NAVIGABLE +} + +var collision_previews := {} +var num_regex := RegEx.new() +var images_container : ImagesContainer +var x_size_input : EditorSpinSlider +var y_size_input : EditorSpinSlider +var generate_template_button : Button +var generate_tileset_button : Button +var generate_tilemaplayer_button : Button +var overlay_texture_rect : TextureRect +var preview_texture_rect : TextureRect +var guide_texture_rect : TextureRect +var reset_zoom_button : Button +var resource_map : Dictionary = {} +var collision_type_map : Dictionary = {} +var zoom := 1.0 +var save_template_file_dialog : EditorFileDialog +var save_tile_set_file_dialog : EditorFileDialog +var hint_color := Color(0, 0, 0, 0.702) +var collision_layer_color := Color(1.0, 0.0, 0.0, 0.4) + +func _enter_tree() -> void: + num_regex.compile("^\\d+\\.?\\d*$") + images_container = find_child("ImagesContainer") + x_size_input = EditorSpinSlider.new() + y_size_input = EditorSpinSlider.new() + x_size_input.value = 16 + y_size_input.value = 16 + x_size_input.min_value = 2 + x_size_input.max_value = 2048 + y_size_input.min_value = 2 + y_size_input.max_value = 2048 + find_child("XSizeInputContainer").add_child(x_size_input) + find_child("YSizeInputContainer").add_child(y_size_input) + generate_template_button = find_child("GenerateTemplateButton") + generate_tileset_button = find_child("GenerateTileSetButton") + generate_tilemaplayer_button = find_child("GenerateTileMapLayerButton") + overlay_texture_rect = find_child("OverlayTextureRect") + preview_texture_rect = find_child("PreviewTextureRect") + guide_texture_rect = find_child("GuideTextureRect") + reset_zoom_button = find_child("ResetZoomButton") + preview_texture_rect.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + overlay_texture_rect.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + save_template_file_dialog = EditorFileDialog.new() + save_template_file_dialog.add_filter("*.png", "PNG image") + save_template_file_dialog.file_mode = EditorFileDialog.FILE_MODE_SAVE_FILE + save_template_file_dialog.file_selected.connect(_on_save_template_file_selected) + EditorInterface.get_base_control().add_child(save_template_file_dialog) + save_tile_set_file_dialog = EditorFileDialog.new() + save_tile_set_file_dialog.add_filter("*.tres,*.res", "Resource file") + save_tile_set_file_dialog.file_mode = EditorFileDialog.FILE_MODE_SAVE_FILE + save_tile_set_file_dialog.file_selected.connect(_on_save_tile_set_file_selected) + EditorInterface.get_base_control().add_child(save_tile_set_file_dialog) + collision_previews[CollisionType.RECT] = preview_texture_rect.find_child("Rectangles") + collision_previews[CollisionType.ALL_SLOPES] = preview_texture_rect.find_child("Sloped (All Corners)") + collision_previews[CollisionType.BOTTOM_SLOPES] = preview_texture_rect.find_child("Sloped (Bottom Corners)") + collision_previews[CollisionType.TOP_SLOPES] = preview_texture_rect.find_child("Sloped (Top Corners)") + collision_previews[CollisionType.ROUNDED] = preview_texture_rect.find_child("Rounded Corners") + collision_previews[CollisionType.INVERSE_ROUNDED] = preview_texture_rect.find_child("Rounded Corners (Inverse)") + collision_previews[CollisionType.TREE] = preview_texture_rect.find_child("Tree") + collision_previews[CollisionType.CACTUS] = preview_texture_rect.find_child("Cactus") + x_size_input.value_changed.connect(func(n): handle_tilesize_update()) + y_size_input.value_changed.connect(func(n): handle_tilesize_update()) + handle_tilesize_update() + + +func _on_file_menu_load_files(files : PackedStringArray) -> void: + load_files(files) + + +func _on_images_container_drop_files(files: PackedStringArray) -> void: + load_files(files) + + +func _on_preview_panel_container_drop_files(files: PackedStringArray) -> void: + load_files(files) + + +func validate_size(actual : Vector2) -> String: + var tile_size = Vector2i( + x_size_input.value, + y_size_input.value + ) + if not tile_size: + return "" + + var expected = Vector2i( + x_size_input.value * 6, + y_size_input.value * 4 + ) + if expected.x != actual.x or expected.y != actual.y: + return """ + Invalid size detected for %dx%d tiles! + Expected size = %dx%d pixels + Actual size = %dx%d pixels + """ % [tile_size.x, tile_size.y, expected.x, expected.y, actual.x, actual.y] + return "" + + +func load_files(files : PackedStringArray): + for file in files: + var im := ResourceLoader.load(file, "Image") + if im is CompressedTexture2D and not resource_map.has(im.get_rid()): + var detected_size = im.get_size() + var validation := "" + if not resource_map.is_empty(): + validation = validate_size(detected_size) + images_container.add_file(im, validation) + if resource_map.is_empty(): + var tile_size := Vector2(float(detected_size.x) / 6.0, float(detected_size.y) / 4.0) + x_size_input.value = tile_size.x + y_size_input.value = tile_size.y + x_size_input.read_only = true + y_size_input.read_only = true + generate_tileset_button.disabled = false + generate_tilemaplayer_button.disabled = false + handle_tilesize_update() + + resource_map[im.get_rid()] = im + collision_type_map[im.get_rid()] = CollisionType.NONE + preview_texture_rect.texture = im + _show_collision_preview(im.get_rid()) + + +func _show_collision_preview(resource_id : RID) -> void: + for c : Node in collision_previews.values(): + c.hide() + if collision_type_map.has(resource_id) and collision_previews.has(collision_type_map[resource_id]): + collision_previews[collision_type_map[resource_id]].show() + + +func _on_images_container_terrain_list_collision_type_selected( + resource_id: RID, type_id: EZTilesDock.CollisionType) -> void: + collision_type_map[resource_id] = type_id + _on_images_container_terrain_list_entry_selected(resource_id) + + +func _on_images_container_terrain_list_entry_removed(removed_resource_id : RID) -> void: + resource_map.erase(removed_resource_id) + collision_type_map.erase(removed_resource_id) + if preview_texture_rect.texture and preview_texture_rect.texture.get_rid() == removed_resource_id: + preview_texture_rect.texture = null + + if resource_map.size() == 0: + x_size_input.value = 16 + y_size_input.value = 16 + x_size_input.read_only = false + y_size_input.read_only = false + generate_tileset_button.disabled = true + generate_tilemaplayer_button.disabled = true + handle_tilesize_update() + for c : Node2D in collision_previews.values(): + c.hide() + + +func _redraw_overlay_texture() -> void: + var tile_size := Vector2i(x_size_input.value, y_size_input.value) + var new_template_overlay := Image.create_empty(tile_size.x * 6, tile_size.y * 4, false, Image.FORMAT_RGBA8) + for y in range(new_template_overlay.get_height()): + for x in range(new_template_overlay.get_width()): + if ( + (x >= tile_size.x * 2 and y < tile_size.y * 3 and x < tile_size.x * 3) or + (x < tile_size.x and y >= tile_size.y and y < tile_size.y * 3) or + (x >= tile_size.x * 3 and y >= tile_size.y * 3) + ): + new_template_overlay.set_pixel(x, y, hint_color) + overlay_texture_rect.texture = ImageTexture.create_from_image(new_template_overlay) + guide_texture_rect.modulate = hint_color + for c : Node2D in collision_previews.values(): + c.modulate = collision_layer_color + +func handle_tilesize_update() -> void: + generate_template_button.disabled = false + _redraw_overlay_texture() + resize_texture_rects(1) + + +func resize_texture_rects(new_zoom : float): + zoom = new_zoom + var new_size := Vector2( + float(x_size_input.value) * 6 * zoom, + float(y_size_input.value) * 4 * zoom + ) + preview_texture_rect.custom_minimum_size = new_size + overlay_texture_rect.custom_minimum_size = new_size + guide_texture_rect.custom_minimum_size = new_size + reset_zoom_button.text = str(zoom * 100) + "%" + for c : Node2D in collision_previews.values(): + c.scale = Vector2(float(x_size_input.value), float(y_size_input.value)) * zoom + + +func _on_images_container_terrain_list_entry_selected(resource_id: RID) -> void: + preview_texture_rect.texture = resource_map[resource_id] + _show_collision_preview(resource_id) + + +func _on_preview_panel_container_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_WHEEL_UP and event.pressed: + resize_texture_rects(zoom + 0.25) + if event.button_index == MOUSE_BUTTON_WHEEL_DOWN and event.pressed: + resize_texture_rects(zoom - 0.25) + + +func _on_zoom_out_button_pressed() -> void: + resize_texture_rects(zoom - 0.25) + + +func _on_reset_zoom_button_pressed() -> void: + resize_texture_rects(1) + + +func _on_zoom_in_button_pressed() -> void: + resize_texture_rects(zoom + 0.25) + + +func _on_generate_template_button_pressed() -> void: + save_template_file_dialog.set_current_path( + "res://template_%dx%d.png" % [x_size_input.value, y_size_input.value]) + save_template_file_dialog.popup_file_dialog() + + +func _on_save_template_file_selected(path : String) -> void: + var export_image := Image.create_empty(overlay_texture_rect.texture.get_size().x, overlay_texture_rect.texture.get_size().y, false, Image.FORMAT_RGBA8) + var overlay_image := overlay_texture_rect.texture.get_image() + var guide_image := guide_texture_rect.texture.get_image() + var tile_size := Vector2(float(x_size_input.value), float(y_size_input.value)) + + for x in range(overlay_image.get_size().x): + for y in range(overlay_image.get_size().y): + if overlay_image.get_pixel(x, y).a > 0.0: + export_image.set_pixel(x, y, hint_color) + elif guide_image.get_pixel(int((x / tile_size.x) * 256), int((y / tile_size.y) * 256)).a > 0.0: + export_image.set_pixel(x, y, hint_color) + export_image.save_png(path) + EditorInterface.get_resource_filesystem().scan() + + +func _on_color_picker_button_color_changed(color: Color) -> void: + hint_color = color + _redraw_overlay_texture() + + +func _on_collision_layer_color_picker_button_color_changed(color: Color) -> void: + collision_layer_color = color + for c : Node2D in collision_previews.values(): + c.modulate = collision_layer_color + + +func _on_generate_tile_set_button_pressed() -> void: + save_tile_set_file_dialog.set_current_path("res://tile_set.tres") + save_tile_set_file_dialog.popup_file_dialog() + + +func _on_save_tile_set_file_selected(path : String) -> void: + var tile_set := generate_tileset() + ResourceSaver.save(tile_set, path) + EditorInterface.get_resource_filesystem().scan() + + +func _on_generate_tile_map_layer_button_pressed() -> void: + var tile_set := generate_tileset() + request_tile_map_layer.emit(tile_set) + + +func generate_tileset() -> TileSet: + var raw_intel := images_container.gather_data() + var tile_set := TileSet.new() + var physics_layer_added := false + var nav_layer_added := false + tile_set.add_terrain_set() + tile_set.set_terrain_set_mode(0, TileSet.TERRAIN_MODE_MATCH_SIDES) + tile_set.tile_size = Vector2i(x_size_input.value, y_size_input.value) + + for terrain_id in range(raw_intel.size()): + tile_set.add_terrain(0, terrain_id) + tile_set.set_terrain_name(0, terrain_id, raw_intel[terrain_id]["terrain_name"]) + if raw_intel[terrain_id]["layer_type"] != CollisionType.NONE and not physics_layer_added: + tile_set.add_physics_layer() + physics_layer_added = true + if raw_intel[terrain_id]["layer_type"] == CollisionType.NAVIGABLE and not nav_layer_added: + tile_set.add_navigation_layer() + nav_layer_added = true + + for terrain_id in range(raw_intel.size()): + var atlas_source := TileSetAtlasSource.new() + atlas_source.texture_region_size = tile_set.tile_size + atlas_source.texture = raw_intel[terrain_id]["texture_resource"] + tile_set.add_source(atlas_source) + var created_tiles : Array[TileData] = [] + # row + created_tiles.append(create_tile(atlas_source, terrain_id, Vector2i(0,0), _get_collision_polygon_for_tile("MC", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(1,0), raw_intel.size(), TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, _get_collision_polygon_for_tile("VT", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(3,0), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE], _get_collision_polygon_for_tile("TL", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(4,0), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("TM", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(5,0), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("TR", atlas_source.texture.get_rid(), tile_set.tile_size))) + + # row + created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(1,1), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_TOP_SIDE], _get_collision_polygon_for_tile("VM", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(3,1), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE, TileSet.CELL_NEIGHBOR_TOP_SIDE], _get_collision_polygon_for_tile("LM", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_all_sides_neighbour_tile(atlas_source, terrain_id, Vector2i(4,1), raw_intel.size(), _get_collision_polygon_for_tile("CM", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(5,1), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE, TileSet.CELL_NEIGHBOR_TOP_SIDE], _get_collision_polygon_for_tile("RM", atlas_source.texture.get_rid(), tile_set.tile_size))) + + # row + created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(1,2), raw_intel.size(), TileSet.CELL_NEIGHBOR_TOP_SIDE, _get_collision_polygon_for_tile("VB", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(3,2), raw_intel.size(), [TileSet.CELL_NEIGHBOR_TOP_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE], _get_collision_polygon_for_tile("BL", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(4,2), raw_intel.size(), [TileSet.CELL_NEIGHBOR_TOP_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("BC", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(5,2), raw_intel.size(), [TileSet.CELL_NEIGHBOR_TOP_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("BR", atlas_source.texture.get_rid(), tile_set.tile_size))) + + # row + created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(0,3), raw_intel.size(), TileSet.CELL_NEIGHBOR_RIGHT_SIDE, _get_collision_polygon_for_tile("HL", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(1,3), raw_intel.size(), [TileSet.CELL_NEIGHBOR_LEFT_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE], _get_collision_polygon_for_tile("HM", atlas_source.texture.get_rid(), tile_set.tile_size))) + created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(2,3), raw_intel.size(), TileSet.CELL_NEIGHBOR_LEFT_SIDE, _get_collision_polygon_for_tile("HR", atlas_source.texture.get_rid(), tile_set.tile_size))) + if raw_intel[terrain_id]["layer_type"] == CollisionType.NAVIGABLE: + for tile_data : TileData in created_tiles: + tile_data.set_navigation_polygon(0, _get_new_navigation_rect(Vector2(tile_set.tile_size))) + return tile_set + + +func _get_new_navigation_rect(tile_size : Vector2) -> NavigationPolygon: + var new_navigation_mesh = NavigationPolygon.new() + var new_vertices = PackedVector2Array([ + Vector2(-0.5, -0.5) * tile_size, + Vector2(0.5, -0.5) * tile_size, + Vector2(0.5, 0.5) * tile_size, + Vector2(-0.5, 0.5) * tile_size + ]) + new_navigation_mesh.vertices = new_vertices + var new_polygon_indices = PackedInt32Array([0, 1, 2, 3]) + new_navigation_mesh.add_polygon(new_polygon_indices) + return new_navigation_mesh + + +func _get_collision_polygon_for_tile(node_name : String, resource_id : RID, tile_size : Vector2) -> PackedVector2Array: + #print(resource_id, collision_type_map.has(resource_id)) + if not collision_type_map.has(resource_id): + return PackedVector2Array([]) + + if not collision_previews.has(collision_type_map[resource_id]): + return PackedVector2Array([]) + var polygon_node : Polygon2D = collision_previews[collision_type_map[resource_id]].find_child(node_name) + if is_instance_valid(polygon_node): + var poly_points : Array[Vector2] = [] + for point : Vector2 in polygon_node.polygon: + poly_points.append((point - Vector2(0.5, 0.5)) * tile_size) + return PackedVector2Array(poly_points) + return PackedVector2Array([]) + + +func create_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, collision_polygon_points : PackedVector2Array) -> TileData: + atlas_source.create_tile(at_pos) + var new_tile := atlas_source.get_tile_data(at_pos, 0) + new_tile.terrain_set = 0 + new_tile.terrain = terrain_id + if not collision_polygon_points.is_empty(): + new_tile.add_collision_polygon(0) + new_tile.set_collision_polygon_points(0, 0, PackedVector2Array(collision_polygon_points)) + return new_tile + + +func create_single_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, neighbour : int, collision_polygon_points : PackedVector2Array) -> TileData: + var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points) + new_tile.set_terrain_peering_bit(neighbour, terrain_id) + return new_tile + + +func create_dual_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, neighbours : Array[int], collision_polygon_points : PackedVector2Array) -> TileData: + var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points) + new_tile.set_terrain_peering_bit(neighbours[0], terrain_id) + new_tile.set_terrain_peering_bit(neighbours[1], terrain_id) + return new_tile + + +func create_triple_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, neighbours : Array[int], collision_polygon_points : PackedVector2Array) -> TileData: + var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points) + new_tile.set_terrain_peering_bit(neighbours[0], terrain_id) + new_tile.set_terrain_peering_bit(neighbours[1], terrain_id) + new_tile.set_terrain_peering_bit(neighbours[2], terrain_id) + return new_tile + + +func create_all_sides_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, collision_polygon_points : PackedVector2Array) -> TileData: + var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points) + new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_RIGHT_SIDE, terrain_id) + new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, terrain_id) + new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_LEFT_SIDE, terrain_id) + new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_TOP_SIDE, terrain_id) + return new_tile + diff --git a/addons/ez_tiles/ez_tiles_dock.gd.uid b/addons/ez_tiles/ez_tiles_dock.gd.uid new file mode 100644 index 0000000..75fa74a --- /dev/null +++ b/addons/ez_tiles/ez_tiles_dock.gd.uid @@ -0,0 +1 @@ +uid://dlwkkly71ed7v diff --git a/addons/ez_tiles/ez_tiles_dock.tscn b/addons/ez_tiles/ez_tiles_dock.tscn new file mode 100644 index 0000000..516db75 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_dock.tscn @@ -0,0 +1,211 @@ +[gd_scene load_steps=22 format=3 uid="uid://ci7u5r1qc0aob"] + +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_dock.gd" id="1_xlstp"] +[ext_resource type="Script" path="res://addons/ez_tiles/load_files_button.gd" id="2_8dh4w"] +[ext_resource type="PackedScene" uid="uid://1u5mrsioaaon" path="res://addons/ez_tiles/images_container.tscn" id="3_vxumx"] +[ext_resource type="Texture2D" uid="uid://cxl4w251e8xgf" path="res://addons/ez_tiles/Save.svg" id="4_2smhm"] +[ext_resource type="Texture2D" uid="uid://njliaygubc5c" path="res://addons/ez_tiles/ZoomLess.svg" id="4_k6fm5"] +[ext_resource type="Texture2D" uid="uid://bvwx6xu0hp7mv" path="res://addons/ez_tiles/ZoomMore.svg" id="5_0phj1"] +[ext_resource type="Script" path="res://addons/ez_tiles/preview_panel_container.gd" id="6_3jtbs"] +[ext_resource type="Texture2D" uid="uid://d4a0dorx8awbg" path="res://addons/ez_tiles/guide.png" id="9_umpsr"] +[ext_resource type="PackedScene" uid="uid://cxnhqxx237lix" path="res://addons/ez_tiles/collision_polygon_templates/inverse_rounded_corners.tscn" id="9_wk7qe"] +[ext_resource type="PackedScene" uid="uid://bdtlwd7f6ojk0" path="res://addons/ez_tiles/collision_polygon_templates/rectangles.tscn" id="10_fyd7t"] +[ext_resource type="PackedScene" uid="uid://cm4063l3dfehn" path="res://addons/ez_tiles/collision_polygon_templates/rounded_corners.tscn" id="11_cnbjd"] +[ext_resource type="PackedScene" uid="uid://lfnyjmnayoqe" path="res://addons/ez_tiles/collision_polygon_templates/slopes.tscn" id="12_x4rcv"] +[ext_resource type="PackedScene" uid="uid://ckfu3f4u350bg" path="res://addons/ez_tiles/collision_polygon_templates/slopes_bottom.tscn" id="13_3furq"] +[ext_resource type="PackedScene" uid="uid://3gmoem8hi2hi" path="res://addons/ez_tiles/collision_polygon_templates/slopes_top.tscn" id="14_djl3r"] +[ext_resource type="PackedScene" uid="uid://ywxhlehtt18d" path="res://addons/ez_tiles/collision_polygon_templates/cactus.tscn" id="15_ll5rq"] +[ext_resource type="PackedScene" uid="uid://bp35luh5na8o7" path="res://addons/ez_tiles/collision_polygon_templates/tree.tscn" id="16_02naq"] + +[sub_resource type="LabelSettings" id="LabelSettings_2svd6"] +font_color = Color(0.619608, 0.619608, 0.619608, 1) + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_wkbrg"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3l5ec"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ikc07"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fl86h"] +bg_color = Color(0.12549, 0.145098, 0.172549, 1) + +[node name="EZTilesDock" type="HBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_xlstp") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 + +[node name="LoadFilesButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +text = "Import Images" +script = ExtResource("2_8dh4w") + +[node name="GenerateTileSetButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +disabled = true +text = "Save TileSet" + +[node name="GenerateTileMapLayerButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +disabled = true +text = "Create TileMapLayer" + +[node name="ImagesContainer" parent="VBoxContainer" instance=ExtResource("3_vxumx")] +layout_mode = 2 + +[node name="VBoxContainer2" type="VBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer2"] +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 + +[node name="TileSizeLabel" type="Label" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +tooltip_text = "The tile size is determined automatically from the first image you import. As you can see in the template below, EZ Tiles expects a 6 by 4 grid; the tiles do not have to be square." +mouse_filter = 0 +text = "Tile Size* " +label_settings = SubResource("LabelSettings_2svd6") + +[node name="XSizeInputContainer" type="PanelContainer" parent="VBoxContainer2/HBoxContainer"] +custom_minimum_size = Vector2(84, 0) +layout_mode = 2 +size_flags_horizontal = 0 + +[node name="YSizeInputContainer" type="PanelContainer" parent="VBoxContainer2/HBoxContainer"] +custom_minimum_size = Vector2(84, 0) +layout_mode = 2 +size_flags_horizontal = 0 + +[node name="HintColorLabel" type="Label" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +mouse_filter = 0 +text = "Hint colors: " +label_settings = SubResource("LabelSettings_2svd6") + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer2/HBoxContainer"] +custom_minimum_size = Vector2(40, 0) +layout_mode = 2 +tooltip_text = "Overlay Color" +color = Color(0, 0, 0, 0.701961) + +[node name="CollisionLayerColorPickerButton" type="ColorPickerButton" parent="VBoxContainer2/HBoxContainer"] +custom_minimum_size = Vector2(40, 0) +layout_mode = 2 +tooltip_text = "Collision Polygon color" +color = Color(1, 0, 0, 0.392157) + +[node name="GenerateTemplateButton" type="Button" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +disabled = true +text = "Save template" +icon = ExtResource("4_2smhm") + +[node name="ZoomPreviewLabel" type="Label" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Zoom Preview: " +label_settings = SubResource("LabelSettings_2svd6") +horizontal_alignment = 2 + +[node name="ZoomOutButton" type="Button" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_wkbrg") +icon = ExtResource("4_k6fm5") + +[node name="ResetZoomButton" type="Button" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_3l5ec") +text = "100%" + +[node name="ZoomInButton" type="Button" parent="VBoxContainer2/HBoxContainer"] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_ikc07") +icon = ExtResource("5_0phj1") + +[node name="PreviewScrollContainer" type="ScrollContainer" parent="VBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_fl86h") + +[node name="PreviewPanelContainer" type="CenterContainer" parent="VBoxContainer2/PreviewScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("6_3jtbs") + +[node name="PreviewTextureRect" type="TextureRect" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer"] +texture_filter = 1 +layout_mode = 2 +expand_mode = 3 + +[node name="Rounded Corners (Inverse)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("9_wk7qe")] +visible = false +modulate = Color(0.970763, 0, 0.452533, 0.42) + +[node name="Rectangles" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("10_fyd7t")] +visible = false +modulate = Color(0.970763, 0, 0.452533, 0.42) + +[node name="Rounded Corners" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("11_cnbjd")] +visible = false +modulate = Color(0.970763, 0, 0.452533, 0.42) + +[node name="Sloped (All Corners)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("12_x4rcv")] +visible = false +modulate = Color(0.970763, 0, 0.452533, 0.42) + +[node name="Sloped (Bottom Corners)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("13_3furq")] +visible = false +modulate = Color(0.970763, 0, 0.452533, 0.42) + +[node name="Sloped (Top Corners)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("14_djl3r")] +visible = false +modulate = Color(0.970763, 0, 0.452533, 0.42) + +[node name="Cactus" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("15_ll5rq")] +visible = false + +[node name="Tree" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("16_02naq")] +visible = false + +[node name="OverlayTextureRect" type="TextureRect" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer"] +texture_filter = 1 +layout_mode = 2 +expand_mode = 3 + +[node name="GuideTextureRect" type="TextureRect" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer"] +modulate = Color(1, 1, 1, 0.701961) +texture_filter = 1 +layout_mode = 2 +texture = ExtResource("9_umpsr") +expand_mode = 3 + +[connection signal="load_files" from="VBoxContainer/HBoxContainer/LoadFilesButton" to="." method="_on_file_menu_load_files"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/LoadFilesButton" to="VBoxContainer/HBoxContainer/LoadFilesButton" method="_on_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateTileSetButton" to="." method="_on_generate_tile_set_button_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateTileMapLayerButton" to="." method="_on_generate_tile_map_layer_button_pressed"] +[connection signal="drop_files" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_drop_files"] +[connection signal="terrain_list_collision_type_selected" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_terrain_list_collision_type_selected"] +[connection signal="terrain_list_entry_removed" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_terrain_list_entry_removed"] +[connection signal="terrain_list_entry_selected" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_terrain_list_entry_selected"] +[connection signal="color_changed" from="VBoxContainer2/HBoxContainer/ColorPickerButton" to="." method="_on_color_picker_button_color_changed"] +[connection signal="color_changed" from="VBoxContainer2/HBoxContainer/CollisionLayerColorPickerButton" to="." method="_on_collision_layer_color_picker_button_color_changed"] +[connection signal="pressed" from="VBoxContainer2/HBoxContainer/GenerateTemplateButton" to="." method="_on_generate_template_button_pressed"] +[connection signal="pressed" from="VBoxContainer2/HBoxContainer/ZoomOutButton" to="." method="_on_zoom_out_button_pressed"] +[connection signal="pressed" from="VBoxContainer2/HBoxContainer/ResetZoomButton" to="." method="_on_reset_zoom_button_pressed"] +[connection signal="pressed" from="VBoxContainer2/HBoxContainer/ZoomInButton" to="." method="_on_zoom_in_button_pressed"] +[connection signal="gui_input" from="VBoxContainer2/PreviewScrollContainer" to="." method="_on_preview_panel_container_gui_input"] +[connection signal="drop_files" from="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer" to="." method="_on_preview_panel_container_drop_files"] diff --git a/addons/ez_tiles/ez_tiles_draw/area_draw.gd b/addons/ez_tiles/ez_tiles_draw/area_draw.gd new file mode 100644 index 0000000..7046cbb --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/area_draw.gd @@ -0,0 +1,381 @@ +@tool +extends Control +class_name AreaDraw + +signal connect_mode_toggled(toggled : bool) + +enum Shape { + RECTANGLE, + SLOPE_TL, + SLOPE_TR, + SLOPE_BR, + SLOPE_BL, + HARD_RECTANGLE, + HILL_TOP, + HILL_BOTTOM, + HILL_RIGHT, + HILL_LEFT, + ISLAND, + RECTANGLE_BASIC +} +var shape := Shape.RECTANGLE_BASIC +var preview_container : GridContainer + +const TL := Vector2i(3, 0) +const TR := Vector2i(5, 0) +const TM := Vector2i(4, 0) +const BL := Vector2i(3, 2) +const BR := Vector2i(5, 2) +const BM := Vector2i(4, 2) +const LM := Vector2i(3, 1) +const RM := Vector2i(5, 1) +const CM := Vector2i(4, 1) +const XX := null + +const SHAPE_MAP := { + Shape.RECTANGLE_BASIC: [ + [CM, CM, CM, CM, CM], + [CM, CM, CM, CM, CM], + [CM, CM, CM, CM, CM], + [CM, CM, CM, CM, CM], + [CM, CM, CM, CM, CM], + ], + Shape.RECTANGLE: [ + [TL, TM, TM, TM, TR], + [LM, CM, CM, CM, RM], + [LM, CM, CM, CM, RM], + [BL, BM, BM, BM, BR], + [XX, XX, XX, XX, XX], + ], + Shape.SLOPE_TL: [ + [XX, XX, XX, TL, TM], + [XX, XX, TL, CM, CM], + [XX, TL, CM, CM, CM], + [TL, CM, CM, CM, CM], + [XX, XX, XX, XX, XX], + ], + Shape.SLOPE_TR: [ + [TM, TR, XX, XX, XX], + [CM, CM, TR, XX, XX], + [CM, CM, CM, TR, XX], + [CM, CM, CM, CM, TR], + [XX, XX, XX, XX, XX], + ], + Shape.SLOPE_BR: [ + [CM, CM, CM, CM, BR], + [CM, CM, CM, BR, XX], + [CM, CM, BR, XX, XX], + [BM, BR, XX, XX, XX], + [XX, XX, XX, XX, XX], + ], + Shape.SLOPE_BL: [ + [BL, CM, CM, CM, CM], + [XX, BL, CM, CM, CM], + [XX, XX, BL, CM, CM], + [XX, XX, XX, BL, BM], + [XX, XX, XX, XX, XX], + ], + Shape.HARD_RECTANGLE: [ + [TM, TM, TM, TM, TM], + [LM, CM, CM, CM, RM], + [LM, CM, CM, CM, RM], + [BM, BM, BM, BM, BM], + [XX, XX, XX, XX, XX], + ], + Shape.HILL_TOP: [ + [XX, TL, TM, TR, XX], + [TL, CM, CM, CM, TR], + [LM, CM, CM, CM, RM], + [LM, CM, CM, CM, RM], + [XX, XX, XX, XX, XX], + ], + Shape.HILL_BOTTOM: [ + [LM, CM, CM, CM, RM], + [LM, CM, CM, CM, RM], + [BL, CM, CM, CM, BR], + [XX, BL, BM, BR, XX], + [XX, XX, XX, XX, XX], + ], + Shape.HILL_LEFT: [ + [XX, TL, TM, TM, TM], + [TL, CM, CM, CM, CM], + [LM, CM, CM, CM, CM], + [BL, CM, CM, CM, CM], + [XX, BL, BM, BM, BM], + ], + Shape.HILL_RIGHT: [ + [TM, TM, TM, TR, XX], + [CM, CM, CM, CM, TR], + [CM, CM, CM, CM, RM], + [CM, CM, CM, CM, BR], + [BM, BM, BM, BR, XX], + ], + Shape.ISLAND: [ + [XX, TL, TM, TR, XX], + [TL, CM, CM, CM, TR], + [CM, CM, CM, CM, RM], + [BL, CM, CM, CM, BR], + [XX, BL, BM, BR, XX], + ], +} + +var cur_terrain_texture : Texture2D +var cur_tile_size : Vector2i +var connect_terrains_button : Button +var tile_button : Button + + +func _enter_tree() -> void: + preview_container = find_child("PreviewGridContainer") + connect_terrains_button = find_child("ConnectTerrainsButton") + tile_button = find_child("TileButton1") + + +func _get_empty_tex(tile_size : Vector2i) -> Texture2D: + var plc_tex := GradientTexture2D.new() + plc_tex.width = tile_size.x + plc_tex.height = tile_size.y + plc_tex.gradient = Gradient.new() + plc_tex.gradient.colors = [Color.TRANSPARENT] + return plc_tex + + +func update_grid_preview(terrain_texture : Texture2D = cur_terrain_texture, tile_size : Vector2i = cur_tile_size): + tile_button.icon = AtlasTexture.new() + tile_button.icon.atlas = terrain_texture + tile_button.icon.region = Rect2i(CM * tile_size, tile_size) + cur_terrain_texture = terrain_texture + cur_tile_size = tile_size + var i := 0 + for y in range(SHAPE_MAP[shape].size()): + for x in range(SHAPE_MAP[shape][y].size()): + var tex_rect : TextureRect = preview_container.get_child(i) + i += 1 + if not is_instance_valid(tex_rect): + continue + if SHAPE_MAP[shape][y][x] == null: + tex_rect.texture = _get_empty_tex(tile_size) + continue + var atlas_texture : AtlasTexture = tex_rect.texture if tex_rect.texture is AtlasTexture else AtlasTexture.new() + atlas_texture.atlas = terrain_texture + atlas_texture.region = Rect2i(SHAPE_MAP[shape][y][x] * tile_size, tile_size) + tex_rect.texture = atlas_texture + + +static func get_cells_rectangle_basic(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var cells := {} + for x in range(p1.x, p2.x + 1): + for y in range(p1.y, p2.y + 1): + cells[Vector2i(x, y)] = CM + return cells + + +static func get_cells_rectangle(p1 : Vector2i, p2 : Vector2i, soft := false) -> Dictionary: + var cells := {} + for x in range(p1.x, p2.x + 1): + for y in range(p1.y, p2.y + 1): + if x == p1.x and y == p1.y and soft: + cells[Vector2i(x, y)] = TL + elif x == p2.x and y == p1.y and soft: + cells[Vector2i(x, y)] = TR + elif x == p1.x and y == p2.y and soft: + cells[Vector2i(x, y)] = BL + elif x == p2.x and y == p2.y and soft: + cells[Vector2i(x, y)] = BR + elif x == p2.x and y > p1.y and y < p2.y: + cells[Vector2i(x, y)] = RM + elif x == p1.x and y > p1.y and y < p2.y: + cells[Vector2i(x, y)] = LM + elif y == p2.y: + cells[Vector2i(x, y)] = BM + elif y == p1.y: + cells[Vector2i(x, y)] = TM + else: + cells[Vector2i(x, y)] = CM + return cells + + +static func get_cells_slope_tl(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var cells := {} + var width := p2.x - p1.x + 1 + var height := p2.y - p1.y + 1 + var sq_siz := min(width, height) + for y : int in range(sq_siz): + var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0 + for x in range(range_start, sq_siz): + cells[Vector2i(p1.x + x, p1.y + y)] = TL if x == range_start else CM + if width > sq_siz: + for x in range(sq_siz, width): + for y in range(height): + cells[Vector2i(p1.x + x, p1.y + y)] = TM if y == 0 else CM + else: + for y in range(sq_siz, height): + for x in range(width): + cells[Vector2i(p1.x + x, p1.y + y)] = LM if x == 0 else CM + return cells + +static func get_cells_slope_tr(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var cells := {} + var width := p2.x - p1.x + 1 + var height := p2.y - p1.y + 1 + var sq_siz := min(width, height) + for y : int in range(sq_siz): + var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0 + for x in range(range_start, sq_siz): + cells[Vector2i(p1.x + (width-x-1), p1.y + y)] = TR if x == range_start else CM + if width > sq_siz: + for x in range(sq_siz, width): + for y in range(height): + cells[Vector2i(p1.x + (width-x-1), p1.y + y)] = TM if y == 0 else CM + else: + for y in range(sq_siz, height): + for x in range(width): + cells[Vector2i(p1.x + (width-x-1), p1.y + y)] = RM if x == 0 else CM + return cells + +static func get_cells_slope_bl(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var cells := {} + var width := p2.x - p1.x + 1 + var height := p2.y - p1.y + 1 + var sq_siz := min(width, height) + for y : int in range(sq_siz): + var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0 + for x in range(range_start, sq_siz): + cells[Vector2i(p1.x + x, p1.y + (height - y - 1))] = BL if x == range_start else CM + if width > sq_siz: + for x in range(sq_siz, width): + for y in range(height): + cells[Vector2i(p1.x + x, p1.y + (height - y - 1))] = BM if y == 0 else CM + else: + for y in range(sq_siz, height): + for x in range(width): + cells[Vector2i(p1.x + x, p1.y + (height - y - 1))] = LM if x == 0 else CM + return cells + +static func get_cells_slope_br(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var cells := {} + var width := p2.x - p1.x + 1 + var height := p2.y - p1.y + 1 + var sq_siz := min(width, height) + for y : int in range(sq_siz): + var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0 + for x in range(range_start, sq_siz): + cells[Vector2i(p1.x + (width-x-1), p1.y + (height - y - 1))] = BR if x == range_start else CM + if width > sq_siz: + for x in range(sq_siz, width): + for y in range(height): + cells[Vector2i(p1.x + (width-x-1), p1.y + (height - y - 1))] = BM if y == 0 else CM + else: + for y in range(sq_siz, height): + for x in range(width): + cells[Vector2i(p1.x + (width-x-1), p1.y + (height - y - 1))] = RM if x == 0 else CM + return cells + +static func get_cells_hill_top(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var width := p2.x - p1.x + var height := p2.y - p1.y + var out = get_cells_slope_tl(p1, p1 + Vector2i(ceil(width / 2.0) - 1, height)) + out.merge(get_cells_slope_tr(p1 + Vector2i(ceil(width / 2.0), 0), p2)) + return out + + +static func get_cells_hill_bottom(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var width := p2.x - p1.x + var height := p2.y - p1.y + var out = get_cells_slope_bl(p1, p1 + Vector2i(ceil(width / 2.0) - 1, height)) + out.merge(get_cells_slope_br(p1 + Vector2i(ceil(width / 2.0), 0), p2)) + return out + +static func get_cells_hill_left(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var width := p2.x - p1.x + var height := p2.y - p1.y + var out = get_cells_slope_tl(p1, p1 + Vector2i(width, ceil(height / 2.0) - 1)) + out.merge(get_cells_slope_bl(p1 + Vector2i(0, ceil(height / 2.0)), p2)) + return out + + +static func get_cells_hill_right(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var width := p2.x - p1.x + var height := p2.y - p1.y + var out = get_cells_slope_tr(p1, p1 + Vector2i(width, ceil(height / 2.0) - 1)) + out.merge(get_cells_slope_br(p1 + Vector2i(0, ceil(height / 2.0)), p2)) + return out + + +static func get_cells_island(p1 : Vector2i, p2 : Vector2i) -> Dictionary: + var width := p2.x - p1.x + var height := p2.y - p1.y + var out = get_cells_slope_tl(p1, p1 + Vector2i(ceil(width / 2.0) - 1, ceil(height / 2.0) - 1)) + out.merge(get_cells_slope_tr(p1 + Vector2i(ceil(width / 2.0), 0), Vector2i(p2.x, p1.y + ceil(height / 2.0) - 1))) + out.merge(get_cells_slope_bl(p1 + Vector2i(0, ceil(height / 2.0)), Vector2i(p1.x + ceil(width / 2.0) - 1, p2.y))) + out.merge(get_cells_slope_br(p1 + Vector2i(ceil(width / 2.0), ceil(height / 2.0)), p2), true) + return out + + + +func _on_connect_terrains_button_pressed() -> void: + connect_mode_toggled.emit(true) + + +func _on_tile_button_1_pressed() -> void: + connect_mode_toggled.emit(false) + + +func _on_rectangles_button_pressed() -> void: + shape = Shape.RECTANGLE + update_grid_preview() + + +func _on_slopes_tl_button_pressed() -> void: + shape = Shape.SLOPE_TL + update_grid_preview() + + +func _on_slopes_tr_button_pressed() -> void: + shape = Shape.SLOPE_TR + update_grid_preview() + + +func _on_slopes_br_button_pressed() -> void: + shape = Shape.SLOPE_BR + update_grid_preview() + + +func _on_slopes_bl_button_pressed() -> void: + shape = Shape.SLOPE_BL + update_grid_preview() + + +func _on_hard_rectangles_button_pressed() -> void: + shape = Shape.HARD_RECTANGLE + update_grid_preview() + + +func _on_hill_top_button_pressed() -> void: + shape = Shape.HILL_TOP + update_grid_preview() + + +func _on_hill_bottom_button_pressed() -> void: + shape = Shape.HILL_BOTTOM + update_grid_preview() + + +func _on_hill_left_button_pressed() -> void: + shape = Shape.HILL_LEFT + update_grid_preview() + + +func _on_hill_right_button_pressed() -> void: + shape = Shape.HILL_RIGHT + update_grid_preview() + + +func _on_island_button_pressed() -> void: + shape = Shape.ISLAND + update_grid_preview() + + +func _on_rectangles_basic_button_pressed() -> void: + shape = Shape.RECTANGLE_BASIC + update_grid_preview() diff --git a/addons/ez_tiles/ez_tiles_draw/area_draw.gd.uid b/addons/ez_tiles/ez_tiles_draw/area_draw.gd.uid new file mode 100644 index 0000000..fd7cf67 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/area_draw.gd.uid @@ -0,0 +1 @@ +uid://b87n11kajm34 diff --git a/addons/ez_tiles/ez_tiles_draw/area_draw.tscn b/addons/ez_tiles/ez_tiles_draw/area_draw.tscn new file mode 100644 index 0000000..eef1f13 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/area_draw.tscn @@ -0,0 +1,389 @@ +[gd_scene load_steps=18 format=3 uid="uid://bitqwiwmn3s0r"] + +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/area_draw.gd" id="1_ee3lv"] +[ext_resource type="Texture2D" uid="uid://dooqg3fapf15x" path="res://addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg" id="2_0c16j"] +[ext_resource type="Texture2D" uid="uid://xetkyyw6y8ff" path="res://addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg" id="2_lfgj6"] +[ext_resource type="Texture2D" uid="uid://behgjlyeldpdv" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg" id="3_j68q8"] +[ext_resource type="Texture2D" uid="uid://dbjof7q6tq4d6" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg" id="4_703fo"] +[ext_resource type="Texture2D" uid="uid://7crpolmxjj2r" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg" id="5_f5qx1"] +[ext_resource type="Texture2D" uid="uid://clpg11r4kdy8v" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg" id="6_r38ls"] +[ext_resource type="Texture2D" uid="uid://c7u17hgk6jvet" path="res://addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg" id="8_05x1s"] +[ext_resource type="Texture2D" uid="uid://cri2mdk3hr6s1" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillT.svg" id="8_trf31"] +[ext_resource type="Texture2D" uid="uid://dntkx0h8qim1n" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillB.svg" id="9_abenc"] +[ext_resource type="Texture2D" uid="uid://dpmrju1gvdr16" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillL.svg" id="10_dsu38"] +[ext_resource type="Texture2D" uid="uid://dv855gccwqgu" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillR.svg" id="11_nyydi"] +[ext_resource type="Texture2D" uid="uid://frudvs8p10ea" path="res://addons/ez_tiles/ez_tiles_draw/icons/Island.svg" id="12_qvlkp"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_51lt4"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.211765, 0.239216, 0.290196, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ehgjy"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.12549, 0.145098, 0.172549, 1) + +[sub_resource type="ButtonGroup" id="ButtonGroup_82nql"] + +[sub_resource type="ButtonGroup" id="ButtonGroup_3cdnu"] + +[node name="AreaDraw" type="PanelContainer"] +clip_children = 2 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_51lt4") +script = ExtResource("1_ee3lv") +metadata/_tab_index = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Panel2" type="Panel" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.3 +theme_override_styles/panel = SubResource("StyleBoxFlat_ehgjy") + +[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/Panel2"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/Panel2/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="RectanglesBasicButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_pressed = true +button_group = SubResource("ButtonGroup_82nql") +text = "Rectangle" +icon = ExtResource("2_0c16j") +alignment = 0 + +[node name="RectanglesButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Rectangle (Soft)" +icon = ExtResource("2_lfgj6") +alignment = 0 + +[node name="HardRectanglesButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Rectangle (Hard)" +icon = ExtResource("2_0c16j") +alignment = 0 + +[node name="SlopesTLButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Slope (Top Left)" +icon = ExtResource("3_j68q8") +alignment = 0 + +[node name="SlopesTRButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Slope (Top Right)" +icon = ExtResource("4_703fo") +alignment = 0 + +[node name="SlopesBRButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Slope (Bottom Right)" +icon = ExtResource("5_f5qx1") +alignment = 0 + +[node name="SlopesBLButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Slope (Bottom Left)" +icon = ExtResource("6_r38ls") +alignment = 0 + +[node name="HillTopButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Hill (Top)" +icon = ExtResource("8_trf31") +alignment = 0 + +[node name="HillBottomButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Hill (Bottom)" +icon = ExtResource("9_abenc") +alignment = 0 + +[node name="HillLeftButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Hill (Left)" +icon = ExtResource("10_dsu38") +alignment = 0 + +[node name="HillRightButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Hill (Right)" +icon = ExtResource("11_nyydi") +alignment = 0 + +[node name="IslandButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"] +layout_mode = 2 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_82nql") +text = "Island" +icon = ExtResource("12_qvlkp") +alignment = 0 + +[node name="Panel" type="Panel" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_ehgjy") + +[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PreviewGridContainer" type="GridContainer" parent="HBoxContainer/Panel/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 6 +size_flags_vertical = 6 +theme_override_constants/h_separation = 0 +theme_override_constants/v_separation = 0 +columns = 5 + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect2" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect3" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect4" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect5" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect6" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect7" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect8" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect9" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect10" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect11" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect12" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect13" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect14" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect15" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect16" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect17" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect18" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect19" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect20" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect21" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect22" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect23" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect24" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="TextureRect25" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 8 + +[node name="HFlowContainer" type="HFlowContainer" parent="HBoxContainer/Panel"] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 84.0 +grow_horizontal = 2 +theme_override_constants/h_separation = 5 + +[node name="ConnectTerrainsButton" type="Button" parent="HBoxContainer/Panel/HFlowContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +toggle_mode = true +button_group = SubResource("ButtonGroup_3cdnu") +icon = ExtResource("8_05x1s") + +[node name="TileButton1" type="Button" parent="HBoxContainer/Panel/HFlowContainer"] +custom_minimum_size = Vector2(40, 40) +layout_mode = 2 +theme_override_colors/icon_normal_color = Color(0.556863, 0.556863, 0.556863, 1) +theme_override_colors/icon_pressed_color = Color(1, 1, 1, 1) +theme_override_colors/icon_hover_color = Color(1, 1, 1, 1) +toggle_mode = true +button_pressed = true +button_group = SubResource("ButtonGroup_3cdnu") +flat = true +icon_alignment = 1 +expand_icon = true + +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/RectanglesBasicButton" to="." method="_on_rectangles_basic_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/RectanglesButton" to="." method="_on_rectangles_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HardRectanglesButton" to="." method="_on_hard_rectangles_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesTLButton" to="." method="_on_slopes_tl_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesTRButton" to="." method="_on_slopes_tr_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesBRButton" to="." method="_on_slopes_br_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesBLButton" to="." method="_on_slopes_bl_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillTopButton" to="." method="_on_hill_top_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillBottomButton" to="." method="_on_hill_bottom_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillLeftButton" to="." method="_on_hill_left_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillRightButton" to="." method="_on_hill_right_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/IslandButton" to="." method="_on_island_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel/HFlowContainer/ConnectTerrainsButton" to="." method="_on_connect_terrains_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Panel/HFlowContainer/TileButton1" to="." method="_on_tile_button_1_pressed"] diff --git a/addons/ez_tiles/ez_tiles_draw/brush_draw.gd b/addons/ez_tiles/ez_tiles_draw/brush_draw.gd new file mode 100644 index 0000000..49bd7f9 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/brush_draw.gd @@ -0,0 +1,64 @@ +@tool +extends PanelContainer +class_name BrushDraw + +var brush_size : int = 1 +var TileButtonScene : PackedScene + +enum BrushShape {CIRCLE, SQUARE} +signal connect_mode_toggled(toggled : bool) + +var tile_coords := Vector2i.ZERO +var connect_terrains_button : Button +var brush_shape := BrushShape.SQUARE +var button_container : Control +var first_tile_button : Button + +func _enter_tree() -> void: + TileButtonScene = preload("res://addons/ez_tiles/ez_tiles_draw/tile_button.tscn") + connect_terrains_button = find_child("ConnectTerrainsButton") + connect_terrains_button.pressed.connect(func(): connect_mode_toggled.emit(true)) + button_container = find_child("TileButtonContainer") + + +func _on_tile_button_pressed(coords : Vector2i): + tile_coords = coords + connect_mode_toggled.emit(false) + + +func _on_range_slider_with_line_edit_value_changed(value: int) -> void: + brush_size = value + + +func update_tile_buttons(tileset_source : TileSetAtlasSource, tile_size : Vector2i): + first_tile_button = null + for c in button_container.get_children(): + if c is TileButton: + c.queue_free() + + var terrain_texture := tileset_source.texture + for idx in range(tileset_source.get_tiles_count()): + var pos := tileset_source.get_tile_id(idx) + var tile_button : TileButton = TileButtonScene.instantiate() + tile_button.clicked.connect(_on_tile_button_pressed) + tile_button.coords = pos + var texture := AtlasTexture.new() + tile_button.icon = texture + tile_button.icon.atlas = terrain_texture + tile_button.icon.region = Rect2i(pos * tile_size, tile_size) + button_container.add_child(tile_button) + if not is_instance_valid(first_tile_button): + first_tile_button = tile_button + first_tile_button.button_pressed = true + + +func toggle_off_connected_brush() -> void: + if is_instance_valid(first_tile_button): + first_tile_button.button_pressed = true + +func _on_brush_shape_square_button_pressed() -> void: + brush_shape = BrushShape.SQUARE + + +func _on_brush_shape_circle_button_pressed() -> void: + brush_shape = BrushShape.CIRCLE diff --git a/addons/ez_tiles/ez_tiles_draw/brush_draw.gd.uid b/addons/ez_tiles/ez_tiles_draw/brush_draw.gd.uid new file mode 100644 index 0000000..e1db885 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/brush_draw.gd.uid @@ -0,0 +1 @@ +uid://dap4bbli16fp6 diff --git a/addons/ez_tiles/ez_tiles_draw/brush_draw.tscn b/addons/ez_tiles/ez_tiles_draw/brush_draw.tscn new file mode 100644 index 0000000..45e389e --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/brush_draw.tscn @@ -0,0 +1,110 @@ +[gd_scene load_steps=11 format=3 uid="uid://is8n20fchd2q"] + +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/brush_draw.gd" id="1_qrfye"] +[ext_resource type="PackedScene" uid="uid://chi7cp6qp6vki" path="res://addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.tscn" id="2_g17n4"] +[ext_resource type="Texture2D" uid="uid://bps21xe8h1m2p" path="res://addons/ez_tiles/ez_tiles_draw/icons/Square.svg" id="3_eksbm"] +[ext_resource type="Texture2D" uid="uid://c7u17hgk6jvet" path="res://addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg" id="3_lefkq"] +[ext_resource type="Texture2D" uid="uid://bb3xfpcrmc8gc" path="res://addons/ez_tiles/ez_tiles_draw/icons/Circle.svg" id="4_04hac"] +[ext_resource type="ButtonGroup" uid="uid://dtpx52d0n4ff1" path="res://addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres" id="5_wkw32"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gwowe"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.211765, 0.239216, 0.290196, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qgks4"] +content_margin_left = 10.0 +content_margin_top = 2.0 +content_margin_right = 10.0 +content_margin_bottom = 2.0 +bg_color = Color(0.12549, 0.145098, 0.172549, 1) + +[sub_resource type="ButtonGroup" id="ButtonGroup_461xu"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_r4hko"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.12549, 0.145098, 0.172549, 1) + +[node name="BrushDraw" type="PanelContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_gwowe") +script = ExtResource("1_qrfye") +metadata/_tab_index = 1 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"] +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_qgks4") + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer"] +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +size_flags_vertical = 0 +theme_override_constants/separation = 10 + +[node name="Label" type="Label" parent="VBoxContainer/PanelContainer/HBoxContainer"] +layout_mode = 2 +text = "Brush Size" + +[node name="RangeSliderWithLineEdit" parent="VBoxContainer/PanelContainer/HBoxContainer" instance=ExtResource("2_g17n4")] +layout_mode = 2 + +[node name="Label2" type="Label" parent="VBoxContainer/PanelContainer/HBoxContainer"] +layout_mode = 2 +text = "Shape" + +[node name="BrushShapeSquareButton" type="Button" parent="VBoxContainer/PanelContainer/HBoxContainer"] +custom_minimum_size = Vector2(32, 0) +layout_mode = 2 +toggle_mode = true +button_pressed = true +button_group = SubResource("ButtonGroup_461xu") +icon = ExtResource("3_eksbm") +icon_alignment = 1 + +[node name="BrushShapeCircleButton" type="Button" parent="VBoxContainer/PanelContainer/HBoxContainer"] +custom_minimum_size = Vector2(32, 0) +layout_mode = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_461xu") +icon = ExtResource("4_04hac") +icon_alignment = 1 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/ScrollContainer"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_r4hko") + +[node name="TileButtonContainer" type="HFlowContainer" parent="VBoxContainer/ScrollContainer/PanelContainer2"] +layout_mode = 2 +theme_override_constants/h_separation = 5 + +[node name="ConnectTerrainsButton" type="Button" parent="VBoxContainer/ScrollContainer/PanelContainer2/TileButtonContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +toggle_mode = true +button_group = ExtResource("5_wkw32") +icon = ExtResource("3_lefkq") + +[connection signal="value_changed" from="VBoxContainer/PanelContainer/HBoxContainer/RangeSliderWithLineEdit" to="." method="_on_range_slider_with_line_edit_value_changed"] +[connection signal="pressed" from="VBoxContainer/PanelContainer/HBoxContainer/BrushShapeSquareButton" to="." method="_on_brush_shape_square_button_pressed"] +[connection signal="pressed" from="VBoxContainer/PanelContainer/HBoxContainer/BrushShapeCircleButton" to="." method="_on_brush_shape_circle_button_pressed"] diff --git a/addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres b/addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres new file mode 100644 index 0000000..08d31b4 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres @@ -0,0 +1,5 @@ +[gd_resource type="ButtonGroup" format=3 uid="uid://dtpx52d0n4ff1"] + +[resource] +resource_local_to_scene = false +allow_unpress = true diff --git a/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd b/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd new file mode 100644 index 0000000..734f057 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd @@ -0,0 +1,694 @@ +@tool +extends Control +class_name EZTilesDrawDock + +enum NeighbourMode {OVERWRITE, PEERING_BIT, INCLUSIVE, EXCLUSIVE} +enum DragMode {BRUSH, AREA, STAMP, SNAPSHOT} + +const EZ_TILE_CUSTOM_META := "_is_ez_tiles_generated" + +var StampScene : PackedScene +var StampTileScene : PackedScene +var TerrainPickerEntryScene : PackedScene +var under_edit : TileMapLayer = null +var hint_label : Label +var main_container : Control +var default_editor_check_button : Button +var terrain_list_container : VBoxContainer +var drag_start := Vector2i.ZERO +var drag_mode := DragMode.BRUSH + +var remembered_cells := {} +var viewport_has_mouse := false +var lmb_is_down := false +var rmb_is_down := false +var current_terrain_id := 0 +var neighbour_mode := NeighbourMode.OVERWRITE +var suppress_preview := false +var using_eraser := false +var undo_redo : EditorUndoRedoManager + +var area_draw_tab : AreaDraw +var brush_tab : BrushDraw +var stamp_tab : StampTab + +var area_draw_toggle_button : Button +var brush_draw_toggle_button : Button +var stamp_draw_toggle_button : Button +var select_snap_shot_button : Button +var eraser_button : Button + +var connect_toggle_button : Button +var connect_icon_connected : Texture2D +var connect_icon_disconnected : Texture2D +var neighbor_mode_option_button : OptionButton + +const EZ_NEIGHBOUR_MAP := { + "....O...." : Vector2i.ZERO, + "....OX..." : Vector2i(0,3), + "....O..X." : Vector2i(1,0), + ".X..O..X." : Vector2i(1,1), + ".X..O...." : Vector2i(1,2), + "...XOX..." : Vector2i(1,3), + "...XO...." : Vector2i(2,3), + "....OX.X." : Vector2i(3,0), + ".X..OX.X." : Vector2i(3,1), + ".X..OX..." : Vector2i(3,2), + "...XOX.X." : Vector2i(4,0), + ".X.XOX.X." : Vector2i(4,1), + ".X.XOX..." : Vector2i(4,2), + "...XO..X." : Vector2i(5,0), + ".X.XO..X." : Vector2i(5,1), + ".X.XO...." : Vector2i(5,2) +} + + +func _enter_tree() -> void: + StampScene = preload("res://addons/ez_tiles/ez_tiles_draw/stamp.tscn") + StampTileScene = preload("res://addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn") + TerrainPickerEntryScene = preload("res://addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.tscn") + hint_label = find_child("HintLabel") + main_container = find_child("MainVBoxContainer") + default_editor_check_button = find_child("DefaultEditorCheckButton") + terrain_list_container = find_child("TerrainListVboxContainer") + area_draw_tab = find_child("Area Draw") + brush_tab = find_child("Brush Draw") + stamp_tab = find_child("Stamp") + area_draw_toggle_button = find_child("AreaDrawButton") + brush_draw_toggle_button = find_child("BrushDrawButton") + stamp_draw_toggle_button = find_child("StampDrawButton") + select_snap_shot_button = find_child("SelectSnapShotButton") + eraser_button = find_child("EraserButton") + connect_toggle_button = find_child("ConnectingToggle") + connect_icon_disconnected = preload("res://addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg") + connect_icon_connected = preload("res://addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg") + neighbor_mode_option_button = find_child("NeighbourModeOptionButton") + + +func activate(node : TileMapLayer): + current_terrain_id = 0 + remembered_cells = {} + under_edit = node + hint_label.hide() + main_container.show() + + for child in terrain_list_container.get_children(): + if is_instance_valid(child): + child.queue_free() + + if under_edit.tile_set.get_terrain_sets_count() > 0: + for terrain_id in range(under_edit.tile_set.get_terrains_count(0)): + var entry : TerrainPickerEntry = TerrainPickerEntryScene.instantiate() + entry.terrain_name = under_edit.tile_set.get_terrain_name(0, terrain_id) + entry.texture_resource = _get_first_texture_for_terrain(terrain_id) + entry.terrain_id = terrain_id + entry.selected.connect(_on_terrain_selected) + terrain_list_container.add_child(entry) + area_draw_tab.update_grid_preview( + _get_first_texture_for_terrain(current_terrain_id), + under_edit.tile_set.tile_size) + + brush_tab.update_tile_buttons( + _get_first_tileset_source_for_terrain(current_terrain_id), + under_edit.tile_set.tile_size) + + if under_edit.has_meta(EZ_TILE_CUSTOM_META): + default_editor_check_button.button_pressed = true + else: + default_editor_check_button.button_pressed = false + + stamp_tab.show_stamps_for_tile_map_layer(under_edit) + + +func _get_first_source_id_for_terrain(terrain_id : int) -> int: + for i in range(under_edit.tile_set.get_source_count()): + var source_id := under_edit.tile_set.get_source_id(i) + var source : TileSetAtlasSource = under_edit.tile_set.get_source(source_id) + if source.get_tiles_count() > 0: + for j in source.get_tiles_count(): + var tile_data = source.get_tile_data(source.get_tile_id(j), 0) + if tile_data.terrain == terrain_id: + return source_id + printerr("Terrain %d not found in tile set sources: " % terrain_id) + return terrain_id # assume equal in case of inconsistent data + + +func _get_first_texture_for_terrain(terrain_id : int) -> Texture2D: + var source := _get_first_tileset_source_for_terrain(terrain_id) + if is_instance_valid(source): + return source.texture + return null + + +func _get_first_tileset_source_for_terrain(terrain_id : int) -> TileSetAtlasSource: + for i in range(under_edit.tile_set.get_source_count()): + var source_id := under_edit.tile_set.get_source_id(i) + var source : TileSetAtlasSource = under_edit.tile_set.get_source(source_id) + if source.get_tiles_count() > 0: + for j in source.get_tiles_count(): + var tile_data = source.get_tile_data(source.get_tile_id(j), 0) + if tile_data.terrain == terrain_id: + return source + printerr("Terrain %d not found in tile set sources: " % terrain_id) + return null + + +func deactivate(): + under_edit = null + hint_label.show() + main_container.hide() + + +func _on_terrain_selected(id : int) -> void: + current_terrain_id = id + area_draw_tab.update_grid_preview( + _get_first_texture_for_terrain(id), under_edit.tile_set.tile_size) + brush_tab.update_tile_buttons( + _get_first_tileset_source_for_terrain(id), under_edit.tile_set.tile_size) + if neighbour_mode != NeighbourMode.OVERWRITE: + brush_tab.connect_terrains_button.button_pressed = true + + if stamp_tab.visible: + brush_tab.show() + + +func _place_back_remembered_cells() -> void: + for prev_pos in remembered_cells.keys(): + if remembered_cells[prev_pos][0] > -1: + under_edit.set_cell(prev_pos, remembered_cells[prev_pos][0], remembered_cells[prev_pos][1]) + else: + under_edit.erase_cell(prev_pos) + remembered_cells.clear() + + +func _remember_cell(tile_pos : Vector2i) -> void: + if under_edit.get_cell_source_id(tile_pos) > -1: + remembered_cells[tile_pos] = [under_edit.get_cell_source_id(tile_pos), under_edit.get_cell_atlas_coords(tile_pos)] + else: + remembered_cells[tile_pos] = [-1, Vector2i.ZERO] + + +func _take_snapshot(drag_end : Vector2i) -> void: + var stamp : Stamp = StampScene.instantiate() + var from_x := drag_start.x if drag_start.x < drag_end.x else drag_end.x + var to_x := drag_start.x if drag_start.x > drag_end.x else drag_end.x + var from_y := drag_start.y if drag_start.y < drag_end.y else drag_end.y + var to_y := drag_start.y if drag_start.y > drag_end.y else drag_end.y + stamp.stamp_size = Vector2i(to_x - from_x + 1, to_y - from_y + 1) + var stamp_tile_size := Vector2(under_edit.tile_set.tile_size) + while (stamp.stamp_size.x * stamp_tile_size.x) > 512: + stamp_tile_size *= 0.5 + + for y in range(from_y, to_y + 1): + for x in range(from_x, to_x + 1): + var tile_pos := Vector2i(x, y) + var stamp_tile : TextureRect = StampTileScene.instantiate() + stamp_tile.custom_minimum_size = Vector2i(stamp_tile_size) + if under_edit.get_cell_source_id(tile_pos) > -1: + stamp.stamp_cell_data[Vector2i(x - from_x, y - from_y)] = [under_edit.get_cell_source_id(tile_pos), under_edit.get_cell_atlas_coords(tile_pos)] + stamp_tile.texture = AtlasTexture.new() + stamp_tile.texture.atlas = under_edit.tile_set.get_source(under_edit.get_cell_source_id(tile_pos)).texture + stamp_tile.texture.region = Rect2i( + under_edit.get_cell_atlas_coords(tile_pos) * under_edit.tile_set.tile_size, + under_edit.tile_set.tile_size) + else: + stamp.stamp_cell_data[Vector2i(x - from_x, y - from_y)] = [-1, Vector2i.ZERO] + stamp.tile_textures.append(stamp_tile) + stamp.tile_map_layer_under_edit = under_edit + stamp_tab.add_stamp(stamp) + + +func _grow_cells(area_cells : Array, diagonal := false, base_dir := Vector2i.ZERO) -> Array: + var expanded_region := {} + for cell in area_cells: + if cell not in expanded_region: + expanded_region[cell] = true + for neighour in _get_neighbors(cell, diagonal, base_dir): + if neighour not in expanded_region: + expanded_region[neighour] = true + return expanded_region.keys() + +func _straighten_line_direction(from : Vector2i, to : Vector2i) -> Vector2: + var angle := fmod(rad_to_deg(Vector2(from).angle_to_point(Vector2(to))), 360) + if angle < 0: + angle += 360 + match(snappedi(angle, 45)): + 45: + return Vector2(0.7071, 0.7071) + 90: + return Vector2.DOWN + 135: + return Vector2(-0.7071, 0.7071) + 180: + return Vector2.LEFT + 225: + return Vector2(-0.7071, -0.7071) + 270: + return Vector2.UP + 315: + return Vector2(0.7071, -0.7071) + 0, 360, _: + return Vector2.RIGHT + +func _get_brush_sized_line(from : Vector2i, cell : Dictionary) -> Dictionary: + var to := cell.keys()[0] as Vector2i + var direction = _straighten_line_direction(from, to) + var cur := Vector2(from) + var out := {} + for _i in range(floor(from.distance_to(to))): + cur += direction + out.merge(_get_brush_for_cell({Vector2i(cur.floor()): cell.values()[0]})) + return out + + +func _get_brush_for_cell(cell : Dictionary) -> Dictionary: + if brush_tab.brush_size == 1: + return cell + + var out := Dictionary() + var cur_keys := [] + if brush_tab.brush_shape == BrushDraw.BrushShape.SQUARE: + var middle : Vector2i = cell.keys()[0] + Vector2i.ONE + for x in range(middle.x - ceil(brush_tab.brush_size / 2.0), middle.x + floor(brush_tab.brush_size / 2.0)): + for y in range(middle.y - ceil(brush_tab.brush_size / 2.0), middle.y + floor(brush_tab.brush_size / 2.0)): + cur_keys.append(Vector2i(x, y)) + elif brush_tab.brush_shape == BrushDraw.BrushShape.CIRCLE: + var m : Vector2i = cell.keys()[0] + var sz := brush_tab.brush_size + for x in range(m.x - sz - 1, m.x + sz + 1): + for y in range(m.y - sz - 1, m.y + sz + 1): + if Vector2i(x, y).distance_to(m) <= sz * 0.67: + cur_keys.append(Vector2i(x, y)) + for k in cur_keys: + out[k] = cell.values()[0] + return out + + +func _get_sized_brush(cell : Dictionary) -> Dictionary: + if Input.is_key_pressed(KEY_SHIFT): + return _get_brush_sized_line(drag_start, cell) + + return _get_brush_for_cell(cell) + + +func _get_stamp_placement_area(stamp : Stamp, tile_pos : Vector2i, include_empty_cells := false) -> Array[Vector2i]: + var out : Array[Vector2i] = [] + for stamp_tile_pos in stamp.stamp_cell_data.keys(): + if stamp.stamp_cell_data[stamp_tile_pos][0] > -1 or include_empty_cells: + out.append(tile_pos + stamp_tile_pos) + + return out + + +func _place_stamp_preview(stamp : Stamp, cursor_tile_pos : Vector2i) -> void: + var overwrite_with_empty_cells := Input.is_key_pressed(KEY_SHIFT) + var stamp_plc_area := _get_stamp_placement_area(stamp, cursor_tile_pos, overwrite_with_empty_cells) + var all_cells = _grow_cells(stamp_plc_area, neighbour_mode == NeighbourMode.PEERING_BIT) + for tile_pos in all_cells: + _remember_cell(tile_pos) + + for stamp_tile_pos in stamp.stamp_cell_data.keys(): + if stamp.stamp_cell_data[stamp_tile_pos][0] > -1: + under_edit.set_cell(cursor_tile_pos + stamp_tile_pos, stamp.stamp_cell_data[stamp_tile_pos][0], + stamp.stamp_cell_data[stamp_tile_pos][1]) + elif overwrite_with_empty_cells: + under_edit.erase_cell(cursor_tile_pos + stamp_tile_pos) + if neighbour_mode != NeighbourMode.PEERING_BIT and neighbour_mode != NeighbourMode.OVERWRITE: + _update_atlas_coords(_get_neighbors(cursor_tile_pos + stamp_tile_pos)) + + if neighbour_mode == NeighbourMode.PEERING_BIT: + for tile_pos in stamp_plc_area: + under_edit.set_cells_terrain_connect([tile_pos], 0, under_edit.get_cell_source_id(tile_pos), true) + + +func _place_cells_preview(cells_in_current_draw_area : Dictionary, terrain_id : int) -> void: + var all_cells := _grow_cells(cells_in_current_draw_area.keys(), neighbour_mode == NeighbourMode.PEERING_BIT) + for tile_pos in all_cells: + _remember_cell(tile_pos) + + for tile_pos in cells_in_current_draw_area: + if terrain_id < 0: + under_edit.erase_cell(tile_pos) + else: + var coord : Vector2i = ( + cells_in_current_draw_area[tile_pos] if neighbour_mode == NeighbourMode.OVERWRITE + else _get_ez_atlas_coord(tile_pos, terrain_id) + ) + under_edit.set_cell(tile_pos, _get_first_source_id_for_terrain(terrain_id), coord) + if neighbour_mode != NeighbourMode.PEERING_BIT and neighbour_mode != NeighbourMode.OVERWRITE: + _update_atlas_coords(_get_neighbors(tile_pos)) + + if neighbour_mode == NeighbourMode.PEERING_BIT: + under_edit.set_cells_terrain_connect(cells_in_current_draw_area.keys(), 0, terrain_id, true) + + +func _commit_cell_placement(cells_in_current_draw_area : Array) -> void: + undo_redo.create_action("Update cells in: " + under_edit.name) + for cell in remembered_cells: + if remembered_cells[cell][0] < 0: + undo_redo.add_undo_method(under_edit, "erase_cell", cell) + else: + undo_redo.add_undo_method(under_edit, "set_cell", cell, + remembered_cells[cell][0], remembered_cells[cell][1]) + remembered_cells.clear() + for cell in _grow_cells(cells_in_current_draw_area): + if under_edit.get_cell_source_id(cell) > -1: + undo_redo.add_do_method(under_edit, "set_cell", cell, + under_edit.get_cell_source_id(cell), + under_edit.get_cell_atlas_coords(cell)) + else: + undo_redo.add_do_method(under_edit, "erase_cell", cell) + undo_redo.commit_action(false) + + +func _update_atlas_coords(cells : Array[Vector2i]) -> void: + for tile_pos in cells: + under_edit.set_cell(tile_pos, under_edit.get_cell_source_id(tile_pos), + _get_ez_atlas_coord(tile_pos, under_edit.get_cell_source_id(tile_pos))) + + +func _erase_cells(cells : Dictionary): + # prevent current preview placement from being added to the undo list + if drag_mode == DragMode.BRUSH: + for cell in cells.keys(): + if cell in remembered_cells and remembered_cells[cell][0] > -1: + under_edit.set_cell(cell, remembered_cells[cell][0], remembered_cells[cell][1]) + else: + under_edit.erase_cell(cell) + _place_cells_preview(cells, -1) + + +func _get_neighbors(tile_pos : Vector2i, diagonal := false, base_dir := Vector2i.ZERO) -> Array[Vector2i]: + if base_dir: + return [ + tile_pos + base_dir, + tile_pos + Vector2i(base_dir.x , 0), + tile_pos + Vector2i(0, base_dir.y) + ] + if diagonal: + return [ + tile_pos + Vector2i.LEFT, + tile_pos + Vector2i.UP, + tile_pos + Vector2i.DOWN, + tile_pos + Vector2i.RIGHT, + tile_pos - Vector2i.ONE, + tile_pos + Vector2i.ONE, + tile_pos + Vector2i(-1, 1), + tile_pos + Vector2i(1, -1) + ] + return [tile_pos + Vector2i.LEFT, tile_pos + Vector2i.UP, tile_pos + Vector2i.DOWN, tile_pos + Vector2i.RIGHT] + + +func _consider_a_neighbour(cell : Vector2i, for_source_id : int) -> bool: + var neighbour_source_id := under_edit.get_cell_source_id(cell) + match(neighbour_mode): + NeighbourMode.INCLUSIVE: + return neighbour_source_id > -1 + NeighbourMode.EXCLUSIVE: + return neighbour_source_id > -1 and neighbour_source_id == for_source_id + NeighbourMode.OVERWRITE: + printerr("illegal state: should not be considering neighbours") + return false + NeighbourMode.PEERING_BIT: + printerr("illegal state: should invoke `under_edit.set_cells_terrain_connect`") + return false + return false + + +func _get_ez_atlas_coord(tile_pos : Vector2i, for_terrain_id : int) -> Vector2i: + if neighbour_mode == NeighbourMode.PEERING_BIT: + var source := _get_first_tileset_source_for_terrain(for_terrain_id) + for id in range(source.get_tiles_count()): + return source.get_tile_id(id) + printerr("could not find a tile in terrain: " + str(for_terrain_id)) + return Vector2i.ZERO + # EZ Tiles considers the source_id to be equal to the terrain_id + # Therefore, in these modes the complexity of searching the correct texture is lost + # (thus, making things EZ. is a lot less flexible) + # - In inclusive mode all terrains in neighboring tiles are considered to be the same terrain + # - in exclusive mode the terrains from the exact same TileSetSource are considered the same terrain + var l = "X" if _consider_a_neighbour(tile_pos + Vector2i.LEFT, for_terrain_id) else "." + var r = "X" if _consider_a_neighbour(tile_pos + Vector2i.RIGHT, for_terrain_id) else "."; + var t = "X" if _consider_a_neighbour(tile_pos + Vector2i.UP, for_terrain_id) else "." + var b = "X" if _consider_a_neighbour(tile_pos + Vector2i.DOWN, for_terrain_id) else "."; + + var fmt = ".%s.%sO%s.%s." % [t, l, r, b] + return EZ_NEIGHBOUR_MAP[fmt] if fmt in EZ_NEIGHBOUR_MAP else Vector2i.ZERO + + +func get_draw_rect(tile_pos : Vector2i) -> Rect2i: + match(drag_mode): + DragMode.SNAPSHOT: + if lmb_is_down: + var from_x := drag_start.x if drag_start.x < tile_pos.x else tile_pos.x + var to_x := drag_start.x if drag_start.x > tile_pos.x else tile_pos.x + var from_y := drag_start.y if drag_start.y < tile_pos.y else tile_pos.y + var to_y := drag_start.y if drag_start.y > tile_pos.y else tile_pos.y + return Rect2i(Vector2i(from_x, from_y), Vector2i(to_x, to_y) - Vector2i(from_x, from_y) + Vector2i.ONE) + else: + return Rect2i(tile_pos, Vector2i.ONE) + DragMode.AREA: + if rmb_is_down or lmb_is_down: + var from_x := drag_start.x if drag_start.x < tile_pos.x else tile_pos.x + var to_x := drag_start.x if drag_start.x > tile_pos.x else tile_pos.x + var from_y := drag_start.y if drag_start.y < tile_pos.y else tile_pos.y + var to_y := drag_start.y if drag_start.y > tile_pos.y else tile_pos.y + return Rect2i(Vector2i(from_x, from_y), Vector2i(to_x, to_y) - Vector2i(from_x, from_y) + Vector2i.ONE) + else: + return Rect2i(tile_pos, Vector2i.ONE) + DragMode.STAMP: + var stamp := stamp_tab.get_selected_stamp() + if is_instance_valid(stamp): + return Rect2i(tile_pos, stamp.stamp_size) + else: + Rect2i() + DragMode.BRUSH, _: + return Rect2i() + return Rect2i() + + +func get_draw_area(tile_pos : Vector2i) -> Array: + match(drag_mode): + DragMode.SNAPSHOT: + return [] + DragMode.AREA: + if rmb_is_down or lmb_is_down: + return _get_draw_shape_for_area(drag_start, tile_pos).keys() + else: + return [] + DragMode.BRUSH: + return _get_sized_brush({tile_pos: Vector2.ZERO}).keys() + _: + return [] + +func _get_draw_shape_for_area(p1 : Vector2i, p2 : Vector2i, for_shape : AreaDraw.Shape = area_draw_tab.shape) -> Dictionary: + var from_x := p1.x if p1.x < p2.x else p2.x + var to_x := p1.x if p1.x > p2.x else p2.x + var from_y := p1.y if p1.y < p2.y else p2.y + var to_y := p1.y if p1.y > p2.y else p2.y + + match(for_shape): + AreaDraw.Shape.RECTANGLE_BASIC: + return AreaDraw.get_cells_rectangle_basic(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.HARD_RECTANGLE: + return AreaDraw.get_cells_rectangle(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.RECTANGLE: + return AreaDraw.get_cells_rectangle(Vector2i(from_x, from_y), Vector2i(to_x, to_y), true) + AreaDraw.Shape.SLOPE_TL: + return AreaDraw.get_cells_slope_tl(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.SLOPE_BL: + return AreaDraw.get_cells_slope_bl(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.SLOPE_TR: + return AreaDraw.get_cells_slope_tr(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.SLOPE_BR: + return AreaDraw.get_cells_slope_br(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.HILL_TOP: + return AreaDraw.get_cells_hill_top(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.HILL_BOTTOM: + return AreaDraw.get_cells_hill_bottom(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.HILL_LEFT: + return AreaDraw.get_cells_hill_left(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.HILL_RIGHT: + return AreaDraw.get_cells_hill_right(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + AreaDraw.Shape.ISLAND: + return AreaDraw.get_cells_island(Vector2i(from_x, from_y), Vector2i(to_x, to_y)) + return {} + + +func handle_mouse_move(tile_pos : Vector2i) -> void: + if suppress_preview: + pass + if is_instance_valid(under_edit): + if drag_mode == DragMode.BRUSH: + _place_back_remembered_cells() + if using_eraser: + _place_cells_preview(_get_sized_brush({tile_pos: brush_tab.tile_coords}), -1) + else: + _place_cells_preview(_get_sized_brush({tile_pos: brush_tab.tile_coords}), current_terrain_id) + if lmb_is_down: + _commit_cell_placement(_get_sized_brush({tile_pos: brush_tab.tile_coords}).keys()) + + elif drag_mode == DragMode.AREA: + _place_back_remembered_cells() + if rmb_is_down or (using_eraser and lmb_is_down): + _erase_cells(_get_draw_shape_for_area(drag_start, tile_pos, AreaDraw.Shape.RECTANGLE)) + elif lmb_is_down: + _place_cells_preview(_get_draw_shape_for_area(drag_start, tile_pos), current_terrain_id) + + elif drag_mode == DragMode.STAMP: + _place_back_remembered_cells() + var stamp := stamp_tab.get_selected_stamp() + if is_instance_valid(stamp): + _place_stamp_preview(stamp, tile_pos) + + +func handle_mouse_up(button : MouseButton, tile_pos: Vector2i): + rmb_is_down = false if button == MouseButton.MOUSE_BUTTON_RIGHT else rmb_is_down + lmb_is_down = false if button == MouseButton.MOUSE_BUTTON_LEFT else lmb_is_down + + if button == MouseButton.MOUSE_BUTTON_RIGHT or (using_eraser and button == MouseButton.MOUSE_BUTTON_LEFT): + if drag_mode == DragMode.AREA: + _commit_cell_placement(_get_draw_shape_for_area(drag_start, tile_pos, AreaDraw.Shape.RECTANGLE).keys()) + elif button == MouseButton.MOUSE_BUTTON_LEFT: + if drag_mode == DragMode.AREA: + _commit_cell_placement(_get_draw_shape_for_area(drag_start, tile_pos).keys()) + if drag_mode == DragMode.SNAPSHOT: + _take_snapshot(tile_pos) + _on_stamp_snapshot_toggled(false) + if drag_mode == DragMode.STAMP: + var stamp := stamp_tab.get_selected_stamp() + if is_instance_valid(stamp): + _commit_cell_placement(_get_stamp_placement_area(stamp, tile_pos)) + + + + +func handle_mouse_down(button : MouseButton, tile_pos: Vector2i): + drag_start = tile_pos + rmb_is_down = true if button == MouseButton.MOUSE_BUTTON_RIGHT else rmb_is_down + lmb_is_down = true if button == MouseButton.MOUSE_BUTTON_LEFT else lmb_is_down + + if using_eraser and button == MouseButton.MOUSE_BUTTON_RIGHT: + eraser_button.button_pressed = false + if drag_mode == DragMode.BRUSH: + _place_back_remembered_cells() + elif button == MouseButton.MOUSE_BUTTON_RIGHT: + if drag_mode == DragMode.AREA and not suppress_preview: + _place_back_remembered_cells() + _erase_cells(_get_draw_shape_for_area(drag_start, tile_pos)) + elif drag_mode == DragMode.BRUSH: + _place_back_remembered_cells() + area_draw_toggle_button.button_pressed = true + area_draw_tab.show() + elif drag_mode == DragMode.SNAPSHOT: + _on_stamp_snapshot_toggled(false) + elif drag_mode == DragMode.STAMP: + var stamp := stamp_tab.get_selected_stamp() + if is_instance_valid(stamp): + _place_back_remembered_cells() + stamp.deselect() + elif button == MouseButton.MOUSE_BUTTON_LEFT: + if drag_mode == DragMode.AREA and not suppress_preview: + _place_back_remembered_cells() + _place_cells_preview(_get_draw_shape_for_area(drag_start, tile_pos), current_terrain_id) + elif drag_mode == DragMode.BRUSH: + _commit_cell_placement(_get_sized_brush({tile_pos: brush_tab.tile_coords}).keys()) + + + +func handle_mouse_entered(): + viewport_has_mouse = true + remembered_cells.clear() + + +func handle_mouse_out(): + viewport_has_mouse = false + if not lmb_is_down: + _place_back_remembered_cells() + + +func _on_area_draw_button_pressed() -> void: + area_draw_tab.show() + + +func _on_brush_draw_button_pressed() -> void: + brush_tab.show() + + +func _on_stamp_draw_button_pressed() -> void: + stamp_tab.show() + + +func _on_stamp_snapshot_toggled(on_off: bool) -> void: + select_snap_shot_button.button_pressed = on_off + if on_off: + stamp_tab.show() + stamp_tab.start_snapshot() + drag_mode = DragMode.SNAPSHOT + else: + stamp_tab.stop_snapshotting() + select_snap_shot_button.focus_mode = Control.FOCUS_NONE + drag_mode = DragMode.STAMP + + +func _on_default_editor_check_button_toggled(toggled_on: bool) -> void: + if toggled_on: + under_edit.set_meta(EZ_TILE_CUSTOM_META, true) + else: + under_edit.remove_meta(EZ_TILE_CUSTOM_META) + + +func _on_tab_container_tab_changed(tab: DragMode) -> void: + drag_mode = tab + if tab != DragMode.STAMP: + stamp_tab.stop_snapshotting() + select_snap_shot_button.button_pressed = false + + match(drag_mode): + DragMode.AREA: + area_draw_toggle_button.button_pressed = true + eraser_button.disabled = false + DragMode.BRUSH: + brush_draw_toggle_button.button_pressed = true + eraser_button.disabled = false + DragMode.STAMP: + stamp_draw_toggle_button.button_pressed = true + eraser_button.button_pressed = false + eraser_button.disabled = true + + +func _on_neighbour_mode_option_button_item_selected(index: NeighbourMode) -> void: + neighbour_mode = index + if neighbour_mode == NeighbourMode.OVERWRITE: + connect_toggle_button.icon = connect_icon_disconnected + connect_toggle_button.button_pressed = false + brush_tab.toggle_off_connected_brush() + area_draw_tab.find_child("TileButton1").button_pressed = true + else: + connect_toggle_button.icon = connect_icon_connected + connect_toggle_button.button_pressed = true + brush_tab.connect_terrains_button.button_pressed = true + area_draw_tab.connect_terrains_button.button_pressed = true + + +func _on_connecting_toggle_toggled(toggled_on: bool) -> void: + if toggled_on: + connect_toggle_button.icon = connect_icon_connected + connect_toggle_button.button_pressed = true + if neighbour_mode == NeighbourMode.OVERWRITE: + neighbour_mode = NeighbourMode.PEERING_BIT + neighbor_mode_option_button.selected = NeighbourMode.PEERING_BIT + brush_tab.connect_terrains_button.button_pressed = true + area_draw_tab.connect_terrains_button.button_pressed = true + # else it's already in a connected mode + else: + connect_toggle_button.icon = connect_icon_disconnected + connect_toggle_button.button_pressed = false + neighbour_mode = NeighbourMode.OVERWRITE + neighbor_mode_option_button.selected = NeighbourMode.OVERWRITE + brush_tab.toggle_off_connected_brush() + area_draw_tab.find_child("TileButton1").button_pressed = true + + +func _on_eraser_button_toggled(toggled_on: bool) -> void: + using_eraser = toggled_on diff --git a/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd.uid b/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd.uid new file mode 100644 index 0000000..8f353d0 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd.uid @@ -0,0 +1 @@ +uid://6bvphp60kmbq diff --git a/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.tscn b/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.tscn new file mode 100644 index 0000000..d061af8 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.tscn @@ -0,0 +1,169 @@ +[gd_scene load_steps=13 format=3 uid="uid://bylxp7tq3yo5s"] + +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd" id="1_wtbry"] +[ext_resource type="Texture2D" uid="uid://pyivvoarllad" path="res://addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg" id="2_dplls"] +[ext_resource type="PackedScene" uid="uid://bitqwiwmn3s0r" path="res://addons/ez_tiles/ez_tiles_draw/area_draw.tscn" id="2_k0y3s"] +[ext_resource type="Texture2D" uid="uid://dooqg3fapf15x" path="res://addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg" id="2_urupm"] +[ext_resource type="Texture2D" uid="uid://d10gshlv0aq2d" path="res://addons/ez_tiles/ez_tiles_draw/icons/Edit.svg" id="3_qgjav"] +[ext_resource type="Texture2D" uid="uid://dhhtq6kkxpaus" path="res://addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg" id="4_uxbhq"] +[ext_resource type="Texture2D" uid="uid://cj2hivk8xemhb" path="res://addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg" id="6_lleak"] +[ext_resource type="PackedScene" uid="uid://is8n20fchd2q" path="res://addons/ez_tiles/ez_tiles_draw/brush_draw.tscn" id="7_sh02n"] +[ext_resource type="Texture2D" uid="uid://bbpao1cndqvwr" path="res://addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg" id="7_vvdr0"] +[ext_resource type="PackedScene" uid="uid://catlvg1l82g5v" path="res://addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn" id="8_6lfv8"] + +[sub_resource type="ButtonGroup" id="ButtonGroup_m6mfs"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fl86h"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.12549, 0.145098, 0.172549, 1) + +[node name="EzTilesDrawDock" type="HBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_wtbry") + +[node name="MainVBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="MainVBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Determines how to connect neighbouring tiles. +- Overwrite/Ignore (draw over other tiles without connecting to them) +- Use Terrain Peering Bit (the Godot default way of connecting tiles) +- Inclusive (consider all terrains in my terrain set my neighbour - as per the EZ Tiles template) +- Exclusive (consider only my terrain - as per the EZ Tiles template - as neighbour) +" +mouse_filter = 0 +text = "Connect mode* " + +[node name="NeighbourModeOptionButton" type="OptionButton" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Determines in which cases a neighbouring tile is considered a neighbour. When a tile is considered a neighbour, this tile will act as if it is 'glued' to it." +selected = 0 +item_count = 4 +popup/item_0/text = "Overwrite" +popup/item_1/text = "Use Terrain Peering Bit" +popup/item_1/id = 3 +popup/item_2/text = "Inclusive" +popup/item_2/id = 1 +popup/item_3/text = "Exclusive" +popup/item_3/id = 2 + +[node name="ConnectingToggle" type="Button" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Toggle connected drawing off or on (See connect modes for more options)" +toggle_mode = true +icon = ExtResource("2_dplls") + +[node name="BrushDrawButton" type="Button" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Brush/Pencil draw (Square, Circle)" +toggle_mode = true +button_pressed = true +button_group = SubResource("ButtonGroup_m6mfs") +icon = ExtResource("3_qgjav") + +[node name="AreaDrawButton" type="Button" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Area draw (Rectangles, Slopes, Island)" +toggle_mode = true +button_group = SubResource("ButtonGroup_m6mfs") +icon = ExtResource("2_urupm") + +[node name="StampDrawButton" type="Button" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Stamp, Copy/Paste draw" +toggle_mode = true +button_group = SubResource("ButtonGroup_m6mfs") +icon = ExtResource("4_uxbhq") + +[node name="SelectSnapShotButton" type="Button" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Take snapshot for stamp" +toggle_mode = true +icon = ExtResource("6_lleak") + +[node name="EraserButton" type="Button" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +tooltip_text = "Eraser, toggle on the eraser to remove tiles with the left mouse button (this works the same as using the right mouse button). + +Can be used in both brush mode and in area mode." +toggle_mode = true +icon = ExtResource("7_vvdr0") + +[node name="DefaultEditorCheckButton" type="CheckButton" parent="MainVBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 10 +tooltip_text = "When you select a TileMapLayer in your scene, Godot will normally open the builtin TileMap or TileSet bottom pane. +When this toggle is on, EZ Tiles Draw will automatically open for the current TileMapLayer." +text = "Default Editor" + +[node name="MainHBoxContainer" type="HBoxContainer" parent="MainVBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="TerrainPickerScrollContainer" type="ScrollContainer" parent="MainVBoxContainer/MainHBoxContainer"] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_fl86h") +horizontal_scroll_mode = 0 + +[node name="TerrainListVboxContainer" type="VBoxContainer" parent="MainVBoxContainer/MainHBoxContainer/TerrainPickerScrollContainer"] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/separation = 10 + +[node name="TabContainer" type="TabContainer" parent="MainVBoxContainer/MainHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +current_tab = 0 + +[node name="Brush Draw" parent="MainVBoxContainer/MainHBoxContainer/TabContainer" instance=ExtResource("7_sh02n")] +layout_mode = 2 +metadata/_tab_index = 0 + +[node name="Area Draw" parent="MainVBoxContainer/MainHBoxContainer/TabContainer" instance=ExtResource("2_k0y3s")] +visible = false +clip_contents = true +layout_mode = 2 +metadata/_tab_index = 1 + +[node name="Stamp" parent="MainVBoxContainer/MainHBoxContainer/TabContainer" instance=ExtResource("8_6lfv8")] +visible = false +layout_mode = 2 + +[node name="HintLabel" type="Label" parent="."] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +text = "Select a TileMapLayer generated by EZ Tiles to use EZ Tiles Draw" +horizontal_alignment = 1 +vertical_alignment = 1 + +[connection signal="item_selected" from="MainVBoxContainer/HBoxContainer/NeighbourModeOptionButton" to="." method="_on_neighbour_mode_option_button_item_selected"] +[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/ConnectingToggle" to="." method="_on_connecting_toggle_toggled"] +[connection signal="pressed" from="MainVBoxContainer/HBoxContainer/BrushDrawButton" to="." method="_on_brush_draw_button_pressed"] +[connection signal="pressed" from="MainVBoxContainer/HBoxContainer/AreaDrawButton" to="." method="_on_area_draw_button_pressed"] +[connection signal="pressed" from="MainVBoxContainer/HBoxContainer/StampDrawButton" to="." method="_on_stamp_draw_button_pressed"] +[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/SelectSnapShotButton" to="." method="_on_stamp_snapshot_toggled"] +[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/EraserButton" to="." method="_on_eraser_button_toggled"] +[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/DefaultEditorCheckButton" to="." method="_on_default_editor_check_button_toggled"] +[connection signal="tab_changed" from="MainVBoxContainer/MainHBoxContainer/TabContainer" to="." method="_on_tab_container_tab_changed"] +[connection signal="connect_mode_toggled" from="MainVBoxContainer/MainHBoxContainer/TabContainer/Brush Draw" to="." method="_on_connecting_toggle_toggled"] +[connection signal="connect_mode_toggled" from="MainVBoxContainer/MainHBoxContainer/TabContainer/Area Draw" to="." method="_on_connecting_toggle_toggled"] +[connection signal="snapshot_toggled" from="MainVBoxContainer/MainHBoxContainer/TabContainer/Stamp" to="." method="_on_stamp_snapshot_toggled"] diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Circle.svg b/addons/ez_tiles/ez_tiles_draw/icons/Circle.svg new file mode 100644 index 0000000..21236ba --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Circle.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Circle.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Circle.svg.import new file mode 100644 index 0000000..2e39163 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Circle.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb3xfpcrmc8gc" +path="res://.godot/imported/Circle.svg-8d5a72a976af170c5462c4822817bc86.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Circle.svg" +dest_files=["res://.godot/imported/Circle.svg-8d5a72a976af170c5462c4822817bc86.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg b/addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg new file mode 100644 index 0000000..3167e57 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg.import new file mode 100644 index 0000000..acc871e --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pyivvoarllad" +path="res://.godot/imported/Connect1.svg-e03696726517e376a9f1cb9904cf4c39.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg" +dest_files=["res://.godot/imported/Connect1.svg-e03696726517e376a9f1cb9904cf4c39.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg b/addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg new file mode 100644 index 0000000..82cd45b --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg.import new file mode 100644 index 0000000..9d07170 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://un7sibaoyeeo" +path="res://.godot/imported/Connect2.svg-6e813cff05f022d485f4d95296800abe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg" +dest_files=["res://.godot/imported/Connect2.svg-6e813cff05f022d485f4d95296800abe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Edit.svg b/addons/ez_tiles/ez_tiles_draw/icons/Edit.svg new file mode 100644 index 0000000..7963e54 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Edit.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Edit.svg.import new file mode 100644 index 0000000..6130cfd --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Edit.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d10gshlv0aq2d" +path="res://.godot/imported/Edit.svg-206c08cdfe2c86e6e36fbd0ea67b4db7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Edit.svg" +dest_files=["res://.godot/imported/Edit.svg-206c08cdfe2c86e6e36fbd0ea67b4db7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg b/addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg new file mode 100644 index 0000000..ff8acce --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg.import new file mode 100644 index 0000000..8faa170 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbpao1cndqvwr" +path="res://.godot/imported/Eraser.svg-a188c3a7a38a6aac8c5d49fe081b58f3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg" +dest_files=["res://.godot/imported/Eraser.svg-a188c3a7a38a6aac8c5d49fe081b58f3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillB.svg b/addons/ez_tiles/ez_tiles_draw/icons/HillB.svg new file mode 100644 index 0000000..4eaf75e --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillB.svg @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillB.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/HillB.svg.import new file mode 100644 index 0000000..6312212 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillB.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dntkx0h8qim1n" +path="res://.godot/imported/HillB.svg-2b1e837b4005cfdb77e758705f71d6c7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillB.svg" +dest_files=["res://.godot/imported/HillB.svg-2b1e837b4005cfdb77e758705f71d6c7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillL.svg b/addons/ez_tiles/ez_tiles_draw/icons/HillL.svg new file mode 100644 index 0000000..6245b0d --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillL.svg @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillL.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/HillL.svg.import new file mode 100644 index 0000000..302e4d9 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillL.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dpmrju1gvdr16" +path="res://.godot/imported/HillL.svg-f186ea095ce3e10ae26d57f879ef2e31.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillL.svg" +dest_files=["res://.godot/imported/HillL.svg-f186ea095ce3e10ae26d57f879ef2e31.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillR.svg b/addons/ez_tiles/ez_tiles_draw/icons/HillR.svg new file mode 100644 index 0000000..3cc4005 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillR.svg @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillR.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/HillR.svg.import new file mode 100644 index 0000000..53e41fb --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillR.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dv855gccwqgu" +path="res://.godot/imported/HillR.svg-11714009d9d53e804e759b93eeefee15.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillR.svg" +dest_files=["res://.godot/imported/HillR.svg-11714009d9d53e804e759b93eeefee15.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillT.svg b/addons/ez_tiles/ez_tiles_draw/icons/HillT.svg new file mode 100644 index 0000000..ef5efa5 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillT.svg @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/HillT.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/HillT.svg.import new file mode 100644 index 0000000..ffe970c --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/HillT.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cri2mdk3hr6s1" +path="res://.godot/imported/HillT.svg-598ff05abd20ebbb7b4a78e8535c9357.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillT.svg" +dest_files=["res://.godot/imported/HillT.svg-598ff05abd20ebbb7b4a78e8535c9357.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Island.svg b/addons/ez_tiles/ez_tiles_draw/icons/Island.svg new file mode 100644 index 0000000..a0dfecf --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Island.svg @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Island.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Island.svg.import new file mode 100644 index 0000000..c36d891 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Island.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://frudvs8p10ea" +path="res://.godot/imported/Island.svg-7090cc71872006e2240c54753a4c52e7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Island.svg" +dest_files=["res://.godot/imported/Island.svg-7090cc71872006e2240c54753a4c52e7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg b/addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg new file mode 100644 index 0000000..7281929 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg.import new file mode 100644 index 0000000..a2a1ae7 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dooqg3fapf15x" +path="res://.godot/imported/Rectangle.svg-450f2673af07c8d154ef34ab8a606d56.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg" +dest_files=["res://.godot/imported/Rectangle.svg-450f2673af07c8d154ef34ab8a606d56.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg b/addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg new file mode 100644 index 0000000..e57d813 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg.import new file mode 100644 index 0000000..783f0f2 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xetkyyw6y8ff" +path="res://.godot/imported/RectangleSoft.svg-aded69f4f7c973cda80407dd5d1813e7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg" +dest_files=["res://.godot/imported/RectangleSoft.svg-aded69f4f7c973cda80407dd5d1813e7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Remove.svg b/addons/ez_tiles/ez_tiles_draw/icons/Remove.svg new file mode 100644 index 0000000..d2eb0f9 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Remove.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Remove.svg.import new file mode 100644 index 0000000..5dee57b --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Remove.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxcgf65bf2tjg" +path="res://.godot/imported/Remove.svg-d38ed9ddff4a945d6e8972b52d88ce61.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Remove.svg" +dest_files=["res://.godot/imported/Remove.svg-d38ed9ddff4a945d6e8972b52d88ce61.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg new file mode 100644 index 0000000..8f5d94a --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg.import new file mode 100644 index 0000000..98abebf --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://clpg11r4kdy8v" +path="res://.godot/imported/SlopeBL.svg-07bc9170ee5f32449d71bdf48e2aadac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg" +dest_files=["res://.godot/imported/SlopeBL.svg-07bc9170ee5f32449d71bdf48e2aadac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg new file mode 100644 index 0000000..d82a5c3 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg.import new file mode 100644 index 0000000..0cbfcde --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7crpolmxjj2r" +path="res://.godot/imported/SlopeBR.svg-3123c663666c02b499bb295c174e62d4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg" +dest_files=["res://.godot/imported/SlopeBR.svg-3123c663666c02b499bb295c174e62d4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg new file mode 100644 index 0000000..bfe710b --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg.import new file mode 100644 index 0000000..bc02611 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://behgjlyeldpdv" +path="res://.godot/imported/SlopeTL.svg-304f00192e035433e3ab5b565f2a3965.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg" +dest_files=["res://.godot/imported/SlopeTL.svg-304f00192e035433e3ab5b565f2a3965.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg new file mode 100644 index 0000000..061397f --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg.import new file mode 100644 index 0000000..e0fbdc9 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbjof7q6tq4d6" +path="res://.godot/imported/SlopeTR.svg-ea09242bcff8172bbe9a89e2498ebe9b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg" +dest_files=["res://.godot/imported/SlopeTR.svg-ea09242bcff8172bbe9a89e2498ebe9b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg b/addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg new file mode 100644 index 0000000..f81051c --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg @@ -0,0 +1,57 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg.import new file mode 100644 index 0000000..0b98a10 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://copno6ivhw1mu" +path="res://.godot/imported/SnapShot.svg-b7c8a5ed655ab3c8e1b1a7210c311ccc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg" +dest_files=["res://.godot/imported/SnapShot.svg-b7c8a5ed655ab3c8e1b1a7210c311ccc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg b/addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg new file mode 100644 index 0000000..253a69e --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg @@ -0,0 +1,57 @@ + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg.import new file mode 100644 index 0000000..52a321e --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cj2hivk8xemhb" +path="res://.godot/imported/SnapShotSmall.svg-77889c9725918cf955b4bf344be46c1f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg" +dest_files=["res://.godot/imported/SnapShotSmall.svg-77889c9725918cf955b4bf344be46c1f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Square.svg b/addons/ez_tiles/ez_tiles_draw/icons/Square.svg new file mode 100644 index 0000000..9d3e641 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Square.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Square.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Square.svg.import new file mode 100644 index 0000000..1ec395c --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Square.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bps21xe8h1m2p" +path="res://.godot/imported/Square.svg-4af37f8b017eb4ebfb0d5af72c78ca11.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Square.svg" +dest_files=["res://.godot/imported/Square.svg-4af37f8b017eb4ebfb0d5af72c78ca11.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg b/addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg new file mode 100644 index 0000000..7852d48 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg @@ -0,0 +1,34 @@ + + + + + + diff --git a/addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg.import new file mode 100644 index 0000000..1ab248c --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhhtq6kkxpaus" +path="res://.godot/imported/Stamp.svg-86e9268b7826ab5139d2b06f5a62e1ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg" +dest_files=["res://.godot/imported/Stamp.svg-86e9268b7826ab5139d2b06f5a62e1ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg b/addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg new file mode 100644 index 0000000..9d366c5 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg.import b/addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg.import new file mode 100644 index 0000000..15b4c02 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7u17hgk6jvet" +path="res://.godot/imported/TerrainConnect.svg-29259845b83ee65a5a268a56f0da6c20.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg" +dest_files=["res://.godot/imported/TerrainConnect.svg-29259845b83ee65a5a268a56f0da6c20.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/ez_tiles/ez_tiles_draw/plugin.cfg b/addons/ez_tiles/ez_tiles_draw/plugin.cfg new file mode 100644 index 0000000..e12d20a --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="EZ Tiles Draw" +description="" +author="" +version="" +script="ez_tiles_draw.gd" diff --git a/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd b/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd new file mode 100644 index 0000000..c190cbb --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd @@ -0,0 +1,51 @@ +@tool + +extends HBoxContainer + +signal value_changed(value : int) +var num_regex := RegEx.new() +var line_edit : LineEdit +var slider : HSlider +var my_value : int = 1 + +func _enter_tree() -> void: + num_regex.compile("^\\d+$") + line_edit = find_child("LineEdit") + slider = find_child("Slider") + + +func _on_slider_value_changed(value: float) -> void: + if int(value) != my_value: + my_value = int(value) + line_edit.text = str(my_value) + value_changed.emit(my_value) + + +func _on_line_edit_text_submitted(new_text: String) -> void: + var prev_value := my_value + if num_regex.search(new_text): + my_value = int(new_text) + if my_value < 0: + my_value = 1 + if my_value > slider.max_value: + my_value = int(slider.max_value) + + line_edit.text = str(my_value) + slider.value = float(my_value) + slider.grab_focus() + if prev_value != my_value: + value_changed.emit(my_value) + + +func _on_line_edit_text_changed(new_text: String) -> void: + var prev_value := my_value + if num_regex.search(new_text): + my_value = int(new_text) + if my_value < 0: + my_value = 1 + if my_value > slider.max_value: + my_value = int(slider.max_value) + line_edit.text = str(my_value) + slider.value = float(my_value) + if prev_value != my_value: + value_changed.emit(my_value) diff --git a/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd.uid b/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd.uid new file mode 100644 index 0000000..06ad244 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd.uid @@ -0,0 +1 @@ +uid://cu5gallcaxllu diff --git a/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.tscn b/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.tscn new file mode 100644 index 0000000..0e7c33d --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=2 format=3 uid="uid://chi7cp6qp6vki"] + +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.gd" id="1_6fi0e"] + +[node name="RangeSliderWithLineEdit" type="HBoxContainer"] +script = ExtResource("1_6fi0e") + +[node name="Slider" type="HSlider" parent="."] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 1 +min_value = 1.0 +max_value = 10.0 +value = 1.0 +rounded = true +allow_greater = true + +[node name="LineEdit" type="LineEdit" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_constants/minimum_character_width = 2 +text = "1" +alignment = 1 +select_all_on_focus = true + +[connection signal="value_changed" from="Slider" to="." method="_on_slider_value_changed"] +[connection signal="text_changed" from="LineEdit" to="." method="_on_line_edit_text_changed"] +[connection signal="text_submitted" from="LineEdit" to="." method="_on_line_edit_text_submitted"] diff --git a/addons/ez_tiles/ez_tiles_draw/stamp.gd b/addons/ez_tiles/ez_tiles_draw/stamp.gd new file mode 100644 index 0000000..647ae96 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/stamp.gd @@ -0,0 +1,56 @@ +@tool +extends PanelContainer + +class_name Stamp + +var style_box_normal : StyleBoxFlat +var style_box_hover : StyleBoxFlat +var style_box_selected : StyleBoxFlat +var grid_container : GridContainer +var is_selected := false +var stamp_size := Vector2i.ONE +var tile_textures : Array[TextureRect] = [] +var tile_map_layer_under_edit : TileMapLayer +var stamp_cell_data := {} + +signal selected() + + +func _enter_tree() -> void: + style_box_normal = preload("res://addons/ez_tiles/ez_tiles_draw/stamp.stylebox") + style_box_hover = preload("res://addons/ez_tiles/ez_tiles_draw/stamp_hover.stylebox") + style_box_selected = preload("res://addons/ez_tiles/ez_tiles_draw/stamp_selected.stylebox") + grid_container = find_child("GridContainer") + grid_container.columns = stamp_size.x + for tt in tile_textures: + grid_container.add_child(tt) + select() + + +func deselect(): + is_selected = false + add_theme_stylebox_override("panel", style_box_normal) + + +func _on_mouse_entered() -> void: + if not is_selected: + add_theme_stylebox_override("panel", style_box_hover) + + +func _on_mouse_exited() -> void: + if not is_selected: + add_theme_stylebox_override("panel", style_box_normal) + +func select(): + selected.emit() + is_selected = true + add_theme_stylebox_override("panel", style_box_selected) + + +func _on_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + select() + + +func _on_remove_button_pressed() -> void: + queue_free() diff --git a/addons/ez_tiles/ez_tiles_draw/stamp.gd.uid b/addons/ez_tiles/ez_tiles_draw/stamp.gd.uid new file mode 100644 index 0000000..b6ae88b --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/stamp.gd.uid @@ -0,0 +1 @@ +uid://bspv17eu4gm0k diff --git a/addons/ez_tiles/ez_tiles_draw/stamp.stylebox b/addons/ez_tiles/ez_tiles_draw/stamp.stylebox new file mode 100644 index 0000000000000000000000000000000000000000..87ddf0d7447ce72a17a087b43234c22542040944 GIT binary patch literal 468 zcmV;_0W1DeQ$s@n000005C8zK0{{TL0RR9fwJ-f(t^$<}047vLI8dc19Z-5;XJ%Fe z*F{BUc?ngmQ-4k???>e3@%;&ro9qR*ua*F<2rf}zq3ys`muLT16&UuRQ!@ZD05<^t zr*HOV&O=)xJE zj|YOI2?4;7xUPvp!hZq@r}S?uK0r1TN5|%+jR?g>T&)~+t)xv4 z9;!JsUCuEu5Htl_*p$v@)x=T&9;wbOp{YGr_HZZM*cjk{V>@4j6MYb)djlg3T8EW! zQ}BySt@2A+2(JkkszCouPkxFmlbH);*QM}j!3 Kzr^uUQ$s@p2G6Yk literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/ez_tiles_draw/stamp.tscn b/addons/ez_tiles/ez_tiles_draw/stamp.tscn new file mode 100644 index 0000000..2b09aed --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/stamp.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=5 format=3 uid="uid://cxwounoiwp4xo"] + +[ext_resource type="StyleBox" uid="uid://cebcvill7i7w6" path="res://addons/ez_tiles/ez_tiles_draw/stamp.stylebox" id="1_jeeam"] +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/stamp.gd" id="2_4618f"] +[ext_resource type="Texture2D" uid="uid://cxcgf65bf2tjg" path="res://addons/ez_tiles/ez_tiles_draw/icons/Remove.svg" id="3_a7o81"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4kexi"] +bg_color = Color(0, 0, 0, 0.223529) + +[node name="Stamp" type="PanelContainer"] +size_flags_horizontal = 0 +size_flags_vertical = 0 +mouse_default_cursor_shape = 2 +theme_override_styles/panel = ExtResource("1_jeeam") +script = ExtResource("2_4618f") + +[node name="GridContainer" type="GridContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +theme_override_constants/h_separation = 0 +theme_override_constants/v_separation = 0 +columns = 8 + +[node name="RemoveButton" type="Button" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +theme_override_colors/icon_normal_color = Color(0.63, 0.63, 0.63, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_4kexi") +icon = ExtResource("3_a7o81") + +[connection signal="gui_input" from="." to="." method="_on_gui_input"] +[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"] +[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] +[connection signal="pressed" from="RemoveButton" to="." method="_on_remove_button_pressed"] diff --git a/addons/ez_tiles/ez_tiles_draw/stamp_hover.stylebox b/addons/ez_tiles/ez_tiles_draw/stamp_hover.stylebox new file mode 100644 index 0000000000000000000000000000000000000000..ae5e577fac33d8581c8fb5d4e1b2e150177eda31 GIT binary patch literal 483 zcmV<90UZ8PQ$s@n000005C8zQ0{{Ta0RR9fwJ-f(v;qwd0LIivJWz)y9Z->pikUEg z>E>r90y?dDMzQ_ou=0LHZaUs3v2v5WO@ptNe0JsvrUnB5#H+e|n0~8zRp2#B0W<(I z0673`{g=Mko0RWdt2%BcpT*LxML%4Z{>S{s$OwQuAn?(^!TZS#h&xt>y7PbXzu`aR z|H2=RE~H%fwgBpXhSTl2mfIeM|0Sm^*>YF)Kk|&bxte%mSEQF~+?KazrJM1hFLOP& zXB+<$v`8(7YsUJbd@lBUTRk2Y#kw(kSiMLUIG+Yu8DB4?R9Il@C&EV^-AO49=gMj# zStPKAaSI-t4(EdUK!`wX7BHY93K)<;Jp5OPP@`XyNuWR@9YCP@XaGdxAg)%1x@OP~ zz?jpr*L89$V>{7Kbuxr+nm7VOsIff}DH=&5rA5sFU;+^}Wjhi8qvhoeS${kzqxlDcISj;%ru(SPA-H`aP|U!vqV}{`qAzKL9#1WMHLap#|Iz#OWZRo=(il ZSExkXsy~lGbqnAQ87Wa}?C?@kLqlo;+`9k( literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/ez_tiles_draw/stamp_selected.stylebox b/addons/ez_tiles/ez_tiles_draw/stamp_selected.stylebox new file mode 100644 index 0000000000000000000000000000000000000000..7d12c0e3baf0b8cf77ae189a8993ce79eb99203a GIT binary patch literal 497 zcmV z|0Dks{vGA!EJs_f|Cn$5asMmaa#MzGdp7>3+}2s4!>(twyIv9R5GJkWTJ6jm#M4oU z*_XMd95KGC(%}3*(4>V77?tt^-of1$c4w8=Pw=f74u&4k6teXH# zA{igmizlh?MdXG&`8q9oeJjUPwkvUUX$?rIaZM2^A|**_Q8NaB0udx-I}(7SaL*W} zjS?BOh1L2Q_)ACOV1|SzTBsoDcBSKHXV&W`fxA!nOA6~vO@S0Y!LZp#VoP8Tq4EKs zNpFPZ0iCwe*b9HdcDTGrgM*%us*Fz1Vz$X)m|x&^{1>!$+(1x*YLQ=s;zO(phzH4< nFH~awkeK void: + h_flow_container = find_child("HFlowContainer") + snapshot_button = find_child("SnapShotSelectButton") + for stamp : Stamp in find_children("Stamp*"): + stamp.selected.connect(func(): _on_stamp_selected(stamp)) + + +func _on_stamp_selected(selected_stamp : Stamp): + snapshot_button.button_pressed = false + snapshot_button.focus_mode = Control.FOCUS_NONE + for child in h_flow_container.get_children(): + if is_instance_valid(child) and child != selected_stamp and child is Stamp: + child.deselect() + snapshot_toggled.emit(false) + + +func add_stamp(stamp : Stamp): + stamp.selected.connect(func(): _on_stamp_selected(stamp)) + h_flow_container.add_child(stamp) + + +func get_selected_stamp() -> Stamp: + for child in h_flow_container.get_children(): + if is_instance_valid(child) and child is Stamp and child.is_selected and child.visible: + return child + return null + +func start_snapshot(): + snapshot_button.button_pressed = true + for child in h_flow_container.get_children(): + if is_instance_valid(child) and child is Stamp: + child.deselect() + + +func stop_snapshotting(): + snapshot_button.button_pressed = false + + +func _on_snap_shot_select_button_toggled(toggled_on: bool) -> void: + snapshot_toggled.emit(toggled_on) + + +func show_stamps_for_tile_map_layer(tml : TileMapLayer) -> void: + for child in h_flow_container.get_children(): + if child is Stamp: + if child.tile_map_layer_under_edit == tml: + child.show() + else: + child.hide() diff --git a/addons/ez_tiles/ez_tiles_draw/stamp_tab.gd.uid b/addons/ez_tiles/ez_tiles_draw/stamp_tab.gd.uid new file mode 100644 index 0000000..d130351 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/stamp_tab.gd.uid @@ -0,0 +1 @@ +uid://b0j87ylb537s0 diff --git a/addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn b/addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn new file mode 100644 index 0000000..ab671a0 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=4 format=3 uid="uid://catlvg1l82g5v"] + +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/stamp_tab.gd" id="1_c1kw7"] +[ext_resource type="Texture2D" uid="uid://copno6ivhw1mu" path="res://addons/ez_tiles/ez_tiles_draw/icons/SnapShot.svg" id="1_jqf6j"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_q6lwj"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 + +[node name="StampTab" type="PanelContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxEmpty_q6lwj") +script = ExtResource("1_c1kw7") +metadata/_tab_index = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 2 +horizontal_scroll_mode = 0 + +[node name="HFlowContainer" type="HFlowContainer" parent="ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/h_separation = 5 +theme_override_constants/v_separation = 5 + +[node name="SnapShotSelectButton" type="Button" parent="ScrollContainer/HFlowContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +toggle_mode = true +icon = ExtResource("1_jqf6j") +icon_alignment = 1 + +[connection signal="toggled" from="ScrollContainer/HFlowContainer/SnapShotSelectButton" to="." method="_on_snap_shot_select_button_toggled"] diff --git a/addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn b/addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn new file mode 100644 index 0000000..80be299 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://cn1kk5uedjgwp"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_q2mxv"] + +[node name="StampTile" type="TextureRect"] +custom_minimum_size = Vector2(16, 16) +size_flags_horizontal = 8 +size_flags_vertical = 8 +texture = SubResource("AtlasTexture_q2mxv") +expand_mode = 3 diff --git a/addons/ez_tiles/ez_tiles_draw/terrain_picker_button_group.tres b/addons/ez_tiles/ez_tiles_draw/terrain_picker_button_group.tres new file mode 100644 index 0000000..098ca2c --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/terrain_picker_button_group.tres @@ -0,0 +1,5 @@ +[gd_resource type="ButtonGroup" format=3 uid="uid://j3ffo1rd1gce"] + +[resource] +resource_local_to_scene = false +allow_unpress = true diff --git a/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd b/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd new file mode 100644 index 0000000..f48a708 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd @@ -0,0 +1,34 @@ +@tool +extends HBoxContainer + +class_name TerrainPickerEntry + +signal selected(terrain_id : int) + +var terrain_id : int +var terrain_name_button : Button +var terrain_name : String +var texture_resource : Texture2D +var icon : TextureRect + + +func _enter_tree() -> void: + terrain_name_button = find_child("TerrainNameButton") + icon = find_child("IconTextureRect") + terrain_name_button.text = terrain_name + if is_instance_valid(texture_resource): + icon.texture = texture_resource + + +func _on_icon_texture_rect_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + selected.emit(terrain_id) + terrain_name_button.button_pressed = true + if event is InputEventMouseMotion: + terrain_name_button.grab_focus() + + +func _on_terrain_name_button_pressed() -> void: + selected.emit(terrain_id) + diff --git a/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd.uid b/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd.uid new file mode 100644 index 0000000..33ea596 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd.uid @@ -0,0 +1 @@ +uid://b5483bu7juaph diff --git a/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.tscn b/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.tscn new file mode 100644 index 0000000..80c11c7 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=3 uid="uid://cfs45hiixp0h2"] + +[ext_resource type="ButtonGroup" uid="uid://j3ffo1rd1gce" path="res://addons/ez_tiles/ez_tiles_draw/terrain_picker_button_group.tres" id="1_1wme2"] +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.gd" id="1_i3rdw"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_geq4r"] +size = Vector2(384, 256) + +[node name="TerrainPickerEntry" type="HBoxContainer"] +custom_minimum_size = Vector2(0, 40) +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 31.0 +grow_horizontal = 2 +script = ExtResource("1_i3rdw") + +[node name="IconTextureRect" type="TextureRect" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +mouse_filter = 0 +mouse_default_cursor_shape = 2 +texture = SubResource("PlaceholderTexture2D_geq4r") +expand_mode = 3 +stretch_mode = 5 + +[node name="TerrainNameButton" type="Button" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = ExtResource("1_1wme2") +text = "Terrain name here" +alignment = 0 + +[connection signal="gui_input" from="IconTextureRect" to="." method="_on_icon_texture_rect_gui_input"] +[connection signal="pressed" from="TerrainNameButton" to="." method="_on_terrain_name_button_pressed"] diff --git a/addons/ez_tiles/ez_tiles_draw/tile_button.gd b/addons/ez_tiles/ez_tiles_draw/tile_button.gd new file mode 100644 index 0000000..8a92821 --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/tile_button.gd @@ -0,0 +1,11 @@ +@tool +extends Button +class_name TileButton + +signal clicked(coords : Vector2i) + +var coords := Vector2i.ZERO + +func _on_pressed() -> void: + clicked.emit(coords) + button_pressed = true diff --git a/addons/ez_tiles/ez_tiles_draw/tile_button.gd.uid b/addons/ez_tiles/ez_tiles_draw/tile_button.gd.uid new file mode 100644 index 0000000..241438f --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/tile_button.gd.uid @@ -0,0 +1 @@ +uid://by7i58quit85g diff --git a/addons/ez_tiles/ez_tiles_draw/tile_button.tscn b/addons/ez_tiles/ez_tiles_draw/tile_button.tscn new file mode 100644 index 0000000..cda172a --- /dev/null +++ b/addons/ez_tiles/ez_tiles_draw/tile_button.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://brj7avx23jyw2"] + +[ext_resource type="ButtonGroup" uid="uid://dtpx52d0n4ff1" path="res://addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres" id="1_jn7g0"] +[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/tile_button.gd" id="2_831ko"] + +[node name="TileButton" type="Button"] +custom_minimum_size = Vector2(40, 40) +theme_override_colors/icon_normal_color = Color(0.556863, 0.556863, 0.556863, 1) +theme_override_colors/icon_pressed_color = Color(1, 1, 1, 1) +theme_override_colors/icon_hover_color = Color(1, 1, 1, 1) +toggle_mode = true +button_group = ExtResource("1_jn7g0") +flat = true +icon_alignment = 1 +expand_icon = true +script = ExtResource("2_831ko") + +[connection signal="pressed" from="." to="." method="_on_pressed"] diff --git a/addons/ez_tiles/guide.png b/addons/ez_tiles/guide.png new file mode 100644 index 0000000000000000000000000000000000000000..491d03fe7d76e924067e4f31d52e5fc35806870a GIT binary patch literal 43866 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 Ic>Vmp047AH82|tP literal 0 HcmV?d00001 diff --git a/addons/ez_tiles/guide.png.import b/addons/ez_tiles/guide.png.import new file mode 100644 index 0000000..66798a8 --- /dev/null +++ b/addons/ez_tiles/guide.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4a0dorx8awbg" +path="res://.godot/imported/guide.png-8636de6038a75fffe8f18227cfcb8946.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/ez_tiles/guide.png" +dest_files=["res://.godot/imported/guide.png-8636de6038a75fffe8f18227cfcb8946.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/ez_tiles/images_container.gd b/addons/ez_tiles/images_container.gd new file mode 100644 index 0000000..2c2057f --- /dev/null +++ b/addons/ez_tiles/images_container.gd @@ -0,0 +1,69 @@ +@tool +extends ScrollContainer +class_name ImagesContainer + +signal drop_files(files : PackedStringArray) +signal terrain_list_entry_removed(resource_id : RID) +signal terrain_list_entry_selected(resource_id : RID) +signal terrain_list_collision_type_selected(resource_id : RID, type_id : EZTilesDock.CollisionType) + +var image_list : VBoxContainer +var hint_label : VBoxContainer +var TerrainListEntry +var terrain_name_regex := RegEx.new() + + +func _enter_tree() -> void: + TerrainListEntry = preload("res://addons/ez_tiles/terrain_list_entry.tscn") + image_list = find_child("ImageList") + hint_label = find_child("HintLabel") + terrain_name_regex.compile("^.*\\/([^\\.]+)\\..*$") + + +func _can_drop_data(at_position : Vector2, data : Variant) -> bool: + if not typeof(data) == TYPE_DICTIONARY and "type" in data and data["type"] == "files": + return false + + for file : String in data["files"]: + if (file.ends_with(".png") or file.ends_with(".svg") or file.ends_with(".webp") or + file.ends_with(".jpg") or file.ends_with(".bmp") or file.ends_with(".tga")): + return true + + return false + + +func _drop_data(at_position: Vector2, data: Variant) -> void: + if _can_drop_data(at_position, data): + drop_files.emit(data["files"]) + + +func _on_terrain_list_entry_removed(rid : RID) -> void: + terrain_list_entry_removed.emit(rid) + if image_list.get_children().size() <= 1: + image_list.hide() + hint_label.show() + + +func add_file(img_resource : CompressedTexture2D, invalid_message : String = ""): + hint_label.hide() + var new_entry : TerrainListEntry = TerrainListEntry.instantiate() + var regex_result := terrain_name_regex.search(img_resource.resource_path).strings + if regex_result.size() < 2: + new_entry.terrain_name = img_resource.resource_path + else: + new_entry.terrain_name = regex_result[1].replace("_", " ") + new_entry.texture_resource = img_resource + new_entry.warning_message = invalid_message + image_list.add_child(new_entry) + image_list.show() + new_entry.removed.connect(func(): _on_terrain_list_entry_removed(img_resource.get_rid())) + new_entry.selected.connect(func(): terrain_list_entry_selected.emit(img_resource.get_rid())) + new_entry.collision_type_selected.connect( + func(type_id : EZTilesDock.CollisionType): terrain_list_collision_type_selected.emit(img_resource.get_rid(), type_id) + ) + +func gather_data() -> Array: + var data := [] + for entry : TerrainListEntry in image_list.get_children(): + data.append(entry.gather_data()) + return data diff --git a/addons/ez_tiles/images_container.gd.uid b/addons/ez_tiles/images_container.gd.uid new file mode 100644 index 0000000..f01336b --- /dev/null +++ b/addons/ez_tiles/images_container.gd.uid @@ -0,0 +1 @@ +uid://brfnb2fjqpt5u diff --git a/addons/ez_tiles/images_container.tscn b/addons/ez_tiles/images_container.tscn new file mode 100644 index 0000000..e38c777 --- /dev/null +++ b/addons/ez_tiles/images_container.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=4 format=3 uid="uid://1u5mrsioaaon"] + +[ext_resource type="Script" path="res://addons/ez_tiles/images_container.gd" id="1_nrl1h"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_daguq"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.12549, 0.145098, 0.172549, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_wwpia"] +font_color = Color(0.621524, 0.621524, 0.621524, 1) + +[node name="ImagesContainer" type="ScrollContainer"] +custom_minimum_size = Vector2(400, 0) +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_daguq") +horizontal_scroll_mode = 0 +script = ExtResource("1_nrl1h") + +[node name="HintLabel" type="VBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 + +[node name="Label" type="Label" parent="HintLabel"] +layout_mode = 2 +size_flags_vertical = 0 +text = "Drop image files here" +label_settings = SubResource("LabelSettings_wwpia") +horizontal_alignment = 1 + +[node name="LinkButton" type="LinkButton" parent="HintLabel"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +size_flags_stretch_ratio = 0.0 +text = "Watch explainers" +uri = "https://youtube.com/playlist?list=PL5lf_BvgORchB6W4Dn-EbqPPeXR2l30Wt&feature=shared" + +[node name="ImageList" type="VBoxContainer" parent="."] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 diff --git a/addons/ez_tiles/load_files_button.gd b/addons/ez_tiles/load_files_button.gd new file mode 100644 index 0000000..10e6f79 --- /dev/null +++ b/addons/ez_tiles/load_files_button.gd @@ -0,0 +1,27 @@ +@tool +extends Button +class_name LoadFilesButton + +signal load_files(files : PackedStringArray) + +var file_dialog : EditorFileDialog + +func _enter_tree() -> void: + file_dialog = EditorFileDialog.new() + file_dialog.add_filter("*.png,*.svg,*.webp,*.jpg,*.jpeg,*.bmp,*.tga", "Image files") + file_dialog.file_mode = EditorFileDialog.FILE_MODE_OPEN_FILES + file_dialog.files_selected.connect(_on_files_selected) + EditorInterface.get_base_control().add_child(file_dialog) + + +func _on_files_selected(files : PackedStringArray) -> void: + load_files.emit(files) + + +func _exit_tree(): + # Cleanup + file_dialog.queue_free() + + +func _on_pressed() -> void: + file_dialog.popup_file_dialog() diff --git a/addons/ez_tiles/load_files_button.gd.uid b/addons/ez_tiles/load_files_button.gd.uid new file mode 100644 index 0000000..f2a33eb --- /dev/null +++ b/addons/ez_tiles/load_files_button.gd.uid @@ -0,0 +1 @@ +uid://dso6vfx3fidvs diff --git a/addons/ez_tiles/plugin.cfg b/addons/ez_tiles/plugin.cfg new file mode 100644 index 0000000..e2e9c0d --- /dev/null +++ b/addons/ez_tiles/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="EZ Tiles" +description="With EZ Tiles you can quickly import one specific PNG tilesheet template and start drawing quickly. See the Youtube explainer for a quickstart instruction." +author="René and Chris van der Ark" +version="1.0.3" +script="ez_tiles.gd" diff --git a/addons/ez_tiles/preview_panel_container.gd b/addons/ez_tiles/preview_panel_container.gd new file mode 100644 index 0000000..36eb112 --- /dev/null +++ b/addons/ez_tiles/preview_panel_container.gd @@ -0,0 +1,21 @@ +@tool +extends CenterContainer + +signal drop_files(files : PackedStringArray) + + +func _can_drop_data(at_position : Vector2, data : Variant) -> bool: + if not typeof(data) == TYPE_DICTIONARY and "type" in data and data["type"] == "files": + return false + + for file : String in data["files"]: + if (file.ends_with(".png") or file.ends_with(".svg") or file.ends_with(".webp") or + file.ends_with(".jpg") or file.ends_with(".bmp") or file.ends_with(".tga")): + return true + + return false + + +func _drop_data(at_position: Vector2, data: Variant) -> void: + if _can_drop_data(at_position, data): + drop_files.emit(data["files"]) diff --git a/addons/ez_tiles/preview_panel_container.gd.uid b/addons/ez_tiles/preview_panel_container.gd.uid new file mode 100644 index 0000000..70c6548 --- /dev/null +++ b/addons/ez_tiles/preview_panel_container.gd.uid @@ -0,0 +1 @@ +uid://b5lnmugjic5k1 diff --git a/addons/ez_tiles/select_terrain_button_group.tres b/addons/ez_tiles/select_terrain_button_group.tres new file mode 100644 index 0000000..af33b8d --- /dev/null +++ b/addons/ez_tiles/select_terrain_button_group.tres @@ -0,0 +1,5 @@ +[gd_resource type="ButtonGroup" format=3 uid="uid://b5bf2ekbf2vrc"] + +[resource] +resource_local_to_scene = false +allow_unpress = true diff --git a/addons/ez_tiles/terrain_list_entry.gd b/addons/ez_tiles/terrain_list_entry.gd new file mode 100644 index 0000000..3fa685b --- /dev/null +++ b/addons/ez_tiles/terrain_list_entry.gd @@ -0,0 +1,88 @@ +@tool +extends HBoxContainer +class_name TerrainListEntry + +signal removed() +signal selected() +signal collision_type_selected(type_id : EZTilesDock.CollisionType) + +var terrain_name_input : LineEdit +var terrain_name_button : Button +var edit_button : Button +var save_button : Button +var terrain_name : String +var texture_resource : CompressedTexture2D +var collision_type_button : OptionButton +var icon : TextureRect +var warning_icon : TextureRect +var warning_message : String = "" + +func _enter_tree() -> void: + save_button = find_child("SaveButton") + edit_button = find_child("EditButton") + collision_type_button = find_child("CollisionTypeButton") + terrain_name_input = find_child("TerrainNameInput") + terrain_name_button = find_child("TerrainNameButton") + icon = find_child("IconTextureRect") + warning_icon = find_child("WarningIcon") + terrain_name_input.text = terrain_name + terrain_name_button.text = terrain_name + if is_instance_valid(texture_resource): + icon.texture = texture_resource + terrain_name_button.button_pressed = true + if warning_message.length() > 0: + warning_icon.tooltip_text = warning_message + warning_icon.show() + +func _on_edit_button_pressed() -> void: + edit_button.hide() + save_button.show() + terrain_name_button.hide() + terrain_name_input.show() + terrain_name_input.grab_focus() + + +func save_new_terrain_name() -> void: + if terrain_name_input.text.length() > 0: + terrain_name = terrain_name_input.text + + terrain_name_button.text = terrain_name + terrain_name_input.text = terrain_name + terrain_name_button.show() + terrain_name_input.hide() + edit_button.show() + save_button.hide() + + +func _on_remove_button_pressed() -> void: + removed.emit() + queue_free() + + +func _on_terrain_name_button_pressed() -> void: + selected.emit() + + +func _on_terrain_name_input_text_submitted(_new_text: String) -> void: + save_new_terrain_name() + + +func gather_data() -> Dictionary: + return { + "texture_resource": texture_resource, + "terrain_name": terrain_name, + "layer_type": collision_type_button.get_selected_id() + } + + +func _on_icon_texture_rect_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + selected.emit() + terrain_name_button.button_pressed = true + if event is InputEventMouseMotion: + terrain_name_button.grab_focus() + + +func _on_collision_type_button_item_selected(index: int) -> void: + collision_type_selected.emit(collision_type_button.get_selected_id()) diff --git a/addons/ez_tiles/terrain_list_entry.gd.uid b/addons/ez_tiles/terrain_list_entry.gd.uid new file mode 100644 index 0000000..6522faa --- /dev/null +++ b/addons/ez_tiles/terrain_list_entry.gd.uid @@ -0,0 +1 @@ +uid://donmw3vyv7uar diff --git a/addons/ez_tiles/terrain_list_entry.tscn b/addons/ez_tiles/terrain_list_entry.tscn new file mode 100644 index 0000000..8d5932d --- /dev/null +++ b/addons/ez_tiles/terrain_list_entry.tscn @@ -0,0 +1,105 @@ +[gd_scene load_steps=8 format=3 uid="uid://dk3duerdgfgah"] + +[ext_resource type="Script" path="res://addons/ez_tiles/terrain_list_entry.gd" id="1_237eo"] +[ext_resource type="Texture2D" uid="uid://smg4iofcineo" path="res://addons/ez_tiles/Remove.svg" id="1_e3wgq"] +[ext_resource type="Texture2D" uid="uid://dwo07c1odx7ob" path="res://addons/ez_tiles/Edit.svg" id="2_6tddt"] +[ext_resource type="ButtonGroup" uid="uid://b5bf2ekbf2vrc" path="res://addons/ez_tiles/select_terrain_button_group.tres" id="2_framc"] +[ext_resource type="Texture2D" uid="uid://cxl4w251e8xgf" path="res://addons/ez_tiles/Save.svg" id="4_6vr40"] +[ext_resource type="Texture2D" uid="uid://cfrwoh80yb3se" path="res://addons/ez_tiles/exclamation-warning-triangle-icon.svg" id="6_yi7ck"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_n7skr"] +size = Vector2(384, 256) + +[node name="TerrainListEntry" type="HBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 31.0 +grow_horizontal = 2 +size_flags_horizontal = 3 +script = ExtResource("1_237eo") + +[node name="WarningIcon" type="TextureRect" parent="."] +visible = false +custom_minimum_size = Vector2(32, 16) +layout_mode = 2 +tooltip_text = "Unexpected image size: +Expected it to be: " +texture = ExtResource("6_yi7ck") +stretch_mode = 3 + +[node name="IconTextureRect" type="TextureRect" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +mouse_filter = 0 +mouse_default_cursor_shape = 2 +texture = SubResource("PlaceholderTexture2D_n7skr") +expand_mode = 3 +stretch_mode = 5 + +[node name="TerrainNameButton" type="Button" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +toggle_mode = true +button_group = ExtResource("2_framc") +alignment = 0 + +[node name="TerrainNameInput" type="LineEdit" parent="."] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "Terrain name..." +select_all_on_focus = true + +[node name="EditButton" type="Button" parent="."] +layout_mode = 2 +tooltip_text = "Change Terrain Name" +icon = ExtResource("2_6tddt") + +[node name="SaveButton" type="Button" parent="."] +visible = false +layout_mode = 2 +icon = ExtResource("4_6vr40") + +[node name="CollisionTypeButton" type="OptionButton" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +tooltip_text = "Pick a template for collision polygon, or pick: +- No Collision +- Navigable, i.e.: no Collision with Navigation; where navigation polygons are generated as full rectangles for pathfinding." +selected = 8 +fit_to_longest_item = false +allow_reselect = true +item_count = 10 +popup/item_0/text = "Rectangles" +popup/item_1/text = "Sloped All Corners" +popup/item_1/id = 3 +popup/item_2/text = "Sloped Top Corners" +popup/item_2/id = 1 +popup/item_3/text = "Sloped Bottom Corners" +popup/item_3/id = 4 +popup/item_4/text = "Rounded Corners" +popup/item_4/id = 5 +popup/item_5/text = "Rounded Corners (Inverse)" +popup/item_5/id = 6 +popup/item_6/text = "Tree" +popup/item_6/id = 7 +popup/item_7/text = "Cactus" +popup/item_7/id = 8 +popup/item_8/text = "No Collision" +popup/item_8/id = 2 +popup/item_9/text = "Navigable" +popup/item_9/id = 9 + +[node name="RemoveButton" type="Button" parent="."] +layout_mode = 2 +icon = ExtResource("1_e3wgq") + +[connection signal="gui_input" from="IconTextureRect" to="." method="_on_icon_texture_rect_gui_input"] +[connection signal="pressed" from="TerrainNameButton" to="." method="_on_terrain_name_button_pressed"] +[connection signal="focus_exited" from="TerrainNameInput" to="." method="save_new_terrain_name"] +[connection signal="text_submitted" from="TerrainNameInput" to="." method="_on_terrain_name_input_text_submitted"] +[connection signal="pressed" from="EditButton" to="." method="_on_edit_button_pressed"] +[connection signal="pressed" from="SaveButton" to="." method="save_new_terrain_name"] +[connection signal="item_selected" from="CollisionTypeButton" to="." method="_on_collision_type_button_item_selected"] +[connection signal="pressed" from="RemoveButton" to="." method="_on_remove_button_pressed"] diff --git a/coin.gd b/coin.gd new file mode 100644 index 0000000..5871267 --- /dev/null +++ b/coin.gd @@ -0,0 +1,6 @@ +extends Area2D + +func _on_body_entered(body: Node2D) -> void: + print("you got coing") + queue_free() + pass # Replace with function body. diff --git a/coin.gd.uid b/coin.gd.uid new file mode 100644 index 0000000..19930ac --- /dev/null +++ b/coin.gd.uid @@ -0,0 +1 @@ +uid://csmkrqtuurkyo diff --git a/coin.tscn b/coin.tscn new file mode 100644 index 0000000..8106fa2 --- /dev/null +++ b/coin.tscn @@ -0,0 +1,65 @@ +[gd_scene format=3 uid="uid://bwwv5c0bsfmgh"] + +[ext_resource type="Script" uid="uid://csmkrqtuurkyo" path="res://coin.gd" id="1_0t63x"] +[ext_resource type="Texture2D" uid="uid://c7kuxextst4j0" path="res://sprites/coin/MonedaD.png" id="1_d5gmh"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_0t63x"] +radius = 7.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_v7riw"] +atlas = ExtResource("1_d5gmh") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pdq0q"] +atlas = ExtResource("1_d5gmh") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_w14il"] +atlas = ExtResource("1_d5gmh") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h4etq"] +atlas = ExtResource("1_d5gmh") +region = Rect2(48, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o4fra"] +atlas = ExtResource("1_d5gmh") +region = Rect2(64, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_te2np"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_v7riw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pdq0q") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_w14il") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h4etq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o4fra") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[node name="Coin" type="Area2D" unique_id=1353750555] +script = ExtResource("1_0t63x") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1032039025] +scale = Vector2(4, 4) +shape = SubResource("CircleShape2D_0t63x") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=168181176] +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_te2np") +autoplay = "default" +frame_progress = 0.9891366 + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/dino.gd b/dino.gd new file mode 100644 index 0000000..6f5b46e --- /dev/null +++ b/dino.gd @@ -0,0 +1,25 @@ +extends CharacterBody2D + + +const SPEED = 300.0 +const JUMP_VELOCITY = -800.0 + + +func _physics_process(delta: float) -> void: + # Add the gravity. + if not is_on_floor(): + velocity += get_gravity() * delta + + # Handle jump. + if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var direction := Input.get_axis("ui_left", "ui_right") + if direction: + velocity.x = direction * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + + move_and_slide() diff --git a/dino.gd.uid b/dino.gd.uid new file mode 100644 index 0000000..ca7b08b --- /dev/null +++ b/dino.gd.uid @@ -0,0 +1 @@ +uid://bpkdfjw75x4tv diff --git a/dino.tscn b/dino.tscn new file mode 100644 index 0000000..d06aa19 --- /dev/null +++ b/dino.tscn @@ -0,0 +1,135 @@ +[gd_scene format=3 uid="uid://b4dj7u1t6qjuy"] + +[ext_resource type="Texture2D" uid="uid://dw64sm6hvikka" path="res://sprites/dino/DinoSprites - doux.png" id="1_la3et"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_2lsqi"] +atlas = ExtResource("1_la3et") +region = Rect2(0, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ab7rj"] +atlas = ExtResource("1_la3et") +region = Rect2(24, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cm433"] +atlas = ExtResource("1_la3et") +region = Rect2(48, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x55me"] +atlas = ExtResource("1_la3et") +region = Rect2(72, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8c0fg"] +atlas = ExtResource("1_la3et") +region = Rect2(240, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_il6vs"] +atlas = ExtResource("1_la3et") +region = Rect2(264, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ltur4"] +atlas = ExtResource("1_la3et") +region = Rect2(288, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1tmb4"] +atlas = ExtResource("1_la3et") +region = Rect2(312, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_73a84"] +atlas = ExtResource("1_la3et") +region = Rect2(96, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fmqac"] +atlas = ExtResource("1_la3et") +region = Rect2(120, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ywlg6"] +atlas = ExtResource("1_la3et") +region = Rect2(144, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pfltw"] +atlas = ExtResource("1_la3et") +region = Rect2(168, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vwdhm"] +atlas = ExtResource("1_la3et") +region = Rect2(192, 0, 24, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ygjic"] +atlas = ExtResource("1_la3et") +region = Rect2(216, 0, 24, 24) + +[sub_resource type="SpriteFrames" id="SpriteFrames_cqd6i"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_2lsqi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ab7rj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cm433") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x55me") +}], +"loop": true, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_8c0fg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_il6vs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ltur4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1tmb4") +}], +"loop": true, +"name": &"jump", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_73a84") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fmqac") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ywlg6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pfltw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vwdhm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ygjic") +}], +"loop": true, +"name": &"walk", +"speed": 5.0 +}] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_la3et"] +size = Vector2(8, 17) + +[node name="Dino" type="CharacterBody2D" unique_id=1560363456] + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=465878451] +position = Vector2(0, -9) +sprite_frames = SubResource("SpriteFrames_cqd6i") +animation = &"idle" +autoplay = "idle" +frame_progress = 0.46606407 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=834206527] +position = Vector2(0, -8.5) +shape = SubResource("RectangleShape2D_la3et") diff --git a/game.tscn b/game.tscn new file mode 100644 index 0000000..28975fd --- /dev/null +++ b/game.tscn @@ -0,0 +1,364 @@ +[gd_scene format=4 uid="uid://dnqvtckxgbhqv"] + +[ext_resource type="PackedScene" uid="uid://b4dj7u1t6qjuy" path="res://dino.tscn" id="1_80nbo"] +[ext_resource type="Script" uid="uid://bpkdfjw75x4tv" path="res://dino.gd" id="2_e2o6t"] +[ext_resource type="Texture2D" uid="uid://dxc264vu06a4x" path="res://addons/ez_tiles/examples/64x64/spikes.svg" id="3_7jktm"] +[ext_resource type="Texture2D" uid="uid://82nd1ajjv633" path="res://addons/ez_tiles/examples/64x64/plains_1.svg" id="4_7jktm"] +[ext_resource type="Texture2D" uid="uid://bbr3esj1mxpl0" path="res://addons/ez_tiles/examples/64x64/plains_2.svg" id="4_ryrav"] +[ext_resource type="PackedScene" uid="uid://bwwv5c0bsfmgh" path="res://coin.tscn" id="6_ryrav"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_7jktm"] +texture = ExtResource("3_7jktm") +texture_region_size = Vector2i(64, 64) +0:0/0 = 0 +0:0/0/terrain_set = 0 +0:0/0/terrain = 0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:0/0 = 0 +1:0/0/terrain_set = 0 +1:0/0/terrain = 0 +1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:0/0/terrains_peering_bit/bottom_side = 0 +3:0/0 = 0 +3:0/0/terrain_set = 0 +3:0/0/terrain = 0 +3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, 32, -32, 32, 32, 32, 32) +3:0/0/terrains_peering_bit/right_side = 0 +3:0/0/terrains_peering_bit/bottom_side = 0 +4:0/0 = 0 +4:0/0/terrain_set = 0 +4:0/0/terrain = 0 +4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:0/0/terrains_peering_bit/right_side = 0 +4:0/0/terrains_peering_bit/bottom_side = 0 +4:0/0/terrains_peering_bit/left_side = 0 +5:0/0 = 0 +5:0/0/terrain_set = 0 +5:0/0/terrain = 0 +5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, 32, 32, 32) +5:0/0/terrains_peering_bit/bottom_side = 0 +5:0/0/terrains_peering_bit/left_side = 0 +1:1/0 = 0 +1:1/0/terrain_set = 0 +1:1/0/terrain = 0 +1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:1/0/terrains_peering_bit/bottom_side = 0 +1:1/0/terrains_peering_bit/top_side = 0 +3:1/0 = 0 +3:1/0/terrain_set = 0 +3:1/0/terrain = 0 +3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +3:1/0/terrains_peering_bit/right_side = 0 +3:1/0/terrains_peering_bit/bottom_side = 0 +3:1/0/terrains_peering_bit/top_side = 0 +4:1/0 = 0 +4:1/0/terrain_set = 0 +4:1/0/terrain = 0 +4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:1/0/terrains_peering_bit/right_side = 0 +4:1/0/terrains_peering_bit/bottom_side = 0 +4:1/0/terrains_peering_bit/left_side = 0 +4:1/0/terrains_peering_bit/top_side = 0 +5:1/0 = 0 +5:1/0/terrain_set = 0 +5:1/0/terrain = 0 +5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +5:1/0/terrains_peering_bit/bottom_side = 0 +5:1/0/terrains_peering_bit/left_side = 0 +5:1/0/terrains_peering_bit/top_side = 0 +1:2/0 = 0 +1:2/0/terrain_set = 0 +1:2/0/terrain = 0 +1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:2/0/terrains_peering_bit/top_side = 0 +3:2/0 = 0 +3:2/0/terrain_set = 0 +3:2/0/terrain = 0 +3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 32, 32, 32) +3:2/0/terrains_peering_bit/right_side = 0 +3:2/0/terrains_peering_bit/top_side = 0 +4:2/0 = 0 +4:2/0/terrain_set = 0 +4:2/0/terrain = 0 +4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:2/0/terrains_peering_bit/right_side = 0 +4:2/0/terrains_peering_bit/left_side = 0 +4:2/0/terrains_peering_bit/top_side = 0 +5:2/0 = 0 +5:2/0/terrain_set = 0 +5:2/0/terrain = 0 +5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32) +5:2/0/terrains_peering_bit/left_side = 0 +5:2/0/terrains_peering_bit/top_side = 0 +0:3/0 = 0 +0:3/0/terrain_set = 0 +0:3/0/terrain = 0 +0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +0:3/0/terrains_peering_bit/right_side = 0 +1:3/0 = 0 +1:3/0/terrain_set = 0 +1:3/0/terrain = 0 +1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:3/0/terrains_peering_bit/right_side = 0 +1:3/0/terrains_peering_bit/left_side = 0 +2:3/0 = 0 +2:3/0/terrain_set = 0 +2:3/0/terrain = 0 +2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +2:3/0/terrains_peering_bit/left_side = 0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ryrav"] +texture = ExtResource("4_ryrav") +texture_region_size = Vector2i(64, 64) +0:0/0 = 0 +0:0/0/terrain_set = 0 +0:0/0/terrain = 1 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:0/0 = 0 +1:0/0/terrain_set = 0 +1:0/0/terrain = 1 +1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:0/0/terrains_peering_bit/bottom_side = 1 +3:0/0 = 0 +3:0/0/terrain_set = 0 +3:0/0/terrain = 1 +3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, 32, -32, 32, 32, 32, 32) +3:0/0/terrains_peering_bit/right_side = 1 +3:0/0/terrains_peering_bit/bottom_side = 1 +4:0/0 = 0 +4:0/0/terrain_set = 0 +4:0/0/terrain = 1 +4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:0/0/terrains_peering_bit/right_side = 1 +4:0/0/terrains_peering_bit/bottom_side = 1 +4:0/0/terrains_peering_bit/left_side = 1 +5:0/0 = 0 +5:0/0/terrain_set = 0 +5:0/0/terrain = 1 +5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, 32, 32, 32) +5:0/0/terrains_peering_bit/bottom_side = 1 +5:0/0/terrains_peering_bit/left_side = 1 +1:1/0 = 0 +1:1/0/terrain_set = 0 +1:1/0/terrain = 1 +1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:1/0/terrains_peering_bit/bottom_side = 1 +1:1/0/terrains_peering_bit/top_side = 1 +3:1/0 = 0 +3:1/0/terrain_set = 0 +3:1/0/terrain = 1 +3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +3:1/0/terrains_peering_bit/right_side = 1 +3:1/0/terrains_peering_bit/bottom_side = 1 +3:1/0/terrains_peering_bit/top_side = 1 +4:1/0 = 0 +4:1/0/terrain_set = 0 +4:1/0/terrain = 1 +4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:1/0/terrains_peering_bit/right_side = 1 +4:1/0/terrains_peering_bit/bottom_side = 1 +4:1/0/terrains_peering_bit/left_side = 1 +4:1/0/terrains_peering_bit/top_side = 1 +5:1/0 = 0 +5:1/0/terrain_set = 0 +5:1/0/terrain = 1 +5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +5:1/0/terrains_peering_bit/bottom_side = 1 +5:1/0/terrains_peering_bit/left_side = 1 +5:1/0/terrains_peering_bit/top_side = 1 +1:2/0 = 0 +1:2/0/terrain_set = 0 +1:2/0/terrain = 1 +1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:2/0/terrains_peering_bit/top_side = 1 +3:2/0 = 0 +3:2/0/terrain_set = 0 +3:2/0/terrain = 1 +3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 32, 32, 32) +3:2/0/terrains_peering_bit/right_side = 1 +3:2/0/terrains_peering_bit/top_side = 1 +4:2/0 = 0 +4:2/0/terrain_set = 0 +4:2/0/terrain = 1 +4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:2/0/terrains_peering_bit/right_side = 1 +4:2/0/terrains_peering_bit/left_side = 1 +4:2/0/terrains_peering_bit/top_side = 1 +5:2/0 = 0 +5:2/0/terrain_set = 0 +5:2/0/terrain = 1 +5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32) +5:2/0/terrains_peering_bit/left_side = 1 +5:2/0/terrains_peering_bit/top_side = 1 +0:3/0 = 0 +0:3/0/terrain_set = 0 +0:3/0/terrain = 1 +0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +0:3/0/terrains_peering_bit/right_side = 1 +1:3/0 = 0 +1:3/0/terrain_set = 0 +1:3/0/terrain = 1 +1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:3/0/terrains_peering_bit/right_side = 1 +1:3/0/terrains_peering_bit/left_side = 1 +2:3/0 = 0 +2:3/0/terrain_set = 0 +2:3/0/terrain = 1 +2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +2:3/0/terrains_peering_bit/left_side = 1 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_eow3j"] +texture = ExtResource("4_7jktm") +texture_region_size = Vector2i(64, 64) +0:0/0 = 0 +0:0/0/terrain_set = 0 +0:0/0/terrain = 2 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:0/0 = 0 +1:0/0/terrain_set = 0 +1:0/0/terrain = 2 +1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:0/0/terrains_peering_bit/bottom_side = 2 +3:0/0 = 0 +3:0/0/terrain_set = 0 +3:0/0/terrain = 2 +3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, 32, -32, 32, 32, 32, 32) +3:0/0/terrains_peering_bit/right_side = 2 +3:0/0/terrains_peering_bit/bottom_side = 2 +4:0/0 = 0 +4:0/0/terrain_set = 0 +4:0/0/terrain = 2 +4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:0/0/terrains_peering_bit/right_side = 2 +4:0/0/terrains_peering_bit/bottom_side = 2 +4:0/0/terrains_peering_bit/left_side = 2 +5:0/0 = 0 +5:0/0/terrain_set = 0 +5:0/0/terrain = 2 +5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, 32, 32, 32) +5:0/0/terrains_peering_bit/bottom_side = 2 +5:0/0/terrains_peering_bit/left_side = 2 +1:1/0 = 0 +1:1/0/terrain_set = 0 +1:1/0/terrain = 2 +1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:1/0/terrains_peering_bit/bottom_side = 2 +1:1/0/terrains_peering_bit/top_side = 2 +3:1/0 = 0 +3:1/0/terrain_set = 0 +3:1/0/terrain = 2 +3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +3:1/0/terrains_peering_bit/right_side = 2 +3:1/0/terrains_peering_bit/bottom_side = 2 +3:1/0/terrains_peering_bit/top_side = 2 +4:1/0 = 0 +4:1/0/terrain_set = 0 +4:1/0/terrain = 2 +4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:1/0/terrains_peering_bit/right_side = 2 +4:1/0/terrains_peering_bit/bottom_side = 2 +4:1/0/terrains_peering_bit/left_side = 2 +4:1/0/terrains_peering_bit/top_side = 2 +5:1/0 = 0 +5:1/0/terrain_set = 0 +5:1/0/terrain = 2 +5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +5:1/0/terrains_peering_bit/bottom_side = 2 +5:1/0/terrains_peering_bit/left_side = 2 +5:1/0/terrains_peering_bit/top_side = 2 +1:2/0 = 0 +1:2/0/terrain_set = 0 +1:2/0/terrain = 2 +1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:2/0/terrains_peering_bit/top_side = 2 +3:2/0 = 0 +3:2/0/terrain_set = 0 +3:2/0/terrain = 2 +3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 32, 32, 32) +3:2/0/terrains_peering_bit/right_side = 2 +3:2/0/terrains_peering_bit/top_side = 2 +4:2/0 = 0 +4:2/0/terrain_set = 0 +4:2/0/terrain = 2 +4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +4:2/0/terrains_peering_bit/right_side = 2 +4:2/0/terrains_peering_bit/left_side = 2 +4:2/0/terrains_peering_bit/top_side = 2 +5:2/0 = 0 +5:2/0/terrain_set = 0 +5:2/0/terrain = 2 +5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32) +5:2/0/terrains_peering_bit/left_side = 2 +5:2/0/terrains_peering_bit/top_side = 2 +0:3/0 = 0 +0:3/0/terrain_set = 0 +0:3/0/terrain = 2 +0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +0:3/0/terrains_peering_bit/right_side = 2 +1:3/0 = 0 +1:3/0/terrain_set = 0 +1:3/0/terrain = 2 +1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +1:3/0/terrains_peering_bit/right_side = 2 +1:3/0/terrains_peering_bit/left_side = 2 +2:3/0 = 0 +2:3/0/terrain_set = 0 +2:3/0/terrain = 2 +2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 32, -32, -32, 32, -32, 32, 32, 32, 32) +2:3/0/terrains_peering_bit/left_side = 2 + +[sub_resource type="TileSet" id="TileSet_j5wjh"] +tile_size = Vector2i(64, 64) +physics_layer_0/collision_layer = 1 +terrain_set_0/mode = 2 +terrain_set_0/terrain_0/name = "spikes" +terrain_set_0/terrain_0/color = Color(0.5, 0.34375, 0.25, 1) +terrain_set_0/terrain_1/name = "plains 2" +terrain_set_0/terrain_1/color = Color(0.5, 0.4375, 0.25, 1) +terrain_set_0/terrain_2/name = "plains 1" +terrain_set_0/terrain_2/color = Color(0.46875, 0.5, 0.25, 1) +sources/0 = SubResource("TileSetAtlasSource_7jktm") +sources/1 = SubResource("TileSetAtlasSource_ryrav") +sources/2 = SubResource("TileSetAtlasSource_eow3j") + +[node name="Game" type="Node2D" unique_id=340801904] + +[node name="Dino" parent="." unique_id=1560363456 instance=ExtResource("1_80nbo")] +position = Vector2(0, -128) +scale = Vector2(4, 4) +script = ExtResource("2_e2o6t") + +[node name="Camera2D" type="Camera2D" parent="Dino" unique_id=2139718142] +position_smoothing_enabled = true + +[node name="EZTilesTileMapLayer" type="TileMapLayer" parent="." unique_id=166272375] +tile_map_data = PackedByteArray("AAD7/wAAAQAEAAEAAAD8/wAAAQAEAAEAAAD9/wAAAQAEAAEAAAD+/wAAAQAEAAEAAAD//wAAAQAEAAEAAAAAAAAAAQAEAAEAAAABAAAAAQAEAAEAAAACAAAAAQAEAAEAAAADAAAAAQAEAAEAAAAEAAAAAQAEAAEAAAD7/wEAAQAEAAEAAAD8/wEAAQAEAAEAAAD9/wEAAQAEAAEAAAD+/wEAAQAEAAEAAAD//wEAAQAEAAEAAAAAAAEAAQAEAAEAAAABAAEAAQAEAAEAAAACAAEAAQAEAAEAAAADAAEAAQAEAAEAAAAEAAEAAQAEAAEAAAD7/wIAAQAEAAEAAAD8/wIAAQAEAAEAAAD9/wIAAQAEAAEAAAD+/wIAAQAEAAEAAAD//wIAAQAEAAEAAAAAAAIAAQAEAAEAAAABAAIAAQAEAAEAAAACAAIAAQAEAAEAAAADAAIAAQAEAAEAAAAEAAIAAQAEAAEAAAAFAAAAAQAEAAEAAAAGAAAAAQAEAAEAAAAHAAAAAQAEAAEAAAAIAAAAAQAEAAEAAAAJAAAAAQAEAAEAAAAFAAEAAQAEAAEAAAAGAAEAAQAEAAEAAAAHAAEAAQAEAAEAAAAIAAEAAQAEAAEAAAAJAAEAAQAEAAEAAAAKAAAAAQAEAAEAAAAKAAEAAQAEAAEAAAALAAAAAQAEAAEAAAALAAEAAQAEAAEAAAAMAAAAAQAEAAEAAAAMAAEAAQAEAAEAAAANAAAAAQAEAAEAAAANAAEAAQAEAAEAAAAOAAAAAQAEAAEAAAAOAAEAAQAEAAEAAAAPAAEAAQAEAAEAAAAQAAEAAQAEAAEAAAARAAEAAQAEAAEAAAASAAEAAQAEAAEAAAATAAEAAQAEAAEAAAAUAAEAAQAEAAEAAAAVAAEAAQAEAAEAAAAWAAEAAQAEAAEAAAAXAAAAAQAEAAEAAAAXAAEAAQAEAAEAAAAYAAAAAQAEAAEAAAAYAAEAAQAEAAEAAAAFAAIAAQAEAAEAAAAGAAIAAQAEAAEAAAAHAAIAAQAEAAEAAAAIAAIAAQAEAAEAAAAJAAIAAQAEAAEAAAAKAAIAAQAEAAEAAAALAAIAAQAEAAEAAAAMAAIAAQAEAAEAAAANAAIAAQAEAAEAAAAOAAIAAQAEAAEAAAAPAAIAAQAEAAEAAAAQAAIAAQAEAAEAAAARAAIAAQAEAAEAAAASAAIAAQAEAAEAAAATAAIAAQAEAAEAAAAUAAIAAQAEAAEAAAAVAAIAAQAEAAEAAAAWAAIAAQAEAAEAAAAXAAIAAQAEAAEAAAAYAAIAAQAEAAEAAAAJAP//AQADAAAAAAAKAP//AQAEAAEAAAAKAP7/AQADAAAAAAALAP7/AQAEAAEAAAALAP//AQAEAAEAAAALAP3/AQADAAAAAAAMAP3/AQAEAAEAAAAMAP7/AQAEAAEAAAAMAP//AQAEAAEAAAANAP3/AQAEAAEAAAANAP7/AQAEAAEAAAANAP//AQAEAAEAAAAMAPz/AQADAAAAAAANAPz/AQAEAAEAAAAOAPz/AQAEAAEAAAAOAP3/AQAEAAEAAAAOAP7/AQAEAAEAAAAOAP//AQAEAAEAAAANAPv/AQADAAAAAAAOAPv/AQAEAAAAAAAPAPv/AQAEAAAAAAAQAPv/AQAEAAAAAAARAPv/AQAEAAAAAAASAPv/AQAEAAAAAAATAPv/AQAEAAAAAAAUAPv/AQAEAAAAAAAVAPv/AQAEAAAAAAAWAPv/AQAEAAAAAAAXAPv/AQAEAAAAAAAXAPz/AQAEAAEAAAAXAP3/AQAEAAEAAAAXAP7/AQAEAAEAAAAXAP//AQAEAAEAAAAYAPv/AQAEAAAAAAAYAPz/AQAEAAEAAAAYAP3/AQAEAAEAAAAYAP7/AQAEAAEAAAAYAP//AQAEAAEAAAAPAPz/AAAEAAAAAAAQAP3/AAAEAAEAAAAPAP3/AAAEAAEAAAARAP7/AAAEAAEAAAAQAP7/AAAEAAEAAAAPAP7/AAAEAAEAAAAQAPz/AAAEAAAAAAARAP3/AAAEAAEAAAASAP7/AAAEAAEAAAATAP//AAAEAAEAAAASAP//AAAEAAEAAAARAP//AAAEAAEAAAAQAP//AAAEAAEAAAAPAP//AAAEAAEAAAARAPz/AAAEAAAAAAASAP3/AAAEAAEAAAATAP7/AAAEAAEAAAAUAP//AAAEAAEAAAAVAAAAAAAEAAEAAAAUAAAAAAAEAAEAAAATAAAAAAAEAAEAAAASAAAAAAAEAAEAAAARAAAAAAAEAAEAAAAQAAAAAAAEAAEAAAAPAAAAAAAEAAEAAAASAPz/AAAFAAAAAAATAP3/AAAFAAAAAAAUAP7/AAAFAAAAAAAVAP//AAAFAAAAAAAWAAAAAAAFAAAAAAAZAAAAAQAEAAEAAAAaAAAAAQAEAAEAAAAoAAAAAQAEAAEAAAApAAAAAQAEAAEAAAAqAAAAAQAEAAEAAAArAAAAAQAEAAEAAAAsAAAAAQAEAAEAAAAtAAAAAQAEAAEAAAAuAAAAAQAEAAEAAAAvAAAAAQAEAAEAAAAwAAAAAQAEAAEAAAAxAAAAAQAEAAEAAAAyAAAAAQAEAAEAAAAzAAAAAQAEAAEAAAA0AAAAAQAEAAEAAAA1AAAAAQAEAAEAAAA2AAAAAQAEAAEAAAA3AAAAAQAEAAEAAAA4AAAAAQAEAAEAAAA5AAAAAQAEAAEAAAAZAAEAAQAEAAEAAAAaAAEAAQAEAAEAAAApAAEAAQAEAAEAAAAqAAEAAQAEAAEAAAArAAEAAQAEAAEAAAAsAAEAAQAEAAEAAAAtAAEAAQAEAAEAAAAuAAEAAQAEAAEAAAAvAAEAAQAEAAEAAAAwAAEAAQAEAAEAAAAxAAEAAQAEAAEAAAAyAAEAAQAEAAEAAAAzAAEAAQAEAAEAAAA0AAEAAQAEAAEAAAA1AAEAAQAEAAEAAAA2AAEAAQAEAAEAAAA3AAEAAQAEAAEAAAA4AAEAAQAEAAEAAAA5AAEAAQAEAAEAAAAZAAIAAQAEAAEAAAAaAAIAAQAEAAEAAAAoAAIAAQAEAAEAAAApAAIAAQAEAAEAAAAqAAIAAQAEAAEAAAArAAIAAQAEAAEAAAAsAAIAAQAEAAEAAAAtAAIAAQAEAAEAAAAuAAIAAQAEAAEAAAAvAAIAAQAEAAEAAAAwAAIAAQAEAAEAAAAxAAIAAQAEAAEAAAAyAAIAAQAEAAEAAAAzAAIAAQAEAAEAAAA0AAIAAQAEAAEAAAA1AAIAAQAEAAEAAAA2AAIAAQAEAAEAAAA3AAIAAQAEAAEAAAA4AAIAAQAEAAEAAAA5AAIAAQAEAAEAAAAbAAAAAQAEAAEAAAAbAAEAAQAEAAEAAAAbAAIAAQAEAAEAAAAeAAAAAQAEAAEAAAAfAAAAAQAEAAEAAAAgAAAAAQAEAAEAAAAhAAAAAQAEAAEAAAAiAAAAAQAEAAEAAAAjAAAAAQAEAAEAAAAkAAAAAQAEAAEAAAAlAAAAAQAEAAEAAAAdAAEAAQAEAAEAAAAeAAEAAQAEAAEAAAAfAAEAAQAEAAEAAAAgAAEAAQAEAAEAAAAmAAEAAQAEAAEAAAAlAAEAAQAEAAEAAAAkAAEAAQAEAAEAAAAjAAEAAQAEAAEAAAAiAAEAAQAEAAEAAAAhAAEAAQAEAAEAAAAdAAIAAQAEAAEAAAAeAAIAAQAEAAEAAAAfAAIAAQAEAAEAAAAgAAIAAQAEAAEAAAAjAAIAAQAEAAEAAAAiAAIAAQAEAAEAAAAhAAIAAQAEAAEAAAAcAAIAAQAEAAEAAAAoAAEAAQAEAAEAAAAdAAAAAQAEAAEAAAAeAP//AQAEAAEAAAAfAP//AQAEAAEAAAAiAP//AQAEAAEAAAAhAP//AQAEAAEAAAAgAP//AQAEAAEAAAAeAP7/AQAEAAEAAAAdAP//AQAEAAEAAAAcAAAAAQAEAAEAAAAfAP7/AQAEAAEAAAAiAP7/AQAEAAEAAAAjAP//AQAEAAEAAAAhAP7/AQAEAAEAAAAgAP7/AQAEAAEAAAAfAP3/AQAEAAEAAAAgAP3/AQAEAAEAAAAiAP3/AQAEAAEAAAAjAP7/AQAEAAEAAAAkAP//AQAEAAEAAAAhAP3/AQAEAAEAAAAfAPz/AQADAAAAAAAeAP3/AQADAAAAAAAdAP7/AQADAAAAAAAcAP//AQADAAAAAAAgAPz/AQAEAAAAAAAiAPz/AQAEAAAAAAAjAP3/AQAEAAEAAAAkAP7/AQAEAAEAAAAlAP//AQAEAAEAAAAhAPz/AQAEAAAAAAAjAPz/AQAEAAAAAAAkAP3/AQAEAAEAAAAlAP7/AQAEAAEAAAAmAP//AQAEAAEAAAAmAAAAAQAEAAEAAAAkAPz/AQAFAAAAAAAlAP3/AQAFAAAAAAAmAP7/AQAFAAAAAAAnAP//AQAFAAAAAAAnAAAAAQAEAAEAAAAkAAIAAQAEAAEAAAAcAAEAAQAEAAEAAAAlAAIAAQAEAAEAAAAmAAIAAQAEAAEAAAAnAAEAAQAEAAEAAAAnAAIAAQAEAAEAAAA2APv/AQADAAIAAAA3APz/AQADAAIAAAA3APv/AQAEAAEAAAA4APz/AQAEAAEAAAA4APv/AQAEAAEAAAA4AP3/AQADAAIAAAA5AP3/AQAEAAIAAAA5APz/AQAEAAEAAAA5APv/AQAEAAEAAAA6AAAAAQAEAAEAAAA6AAEAAQAEAAEAAAA6AAIAAQAEAAEAAAA+AAAAAQADAAEAAAA/AAAAAQAEAAEAAABAAAAAAQAEAAEAAABBAAAAAQAEAAEAAABCAAAAAQAEAAEAAABDAAAAAQAEAAEAAABEAAAAAQAEAAEAAABFAAAAAQAEAAEAAABGAAAAAQAEAAEAAABHAAAAAQAEAAEAAABIAAAAAQAEAAEAAABJAAAAAQAEAAEAAABKAAAAAQAEAAEAAABLAAAAAQAEAAEAAABMAAAAAQAEAAEAAABSAAAAAQAEAAEAAABTAAAAAQAEAAEAAABUAAAAAQAEAAEAAABVAAAAAQAEAAEAAABWAAAAAQAEAAEAAAA/AAEAAQAEAAEAAABAAAEAAQAEAAEAAABBAAEAAQAEAAEAAABCAAEAAQAEAAEAAABDAAEAAQAEAAEAAABEAAEAAQAEAAEAAABFAAEAAQAEAAEAAABGAAEAAQAEAAEAAABHAAEAAQAEAAEAAABIAAEAAQAEAAEAAABJAAEAAQAEAAEAAABVAAEAAQAEAAEAAABUAAEAAQAEAAEAAABTAAEAAQAEAAEAAABSAAEAAQAEAAEAAABRAAEAAQAEAAEAAABNAAEAAQAEAAEAAABMAAEAAQAEAAEAAABLAAEAAQAEAAEAAABKAAEAAQAEAAEAAABWAAEAAQAEAAEAAABXAAAAAQAEAAEAAABXAAEAAQAEAAEAAABYAAAAAQAEAAEAAABYAAEAAQAEAAEAAABZAAAAAQAEAAEAAABZAAEAAQAEAAEAAABaAAAAAQAEAAEAAABaAAEAAQAEAAEAAABbAAAAAQAEAAEAAABbAAEAAQAEAAEAAABcAAAAAQAEAAEAAABcAAEAAQAEAAEAAABdAAAAAQAEAAEAAABAAAIAAQAEAAEAAABBAAIAAQAEAAEAAABCAAIAAQAEAAEAAABDAAIAAQAEAAEAAABEAAIAAQAEAAEAAABFAAIAAQAEAAEAAABGAAIAAQAEAAEAAABHAAIAAQAEAAEAAABIAAIAAQAEAAEAAABJAAIAAQAEAAEAAABKAAIAAQAEAAEAAABLAAIAAQAEAAEAAABMAAIAAQAEAAEAAABNAAIAAQAEAAEAAABbAAIAAQAEAAEAAABaAAIAAQAEAAEAAABZAAIAAQAEAAEAAABYAAIAAQAEAAEAAABXAAIAAQAEAAEAAABWAAIAAQAEAAEAAABVAAIAAQAEAAEAAABUAAIAAQAEAAEAAABTAAIAAQAEAAEAAABSAAIAAQAEAAEAAABRAAIAAQAEAAEAAABQAAIAAQAEAAEAAABOAAIAAQAEAAEAAABBAAMAAQAEAAEAAABCAAMAAQAEAAEAAABDAAMAAQAEAAEAAABEAAMAAQAEAAEAAABFAAMAAQAEAAEAAABGAAMAAQAEAAEAAABHAAMAAQAEAAEAAABIAAMAAQAEAAEAAABJAAMAAQAEAAEAAABKAAMAAQAEAAEAAABLAAMAAQAEAAEAAABMAAMAAQAEAAEAAABNAAMAAQAEAAEAAABaAAMAAQAEAAEAAABZAAMAAQAEAAEAAABYAAMAAQAEAAEAAABXAAMAAQAEAAEAAABWAAMAAQAEAAEAAABVAAMAAQAEAAEAAABUAAMAAQAEAAEAAABTAAMAAQAEAAEAAABSAAMAAQAEAAEAAABRAAMAAQAEAAEAAABQAAMAAQAEAAEAAABOAAMAAQAEAAEAAABCAAQAAQAEAAEAAABDAAQAAQAEAAEAAABEAAQAAQAEAAEAAABFAAQAAQAEAAEAAABGAAQAAQAEAAEAAABHAAQAAQAEAAEAAABIAAQAAQAEAAEAAABJAAQAAQAEAAEAAABKAAQAAQAEAAEAAABLAAQAAQAEAAEAAABMAAQAAQAEAAEAAABNAAQAAQAEAAEAAABZAAQAAQAEAAEAAABYAAQAAQAEAAEAAABXAAQAAQAEAAEAAABWAAQAAQAEAAEAAABVAAQAAQAEAAEAAABUAAQAAQAEAAEAAABTAAQAAQAEAAEAAABSAAQAAQAEAAEAAABRAAQAAQAEAAEAAABQAAQAAQAEAAEAAABOAAQAAQAEAAEAAABDAAUAAQAEAAEAAABEAAUAAQAEAAEAAABFAAUAAQAEAAEAAABGAAUAAQAEAAEAAABHAAUAAQAEAAEAAABIAAUAAQAEAAEAAABJAAUAAQAEAAEAAABKAAUAAQAEAAEAAABLAAUAAQAEAAEAAABMAAUAAQAEAAEAAABNAAUAAQAEAAEAAABZAAUAAQAEAAEAAABaAAQAAQAEAAEAAABbAAMAAQAEAAEAAABcAAIAAQAEAAEAAABdAAEAAQAEAAEAAABeAAAAAQAFAAEAAABYAAUAAQAEAAEAAABXAAUAAQAEAAEAAABWAAUAAQAEAAEAAABVAAUAAQAEAAEAAABUAAUAAQAEAAEAAABTAAUAAQAEAAEAAABSAAUAAQAEAAEAAABRAAUAAQAEAAEAAABQAAUAAQAEAAEAAABOAAUAAQAEAAEAAABEAAYAAQAEAAEAAABFAAYAAQAEAAEAAABGAAYAAQAEAAEAAABHAAYAAQAEAAEAAABYAAYAAQAEAAEAAABRAAYAAQAEAAEAAABQAAYAAQAEAAEAAABOAAYAAQAEAAEAAABFAAcAAQAEAAEAAABGAAcAAQAEAAEAAABHAAcAAQAEAAEAAABRAAcAAQAEAAEAAABQAAcAAQAEAAEAAABOAAcAAQAEAAEAAABGAAgAAQAEAAEAAABHAAgAAQAEAAEAAABRAAgAAQAEAAEAAABQAAgAAQAEAAEAAABHAAkAAQAEAAEAAABRAAkAAQAEAAEAAABIAAoAAQAEAAEAAABJAAoAAQAEAAEAAABLAAoAAQAEAAEAAABMAAoAAQAEAAEAAABNAAoAAQAEAAEAAABPAAoAAQAEAAEAAABOAAoAAQAEAAEAAABJAAsAAQAEAAEAAABLAAsAAQAEAAEAAABMAAsAAQAEAAEAAABNAAsAAQAEAAEAAABTAAsAAQAEAAEAAABSAAsAAQAEAAEAAABRAAsAAQAEAAEAAABQAAsAAQAEAAEAAABPAAsAAQAEAAEAAABOAAsAAQAEAAEAAABNAAwAAQAEAAEAAABLAA0AAQAEAAEAAABNAA0AAQAEAAEAAABNAA8AAQAEAAEAAABNABAAAQAEAAEAAABMAA8AAQAEAAEAAABLAA4AAQAEAAEAAABKAA0AAQAEAAEAAABJAAwAAQAEAAEAAABIAAsAAQAEAAEAAABHAAoAAQAEAAEAAABGAAkAAQAEAAEAAABFAAgAAQAEAAEAAABEAAcAAQAEAAEAAABDAAYAAQAEAAEAAABCAAUAAQAEAAEAAABBAAQAAQAEAAEAAABAAAMAAQAEAAEAAAA/AAIAAQAEAAEAAAA+AAEAAQADAAEAAABNABEAAQAEAAEAAABMABAAAQAEAAEAAABLAA8AAQAEAAEAAABKAA4AAQAEAAEAAABJAA0AAQAEAAEAAABIAAwAAQAEAAEAAABHAAsAAQAEAAEAAABGAAoAAQAEAAEAAABFAAkAAQAEAAEAAABEAAgAAQAEAAEAAABDAAcAAQAEAAEAAABCAAYAAQAEAAEAAABBAAUAAQAEAAEAAABAAAQAAQAEAAEAAAA/AAMAAQAEAAEAAAA+AAIAAQADAAEAAABTAAwAAQAEAAEAAABUAAsAAQAEAAEAAABYAAcAAQAEAAEAAABZAAYAAQAEAAEAAABaAAUAAQAEAAEAAABbAAQAAQAEAAEAAABcAAMAAQAEAAEAAABdAAIAAQAEAAEAAABeAAEAAQAFAAEAAABNABIAAQAEAAEAAABMABEAAQAEAAEAAABLABAAAQAEAAEAAABKAA8AAQAEAAEAAABJAA4AAQAEAAEAAABIAA0AAQAEAAEAAABHAAwAAQAEAAEAAABGAAsAAQAEAAEAAABFAAoAAQAEAAEAAABEAAkAAQAEAAEAAABDAAgAAQAEAAEAAABCAAcAAQAEAAEAAABBAAYAAQAEAAEAAABAAAUAAQAEAAEAAAA/AAQAAQAEAAEAAAA+AAMAAQADAAEAAABOABIAAQAEAAEAAABTAA0AAQAEAAEAAABUAAwAAQAEAAEAAABVAAsAAQAEAAEAAABYAAgAAQAEAAEAAABZAAcAAQAEAAEAAABaAAYAAQAEAAEAAABbAAUAAQAEAAEAAABcAAQAAQAEAAEAAABdAAMAAQAEAAEAAABeAAIAAQAFAAEAAABNABMAAQAEAAEAAABMABIAAQAEAAEAAABLABEAAQAEAAEAAABKABAAAQAEAAEAAABJAA8AAQAEAAEAAABIAA4AAQAEAAEAAABHAA0AAQAEAAEAAABGAAwAAQAEAAEAAABFAAsAAQAEAAEAAABEAAoAAQAEAAEAAABDAAkAAQAEAAEAAABCAAgAAQAEAAEAAABBAAcAAQAEAAEAAABAAAYAAQAEAAEAAAA/AAUAAQAEAAEAAAA+AAQAAQADAAEAAABOABMAAQAEAAEAAABPABIAAQAEAAEAAABTAA4AAQAEAAEAAABUAA0AAQAEAAEAAABVAAwAAQAEAAEAAABWAAsAAQAEAAEAAABYAAkAAQAEAAEAAABZAAgAAQAEAAEAAABaAAcAAQAEAAEAAABbAAYAAQAEAAEAAABcAAUAAQAEAAEAAABdAAQAAQAEAAEAAABeAAMAAQAFAAEAAABNABQAAQAEAAEAAABMABMAAQAEAAEAAABLABIAAQAEAAEAAABKABEAAQAEAAEAAABJABAAAQAEAAEAAABIAA8AAQAEAAEAAABHAA4AAQAEAAEAAABGAA0AAQAEAAEAAABFAAwAAQAEAAEAAABEAAsAAQAEAAEAAABDAAoAAQAEAAEAAABCAAkAAQAEAAEAAABBAAgAAQAEAAEAAABAAAcAAQAEAAEAAAA/AAYAAQAEAAEAAAA+AAUAAQADAAEAAABOABQAAQAEAAEAAABPABMAAQAEAAEAAABQABIAAQAEAAEAAABRABEAAQAEAAEAAABTAA8AAQAEAAEAAABUAA4AAQAEAAEAAABVAA0AAQAEAAEAAABWAAwAAQAEAAEAAABXAAsAAQAEAAEAAABYAAoAAQAEAAEAAABZAAkAAQAEAAEAAABaAAgAAQAEAAEAAABbAAcAAQAEAAEAAABcAAYAAQAEAAEAAABdAAUAAQAEAAEAAABeAAQAAQAFAAEAAABNABUAAQADAAIAAABMABQAAQADAAIAAABLABMAAQADAAIAAABKABIAAQADAAIAAABJABEAAQADAAIAAABIABAAAQADAAIAAABHAA8AAQADAAIAAABGAA4AAQADAAIAAABFAA0AAQADAAIAAABEAAwAAQADAAIAAABDAAsAAQADAAIAAABCAAoAAQADAAIAAABBAAkAAQADAAIAAABAAAgAAQADAAIAAAA/AAcAAQADAAIAAAA+AAYAAQADAAIAAABOABUAAQAFAAIAAABPABQAAQAFAAIAAABQABMAAQAFAAIAAABRABIAAQAFAAIAAABSABEAAQAFAAIAAABTABAAAQAFAAIAAABUAA8AAQAFAAIAAABVAA4AAQAFAAIAAABWAA0AAQAFAAIAAABXAAwAAQAFAAIAAABYAAsAAQAFAAIAAABZAAoAAQAFAAIAAABaAAkAAQAFAAIAAABbAAgAAQAFAAIAAABcAAcAAQAFAAIAAABdAAYAAQAFAAIAAABeAAUAAQAFAAIAAABNAAYAAQAEAAEAAABNAAcAAQAEAAEAAABKAAoAAgAEAAEAAABOABEAAQAEAAEAAABPABEAAQAEAAEAAABQABEAAQAEAAEAAABOABAAAQAEAAEAAABPABAAAQAEAAEAAABQABAAAQAEAAEAAABRABAAAQAEAAEAAABSABAAAQAEAAEAAAA=") +tile_set = SubResource("TileSet_j5wjh") +metadata/_is_ez_tiles_generated = true + +[node name="Coin" parent="." unique_id=1198916388 instance=ExtResource("6_ryrav")] +position = Vector2(1, -61) + +[node name="Coin2" parent="." unique_id=792955553 instance=ExtResource("6_ryrav")] +position = Vector2(608, -160) + +[node name="Coin3" parent="." unique_id=1551367866 instance=ExtResource("6_ryrav")] +position = Vector2(672, -224) + +[node name="Coin4" parent="." unique_id=1762745022 instance=ExtResource("6_ryrav")] +position = Vector2(736, -296) + +[node name="Coin5" parent="." unique_id=1353750555 instance=ExtResource("6_ryrav")] +position = Vector2(800, -352) + +[node name="Coin6" parent="." unique_id=1727849148 instance=ExtResource("6_ryrav")] +position = Vector2(1376, -160) + +[node name="Coin7" parent="." unique_id=1297199083 instance=ExtResource("6_ryrav")] +position = Vector2(2144, -352) + +[node name="Coin8" parent="." unique_id=1299498120 instance=ExtResource("6_ryrav")] +position = Vector2(4776, 792) + +[node name="Coin9" parent="." unique_id=1541600136 instance=ExtResource("6_ryrav")] +position = Vector2(5152, 864) diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..c6bbb7d --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..7ead1e5 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cd5gewbyasj7t" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..d80d19e --- /dev/null +++ b/project.godot @@ -0,0 +1,29 @@ +; 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=5 + +[application] + +config/name="LeoGame" +run/main_scene="uid://dnqvtckxgbhqv" +config/features=PackedStringArray("4.6", "Forward Plus") +config/icon="res://icon.svg" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/ez_tiles/plugin.cfg") + +[physics] + +3d/physics_engine="Jolt Physics" + +[rendering] + +textures/canvas_textures/default_texture_filter=0 +rendering_device/driver.windows="d3d12" diff --git a/sprites/coin/MonedaD.png b/sprites/coin/MonedaD.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1067cf895ce50e4be771c2fcceff1d52eef677 GIT binary patch literal 663 zcmV;I0%-k-P)4_cA0^h#1~*$y*|s5 zb{D}|FU#ds{`GUYEUbIA>-Wk-C+nDMTgtL;Q+0U#ub{Bt>3qq!tXIqQ+v5myoX%&G zhly)guU0NuHah4Se1L6_T}_s+d3Chn*L=tTN~goV$gAy;kUbC?ynR#;x%hcFhVb_3 z2f@A^cJt&)|2_7b@gw&4+W!&YC|rUAHG&5a_}+pz0u=C|!V`epvPT1K#!rrEF(iPd z@D~44DRg901uxM4(584Hmj29@3(5buI`*6K%Y;%+p$$;LJM0!=vm1_LE1PadfbNYt za0EB6LmYEJKnBZm{3{Sn`zk=hAK}4%@}J;=h4e)SDB$t2Wq5snv3aCyC1}qAIKjRK zUS@4d9xSDV831#El!25*eSooZ#+^&cnE`b7_#p#&b_SO9zn_8JFjD=xb5r4=LZp^W@-}U6dK9;fP z0F~Jdf-?K2)IhFZbGtA)IIlTfc(hMVpsZi4I|EqEys~*}u@{3hb;#P8N9(i=v- zV+_nCU0)aX=rhXT@sFEWYGif?m0?;>Q1Tvgkgj$D7o-!Y1;^p8UM5%&r@)&Fu!87> zSI2*wdHFxffAeL+_ecIR0pPGa5A}ek$$MmFFs!4uY2|^D*~Cqt_Y5!X;=9*>^A(l% xb&hq~@0I6l@@|?2QC^#}dD1rPu;hOMD?=A#M297xk%dv# zA+}p(p)ac=ir?~K1dyHXpZgKO&DCajE;*ugh@9x!KkXN)}*jQuEn ziT&<&H}U@)AcVDH5d=JWC-)IV)&qE=BNG6x*iQqD;)h>W3D$UWSfCPo=(2>{qB0Q4pZuLnx(rT#wwh_XfYoeIEcjm5FIqc~7 z4_(y&9+hJ05a6AlO0lPpa@l#zgIEKv6`(gtmEZwVbd>Y_cRwavTz;K>xrF3CbEp?b zEcuKq2Lm0M^0g{~H-XX_p6$wg)_?aCRrYhvh%!CQl}9#Z7ft&y*M3(16Ma4PKC*_! RHUIzs07*qoM6N<$f&fd~4I=;m literal 0 HcmV?d00001 diff --git a/sprites/coin/MonedaP.png.import b/sprites/coin/MonedaP.png.import new file mode 100644 index 0000000..1f02699 --- /dev/null +++ b/sprites/coin/MonedaP.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwye2r1dj4sq" +path="res://.godot/imported/MonedaP.png-108c922c1b6c9fedcf7da4f30c1a930e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/coin/MonedaP.png" +dest_files=["res://.godot/imported/MonedaP.png-108c922c1b6c9fedcf7da4f30c1a930e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/sprites/coin/MonedaR.png b/sprites/coin/MonedaR.png new file mode 100644 index 0000000000000000000000000000000000000000..e09add077b794d1aa422cde51f90b0d2067f7464 GIT binary patch literal 645 zcmV;00($+4P)5RSk>knjKkzjF`?kniG( zVOfCOv7ZK*TR-j6*5Cmqh39i0em)cp-qeCuhp!*kO|e3Z?HMZPYWpqvbL*F$tVLlO zpn&&Y6z=(Q@ep&~L_+}Gzgy3N5PX_WdwHQ;5a3~0!oLN=s9yyL`1Qs^KkO$wu#mRs z027{^*)P!4ZMsRIFF1%nZi_nan1vEdXdEggWDTDK<2(UrQF*C zH5OS93cLLL*vV8iwY{L=Whp?>tkbp zaoDnWYU!&1Q0v_wB;obRfy`e+t1t=x$B-&a{VW1;1?AilU=CgqV5@@0SzX-cda|x& z)Y{L5LNXrrYQS@$*mVdqEa5ASmEOcdK-U>w>cwxX{mD;M*3UVqXunmS9%0?I f*p6HETjjq2ai(ZKw<><900000NkvXXu0mjf@J2HL literal 0 HcmV?d00001 diff --git a/sprites/coin/MonedaR.png.import b/sprites/coin/MonedaR.png.import new file mode 100644 index 0000000..7d29e15 --- /dev/null +++ b/sprites/coin/MonedaR.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://30fdxc615oow" +path="res://.godot/imported/MonedaR.png-a99fdad1d1f73ea87baedcb3a4b4d2f9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/coin/MonedaR.png" +dest_files=["res://.godot/imported/MonedaR.png-a99fdad1d1f73ea87baedcb3a4b4d2f9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/sprites/coin/spr_coin_ama.png b/sprites/coin/spr_coin_ama.png new file mode 100644 index 0000000000000000000000000000000000000000..51a5f56a1bba74d72656c43964215c37f26fbf6b GIT binary patch literal 522 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 TwM0$;sGRe3^>bP0l+XkKc`3+~ literal 0 HcmV?d00001 diff --git a/sprites/dino/DinoSprites - doux.png.import b/sprites/dino/DinoSprites - doux.png.import new file mode 100644 index 0000000..ed63262 --- /dev/null +++ b/sprites/dino/DinoSprites - doux.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw64sm6hvikka" +path="res://.godot/imported/DinoSprites - doux.png-d51036e5161b6cff627ade033fad6f3e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/dino/DinoSprites - doux.png" +dest_files=["res://.godot/imported/DinoSprites - doux.png-d51036e5161b6cff627ade033fad6f3e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/sprites/dino/DinoSprites - mort.png b/sprites/dino/DinoSprites - mort.png new file mode 100644 index 0000000000000000000000000000000000000000..90899237840398fbc4edab2ae9621fa34c65596c GIT binary patch literal 1906 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 literal 0 HcmV?d00001 diff --git a/sprites/dino/DinoSprites - vita.png.import b/sprites/dino/DinoSprites - vita.png.import new file mode 100644 index 0000000..c2b52ba --- /dev/null +++ b/sprites/dino/DinoSprites - vita.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnfmpot7qh8wu" +path="res://.godot/imported/DinoSprites - vita.png-4c4596cbc96a240c1c95612bc8b4e2ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/dino/DinoSprites - vita.png" +dest_files=["res://.godot/imported/DinoSprites - vita.png-4c4596cbc96a240c1c95612bc8b4e2ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1