├── .gitignore ├── LICENSE ├── README.md ├── godot3 ├── BasicDungeon │ ├── 01.Rectangular │ │ ├── Rectangular.gd │ │ └── Rectangular.tscn │ ├── 02.AndOrganic │ │ ├── AndOrganic.gd │ │ └── AndOrganic.tscn │ └── 03.Bonus │ │ ├── Bonus.gd │ │ ├── Bonus.tscn │ │ ├── Generator.gd │ │ ├── Room.gd │ │ ├── RoomOrganic.gd │ │ └── Utils.gd ├── CellularAutomata │ ├── 01.FoliageGenerator │ │ ├── FoliageGenerator.gd │ │ ├── FoliageGenerator.tscn │ │ ├── plants.png │ │ └── plants.png.import │ ├── 02.CavernGenerator │ │ ├── CellularCavernGenerator.gd │ │ ├── CellularCavernGenerator.tscn │ │ ├── UISettings.gd │ │ ├── tiles_basic.png │ │ ├── tiles_basic.png.import │ │ └── tileset_basic.tres │ └── 03.DungeonGenerator │ │ ├── ButtonCameraSwitch.gd │ │ ├── CellularDungeonGenerator.gd │ │ ├── CellularDungeonGenerator.tscn │ │ ├── Miner │ │ ├── Miner.gd │ │ ├── Miner.tscn │ │ ├── drill-blade.png │ │ ├── drill-blade.png.import │ │ ├── drill-top.png │ │ ├── drill-top.png.import │ │ ├── miner.png │ │ └── miner.png.import │ │ ├── Props │ │ ├── Exit.gd │ │ ├── Exit.tscn │ │ ├── Treasure.gd │ │ ├── Treasure.tscn │ │ ├── chest.png │ │ ├── chest.png.import │ │ ├── exit.png │ │ └── exit.png.import │ │ ├── UISettingsAdvanced.gd │ │ ├── tileset_advanced.tres │ │ ├── tileset_mining.png │ │ └── tileset_mining.png.import ├── Common │ ├── assets-prototype.svg │ ├── assets-prototype.svg.import │ └── tileset-prototype.tres ├── MSTDungeon │ ├── MSTDungeon.gd │ ├── MSTDungeon.tscn │ ├── Room.gd │ ├── Room.tscn │ └── Utils.gd ├── ModularWeapons │ ├── ModularWeapon │ │ ├── FiringConfigurations │ │ │ ├── Cone3Configuration.tscn │ │ │ └── Straight1Configuration.tscn │ │ ├── ModularWeaponsSystem.tscn │ │ ├── ProjectileEvents │ │ │ └── ExplosionEvent.tres │ │ ├── ProjectileMotions │ │ │ ├── HomingMotion.tres │ │ │ ├── SineMotion.tres │ │ │ └── StraightMotion.tres │ │ ├── Projectiles │ │ │ ├── BasicEmitter.tscn │ │ │ └── LaserEmitter.tscn │ │ ├── SpawnedObjects.tscn │ │ └── src │ │ │ ├── FiringConfiguration │ │ │ ├── WeaponLocation.gd │ │ │ └── WeaponLocation.tscn │ │ │ ├── ModularWeapon.gd │ │ │ ├── Projectile │ │ │ ├── Basic │ │ │ │ ├── BasicEmitter.gd │ │ │ │ ├── BasicProjectile.gd │ │ │ │ ├── BasicProjectile.tscn │ │ │ │ ├── white_circle.svg │ │ │ │ └── white_circle.svg.import │ │ │ ├── Laser │ │ │ │ ├── CastingParticles.tres │ │ │ │ ├── ImpactParticles.tres │ │ │ │ ├── LaserEmitter.gd │ │ │ │ ├── LaserTracer.gd │ │ │ │ ├── LaserTracer.tscn │ │ │ │ ├── glowing_circle.png │ │ │ │ └── glowing_circle.png.import │ │ │ ├── Projectile.gd │ │ │ └── ProjectileEmitter.gd │ │ │ ├── ProjectileEvents │ │ │ ├── Events │ │ │ │ └── ExplosionEvent │ │ │ │ │ ├── Explosion.gd │ │ │ │ │ ├── Explosion.tscn │ │ │ │ │ ├── ExplosionEvent.gd │ │ │ │ │ ├── explosion_gradient.tres │ │ │ │ │ ├── explosion_gradient_2.tres │ │ │ │ │ ├── puff.png │ │ │ │ │ ├── puff.png.import │ │ │ │ │ ├── puff_smooth.png │ │ │ │ │ ├── puff_smooth.png.import │ │ │ │ │ ├── scraps_gradient.tres │ │ │ │ │ ├── sparkle.png │ │ │ │ │ └── sparkle.png.import │ │ │ └── ProjectileEvent.gd │ │ │ └── ProjectileMotion │ │ │ ├── Motions │ │ │ ├── HomingMotion.gd │ │ │ ├── SineMotion.gd │ │ │ └── StraightMotion.gd │ │ │ └── ProjectileMotion.gd │ ├── ModularWeaponsDemo.tscn │ ├── PlayerShip │ │ ├── PlayerShip.gd │ │ ├── PlayerShip.tscn │ │ ├── topdown-player.svg │ │ └── topdown-player.svg.import │ └── procedural-weapons.md ├── RandomWalker │ ├── Actors │ │ ├── Actor.gd │ │ ├── Enemy.gd │ │ ├── Enemy.tscn │ │ ├── Player.gd │ │ └── Player.tscn │ ├── Camera2D.gd │ ├── Levels │ │ ├── Level.gd │ │ ├── Level.tscn │ │ ├── Test.tscn │ │ ├── background-gradient.svg │ │ ├── background-gradient.svg.import │ │ ├── background-hills.svg │ │ ├── background-hills.svg.import │ │ ├── background-trees.svg │ │ ├── background-trees.svg.import │ │ ├── tiles.svg │ │ ├── tiles.svg.import │ │ └── tileset.tres │ ├── RandomWalker.gd │ ├── RandomWalker.tscn │ ├── Rooms.gd │ └── Rooms.tscn ├── SpaceInfiniteGeneration │ ├── BlueNoiseWorldGenerator.gd │ ├── BlueNoiseWorldGenerator.tscn │ ├── LayeredWorldGenerator.gd │ ├── LayeredWorldGenerator.tscn │ ├── PersistentWorldGenerator.gd │ ├── PersistentWorldGenerator.tscn │ ├── README.md │ ├── Shared │ │ ├── Asteroid.tscn │ │ ├── GridDrawer.gd │ │ ├── GridDrawer.tscn │ │ ├── Player │ │ │ ├── Player.gd │ │ │ ├── Player.tscn │ │ │ ├── topdown-player.svg │ │ │ └── topdown-player.svg.import │ │ ├── WorldGenerator.gd │ │ ├── asteroid-round.svg │ │ └── asteroid-round.svg.import │ ├── WhiteNoiseWorldGenerator.gd │ └── WhiteNoiseWorldGenerator.tscn ├── WorldMap │ ├── RiverGenerator.gd │ ├── Utils.gd │ ├── WorldMap.gd │ ├── WorldMap.tscn │ ├── biomes.shader │ ├── color_map.tres │ ├── discrete-color-map.png │ ├── discrete-color-map.png.import │ ├── heat_map.tres │ ├── height_map.tres │ ├── moisture_map.tres │ └── sobel.shader ├── default_env.tres ├── icon.png ├── icon.png.import └── project.godot ├── godot4 ├── BasicDungeon │ ├── 01.Rectangular │ │ ├── Rectangular.gd │ │ └── Rectangular.tscn │ ├── 02.AndOrganic │ │ ├── AndOrganic.gd │ │ └── AndOrganic.tscn │ └── 03.Bonus │ │ ├── Bonus.gd │ │ ├── Bonus.tscn │ │ ├── Generator.gd │ │ ├── Room.gd │ │ ├── RoomOrganic.gd │ │ └── Utils.gd ├── CellularAutomata │ ├── 01.FoliageGenerator │ │ ├── FoliageGenerator.gd │ │ ├── FoliageGenerator.tres │ │ ├── FoliageGenerator.tscn │ │ ├── plants.png │ │ └── plants.png.import │ ├── 02.CavernGenerator │ │ ├── CellularCavernGenerator.gd │ │ ├── CellularCavernGenerator.tscn │ │ ├── UISettings.gd │ │ ├── tiles_basic.png │ │ ├── tiles_basic.png.import │ │ └── tileset_basic.tres │ └── 03.DungeonGenerator │ │ ├── ButtonCameraSwitch.gd │ │ ├── CellularDungeonGenerator.gd │ │ ├── CellularDungeonGenerator.tscn │ │ ├── Miner │ │ ├── Miner.gd │ │ ├── Miner.tscn │ │ ├── drill-blade.png │ │ ├── drill-blade.png.import │ │ ├── drill-top.png │ │ ├── drill-top.png.import │ │ ├── miner.png │ │ └── miner.png.import │ │ ├── Props │ │ ├── Exit.gd │ │ ├── Exit.tscn │ │ ├── Treasure.gd │ │ ├── Treasure.tscn │ │ ├── chest.png │ │ ├── chest.png.import │ │ ├── exit.png │ │ └── exit.png.import │ │ ├── UISettingsAdvanced.gd │ │ ├── tileset_advanced.tres │ │ ├── tileset_mining.png │ │ └── tileset_mining.png.import ├── Common │ ├── assets-prototype.svg │ ├── assets-prototype.svg.import │ └── tileset-prototype.tres ├── MSTDungeon │ ├── MSTDungeon.gd │ ├── MSTDungeon.tscn │ ├── Room.gd │ ├── Room.tscn │ └── Utils.gd ├── ModularWeapons │ ├── ModularWeapon │ │ ├── FiringConfigurations │ │ │ ├── Cone3Configuration.tscn │ │ │ └── Straight1Configuration.tscn │ │ ├── ModularWeaponsSystem.tscn │ │ ├── ProjectileEvents │ │ │ └── ExplosionEvent.tres │ │ ├── ProjectileMotions │ │ │ ├── HomingMotion.tres │ │ │ ├── SineMotion.tres │ │ │ └── StraightMotion.tres │ │ ├── Projectiles │ │ │ ├── BasicEmitter.tscn │ │ │ └── LaserEmitter.tscn │ │ ├── SpawnedObjects.tscn │ │ └── src │ │ │ ├── FiringConfiguration │ │ │ ├── WeaponLocation.gd │ │ │ └── WeaponLocation.tscn │ │ │ ├── ModularWeapon.gd │ │ │ ├── Projectile │ │ │ ├── Basic │ │ │ │ ├── BasicEmitter.gd │ │ │ │ ├── BasicProjectile.gd │ │ │ │ ├── BasicProjectile.tscn │ │ │ │ ├── white_circle.svg │ │ │ │ └── white_circle.svg.import │ │ │ ├── Laser │ │ │ │ ├── CastingParticles.tres │ │ │ │ ├── ImpactParticles.tres │ │ │ │ ├── LaserEmitter.gd │ │ │ │ ├── LaserTracer.gd │ │ │ │ ├── LaserTracer.tscn │ │ │ │ ├── glowing_circle.png │ │ │ │ └── glowing_circle.png.import │ │ │ ├── Projectile.gd │ │ │ └── ProjectileEmitter.gd │ │ │ ├── ProjectileEvents │ │ │ ├── Events │ │ │ │ └── ExplosionEvent │ │ │ │ │ ├── Explosion.gd │ │ │ │ │ ├── Explosion.tscn │ │ │ │ │ ├── ExplosionEvent.gd │ │ │ │ │ ├── explosion_gradient.tres │ │ │ │ │ ├── explosion_gradient_2.tres │ │ │ │ │ ├── puff.png │ │ │ │ │ ├── puff.png.import │ │ │ │ │ ├── puff_smooth.png │ │ │ │ │ ├── puff_smooth.png.import │ │ │ │ │ ├── scraps_gradient.tres │ │ │ │ │ ├── sparkle.png │ │ │ │ │ └── sparkle.png.import │ │ │ └── ProjectileEvent.gd │ │ │ └── ProjectileMotion │ │ │ ├── Motions │ │ │ ├── HomingMotion.gd │ │ │ ├── SineMotion.gd │ │ │ └── StraightMotion.gd │ │ │ └── ProjectileMotion.gd │ ├── ModularWeaponsDemo.tscn │ ├── PlayerShip │ │ ├── PlayerShip.gd │ │ ├── PlayerShip.tscn │ │ ├── topdown-player.svg │ │ └── topdown-player.svg.import │ └── procedural-weapons.md ├── RandomWalker │ ├── Actors │ │ ├── Actor.gd │ │ ├── Enemy.gd │ │ ├── Enemy.tscn │ │ ├── Player.gd │ │ └── Player.tscn │ ├── Camera2D.gd │ ├── Levels │ │ ├── Level.gd │ │ ├── Level.tscn │ │ ├── Test.tscn │ │ ├── background-gradient.svg │ │ ├── background-gradient.svg.import │ │ ├── background-hills.svg │ │ ├── background-hills.svg.import │ │ ├── background-trees.svg │ │ ├── background-trees.svg.import │ │ ├── tiles.svg │ │ ├── tiles.svg.import │ │ └── tileset.tres │ ├── RandomWalker.gd │ ├── RandomWalker.tscn │ ├── Rooms.gd │ └── Rooms.tscn ├── SpaceInfiniteGeneration │ ├── BlueNoiseWorldGenerator.gd │ ├── BlueNoiseWorldGenerator.tscn │ ├── LayeredWorldGenerator.gd │ ├── LayeredWorldGenerator.tscn │ ├── PersistentWorldGenerator.gd │ ├── PersistentWorldGenerator.tscn │ ├── README.md │ ├── Shared │ │ ├── Asteroid.tscn │ │ ├── GridDrawer.gd │ │ ├── GridDrawer.tscn │ │ ├── Player │ │ │ ├── Player.gd │ │ │ ├── Player.tscn │ │ │ ├── topdown-player.svg │ │ │ └── topdown-player.svg.import │ │ ├── WorldGenerator.gd │ │ ├── asteroid-round.svg │ │ └── asteroid-round.svg.import │ ├── WhiteNoiseWorldGenerator.gd │ └── WhiteNoiseWorldGenerator.tscn ├── WorldMap │ ├── RiverGenerator.gd │ ├── Utils.gd │ ├── WorldMap.gd │ ├── WorldMap.tscn │ ├── biomes.gdshader │ ├── color_map.tres │ ├── discrete-color-map.png │ ├── discrete-color-map.png.import │ ├── heat_map.tres │ ├── height_map.tres │ ├── moisture_map.tres │ └── sobel.gdshader ├── default_env.tres ├── icon.png ├── icon.png.import └── project.godot ├── images ├── infinite-world-blue-noise.png ├── infinite-world-layered.png ├── pcg-secrets.png ├── random-walker-1.png ├── random-walker-2.png └── world-map.png └── start-project ├── CellularAutomata ├── 01.FoliageGenerator │ ├── FoliageGenerator.gd │ ├── FoliageGenerator.tscn │ ├── plants.png │ └── plants.png.import ├── 02.CavernGenerator │ ├── CellularCavernGenerator.gd │ ├── CellularCavernGenerator.tscn │ ├── UISettings.gd │ ├── tiles_basic.png │ ├── tiles_basic.png.import │ └── tileset_basic.tres └── 03.DungeonGenerator │ ├── ButtonCameraSwitch.gd │ ├── CellularDungeonGenerator.gd │ ├── CellularDungeonGenerator.tscn │ ├── Miner │ ├── Miner.gd │ ├── Miner.tscn │ ├── drill-blade.png │ ├── drill-blade.png.import │ ├── drill-top.png │ ├── drill-top.png.import │ ├── miner.png │ └── miner.png.import │ ├── Props │ ├── Exit.gd │ ├── Exit.tscn │ ├── Treasure.gd │ ├── Treasure.tscn │ ├── chest.png │ ├── chest.png.import │ ├── exit.png │ └── exit.png.import │ ├── UISettingsAdvanced.gd │ ├── tileset_mining.png │ └── tileset_mining.png.import ├── Common ├── assets-prototype.svg ├── assets-prototype.svg.import └── tileset-prototype.tres ├── ModularWeapons ├── ModularWeapons │ └── SpawnedObjects.tscn ├── ModularWeaponsDemo.tscn └── PlayerShip │ ├── PlayerShip.gd │ ├── PlayerShip.tscn │ ├── topdown-player.svg │ └── topdown-player.svg.import ├── README.md ├── RandomWalker └── Levels │ ├── background-gradient.svg │ ├── background-gradient.svg.import │ ├── background-hills.svg │ ├── background-hills.svg.import │ ├── background-trees.svg │ ├── background-trees.svg.import │ ├── tiles.svg │ ├── tiles.svg.import │ └── tileset.tres ├── SpaceInfiniteGeneration └── Shared │ ├── Asteroid.tscn │ ├── GridDrawer.gd │ ├── GridDrawer.tscn │ ├── Player │ ├── Player.gd │ ├── Player.tscn │ ├── topdown-player.svg │ └── topdown-player.svg.import │ ├── asteroid-round.svg │ └── asteroid-round.svg.import ├── WorldMap ├── discrete-color-map.png └── discrete-color-map.png.import ├── default_env.tres ├── icon.png ├── icon.png.import └── project.godot /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Godot 4+ specific ignores 3 | .godot/ 4 | 5 | 6 | # Godot-specific ignores 7 | .import/ 8 | export.cfg 9 | export_presets.cfg 10 | 11 | # Mono-specific ignores 12 | .mono/ 13 | data_*/ 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This project is dual-licensed: 2 | 3 | - The source code is available under the MIT license. 4 | - Art assets (images, audio files) are [CC-By 4.0](https://creativecommons.org/licenses/by/4.0/). You can attribute them to `GDQuest and contributors (https://www.gdquest.com/)`. 5 | 6 | 7 | MIT License 8 | 9 | Copyright (c) 2020 GDQuest 10 | 11 | Permission is hereby granted, free of charge, to any person obtaining a copy 12 | of this software and associated documentation files (the "Software"), to deal 13 | in the Software without restriction, including without limitation the rights 14 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | copies of the Software, and to permit persons to whom the Software is 16 | furnished to do so, subject to the following conditions: 17 | 18 | The above copyright notice and this permission notice shall be included in all 19 | copies or substantial portions of the Software. 20 | 21 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 27 | SOFTWARE. 28 | 29 | 30 | Creative Commons Attribution 4.0 International Public License 31 | 32 | Read the full license on: https://creativecommons.org/licenses/by/4.0/legalcode 33 | -------------------------------------------------------------------------------- /godot3/BasicDungeon/01.Rectangular/Rectangular.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://BasicDungeon/01.Rectangular/Rectangular.gd" type="Script" id=1] 4 | [ext_resource path="res://Common/tileset-prototype.tres" type="TileSet" id=2] 5 | 6 | [node name="BasicDungeonRectangular" type="Node2D"] 7 | script = ExtResource( 1 ) 8 | 9 | [node name="Level" type="TileMap" parent="."] 10 | tile_set = ExtResource( 2 ) 11 | cell_size = Vector2( 60, 60 ) 12 | format = 1 13 | 14 | [node name="Camera2D" type="Camera2D" parent="."] 15 | current = true 16 | -------------------------------------------------------------------------------- /godot3/BasicDungeon/02.AndOrganic/AndOrganic.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://Common/tileset-prototype.tres" type="TileSet" id=1] 4 | [ext_resource path="res://BasicDungeon/02.AndOrganic/AndOrganic.gd" type="Script" id=2] 5 | 6 | [node name="BasicDungeonAndOrganic" type="Node2D"] 7 | script = ExtResource( 2 ) 8 | 9 | [node name="Level" type="TileMap" parent="."] 10 | tile_set = ExtResource( 1 ) 11 | cell_size = Vector2( 60, 60 ) 12 | format = 1 13 | 14 | [node name="Camera2D" type="Camera2D" parent="."] 15 | current = true 16 | -------------------------------------------------------------------------------- /godot3/BasicDungeon/03.Bonus/Bonus.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | export var level_size := Vector2(100, 80) 5 | export var rooms_size := Vector2(10, 14) 6 | export var rooms_max := 15 7 | 8 | onready var level: TileMap = $Level 9 | onready var camera: Camera2D = $Camera2D 10 | 11 | 12 | func _ready() -> void: 13 | _setup_camera() 14 | _generate() 15 | 16 | 17 | func _unhandled_input(event: InputEvent): 18 | if event.is_action_pressed("ui_select"): 19 | _generate() 20 | 21 | 22 | func _setup_camera() -> void: 23 | camera.position = level.map_to_world(level_size / 2) 24 | var z := max(level_size.x, level_size.y) / 8 25 | camera.zoom = Vector2(z, z) 26 | 27 | 28 | func _generate() -> void: 29 | level.clear() 30 | for vector in BasicDungeonGenerator.generate(level_size, rooms_size, rooms_max): 31 | level.set_cellv(vector, 0) 32 | -------------------------------------------------------------------------------- /godot3/BasicDungeon/03.Bonus/Bonus.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://Common/tileset-prototype.tres" type="TileSet" id=1] 4 | [ext_resource path="res://BasicDungeon/03.Bonus/Bonus.gd" type="Script" id=2] 5 | 6 | [node name="BasicDungeonBonus" type="Node2D"] 7 | script = ExtResource( 2 ) 8 | 9 | [node name="Level" type="TileMap" parent="."] 10 | tile_set = ExtResource( 1 ) 11 | cell_size = Vector2( 60, 60 ) 12 | format = 1 13 | 14 | [node name="Camera2D" type="Camera2D" parent="."] 15 | current = true 16 | -------------------------------------------------------------------------------- /godot3/BasicDungeon/03.Bonus/Room.gd: -------------------------------------------------------------------------------- 1 | class_name BasicDungeonRoom 2 | 3 | 4 | var position := Vector2.ZERO setget _no_op, get_position 5 | var end := Vector2.ZERO setget _no_op, get_end 6 | var center := Vector2.ZERO setget _no_op, get_center 7 | var rect: Rect2 8 | 9 | var _rect_area: float 10 | var _iter_index: int 11 | 12 | 13 | func _init(rect: Rect2) -> void: 14 | update(rect) 15 | 16 | 17 | func _iter_init(_arg) -> bool: 18 | _iter_index = 0 19 | return _iter_is_running() 20 | 21 | 22 | func _iter_next(_arg) -> bool: 23 | _iter_index += 1 24 | return _iter_is_running() 25 | 26 | 27 | func _iter_get(_arg) -> Vector2: 28 | var offset := BasicDungeonUtils.index_to_xy(rect.size.x, _iter_index) 29 | return rect.position + offset 30 | 31 | 32 | func update(rect: Rect2) -> void: 33 | self.rect = rect.abs() 34 | _rect_area = rect.get_area() 35 | 36 | 37 | func intersects(room: BasicDungeonRoom) -> bool: 38 | return rect.intersects(room.rect) 39 | 40 | 41 | func get_position() -> Vector2: 42 | return rect.position 43 | 44 | 45 | func get_end() -> Vector2: 46 | return rect.end 47 | 48 | 49 | func get_center() -> Vector2: 50 | return 0.5 * (rect.position + rect.end) 51 | 52 | 53 | func _iter_is_running() -> bool: 54 | return _iter_index < _rect_area 55 | 56 | 57 | func _no_op(val) -> void: 58 | pass 59 | -------------------------------------------------------------------------------- /godot3/BasicDungeon/03.Bonus/Utils.gd: -------------------------------------------------------------------------------- 1 | class_name BasicDungeonUtils 2 | 3 | 4 | static func lessv_x(v1: Vector2, v2: Vector2) -> bool: 5 | return v1.x < v2.x 6 | 7 | 8 | static func lessv_y(v1: Vector2, v2: Vector2) -> bool: 9 | return v1.y < v2.y 10 | 11 | 12 | static func index_to_xy(width: int, index: int) -> Vector2: 13 | return Vector2(index % width, index / width) 14 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/01.FoliageGenerator/plants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/01.FoliageGenerator/plants.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/01.FoliageGenerator/plants.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/plants.png-3c35404687f314420a8a6a57a0bc89f1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/01.FoliageGenerator/plants.png" 13 | dest_files=[ "res://.import/plants.png-3c35404687f314420a8a6a57a0bc89f1.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/02.CavernGenerator/UISettings.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | signal step_time_changed(time) 4 | signal wall_chance_changed(value) 5 | signal wall_conversion_changed(value) 6 | signal floor_conversion_changed(value) 7 | signal step_count_changed(value) 8 | signal maximum_treasure_changed(value) 9 | signal min_cavern_area_changed(value) 10 | signal min_exit_distance_changed(value) 11 | 12 | onready var button_generate := $ButtonGenerate 13 | onready var step_time_value := $StepSpeed/Value 14 | onready var wall_chance_value := $WallChance/Value 15 | onready var wall_conversion_value := $WallConversion/Value 16 | onready var floor_conversion_value := $FloorConversion/Value 17 | onready var step_count_value := $StepCount/Value 18 | 19 | 20 | func _on_SliderStepSpeed_value_changed(value: float) -> void: 21 | step_time_value.text = "%s" % [value] 22 | emit_signal("step_time_changed", value) 23 | 24 | 25 | func _on_SliderWallChance_value_changed(value) -> void: 26 | wall_chance_value.text = "%s" % [value] 27 | emit_signal("wall_chance_changed", value) 28 | 29 | 30 | func _on_SliderWallConversion_value_changed(value: int) -> void: 31 | wall_conversion_value.text = "< %s" % [value] 32 | emit_signal("wall_conversion_changed", value) 33 | 34 | 35 | func _on_SliderFloorConversion_value_changed(value: int) -> void: 36 | floor_conversion_value.text = "> %s" % [value] 37 | emit_signal("floor_conversion_changed", value) 38 | 39 | 40 | func _on_SliderStepCount_value_changed(value) -> void: 41 | step_count_value.text = "%s" % [value] 42 | emit_signal("step_count_changed", value) 43 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/02.CavernGenerator/tiles_basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/02.CavernGenerator/tiles_basic.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/02.CavernGenerator/tiles_basic.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tiles_basic.png-c37d53ddad9ea99b63fdb526d9c92d4f.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/02.CavernGenerator/tiles_basic.png" 13 | dest_files=[ "res://.import/tiles_basic.png-c37d53ddad9ea99b63fdb526d9c92d4f.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/02.CavernGenerator/tileset_basic.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://CellularAutomata/02.CavernGenerator/tiles_basic.png" type="Texture" id=1] 4 | 5 | [resource] 6 | 0/name = "wall" 7 | 0/texture = ExtResource( 1 ) 8 | 0/tex_offset = Vector2( 0, 0 ) 9 | 0/modulate = Color( 1, 1, 1, 1 ) 10 | 0/region = Rect2( 64, 0, 64, 64 ) 11 | 0/tile_mode = 0 12 | 0/occluder_offset = Vector2( 0, 0 ) 13 | 0/navigation_offset = Vector2( 0, 0 ) 14 | 0/shape_offset = Vector2( 0, 0 ) 15 | 0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 16 | 0/shape_one_way = false 17 | 0/shape_one_way_margin = 0.0 18 | 0/shapes = [ ] 19 | 0/z_index = 0 20 | 1/name = "floor" 21 | 1/texture = ExtResource( 1 ) 22 | 1/tex_offset = Vector2( 0, 0 ) 23 | 1/modulate = Color( 1, 1, 1, 1 ) 24 | 1/region = Rect2( 0, 0, 64, 64 ) 25 | 1/tile_mode = 0 26 | 1/occluder_offset = Vector2( 0, 0 ) 27 | 1/navigation_offset = Vector2( 0, 0 ) 28 | 1/shape_offset = Vector2( 0, 0 ) 29 | 1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 30 | 1/shape_one_way = false 31 | 1/shape_one_way_margin = 0.0 32 | 1/shapes = [ ] 33 | 1/z_index = 0 34 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/ButtonCameraSwitch.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | export (NodePath) var camera_one_path 4 | export (NodePath) var camera_two_path 5 | 6 | onready var _camera_one: Camera2D = get_node(camera_one_path) 7 | onready var _camera_two: Camera2D = get_node(camera_two_path) 8 | 9 | 10 | func _on_pressed(): 11 | if _camera_one.current: 12 | _camera_two.current = true 13 | else: 14 | _camera_one.current = true 15 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/Miner.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | signal drill_used(dig_positions) 4 | 5 | export var speed := 500 6 | 7 | const DRILL_RANGE := 100 8 | 9 | onready var _pivot := $Pivot 10 | 11 | 12 | func _unhandled_input(event: InputEvent) -> void: 13 | if event.is_action_pressed("ui_accept"): 14 | var dig_positions := [] 15 | var angles_of_attack := [0, PI/6, -PI/6] 16 | 17 | for angle in angles_of_attack: 18 | dig_positions.append(global_position + Vector2.RIGHT.rotated(_pivot.rotation + angle) * DRILL_RANGE) 19 | 20 | emit_signal("drill_used", dig_positions) 21 | 22 | 23 | func _physics_process(_delta: float) -> void: 24 | var direction := Vector2(Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left"), Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")).normalized() 25 | 26 | _pivot.look_at(global_position + direction) 27 | 28 | var velocity := direction * speed 29 | move_and_slide(velocity) 30 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/drill-blade.png-de8a6cf1ae08c7269581da2473f9d019.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png" 13 | dest_files=[ "res://.import/drill-blade.png-de8a6cf1ae08c7269581da2473f9d019.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/drill-top.png-c73f71dd0dc6e52c50e2b8dd19ae575a.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/drill-top.png" 13 | dest_files=[ "res://.import/drill-top.png-c73f71dd0dc6e52c50e2b8dd19ae575a.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/miner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/03.DungeonGenerator/Miner/miner.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Miner/miner.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/miner.png-6e8a50cec6c2a0656a1bfcf286916308.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/miner.png" 13 | dest_files=[ "res://.import/miner.png-6e8a50cec6c2a0656a1bfcf286916308.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/Exit.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | signal miner_entered 4 | 5 | 6 | func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape): 7 | emit_signal("miner_entered") 8 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/Exit.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/exit.png" type="Texture" id=1] 4 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/Exit.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 32, 32 ) 8 | 9 | [node name="Exit" type="Area2D"] 10 | monitoring = false 11 | monitorable = false 12 | collision_layer = 0 13 | script = ExtResource( 2 ) 14 | 15 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 16 | shape = SubResource( 1 ) 17 | 18 | [node name="Sprite" type="Sprite" parent="."] 19 | texture = ExtResource( 1 ) 20 | 21 | [connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"] 22 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/Treasure.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | signal treasure_collected 4 | 5 | 6 | func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape): 7 | emit_signal("treasure_collected") 8 | queue_free() 9 | 10 | 11 | # If treasure ever overlap, destroy them 12 | func _on_area_entered(area): 13 | queue_free() 14 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/Treasure.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/chest.png" type="Texture" id=1] 4 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/Treasure.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 32, 32 ) 8 | 9 | [node name="Treasure" type="Area2D" groups=[ 10 | "treasure", 11 | ]] 12 | position = Vector2( -118.49, -118.49 ) 13 | collision_layer = 2 14 | collision_mask = 2 15 | script = ExtResource( 2 ) 16 | 17 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 18 | position = Vector2( 32, 32 ) 19 | shape = SubResource( 1 ) 20 | 21 | [node name="Sprite" type="Sprite" parent="."] 22 | position = Vector2( 32, 32 ) 23 | texture = ExtResource( 1 ) 24 | 25 | [connection signal="area_entered" from="." to="." method="_on_area_entered"] 26 | [connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"] 27 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/03.DungeonGenerator/Props/chest.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/chest.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/chest.png-44cfea0735d31b7af6bc109aae4c8048.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Props/chest.png" 13 | dest_files=[ "res://.import/chest.png-44cfea0735d31b7af6bc109aae4c8048.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/03.DungeonGenerator/Props/exit.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/Props/exit.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/exit.png-d1523b2b4a1e725e89824b5c40d6f2f0.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Props/exit.png" 13 | dest_files=[ "res://.import/exit.png-d1523b2b4a1e725e89824b5c40d6f2f0.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/tileset_mining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/CellularAutomata/03.DungeonGenerator/tileset_mining.png -------------------------------------------------------------------------------- /godot3/CellularAutomata/03.DungeonGenerator/tileset_mining.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tileset_mining.png-da97036bb2cde0cfbe008239cc0336dd.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/tileset_mining.png" 13 | dest_files=[ "res://.import/tileset_mining.png-da97036bb2cde0cfbe008239cc0336dd.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/Common/assets-prototype.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/assets-prototype.svg-63ab5b9a554b14addf8bfc1fc8eff619.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://Common/assets-prototype.svg" 13 | dest_files=[ "res://.import/assets-prototype.svg-63ab5b9a554b14addf8bfc1fc8eff619.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/Common/tileset-prototype.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://Common/assets-prototype.svg" type="Texture" id=1] 4 | 5 | [resource] 6 | 0/name = "Block" 7 | 0/texture = ExtResource( 1 ) 8 | 0/tex_offset = Vector2( 0, 0 ) 9 | 0/modulate = Color( 1, 1, 1, 1 ) 10 | 0/region = Rect2( 0, 0, 60, 60 ) 11 | 0/tile_mode = 0 12 | 0/occluder_offset = Vector2( 0, 0 ) 13 | 0/navigation_offset = Vector2( 0, 0 ) 14 | 0/shape_offset = Vector2( 0, 0 ) 15 | 0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 16 | 0/shape_one_way = false 17 | 0/shape_one_way_margin = 0.0 18 | 0/shapes = [ ] 19 | 0/z_index = 0 20 | -------------------------------------------------------------------------------- /godot3/MSTDungeon/MSTDungeon.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://Common/tileset-prototype.tres" type="TileSet" id=1] 4 | [ext_resource path="res://MSTDungeon/MSTDungeon.gd" type="Script" id=2] 5 | 6 | [node name="MSTDungeon" type="Node2D"] 7 | script = ExtResource( 2 ) 8 | 9 | [node name="Camera2D" type="Camera2D" parent="."] 10 | current = true 11 | zoom = Vector2( 8, 8 ) 12 | 13 | [node name="Level" type="TileMap" parent="."] 14 | show_behind_parent = true 15 | tile_set = ExtResource( 1 ) 16 | cell_size = Vector2( 60, 60 ) 17 | format = 1 18 | 19 | [node name="Rooms" type="Node2D" parent="."] 20 | -------------------------------------------------------------------------------- /godot3/MSTDungeon/Room.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://MSTDungeon/Room.gd" type="Script" id=1] 4 | 5 | [sub_resource type="RectangleShape2D" id=1] 6 | resource_local_to_scene = true 7 | 8 | [node name="Room" type="RigidBody2D"] 9 | mode = 2 10 | gravity_scale = 0.0 11 | script = ExtResource( 1 ) 12 | 13 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 14 | shape = SubResource( 1 ) 15 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/FiringConfigurations/Cone3Configuration.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.tscn" type="PackedScene" id=1] 4 | 5 | [node name="Cone3Configuration" type="Node2D"] 6 | 7 | [node name="WeaponLocation" parent="." instance=ExtResource( 1 )] 8 | position = Vector2( -15, -33.8697 ) 9 | rotation = -0.436332 10 | 11 | [node name="WeaponLocation2" parent="." instance=ExtResource( 1 )] 12 | position = Vector2( 0, -44.0319 ) 13 | 14 | [node name="WeaponLocation3" parent="." instance=ExtResource( 1 )] 15 | position = Vector2( 15, -33.8697 ) 16 | rotation = 0.436332 17 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/FiringConfigurations/Straight1Configuration.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.tscn" type="PackedScene" id=1] 4 | 5 | [node name="Straight1Configuration" type="Node2D"] 6 | 7 | [node name="WeaponLocation" parent="." instance=ExtResource( 1 )] 8 | position = Vector2( 0, -40 ) 9 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/ModularWeaponsSystem.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/ModularWeapon.gd" type="Script" id=1] 4 | [ext_resource path="res://ModularWeapons/ModularWeapon/FiringConfigurations/Straight1Configuration.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://ModularWeapons/ModularWeapon/Projectiles/BasicEmitter.tscn" type="PackedScene" id=3] 6 | [ext_resource path="res://ModularWeapons/ModularWeapon/ProjectileMotions/StraightMotion.tres" type="Resource" id=4] 7 | 8 | [node name="ModularWeaponsSystem" type="Node2D"] 9 | script = ExtResource( 1 ) 10 | emitter_configuration = ExtResource( 2 ) 11 | projectile_emitter = ExtResource( 3 ) 12 | projectile_motions = [ ExtResource( 4 ) ] 13 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/ProjectileEvents/ExplosionEvent.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/ExplosionEvent.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | triggers_on_misses = false 8 | explosion_radius = 130.0 9 | explosion_damage = 30.0 10 | damage_scales_with_distances = true 11 | collision_mask = 10 12 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/ProjectileMotions/HomingMotion.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/HomingMotion.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | homing_radius = 250.0 8 | homing_strength = 0.275 9 | collision_mask = 2 10 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/ProjectileMotions/SineMotion.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/SineMotion.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | amplitude = 100.0 8 | frequency = 2 9 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/ProjectileMotions/StraightMotion.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/StraightMotion.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | travel_speed = 650.0 8 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/Projectiles/BasicEmitter.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicEmitter.gd" type="Script" id=1] 4 | 5 | [node name="BasicEmitter" type="Node2D"] 6 | script = ExtResource( 1 ) 7 | projectiles_per_second = 3.0 8 | projectile_lifetime = 0.85 9 | 10 | [node name="Timer" type="Timer" parent="."] 11 | process_mode = 0 12 | one_shot = true 13 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/Projectiles/LaserEmitter.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/LaserTracer.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/LaserEmitter.gd" type="Script" id=2] 5 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/CastingParticles.tres" type="Material" id=3] 6 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png" type="Texture" id=4] 7 | 8 | [sub_resource type="GDScript" id=1] 9 | script/source = "extends Line2D 10 | 11 | func _ready() -> void: 12 | set_as_toplevel(true) 13 | " 14 | 15 | [node name="LaserEmitter" type="Node2D"] 16 | script = ExtResource( 2 ) 17 | projectile_lifetime = 2.0 18 | 19 | [node name="LaserTracer" parent="." instance=ExtResource( 1 )] 20 | visible = false 21 | 22 | [node name="Line2D" type="Line2D" parent="."] 23 | default_color = Color( 1.43922, 0.74902, 0.2, 1 ) 24 | joint_mode = 2 25 | begin_cap_mode = 2 26 | end_cap_mode = 2 27 | antialiased = true 28 | script = SubResource( 1 ) 29 | 30 | [node name="Timer" type="Timer" parent="."] 31 | process_mode = 0 32 | one_shot = true 33 | 34 | [node name="CastingParticles" type="Particles2D" parent="."] 35 | modulate = Color( 1.43922, 0.745098, 0.2, 1 ) 36 | emitting = false 37 | lifetime = 0.3 38 | visibility_rect = Rect2( -16.3859, -29.8711, 35.7076, 29.8554 ) 39 | local_coords = false 40 | process_material = ExtResource( 3 ) 41 | texture = ExtResource( 4 ) 42 | [connection signal="collided" from="LaserTracer" to="." method="_on_projectile_collided"] 43 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/SpawnedObjects.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="SpawnedObjects" type="Node2D" groups=[ 4 | "spawned_objects", 5 | ]] 6 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Position2D 3 | 4 | 5 | func _draw() -> void: 6 | if Engine.editor_hint: 7 | draw_line(Vector2.ZERO, Vector2.UP * 100, Color.steelblue, 4) 8 | draw_line(Vector2(-15, -85), Vector2(15, -115), Color.red, 4) 9 | draw_line(Vector2(-15, -115), Vector2(15, -85), Color.green, 4) 10 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.gd" type="Script" id=1] 4 | 5 | 6 | 7 | [node name="WeaponLocation" type="Position2D"] 8 | script = ExtResource( 1 ) 9 | __meta__ = { 10 | "_gizmo_extents_": 30.0 11 | } 12 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicEmitter.gd: -------------------------------------------------------------------------------- 1 | extends ProjectileEmitter 2 | 3 | 4 | var projectile := preload("BasicProjectile.tscn") 5 | 6 | onready var timer := $Timer 7 | 8 | 9 | func _physics_process(_delta: float) -> void: 10 | if Input.is_action_pressed("fire") and timer.is_stopped(): 11 | fire() 12 | timer.start(1.0 / projectiles_per_second) 13 | 14 | 15 | # Spawns and configures a basic projectile scene and connects to its signals. 16 | func _do_fire(_direction: Vector2, _motions: Array, _lifetime: float) -> void: 17 | if not spawned_objects: 18 | return 19 | 20 | var new_projectile := projectile.instance() 21 | new_projectile.setup(global_position, _direction, _motions, _lifetime) 22 | spawned_objects.add_child(new_projectile) 23 | 24 | var _error := new_projectile.connect("collided", self, "_on_projectile_collided") 25 | _error = new_projectile.connect("missed", self, "_on_projectile_missed") 26 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicProjectile.gd: -------------------------------------------------------------------------------- 1 | extends Projectile 2 | 3 | onready var timer: Timer = $Timer 4 | onready var tween := $Tween 5 | 6 | 7 | # Called after the base _setup to allow for specialized configuration. 8 | func _post_setup() -> void: 9 | if not is_inside_tree(): 10 | yield(self, "ready") 11 | timer.start(lifetime) 12 | 13 | 14 | func _physics_process(delta: float) -> void: 15 | var movement := _update_movement(delta) 16 | 17 | var collision := move_and_collide(movement) 18 | 19 | if collision: 20 | emit_signal("collided", collision.collider, collision.position) 21 | _impact() 22 | 23 | 24 | func _on_Timer_timeout() -> void: 25 | _miss() 26 | 27 | 28 | # What the projectile does after it has hit a valid target. 29 | # Flares up in size and fades out. 30 | # @tags - virtual 31 | func _impact() -> void: 32 | set_physics_process(false) 33 | tween.interpolate_property(self, "modulate", modulate, modulate * 3, 0.1, Tween.TRANS_CUBIC) 34 | tween.interpolate_property(self, "modulate", modulate * 3, Color.transparent, 0.2, 0, 2, 0.1) 35 | tween.start() 36 | yield(tween, "tween_all_completed") 37 | queue_free() 38 | 39 | 40 | # What the projectile does after it has not hit any target. 41 | # Shrinks and fades out 42 | # @tags - virtual 43 | func _miss() -> void: 44 | emit_signal("missed", global_position) 45 | collision_layer = 0 46 | collision_mask = 0 47 | tween.interpolate_property(self, "scale", scale, Vector2.ZERO, 0.25) 48 | tween.start() 49 | yield(tween, "tween_all_completed") 50 | queue_free() 51 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicProjectile.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicProjectile.gd" type="Script" id=2] 4 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/white_circle.svg" type="Texture" id=3] 5 | 6 | [sub_resource type="CircleShape2D" id=1] 7 | radius = 5.0 8 | 9 | [node name="Projectile" type="KinematicBody2D"] 10 | collision_layer = 4 11 | collision_mask = 2 12 | script = ExtResource( 2 ) 13 | 14 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 15 | shape = SubResource( 1 ) 16 | 17 | [node name="Sprite" type="Sprite" parent="."] 18 | modulate = Color( 1.37647, 0.550031, 0.101961, 1 ) 19 | scale = Vector2( 0.5, 0.5 ) 20 | texture = ExtResource( 3 ) 21 | 22 | [node name="Timer" type="Timer" parent="."] 23 | process_mode = 0 24 | one_shot = true 25 | 26 | [node name="Tween" type="Tween" parent="."] 27 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 28 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Basic/white_circle.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/white_circle.svg-92d22f22d631d792a11832b12e624001.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/white_circle.svg" 13 | dest_files=[ "res://.import/white_circle.svg-92d22f22d631d792a11832b12e624001.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Laser/CastingParticles.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ParticlesMaterial" load_steps=5 format=2] 2 | 3 | [sub_resource type="Gradient" id=1] 4 | offsets = PoolRealArray( 0.582915, 1 ) 5 | colors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0 ) 6 | 7 | [sub_resource type="GradientTexture" id=2] 8 | gradient = SubResource( 1 ) 9 | 10 | [sub_resource type="Curve" id=3] 11 | _data = [ Vector2( 0.518072, 1 ), 0.0, -3.53434, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ] 12 | 13 | [sub_resource type="CurveTexture" id=4] 14 | curve = SubResource( 3 ) 15 | 16 | [resource] 17 | flag_disable_z = true 18 | direction = Vector3( 0, -1, 0 ) 19 | gravity = Vector3( 0, 0, 0 ) 20 | initial_velocity = 100.0 21 | orbit_velocity = 0.0 22 | orbit_velocity_random = 0.0 23 | scale = 0.5 24 | scale_curve = SubResource( 4 ) 25 | color_ramp = SubResource( 2 ) 26 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Laser/ImpactParticles.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ParticlesMaterial" load_steps=5 format=2] 2 | 3 | [sub_resource type="Gradient" id=1] 4 | offsets = PoolRealArray( 0.582915, 1 ) 5 | colors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0 ) 6 | 7 | [sub_resource type="GradientTexture" id=2] 8 | gradient = SubResource( 1 ) 9 | 10 | [sub_resource type="Curve" id=3] 11 | _data = [ Vector2( 0.518072, 1 ), 0.0, -3.53434, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ] 12 | 13 | [sub_resource type="CurveTexture" id=4] 14 | curve = SubResource( 3 ) 15 | 16 | [resource] 17 | flag_disable_z = true 18 | spread = 50.0 19 | gravity = Vector3( 0, 0, 0 ) 20 | initial_velocity = 300.0 21 | orbit_velocity = 0.0 22 | orbit_velocity_random = 0.0 23 | scale = 0.5 24 | scale_curve = SubResource( 4 ) 25 | color_ramp = SubResource( 2 ) 26 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Laser/LaserTracer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/LaserTracer.gd" type="Script" id=2] 4 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/ImpactParticles.tres" type="Material" id=3] 5 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png" type="Texture" id=4] 6 | 7 | [sub_resource type="CircleShape2D" id=1] 8 | radius = 5.0 9 | 10 | [sub_resource type="GDScript" id=2] 11 | script/source = "extends Particles2D 12 | 13 | 14 | func _ready() -> void: 15 | set_as_toplevel(true) 16 | " 17 | 18 | [node name="LaserTracer" type="KinematicBody2D"] 19 | collision_layer = 4 20 | collision_mask = 2 21 | script = ExtResource( 2 ) 22 | 23 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 24 | shape = SubResource( 1 ) 25 | 26 | [node name="ImpactParticles" type="Particles2D" parent="."] 27 | modulate = Color( 1.44, 0.75, 0.2, 1 ) 28 | emitting = false 29 | amount = 16 30 | lifetime = 0.3 31 | visibility_rect = Rect2( -2500, -2500, 5000, 5000 ) 32 | local_coords = false 33 | process_material = ExtResource( 3 ) 34 | texture = ExtResource( 4 ) 35 | script = SubResource( 2 ) 36 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/glowing_circle.png-98f59b10001a2f55c1125f5d4b5a794e.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png" 13 | dest_files=[ "res://.import/glowing_circle.png-98f59b10001a2f55c1125f5d4b5a794e.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/Explosion.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | onready var player := $AnimationPlayer 4 | onready var area := $Area2D 5 | onready var shape: CircleShape2D = $Area2D/CollisionShape2D.shape 6 | 7 | 8 | # Plays the explosion animation and cleans up 9 | func trigger() -> void: 10 | player.play("Explode") 11 | yield(player, "animation_finished") 12 | queue_free() 13 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/ExplosionEvent.gd: -------------------------------------------------------------------------------- 1 | class_name ExplosionEvent 2 | extends ProjectileEvent 3 | 4 | export var explosion_radius := 130.0 5 | export var explosion_damage := 30.0 6 | export var damage_scales_with_distances := true 7 | export (int, LAYERS_2D_PHYSICS) var collision_mask: int 8 | 9 | var explosion_effect := preload("Explosion.tscn") 10 | 11 | 12 | # Spawns a new explosion, positions it and triggers its animation. 13 | # Causes damage based on proximity to the explosion. 14 | # @tags - virtual 15 | func _do_trigger(_spawn_location: Vector2, _spawn_parent: Node, _weapons_system, _missed: bool) -> void: 16 | var explosion := explosion_effect.instance() 17 | 18 | explosion.position = _spawn_location 19 | 20 | _spawn_parent.add_child(explosion) 21 | explosion.shape.radius = explosion_radius 22 | explosion.area.collision_mask = collision_mask 23 | 24 | explosion.trigger() 25 | 26 | yield(explosion.get_tree(), "physics_frame") 27 | 28 | var bodies: Array = explosion.area.get_overlapping_bodies() 29 | for body in bodies: 30 | var distance: float = body.global_position.distance_to(explosion.global_position) 31 | 32 | var damage := explosion_damage 33 | if damage_scales_with_distances: 34 | damage *= clamp(1.0 - distance / explosion_radius, 0, 1) 35 | 36 | _weapons_system.emit_signal("damaged", body, damage) 37 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/explosion_gradient.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="Gradient" id=1] 4 | offsets = PoolRealArray( 0, 0.256158, 0.596059, 0.842365, 1 ) 5 | colors = PoolColorArray( 0.831373, 0.219608, 0.219608, 0, 0.831373, 0.219608, 0.219608, 1, 0.980392, 0.419608, 0.211765, 1, 1, 0.788235, 0.309804, 1, 1, 1, 1, 1 ) 6 | 7 | [resource] 8 | gradient = SubResource( 1 ) 9 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/explosion_gradient_2.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="Gradient" id=1] 4 | offsets = PoolRealArray( 0, 0.0945455, 0.181818, 0.389091, 0.570909, 0.865455 ) 5 | colors = PoolColorArray( 0.976471, 0.878431, 0.705882, 0, 0.97568, 0.84943, 0.605487, 1, 0.972656, 0.754792, 0.26258, 1, 1, 0.45265, 0.155894, 1, 0.831373, 0.219608, 0.219608, 1, 0.258824, 0.25098, 0.25098, 1 ) 6 | 7 | [resource] 8 | gradient = SubResource( 1 ) 9 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/puff.png-6910228130a45f56ce0d6387a09c4d74.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png" 13 | dest_files=[ "res://.import/puff.png-6910228130a45f56ce0d6387a09c4d74.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/puff_smooth.png-835ddf23b782e80c28b584266fb7775a.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png" 13 | dest_files=[ "res://.import/puff_smooth.png-835ddf23b782e80c28b584266fb7775a.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/scraps_gradient.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="Gradient" id=1] 4 | offsets = PoolRealArray( 0, 0.155894, 0.505017, 0.8327, 1 ) 5 | colors = PoolColorArray( 0.258824, 0.25098, 0.25098, 1, 0.722656, 0.118153, 0.118153, 1, 0.855469, 0.323879, 0.126857, 1, 1, 0.788235, 0.309804, 0.717647, 1, 1, 1, 0 ) 6 | 7 | [resource] 8 | gradient = SubResource( 1 ) 9 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/sparkle.png-c023181495e3d5cc15f93f9f798220f3.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png" 13 | dest_files=[ "res://.import/sparkle.png-c023181495e3d5cc15f93f9f798220f3.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileEvents/ProjectileEvent.gd: -------------------------------------------------------------------------------- 1 | # A base class that defines an event for when a projectile hits and/or misses. 2 | # The `trigger()` function is provided and filters out misses from events that 3 | # do not trigger on miss. It calls `_do_trigger()`, which is the specialized 4 | # implementation of the event. Like spawning an explosion, or a new, temporary 5 | # projectile emitter. 6 | # @tags - abstract 7 | class_name ProjectileEvent 8 | extends Resource 9 | 10 | 11 | export var triggers_on_misses := false 12 | 13 | 14 | # Base function for triggering an impact event. Will check if it should or 15 | # shouldn't trigger on miss and only call the virtual `_do_trigger` on a match. 16 | func trigger(_spawn_location: Vector2, _spawn_parent: Node, _weapons_system, _missed: bool) -> void: 17 | if _missed and not triggers_on_misses: 18 | return 19 | 20 | _do_trigger(_spawn_location, _spawn_parent, _weapons_system, _missed) 21 | 22 | 23 | # Virtual implementation specific call for triggering an impact event. 24 | # @tags - virtual 25 | func _do_trigger(_spawn_location: Vector2, _spawn_parent: Node, _weapons_system, _missed: bool) -> void: 26 | pass 27 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/SineMotion.gd: -------------------------------------------------------------------------------- 1 | class_name SineMotion 2 | extends ProjectileMotion 3 | 4 | # Amplitude of the sine wave in pixels relative to the emission point. 5 | export var amplitude := 100.0 6 | # Number of waves the sine draws per second. 7 | export var frequency := 2 8 | 9 | var elapsed_time := 0.0 10 | 11 | 12 | # Moves the projectile perpendicular to its travel direction in a sine wave 13 | # pattern. 14 | # @tags - virtual 15 | func _update_movement(direction: Vector2, delta: float) -> Vector2: 16 | elapsed_time += delta 17 | 18 | var wobble_amount := amplitude * sin(elapsed_time * frequency * PI) * frequency 19 | 20 | var travel_direction := Vector2(-direction.y, direction.x) 21 | return travel_direction * wobble_amount * delta 22 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/StraightMotion.gd: -------------------------------------------------------------------------------- 1 | class_name StraightMotion 2 | extends ProjectileMotion 3 | 4 | # Speed at which the projectile travels. 5 | export var travel_speed := 300.0 6 | 7 | 8 | # Moves in a straight line by the projectile's speed 9 | # @tags - virtual 10 | func _update_movement(direction: Vector2, delta: float) -> Vector2: 11 | return direction * travel_speed * delta 12 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/ModularWeapon/src/ProjectileMotion/ProjectileMotion.gd: -------------------------------------------------------------------------------- 1 | # Base class to represent a projectile's motion. The projectile's position 2 | # and/or orientation can be updated inside of `_update_movement`, or it can 3 | # be used just to provide a movement vector. 4 | # @tags - abstract 5 | class_name ProjectileMotion 6 | extends Resource 7 | 8 | var projectile: Projectile 9 | 10 | 11 | # Method to override to define the projectile's motion. 12 | # @tags - virtual 13 | func _update_movement(_direction: Vector2, _delta: float) -> Vector2: 14 | return Vector2.ZERO 15 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/PlayerShip/PlayerShip.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/PlayerShip/topdown-player.svg" type="Texture" id=1] 4 | [ext_resource path="res://ModularWeapons/ModularWeapon/ModularWeaponsSystem.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://ModularWeapons/PlayerShip/PlayerShip.gd" type="Script" id=4] 6 | 7 | [node name="PlayerShip" type="KinematicBody2D"] 8 | script = ExtResource( 4 ) 9 | 10 | [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 11 | polygon = PoolVector2Array( 0, -40, -15, -30, -40, 30, -20, 40, 0, 30, 20, 40, 40, 25, 15, -30 ) 12 | 13 | [node name="Sprite" type="Sprite" parent="."] 14 | position = Vector2( 0, -0.142395 ) 15 | texture = ExtResource( 1 ) 16 | 17 | [node name="ModularWeaponsSystem" parent="." instance=ExtResource( 2 )] 18 | -------------------------------------------------------------------------------- /godot3/ModularWeapons/PlayerShip/topdown-player.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/topdown-player.svg-183557eaf015028958738f745721d42b.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/PlayerShip/topdown-player.svg" 13 | dest_files=[ "res://.import/topdown-player.svg-183557eaf015028958738f745721d42b.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Actors/Actor.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | 4 | const FLOOR_NORMAL: = Vector2.UP 5 | 6 | export var speed: = Vector2(400.0, 1000.0) 7 | export var gravity: = 3500.0 8 | 9 | var velocity: = Vector2.ZERO 10 | 11 | 12 | func _physics_process(delta: float) -> void: 13 | velocity.y += gravity * delta 14 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Actors/Enemy.gd: -------------------------------------------------------------------------------- 1 | extends "Actor.gd" 2 | 3 | 4 | onready var visibility_enabler : VisibilityEnabler2D = $VisibilityEnabler2D 5 | 6 | 7 | func _ready() -> void: 8 | set_physics_process(false) 9 | velocity.x = speed.x 10 | 11 | 12 | func _physics_process(_delta: float) -> void: 13 | velocity.x *= -1 if is_on_wall() else 1 14 | velocity.y = move_and_slide(velocity, FLOOR_NORMAL).y 15 | 16 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Actors/Enemy.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://RandomWalker/Levels/tiles.svg" type="Texture" id=1] 4 | [ext_resource path="res://RandomWalker/Actors/Enemy.gd" type="Script" id=2] 5 | 6 | 7 | 8 | 9 | [sub_resource type="CapsuleShape2D" id=1] 10 | radius = 15.0 11 | height = 0.0 12 | 13 | [node name="Enemy" type="KinematicBody2D" groups=[ 14 | "enemy", 15 | ]] 16 | collision_layer = 2 17 | script = ExtResource( 2 ) 18 | speed = Vector2( 300, 1000 ) 19 | 20 | [node name="Sprite" type="Sprite" parent="."] 21 | texture = ExtResource( 1 ) 22 | offset = Vector2( 0, -15 ) 23 | region_enabled = true 24 | region_rect = Rect2( 330, 270, 30, 30 ) 25 | 26 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 27 | position = Vector2( 0, -15 ) 28 | shape = SubResource( 1 ) 29 | 30 | [node name="VisibilityEnabler2D" type="VisibilityEnabler2D" parent="."] 31 | position = Vector2( 0, -15 ) 32 | rect = Rect2( -15, -15, 30, 30 ) 33 | process_parent = true 34 | physics_process_parent = true 35 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Actors/Player.gd: -------------------------------------------------------------------------------- 1 | extends "Actor.gd" 2 | 3 | 4 | const TIME_DEATH := 0.2 5 | 6 | onready var danger_detector: Area2D = $DangerDetector 7 | onready var tween: Tween = $Tween 8 | 9 | 10 | func _on_DangerDetector_body_entered(_body: Node): 11 | set_physics_process(false) 12 | 13 | tween.interpolate_property(self, "scale", null, Vector2.ZERO, TIME_DEATH, Tween.TRANS_LINEAR) 14 | tween.start() 15 | 16 | yield(tween, "tween_all_completed") 17 | queue_free() 18 | 19 | 20 | func _physics_process(_delta: float) -> void: 21 | var direction := _get_direction() 22 | var is_jump_interrupted := Input.is_action_just_released("jump") and velocity.y < 0.0 23 | velocity = calculate_velocity(velocity, direction, speed, is_jump_interrupted) 24 | velocity = move_and_slide(velocity, FLOOR_NORMAL) 25 | 26 | 27 | func _get_direction() -> Vector2: 28 | var x := Input.get_action_strength("move_right") - Input.get_action_strength("move_left") 29 | var y := ( 30 | -Input.get_action_strength("jump") 31 | if is_on_floor() and Input.is_action_just_pressed("jump") 32 | else 0.0 33 | ) 34 | return Vector2(x, y) 35 | 36 | 37 | func calculate_velocity( 38 | velocity: Vector2, direction: Vector2, speed: Vector2, is_jump_interrupted: bool 39 | ) -> Vector2: 40 | velocity.x = speed.x * direction.x 41 | if direction.y != 0.0: 42 | velocity.y = speed.y * direction.y 43 | if is_jump_interrupted: 44 | velocity.y = 0.0 45 | return velocity 46 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Actors/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://RandomWalker/Levels/tiles.svg" type="Texture" id=1] 4 | [ext_resource path="res://RandomWalker/Actors/Player.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 11.185, 29.5827 ) 8 | 9 | [sub_resource type="CapsuleShape2D" id=2] 10 | radius = 15.0 11 | height = 30.0 12 | 13 | [node name="Player" type="KinematicBody2D" groups=[ 14 | "player", 15 | ]] 16 | collision_layer = 0 17 | script = ExtResource( 2 ) 18 | 19 | [node name="Sprite" type="Sprite" parent="."] 20 | texture = ExtResource( 1 ) 21 | offset = Vector2( 0, -30 ) 22 | region_enabled = true 23 | region_rect = Rect2( 300, 240, 30, 60 ) 24 | 25 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 26 | position = Vector2( 0, -30 ) 27 | shape = SubResource( 1 ) 28 | 29 | [node name="DangerDetector" type="Area2D" parent="."] 30 | collision_layer = 0 31 | collision_mask = 2 32 | 33 | [node name="CollisionShape2D" type="CollisionShape2D" parent="DangerDetector"] 34 | position = Vector2( 0, -30 ) 35 | shape = SubResource( 2 ) 36 | 37 | [node name="RemoteTransform2D" type="RemoteTransform2D" parent="."] 38 | 39 | [node name="Tween" type="Tween" parent="."] 40 | [connection signal="body_entered" from="DangerDetector" to="." method="_on_DangerDetector_body_entered"] 41 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Camera2D.gd: -------------------------------------------------------------------------------- 1 | extends Camera2D 2 | 3 | 4 | signal zoom_changed(zoom) 5 | 6 | const LIMIT_DEFAULT := 10000000 7 | const MARGIN := 100 8 | const SPEED := 800 9 | const SPEED_ZOOM := Vector2(0.2, 0.2) 10 | const TIME_START := 0.8 11 | const TIME_TWEEN := 1.0 12 | 13 | var _direction := Vector2.ZERO 14 | var _resolution := Vector2.ZERO 15 | 16 | onready var tween: Tween = $Tween 17 | onready var scene_tree: SceneTree = get_tree() 18 | 19 | 20 | func _on_LevelGenerator_level_completed(player_position: Vector2) -> void: 21 | tween.interpolate_property(self, ":zoom", null, Vector2.ONE, TIME_TWEEN, Tween.TRANS_LINEAR) 22 | tween.interpolate_property(self, ":position", null, player_position, TIME_TWEEN, Tween.TRANS_LINEAR) 23 | yield(scene_tree.create_timer(TIME_START), "timeout") 24 | tween.start() 25 | 26 | 27 | func _on_Tween_tween_step(_object: Object, key: NodePath, _elapsed: float, value: Vector2) -> void: 28 | if key == ":zoom": 29 | emit_signal("zoom_changed", value) 30 | 31 | 32 | func setup(resolution: Vector2, world_size: Vector2) -> void: 33 | _resolution = resolution 34 | limit_left = -LIMIT_DEFAULT 35 | limit_top = -LIMIT_DEFAULT 36 | limit_right = LIMIT_DEFAULT 37 | limit_bottom = LIMIT_DEFAULT 38 | 39 | tween.remove_all() 40 | 41 | position = world_size / 2 42 | var ratio := world_size / resolution 43 | var zoom_max := ceil(max(ratio.x, ratio.y) + 1) 44 | zoom = Vector2(zoom_max, zoom_max) 45 | emit_signal("zoom_changed", zoom) 46 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Levels/Level.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | var _player: KinematicBody2D = null 5 | 6 | onready var extra: Node2D = $Extra 7 | 8 | 9 | func _ready() -> void: 10 | for n in extra.get_children(): 11 | if n.is_in_group("player"): 12 | _player = n 13 | elif n.is_in_group("enemy"): 14 | n.visibility_enabler.connect("screen_entered", self, "_on_Enemy_screen_enetered", [n]) 15 | 16 | 17 | func _on_Enemy_screen_enetered(enemy: Node2D) -> void: 18 | enemy.velocity.x = sign((_player.position - enemy.position).x) * enemy.speed.x 19 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Levels/Level.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://RandomWalker/Levels/tileset.tres" type="TileSet" id=1] 4 | [ext_resource path="res://RandomWalker/Levels/Level.gd" type="Script" id=2] 5 | 6 | [node name="Level" type="Node2D"] 7 | script = ExtResource( 2 ) 8 | 9 | [node name="TileMapMain" type="TileMap" parent="."] 10 | tile_set = ExtResource( 1 ) 11 | cell_size = Vector2( 60, 60 ) 12 | collision_mask = 0 13 | format = 1 14 | 15 | [node name="TileMapDanger" type="TileMap" parent="."] 16 | tile_set = ExtResource( 1 ) 17 | cell_size = Vector2( 60, 60 ) 18 | collision_layer = 2 19 | collision_mask = 0 20 | format = 1 21 | 22 | [node name="Extra" type="Node2D" parent="."] 23 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Levels/background-gradient.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/background-gradient.svg-8dc41d2b2b1fb3ab56fe634a99cc78f1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/background-gradient.svg" 13 | dest_files=[ "res://.import/background-gradient.svg-8dc41d2b2b1fb3ab56fe634a99cc78f1.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Levels/background-hills.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/background-hills.svg-85273ce5f22bf0708f362e62a9911261.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/background-hills.svg" 13 | dest_files=[ "res://.import/background-hills.svg-85273ce5f22bf0708f362e62a9911261.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=1 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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Levels/background-trees.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/background-trees.svg-a4815e15603624fb0031ceeff10ecdaf.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/background-trees.svg" 13 | dest_files=[ "res://.import/background-trees.svg-a4815e15603624fb0031ceeff10ecdaf.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=1 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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/RandomWalker/Levels/tiles.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tiles.svg-fc8b5267736bff16ee28b8d30801e87c.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/tiles.svg" 13 | dest_files=[ "res://.import/tiles.svg-fc8b5267736bff16ee28b8d30801e87c.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/BlueNoiseWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/BlueNoiseWorldGenerator.gd" type="Script" id=1] 4 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Asteroid.tscn" type="PackedScene" id=3] 6 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" type="PackedScene" id=4] 7 | 8 | [node name="BlueNoiseWorldGenerator" type="Node2D"] 9 | script = ExtResource( 1 ) 10 | start_seed = "blue_noise_generation" 11 | Asteroid = ExtResource( 3 ) 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchor_right = 1.0 18 | anchor_bottom = 1.0 19 | mouse_filter = 2 20 | color = Color( 0.0666667, 0.133333, 0.333333, 1 ) 21 | __meta__ = { 22 | "_edit_use_anchors_": false 23 | } 24 | 25 | [node name="Player" parent="." instance=ExtResource( 2 )] 26 | 27 | [node name="GridDrawer" parent="." instance=ExtResource( 4 )] 28 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/LayeredWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/LayeredWorldGenerator.gd" type="Script" id=1] 4 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" type="PackedScene" id=3] 6 | 7 | [node name="LayeredWorldGenerator" type="Node2D"] 8 | script = ExtResource( 1 ) 9 | sector_axis_count = 16 10 | start_seed = "layered_generation" 11 | show_debug = true 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchor_right = 1.0 18 | anchor_bottom = 1.0 19 | mouse_filter = 2 20 | color = Color( 0.0666667, 0.133333, 0.333333, 1 ) 21 | __meta__ = { 22 | "_edit_use_anchors_": false 23 | } 24 | 25 | [node name="Player" parent="." instance=ExtResource( 2 )] 26 | speed_max = 1350.0 27 | 28 | [node name="Camera2D" parent="Player" index="2"] 29 | zoom = Vector2( 10, 10 ) 30 | 31 | [node name="GridDrawer" parent="." instance=ExtResource( 3 )] 32 | 33 | [editable path="Player"] 34 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/PersistentWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://SpaceInfiniteGeneration/PersistentWorldGenerator.gd" type="Script" id=2] 5 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" type="PackedScene" id=3] 6 | 7 | [node name="PersistentWorldGenerator" type="Node2D"] 8 | script = ExtResource( 2 ) 9 | sector_axis_count = 16 10 | start_seed = "persistent_world" 11 | show_debug = true 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchor_right = 1.0 18 | anchor_bottom = 1.0 19 | mouse_filter = 2 20 | color = Color( 0.0666667, 0.133333, 0.333333, 1 ) 21 | __meta__ = { 22 | "_edit_use_anchors_": false 23 | } 24 | 25 | [node name="Player" parent="." instance=ExtResource( 1 )] 26 | speed_max = 1350.0 27 | 28 | [node name="Camera2D" parent="Player" index="2"] 29 | zoom = Vector2( 10, 10 ) 30 | 31 | [node name="GridDrawer" parent="." instance=ExtResource( 3 )] 32 | 33 | [editable path="Player"] 34 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/Asteroid.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/asteroid-round.svg" type="Texture" id=1] 4 | 5 | [sub_resource type="CircleShape2D" id=1] 6 | radius = 113.5 7 | 8 | [node name="Asteroid" type="StaticBody2D" groups=[ 9 | "asteroids", 10 | ]] 11 | scale = Vector2( 0.5, 0.5 ) 12 | 13 | [node name="Sprite" type="Sprite" parent="."] 14 | texture = ExtResource( 1 ) 15 | 16 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 17 | shape = SubResource( 1 ) 18 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/GridDrawer.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | var cell_size: float 4 | var grid_origin: Vector2 5 | var cell_count: int 6 | 7 | 8 | func _draw() -> void: 9 | if cell_size == 0: 10 | return 11 | 12 | var position_origin := grid_origin * cell_size 13 | 14 | var half_cell_count := int(cell_count / 2.0) 15 | var half_cell_size := cell_size/2.0 16 | 17 | for x in range(-half_cell_count, half_cell_count): 18 | for y in range(-half_cell_count, half_cell_count): 19 | var cell_rect := Rect2( 20 | Vector2( 21 | position_origin.x + x * cell_size - half_cell_size, 22 | position_origin.y + y * cell_size - half_cell_size 23 | ), 24 | Vector2(cell_size, cell_size) 25 | ) 26 | 27 | draw_rect(cell_rect, Color.skyblue, false) 28 | 29 | 30 | func setup(size: float, count: int) -> void: 31 | cell_size = size 32 | cell_count = count 33 | update() 34 | 35 | 36 | func move_grid_to(origin: Vector2) -> void: 37 | grid_origin = origin 38 | update() 39 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/GridDrawer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/GridDrawer.gd" type="Script" id=1] 4 | 5 | [node name="GridDrawer" type="Node2D"] 6 | script = ExtResource( 1 ) 7 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/Player/Player.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | export var speed_max := 675.0 4 | export var acceleration := 1500.0 5 | export var angular_speed_max := deg2rad(150) 6 | export var angular_acceleration := deg2rad(1200) 7 | export var drag_factor := 0.05 8 | export var angular_drag_factor := 0.1 9 | 10 | var velocity := Vector2.ZERO 11 | var angular_velocity := 0.0 12 | 13 | 14 | func _physics_process(delta: float) -> void: 15 | velocity = velocity.clamped(speed_max) 16 | 17 | angular_velocity = clamp(angular_velocity, -angular_speed_max, angular_speed_max) 18 | angular_velocity = lerp(angular_velocity, 0, angular_drag_factor) 19 | 20 | velocity = move_and_slide(velocity) 21 | rotation += angular_velocity * delta 22 | 23 | var movement := _get_movement() 24 | 25 | if is_equal_approx(movement.y, 0): 26 | velocity = (velocity.linear_interpolate(Vector2.ZERO, drag_factor)) 27 | 28 | var direction := Vector2.UP.rotated(rotation) 29 | 30 | velocity += movement.y * direction * acceleration * delta 31 | angular_velocity += movement.x * angular_acceleration * delta 32 | 33 | 34 | func _get_movement() -> Vector2: 35 | return Vector2( 36 | Input.get_action_strength("move_right") - Input.get_action_strength("move_left"), 37 | Input.get_action_strength("forwards") - Input.get_action_strength("back") 38 | ) 39 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/Player/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/Player.gd" type="Script" id=1] 4 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/topdown-player.svg" type="Texture" id=2] 5 | 6 | [node name="Player" type="KinematicBody2D"] 7 | script = ExtResource( 1 ) 8 | 9 | [node name="Sprite" type="Sprite" parent="."] 10 | texture = ExtResource( 2 ) 11 | 12 | [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 13 | polygon = PoolVector2Array( 0, -40, 30, 0, 40, 35, -40, 35, -30, 0 ) 14 | 15 | [node name="Camera2D" type="Camera2D" parent="."] 16 | current = true 17 | zoom = Vector2( 5, 5 ) 18 | process_mode = 0 19 | smoothing_enabled = true 20 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/Player/topdown-player.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/topdown-player.svg-0c5c44ce4a74751e54a17f51add1317c.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://SpaceInfiniteGeneration/Shared/Player/topdown-player.svg" 13 | dest_files=[ "res://.import/topdown-player.svg-0c5c44ce4a74751e54a17f51add1317c.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/Shared/asteroid-round.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/asteroid-round.svg-fe5c09dd3939d3fe8a61ba2d8f136fa6.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://SpaceInfiniteGeneration/Shared/asteroid-round.svg" 13 | dest_files=[ "res://.import/asteroid-round.svg-fe5c09dd3939d3fe8a61ba2d8f136fa6.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/SpaceInfiniteGeneration/WhiteNoiseWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Asteroid.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" type="PackedScene" id=3] 6 | [ext_resource path="res://SpaceInfiniteGeneration/WhiteNoiseWorldGenerator.gd" type="Script" id=4] 7 | 8 | [node name="WhiteNoiseWorldGenerator" type="Node2D"] 9 | script = ExtResource( 4 ) 10 | start_seed = "white_noise_generation" 11 | Asteroid = ExtResource( 1 ) 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchor_right = 1.0 18 | anchor_bottom = 1.0 19 | mouse_filter = 2 20 | color = Color( 0.0666667, 0.133333, 0.333333, 1 ) 21 | __meta__ = { 22 | "_edit_use_anchors_": false 23 | } 24 | 25 | [node name="Player" parent="." instance=ExtResource( 2 )] 26 | 27 | [node name="GridDrawer" parent="." instance=ExtResource( 3 )] 28 | -------------------------------------------------------------------------------- /godot3/WorldMap/Utils.gd: -------------------------------------------------------------------------------- 1 | class_name WorldMapUtils 2 | 3 | 4 | # Normalizes a value from a noise generator based on the noise's minimum and maximum range. 5 | static func normalize_noise(value: float, minmax := Vector2(-1, 1)) -> float: 6 | return range_lerp(value, minmax.x, minmax.y, 0, 1) 7 | 8 | 9 | # Normalizes the components of a 2D vector individually and returns them as a new Vector2. 10 | # Intended to use with the minmax range of a noise generator. 11 | static func normalize_noise_vector2(value: Vector2) -> Vector2: 12 | return Vector2(normalize_noise(value.x), normalize_noise(value.y)) 13 | 14 | 15 | # Returns the minimum and maximum value of a noise texture as a Vector2. 16 | static func get_minmax_noise(texture: NoiseTexture) -> Vector2: 17 | var out := Vector2(INF, -INF) 18 | for x in texture.width: 19 | for y in texture.height: 20 | var value := texture.noise.get_noise_2d(y, x) 21 | out.x = min(out.x, value) 22 | out.y = max(out.y, value) 23 | return out 24 | -------------------------------------------------------------------------------- /godot3/WorldMap/color_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="Gradient" id=1] 4 | offsets = PoolRealArray( 0, 0.240618, 0.496689, 0.529697, 0.561212, 0.580606, 0.601212, 0.638788, 0.673939, 0.69697, 0.74, 0.78, 1 ) 5 | colors = PoolColorArray( 0.278431, 0.231373, 0.470588, 1, 0.294118, 0.356863, 0.670588, 1, 0.341176, 1, 0.894118, 1, 0.960784, 0.647059, 0.392157, 1, 0.196078, 0.243137, 0.309804, 1, 0.807843, 0.996078, 0.486275, 1, 0.905882, 0.403922, 0.34902, 1, 0.262745, 0.262745, 0.305882, 1, 0.239216, 0.431373, 0.439216, 1, 0.235294, 0.639216, 0.439216, 1, 0.262745, 0.145098, 0.266667, 1, 1, 1, 0.921569, 1, 1, 1, 1, 1 ) 6 | 7 | [resource] 8 | gradient = SubResource( 1 ) 9 | width = 512 10 | -------------------------------------------------------------------------------- /godot3/WorldMap/discrete-color-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/WorldMap/discrete-color-map.png -------------------------------------------------------------------------------- /godot3/WorldMap/discrete-color-map.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/discrete-color-map.png-9714d85f2ec6c933888d235010f7d285.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://WorldMap/discrete-color-map.png" 13 | dest_files=[ "res://.import/discrete-color-map.png-9714d85f2ec6c933888d235010f7d285.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot3/WorldMap/heat_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="OpenSimplexNoise" id=1] 4 | octaves = 2 5 | period = 55.0 6 | persistence = 0.8 7 | lacunarity = 2.8 8 | 9 | [resource] 10 | width = 256 11 | height = 256 12 | noise = SubResource( 1 ) 13 | -------------------------------------------------------------------------------- /godot3/WorldMap/height_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="OpenSimplexNoise" id=1] 4 | period = 33.0 5 | persistence = 0.49 6 | lacunarity = 2.6 7 | 8 | [resource] 9 | noise = SubResource( 1 ) 10 | -------------------------------------------------------------------------------- /godot3/WorldMap/moisture_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture" load_steps=2 format=2] 2 | 3 | [sub_resource type="OpenSimplexNoise" id=1] 4 | period = 34.0 5 | persistence = 0.8 6 | 7 | [resource] 8 | width = 256 9 | height = 256 10 | noise = SubResource( 1 ) 11 | -------------------------------------------------------------------------------- /godot3/WorldMap/sobel.shader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | 4 | uniform vec4 edge_color : hint_color; 5 | uniform vec2 edge_width = vec2(0.1); 6 | 7 | 8 | float sobel(sampler2D tex, vec2 uv, vec2 pixel_size) { 9 | vec2 edge_width_pixel = edge_width * pixel_size; 10 | 11 | vec4 h = vec4(0.0); 12 | vec4 v = vec4(0.0); 13 | 14 | h += texture(tex, uv + vec2(-1.0, -1.0) * edge_width_pixel); 15 | h -= texture(tex, uv + vec2( 0.0, -1.0) * edge_width_pixel); 16 | h += 2.0 * texture(tex, uv + vec2(-1.0, 0.0) * edge_width_pixel); 17 | h -= 2.0 * texture(tex, uv + vec2( 1.0, 0.0) * edge_width_pixel); 18 | h += texture(tex, uv + vec2(-1.0, 1.0) * edge_width_pixel); 19 | h -= texture(tex, uv + vec2( 1.0, 1.0) * edge_width_pixel); 20 | 21 | v += texture(tex, uv + vec2(-1.0, -1.0) * edge_width_pixel); 22 | v += 2.0 * texture(tex, uv + vec2( 0.0, -1.0) * edge_width_pixel); 23 | v += texture(tex, uv + vec2( 1.0, -1.0) * edge_width_pixel); 24 | v -= texture(tex, uv + vec2(-1.0, 1.0) * edge_width_pixel); 25 | v -= 2.0 * texture(tex, uv + vec2( 0.0, 1.0) * edge_width_pixel); 26 | v -= texture(tex, uv + vec2( 1.0, 1.0) * edge_width_pixel); 27 | 28 | return sqrt(dot(h, h) + dot(v, v)); 29 | } 30 | 31 | 32 | void fragment() { 33 | float s = sobel(SCREEN_TEXTURE, SCREEN_UV, SCREEN_PIXEL_SIZE); 34 | COLOR = texture(SCREEN_TEXTURE, SCREEN_UV); 35 | COLOR = mix(COLOR, edge_color, s); 36 | } -------------------------------------------------------------------------------- /godot3/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 | -------------------------------------------------------------------------------- /godot3/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot3/icon.png -------------------------------------------------------------------------------- /godot3/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.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 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /godot4/BasicDungeon/01.Rectangular/Rectangular.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://d1ls1mwo47o5c"] 2 | 3 | [ext_resource type="Script" path="res://BasicDungeon/01.Rectangular/Rectangular.gd" id="1"] 4 | [ext_resource type="TileSet" uid="uid://vsh1t5kh20en" path="res://Common/tileset-prototype.tres" id="2"] 5 | 6 | [node name="BasicDungeonRectangular" type="Node2D"] 7 | script = ExtResource("1") 8 | 9 | [node name="Level" type="TileMap" parent="."] 10 | tile_set = ExtResource("2") 11 | format = 2 12 | 13 | [node name="Camera2D" type="Camera2D" parent="."] 14 | -------------------------------------------------------------------------------- /godot4/BasicDungeon/02.AndOrganic/AndOrganic.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://djar46m4afhmk"] 2 | 3 | [ext_resource type="TileSet" uid="uid://vsh1t5kh20en" path="res://Common/tileset-prototype.tres" id="1"] 4 | [ext_resource type="Script" path="res://BasicDungeon/02.AndOrganic/AndOrganic.gd" id="2"] 5 | 6 | [node name="BasicDungeonAndOrganic" type="Node2D"] 7 | script = ExtResource("2") 8 | 9 | [node name="Level" type="TileMap" parent="."] 10 | tile_set = ExtResource("1") 11 | format = 2 12 | 13 | [node name="Camera2D" type="Camera2D" parent="."] 14 | -------------------------------------------------------------------------------- /godot4/BasicDungeon/03.Bonus/Bonus.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | @export var level_size := Vector2(100, 80) 5 | @export var rooms_size := Vector2(10, 14) 6 | @export var rooms_max := 15 7 | 8 | @onready var level: TileMap = $Level 9 | @onready var camera: Camera2D = $Camera2D 10 | 11 | 12 | func _ready() -> void: 13 | _setup_camera() 14 | _generate() 15 | 16 | 17 | func _unhandled_input(event: InputEvent): 18 | if event.is_action_pressed("ui_select"): 19 | _generate() 20 | 21 | 22 | func _setup_camera() -> void: 23 | camera.position = level.map_to_local(level_size / 2) 24 | var z := 8 / maxf(level_size.x, level_size.y) 25 | camera.zoom = Vector2(z, z) 26 | 27 | 28 | func _generate() -> void: 29 | level.clear() 30 | for vector in BasicDungeonGenerator.generate(level_size, rooms_size, rooms_max): 31 | level.set_cell(0,vector, 0, Vector2i(0,0), 0) 32 | -------------------------------------------------------------------------------- /godot4/BasicDungeon/03.Bonus/Bonus.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://bcx4phl1k7no0"] 2 | 3 | [ext_resource type="TileSet" uid="uid://vsh1t5kh20en" path="res://Common/tileset-prototype.tres" id="1"] 4 | [ext_resource type="Script" path="res://BasicDungeon/03.Bonus/Bonus.gd" id="2"] 5 | 6 | [node name="BasicDungeonBonus" type="Node2D"] 7 | script = ExtResource("2") 8 | 9 | [node name="Level" type="TileMap" parent="."] 10 | tile_set = ExtResource("1") 11 | format = 2 12 | 13 | [node name="Camera2D" type="Camera2D" parent="."] 14 | -------------------------------------------------------------------------------- /godot4/BasicDungeon/03.Bonus/Room.gd: -------------------------------------------------------------------------------- 1 | class_name BasicDungeonRoom 2 | 3 | 4 | var position := Vector2.ZERO : get = get_position 5 | var end := Vector2.ZERO : get = get_end 6 | var center := Vector2.ZERO : get = get_center 7 | var rect: Rect2 8 | 9 | var _rect_area: float 10 | var _iter_index: int 11 | 12 | 13 | func _init(rectangle: Rect2): 14 | update(rectangle) 15 | 16 | 17 | func _iter_init(_arg) -> bool: 18 | _iter_index = 0 19 | return _iter_is_running() 20 | 21 | 22 | func _iter_next(_arg) -> bool: 23 | _iter_index += 1 24 | return _iter_is_running() 25 | 26 | 27 | func _iter_get(_arg) -> Vector2: 28 | var offset := BasicDungeonUtils.index_to_xy(rect.size.x, _iter_index) 29 | return rect.position + offset 30 | 31 | 32 | func update(rectangle: Rect2) -> void: 33 | self.rect = rectangle.abs() 34 | _rect_area = rectangle.get_area() 35 | 36 | 37 | func intersects(room: BasicDungeonRoom) -> bool: 38 | return rect.intersects(room.rect) 39 | 40 | 41 | func get_position() -> Vector2: 42 | return rect.position 43 | 44 | 45 | func get_end() -> Vector2: 46 | return rect.end 47 | 48 | 49 | func get_center() -> Vector2: 50 | return 0.5 * (rect.position + rect.end) 51 | 52 | 53 | func _iter_is_running() -> bool: 54 | return _iter_index < _rect_area 55 | -------------------------------------------------------------------------------- /godot4/BasicDungeon/03.Bonus/Utils.gd: -------------------------------------------------------------------------------- 1 | class_name BasicDungeonUtils 2 | 3 | 4 | static func lessv_x(v1: Vector2, v2: Vector2) -> bool: 5 | return v1.x < v2.x 6 | 7 | 8 | static func lessv_y(v1: Vector2, v2: Vector2) -> bool: 9 | return v1.y < v2.y 10 | 11 | 12 | static func index_to_xy(width: int, index: int) -> Vector2: 13 | return Vector2(index % width, index / width) 14 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/01.FoliageGenerator/FoliageGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://c72hicbnktppy"] 2 | 3 | [ext_resource type="TileSet" uid="uid://brghypklahquq" path="res://CellularAutomata/01.FoliageGenerator/FoliageGenerator.tres" id="1"] 4 | [ext_resource type="Script" path="res://CellularAutomata/01.FoliageGenerator/FoliageGenerator.gd" id="2"] 5 | 6 | [node name="FoliageGenerator" type="Node2D"] 7 | script = ExtResource("2") 8 | 9 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 10 | layer = -1 11 | 12 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 13 | anchors_preset = 15 14 | anchor_right = 1.0 15 | anchor_bottom = 1.0 16 | mouse_filter = 2 17 | color = Color(0.152941, 0.152941, 0.211765, 1) 18 | 19 | [node name="FoliageTileMap" type="TileMap" parent="."] 20 | position = Vector2(0, 16) 21 | tile_set = ExtResource("1") 22 | format = 2 23 | 24 | [node name="ButtonStep" type="Button" parent="."] 25 | offset_left = 1184.0 26 | offset_top = 649.0 27 | offset_right = 1261.0 28 | offset_bottom = 703.0 29 | text = "Step" 30 | 31 | [connection signal="pressed" from="ButtonStep" to="." method="update_grid"] 32 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/01.FoliageGenerator/plants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/01.FoliageGenerator/plants.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/01.FoliageGenerator/plants.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c3wf6uulun34o" 6 | path="res://.godot/imported/plants.png-3c35404687f314420a8a6a57a0bc89f1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/01.FoliageGenerator/plants.png" 14 | dest_files=["res://.godot/imported/plants.png-3c35404687f314420a8a6a57a0bc89f1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/02.CavernGenerator/UISettings.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | signal step_time_changed(time) 4 | signal wall_chance_changed(value) 5 | signal wall_conversion_changed(value) 6 | signal floor_conversion_changed(value) 7 | signal step_count_changed(value) 8 | signal maximum_treasure_changed(value) 9 | signal min_cavern_area_changed(value) 10 | signal min_exit_distance_changed(value) 11 | 12 | @onready var button_generate := $ButtonGenerate 13 | @onready var step_time_value := $StepSpeed/Value 14 | @onready var wall_chance_value := $WallChance/Value 15 | @onready var wall_conversion_value := $WallConversion/Value 16 | @onready var floor_conversion_value := $FloorConversion/Value 17 | @onready var step_count_value := $StepCount/Value 18 | 19 | 20 | func _on_SliderStepSpeed_value_changed(value: float) -> void: 21 | step_time_value.text = "%s" % [value] 22 | step_time_changed.emit(value) 23 | 24 | 25 | func _on_SliderWallChance_value_changed(value) -> void: 26 | wall_chance_value.text = "%s" % [value] 27 | wall_chance_changed.emit(value) 28 | 29 | 30 | func _on_SliderWallConversion_value_changed(value: int) -> void: 31 | wall_conversion_value.text = "< %s" % [value] 32 | wall_conversion_changed.emit(value) 33 | 34 | 35 | func _on_SliderFloorConversion_value_changed(value: int) -> void: 36 | floor_conversion_value.text = "> %s" % [value] 37 | floor_conversion_changed.emit(value) 38 | 39 | 40 | func _on_SliderStepCount_value_changed(value) -> void: 41 | step_count_value.text = "%s" % [value] 42 | step_count_changed.emit(value) 43 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/02.CavernGenerator/tiles_basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/02.CavernGenerator/tiles_basic.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/02.CavernGenerator/tiles_basic.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ctwb56idh422a" 6 | path="res://.godot/imported/tiles_basic.png-c37d53ddad9ea99b63fdb526d9c92d4f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/02.CavernGenerator/tiles_basic.png" 14 | dest_files=["res://.godot/imported/tiles_basic.png-c37d53ddad9ea99b63fdb526d9c92d4f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/02.CavernGenerator/tileset_basic.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=4 format=3 uid="uid://cvfdg1ii7f6yx"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://cynfusrsk0wiv" path="res://CellularAutomata/02.CavernGenerator/tiles_basic.png" id="1"] 4 | 5 | [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_nyixi"] 6 | texture = ExtResource("1") 7 | margins = Vector2i(64, 0) 8 | texture_region_size = Vector2i(64, 64) 9 | 0:0/next_alternative_id = 8 10 | 0:0/0 = 0 11 | 12 | [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_cyifi"] 13 | texture = ExtResource("1") 14 | texture_region_size = Vector2i(64, 64) 15 | 0:0/next_alternative_id = 8 16 | 0:0/0 = 0 17 | 18 | [resource] 19 | tile_size = Vector2i(64, 64) 20 | sources/0 = SubResource("TileSetAtlasSource_nyixi") 21 | sources/1 = SubResource("TileSetAtlasSource_cyifi") 22 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/ButtonCameraSwitch.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | @export var camera_one_path : NodePath 4 | @export var camera_two_path : NodePath 5 | 6 | @onready var _camera_one: Camera2D = get_node(camera_one_path) 7 | @onready var _camera_two: Camera2D = get_node(camera_two_path) 8 | 9 | 10 | func _on_pressed(): 11 | if _camera_one.is_current(): 12 | _camera_two.make_current() 13 | else: 14 | _camera_one.make_current() 15 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/Miner.gd: -------------------------------------------------------------------------------- 1 | extends CharacterBody2D 2 | 3 | signal drill_used(dig_positions) 4 | 5 | @export var speed := 500 6 | 7 | const DRILL_RANGE := 100 8 | 9 | @onready var _pivot := $Pivot 10 | 11 | 12 | func _unhandled_input(event: InputEvent) -> void: 13 | if event.is_action_pressed("ui_accept"): 14 | var dig_positions := [] 15 | var angles_of_attack := [0, PI/6, -PI/6] 16 | for angle in angles_of_attack: 17 | dig_positions.append(global_position + Vector2.RIGHT.rotated(_pivot.rotation + angle) * DRILL_RANGE) 18 | drill_used.emit(dig_positions) 19 | 20 | 21 | func _physics_process(_delta: float) -> void: 22 | var direction := Vector2(Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left"), Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")).normalized() 23 | 24 | _pivot.look_at(global_position + direction) 25 | 26 | velocity = direction * speed 27 | move_and_slide() 28 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bgxdxc60wdey6" 6 | path="res://.godot/imported/drill-blade.png-de8a6cf1ae08c7269581da2473f9d019.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png" 14 | dest_files=["res://.godot/imported/drill-blade.png-de8a6cf1ae08c7269581da2473f9d019.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://conglyxmvaxgb" 6 | path="res://.godot/imported/drill-top.png-c73f71dd0dc6e52c50e2b8dd19ae575a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/drill-top.png" 14 | dest_files=["res://.godot/imported/drill-top.png-c73f71dd0dc6e52c50e2b8dd19ae575a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/miner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/03.DungeonGenerator/Miner/miner.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Miner/miner.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c5t4kv4e75gr4" 6 | path="res://.godot/imported/miner.png-6e8a50cec6c2a0656a1bfcf286916308.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/miner.png" 14 | dest_files=["res://.godot/imported/miner.png-6e8a50cec6c2a0656a1bfcf286916308.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/Exit.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | signal miner_entered 4 | 5 | 6 | func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape): 7 | miner_entered.emit() 8 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/Exit.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://6mc8wksgfkjv"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://kljk8s0n2oek" path="res://CellularAutomata/03.DungeonGenerator/Props/exit.png" id="1"] 4 | [ext_resource type="Script" path="res://CellularAutomata/03.DungeonGenerator/Props/Exit.gd" id="2"] 5 | 6 | [sub_resource type="RectangleShape2D" id="1"] 7 | size = Vector2(64, 64) 8 | 9 | [node name="Exit" type="Area2D"] 10 | collision_layer = 0 11 | monitoring = false 12 | monitorable = false 13 | script = ExtResource("2") 14 | 15 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 16 | shape = SubResource("1") 17 | 18 | [node name="Sprite2D" type="Sprite2D" parent="."] 19 | texture = ExtResource("1") 20 | 21 | [connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"] 22 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/Treasure.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | signal treasure_collected 4 | 5 | 6 | func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape): 7 | treasure_collected.emit() 8 | queue_free() 9 | 10 | 11 | # If treasure ever overlap, destroy them 12 | func _on_area_entered(area): 13 | queue_free() 14 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/Treasure.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://gfs65v4lsajh"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://hwahvfhugmxa" path="res://CellularAutomata/03.DungeonGenerator/Props/chest.png" id="1"] 4 | [ext_resource type="Script" path="res://CellularAutomata/03.DungeonGenerator/Props/Treasure.gd" id="2"] 5 | 6 | [sub_resource type="RectangleShape2D" id="1"] 7 | size = Vector2(64, 64) 8 | 9 | [node name="Treasure" type="Area2D" groups=["treasure"]] 10 | position = Vector2(-118.49, -118.49) 11 | collision_layer = 2 12 | collision_mask = 2 13 | script = ExtResource("2") 14 | 15 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 16 | position = Vector2(32, 32) 17 | shape = SubResource("1") 18 | 19 | [node name="Sprite2D" type="Sprite2D" parent="."] 20 | position = Vector2(32, 32) 21 | texture = ExtResource("1") 22 | 23 | [connection signal="area_entered" from="." to="." method="_on_area_entered"] 24 | [connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"] 25 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/03.DungeonGenerator/Props/chest.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/chest.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dkxma1xs1p07m" 6 | path="res://.godot/imported/chest.png-44cfea0735d31b7af6bc109aae4c8048.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/03.DungeonGenerator/Props/chest.png" 14 | dest_files=["res://.godot/imported/chest.png-44cfea0735d31b7af6bc109aae4c8048.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/03.DungeonGenerator/Props/exit.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/Props/exit.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c3x1bjri68gea" 6 | path="res://.godot/imported/exit.png-d1523b2b4a1e725e89824b5c40d6f2f0.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/03.DungeonGenerator/Props/exit.png" 14 | dest_files=["res://.godot/imported/exit.png-d1523b2b4a1e725e89824b5c40d6f2f0.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/tileset_mining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/CellularAutomata/03.DungeonGenerator/tileset_mining.png -------------------------------------------------------------------------------- /godot4/CellularAutomata/03.DungeonGenerator/tileset_mining.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cca4p3dnlkron" 6 | path="res://.godot/imported/tileset_mining.png-da97036bb2cde0cfbe008239cc0336dd.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://CellularAutomata/03.DungeonGenerator/tileset_mining.png" 14 | dest_files=["res://.godot/imported/tileset_mining.png-da97036bb2cde0cfbe008239cc0336dd.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/Common/assets-prototype.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dt0cqfdspvphx" 6 | path="res://.godot/imported/assets-prototype.svg-63ab5b9a554b14addf8bfc1fc8eff619.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Common/assets-prototype.svg" 14 | dest_files=["res://.godot/imported/assets-prototype.svg-63ab5b9a554b14addf8bfc1fc8eff619.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/Common/tileset-prototype.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=3 format=3 uid="uid://vsh1t5kh20en"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dt0cqfdspvphx" path="res://Common/assets-prototype.svg" id="1"] 4 | 5 | [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_075ro"] 6 | texture = ExtResource("1") 7 | texture_region_size = Vector2i(60, 60) 8 | 0:0/next_alternative_id = 8 9 | 0:0/0 = 0 10 | 0:0/1 = 1 11 | 0:0/1/flip_h = true 12 | 0:0/2 = 2 13 | 0:0/2/flip_v = true 14 | 0:0/3 = 3 15 | 0:0/3/flip_h = true 16 | 0:0/3/flip_v = true 17 | 0:0/4 = 4 18 | 0:0/4/transpose = true 19 | 0:0/5 = 5 20 | 0:0/5/flip_h = true 21 | 0:0/5/transpose = true 22 | 0:0/6 = 6 23 | 0:0/6/flip_v = true 24 | 0:0/6/transpose = true 25 | 0:0/7 = 7 26 | 0:0/7/flip_h = true 27 | 0:0/7/flip_v = true 28 | 0:0/7/transpose = true 29 | 30 | [resource] 31 | tile_size = Vector2i(60, 60) 32 | sources/0 = SubResource("TileSetAtlasSource_075ro") 33 | -------------------------------------------------------------------------------- /godot4/MSTDungeon/MSTDungeon.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://dj5pamcw527p5"] 2 | 3 | [ext_resource type="TileSet" uid="uid://vsh1t5kh20en" path="res://Common/tileset-prototype.tres" id="1"] 4 | [ext_resource type="Script" path="res://MSTDungeon/MSTDungeon.gd" id="2"] 5 | 6 | [node name="MSTDungeon" type="Node2D"] 7 | script = ExtResource("2") 8 | 9 | [node name="Camera2D" type="Camera2D" parent="."] 10 | zoom = Vector2(0.125, 0.125) 11 | 12 | [node name="Level" type="TileMap" parent="."] 13 | show_behind_parent = true 14 | tile_set = ExtResource("1") 15 | format = 2 16 | 17 | [node name="Rooms" type="Node2D" parent="."] 18 | -------------------------------------------------------------------------------- /godot4/MSTDungeon/Room.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://hebwin41t2f"] 2 | 3 | [ext_resource type="Script" path="res://MSTDungeon/Room.gd" id="1"] 4 | 5 | [sub_resource type="RectangleShape2D" id="1"] 6 | resource_local_to_scene = true 7 | 8 | [node name="Node3D" type="RigidBody2D"] 9 | gravity_scale = 0.0 10 | script = ExtResource("1") 11 | 12 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 13 | shape = SubResource("1") 14 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/FiringConfigurations/Cone3Configuration.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://b643i3ri61xab"] 2 | 3 | [ext_resource type="PackedScene" path="res://ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.tscn" id="1"] 4 | 5 | [node name="Cone3Configuration" type="Node2D"] 6 | 7 | [node name="WeaponLocation" parent="." instance=ExtResource("1")] 8 | position = Vector2(-15, -33.8697) 9 | rotation = -0.436332 10 | 11 | [node name="WeaponLocation2" parent="." instance=ExtResource("1")] 12 | position = Vector2(0, -44.0319) 13 | 14 | [node name="WeaponLocation3" parent="." instance=ExtResource("1")] 15 | position = Vector2(15, -33.8697) 16 | rotation = 0.436332 17 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/FiringConfigurations/Straight1Configuration.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://dios6atpm7cd5"] 2 | 3 | [ext_resource type="PackedScene" path="res://ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.tscn" id="1"] 4 | 5 | [node name="Straight1Configuration" type="Node2D"] 6 | 7 | [node name="WeaponLocation" parent="." instance=ExtResource("1")] 8 | position = Vector2(0, -40) 9 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/ModularWeaponsSystem.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://jdwk2wjgtj56"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/ModularWeapon.gd" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://dios6atpm7cd5" path="res://ModularWeapons/ModularWeapon/FiringConfigurations/Straight1Configuration.tscn" id="2"] 5 | [ext_resource type="PackedScene" uid="uid://dapwbytibyleq" path="res://ModularWeapons/ModularWeapon/Projectiles/BasicEmitter.tscn" id="3"] 6 | [ext_resource type="Resource" path="res://ModularWeapons/ModularWeapon/ProjectileMotions/StraightMotion.tres" id="4"] 7 | 8 | [node name="ModularWeaponsSystem" type="Node2D"] 9 | script = ExtResource("1") 10 | emitter_configuration = ExtResource("2") 11 | projectile_emitter = ExtResource("3") 12 | projectile_motions = Array[Resource]([ExtResource("4")]) 13 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/ProjectileEvents/ExplosionEvent.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="ExplosionEvent" load_steps=2 format=3 uid="uid://cskdbh5h0q7hu"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/ExplosionEvent.gd" id="1"] 4 | 5 | [resource] 6 | script = ExtResource("1") 7 | explosion_radius = 130.0 8 | explosion_damage = 30.0 9 | damage_scales_with_distances = true 10 | collision_mask = 10 11 | triggers_on_misses = false 12 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/ProjectileMotions/HomingMotion.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="HomingMotion" load_steps=2 format=3 uid="uid://ci0okhnevdi5r"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/HomingMotion.gd" id="1"] 4 | 5 | [resource] 6 | script = ExtResource("1") 7 | homing_radius = 250.0 8 | homing_strength = 0.275 9 | collision_mask = 2 10 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/ProjectileMotions/SineMotion.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="SineMotion" load_steps=2 format=3 uid="uid://cugqdrkcuqum2"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/SineMotion.gd" id="1"] 4 | 5 | [resource] 6 | script = ExtResource("1") 7 | amplitude = 100.0 8 | frequency = 2 9 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/ProjectileMotions/StraightMotion.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="StraightMotion" load_steps=2 format=3 uid="uid://dvkepprqpw5qw"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/StraightMotion.gd" id="1"] 4 | 5 | [resource] 6 | script = ExtResource("1") 7 | travel_speed = 650.0 8 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/Projectiles/BasicEmitter.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://dapwbytibyleq"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicEmitter.gd" id="1"] 4 | 5 | [node name="BasicEmitter" type="Node2D"] 6 | script = ExtResource("1") 7 | projectiles_per_second = 3.0 8 | projectile_lifetime = 0.85 9 | 10 | [node name="Timer" type="Timer" parent="."] 11 | one_shot = true 12 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/SpawnedObjects.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=3 uid="uid://daims3qtnr0av"] 2 | 3 | [node name="SpawnedObjects" type="Node2D" groups=["spawned_objects"]] 4 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends Marker2D 3 | 4 | 5 | func _draw() -> void: 6 | if Engine.is_editor_hint(): 7 | draw_line(Vector2.ZERO, Vector2.UP * 100, Color.STEEL_BLUE, 4) 8 | draw_line(Vector2(-15, -85), Vector2(15, -115), Color.RED, 4) 9 | draw_line(Vector2(-15, -115), Vector2(15, -85), Color.GREEN, 4) 10 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/ModularWeapon/src/FiringConfiguration/WeaponLocation.gd" type="Script" id=1] 4 | 5 | 6 | 7 | [node name="WeaponLocation" type="Marker2D"] 8 | script = ExtResource( 1 ) 9 | __meta__ = { 10 | "_gizmo_extents_": 30.0 11 | } 12 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicEmitter.gd: -------------------------------------------------------------------------------- 1 | extends ProjectileEmitter 2 | 3 | 4 | var projectile := preload("BasicProjectile.tscn") 5 | 6 | @onready var timer := $Timer 7 | 8 | 9 | func _physics_process(_delta: float) -> void: 10 | if Input.is_action_pressed("fire") and timer.is_stopped(): 11 | fire() 12 | timer.start(1.0 / projectiles_per_second) 13 | 14 | 15 | # Spawns and configures a basic projectile scene and connects to its signals. 16 | func _do_fire(_direction: Vector2, _motions: Array, _lifetime: float) -> void: 17 | if not spawned_objects: 18 | return 19 | 20 | var new_projectile := projectile.instantiate() 21 | new_projectile.setup(global_position, _direction, _motions, _lifetime) 22 | spawned_objects.add_child(new_projectile) 23 | 24 | new_projectile.connect("collided", _on_projectile_collided) 25 | new_projectile.connect("missed", _on_projectile_missed) 26 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicProjectile.gd: -------------------------------------------------------------------------------- 1 | extends Projectile 2 | 3 | @onready var timer: Timer = $Timer 4 | 5 | 6 | # Called after the base _setup to allow for specialized configuration. 7 | func _post_setup() -> void: 8 | if not is_inside_tree(): 9 | await ready 10 | timer.start(lifetime) 11 | 12 | 13 | func _physics_process(delta: float) -> void: 14 | var movement := _update_movement(delta) 15 | 16 | var collision : KinematicCollision2D= move_and_collide(movement) 17 | 18 | if collision: 19 | collided.emit(collision.get_collider(), collision.get_position()) 20 | _impact() 21 | 22 | 23 | func _on_Timer_timeout() -> void: 24 | _miss() 25 | 26 | 27 | # What the projectile does after it has hit a valid target. 28 | # Flares up in size and fades out. 29 | func _impact() -> void: 30 | set_physics_process(false) 31 | var tween = create_tween() 32 | tween.tween_property(self, "modulate", modulate * 3, 0.1).set_trans(Tween.TRANS_CUBIC) 33 | tween.tween_property(self, "modulate", Color.TRANSPARENT, 0.1).set_delay(0.1) 34 | tween.tween_callback(queue_free) 35 | 36 | 37 | # What the projectile does after it has not hit any target. 38 | # Shrinks and fades out 39 | func _miss() -> void: 40 | missed.emit(global_position) 41 | collision_layer = 0 42 | collision_mask = 0 43 | var tween = create_tween() 44 | tween.tween_property(self, "scale", Vector2.ZERO, 0.25) 45 | tween.tween_callback(queue_free) 46 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicProjectile.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://d1c7v5imr67s6"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/BasicProjectile.gd" id="2"] 4 | [ext_resource type="Texture2D" uid="uid://brn1s6mrsjp8x" path="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/white_circle.svg" id="3"] 5 | 6 | [sub_resource type="CircleShape2D" id="1"] 7 | radius = 5.0 8 | 9 | [node name="Projectile" type="CharacterBody2D"] 10 | collision_layer = 4 11 | collision_mask = 2 12 | script = ExtResource("2") 13 | 14 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 15 | shape = SubResource("1") 16 | 17 | [node name="Sprite2D" type="Sprite2D" parent="."] 18 | modulate = Color(1.37647, 0.550031, 0.101961, 1) 19 | scale = Vector2(0.5, 0.5) 20 | texture = ExtResource("3") 21 | 22 | [node name="Timer" type="Timer" parent="."] 23 | one_shot = true 24 | 25 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 26 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Basic/white_circle.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dx45ilemf8t5c" 6 | path="res://.godot/imported/white_circle.svg-92d22f22d631d792a11832b12e624001.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ModularWeapons/ModularWeapon/src/Projectile/Basic/white_circle.svg" 14 | dest_files=["res://.godot/imported/white_circle.svg-92d22f22d631d792a11832b12e624001.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Laser/CastingParticles.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ParticleProcessMaterial" load_steps=5 format=3 uid="uid://hgugamkrjpg5"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_2wp5c"] 4 | offsets = PackedFloat32Array(0.581818, 1) 5 | colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) 6 | 7 | [sub_resource type="GradientTexture1D" id="GradientTexture1D_7kv77"] 8 | gradient = SubResource("Gradient_2wp5c") 9 | use_hdr = true 10 | 11 | [sub_resource type="Curve" id="3"] 12 | _data = [Vector2(0.518072, 1), 0.0, -3.53434, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] 13 | point_count = 2 14 | 15 | [sub_resource type="CurveTexture" id="4"] 16 | curve = SubResource("3") 17 | 18 | [resource] 19 | particle_flag_disable_z = true 20 | direction = Vector3(0, -1, 0) 21 | gravity = Vector3(0, 0, 0) 22 | initial_velocity_min = 100.0 23 | initial_velocity_max = 100.0 24 | orbit_velocity_min = 0.0 25 | orbit_velocity_max = 0.0 26 | scale_min = 0.5 27 | scale_max = 0.5 28 | scale_curve = SubResource("4") 29 | color_ramp = SubResource("GradientTexture1D_7kv77") 30 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Laser/ImpactParticles.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ParticleProcessMaterial" load_steps=5 format=3 uid="uid://dni4dt5lfv8jn"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_ku676"] 4 | offsets = PackedFloat32Array(0.583, 1) 5 | colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) 6 | 7 | [sub_resource type="GradientTexture1D" id="GradientTexture1D_xggp2"] 8 | gradient = SubResource("Gradient_ku676") 9 | use_hdr = true 10 | 11 | [sub_resource type="Curve" id="3"] 12 | _data = [Vector2(0.518072, 1), 0.0, -3.53434, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] 13 | point_count = 2 14 | 15 | [sub_resource type="CurveTexture" id="4"] 16 | curve = SubResource("3") 17 | 18 | [resource] 19 | particle_flag_disable_z = true 20 | spread = 50.0 21 | gravity = Vector3(0, 0, 0) 22 | initial_velocity_min = 300.0 23 | initial_velocity_max = 300.0 24 | orbit_velocity_min = 0.0 25 | orbit_velocity_max = 0.0 26 | scale_min = 0.5 27 | scale_max = 0.5 28 | scale_curve = SubResource("4") 29 | color_ramp = SubResource("GradientTexture1D_xggp2") 30 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Laser/LaserTracer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://cuywmrsrrocdk"] 2 | 3 | [ext_resource type="Script" path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/LaserTracer.gd" id="2"] 4 | [ext_resource type="Material" uid="uid://dni4dt5lfv8jn" path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/ImpactParticles.tres" id="3"] 5 | [ext_resource type="Texture2D" uid="uid://bjac1usritmo0" path="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png" id="4"] 6 | 7 | [sub_resource type="CircleShape2D" id="1"] 8 | radius = 5.0 9 | 10 | [sub_resource type="GDScript" id="2"] 11 | script/source = "extends GPUParticles2D 12 | 13 | 14 | func _ready() -> void: 15 | set_as_top_level(true) 16 | " 17 | 18 | [node name="LaserTracer" type="CharacterBody2D"] 19 | collision_layer = 4 20 | collision_mask = 2 21 | script = ExtResource("2") 22 | 23 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 24 | shape = SubResource("1") 25 | 26 | [node name="ImpactParticles" type="GPUParticles2D" parent="."] 27 | modulate = Color(1.44, 0.75, 0.2, 1) 28 | emitting = false 29 | amount = 16 30 | process_material = ExtResource("3") 31 | texture = ExtResource("4") 32 | lifetime = 0.3 33 | visibility_rect = Rect2(-2500, -2500, 5000, 5000) 34 | script = SubResource("2") 35 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cyfp8v3f52q7l" 6 | path="res://.godot/imported/glowing_circle.png-98f59b10001a2f55c1125f5d4b5a794e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ModularWeapons/ModularWeapon/src/Projectile/Laser/glowing_circle.png" 14 | dest_files=["res://.godot/imported/glowing_circle.png-98f59b10001a2f55c1125f5d4b5a794e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/Explosion.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | @onready var player := $AnimationPlayer 4 | @onready var area := $Area2D 5 | @onready var shape: CircleShape2D = $Area2D/CollisionShape2D.shape 6 | 7 | 8 | # Plays the explosion animation and cleans up 9 | func trigger() -> void: 10 | player.play("Explode") 11 | await player.animation_finished 12 | queue_free() 13 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/ExplosionEvent.gd: -------------------------------------------------------------------------------- 1 | class_name ExplosionEvent 2 | extends ProjectileEvent 3 | 4 | @export var explosion_radius := 130.0 5 | @export var explosion_damage := 30.0 6 | @export var damage_scales_with_distances := true 7 | @export_flags_2d_physics var collision_mask: int 8 | 9 | var explosion_effect := preload("Explosion.tscn") 10 | 11 | 12 | # Spawns a new explosion, positions it and triggers its animation. 13 | # Causes damage based on proximity to the explosion. 14 | # @tags - virtual 15 | func _do_trigger(_spawn_location: Vector2, _spawn_parent: Node, _weapons_system, _missed: bool) -> void: 16 | var explosion := explosion_effect.instantiate() 17 | 18 | explosion.position = _spawn_location 19 | 20 | _spawn_parent.add_child(explosion) 21 | explosion.shape.radius = explosion_radius 22 | explosion.area.collision_mask = collision_mask 23 | 24 | explosion.trigger() 25 | 26 | await explosion.get_tree().physics_frame 27 | 28 | var bodies: Array = explosion.area.get_overlapping_bodies() 29 | for body in bodies: 30 | var distance: float = body.global_position.distance_to(explosion.global_position) 31 | 32 | var damage := explosion_damage 33 | if damage_scales_with_distances: 34 | damage *= clamp(1.0 - distance / explosion_radius, 0, 1) 35 | 36 | _weapons_system.damaged.emit(body, damage) 37 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/explosion_gradient.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture1D" load_steps=2 format=3 uid="uid://drup2wlyypukb"] 2 | 3 | [sub_resource type="Gradient" id="1"] 4 | offsets = PackedFloat32Array(0, 0.256158, 0.596059, 0.842365, 1) 5 | colors = PackedColorArray(0.831373, 0.219608, 0.219608, 0, 0.831373, 0.219608, 0.219608, 1, 0.980392, 0.419608, 0.211765, 1, 1, 0.788235, 0.309804, 1, 1, 1, 1, 1) 6 | 7 | [resource] 8 | gradient = SubResource("1") 9 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/explosion_gradient_2.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture1D" load_steps=2 format=3 uid="uid://c01e3qaagenf3"] 2 | 3 | [sub_resource type="Gradient" id="1"] 4 | offsets = PackedFloat32Array(0, 0.0945455, 0.181818, 0.389091, 0.570909, 0.865455) 5 | colors = PackedColorArray(0.976471, 0.878431, 0.705882, 0, 0.97568, 0.84943, 0.605487, 1, 0.972656, 0.754792, 0.26258, 1, 1, 0.45265, 0.155894, 1, 0.831373, 0.219608, 0.219608, 1, 0.258824, 0.25098, 0.25098, 1) 6 | 7 | [resource] 8 | gradient = SubResource("1") 9 | width = 2048 10 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bcvnt8df40x63" 6 | path="res://.godot/imported/puff.png-6910228130a45f56ce0d6387a09c4d74.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff.png" 14 | dest_files=["res://.godot/imported/puff.png-6910228130a45f56ce0d6387a09c4d74.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bqyedej4owyqc" 6 | path="res://.godot/imported/puff_smooth.png-835ddf23b782e80c28b584266fb7775a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/puff_smooth.png" 14 | dest_files=["res://.godot/imported/puff_smooth.png-835ddf23b782e80c28b584266fb7775a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/scraps_gradient.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture1D" load_steps=2 format=3 uid="uid://bx8w803w85wc0"] 2 | 3 | [sub_resource type="Gradient" id="1"] 4 | offsets = PackedFloat32Array(0, 0.155894, 0.505017, 0.8327, 1) 5 | colors = PackedColorArray(0.258824, 0.25098, 0.25098, 1, 0.722656, 0.118153, 0.118153, 1, 0.855469, 0.323879, 0.126857, 1, 1, 0.788235, 0.309804, 0.717647, 1, 1, 1, 0) 6 | 7 | [resource] 8 | gradient = SubResource("1") 9 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b8i5hucega02d" 6 | path="res://.godot/imported/sparkle.png-c023181495e3d5cc15f93f9f798220f3.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ModularWeapons/ModularWeapon/src/ProjectileEvents/Events/ExplosionEvent/sparkle.png" 14 | dest_files=["res://.godot/imported/sparkle.png-c023181495e3d5cc15f93f9f798220f3.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileEvents/ProjectileEvent.gd: -------------------------------------------------------------------------------- 1 | # A base class that defines an event for when a projectile hits and/or misses. 2 | # The `trigger()` function is provided and filters out misses from events that 3 | # do not trigger on miss. It calls `_do_trigger()`, which is the specialized 4 | # implementation of the event. Like spawning an explosion, or a new, temporary 5 | # projectile emitter. 6 | # @tags - abstract 7 | class_name ProjectileEvent 8 | extends Resource 9 | 10 | 11 | @export var triggers_on_misses := false 12 | 13 | 14 | # Base function for triggering an impact event. Will check if it should or 15 | # shouldn't trigger on miss and only call the virtual `_do_trigger` on a match. 16 | func trigger(_spawn_location: Vector2, _spawn_parent: Node, _weapons_system, _missed: bool) -> void: 17 | if _missed and not triggers_on_misses: 18 | return 19 | 20 | _do_trigger(_spawn_location, _spawn_parent, _weapons_system, _missed) 21 | 22 | 23 | # Virtual implementation specific call for triggering an impact event. 24 | # @tags - virtual 25 | func _do_trigger(_spawn_location: Vector2, _spawn_parent: Node, _weapons_system, _missed: bool) -> void: 26 | pass 27 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/SineMotion.gd: -------------------------------------------------------------------------------- 1 | class_name SineMotion 2 | extends ProjectileMotion 3 | 4 | # Amplitude of the sine wave in pixels relative to the emission point. 5 | @export var amplitude := 100.0 6 | # Number of waves the sine draws per second. 7 | @export var frequency := 2 8 | 9 | var elapsed_time := 0.0 10 | 11 | 12 | # Moves the projectile perpendicular to its travel direction in a sine wave 13 | # pattern. 14 | # @tags - virtual 15 | func _update_movement(direction: Vector2, delta: float) -> Vector2: 16 | elapsed_time += delta 17 | 18 | var wobble_amount := amplitude * sin(elapsed_time * frequency * PI) * frequency 19 | 20 | var travel_direction := Vector2(-direction.y, direction.x) 21 | return travel_direction * wobble_amount * delta 22 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileMotion/Motions/StraightMotion.gd: -------------------------------------------------------------------------------- 1 | class_name StraightMotion 2 | extends ProjectileMotion 3 | 4 | # Speed at which the projectile travels. 5 | @export var travel_speed := 300.0 6 | 7 | 8 | # Moves in a straight line by the projectile's speed 9 | # @tags - virtual 10 | func _update_movement(direction: Vector2, delta: float) -> Vector2: 11 | return direction * travel_speed * delta 12 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/ModularWeapon/src/ProjectileMotion/ProjectileMotion.gd: -------------------------------------------------------------------------------- 1 | # Base class to represent a projectile's motion. The projectile's position 2 | # and/or orientation can be updated inside of `_update_movement`, or it can 3 | # be used just to provide a movement vector. 4 | # @tags - abstract 5 | class_name ProjectileMotion 6 | extends Resource 7 | 8 | var projectile: Projectile 9 | 10 | 11 | # Method to override to define the projectile's motion. 12 | # @tags - virtual 13 | func _update_movement(_direction: Vector2, _delta: float) -> Vector2: 14 | return Vector2.ZERO 15 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/PlayerShip/PlayerShip.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://se32spj17ca2"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://gx8c5ofe4qwu" path="res://ModularWeapons/PlayerShip/topdown-player.svg" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://jdwk2wjgtj56" path="res://ModularWeapons/ModularWeapon/ModularWeaponsSystem.tscn" id="2"] 5 | [ext_resource type="Script" path="res://ModularWeapons/PlayerShip/PlayerShip.gd" id="4"] 6 | 7 | [node name="PlayerShip" type="CharacterBody2D"] 8 | script = ExtResource("4") 9 | 10 | [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 11 | polygon = PackedVector2Array(0, -40, -15, -30, -40, 30, -20, 40, 0, 30, 20, 40, 40, 25, 15, -30) 12 | 13 | [node name="Sprite2D" type="Sprite2D" parent="."] 14 | position = Vector2(0, -0.142395) 15 | texture = ExtResource("1") 16 | 17 | [node name="ModularWeaponsSystem" parent="." instance=ExtResource("2")] 18 | -------------------------------------------------------------------------------- /godot4/ModularWeapons/PlayerShip/topdown-player.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cnb8tgxlclxxk" 6 | path="res://.godot/imported/topdown-player.svg-183557eaf015028958738f745721d42b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ModularWeapons/PlayerShip/topdown-player.svg" 14 | dest_files=["res://.godot/imported/topdown-player.svg-183557eaf015028958738f745721d42b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Actors/Actor.gd: -------------------------------------------------------------------------------- 1 | extends CharacterBody2D 2 | 3 | const FLOOR_NORMAL: = Vector2.UP 4 | 5 | @export var speed: = Vector2(400.0, 1000.0) 6 | @export var gravity: = 3500.0 7 | 8 | func _ready(): 9 | velocity = Vector2.ZERO 10 | 11 | func _physics_process(delta: float) -> void: 12 | velocity.y += gravity * delta 13 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Actors/Enemy.gd: -------------------------------------------------------------------------------- 1 | extends "Actor.gd" 2 | 3 | 4 | var _inital_speed: float = 300.0 5 | var _direction: float = 1.0 6 | 7 | @onready var visibility_enabler: VisibleOnScreenEnabler2D = $VisibleOnScreenEnabler2D 8 | 9 | 10 | func _ready() -> void: 11 | visibility_enabler.screen_entered.connect(set_physics_process.bind(true)) 12 | visibility_enabler.screen_exited.connect(set_physics_process.bind(false)) 13 | set_physics_process(false) 14 | velocity.x = _inital_speed 15 | velocity.y = 0.0 16 | 17 | 18 | func _physics_process(_delta: float) -> void: 19 | if is_on_wall(): 20 | _direction *= -1 21 | velocity.x = _inital_speed * _direction 22 | if not is_on_floor(): 23 | velocity.y += 3500 * _delta 24 | 25 | move_and_slide() 26 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Actors/Enemy.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://bvbk1abn8b804"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://cqv8s40eawu7i" path="res://RandomWalker/Levels/tiles.svg" id="1"] 4 | [ext_resource type="Script" path="res://RandomWalker/Actors/Enemy.gd" id="2"] 5 | 6 | [sub_resource type="CapsuleShape2D" id="1"] 7 | custom_solver_bias = 0.1 8 | radius = 15.0 9 | 10 | [node name="Enemy" type="CharacterBody2D" groups=["enemy"]] 11 | process_mode = 1 12 | collision_layer = 2 13 | script = ExtResource("2") 14 | speed = Vector2(300, 1000) 15 | 16 | [node name="Sprite2D" type="Sprite2D" parent="."] 17 | texture = ExtResource("1") 18 | offset = Vector2(0, -15) 19 | region_enabled = true 20 | region_rect = Rect2(331, 270, 28, 30) 21 | 22 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 23 | position = Vector2(0, -15) 24 | shape = SubResource("1") 25 | 26 | [node name="VisibleOnScreenEnabler2D" type="VisibleOnScreenEnabler2D" parent="."] 27 | position = Vector2(0, -15) 28 | rect = Rect2(-15, -15, 30, 30) 29 | enable_mode = 1 30 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Actors/Player.gd: -------------------------------------------------------------------------------- 1 | extends "Actor.gd" 2 | 3 | 4 | const TIME_DEATH := 0.2 5 | 6 | @onready var danger_detector: Area2D = $DangerDetector 7 | 8 | 9 | func _on_DangerDetector_body_entered(_body: Node) -> void: 10 | set_physics_process(false) 11 | var tween = create_tween() 12 | tween.tween_property(self, "scale", Vector2.ZERO, TIME_DEATH) 13 | tween.tween_callback(queue_free) 14 | 15 | 16 | func _physics_process(_delta: float) -> void: 17 | if not is_on_floor(): 18 | velocity.y += 3500 * _delta 19 | 20 | if Input.is_action_just_pressed("jump") and is_on_floor(): 21 | velocity.y = -speed.y 22 | 23 | var direction = Input.get_axis("move_left", "move_right") 24 | if direction: 25 | velocity.x = direction * speed.x 26 | else: 27 | velocity.x = move_toward(velocity.x, 0, speed.x) 28 | move_and_slide() 29 | 30 | if Input.is_action_just_pressed("ui_cancel"): 31 | get_tree().quit() 32 | 33 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Actors/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://bvew0uroh2hcu"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://bv5ogdkv48xuk" path="res://RandomWalker/Levels/tiles.svg" id="1"] 4 | [ext_resource type="Script" path="res://RandomWalker/Actors/Player.gd" id="2"] 5 | 6 | [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_mbl4j"] 7 | radius = 12.0 8 | height = 60.0 9 | 10 | [sub_resource type="CapsuleShape2D" id="2"] 11 | radius = 15.0 12 | height = 55.0 13 | 14 | [node name="Player" type="CharacterBody2D" groups=["player"]] 15 | collision_layer = 0 16 | script = ExtResource("2") 17 | 18 | [node name="Sprite2D" type="Sprite2D" parent="."] 19 | texture = ExtResource("1") 20 | offset = Vector2(0, -30) 21 | region_enabled = true 22 | region_rect = Rect2(300, 240, 30, 60) 23 | 24 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 25 | position = Vector2(0, -30) 26 | shape = SubResource("CapsuleShape2D_mbl4j") 27 | 28 | [node name="DangerDetector" type="Area2D" parent="."] 29 | collision_layer = 0 30 | collision_mask = 2 31 | 32 | [node name="CollisionShape2D" type="CollisionShape2D" parent="DangerDetector"] 33 | position = Vector2(0, -30) 34 | shape = SubResource("2") 35 | 36 | [node name="RemoteTransform2D" type="RemoteTransform2D" parent="."] 37 | 38 | [connection signal="body_entered" from="DangerDetector" to="." method="_on_DangerDetector_body_entered"] 39 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Camera2D.gd: -------------------------------------------------------------------------------- 1 | extends Camera2D 2 | 3 | 4 | signal zoom_changed(zoom: float) 5 | 6 | const LIMIT_DEFAULT := 10000000 7 | const TIME_START := 0.8 8 | const TIME_TWEEN := 1.0 9 | const TARGET_ZOOM := Vector2.ONE 10 | 11 | var _direction := Vector2.ZERO 12 | var _resolution := Vector2.ZERO 13 | 14 | 15 | func _on_LevelGenerator_level_completed(player_position: Vector2) -> void: 16 | await get_tree().create_timer(TIME_START).timeout 17 | var tween = create_tween() 18 | tween.tween_property(self, "zoom", TARGET_ZOOM, TIME_TWEEN).set_delay(0.2) 19 | tween.parallel().tween_method(_on_Tween_tween_step, zoom, TARGET_ZOOM,TIME_TWEEN) 20 | tween.parallel().tween_property(self, "position", player_position, TIME_TWEEN).set_trans(Tween.TRANS_QUAD) 21 | tween.connect("finished", get_parent()._on_Tween_tween_all_completed) 22 | 23 | 24 | func _on_Tween_tween_step(zoom: Vector2) -> void: 25 | zoom_changed.emit(zoom) 26 | 27 | 28 | func setup(resolution: Vector2, world_size: Vector2) -> void: 29 | _resolution = resolution 30 | limit_left = -LIMIT_DEFAULT 31 | limit_top = -LIMIT_DEFAULT 32 | limit_right = LIMIT_DEFAULT 33 | limit_bottom = LIMIT_DEFAULT 34 | 35 | position = world_size / 2 36 | var ratio := world_size / resolution 37 | var zoom_max := 1 / ceilf(maxf(ratio.x, ratio.y) + 1) 38 | zoom = zoom_max * Vector2.ONE 39 | zoom_changed.emit(zoom) 40 | 41 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Levels/Level.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | var _player: CharacterBody2D = null 5 | 6 | @onready var extra: Node2D = $Extra 7 | 8 | 9 | func _ready() -> void: 10 | for n in extra.get_children(): 11 | if n.is_in_group("player"): 12 | _player = n 13 | elif n.is_in_group("enemy"): 14 | n.visibility_enabler.connect("screen_entered",Callable(self,"_on_Enemy_screen_enetered").bind(n)) 15 | 16 | # this func is currently not used an may be removed 17 | func _on_Enemy_screen_enetered(enemy: Node2D) -> void: 18 | pass 19 | # enemy.direction .velocity.x = sign((_player.position - enemy.position).x) * enemy.speed.x 20 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Levels/Level.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://b6dyithfkwp8q"] 2 | 3 | [ext_resource type="Script" path="res://RandomWalker/Levels/Level.gd" id="2"] 4 | [ext_resource type="TileSet" uid="uid://cd00vubx3rfc7" path="res://RandomWalker/Levels/tileset.tres" id="2_csqdq"] 5 | 6 | [node name="Level" type="Node2D"] 7 | script = ExtResource("2") 8 | 9 | [node name="TileMapMain" type="TileMap" parent="."] 10 | tile_set = ExtResource("2_csqdq") 11 | format = 2 12 | 13 | [node name="TileMapDanger" type="TileMap" parent="."] 14 | tile_set = ExtResource("2_csqdq") 15 | format = 2 16 | 17 | [node name="Extra" type="Node2D" parent="."] 18 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Levels/background-gradient.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cfrb75bpw4epe" 6 | path="res://.godot/imported/background-gradient.svg-8dc41d2b2b1fb3ab56fe634a99cc78f1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://RandomWalker/Levels/background-gradient.svg" 14 | dest_files=["res://.godot/imported/background-gradient.svg-8dc41d2b2b1fb3ab56fe634a99cc78f1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Levels/background-hills.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c6wokvkr46cbh" 6 | path="res://.godot/imported/background-hills.svg-85273ce5f22bf0708f362e62a9911261.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://RandomWalker/Levels/background-hills.svg" 14 | dest_files=["res://.godot/imported/background-hills.svg-85273ce5f22bf0708f362e62a9911261.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Levels/background-trees.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c82vnjhqgpcos" 6 | path="res://.godot/imported/background-trees.svg-a4815e15603624fb0031ceeff10ecdaf.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://RandomWalker/Levels/background-trees.svg" 14 | dest_files=["res://.godot/imported/background-trees.svg-a4815e15603624fb0031ceeff10ecdaf.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Levels/tiles.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cqv8s40eawu7i" 6 | path="res://.godot/imported/tiles.svg-fc8b5267736bff16ee28b8d30801e87c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://RandomWalker/Levels/tiles.svg" 14 | dest_files=["res://.godot/imported/tiles.svg-fc8b5267736bff16ee28b8d30801e87c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/RandomWalker/Rooms.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | enum Type { SIDE, LR, LRB, LRT, LRTB } 5 | enum Cell { GROUND, VEGETATION, SPIKES, MAYBE_GROUND, MAYBE_BUSH, MAYBE_TREE, MAYBE_SPIKES } 6 | 7 | const BOTTOM_OPENED := [Type.LRB, Type.LRTB] 8 | const BOTTOM_CLOSED := [Type.LR, Type.LRT] 9 | 10 | var room_size := Vector2.ZERO 11 | var cell_size := Vector2.ZERO 12 | 13 | var _rng := RandomNumberGenerator.new() 14 | 15 | 16 | func _notification(what: int) -> void: 17 | if what == Node.NOTIFICATION_SCENE_INSTANTIATED: 18 | _rng.randomize() 19 | 20 | var room: TileMap = $Side.get_child(0) 21 | room_size = room.get_used_rect().size 22 | cell_size = room.tile_set.tile_size 23 | 24 | 25 | func get_room_data(type: int) -> Dictionary: 26 | var group: Node2D = get_child(type) 27 | var index := _rng.randi_range(0, group.get_child_count() - 1) 28 | var room: TileMap = group.get_child(index) 29 | 30 | var data := {"objects": [], "tilemap": []} 31 | for object in room.get_children(): 32 | data.objects.push_back(object) 33 | 34 | for v in room.get_used_cells(0): 35 | var cell_data = room.get_cell_tile_data(0,v) 36 | var chance: float = cell_data.get_custom_data("chance") 37 | var target_id: int = cell_data.get_custom_data("target_id") 38 | var cell_source_id : int = room.get_cell_source_id(0,v) 39 | var atlas_coords : Vector2i = room.get_cell_atlas_coords(0,v) 40 | if _rng.randf() > chance: 41 | continue 42 | data.tilemap.push_back({ 43 | "offset": v, 44 | "cell": cell_source_id, 45 | "atlas_coords": atlas_coords, 46 | "target_id": target_id 47 | }) 48 | return data 49 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/BlueNoiseWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://cocufxhvdr5dm"] 2 | 3 | [ext_resource type="Script" path="res://SpaceInfiniteGeneration/BlueNoiseWorldGenerator.gd" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://bo16yl58lvfnr" path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" id="2"] 5 | [ext_resource type="PackedScene" uid="uid://1nbvdtr0s2lj" path="res://SpaceInfiniteGeneration/Shared/Asteroid.tscn" id="3"] 6 | [ext_resource type="PackedScene" uid="uid://dropctlxnbvds" path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" id="4"] 7 | 8 | [node name="BlueNoiseWorldGenerator" type="Node2D"] 9 | script = ExtResource("1") 10 | Asteroid = ExtResource("3") 11 | start_seed = "blue_noise_generation" 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchors_preset = 15 18 | anchor_right = 1.0 19 | anchor_bottom = 1.0 20 | mouse_filter = 2 21 | color = Color(0.0666667, 0.133333, 0.333333, 1) 22 | 23 | [node name="Player" parent="." instance=ExtResource("2")] 24 | 25 | [node name="GridDrawer" parent="." instance=ExtResource("4")] 26 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/LayeredWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://birtg3kksvfe8"] 2 | 3 | [ext_resource type="Script" path="res://SpaceInfiniteGeneration/LayeredWorldGenerator.gd" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://bo16yl58lvfnr" path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" id="2"] 5 | [ext_resource type="PackedScene" uid="uid://dropctlxnbvds" path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" id="3"] 6 | 7 | [node name="LayeredWorldGenerator" type="Node2D"] 8 | script = ExtResource("1") 9 | show_debug = true 10 | sector_axis_count = 16 11 | start_seed = "layered_generation" 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchors_preset = 15 18 | anchor_right = 1.0 19 | anchor_bottom = 1.0 20 | mouse_filter = 2 21 | color = Color(0.0666667, 0.133333, 0.333333, 1) 22 | 23 | [node name="Player" parent="." instance=ExtResource("2")] 24 | speed_max = 1350.0 25 | 26 | [node name="Camera2D" parent="Player" index="2"] 27 | zoom = Vector2(0.1, 0.1) 28 | 29 | [node name="GridDrawer" parent="." instance=ExtResource("3")] 30 | 31 | [editable path="Player"] 32 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/PersistentWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://6erjb4mfmrdk"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://bo16yl58lvfnr" path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" id="1"] 4 | [ext_resource type="Script" path="res://SpaceInfiniteGeneration/PersistentWorldGenerator.gd" id="2"] 5 | [ext_resource type="PackedScene" uid="uid://dropctlxnbvds" path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" id="3"] 6 | 7 | [node name="PersistentWorldGenerator" type="Node2D"] 8 | script = ExtResource("2") 9 | show_debug = true 10 | sector_axis_count = 16 11 | start_seed = "persistent_world" 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchors_preset = 15 18 | anchor_right = 1.0 19 | anchor_bottom = 1.0 20 | mouse_filter = 2 21 | color = Color(0.0666667, 0.133333, 0.333333, 1) 22 | 23 | [node name="Player" parent="." instance=ExtResource("1")] 24 | speed_max = 1350.0 25 | 26 | [node name="Camera2D" parent="Player" index="2"] 27 | zoom = Vector2(0.1, 0.1) 28 | 29 | [node name="GridDrawer" parent="." instance=ExtResource("3")] 30 | 31 | [editable path="Player"] 32 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/Asteroid.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://1nbvdtr0s2lj"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://bcvow5i81v5eg" path="res://SpaceInfiniteGeneration/Shared/asteroid-round.svg" id="1"] 4 | 5 | [sub_resource type="CircleShape2D" id="1"] 6 | radius = 113.5 7 | 8 | [node name="Asteroid" type="StaticBody2D" groups=["asteroids"]] 9 | scale = Vector2(0.5, 0.5) 10 | 11 | [node name="Sprite2D" type="Sprite2D" parent="."] 12 | texture = ExtResource("1") 13 | 14 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 15 | shape = SubResource("1") 16 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/GridDrawer.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | var cell_size: float 4 | var grid_origin: Vector2 5 | var cell_count: int 6 | 7 | 8 | func _draw() -> void: 9 | if cell_size == 0: 10 | return 11 | 12 | var position_origin := grid_origin * cell_size 13 | 14 | var half_cell_count := int(cell_count / 2.0) 15 | var half_cell_size := cell_size/2.0 16 | 17 | for x in range(-half_cell_count, half_cell_count): 18 | for y in range(-half_cell_count, half_cell_count): 19 | var cell_rect := Rect2( 20 | Vector2( 21 | position_origin.x + x * cell_size - half_cell_size, 22 | position_origin.y + y * cell_size - half_cell_size 23 | ), 24 | Vector2(cell_size, cell_size) 25 | ) 26 | 27 | draw_rect(cell_rect, Color.SKY_BLUE, false) 28 | 29 | 30 | func setup(size: float, count: int) -> void: 31 | cell_size = size 32 | cell_count = count 33 | 34 | queue_redraw() 35 | 36 | 37 | func move_grid_to(origin: Vector2) -> void: 38 | grid_origin = origin 39 | queue_redraw() 40 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/GridDrawer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://dropctlxnbvds"] 2 | 3 | [ext_resource type="Script" path="res://SpaceInfiniteGeneration/Shared/GridDrawer.gd" id="1"] 4 | 5 | [node name="GridDrawer" type="Node2D"] 6 | script = ExtResource("1") 7 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/Player/Player.gd: -------------------------------------------------------------------------------- 1 | extends CharacterBody2D 2 | 3 | @export var speed_max := 675.0 4 | @export var acceleration := 1500.0 5 | @export var angular_speed_max := deg_to_rad(150) 6 | @export var angular_acceleration := deg_to_rad(1200) 7 | @export var drag_factor := 0.05 8 | @export var angular_drag_factor := 0.1 9 | 10 | @onready var angular_velocity : float = 0.0 11 | 12 | 13 | func _physics_process(delta: float) -> void: 14 | velocity = velocity.limit_length(speed_max) 15 | 16 | angular_velocity = clamp(angular_velocity, -angular_speed_max, angular_speed_max) 17 | angular_velocity = lerp(angular_velocity, 0.0, angular_drag_factor) 18 | 19 | move_and_slide() 20 | rotation += angular_velocity * delta 21 | 22 | var movement := _get_movement() 23 | 24 | if is_equal_approx(movement.y, 0): 25 | velocity = (velocity.lerp(Vector2.ZERO, drag_factor)) 26 | 27 | var direction := Vector2.UP.rotated(rotation) 28 | 29 | velocity += movement.y * direction * acceleration * delta 30 | angular_velocity += movement.x * angular_acceleration * delta 31 | 32 | 33 | func _get_movement() -> Vector2: 34 | return Vector2( 35 | Input.get_action_strength("move_right") - Input.get_action_strength("move_left"), 36 | Input.get_action_strength("forwards") - Input.get_action_strength("back") 37 | ) 38 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/Player/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://bo16yl58lvfnr"] 2 | 3 | [ext_resource type="Script" path="res://SpaceInfiniteGeneration/Shared/Player/Player.gd" id="1"] 4 | [ext_resource type="Texture2D" uid="uid://t2pdwfdsmdqa" path="res://SpaceInfiniteGeneration/Shared/Player/topdown-player.svg" id="2"] 5 | 6 | [node name="Player" type="CharacterBody2D"] 7 | script = ExtResource("1") 8 | 9 | [node name="Sprite2D" type="Sprite2D" parent="."] 10 | texture = ExtResource("2") 11 | 12 | [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 13 | polygon = PackedVector2Array(0, -40, 30, 0, 40, 35, -40, 35, -30, 0) 14 | 15 | [node name="Camera2D" type="Camera2D" parent="."] 16 | zoom = Vector2(0.2, 0.2) 17 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/Player/topdown-player.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cgjqgfsuuxxpw" 6 | path="res://.godot/imported/topdown-player.svg-0c5c44ce4a74751e54a17f51add1317c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://SpaceInfiniteGeneration/Shared/Player/topdown-player.svg" 14 | dest_files=["res://.godot/imported/topdown-player.svg-0c5c44ce4a74751e54a17f51add1317c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/Shared/asteroid-round.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://do37mlqhwo6vt" 6 | path="res://.godot/imported/asteroid-round.svg-fe5c09dd3939d3fe8a61ba2d8f136fa6.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://SpaceInfiniteGeneration/Shared/asteroid-round.svg" 14 | dest_files=["res://.godot/imported/asteroid-round.svg-fe5c09dd3939d3fe8a61ba2d8f136fa6.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot4/SpaceInfiniteGeneration/WhiteNoiseWorldGenerator.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://chbhk5g00t35j"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://1nbvdtr0s2lj" path="res://SpaceInfiniteGeneration/Shared/Asteroid.tscn" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://bo16yl58lvfnr" path="res://SpaceInfiniteGeneration/Shared/Player/Player.tscn" id="2"] 5 | [ext_resource type="PackedScene" uid="uid://dropctlxnbvds" path="res://SpaceInfiniteGeneration/Shared/GridDrawer.tscn" id="3"] 6 | [ext_resource type="Script" path="res://SpaceInfiniteGeneration/WhiteNoiseWorldGenerator.gd" id="4"] 7 | 8 | [node name="WhiteNoiseWorldGenerator" type="Node2D"] 9 | script = ExtResource("4") 10 | Asteroid = ExtResource("1") 11 | start_seed = "white_noise_generation" 12 | 13 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 14 | layer = -1 15 | 16 | [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] 17 | anchors_preset = 15 18 | anchor_right = 1.0 19 | anchor_bottom = 1.0 20 | mouse_filter = 2 21 | color = Color(0.0666667, 0.133333, 0.333333, 1) 22 | 23 | [node name="Player" parent="." instance=ExtResource("2")] 24 | 25 | [node name="GridDrawer" parent="." instance=ExtResource("3")] 26 | -------------------------------------------------------------------------------- /godot4/WorldMap/Utils.gd: -------------------------------------------------------------------------------- 1 | class_name WorldMapUtils 2 | 3 | 4 | # Normalizes a value from a noise generator based on the noise's minimum and maximum range. 5 | static func normalize_noise(value: float, minmax := Vector2(-1, 1)) -> float: 6 | return remap(value, minmax.x, minmax.y, 0, 1) 7 | 8 | 9 | # Normalizes the components of a 2D vector individually and returns them as a new Vector2. 10 | # Intended to use with the minmax range of a noise generator. 11 | static func normalize_noise_vector2(value: Vector2) -> Vector2: 12 | return Vector2(normalize_noise(value.x), normalize_noise(value.y)) 13 | 14 | 15 | # Returns the minimum and maximum value of a noise texture as a Vector2. 16 | static func get_minmax_noise(texture: NoiseTexture2D) -> Vector2: 17 | var out := Vector2(INF, -INF) 18 | for x in texture.width: 19 | for y in texture.height: 20 | var value := texture.noise.get_noise_2d(x, y) 21 | out.x = min(out.x, value) 22 | out.y = max(out.y, value) 23 | return out 24 | -------------------------------------------------------------------------------- /godot4/WorldMap/color_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="GradientTexture2D" load_steps=2 format=3 uid="uid://b3nphp8j4yemi"] 2 | 3 | [sub_resource type="Gradient" id="1"] 4 | offsets = PackedFloat32Array(0, 0.240618, 0.496689, 0.529697, 0.561212, 0.580606, 0.601212, 0.638788, 0.673939, 0.69697, 0.74, 0.78, 1) 5 | colors = PackedColorArray(0.278431, 0.231373, 0.470588, 1, 0.294118, 0.356863, 0.670588, 1, 0.341176, 1, 0.894118, 1, 0.960784, 0.647059, 0.392157, 1, 0.196078, 0.243137, 0.309804, 1, 0.807843, 0.996078, 0.486275, 1, 0.905882, 0.403922, 0.34902, 1, 0.262745, 0.262745, 0.305882, 1, 0.239216, 0.431373, 0.439216, 1, 0.235294, 0.639216, 0.439216, 1, 0.262745, 0.145098, 0.266667, 1, 1, 1, 0.921569, 1, 1, 1, 1, 1) 6 | 7 | [resource] 8 | gradient = SubResource("1") 9 | width = 512 10 | -------------------------------------------------------------------------------- /godot4/WorldMap/discrete-color-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/WorldMap/discrete-color-map.png -------------------------------------------------------------------------------- /godot4/WorldMap/discrete-color-map.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c2aiuqigvcmdg" 6 | path="res://.godot/imported/discrete-color-map.png-9714d85f2ec6c933888d235010f7d285.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://WorldMap/discrete-color-map.png" 14 | dest_files=["res://.godot/imported/discrete-color-map.png-9714d85f2ec6c933888d235010f7d285.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot4/WorldMap/heat_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture2D" load_steps=2 format=3 uid="uid://c7jknlv8nn8b1"] 2 | 3 | [sub_resource type="FastNoiseLite" id="1"] 4 | frequency = 0.016 5 | fractal_octaves = 2 6 | fractal_lacunarity = 2.8 7 | fractal_gain = 0.8 8 | 9 | [resource] 10 | width = 256 11 | height = 256 12 | noise = SubResource("1") 13 | -------------------------------------------------------------------------------- /godot4/WorldMap/height_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture2D" load_steps=2 format=3 uid="uid://xiuixk03bk01"] 2 | 3 | [sub_resource type="FastNoiseLite" id="1"] 4 | noise_type = 0 5 | frequency = 0.018 6 | fractal_octaves = 3 7 | fractal_lacunarity = 2.6 8 | fractal_gain = 0.49 9 | 10 | [resource] 11 | noise = SubResource("1") 12 | -------------------------------------------------------------------------------- /godot4/WorldMap/moisture_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture2D" load_steps=2 format=3 uid="uid://cqwb1i7iftarx"] 2 | 3 | [sub_resource type="FastNoiseLite" id="1"] 4 | frequency = 0.029 5 | fractal_octaves = 3 6 | fractal_gain = 0.8 7 | 8 | [resource] 9 | width = 256 10 | height = 256 11 | noise = SubResource("1") 12 | -------------------------------------------------------------------------------- /godot4/WorldMap/sobel.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | 4 | uniform vec4 edge_color : source_color; 5 | uniform vec2 edge_width = vec2(0.1); 6 | uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap; 7 | 8 | 9 | float sobel(sampler2D tex, vec2 uv, vec2 pixel_size) { 10 | vec2 edge_width_pixel = edge_width * pixel_size; 11 | 12 | vec4 h = vec4(0.0); 13 | vec4 v = vec4(0.0); 14 | 15 | h += texture(tex, uv + vec2(-1.0, -1.0) * edge_width_pixel); 16 | h -= texture(tex, uv + vec2( 0.0, -1.0) * edge_width_pixel); 17 | h += 2.0 * texture(tex, uv + vec2(-1.0, 0.0) * edge_width_pixel); 18 | h -= 2.0 * texture(tex, uv + vec2( 1.0, 0.0) * edge_width_pixel); 19 | h += texture(tex, uv + vec2(-1.0, 1.0) * edge_width_pixel); 20 | h -= texture(tex, uv + vec2( 1.0, 1.0) * edge_width_pixel); 21 | 22 | v += texture(tex, uv + vec2(-1.0, -1.0) * edge_width_pixel); 23 | v += 2.0 * texture(tex, uv + vec2( 0.0, -1.0) * edge_width_pixel); 24 | v += texture(tex, uv + vec2( 1.0, -1.0) * edge_width_pixel); 25 | v -= texture(tex, uv + vec2(-1.0, 1.0) * edge_width_pixel); 26 | v -= 2.0 * texture(tex, uv + vec2( 0.0, 1.0) * edge_width_pixel); 27 | v -= texture(tex, uv + vec2( 1.0, 1.0) * edge_width_pixel); 28 | 29 | return sqrt(dot(h, h) + dot(v, v)); 30 | } 31 | 32 | 33 | void fragment() { 34 | float s = sobel(SCREEN_TEXTURE, SCREEN_UV, SCREEN_PIXEL_SIZE); 35 | COLOR = texture(SCREEN_TEXTURE, SCREEN_UV); 36 | COLOR = mix(COLOR, edge_color, s); 37 | } -------------------------------------------------------------------------------- /godot4/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 | -------------------------------------------------------------------------------- /godot4/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/godot4/icon.png -------------------------------------------------------------------------------- /godot4/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://m321atbmjg3h" 6 | path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icon.png" 14 | dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /images/infinite-world-blue-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/images/infinite-world-blue-noise.png -------------------------------------------------------------------------------- /images/infinite-world-layered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/images/infinite-world-layered.png -------------------------------------------------------------------------------- /images/pcg-secrets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/images/pcg-secrets.png -------------------------------------------------------------------------------- /images/random-walker-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/images/random-walker-1.png -------------------------------------------------------------------------------- /images/random-walker-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/images/random-walker-2.png -------------------------------------------------------------------------------- /images/world-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/images/world-map.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/01.FoliageGenerator/FoliageGenerator.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | func update_grid() -> void: 5 | pass 6 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/01.FoliageGenerator/plants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/01.FoliageGenerator/plants.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/01.FoliageGenerator/plants.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/plants.png-3c35404687f314420a8a6a57a0bc89f1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/01.FoliageGenerator/plants.png" 13 | dest_files=[ "res://.import/plants.png-3c35404687f314420a8a6a57a0bc89f1.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/02.CavernGenerator/CellularCavernGenerator.gd: -------------------------------------------------------------------------------- 1 | ## Generates a cavern using an algorithm based on celular automata. 2 | extends Node2D 3 | 4 | var _wall_conversion := 4 setget set_wall_conversion 5 | var _floor_conversion := 4 setget set_floor_conversion 6 | 7 | var _step_count := 10 setget set_step_count 8 | var _step_time := 0.1 setget set_step_time 9 | var _wall_chance := 0.5 setget set_wall_chance 10 | 11 | 12 | func generate_new_dungeon() -> void: 13 | pass 14 | 15 | 16 | func set_wall_chance(value: float) -> void: 17 | _wall_chance = value 18 | 19 | 20 | func set_step_time(value: float) -> void: 21 | _step_time = value 22 | 23 | 24 | func set_wall_conversion(value: int) -> void: 25 | _wall_conversion = value 26 | 27 | 28 | func set_floor_conversion(value: int) -> void: 29 | _floor_conversion = value 30 | 31 | 32 | func set_step_count(value: int) -> void: 33 | _step_count = value 34 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/02.CavernGenerator/UISettings.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | signal step_time_changed(time) 4 | signal wall_chance_changed(value) 5 | signal wall_conversion_changed(value) 6 | signal floor_conversion_changed(value) 7 | signal step_count_changed(value) 8 | signal maximum_treasure_changed(value) 9 | signal min_cavern_area_changed(value) 10 | signal min_exit_distance_changed(value) 11 | 12 | onready var button_generate := $ButtonGenerate 13 | onready var step_time_value := $StepSpeed/Value 14 | onready var wall_chance_value := $WallChance/Value 15 | onready var wall_conversion_value := $WallConversion/Value 16 | onready var floor_conversion_value := $FloorConversion/Value 17 | onready var step_count_value := $StepCount/Value 18 | 19 | 20 | func _on_SliderStepSpeed_value_changed(value: float) -> void: 21 | step_time_value.text = "%s" % [value] 22 | emit_signal("step_time_changed", value) 23 | 24 | 25 | func _on_SliderWallChance_value_changed(value) -> void: 26 | wall_chance_value.text = "%s" % [value] 27 | emit_signal("wall_chance_changed", value) 28 | 29 | 30 | func _on_SliderWallConversion_value_changed(value: int) -> void: 31 | wall_conversion_value.text = "< %s" % [value] 32 | emit_signal("wall_conversion_changed", value) 33 | 34 | 35 | func _on_SliderFloorConversion_value_changed(value: int) -> void: 36 | floor_conversion_value.text = "> %s" % [value] 37 | emit_signal("floor_conversion_changed", value) 38 | 39 | 40 | func _on_SliderStepCount_value_changed(value) -> void: 41 | step_count_value.text = "%s" % [value] 42 | emit_signal("step_count_changed", value) 43 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/02.CavernGenerator/tiles_basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/02.CavernGenerator/tiles_basic.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/02.CavernGenerator/tiles_basic.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tiles_basic.png-c37d53ddad9ea99b63fdb526d9c92d4f.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/02.CavernGenerator/tiles_basic.png" 13 | dest_files=[ "res://.import/tiles_basic.png-c37d53ddad9ea99b63fdb526d9c92d4f.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/02.CavernGenerator/tileset_basic.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://CellularAutomata/02.CavernGenerator/tiles_basic.png" type="Texture" id=1] 4 | 5 | [resource] 6 | 0/name = "wall" 7 | 0/texture = ExtResource( 1 ) 8 | 0/tex_offset = Vector2( 0, 0 ) 9 | 0/modulate = Color( 1, 1, 1, 1 ) 10 | 0/region = Rect2( 64, 0, 64, 64 ) 11 | 0/tile_mode = 0 12 | 0/occluder_offset = Vector2( 0, 0 ) 13 | 0/navigation_offset = Vector2( 0, 0 ) 14 | 0/shape_offset = Vector2( 0, 0 ) 15 | 0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 16 | 0/shape_one_way = false 17 | 0/shape_one_way_margin = 0.0 18 | 0/shapes = [ ] 19 | 0/z_index = 0 20 | 1/name = "floor" 21 | 1/texture = ExtResource( 1 ) 22 | 1/tex_offset = Vector2( 0, 0 ) 23 | 1/modulate = Color( 1, 1, 1, 1 ) 24 | 1/region = Rect2( 0, 0, 64, 64 ) 25 | 1/tile_mode = 0 26 | 1/occluder_offset = Vector2( 0, 0 ) 27 | 1/navigation_offset = Vector2( 0, 0 ) 28 | 1/shape_offset = Vector2( 0, 0 ) 29 | 1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 30 | 1/shape_one_way = false 31 | 1/shape_one_way_margin = 0.0 32 | 1/shapes = [ ] 33 | 1/z_index = 0 34 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/ButtonCameraSwitch.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | export (NodePath) var camera_one_path 4 | export (NodePath) var camera_two_path 5 | 6 | onready var _camera_one: Camera2D = get_node(camera_one_path) 7 | onready var _camera_two: Camera2D = get_node(camera_two_path) 8 | 9 | 10 | func _on_pressed(): 11 | if _camera_one.current: 12 | _camera_two.current = true 13 | else: 14 | _camera_one.current = true 15 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/Miner.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | export var speed := 500 4 | 5 | onready var _pivot := $Pivot 6 | 7 | 8 | func _physics_process(_delta: float) -> void: 9 | var direction := Vector2(Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left"), Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")).normalized() 10 | 11 | _pivot.look_at(global_position + direction) 12 | 13 | var velocity := direction * speed 14 | move_and_slide(velocity) 15 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/drill-blade.png-de8a6cf1ae08c7269581da2473f9d019.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/drill-blade.png" 13 | dest_files=[ "res://.import/drill-blade.png-de8a6cf1ae08c7269581da2473f9d019.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/drill-top.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/drill-top.png-c73f71dd0dc6e52c50e2b8dd19ae575a.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/drill-top.png" 13 | dest_files=[ "res://.import/drill-top.png-c73f71dd0dc6e52c50e2b8dd19ae575a.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/miner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/03.DungeonGenerator/Miner/miner.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Miner/miner.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/miner.png-6e8a50cec6c2a0656a1bfcf286916308.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Miner/miner.png" 13 | dest_files=[ "res://.import/miner.png-6e8a50cec6c2a0656a1bfcf286916308.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/Exit.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | signal player_entered 4 | 5 | 6 | func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape): 7 | emit_signal("player_entered") 8 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/Exit.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/exit.png" type="Texture" id=1] 4 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/Exit.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 32, 32 ) 8 | 9 | [node name="Exit" type="Area2D"] 10 | monitoring = false 11 | monitorable = false 12 | collision_layer = 0 13 | script = ExtResource( 2 ) 14 | 15 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 16 | shape = SubResource( 1 ) 17 | 18 | [node name="Sprite" type="Sprite" parent="."] 19 | texture = ExtResource( 1 ) 20 | 21 | [connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"] 22 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/Treasure.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | signal treasure_collected 4 | 5 | 6 | func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape): 7 | emit_signal("treasure_collected") 8 | queue_free() 9 | 10 | 11 | # If treasure ever overlap, destroy them 12 | func _on_area_entered(area): 13 | queue_free() 14 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/Treasure.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/chest.png" type="Texture" id=1] 4 | [ext_resource path="res://CellularAutomata/03.DungeonGenerator/Props/Treasure.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 32, 32 ) 8 | 9 | [node name="Treasure" type="Area2D" groups=[ 10 | "treasure", 11 | ]] 12 | position = Vector2( -118.49, -118.49 ) 13 | collision_layer = 2 14 | collision_mask = 2 15 | script = ExtResource( 2 ) 16 | 17 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 18 | position = Vector2( 32, 32 ) 19 | shape = SubResource( 1 ) 20 | 21 | [node name="Sprite" type="Sprite" parent="."] 22 | position = Vector2( 32, 32 ) 23 | texture = ExtResource( 1 ) 24 | 25 | [connection signal="area_entered" from="." to="." method="_on_area_entered"] 26 | [connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"] 27 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/03.DungeonGenerator/Props/chest.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/chest.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/chest.png-44cfea0735d31b7af6bc109aae4c8048.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Props/chest.png" 13 | dest_files=[ "res://.import/chest.png-44cfea0735d31b7af6bc109aae4c8048.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/03.DungeonGenerator/Props/exit.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/Props/exit.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/exit.png-d1523b2b4a1e725e89824b5c40d6f2f0.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/Props/exit.png" 13 | dest_files=[ "res://.import/exit.png-d1523b2b4a1e725e89824b5c40d6f2f0.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 | -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/tileset_mining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/CellularAutomata/03.DungeonGenerator/tileset_mining.png -------------------------------------------------------------------------------- /start-project/CellularAutomata/03.DungeonGenerator/tileset_mining.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tileset_mining.png-da97036bb2cde0cfbe008239cc0336dd.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://CellularAutomata/03.DungeonGenerator/tileset_mining.png" 13 | dest_files=[ "res://.import/tileset_mining.png-da97036bb2cde0cfbe008239cc0336dd.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 | -------------------------------------------------------------------------------- /start-project/Common/assets-prototype.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/assets-prototype.svg-63ab5b9a554b14addf8bfc1fc8eff619.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://Common/assets-prototype.svg" 13 | dest_files=[ "res://.import/assets-prototype.svg-63ab5b9a554b14addf8bfc1fc8eff619.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 | -------------------------------------------------------------------------------- /start-project/Common/tileset-prototype.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://Common/assets-prototype.svg" type="Texture" id=1] 4 | 5 | [resource] 6 | 0/name = "Block" 7 | 0/texture = ExtResource( 1 ) 8 | 0/tex_offset = Vector2( 0, 0 ) 9 | 0/modulate = Color( 1, 1, 1, 1 ) 10 | 0/region = Rect2( 0, 0, 60, 60 ) 11 | 0/tile_mode = 0 12 | 0/occluder_offset = Vector2( 0, 0 ) 13 | 0/navigation_offset = Vector2( 0, 0 ) 14 | 0/shape_offset = Vector2( 0, 0 ) 15 | 0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 16 | 0/shape_one_way = false 17 | 0/shape_one_way_margin = 0.0 18 | 0/shapes = [ ] 19 | 0/z_index = 0 20 | -------------------------------------------------------------------------------- /start-project/ModularWeapons/ModularWeapons/SpawnedObjects.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="SpawnedObjects" type="Node2D" groups=[ 4 | "spawned_objects", 5 | ]] 6 | -------------------------------------------------------------------------------- /start-project/ModularWeapons/PlayerShip/PlayerShip.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://ModularWeapons/PlayerShip/topdown-player.svg" type="Texture" id=1] 4 | [ext_resource path="res://ModularWeapons/PlayerShip/PlayerShip.gd" type="Script" id=4] 5 | 6 | [node name="PlayerShip" type="KinematicBody2D"] 7 | script = ExtResource( 4 ) 8 | 9 | [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 10 | polygon = PoolVector2Array( 0, -40, -15, -30, -40, 30, -20, 40, 0, 30, 20, 40, 40, 25, 15, -30 ) 11 | 12 | [node name="Sprite" type="Sprite" parent="."] 13 | position = Vector2( 0, -0.142395 ) 14 | texture = ExtResource( 1 ) 15 | -------------------------------------------------------------------------------- /start-project/ModularWeapons/PlayerShip/topdown-player.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/topdown-player.svg-183557eaf015028958738f745721d42b.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ModularWeapons/PlayerShip/topdown-player.svg" 13 | dest_files=[ "res://.import/topdown-player.svg-183557eaf015028958738f745721d42b.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 | -------------------------------------------------------------------------------- /start-project/README.md: -------------------------------------------------------------------------------- 1 | # Start project 2 | 3 | This Godot project contains the files you'll need to follow along our course [Godot PCG Secrets](https://gdquest.mavenseed.com/courses/pcg-secrets-the-art-of-procedural-generation-in-godot). 4 | 5 | It is included in the course's download, but like the rest of the code, we keep it this open-source code repository, to have everything in one place. 6 | -------------------------------------------------------------------------------- /start-project/RandomWalker/Levels/background-gradient.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/background-gradient.svg-8dc41d2b2b1fb3ab56fe634a99cc78f1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/background-gradient.svg" 13 | dest_files=[ "res://.import/background-gradient.svg-8dc41d2b2b1fb3ab56fe634a99cc78f1.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 | -------------------------------------------------------------------------------- /start-project/RandomWalker/Levels/background-hills.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/background-hills.svg-85273ce5f22bf0708f362e62a9911261.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/background-hills.svg" 13 | dest_files=[ "res://.import/background-hills.svg-85273ce5f22bf0708f362e62a9911261.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=1 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 | -------------------------------------------------------------------------------- /start-project/RandomWalker/Levels/background-trees.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/background-trees.svg-a4815e15603624fb0031ceeff10ecdaf.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/background-trees.svg" 13 | dest_files=[ "res://.import/background-trees.svg-a4815e15603624fb0031ceeff10ecdaf.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=1 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 | -------------------------------------------------------------------------------- /start-project/RandomWalker/Levels/tiles.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tiles.svg-fc8b5267736bff16ee28b8d30801e87c.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://RandomWalker/Levels/tiles.svg" 13 | dest_files=[ "res://.import/tiles.svg-fc8b5267736bff16ee28b8d30801e87c.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 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/Asteroid.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/asteroid-round.svg" type="Texture" id=1] 4 | 5 | [sub_resource type="CircleShape2D" id=1] 6 | radius = 113.5 7 | 8 | [node name="Asteroid" type="StaticBody2D" groups=[ 9 | "asteroids", 10 | ]] 11 | scale = Vector2( 0.5, 0.5 ) 12 | 13 | [node name="Sprite" type="Sprite" parent="."] 14 | texture = ExtResource( 1 ) 15 | 16 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 17 | shape = SubResource( 1 ) 18 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/GridDrawer.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | var cell_size: float 4 | var grid_origin: Vector2 5 | var cell_count: int 6 | 7 | 8 | func _draw() -> void: 9 | if cell_size == 0: 10 | return 11 | 12 | var position_origin := grid_origin * cell_size 13 | 14 | var half_cell_count := int(cell_count / 2.0) 15 | var half_cell_size := cell_size/2.0 16 | 17 | for x in range(-half_cell_count, half_cell_count): 18 | for y in range(-half_cell_count, half_cell_count): 19 | var cell_rect := Rect2( 20 | Vector2( 21 | position_origin.x + x * cell_size - half_cell_size, 22 | position_origin.y + y * cell_size - half_cell_size 23 | ), 24 | Vector2(cell_size, cell_size) 25 | ) 26 | 27 | draw_rect(cell_rect, Color.skyblue, false) 28 | 29 | 30 | func setup(size: float, count: int) -> void: 31 | cell_size = size 32 | cell_count = count 33 | update() 34 | 35 | 36 | func move_grid_to(origin: Vector2) -> void: 37 | grid_origin = origin 38 | update() 39 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/GridDrawer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/GridDrawer.gd" type="Script" id=1] 4 | 5 | [node name="GridDrawer" type="Node2D"] 6 | script = ExtResource( 1 ) 7 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/Player/Player.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | export var speed_max := 675.0 4 | export var acceleration := 1500.0 5 | export var angular_speed_max := deg2rad(150) 6 | export var angular_acceleration := deg2rad(1200) 7 | export var drag_factor := 0.05 8 | export var angular_drag_factor := 0.1 9 | 10 | var velocity := Vector2.ZERO 11 | var angular_velocity := 0.0 12 | 13 | 14 | func _physics_process(delta: float) -> void: 15 | velocity = velocity.clamped(speed_max) 16 | 17 | angular_velocity = clamp(angular_velocity, -angular_speed_max, angular_speed_max) 18 | angular_velocity = lerp(angular_velocity, 0, angular_drag_factor) 19 | 20 | velocity = move_and_slide(velocity) 21 | rotation += angular_velocity * delta 22 | 23 | var movement := _get_movement() 24 | 25 | if is_equal_approx(movement.y, 0): 26 | velocity = (velocity.linear_interpolate(Vector2.ZERO, drag_factor)) 27 | 28 | var direction := Vector2.UP.rotated(rotation) 29 | 30 | velocity += movement.y * direction * acceleration * delta 31 | angular_velocity += movement.x * angular_acceleration * delta 32 | 33 | 34 | func _get_movement() -> Vector2: 35 | return Vector2( 36 | Input.get_action_strength("move_right") - Input.get_action_strength("move_left"), 37 | Input.get_action_strength("forwards") - Input.get_action_strength("back") 38 | ) 39 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/Player/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/Player.gd" type="Script" id=1] 4 | [ext_resource path="res://SpaceInfiniteGeneration/Shared/Player/topdown-player.svg" type="Texture" id=2] 5 | 6 | [node name="Player" type="KinematicBody2D"] 7 | script = ExtResource( 1 ) 8 | 9 | [node name="Sprite" type="Sprite" parent="."] 10 | texture = ExtResource( 2 ) 11 | 12 | [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 13 | polygon = PoolVector2Array( 0, -40, 30, 0, 40, 35, -40, 35, -30, 0 ) 14 | 15 | [node name="Camera2D" type="Camera2D" parent="."] 16 | current = true 17 | zoom = Vector2( 5, 5 ) 18 | process_mode = 0 19 | smoothing_enabled = true 20 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/Player/topdown-player.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/topdown-player.svg-0c5c44ce4a74751e54a17f51add1317c.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://SpaceInfiniteGeneration/Shared/Player/topdown-player.svg" 13 | dest_files=[ "res://.import/topdown-player.svg-0c5c44ce4a74751e54a17f51add1317c.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 | -------------------------------------------------------------------------------- /start-project/SpaceInfiniteGeneration/Shared/asteroid-round.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/asteroid-round.svg-fe5c09dd3939d3fe8a61ba2d8f136fa6.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://SpaceInfiniteGeneration/Shared/asteroid-round.svg" 13 | dest_files=[ "res://.import/asteroid-round.svg-fe5c09dd3939d3fe8a61ba2d8f136fa6.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 | -------------------------------------------------------------------------------- /start-project/WorldMap/discrete-color-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/WorldMap/discrete-color-map.png -------------------------------------------------------------------------------- /start-project/WorldMap/discrete-color-map.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/discrete-color-map.png-9714d85f2ec6c933888d235010f7d285.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://WorldMap/discrete-color-map.png" 13 | dest_files=[ "res://.import/discrete-color-map.png-9714d85f2ec6c933888d235010f7d285.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=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /start-project/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 | -------------------------------------------------------------------------------- /start-project/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdquest-demos/godot-procedural-generation/c36b4e21519dc4b726d2f7cc83b76699749bb577/start-project/icon.png -------------------------------------------------------------------------------- /start-project/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.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 | --------------------------------------------------------------------------------