Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions map.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class_name GameMap
extends StaticBody3D
1 change: 1 addition & 0 deletions map.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://c3kfbh72phe74
47 changes: 37 additions & 10 deletions scenes/bull.gd
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
class_name Bull
extends CharacterBody3D

enum BullType {
Expand All @@ -8,13 +9,15 @@ enum BullType {
GREEN,
}

static var scared: bool = false

@export var bull_type: BullType = BullType.RED
@export var bull_color: Color = Color(1.0, 0.21568628, 0.21176471, 1.0)
@export_range(0.5, 10.0, 0.1) var move_speed: float = 2.5
@export_range(0.1, 5.0, 0.1) var retarget_interval: float = 0.4
@export_range(0.5, 8.0, 0.1) var prediction_distance: float = 3.0
@export_range(1.0, 10.0, 0.1) var flee_distance: float = 5.0
@export_range(0.2, 5.0, 0.1) var teleport_interval: float = 10.
@export_range(0.2, 5.0, 0.1) var teleport_interval: float = 30.
@export_range(0.5, 6.0, 0.1) var teleport_radius_min: float = 1.4
@export_range(1.0, 8.0, 0.1) var teleport_radius_max: float = 3.0
@export_range(0.5, 4.0, 0.1) var min_safe_teleport_distance: float = 1.2
Expand All @@ -26,6 +29,7 @@ var current_target_position: Vector3 = Vector3.ZERO
var freeze_timers: int = 0
var slow_timers: int = 0
var freeze_range: float = 2.5
var starting_pos

@onready var navigation_agent: NavigationAgent3D = $NavigationAgent3D
@onready var mesh_instance_3d: MeshInstance3D = $CollisionShape3D/MeshInstance3D
Expand All @@ -37,8 +41,9 @@ func _ready() -> void:
navigation_agent.path_desired_distance = 0.5
navigation_agent.target_desired_distance = 0.5
retarget_cooldown = randf_range(1. / Inventory.level, retarget_interval)
teleport_cooldown = randf_range(6. - Inventory.level, teleport_interval)
teleport_cooldown = _get_green_teleport_cooldown()
actor_setup.call_deferred()
starting_pos = self.position


func _physics_process(delta: float) -> void:
Expand All @@ -47,11 +52,9 @@ func _physics_process(delta: float) -> void:
velocity = Vector3.ZERO
move_and_slide()
return

if bull_type == BullType.GREEN:
_process_green(delta)
return

_process_navigation(delta)


Expand Down Expand Up @@ -99,11 +102,18 @@ func _process_green(delta: float) -> void:
teleport_cooldown -= delta
if teleport_cooldown <= 0.0:
global_position = _find_green_teleport_target()
teleport_cooldown = teleport_interval
teleport_cooldown = _get_green_teleport_cooldown()

move_and_slide()


func _get_green_teleport_cooldown() -> float:
var min_cd := 15.0 - Inventory.level * 2.0
min_cd = maxf(0.1, min_cd)
var max_cd := maxf(min_cd, teleport_interval)
return randf_range(min_cd, max_cd)


func _retarget() -> void:
current_target_position = _get_target_position()
navigation_agent.set_target_position(current_target_position)
Expand Down Expand Up @@ -239,14 +249,12 @@ func _navigation_map_ready() -> bool:
func _get_movement_target() -> Vector3:
if not navigation_agent.is_navigation_finished():
return navigation_agent.get_next_path_position()

return current_target_position


func _ensure_player() -> void:
if is_instance_valid(player):
return

player = _get_player()


Expand All @@ -271,7 +279,10 @@ func _apply_color() -> void:

func _on_damage_area_body_entered(body: Node3D) -> void:
if body is Player:
Lives.take_damage()
if not scared:
Lives.take_damage()
else:
self.position = starting_pos


func _on_timer_2_timeout() -> void:
Expand All @@ -281,8 +292,6 @@ func _on_timer_2_timeout() -> void:
func _on_hotbar_powerup_used(powerup: Inventory.Powerup) -> void:
if powerup == Inventory.Powerup.FREEZE:
_ensure_player()
if player == null:
return
if global_position.distance_to(player.global_position) > freeze_range:
return
freeze_timers += 1
Expand All @@ -302,8 +311,26 @@ func _base_move_speed() -> float:
return (1 + Inventory.level / 5) * 2.5


func _get_scared() -> void:
scared = true
var material := StandardMaterial3D.new()
material.albedo_color = Color(0.126, 0.362, 1.0, 1.0)
mesh_instance_3d.material_override = material
await get_tree().create_timer(3).timeout
scared = false
material.albedo_color = bull_color
mesh_instance_3d.material_override = material


func _update_move_speed() -> void:
if freeze_timers > 0:
move_speed = 0.0
return
move_speed = _base_move_speed() * pow(0.5, slow_timers)
teleport_interval = 30. - Inventory.level * 4

func _on_money_bag_money_bag() -> void:
slow_timers += 1
_get_scared()
await get_tree().create_timer(3).timeout
slow_timers = maxi(0, slow_timers - 1)
72 changes: 44 additions & 28 deletions scenes/chest.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,37 @@ signal chest_opened

const MIN_TWEEN_SCALE := Vector3(0.001, 0.001, 0.001)

var cloned := false
@onready var hotbar: Hotbar = get_parent().find_child("CanvasLayer").find_child("Hotbar")
static var occupied: Array[bool] = []

var cloned := false
var time: int = 0
var random: float

var positions: Array[Vector3] = [
Vector3(3.0, -0.25, -5.5), Vector3(-4.25,-0.25,-3.25),
Vector3(-4.25, -0.25, 2.), Vector3(3.25, -0.25, 2.75),
Vector3(3.25, -0.25, 6.3), Vector3(-6.35, -0.25, 8.0),
Vector3(3.6, -0.25, 9.5), Vector3(-9.9, -0.25, -5.70),
Vector3(8.5, -0.25, -10.)
]
static var occupied: Array[bool] = []
Vector3(3.0, -0.25, -5.5),
Vector3(-4.25, -0.25, -3.25),
Vector3(-4.25, -0.25, 2.),
Vector3(3.25, -0.25, 2.75),
Vector3(3.25, -0.25, 6.3),
Vector3(-6.35, -0.25, 8.0),
Vector3(3.6, -0.25, 9.5),
Vector3(-9.9, -0.25, -5.70),
Vector3(8.5, -0.25, -10.),
]

@onready var hotbar: Hotbar = get_parent().find_child("CanvasLayer").find_child("Hotbar")


func _ready() -> void:
if not self.cloned:
await get_tree().process_frame
random = randf_range(180, 1800)
for i in positions:
occupied.append(false)
occupied.clear()
occupied.resize(positions.size())
for i in range(positions.size()):
occupied[i] = false


func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if not self.cloned:
time += 1
if time > random:
Expand All @@ -45,6 +52,26 @@ func on_hotbar_pickup() -> void:
$Powerup.pickup = true


func create_clone() -> void:
var open_indices: Array[int] = []
for i in range(positions.size()):
if i < occupied.size() and not occupied[i]:
open_indices.append(i)

if open_indices.is_empty():
return

var copy: Chest = self.duplicate()
var picked_index: int = open_indices.pick_random()
copy.position = positions[picked_index]
copy.occupied = self.occupied
occupied[picked_index] = true
copy.cloned = true
get_parent().add_child(copy)
hotbar.no_pickup.connect(copy.on_hotbar_no_pickup)
hotbar.pickup.connect(copy.on_hotbar_pickup)


func _on_body_entered(body: Node3D) -> void:
if body is Player:
chest_opened.emit()
Expand Down Expand Up @@ -74,19 +101,8 @@ func _on_powerup_collected(powerup: Inventory.Powerup) -> void:
1.0,
)
await get_tree().create_timer(1.0).timeout
if cloned:
var idx := positions.find(position)
if idx != -1 and idx < occupied.size():
occupied[idx] = false
self.queue_free()

func create_clone() -> void:
if occupied.find(false) == -1:
return
var copy: Chest = self.duplicate()
var pos = positions.pick_random()
while occupied[positions.find(pos)]:
pos = positions.pick_random()
copy.position = pos
copy.occupied = self.occupied
occupied[positions.find(pos)] = true
copy.cloned = true
get_parent().add_child(copy)
hotbar.no_pickup.connect(copy.on_hotbar_no_pickup)
hotbar.pickup.connect(copy.on_hotbar_pickup)
4 changes: 4 additions & 0 deletions scenes/game_over.gd
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
extends Control


func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE


func _on_play_again_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/main.tscn")

Expand Down
8 changes: 7 additions & 1 deletion scenes/hotbar.gd
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ var contains: Array[bool] = []
var selected: int
var no_pick := false

@onready var ogstyle: StyleBoxFlat = get_child(0).find_child("Panel").get_theme_stylebox("panel").duplicate()
@onready var ogstyle: StyleBoxFlat = (
get_child(0).find_child("Panel").get_theme_stylebox("panel").duplicate()
)
@onready var newstyle: StyleBoxFlat = ogstyle.duplicate()


Expand All @@ -19,6 +21,8 @@ func _ready() -> void:
contains.append(false)
for child in get_children():
child.no_pickup.connect(_on_last_slot_no_pickup)
selected = 0
get_child(selected).find_child("Panel").add_theme_stylebox_override("panel", newstyle)


func _input(event: InputEvent) -> void:
Expand All @@ -41,6 +45,8 @@ func _input(event: InputEvent) -> void:
)
selected = number_pressed
elif event.keycode == KEY_E:
if selected < 0 or selected >= get_child_count():
return
if contains[get_child(selected).get_index()]:
powerup_used.emit(get_child(selected).empty())
no_pick = false
Expand Down
22 changes: 22 additions & 0 deletions scenes/lasso.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
extends Area3D

var cloned := false

func _on_hotbar_powerup_used(powerup: Inventory.Powerup) -> void:
if powerup == Inventory.Powerup.SHOOT:
var copy: Area3D = self.duplicate()
copy.cloned = true
copy.visible = true
get_parent().add_child(copy)
copy.position = get_parent().find_child("CharacterBody3D").position

func _process(delta: float) -> void:
if cloned:
self.position.x += cos(self.rotation.y)
self.position.z += sin(self.rotation.y)

func _on_body_entered(body: Node3D) -> void:
if body is Bull or body is GameMap:
if body is Bull:
body.position = body.starting_pos
self.queue_free()
1 change: 1 addition & 0 deletions scenes/lasso.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://da3d1a0negrei
3 changes: 1 addition & 2 deletions scenes/level.gd
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
extends Label

func _ready() -> void:
pass
func _ready() -> void: self.text = "Level " + str(Inventory.level)

func _on_timer_2_timeout() -> void:
self.text = "Level " + str(Inventory.level)
Loading
Loading