├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug-report.md │ └── feature-request.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── publish_to_web.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── addons ├── entity_api │ ├── icon.png │ ├── icon.png.import │ ├── materials │ │ └── bbox.material │ ├── plugin.cfg │ ├── plugin.gd │ └── scripts │ │ ├── LogicManager.gd │ │ └── classes │ │ └── LogicEntity.gd ├── gdunzip │ ├── LICENSE │ └── gdunzip.gd └── vmflib │ ├── LICENSE │ ├── README.md │ ├── VMF.gd │ ├── VMFDataManager.gd │ ├── VMFRoot.gd │ ├── examples │ ├── Example1.gd │ ├── Example1.tscn │ ├── Example2.gd │ └── Example2.tscn │ ├── icon │ ├── .gdignore │ └── icon.png │ ├── plugin.cfg │ └── vmflib_plugin.gd ├── build └── html5 │ ├── .gitignore │ ├── favicon.png │ ├── index.html │ ├── index.js │ ├── index.pck │ ├── index.png │ └── index.wasm ├── default_env.tres ├── editor_assets ├── entities │ ├── CoinEntity.scn │ ├── DirectionGizmo.scn │ ├── DoorEntity.scn │ ├── EnemyEntity.scn │ ├── LightEntity.scn │ ├── PlayerStart.scn │ └── TableEntity.scn ├── pack_manifest.json └── textures │ ├── black.png │ ├── black.png.import │ ├── brick_1.png │ ├── brick_1.png.import │ ├── building_1.png │ ├── building_1.png.import │ ├── building_2.png │ ├── building_2.png.import │ ├── carpet_1.png │ ├── carpet_1.png.import │ ├── concrete_1.png │ ├── concrete_1.png.import │ ├── concrete_2.png │ ├── concrete_2.png.import │ ├── concrete_3.png │ ├── concrete_3.png.import │ ├── concrete_4.png │ ├── concrete_4.png.import │ ├── concrete_5.png │ ├── concrete_5.png.import │ ├── concrete_6.png │ ├── concrete_6.png.import │ ├── dirt_1.png │ ├── dirt_1.png.import │ ├── fullres │ ├── .gdignore │ ├── brick_1.jpg │ ├── building_1.jpg │ ├── building_2.jpg │ ├── carpet_1.jpg │ ├── concrete_1.jpg │ ├── concrete_2.png │ ├── concrete_3.jpg │ ├── concrete_4.jpg │ ├── concrete_5.jpg │ ├── concrete_6.jpg │ ├── dirt_1.jpg │ ├── grass_1.jpg │ ├── leather_1.jpg │ ├── stone_1.jpg │ └── wall_1.jpg │ ├── grass_1.png │ ├── grass_1.png.import │ ├── grey_dev.png │ ├── grey_dev.png.import │ ├── leather_1.png │ ├── leather_1.png.import │ ├── orange_dev.png │ ├── orange_dev.png.import │ ├── portal2 │ ├── builtin_black.vmt │ ├── builtin_black.vtf │ ├── builtin_brick_1.vmt │ ├── builtin_brick_1.vtf │ ├── builtin_building_1.vmt │ ├── builtin_building_1.vtf │ ├── builtin_building_2.vmt │ ├── builtin_building_2.vtf │ ├── builtin_carpet_1.vmt │ ├── builtin_carpet_1.vtf │ ├── builtin_concrete_1.vmt │ ├── builtin_concrete_1.vtf │ ├── builtin_concrete_2.vmt │ ├── builtin_concrete_2.vtf │ ├── builtin_concrete_3.vmt │ ├── builtin_concrete_3.vtf │ ├── builtin_concrete_4.vmt │ ├── builtin_concrete_4.vtf │ ├── builtin_concrete_5.vmt │ ├── builtin_concrete_5.vtf │ ├── builtin_concrete_6.vmt │ ├── builtin_concrete_6.vtf │ ├── builtin_dev_grey.vmt │ ├── builtin_dev_grey.vtf │ ├── builtin_dev_orange.vmt │ ├── builtin_dev_orange.vtf │ ├── builtin_dirt_1.vmt │ ├── builtin_dirt_1.vtf │ ├── builtin_grass_1.vmt │ ├── builtin_grass_1.vtf │ ├── builtin_leather_1.vmt │ ├── builtin_leather_1.vtf │ ├── builtin_stone_1.vmt │ ├── builtin_stone_1.vtf │ ├── builtin_wall_1.vmt │ └── builtin_wall_1.vtf │ ├── sources.txt │ ├── stone_1.png │ ├── stone_1.png.import │ ├── wall_1.png │ ├── wall_1.png.import │ ├── white.png │ └── white.png.import ├── export_presets.cfg ├── fonts ├── original │ └── rubik │ │ ├── README.md │ │ ├── Rubik-Black.ttf │ │ ├── Rubik-BlackItalic.ttf │ │ ├── Rubik-Bold.ttf │ │ ├── Rubik-BoldItalic.ttf │ │ ├── Rubik-ExtraBold.ttf │ │ ├── Rubik-ExtraBoldItalic.ttf │ │ ├── Rubik-Italic.ttf │ │ ├── Rubik-Light.ttf │ │ ├── Rubik-LightItalic.ttf │ │ ├── Rubik-Medium.ttf │ │ ├── Rubik-MediumItalic.ttf │ │ ├── Rubik-Regular.ttf │ │ ├── Rubik-SemiBold.ttf │ │ └── Rubik-SemiBoldItalic.ttf └── rubik │ └── Rubik_18.tres ├── images ├── editor │ ├── entities │ │ ├── lightbulb.png │ │ ├── lightbulb.png.import │ │ ├── player_spawn.png │ │ └── player_spawn.png.import │ └── textures │ │ ├── highlight.png │ │ ├── highlight.png.import │ │ ├── portal2 │ │ ├── default_white.vmt │ │ └── default_white.vtf │ │ ├── white.png │ │ └── white.png.import ├── icons │ ├── add.png │ ├── add.png.import │ ├── circle.png │ ├── circle.png.import │ ├── connection.png │ ├── connection.png.import │ ├── crosshair.png │ ├── crosshair.png.import │ ├── down.png │ ├── down.png.import │ ├── entity_coin.png │ ├── entity_coin.png.import │ ├── left.png │ ├── left.png.import │ ├── light.png │ ├── light.png.import │ ├── mobile.png │ ├── mobile.png.import │ ├── mouse.png │ ├── mouse.png.import │ ├── mouse_left.png │ ├── mouse_left.png.import │ ├── mouse_right.png │ ├── mouse_right.png.import │ ├── play.png │ ├── play.png.import │ ├── reload.png │ ├── reload.png.import │ ├── right.png │ ├── right.png.import │ ├── search.png │ ├── search.png.import │ ├── select.png │ ├── select.png.import │ ├── trash.png │ ├── trash.png.import │ ├── trash_clickbitmap.bmp │ ├── trash_clickbitmap.bmp.import │ ├── up.png │ ├── up.png.import │ ├── vovel_build.png │ ├── vovel_build.png.import │ ├── vovel_delete.png │ ├── vovel_delete.png.import │ ├── voxel.png │ ├── voxel.png.import │ ├── voxel_textured.png │ └── voxel_textured.png.import └── logo │ ├── icon.icns │ ├── icon.ico │ ├── icon.png │ ├── icon.png.import │ ├── icon512.png │ ├── icon512.png.import │ ├── loading.png │ ├── loading.png.import │ ├── logo.png │ └── logo.png.import ├── materials ├── action_gizmo_arrowx.material ├── action_gizmo_arrowy.material ├── action_gizmo_arrowz.material └── action_gizmo_selector.material ├── models ├── door │ ├── anim │ │ ├── close.anim │ │ ├── close_idle.anim │ │ ├── open.anim │ │ └── open_idle.anim │ ├── door.glb │ ├── door.glb.import │ ├── door.material │ └── doorframe.material ├── raw │ ├── door.blend │ └── door.blend1 ├── sources.txt └── table │ ├── Material.material │ ├── table.glb │ └── table.glb.import ├── project.godot ├── scenes ├── Main.tscn ├── editor │ ├── Cube.tscn │ ├── Player.tscn │ └── Room.tscn └── menu │ ├── ConnectionItem.tscn │ └── TouchControls.tscn ├── scripts ├── Globals.gd ├── Main.gd ├── editor │ ├── Camera.gd │ ├── Cube.gd │ ├── LightPanel.gd │ ├── Play.gd │ ├── Player.gd │ ├── Room.gd │ ├── SoundEffect.gd │ ├── ToolBar.gd │ ├── ToolBarUpDown.gd │ └── TouchControls.gd ├── menu │ ├── About.gd │ ├── Add.gd │ ├── ConfirmNewLevel.gd │ ├── ConnectionItem.gd │ ├── ConnectionList.gd │ ├── Crosshair.gd │ ├── Edit.gd │ ├── EntityFileSelect.gd │ ├── EntityList.gd │ ├── ExportDialog.gd │ ├── Feedback.gd │ ├── File.gd │ ├── FileSelect.gd │ ├── LevelName.gd │ ├── LightingButton.gd │ ├── Properties.gd │ ├── QuitRequest.gd │ ├── TextureFileSelect.gd │ └── TextureList.gd └── util │ └── PackLoader.gd ├── shaders └── crosshair.shader ├── sounds ├── background │ ├── concentration.ogg │ └── concentration.ogg.import └── editor │ ├── README.md │ ├── click.wav │ └── click.wav.import └── theme ├── button ├── disabled.stylebox ├── focus.stylebox ├── hover.stylebox ├── normal.stylebox └── pressed.stylebox ├── lineedit ├── disabled.stylebox ├── focus.stylebox └── normal.stylebox ├── main.theme ├── main ├── button │ ├── disabled.stylebox │ ├── focus.stylebox │ ├── hover.stylebox │ ├── normal.stylebox │ └── pressed.stylebox ├── panel │ └── panel.stylebox └── popup_menu │ └── panel.stylebox ├── menu.theme └── popup_menu ├── hover.stylebox └── panel.stylebox /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: craftablescience 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Create a report to help us improve. 4 | title: "[BUG] Name of issue here" 5 | labels: bug 6 | assignees: craftablescience 7 | 8 | --- 9 | 10 | **Godot Version & Plugin Version** 11 | Godot: *x.x.x* 12 | Plugin: *x.x.x* 13 | 14 | **Describe the bug** 15 | A clear and concise description of what the bug is. 16 | 17 | **Screenshots** 18 | A screenshot of Godot Editor while you are encountering this bug, or a clear screenshot of the Editor/External console. 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request 3 | about: Suggest an idea for this project. 4 | title: "[FEATURE] Name of feature idea here" 5 | labels: enhancement 6 | assignees: craftablescience 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Fixes/implements #--. 2 | 3 | ### Changes: 4 | - Change 1 5 | - Change 2 6 | - Change 3 7 | 8 | Please assign @craftablescience, and mark this PR as an enhancement. 9 | -------------------------------------------------------------------------------- /.github/workflows/publish_to_web.yml: -------------------------------------------------------------------------------- 1 | name: PublishToWeb 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Copy 12 | uses: andstor/copycat-action@v3.2.3 13 | with: 14 | personal_token: ${{ secrets.PERSONAL_TOKEN }} 15 | src_path: /build/html5/. 16 | dst_path: / 17 | src_branch: main 18 | dst_branch: web 19 | dst_owner: craftablescience 20 | clean: true 21 | commit_message: "Actions: Update web branch to latest version" 22 | username: "craftablescience" 23 | email: "brendanelewis@gmail.com" 24 | dst_repo_name: GodotPuzzlemaker 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Godot-specific ignores 3 | .import/ 4 | build/win64 5 | build/x11 6 | debug.log 7 | discordid.txt 8 | 9 | # Imported translations (automatically generated from CSV files) 10 | *.translation 11 | 12 | # Mono-specific ignores 13 | .mono/ 14 | data_*/ 15 | mono_crash.*.json 16 | 17 | # System/tool-specific ignores 18 | .directory 19 | *~ 20 | 21 | # Plugin specific ignores 22 | screenshots/ 23 | 24 | 25 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at brendanelewis@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Reporting Issues: 2 | - Please use an issue template if you wish to report a bug or request a feature. 3 | - Go into detail wherever possible, and if the bug is visual please send a screenshot. 4 | - If a bug compromises user data in some way, see `SECURITY.md`. 5 | 6 | ## Conduct: 7 | - Follow the rules outlined in `CODE_OF_CONDUCT.md`. 8 | 9 | ## Code Contributions: 10 | - If you are creating a new feature, please save your work in a new scene to avoid merge conflicts. 11 | - Please save scripts in the `scripts` directory, scenes in the `scenes` directory, etc. 12 | - Add comments if your code is even slightly difficult to read at first glance. 13 | 14 | ## Texture Contributions: 15 | - Textures must be from copyright-free sources to be included in the project. 16 | Please list the source of the texture(s) in `images/editor/textures/sources.txt`. 17 | If you created the texture(s), put your own name. 18 | 19 | ## Entity Contributions: 20 | - I advise against contributing complex entities until the logic system is implemented. 21 | - However, 3D models from copyright-free sources are greatly appreciated. 22 | Please list the source of the model(s) in `models/sources.txt`, and put the model (preferably a GLTF2 or GLB) in the `models` directory. 23 | If you created the model(s), put your own name. 24 | 25 | ## Wiki: 26 | - You may edit the wiki to add relevant information. **DO NOT** edit the wiki purely to mess up existing articles. 27 | - When editing the wiki, please stay professional and on-topic, but hyper-formal speech is not required. 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Godot Puzzlemaker 2 | [![Discord](https://img.shields.io/discord/678074864346857482?logo=discord&style=flat-square)](https://discord.gg/ASgHfkX/) 3 | 4 | A work in progress voxel-based level editor. Currently supports exporting to Portal 2, custom textures, entities, saving/loading levels, and more. 5 | 6 | Try it out [here!](https://craftablescience.github.io/GodotPuzzlemaker) 7 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | While in alpha, only the current version will be updated to fix security issues. Please always update to the latest version. 6 | 7 | ## Reporting a Vulnerability 8 | 9 | Please e-mail me at `brendanelewis@gmail.com` if the vulnerability is critical, and could compromise user data. I will work on fixing it immediately. 10 | If the vulnerability is not serious, or you are just experiencing a bug, please report it on this repository's Issues tracker. 11 | -------------------------------------------------------------------------------- /addons/entity_api/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/addons/entity_api/icon.png -------------------------------------------------------------------------------- /addons/entity_api/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-0d8de506c0dbae3259d5835d2e07463d.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://addons/entity_api/icon.png" 13 | dest_files=[ "res://.import/icon.png-0d8de506c0dbae3259d5835d2e07463d.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /addons/entity_api/materials/bbox.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/addons/entity_api/materials/bbox.material -------------------------------------------------------------------------------- /addons/entity_api/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="EntityAPI" 4 | description="A custom entity API for GodotPuzzlemaker. Also adds a logic system." 5 | author="craftablescience" 6 | version="0.0.1" 7 | script="plugin.gd" 8 | -------------------------------------------------------------------------------- /addons/entity_api/plugin.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends EditorPlugin 3 | 4 | 5 | func _enter_tree() -> void: 6 | pass 7 | 8 | func _exit_tree() -> void: 9 | pass 10 | -------------------------------------------------------------------------------- /addons/entity_api/scripts/LogicManager.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # int ID -:- LogicEntity entity 4 | var entity_registry: Dictionary 5 | # string input names -:- array of dictionaries of [entity ID that subscribes to the input -:- FuncRef that takes one dictionary as input] 6 | var inputs: Dictionary 7 | # output id -:- dict{output name -:- array[of dicts{input id -:- FuncRef}]} 8 | var connections: Dictionary = {} 9 | onready var is_active: bool = false 10 | 11 | const ON_LOGIC_MANAGER_ACTIVATE = "OnLogicManagerActivate" 12 | const ON_LOGIC_MANAGER_DEACTIVATE = "OnLogicManagerDeactivate" 13 | 14 | 15 | func add_logic_entity(id: int, ent: Node) -> void: 16 | entity_registry[id] = ent 17 | 18 | func remove_logic_entity(id: int) -> void: 19 | entity_registry.erase(id) 20 | 21 | func add_input(input_name: String, id: int, function_name: String) -> void: 22 | var func_ref: FuncRef = FuncRef.new() 23 | func_ref.set_function(function_name) 24 | func_ref.set_instance(entity_registry[id]) 25 | if !inputs.has(input_name): 26 | inputs[input_name] = [] 27 | inputs[input_name].append({"id": id, "function": func_ref}) 28 | 29 | func broadcast(output_name: String, arguments: Dictionary) -> void: 30 | if inputs.has(output_name): 31 | for input in inputs[output_name]: 32 | if input["function"].is_valid(): 33 | input["function"].call_func(arguments) 34 | 35 | func broadcast_to(output_name: String, id: int, arguments: Dictionary) -> void: 36 | if inputs.has(output_name): 37 | for input in inputs[output_name]: 38 | if input["id"] == id and input["function"].is_valid(): 39 | input["function"].call_func(arguments) 40 | 41 | func fire_output(output_id: int, output: String, arguments: Dictionary) -> void: 42 | pass 43 | 44 | func get_entity_from_id(id: int) -> Node: 45 | return entity_registry[id] 46 | 47 | func set_active(active: bool) -> void: 48 | is_active = active 49 | if is_active: 50 | broadcast(ON_LOGIC_MANAGER_ACTIVATE, {}) 51 | else: 52 | broadcast(ON_LOGIC_MANAGER_DEACTIVATE, {}) 53 | 54 | func get_active() -> bool: 55 | return is_active 56 | -------------------------------------------------------------------------------- /addons/entity_api/scripts/classes/LogicEntity.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | class_name LogicEntity, "res://addons/entity_api/icon.png" 3 | 4 | 5 | var connection_list: Node 6 | var roomNode: Node 7 | var clickable_area: Area 8 | var object_area: Area 9 | var collider: CollisionShape 10 | var object_collider: CollisionShape 11 | var coldata: BoxShape 12 | var csg_preview: CSGBox 13 | var logic_id: int 14 | var inputlist: Array = [] 15 | 16 | 17 | func _init() -> void: 18 | self.clickable_area = Area.new() 19 | self.clickable_area.transform.origin.y = 5 20 | self.add_child(self.clickable_area) 21 | self.collider = CollisionShape.new() 22 | self.clickable_area.add_child(self.collider) 23 | self.coldata = BoxShape.new() 24 | self.coldata.extents = Vector3(4, 4, 4) 25 | self.collider.shape = self.coldata 26 | self.clickable_area.connect("input_event", self, "_on_click") 27 | 28 | self.object_area = Area.new() 29 | self.object_area.transform.origin.y = 5 30 | self.add_child(self.object_area) 31 | self.object_collider = CollisionShape.new() 32 | self.object_area.add_child(object_collider) 33 | self.object_collider.shape = self.coldata 34 | self.object_area.connect("body_entered", self, "start_touching_object") 35 | self.object_area.connect("body_exited", self, "stop_touching_object") 36 | 37 | self.csg_preview = CSGBox.new() 38 | self.csg_preview.transform.origin.y = 5 39 | self.csg_preview.height = 8 40 | self.csg_preview.width = 8 41 | self.csg_preview.depth = 8 42 | self.csg_preview.material = preload("../../materials/bbox.material") 43 | self.add_child(self.csg_preview) 44 | 45 | func _editor_set_connection_list(list: Node) -> void: 46 | self.connection_list = list 47 | 48 | func _editor_set_room(room: Node) -> void: 49 | self.roomNode = room 50 | 51 | func _on_click(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 52 | if !self.collider.disabled and event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed and self.roomNode.toolSelected == Globals.TOOL.CONNECTION: 53 | self.connection_list.add_connection(self) 54 | elif !self.collider.disabled and event is InputEventMouseButton and event.button_index == BUTTON_LEFT and self.roomNode.toolSelected == Globals.TOOL.PLACEENTITY: 55 | # todo: remove this entity from self.roomNode 56 | self.queue_free() 57 | 58 | func set_collider_disabled(disabled: bool) -> void: 59 | self.collider.disabled = disabled 60 | if disabled: 61 | self.csg_preview.hide() 62 | else: 63 | self.csg_preview.show() 64 | 65 | func get_collider_disabled() -> bool: 66 | return self.collider.disabled 67 | 68 | func set_click_collider(collider: Shape) -> void: 69 | self.collider.shape = collider 70 | 71 | func set_logic_collider(collider: Shape) -> void: 72 | self.object_collider.shape = collider 73 | 74 | func set_logic_id(id: int) -> void: 75 | logic_id = id 76 | LogicManager.add_logic_entity(logic_id, self) 77 | 78 | func register_input(input_name: String, function_name: String) -> void: 79 | LogicManager.add_input(input_name, logic_id, function_name) 80 | inputlist.append(input_name) 81 | 82 | func broadcast(input_name: String, arguments: Dictionary) -> void: 83 | LogicManager.broadcast(input_name, arguments) 84 | 85 | func broadcast_to(id: int, input_name: String, arguments: Dictionary) -> void: 86 | LogicManager.broadcast_to(input_name, id, arguments) 87 | 88 | func get_inputs() -> Array: 89 | return inputlist 90 | 91 | # -v- these should be redefined for your game -v- 92 | 93 | func is_player(node: Node) -> bool: 94 | return node.has_method("_i_am_the_player_fear_me_") 95 | 96 | # -^- end -^- 97 | 98 | # -v- these can be overridden by your entity as needed -v- 99 | 100 | func start_touching_object(node: Node) -> void: 101 | pass 102 | 103 | func stop_touching_object(node: Node) -> void: 104 | pass 105 | 106 | func get_outputs() -> Array: 107 | return [] 108 | 109 | # -^- end -^- 110 | -------------------------------------------------------------------------------- /addons/gdunzip/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Jelle Hermsen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /addons/vmflib/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021, Brendan Lewis 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 17 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /addons/vmflib/README.md: -------------------------------------------------------------------------------- 1 | # vmflib-godot 2 | A port of vmflib2 to the Godot Game Engine. 3 | 4 | ## Information 5 | 6 | This addon allows you to create a Source Engine VMF file, and export to a BSP. 7 | It is targeted towards Portal 2, although other games will work with it. 8 | This was made for my "Godot Puzzlemaker" level editor, and I will update it as necessary. 9 | It is targeted toward desktop platforms, but should theoretically work on any platform Godot does. 10 | 11 | The code is an improved version of [https://github.com/Trainzack/vmflib2](https://github.com/Trainzack/vmflib2), which is under the BSD 2-Clause "Simplified" License. 12 | Thus, this code is as well. See more info at LICENSE. 13 | 14 | This addon is still in development. The overall foundation is in place, it is just a matter of adding more entity and texture listings, and adding more features. 15 | 16 | ## Installation 17 | 18 | 1. Download this repository as a ZIP. 19 | 2. Unzip the downloaded file anywhere. 20 | 3. Copy the `addons/` folder to the root folder of your project. It won't overwrite any addons you currently have installed. 21 | 4. In Project Settings, under the Plugins tab select the checkbox to enable the `vmflib` plugin. 22 | 5. In Project Settings, under the AutoLoad tab add `addons/vmflib/VMFDataManager.gd` as a singleton. 23 | **Make sure it is exactly called VMFDataManager, Godot may make some letters lowercase.** 24 | 25 | ## Usage 26 | 27 | In the script to create a level, write: 28 | 29 | `var vmf = VMF.new(VMF.GAMES.GameToExportToHere)` 30 | 31 | This object is how you add brushes, entities, and export to VMF and/or BSP. 32 | 33 | To add a brush, you can write something like this. 34 | Note that every Vector3 argument uses a +Y = UP coordinate system, where the exported VMF uses a +Z = UP coordinate system. 35 | This is because of personal preference. 36 | 37 | `vmf.add_solid(VMF.Block.new(Vector3(0, 0, 0), Vector3(64, 64, 64), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush)` 38 | 39 | In the Block constructor, the first argument is the coordinates of the center of the block. 40 | The second argument is the size of the block. 41 | The third argument is the texture to use for each block face (defaults to "TOOLS/TOOLSNODRAW"). 42 | 43 | To change the texture of one face, add `.set_material_face(material: String, face: Vector3)` before `.brush`. 44 | This function modifies the block object it is called on, but it also returns the block object, so it can be chained. 45 | Use `Vector3.UP`, `Vector3.DOWN`, `Vector3.LEFT`, etc. to select the face to change. 46 | 47 | Adding an entity is slightly different. Here is an example: 48 | 49 | `var info_player_start = VMF.Entities.Common.InfoPlayerStartEntity.new(vmf, Vector3(0, 64, 0))` 50 | 51 | Each type of entity is an instance of a separate helper class. 52 | It adds itself to the VMF object passed to the constructor automatically. 53 | Depending on the type of entity, there are different arguments. 54 | 55 | Finally, run `vmf.write_vmf(file_path_here: String)` to save the VMF to the specified path, or save the value of `str(vmf)` for use in scripting. 56 | -------------------------------------------------------------------------------- /addons/vmflib/VMFDataManager.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var ENTITY_COUNT: int = 0 4 | var WORLD_COUNT: int = 0 5 | var SOLID_COUNT: int = 0 6 | var SIDE_COUNT: int = 0 7 | var GROUP_COUNT: int = 0 8 | var VISGROUP_COUNT: int = 0 9 | 10 | static func resetValues() -> void: 11 | VMFDataManager.ENTITY_COUNT = 0 12 | VMFDataManager.WORLD_COUNT = 0 13 | VMFDataManager.SOLID_COUNT = 0 14 | VMFDataManager.SIDE_COUNT = 0 15 | VMFDataManager.GROUP_COUNT = 0 16 | VMFDataManager.VISGROUP_COUNT = 0 17 | 18 | 19 | var DEFAULT_MATERIAL = "TOOLS/TOOLSNODRAW" 20 | -------------------------------------------------------------------------------- /addons/vmflib/VMFRoot.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | var vmf_class_name: String = "UntitledClass" 5 | var properties: Dictionary 6 | var auto_properties: Array 7 | var children: Array 8 | 9 | 10 | func _init(className: String) -> void: 11 | self.properties = {} 12 | self.auto_properties = [] 13 | self.children = [] 14 | self.setVmfClassName(className) 15 | 16 | func getAsStr(tab_level: int = -1) -> String: 17 | var string: String = "" 18 | var tab_prefix: String = "" 19 | for i in range(tab_level): 20 | tab_prefix += "\t" 21 | var tab_prefix_inner = tab_prefix + "\t" 22 | if self.vmf_class_name != "": 23 | string += tab_prefix + self.vmf_class_name + "\n" 24 | string += tab_prefix + "{\n" 25 | for attr_name in self.auto_properties: 26 | var value = self.get(attr_name) 27 | if !(value == null): 28 | string += tab_prefix_inner + "\"" + str(attr_name) + "\" \"" + str(value) + "\"\n" 29 | for key in self.properties.keys(): 30 | string += tab_prefix_inner + "\"" + str(key) + "\" " + "\"" + str(self.properties[key]) + "\"\n" 31 | for child in self.children: 32 | string += child.getAsStr(tab_level + 1) 33 | if self.vmf_class_name != "": 34 | string += tab_prefix + "}\n" 35 | return string 36 | 37 | func setVmfClassName(className: String) -> void: 38 | self.vmf_class_name = className 39 | 40 | func getVmfClassName() -> String: 41 | return self.vmf_class_name 42 | 43 | func getProperties() -> Dictionary: 44 | return self.properties 45 | 46 | func getAutoProperties() -> Array: 47 | return self.auto_properties 48 | 49 | func getChildren() -> Array: 50 | return self.children 51 | -------------------------------------------------------------------------------- /addons/vmflib/examples/Example1.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | 4 | func _on_pressed() -> void: 5 | var vmf = VMF.new(VMF.GAMES.PORTAL_2) 6 | 7 | vmf.add_solid(VMF.Block.new(Vector3(0, -32, 0), Vector3(512, 64, 512), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush) 8 | vmf.add_solid(VMF.Block.new(Vector3(0, 256 + 32, 0), Vector3(512, 64, 512), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush) 9 | 10 | vmf.add_solid(VMF.Block.new(Vector3(0, 128, 256 + 32), Vector3(512, 256, 64), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush) 11 | vmf.add_solid(VMF.Block.new(Vector3(0, 128, -256 - 32), Vector3(512, 256, 64), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush) 12 | 13 | vmf.add_solid(VMF.Block.new(Vector3(256 + 32, 128, 0), Vector3(64, 256, 512), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush) 14 | vmf.add_solid(VMF.Block.new(Vector3(-256 - 32, 128, 0), Vector3(64, 256, 512), vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A).brush) 15 | 16 | var info_player_start = VMF.Entities.Common.InfoPlayerStartEntity.new(vmf) 17 | var light = VMF.Entities.Common.LightEntity.new(vmf, Vector3(0,128,0)) 18 | 19 | vmf.write_vmf("user://output.vmf") 20 | 21 | get_parent().get_node("Label2").show() 22 | get_parent().get_node("Button2").show() 23 | 24 | 25 | func _on_Button2_pressed() -> void: 26 | OS.shell_open(OS.get_user_data_dir()) 27 | -------------------------------------------------------------------------------- /addons/vmflib/examples/Example1.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/vmflib/examples/Example1.gd" type="Script" id=1] 4 | 5 | [node name="Example1" type="Control"] 6 | anchor_right = 1.0 7 | anchor_bottom = 1.0 8 | __meta__ = { 9 | "_edit_use_anchors_": false 10 | } 11 | 12 | [node name="CenterContainer" type="CenterContainer" parent="."] 13 | anchor_right = 1.0 14 | anchor_bottom = 1.0 15 | 16 | [node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] 17 | margin_left = 433.0 18 | margin_top = 281.0 19 | margin_right = 590.0 20 | margin_bottom = 319.0 21 | 22 | [node name="Label" type="Label" parent="CenterContainer/VBoxContainer"] 23 | margin_right = 157.0 24 | margin_bottom = 14.0 25 | text = "Generate a simple level:" 26 | align = 1 27 | 28 | [node name="Button" type="Button" parent="CenterContainer/VBoxContainer"] 29 | margin_top = 18.0 30 | margin_right = 157.0 31 | margin_bottom = 38.0 32 | text = "Click Me" 33 | script = ExtResource( 1 ) 34 | 35 | [node name="Label2" type="Label" parent="CenterContainer/VBoxContainer"] 36 | visible = false 37 | margin_top = 42.0 38 | margin_right = 421.0 39 | margin_bottom = 56.0 40 | text = "Your VMF is at %appdata%/Godot/NameOfProjectHere/output.vmf" 41 | align = 1 42 | 43 | [node name="Button2" type="Button" parent="CenterContainer/VBoxContainer"] 44 | visible = false 45 | margin_top = 42.0 46 | margin_right = 157.0 47 | margin_bottom = 62.0 48 | text = "Show VMF" 49 | [connection signal="pressed" from="CenterContainer/VBoxContainer/Button" to="CenterContainer/VBoxContainer/Button" method="_on_pressed"] 50 | [connection signal="pressed" from="CenterContainer/VBoxContainer/Button2" to="CenterContainer/VBoxContainer/Button" method="_on_Button2_pressed"] 51 | -------------------------------------------------------------------------------- /addons/vmflib/examples/Example2.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | 4 | func _on_pressed() -> void: 5 | var vmf = VMF.new(VMF.GAMES.PORTAL_2) 6 | 7 | vmf.add_solid(VMF.Block.new(Vector3(0, 0, 0), Vector3(256, 256, 256)).set_material_side(vmf.COMMON_MATERIALS.DEV_MEASUREWALL01A, Vector3.UP).brush) 8 | 9 | var info_player_start = VMF.Entities.Common.InfoPlayerStartEntity.new(vmf) 10 | 11 | vmf.write_vmf("user://output.vmf") 12 | 13 | get_parent().get_node("Label2").show() 14 | get_parent().get_node("Button2").show() 15 | 16 | 17 | func _on_Button2_pressed() -> void: 18 | OS.shell_open(OS.get_user_data_dir()) 19 | -------------------------------------------------------------------------------- /addons/vmflib/examples/Example2.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/vmflib/examples/Example2.gd" type="Script" id=1] 4 | 5 | [node name="Example2" type="Control"] 6 | anchor_right = 1.0 7 | anchor_bottom = 1.0 8 | __meta__ = { 9 | "_edit_use_anchors_": false 10 | } 11 | 12 | [node name="CenterContainer" type="CenterContainer" parent="."] 13 | anchor_right = 1.0 14 | anchor_bottom = 1.0 15 | __meta__ = { 16 | "_edit_use_anchors_": false 17 | } 18 | 19 | [node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] 20 | margin_left = 436.0 21 | margin_top = 281.0 22 | margin_right = 587.0 23 | margin_bottom = 319.0 24 | 25 | [node name="Label" type="Label" parent="CenterContainer/VBoxContainer"] 26 | margin_right = 151.0 27 | margin_bottom = 14.0 28 | text = "Generate a single cube:" 29 | align = 1 30 | 31 | [node name="Button" type="Button" parent="CenterContainer/VBoxContainer"] 32 | margin_top = 18.0 33 | margin_right = 151.0 34 | margin_bottom = 38.0 35 | text = "Click Me" 36 | script = ExtResource( 1 ) 37 | 38 | [node name="Label2" type="Label" parent="CenterContainer/VBoxContainer"] 39 | visible = false 40 | margin_top = 42.0 41 | margin_right = 421.0 42 | margin_bottom = 56.0 43 | text = "Your VMF is at %appdata%/Godot/NameOfProjectHere/output.vmf" 44 | align = 1 45 | 46 | [node name="Button2" type="Button" parent="CenterContainer/VBoxContainer"] 47 | visible = false 48 | margin_top = 42.0 49 | margin_right = 157.0 50 | margin_bottom = 62.0 51 | text = "Show VMF" 52 | [connection signal="pressed" from="CenterContainer/VBoxContainer/Button" to="CenterContainer/VBoxContainer/Button" method="_on_pressed"] 53 | [connection signal="pressed" from="CenterContainer/VBoxContainer/Button2" to="CenterContainer/VBoxContainer/Button" method="_on_Button2_pressed"] 54 | -------------------------------------------------------------------------------- /addons/vmflib/icon/.gdignore: -------------------------------------------------------------------------------- 1 | icon.png -------------------------------------------------------------------------------- /addons/vmflib/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/addons/vmflib/icon/icon.png -------------------------------------------------------------------------------- /addons/vmflib/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="vmflib" 4 | description="A port of the vmflib2 code at https://github.com/Trainzack/vmflib2." 5 | author="craftablescience" 6 | version="0.1.1" 7 | script="vmflib_plugin.gd" 8 | -------------------------------------------------------------------------------- /addons/vmflib/vmflib_plugin.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends EditorPlugin 3 | 4 | 5 | func _enter_tree() -> void: 6 | pass 7 | 8 | func _exit_tree() -> void: 9 | pass 10 | -------------------------------------------------------------------------------- /build/html5/.gitignore: -------------------------------------------------------------------------------- 1 | *.import 2 | GodotPuzzlemaker.zip 3 | html5.zip 4 | GodotPuzzlemaker_html5.zip -------------------------------------------------------------------------------- /build/html5/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/build/html5/favicon.png -------------------------------------------------------------------------------- /build/html5/index.pck: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/build/html5/index.pck -------------------------------------------------------------------------------- /build/html5/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/build/html5/index.png -------------------------------------------------------------------------------- /build/html5/index.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/build/html5/index.wasm -------------------------------------------------------------------------------- /default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_sky = SubResource( 1 ) 7 | ambient_light_color = Color( 1, 1, 1, 1 ) 8 | ambient_light_sky_contribution = 0.0 9 | dof_blur_far_distance = 100.0 10 | dof_blur_far_transition = 10.0 11 | dof_blur_far_amount = 0.01 12 | -------------------------------------------------------------------------------- /editor_assets/entities/CoinEntity.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/CoinEntity.scn -------------------------------------------------------------------------------- /editor_assets/entities/DirectionGizmo.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/DirectionGizmo.scn -------------------------------------------------------------------------------- /editor_assets/entities/DoorEntity.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/DoorEntity.scn -------------------------------------------------------------------------------- /editor_assets/entities/EnemyEntity.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/EnemyEntity.scn -------------------------------------------------------------------------------- /editor_assets/entities/LightEntity.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/LightEntity.scn -------------------------------------------------------------------------------- /editor_assets/entities/PlayerStart.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/PlayerStart.scn -------------------------------------------------------------------------------- /editor_assets/entities/TableEntity.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/entities/TableEntity.scn -------------------------------------------------------------------------------- /editor_assets/pack_manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "category": { 3 | "id": "builtin", 4 | "name": "Built-In" 5 | }, 6 | "textures": [ 7 | { 8 | "id": "black", 9 | "name": "Black", 10 | "path": "black.png", 11 | "portal2_path": { 12 | "vtf": "portal2/builtin_black.vtf", 13 | "vmt": "portal2/builtin_black.vmt" 14 | } 15 | }, 16 | { 17 | "id": "dev_orange", 18 | "name": "Dev Orange", 19 | "path": "orange_dev.png", 20 | "portal2_path": { 21 | "vtf": "portal2/builtin_dev_orange.vtf", 22 | "vmt": "portal2/builtin_dev_orange.vmt" 23 | } 24 | }, 25 | { 26 | "id": "dev_grey", 27 | "name": "Dev Grey", 28 | "path": "grey_dev.png", 29 | "portal2_path": { 30 | "vtf": "portal2/builtin_dev_grey.vtf", 31 | "vmt": "portal2/builtin_dev_grey.vmt" 32 | } 33 | }, 34 | { 35 | "id": "brick_1", 36 | "name": "Brick 1", 37 | "path": "brick_1.png", 38 | "portal2_path": { 39 | "vtf": "portal2/builtin_brick_1.vtf", 40 | "vmt": "portal2/builtin_brick_1.vmt" 41 | } 42 | }, 43 | { 44 | "id": "building_1", 45 | "name": "Building 1", 46 | "path": "building_1.png", 47 | "portal2_path": { 48 | "vtf": "portal2/builtin_building_1.vtf", 49 | "vmt": "portal2/builtin_building_1.vmt" 50 | } 51 | }, 52 | { 53 | "id": "building_2", 54 | "name": "Building 2", 55 | "path": "building_2.png", 56 | "portal2_path": { 57 | "vtf": "portal2/builtin_building_2.vtf", 58 | "vmt": "portal2/builtin_building_2.vmt" 59 | } 60 | }, 61 | { 62 | "id": "carpet_1", 63 | "name": "Carpet 1", 64 | "path": "carpet_1.png", 65 | "portal2_path": { 66 | "vtf": "portal2/builtin_carpet_1.vtf", 67 | "vmt": "portal2/builtin_carpet_1.vmt" 68 | } 69 | }, 70 | { 71 | "id": "concrete_1", 72 | "name": "Concrete 1", 73 | "path": "concrete_1.png", 74 | "portal2_path": { 75 | "vtf": "portal2/builtin_concrete_1.vtf", 76 | "vmt": "portal2/builtin_concrete_1.vmt" 77 | } 78 | }, 79 | { 80 | "id": "concrete_2", 81 | "name": "Concrete 2", 82 | "path": "concrete_2.png", 83 | "portal2_path": { 84 | "vtf": "portal2/builtin_concrete_2.vtf", 85 | "vmt": "portal2/builtin_concrete_2.vmt" 86 | } 87 | }, 88 | { 89 | "id": "concrete_3", 90 | "name": "Concrete 3", 91 | "path": "concrete_3.png", 92 | "portal2_path": { 93 | "vtf": "portal2/builtin_concrete_3.vtf", 94 | "vmt": "portal2/builtin_concrete_3.vmt" 95 | } 96 | }, 97 | { 98 | "id": "concrete_4", 99 | "name": "Concrete 4", 100 | "path": "concrete_4.png", 101 | "portal2_path": { 102 | "vtf": "portal2/builtin_concrete_4.vtf", 103 | "vmt": "portal2/builtin_concrete_4.vmt" 104 | } 105 | }, 106 | { 107 | "id": "concrete_5", 108 | "name": "Concrete 5", 109 | "path": "concrete_5.png", 110 | "portal2_path": { 111 | "vtf": "portal2/builtin_concrete_5.vtf", 112 | "vmt": "portal2/builtin_concrete_5.vmt" 113 | } 114 | }, 115 | { 116 | "id": "concrete_6", 117 | "name": "Concrete 6", 118 | "path": "concrete_6.png", 119 | "portal2_path": { 120 | "vtf": "portal2/builtin_concrete_6.vtf", 121 | "vmt": "portal2/builtin_concrete_6.vmt" 122 | } 123 | }, 124 | { 125 | "id": "dirt_1", 126 | "name": "Dirt 1", 127 | "path": "dirt_1.png", 128 | "portal2_path": { 129 | "vtf": "portal2/builtin_dirt_1.vtf", 130 | "vmt": "portal2/builtin_dirt_1.vmt" 131 | } 132 | }, 133 | { 134 | "id": "grass_1", 135 | "name": "Grass 1", 136 | "path": "grass_1.png", 137 | "portal2_path": { 138 | "vtf": "portal2/builtin_grass_1.vtf", 139 | "vmt": "portal2/builtin_grass_1.vmt" 140 | } 141 | }, 142 | { 143 | "id": "leather_1", 144 | "name": "Leather 1", 145 | "path": "leather_1.png", 146 | "portal2_path": { 147 | "vtf": "portal2/builtin_leather_1.vtf", 148 | "vmt": "portal2/builtin_leather_1.vmt" 149 | } 150 | }, 151 | { 152 | "id": "stone_1", 153 | "name": "Stone 1", 154 | "path": "stone_1.png", 155 | "portal2_path": { 156 | "vtf": "portal2/builtin_stone_1.vtf", 157 | "vmt": "portal2/builtin_stone_1.vmt" 158 | } 159 | }, 160 | { 161 | "id": "wall_1", 162 | "name": "Wall 1", 163 | "path": "wall_1.png", 164 | "portal2_path": { 165 | "vtf": "portal2/builtin_wall_1.vtf", 166 | "vmt": "portal2/builtin_wall_1.vmt" 167 | } 168 | } 169 | ], 170 | "entities": [ 171 | { 172 | "id": "player_start", 173 | "name": "Player Spawn", 174 | "path": "PlayerStart.scn", 175 | "portal2_equivalent": "info_player_start" 176 | }, 177 | { 178 | "id": "coin", 179 | "name": "Coin", 180 | "path": "CoinEntity.scn" 181 | }, 182 | { 183 | "id": "door", 184 | "name": "Door", 185 | "path": "DoorEntity.scn" 186 | }, 187 | { 188 | "id": "table", 189 | "name": "Table", 190 | "path": "TableEntity.scn" 191 | }, 192 | { 193 | "id": "enemy", 194 | "name": "Enemy", 195 | "path": "EnemyEntity.scn" 196 | }, 197 | { 198 | "id": "direction_gizmo", 199 | "name": "Direction Helper", 200 | "path": "DirectionGizmo.scn" 201 | }, 202 | { 203 | "id": "omnilight", 204 | "name": "Light", 205 | "path": "LightEntity.scn", 206 | "portal2_equivalent": "light" 207 | } 208 | ] 209 | } -------------------------------------------------------------------------------- /editor_assets/textures/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/black.png -------------------------------------------------------------------------------- /editor_assets/textures/black.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/black.png-1f415e2f82f999a08836ad17e833cb04.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/black.png" 10 | dest_files=[ "res://.import/black.png-1f415e2f82f999a08836ad17e833cb04.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/brick_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/brick_1.png -------------------------------------------------------------------------------- /editor_assets/textures/brick_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/brick_1.png-89a3584ec785a419b257078409706676.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/brick_1.png" 10 | dest_files=[ "res://.import/brick_1.png-89a3584ec785a419b257078409706676.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/building_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/building_1.png -------------------------------------------------------------------------------- /editor_assets/textures/building_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/building_1.png-21cb1d6cd0fa2de711e90b4bfbecb0d0.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/building_1.png" 10 | dest_files=[ "res://.import/building_1.png-21cb1d6cd0fa2de711e90b4bfbecb0d0.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/building_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/building_2.png -------------------------------------------------------------------------------- /editor_assets/textures/building_2.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/building_2.png-e4733e4d9bf088a36189cda22e4c3e3e.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/building_2.png" 10 | dest_files=[ "res://.import/building_2.png-e4733e4d9bf088a36189cda22e4c3e3e.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/carpet_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/carpet_1.png -------------------------------------------------------------------------------- /editor_assets/textures/carpet_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/carpet_1.png-cb22c31b1df78cf5149c8fec4920086f.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/carpet_1.png" 10 | dest_files=[ "res://.import/carpet_1.png-cb22c31b1df78cf5149c8fec4920086f.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/concrete_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/concrete_1.png -------------------------------------------------------------------------------- /editor_assets/textures/concrete_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/concrete_1.png-c81edbfba10e2c955bd38f6862469c86.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/concrete_1.png" 10 | dest_files=[ "res://.import/concrete_1.png-c81edbfba10e2c955bd38f6862469c86.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/concrete_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/concrete_2.png -------------------------------------------------------------------------------- /editor_assets/textures/concrete_2.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/concrete_2.png-2448792a5619da08b85c2023b485d6ea.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/concrete_2.png" 10 | dest_files=[ "res://.import/concrete_2.png-2448792a5619da08b85c2023b485d6ea.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/concrete_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/concrete_3.png -------------------------------------------------------------------------------- /editor_assets/textures/concrete_3.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/concrete_3.png-bbe2906f4dd3cca848dcb1ed0fd3791c.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/concrete_3.png" 10 | dest_files=[ "res://.import/concrete_3.png-bbe2906f4dd3cca848dcb1ed0fd3791c.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/concrete_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/concrete_4.png -------------------------------------------------------------------------------- /editor_assets/textures/concrete_4.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/concrete_4.png-55db4b7c310eda250058345371f551f1.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/concrete_4.png" 10 | dest_files=[ "res://.import/concrete_4.png-55db4b7c310eda250058345371f551f1.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/concrete_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/concrete_5.png -------------------------------------------------------------------------------- /editor_assets/textures/concrete_5.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/concrete_5.png-06efa116c9269fb9c45c588518fa8ca9.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/concrete_5.png" 10 | dest_files=[ "res://.import/concrete_5.png-06efa116c9269fb9c45c588518fa8ca9.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/concrete_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/concrete_6.png -------------------------------------------------------------------------------- /editor_assets/textures/concrete_6.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/concrete_6.png-b0c107517f6be05ec77146b7019af909.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/concrete_6.png" 10 | dest_files=[ "res://.import/concrete_6.png-b0c107517f6be05ec77146b7019af909.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/dirt_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/dirt_1.png -------------------------------------------------------------------------------- /editor_assets/textures/dirt_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/dirt_1.png-4c5062a0a375e16b016f142cb64dbe83.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/dirt_1.png" 10 | dest_files=[ "res://.import/dirt_1.png-4c5062a0a375e16b016f142cb64dbe83.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/fullres/.gdignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/.gdignore -------------------------------------------------------------------------------- /editor_assets/textures/fullres/brick_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/brick_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/building_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/building_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/building_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/building_2.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/carpet_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/carpet_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/concrete_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/concrete_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/concrete_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/concrete_2.png -------------------------------------------------------------------------------- /editor_assets/textures/fullres/concrete_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/concrete_3.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/concrete_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/concrete_4.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/concrete_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/concrete_5.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/concrete_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/concrete_6.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/dirt_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/dirt_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/grass_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/grass_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/leather_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/leather_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/stone_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/stone_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/fullres/wall_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/fullres/wall_1.jpg -------------------------------------------------------------------------------- /editor_assets/textures/grass_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/grass_1.png -------------------------------------------------------------------------------- /editor_assets/textures/grass_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/grass_1.png-f8365a6aaa4c3f346ee3316a96effe12.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/grass_1.png" 10 | dest_files=[ "res://.import/grass_1.png-f8365a6aaa4c3f346ee3316a96effe12.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/grey_dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/grey_dev.png -------------------------------------------------------------------------------- /editor_assets/textures/grey_dev.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/grey_dev.png-fc7c91cef19d874124b7fef9fc6138ec.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/grey_dev.png" 10 | dest_files=[ "res://.import/grey_dev.png-fc7c91cef19d874124b7fef9fc6138ec.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/leather_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/leather_1.png -------------------------------------------------------------------------------- /editor_assets/textures/leather_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/leather_1.png-f4dee42f234cea4f4598eb2adebcee03.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/leather_1.png" 10 | dest_files=[ "res://.import/leather_1.png-f4dee42f234cea4f4598eb2adebcee03.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/orange_dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/orange_dev.png -------------------------------------------------------------------------------- /editor_assets/textures/orange_dev.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/orange_dev.png-fdb8896fe81e9e80badde483e5fcd100.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/orange_dev.png" 10 | dest_files=[ "res://.import/orange_dev.png-fdb8896fe81e9e80badde483e5fcd100.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_black.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_black" 4 | "%noportal" 1 5 | } 6 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_black.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_black.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_brick_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_brick_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_brick_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_brick_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_building_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_building_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_building_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_building_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_building_2.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_building_2" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_building_2.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_building_2.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_carpet_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_carpet_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_carpet_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_carpet_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_concrete_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_concrete_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_2.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_concrete_2" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_2.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_concrete_2.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_3.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_concrete_3" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_3.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_concrete_3.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_4.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_concrete_4" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_4.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_concrete_4.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_5.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_concrete_5" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_5.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_concrete_5.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_6.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_concrete_6" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_concrete_6.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_concrete_6.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_dev_grey.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_dev_grey" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_dev_grey.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_dev_grey.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_dev_orange.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_dev_orange" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_dev_orange.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_dev_orange.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_dirt_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_dirt_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_dirt_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_dirt_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_grass_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_grass_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_grass_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_grass_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_leather_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_leather_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_leather_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_leather_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_stone_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_stone_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_stone_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_stone_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_wall_1.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/builtin_wall_1" 4 | } 5 | -------------------------------------------------------------------------------- /editor_assets/textures/portal2/builtin_wall_1.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/portal2/builtin_wall_1.vtf -------------------------------------------------------------------------------- /editor_assets/textures/sources.txt: -------------------------------------------------------------------------------- 1 | white.png = Brendan Lewis 2 | black.png = Brendan Lewis 3 | orange_dev.png = Brendan Lewis 4 | grey_dev.png = Brendan Lewis 5 | stone_1.jpg = https://www.textures.com/download/BrickRound0044/9218 6 | brick_1.jpg = https://www.textures.com/download/BrickLargeBlocks0037/113930 7 | grass_1.jpg = https://www.textures.com/download/Grass0131/38957 8 | dirt_1.jpg = https://www.textures.com/download/SoilMud0066/48062 9 | carpet_1.jpg = https://www.textures.com/download/Carpet0012/8242 10 | concrete_1.jpg = https://www.textures.com/download/ConcreteFloors0005/25472 11 | concrete_2.png = https://www.textures.com/download/ConcreteBare0378/76808 12 | concrete_3.jpg = https://www.textures.com/download/BrickLargeBlocks0028/52674 13 | concrete_4.jpg = https://www.textures.com/download/BrickLargeBlocks0021/22238 14 | concrete_5.jpg = https://www.textures.com/download/BrickLargeBlocks0026/40834 15 | concrete_6.jpg = https://www.textures.com/download/ConcreteFloors0045/33522 16 | wall_1.jpg = https://www.textures.com/download/ConcretePlates0199/108750 17 | leather_1.jpg = https://www.textures.com/download/Leather0087/18098 18 | building_1.jpg = https://www.textures.com/download/BuildingsIndustrial0095/69856 19 | building_2.jpg = https://www.textures.com/download/BuildingsHouseOld0253/70975 -------------------------------------------------------------------------------- /editor_assets/textures/stone_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/stone_1.png -------------------------------------------------------------------------------- /editor_assets/textures/stone_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/stone_1.png-7a65a087977c2ef743f327ca006e007e.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/stone_1.png" 10 | dest_files=[ "res://.import/stone_1.png-7a65a087977c2ef743f327ca006e007e.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/wall_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/wall_1.png -------------------------------------------------------------------------------- /editor_assets/textures/wall_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/wall_1.png-90ba50b011b8b28d107123887aa1f2f4.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/wall_1.png" 10 | dest_files=[ "res://.import/wall_1.png-90ba50b011b8b28d107123887aa1f2f4.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /editor_assets/textures/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/editor_assets/textures/white.png -------------------------------------------------------------------------------- /editor_assets/textures/white.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/white.png-3a1b0406d764d39524430e5812bec6e7.image" 6 | 7 | [deps] 8 | 9 | source_file="res://editor_assets/textures/white.png" 10 | dest_files=[ "res://.import/white.png-3a1b0406d764d39524430e5812bec6e7.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Windows Desktop" 4 | platform="Windows Desktop" 5 | runnable=true 6 | custom_features="" 7 | export_filter="all_resources" 8 | include_filter="*.txt, *.json, *.vmt, *.vtf" 9 | exclude_filter="build/*, editor_assets/textures/full_res/*" 10 | export_path="build/win64/GodotPuzzlemaker.exe" 11 | patch_list=PoolStringArray( ) 12 | script_export_mode=1 13 | script_encryption_key="" 14 | 15 | [preset.0.options] 16 | 17 | texture_format/bptc=false 18 | texture_format/s3tc=true 19 | texture_format/etc=false 20 | texture_format/etc2=false 21 | texture_format/no_bptc_fallbacks=true 22 | binary_format/64_bits=true 23 | binary_format/embed_pck=true 24 | custom_template/release="" 25 | custom_template/debug="" 26 | codesign/enable=false 27 | codesign/identity_type=0 28 | codesign/identity="" 29 | codesign/password="" 30 | codesign/timestamp=true 31 | codesign/timestamp_server_url="" 32 | codesign/digest_algorithm=1 33 | codesign/description="" 34 | codesign/custom_options=PoolStringArray( ) 35 | application/icon="res://images/logo/icon.ico" 36 | application/file_version="0.8.3-alpha" 37 | application/product_version="0.8.3-alpha" 38 | application/company_name="craftablescience" 39 | application/product_name="GodotPuzzlemaker" 40 | application/file_description="Create levels, export levels." 41 | application/copyright="2021" 42 | application/trademarks="" 43 | 44 | [preset.1] 45 | 46 | name="HTML5" 47 | platform="HTML5" 48 | runnable=true 49 | custom_features="" 50 | export_filter="all_resources" 51 | include_filter="*.txt, *.json" 52 | exclude_filter="build/*, editor_assets/textures/full_res/*" 53 | export_path="build/html5/index.html" 54 | patch_list=PoolStringArray( ) 55 | script_export_mode=1 56 | script_encryption_key="" 57 | 58 | [preset.1.options] 59 | 60 | vram_texture_compression/for_desktop=true 61 | vram_texture_compression/for_mobile=false 62 | html/custom_html_shell="" 63 | html/head_include="" 64 | custom_template/release="" 65 | custom_template/debug="" 66 | 67 | [preset.2] 68 | 69 | name="Linux/X11" 70 | platform="Linux/X11" 71 | runnable=true 72 | custom_features="" 73 | export_filter="all_resources" 74 | include_filter="*.txt, *.json" 75 | exclude_filter="build/*, editor_assets/textures/full_res/*" 76 | export_path="build/x11/GodotPuzzlemaker.x86_64" 77 | patch_list=PoolStringArray( ) 78 | script_export_mode=1 79 | script_encryption_key="" 80 | 81 | [preset.2.options] 82 | 83 | texture_format/bptc=false 84 | texture_format/s3tc=true 85 | texture_format/etc=false 86 | texture_format/etc2=false 87 | texture_format/no_bptc_fallbacks=true 88 | binary_format/64_bits=true 89 | binary_format/embed_pck=true 90 | custom_template/release="" 91 | custom_template/debug="" 92 | -------------------------------------------------------------------------------- /fonts/original/rubik/README.md: -------------------------------------------------------------------------------- 1 | Created by "Hubert and Fischer", "Meir Sadan", and "Cyreal". -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-Black.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-BlackItalic.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-Bold.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-ExtraBold.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-Italic.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-Light.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-LightItalic.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-Medium.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-MediumItalic.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-Regular.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-SemiBold.ttf -------------------------------------------------------------------------------- /fonts/original/rubik/Rubik-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/fonts/original/rubik/Rubik-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/rubik/Rubik_18.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://fonts/original/rubik/Rubik-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 18 7 | use_mipmaps = true 8 | font_data = ExtResource( 1 ) 9 | -------------------------------------------------------------------------------- /images/editor/entities/lightbulb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/editor/entities/lightbulb.png -------------------------------------------------------------------------------- /images/editor/entities/lightbulb.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/lightbulb.png-663cba7a24398020408b1645c4ab52e3.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/editor/entities/lightbulb.png" 13 | dest_files=[ "res://.import/lightbulb.png-663cba7a24398020408b1645c4ab52e3.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=true 25 | flags/anisotropic=true 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/editor/entities/player_spawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/editor/entities/player_spawn.png -------------------------------------------------------------------------------- /images/editor/entities/player_spawn.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/player_spawn.png-b081532fd4454a0d5e57bed4051f4ea9.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/editor/entities/player_spawn.png" 13 | dest_files=[ "res://.import/player_spawn.png-b081532fd4454a0d5e57bed4051f4ea9.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=true 25 | flags/anisotropic=true 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/editor/textures/highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/editor/textures/highlight.png -------------------------------------------------------------------------------- /images/editor/textures/highlight.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/highlight.png-63d1081df754d9e7bf8d1d312db7f937.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/editor/textures/highlight.png" 13 | dest_files=[ "res://.import/highlight.png-63d1081df754d9e7bf8d1d312db7f937.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/editor/textures/portal2/default_white.vmt: -------------------------------------------------------------------------------- 1 | "LightmappedGeneric" 2 | { 3 | "$basetexture" "gpz/default_white" 4 | } 5 | -------------------------------------------------------------------------------- /images/editor/textures/portal2/default_white.vtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/editor/textures/portal2/default_white.vtf -------------------------------------------------------------------------------- /images/editor/textures/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/editor/textures/white.png -------------------------------------------------------------------------------- /images/editor/textures/white.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/white.png-5e0bad8267b2542cb9d2b9bb16d6fe4b.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/editor/textures/white.png" 13 | dest_files=[ "res://.import/white.png-5e0bad8267b2542cb9d2b9bb16d6fe4b.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/add.png -------------------------------------------------------------------------------- /images/icons/add.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/add.png-a5756096d306a26b6537de270d5da145.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/add.png" 13 | dest_files=[ "res://.import/add.png-a5756096d306a26b6537de270d5da145.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/circle.png -------------------------------------------------------------------------------- /images/icons/circle.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/circle.png-9bfb4b44fed36fdc069f45adccc9a962.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/circle.png" 13 | dest_files=[ "res://.import/circle.png-9bfb4b44fed36fdc069f45adccc9a962.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/connection.png -------------------------------------------------------------------------------- /images/icons/connection.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/connection.png-5e3c4c71f51954db66b9292936da64fe.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/connection.png" 13 | dest_files=[ "res://.import/connection.png-5e3c4c71f51954db66b9292936da64fe.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/crosshair.png -------------------------------------------------------------------------------- /images/icons/crosshair.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/crosshair.png-1539f136d13b4cc6390ff2053921d1f5.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/crosshair.png" 13 | dest_files=[ "res://.import/crosshair.png-1539f136d13b4cc6390ff2053921d1f5.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/down.png -------------------------------------------------------------------------------- /images/icons/down.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/down.png-62f308f49c9a66eb7d6ef865641028b8.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/down.png" 13 | dest_files=[ "res://.import/down.png-62f308f49c9a66eb7d6ef865641028b8.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/entity_coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/entity_coin.png -------------------------------------------------------------------------------- /images/icons/entity_coin.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/entity_coin.png-011255a92230b61991b3b2bbe9c4d46b.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/entity_coin.png" 13 | dest_files=[ "res://.import/entity_coin.png-011255a92230b61991b3b2bbe9c4d46b.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/left.png -------------------------------------------------------------------------------- /images/icons/left.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/left.png-0b490151ab89c676176ed983e0387dd5.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/left.png" 13 | dest_files=[ "res://.import/left.png-0b490151ab89c676176ed983e0387dd5.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/light.png -------------------------------------------------------------------------------- /images/icons/light.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/light.png-1596dc9edb9e9942f9e40ea7610290cb.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/light.png" 13 | dest_files=[ "res://.import/light.png-1596dc9edb9e9942f9e40ea7610290cb.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/mobile.png -------------------------------------------------------------------------------- /images/icons/mobile.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/mobile.png-959900d935dca95f43c4b37db2c5fff8.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/mobile.png" 13 | dest_files=[ "res://.import/mobile.png-959900d935dca95f43c4b37db2c5fff8.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/mouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/mouse.png -------------------------------------------------------------------------------- /images/icons/mouse.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/mouse.png-53575298d98bc0399ddfe06c89fcdf7b.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/mouse.png" 13 | dest_files=[ "res://.import/mouse.png-53575298d98bc0399ddfe06c89fcdf7b.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/mouse_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/mouse_left.png -------------------------------------------------------------------------------- /images/icons/mouse_left.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/mouse_left.png-fc2a91d6adb37b745dfccebda4229d06.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/mouse_left.png" 13 | dest_files=[ "res://.import/mouse_left.png-fc2a91d6adb37b745dfccebda4229d06.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/mouse_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/mouse_right.png -------------------------------------------------------------------------------- /images/icons/mouse_right.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/mouse_right.png-b53d57b7f1658c3beba2d62591943f47.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/mouse_right.png" 13 | dest_files=[ "res://.import/mouse_right.png-b53d57b7f1658c3beba2d62591943f47.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/play.png -------------------------------------------------------------------------------- /images/icons/play.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/play.png-f86e94de53844a96f3587c7bad0cb123.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/play.png" 13 | dest_files=[ "res://.import/play.png-f86e94de53844a96f3587c7bad0cb123.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/reload.png -------------------------------------------------------------------------------- /images/icons/reload.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/reload.png-46691bda0361d694a3ac478fd0b4abb0.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/reload.png" 13 | dest_files=[ "res://.import/reload.png-46691bda0361d694a3ac478fd0b4abb0.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/right.png -------------------------------------------------------------------------------- /images/icons/right.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/right.png-1f1d175909964b60fea1f4bbf813eeaf.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/right.png" 13 | dest_files=[ "res://.import/right.png-1f1d175909964b60fea1f4bbf813eeaf.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/search.png -------------------------------------------------------------------------------- /images/icons/search.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/search.png-3f5f43dc538ec7081925f26bae0b99d4.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/search.png" 13 | dest_files=[ "res://.import/search.png-3f5f43dc538ec7081925f26bae0b99d4.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/select.png -------------------------------------------------------------------------------- /images/icons/select.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/select.png-eb76e5b55ef6ad43385210b3ab6f2236.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/select.png" 13 | dest_files=[ "res://.import/select.png-eb76e5b55ef6ad43385210b3ab6f2236.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/trash.png -------------------------------------------------------------------------------- /images/icons/trash.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/trash.png-16c57e71fd66b6d17ca9fce45f926901.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/trash.png" 13 | dest_files=[ "res://.import/trash.png-16c57e71fd66b6d17ca9fce45f926901.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/trash_clickbitmap.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/trash_clickbitmap.bmp -------------------------------------------------------------------------------- /images/icons/trash_clickbitmap.bmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="bitmap" 4 | type="BitMap" 5 | path="res://.import/trash_clickbitmap.bmp-fefcfd447cda8ef82cc1eb3e27e99e5e.res" 6 | 7 | [deps] 8 | 9 | source_file="res://images/icons/trash_clickbitmap.bmp" 10 | dest_files=[ "res://.import/trash_clickbitmap.bmp-fefcfd447cda8ef82cc1eb3e27e99e5e.res" ] 11 | 12 | [params] 13 | 14 | create_from=0 15 | threshold=0.5 16 | -------------------------------------------------------------------------------- /images/icons/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/up.png -------------------------------------------------------------------------------- /images/icons/up.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/up.png-128c238f27800a1bf751359e28f22813.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/up.png" 13 | dest_files=[ "res://.import/up.png-128c238f27800a1bf751359e28f22813.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/vovel_build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/vovel_build.png -------------------------------------------------------------------------------- /images/icons/vovel_build.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/vovel_build.png-73ac43a19292c052c4cdb8f928bc1475.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/vovel_build.png" 13 | dest_files=[ "res://.import/vovel_build.png-73ac43a19292c052c4cdb8f928bc1475.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/vovel_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/vovel_delete.png -------------------------------------------------------------------------------- /images/icons/vovel_delete.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/vovel_delete.png-29215da251f60f7a96916aa2741f19be.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/vovel_delete.png" 13 | dest_files=[ "res://.import/vovel_delete.png-29215da251f60f7a96916aa2741f19be.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/voxel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/voxel.png -------------------------------------------------------------------------------- /images/icons/voxel.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/voxel.png-6dec07250f187f0c5ea74e682c08937e.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/voxel.png" 13 | dest_files=[ "res://.import/voxel.png-6dec07250f187f0c5ea74e682c08937e.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/icons/voxel_textured.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/icons/voxel_textured.png -------------------------------------------------------------------------------- /images/icons/voxel_textured.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/voxel_textured.png-5bc301b3a4ba47d50a554f3c3038ddef.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/icons/voxel_textured.png" 13 | dest_files=[ "res://.import/voxel_textured.png-5bc301b3a4ba47d50a554f3c3038ddef.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/logo/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/logo/icon.icns -------------------------------------------------------------------------------- /images/logo/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/logo/icon.ico -------------------------------------------------------------------------------- /images/logo/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/logo/icon.png -------------------------------------------------------------------------------- /images/logo/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/icon.png-084bcfcb1281f90d9f574b895582a7ea.image" 6 | 7 | [deps] 8 | 9 | source_file="res://images/logo/icon.png" 10 | dest_files=[ "res://.import/icon.png-084bcfcb1281f90d9f574b895582a7ea.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /images/logo/icon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/logo/icon512.png -------------------------------------------------------------------------------- /images/logo/icon512.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon512.png-8dd8212dd4ae1071d9aca4b49fbc6651.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/logo/icon512.png" 13 | dest_files=[ "res://.import/icon512.png-8dd8212dd4ae1071d9aca4b49fbc6651.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /images/logo/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/logo/loading.png -------------------------------------------------------------------------------- /images/logo/loading.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | path="res://.import/loading.png-1a94a25804b8dd99d225a397f69d4bf7.image" 6 | 7 | [deps] 8 | 9 | source_file="res://images/logo/loading.png" 10 | dest_files=[ "res://.import/loading.png-1a94a25804b8dd99d225a397f69d4bf7.image" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /images/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/images/logo/logo.png -------------------------------------------------------------------------------- /images/logo/logo.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/logo.png-143b09eab1b2f0532879f73491b0c87d.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://images/logo/logo.png" 13 | dest_files=[ "res://.import/logo.png-143b09eab1b2f0532879f73491b0c87d.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /materials/action_gizmo_arrowx.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/materials/action_gizmo_arrowx.material -------------------------------------------------------------------------------- /materials/action_gizmo_arrowy.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/materials/action_gizmo_arrowy.material -------------------------------------------------------------------------------- /materials/action_gizmo_arrowz.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/materials/action_gizmo_arrowz.material -------------------------------------------------------------------------------- /materials/action_gizmo_selector.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/materials/action_gizmo_selector.material -------------------------------------------------------------------------------- /models/door/anim/close.anim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/anim/close.anim -------------------------------------------------------------------------------- /models/door/anim/close_idle.anim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/anim/close_idle.anim -------------------------------------------------------------------------------- /models/door/anim/open.anim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/anim/open.anim -------------------------------------------------------------------------------- /models/door/anim/open_idle.anim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/anim/open_idle.anim -------------------------------------------------------------------------------- /models/door/door.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/door.glb -------------------------------------------------------------------------------- /models/door/door.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/door.material -------------------------------------------------------------------------------- /models/door/doorframe.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/door/doorframe.material -------------------------------------------------------------------------------- /models/raw/door.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/raw/door.blend -------------------------------------------------------------------------------- /models/raw/door.blend1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/raw/door.blend1 -------------------------------------------------------------------------------- /models/sources.txt: -------------------------------------------------------------------------------- 1 | table = Brendan Lewis -------------------------------------------------------------------------------- /models/table/Material.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/table/Material.material -------------------------------------------------------------------------------- /models/table/table.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/models/table/table.glb -------------------------------------------------------------------------------- /scenes/editor/Cube.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=17 format=2] 2 | 3 | [ext_resource path="res://images/editor/textures/white.png" type="Texture" id=1] 4 | [ext_resource path="res://scripts/editor/Cube.gd" type="Script" id=2] 5 | 6 | [sub_resource type="BoxShape" id=1] 7 | extents = Vector3( 5, 5, 5 ) 8 | 9 | [sub_resource type="SpatialMaterial" id=2] 10 | resource_local_to_scene = true 11 | albedo_texture = ExtResource( 1 ) 12 | 13 | [sub_resource type="PlaneMesh" id=3] 14 | size = Vector2( 10, 10 ) 15 | 16 | [sub_resource type="BoxShape" id=4] 17 | extents = Vector3( 0.1, 5, 5 ) 18 | 19 | [sub_resource type="SpatialMaterial" id=5] 20 | resource_local_to_scene = true 21 | albedo_texture = ExtResource( 1 ) 22 | 23 | [sub_resource type="PlaneMesh" id=6] 24 | size = Vector2( 10, 10 ) 25 | 26 | [sub_resource type="SpatialMaterial" id=7] 27 | resource_local_to_scene = true 28 | albedo_texture = ExtResource( 1 ) 29 | 30 | [sub_resource type="PlaneMesh" id=8] 31 | size = Vector2( 10, 10 ) 32 | 33 | [sub_resource type="SpatialMaterial" id=9] 34 | resource_local_to_scene = true 35 | albedo_texture = ExtResource( 1 ) 36 | 37 | [sub_resource type="PlaneMesh" id=10] 38 | size = Vector2( 10, 10 ) 39 | 40 | [sub_resource type="SpatialMaterial" id=11] 41 | resource_local_to_scene = true 42 | albedo_texture = ExtResource( 1 ) 43 | 44 | [sub_resource type="PlaneMesh" id=12] 45 | size = Vector2( 10, 10 ) 46 | 47 | [sub_resource type="SpatialMaterial" id=13] 48 | resource_local_to_scene = true 49 | albedo_texture = ExtResource( 1 ) 50 | 51 | [sub_resource type="PlaneMesh" id=14] 52 | size = Vector2( 10, 10 ) 53 | 54 | [node name="Cube" type="Spatial"] 55 | script = ExtResource( 2 ) 56 | __meta__ = { 57 | "_edit_group_": true 58 | } 59 | 60 | [node name="StaticBody" type="StaticBody" parent="."] 61 | 62 | [node name="CollisionShape" type="CollisionShape" parent="StaticBody"] 63 | shape = SubResource( 1 ) 64 | 65 | [node name="XP" type="MeshInstance" parent="."] 66 | transform = Transform( 1.19249e-08, 1, 0, 4.37114e-08, -5.21254e-16, -1, -1, 1.19249e-08, -4.37114e-08, 5, 0, 0 ) 67 | material_override = SubResource( 2 ) 68 | use_in_baked_light = true 69 | mesh = SubResource( 3 ) 70 | material/0 = null 71 | 72 | [node name="Area" type="Area" parent="XP"] 73 | transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0, 0, 0 ) 74 | input_capture_on_drag = true 75 | 76 | [node name="CollisionShape" type="CollisionShape" parent="XP/Area"] 77 | shape = SubResource( 4 ) 78 | 79 | [node name="XM" type="MeshInstance" parent="."] 80 | transform = Transform( 4.37114e-08, -1, 1.4243e-14, 1.94707e-07, -5.73206e-15, -1, 1, 4.37114e-08, 1.94707e-07, -5, 0, 0 ) 81 | material_override = SubResource( 5 ) 82 | use_in_baked_light = true 83 | mesh = SubResource( 6 ) 84 | material/0 = null 85 | 86 | [node name="Area" type="Area" parent="XM"] 87 | transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0, 0, 0 ) 88 | input_capture_on_drag = true 89 | 90 | [node name="CollisionShape" type="CollisionShape" parent="XM/Area"] 91 | shape = SubResource( 4 ) 92 | 93 | [node name="YM" type="MeshInstance" parent="."] 94 | transform = Transform( -1, 3.25841e-07, 0, -3.25841e-07, -1, 0, 0, 0, 1, 0, -5, 0 ) 95 | material_override = SubResource( 7 ) 96 | use_in_baked_light = true 97 | mesh = SubResource( 8 ) 98 | material/0 = null 99 | 100 | [node name="Area" type="Area" parent="YM"] 101 | input_capture_on_drag = true 102 | 103 | [node name="CollisionShape" type="CollisionShape" parent="YM/Area"] 104 | transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0, 0, 0 ) 105 | shape = SubResource( 4 ) 106 | 107 | [node name="YP" type="MeshInstance" parent="."] 108 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0 ) 109 | material_override = SubResource( 9 ) 110 | mesh = SubResource( 10 ) 111 | material/0 = null 112 | 113 | [node name="Area" type="Area" parent="YP"] 114 | input_capture_on_drag = true 115 | 116 | [node name="CollisionShape" type="CollisionShape" parent="YP/Area"] 117 | transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0, 0, 0 ) 118 | shape = SubResource( 4 ) 119 | 120 | [node name="ZP" type="MeshInstance" parent="."] 121 | transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 5 ) 122 | material_override = SubResource( 11 ) 123 | use_in_baked_light = true 124 | mesh = SubResource( 12 ) 125 | material/0 = null 126 | 127 | [node name="Area" type="Area" parent="ZP"] 128 | transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0 ) 129 | input_capture_on_drag = true 130 | 131 | [node name="CollisionShape" type="CollisionShape" parent="ZP/Area"] 132 | transform = Transform( 4.88762e-07, -1, 5.30863e-14, 1.62921e-07, 2.65431e-14, -1, 1, 4.88762e-07, 1.62921e-07, 0, 0, 0 ) 133 | shape = SubResource( 4 ) 134 | 135 | [node name="ZM" type="MeshInstance" parent="."] 136 | transform = Transform( -1, 0, -3.25841e-07, 3.25841e-07, -4.37114e-08, -1, -1.4243e-14, -1, 4.37114e-08, 0, 0, -5 ) 137 | material_override = SubResource( 13 ) 138 | use_in_baked_light = true 139 | mesh = SubResource( 14 ) 140 | material/0 = null 141 | 142 | [node name="Area" type="Area" parent="ZM"] 143 | transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0 ) 144 | input_capture_on_drag = true 145 | 146 | [node name="CollisionShape" type="CollisionShape" parent="ZM/Area"] 147 | transform = Transform( 4.88762e-07, -1, 5.30863e-14, 1.62921e-07, 2.65431e-14, -1, 1, 4.88762e-07, 1.62921e-07, 0, 0, 0 ) 148 | shape = SubResource( 4 ) 149 | [connection signal="input_event" from="XP/Area" to="." method="_on_XP_select"] 150 | [connection signal="input_event" from="XM/Area" to="." method="_on_XM_select"] 151 | [connection signal="input_event" from="YM/Area" to="." method="_on_YM_select"] 152 | [connection signal="input_event" from="YP/Area" to="." method="_on_YP_select"] 153 | [connection signal="input_event" from="ZP/Area" to="." method="_on_ZP_select"] 154 | [connection signal="input_event" from="ZM/Area" to="." method="_on_ZM_select"] 155 | -------------------------------------------------------------------------------- /scenes/editor/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://scripts/editor/Player.gd" type="Script" id=1] 4 | 5 | [sub_resource type="CylinderShape" id=1] 6 | radius = 4.0 7 | height = 16.0 8 | 9 | [node name="Player" type="KinematicBody"] 10 | script = ExtResource( 1 ) 11 | 12 | [node name="CollisionShape" type="CollisionShape" parent="."] 13 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8, 0 ) 14 | shape = SubResource( 1 ) 15 | 16 | [node name="Camera" type="Camera" parent="."] 17 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 13.5, 0 ) 18 | current = true 19 | far = 8192.0 20 | 21 | [node name="CSGSphere" type="CSGCylinder" parent="."] 22 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8, 0 ) 23 | radius = 4.0 24 | height = 16.0 25 | sides = 32 26 | -------------------------------------------------------------------------------- /scenes/editor/Room.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=2] 2 | 3 | [ext_resource path="res://scripts/editor/Room.gd" type="Script" id=1] 4 | [ext_resource path="res://materials/action_gizmo_arrowx.material" type="Material" id=2] 5 | [ext_resource path="res://materials/action_gizmo_selector.material" type="Material" id=3] 6 | [ext_resource path="res://materials/action_gizmo_arrowy.material" type="Material" id=4] 7 | [ext_resource path="res://materials/action_gizmo_arrowz.material" type="Material" id=5] 8 | [ext_resource path="res://scenes/editor/Player.tscn" type="PackedScene" id=6] 9 | 10 | [sub_resource type="BoxShape" id=1] 11 | extents = Vector3( 0.2, 1.4, 0.2 ) 12 | 13 | [node name="Room" type="Spatial"] 14 | script = ExtResource( 1 ) 15 | 16 | [node name="ActionGizmo" type="Spatial" parent="."] 17 | visible = false 18 | 19 | [node name="Selector" type="CSGSphere" parent="ActionGizmo"] 20 | radius = 0.5 21 | radial_segments = 32 22 | rings = 32 23 | material = ExtResource( 3 ) 24 | 25 | [node name="ArrowX" type="CSGCylinder" parent="ActionGizmo"] 26 | transform = Transform( 1.19249e-08, 1, 0, -1, 1.19249e-08, 0, 0, 0, 1, 1.5, 0, 0 ) 27 | radius = 0.1 28 | height = 2.5 29 | sides = 16 30 | material = ExtResource( 2 ) 31 | 32 | [node name="ArrowX_Tip" type="CSGCylinder" parent="ActionGizmo/ArrowX"] 33 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.78873e-08, 1.5, 0 ) 34 | radius = 0.25 35 | height = 0.5 36 | sides = 16 37 | cone = true 38 | material = ExtResource( 2 ) 39 | 40 | [node name="ArrowX_Collider" type="Area" parent="ActionGizmo/ArrowX"] 41 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.15, 0 ) 42 | 43 | [node name="CollisionShape" type="CollisionShape" parent="ActionGizmo/ArrowX/ArrowX_Collider"] 44 | shape = SubResource( 1 ) 45 | 46 | [node name="ArrowY" type="CSGCylinder" parent="ActionGizmo"] 47 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0 ) 48 | radius = 0.1 49 | height = 2.5 50 | sides = 16 51 | material = ExtResource( 4 ) 52 | 53 | [node name="ArrowY_Tip" type="CSGCylinder" parent="ActionGizmo/ArrowY"] 54 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.78873e-08, 1.5, 0 ) 55 | radius = 0.25 56 | height = 0.5 57 | sides = 16 58 | cone = true 59 | material = ExtResource( 4 ) 60 | 61 | [node name="ArrowY_Collider" type="Area" parent="ActionGizmo/ArrowY"] 62 | transform = Transform( -1, 3.25841e-07, 0, -3.25841e-07, -1, 0, 0, 0, 1, 0, 0.15, 0 ) 63 | 64 | [node name="CollisionShape" type="CollisionShape" parent="ActionGizmo/ArrowY/ArrowY_Collider"] 65 | shape = SubResource( 1 ) 66 | 67 | [node name="ArrowZ" type="CSGCylinder" parent="ActionGizmo"] 68 | transform = Transform( 2.65431e-14, -1.62921e-07, -1, -1, -1.62921e-07, 0, -1.62921e-07, 1, -1.62921e-07, 0, 0, 1.5 ) 69 | radius = 0.1 70 | height = 2.5 71 | sides = 16 72 | material = ExtResource( 5 ) 73 | 74 | [node name="ArrowZ_Tip" type="CSGCylinder" parent="ActionGizmo/ArrowZ"] 75 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.78873e-08, 1.5, 0 ) 76 | radius = 0.25 77 | height = 0.5 78 | sides = 16 79 | cone = true 80 | material = ExtResource( 5 ) 81 | 82 | [node name="ArrowZ_Collider" type="Area" parent="ActionGizmo/ArrowZ"] 83 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.15, 0 ) 84 | 85 | [node name="CollisionShape" type="CollisionShape" parent="ActionGizmo/ArrowZ/ArrowZ_Collider"] 86 | shape = SubResource( 1 ) 87 | 88 | [node name="Sun" type="DirectionalLight" parent="."] 89 | light_color = Color( 1, 1, 0.909804, 1 ) 90 | light_energy = 0.5 91 | light_bake_mode = 0 92 | shadow_enabled = true 93 | directional_shadow_blend_splits = true 94 | 95 | [node name="Player" parent="." instance=ExtResource( 6 )] 96 | -------------------------------------------------------------------------------- /scenes/menu/ConnectionItem.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://scripts/menu/ConnectionItem.gd" type="Script" id=1] 4 | [ext_resource path="res://images/icons/trash.png" type="Texture" id=2] 5 | [ext_resource path="res://images/icons/trash_clickbitmap.bmp" type="BitMap" id=3] 6 | 7 | [node name="ConnectionItem" type="Panel"] 8 | margin_right = 376.0 9 | margin_bottom = 100.0 10 | rect_min_size = Vector2( 0, 100 ) 11 | size_flags_horizontal = 3 12 | script = ExtResource( 1 ) 13 | __meta__ = { 14 | "_edit_use_anchors_": false 15 | } 16 | 17 | [node name="OutputName" type="Label" parent="."] 18 | anchor_right = 0.4 19 | anchor_bottom = 0.5 20 | margin_left = 2.0 21 | margin_top = 2.0 22 | margin_bottom = -0.667427 23 | text = "IDHere" 24 | align = 1 25 | valign = 1 26 | __meta__ = { 27 | "_edit_use_anchors_": false 28 | } 29 | 30 | [node name="EllipsisLabel" type="Label" parent="."] 31 | anchor_left = 0.4 32 | anchor_top = 0.5 33 | anchor_right = 0.6 34 | anchor_bottom = 1.0 35 | text = "to:" 36 | align = 1 37 | valign = 1 38 | __meta__ = { 39 | "_edit_use_anchors_": true 40 | } 41 | 42 | [node name="DeleteButton" type="TextureButton" parent="."] 43 | anchor_left = 0.4 44 | anchor_top = 0.1 45 | anchor_right = 0.6 46 | anchor_bottom = 0.4 47 | texture_normal = ExtResource( 2 ) 48 | texture_pressed = ExtResource( 2 ) 49 | texture_hover = ExtResource( 2 ) 50 | texture_disabled = ExtResource( 2 ) 51 | texture_focused = ExtResource( 2 ) 52 | texture_click_mask = ExtResource( 3 ) 53 | expand = true 54 | stretch_mode = 5 55 | __meta__ = { 56 | "_edit_use_anchors_": true 57 | } 58 | 59 | [node name="InputName" type="Button" parent="."] 60 | anchor_left = 0.6 61 | anchor_right = 1.0 62 | anchor_bottom = 0.5 63 | margin_top = 2.0 64 | margin_right = -2.0 65 | text = "Select..." 66 | __meta__ = { 67 | "_edit_use_anchors_": false 68 | } 69 | 70 | [node name="OutputContainer" type="CenterContainer" parent="."] 71 | anchor_top = 0.5 72 | anchor_right = 0.4 73 | anchor_bottom = 1.0 74 | __meta__ = { 75 | "_edit_use_anchors_": false 76 | } 77 | 78 | [node name="OutputSelection" type="OptionButton" parent="OutputContainer"] 79 | margin_left = 54.0 80 | margin_top = 15.0 81 | margin_right = 95.0 82 | margin_bottom = 35.0 83 | text = "..." 84 | align = 1 85 | selected = 0 86 | __meta__ = { 87 | "_edit_use_anchors_": true 88 | } 89 | 90 | [node name="InputContainer" type="CenterContainer" parent="."] 91 | anchor_left = 0.6 92 | anchor_top = 0.5 93 | anchor_right = 1.0 94 | anchor_bottom = 1.0 95 | __meta__ = { 96 | "_edit_use_anchors_": false 97 | } 98 | 99 | [node name="InputSelection" type="OptionButton" parent="InputContainer"] 100 | margin_left = 54.0 101 | margin_top = 15.0 102 | margin_right = 95.0 103 | margin_bottom = 35.0 104 | text = "..." 105 | align = 1 106 | items = [ "...", null, false, 0, null ] 107 | selected = 0 108 | __meta__ = { 109 | "_edit_use_anchors_": true 110 | } 111 | [connection signal="pressed" from="DeleteButton" to="." method="_on_Delete_pressed"] 112 | [connection signal="pressed" from="InputName" to="." method="_on_InputName_pressed"] 113 | -------------------------------------------------------------------------------- /scenes/menu/TouchControls.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=2] 2 | 3 | [ext_resource path="res://scripts/editor/TouchControls.gd" type="Script" id=1] 4 | [ext_resource path="res://images/icons/right.png" type="Texture" id=2] 5 | [ext_resource path="res://images/icons/up.png" type="Texture" id=3] 6 | [ext_resource path="res://images/icons/left.png" type="Texture" id=4] 7 | [ext_resource path="res://images/icons/down.png" type="Texture" id=5] 8 | [ext_resource path="res://images/icons/mouse_right.png" type="Texture" id=6] 9 | [ext_resource path="res://images/icons/mouse_left.png" type="Texture" id=7] 10 | 11 | [node name="TouchControls" type="Control"] 12 | visible = false 13 | anchor_right = 1.0 14 | anchor_bottom = 1.0 15 | mouse_filter = 2 16 | script = ExtResource( 1 ) 17 | __meta__ = { 18 | "_edit_use_anchors_": false 19 | } 20 | 21 | [node name="Up" type="Button" parent="."] 22 | anchor_left = 0.21 23 | anchor_top = 0.65 24 | anchor_right = 0.27 25 | anchor_bottom = 0.77 26 | size_flags_horizontal = 0 27 | size_flags_vertical = 0 28 | action_mode = 0 29 | icon = ExtResource( 3 ) 30 | expand_icon = true 31 | __meta__ = { 32 | "_edit_use_anchors_": true 33 | } 34 | 35 | [node name="Down" type="Button" parent="."] 36 | anchor_left = 0.21 37 | anchor_top = 0.78 38 | anchor_right = 0.27 39 | anchor_bottom = 0.9 40 | margin_left = 0.409912 41 | margin_top = -6.10352e-05 42 | margin_right = 0.409912 43 | margin_bottom = -0.00012207 44 | size_flags_horizontal = 0 45 | size_flags_vertical = 0 46 | action_mode = 0 47 | icon = ExtResource( 5 ) 48 | expand_icon = true 49 | __meta__ = { 50 | "_edit_use_anchors_": true 51 | } 52 | 53 | [node name="LeftClick" type="Button" parent="."] 54 | anchor_left = 0.73 55 | anchor_top = 0.65 56 | anchor_right = 0.79 57 | anchor_bottom = 0.77 58 | size_flags_horizontal = 0 59 | size_flags_vertical = 0 60 | button_mask = 3 61 | icon = ExtResource( 7 ) 62 | expand_icon = true 63 | __meta__ = { 64 | "_edit_use_anchors_": true 65 | } 66 | 67 | [node name="RightClick" type="Button" parent="."] 68 | anchor_left = 0.73 69 | anchor_top = 0.78 70 | anchor_right = 0.79 71 | anchor_bottom = 0.9 72 | margin_left = 0.409912 73 | margin_top = -6.10352e-05 74 | margin_right = 0.409912 75 | margin_bottom = -0.00012207 76 | size_flags_horizontal = 0 77 | size_flags_vertical = 0 78 | button_mask = 3 79 | icon = ExtResource( 6 ) 80 | expand_icon = true 81 | __meta__ = { 82 | "_edit_use_anchors_": true 83 | } 84 | 85 | [node name="Move" type="Panel" parent="."] 86 | anchor_left = -0.000208333 87 | anchor_top = 0.649704 88 | anchor_right = 0.2 89 | anchor_bottom = 0.899704 90 | margin_left = -0.6 91 | margin_top = 0.319946 92 | margin_right = 0.879974 93 | margin_bottom = 0.319946 94 | size_flags_horizontal = 0 95 | size_flags_vertical = 0 96 | __meta__ = { 97 | "_edit_use_anchors_": true 98 | } 99 | 100 | [node name="Forward" type="Button" parent="Move"] 101 | anchor_left = 0.33 102 | anchor_right = 0.66 103 | anchor_bottom = 0.5 104 | size_flags_horizontal = 0 105 | size_flags_vertical = 0 106 | action_mode = 0 107 | icon = ExtResource( 3 ) 108 | expand_icon = true 109 | __meta__ = { 110 | "_edit_use_anchors_": true 111 | } 112 | 113 | [node name="Back" type="Button" parent="Move"] 114 | anchor_left = 0.33 115 | anchor_top = 0.5 116 | anchor_right = 0.66 117 | anchor_bottom = 1.0 118 | size_flags_horizontal = 0 119 | size_flags_vertical = 0 120 | action_mode = 0 121 | icon = ExtResource( 5 ) 122 | expand_icon = true 123 | __meta__ = { 124 | "_edit_use_anchors_": true 125 | } 126 | 127 | [node name="Left" type="Button" parent="Move"] 128 | anchor_top = 0.250048 129 | anchor_right = 0.33 130 | anchor_bottom = 0.750048 131 | size_flags_horizontal = 0 132 | size_flags_vertical = 0 133 | action_mode = 0 134 | icon = ExtResource( 4 ) 135 | expand_icon = true 136 | __meta__ = { 137 | "_edit_use_anchors_": true 138 | } 139 | 140 | [node name="Right" type="Button" parent="Move"] 141 | anchor_left = 0.66 142 | anchor_top = 0.25 143 | anchor_right = 1.0 144 | anchor_bottom = 0.75 145 | size_flags_horizontal = 0 146 | size_flags_vertical = 0 147 | action_mode = 0 148 | icon = ExtResource( 2 ) 149 | expand_icon = true 150 | __meta__ = { 151 | "_edit_use_anchors_": true 152 | } 153 | 154 | [node name="Look" type="Panel" parent="."] 155 | anchor_left = 0.8 156 | anchor_top = 0.649704 157 | anchor_right = 1.0 158 | anchor_bottom = 0.899704 159 | margin_left = -0.6 160 | margin_top = 0.319946 161 | margin_right = 0.879974 162 | margin_bottom = 0.319946 163 | size_flags_horizontal = 0 164 | size_flags_vertical = 0 165 | __meta__ = { 166 | "_edit_use_anchors_": true 167 | } 168 | 169 | [node name="Up" type="Button" parent="Look"] 170 | anchor_left = 0.33 171 | anchor_right = 0.66 172 | anchor_bottom = 0.5 173 | size_flags_horizontal = 0 174 | size_flags_vertical = 0 175 | icon = ExtResource( 3 ) 176 | expand_icon = true 177 | __meta__ = { 178 | "_edit_use_anchors_": true 179 | } 180 | 181 | [node name="Down" type="Button" parent="Look"] 182 | anchor_left = 0.33 183 | anchor_top = 0.5 184 | anchor_right = 0.66 185 | anchor_bottom = 1.0 186 | size_flags_horizontal = 0 187 | size_flags_vertical = 0 188 | icon = ExtResource( 5 ) 189 | expand_icon = true 190 | __meta__ = { 191 | "_edit_use_anchors_": true 192 | } 193 | 194 | [node name="Left" type="Button" parent="Look"] 195 | anchor_top = 0.250048 196 | anchor_right = 0.33 197 | anchor_bottom = 0.750048 198 | size_flags_horizontal = 0 199 | size_flags_vertical = 0 200 | icon = ExtResource( 4 ) 201 | expand_icon = true 202 | __meta__ = { 203 | "_edit_use_anchors_": true 204 | } 205 | 206 | [node name="Right" type="Button" parent="Look"] 207 | anchor_left = 0.66 208 | anchor_top = 0.25 209 | anchor_right = 1.0 210 | anchor_bottom = 0.75 211 | size_flags_horizontal = 0 212 | size_flags_vertical = 0 213 | icon = ExtResource( 2 ) 214 | expand_icon = true 215 | __meta__ = { 216 | "_edit_use_anchors_": true 217 | } 218 | [connection signal="button_down" from="Up" to="." method="_on_Up_button_down"] 219 | [connection signal="button_up" from="Up" to="." method="_on_Up_button_up"] 220 | [connection signal="button_down" from="Down" to="." method="_on_Down_button_down"] 221 | [connection signal="button_up" from="Down" to="." method="_on_Down_button_up"] 222 | [connection signal="pressed" from="LeftClick" to="." method="_on_LeftClick_pressed"] 223 | [connection signal="pressed" from="RightClick" to="." method="_on_RightClick_pressed"] 224 | [connection signal="button_down" from="Move/Forward" to="." method="_on_Forward_button_down"] 225 | [connection signal="button_up" from="Move/Forward" to="." method="_on_Forward_button_up"] 226 | [connection signal="button_down" from="Move/Back" to="." method="_on_Back_button_down"] 227 | [connection signal="button_up" from="Move/Back" to="." method="_on_Back_button_up"] 228 | [connection signal="button_down" from="Move/Left" to="." method="_on_Left_button_down"] 229 | [connection signal="button_up" from="Move/Left" to="." method="_on_Left_button_up"] 230 | [connection signal="button_down" from="Move/Right" to="." method="_on_Right_button_down"] 231 | [connection signal="button_up" from="Move/Right" to="." method="_on_Right_button_up"] 232 | [connection signal="button_down" from="Look/Up" to="." method="_on_LookUp_button_down"] 233 | [connection signal="button_up" from="Look/Up" to="." method="_on_LookUp_button_up"] 234 | [connection signal="button_down" from="Look/Down" to="." method="_on_LookDown_button_down"] 235 | [connection signal="button_up" from="Look/Down" to="." method="_on_LookDown_button_up"] 236 | [connection signal="button_down" from="Look/Left" to="." method="_on_LookLeft_button_down"] 237 | [connection signal="button_up" from="Look/Left" to="." method="_on_LookLeft_button_up"] 238 | [connection signal="button_down" from="Look/Right" to="." method="_on_LookRight_button_down"] 239 | [connection signal="button_up" from="Look/Right" to="." method="_on_LookRight_button_up"] 240 | -------------------------------------------------------------------------------- /scripts/Globals.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | enum PLANEID { 5 | XP, 6 | XM, 7 | YP, 8 | YM, 9 | ZP, 10 | ZM 11 | } 12 | 13 | enum TOOL { 14 | SELECT, 15 | VOXEL, 16 | TEXTURE, 17 | PLACEENTITY, 18 | CONNECTION 19 | } 20 | 21 | enum THEME { 22 | LIGHT, 23 | DARK 24 | } 25 | 26 | var MOUSE_SENSITIVITY: float = 0.02 27 | var MOVEMENT_SENSITIVITY: float = 1.0 28 | 29 | const MOBILE_SENSITIVITY: float = 32.0 30 | 31 | const FIRSTTOOL: int = TOOL.VOXEL 32 | 33 | const FILEFORMAT: int = 17 34 | const FILESETTINGSFORMAT: int = 19 35 | 36 | const TEXTUREFALLBACK: String = "default:white" 37 | 38 | var PLAY_MODE: bool = false 39 | 40 | const CUSTOMID: String = "usercustom" 41 | const PLAYER_START: String = "player_start" 42 | 43 | var TEXTURE_PREVIEW_WIDTH = 64 44 | 45 | static func SET_THEME(tm: int) -> void: 46 | if tm == Globals.THEME.LIGHT: 47 | var c: float = 166.0 / 255.0 48 | VisualServer.set_default_clear_color(Color(c, c, c, 1.0)) 49 | elif tm == Globals.THEME.DARK: 50 | var c: float = (255.0 - 166.0) / 255.0 51 | VisualServer.set_default_clear_color(Color(c, c, c, 1.0)) 52 | 53 | static func LIST_FILES_IN_DIR(path) -> Array: 54 | var files = [] 55 | var dir = Directory.new() 56 | dir.open(path) 57 | dir.list_dir_begin(true) 58 | 59 | while true: 60 | var file = dir.get_next() 61 | if file == "": 62 | break 63 | files.append(file) 64 | 65 | dir.list_dir_end() 66 | return files 67 | 68 | static func COPY_FILE(original_path: String, new_path: String) -> void: 69 | var copy: File = File.new() 70 | var original: File = File.new() 71 | # warning-ignore:return_value_discarded 72 | copy.open(new_path, copy.WRITE) 73 | # warning-ignore:return_value_discarded 74 | original.open(original_path, original.READ) 75 | copy.store_buffer(original.get_buffer(original.get_len())) 76 | copy.close() 77 | original.close() 78 | 79 | static func SAVE_DATA(data: PoolByteArray, path: String) -> void: 80 | var copy: File = File.new() 81 | # warning-ignore:return_value_discarded 82 | copy.open(path, copy.WRITE) 83 | # warning-ignore:return_value_discarded 84 | copy.store_buffer(data) 85 | copy.close() 86 | 87 | static func GET_OFFSET_ON_AXIS(pos: Vector3, direction: int): 88 | match (direction): 89 | PLANEID.XM: 90 | return Vector3(pos.x - 1, pos.y, pos.z) 91 | PLANEID.XP: 92 | return Vector3(pos.x + 1, pos.y, pos.z) 93 | PLANEID.YM: 94 | return Vector3(pos.x, pos.y - 1, pos.z) 95 | PLANEID.YP: 96 | return Vector3(pos.x, pos.y + 1, pos.z) 97 | PLANEID.ZM: 98 | return Vector3(pos.x, pos.y, pos.z - 1) 99 | PLANEID.ZP: 100 | return Vector3(pos.x, pos.y, pos.z + 1) 101 | _: 102 | return null 103 | 104 | func CLEAR_SELECTED_TOOLS() -> void: 105 | for node in get_tree().get_nodes_in_group("TOOL_BUTTON"): 106 | node.pressed = false 107 | -------------------------------------------------------------------------------- /scripts/Main.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | func _ready() -> void: 5 | # Touchscreen controls 6 | if OS.get_name() == "HTML5" or OS.get_name() == "Android" or OS.get_name() == "iOS": 7 | get_node("Menu/Control/TopBar/CenterMenu/Mobile").hide() # change to show if re-enabling 8 | else: 9 | get_node("Menu/Control/TopBar/CenterMenu/Mobile").hide() 10 | 11 | var cache: Directory = Directory.new() 12 | if !cache.dir_exists("user://.cache"): 13 | # warning-ignore:return_value_discarded 14 | cache.make_dir("user://.cache") 15 | 16 | var settings: File = File.new() 17 | var ary: Array = [] 18 | if settings.file_exists("user://settings.cfg"): 19 | # warning-ignore:return_value_discarded 20 | settings.open("user://settings.cfg", settings.READ) 21 | for line in settings.get_as_text().split("\n"): 22 | ary.append(parse_json(line)) 23 | settings.close() 24 | if ary[0]["VERSION"] != Globals.FILESETTINGSFORMAT: 25 | get_node("Menu/Control/LoadSettingsError").popup_centered() 26 | else: 27 | ary.remove(0) 28 | get_node("Menu/Control/TopBar/LeftMenu/Edit").__init(int(ary[0]["THEME"])) 29 | ary.remove(0) 30 | var musicSet: bool = false 31 | var soundSet: bool = false 32 | var mobileSet: bool = false 33 | var windowSize: bool = false 34 | var keyboardType: bool = false 35 | var mouseSensitivity: bool = false 36 | var cameraSpeed: bool = false 37 | var p2vmfexport: bool = false 38 | 39 | for line in ary: 40 | if line == null: 41 | print("ERROR: INVALID CONFIG. If you did not change the config yourself, please report this bug.") 42 | continue 43 | if "musictgl" in line.keys(): 44 | get_node("Menu/Control/Properties/TabContainer/General/Music/Music").pressed = bool(line["musictgl"]) 45 | musicSet = true 46 | if "soundtgl" in line.keys(): 47 | get_node("Menu/Control/Properties/TabContainer/General/Sound/Sound").pressed = bool(line["soundtgl"]) 48 | soundSet = true 49 | if "mobilebtn" in line.keys(): 50 | get_node("Menu/Control/Properties/TabContainer/General/Mobile/Mobile").pressed = bool(line["mobilebtn"]) 51 | mobileSet = true 52 | if "windowSize" in line.keys(): 53 | get_node("Menu/Control/Properties/TabContainer/General/WindowSize/HBoxContainer/WindowSize").select(int(line["windowSize"])) 54 | windowSize = true 55 | if "keyboardType" in line.keys(): 56 | get_node("Menu/Control/Properties/TabContainer/General/KeyboardLayout/HBoxContainer/KeyboardLayout").select(int(line["keyboardType"])) 57 | keyboardType = true 58 | if "mouseSensitivity" in line.keys(): 59 | get_node("Menu/Control/Properties/TabContainer/General/MouseSensitivity/MouseSensitivity").value = float(line["mouseSensitivity"]) 60 | mouseSensitivity = true 61 | if "cameraSpeed" in line.keys(): 62 | get_node("Menu/Control/Properties/TabContainer/General/CameraSpeed/CameraSpeed").value = float(line["cameraSpeed"]) 63 | cameraSpeed = true 64 | if "p2vmfexport" in line.keys(): 65 | get_node("Menu/Control/Properties/TabContainer/Experimental/P2VMFExport/P2VMFExport").pressed = bool(line["p2vmfexport"]) 66 | p2vmfexport = true 67 | if "p2gameinfo" in line.keys(): 68 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/GameInfo/LineEdit").text = str(line["p2gameinfo"]) 69 | if "p2gamedir" in line.keys(): 70 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/GameDir/LineEdit").text = str(line["p2gamedir"]) 71 | if "p2exe" in line.keys(): 72 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/ExePath/LineEdit").text = str(line["p2exe"]) 73 | if "p2vbsp" in line.keys(): 74 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/VBSP/LineEdit").text = str(line["p2vbsp"]) 75 | if "p2bspzip" in line.keys(): 76 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/BSPZIP/LineEdit").text = str(line["p2bspzip"]) 77 | if "p2vvis" in line.keys(): 78 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/VVIS/LineEdit").text = str(line["p2vvis"]) 79 | if "p2vrad" in line.keys(): 80 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/VRAD/LineEdit").text = str(line["p2vrad"]) 81 | if "p2runonbuild" in line.keys(): 82 | get_node("Menu/Control/ExportDialog/TabContainer/Portal 2/RunGame/CenterContainer/CheckButton").pressed = bool(line["p2runonbuild"]) 83 | if !musicSet: 84 | get_node("Menu/Control/Properties/TabContainer/General/Music/Music").pressed = true 85 | if !soundSet: 86 | get_node("Menu/Control/Properties/TabContainer/General/Sound/Sound").pressed = true 87 | if !mobileSet: 88 | get_node("Menu/Control/Properties/TabContainer/General/Sound/Sound").pressed = false 89 | if !windowSize: 90 | get_node("Menu/Control/Properties/TabContainer/General/WindowSize/HBoxContainer/WindowSize").select(0) 91 | if !keyboardType: 92 | get_node("Menu/Control/Properties/TabContainer/General/KeyboardLayout/HBoxContainer/KeyboardLayout").select(0) 93 | if !mouseSensitivity: 94 | get_node("Menu/Control/Properties/TabContainer/General/MouseSensitivity/MouseSensitivity").value = 20.0 95 | if !cameraSpeed: 96 | get_node("Menu/Control/Properties/TabContainer/General/CameraSpeed/CameraSpeed").value = 20.0 97 | if !p2vmfexport: 98 | get_node("Menu/Control/Properties/TabContainer/Experimental/P2VMFExport/P2VMFExport").pressed = false 99 | 100 | if OS.get_name() == "HTML5": 101 | get_node("Menu/Control/Properties/TabContainer/General/WindowSize/HBoxContainer/WindowSize").select(0) 102 | get_node("Menu/Control/Properties/TabContainer/General/WindowSize").hide() 103 | 104 | var textree: Tree = get_node("Menu/Control/ContextPanel/TabContainer/Textures/Tree") 105 | PackLoader.set_texture_list(textree) 106 | var enttree: Tree = get_node("Menu/Control/ContextPanel/TabContainer/Entities/Tree") 107 | PackLoader.set_entity_list(enttree) 108 | PackLoader.set_error_dialog(get_node("Menu/Control/ResourcePackLoadError")) 109 | PackLoader.set_export_dialog(get_node("Menu/Control/ExportDialog")) 110 | PackLoader.load_default_resource_pack("res://editor_assets/") 111 | textree.add_category("Custom", Globals.CUSTOMID) 112 | enttree.add_category("Custom", Globals.CUSTOMID) 113 | 114 | get_node("Menu/Control/Properties").__init() 115 | get_node("Menu/Control/LightPanel").__init(false, true, 0, 0, 100, 100) 116 | get_node("Scene/Room").__init() 117 | 118 | func _notification(notification): 119 | if notification == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: 120 | if get_node("Menu/Control/TopBar/CenterMenu/LevelName").text != "": 121 | get_node("Menu/Control/TopBar/LeftMenu/File").emit_signal("save_level", get_node("Menu/Control/TopBar/CenterMenu/LevelName").text) 122 | get_node("Menu/Control/QuitRequest").popup_centered() 123 | -------------------------------------------------------------------------------- /scripts/editor/Camera.gd: -------------------------------------------------------------------------------- 1 | extends Camera 2 | 3 | 4 | var active_toggle: bool 5 | var active_button: bool 6 | 7 | var pivot: Spatial 8 | 9 | signal editor_camera_active 10 | signal editor_camera_inactive 11 | 12 | 13 | func _ready() -> void: 14 | active_toggle = false 15 | active_button = false 16 | pivot = get_parent() 17 | 18 | func get_movement() -> Vector3: 19 | # Get movement keys, 20 | var vec3: Vector3 = Vector3() 21 | if (Input.is_action_pressed("editor_camera_forward")): 22 | vec3 -= self.transform.basis.z 23 | if (Input.is_action_pressed("editor_camera_back")): 24 | vec3 += self.transform.basis.z 25 | if (Input.is_action_pressed("editor_camera_left")): 26 | vec3 -= self.transform.basis.x 27 | if (Input.is_action_pressed("editor_camera_right")): 28 | vec3 += self.transform.basis.x 29 | if (Input.is_action_pressed("editor_camera_up")): 30 | vec3.y += 1 31 | if (Input.is_action_pressed("editor_camera_down")): 32 | vec3.y -= 1 33 | vec3 = vec3.normalized() * Globals.MOVEMENT_SENSITIVITY 34 | return vec3 35 | 36 | """ # remove mobile controls 37 | func get_mobile_movement(key) -> Vector3: 38 | # Get movement keys, 39 | var vec3: Vector3 = Vector3() 40 | if (key == KEY_W): 41 | vec3 -= self.transform.basis.z 42 | elif (key == KEY_S): 43 | vec3 += self.transform.basis.z 44 | elif (key == KEY_A): 45 | vec3 -= self.transform.basis.x 46 | elif (key == KEY_D): 47 | vec3 += self.transform.basis.x 48 | elif (key == KEY_SPACE): 49 | vec3.y += 1 50 | elif (key == KEY_C): 51 | vec3.y -= 1 52 | vec3 = vec3.normalized() * Globals.MOVEMENT_SENSITIVITY 53 | return vec3 54 | """ 55 | 56 | func _process(delta) -> void: 57 | if Globals.PLAY_MODE: 58 | self.current = false 59 | else: 60 | self.current = true 61 | if active_toggle or active_button: 62 | if Input.is_action_just_released("editor_camera_speed_increase"): 63 | Globals.MOVEMENT_SENSITIVITY = clamp(Globals.MOVEMENT_SENSITIVITY + (5 * delta), 0.25, 5.0) 64 | elif Input.is_action_just_released("editor_camera_speed_decrease"): 65 | Globals.MOVEMENT_SENSITIVITY = clamp(Globals.MOVEMENT_SENSITIVITY - (5 * delta), 0.25, 5.0) 66 | pivot.translate(self.get_movement()) 67 | 68 | func _input(_event: InputEvent) -> void: 69 | if !Globals.PLAY_MODE: 70 | # Activate movement? 71 | if Input.is_action_just_pressed("editor_camera_button"): 72 | active_button = true 73 | active_toggle = false 74 | if Input.is_action_just_released("editor_camera_button"): 75 | active_button = false 76 | if Input.is_action_just_pressed("editor_camera_toggle") and !active_button: 77 | active_toggle = !active_toggle 78 | 79 | if Input.is_action_just_pressed("editor_player_pause") and active_toggle: 80 | active_toggle = false 81 | 82 | if (!(active_toggle or active_button)): 83 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 84 | self.emit_signal("editor_camera_inactive") 85 | else: 86 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 87 | self.emit_signal("editor_camera_active") 88 | 89 | func _unhandled_input(event: InputEvent) -> void: 90 | if event is InputEventMouseMotion: 91 | # Rotate the camera.. 92 | if active_toggle or active_button: 93 | pivot.rotate_y(deg2rad(-event.relative.x * Globals.MOUSE_SENSITIVITY)) 94 | self.rotate_x(deg2rad(-event.relative.y * Globals.MOUSE_SENSITIVITY)) 95 | self.rotation_degrees.x = clamp(self.rotation_degrees.x, -90, 90) 96 | """ # remove touch controls code 97 | elif event is InputEventKey: 98 | if !event.scancode in [KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT] and !Globals.PLAY_MODE: 99 | if get_parent().get_parent().get_parent().get_node("Menu/Control/Properties").get_keyboard_type() == 0: 100 | pivot.translate(self.get_mobile_movement(event.scancode)) 101 | elif get_parent().get_parent().get_parent().get_node("Menu/Control/Properties").get_keyboard_type() == 1: 102 | if event.scancode == KEY_Z: 103 | pivot.translate(self.get_mobile_movement(KEY_W)) 104 | elif event.scancode == KEY_Q: 105 | pivot.translate(self.get_mobile_movement(KEY_A)) 106 | elif !event.scancode in [KEY_A, KEY_W]: 107 | pivot.translate(self.get_mobile_movement(event.scancode)) 108 | elif !Globals.PLAY_MODE: 109 | var x: float = 0.0 110 | var y: float = 0.0 111 | if event.scancode == KEY_UP: 112 | y = Globals.MOBILE_SENSITIVITY 113 | elif event.scancode == KEY_DOWN: 114 | y = -Globals.MOBILE_SENSITIVITY 115 | elif event.scancode == KEY_LEFT: 116 | x = Globals.MOBILE_SENSITIVITY 117 | elif event.scancode == KEY_RIGHT: 118 | x = -Globals.MOBILE_SENSITIVITY 119 | pivot.rotate_y(deg2rad(x * Globals.MOUSE_SENSITIVITY)) 120 | self.rotate_x(deg2rad(y * Globals.MOUSE_SENSITIVITY)) 121 | self.rotation_degrees.x = clamp(self.rotation_degrees.x, -90, 90) 122 | """ 123 | 124 | func _on_play_button_pressed() -> void: 125 | active_toggle = false 126 | active_button = false 127 | -------------------------------------------------------------------------------- /scripts/editor/Cube.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | var XP: MeshInstance 5 | var XM: MeshInstance 6 | var YP: MeshInstance 7 | var YM: MeshInstance 8 | var ZP: MeshInstance 9 | var ZM: MeshInstance 10 | 11 | var planes: Dictionary 12 | 13 | 14 | enum FACE_SELECTION_MODE { 15 | NONE, 16 | CLICK, 17 | DRAG 18 | } 19 | 20 | 21 | func __init(pos: Vector3, type: String, id: int): 22 | self.XP = get_node("XP") 23 | self.XM = get_node("XM") 24 | self.YP = get_node("YP") 25 | self.YM = get_node("YM") 26 | self.ZP = get_node("ZP") 27 | self.ZM = get_node("ZM") 28 | 29 | self.planes = { 30 | Globals.PLANEID.XP: { 31 | "node": self.XP, 32 | "texture": null, 33 | "highlighted": false, 34 | "disabled": false 35 | }, 36 | Globals.PLANEID.XM: { 37 | "node": self.XM, 38 | "texture": null, 39 | "highlighted": false, 40 | "disabled": false 41 | }, 42 | Globals.PLANEID.YP: { 43 | "node": self.YP, 44 | "texture": null, 45 | "highlighted": false, 46 | "disabled": false 47 | }, 48 | Globals.PLANEID.YM: { 49 | "node": self.YM, 50 | "texture": null, 51 | "highlighted": false, 52 | "disabled": false 53 | }, 54 | Globals.PLANEID.ZP: { 55 | "node": self.ZP, 56 | "texture": null, 57 | "highlighted": false, 58 | "disabled": false 59 | }, 60 | Globals.PLANEID.ZM: { 61 | "node": self.ZM, 62 | "texture": null, 63 | "highlighted": false, 64 | "disabled": false 65 | } 66 | } 67 | self.set_type_all(type) 68 | self.set_position_grid(pos) 69 | self.set_id(id) 70 | 71 | func get_id() -> int: 72 | return int(self.name) 73 | 74 | func set_id(cubeID: int) -> void: 75 | self.name = str(cubeID) 76 | 77 | func get_disabled(plane: int) -> bool: 78 | return self.planes[plane]["disabled"] 79 | 80 | func set_disabled(plane: int, disabled: bool) -> void: 81 | self.planes[plane]["disabled"] = disabled 82 | if disabled: 83 | self.planes[plane]["node"].hide() 84 | else: 85 | self.planes[plane]["node"].show() 86 | 87 | func get_plane(planeid: int): 88 | match planeid: 89 | Globals.PLANEID.XP: 90 | return self.XP 91 | Globals.PLANEID.XM: 92 | return self.XM 93 | Globals.PLANEID.YP: 94 | return self.YP 95 | Globals.PLANEID.YM: 96 | return self.YM 97 | Globals.PLANEID.ZP: 98 | return self.ZP 99 | Globals.PLANEID.ZM: 100 | return self.ZM 101 | _: 102 | assert(false, "Room.get_plane says how?") 103 | 104 | # warning-ignore:shadowed_variable 105 | func set_data(planes: Dictionary) -> void: 106 | for i in range(6): 107 | self.set_type(i, planes[i]["texture"]) 108 | self.set_disabled(i, planes[i]["disabled"]) 109 | 110 | func get_data() -> Dictionary: 111 | return self.planes 112 | 113 | func set_type_all(type: String) -> void: 114 | for i in Globals.PLANEID.values(): 115 | self.set_type(i, type) 116 | 117 | func set_type(plane: int, type: String) -> void: 118 | self.planes[plane]["node"].material_override.albedo_texture = PackLoader.textureNode.get_texture(type) 119 | self.planes[plane]["texture"] = type 120 | 121 | func get_type(plane: int) -> String: 122 | return self.planes[plane]["texture"] 123 | 124 | func get_portal2_type(plane: int) -> String: 125 | return PackLoader.get_portal2_texture_from_id(self.planes[plane]["texture"]) 126 | 127 | func set_position_grid(pos: Vector3) -> void: 128 | self.transform.origin.x = pos.x * 10 129 | self.transform.origin.y = pos.y * 10 130 | self.transform.origin.z = pos.z * 10 131 | 132 | func get_position_grid() -> Vector3: 133 | return Vector3( self.transform.origin.x / 10, 134 | self.transform.origin.y / 10, 135 | self.transform.origin.z / 10 ) 136 | 137 | func set_face_highlight(plane: int, highlighted: bool) -> void: 138 | if highlighted: 139 | self.planes[plane]["node"].material_override.albedo_color = Color.cadetblue 140 | else: 141 | self.planes[plane]["node"].material_override.albedo_color = Color.white 142 | self.planes[plane]["highlighted"] = highlighted 143 | 144 | func set_all_face_highlight(highlighted: bool) -> void: 145 | for i in range(6): 146 | self.set_face_highlight(i, highlighted) 147 | 148 | func get_face_highlight(plane: int) -> bool: 149 | return self.planes[plane]["highlighted"] 150 | 151 | func _select_helper(event: InputEvent) -> int: 152 | if event is InputEventMouseButton and ((event.button_index == BUTTON_LEFT or event.button_index == BUTTON_RIGHT) and event.pressed == true): 153 | return FACE_SELECTION_MODE.CLICK 154 | elif event is InputEventMouseMotion and (Input.is_action_pressed("left_click") or Input.is_action_pressed("right_click")): 155 | return FACE_SELECTION_MODE.DRAG 156 | else: 157 | return FACE_SELECTION_MODE.NONE 158 | 159 | func _on_select(plane: int, event: InputEvent): 160 | var selectHelper: int = self._select_helper(event) 161 | match (selectHelper): 162 | FACE_SELECTION_MODE.NONE: 163 | return 164 | FACE_SELECTION_MODE.CLICK: 165 | get_parent()._on_face_selected(self.get_id(), plane, event.button_index, false) 166 | FACE_SELECTION_MODE.DRAG: 167 | var btn: int 168 | if Input.is_action_pressed("left_click"): 169 | btn = BUTTON_LEFT 170 | elif Input.is_action_pressed("right_click"): 171 | btn = BUTTON_RIGHT 172 | else: 173 | return 174 | if is_instance_valid(get_parent()): 175 | get_parent()._on_face_selected(self.get_id(), plane, btn, true) 176 | _: 177 | assert(false, "Cube._on_select says how?") 178 | 179 | func _on_XP_select(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 180 | self._on_select(Globals.PLANEID.XP, event) 181 | 182 | func _on_XM_select(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 183 | self._on_select(Globals.PLANEID.XM, event) 184 | 185 | func _on_YP_select(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 186 | self._on_select(Globals.PLANEID.YP, event) 187 | 188 | func _on_YM_select(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 189 | self._on_select(Globals.PLANEID.YM, event) 190 | 191 | func _on_ZP_select(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 192 | self._on_select(Globals.PLANEID.ZP, event) 193 | 194 | func _on_ZM_select(_camera: Node, event: InputEvent, _click_position: Vector3, _click_normal: Vector3, _shape_idx: int) -> void: 195 | self._on_select(Globals.PLANEID.ZM, event) 196 | -------------------------------------------------------------------------------- /scripts/editor/LightPanel.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/editor/ToolBarUpDown.gd" 2 | 3 | 4 | var x: Label 5 | var y: Label 6 | var gi: Label 7 | var sn: Label 8 | var xs: Slider 9 | var ys: Slider 10 | var gis: Slider 11 | var sns: Slider 12 | var sunBtn: Button 13 | var giBtn: Button 14 | 15 | 16 | func _ready() -> void: 17 | self.x = $LabelX 18 | self.y = $LabelY 19 | self.gi = $LabelGI 20 | self.sn = $LabelSun 21 | self.xs = $XSlider 22 | self.ys = $YSlider 23 | self.gis = $GISlider 24 | self.sns = $SunSlider 25 | self.sunBtn = $SunEnable 26 | self.giBtn = $GIEnable 27 | 28 | 29 | func __init(sunOn: bool, giOn: bool, xi: int, yi: int, gii: int, sni: int) -> void: 30 | self.sunBtn.pressed = sunOn 31 | self.giBtn.pressed = giOn 32 | self.xs.value = xi 33 | self.ys.value = yi 34 | self.gis.value = gii 35 | self.sns.value = sni 36 | self.update() 37 | 38 | func update() -> void: 39 | self.x.text = "Pitch: " + str(int(self.xs.value)) + "°" 40 | self.y.text = "Yaw: " + str(int(self.ys.value)) + "°" 41 | self.gi.text = "GI: " + str(int(self.gis.value)) + "%" 42 | self.sn.text = "Sun: " + str(int(self.sns.value)) + "%" 43 | 44 | var roomSun: DirectionalLight = get_parent().get_parent().get_parent().get_node("Scene/Room/Sun") 45 | if self.sunBtn.pressed: 46 | roomSun.light_energy = float(self.sns.value) / 100.0 47 | roomSun.show() 48 | else: 49 | roomSun.hide() 50 | roomSun.rotation_degrees.x = int(self.xs.value) 51 | roomSun.rotation_degrees.y = int(self.ys.value) 52 | roomSun.rotation_degrees.z = 0 53 | var env: Environment = get_parent().get_parent().get_parent().get_node("Environment").environment 54 | if self.giBtn.pressed: 55 | env.ambient_light_energy = float(self.gis.value) / 100.0 56 | else: 57 | env.ambient_light_energy = 0.0 58 | 59 | 60 | func _on_XSlider_value_changed(_value: float) -> void: 61 | self.update() 62 | 63 | func _on_YSlider_value_changed(_value: float) -> void: 64 | self.update() 65 | 66 | func _on_GISlider_value_changed(_value: float) -> void: 67 | self.update() 68 | 69 | func _on_SunSlider_value_changed(_value: float) -> void: 70 | self.update() 71 | 72 | func _on_SunEnable_toggled(_button_pressed: bool) -> void: 73 | self.update() 74 | 75 | func _on_GIEnable_toggled(_button_pressed: bool) -> void: 76 | self.update() 77 | -------------------------------------------------------------------------------- /scripts/editor/Play.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | 4 | var player: KinematicBody 5 | var room: Spatial 6 | 7 | signal play_button_pressed 8 | 9 | 10 | func _ready() -> void: 11 | self.text = "Play" 12 | self.room = get_parent().get_parent().get_parent().get_parent().get_parent().get_node("Scene/Room") 13 | self.player = self.room.get_node("Player") 14 | self.player.hide() 15 | 16 | func _on_toggled(button_pressed: bool) -> void: 17 | self.release_focus() 18 | for ent in get_parent().get_parent().get_parent().get_parent().get_parent().get_node("Scene/Room").ents: 19 | ent["node"].global_transform.origin.x = ent["posx"] 20 | ent["node"].global_transform.origin.y = ent["posy"] 21 | ent["node"].global_transform.origin.z = ent["posz"] 22 | if button_pressed: 23 | self.emit_signal("play_button_pressed") 24 | var resp: Array = self.room.get_player_start() 25 | if !resp[0]: 26 | get_parent().get_parent().get_parent().get_node("PlayModeError").popup_centered() 27 | self.pressed = false 28 | self.player._set_active(false) 29 | self.player.hide() 30 | else: 31 | self.text = "Stop" 32 | Globals.PLAY_MODE = true 33 | self.player.global_transform.origin.x = resp[1] 34 | self.player.global_transform.origin.y = resp[2] 35 | self.player.global_transform.origin.z = resp[3] 36 | self.player._set_active(true) 37 | self.player.show() 38 | else: 39 | self.text = "Play" 40 | Globals.PLAY_MODE = false 41 | self.player._set_active(false) 42 | self.player.hide() 43 | -------------------------------------------------------------------------------- /scripts/editor/Player.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | var active: bool 5 | var esc_pressed: bool 6 | var cam: Camera 7 | var gravity: float 8 | var movement: Vector3 9 | 10 | 11 | func _ready() -> void: 12 | self.active = false 13 | self.cam = $Camera 14 | self.esc_pressed = false 15 | self.gravity = -10.0 16 | self.movement = Vector3() 17 | 18 | func _i_am_the_player_fear_me_() -> void: 19 | pass # very convoluted (but in a few lines) way of telling player apart from other nodes 20 | 21 | # warning-ignore:shadowed_variable 22 | func _set_active(active: bool) -> void: 23 | self.active = active 24 | LogicManager.set_active(active) 25 | if active: 26 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 27 | self.esc_pressed = false 28 | else: 29 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 30 | 31 | func _physics_process(delta: float) -> void: 32 | if self.active and Input.is_action_just_pressed("editor_player_pause"): 33 | if !esc_pressed: 34 | self.esc_pressed = true 35 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 36 | else: 37 | self.esc_pressed = false 38 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 39 | 40 | if self.active: 41 | if Input.is_action_pressed("editor_camera_forward"): 42 | self.movement.z = -1 43 | if Input.is_action_pressed("editor_camera_back"): 44 | self.movement.z = 1 45 | if !Input.is_action_pressed("editor_camera_forward") and !Input.is_action_pressed("editor_camera_back"): 46 | self.movement.z = 0 47 | if Input.is_action_pressed("editor_camera_left"): 48 | self.movement.x = -1 49 | if Input.is_action_pressed("editor_camera_right"): 50 | self.movement.x = 1 51 | if !Input.is_action_pressed("editor_camera_left") and !Input.is_action_pressed("editor_camera_right"): 52 | self.movement.x = 0 53 | 54 | var snap: Vector3 = Vector3(0,-0.25,0) 55 | 56 | if self.is_on_floor(): 57 | self.movement.y = 0 58 | else: 59 | self.movement.y += gravity * delta 60 | 61 | if Input.is_action_just_pressed("editor_camera_up") and self.is_on_floor(): 62 | self.movement.y = 4 63 | snap = Vector3() 64 | 65 | # warning-ignore:return_value_discarded 66 | self.move_and_slide_with_snap(transform.basis.xform(movement) * 20, snap, Vector3(0,1,0)) 67 | 68 | func _input(event: InputEvent) -> void: 69 | if event is InputEventMouseMotion: 70 | # Rotate the camera.. 71 | if self.active and !self.esc_pressed: 72 | self.rotation_degrees.y -= event.relative.x * Globals.MOUSE_SENSITIVITY 73 | self.cam.rotation_degrees.x -= event.relative.y * Globals.MOUSE_SENSITIVITY 74 | if self.cam.rotation_degrees.x < -90: 75 | self.cam.rotation_degrees.x = -90 76 | elif self.cam.rotation_degrees.x > 90: 77 | self.cam.rotation_degrees.x = 90 78 | -------------------------------------------------------------------------------- /scripts/editor/SoundEffect.gd: -------------------------------------------------------------------------------- 1 | extends AudioStreamPlayer 2 | 3 | 4 | onready var isDisabled = false 5 | 6 | 7 | func get_disabled() -> bool: 8 | return self.isDisabled 9 | 10 | func set_disabled(b: bool) -> void: 11 | self.isDisabled = b 12 | -------------------------------------------------------------------------------- /scripts/editor/ToolBar.gd: -------------------------------------------------------------------------------- 1 | extends Panel 2 | 3 | 4 | export(float) var anchorLeft: float 5 | export(float) var anchorRight: float 6 | export(float) var anchorLeftHidden: float 7 | export(float) var anchorRightHidden: float 8 | 9 | var tween: Tween 10 | 11 | 12 | func _ready() -> void: 13 | self.anchor_left = anchorLeftHidden 14 | self.anchor_right = anchorRightHidden 15 | self.tween = get_node("Tween") 16 | 17 | 18 | func _on_grow() -> void: 19 | # warning-ignore:return_value_discarded 20 | tween.interpolate_property(self, "anchor_left", null, self.anchorLeft, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 21 | # warning-ignore:return_value_discarded 22 | tween.interpolate_property(self, "anchor_right", null, self.anchorRight, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 23 | # warning-ignore:return_value_discarded 24 | tween.start() 25 | 26 | func _on_shrink() -> void: 27 | # warning-ignore:return_value_discarded 28 | tween.interpolate_property(self, "anchor_left", null, self.anchorLeftHidden, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 29 | # warning-ignore:return_value_discarded 30 | tween.interpolate_property(self, "anchor_right", null, self.anchorRightHidden, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 31 | # warning-ignore:return_value_discarded 32 | tween.start() 33 | -------------------------------------------------------------------------------- /scripts/editor/ToolBarUpDown.gd: -------------------------------------------------------------------------------- 1 | extends Panel 2 | 3 | 4 | export(float) var anchorUp: float 5 | export(float) var anchorDown: float 6 | export(float) var anchorUpHidden: float 7 | export(float) var anchorDownHidden: float 8 | 9 | var tween: Tween 10 | 11 | 12 | func _ready() -> void: 13 | self.anchor_top = anchorUpHidden 14 | self.anchor_bottom = anchorDownHidden 15 | self.tween = get_node("Tween") 16 | 17 | 18 | func _on_grow() -> void: 19 | # warning-ignore:return_value_discarded 20 | tween.interpolate_property(self, "anchor_top", null, self.anchorUp, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 21 | # warning-ignore:return_value_discarded 22 | tween.interpolate_property(self, "anchor_bottom", null, self.anchorDown, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 23 | # warning-ignore:return_value_discarded 24 | tween.start() 25 | 26 | func _on_shrink() -> void: 27 | # warning-ignore:return_value_discarded 28 | tween.interpolate_property(self, "anchor_top", null, self.anchorUpHidden, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 29 | # warning-ignore:return_value_discarded 30 | tween.interpolate_property(self, "anchor_bottom", null, self.anchorDownHidden, 0.25, Tween.TRANS_CIRC, Tween.EASE_IN_OUT) 31 | # warning-ignore:return_value_discarded 32 | tween.start() 33 | -------------------------------------------------------------------------------- /scripts/editor/TouchControls.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | 4 | var btn 5 | var fwd: bool 6 | var bck: bool 7 | var lft: bool 8 | var rgt: bool 9 | var up: bool 10 | var dwn: bool 11 | var llft: bool 12 | var lrgt: bool 13 | var lup: bool 14 | var ldwn: bool 15 | 16 | 17 | func _ready() -> void: 18 | self.hide() 19 | self.btn = BUTTON_LEFT 20 | get_node("LeftClick").disabled = true 21 | self.fwd = false 22 | self.bck = false 23 | self.lft = false 24 | self.rgt = false 25 | self.up = false 26 | self.dwn = false 27 | self.llft = false 28 | self.lrgt = false 29 | self.lup = false 30 | self.ldwn = false 31 | 32 | func _process(_delta: float) -> void: 33 | if self.visible: 34 | if self.fwd: 35 | self.create_key_event(KEY_W) 36 | if self.bck: 37 | self.create_key_event(KEY_S) 38 | if self.lft: 39 | self.create_key_event(KEY_A) 40 | if self.rgt: 41 | self.create_key_event(KEY_D) 42 | if self.up: 43 | self.create_key_event(KEY_SPACE) 44 | if self.dwn: 45 | self.create_key_event(KEY_C) 46 | 47 | if self.llft: 48 | self.create_key_event(KEY_LEFT) 49 | if self.lrgt: 50 | self.create_key_event(KEY_RIGHT) 51 | if self.lup: 52 | self.create_key_event(KEY_UP) 53 | if self.ldwn: 54 | self.create_key_event(KEY_DOWN) 55 | 56 | 57 | func create_mouse_event(event: InputEventMouseButton) -> void: 58 | var ev = event 59 | ev.button_index = self.btn 60 | get_tree().input_event(ev) 61 | 62 | func create_key_event(key) -> void: 63 | var ev = InputEventKey.new() 64 | ev.scancode = key 65 | ev.pressed = true 66 | get_tree().input_event(ev) 67 | 68 | func _input(event: InputEvent) -> void: 69 | if self.visible: 70 | if event is InputEventMouseButton and event.button_index != self.btn: 71 | self.create_mouse_event(event) 72 | get_tree().set_input_as_handled() 73 | 74 | func _on_Mobile_toggled(button_pressed: bool) -> void: 75 | if button_pressed: 76 | self.show() 77 | else: 78 | self.hide() 79 | 80 | func _on_LeftClick_pressed() -> void: 81 | get_node("LeftClick").disabled = true 82 | get_node("RightClick").disabled = false 83 | self.btn = BUTTON_LEFT 84 | 85 | func _on_RightClick_pressed() -> void: 86 | get_node("LeftClick").disabled = false 87 | get_node("RightClick").disabled = true 88 | self.btn = BUTTON_RIGHT 89 | 90 | 91 | func _on_Forward_button_down() -> void: 92 | self.fwd = true 93 | func _on_Forward_button_up() -> void: 94 | self.fwd = false 95 | 96 | func _on_Back_button_down() -> void: 97 | self.bck = true 98 | func _on_Back_button_up() -> void: 99 | self.bck = false 100 | 101 | func _on_Left_button_down() -> void: 102 | self.lft = true 103 | func _on_Left_button_up() -> void: 104 | self.lft = false 105 | 106 | func _on_Right_button_down() -> void: 107 | self.rgt = true 108 | func _on_Right_button_up() -> void: 109 | self.rgt = false 110 | 111 | func _on_Up_button_down() -> void: 112 | self.up = true 113 | func _on_Up_button_up() -> void: 114 | self.up = false 115 | 116 | func _on_Down_button_down() -> void: 117 | self.dwn = true 118 | func _on_Down_button_up() -> void: 119 | self.dwn = false 120 | 121 | 122 | func _on_LookUp_button_down() -> void: 123 | self.lup = true 124 | func _on_LookUp_button_up() -> void: 125 | self.lup = false 126 | 127 | func _on_LookDown_button_down() -> void: 128 | self.ldwn = true 129 | func _on_LookDown_button_up() -> void: 130 | self.ldwn = false 131 | 132 | func _on_LookLeft_button_down() -> void: 133 | self.llft = true 134 | func _on_LookLeft_button_up() -> void: 135 | self.llft = false 136 | 137 | func _on_LookRight_button_down() -> void: 138 | self.lrgt = true 139 | func _on_LookRight_button_up() -> void: 140 | self.lrgt = false 141 | -------------------------------------------------------------------------------- /scripts/menu/About.gd: -------------------------------------------------------------------------------- 1 | extends MenuButton 2 | 3 | 4 | var popup: PopupMenu 5 | 6 | 7 | func _ready() -> void: 8 | popup = get_popup() 9 | popup.add_item("Credits") 10 | popup.add_item("Background Music") 11 | 12 | # warning-ignore:return_value_discarded 13 | popup.connect("id_pressed", self, "_on_item_pressed") 14 | 15 | 16 | func _on_item_pressed(id : int) -> void: 17 | match id: 18 | 0: 19 | get_parent().get_parent().get_parent().get_node("Credits").popup_centered() 20 | 1: 21 | get_parent().get_parent().get_parent().get_node("BackgroundMusicCredits").popup_centered() 22 | _: 23 | assert(false, "About says how?") 24 | -------------------------------------------------------------------------------- /scripts/menu/Add.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | 4 | func _on_pressed() -> void: 5 | if OS.get_name() == "HTML5": 6 | get_parent().get_parent().get_parent().get_node("DragAndDrop").popup_centered() 7 | elif get_parent().get_parent().get_node("TabContainer/Entities").visible: 8 | get_parent().get_parent().get_parent().get_node("EntityFileSelect").popup_centered() 9 | elif get_parent().get_parent().get_node("TabContainer/Textures").visible: 10 | get_parent().get_parent().get_parent().get_node("TextureFileSelect").popup_centered() 11 | -------------------------------------------------------------------------------- /scripts/menu/ConfirmNewLevel.gd: -------------------------------------------------------------------------------- 1 | extends ConfirmationDialog 2 | 3 | 4 | signal clear 5 | 6 | 7 | func _ready() -> void: 8 | # warning-ignore:return_value_discarded 9 | self.connect("clear", get_parent().get_parent().get_parent().get_node("Scene/Room"), "clear") 10 | 11 | func _on_confirmed(): 12 | self.emit_signal("clear") 13 | -------------------------------------------------------------------------------- /scripts/menu/ConnectionItem.gd: -------------------------------------------------------------------------------- 1 | extends Panel 2 | 3 | 4 | var input_logic_id: int 5 | var output_logic_id: int 6 | 7 | 8 | func set_inputs(inputs: Array) -> void: 9 | $InputContainer/InputSelection.clear() 10 | if len(inputs) == 0: 11 | $InputContainer/InputSelection.add_item("...") 12 | else: 13 | for input in inputs: 14 | $InputContainer/InputSelection.add_item(input) 15 | 16 | func set_outputs(outputs: Array) -> void: 17 | $OutputContainer/OutputSelection.clear() 18 | if len(outputs) == 0: 19 | $OutputContainer/OutputSelection.add_item("...") 20 | else: 21 | for output in outputs: 22 | $OutputContainer/OutputSelection.add_item(output) 23 | 24 | func set_input_id(id: int) -> void: 25 | self.self_modulate = Color.white 26 | input_logic_id = id 27 | $InputName.text = str(id) 28 | 29 | func set_output_id(id: int) -> void: 30 | output_logic_id = id 31 | $OutputName.text = str(id) 32 | 33 | func _on_InputName_pressed() -> void: 34 | get_parent().set_input_listener(self) 35 | 36 | func _on_Delete_pressed() -> void: 37 | get_parent().remove_connection(self) 38 | -------------------------------------------------------------------------------- /scripts/menu/ConnectionList.gd: -------------------------------------------------------------------------------- 1 | extends VBoxContainer 2 | 3 | 4 | onready var connectionitem_scene: PackedScene = preload("res://scenes/menu/ConnectionItem.tscn") 5 | var isListeningForInput: Panel = null 6 | 7 | 8 | func _on_connection_button_pressed() -> void: 9 | for node in get_parent().get_parent().get_children(): 10 | node.hide() 11 | get_parent().show() 12 | 13 | func _on_rebuild_connectionlist(removed_ent_logic_ids: Array) -> void: 14 | for id in removed_ent_logic_ids: 15 | for node in get_children(): 16 | if node.input_logic_id == id or node.output_logic_id == id: 17 | remove_child(node) 18 | node.queue_free() 19 | 20 | func set_input_listener(node: Node) -> void: 21 | if isListeningForInput != null: 22 | isListeningForInput.self_modulate = Color.white 23 | isListeningForInput = node 24 | isListeningForInput.self_modulate = Color.blue 25 | 26 | func add_connection(entity: Node) -> void: 27 | if isListeningForInput != null: 28 | if isListeningForInput.output_logic_id == entity.logic_id: 29 | return 30 | isListeningForInput.set_inputs(entity.get_inputs()) 31 | isListeningForInput.set_input_id(entity.logic_id) 32 | isListeningForInput = null 33 | return 34 | var new_connection: Panel = connectionitem_scene.instance() 35 | new_connection.set_outputs(entity.get_outputs()) 36 | new_connection.set_output_id(entity.logic_id) 37 | self.add_child(new_connection) 38 | 39 | func remove_connection(connection: Panel) -> void: 40 | # todo 41 | remove_child(connection) 42 | connection.queue_free() 43 | -------------------------------------------------------------------------------- /scripts/menu/Crosshair.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | 4 | func _ready(): 5 | self.position = Vector2(get_viewport().size.x / 2, get_viewport().size.y / 2) 6 | self.hide() 7 | 8 | func _on_editor_camera_active(): 9 | self.show() 10 | 11 | func _on_editor_camera_inactive(): 12 | self.hide() 13 | -------------------------------------------------------------------------------- /scripts/menu/Edit.gd: -------------------------------------------------------------------------------- 1 | extends MenuButton 2 | 3 | 4 | var popup: PopupMenu 5 | var themeSubMenu: PopupMenu 6 | var themeID: int 7 | #var advancedSubMenu: PopupMenu 8 | 9 | 10 | func _ready() -> void: 11 | var properties_shortcut = ShortCut.new() 12 | properties_shortcut.set_shortcut(InputMap.get_action_list("ui_properties")[0]) 13 | 14 | popup = get_popup() 15 | popup.add_item("Properties...") 16 | popup.set_item_shortcut(0, properties_shortcut) 17 | 18 | themeSubMenu = PopupMenu.new() 19 | themeSubMenu.set_name("themeSubMenu") 20 | themeSubMenu.add_radio_check_item("Light") 21 | themeSubMenu.set_item_checked(0, true) 22 | themeSubMenu.add_radio_check_item("Dark") 23 | themeSubMenu.set_item_checked(1, false) 24 | popup.add_child(themeSubMenu) 25 | popup.add_submenu_item("Theme", "themeSubMenu") 26 | 27 | #advancedSubMenu = PopupMenu.new() 28 | #advancedSubMenu.set_name("advancedSubMenu") 29 | #advancedSubMenu.add_item("Save VMF...") 30 | #popup.add_child(advancedSubMenu) 31 | #popup.add_submenu_item("Advanced", "advancedSubMenu") 32 | 33 | # warning-ignore:return_value_discarded 34 | popup.connect("id_pressed", self, "_on_item_pressed") 35 | #advancedSubMenu.connect("id_pressed", self, "_on_item_pressed_advanced") 36 | # warning-ignore:return_value_discarded 37 | themeSubMenu.connect("id_pressed", self, "_on_item_pressed_theme") 38 | 39 | func __init(themeid: int) -> void: 40 | self.themeID = themeid 41 | if self.themeID == Globals.THEME.LIGHT: 42 | themeSubMenu.set_item_checked(0, true) 43 | themeSubMenu.set_item_checked(1, false) 44 | Globals.SET_THEME(Globals.THEME.LIGHT) 45 | elif self.themeID == Globals.THEME.DARK: 46 | themeSubMenu.set_item_checked(0, false) 47 | themeSubMenu.set_item_checked(1, true) 48 | Globals.SET_THEME(Globals.THEME.DARK) 49 | 50 | func get_theme_selection() -> int: 51 | return self.themeID 52 | 53 | func _on_item_pressed(id : int) -> void: 54 | match id: 55 | 0: 56 | get_parent().get_parent().get_parent().get_node("Properties").popup_centered() 57 | _: 58 | assert(false, "Edit says how?") 59 | 60 | func _on_item_pressed_theme(id: int) -> void: 61 | self.themeID = id 62 | match id: 63 | 0: 64 | themeSubMenu.set_item_checked(0, true) 65 | themeSubMenu.set_item_checked(1, false) 66 | Globals.SET_THEME(Globals.THEME.LIGHT) 67 | get_parent().get_parent().get_parent().get_node("Properties").save() 68 | 1: 69 | themeSubMenu.set_item_checked(0, false) 70 | themeSubMenu.set_item_checked(1, true) 71 | Globals.SET_THEME(Globals.THEME.DARK) 72 | get_parent().get_parent().get_parent().get_node("Properties").save() 73 | _: 74 | print("Edit.Theme says how?") 75 | 76 | func _on_item_pressed_advanced(id: int) -> void: 77 | match id: 78 | 0: 79 | print("(Save VMF...) was pressed") 80 | _: 81 | assert(false, "Edit.Advanced says how?") 82 | -------------------------------------------------------------------------------- /scripts/menu/EntityFileSelect.gd: -------------------------------------------------------------------------------- 1 | extends FileDialog 2 | 3 | 4 | func _on_about_to_show() -> void: 5 | self.invalidate() 6 | 7 | func _on_file_selected(path: String) -> void: 8 | if path.ends_with("zip"): 9 | PackLoader.load_resource_pack(path) 10 | return 11 | var scn: PackedScene = load(path) 12 | var ID: String = path.split("/")[-1] 13 | var copy: File = File.new() 14 | var original: File = File.new() 15 | # warning-ignore:return_value_discarded 16 | copy.open("user://.cache/" + path.split("/")[-1], copy.WRITE) 17 | # warning-ignore:return_value_discarded 18 | original.open(path, original.READ) 19 | copy.store_buffer(original.get_buffer(original.get_len())) 20 | copy.close() 21 | original.close() 22 | get_parent().get_node("ContextPanel/TabContainer/Entities/Tree").add_item(Globals.CUSTOMID, ID.split(".")[0], ID, scn) 23 | -------------------------------------------------------------------------------- /scripts/menu/EntityList.gd: -------------------------------------------------------------------------------- 1 | extends Tree 2 | 3 | 4 | var ENTITIES: Dictionary 5 | var root: TreeItem 6 | var children: Dictionary 7 | 8 | signal RemoveEntity(id) 9 | 10 | 11 | func _ready() -> void: 12 | self.root = self.create_item() 13 | self.set_hide_root(true) 14 | self.ENTITIES = {} 15 | self.children = {} 16 | self._on_search_text_changed("") 17 | 18 | func add_category(catName: String, ID: String) -> void: 19 | self.children[ID] = {"parent": self.create_item(root), "children": {}} 20 | self.children[ID]["parent"].set_text(0, catName) 21 | self.children[ID]["parent"].set_metadata(0, "__category__") 22 | 23 | func add_item(category: String, itemName: String, itemID: String, entity: PackedScene) -> bool: 24 | if !(category in self.children.keys()): 25 | return false; 26 | self.ENTITIES[category + ":" + itemID] = entity 27 | self.children[category]["children"][itemID] = { 28 | "item": self.create_item(self.children[category]["parent"]), 29 | "name": itemName, 30 | "node": entity 31 | } 32 | self.children[category]["children"][itemID]["item"].set_text(0, itemName) 33 | self.children[category]["children"][itemID]["item"].set_icon(0, self.ENTITIES[category + ":" + itemID]) 34 | self.children[category]["children"][itemID]["item"].set_icon_max_width(0, 16) 35 | self.children[category]["children"][itemID]["item"].set_metadata(0, category + ":" + itemID) 36 | return true; 37 | 38 | func get_selected_entity() -> String: 39 | if self.get_selected() != null and self.get_selected().get_metadata(0) != "__category__": 40 | return self.get_selected().get_metadata(0) 41 | else: 42 | return "" 43 | 44 | func get_entity(entName: String) -> Node: 45 | return self.ENTITIES[entName] 46 | 47 | func get_entity_ID(scene: PackedScene) -> String: 48 | var c: int = 0 49 | for i in self.ENTITIES.values(): 50 | if i == scene: 51 | return self.ENTITIES.keys()[c] 52 | c += 1 53 | return "" 54 | 55 | func _on_entity_button_pressed() -> void: 56 | for node in get_parent().get_parent().get_children(): 57 | node.hide() 58 | get_parent().show() 59 | 60 | func _on_Tree_cell_selected() -> void: 61 | self.release_focus() 62 | 63 | func _on_search_text_changed(new_text: String) -> void: 64 | for category in self.children.keys(): 65 | for itemID in self.children[category]["children"].keys(): 66 | if self.children[category]["children"][itemID]["item"] != null: 67 | self.children[category]["children"][itemID]["item"].free() 68 | if new_text == "": 69 | for category in self.children.keys(): 70 | for itemID in self.children[category]["children"].keys(): 71 | self.children[category]["children"][itemID]["item"] = self.create_item(self.children[category]["parent"]) 72 | self.children[category]["children"][itemID]["item"].set_text(0, self.children[category]["children"][itemID]["name"]) 73 | self.children[category]["children"][itemID]["item"].set_metadata(0, category + ":" + itemID) 74 | else: 75 | for category in self.children.keys(): 76 | for itemID in self.children[category]["children"].keys(): 77 | if new_text.to_lower() in self.children[category]["children"][itemID]["name"].to_lower(): 78 | self.children[category]["children"][itemID]["item"] = self.create_item(self.children[category]["parent"]) 79 | self.children[category]["children"][itemID]["item"].set_text(0, self.children[category]["children"][itemID]["name"]) 80 | self.children[category]["children"][itemID]["item"].set_metadata(0, category + ":" + itemID) 81 | 82 | func _on_Remove_pressed() -> void: 83 | if self.get_selected() != null and self.get_selected().get_metadata(0) != "__category__" and !self.get_selected().get_metadata(0).begins_with("builtin"): 84 | for category in self.children.keys(): 85 | var namae: String = self.get_selected().get_metadata(0) 86 | if namae.split(":")[-1] in self.children[category]["children"]: 87 | self.emit_signal("RemoveEntity", namae) 88 | self.children[category]["children"][namae.split(":")[-1]]["item"].free() 89 | self.children[category]["children"].erase(namae.split(":")[-1]) 90 | self._on_search_text_changed(get_parent().get_parent().get_parent().get_node("HBoxContainer/Search").text) 91 | break 92 | -------------------------------------------------------------------------------- /scripts/menu/ExportDialog.gd: -------------------------------------------------------------------------------- 1 | extends Popup 2 | 3 | 4 | onready var TEXTURES: Array = [ 5 | {"file": "res://images/editor/textures/portal2/default_white.vtf", "name": "materials/gpz/default_white.vtf", "short": "default_white.vtf"}, 6 | {"file": "res://images/editor/textures/portal2/default_white.vmt", "name": "materials/gpz/default_white.vmt", "short": "default_white.vmt"} 7 | ] 8 | 9 | 10 | func set_portal2_visibility(visible: bool) -> void: 11 | if visible: 12 | $"TabContainer/Portal 2/GameDir".show() 13 | $"TabContainer/Portal 2/GameInfo".show() 14 | $"TabContainer/Portal 2/ExePath".show() 15 | $"TabContainer/Portal 2/VBSP".show() 16 | $"TabContainer/Portal 2/VVIS".show() 17 | $"TabContainer/Portal 2/VRAD".show() 18 | $"TabContainer/Portal 2/RunGame".show() 19 | $"TabContainer/Portal 2/TextEdit".show() 20 | $"TabContainer/Portal 2/BSPZIP".show() 21 | $"TabContainer/Portal 2/Unusable".hide() 22 | else: 23 | $"TabContainer/Portal 2/GameDir".hide() 24 | $"TabContainer/Portal 2/GameInfo".hide() 25 | $"TabContainer/Portal 2/ExePath".hide() 26 | $"TabContainer/Portal 2/VBSP".hide() 27 | $"TabContainer/Portal 2/VVIS".hide() 28 | $"TabContainer/Portal 2/VRAD".hide() 29 | $"TabContainer/Portal 2/RunGame".hide() 30 | $"TabContainer/Portal 2/TextEdit".hide() 31 | $"TabContainer/Portal 2/BSPZIP".hide() 32 | $"TabContainer/Portal 2/Unusable".show() 33 | 34 | func _on_Close_pressed() -> void: 35 | self.hide() 36 | get_parent().get_node("Properties").set_portal2_properties( \ 37 | $"TabContainer/Portal 2/ExePath/LineEdit".text, \ 38 | $"TabContainer/Portal 2/GameDir/LineEdit".text, \ 39 | $"TabContainer/Portal 2/VBSP/LineEdit".text, \ 40 | $"TabContainer/Portal 2/BSPZIP/LineEdit".text, \ 41 | $"TabContainer/Portal 2/VVIS/LineEdit".text, \ 42 | $"TabContainer/Portal 2/VRAD/LineEdit".text, \ 43 | $"TabContainer/Portal 2/GameInfo/LineEdit".text, \ 44 | $"TabContainer/Portal 2/RunGame/CenterContainer/CheckButton".pressed) 45 | get_parent().get_node("Properties").save() 46 | 47 | func _on_SaveVMF_pressed() -> void: 48 | var filenam: String = $"TabContainer/Portal 2/GameInfo/LineEdit".text + "/" + get_parent().get_parent().get_parent().get_node("Menu/Control/TopBar/CenterMenu/LevelName").text + ".vmf" 49 | get_parent().get_parent().get_parent().get_node("Scene/Room").export_to_vmf(filenam) 50 | $"TabContainer/Portal 2/TextEdit".text += "\nAttempted to save to " + filenam 51 | 52 | func _on_BuildRun_pressed() -> void: 53 | $"TabContainer/Portal 2/TextEdit".text = "" 54 | _on_SaveVMF_pressed() 55 | $"TabContainer/Portal 2/TextEdit".text += "\n\n" 56 | var filenam: String = $"TabContainer/Portal 2/GameInfo/LineEdit".text + "/" + get_parent().get_parent().get_parent().get_node("Menu/Control/TopBar/CenterMenu/LevelName").text + ".vmf" 57 | var filenam_bsp: String = $"TabContainer/Portal 2/GameInfo/LineEdit".text + "/" + get_parent().get_parent().get_parent().get_node("Menu/Control/TopBar/CenterMenu/LevelName").text + ".bsp" 58 | var levelname: String = get_parent().get_parent().get_parent().get_node("Menu/Control/TopBar/CenterMenu/LevelName").text 59 | 60 | for texture in TEXTURES: 61 | var save_to_cache: File = File.new() 62 | var texture_to_load: File = File.new() 63 | var mat_dir = Directory.new() 64 | mat_dir.open($"TabContainer/Portal 2/GameDir/LineEdit".text) 65 | if !mat_dir.dir_exists("materials"): 66 | mat_dir.make_dir("materials") 67 | mat_dir.open($"TabContainer/Portal 2/GameDir/LineEdit".text + "/materials") 68 | if !mat_dir.dir_exists("gpz"): 69 | mat_dir.make_dir("gpz") 70 | # warning-ignore:return_value_discarded 71 | texture_to_load.open(texture["file"], File.READ) 72 | # warning-ignore:return_value_discarded 73 | save_to_cache.open($"TabContainer/Portal 2/GameDir/LineEdit".text + "/" + texture["name"], File.WRITE) 74 | save_to_cache.store_buffer(texture_to_load.get_buffer(texture_to_load.get_len())) 75 | save_to_cache.close() 76 | 77 | var output = [] 78 | # warning-ignore:return_value_discarded 79 | OS.execute($"TabContainer/Portal 2/VBSP/LineEdit".text, ["-game", $"TabContainer/Portal 2/GameDir/LineEdit".text, filenam], true, output, true) 80 | $"TabContainer/Portal 2/TextEdit".text += output[0] 81 | 82 | for texture in TEXTURES: 83 | output = [] 84 | # warning-ignore:return_value_discarded 85 | OS.execute($"TabContainer/Portal 2/BSPZIP/LineEdit".text, ["-addfile", filenam_bsp, "materials/gpz/" + texture["short"], OS.get_user_data_dir().replace("\\", "/") + "/.cache/" + texture["short"], filenam_bsp, "-game", $"TabContainer/Portal 2/GameDir/LineEdit".text], true, output, true) 86 | $"TabContainer/Portal 2/TextEdit".text += output[0] 87 | 88 | output = [] 89 | # warning-ignore:return_value_discarded 90 | OS.execute($"TabContainer/Portal 2/VVIS/LineEdit".text, ["-game", $"TabContainer/Portal 2/GameDir/LineEdit".text, filenam], true, output, true) 91 | $"TabContainer/Portal 2/TextEdit".text += output[0] 92 | 93 | output = [] 94 | # warning-ignore:return_value_discarded 95 | OS.execute($"TabContainer/Portal 2/VRAD/LineEdit".text, ["-both", "-final", "-textureshadows", "-StaticPropLighting", "-StaticPropPolys", "-game", $"TabContainer/Portal 2/GameDir/LineEdit".text, filenam], true, output, true) 96 | $"TabContainer/Portal 2/TextEdit".text += output[0] 97 | 98 | if $"TabContainer/Portal 2/RunGame/CenterContainer/CheckButton".pressed: 99 | # warning-ignore:return_value_discarded 100 | OS.execute($"TabContainer/Portal 2/ExePath/LineEdit".text, ["-dev", "-game", $"TabContainer/Portal 2/GameDir/LineEdit".text, "+map", levelname + ".bsp", "+sv_lan", "1"], false) 101 | 102 | func _on_TabContainer_tab_changed(tab: int) -> void: 103 | match tab: 104 | 0: 105 | $Panel/HBoxContainer/BuildRun.hide() 106 | $Panel/HBoxContainer/SaveVMF.hide() 107 | 1: 108 | if OS.get_name() == "Windows": 109 | $Panel/HBoxContainer/BuildRun.show() 110 | $Panel/HBoxContainer/SaveVMF.show() 111 | -------------------------------------------------------------------------------- /scripts/menu/Feedback.gd: -------------------------------------------------------------------------------- 1 | extends MenuButton 2 | 3 | 4 | var popup: PopupMenu 5 | 6 | 7 | func _ready() -> void: 8 | popup = get_popup() 9 | popup.add_item("Report an issue") 10 | popup.add_item("Request a feature") 11 | 12 | # warning-ignore:return_value_discarded 13 | popup.connect("id_pressed", self, "_on_item_pressed") 14 | 15 | 16 | func _on_item_pressed(id : int) -> void: 17 | match id: 18 | 0: 19 | # warning-ignore:return_value_discarded 20 | OS.shell_open("https://github.com/craftablescience/GodotPuzzlemaker/issues/new?assignees=craftablescience&labels=bug&template=bug-report.md&title=%5BBUG%5D+Name+of+issue+here") 21 | 1: 22 | # warning-ignore:return_value_discarded 23 | OS.shell_open("https://github.com/craftablescience/GodotPuzzlemaker/issues/new?assignees=craftablescience&labels=enhancement&template=feature-request.md&title=%5BFEATURE%5D+Name+of+feature+idea+here") 24 | _: 25 | assert(false, "Feedback says how?") 26 | -------------------------------------------------------------------------------- /scripts/menu/File.gd: -------------------------------------------------------------------------------- 1 | extends MenuButton 2 | 3 | 4 | var popup: PopupMenu 5 | var levelName: LineEdit 6 | 7 | signal save_level 8 | 9 | 10 | func _ready() -> void: 11 | var new_shortcut = ShortCut.new() 12 | new_shortcut.set_shortcut(InputMap.get_action_list("ui_new_level")[0]) 13 | var open_shortcut = ShortCut.new() 14 | open_shortcut.set_shortcut(InputMap.get_action_list("ui_open_level")[0]) 15 | var save_shortcut = ShortCut.new() 16 | save_shortcut.set_shortcut(InputMap.get_action_list("ui_save_level")[0]) 17 | var export_shortcut = ShortCut.new() 18 | export_shortcut.set_shortcut(InputMap.get_action_list("ui_export")[0]) 19 | var exit_shortcut = ShortCut.new() 20 | exit_shortcut.set_shortcut(InputMap.get_action_list("ui_exit")[0]) 21 | 22 | self.popup = get_popup() 23 | self.popup.add_item("New") 24 | self.popup.set_item_shortcut(0, new_shortcut) 25 | self.popup.add_item("Open...") 26 | self.popup.set_item_shortcut(1, open_shortcut) 27 | self.popup.add_item("Save") 28 | self.popup.set_item_shortcut(2, save_shortcut) 29 | self.popup.add_item("Export...") 30 | self.popup.set_item_shortcut(3, export_shortcut) 31 | if (OS.get_name() != "HTML5"): 32 | self.popup.add_item("Exit") 33 | self.popup.set_item_shortcut(4, exit_shortcut) 34 | # warning-ignore:return_value_discarded 35 | self.popup.connect("id_pressed", self, "_on_item_pressed") 36 | 37 | self.levelName = get_parent().get_parent().get_parent().get_node("TopBar/CenterMenu/LevelName") 38 | 39 | # warning-ignore:return_value_discarded 40 | self.connect("save_level", get_parent().get_parent().get_parent().get_parent().get_parent().get_node("Scene/Room"), "save") 41 | 42 | func _on_item_pressed(id : int) -> void: 43 | match id: 44 | 0: 45 | if self.levelName.text != "": 46 | self.emit_signal("save_level", self.levelName.text) 47 | get_parent().get_parent().get_parent().get_node("ConfirmNewLevel").popup_centered() 48 | 1: 49 | get_parent().get_parent().get_parent().get_node("FileSelect").popup() 50 | 2: 51 | if self.levelName.text != "": 52 | self.emit_signal("save_level", self.levelName.text) 53 | else: 54 | get_parent().get_parent().get_parent().get_node("MissingLevelNameDialog").popup_centered() 55 | 3: 56 | get_parent().get_parent().get_parent().get_node("ExportDialog").popup_centered() 57 | 4: 58 | if self.levelName.text != "": 59 | self.emit_signal("save_level", self.levelName.text) 60 | get_parent().get_parent().get_parent().get_node("QuitRequest").popup_centered() 61 | _: 62 | assert(false, "File says how?") 63 | -------------------------------------------------------------------------------- /scripts/menu/FileSelect.gd: -------------------------------------------------------------------------------- 1 | extends FileDialog 2 | 3 | 4 | signal load_save 5 | 6 | 7 | func _ready() -> void: 8 | # warning-ignore:return_value_discarded 9 | self.connect("load_save", get_parent().get_parent().get_parent().get_node("Scene/Room"), "load_save") 10 | 11 | func _on_file_selected(path: String) -> void: 12 | self.emit_signal("load_save", path) 13 | 14 | func _on_about_to_show(): 15 | self.invalidate() 16 | -------------------------------------------------------------------------------- /scripts/menu/LevelName.gd: -------------------------------------------------------------------------------- 1 | extends LineEdit 2 | 3 | 4 | func _ready(): 5 | # warning-ignore:return_value_discarded 6 | self.connect("focus_entered", self, "_on_focus") 7 | 8 | func _on_focus(): 9 | if OS.get_name() == "HTML5" and get_parent().get_node("Mobile").visible and get_parent().get_node("Mobile").pressed: 10 | self.text = JavaScript.eval("prompt('%s', '%s');" % ["Please enter text:", text], true) 11 | self.release_focus() 12 | 13 | func _on_text_changed(_text: String) -> void: 14 | pass 15 | -------------------------------------------------------------------------------- /scripts/menu/LightingButton.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | 4 | func _on_toggled(button_pressed: bool) -> void: 5 | if button_pressed: 6 | get_parent().get_node("LightPanel")._on_grow() 7 | else: 8 | get_parent().get_node("LightPanel")._on_shrink() 9 | -------------------------------------------------------------------------------- /scripts/menu/QuitRequest.gd: -------------------------------------------------------------------------------- 1 | extends ConfirmationDialog 2 | 3 | 4 | func _on_confirmed(): 5 | for file in Globals.LIST_FILES_IN_DIR("user://.cache/"): 6 | var d: Directory = Directory.new() 7 | # warning-ignore:return_value_discarded 8 | d.remove("user://.cache/" + file) 9 | get_tree().quit(0) 10 | -------------------------------------------------------------------------------- /scripts/menu/TextureFileSelect.gd: -------------------------------------------------------------------------------- 1 | extends FileDialog 2 | 3 | 4 | func _on_about_to_show() -> void: 5 | self.invalidate() 6 | 7 | func _on_file_selected(path: String) -> void: 8 | if path.ends_with("zip"): 9 | PackLoader.load_resource_pack(path) 10 | return 11 | var image = Image.new() 12 | var err = image.load(path) 13 | if err != OK: 14 | get_parent().get_node("TextureError").popup_centered() 15 | else: 16 | var copy: File = File.new() 17 | var original: File = File.new() 18 | # warning-ignore:return_value_discarded 19 | copy.open("user://.cache/" + path.split("/")[-1], copy.WRITE) 20 | # warning-ignore:return_value_discarded 21 | original.open(path, original.READ) 22 | copy.store_buffer(original.get_buffer(original.get_len())) 23 | copy.close() 24 | original.close() 25 | #image.resize(64, 64, Image.INTERPOLATE_LANCZOS) 26 | var texture = ImageTexture.new() 27 | texture.create_from_image(image, 1) 28 | var ID: String = path.split("/")[-1] 29 | get_parent().get_node("ContextPanel/TabContainer/Textures/Tree").add_item(Globals.CUSTOMID, ID, ID, texture) 30 | -------------------------------------------------------------------------------- /scripts/menu/TextureList.gd: -------------------------------------------------------------------------------- 1 | extends Tree 2 | 3 | 4 | var TEXTURES: Dictionary 5 | var root: TreeItem 6 | var children: Dictionary 7 | 8 | signal RemoveTexture(id) 9 | 10 | 11 | func _ready() -> void: 12 | self.root = self.create_item() 13 | self.set_hide_root(true) 14 | self.TEXTURES = {} 15 | self.children = {} 16 | self.add_category("Default", "default") 17 | # warning-ignore:return_value_discarded 18 | self.add_item("default", "White", "white", preload("res://images/editor/textures/white.png"), "gpz/default_white") 19 | self._on_search_text_changed("") 20 | 21 | func add_category(catName: String, ID: String) -> void: 22 | self.children[ID] = {"parent": self.create_item(root), "children": {}} 23 | self.children[ID]["parent"].set_text(0, catName) 24 | self.children[ID]["parent"].set_metadata(0, "__category__") 25 | 26 | func add_item(category: String, itemName: String, itemID: String, texture: Texture, portal2path = null) -> bool: 27 | if !(category in self.children.keys()): 28 | return false; 29 | if portal2path == null: 30 | self.TEXTURES[category + ":" + itemID] = {"texture": texture} 31 | else: 32 | self.TEXTURES[category + ":" + itemID] = {"texture": texture, "portal2path": portal2path} 33 | self.children[category]["children"][itemID] = { 34 | "item": self.create_item(self.children[category]["parent"]), 35 | "name": itemName, 36 | "node": texture 37 | } 38 | self.children[category]["children"][itemID]["item"].set_text(0, itemName) 39 | self.children[category]["children"][itemID]["item"].set_icon(0, self.TEXTURES[category + ":" + itemID]["texture"]) 40 | self.children[category]["children"][itemID]["item"].set_icon_max_width(0, Globals.TEXTURE_PREVIEW_WIDTH) 41 | self.children[category]["children"][itemID]["item"].set_metadata(0, category + ":" + itemID) 42 | return true; 43 | 44 | func get_selected_texture() -> String: 45 | if self.get_selected() != null and self.get_selected().get_metadata(0) != "__category__": 46 | return self.get_selected().get_metadata(0) 47 | else: 48 | return "" 49 | 50 | func get_texture(texName: String) -> Texture: 51 | return self.TEXTURES[texName]["texture"] 52 | 53 | func _on_texture_button_pressed() -> void: 54 | for node in get_parent().get_parent().get_children(): 55 | node.hide() 56 | get_parent().show() 57 | 58 | func _on_Tree_cell_selected() -> void: 59 | self.release_focus() 60 | 61 | func _on_search_text_changed(new_text: String) -> void: 62 | for category in self.children.keys(): 63 | for itemID in self.children[category]["children"].keys(): 64 | if self.children[category]["children"][itemID]["item"] != null: 65 | self.children[category]["children"][itemID]["item"].free() 66 | if new_text == "": 67 | for category in self.children.keys(): 68 | for itemID in self.children[category]["children"].keys(): 69 | self.children[category]["children"][itemID]["item"] = self.create_item(self.children[category]["parent"]) 70 | self.children[category]["children"][itemID]["item"].set_text(0, self.children[category]["children"][itemID]["name"]) 71 | self.children[category]["children"][itemID]["item"].set_icon(0, self.TEXTURES[category + ":" + itemID]["texture"]) 72 | self.children[category]["children"][itemID]["item"].set_icon_max_width(0, Globals.TEXTURE_PREVIEW_WIDTH) 73 | self.children[category]["children"][itemID]["item"].set_metadata(0, category + ":" + itemID) 74 | else: 75 | for category in self.children.keys(): 76 | for itemID in self.children[category]["children"].keys(): 77 | if new_text.to_lower() in self.children[category]["children"][itemID]["name"].to_lower(): 78 | self.children[category]["children"][itemID]["item"] = self.create_item(self.children[category]["parent"]) 79 | self.children[category]["children"][itemID]["item"].set_text(0, self.children[category]["children"][itemID]["name"]) 80 | self.children[category]["children"][itemID]["item"].set_icon(0, self.TEXTURES[category + ":" + itemID]["texture"]) 81 | self.children[category]["children"][itemID]["item"].set_icon_max_width(0, Globals.TEXTURE_PREVIEW_WIDTH) 82 | self.children[category]["children"][itemID]["item"].set_metadata(0, category + ":" + itemID) 83 | 84 | func _on_Remove_pressed() -> void: 85 | if self.get_selected() != null and self.get_selected().get_metadata(0) != "__category__" and !self.get_selected().get_metadata(0).begins_with("builtin") and !self.get_selected().get_metadata(0).begins_with("default"): 86 | for category in self.children.keys(): 87 | var namae: String = self.get_selected().get_metadata(0) 88 | if namae.split(":")[-1] in self.children[category]["children"]: 89 | self.emit_signal("RemoveTexture", namae) 90 | self.children[category]["children"][namae.split(":")[-1]]["item"].free() 91 | self.children[category]["children"].erase(namae.split(":")[-1]) 92 | self._on_search_text_changed(get_parent().get_parent().get_parent().get_node("HBoxContainer/Search").text) 93 | break 94 | -------------------------------------------------------------------------------- /shaders/crosshair.shader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | void fragment() { 5 | vec4 cs = textureLod(SCREEN_TEXTURE, SCREEN_UV, 0.0).rgba; 6 | vec4 c = textureLod(TEXTURE, UV, 0.0).rgba; 7 | cs.rgb = vec3(1.0) - cs.rgb; 8 | COLOR.rgb = cs.rgb; 9 | COLOR.a = c.a; 10 | COLOR.r += 0.1; 11 | COLOR.g += 0.1; 12 | COLOR.b += 0.1; 13 | } -------------------------------------------------------------------------------- /sounds/background/concentration.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/sounds/background/concentration.ogg -------------------------------------------------------------------------------- /sounds/background/concentration.ogg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="ogg_vorbis" 4 | type="AudioStreamOGGVorbis" 5 | path="res://.import/concentration.ogg-8c8dbad75e1c8155247f5696427cee62.oggstr" 6 | 7 | [deps] 8 | 9 | source_file="res://sounds/background/concentration.ogg" 10 | dest_files=[ "res://.import/concentration.ogg-8c8dbad75e1c8155247f5696427cee62.oggstr" ] 11 | 12 | [params] 13 | 14 | loop=true 15 | loop_offset=0 16 | -------------------------------------------------------------------------------- /sounds/editor/README.md: -------------------------------------------------------------------------------- 1 | Created by Mike Koenig. 2 | http://soundbible.com/772-Button.html -------------------------------------------------------------------------------- /sounds/editor/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/sounds/editor/click.wav -------------------------------------------------------------------------------- /sounds/editor/click.wav.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="wav" 4 | type="AudioStreamSample" 5 | path="res://.import/click.wav-c23ca04832e211ba574a5874af17edc7.sample" 6 | 7 | [deps] 8 | 9 | source_file="res://sounds/editor/click.wav" 10 | dest_files=[ "res://.import/click.wav-c23ca04832e211ba574a5874af17edc7.sample" ] 11 | 12 | [params] 13 | 14 | force/8_bit=false 15 | force/mono=false 16 | force/max_rate=false 17 | force/max_rate_hz=44100 18 | edit/trim=false 19 | edit/normalize=false 20 | edit/loop=false 21 | compress/mode=0 22 | -------------------------------------------------------------------------------- /theme/button/disabled.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/button/disabled.stylebox -------------------------------------------------------------------------------- /theme/button/focus.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/button/focus.stylebox -------------------------------------------------------------------------------- /theme/button/hover.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/button/hover.stylebox -------------------------------------------------------------------------------- /theme/button/normal.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/button/normal.stylebox -------------------------------------------------------------------------------- /theme/button/pressed.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/button/pressed.stylebox -------------------------------------------------------------------------------- /theme/lineedit/disabled.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/lineedit/disabled.stylebox -------------------------------------------------------------------------------- /theme/lineedit/focus.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/lineedit/focus.stylebox -------------------------------------------------------------------------------- /theme/lineedit/normal.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/lineedit/normal.stylebox -------------------------------------------------------------------------------- /theme/main.theme: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main.theme -------------------------------------------------------------------------------- /theme/main/button/disabled.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/button/disabled.stylebox -------------------------------------------------------------------------------- /theme/main/button/focus.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/button/focus.stylebox -------------------------------------------------------------------------------- /theme/main/button/hover.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/button/hover.stylebox -------------------------------------------------------------------------------- /theme/main/button/normal.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/button/normal.stylebox -------------------------------------------------------------------------------- /theme/main/button/pressed.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/button/pressed.stylebox -------------------------------------------------------------------------------- /theme/main/panel/panel.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/panel/panel.stylebox -------------------------------------------------------------------------------- /theme/main/popup_menu/panel.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/main/popup_menu/panel.stylebox -------------------------------------------------------------------------------- /theme/menu.theme: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/menu.theme -------------------------------------------------------------------------------- /theme/popup_menu/hover.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/popup_menu/hover.stylebox -------------------------------------------------------------------------------- /theme/popup_menu/panel.stylebox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craftablescience/GodotPuzzlemaker/c6426dc64a10e6c70bc3db928f5b7c7f40ad36cf/theme/popup_menu/panel.stylebox --------------------------------------------------------------------------------