The beginning of public history
This commit is contained in:
41
Scripts/BaddieManager.gd
Normal file
41
Scripts/BaddieManager.gd
Normal file
@ -0,0 +1,41 @@
|
||||
extends Node2D
|
||||
|
||||
export var HP = 8
|
||||
export var color = "ffff00"
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
func take_damage(dmg):
|
||||
playAudio("Bomb_Drop.wav")
|
||||
modulate = Color(255,0,0)
|
||||
$KinematicBody2D/Light2D.color = Color(255,0,0)
|
||||
HP -= dmg
|
||||
reset_color()
|
||||
|
||||
|
||||
var color_timer
|
||||
func reset_color():
|
||||
if !color_timer:
|
||||
color_timer = Timer.new()
|
||||
add_child(color_timer)
|
||||
color_timer.connect("timeout", self, "color_timeout")
|
||||
color_timer.start(0.125)
|
||||
|
||||
func color_timeout():
|
||||
modulate = Color(color)
|
||||
$KinematicBody2D/Light2D.color = Color(color)
|
||||
|
||||
func _process(delta):
|
||||
if(HP <= 0):
|
||||
queue_free()
|
||||
|
||||
|
||||
var audioPlayer
|
||||
func playAudio(track):
|
||||
if !audioPlayer:
|
||||
audioPlayer = AudioStreamPlayer.new()
|
||||
get_parent().add_child(audioPlayer)
|
||||
audioPlayer.stream = load("res://Sound/" + track)
|
||||
audioPlayer.volume_db = -30
|
||||
audioPlayer.play()
|
271
Scripts/Console.gd
Normal file
271
Scripts/Console.gd
Normal file
@ -0,0 +1,271 @@
|
||||
extends Control
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a = 2
|
||||
# var b = "text"
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
|
||||
|
||||
|
||||
const CHANGE_TIME = 0.0125
|
||||
const ACTION_TIME = 0.25
|
||||
var actionTimer
|
||||
|
||||
var changeChar
|
||||
var queuedAction
|
||||
var charCount = 0
|
||||
var visableChars = 0
|
||||
|
||||
var tempValue = ""
|
||||
|
||||
const MAIN_MENU = ['Next Level', 'Upgrades', 'Main Menu']
|
||||
|
||||
|
||||
const ALL_EQUIPMENT = {
|
||||
#"pistol" : 4,
|
||||
#"smg" : 8
|
||||
}
|
||||
|
||||
const BASE_UNLOCK = {
|
||||
#"stealth" : 1000,
|
||||
"jump" : 1
|
||||
}
|
||||
|
||||
func _ready():
|
||||
actionTimer = Timer.new()
|
||||
actionTimer.connect("timeout", self, "RunQueuedAction")
|
||||
add_child(actionTimer)
|
||||
$Display.text = $Display.text + "\nGood job Unit " + String(SaveManager.get_run()) + "!"
|
||||
addLine("\nAwaiting input...")
|
||||
changeChar = CHANGE_TIME
|
||||
$Display.visible_characters = 18
|
||||
visableChars = 18
|
||||
updateCharCount()
|
||||
|
||||
GenerateInputs(MAIN_MENU)
|
||||
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
func GenerateInputs(options):
|
||||
for child in $Buttons.get_children():
|
||||
child.queue_free()
|
||||
for option in options:
|
||||
var button = Button.new()
|
||||
button.text = " [" + option + "] "
|
||||
button.connect("button_down", self, "ButtonInput", [option])
|
||||
$Buttons.add_child(button)
|
||||
|
||||
func ButtonInput(input):
|
||||
if input == "Main Menu":
|
||||
addLine("gis exit\nExiting environment...")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Next Level":
|
||||
addLine("gis run unit " + String(SaveManager.get_run()))
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Upgrades":
|
||||
addLine("gis config unit " + String(SaveManager.get_run()))
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Back":
|
||||
addLine("X")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Equipment":
|
||||
addLine("2")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Abilities":
|
||||
addLine("1")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input.to_lower() in SaveManager.get_equipment():
|
||||
addLine("gis access equipment " + input.to_lower())
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input.to_lower() in SaveManager.get_actions():
|
||||
addLine("gis access upgrade " + input.to_lower())
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Equip":
|
||||
addLine("1")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Upgrade":
|
||||
addLine("1")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Unequip":
|
||||
addLine("1")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input == "Buy Equipment":
|
||||
addLine("3")
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
elif input.to_lower() in ALL_EQUIPMENT:
|
||||
addLine("gis equipment purchase " + input.to_lower())
|
||||
if !queuedAction:
|
||||
queuedAction = input
|
||||
else:
|
||||
addLine("Error 404! Command `button:" + input + "` not found!")
|
||||
|
||||
func capFirst(inputVal):
|
||||
return inputVal.capitalize()[0] + inputVal.substr(1, len(inputVal))
|
||||
|
||||
func RunQueuedAction():
|
||||
if queuedAction == "Main Menu":
|
||||
get_tree().change_scene("res://Nodes/Title.tscn")
|
||||
elif queuedAction == "Next Level":
|
||||
get_tree().change_scene("res://Nodes/Game.tscn")
|
||||
elif queuedAction == "Upgrades":
|
||||
clearConsole()
|
||||
addLine("Upgrade Chips: " + String(SaveManager.get_upgrade_points()) + "\n\n")
|
||||
addLine("Select upgrade category:")
|
||||
addLine("1. Abilities")
|
||||
addLine("2. Equipment")
|
||||
addLine("3. Buy Equipment")
|
||||
addLine("\nX. Back")
|
||||
GenerateInputs(['Abilities', 'Equipment', 'Buy Equipment', 'Back'])
|
||||
elif queuedAction == "Buy Equipment":
|
||||
clearConsole()
|
||||
addLine("Upgrade Chips: " + String(SaveManager.get_upgrade_points()) + "\n\n")
|
||||
addLine("Equipment:")
|
||||
var i = 1
|
||||
var tempInputs = []
|
||||
for equipment in ALL_EQUIPMENT:
|
||||
if !(equipment in SaveManager.get_equipment()):
|
||||
tempInputs.append(capFirst(equipment))
|
||||
addLine(String(i) + ". " + capFirst(equipment) + " (COST " + String(ALL_EQUIPMENT[equipment]) + ")")
|
||||
i += 1
|
||||
GenerateInputs(tempInputs + ['Upgrades'])
|
||||
elif queuedAction == "Back":
|
||||
GenerateInputs(MAIN_MENU)
|
||||
clearConsole()
|
||||
elif queuedAction == "Equipment":
|
||||
clearConsole()
|
||||
addLine("Upgrade Chips: " + String(SaveManager.get_upgrade_points()) + "\n\n")
|
||||
addLine("Equipment:")
|
||||
var i = 1
|
||||
var tempInputs = []
|
||||
for equip in SaveManager.get_equipment():
|
||||
var suffix = ""
|
||||
if equip == SaveManager.get_equiped():
|
||||
suffix = " (EQUIPED)"
|
||||
addLine(String(i) + ". " + equip.capitalize()[0] + equip.substr(1, len(equip)) + suffix)
|
||||
tempInputs.append(equip.capitalize()[0] + equip.substr(1, len(equip)))
|
||||
i += 1
|
||||
addLine('\nX. Back')
|
||||
|
||||
GenerateInputs(tempInputs + ["Upgrades"])
|
||||
elif queuedAction == "Abilities":
|
||||
clearConsole()
|
||||
addLine("Upgrade Chips: " + String(SaveManager.get_upgrade_points()) + "\n\n")
|
||||
addLine("Abilities:")
|
||||
var i = 1
|
||||
var tempInputs = []
|
||||
for action in SaveManager.get_actions():
|
||||
addLine(String(i) + ". " + action.capitalize()[0] + action.substr(1, len(action)))
|
||||
tempInputs.append(action.capitalize()[0] + action.substr(1, len(action)))
|
||||
i += 1
|
||||
addLine('\nX. Back')
|
||||
|
||||
GenerateInputs(tempInputs + ["Upgrades"])
|
||||
elif queuedAction.to_lower() in SaveManager.get_equipment():
|
||||
clearConsole()
|
||||
addLine("Equipment: " + queuedAction)
|
||||
addLine("")
|
||||
var tempInputs = []
|
||||
if(queuedAction.to_lower() == SaveManager.get_equiped()):
|
||||
tempInputs.append("Unequip")
|
||||
addLine("1. Unequip")
|
||||
else:
|
||||
tempInputs.append("Equip")
|
||||
addLine("1. Equip")
|
||||
addLine("\nX. Back")
|
||||
tempValue = queuedAction.to_lower()
|
||||
GenerateInputs(tempInputs + ["Equipment"])
|
||||
elif queuedAction.to_lower() in SaveManager.get_actions():
|
||||
clearConsole()
|
||||
addLine("Upgrade Chips: " + String(SaveManager.get_upgrade_points()) + "\n\n")
|
||||
addLine("Ability: " + queuedAction)
|
||||
addLine("Level: " + String(SaveManager.get_action_value(queuedAction.to_lower())))
|
||||
addLine("")
|
||||
var pointsToUpgrade = 1 * int(SaveManager.get_action_value(queuedAction.to_lower()))
|
||||
if queuedAction.to_lower() in BASE_UNLOCK:
|
||||
pointsToUpgrade += BASE_UNLOCK[queuedAction.to_lower()]
|
||||
var tempInputs = []
|
||||
tempInputs.append("Upgrade")
|
||||
addLine("1. Upgrade (" + String(pointsToUpgrade) + " Points)")
|
||||
addLine("\nX. Back")
|
||||
tempValue = queuedAction.to_lower()
|
||||
GenerateInputs(tempInputs + ["Abilities"])
|
||||
elif queuedAction == "Equip":
|
||||
SaveManager.set_equiped(tempValue)
|
||||
addLine("\nEquiped: " + tempValue.capitalize()[0] + tempValue.substr(1, len(tempValue)))
|
||||
queuedAction = "Equipment"
|
||||
actionTimer.stop()
|
||||
return
|
||||
elif queuedAction == "Upgrade":
|
||||
var UPGRADE_COST = 1 * int(SaveManager.get_action_value(tempValue.to_lower()))
|
||||
if tempValue.to_lower() in BASE_UNLOCK:
|
||||
UPGRADE_COST += BASE_UNLOCK[tempValue.to_lower()]
|
||||
if (SaveManager.get_upgrade_points() >= UPGRADE_COST):
|
||||
SaveManager.change_upgrade_points(-1 * UPGRADE_COST)
|
||||
SaveManager.set_action_value(tempValue, SaveManager.get_action_value(tempValue) + 1)
|
||||
addLine("\nUpgraded: " + tempValue.capitalize()[0] + tempValue.substr(1, len(tempValue)))
|
||||
else:
|
||||
addLine("\nNot enough upgrade chips!")
|
||||
queuedAction = tempValue
|
||||
actionTimer.stop()
|
||||
return
|
||||
elif queuedAction == "Unequip":
|
||||
SaveManager.set_equiped("none")
|
||||
addLine("\nUnequiped: " + tempValue.capitalize()[0] + tempValue.substr(1, len(tempValue)))
|
||||
queuedAction = "Equipment"
|
||||
actionTimer.stop()
|
||||
return
|
||||
elif queuedAction.to_lower() in ALL_EQUIPMENT:
|
||||
var cost = ALL_EQUIPMENT[queuedAction.to_lower()]
|
||||
if (SaveManager.get_upgrade_points() >= cost):
|
||||
SaveManager.change_upgrade_points(-1 * cost)
|
||||
addLine("Purchased: " + queuedAction)
|
||||
SaveManager.unlock_equipment(queuedAction.to_lower())
|
||||
else:
|
||||
addLine("\nNot enough upgrade chips!")
|
||||
queuedAction = "Buy Equipment"
|
||||
return
|
||||
else:
|
||||
addLine("Error 404! Command `action:" + queuedAction + "` not found!")
|
||||
queuedAction = null
|
||||
addLine("\nAwaiting input...")
|
||||
actionTimer.stop()
|
||||
|
||||
func _process(delta):
|
||||
if(visableChars < charCount):
|
||||
if(changeChar <= 0):
|
||||
visableChars += 4
|
||||
$Display.visible_characters = visableChars
|
||||
changeChar = CHANGE_TIME
|
||||
else:
|
||||
changeChar -= delta
|
||||
else:
|
||||
changeChar = CHANGE_TIME
|
||||
if queuedAction && actionTimer.is_stopped():
|
||||
actionTimer.start(ACTION_TIME)
|
||||
|
||||
func addLine(line):
|
||||
$Display.text = $Display.text + "\n" + line
|
||||
updateCharCount()
|
||||
|
||||
func clearConsole():
|
||||
$Display.visible_characters = 0
|
||||
$Display.text = ""
|
||||
visableChars = 0
|
||||
updateCharCount()
|
||||
|
||||
func updateCharCount():
|
||||
charCount = $Display.get_total_character_count()
|
90
Scripts/Equipment/saber.gd
Normal file
90
Scripts/Equipment/saber.gd
Normal file
@ -0,0 +1,90 @@
|
||||
extends Node2D
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a = 2
|
||||
# var b = "text"
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
const DASH_SPEED = 300
|
||||
const UP = Vector2(0, -1)
|
||||
const RADperDEGREE = 57.2957795
|
||||
|
||||
const SLASH_ANIMATION = preload("res://Nodes/Animations/SlashAnimation.tscn")
|
||||
var player
|
||||
var colliderShape
|
||||
|
||||
|
||||
func _ready():
|
||||
colliderShape = $AnimatedSprite/Area2D/CollisionShape2D.get_shape()
|
||||
get_child(0).get_child(0).hide()
|
||||
player = get_parent().get_parent()
|
||||
player.connect("unequip", self, "on_unequip")
|
||||
$AnimatedSprite.connect("animation_finished", self, "on_animation_finished")
|
||||
$AnimatedSprite/Area2D.connect("body_entered", self, "on_collide")
|
||||
$AnimatedSprite.play("Spawn")
|
||||
pass # Replace with function body.
|
||||
|
||||
var audioPlayer
|
||||
func playAudio(track):
|
||||
if !audioPlayer:
|
||||
audioPlayer = AudioStreamPlayer.new()
|
||||
self.add_child(audioPlayer)
|
||||
audioPlayer.stream = load("res://Sound/" + track)
|
||||
audioPlayer.volume_db = -30
|
||||
audioPlayer.play()
|
||||
|
||||
func on_unequip():
|
||||
$AnimatedSprite.play("Spawn", true)
|
||||
|
||||
func on_collide(body):
|
||||
if(body.has_method("take_damage")):
|
||||
print(body)
|
||||
if($AnimatedSprite.animation == "Attack"):
|
||||
print("ATTACK")
|
||||
body.take_damage(1)
|
||||
pass
|
||||
|
||||
|
||||
var pos
|
||||
func _physics_process(delta):
|
||||
|
||||
$AnimatedSprite.flip_h = get_global_mouse_position().x < global_position.x
|
||||
if(get_global_mouse_position().x < global_position.x):
|
||||
$AnimatedSprite/Area2D.rotation = PI
|
||||
else:
|
||||
$AnimatedSprite/Area2D.rotation = 0
|
||||
|
||||
if($AnimatedSprite.animation == "Attack"):
|
||||
$AnimatedSprite/Area2D/CollisionShape2D.shape = colliderShape
|
||||
else:
|
||||
$AnimatedSprite/Area2D/CollisionShape2D.shape = null
|
||||
|
||||
if($AnimatedSprite.animation != "Spawn"):
|
||||
if(Input.is_action_just_pressed("attack")):
|
||||
if($AnimatedSprite.animation != "Attack"):
|
||||
playAudio("Charge2.wav")
|
||||
get_child(0).get_child(0).show()
|
||||
$AnimatedSprite.play("Attack")
|
||||
pos = player.global_position - get_global_mouse_position()
|
||||
var angle = atan(pos.y/pos.x)
|
||||
var goUp = -1
|
||||
var goRight = -1
|
||||
if(pos.y < 0):
|
||||
goUp = 1
|
||||
if(pos.x < 0):
|
||||
goRight = 1
|
||||
var xVar = cos(abs(angle)) * DASH_SPEED * goRight
|
||||
var yVar = sin(abs(angle)) * DASH_SPEED
|
||||
yVar = (yVar) * goUp - 20
|
||||
pos = Vector2(xVar, yVar)
|
||||
|
||||
if($AnimatedSprite.animation == "Attack"):
|
||||
player.move_and_slide(pos, UP)
|
||||
|
||||
|
||||
|
||||
|
||||
func on_animation_finished():
|
||||
if($AnimatedSprite.animation != "idle"):
|
||||
get_child(0).get_child(0).hide()
|
||||
$AnimatedSprite.play("idle")
|
14
Scripts/Exit.gd
Normal file
14
Scripts/Exit.gd
Normal file
@ -0,0 +1,14 @@
|
||||
extends Node2D
|
||||
|
||||
|
||||
func _ready():
|
||||
$Area2D.connect("body_entered", self, "on_collide")
|
||||
|
||||
|
||||
func on_collide(body):
|
||||
if body.has_method("victoryCondition"):
|
||||
MusicPlayer.stop()
|
||||
MusicPlayer.stream = load("res://Music/DOS-88/Smooth Sailing.ogg")
|
||||
MusicPlayer.volume_db = 0
|
||||
MusicPlayer.play()
|
||||
body.victoryCondition()
|
64
Scripts/MangeIntro.gd
Normal file
64
Scripts/MangeIntro.gd
Normal file
@ -0,0 +1,64 @@
|
||||
extends Label
|
||||
|
||||
#Hide all charafcters on start
|
||||
func _ready():
|
||||
show_text(2)
|
||||
visible_characters = 0
|
||||
|
||||
|
||||
var timePassed = 0 #Current amount of time spend displaying te
|
||||
const CHECK_LENGTH = 0.05 #Interval to check for updates
|
||||
var timeNeeded = 0 #Time that it takes to display the text
|
||||
var timer #Timer object
|
||||
var fadeTimer #Timer object
|
||||
|
||||
func show_text(seconds):
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!timer):
|
||||
timer = Timer.new()
|
||||
add_child(timer)
|
||||
timer.connect("timeout", self, "on_timeout")
|
||||
timer.start(CHECK_LENGTH)
|
||||
|
||||
func fade_text(seconds):
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!fadeTimer):
|
||||
fadeTimer = Timer.new()
|
||||
add_child(fadeTimer)
|
||||
fadeTimer.connect("timeout", self, "on_fade_timeout")
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
|
||||
func on_fade_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
modulate.a = 1 - (timePassed/timeNeeded)
|
||||
if(timePassed >= timeNeeded):
|
||||
fadeTimer.stop()
|
||||
checkIfDone()
|
||||
else:
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
pass
|
||||
|
||||
var done = false
|
||||
func checkIfDone():
|
||||
if(done):
|
||||
fadeTimer.queue_free()
|
||||
timer.queue_free()
|
||||
get_tree().change_scene("res://Nodes/Title.tscn")
|
||||
else:
|
||||
visible_characters = 0
|
||||
modulate.a = 1
|
||||
text = "Welcome Unit " + String($"/root/SaveManager".get_run() + 1) + "."
|
||||
done = true
|
||||
show_text(3)
|
||||
|
||||
func on_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
visible_characters = (timePassed/timeNeeded) * get_total_character_count()
|
||||
if(timePassed >= timeNeeded):
|
||||
timer.stop()
|
||||
fade_text(2)
|
||||
else:
|
||||
timer.start(CHECK_LENGTH)
|
||||
pass
|
292
Scripts/MapGeneration.gd
Normal file
292
Scripts/MapGeneration.gd
Normal file
@ -0,0 +1,292 @@
|
||||
extends Node
|
||||
|
||||
export var mapSize = 128
|
||||
var playerSpawn = Vector2()
|
||||
var PLAYER_OBJ = preload("res://Nodes/Player.tscn")
|
||||
|
||||
const PATH_SIZE = 2
|
||||
|
||||
func _ready():
|
||||
|
||||
MusicPlayer.stop()
|
||||
MusicPlayer.stream = load("res://Music/DOS-88/Checking Manifest.ogg")
|
||||
MusicPlayer.volume_db = 0
|
||||
MusicPlayer.play()
|
||||
|
||||
|
||||
UpdateProgress("Loading generation libraries...")
|
||||
randomize()
|
||||
|
||||
func UpdateProgress(message):
|
||||
print(message)
|
||||
$LoadingScreen.get_child(2).text = message
|
||||
|
||||
func setTile(x,y, value):
|
||||
var tileValue = -1
|
||||
if(value == "block"):
|
||||
tileValue = 0
|
||||
elif(value == "safe_block"):
|
||||
tileValue = 2
|
||||
elif(value == "player"):
|
||||
playerSpawn = Vector2(x,y)
|
||||
elif(value == "ladder"):
|
||||
tileValue = 1
|
||||
elif(value == "light"):
|
||||
createObject(x,y, "res://Nodes/Light.tscn")
|
||||
elif(value == "coin"):
|
||||
createObject(x,y, "res://Nodes/Pickup.tscn")
|
||||
elif(value == "enemy"):
|
||||
createObject(x,y, "res://Nodes/Enemies/Basic.tscn")
|
||||
elif(value == "exit"):
|
||||
createObject(x,y, "res://Nodes/Exit.tscn")
|
||||
$TileMap.set_cell(x, y, tileValue)
|
||||
|
||||
func createObject(x,y,objectPath):
|
||||
var obj = load(objectPath).instance()
|
||||
add_child(obj)
|
||||
var pos = $TileMap.map_to_world(Vector2(x,y))
|
||||
obj.position = Vector2(pos.x + 8, pos.y + 8)
|
||||
|
||||
func generateStructure(x,y, structure):
|
||||
var symbolDictionary = {
|
||||
"x" : "safe_block",
|
||||
"p" : "player",
|
||||
"l" : "ladder",
|
||||
"c" : "coin",
|
||||
"e" : "enemy",
|
||||
"#" : "exit",
|
||||
"?": "light"
|
||||
}
|
||||
var largestX = 0
|
||||
var largestY = structure.size()
|
||||
for structY in range(0, structure.size()):
|
||||
for structX in range(0, structure[structY].size()):
|
||||
if structX > largestX:
|
||||
largestX = structX
|
||||
var symbol = structure[structY][structX]
|
||||
setTile(x + structX, y + structY, symbolDictionary.get(symbol))
|
||||
var rect = Rect2(Vector2(x-1,y-1),Vector2(largestX+1,largestY+1))
|
||||
return rect
|
||||
|
||||
|
||||
func fillMap(value="block"):
|
||||
for x in range(0, mapSize):
|
||||
for y in range(0, mapSize):
|
||||
setTile(x,y,value)
|
||||
|
||||
func spawnPlayer():
|
||||
var tempVector = Vector2(playerSpawn.x * $TileMap.cell_size.x, playerSpawn.y * $TileMap.cell_size.y)
|
||||
var player = PLAYER_OBJ.instance()
|
||||
add_child(player)
|
||||
player.position = tempVector
|
||||
player.get_child(0).current = true
|
||||
var welcome = load("res://Nodes/PlayerGreetings.tscn").instance()
|
||||
add_child(welcome)
|
||||
welcome.position = Vector2(tempVector.x - 16, tempVector.y - 16)
|
||||
$TileMap.set_cell(playerSpawn.x, playerSpawn.y, -1)
|
||||
$LoadingScreen.hideSelf()
|
||||
|
||||
var rooms = Array()
|
||||
func createConnections():
|
||||
var graph = AStar.new()
|
||||
var point_id = 0
|
||||
for x in range(mapSize):
|
||||
for y in range(mapSize):
|
||||
if $TileMap.get_cell(x,y) == 0:
|
||||
graph.add_point(point_id, Vector3(x,y,0))
|
||||
|
||||
if x > 0 && $TileMap.get_cell(x - 1, y) == 0:
|
||||
var left_point = graph.get_closest_point(Vector3(x - 1, y, 0))
|
||||
graph.connect_points(point_id, left_point)
|
||||
|
||||
if y > 0 && $TileMap.get_cell(x, y - 1) == 0:
|
||||
var above_point = graph.get_closest_point(Vector3(x, y - 1, 0))
|
||||
graph.connect_points(point_id, above_point)
|
||||
|
||||
point_id += 1
|
||||
|
||||
var room_graph = AStar.new()
|
||||
point_id = 0
|
||||
for room in rooms:
|
||||
var room_center = room.position + room.size / 2
|
||||
room_graph.add_point(point_id, Vector3(room_center.x, room_center.y, 0))
|
||||
point_id += 1
|
||||
|
||||
while !is_everything_connected(room_graph):
|
||||
add_random_connection(graph, room_graph)
|
||||
|
||||
func is_everything_connected(graph):
|
||||
var points = graph.get_points()
|
||||
var start = points.pop_back()
|
||||
for point in points:
|
||||
var path = graph.get_point_path(start, point)
|
||||
if !path:
|
||||
return false
|
||||
return true
|
||||
|
||||
func add_random_connection(stone_graph, room_graph):
|
||||
|
||||
var start_room_id = get_least_connected_point(room_graph)
|
||||
var end_room_id = get_nearest_unconnected_point(room_graph, start_room_id)
|
||||
|
||||
var start_position = pick_random_door_location(rooms[start_room_id])
|
||||
var end_position = pick_random_door_location(rooms[end_room_id])
|
||||
|
||||
var closet_start_point = stone_graph.get_closest_point(start_position)
|
||||
var closet_end_point = stone_graph.get_closest_point(end_position)
|
||||
|
||||
var path = stone_graph.get_point_path(closet_start_point, closet_end_point)
|
||||
|
||||
for pos in path:
|
||||
for i in range(PATH_SIZE):
|
||||
if($TileMap.get_cell(pos.x+i, pos.y+i) == 0):
|
||||
setTile(pos.x+i, pos.y+i, "-1")
|
||||
if($TileMap.get_cell(pos.x+i, pos.y-i) == 0):
|
||||
setTile(pos.x+i, pos.y-i, "-1")
|
||||
if($TileMap.get_cell(pos.x-i, pos.y+i) == 0):
|
||||
setTile(pos.x-i, pos.y+i, "-1")
|
||||
if($TileMap.get_cell(pos.x-i, pos.y-i) == 0):
|
||||
setTile(pos.x-i, pos.y-i, "-1")
|
||||
if $TileMap.get_cell(pos.x, pos.y - 2) == -1:
|
||||
if $TileMap.get_cell(pos.x, pos.y - 1) == -1:
|
||||
if $TileMap.get_cell(pos.x, pos.y) == -1:
|
||||
if !isNextToCell(pos.x, pos.y, 1):
|
||||
setTile(pos.x, pos.y, "ladder")
|
||||
#elif(rand_range(0,1) > 0.666):
|
||||
# setTile(pos.x, pos.y, "light")
|
||||
|
||||
elif $TileMap.get_cell(pos.x, pos.y + 2) == -1:
|
||||
if $TileMap.get_cell(pos.x, pos.y + 1) == -1:
|
||||
if $TileMap.get_cell(pos.x, pos.y) == -1:
|
||||
if !isNextToCell(pos.x, pos.y, 1):
|
||||
setTile(pos.x, pos.y, "ladder")
|
||||
|
||||
room_graph.connect_points(start_room_id, end_room_id)
|
||||
|
||||
func isNextToCell(x, y, tileId):
|
||||
return $TileMap.get_cell(x-1, y) == tileId or $TileMap.get_cell(x+1, y) == tileId or $TileMap.get_cell(x, y-1) == tileId or $TileMap.get_cell(x, y+1) == tileId
|
||||
|
||||
func get_least_connected_point(graph):
|
||||
var point_ids = graph.get_points()
|
||||
|
||||
var least
|
||||
var tied_for_least
|
||||
|
||||
for point in point_ids:
|
||||
var count = graph.get_point_connections(point).size()
|
||||
if !least or count < least:
|
||||
least = count
|
||||
tied_for_least = [point]
|
||||
elif count == least:
|
||||
tied_for_least.append(point)
|
||||
|
||||
return tied_for_least[randi() % tied_for_least.size()]
|
||||
|
||||
func get_nearest_unconnected_point(graph, target_point):
|
||||
var target_position = graph.get_point_position(target_point)
|
||||
var point_ids = graph.get_points()
|
||||
|
||||
var nearest
|
||||
var tied_for_nearest = []
|
||||
|
||||
for point in point_ids:
|
||||
if point == target_point:
|
||||
continue
|
||||
|
||||
var path = graph.get_point_path(point, target_point)
|
||||
if path:
|
||||
continue
|
||||
|
||||
var dist = (graph.get_point_position(point) - target_position).length()
|
||||
if !nearest || dist < nearest:
|
||||
nearest = dist
|
||||
tied_for_nearest = [point]
|
||||
elif dist == nearest:
|
||||
tied_for_nearest.append(point)
|
||||
return tied_for_nearest[randi() % tied_for_nearest.size()]
|
||||
|
||||
func pick_random_door_location(room):
|
||||
var options = []
|
||||
|
||||
for x in range(room.position.x + 1, room.end.x - 2):
|
||||
if $TileMap.get_cell(x, room.position.y) == -1:
|
||||
options.append(Vector3(x, room.position.y, 0))
|
||||
if $TileMap.get_cell(x, room.end.y) == -1:
|
||||
options.append(Vector3(x, room.end.y - 1, 0))
|
||||
|
||||
for y in range(room.position.y + 1, room.end.y - 2):
|
||||
if $TileMap.get_cell(room.position.x, y) == -1:
|
||||
options.append(Vector3(room.position.x, y, 0))
|
||||
if $TileMap.get_cell(room.end.x - 1, y) == -1:
|
||||
options.append(Vector3(room.end.x - 1, y, 0))
|
||||
|
||||
|
||||
return options[randi() % options.size()]
|
||||
|
||||
func defaultGenerator(padding = 16):
|
||||
|
||||
UpdateProgress("Running default generator with map size " + String(mapSize) + "x" + String(mapSize))
|
||||
fillMap()
|
||||
|
||||
|
||||
var randomStructures = [
|
||||
[
|
||||
['x','x','x','x','x','x','x','x','x','x','x','x'],
|
||||
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
|
||||
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
|
||||
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
|
||||
['x','x',' ',' ','x',' ',' ','x',' ',' ','x','x'],
|
||||
['x',' ',' ',' ','x',' ',' ','x',' ',' ',' ','x'],
|
||||
['x',' ',' ',' ','x',' ','e','x',' ','e',' ','x'],
|
||||
['x','x','x','x','x','x','x','x','x','x','x','x']
|
||||
],
|
||||
[
|
||||
['x','x','x','x','x','x','x','x','x','x','x','x'],
|
||||
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
|
||||
[' ',' ',' ',' ','x','l',' ','x',' ',' ',' ',' '],
|
||||
[' ','e',' ',' ','x',' ',' ','x',' ',' ',' ',' '],
|
||||
['x','x','x','x','x','l',' ','x','x','x','x','x'],
|
||||
['x',' ',' ',' ','x',' ',' ','x',' ',' ',' ','x'],
|
||||
['x','c',' ',' ',' ',' ','e',' ',' ',' ','c','x'],
|
||||
['x','x','x','x','x','x','x','x','x','x','x','x']
|
||||
],
|
||||
]
|
||||
|
||||
|
||||
for i in range(rand_range(mapSize/32, mapSize/8)):
|
||||
rooms.append(generateStructure(rand_range(padding, mapSize - padding),rand_range(padding, mapSize - padding), randomStructures[rand_range(0, randomStructures.size())]))
|
||||
|
||||
|
||||
#Create spawn point
|
||||
UpdateProgress("Creating client connection port...")
|
||||
var spawnStructure = [
|
||||
['x','x','x','x','x','x','x','x','x'],
|
||||
['x',' ','?',' ',' ',' ','?',' ','x'],
|
||||
['x',' ',' ',' ',' ',' ',' ',' ',' '],
|
||||
['x',' ','p',' ',' ',' ',' ',' ',' '],
|
||||
['x','x','x','x','x','x','x','x','x']]
|
||||
rooms.append(generateStructure(rand_range(padding, mapSize/3),rand_range(padding, mapSize/3), spawnStructure))
|
||||
|
||||
var exitStructure = [
|
||||
['x','x','x','x','x','x','x'],
|
||||
['x',' ',' ',' ',' ',' ','x'],
|
||||
['x',' ',' ',' ',' ',' ','x'],
|
||||
[' ',' ',' ','#',' ',' ',' '],
|
||||
[' ',' ','x','x','x',' ',' '],
|
||||
[' ',' ','x','x','x',' ',' ']]
|
||||
|
||||
rooms.append(generateStructure(rand_range(padding, mapSize - padding),rand_range(padding, mapSize - padding*3), exitStructure))
|
||||
|
||||
createConnections()
|
||||
|
||||
$TileMap.set_cell(playerSpawn.x, playerSpawn.y, 0)
|
||||
|
||||
|
||||
UpdateProgress("Removing all possible escapes...")
|
||||
for x in range(0, mapSize):
|
||||
for y in range(0, mapSize):
|
||||
if x < padding or y < padding or x >= mapSize - padding or y >= mapSize - padding:
|
||||
setTile(x,y,"block")
|
||||
|
||||
spawnPlayer()
|
||||
|
193
Scripts/PlayerManager.gd
Normal file
193
Scripts/PlayerManager.gd
Normal file
@ -0,0 +1,193 @@
|
||||
extends KinematicBody2D
|
||||
|
||||
|
||||
|
||||
|
||||
#----------- Equipment
|
||||
var currentlyEquiped = "none"
|
||||
var sheathed = "saber"
|
||||
|
||||
|
||||
#----------- misc movement
|
||||
const UP = Vector2(0, -1)
|
||||
const BASE_GRAVITY = 20
|
||||
const BASE_SPEED = 150
|
||||
var motion = Vector2()
|
||||
|
||||
#----------- Jumping related variables
|
||||
const BASE_JUMP = -250 #Motion added for a jump
|
||||
var extra_jumps = 0 #Number of double jumps a player has
|
||||
var current_jumps = 0 #Number of jumps a player has left
|
||||
var jumpHeight = 0
|
||||
var coins = 0
|
||||
var GAMEOVER = false
|
||||
|
||||
const JUMP_PLATFORM = preload("res://Nodes/jump_platform.tscn")
|
||||
|
||||
func _ready():
|
||||
extra_jumps = SaveManager.get_action_value('jump')/4
|
||||
jumpHeight = SaveManager.get_action_value('jump') * -2
|
||||
sheathed = SaveManager.get_equiped()
|
||||
updateEquipment()
|
||||
|
||||
func victoryCondition():
|
||||
SaveManager.change_upgrade_points(coins)
|
||||
slide_out()
|
||||
|
||||
|
||||
const VICTORY_SCREEN = "res://Nodes/Victory.tscn"
|
||||
var slide_progress = 0
|
||||
var slide_timer
|
||||
const SLIDE_SPEED = 0.0125
|
||||
const PIXELS_PER = 32
|
||||
func slide_out():
|
||||
$CanvasLayer/GUI/SlideRect.rect_size.y = slide_progress
|
||||
if slide_progress < 600:
|
||||
slide_progress += PIXELS_PER
|
||||
if(!slide_timer):
|
||||
slide_timer = Timer.new()
|
||||
add_child(slide_timer)
|
||||
slide_timer.connect("timeout", self, "slide_out")
|
||||
slide_timer.start(SLIDE_SPEED)
|
||||
else:
|
||||
get_tree().change_scene(VICTORY_SCREEN)
|
||||
|
||||
func done_sliding():
|
||||
return slide_progress >= 600
|
||||
|
||||
signal unequip
|
||||
|
||||
var waitingToUpdate = 0
|
||||
func _process(delta):
|
||||
if(Input.is_action_just_pressed("sheath")):
|
||||
switch_sheath()
|
||||
if(Input.is_action_pressed("attack") and currentlyEquiped == "none"):
|
||||
switch_sheath()
|
||||
|
||||
func deal_damage(dmg = 1):
|
||||
playAudio("Hero_Hurt.wav")
|
||||
updateHealth(-dmg)
|
||||
print(getHealth())
|
||||
|
||||
func switch_sheath():
|
||||
if(sheathed == "none"):
|
||||
sheathed = currentlyEquiped
|
||||
currentlyEquiped = "none"
|
||||
else:
|
||||
currentlyEquiped = sheathed
|
||||
sheathed = "none"
|
||||
emit_signal("unequip")
|
||||
updateEquipment()
|
||||
|
||||
var audioPlayer
|
||||
func playAudio(track):
|
||||
if !audioPlayer:
|
||||
audioPlayer = AudioStreamPlayer.new()
|
||||
self.add_child(audioPlayer)
|
||||
audioPlayer.stream = load("res://Sound/" + track)
|
||||
audioPlayer.volume_db = -30
|
||||
audioPlayer.play()
|
||||
|
||||
func pickupCoin():
|
||||
coins += 1
|
||||
$CanvasLayer/GUI/Label.text = String(coins)
|
||||
|
||||
var maxHP = 25
|
||||
var health
|
||||
func updateHealth(val):
|
||||
if !health:
|
||||
health = maxHP
|
||||
$CanvasLayer/GUI/Healthbar.max_value = maxHP
|
||||
health += val
|
||||
$CanvasLayer/GUI/Healthbar.value = health
|
||||
if(health <= 0):
|
||||
game_over()
|
||||
|
||||
func getHealth():
|
||||
if !health:
|
||||
health = maxHP
|
||||
return health
|
||||
|
||||
func game_over():
|
||||
GAMEOVER = true
|
||||
$CanvasLayer/GUI.hide()
|
||||
$CanvasLayer/GameOver.show()
|
||||
|
||||
var tileMap
|
||||
|
||||
func _physics_process(delta):
|
||||
if GAMEOVER:
|
||||
hide()
|
||||
else:
|
||||
#Implement the force of gravity!
|
||||
motion.y += BASE_GRAVITY
|
||||
|
||||
#Moves the player left & right
|
||||
if(Input.is_action_pressed("right")):
|
||||
motion.x = BASE_SPEED
|
||||
elif (Input.is_action_pressed("left")):
|
||||
motion.x = -BASE_SPEED
|
||||
else:
|
||||
motion.x = 0
|
||||
|
||||
if is_on_floor():
|
||||
motion.y = 0
|
||||
|
||||
if !tileMap:
|
||||
var childs = get_parent().get_children()
|
||||
for child in childs:
|
||||
if typeof(child) == typeof(TileMap):
|
||||
tileMap = child
|
||||
break
|
||||
|
||||
#Handle the jumpings
|
||||
if (Input.is_action_just_pressed("up")):
|
||||
if is_on_floor():
|
||||
if(Input.is_action_pressed("down")):
|
||||
var tilePos = tileMap.world_to_map(position)
|
||||
tilePos.y += 1
|
||||
if(tileMap.get_cell(tilePos.x, tilePos.y) == 1):
|
||||
position.y += 4
|
||||
else:
|
||||
motion.y = BASE_JUMP + jumpHeight
|
||||
#Reset number of jumps
|
||||
current_jumps = extra_jumps
|
||||
elif current_jumps > 0:
|
||||
motion.y = BASE_JUMP + jumpHeight
|
||||
playAudio("Sword.wav")
|
||||
spawn_jump_platform()
|
||||
current_jumps -= 1
|
||||
|
||||
|
||||
#Do animations
|
||||
$AnimatedSprite.flip_h = get_global_mouse_position().x < position.x
|
||||
|
||||
if is_on_floor():
|
||||
if($AnimatedSprite.animation == "jump"):
|
||||
playAudio("Sword2.wav")
|
||||
if abs(motion.x) > 0:
|
||||
if(motion.x > 0):
|
||||
$AnimatedSprite.play("walk", true)
|
||||
else:
|
||||
$AnimatedSprite.play("walk", false)
|
||||
else:
|
||||
$AnimatedSprite.play("idle")
|
||||
else:
|
||||
$AnimatedSprite.play("jump")
|
||||
|
||||
motion = move_and_slide(motion, UP)
|
||||
|
||||
func spawn_jump_platform():
|
||||
var platform = JUMP_PLATFORM.instance()
|
||||
get_parent().add_child(platform)
|
||||
platform.position = Vector2(position.x, position.y + 4)
|
||||
|
||||
pass
|
||||
|
||||
func updateEquipment():
|
||||
var equipmentNode = get_child(3)
|
||||
if(equipmentNode.get_children().size() + 1 > 0):
|
||||
for enode in equipmentNode.get_children():
|
||||
enode.queue_free()
|
||||
var equipment = load("res://Nodes/Equipment/" + currentlyEquiped + ".tscn").instance()
|
||||
equipmentNode.add_child(equipment)
|
51
Scripts/RunLabel.gd
Normal file
51
Scripts/RunLabel.gd
Normal file
@ -0,0 +1,51 @@
|
||||
extends Label
|
||||
|
||||
#Hide all charafcters on start
|
||||
func _ready():
|
||||
text = "Authorization Granted: Unit " + String($"/root/SaveManager".get_run())
|
||||
show_text(2)
|
||||
visible_characters = 0
|
||||
|
||||
|
||||
var timePassed = 0 #Current amount of time spend displaying te
|
||||
const CHECK_LENGTH = 0.05 #Interval to check for updates
|
||||
var timeNeeded = 0 #Time that it takes to display the text
|
||||
var timer #Timer object
|
||||
var fadeTimer #Timer object
|
||||
|
||||
func show_text(seconds):
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!timer):
|
||||
timer = Timer.new()
|
||||
add_child(timer)
|
||||
timer.connect("timeout", self, "on_timeout")
|
||||
timer.start(CHECK_LENGTH)
|
||||
|
||||
func fade_text(seconds):
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!fadeTimer):
|
||||
fadeTimer = Timer.new()
|
||||
add_child(fadeTimer)
|
||||
fadeTimer.connect("timeout", self, "on_fade_timeout")
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
|
||||
func on_fade_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
modulate.a = 1 - (timePassed/timeNeeded)
|
||||
if(timePassed >= timeNeeded):
|
||||
fadeTimer.queue_free()
|
||||
else:
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
pass
|
||||
|
||||
func on_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
visible_characters = (timePassed/timeNeeded) * get_total_character_count()
|
||||
if(timePassed >= timeNeeded):
|
||||
timer.queue_free()
|
||||
fade_text(2)
|
||||
else:
|
||||
timer.start(CHECK_LENGTH)
|
||||
pass
|
59
Scripts/Title.gd
Normal file
59
Scripts/Title.gd
Normal file
@ -0,0 +1,59 @@
|
||||
extends Control
|
||||
|
||||
var fadeTo
|
||||
|
||||
func _ready():
|
||||
MusicPlayer.stop()
|
||||
MusicPlayer.stream = load("res://Music/DOS-88/Race to Mars.ogg")
|
||||
MusicPlayer.volume_db = 0
|
||||
MusicPlayer.play()
|
||||
$Fader.modulate.a = 1
|
||||
$CreditsMenu.hide()
|
||||
|
||||
$"New Game".connect("button_down", self, "new_game")
|
||||
$Credits.connect("button_down", self, "show_credits")
|
||||
$Quit.connect("button_down", self, "on_quit_down")
|
||||
|
||||
fade_out(3, 1, -1)
|
||||
|
||||
func new_game():
|
||||
SaveManager.add_run()
|
||||
fadeTo = "res://Nodes/Game.tscn"
|
||||
fade_out(3, -80)
|
||||
|
||||
func show_credits():
|
||||
$CreditsMenu.show()
|
||||
|
||||
func on_quit_down():
|
||||
get_tree().quit()
|
||||
|
||||
|
||||
var timePassed = 0 #Current amount of time spend displaying te
|
||||
const CHECK_LENGTH = 0.05 #Interval to check for updates
|
||||
var timeNeeded = 0 #Time that it takes to display the text
|
||||
var fadeTimer #Timer object
|
||||
|
||||
var multiplier = 1
|
||||
var adder = 0
|
||||
func fade_out(seconds, multi = 1, add = 0):
|
||||
multiplier = multi
|
||||
adder = add
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!fadeTimer):
|
||||
fadeTimer = Timer.new()
|
||||
add_child(fadeTimer)
|
||||
fadeTimer.connect("timeout", self, "on_fade_timeout")
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
|
||||
func on_fade_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
MusicPlayer.volume_db = multiplier * (timePassed/timeNeeded)
|
||||
$Fader.modulate.a = abs(timePassed/timeNeeded + adder)
|
||||
if(timePassed >= timeNeeded):
|
||||
fadeTimer.stop()
|
||||
if($Fader.modulate.a > 0.5):
|
||||
get_tree().change_scene(fadeTo)
|
||||
else:
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
pass
|
53
Scripts/TypeLabel.gd
Normal file
53
Scripts/TypeLabel.gd
Normal file
@ -0,0 +1,53 @@
|
||||
extends Label
|
||||
|
||||
export var time_to_show = 4.0
|
||||
export var fade_after_show = true
|
||||
#Hide all charafcters on start
|
||||
func _ready():
|
||||
show_text(time_to_show)
|
||||
visible_characters = 0
|
||||
|
||||
|
||||
var timePassed = 0 #Current amount of time spend displaying te
|
||||
const CHECK_LENGTH = 0.05 #Interval to check for updates
|
||||
var timeNeeded = 0 #Time that it takes to display the text
|
||||
var timer #Timer object
|
||||
var fadeTimer #Timer object
|
||||
|
||||
func show_text(seconds):
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!timer):
|
||||
timer = Timer.new()
|
||||
add_child(timer)
|
||||
timer.connect("timeout", self, "on_timeout")
|
||||
timer.start(CHECK_LENGTH)
|
||||
|
||||
func fade_text(seconds):
|
||||
timeNeeded = seconds
|
||||
timePassed = 0
|
||||
if(!fadeTimer):
|
||||
fadeTimer = Timer.new()
|
||||
add_child(fadeTimer)
|
||||
fadeTimer.connect("timeout", self, "on_fade_timeout")
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
|
||||
func on_fade_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
modulate.a = 1 - (timePassed/timeNeeded)
|
||||
if(timePassed >= timeNeeded):
|
||||
fadeTimer.queue_free()
|
||||
else:
|
||||
fadeTimer.start(CHECK_LENGTH)
|
||||
pass
|
||||
|
||||
func on_timeout():
|
||||
timePassed += CHECK_LENGTH
|
||||
visible_characters = (timePassed/timeNeeded) * get_total_character_count()
|
||||
if(timePassed >= timeNeeded):
|
||||
timer.queue_free()
|
||||
if(fade_after_show):
|
||||
fade_text(2)
|
||||
else:
|
||||
timer.start(CHECK_LENGTH)
|
||||
pass
|
12
Scripts/destroy_after_animation.gd
Normal file
12
Scripts/destroy_after_animation.gd
Normal file
@ -0,0 +1,12 @@
|
||||
extends AnimatedSprite
|
||||
|
||||
func _ready():
|
||||
play("spawn")
|
||||
connect("animation_finished", self, "on_animation_finished")
|
||||
|
||||
|
||||
func on_animation_finished():
|
||||
if(animation == "spawn"):
|
||||
play("destroy")
|
||||
else:
|
||||
get_parent().queue_free()
|
127
Scripts/saving.gd
Normal file
127
Scripts/saving.gd
Normal file
@ -0,0 +1,127 @@
|
||||
extends Node
|
||||
|
||||
const SAVE_PATH = "res://save_raw.yaml"
|
||||
const CONFIG_PATH = "res://config.cfg"
|
||||
|
||||
var _config_file = ConfigFile.new()
|
||||
|
||||
const RUN_PATH = "user://run.save"
|
||||
var _run_file = File.new()
|
||||
|
||||
const SAVE_PROGRESS = "user://progress.save"
|
||||
|
||||
var _settings = {
|
||||
"audio": {
|
||||
"mute": "false"
|
||||
}
|
||||
}
|
||||
|
||||
var _game_progress = {
|
||||
"upgrade_points" : "0",
|
||||
"equipment" : ["saber"],
|
||||
"equiped" : "saber",
|
||||
"actions" :
|
||||
{
|
||||
"jump" : 1
|
||||
}
|
||||
}
|
||||
|
||||
func _ready():
|
||||
var SaveFile = File.new()
|
||||
if !SaveFile.file_exists(SAVE_PROGRESS):
|
||||
save_settings()
|
||||
else:
|
||||
load_settings()
|
||||
|
||||
|
||||
func load_json(path):
|
||||
var file = File.new()
|
||||
file.open(path, file.READ)
|
||||
var tmp_text = file.get_as_text()
|
||||
file.close()
|
||||
var data = parse_json(tmp_text)
|
||||
return data
|
||||
|
||||
func write_json(path, data):
|
||||
var file = File.new()
|
||||
file.open(path, file.WRITE)
|
||||
file.store_string(to_json(data))
|
||||
file.close()
|
||||
|
||||
func get_run():
|
||||
if(_run_file.file_exists(RUN_PATH)):
|
||||
_run_file.open(RUN_PATH, File.READ)
|
||||
var run_value = _run_file.get_64()
|
||||
_run_file.close()
|
||||
return run_value
|
||||
else:
|
||||
return 0
|
||||
|
||||
func add_run():
|
||||
var currentRun = get_run()
|
||||
currentRun += 1
|
||||
_run_file.open(RUN_PATH, File.WRITE)
|
||||
_run_file.store_64(currentRun)
|
||||
_run_file.close()
|
||||
return currentRun
|
||||
|
||||
|
||||
func save_progress():
|
||||
write_json(SAVE_PROGRESS, _game_progress)
|
||||
|
||||
func get_upgrade_points():
|
||||
if "upgrade_points" in _game_progress:
|
||||
return int(_game_progress["upgrade_points"])
|
||||
else:
|
||||
return 0
|
||||
|
||||
func change_upgrade_points(pts):
|
||||
_game_progress["upgrade_points"] = int(_game_progress["upgrade_points"]) + pts
|
||||
|
||||
func get_equipment():
|
||||
return _game_progress['equipment']
|
||||
|
||||
func get_equiped():
|
||||
return _game_progress['equiped']
|
||||
|
||||
func set_equiped(equip):
|
||||
_game_progress['equiped'] = equip
|
||||
save_progress()
|
||||
|
||||
func unlock_equipment(equip):
|
||||
_game_progress['equipment'].append(equip)
|
||||
save_progress()
|
||||
|
||||
|
||||
func get_actions():
|
||||
var actions = []
|
||||
for action in _game_progress['actions']:
|
||||
actions.append(action)
|
||||
return actions
|
||||
|
||||
func get_action_value(action):
|
||||
return _game_progress['actions'][action]
|
||||
|
||||
func set_action_value(action, value):
|
||||
_game_progress['actions'][action] = value
|
||||
save_progress()
|
||||
|
||||
|
||||
func save_settings():
|
||||
for section in _settings.keys():
|
||||
for key in _settings[section]:
|
||||
_config_file.set_value(section, key, _settings[section][key])
|
||||
_config_file.save(CONFIG_PATH)
|
||||
|
||||
func load_settings():
|
||||
var error = _config_file.load(CONFIG_PATH)
|
||||
if error != OK:
|
||||
print("Failed to load config file. Error: %s" % error)
|
||||
return -1
|
||||
|
||||
for section in _settings.keys():
|
||||
for key in _settings[section]:
|
||||
var val = _config_file.get_value(section, key, null)
|
||||
_settings[section][key] = val
|
||||
|
||||
pass
|
Reference in New Issue
Block a user