godot-mota/scripts/GameArchiveManager.gd

162 lines
4.2 KiB
GDScript

extends Node
const archive_image_path_prefix = "user://"
const archive_file_path = "user://mota.save"
# 当前玩家信息
var player_info = {
#英雄名称
"username" : "hero",
#英雄当前位置
"position" : Vector2.ZERO,
#英雄血量
"hp" : 1000,
# 英雄攻击力
"atk" : 10,
# 英雄防御力
"def" : 10,
#默认金钱
"money" : 0,
# 英雄等级
"level" : 1,
# 英雄经验
"experience" : 0,
# 当前楼层
"now_floor" : 1,
# 去过的最大楼层
"max_floor" : 1,
# 去过的最小楼层
"min_floor" : 1,
# 黄钥匙数量
"yellow_key" : 0,
# 蓝钥匙数量
"blue_key" : 0,
# 红钥匙数量
"red_key" : 0,
# 绿色钥匙数量
"green_key" : 0,
# 被使用的道具
"used_items" : {}
}
# 增加已经使用的对象
func add_used_item(path:String) -> void:
if not player_info.has("used_items"):
player_info.used_items = {}
var k = player_info.now_floor as String
if not player_info.used_items.has(k):
player_info.used_items[k] = [path]
else:
player_info.used_items[k].append(path)
# 根据楼层查询被使用的道具
func get_used_item(f:int) -> Array:
if not player_info.has("used_items"):
return []
var k = f as String
if not player_info.used_items.has(k):
return []
else:
return player_info.used_items[k]
return []
# 保存存档
func save_to_index(index:int):
update_player_position()
var archives := get_archives() as Array
if index >= 0 and index < archives.size():
var archive = archives[index] as Dictionary
archive.update_time = OS.get_unix_time()
archive.screenshot_file_path = save_screenshot_to_file(index)
archive.player_info = self.player_info
else:
var archive = {}
archive.create_time = OS.get_unix_time()
archive.update_time = archive.create_time
archive.screenshot_file_path = save_screenshot_to_file(index)
archive.player_info = self.player_info
archives.append(archive)
save_archives(archives)
# 获取玩家对象
func get_player() -> PlayerKinematicBody2D:
return get_tree().get_nodes_in_group("player")[0] as PlayerKinematicBody2D
# 更新玩家位置
func update_player_position() -> void:
var player = get_player()
player_info.position = player.position
# 根据索引加载存档
func load_by_index(index:int) -> void:
var archive = get_archives()[index]
self.player_info = archive.player_info
#加载楼层
GameFloorManager.load_by_floor(self.player_info.now_floor)
#设置人物位置
var player = get_player()
player.position = self.player_info.position
#更新楼层UI显示
update_floor_view()
update_hp_view()
update_key_view()
# 更新楼层UI显示
func update_floor_view():
$"/root/Main/UI/LevelBackground/LevelLabel".text = "魔塔 第%s" % player_info.now_floor
# 更新人物血量
func update_hp_view():
$"/root/Main/UI/HpSprite/HpBackground/HpLabel".text = player_info.hp as String
# 更新钥匙数量显示
func update_key_view():
$"/root/Main/UI/KeyBackground/YellowKeyCountLabel".text = player_info.yellow_key as String
$"/root/Main/UI/KeyBackground/BlueKeyCountLabel".text = player_info.blue_key as String
$"/root/Main/UI/KeyBackground/RedKeyCountLabel".text = player_info.red_key as String
$"/root/Main/UI/KeyBackground/GreenKeyCountLabel".text = player_info.green_key as String
# 保存屏幕截图到本地
func save_screenshot_to_file(index:int) -> String:
var image = get_viewport().get_texture().get_data()
image.flip_y()
var image_path = "%s%s%s" % [archive_image_path_prefix,index,".png"]
var result = image.save_png(image_path)
if result != OK:
print("保存存档图片错误:",result)
return image_path
# 得到所有存档文件对象
func get_archives() -> Array:
var archive_file = File.new()
if not archive_file.file_exists(archive_file_path):
archive_file.close()
return []
var result = archive_file.open(archive_file_path,File.READ)
if result == OK:
return archive_file.get_var(true)
else:
archive_file.close()
return []
# 保存所有存档文件对象
func save_archives(archives:Array) -> void:
var archive_file = File.new()
var result = archive_file.open(archive_file_path,File.WRITE)
if result == OK:
archive_file.store_var(archives,true)
else:
print("保存游戏文件失败:",result)
archive_file.close()