chore: add pause + fixes
This commit is contained in:
parent
fffb13a27f
commit
ca8b39c325
15 changed files with 191 additions and 112 deletions
|
|
@ -7,16 +7,6 @@ extends Node
|
||||||
signal tower_selected(towerType : Tower.TYPE)
|
signal tower_selected(towerType : Tower.TYPE)
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [Tower][br]
|
|
||||||
## [b]Subscriber[/b] [GuiButton], [gui.gd]:
|
|
||||||
signal tower_changed(tower : Tower)
|
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [UpgradeButton][br]
|
|
||||||
## [b]Subscriber[/b] : [Tower]
|
|
||||||
signal tower_upgraded(towerType : Tower.TYPE, upgrade : TowerUpgrade)
|
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [TowerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : gui.gd
|
## [b]Subscriber[/b] : gui.gd
|
||||||
signal tower_count_changed(count : int)
|
signal tower_count_changed(count : int)
|
||||||
|
|
@ -43,8 +33,8 @@ signal player_has_won
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [WorldManager][br]
|
## [b]Emitter[/b] : [WorldManager][br]
|
||||||
## [b]Subscriber[/b] : [code]null[/code]
|
## [b]Subscriber[/b] : gui.gd
|
||||||
signal wave_has_change(waveNumber : int)
|
signal wave_has_change(waveNumber : int, timeRemaining : float)
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [gui.gd][br]
|
## [b]Emitter[/b] : [gui.gd][br]
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,6 @@ signal allowed_tower_has_change
|
||||||
var towerPackedScenes : Dictionary
|
var towerPackedScenes : Dictionary
|
||||||
var enmies : Dictionary
|
var enmies : Dictionary
|
||||||
var towers : Dictionary
|
var towers : Dictionary
|
||||||
var allowedTowers : Array[Tower.TYPE] :
|
|
||||||
set(value):
|
|
||||||
allowedTowers = value
|
|
||||||
allowed_tower_has_change.emit()
|
|
||||||
|
|
||||||
|
|
||||||
var max_health : int = 50
|
var max_health : int = 50
|
||||||
|
|
@ -25,9 +21,6 @@ var health : int = max_health :
|
||||||
cube_integrity_changed.emit()
|
cube_integrity_changed.emit()
|
||||||
if health <= 0:
|
if health <= 0:
|
||||||
death()
|
death()
|
||||||
var healthPercentage : int :
|
|
||||||
get():
|
|
||||||
return float(health) / float(max_health) * 100.0
|
|
||||||
|
|
||||||
|
|
||||||
var money : int = 0:
|
var money : int = 0:
|
||||||
|
|
@ -37,21 +30,28 @@ var money : int = 0:
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
process_mode = Node.PROCESS_MODE_ALWAYS
|
||||||
EventBus.player_has_won.connect(win)
|
EventBus.player_has_won.connect(win)
|
||||||
Helper.preloadSceneInGlobal(towerPackedScenes, Helper.RESOURCE_TYPE.TOWER)
|
Helper.preloadSceneInGlobal(towerPackedScenes, Helper.RESOURCE_TYPE.TOWER)
|
||||||
#Helper.preloadSceneInGlobal(towerPackedScenes, Helper.RESOURCE_TYPE.ENEMY)
|
#Helper.preloadSceneInGlobal(towerPackedScenes, Helper.RESOURCE_TYPE.ENEMY)
|
||||||
|
|
||||||
|
|
||||||
func initTower(towerType: Tower.TYPE) -> Tower:
|
func _input(event: InputEvent) -> void:
|
||||||
|
if event.is_action_pressed("pause_game"):
|
||||||
|
get_tree().paused = not get_tree().paused
|
||||||
|
|
||||||
|
|
||||||
|
func initTowers(allowedTowers : Array[Tower.TYPE]) -> void:
|
||||||
|
towers.clear()
|
||||||
|
for towerType in allowedTowers:
|
||||||
var tower : Tower = towerPackedScenes.get(towerType).instantiate()
|
var tower : Tower = towerPackedScenes.get(towerType).instantiate()
|
||||||
towers.set(towerType, tower)
|
towers.set(towerType, tower)
|
||||||
return tower
|
|
||||||
|
allowed_tower_has_change.emit()
|
||||||
|
|
||||||
|
|
||||||
func resetGame() -> void:
|
func resetGame() -> void:
|
||||||
towers.clear()
|
initTowers([])
|
||||||
# DANGER Don't use [method clear] or you will clear the level datas
|
|
||||||
allowedTowers = []
|
|
||||||
money = 0
|
money = 0
|
||||||
health = max_health
|
health = max_health
|
||||||
|
|
||||||
|
|
@ -61,6 +61,15 @@ func win():
|
||||||
resetGame()
|
resetGame()
|
||||||
|
|
||||||
|
|
||||||
|
func quitLevel() -> void:
|
||||||
|
Transition.goto("res://UI/start_menu.tscn")
|
||||||
|
resetGame()
|
||||||
|
|
||||||
|
|
||||||
|
func quitGame() -> void:
|
||||||
|
get_tree().quit()
|
||||||
|
|
||||||
|
|
||||||
func spendMoney(amount : int) -> bool:
|
func spendMoney(amount : int) -> bool:
|
||||||
if money >= amount:
|
if money >= amount:
|
||||||
money -= amount
|
money -= amount
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,11 @@ var progress : Array[float]
|
||||||
|
|
||||||
var tween : Tween
|
var tween : Tween
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
process_mode = Node.PROCESS_MODE_ALWAYS
|
||||||
|
|
||||||
|
|
||||||
func goto(scene_path : String, _loadState : LOAD_STATE = LOAD_STATE.BASIC_LOAD):
|
func goto(scene_path : String, _loadState : LOAD_STATE = LOAD_STATE.BASIC_LOAD):
|
||||||
loadState = _loadState
|
loadState = _loadState
|
||||||
target_scene_path = scene_path
|
target_scene_path = scene_path
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ const SCREEN_MARGIN : int = 50
|
||||||
const SCREEN_MOVEMENT_SPEED : float = .05
|
const SCREEN_MOVEMENT_SPEED : float = .05
|
||||||
|
|
||||||
@export var curve : Curve
|
@export var curve : Curve
|
||||||
|
var shouldMove : bool = true
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
|
@ -12,6 +13,9 @@ func _ready() -> void:
|
||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
|
if not shouldMove:
|
||||||
|
return
|
||||||
|
|
||||||
var windowSize : Vector2i = get_window().size
|
var windowSize : Vector2i = get_window().size
|
||||||
var mousePosition : Vector2 = get_viewport().get_mouse_position()
|
var mousePosition : Vector2 = get_viewport().get_mouse_position()
|
||||||
|
|
||||||
|
|
@ -25,15 +29,22 @@ func _process(_delta: float) -> void:
|
||||||
position.z += SCREEN_MOVEMENT_SPEED
|
position.z += SCREEN_MOVEMENT_SPEED
|
||||||
|
|
||||||
|
|
||||||
|
func _notification(what: int) -> void:
|
||||||
|
match what:
|
||||||
|
NOTIFICATION_WM_MOUSE_ENTER: shouldMove = true
|
||||||
|
NOTIFICATION_WM_MOUSE_EXIT: shouldMove = false
|
||||||
|
|
||||||
|
|
||||||
func _input(event: InputEvent) -> void:
|
func _input(event: InputEvent) -> void:
|
||||||
if not event is InputEventMouseButton:
|
if not event is InputEventMouseButton:
|
||||||
return
|
return
|
||||||
|
|
||||||
var newPosition : float = position.y
|
var newPosition : float = position.y
|
||||||
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
|
match event.button_index:
|
||||||
newPosition = clampf(newPosition - .2, curve.min_domain, curve.max_domain)
|
MOUSE_BUTTON_WHEEL_UP: newPosition -= .2
|
||||||
elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
|
MOUSE_BUTTON_WHEEL_DOWN: newPosition += .2
|
||||||
newPosition = clampf(newPosition + .2, curve.min_domain, curve.max_domain)
|
|
||||||
|
newPosition = clampf(newPosition, curve.min_domain, curve.max_domain)
|
||||||
|
|
||||||
rotation.x = deg_to_rad(curve.sample(newPosition))
|
rotation.x = deg_to_rad(curve.sample(newPosition))
|
||||||
position.y = newPosition
|
position.y = newPosition
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ func changeState(newState: STATE) -> void:
|
||||||
func spawnNextWave() -> void:
|
func spawnNextWave() -> void:
|
||||||
currentTroopIdx = 0
|
currentTroopIdx = 0
|
||||||
wave += 1
|
wave += 1
|
||||||
EventBus.wave_has_change.emit(wave)
|
EventBus.wave_has_change.emit(wave, level.waves[wave - 1].troops[0].spawn_delay)
|
||||||
spawnNextTroop()
|
spawnNextTroop()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -121,7 +121,7 @@ func addMap(mapScene : PackedScene) -> void:
|
||||||
level = map.level
|
level = map.level
|
||||||
paths = map.paths.get_children()
|
paths = map.paths.get_children()
|
||||||
Game.money = level.startingMoney
|
Game.money = level.startingMoney
|
||||||
Game.allowedTowers = level.allowedTowers
|
Game.initTowers(level.allowedTowers)
|
||||||
state = STATE.SPAWN if level.auto_start else STATE.IDLE
|
state = STATE.SPAWN if level.auto_start else STATE.IDLE
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,14 +63,17 @@ adjustment_contrast = 1.3
|
||||||
adjustment_saturation = 1.2
|
adjustment_saturation = 1.2
|
||||||
|
|
||||||
[node name="World" type="Node3D"]
|
[node name="World" type="Node3D"]
|
||||||
|
process_mode = 1
|
||||||
script = ExtResource("1_tk0a6")
|
script = ExtResource("1_tk0a6")
|
||||||
|
|
||||||
[node name="Camera3D" type="Camera3D" parent="."]
|
[node name="Camera3D" type="Camera3D" parent="."]
|
||||||
|
process_mode = 3
|
||||||
transform = Transform3D(1, 0, 0, 0, 0.5, 0.866026, 0, -0.866026, 0.5, 0, 10, 0)
|
transform = Transform3D(1, 0, 0, 0, 0.5, 0.866026, 0, -0.866026, 0.5, 0, 10, 0)
|
||||||
script = ExtResource("2_c1rgm")
|
script = ExtResource("2_c1rgm")
|
||||||
curve = SubResource("Curve_c1rgm")
|
curve = SubResource("Curve_c1rgm")
|
||||||
|
|
||||||
[node name="TowerManager" type="Node3D" parent="."]
|
[node name="TowerManager" type="Node3D" parent="."]
|
||||||
|
process_mode = 3
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.73017, 0.728414, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.73017, 0.728414, 0)
|
||||||
script = ExtResource("2_7pixp")
|
script = ExtResource("2_7pixp")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
|
@tool
|
||||||
extends StaticBody3D
|
extends StaticBody3D
|
||||||
class_name Tower
|
class_name Tower
|
||||||
|
|
||||||
|
|
||||||
|
signal energy_changed
|
||||||
|
signal changed
|
||||||
|
|
||||||
|
|
||||||
# DANGER "NONE" Should always be first
|
# DANGER "NONE" Should always be first
|
||||||
enum TYPE { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX, GERALDINE }
|
enum TYPE { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX, GERALDINE }
|
||||||
|
|
||||||
|
|
@ -25,7 +30,9 @@ var projectileScene : PackedScene = preload("res://Towers/Projectiles/projectile
|
||||||
@export var max_energy : float = 100.0 :
|
@export var max_energy : float = 100.0 :
|
||||||
set(value):
|
set(value):
|
||||||
max_energy = value
|
max_energy = value
|
||||||
towerChange.call_deferred()
|
if not Engine.is_editor_hint() && is_node_ready():
|
||||||
|
energyBar.max_value = max_energy
|
||||||
|
changed.emit()
|
||||||
@export var energy_regen : float = 10.0
|
@export var energy_regen : float = 10.0
|
||||||
@export var energy_cost : float = 50.0
|
@export var energy_cost : float = 50.0
|
||||||
|
|
||||||
|
|
@ -43,7 +50,7 @@ var energy : float :
|
||||||
energyBar.value = value
|
energyBar.value = value
|
||||||
energy = clampf(value, 0.0, max_energy)
|
energy = clampf(value, 0.0, max_energy)
|
||||||
is_exhausted = energy < energy_cost
|
is_exhausted = energy < energy_cost
|
||||||
EventBus.tower_changed.emit(self)
|
energy_changed.emit()
|
||||||
|
|
||||||
var availableTargets : Array[Enemy]
|
var availableTargets : Array[Enemy]
|
||||||
var target : Enemy
|
var target : Enemy
|
||||||
|
|
@ -60,11 +67,10 @@ var builded : bool = false
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
EventBus.tower_upgraded.connect(apply_upgrade)
|
|
||||||
energyRecoveryCooldown.timeout.connect(func(): energy += energy_regen)
|
|
||||||
energy = max_energy
|
energy = max_energy
|
||||||
# WARNING : Prevent .tscn file to be modified by the load of the scene in editor
|
# WARNING : Prevent .tscn file to be modified by the load of the scene in editor
|
||||||
if not Engine.is_editor_hint():
|
if not Engine.is_editor_hint():
|
||||||
|
energyRecoveryCooldown.timeout.connect(func(): energy += energy_regen)
|
||||||
collision_layer = 0
|
collision_layer = 0
|
||||||
collision_mask = 0
|
collision_mask = 0
|
||||||
$PriceTag.text = str(price) + " €"
|
$PriceTag.text = str(price) + " €"
|
||||||
|
|
@ -80,11 +86,6 @@ func get_available_upgrades() -> Array[TowerUpgrade]:
|
||||||
return upgrades.filter(func(u: TowerUpgrade): u.isLevelMax)
|
return upgrades.filter(func(u: TowerUpgrade): u.isLevelMax)
|
||||||
|
|
||||||
|
|
||||||
func apply_upgrade(towerType : Tower.TYPE, upgrade : TowerUpgrade):
|
|
||||||
if towerType == type && upgrade.canUpgrade():
|
|
||||||
upgrade.upgrade(self)
|
|
||||||
|
|
||||||
|
|
||||||
func shoot() -> void:
|
func shoot() -> void:
|
||||||
energy -= energy_cost
|
energy -= energy_cost
|
||||||
var projectile : Projectile = projectileScene.instantiate()
|
var projectile : Projectile = projectileScene.instantiate()
|
||||||
|
|
@ -125,20 +126,13 @@ func build() -> bool:
|
||||||
return false
|
return false
|
||||||
|
|
||||||
sprite.modulate = "ffffffff"
|
sprite.modulate = "ffffffff"
|
||||||
energyBar.value = energy
|
|
||||||
energyBar.max_value = max_energy
|
|
||||||
$EnergyBar3D.visible = true
|
$EnergyBar3D.visible = true
|
||||||
builded = true
|
builded = true
|
||||||
$PriceTag.visible = false
|
$PriceTag.visible = false
|
||||||
EventBus.tower_changed.emit(self)
|
changed.emit()
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
||||||
func towerChange() -> void:
|
|
||||||
energyBar.max_value = max_energy
|
|
||||||
EventBus.tower_changed.emit(self)
|
|
||||||
|
|
||||||
|
|
||||||
func onBodyEntered(body: Node3D) -> void:
|
func onBodyEntered(body: Node3D) -> void:
|
||||||
if body is Enemy:
|
if body is Enemy:
|
||||||
availableTargets.append(body)
|
availableTargets.append(body)
|
||||||
|
|
|
||||||
|
|
@ -115,13 +115,13 @@ func onTowerSelect(towerType: Tower.TYPE):
|
||||||
selected_tower.visible = false
|
selected_tower.visible = false
|
||||||
|
|
||||||
if selected_tower && selected_tower.type == towerType || towerType == Tower.TYPE.NONE:
|
if selected_tower && selected_tower.type == towerType || towerType == Tower.TYPE.NONE:
|
||||||
|
if selected_tower && not selected_tower.builded:
|
||||||
|
remove_child(selected_tower)
|
||||||
selected_tower = null
|
selected_tower = null
|
||||||
elif Game.towers.has(towerType):
|
else:
|
||||||
selected_tower = Game.towers.get(towerType)
|
selected_tower = Game.towers.get(towerType)
|
||||||
if not selected_tower.builded:
|
if not selected_tower.builded:
|
||||||
selected_tower.visible = true
|
selected_tower.visible = true
|
||||||
else:
|
|
||||||
selected_tower = Game.initTower(towerType)
|
|
||||||
add_child(selected_tower)
|
add_child(selected_tower)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -145,5 +145,5 @@ func handleTowerShortCuts(event: InputEventKey) -> void:
|
||||||
KEY_D: towerType = Tower.TYPE.GERALDINE
|
KEY_D: towerType = Tower.TYPE.GERALDINE
|
||||||
#KEY_F: towerType = Tower.TYPE
|
#KEY_F: towerType = Tower.TYPE
|
||||||
|
|
||||||
if Game.allowedTowers.has(towerType):
|
if Game.towers.has(towerType):
|
||||||
selectTower(towerType, true)
|
selectTower(towerType, true)
|
||||||
|
|
|
||||||
|
|
@ -9,30 +9,38 @@ var tower : Tower
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
EventBus.tower_selected.connect(onTowerSelected)
|
EventBus.tower_selected.connect(onTowerSelected)
|
||||||
EventBus.tower_changed.connect(onTowerChange)
|
|
||||||
|
|
||||||
|
|
||||||
func onTowerSelected(towerType : Tower.TYPE) -> void:
|
func onTowerSelected(towerType : Tower.TYPE) -> void:
|
||||||
|
if tower:
|
||||||
|
tower.energy_changed.disconnect(onEnergyChange)
|
||||||
|
tower.changed.disconnect(onTowerChange)
|
||||||
|
|
||||||
if towerType == Tower.TYPE.NONE:
|
if towerType == Tower.TYPE.NONE:
|
||||||
visible = false
|
visible = false
|
||||||
tower = null
|
tower = null
|
||||||
return
|
return
|
||||||
|
|
||||||
tower = Game.towers.get(towerType)
|
tower = Game.towers.get(towerType)
|
||||||
|
tower.energy_changed.connect(onEnergyChange)
|
||||||
|
tower.changed.connect(onTowerChange)
|
||||||
%UpgradeContainer.visible = false
|
%UpgradeContainer.visible = false
|
||||||
visible = true
|
visible = true
|
||||||
onTowerChange(tower)
|
onTowerChange()
|
||||||
|
|
||||||
|
|
||||||
func onTowerChange(_tower : Tower) -> void:
|
func onEnergyChange() -> void:
|
||||||
if _tower == tower:
|
%TowerEnergy.text = "%d/%d" % [ tower.energy, tower.max_energy ]
|
||||||
|
|
||||||
|
|
||||||
|
func onTowerChange() -> void:
|
||||||
|
onEnergyChange()
|
||||||
%TowerIcon.texture = tower.icone
|
%TowerIcon.texture = tower.icone
|
||||||
%TowerName.text = tower.tower_name
|
%TowerName.text = tower.tower_name
|
||||||
%TowerDamage.text = "Dmg : %d" % tower.projectileRessource.damage
|
%TowerDamage.text = "Dmg : %d" % tower.projectileRessource.damage
|
||||||
%TowerCooldown.text = "cooldown : %.1f" % tower.action_cooldown
|
%TowerCooldown.text = "cooldown : %.1f" % tower.action_cooldown
|
||||||
# TODO Check for better UI to display it
|
# TODO Check for better UI to display it
|
||||||
#%TowerBio.text = tower.bio
|
#%TowerBio.text = tower.bio
|
||||||
%TowerEnergy.text = "%d/%d" % [ tower.energy, tower.max_energy ]
|
|
||||||
|
|
||||||
if tower.builded && not %UpgradeContainer.visible:
|
if tower.builded && not %UpgradeContainer.visible:
|
||||||
createTowerUpgradeButton()
|
createTowerUpgradeButton()
|
||||||
|
|
|
||||||
42
UI/gui.gd
42
UI/gui.gd
|
|
@ -7,29 +7,49 @@ const guiButton : PackedScene = preload("res://UI/gui_button.tscn")
|
||||||
|
|
||||||
@onready var buttonContainer = %ButtonContainer
|
@onready var buttonContainer = %ButtonContainer
|
||||||
@onready var cubeIntegrity = %CubeIntegrity
|
@onready var cubeIntegrity = %CubeIntegrity
|
||||||
|
var waveCooldown : float
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
addTowerButtonNodes()
|
|
||||||
EventBus.team_in_rest_changed.connect(func(count): %LabelTowerInCube.text = "Zzz : %d" % count)
|
EventBus.team_in_rest_changed.connect(func(count): %LabelTowerInCube.text = "Zzz : %d" % count)
|
||||||
EventBus.team_in_action_changed.connect(func(count): %LabelTowerOnTerrain.text = " In action : %d" % count)
|
EventBus.team_in_action_changed.connect(func(count): %LabelTowerOnTerrain.text = " In action : %d" % count)
|
||||||
Game.allowed_tower_has_change.connect(addTowerButtonNodes)
|
Game.allowed_tower_has_change.connect(addTowerButtonNodes)
|
||||||
Game.cube_integrity_changed.connect(func(): cubeIntegrity.value = Game.healthPercentage)
|
Game.cube_integrity_changed.connect(func(): cubeIntegrity.value = Game.health)
|
||||||
|
cubeIntegrity.max_value = Game.max_health
|
||||||
|
cubeIntegrity.value = Game.health
|
||||||
Game.money_changed.connect(func(): %LabelMoney.text = "%d €" % Game.money)
|
Game.money_changed.connect(func(): %LabelMoney.text = "%d €" % Game.money)
|
||||||
EventBus.wave_has_change.connect(func(wave): %WaveNumber.text = "Wave N°%d" % wave)
|
EventBus.wave_has_change.connect(onWaveChange)
|
||||||
%NextWaveBtn.pressed.connect(EventBus.lauch_next_wave.emit)
|
%NextWaveBtn.pressed.connect(EventBus.lauch_next_wave.emit)
|
||||||
|
$WaveCooldown/Timer.timeout.connect(updateWaveCooldownLabel)
|
||||||
|
%QuitLevelBtn.pressed.connect(Game.quitLevel)
|
||||||
|
%QuitGameBtn.pressed.connect(Game.quitGame)
|
||||||
|
$TowerInfoPanel.visible = false
|
||||||
|
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
var allowedTowers : Array[Tower.TYPE]
|
||||||
|
allowedTowers.assign(Tower.TYPE.values().filter(func(v): return v))
|
||||||
|
Game.initTowers(allowedTowers)
|
||||||
|
|
||||||
|
|
||||||
func _on_button_cube_pressed() -> void:
|
func _on_button_cube_pressed() -> void:
|
||||||
pass # Replace with function body.
|
pass # Replace with function body.
|
||||||
|
|
||||||
|
|
||||||
func quitLevel() -> void:
|
func onWaveChange(waveNumber : int, timeRemaining : float) -> void:
|
||||||
Transition.goto("res://UI/start_menu.tscn")
|
%WaveNumber.text = "Wave N°%d" % waveNumber
|
||||||
|
waveCooldown = timeRemaining
|
||||||
|
$WaveCooldown/Timer.start()
|
||||||
|
|
||||||
|
|
||||||
func quitGame() -> void:
|
func updateWaveCooldownLabel() -> void:
|
||||||
get_tree().quit()
|
waveCooldown -= $WaveCooldown/Timer.wait_time
|
||||||
|
if waveCooldown > 5:
|
||||||
|
$WaveCooldown.text = "\n\nNext wave : %3.0f" % waveCooldown
|
||||||
|
elif waveCooldown < 0:
|
||||||
|
$WaveCooldown/Timer.stop()
|
||||||
|
$WaveCooldown.text = ""
|
||||||
|
else:
|
||||||
|
$WaveCooldown.text = "\n\nNext wave : %3.1f" % waveCooldown
|
||||||
|
|
||||||
|
|
||||||
func addTowerButtonNodes() -> void:
|
func addTowerButtonNodes() -> void:
|
||||||
|
|
@ -37,8 +57,7 @@ func addTowerButtonNodes() -> void:
|
||||||
if node.has_meta("dynamicButton"):
|
if node.has_meta("dynamicButton"):
|
||||||
node.queue_free()
|
node.queue_free()
|
||||||
|
|
||||||
for towerType : int in Tower.TYPE.values() :
|
for towerType in Game.towers.keys() :
|
||||||
if towerType && (Engine.is_editor_hint() || Game.allowedTowers.has(towerType)):
|
|
||||||
createTowerButton(towerType)
|
createTowerButton(towerType)
|
||||||
|
|
||||||
for i in BUTTON_QTY - (buttonContainer.get_children().size() % BUTTON_QTY):
|
for i in BUTTON_QTY - (buttonContainer.get_children().size() % BUTTON_QTY):
|
||||||
|
|
@ -50,10 +69,7 @@ func createTowerButton(towerType : Tower.TYPE) -> void:
|
||||||
btn.set_meta("dynamicButton", true)
|
btn.set_meta("dynamicButton", true)
|
||||||
|
|
||||||
if towerType:
|
if towerType:
|
||||||
var tower : PackedScene = Game.towerPackedScenes.get(towerType)
|
btn.tower = Game.towers.get(towerType)
|
||||||
btn.towerType = towerType
|
|
||||||
btn.tooltip_text = str(EnhancedResource.getPackedSceneProperty(tower, "name"))
|
|
||||||
btn.texture = EnhancedResource.getPackedSceneProperty(tower, "icone")
|
|
||||||
else:
|
else:
|
||||||
btn.disabled = true
|
btn.disabled = true
|
||||||
buttonContainer.add_child(btn)
|
buttonContainer.add_child(btn)
|
||||||
|
|
|
||||||
36
UI/gui.tscn
36
UI/gui.tscn
|
|
@ -28,6 +28,7 @@ color = 4
|
||||||
metadata/_custom_type_script = "uid://blnmjxmusrsa7"
|
metadata/_custom_type_script = "uid://blnmjxmusrsa7"
|
||||||
|
|
||||||
[node name="GUI" type="Control"]
|
[node name="GUI" type="Control"]
|
||||||
|
process_mode = 3
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
anchors_preset = 15
|
anchors_preset = 15
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
|
|
@ -38,6 +39,21 @@ mouse_filter = 2
|
||||||
theme = ExtResource("5_wpcnu")
|
theme = ExtResource("5_wpcnu")
|
||||||
script = ExtResource("2_sac4j")
|
script = ExtResource("2_sac4j")
|
||||||
|
|
||||||
|
[node name="WaveCooldown" type="Label" parent="."]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 5
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
offset_left = -90.0
|
||||||
|
offset_right = 90.0
|
||||||
|
offset_bottom = 50.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
|
||||||
|
theme_override_font_sizes/font_size = 40
|
||||||
|
|
||||||
|
[node name="Timer" type="Timer" parent="WaveCooldown"]
|
||||||
|
wait_time = 0.1
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HBoxContainer" parent="."]
|
[node name="HBoxContainer" type="HBoxContainer" parent="."]
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
anchors_preset = 3
|
anchors_preset = 3
|
||||||
|
|
@ -46,7 +62,7 @@ anchor_top = 1.0
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
offset_left = -562.0
|
offset_left = -562.0
|
||||||
offset_top = -268.0
|
offset_top = -200.0
|
||||||
grow_horizontal = 0
|
grow_horizontal = 0
|
||||||
grow_vertical = 0
|
grow_vertical = 0
|
||||||
theme_override_constants/separation = 0
|
theme_override_constants/separation = 0
|
||||||
|
|
@ -100,31 +116,27 @@ unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
|
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
|
||||||
|
|
||||||
[node name="WaveCooldown" type="Label" parent="HBoxContainer/InfoPanel/MarginContainer/VBoxContainer"]
|
|
||||||
unique_name_in_owner = true
|
|
||||||
layout_mode = 2
|
|
||||||
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
|
|
||||||
|
|
||||||
[node name="CubeIntegrity" type="ProgressBar" parent="HBoxContainer"]
|
[node name="CubeIntegrity" type="ProgressBar" parent="HBoxContainer"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(10, 5)
|
custom_minimum_size = Vector2(10, 0)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_vertical = 1
|
size_flags_vertical = 1
|
||||||
tooltip_text = "Les points d'intégrités du Cube. S'ils arrivent à 0, fin de la partie."
|
tooltip_text = "Les points d'intégrités du Cube. S'ils arrivent à 0, fin de la partie."
|
||||||
theme_override_styles/background = SubResource("StyleBoxFlat_nxmp4")
|
theme_override_styles/background = SubResource("StyleBoxFlat_nxmp4")
|
||||||
theme_override_styles/fill = SubResource("StyleBoxFlat_epgl5")
|
theme_override_styles/fill = SubResource("StyleBoxFlat_epgl5")
|
||||||
value = 100.0
|
max_value = 50.0
|
||||||
|
value = 50.0
|
||||||
fill_mode = 3
|
fill_mode = 3
|
||||||
show_percentage = false
|
show_percentage = false
|
||||||
|
|
||||||
[node name="ControlPanelBase" type="PanelContainer" parent="HBoxContainer"]
|
[node name="ControlPanelBase" type="PanelContainer" parent="HBoxContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_horizontal = 3
|
size_flags_horizontal = 3
|
||||||
size_flags_vertical = 8
|
|
||||||
theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd")
|
theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd")
|
||||||
|
|
||||||
[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/ControlPanelBase"]
|
[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/ControlPanelBase"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
|
size_flags_vertical = 0
|
||||||
theme_override_constants/margin_left = 10
|
theme_override_constants/margin_left = 10
|
||||||
theme_override_constants/margin_top = 10
|
theme_override_constants/margin_top = 10
|
||||||
theme_override_constants/margin_right = 10
|
theme_override_constants/margin_right = 10
|
||||||
|
|
@ -142,10 +154,12 @@ layout_mode = 2
|
||||||
texture = ExtResource("7_fffne")
|
texture = ExtResource("7_fffne")
|
||||||
|
|
||||||
[node name="QuitLevelBtn" parent="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")]
|
[node name="QuitLevelBtn" parent="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")]
|
||||||
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
texture = ExtResource("8_decjp")
|
texture = ExtResource("8_decjp")
|
||||||
|
|
||||||
[node name="QuitGameBtn" parent="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")]
|
[node name="QuitGameBtn" parent="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")]
|
||||||
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
texture = ExtResource("9_reygo")
|
texture = ExtResource("9_reygo")
|
||||||
|
|
||||||
|
|
@ -155,6 +169,7 @@ layout_mode = 2
|
||||||
texture = ExtResource("8_ay13l")
|
texture = ExtResource("8_ay13l")
|
||||||
|
|
||||||
[node name="TowerInfoPanel" type="HBoxContainer" parent="."]
|
[node name="TowerInfoPanel" type="HBoxContainer" parent="."]
|
||||||
|
visible = false
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
anchors_preset = 2
|
anchors_preset = 2
|
||||||
anchor_top = 1.0
|
anchor_top = 1.0
|
||||||
|
|
@ -260,6 +275,3 @@ size_flags_horizontal = 0
|
||||||
size_flags_vertical = 0
|
size_flags_vertical = 0
|
||||||
|
|
||||||
[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/CubeBtn" to="." method="_on_button_cube_pressed"]
|
[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/CubeBtn" to="." method="_on_button_cube_pressed"]
|
||||||
[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitLevelBtn" to="." method="quitLevel"]
|
|
||||||
[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitGameBtn" to="." method="quitGame"]
|
|
||||||
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/TowerButton" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/TowerButton" method="buttonToggled"]
|
|
||||||
|
|
|
||||||
|
|
@ -3,31 +3,32 @@ extends Button
|
||||||
class_name GuiButton
|
class_name GuiButton
|
||||||
|
|
||||||
|
|
||||||
var towerPrice : int
|
var tower : Tower : set = towerLinked
|
||||||
var towerType : Tower.TYPE = Tower.TYPE.NONE
|
|
||||||
@export var texture : Texture2D :
|
@export var texture : Texture2D :
|
||||||
set(value):
|
set(value):
|
||||||
texture = value
|
texture = value
|
||||||
$TextureRect.texture = texture
|
$TextureRect.texture = texture
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func towerLinked(value) -> void:
|
||||||
if towerType == Tower.TYPE.NONE:
|
tower = value
|
||||||
|
if not tower:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
$LeFond/Label.text = "%d €" % tower.price
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(GameColor.COLOR.SELECTED))
|
add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(GameColor.COLOR.SELECTED))
|
||||||
EventBus.tower_changed.connect(towerChanged)
|
tower.changed.connect(towerChanged)
|
||||||
EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == towerType))
|
tower.energy_changed.connect(func(): $EnergyBar.value = tower.energy)
|
||||||
|
EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == tower.type))
|
||||||
|
toggled.connect(func(state): EventBus.tower_selected.emit(tower.type if state else Tower.TYPE.NONE))
|
||||||
|
tooltip_text = tower.name
|
||||||
|
texture = tower.icone
|
||||||
|
towerChanged()
|
||||||
|
|
||||||
|
|
||||||
func buttonToggled(state : bool) -> void:
|
func towerChanged() -> void :
|
||||||
if towerType != Tower.TYPE.NONE:
|
disabled = not tower.builded && Game.money < tower.price
|
||||||
EventBus.tower_selected.emit(towerType if state else Tower.TYPE.NONE)
|
|
||||||
|
|
||||||
|
|
||||||
func towerChanged(tower : Tower) -> void :
|
|
||||||
if tower.type == towerType && tower.builded:
|
|
||||||
$EnergyBar.value = tower.energy
|
|
||||||
$EnergyBar.max_value = tower.max_energy
|
$EnergyBar.max_value = tower.max_energy
|
||||||
$EnergyBar.visible = tower.builded
|
$EnergyBar.visible = tower.builded
|
||||||
|
$LeFond.visible = not tower.builded
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=4 format=3 uid="uid://dqb5o8w7u50hc"]
|
[gd_scene load_steps=6 format=3 uid="uid://dqb5o8w7u50hc"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://dyhtr6g7kd1g2" path="res://UI/gui_button.gd" id="1_snobr"]
|
[ext_resource type="Script" uid="uid://dyhtr6g7kd1g2" path="res://UI/gui_button.gd" id="1_snobr"]
|
||||||
[ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="2_enkiu"]
|
[ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="2_enkiu"]
|
||||||
|
|
@ -9,6 +9,15 @@ script = ExtResource("2_enkiu")
|
||||||
color = 1
|
color = 1
|
||||||
metadata/_custom_type_script = "uid://blnmjxmusrsa7"
|
metadata/_custom_type_script = "uid://blnmjxmusrsa7"
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_snobr"]
|
||||||
|
bg_color = Color(1, 1, 1, 0.3)
|
||||||
|
|
||||||
|
[sub_resource type="LabelSettings" id="LabelSettings_snobr"]
|
||||||
|
font_size = 26
|
||||||
|
font_color = Color(1, 0.843137, 0, 1)
|
||||||
|
outline_size = 3
|
||||||
|
outline_color = Color(0, 0, 0, 1)
|
||||||
|
|
||||||
[node name="TowerButton" type="Button"]
|
[node name="TowerButton" type="Button"]
|
||||||
custom_minimum_size = Vector2(80, 80)
|
custom_minimum_size = Vector2(80, 80)
|
||||||
offset_right = 80.0
|
offset_right = 80.0
|
||||||
|
|
@ -38,4 +47,20 @@ offset_bottom = 80.0
|
||||||
theme_override_styles/fill = SubResource("StyleBoxFlat_i47ne")
|
theme_override_styles/fill = SubResource("StyleBoxFlat_i47ne")
|
||||||
show_percentage = false
|
show_percentage = false
|
||||||
|
|
||||||
[connection signal="toggled" from="." to="." method="buttonToggled"]
|
[node name="LeFond" type="PanelContainer" parent="."]
|
||||||
|
visible = false
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 12
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_top = -36.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 0
|
||||||
|
mouse_filter = 2
|
||||||
|
theme_override_styles/panel = SubResource("StyleBoxFlat_snobr")
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="LeFond"]
|
||||||
|
layout_mode = 2
|
||||||
|
label_settings = SubResource("LabelSettings_snobr")
|
||||||
|
horizontal_alignment = 1
|
||||||
|
|
|
||||||
|
|
@ -29,5 +29,5 @@ func upgrade(tower: Tower) -> bool:
|
||||||
|
|
||||||
upgradeUpgrade()
|
upgradeUpgrade()
|
||||||
|
|
||||||
EventBus.tower_changed.emit(tower)
|
tower.changed.emit()
|
||||||
return true
|
return true
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,11 @@ spawn_next_wave={
|
||||||
"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)
|
"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)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
pause_game={
|
||||||
|
"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":80,"key_label":0,"unicode":112,"location":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
[layer_names]
|
[layer_names]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue