Compare commits
2 Commits
b21bf52938
...
3d-tutoria
| Author | SHA1 | Date | |
|---|---|---|---|
| f848935717 | |||
| 9628fff680 |
1
.gitignore
vendored
@@ -49,4 +49,3 @@ export_presets.cfg
|
|||||||
data_*/
|
data_*/
|
||||||
mono_crash.*.json
|
mono_crash.*.json
|
||||||
|
|
||||||
addons/
|
|
||||||
|
|||||||
4
.gitmodules
vendored
@@ -1,4 +0,0 @@
|
|||||||
[submodule "evolve-die-repeat/thirdparty/godot-cpp"]
|
|
||||||
path = evolve-die-repeat/thirdparty/godot-cpp
|
|
||||||
url = https://github.com/godotengine/godot-cpp.git
|
|
||||||
branch = 4.5
|
|
||||||
2
3d-tutorial/3d_squash_the_creeps_starter/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.import
|
||||||
|
logs/
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="oggvorbisstr"
|
||||||
|
type="AudioStreamOggVorbis"
|
||||||
|
uid="uid://c5qpnfga41t4p"
|
||||||
|
path="res://.godot/imported/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggvorbisstr"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://art/House In a Forest Loop.ogg"
|
||||||
|
dest_files=["res://.godot/imported/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggvorbisstr"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
loop=true
|
||||||
|
loop_offset=0
|
||||||
|
bpm=0
|
||||||
|
beat_count=0
|
||||||
|
bar_beats=4
|
||||||
12
3d-tutorial/3d_squash_the_creeps_starter/art/body.tres
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[gd_resource type="SpatialMaterial" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "body"
|
||||||
|
params_cull_mode = 2
|
||||||
|
albedo_color = Color( 0.906332, 0.353653, 0, 1 )
|
||||||
|
roughness = 0.5
|
||||||
|
emission_enabled = true
|
||||||
|
emission = Color( 0, 0, 0, 1 )
|
||||||
|
emission_energy = 1.0
|
||||||
|
emission_operator = 0
|
||||||
|
emission_on_uv2 = false
|
||||||
14
3d-tutorial/3d_squash_the_creeps_starter/art/eye.tres
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[gd_resource type="SpatialMaterial" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "eye"
|
||||||
|
params_cull_mode = 2
|
||||||
|
albedo_color = Color( 0.858824, 0.858824, 0.858824, 1 )
|
||||||
|
metallic = 0.05
|
||||||
|
metallic_specular = 1.0
|
||||||
|
roughness = 0.1
|
||||||
|
emission_enabled = true
|
||||||
|
emission = Color( 0.254902, 0.254902, 0.27451, 1 )
|
||||||
|
emission_energy = 1.0
|
||||||
|
emission_operator = 0
|
||||||
|
emission_on_uv2 = false
|
||||||
BIN
3d-tutorial/3d_squash_the_creeps_starter/art/mob.blend
Normal file
BIN
3d-tutorial/3d_squash_the_creeps_starter/art/mob.glb
Normal file
42
3d-tutorial/3d_squash_the_creeps_starter/art/mob.glb.import
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://bicorb7we351t"
|
||||||
|
path="res://.godot/imported/mob.glb-3afb43c03b9d1598b6af5154e2543eac.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://art/mob.glb"
|
||||||
|
dest_files=["res://.godot/imported/mob.glb-3afb43c03b9d1598b6af5154e2543eac.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type="Spatial"
|
||||||
|
nodes/root_name="Scene Root"
|
||||||
|
nodes/root_script=null
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=false
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=0
|
||||||
|
meshes/lightmap_texel_size=0.1
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=15
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=0
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_resource type="SpatialMaterial" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "mob_body"
|
||||||
|
params_cull_mode = 2
|
||||||
|
albedo_color = Color( 0.0588235, 0.266667, 0.490196, 1 )
|
||||||
|
roughness = 0.43
|
||||||
14
3d-tutorial/3d_squash_the_creeps_starter/art/mob_eye.tres
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[gd_resource type="SpatialMaterial" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "mob_eye"
|
||||||
|
params_cull_mode = 2
|
||||||
|
albedo_color = Color( 0.760784, 0.113725, 0.188235, 1 )
|
||||||
|
metallic = 0.48
|
||||||
|
metallic_specular = 1.0
|
||||||
|
roughness = 0.25
|
||||||
|
emission_enabled = true
|
||||||
|
emission = Color( 0.74902, 0.0784314, 0.0784314, 1 )
|
||||||
|
emission_energy = 1.0
|
||||||
|
emission_operator = 0
|
||||||
|
emission_on_uv2 = false
|
||||||
BIN
3d-tutorial/3d_squash_the_creeps_starter/art/player.blend
Normal file
BIN
3d-tutorial/3d_squash_the_creeps_starter/art/player.glb
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://d0ypm0v45pwdv"
|
||||||
|
path="res://.godot/imported/player.glb-08dcfb373480a049995065542e37637b.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://art/player.glb"
|
||||||
|
dest_files=["res://.godot/imported/player.glb-08dcfb373480a049995065542e37637b.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type="Spatial"
|
||||||
|
nodes/root_name="Scene Root"
|
||||||
|
nodes/root_script=null
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=false
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=0
|
||||||
|
meshes/lightmap_texel_size=0.1
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=15
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=0
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
16
3d-tutorial/3d_squash_the_creeps_starter/art/pupil.tres
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[gd_resource type="SpatialMaterial" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "pupil"
|
||||||
|
params_cull_mode = 2
|
||||||
|
albedo_color = Color( 0, 0, 0, 1 )
|
||||||
|
metallic_specular = 1.0
|
||||||
|
roughness = 0.3
|
||||||
|
emission_enabled = true
|
||||||
|
emission = Color( 0, 0, 0, 1 )
|
||||||
|
emission_energy = 1.0
|
||||||
|
emission_operator = 0
|
||||||
|
emission_on_uv2 = false
|
||||||
|
rim_enabled = true
|
||||||
|
rim = 1.0
|
||||||
|
rim_tint = 0.5
|
||||||
43
3d-tutorial/3d_squash_the_creeps_starter/fonts/LICENSE.txt
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat)
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
—————————————————————————————-
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
—————————————————————————————-
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
“Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
“Reserved Font Name” refers to any names specified as such after the copyright statement(s).
|
||||||
|
|
||||||
|
“Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
“Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
|
||||||
|
|
||||||
|
“Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="font_data_dynamic"
|
||||||
|
type="FontFile"
|
||||||
|
uid="uid://cyxhh7ddkn62q"
|
||||||
|
path="res://.godot/imported/Montserrat-Medium.ttf-e832861e4ad4110e172112dc430c04b0.fontdata"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://fonts/Montserrat-Medium.ttf"
|
||||||
|
dest_files=["res://.godot/imported/Montserrat-Medium.ttf-e832861e4ad4110e172112dc430c04b0.fontdata"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
Rendering=null
|
||||||
|
antialiasing=1
|
||||||
|
generate_mipmaps=false
|
||||||
|
disable_embedded_bitmaps=true
|
||||||
|
multichannel_signed_distance_field=false
|
||||||
|
msdf_pixel_range=8
|
||||||
|
msdf_size=48
|
||||||
|
allow_system_fallback=true
|
||||||
|
force_autohinter=false
|
||||||
|
modulate_color_glyphs=false
|
||||||
|
hinting=1
|
||||||
|
subpixel_positioning=1
|
||||||
|
keep_rounding_remainders=true
|
||||||
|
oversampling=0.0
|
||||||
|
Fallbacks=null
|
||||||
|
fallbacks=[]
|
||||||
|
Compress=null
|
||||||
|
compress=true
|
||||||
|
preload=[]
|
||||||
|
language_support={}
|
||||||
|
script_support={}
|
||||||
|
opentype_features={}
|
||||||
BIN
3d-tutorial/3d_squash_the_creeps_starter/icon.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
@@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://bto1pnycvianp"
|
uid="uid://nev7b6ohgeo"
|
||||||
path="res://.godot/imported/bg.png-84a173f3a1de937d0ba2884af46d549b.ctex"
|
path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://molecular/assets/background/bg.png"
|
source_file="res://icon.webp"
|
||||||
dest_files=["res://.godot/imported/bg.png-84a173f3a1de937d0ba2884af46d549b.ctex"]
|
dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
15
3d-tutorial/3d_squash_the_creeps_starter/main.gd
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
extends Node
|
||||||
|
|
||||||
|
@export var mob_scene: PackedScene
|
||||||
|
|
||||||
|
|
||||||
|
func _on_mob_timer_timeout() -> void:
|
||||||
|
var mob = mob_scene.instantiate()
|
||||||
|
|
||||||
|
var mob_spawn_location = get_node("SpawnPath/SpawnLocation")
|
||||||
|
mob_spawn_location.progress_ratio = randf()
|
||||||
|
|
||||||
|
var player_position = $Player.position
|
||||||
|
mob.initialize(mob_spawn_location.position, player_position)
|
||||||
|
|
||||||
|
add_child(mob)
|
||||||
1
3d-tutorial/3d_squash_the_creeps_starter/main.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://cfb7xo35cn5fo
|
||||||
83
3d-tutorial/3d_squash_the_creeps_starter/main.tscn
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
[gd_scene load_steps=9 format=3 uid="uid://2wap0283yk0r"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://cfb7xo35cn5fo" path="res://main.gd" id="1_0xm2m"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://ceuu150fmggvr" path="res://player.tscn" id="1_ig7tw"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://defdm2qdva75q" path="res://mob.tscn" id="2_h2yge"]
|
||||||
|
|
||||||
|
[sub_resource type="BoxShape3D" id="BoxShape3D_7dm0k"]
|
||||||
|
size = Vector3(60, 2, 60)
|
||||||
|
|
||||||
|
[sub_resource type="BoxMesh" id="BoxMesh_ig7tw"]
|
||||||
|
size = Vector3(60, 2, 60)
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ig7tw"]
|
||||||
|
albedo_color = Color(0.48985153, 0.33837724, 0.8704828, 1)
|
||||||
|
|
||||||
|
[sub_resource type="CylinderMesh" id="CylinderMesh_ig7tw"]
|
||||||
|
material = SubResource("StandardMaterial3D_ig7tw")
|
||||||
|
|
||||||
|
[sub_resource type="Curve3D" id="Curve3D_ig7tw"]
|
||||||
|
closed = true
|
||||||
|
_data = {
|
||||||
|
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -13.082657, 0, 14.897789, 0, 0, 0, 0, 0, 0, 14.178589, 0, 15.103276, 0, 0, 0, 0, 0, 0, 14.178589, 0, -15.240269, 0, 0, 0, 0, 0, 0, -13.01416, 0, -15.171773),
|
||||||
|
"tilts": PackedFloat32Array(0, 0, 0, 0)
|
||||||
|
}
|
||||||
|
point_count = 4
|
||||||
|
|
||||||
|
[node name="Main" type="Node"]
|
||||||
|
script = ExtResource("1_0xm2m")
|
||||||
|
mob_scene = ExtResource("2_h2yge")
|
||||||
|
|
||||||
|
[node name="Ground" type="StaticBody3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||||
|
collision_layer = 4
|
||||||
|
collision_mask = 0
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
|
||||||
|
shape = SubResource("BoxShape3D_7dm0k")
|
||||||
|
|
||||||
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
|
||||||
|
mesh = SubResource("BoxMesh_ig7tw")
|
||||||
|
|
||||||
|
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 0.8660254, 0.5, 0, -0.5, 0.8660254, 0, 15, 5)
|
||||||
|
shadow_enabled = true
|
||||||
|
|
||||||
|
[node name="Player" parent="." instance=ExtResource("1_ig7tw")]
|
||||||
|
|
||||||
|
[node name="CameraPivot" type="Marker3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 0.70710677, 0.70710677, 0, -0.70710677, 0.70710677, 0, 0, 0)
|
||||||
|
|
||||||
|
[node name="Camera3D" type="Camera3D" parent="CameraPivot"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 19)
|
||||||
|
projection = 1
|
||||||
|
size = 19.0
|
||||||
|
|
||||||
|
[node name="Cyllinders" type="Node3D" parent="."]
|
||||||
|
|
||||||
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="Cyllinders"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13, 0, -15)
|
||||||
|
mesh = SubResource("CylinderMesh_ig7tw")
|
||||||
|
|
||||||
|
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Cyllinders"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13, 0, 15)
|
||||||
|
mesh = SubResource("CylinderMesh_ig7tw")
|
||||||
|
|
||||||
|
[node name="MeshInstance3D3" type="MeshInstance3D" parent="Cyllinders"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0, -15)
|
||||||
|
mesh = SubResource("CylinderMesh_ig7tw")
|
||||||
|
|
||||||
|
[node name="MeshInstance3D4" type="MeshInstance3D" parent="Cyllinders"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0, 15)
|
||||||
|
mesh = SubResource("CylinderMesh_ig7tw")
|
||||||
|
|
||||||
|
[node name="SpawnPath" type="Path3D" parent="."]
|
||||||
|
curve = SubResource("Curve3D_ig7tw")
|
||||||
|
|
||||||
|
[node name="SpawnLocation" type="PathFollow3D" parent="SpawnPath"]
|
||||||
|
transform = Transform3D(-0.007537449, 0, -0.9999705, 0, 1, 0, 0.9999705, 0, -0.007537449, -13.082657, 0, 14.897789)
|
||||||
|
|
||||||
|
[node name="MobTimer" type="Timer" parent="."]
|
||||||
|
autostart = true
|
||||||
|
|
||||||
|
[connection signal="timeout" from="MobTimer" to="." method="_on_mob_timer_timeout"]
|
||||||
40
3d-tutorial/3d_squash_the_creeps_starter/mob.gd
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
extends CharacterBody3D
|
||||||
|
|
||||||
|
signal squashed
|
||||||
|
|
||||||
|
@export var min_speed = 10
|
||||||
|
@export var max_speed = 18
|
||||||
|
|
||||||
|
# In code timer for brownian motion
|
||||||
|
var T: float = 0.5
|
||||||
|
var Tinit: float = 1.0
|
||||||
|
var dt: float = 0.05
|
||||||
|
var t: float = 0.0
|
||||||
|
|
||||||
|
func _physics_process(_delta):
|
||||||
|
if t > T and Tinit < 0:
|
||||||
|
t = 0
|
||||||
|
set_new_velocity()
|
||||||
|
t += dt
|
||||||
|
Tinit -= dt
|
||||||
|
|
||||||
|
move_and_slide()
|
||||||
|
|
||||||
|
func initialize(start_position, player_position):
|
||||||
|
look_at_from_position(start_position, player_position, Vector3.UP)
|
||||||
|
|
||||||
|
set_new_velocity()
|
||||||
|
|
||||||
|
func set_new_velocity() -> void:
|
||||||
|
rotate_y(randf_range(-PI / 4, PI / 4))
|
||||||
|
var random_speed = randi_range(min_speed, max_speed)
|
||||||
|
velocity = Vector3.FORWARD * random_speed
|
||||||
|
velocity = velocity.rotated(Vector3.UP, rotation.y)
|
||||||
|
|
||||||
|
func _on_visible_on_screen_notifier_3d_screen_exited() -> void:
|
||||||
|
queue_free()
|
||||||
|
|
||||||
|
|
||||||
|
func squash():
|
||||||
|
squashed.emit()
|
||||||
|
queue_free()
|
||||||
1
3d-tutorial/3d_squash_the_creeps_starter/mob.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://c5wp01kn08qxe
|
||||||
27
3d-tutorial/3d_squash_the_creeps_starter/mob.tscn
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[gd_scene load_steps=4 format=3 uid="uid://defdm2qdva75q"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bicorb7we351t" path="res://art/mob.glb" id="1_dy6sc"]
|
||||||
|
[ext_resource type="Script" uid="uid://c5wp01kn08qxe" path="res://mob.gd" id="1_nokgg"]
|
||||||
|
|
||||||
|
[sub_resource type="BoxShape3D" id="BoxShape3D_nokgg"]
|
||||||
|
size = Vector3(1.9155884, 0.7798462, 1.6226807)
|
||||||
|
|
||||||
|
[node name="Mob" type="CharacterBody3D" groups=["mob"]]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.22412324, 0)
|
||||||
|
collision_layer = 2
|
||||||
|
collision_mask = 0
|
||||||
|
script = ExtResource("1_nokgg")
|
||||||
|
|
||||||
|
[node name="Pivot" type="Node3D" parent="."]
|
||||||
|
|
||||||
|
[node name="Character" parent="Pivot" instance=ExtResource("1_dy6sc")]
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.020843506, 0.4449278, 0.06854248)
|
||||||
|
shape = SubResource("BoxShape3D_nokgg")
|
||||||
|
|
||||||
|
[node name="VisibleOnScreenNotifier3D" type="VisibleOnScreenNotifier3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.007541895, 0.34551716, 0.3237151)
|
||||||
|
aabb = AABB(-1.1488216, -0.65816104, -1.7166415, 2.2976432, 1.2323378, 3.433283)
|
||||||
|
|
||||||
|
[connection signal="screen_exited" from="VisibleOnScreenNotifier3D" to="." method="_on_visible_on_screen_notifier_3d_screen_exited"]
|
||||||
57
3d-tutorial/3d_squash_the_creeps_starter/player.gd
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
extends CharacterBody3D
|
||||||
|
|
||||||
|
@export var speed = 14
|
||||||
|
@export var fall_acc = 75
|
||||||
|
@export var jump_impulse = 50
|
||||||
|
@export var bounce_impulse = 40
|
||||||
|
|
||||||
|
var target_vel = Vector3.ZERO
|
||||||
|
|
||||||
|
|
||||||
|
func _physics_process(delta: float) -> void:
|
||||||
|
# Move
|
||||||
|
var dir = Vector3.ZERO
|
||||||
|
if Input.is_action_pressed("move_left"):
|
||||||
|
dir.x -= 1
|
||||||
|
if Input.is_action_pressed("move_right"):
|
||||||
|
dir.x += 1
|
||||||
|
if Input.is_action_pressed("move_forward"):
|
||||||
|
dir.z -= 1
|
||||||
|
if Input.is_action_pressed("move_back"):
|
||||||
|
dir.z += 1
|
||||||
|
|
||||||
|
if dir != Vector3.ZERO:
|
||||||
|
dir = dir.normalized()
|
||||||
|
$Pivot.basis = Basis.looking_at(dir)
|
||||||
|
|
||||||
|
# Ground vel. (overwrite y later)
|
||||||
|
target_vel = dir * speed
|
||||||
|
|
||||||
|
# vert. vel.
|
||||||
|
target_vel.y = 0
|
||||||
|
if not is_on_floor():
|
||||||
|
target_vel.y -= fall_acc * delta
|
||||||
|
|
||||||
|
# Jump
|
||||||
|
if is_on_floor() and Input.is_action_just_pressed("jump"):
|
||||||
|
target_vel.y = jump_impulse
|
||||||
|
|
||||||
|
# Iterate through all collisions that occurred this frame
|
||||||
|
for index in range(get_slide_collision_count()):
|
||||||
|
var collision = get_slide_collision(index)
|
||||||
|
|
||||||
|
# Avoid calling collision again after deleting
|
||||||
|
if collision.get_collider() == null:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if collision.get_collider().is_in_group("mob"):
|
||||||
|
var mob = collision.get_collider()
|
||||||
|
# hitting it from above.
|
||||||
|
if Vector3.UP.dot(collision.get_normal()) > 0.1:
|
||||||
|
mob.squash()
|
||||||
|
if !is_on_floor(): # TODO: This does not seem to work here
|
||||||
|
target_vel.y = bounce_impulse
|
||||||
|
break
|
||||||
|
|
||||||
|
velocity = target_vel
|
||||||
|
move_and_slide()
|
||||||
1
3d-tutorial/3d_squash_the_creeps_starter/player.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://cnd3r3qyfy5so
|
||||||
21
3d-tutorial/3d_squash_the_creeps_starter/player.tscn
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
[gd_scene load_steps=4 format=3 uid="uid://ceuu150fmggvr"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://d0ypm0v45pwdv" path="res://art/player.glb" id="1_4flbx"]
|
||||||
|
[ext_resource type="Script" uid="uid://cnd3r3qyfy5so" path="res://player.gd" id="1_onrkg"]
|
||||||
|
|
||||||
|
[sub_resource type="SphereShape3D" id="SphereShape3D_4flbx"]
|
||||||
|
radius = 1.0
|
||||||
|
|
||||||
|
[node name="Player" type="CharacterBody3D"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.3503281, 0)
|
||||||
|
collision_mask = 6
|
||||||
|
script = ExtResource("1_onrkg")
|
||||||
|
|
||||||
|
[node name="Pivot" type="Node3D" parent="."]
|
||||||
|
|
||||||
|
[node name="Character" parent="Pivot" instance=ExtResource("1_4flbx")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0)
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
||||||
|
shape = SubResource("SphereShape3D_4flbx")
|
||||||
68
3d-tutorial/3d_squash_the_creeps_starter/project.godot
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
; Engine configuration file.
|
||||||
|
; It's best edited using the editor UI and not directly,
|
||||||
|
; since the parameters that go here are not all obvious.
|
||||||
|
;
|
||||||
|
; Format:
|
||||||
|
; [section] ; section goes between []
|
||||||
|
; param=value ; assign values to parameters
|
||||||
|
|
||||||
|
config_version=5
|
||||||
|
|
||||||
|
[application]
|
||||||
|
|
||||||
|
config/name="Squash the Creeps (3D)"
|
||||||
|
config/description="In this game, your goal is to chase and kick out the creeps!"
|
||||||
|
run/main_scene="uid://2wap0283yk0r"
|
||||||
|
config/features=PackedStringArray("4.5")
|
||||||
|
config/icon="res://icon.webp"
|
||||||
|
|
||||||
|
[display]
|
||||||
|
|
||||||
|
window/size/viewport_width=720
|
||||||
|
window/size/viewport_height=540
|
||||||
|
|
||||||
|
[filesystem]
|
||||||
|
|
||||||
|
import/blender/enabled=false
|
||||||
|
|
||||||
|
[input]
|
||||||
|
|
||||||
|
move_left={
|
||||||
|
"deadzone": 0.2,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
move_right={
|
||||||
|
"deadzone": 0.2,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
move_forward={
|
||||||
|
"deadzone": 0.2,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
move_back={
|
||||||
|
"deadzone": 0.2,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
jump={
|
||||||
|
"deadzone": 0.2,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
[layer_names]
|
||||||
|
|
||||||
|
3d_physics/layer_1="players"
|
||||||
|
3d_physics/layer_2="enemies"
|
||||||
|
3d_physics/layer_3="world"
|
||||||
|
|
||||||
|
[rendering]
|
||||||
|
|
||||||
|
anti_aliasing/quality/msaa_3d=2
|
||||||
25
README.md
@@ -1,25 +1,2 @@
|
|||||||
# Evolve Die Repeat TODO: The name is a work in progress
|
# notSpore
|
||||||
|
|
||||||
This is currently quite empty.
|
|
||||||
|
|
||||||
## C++ setup
|
|
||||||
From anywhere in proejct:
|
|
||||||
```bash
|
|
||||||
git submodule update --init --recursive
|
|
||||||
```
|
|
||||||
|
|
||||||
In `thirdparty`:
|
|
||||||
```bash
|
|
||||||
godot --headless --dump-extension-api
|
|
||||||
```
|
|
||||||
|
|
||||||
To compile the cpp extension, run this from `thirdparty/godot-cpp`:
|
|
||||||
```bash
|
|
||||||
scons platform=linux target=template_debug generate_bindings=yes custom_api_file=../extension_api.json -j8
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, to compile and extern local `.cpp` files, run this from `thirdparty`:
|
|
||||||
```bash
|
|
||||||
scons platform=linux target=template_debug -j8
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
charset = utf-8
|
|
||||||
2
evolve-die-repeat/.gitattributes
vendored
@@ -1,2 +0,0 @@
|
|||||||
# Normalize EOL for all files that Git considers text files.
|
|
||||||
* text=auto eol=lf
|
|
||||||
3
evolve-die-repeat/.gitignore
vendored
@@ -1,3 +0,0 @@
|
|||||||
# Godot 4+ specific ignores
|
|
||||||
.godot/
|
|
||||||
/android/
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
extends Label
|
|
||||||
|
|
||||||
#var counter := Test.new() # C++ class
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
#text += str(counter.get_counter())
|
|
||||||
pass
|
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
#if Input.is_action_just_pressed("ui_accept"):
|
|
||||||
#counter.increment()
|
|
||||||
#var baseText := text
|
|
||||||
#baseText = baseText.left(baseText.length() - str(counter.get_counter()).length())
|
|
||||||
#text = baseText + str(counter.get_counter())
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://ceut2lrvkns75
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
extends Node
|
|
||||||
|
|
||||||
var screen_size = Vector2(1920.0, 1080.0) # Default screen size (this is a float for some reason)
|
|
||||||
var viewport_size
|
|
||||||
@onready var extent: Rect2 = get_viewport().get_visible_rect()
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
viewport_size = get_viewport().get_visible_rect().size
|
|
||||||
|
|
||||||
# TODO: This needs to be called from a script inheriting a CharacterBody2D (e.g. the player)
|
|
||||||
# Alternative would be to pass the player reference to this script (which might be better?)
|
|
||||||
func init_screen_size(x:float, y:float) -> void:
|
|
||||||
screen_size.x = x
|
|
||||||
screen_size.y = y
|
|
||||||
|
|
||||||
# This can take a vector of any size (but should be 2d, other components are unused)
|
|
||||||
func get_boundaried_position(position):
|
|
||||||
## clamp
|
|
||||||
#return position.clamp(Vector2.ZERO, screen_size)
|
|
||||||
|
|
||||||
## periodic
|
|
||||||
position.x = wrapf(position.x, 0, screen_size.x)
|
|
||||||
position.y = wrapf(position.y, 0, screen_size.y)
|
|
||||||
return position
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://vsbibc5fanou
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 995 B |
@@ -1,43 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://uqy71st3rbdr"
|
|
||||||
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://icon.svg"
|
|
||||||
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
svg/scale=1.0
|
|
||||||
editor/scale_with_editor_scale=false
|
|
||||||
editor/convert_colors_with_editor_theme=false
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
extends Control
|
|
||||||
|
|
||||||
|
|
||||||
func _on_play_button_pressed() -> void:
|
|
||||||
get_tree().change_scene_to_file("res://molecular/molecular_stage.tscn")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://dxc66bci2ivrj
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://drgv154ei1vrl"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://dxc66bci2ivrj" path="res://main_menu.gd" id="1_06t4h"]
|
|
||||||
|
|
||||||
[sub_resource type="LabelSettings" id="LabelSettings_rhts7"]
|
|
||||||
font_size = 64
|
|
||||||
|
|
||||||
[node name="MainMenu" type="Control"]
|
|
||||||
layout_mode = 3
|
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
|
||||||
anchor_bottom = 1.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 2
|
|
||||||
script = ExtResource("1_06t4h")
|
|
||||||
|
|
||||||
[node name="PlayButton" type="Button" parent="."]
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 448.0
|
|
||||||
offset_top = 256.0
|
|
||||||
offset_right = 768.0
|
|
||||||
offset_bottom = 314.0
|
|
||||||
text = "Play"
|
|
||||||
|
|
||||||
[node name="MainMenuText" type="Label" parent="."]
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 320.0
|
|
||||||
offset_top = 32.0
|
|
||||||
offset_right = 904.0
|
|
||||||
offset_bottom = 151.0
|
|
||||||
text = "The Main Menu"
|
|
||||||
label_settings = SubResource("LabelSettings_rhts7")
|
|
||||||
horizontal_alignment = 1
|
|
||||||
vertical_alignment = 1
|
|
||||||
|
|
||||||
[connection signal="pressed" from="PlayButton" to="." method="_on_play_button_pressed"]
|
|
||||||
|
Before Width: | Height: | Size: 72 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://dnlrq8gxiix6"
|
|
||||||
path="res://.godot/imported/bg-far-placeholder.jpg-01304d9c071eca65de57b4adc0479e81.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/background/bg-far-placeholder.jpg"
|
|
||||||
dest_files=["res://.godot/imported/bg-far-placeholder.jpg-01304d9c071eca65de57b4adc0479e81.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 450 B |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://c3cuhrmulyy1s"
|
|
||||||
path="res://.godot/imported/bg-near.png-00577ad303726b65cb5579d462bbdf09.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/background/bg-near.png"
|
|
||||||
dest_files=["res://.godot/imported/bg-near.png-00577ad303726b65cb5579d462bbdf09.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 960 B |
|
Before Width: | Height: | Size: 887 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://boknmstvkc0a2"
|
|
||||||
path="res://.godot/imported/player-sprite-placeholder-attacking-crop.png-7a6a3f2b68f208c74f7cac8cb16cfc5e.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/player-sprite-placeholder-attacking-crop.png"
|
|
||||||
dest_files=["res://.godot/imported/player-sprite-placeholder-attacking-crop.png-7a6a3f2b68f208c74f7cac8cb16cfc5e.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 715 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://cxwvga07sm3yl"
|
|
||||||
path="res://.godot/imported/player-sprite-placeholder-crop.png-f29c3ab24e261ab3d11fb066419e0b90.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/player-sprite-placeholder-crop.png"
|
|
||||||
dest_files=["res://.godot/imported/player-sprite-placeholder-crop.png-f29c3ab24e261ab3d11fb066419e0b90.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://dnqwe065lmv0h"
|
|
||||||
path="res://.godot/imported/player-sprite-placeholder.png-6805db1633c9b4853860db48d10b2af1.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/player-sprite-placeholder.png"
|
|
||||||
dest_files=["res://.godot/imported/player-sprite-placeholder.png-6805db1633c9b4853860db48d10b2af1.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 5.0 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://bhcb5g7g7um8"
|
|
||||||
path="res://.godot/imported/prey-dying-frame0.png-3dfc6299514225b1b5ecd511feec558a.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/prey/prey-dying-frame0.png"
|
|
||||||
dest_files=["res://.godot/imported/prey-dying-frame0.png-3dfc6299514225b1b5ecd511feec558a.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://bxn11avw7dykl"
|
|
||||||
path="res://.godot/imported/prey-dying-frame1.png-8e3f40908415d07a432ca919106bfe5f.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/prey/prey-dying-frame1.png"
|
|
||||||
dest_files=["res://.godot/imported/prey-dying-frame1.png-8e3f40908415d07a432ca919106bfe5f.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 5.0 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://ctkehsavw6ghx"
|
|
||||||
path="res://.godot/imported/prey-healthy-frame0.png-fdee965b6537e072b2ba52ebaa00234a.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/prey/prey-healthy-frame0.png"
|
|
||||||
dest_files=["res://.godot/imported/prey-healthy-frame0.png-fdee965b6537e072b2ba52ebaa00234a.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 4.7 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://uy28y3mkk6nt"
|
|
||||||
path="res://.godot/imported/prey-healthy-frame1.png-d0ef89a578931d076b5469c218505713.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/prey/prey-healthy-frame1.png"
|
|
||||||
dest_files=["res://.godot/imported/prey-healthy-frame1.png-d0ef89a578931d076b5469c218505713.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 6.2 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://btnyajci8ptb2"
|
|
||||||
path="res://.godot/imported/prey-injured-frame0.png-de2d8ee9861665f890cb3ef99d676bc3.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/prey/prey-injured-frame0.png"
|
|
||||||
dest_files=["res://.godot/imported/prey-injured-frame0.png-de2d8ee9861665f890cb3ef99d676bc3.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
|
Before Width: | Height: | Size: 5.8 KiB |
@@ -1,40 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://bqll8ge4cr2uf"
|
|
||||||
path="res://.godot/imported/prey-injured-frame1.png-6fdfb22e05a71b519337c6ac43b474b1.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://molecular/assets/prey/prey-injured-frame1.png"
|
|
||||||
dest_files=["res://.godot/imported/prey-injured-frame1.png-6fdfb22e05a71b519337c6ac43b474b1.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=0
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=false
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=1
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
extends CharacterBody2D
|
|
||||||
|
|
||||||
@export var attack_duration = 0.4
|
|
||||||
@export var attack_cooldown_duration = 0.6
|
|
||||||
|
|
||||||
@onready var attack_area: Area2D = $AttackArea
|
|
||||||
@onready var attack_timer: Timer = $AttackTimer
|
|
||||||
@onready var attack_cooldown_timer: Timer = $AttackCooldownTimer
|
|
||||||
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
|
|
||||||
|
|
||||||
@export var speed = 200
|
|
||||||
var damage = 10
|
|
||||||
var can_attack = true
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
var screen_size = get_viewport_rect().size
|
|
||||||
GameManager.init_screen_size(screen_size.x, screen_size.y)
|
|
||||||
|
|
||||||
attack_area.monitoring = false # no collision until attacking
|
|
||||||
attack_timer.wait_time = attack_duration
|
|
||||||
attack_cooldown_timer.wait_time = attack_cooldown_duration
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
velocity = Vector2.ZERO
|
|
||||||
if Input.is_action_pressed("move_right"):
|
|
||||||
velocity.x += 1
|
|
||||||
if Input.is_action_pressed("move_left"):
|
|
||||||
velocity.x -= 1
|
|
||||||
if Input.is_action_pressed("move_down"):
|
|
||||||
velocity.y += 1
|
|
||||||
if Input.is_action_pressed("move_up"):
|
|
||||||
velocity.y -= 1
|
|
||||||
if Input.is_action_pressed("try_attack"):
|
|
||||||
try_attack()
|
|
||||||
|
|
||||||
if not velocity.is_zero_approx():
|
|
||||||
self.rotation = atan2(velocity.y, velocity.x)
|
|
||||||
move_and_collide(speed * velocity * delta)
|
|
||||||
#position += speed * velocity * delta
|
|
||||||
position = GameManager.get_boundaried_position(position)
|
|
||||||
|
|
||||||
func try_attack() -> void:
|
|
||||||
if not can_attack:
|
|
||||||
return
|
|
||||||
attack()
|
|
||||||
|
|
||||||
func attack() -> void:
|
|
||||||
can_attack = false
|
|
||||||
attack_area.monitoring = true
|
|
||||||
attack_timer.start()
|
|
||||||
sprite.play("attacking")
|
|
||||||
|
|
||||||
func _on_attack_timeout() -> void:
|
|
||||||
attack_area.monitoring = false
|
|
||||||
sprite.play("default")
|
|
||||||
attack_cooldown_timer.start()
|
|
||||||
|
|
||||||
func _on_cooldown_timeout() -> void:
|
|
||||||
can_attack = true
|
|
||||||
|
|
||||||
func _on_attack_hit(body: Node2D) -> void:
|
|
||||||
var hit_hittable = false
|
|
||||||
if body.is_in_group("prey") or body.is_in_group("predators"):
|
|
||||||
if body.has_method("handle_damage"):
|
|
||||||
body.handle_damage(damage, self)
|
|
||||||
hit_hittable = true
|
|
||||||
elif body.is_in_group("resources"):
|
|
||||||
pass
|
|
||||||
if hit_hittable:
|
|
||||||
await get_tree().create_timer(0.2).timeout
|
|
||||||
sprite.play("default")
|
|
||||||
# TODO: resource handling logic
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://di7eglnrnqm6i
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
[gd_scene load_steps=7 format=3 uid="uid://dxluckxdkpv4f"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://di7eglnrnqm6i" path="res://molecular/molecular_player.gd" id="1_0ix7k"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://boknmstvkc0a2" path="res://molecular/assets/player-sprite-placeholder-attacking-crop.png" id="2_5hxmy"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://cxwvga07sm3yl" path="res://molecular/assets/player-sprite-placeholder-crop.png" id="2_en8op"]
|
|
||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="SpriteFrames_onrkg"]
|
|
||||||
animations = [{
|
|
||||||
"frames": [{
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("2_5hxmy")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"attacking",
|
|
||||||
"speed": 5.0
|
|
||||||
}, {
|
|
||||||
"frames": [{
|
|
||||||
"duration": 5.0,
|
|
||||||
"texture": ExtResource("2_en8op")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"default",
|
|
||||||
"speed": 5.0
|
|
||||||
}]
|
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id="CircleShape2D_5hxmy"]
|
|
||||||
radius = 378.18
|
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_4flbx"]
|
|
||||||
radius = 191.95984
|
|
||||||
height = 1295.8773
|
|
||||||
|
|
||||||
[node name="player" type="CharacterBody2D"]
|
|
||||||
collision_mask = 2
|
|
||||||
script = ExtResource("1_0ix7k")
|
|
||||||
|
|
||||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
|
|
||||||
visibility_layer = 2
|
|
||||||
scale = Vector2(0.5, 0.5)
|
|
||||||
sprite_frames = SubResource("SpriteFrames_onrkg")
|
|
||||||
|
|
||||||
[node name="AttackArea" type="Area2D" parent="."]
|
|
||||||
position = Vector2(0, 56)
|
|
||||||
rotation = -1.5732701
|
|
||||||
collision_mask = 2
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="AttackArea"]
|
|
||||||
position = Vector2(41.029465, 288.86832)
|
|
||||||
shape = SubResource("CircleShape2D_5hxmy")
|
|
||||||
debug_color = Color(0.80813414, 0.3957308, 0.3356335, 0.41960785)
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="." groups=["player"]]
|
|
||||||
rotation = -1.5732701
|
|
||||||
shape = SubResource("CapsuleShape2D_4flbx")
|
|
||||||
|
|
||||||
[node name="AttackTimer" type="Timer" parent="."]
|
|
||||||
one_shot = true
|
|
||||||
|
|
||||||
[node name="AttackCooldownTimer" type="Timer" parent="."]
|
|
||||||
one_shot = true
|
|
||||||
|
|
||||||
[connection signal="body_entered" from="AttackArea" to="." method="_on_attack_hit"]
|
|
||||||
[connection signal="timeout" from="AttackTimer" to="." method="_on_attack_timeout"]
|
|
||||||
[connection signal="timeout" from="AttackCooldownTimer" to="." method="_on_cooldown_timeout"]
|
|
||||||
@@ -1,153 +0,0 @@
|
|||||||
extends AbstractPrey2D
|
|
||||||
|
|
||||||
@onready var sprite = get_node("AnimatedSprite2D")
|
|
||||||
@onready var fsm = $StateMachine
|
|
||||||
|
|
||||||
@export var speed = 0.5
|
|
||||||
var desired_rotation: float = self.rotation
|
|
||||||
|
|
||||||
# Mirrored sprites for periodic boundary
|
|
||||||
var mirrorSprite1: Node2D
|
|
||||||
var mirrorSprite2: Node2D
|
|
||||||
var mirrorSprite3: Node2D
|
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
health = maxHealth
|
|
||||||
sprite.play("Healthy")
|
|
||||||
|
|
||||||
mirrorSprite1 = sprite.duplicate()
|
|
||||||
sprite.play("Healthy")
|
|
||||||
|
|
||||||
mirrorSprite2 = sprite.duplicate()
|
|
||||||
sprite.play("Healthy")
|
|
||||||
|
|
||||||
mirrorSprite3 = sprite.duplicate()
|
|
||||||
sprite.play("Healthy")
|
|
||||||
|
|
||||||
add_child(mirrorSprite1)
|
|
||||||
add_child(mirrorSprite2)
|
|
||||||
add_child(mirrorSprite3)
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
# smoothly rotate
|
|
||||||
if self.rotation != self.desired_rotation: # FIXME: causes the mirror sprites to flip out
|
|
||||||
self.rotation = lerp_angle(self.rotation, self.desired_rotation, clampf(4 * delta, 0, 1))
|
|
||||||
|
|
||||||
# Boundary mirroring
|
|
||||||
_handle_wrapping()
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
func move(motion: Vector3) -> void:
|
|
||||||
move_and_collide(Vector2(motion.x, motion.y).normalized() * self.speed) # Moves along the given vector
|
|
||||||
self.desired_rotation = atan2(motion.y, motion.x)
|
|
||||||
|
|
||||||
# Apply boundary to new position
|
|
||||||
position = GameManager.get_boundaried_position(position)
|
|
||||||
|
|
||||||
func handle_damage(dmg: int, src: Node) -> void:
|
|
||||||
health = max(0, health-dmg)
|
|
||||||
if health == 0:
|
|
||||||
die()
|
|
||||||
if health < maxHealth:
|
|
||||||
become_injured()
|
|
||||||
fsm.transition_to_next_state(fsm.States.FLEEING, {"threat": src})
|
|
||||||
|
|
||||||
func die() -> void:
|
|
||||||
sprite.play("Dying")
|
|
||||||
mirrorSprite1.play("Dying")
|
|
||||||
mirrorSprite2.play("Dying")
|
|
||||||
mirrorSprite3.play("Dying")
|
|
||||||
super.die()
|
|
||||||
|
|
||||||
func become_injured() -> void:
|
|
||||||
sprite.play("Injured")
|
|
||||||
mirrorSprite1.play("Injured")
|
|
||||||
mirrorSprite2.play("Injured")
|
|
||||||
mirrorSprite3.play("Injured")
|
|
||||||
|
|
||||||
func _on_sight_body_entered(body: Node2D) -> void:
|
|
||||||
if body.is_in_group("predators") or body.is_in_group("player"):
|
|
||||||
fsm.transition_to_next_state(fsm.States.FLEEING, {"threat": body})
|
|
||||||
|
|
||||||
|
|
||||||
# Mirroring table:
|
|
||||||
# |---|---|---|---|
|
|
||||||
# | 4 | 3 | 4 | 3 |
|
|
||||||
# |---|===|===|---|
|
|
||||||
# | 1 ǁ 2 | 1 ǁ 2 |
|
|
||||||
# |---ǁ---|---ǁ---|
|
|
||||||
# | 4 ǁ 3 | 4 ǁ 3 |
|
|
||||||
# |---|===|===|---|
|
|
||||||
# | 1 | 2 | 1 | 2 |
|
|
||||||
# |---|---|---|---|
|
|
||||||
# If less than viewport size away from an edge, mirror over that edge (for seamless boundary)
|
|
||||||
# NOTE: For this to look correctly the camera size should be smaller than half the screen port (in
|
|
||||||
# any one dimension. Ideally, the difference between camera size and half the screen port is
|
|
||||||
# at least the size of the prey sprite)
|
|
||||||
func _handle_wrapping():
|
|
||||||
mirrorSprite1.visible = false
|
|
||||||
mirrorSprite2.visible = false
|
|
||||||
mirrorSprite3.visible = false
|
|
||||||
|
|
||||||
# TODO: Assume viewport size << screen size and only draw according to GameManager.viewport_size
|
|
||||||
# Find corresponding section of the screen
|
|
||||||
if position.x < GameManager.screen_size.x/2 and position.y < GameManager.screen_size.y/2:
|
|
||||||
# 2
|
|
||||||
mirrorSprite1.visible = true
|
|
||||||
mirrorSprite2.visible = true
|
|
||||||
mirrorSprite3.visible = true
|
|
||||||
|
|
||||||
# Right
|
|
||||||
mirrorSprite1.global_position = global_position + Vector2(GameManager.screen_size.x, 0)
|
|
||||||
# Diag
|
|
||||||
mirrorSprite3.global_position = global_position + Vector2(GameManager.screen_size.x, GameManager.screen_size.y)
|
|
||||||
# Bottom
|
|
||||||
mirrorSprite2.global_position = global_position + Vector2(0, GameManager.screen_size.y)
|
|
||||||
|
|
||||||
|
|
||||||
elif position.x < GameManager.screen_size.x/2:
|
|
||||||
# 3
|
|
||||||
mirrorSprite1.visible = true
|
|
||||||
mirrorSprite2.visible = true
|
|
||||||
mirrorSprite3.visible = true
|
|
||||||
|
|
||||||
# Top
|
|
||||||
mirrorSprite1.global_position = global_position + Vector2(0, - GameManager.screen_size.y)
|
|
||||||
# Diag
|
|
||||||
mirrorSprite2.global_position = global_position + Vector2(GameManager.screen_size.x, - GameManager.screen_size.y)
|
|
||||||
# Right
|
|
||||||
mirrorSprite3.global_position = global_position + Vector2(GameManager.screen_size.x, 0)
|
|
||||||
|
|
||||||
|
|
||||||
elif position.y < GameManager.screen_size.y/2:
|
|
||||||
# 1
|
|
||||||
mirrorSprite1.visible = true
|
|
||||||
mirrorSprite2.visible = true
|
|
||||||
mirrorSprite3.visible = true
|
|
||||||
|
|
||||||
# Left
|
|
||||||
mirrorSprite1.global_position = global_position + Vector2(- GameManager.screen_size.x, 0)
|
|
||||||
# Bottom
|
|
||||||
mirrorSprite2.global_position = global_position + Vector2(0, GameManager.screen_size.y)
|
|
||||||
# Diag
|
|
||||||
mirrorSprite3.global_position = global_position + Vector2(- GameManager.screen_size.x, GameManager.screen_size.y)
|
|
||||||
|
|
||||||
|
|
||||||
else:
|
|
||||||
# 4
|
|
||||||
mirrorSprite1.visible = true
|
|
||||||
mirrorSprite2.visible = true
|
|
||||||
mirrorSprite3.visible = true
|
|
||||||
|
|
||||||
# Left
|
|
||||||
mirrorSprite1.global_position = global_position + Vector2(- GameManager.screen_size.x, 0)
|
|
||||||
# Diag
|
|
||||||
mirrorSprite2.global_position = global_position + Vector2(- GameManager.screen_size.x, - GameManager.screen_size.y)
|
|
||||||
# Top
|
|
||||||
mirrorSprite3.global_position = global_position + Vector2(0, - GameManager.screen_size.y)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://bgossk6xo31gi
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
[gd_scene format=3 uid="uid://c3iw2v3x6ngrb"]
|
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bvsdg1v3ksixy" path="res://shared/npc/prey2D.tscn" id="1_qvulj"]
|
|
||||||
[ext_resource type="Script" uid="uid://bgossk6xo31gi" path="res://molecular/prey/nucleotide_prey.gd" id="2_0227s"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bhcb5g7g7um8" path="res://molecular/assets/prey/prey-dying-frame0.png" id="2_lkj7f"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bxn11avw7dykl" path="res://molecular/assets/prey/prey-dying-frame1.png" id="3_svqyr"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://ctkehsavw6ghx" path="res://molecular/assets/prey/prey-healthy-frame0.png" id="4_ee1gb"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://uy28y3mkk6nt" path="res://molecular/assets/prey/prey-healthy-frame1.png" id="5_ae5nf"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://btnyajci8ptb2" path="res://molecular/assets/prey/prey-injured-frame0.png" id="6_0f87h"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bqll8ge4cr2uf" path="res://molecular/assets/prey/prey-injured-frame1.png" id="7_w7inl"]
|
|
||||||
[ext_resource type="Script" uid="uid://0vwv2nt16gpv" path="res://molecular/prey/nucleotide_prey_state_machine.gd" id="9_xxtgy"]
|
|
||||||
[ext_resource type="Script" uid="uid://ubcu8fdfxxj1" path="res://molecular/prey/nucleotide_prey_random_movement.gd" id="10_rgguv"]
|
|
||||||
[ext_resource type="Script" uid="uid://xbiqj7ubmj7d" path="res://molecular/prey/nucleotide_prey_idle.gd" id="12_ubfhk"]
|
|
||||||
[ext_resource type="Script" uid="uid://dlw7inlh6asvu" path="res://molecular/prey/nucleotide_prey_fleeing.gd" id="12_xxtgy"]
|
|
||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="SpriteFrames_66x8p"]
|
|
||||||
animations = [{
|
|
||||||
"frames": [{
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("2_lkj7f")
|
|
||||||
}, {
|
|
||||||
"duration": 20.0,
|
|
||||||
"texture": ExtResource("3_svqyr")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"Dying",
|
|
||||||
"speed": 1.0
|
|
||||||
}, {
|
|
||||||
"frames": [{
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("4_ee1gb")
|
|
||||||
}, {
|
|
||||||
"duration": 20.0,
|
|
||||||
"texture": ExtResource("5_ae5nf")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"Healthy",
|
|
||||||
"speed": 1.0
|
|
||||||
}, {
|
|
||||||
"frames": [{
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("6_0f87h")
|
|
||||||
}, {
|
|
||||||
"duration": 20.0,
|
|
||||||
"texture": ExtResource("7_w7inl")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"Injured",
|
|
||||||
"speed": 1.0
|
|
||||||
}]
|
|
||||||
|
|
||||||
[node name="NucleotidePrey" unique_id=740525631 groups=["prey"] instance=ExtResource("1_qvulj")]
|
|
||||||
collision_layer = 2
|
|
||||||
motion_mode = 1
|
|
||||||
script = ExtResource("2_0227s")
|
|
||||||
speed = 0.5
|
|
||||||
maxHealth = 20
|
|
||||||
|
|
||||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." index="0" unique_id=788182944]
|
|
||||||
rotation = 1.5707964
|
|
||||||
scale = Vector2(0.1, 0.1)
|
|
||||||
sprite_frames = SubResource("SpriteFrames_66x8p")
|
|
||||||
animation = &"Healthy"
|
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" parent="." index="1"]
|
|
||||||
position = Vector2(6.929083, 3.0664783)
|
|
||||||
rotation = 0.474154
|
|
||||||
|
|
||||||
[node name="StateMachine" type="Node" parent="." index="2" unique_id=445822474 node_paths=PackedStringArray("initial_state")]
|
|
||||||
script = ExtResource("9_xxtgy")
|
|
||||||
initial_state = NodePath("Idle")
|
|
||||||
|
|
||||||
[node name="RandomMovement" type="Node" parent="StateMachine" index="0" unique_id=1422146232]
|
|
||||||
script = ExtResource("10_rgguv")
|
|
||||||
|
|
||||||
[node name="Timer" type="Timer" parent="StateMachine/RandomMovement" index="0" unique_id=593528934]
|
|
||||||
one_shot = true
|
|
||||||
|
|
||||||
[node name="Fleeing" type="Node" parent="StateMachine" index="1" unique_id=1125485674]
|
|
||||||
script = ExtResource("12_xxtgy")
|
|
||||||
|
|
||||||
[node name="Idle" type="Node" parent="StateMachine" index="2" unique_id=1424222731]
|
|
||||||
script = ExtResource("12_ubfhk")
|
|
||||||
|
|
||||||
[node name="Timer" type="Timer" parent="StateMachine/Idle" index="0" unique_id=1050348256]
|
|
||||||
one_shot = true
|
|
||||||
|
|
||||||
[node name="Sight" type="Area2D" parent="." index="3" unique_id=1773478588]
|
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Sight" index="0" unique_id=338757598]
|
|
||||||
rotation = 1.5707964
|
|
||||||
polygon = PackedVector2Array(3.8686981, -6.2705374, 7.0000973, -0.08602524, 3.5555592, 5.6287766, -3.0986624, 5.589636, -6.1517763, 0.031402588, -2.942093, -6.0748243, -29.993027, -74.37026, -11.10141, -83.6233, 9.332382, -84.00884, 35.163773, -77.06906)
|
|
||||||
|
|
||||||
[connection signal="timeout" from="StateMachine/RandomMovement/Timer" to="StateMachine/RandomMovement" method="_on_timer_timeout"]
|
|
||||||
[connection signal="timeout" from="StateMachine/Idle/Timer" to="StateMachine/Idle" method="_on_timer_timeout"]
|
|
||||||
[connection signal="body_entered" from="Sight" to="." method="_on_sight_body_entered"]
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
extends State
|
|
||||||
|
|
||||||
var threat: Node2D
|
|
||||||
var threshold: float = 100
|
|
||||||
|
|
||||||
func enter(previous_state_path: String, data := {}) -> void:
|
|
||||||
if data.has("threat"):
|
|
||||||
threat = data["threat"]
|
|
||||||
else:
|
|
||||||
# default behaviour; do nothing
|
|
||||||
threat = owner
|
|
||||||
|
|
||||||
func physics_update(_delta: float) -> void:
|
|
||||||
if owner.position.distance_to(threat.position) > threshold or threat == owner:
|
|
||||||
finished.emit(owner.fsm.States.IDLE, {})
|
|
||||||
return
|
|
||||||
owner.move(flee_from(threat.position))
|
|
||||||
|
|
||||||
func flee_from(pos: Vector2) -> Vector3:
|
|
||||||
var diff = threat.position - owner.position
|
|
||||||
diff = diff.normalized() * -1
|
|
||||||
return Vector3(diff.x, diff.y ,0)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://dlw7inlh6asvu
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
extends State
|
|
||||||
|
|
||||||
@onready var timer = $Timer
|
|
||||||
var dir = Vector3(1, 1, 0)
|
|
||||||
|
|
||||||
func enter(previous_state_path: String, data := {}) -> void:
|
|
||||||
timer.start((float)(randi() % 5)/5)
|
|
||||||
|
|
||||||
func physics_update(_delta: float) -> void:
|
|
||||||
owner.move(_delta * Vector3(randfn(0, 1), randfn(0, 1), 0))
|
|
||||||
|
|
||||||
func _on_timer_timeout() -> void:
|
|
||||||
if (randi() % 4 != 0):
|
|
||||||
finished.emit(owner.fsm.States.RANDOMMOVEMENT, {})
|
|
||||||
else:
|
|
||||||
finished.emit(owner.fsm.States.IDLE, {})
|
|
||||||
|
|
||||||
func exit() -> void:
|
|
||||||
timer.stop()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://xbiqj7ubmj7d
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
extends State
|
|
||||||
|
|
||||||
@onready var timer = $Timer
|
|
||||||
var dir: Vector3 = Vector3(0,0,0);
|
|
||||||
|
|
||||||
func enter(previous_state_path: String, data := {}) -> void:
|
|
||||||
timer.start((float)(randi() % 10)/20)
|
|
||||||
dir = calc_dir(randi() % 360)
|
|
||||||
|
|
||||||
func physics_update(_delta: float) -> void:
|
|
||||||
owner.move(dir)
|
|
||||||
|
|
||||||
func calc_dir(angle: float) -> Vector3:
|
|
||||||
return Vector3(cos(angle), sin(angle), 0)
|
|
||||||
|
|
||||||
func _on_timer_timeout() -> void:
|
|
||||||
finished.emit(owner.fsm.States.IDLE, {})
|
|
||||||
|
|
||||||
func exit() -> void:
|
|
||||||
timer.stop()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://ubcu8fdfxxj1
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
extends StateMachine
|
|
||||||
|
|
||||||
enum States {IDLE, RANDOMMOVEMENT, FEEDING, FLEEING}
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
super()
|
|
||||||
await owner.ready
|
|
||||||
|
|
||||||
|
|
||||||
func transition_to_next_state(target: int, data: Dictionary = {}) -> void:
|
|
||||||
match target:
|
|
||||||
States.IDLE: _transition_to_next_state("Idle", data)
|
|
||||||
States.RANDOMMOVEMENT: _transition_to_next_state("RandomMovement", data)
|
|
||||||
States.FEEDING: _transition_to_next_state("Feeding", data)
|
|
||||||
States.FLEEING: _transition_to_next_state("Fleeing", data)
|
|
||||||
_: push_error("Trying to transition to unknown state {target}")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://0vwv2nt16gpv
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
extends SpawnManager2D
|
|
||||||
|
|
||||||
#@export var cam: Camera2D
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
spawnRange = GameManager.extent
|
|
||||||
#spawnRange = cam.get_viewport_rect()
|
|
||||||
call_deferred("_spawn_minimum")
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://umx4w11edif
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
; Engine configuration file.
|
|
||||||
; It's best edited using the editor UI and not directly,
|
|
||||||
; since the parameters that go here are not all obvious.
|
|
||||||
;
|
|
||||||
; Format:
|
|
||||||
; [section] ; section goes between []
|
|
||||||
; param=value ; assign values to parameters
|
|
||||||
|
|
||||||
config_version=5
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
|
|
||||||
compatibility/default_parent_skeleton_in_mesh_instance_3d=true
|
|
||||||
|
|
||||||
[application]
|
|
||||||
|
|
||||||
config/name="EvolveDieRepeat"
|
|
||||||
run/main_scene="uid://drgv154ei1vrl"
|
|
||||||
config/features=PackedStringArray("4.6", "Forward Plus")
|
|
||||||
config/icon="res://icon.svg"
|
|
||||||
|
|
||||||
[autoload]
|
|
||||||
|
|
||||||
GameManager="*res://game_manager.gd"
|
|
||||||
|
|
||||||
[editor_plugins]
|
|
||||||
|
|
||||||
enabled=PackedStringArray("res://addons/godot_vim/plugin.cfg")
|
|
||||||
|
|
||||||
[global_group]
|
|
||||||
|
|
||||||
player="All scenes that constitute players should be added here."
|
|
||||||
prey="any passive killable entities belong in this group"
|
|
||||||
|
|
||||||
[input]
|
|
||||||
|
|
||||||
move_right={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
move_left={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
move_up={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
move_down={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
try_attack={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
[layer_names]
|
|
||||||
|
|
||||||
2d_render/layer_1="Player"
|
|
||||||
2d_render/layer_2="Prey"
|
|
||||||
|
|
||||||
[rendering]
|
|
||||||
|
|
||||||
textures/canvas_textures/default_texture_filter=0
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
extends CharacterBody2D
|
|
||||||
class_name NPC2D
|
|
||||||
|
|
||||||
@export var maxHealth: int = 0
|
|
||||||
var health: int = maxHealth
|
|
||||||
|
|
||||||
signal died
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
spawn()
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
func spawn() -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
func take_damage(dmg: int) -> void:
|
|
||||||
self.health -= dmg;
|
|
||||||
if self.health < 0:
|
|
||||||
self.die()
|
|
||||||
|
|
||||||
# I think the move per npc is to model concrete behaviours in functions.
|
|
||||||
# How the npc acts can be determined elsewhere, these functions just implement the behvaiour
|
|
||||||
func flee(direction: Vector3) -> void:
|
|
||||||
push_error("Function flee() not implemented.")
|
|
||||||
|
|
||||||
# Im envisioning we feed on "sustenance (to be classed)" only; when something dies it should spawn some sustenance
|
|
||||||
func feed(source ) -> void:
|
|
||||||
push_error("Function feed() not implemented.")
|
|
||||||
|
|
||||||
func die() -> void:
|
|
||||||
died.emit()
|
|
||||||
queue_free()
|
|
||||||
# TODO: should associate this class with a loot table (or equivalent), and can then implement logic for dying in parent class here.
|
|
||||||
|
|
||||||
func move(destination: Vector3) -> void:
|
|
||||||
push_error("Function move() not implemented.")
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://biu3sctw15ga
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
[gd_scene load_steps=2 format=3 uid="uid://biup0eej85fq2"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://biu3sctw15ga" path="res://shared/npc/npc2D.gd" id="1_ucjfp"]
|
|
||||||
|
|
||||||
[node name="NPC" type="CharacterBody2D"]
|
|
||||||
script = ExtResource("1_ucjfp")
|
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
|
|
||||||
position = Vector2(7.215866, -0.5034294)
|
|
||||||
polygon = PackedVector2Array(-8.831272, -2.3390446, -5.7760534, -2.3993049, -4.0230684, 0.41277456, -5.8890305, 2.9948444, -8.862037, 2.9326901, -10.268076, 0.28495264)
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
extends NPC2D
|
|
||||||
class_name AbstractPredator2D
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
func attack(target) -> void:
|
|
||||||
push_error("Function attack() not implemented.")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://dgfimmq53whll
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://b7wqd5owafn6g"]
|
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://biup0eej85fq2" path="res://shared/npc/npc2D.tscn" id="1_4llks"]
|
|
||||||
[ext_resource type="Script" uid="uid://dgfimmq53whll" path="res://shared/npc/predator2D.gd" id="2_rj1ok"]
|
|
||||||
|
|
||||||
[node name="AbstractPredator" instance=ExtResource("1_4llks")]
|
|
||||||
script = ExtResource("2_rj1ok")
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
extends NPC2D
|
|
||||||
class_name AbstractPrey2D
|
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://76jxpubyd8wp
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://bvsdg1v3ksixy"]
|
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://biup0eej85fq2" path="res://shared/npc/npc2D.tscn" id="1_2m1le"]
|
|
||||||
[ext_resource type="Script" uid="uid://76jxpubyd8wp" path="res://shared/npc/prey2D.gd" id="2_dny00"]
|
|
||||||
|
|
||||||
[node name="AbstractPrey" instance=ExtResource("1_2m1le")]
|
|
||||||
script = ExtResource("2_dny00")
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
[gd_scene load_steps=2 format=3 uid="uid://dje58m1cj34gn"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://coetidfssb80w" path="res://shared/npc/spawn_manager_2d.gd" id="1_624qc"]
|
|
||||||
|
|
||||||
[node name="SpawnManager2d" type="Node"]
|
|
||||||
script = ExtResource("1_624qc")
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
extends Node
|
|
||||||
class_name SpawnManager2D
|
|
||||||
|
|
||||||
@export var scene: PackedScene
|
|
||||||
@export var minCount = 1
|
|
||||||
@export var maxCount = 2
|
|
||||||
@export var spawnRange: Rect2 = Rect2(0, 0, 0, 0)
|
|
||||||
var _currentCount = 0
|
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready() -> void:
|
|
||||||
_spawn_minimum()
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
func _spawn_minimum() -> void:
|
|
||||||
while _currentCount < minCount and _currentCount < maxCount:
|
|
||||||
_spawn_random()
|
|
||||||
|
|
||||||
func _random_pos() -> Vector2:
|
|
||||||
return Vector2(randf_range(spawnRange.position[0], spawnRange.size[0]), randf_range(spawnRange.position[1], spawnRange.size[1]))
|
|
||||||
|
|
||||||
func _spawn_random() -> void:
|
|
||||||
var pos = _random_pos()
|
|
||||||
_spawn_creature(pos)
|
|
||||||
_currentCount += 1
|
|
||||||
|
|
||||||
func _spawn_creature(position: Vector2) -> void:
|
|
||||||
var instance = scene.instantiate()
|
|
||||||
instance.position = position
|
|
||||||
add_child(instance)
|
|
||||||
if instance.has_signal("died"):
|
|
||||||
instance.died.connect(_on_entity_died)
|
|
||||||
|
|
||||||
func _on_entity_died() -> void:
|
|
||||||
_currentCount = max(0, _currentCount-1)
|
|
||||||
call_deferred("_spawn_minimum")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://coetidfssb80w
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
class_name State extends Node
|
|
||||||
|
|
||||||
# Emits on state completion
|
|
||||||
signal finished(next_state_path: String, data: Dictionary)
|
|
||||||
|
|
||||||
# Called by StateMachine on unhandled input
|
|
||||||
func handle_input(_event: InputEvent) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Main update loop
|
|
||||||
func update(_delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Physics update loop
|
|
||||||
func physics_update(_delta: float) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Called by StateMachine on state change. Data contains arbitrary data to initialize state.
|
|
||||||
func enter(previous_state_path: String, data := {}) -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Called by StateMachine before state change. Should be used for cleanup.
|
|
||||||
func exit() -> void:
|
|
||||||
pass
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://co2xp7gauamql
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
class_name StateMachine extends Node
|
|
||||||
|
|
||||||
@export var initial_state: State = null
|
|
||||||
|
|
||||||
# use first child as 'active' state
|
|
||||||
@onready var state: State = (func get_initial_state() -> State:
|
|
||||||
return initial_state if initial_state != null else get_child(0)
|
|
||||||
).call()
|
|
||||||
|
|
||||||
# Connect states on ready, then wait.
|
|
||||||
func _ready() -> void:
|
|
||||||
for node: State in find_children("*", "State"):
|
|
||||||
node.finished.connect(transition_to_next_state)
|
|
||||||
|
|
||||||
await owner.ready
|
|
||||||
state.enter("")
|
|
||||||
|
|
||||||
# pass unhandled input to state.
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
|
||||||
state.handle_input(event)
|
|
||||||
|
|
||||||
# Pass process tick to state.
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
state.update(delta)
|
|
||||||
|
|
||||||
# Pass physics tick to state.
|
|
||||||
func _physics_process(delta: float) -> void:
|
|
||||||
state.physics_update(delta)
|
|
||||||
|
|
||||||
# Transition to next state
|
|
||||||
func _transition_to_next_state(target_path: String, data: Dictionary = {}) -> void:
|
|
||||||
if not has_node(target_path):
|
|
||||||
printerr(owner.name + ": Trying to transition to state " + target_path + ", which does not exist.")
|
|
||||||
return
|
|
||||||
|
|
||||||
var previous_state_path := state.name
|
|
||||||
state.exit()
|
|
||||||
state = get_node(target_path)
|
|
||||||
state.enter(previous_state_path, data)
|
|
||||||
|
|
||||||
func transition_to_next_state(target: int, data: Dictionary = {}) -> void:
|
|
||||||
push_error("Child FSM failed to implement transition function.")
|
|
||||||