Added graphics options for psx effects

This commit is contained in:
2026-02-03 19:41:06 +11:00
parent 6f1105cdbe
commit c0859e26cb
35 changed files with 252 additions and 304 deletions

View File

@@ -10,8 +10,8 @@
script = ExtResource("1_k5sd1")
title = "ENEMY_FAST_BABY"
target_type = 1
scene = ExtResource("3_otbdk")
icon = ExtResource("1_xgen5")
scene = ExtResource("3_otbdk")
death_sprite = ExtResource("1_yj87d")
sprite = ExtResource("2_mkbm6")
spawn_power = 16

View File

@@ -1,7 +1,6 @@
[gd_scene format=3 uid="uid://dtahuv0kpxx03"]
[ext_resource type="Script" uid="uid://ejqql2660u6h" path="res://Worlds/GreenPlanet/Enemies/enemy_controller.gd" id="1_8k5ts"]
[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="2_8v4n0"]
[ext_resource type="PackedScene" uid="uid://canrxnpxcugc2" path="res://Scenes/corpse.tscn" id="2_vl30x"]
[ext_resource type="Script" uid="uid://cummt2be3r1gq" path="res://Scripts/hitbox.gd" id="5_f7xim"]
[ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="6_lbm5h"]
@@ -23,7 +22,6 @@ viewport_path = NodePath("SubViewport")
collision_layer = 4
collision_mask = 0
script = ExtResource("1_8k5ts")
stats = ExtResource("2_8v4n0")
status_manager = NodePath("StatusEffector")
movement_controller = NodePath("PathingController")
d_n = NodePath("Node3D")

View File

@@ -2,10 +2,9 @@
[ext_resource type="PackedScene" uid="uid://bjo2q6vca5qlv" path="res://Worlds/GreenPlanet/Enemies/air_enemy.tscn" id="1_aormu"]
[ext_resource type="PackedScene" uid="uid://o6whohcbalui" path="res://Enemies/Crystalisk/crystal_enemy.glb" id="2_myjng"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="2_s62t3"]
[ext_resource type="Script" uid="uid://cummt2be3r1gq" path="res://Scripts/hitbox.gd" id="3_myjng"]
[sub_resource type="ViewportTexture" id="ViewportTexture_tjipw"]
[sub_resource type="ViewportTexture" id="ViewportTexture_ij8ev"]
viewport_path = NodePath("SubViewport")
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_c5uwa"]
@@ -17,10 +16,9 @@ radius = 0.133503
height = 0.56
[node name="Dog" unique_id=1355419805 instance=ExtResource("1_aormu")]
stats = ExtResource("2_s62t3")
[node name="Sprite3D" parent="." index="0" unique_id=2020998819]
texture = SubResource("ViewportTexture_tjipw")
texture = SubResource("ViewportTexture_ij8ev")
[node name="crystal_enemy" parent="." index="6" unique_id=86826412 instance=ExtResource("2_myjng")]

View File

@@ -2,7 +2,7 @@
[ext_resource type="Texture2D" uid="uid://b1lwaxw62yp3p" path="res://Assets/Textures/dead_spike.png" id="1_skyfd"]
[ext_resource type="Texture2D" uid="uid://duywsy7jmh4u" path="res://Assets/Textures/spike.png" id="2_idym2"]
[ext_resource type="PackedScene" uid="uid://cveiaa0y66gln" path="res://Enemies/Crystalisk/crystal_enemy.tscn" id="3_7w5fm"]
[ext_resource type="PackedScene" uid="uid://cveiaa0y66gln" path="res://Enemies/Crystalisk/crystal_enemy.tscn" id="3_fmkhl"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="4_x2l2n"]
[ext_resource type="Texture2D" uid="uid://sybn6bjbj5fh" path="res://Assets/TextureAtlases/spike.tres" id="5_okcvf"]
@@ -10,8 +10,8 @@
script = ExtResource("4_x2l2n")
title = "ENEMY_FLYING_CRYSTAL"
target_type = 2
scene = ExtResource("3_7w5fm")
icon = ExtResource("2_idym2")
scene = ExtResource("3_fmkhl")
death_sprite = ExtResource("1_skyfd")
sprite = ExtResource("5_okcvf")
spawn_power = 6

View File

@@ -10,8 +10,8 @@
script = ExtResource("1_q48il")
title = "ENEMY_HEAVY_WALKER"
target_type = 1
scene = ExtResource("3_m808b")
icon = ExtResource("1_lck53")
scene = ExtResource("3_m808b")
death_sprite = ExtResource("1_qveaa")
sprite = ExtResource("2_7nc4x")
spawn_power = 14

View File

@@ -2,7 +2,6 @@
[ext_resource type="Script" uid="uid://ejqql2660u6h" path="res://Worlds/GreenPlanet/Enemies/enemy_controller.gd" id="1_17xxt"]
[ext_resource type="PackedScene" uid="uid://canrxnpxcugc2" path="res://Scenes/corpse.tscn" id="2_lirjc"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="2_qqld3"]
[ext_resource type="Script" uid="uid://cummt2be3r1gq" path="res://Scripts/hitbox.gd" id="5_bi7k0"]
[ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="6_k6khd"]
[ext_resource type="PackedScene" uid="uid://hjq3nrnumklp" path="res://UI/EnemyHealthBar/health_bar.tscn" id="7_wko6w"]
@@ -23,7 +22,6 @@ viewport_path = NodePath("SubViewport")
collision_layer = 4
collision_mask = 0
script = ExtResource("1_17xxt")
stats = ExtResource("2_qqld3")
status_manager = NodePath("StatusEffector")
movement_controller = NodePath("PathingController")
d_n = NodePath("Node3D")

View File

@@ -3,7 +3,7 @@
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_ivs7a"]
[ext_resource type="Texture2D" uid="uid://cdnhe2mi5c5ln" path="res://Assets/Textures/dead_eye_dog.png" id="1_r8gpy"]
[ext_resource type="Texture2D" uid="uid://g00wwrlxxdc5" path="res://Assets/Textures/icon_eye_dog.png" id="2_tyyee"]
[ext_resource type="PackedScene" uid="uid://bvq6tbkuv2mfp" path="res://Enemies/EyeDog/eye_dog.tscn" id="3_tyyee"]
[ext_resource type="PackedScene" uid="uid://bvq6tbkuv2mfp" path="res://Enemies/EyeDog/eye_dog.tscn" id="3_mxg1o"]
[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="4_7ypa6"]
[sub_resource type="AtlasTexture" id="AtlasTexture_n6kdu"]
@@ -16,8 +16,8 @@ resource_local_to_scene = true
script = ExtResource("1_ivs7a")
title = "ENEMY_DOG"
target_type = 1
scene = ExtResource("3_tyyee")
icon = ExtResource("2_tyyee")
scene = ExtResource("3_mxg1o")
death_sprite = ExtResource("1_r8gpy")
sprite = SubResource("AtlasTexture_n6kdu")
health = 180

View File

@@ -2,7 +2,6 @@
[ext_resource type="Script" uid="uid://ejqql2660u6h" path="res://Worlds/GreenPlanet/Enemies/enemy_controller.gd" id="1_1dh2f"]
[ext_resource type="PackedScene" uid="uid://canrxnpxcugc2" path="res://Scenes/corpse.tscn" id="2_1dh2f"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_2t2qp"]
[ext_resource type="Script" uid="uid://cummt2be3r1gq" path="res://Scripts/hitbox.gd" id="6_3v8fr"]
[ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="7_bkkhh"]
[ext_resource type="PackedScene" uid="uid://hjq3nrnumklp" path="res://UI/EnemyHealthBar/health_bar.tscn" id="8_k2835"]
@@ -10,11 +9,11 @@
[ext_resource type="PackedScene" uid="uid://dlhx6r23m5ceg" path="res://Enemies/EyeDog/eyedog.glb" id="10_h25mw"]
[ext_resource type="Script" uid="uid://cojjgevmbhwal" path="res://Scripts/status_effector.gd" id="11_kpdsm"]
[sub_resource type="SphereShape3D" id="SphereShape3D_cavbv"]
radius = 0.359969
[sub_resource type="BoxShape3D" id="BoxShape3D_246sn"]
size = Vector3(0.58, 0.67, 0.92)
[sub_resource type="SphereShape3D" id="SphereShape3D_h25mw"]
radius = 0.194271
radius = 0.25
[sub_resource type="ViewportTexture" id="ViewportTexture_1kwxq"]
viewport_path = NodePath("SubViewport")
@@ -23,7 +22,6 @@ viewport_path = NodePath("SubViewport")
collision_layer = 4
collision_mask = 0
script = ExtResource("1_1dh2f")
stats = ExtResource("2_2t2qp")
status_manager = NodePath("StatusEffector")
movement_controller = NodePath("PathingController")
d_n = NodePath("Node3D")
@@ -32,12 +30,12 @@ metadata/_custom_type_script = "uid://ejqql2660u6h"
[node name="Hitbox" type="CollisionShape3D" parent="." unique_id=1815903905]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.33811, -0.0104714)
shape = SubResource("SphereShape3D_cavbv")
shape = SubResource("BoxShape3D_246sn")
script = ExtResource("6_3v8fr")
metadata/_custom_type_script = "uid://cummt2be3r1gq"
[node name="Hitbox2" type="CollisionShape3D" parent="." unique_id=906346229]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.559695, -0.45924)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.9604645e-08, 0.73585325, -0.58485436)
shape = SubResource("SphereShape3D_h25mw")
script = ExtResource("6_3v8fr")
critical_zone = true
@@ -115,7 +113,7 @@ bones/23/scale = Vector3(0.89347196, 1, 1)
bones/24/position = Vector3(0.08454189, 0.014853473, 0.12984678)
[node name="AnimationPlayer" parent="eyedog" index="1" unique_id=993841819]
autoplay = &"Walk"
autoplay = &"ArmatureAction"
[connection signal="recieved_effect" from="Hitbox" to="StatusEffector" method="add_effect"]
[connection signal="took_damage" from="Hitbox" to="." method="take_damage"]

View File

@@ -5,8 +5,9 @@ extends HeroState
func enter_state() -> void:
hero.edit_tool.enabled = true
if hero.game_manager:
hero.game_manager.level.enable_non_path_tower_frames()
hero.edit_tool.enabled = true
hero.left_hand_model.visible = true
hero.gauntlet_model.visible = true
hero.cassette.visible = false

View File

@@ -100,7 +100,7 @@ func _ready() -> void:
sprite.queue_free()
player_name_tag.queue_free()
for card: Card in hero_class.deck:
if game_manager.card_gameplay:
if game_manager and game_manager.card_gameplay:
draw_pile.add(card)
else:
add_card(card)
@@ -239,7 +239,6 @@ func set_card_elements_visibility(value: bool) -> void:
else:
hud.hide_hot_wheel()
hud.hide_slots()
$FirstPersonViewport/Head2/LeftHand.visible = value
func _unhandled_input(event: InputEvent) -> void:
@@ -248,6 +247,7 @@ func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("Pause"):
var menu: PauseMenu = pause_menu_scene.instantiate() as PauseMenu
pause()
if game_manager:
menu.game_manager = game_manager
menu.quit_to_desktop_pressed.connect(game_manager.quit_to_desktop)
menu.quit_to_main_menu_pressed.connect(game_manager.scene_switch_main_menu)

View File

@@ -16,7 +16,6 @@
[ext_resource type="Script" uid="uid://b6kjrl7ae1mi0" path="res://PCs/hud.gd" id="8_yl6ka"]
[ext_resource type="Script" uid="uid://hy51bq7x0fy8" path="res://Scripts/on_top_camera.gd" id="11_4sdwe"]
[ext_resource type="PackedScene" uid="uid://rc0qcrcbmw7p" path="res://Gauntlet/gauntlet.glb" id="11_h1yfy"]
[ext_resource type="PackedScene" uid="uid://ckl5tw5rmewhp" path="res://left_hand/card_hand_model.glb" id="11_h82f6"]
[ext_resource type="Script" uid="uid://ckkioruqgbs8p" path="res://Scripts/minimap_cam.gd" id="12_3hpi3"]
[ext_resource type="PackedScene" uid="uid://clgbmveluyewe" path="res://card_hand.glb" id="12_r2yb6"]
[ext_resource type="PackedScene" uid="uid://4g0vatb73duj" path="res://Scenes/Cassette/cassette.glb" id="13_7immr"]
@@ -168,7 +167,7 @@ wave_preview_scene = ExtResource("2_o55s8")
hero_class = ExtResource("2_dbyo0")
camera = NodePath("ViewMovement/Head")
gun_camera = NodePath("FirstPersonViewport/Head2")
left_hand = NodePath("FirstPersonViewport/Head2/LeftHand")
left_hand = NodePath("FirstPersonViewport/Head2/RightHand/card_hand")
right_hand = NodePath("FirstPersonViewport/Head2/RightHand")
edit_tool = NodePath("ViewMovement/Head/EditTool")
carding_tool = NodePath("ViewMovement/Head/CardPlacingTool")
@@ -349,18 +348,6 @@ tree_root = SubResource("AnimationNodeBlendTree_xav2s")
anim_player = NodePath("../card_hand/AnimationPlayer")
parameters/Blend2/blend_amount = 0.0
[node name="LeftHand" type="Node3D" parent="FirstPersonViewport/Head2" unique_id=117309443]
transform = Transform3D(0.235, 0, 0, 0, 0.235, 0, 0, 0, 0.235, -0.645, -0.26, -1.04)
[node name="card_hand_model" parent="FirstPersonViewport/Head2/LeftHand" unique_id=141858112 instance=ExtResource("11_h82f6")]
transform = Transform3D(-4.16989, -0.848374, -3.61733e-07, -0.824933, 4.05468, -0.993384, 0.198049, -0.973442, -4.13774, 1.56596, 0.519149, 3.37051)
[node name="Body_004" parent="FirstPersonViewport/Head2/LeftHand/card_hand_model/Armature/Skeleton3D" parent_id_path=PackedInt32Array(141858112, 1120957052) index="0" unique_id=1372468431]
layers = 2
[node name="Cards" type="Node3D" parent="FirstPersonViewport/Head2/LeftHand" unique_id=140136041]
transform = Transform3D(4.25532, 0, 0, 0, 4.25532, 0, 0, 0, 4.25532, 2.01277, 0.787234, 3.39179)
[node name="MiniMapViewport" type="SubViewport" parent="." unique_id=384727742]
size = Vector2i(256, 256)
render_target_update_mode = 4
@@ -970,5 +957,4 @@ size = 2.243
[editable path="FirstPersonViewport/Head2/RightHand/gauntlet"]
[editable path="FirstPersonViewport/Head2/RightHand/card_hand"]
[editable path="FirstPersonViewport/Head2/RightHand/card_hand/Empty_001/cassette"]
[editable path="FirstPersonViewport/Head2/LeftHand/card_hand_model"]
[editable path="CoinViewport/Coin"]

View File

@@ -44,7 +44,7 @@ var enemy_count: int = 0
func _ready() -> void:
$StartWaveLabel.theme_type_variation = "WaveStartLabel"
$InteractLabel.theme_type_variation = "InteractLabel"
if player.game_manager.card_gameplay:
if player.game_manager and player.game_manager.card_gameplay:
energy_label.visible = true

View File

@@ -1,7 +1,12 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://d224ea5fdnmh2"]
[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_j6syw"]
[ext_resource type="Shader" uid="uid://dq04j2s5foo2f" path="res://Shaders/mightyduke_ps1.gdshader" id="1_6ajq0"]
[ext_resource type="Texture2D" uid="uid://epo8me1kxpba" path="res://Scenes/Cassette/cassette_cassette_tex.png" id="2_iy75q"]
[resource]
render_priority = 0
shader = ExtResource("1_j6syw")
shader = ExtResource("1_6ajq0")
shader_parameter/albedo = ExtResource("2_iy75q")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0

View File

@@ -6,11 +6,15 @@ var direction: Vector3
func _ready() -> void:
super._ready()
if goal:
distance_remaining = character.global_position.distance_to(goal.global_position)
direction = character.global_position.direction_to(goal.global_position)
func _physics_process(delta: float) -> void:
if !direction:
return
var distance_travelled: float = (character.stats.movement_speed * clampf(character.movement_speed_penalty, 0.0, 1.0)) * delta
distance_remaining -= distance_travelled
character.global_position = character.global_position + (direction * distance_travelled)

View File

@@ -24,8 +24,7 @@ var next_pos: Vector3
func _ready() -> void:
super._ready()
#if path:
# distance_remaining = path.get_baked_length()
if flow_field:
next_node = flow_field.get_closest_traversable_point(character.global_position)
distance_remaining += calculate_distance_to_goal(next_node)

View File

@@ -4,8 +4,8 @@ extends Resource
@export var title: String = "enemy name goes here"
@export var description: String = "enemy description goes here"
@export var target_type: Data.EnemyType
@export var scene: PackedScene
@export var icon: Texture
@export var scene: PackedScene
@export var death_sprite: Texture
@export var sprite: AtlasTexture
@export var spawn_power: int = 10

View File

@@ -7,6 +7,8 @@ const SAVE_PATH: String = "user://graphics_settings.tres"
@export var vsync_mode: int = 1
@export var aa_mode: int = 0
@export var windowed_mode: int = 0
@export var vertex_jitter: float = 0.2
@export var affine_warping: float = 1.0
func apply_graphical_settings(viewport: Viewport) -> void:
@@ -28,6 +30,8 @@ func apply_graphical_settings(viewport: Viewport) -> void:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
2:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN)
RenderingServer.global_shader_parameter_set("vertex_jitter", vertex_jitter)
RenderingServer.global_shader_parameter_set("affine_amount", affine_warping)
func save_profile_to_disk() -> void:

View File

@@ -44,12 +44,12 @@ func _process(delta: float) -> void:
if enemy_spawn_timers[enemy] >= enemy.spawn_cooldown:
if is_multiplayer_authority():
if type == Data.EnemyType.LAND:
networked_spawn_land_enemy.rpc(enemy.title, own_id, enemy_id)
networked_spawn_land_enemy.rpc(game_manager.level.enemy_pool.find(enemy), own_id, enemy_id)
if type == Data.EnemyType.AIR:
var radius: float = 10.0
var random_dir: Vector3 = Vector3(randf_range(-1, 1), randf_range(-1, 1), randf_range(-1, 1))
var random_pos: Vector3 = randf_range(0, radius) * random_dir.normalized()
networked_spawn_air_enemy.rpc(enemy.title, random_pos, own_id, enemy_id)
networked_spawn_air_enemy.rpc(game_manager.level.enemy_pool.find(enemy), random_pos, own_id, enemy_id)
enemy_spawn_timers[enemy] -= enemy.spawn_cooldown
enemy_spawned.emit()
@@ -60,16 +60,12 @@ func _process(delta: float) -> void:
#TODO: not sure enemies need all this info over the network
@rpc("reliable", "call_local")
func networked_spawn_land_enemy(enemy_stats: String, id1: int, id2: int) -> void:
var e_stats: Enemy = null
for enemy: Enemy in game_manager.level.enemy_pool:
if enemy.title == enemy_stats:
e_stats = enemy
func networked_spawn_land_enemy(enemy_num: int, id1: int, id2: int) -> void:
var enemy: EnemyController
enemy = e_stats.scene.instantiate()
enemy = game_manager.level.enemy_pool[enemy_num].scene.instantiate()
enemy.stats = game_manager.level.enemy_pool[enemy_num]
enemy.corpse_root = game_manager.level.corpses
enemy.name = str(id1) + str(id2)
enemy.stats = e_stats
enemy.died.connect(enemy_died_callback)
enemy.reached_goal.connect(enemy_reached_goal_callback)
#enemy.movement_controller.path = path.curve
@@ -107,17 +103,13 @@ func update_path() -> void:
@rpc("reliable", "call_local")
func networked_spawn_air_enemy(enemy_stats: String, pos: Vector3, id1: int, id2: int) -> void:
var e_stats: Enemy = null
for enemy: Enemy in game_manager.level.enemy_pool:
if enemy.title == enemy_stats:
e_stats = enemy
func networked_spawn_air_enemy(enemy_num: int, pos: Vector3, id1: int, id2: int) -> void:
var enemy: EnemyController
enemy = e_stats.scene.instantiate()
enemy = game_manager.level.enemy_pool[enemy_num].scene.instantiate()
enemy.stats = game_manager.level.enemy_pool[enemy_num]
enemy.corpse_root = game_manager.level.corpses
enemy.name = str(id1) + str(id2)
enemy.position = pos + global_position
enemy.stats = e_stats
enemy.died.connect(enemy_died_callback)
enemy.reached_goal.connect(enemy_reached_goal_callback)
enemy.movement_controller.goal = dest

View File

@@ -3,7 +3,7 @@ extends PanelContainer
signal all_players_ready()
var entry_scene: PackedScene = preload("res://Scenes/UI/scoreboard_entry.tscn")
var entry_scene: PackedScene = preload("res://UI/scoreboard_entry.tscn")
var entries: Dictionary = {}

View File

@@ -1,143 +0,0 @@
shader_type spatial;
render_mode skip_vertex_transform;
uniform bool billboard = false;
uniform sampler2D color_texture : source_color, filter_nearest, repeat_disable;
uniform vec3 tint : source_color = vec3(1);
uniform bool vertex_snapping = true;
uniform bool affine_texture_mapping = true;
group_uniforms Fog;
uniform bool add_fog = false;
uniform vec3 fog_color : source_color = vec3(0.42, 0.42, 0.45);
uniform vec2 fog_start_end = vec2(10, 100);
group_uniforms;
group_uniforms Light;
uniform bool add_dynamic_vertex_lighting = false;
uniform vec3 light_direction = vec3(0, 1, 0);
uniform float light_intensity = 1.0;
uniform vec3 ambient_light : source_color = vec3(0);
group_uniforms;
group_uniforms Dither;
uniform bool add_dither = true;
uniform float dither_spread = 1.0;
uniform float dither_gamma = 1.0;
group_uniforms;
varying vec4 clip_pos;
varying float FOG_FACTOR;
void vertex() {
mat4 model_matrix = MODEL_MATRIX;
if (billboard) {
mat4 mat_world = mat4(
normalize(INV_VIEW_MATRIX[0]),
vec4(0, 1, 0, 0),
normalize(INV_VIEW_MATRIX[2]),
MODEL_MATRIX[3]);
model_matrix = mat_world;
MODELVIEW_MATRIX = VIEW_MATRIX * mat_world;
MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);
}
vec4 world_space = model_matrix * vec4(VERTEX, 1);
vec4 clip = PROJECTION_MATRIX * VIEW_MATRIX * world_space;
vec4 vertex = clip;
// Snap to nearest pixel
if (vertex_snapping) {
vertex.xy = round(clip.xy / clip.w * VIEWPORT_SIZE.xy) / VIEWPORT_SIZE.xy * clip.w;
}
POSITION = vertex;
// Need to hold on to clip.w to reverse perspective corrections
clip_pos = vertex;
// Calculate vertex distance from camera for fog
float view_distance = length(CAMERA_POSITION_WORLD - world_space.xyz);
FOG_FACTOR = (fog_start_end.y - (view_distance)) / (fog_start_end.y - fog_start_end.x);
FOG_FACTOR = 1.0 - clamp(FOG_FACTOR, 0.0, 1.0);
NORMAL = MODEL_NORMAL_MATRIX * NORMAL;
if (add_dynamic_vertex_lighting) {
float direct_light = clamp(dot(NORMAL, normalize(light_direction)), 0, 1);
vec3 light = ambient_light + direct_light * light_intensity;
COLOR.rgb *= clamp(light, vec3(0), vec3(1));
}
// Multiply by perspective correction to undo it in fragment shader
if (affine_texture_mapping) {
UV = UV * clip_pos.w;
COLOR *= clip_pos.w;
FOG_FACTOR *= clip_pos.w;
}
}
void fragment() {
vec2 uv = UV;
vec3 vertex_color = COLOR.rgb;
float fog_factor = FOG_FACTOR;
// Undo perspective correction
if (affine_texture_mapping) {
uv /= clip_pos.w;
vertex_color /= clip_pos.w;
fog_factor /= clip_pos.w;
}
vec3 texture_color = texture(color_texture, uv).rgb;
vec3 albedo = texture_color * vertex_color * tint;
vec3 fogged = albedo;
if (add_fog) {
fogged = mix(albedo, fog_color, fog_factor);
fogged = clamp(fogged, vec3(0), vec3(1));
}
vec3 quantized = fogged;
if (add_dither) {
int ps1_dither_matrix[16] = {
-4, 0, -3, 1,
2, -2, 3, -1,
-3, 1, -4, 0,
3, -1, 2, -2
};
// Index 1D dither matrix based on 2D screen coordinates
float noise = float(ps1_dither_matrix[(int(FRAGCOORD.x) % 4) + (int(FRAGCOORD.y) % 4) * 4]);
// Apply dithering and quantize 24 bit srgb to 15 bit srgb according to https://psx-spx.consoledev.net/graphicsprocessingunitgpu/
quantized = pow(fogged, vec3(1.0 / dither_gamma)); // Convert to srgb cause it imo looks better and is probably correct idk looks more correct than linear quantization
quantized = round(quantized * 255.0 + noise); // Convert to 0-255 and add dither noise
quantized = clamp(round(quantized), vec3(0), vec3(255)); // Clamp to 0-255 in case of overflow
quantized = clamp(quantized / 8.0, vec3(0), vec3(31)); // Convert to 0-31 range
quantized /= 31.0; // Convert back to 0-1 range
quantized = pow(quantized, vec3(dither_gamma)); // Convert back to linear
}
ALBEDO = quantized;
}
void light() {
DIFFUSE_LIGHT = vec3(1);
SPECULAR_LIGHT = vec3(0);
}

View File

@@ -1 +0,0 @@
uid://bc2aherqyu3na

View File

@@ -1,49 +0,0 @@
shader_type spatial;
render_mode blend_mix,
cull_disabled,
depth_prepass_alpha,
shadows_disabled,
specular_disabled,
vertex_lighting;
global uniform bool affine_mapping = false;
global uniform ivec2 jitter_resolution = ivec2(320, 240);
uniform sampler2D albedo : source_color, filter_nearest;
uniform float alpha_scissor : hint_range(0, 1) = 0.5;
vec4 snap_to_position(vec4 base_position)
{
vec4 snapped_position = base_position;
snapped_position.xyz = base_position.xyz / base_position.w;
vec2 snap_resulotion = floor(vec2(jitter_resolution));
snapped_position.x = floor(snap_resulotion.x * snapped_position.x) / snap_resulotion.x;
snapped_position.y = floor(snap_resulotion.y * snapped_position.y) / snap_resulotion.y;
snapped_position.xyz *= base_position.w;
return snapped_position;
}
void vertex()
{
vec4 snapped_position = snap_to_position(PROJECTION_MATRIX * MODELVIEW_MATRIX * vec4(VERTEX, 1.0));
if (affine_mapping)
{
POSITION = snapped_position;
POSITION /= abs(POSITION.w);
}
else
{
POSITION = snapped_position;
}
}
void fragment()
{
vec4 color_base = COLOR;
vec4 texture_color = texture(albedo, UV);
ALBEDO = (color_base * texture_color).rgb;
ALPHA = texture_color.a * color_base.a;
ALPHA_SCISSOR_THRESHOLD = alpha_scissor;
}

View File

@@ -1 +0,0 @@
uid://c5bffujq0l70k

View File

@@ -16,8 +16,9 @@ uniform sampler2D albedo: source_color, filter_nearest_mipmap;
global uniform float vertex_jitter: hint_range(0.0, 1.0) = 0.5;
uniform bool jitter_z_coordinate = true;
uniform bool jitter_depth_independent = true;
global uniform bool affine_mapping = true;
global uniform float affine_amount: hint_range(0.0, 1.0) = 1.0;
uniform float alpha_scissor: hint_range(0.0, 1.0) = 1.0;
varying vec2 perspective_uv;
void vertex() {
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
@@ -38,19 +39,14 @@ void vertex() {
VERTEX.z = z_orig;
}
POSITION = PROJECTION_MATRIX * vec4(VERTEX, 1.0);
if (affine_mapping) {
POSITION /= abs(POSITION.w);
//UV *= VERTEX.z;
}
perspective_uv = UV;
UV *= VERTEX.z;
}
void fragment() {
vec2 uv = UV;
//if (affine_texture_mapping) {
// uv /= VERTEX.z;
//}
uv /= (VERTEX.z);
uv = mix(perspective_uv, uv, affine_amount);
ALBEDO = texture(albedo, uv).rgb;
ALPHA = texture(albedo, uv).a;

View File

@@ -15,10 +15,10 @@ extends VBoxContainer
func _ready() -> void:
resolution_drop_down.add_item("320x240")
resolution_drop_down.add_item("1920x1080")
$MouseSens2/HBoxContainer/SpinBox.value = get_window().content_scale_factor
$MouseSens2/HBoxContainer/HSlider.value = get_window().content_scale_factor
#resolution_drop_down.add_item("320x240")
#resolution_drop_down.add_item("1920x1080")
#$MouseSens2/HBoxContainer/SpinBox.value = get_window().content_scale_factor
#$MouseSens2/HBoxContainer/HSlider.value = get_window().content_scale_factor
look_sens_slider.value = Data.preferences.mouse_sens
look_sens_input.value = Data.preferences.mouse_sens
toggle_sprint_checkbox.button_pressed = Data.preferences.toggle_sprint

View File

@@ -6,6 +6,10 @@ extends VBoxContainer
@export var vsync_dropdown: OptionButton
@export var aa_dropdown: OptionButton
@export var window_dropdown: OptionButton
@export var vertex_jitter_input: SpinBox
@export var vertex_jitter_slider: HSlider
@export var affine_warping_input: SpinBox
@export var affine_warping_slider: HSlider
func _ready() -> void:
@@ -13,6 +17,11 @@ func _ready() -> void:
fov_slider.value = Data.graphics.hfov
vsync_dropdown.selected = Data.graphics.vsync_mode
aa_dropdown.selected = Data.graphics.aa_mode
window_dropdown.selected = Data.graphics.windowed_mode
vertex_jitter_input.value = Data.graphics.vertex_jitter
vertex_jitter_slider.value = Data.graphics.vertex_jitter
affine_warping_input.value = Data.graphics.affine_warping
affine_warping_slider.value = Data.graphics.affine_warping
func save() -> void:
@@ -20,6 +29,8 @@ func save() -> void:
Data.graphics.vsync_mode = vsync_dropdown.selected
Data.graphics.aa_mode = aa_dropdown.selected
Data.graphics.windowed_mode = window_dropdown.selected
Data.graphics.vertex_jitter = vertex_jitter_slider.value
Data.graphics.affine_warping = affine_warping_slider.value
func _on_fov_spin_box_value_changed(value: float) -> void:
@@ -34,3 +45,31 @@ func _on_fov_spin_box_value_changed(value: float) -> void:
func _on_fov_h_slider_value_changed(value: float) -> void:
fov_input.value = value
Data.graphics.hfov = value
func _on_vertex_jitter_spin_box_value_changed(value: float) -> void:
if value < 0.0:
value = 0.0
if value > 1.0:
value = 1.0
vertex_jitter_slider.value = value
Data.graphics.vertex_jitter = value
func _on_vertex_jitter_h_slider_value_changed(value: float) -> void:
vertex_jitter_input.value = value
Data.graphics.vertex_jitter = value
func _on_affine_warping_spin_box_value_changed(value: float) -> void:
if value < 0.0:
value = 0.0
if value > 1.0:
value = 1.0
affine_warping_slider.value = value
Data.graphics.affine_warping = value
func _on_affine_warping_h_slider_value_changed(value: float) -> void:
affine_warping_input.value = value
Data.graphics.affine_warping = value

View File

@@ -4,7 +4,7 @@
[sub_resource type="ImageTexture" id="ImageTexture_03x6q"]
[node name="Graphics" type="VBoxContainer" unique_id=1842224615 node_paths=PackedStringArray("fov_input", "fov_slider", "vsync_dropdown", "aa_dropdown", "window_dropdown")]
[node name="Graphics" type="VBoxContainer" unique_id=1842224615 node_paths=PackedStringArray("fov_input", "fov_slider", "vsync_dropdown", "aa_dropdown", "window_dropdown", "vertex_jitter_input", "vertex_jitter_slider", "affine_warping_input", "affine_warping_slider")]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@@ -16,6 +16,10 @@ fov_slider = NodePath("FOV/HBoxContainer/HSlider")
vsync_dropdown = NodePath("VSync/OptionButton")
aa_dropdown = NodePath("AntiAliasing/OptionButton")
window_dropdown = NodePath("Windowed/OptionButton")
vertex_jitter_input = NodePath("VextexJitter/HBoxContainer/SpinBox")
vertex_jitter_slider = NodePath("VextexJitter/HBoxContainer/HSlider")
affine_warping_input = NodePath("AffineWarping/HBoxContainer/SpinBox")
affine_warping_slider = NodePath("AffineWarping/HBoxContainer/HSlider")
[node name="FOV" type="HBoxContainer" parent="." unique_id=693078328]
layout_mode = 2
@@ -120,5 +124,79 @@ popup/item_1/id = 1
popup/item_2/text = "OPTION_FULLSCREEN"
popup/item_2/id = 2
[node name="VextexJitter" type="HBoxContainer" parent="." unique_id=624638999]
layout_mode = 2
alignment = 1
[node name="Label" type="Label" parent="VextexJitter" unique_id=890349126]
layout_mode = 2
size_flags_horizontal = 3
text = "OPTION_VERTEX_JITTER"
horizontal_alignment = 1
vertical_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="VextexJitter" unique_id=857909591]
layout_mode = 2
size_flags_horizontal = 3
[node name="SpinBox" type="SpinBox" parent="VextexJitter/HBoxContainer" unique_id=319711346]
layout_mode = 2
theme_override_icons/updown = SubResource("ImageTexture_03x6q")
max_value = 1.0
step = 0.01
value = 0.2
allow_greater = true
allow_lesser = true
alignment = 1
update_on_text_changed = true
[node name="HSlider" type="HSlider" parent="VextexJitter/HBoxContainer" unique_id=451280678]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
max_value = 1.0
step = 0.01
value = 0.2
scrollable = false
[node name="AffineWarping" type="HBoxContainer" parent="." unique_id=962591793]
layout_mode = 2
alignment = 1
[node name="Label" type="Label" parent="AffineWarping" unique_id=206915184]
layout_mode = 2
size_flags_horizontal = 3
text = "OPTION_AFFINE_WARPING"
horizontal_alignment = 1
vertical_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="AffineWarping" unique_id=1780949636]
layout_mode = 2
size_flags_horizontal = 3
[node name="SpinBox" type="SpinBox" parent="AffineWarping/HBoxContainer" unique_id=1434191726]
layout_mode = 2
theme_override_icons/updown = SubResource("ImageTexture_03x6q")
max_value = 1.0
step = 0.01
value = 1.0
allow_greater = true
allow_lesser = true
alignment = 1
update_on_text_changed = true
[node name="HSlider" type="HSlider" parent="AffineWarping/HBoxContainer" unique_id=2037498715]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
max_value = 1.0
step = 0.01
value = 1.0
scrollable = false
[connection signal="value_changed" from="FOV/HBoxContainer/SpinBox" to="." method="_on_fov_spin_box_value_changed"]
[connection signal="value_changed" from="FOV/HBoxContainer/HSlider" to="." method="_on_fov_h_slider_value_changed"]
[connection signal="value_changed" from="VextexJitter/HBoxContainer/SpinBox" to="." method="_on_vertex_jitter_spin_box_value_changed"]
[connection signal="value_changed" from="VextexJitter/HBoxContainer/HSlider" to="." method="_on_vertex_jitter_h_slider_value_changed"]
[connection signal="value_changed" from="AffineWarping/HBoxContainer/SpinBox" to="." method="_on_affine_warping_spin_box_value_changed"]
[connection signal="value_changed" from="AffineWarping/HBoxContainer/HSlider" to="." method="_on_affine_warping_h_slider_value_changed"]

View File

@@ -1,7 +1,12 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://bjdi4f801k0xt"]
[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_r6w0r"]
[ext_resource type="Shader" uid="uid://dq04j2s5foo2f" path="res://Shaders/mightyduke_ps1.gdshader" id="1_kbuty"]
[ext_resource type="Texture2D" uid="uid://u8p3xcl3gvie" path="res://Weapons/Assault/rifle_tex.png" id="2_kb7v3"]
[resource]
render_priority = 0
shader = ExtResource("1_r6w0r")
shader = ExtResource("1_kbuty")
shader_parameter/albedo = ExtResource("2_kb7v3")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0

View File

@@ -1,12 +1,12 @@
[gd_scene format=3 uid="uid://y1qa1g3ic8sp"]
[ext_resource type="Script" uid="uid://cvejbo3srx8py" path="res://Scripts/level.gd" id="1_ws6nn"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="2_ks6qx"]
[ext_resource type="PackedScene" uid="uid://d2yv447trxkwt" path="res://Scenes/enemy_spawner.tscn" id="3_5imwp"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="3_6od8s"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="3_j6d65"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="5_j6d65"]
[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="6_ks6qx"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="9_4gdda"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="3_6tcu8"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="4_uh5sr"]
[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="5_g08yk"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="6_asmpj"]
[ext_resource type="PackedScene" uid="uid://1b2ikdanl66b" path="res://Scenes/CardPrinter/card_printer.tscn" id="9_r25gu"]
[ext_resource type="Script" uid="uid://cxwtuxytavfu5" path="res://Scripts/enemy_goal.gd" id="9_s3rd7"]
[ext_resource type="Script" uid="uid://yk54owkf7pgj" path="res://Scripts/cinema_cam.gd" id="9_xuyhn"]
@@ -248,7 +248,7 @@ size = Vector2(7.84, 3.69)
[node name="Bridge" type="Node3D" unique_id=1906077552 node_paths=PackedStringArray("tower_path", "player_spawns", "enemy_spawns", "enemy_goals", "corpses", "flow_field", "cinematic_cam", "printer", "shop")]
script = ExtResource("1_ws6nn")
enemy_pool = Array[ExtResource("3_6od8s")]([ExtResource("3_j6d65"), ExtResource("9_4gdda"), ExtResource("5_j6d65"), ExtResource("6_ks6qx")])
enemy_pool = Array[ExtResource("2_ks6qx")]([ExtResource("3_6tcu8"), ExtResource("4_uh5sr"), ExtResource("5_g08yk"), ExtResource("6_asmpj")])
tower_path = NodePath("Towers")
player_spawns = [NodePath("PlayerSpawnLocations/PlayerSpawn1"), NodePath("PlayerSpawnLocations/PlayerSpawn2"), NodePath("PlayerSpawnLocations/PlayerSpawn3"), NodePath("PlayerSpawnLocations/PlayerSpawn4")]
enemy_spawns = [NodePath("GroundSpawn"), NodePath("GroundSpawn2"), NodePath("GroundSpawn3"), NodePath("GroundSpawn4"), NodePath("GroundSpawn5"), NodePath("AirSpawn")]

View File

@@ -1,7 +0,0 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://fy4o12thbh6f"]
[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_2suih"]
[resource]
render_priority = 0
shader = ExtResource("1_2suih")

View File

@@ -1,8 +1,8 @@
[gd_scene format=4 uid="uid://n8ab1cy7ordc"]
[ext_resource type="Script" uid="uid://cr6hn1pbu35o1" path="res://card_model/3d_card.gd" id="1_o6jcx"]
[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="2_o6jcx"]
[ext_resource type="PackedScene" uid="uid://dixtx38u4jhd7" path="res://UI/card_hand.tscn" id="3_bnh6n"]
[ext_resource type="Shader" uid="uid://dq04j2s5foo2f" path="res://Shaders/mightyduke_ps1.gdshader" id="3_hprih"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gfbg"]
resource_name = "Face"
@@ -12,7 +12,10 @@ roughness = 0.5
[sub_resource type="ShaderMaterial" id="ShaderMaterial_bdeaa"]
render_priority = 0
shader = ExtResource("2_o6jcx")
shader = ExtResource("3_hprih")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0
[sub_resource type="ArrayMesh" id="ArrayMesh_0gfbg"]
_surfaces = [{
@@ -97,12 +100,18 @@ shadow_mesh = SubResource("ArrayMesh_gxum5")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ld374"]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("2_o6jcx")
shader = ExtResource("3_hprih")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_cuxkc"]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("2_o6jcx")
shader = ExtResource("3_hprih")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0
[node name="3DCard" type="Node3D" unique_id=1654548650 node_paths=PackedStringArray("card_in_hand", "mesh")]
script = ExtResource("1_o6jcx")

View File

@@ -1,7 +1,12 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://5mnnhn5p1tll"]
[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_38tga"]
[ext_resource type="Shader" uid="uid://dq04j2s5foo2f" path="res://Shaders/mightyduke_ps1.gdshader" id="1_38tga"]
[ext_resource type="Texture2D" uid="uid://ctjkfe23t6crn" path="res://coin/coin.png" id="2_kttjc"]
[resource]
render_priority = 0
shader = ExtResource("1_38tga")
shader_parameter/albedo = ExtResource("2_kttjc")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0

View File

@@ -1,7 +1,10 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://cmrs1ubeqtl71"]
[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_bpyoj"]
[ext_resource type="Shader" uid="uid://dq04j2s5foo2f" path="res://Shaders/mightyduke_ps1.gdshader" id="1_bpyoj"]
[resource]
render_priority = 0
shader = ExtResource("1_bpyoj")
shader_parameter/jitter_z_coordinate = true
shader_parameter/jitter_depth_independent = true
shader_parameter/alpha_scissor = 1.0

View File

@@ -249,11 +249,11 @@ textures/canvas_textures/default_texture_filter=0
[shader_globals]
affine_mapping={
"type": "bool",
"value": true
}
vertex_jitter={
"type": "float",
"value": 0.2
}
affine_amount={
"type": "float",
"value": 1.0
}

View File

@@ -1,14 +1,44 @@
[gd_scene format=3 uid="uid://crr8kg4ack7rq"]
[ext_resource type="PackedScene" uid="uid://bvq6tbkuv2mfp" path="res://Enemies/EyeDog/eye_dog.tscn" id="1_sb12i"]
[ext_resource type="Texture2D" uid="uid://cdnhe2mi5c5ln" path="res://Assets/Textures/dead_eye_dog.png" id="2_6emce"]
[ext_resource type="PackedScene" uid="uid://dl3rwqwbgrq2m" path="res://Enemies/ElderEyeDog/elder_eye_dog.tscn" id="2_gbhdq"]
[ext_resource type="Texture2D" uid="uid://g00wwrlxxdc5" path="res://Assets/Textures/icon_eye_dog.png" id="3_lowby"]
[ext_resource type="PackedScene" uid="uid://cveiaa0y66gln" path="res://Enemies/Crystalisk/crystal_enemy.tscn" id="3_y646j"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="4_58smv"]
[ext_resource type="PackedScene" uid="uid://dtahuv0kpxx03" path="res://Enemies/BabyEyeDog/baby_eye_dog.tscn" id="4_lnbra"]
[ext_resource type="PackedScene" uid="uid://dxgxbtf68lcv5" path="res://PCs/hero.tscn" id="5_6emce"]
[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="5_a25ih"]
[sub_resource type="BoxShape3D" id="BoxShape3D_lowby"]
size = Vector3(20, 1, 20)
[sub_resource type="AtlasTexture" id="AtlasTexture_6emce"]
resource_local_to_scene = true
atlas = ExtResource("5_a25ih")
region = Rect2(0, 0, 32, 32)
[sub_resource type="Resource" id="Resource_lowby"]
resource_local_to_scene = true
script = ExtResource("4_58smv")
title = "ENEMY_DOG"
target_type = 1
icon = ExtResource("3_lowby")
death_sprite = ExtResource("2_6emce")
sprite = SubResource("AtlasTexture_6emce")
health = 180
movement_speed = 1.5
spawn_cooldown = 1.2
common_group = 6
uncommon_group = 10
uncommon_cost = 2
rare_group = 16
rare_cost = 3
epic_group = 22
epic_cost = 5
legendary_group = 28
legendary_cost = 6
[node name="Node3D" type="Node3D" unique_id=747882904]
[node name="StaticBody3D" type="StaticBody3D" parent="." unique_id=845198141]
@@ -21,6 +51,7 @@ size = Vector3(20, 1, 20)
[node name="EyeDog" parent="." unique_id=1016179251 instance=ExtResource("1_sb12i")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.4945354, 0.5048856, -2.1569223)
stats = SubResource("Resource_lowby")
[node name="ElderEyeDog" parent="." unique_id=1106613653 instance=ExtResource("2_gbhdq")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.93381655, 0.5048856, -2.248024)