1041 lines
31 KiB
GDScript
1041 lines
31 KiB
GDScript
extends Node
|
||
#存档路径
|
||
var save_file_path:String="user://save.data"
|
||
#加载的存档数据
|
||
var save_data:Array=[]
|
||
|
||
func load_save_data():
|
||
var f= FileAccess.open(save_file_path,FileAccess.READ)
|
||
if f!=null:
|
||
save_data=f.get_var()
|
||
else:
|
||
f=FileAccess.open(save_file_path,FileAccess.WRITE)
|
||
f.store_var(save_data)
|
||
#将所有存档数据保存到硬盘
|
||
func save_save_data():
|
||
var f=FileAccess.open(save_file_path,FileAccess.WRITE)
|
||
f.store_var(save_data)
|
||
#将当前的游戏数据以存档名n的名字添加到存储队列
|
||
func add_now_game_to_save(n:String):
|
||
var new_save=now_game_data.duplicate(true)
|
||
new_save["name"]=n
|
||
save_data.append(new_save)
|
||
save_save_data()
|
||
#将当前的游戏数据以存档原名覆盖到第ind个存档上
|
||
func cover_now_game_to_save(ind:int):
|
||
var n:String=save_data[ind]["name"]
|
||
var new_save=now_game_data.duplicate(true)
|
||
new_save["name"]=n
|
||
save_data[ind]=new_save
|
||
save_save_data()
|
||
#获取当前存档队列
|
||
func get_all_save():
|
||
return save_data.duplicate(true)
|
||
#加载第ind个存档
|
||
func load_save(ind:int):
|
||
now_game_data=save_data[ind].duplicate()
|
||
SceneManager.change_scene_to("res://scene/game_flow.tscn")
|
||
pass
|
||
#删除第ind个存档
|
||
func delete_save(ind:int):
|
||
save_data.pop_at(ind)
|
||
save_save_data()
|
||
var system_config_data_path:String="user://config.data"
|
||
#加载配置文件
|
||
func load_config():
|
||
var f=FileAccess.open(system_config_data_path,FileAccess.READ)
|
||
if f!=null:
|
||
system_config_data=f.get_var()
|
||
else:
|
||
f=FileAccess.open(system_config_data_path,FileAccess.WRITE)
|
||
f.store_var(system_config_data)
|
||
Bgm.set_BGM_volume(system_config_data["BGM_volume"])
|
||
Bgm.set_effect_volume(system_config_data["effect_volume"])
|
||
#存储配置文件
|
||
func save_config():
|
||
var f=FileAccess.open(system_config_data_path,FileAccess.WRITE)
|
||
f.store_var(system_config_data)
|
||
#更改BGM音量
|
||
func change_BGM_volume(value:float):
|
||
Bgm.set_BGM_volume(value)
|
||
system_config_data["BGM_volume"]=value
|
||
save_config()
|
||
pass
|
||
#更改音效音量
|
||
func change_effect_volume(value:float):
|
||
Bgm.set_effect_volume(value)
|
||
system_config_data["effect_volume"]=value
|
||
save_config()
|
||
pass
|
||
func get_BGM_volume():
|
||
return system_config_data["BGM_volume"]
|
||
pass
|
||
func get_effect_volume():
|
||
return system_config_data["effect_volume"]
|
||
var system_config_data:Dictionary={
|
||
#BGM音量
|
||
"BGM_volume":0.7,
|
||
#音效音量
|
||
"effect_volume":0.7,
|
||
}
|
||
|
||
#局外游戏数据文件目录
|
||
var system_game_data_path:String="user://system_game.data"
|
||
#局外游戏数据
|
||
var system_game_data:Dictionary={
|
||
"unlock_character":["test_character_01","test_character_02","Rolland"],
|
||
#全局物品
|
||
"item":[],
|
||
"jifen":100,
|
||
"jinqian":100,
|
||
"zuanshi":100,
|
||
"tili":100,
|
||
}
|
||
#获取系统全局物品
|
||
func get_all_item_system_data():
|
||
|
||
pass
|
||
#货币变更信号
|
||
signal system_currency_changed
|
||
#获取货币,0积分,1金钱,2钻石,3体力
|
||
func get_currency_system(ind:int):
|
||
match ind:
|
||
0:
|
||
return system_game_data["jifen"]
|
||
1:
|
||
return system_game_data["jinqian"]
|
||
2:
|
||
return system_game_data["zuanshi"]
|
||
3:
|
||
return system_game_data["tili"]
|
||
#更改货币数据
|
||
func set_currency_system(ind:int,value):
|
||
match ind:
|
||
0:
|
||
system_game_data["jifen"]=value
|
||
1:
|
||
system_game_data["jinqian"]=value
|
||
2:
|
||
system_game_data["zuanshi"]=value
|
||
3:
|
||
system_game_data["tili"]=value
|
||
system_currency_changed.emit()
|
||
save_system_game_data()
|
||
pass
|
||
#加载局外游戏数据文件
|
||
func load_system_game_data():
|
||
var f=FileAccess.open(system_game_data_path,FileAccess.READ)
|
||
if f!=null:
|
||
system_game_data=f.get_var()
|
||
else:
|
||
f=FileAccess.open(system_game_data_path,FileAccess.WRITE)
|
||
f.store_var(system_game_data)
|
||
#存储局外游戏数据
|
||
func save_system_game_data():
|
||
var f=FileAccess.open(system_game_data_path,FileAccess.WRITE)
|
||
f.store_var(system_game_data)
|
||
#获取当前游戏内所有物品的拷贝数据
|
||
func get_all_item_game_data()->Array:
|
||
return now_game_data["item"].duplicate(true)
|
||
#获取当前游戏内所有物品的非拷贝数据
|
||
func get_all_item_game_data_not_copy()->Array:
|
||
return now_game_data["item"]
|
||
#根据type获取当前物品
|
||
func get_type_item_game_data(type:int)->Array:
|
||
var item:Array=now_game_data["item"].duplicate(true)
|
||
var res:Array=[]
|
||
for i in item:
|
||
if i.has("type") and int(i["type"])==type:
|
||
res.append(i)
|
||
return res
|
||
|
||
func get_now_character_equip_page(page:int):
|
||
return CharacterTool.get_character_equip_page(get_now_character_data(),page)
|
||
|
||
func get_now_character_equip_use():
|
||
return CharacterTool.get_character_equip_now(get_now_character_data())
|
||
|
||
func replace_equip_with_data(page:int,pos:int,item_data):
|
||
|
||
var left=CharacterTool.replace_character_equip(now_game_data["character_data"],page,pos,item_data)
|
||
if left!=null:
|
||
add_item_to_bag(left)
|
||
pass
|
||
#向背包中添加item,会根据allow merger属性决定是否自动合并,并创建num属性
|
||
func add_item_to_bag(item_data:Dictionary):
|
||
var item:Array=now_game_data["item"]
|
||
if item_data["allow_merge"]:
|
||
var is_find:bool=false
|
||
for i in item.size():
|
||
if item[i]["id"]==item_data["id"]:
|
||
is_find=true
|
||
if item[i].has("num"):
|
||
item[i]["num"]+=1
|
||
else:
|
||
item[i]["num"]=2
|
||
|
||
if not is_find:
|
||
item.append(item_data)
|
||
pass
|
||
else:
|
||
item.append(item_data)
|
||
|
||
|
||
#根据在背包的排序减少对应物品的数量
|
||
func decrease_item_num_index(ind:int,num:int=1):
|
||
var item:Array=now_game_data["item"]
|
||
if ind<item.size():
|
||
var item_data=item[ind]
|
||
if item_data.has("num"):
|
||
item_data["num"]-=1
|
||
if item_data["num"]<=0:
|
||
item.pop_at(ind)
|
||
else:
|
||
item.pop_at(ind)
|
||
#根据ID减少在背包内的物品
|
||
func decrease_item_num_id(id:String,num:int=1)->bool:
|
||
var item:Array=now_game_data["item"]
|
||
var item_data
|
||
var ind:int
|
||
for i in item.size():
|
||
if item[i]["id"]==id:
|
||
item_data=item[i]
|
||
ind=i
|
||
break
|
||
if item_data==null:
|
||
return false
|
||
else:
|
||
if not item_data.has("num"):
|
||
item_data["num"]=1
|
||
var item_num:int=item_data["num"]
|
||
if item_num>num:
|
||
item_data["num"]-=num
|
||
return true
|
||
elif item_num==num:
|
||
item.pop_at(ind)
|
||
return true
|
||
else:
|
||
return false
|
||
#通过id获取当前背包数量(如果是不允许合并的物品则返回1(有)或者0(没有))
|
||
func get_item_by_id(id:String)->int:
|
||
var item:Array=now_game_data["item"]
|
||
var item_data
|
||
var ind:int
|
||
for i in item.size():
|
||
if item[i]["id"]==id:
|
||
item_data=item[i]
|
||
ind=i
|
||
break
|
||
if item_data!=null:
|
||
if item_data.has("num"):
|
||
return item_data["num"]
|
||
else:
|
||
print(item_data)
|
||
return 1
|
||
else:
|
||
return 0
|
||
pass
|
||
#返回一个长度为2的数组,第一个数组存储的item中装备的index,另一个是对应的item_data
|
||
func get_all_equip_index_and_data_in_bag()->Array:
|
||
var item:Array=now_game_data["item"].duplicate(true)
|
||
var res:Array=[]
|
||
var ind_arr:Array=[]
|
||
var data_arr:Array=[]
|
||
for i in item.size():
|
||
if is_item_a_equip(item[i]):
|
||
ind_arr.append(i)
|
||
data_arr.append(item[i])
|
||
res=[ind_arr,data_arr]
|
||
return res
|
||
#返回一个长度为2的数组,第一个数组存储的item中技能的index,另一个是对应的item_data
|
||
func get_all_skill_index_and_data_in_bag()->Array:
|
||
var item:Array=now_game_data["item"].duplicate(true)
|
||
var res:Array=[]
|
||
var ind_arr:Array=[]
|
||
var data_arr:Array=[]
|
||
for i in item.size():
|
||
if is_item_a_skill(item[i]):
|
||
ind_arr.append(i)
|
||
data_arr.append(item[i])
|
||
res=[ind_arr,data_arr]
|
||
return res
|
||
#判断item是否为一个装备(暂时将武器除外)
|
||
func is_item_a_equip(item_data:Dictionary)->bool:
|
||
|
||
if not item_data.has("type"):
|
||
return false
|
||
var type:int=item_data["type"]
|
||
if type in [0,1,2,3]:
|
||
return true
|
||
else:
|
||
return false
|
||
|
||
#判断item是否为一个技能
|
||
func is_item_a_skill(item_data:Dictionary):
|
||
if not item_data.has("type"):
|
||
return false
|
||
var type:int=item_data["type"]
|
||
if type ==6:
|
||
return true
|
||
else:
|
||
return false
|
||
|
||
#改变当前角色使用的装备页
|
||
func change_character_equip_now_use(page:int):
|
||
print(page)
|
||
CharacterTool.change_character_equip_now_use(now_game_data["character_data"],page)
|
||
#获取当前使用装备页数
|
||
func get_character_page_now_use()->int:
|
||
return CharacterTool.get_character_equip_now_use_page(now_game_data["character_data"])
|
||
#将角色第ind个技能卡移除,放入背包
|
||
func remove_skill_card_ind_to_bag(ind:int):
|
||
var now_character_data:Dictionary=now_game_data["character_data"]
|
||
var left=CharacterTool.remove_skill_index(now_character_data,ind)
|
||
if left!=null:
|
||
add_item_to_bag(left)
|
||
#将背包中序列为ind的技能卡装备到角色
|
||
func add_sill_card_from_bag_to_character(ind:int):
|
||
var item_data=now_game_data["item"][ind]
|
||
if is_item_a_skill(item_data):
|
||
var res=CharacterTool.add_skill_card(now_game_data["character_data"],item_data)
|
||
if res:
|
||
decrease_item_num_index(ind)
|
||
#获取当前角色的所有技能
|
||
func get_now_character_skill():
|
||
var character_data=now_game_data["character_data"]
|
||
return CharacterTool.get_character_skill_all(character_data)
|
||
##当前局内数据
|
||
var now_game_data:Dictionary={
|
||
"character_data":{
|
||
|
||
},
|
||
"script_data":{
|
||
|
||
},
|
||
#游戏内物品
|
||
"item":[],
|
||
|
||
#存储的NPC数据(仅包含遇到的NPC,用于存储NPC的背包,在申请NPCdata时进行写入
|
||
"NPC_data":{},
|
||
|
||
|
||
#当前场景ID
|
||
"now_scene":"",
|
||
"difficulty":0,
|
||
"gold":1000,
|
||
"health":100,
|
||
"spirit":999,
|
||
"physical":100,
|
||
#体力
|
||
"map":"map_01",
|
||
"move_ability":1,
|
||
"time_unix":0,
|
||
"finish_unix":0,
|
||
#背包卡牌(废弃)
|
||
"card_in_bag":["card_03","card_03","card_02","card_02","card_01","card_01","card_01","card_01"],
|
||
#互动点触摸随机结果记忆字典
|
||
"condition_triger_randi_dic":{
|
||
|
||
},
|
||
#当前可以制作的物品ID(配方)
|
||
"item_could_make":["item_06"],
|
||
|
||
|
||
#事件flag(用来记录某事件条件标志)
|
||
"flags":{
|
||
|
||
},
|
||
|
||
|
||
#地区探索度 id:探索值(int)
|
||
"scene_explore":{
|
||
|
||
},
|
||
|
||
|
||
#定时触发任务
|
||
#格式:
|
||
# [
|
||
# {
|
||
# "time”:到期unix事件戳
|
||
# "triger":[一般触发器格式]
|
||
# }
|
||
# ]
|
||
"time_clock_event":[]
|
||
|
||
}
|
||
#添加定时任务
|
||
func add_clock_event(time_unix:int,triger:Array):
|
||
if now_game_data.has("time_clock_event"):
|
||
now_game_data["time_clock_event"].append({
|
||
"time":time_unix,
|
||
"triger":triger.duplicate(true)
|
||
})
|
||
else:
|
||
now_game_data["time_clock_event"]=[{
|
||
"time":time_unix,
|
||
"triger":triger.duplicate(true)
|
||
}]
|
||
#判定并执行定时任务
|
||
func judge_clock_event():
|
||
if now_game_data.has("time_clock_event"):
|
||
var time_clock_event:Array=now_game_data["time_clock_event"]
|
||
var i=0
|
||
while i <time_clock_event.size():
|
||
var dict=time_clock_event[i]
|
||
var unix=dict["time"]
|
||
var triger:Array=dict["triger"]
|
||
if get_time_unix()>=unix:
|
||
for j in triger:
|
||
call_triger(j["type"],j["data"])
|
||
time_clock_event.pop_at(i)
|
||
i-=1
|
||
i+=1
|
||
pass
|
||
pass
|
||
|
||
|
||
#获取场景探索度
|
||
func get_scene_explore(scene_id:String):
|
||
if now_game_data.has("scene_explore"):
|
||
var scene_explore_dic=now_game_data["scene_explore"]
|
||
if scene_explore_dic.has(scene_id):
|
||
return scene_explore_dic[scene_id]
|
||
else:
|
||
scene_explore_dic[scene_id]=0
|
||
return 0
|
||
else:
|
||
now_game_data["scene_explore"]={
|
||
scene_id:0
|
||
}
|
||
return 0
|
||
#设置场景探索度
|
||
func set_scene_explore(scene_id:String,value:float):
|
||
if now_game_data.has("scene_explore"):
|
||
var scene_explore_dic=now_game_data["scene_explore"]
|
||
scene_explore_dic[scene_id]=value
|
||
else:
|
||
now_game_data["scene_explore"]={
|
||
scene_id:value
|
||
}
|
||
scene_explore_changed.emit(scene_id)
|
||
#场景探索度改变时发出信号,方便更新UI
|
||
signal scene_explore_changed(scene_id:String)
|
||
#改变场景探索度
|
||
func change_scene_explore(scene_id:String,change_value:float):
|
||
set_scene_explore(scene_id,get_scene_explore(scene_id)+change_value)
|
||
|
||
#设置标志
|
||
func set_flag(flag_name:String,value):
|
||
if now_game_data.has("flags"):
|
||
now_game_data["flags"][flag_name]=value
|
||
else:
|
||
now_game_data["flags"]={
|
||
flag_name:value
|
||
}
|
||
#获取标识,-1为标识不存在
|
||
func get_flag(flag_name:String):
|
||
if now_game_data.has("flags") and now_game_data["flags"].has(flag_name):
|
||
return now_game_data["flags"][flag_name]
|
||
else:
|
||
|
||
return -1
|
||
|
||
|
||
|
||
|
||
#当前是否应该展示开始事件
|
||
func should_show_init_event()->bool:
|
||
var now_script_data=now_game_data["script_data"]
|
||
if not now_script_data.has("init_event"):
|
||
return false
|
||
if not now_script_data.has("init_finished"):
|
||
return true
|
||
return false
|
||
#获取初始事件
|
||
func get_init_event():
|
||
var now_script_data=now_game_data["script_data"]
|
||
return now_script_data["init_event"]
|
||
#执行完初始事件后使用
|
||
func shown_init_event():
|
||
var now_script_data=now_game_data["script_data"]
|
||
now_script_data["init_finished"]=true
|
||
|
||
|
||
#返回当前可以制作的物品ID
|
||
func get_now_game_item_could_make():
|
||
return now_game_data["item_could_make"].duplicate()
|
||
#获取当前局内NPC数据
|
||
func get_now_game_npc_data(NPC_id:String):
|
||
var now_npc_data:Dictionary=now_game_data["NPC_data"]
|
||
if now_npc_data.has(NPC_id):
|
||
#这里不进行duplicate副本的原因是trade交易场景要对数据进行操作
|
||
return now_npc_data[NPC_id]
|
||
else:
|
||
#填入npc数据,并实例出售卖的道具()可以通过在get item data上施加影响来实现随机
|
||
var n_data=Database.get_npc_data(NPC_id)
|
||
var sold_item_array:Array=[]
|
||
for i in n_data["sold_item"].keys():
|
||
var item_data=Database.get_item_data(i)
|
||
item_data["num"]=n_data["sold_item"][i]
|
||
sold_item_array.append(item_data)
|
||
n_data["sold_item"]=sold_item_array
|
||
now_game_data["NPC_data"][NPC_id]=n_data
|
||
return now_npc_data[NPC_id]
|
||
#获取当前角色与NPC的好感度
|
||
func get_now_game_npc_favor(npc_id):
|
||
return CharacterTool.get_character_with_npc_favor(now_game_data["character_data"],npc_id)
|
||
#展示和NPC id对应的交易界面
|
||
func show_trade(npc_id:String):
|
||
now_game_flow.show_trade(npc_id)
|
||
|
||
#游戏内货币改变信号
|
||
signal game_currency_changed
|
||
#获取游戏内的“货币”,0:生命,1金钱,2精神
|
||
func get_currency_game(ind:int):
|
||
match ind:
|
||
0:
|
||
return now_game_data["health"]
|
||
1:
|
||
return now_game_data["gold"]
|
||
2:
|
||
return now_game_data["spirit"]
|
||
3:
|
||
return now_game_data["physical"]
|
||
func set_currency_game(ind:int,value):
|
||
match ind:
|
||
0:
|
||
now_game_data["health"]=value
|
||
1:
|
||
now_game_data["gold"]=value
|
||
2:
|
||
now_game_data["spirit"]=value
|
||
3:
|
||
now_game_data["physical"]=value
|
||
game_currency_changed.emit()
|
||
#更改
|
||
func change_currency_game(ind:int,change):
|
||
set_currency_game(ind,get_currency_game(ind)+change)
|
||
#当前战斗场景
|
||
var now_fight_scene:FightScene
|
||
#向卡组中添加卡牌
|
||
func add_card(card_id:String):
|
||
now_game_data["card_in_bag"].append(card_id)
|
||
#从卡组中删除卡牌
|
||
func delete_card(card_id:String)->bool:
|
||
var now_arr:Array= now_game_data["card_in_bag"]
|
||
var ind=now_arr.find(card_id)
|
||
if ind==-1:
|
||
return false
|
||
else:
|
||
now_game_data["card_in_bag"].pop_at(ind)
|
||
return true
|
||
|
||
|
||
var now_fight_enermy_data:Array=[]
|
||
var now_fight_friend_data:Array=[]
|
||
func fight(data:Dictionary):
|
||
if data.has("friend"):
|
||
now_fight_friend_data=data["friend"]
|
||
now_fight_enermy_data
|
||
SceneManager.change_scene_to("res://scene/fight.tscn")
|
||
pass
|
||
|
||
|
||
|
||
#使用卡牌,character为使用者,target为目标,card_data为使用的卡牌数据
|
||
func use_card(card_data:Dictionary,user=null,target=null):
|
||
print("执行了卡牌:\n"+str(card_data)+"\n目标"+str(target))
|
||
if card_data.has("triger"):
|
||
for funcitem in card_data["triger"]:
|
||
var _func=Callable(self,funcitem.func)
|
||
var value:Array=funcitem.value.duplicate()
|
||
for i in value.size():
|
||
if value[i] is String and value[i]=="user":
|
||
value[i]=user
|
||
elif value[i] is String and value[i]=="target":
|
||
value[i]=target
|
||
_func.callv(value)
|
||
##下面是例子
|
||
##打击单位
|
||
func hit(target,value):
|
||
if target is FightCharacterCard ||target is FightEnermyCard:
|
||
target.HP-=value
|
||
#打击全部单位
|
||
func hit_all(value):
|
||
var all_character=now_fight_scene.get_all_unit()
|
||
for i in all_character:
|
||
i.HP-=value
|
||
#回血
|
||
func recover(target,value):
|
||
if target is FightCharacterCard ||target is FightEnermyCard:
|
||
target.HP+=value
|
||
|
||
|
||
|
||
func get_all_card()->Array:
|
||
return now_game_data["card_in_bag"].duplicate()
|
||
func get_move_ability():
|
||
return now_game_data["move_ability"]
|
||
func get_time_dictionary():
|
||
var time_unix=int(now_game_data["time_unix"])
|
||
return Time.get_datetime_dict_from_unix_time(time_unix)
|
||
#返回当前时间戳
|
||
func get_time_unix():
|
||
return now_game_data["time_unix"]
|
||
#year、month、day、weekday、hour、minute 和 second
|
||
func flow_time(data:Dictionary):
|
||
var date=get_time_dictionary()
|
||
var change_unix:float=0
|
||
if data.has("day"):
|
||
var day=data["year"]
|
||
change_unix+=day*86400
|
||
if data.has("hour"):
|
||
var hour=data["hour"]
|
||
change_unix+=3600*hour
|
||
if data.has("minute"):
|
||
var minute=data["minute"]
|
||
change_unix+=minute*60
|
||
now_game_data["time_unix"]+=change_unix
|
||
time_changed.emit()
|
||
#时间改变的信号
|
||
signal time_changed
|
||
#事件触发器列表
|
||
var triger:Dictionary={
|
||
"change_event":func (data):now_game_flow.show_event(data),
|
||
"change_texture": func (data):now_game_flow.event_panel.change_texture(data),
|
||
"change_text":func(data):now_game_flow.event_panel.change_text(data),
|
||
"change_choice":func(data):now_game_flow.event_panel.change_choice(data),
|
||
"increase_health":func (data):now_game_data.health-=data,
|
||
"end_event":func(data):now_game_flow.event_panel.hide(),
|
||
"flow_time":func (data):flow_time(data),
|
||
"fight":func (data):fight(data),
|
||
#货币变更触发器
|
||
"add_currency":func (data):change_currency_game(data["ind"],data["value"]),
|
||
#交易触发器
|
||
"trade":func(data): show_trade(data),
|
||
#鉴定触发器
|
||
"show_identifaction":func(data):show_identification(data),
|
||
#拍卖触发器
|
||
"show_auction":func(data):show_auction(data),
|
||
#装备升级界面展示触发器
|
||
"show_level_up":func (data):now_game_flow.show_item_level_up(),
|
||
"show_warehouse":func(data):now_game_flow.show_warehouse(),
|
||
"make_card":func(data):now_game_flow.show_make_card(),
|
||
#开启任务
|
||
"start_mission":func(data):add_mission_started(data),
|
||
|
||
|
||
#人类特质触发器,触发为当前游戏人物属性随机加一
|
||
"human":func(data):human_triger(),
|
||
|
||
|
||
|
||
|
||
|
||
#角色处理触发器
|
||
"character_data_process":func(data):return character_process(data),
|
||
|
||
|
||
|
||
#设置事件flag
|
||
"set_flag":func(data):set_flag(data["flag_name"],data["value"]),
|
||
|
||
#使用changevalue更改flag的值,可以用来记录事件进度之类的
|
||
"change_flag":func (data):set_flag(data["flag_name"],get_flag(data["flag_name"])+data["change_value"]),
|
||
#改变地区探索度
|
||
"change_scene_explore":func(data):change_scene_explore(data["scene_id"],data["change_value"]),
|
||
|
||
#带有权重的随机触发器
|
||
"rand_triger":func(data):rand_triger(data),
|
||
|
||
|
||
#刷新互动点
|
||
"refresh_scene_touch":func(data):now_game_flow.refresh_scene_touch(),
|
||
|
||
#添加定时任务,time limit 为距离当前时间限时
|
||
"add_clock_triger":func(data):add_clock_event(get_time_unix()+data["time_limit"],data["triger"]),
|
||
|
||
#选择触发器
|
||
"select_triger":func(data):select_triger(data),
|
||
}
|
||
|
||
#随机触发器,接收的格式为
|
||
#[
|
||
# {
|
||
# "type":触发器类型,
|
||
# "weight":随机权重,
|
||
# "data":传入数据
|
||
# }....
|
||
#]
|
||
#意味着在编辑触发器中原本的触发器要写成
|
||
#{
|
||
# "type":"rand_triger",
|
||
# "data":[上面的内容]
|
||
func rand_triger(weight_arr:Array):
|
||
var sum_wight=weight_arr.reduce(sum_weight,0)
|
||
#迭代器
|
||
var weight_ind:float=0
|
||
var final_res:Dictionary
|
||
var rand=randf_range(0,sum_wight)
|
||
|
||
for i in weight_arr:
|
||
weight_ind+=i["weight"]
|
||
if weight_ind>=rand:
|
||
final_res=i
|
||
break
|
||
call_triger(final_res["type"],final_res["data"])
|
||
|
||
#权重迭代器
|
||
static func sum_weight(acc:float,new:Dictionary):
|
||
return acc+new["weight"]
|
||
|
||
#条件选择触发器,根据条件触发器结果来决定执行不同的触发器
|
||
func select_triger(data:Dictionary):
|
||
var condition:Array=data["condition_triger"]
|
||
var success_triger:Array=data["success_triger"]
|
||
var fail_triger:Array=data["fail_triger"]
|
||
var res:bool=true
|
||
for i in condition:
|
||
print("开始进行选择检定")
|
||
res=res and call_condition_triger(i["type"],i["data"])
|
||
print("检定结果:"+str(res))
|
||
if res:
|
||
for i in success_triger:
|
||
call_triger(i["type"],i["data"])
|
||
else:
|
||
for i in fail_triger:
|
||
call_triger(i["type"],i["data"])
|
||
|
||
|
||
#使用事件触发器
|
||
func call_triger(triger_type:String,data):
|
||
print(triger_type)
|
||
if triger.has(triger_type):
|
||
return triger[triger_type].call(data)
|
||
else:
|
||
return null
|
||
|
||
#人类特质触发器
|
||
func human_triger():
|
||
var character_data:Dictionary=now_game_data["character_data"]
|
||
var basic_attribute_dic:Dictionary=character_data["basic_attribute"]
|
||
var size=basic_attribute_dic.size()
|
||
var rand:int=randi_range(0,size-1)
|
||
var key:String=basic_attribute_dic.keys()[rand]
|
||
basic_attribute_dic[key]+=1
|
||
pass
|
||
|
||
#角色数据处理触发器(用于特殊特质,返回处理后的临时角色数据)
|
||
func character_process(data:Dictionary):
|
||
var type=data["type"]
|
||
var from_data:Dictionary
|
||
#确定处理的数据来源(处理时要手动塞进data里),如果缺省默认作为主角
|
||
if data.has("from_data"):
|
||
from_data=data["from_data"].duolicate(true)
|
||
else:
|
||
from_data=get_now_character_data()
|
||
match type:
|
||
#对基础属性的修改(数值增减)
|
||
"attribute_change":
|
||
var attribute_name:String=data["attribute_name"]
|
||
if from_data.has("attribute") and from_data["attribute"].has(attribute_name):
|
||
#基础增减
|
||
if data.has("change_normal"):
|
||
from_data["attribute"][attribute_name]+=from_data["change_normal"]
|
||
if data.has("change_percent"):
|
||
from_data["attribute"][attribute_name]*=(1+from_data["change_percent"])
|
||
|
||
return from_data
|
||
|
||
#条件触发器(用于返回是否的条件判定结果)
|
||
var condition_triger:Dictionary={
|
||
"date_limit":func (data:Dictionary):return TimeTool.is_in_date(data,get_time_dictionary()),
|
||
"time_limit":func (data:Dictionary):return TimeTool.is_in_time(data,get_time_dictionary()),
|
||
"rand":func (data:Dictionary):return get_rand(data["scene_id"],data["touch_id"],data["index"],data["condition"]),
|
||
"currency_more_than": func (data:Dictionary) :return get_currency_game(data["ind"])>=data["value"],
|
||
#返回任务是否存在
|
||
"is_mission_started":func(data:Dictionary):return data["name"] in get_mission_started(),
|
||
"is_missionm_failed":func(data:Dictionary):return data["name"] in get_mission_finished(),
|
||
"is_mission_success":func(data:Dictionary):return data["name"] in get_mission_failed(),
|
||
|
||
|
||
#判断flag是否为指定的值
|
||
"is_flag_equal":func(data:Dictionary):return get_flag(data["flag_name"])==data["value"],
|
||
|
||
|
||
#场景探索度大于
|
||
"is_scene_explore_more_than":func(data:Dictionary):return get_scene_explore(data["scene_id"])>data["value"],
|
||
#场景探索度小于
|
||
"is_scene_explore_less_than":func(data:Dictionary):return get_scene_explore(data["scene_id"])<data["value"],
|
||
|
||
#flag标志显示
|
||
"is_flag_more_than":func(data:Dictionary):return get_flag(data["flag_name"])>data["value"],
|
||
"is_flag_less_than":func(data:Dictionary):return get_flag(data["flag_name"])<data["value"],
|
||
|
||
}
|
||
#使用条件触发器
|
||
func call_condition_triger(triger_type:String,data):
|
||
print(triger_type+":"+str(data))
|
||
if condition_triger.has(triger_type):
|
||
var res= condition_triger[triger_type].call(data)
|
||
print(res)
|
||
return res
|
||
else:
|
||
print(false)
|
||
return false
|
||
|
||
|
||
#获取已经开始的任务列表
|
||
func get_mission_started()->Array:
|
||
if not now_game_data.has("mission"):
|
||
now_game_data["mission"]=[[],[],[]]
|
||
return now_game_data["mission"][0]
|
||
#获取已经完成的任务列表
|
||
func get_mission_finished()->Array:
|
||
if not now_game_data.has("mission"):
|
||
now_game_data["mission"]=[[],[],[]]
|
||
return now_game_data["mission"][1]
|
||
#获取已经失败的任务列表
|
||
func get_mission_failed()->Array:
|
||
if not now_game_data.has("mission"):
|
||
now_game_data["mission"]=[[],[],[]]
|
||
return now_game_data["mission"][2]
|
||
|
||
#将任务添加到任务列表
|
||
func add_mission_started(i:String):
|
||
if not i in get_mission_started():
|
||
get_mission_started().append(i)
|
||
if i in get_mission_failed():
|
||
get_mission_failed().pop_at(get_mission_failed().find(i))
|
||
if i in get_mission_started():
|
||
get_mission_started().pop_at(get_mission_started().find(i))
|
||
|
||
|
||
#记录随机的场景上一次结果,如果时间不变则直接取上一次结果
|
||
#记录在游戏存档内,保证加载数据不改变
|
||
func get_rand(scene_id:String,touch_name:String,index:String,condition:float)->bool:
|
||
if now_game_data["condition_triger_randi_dic"].has(scene_id):
|
||
var scene_data=now_game_data["condition_triger_randi_dic"][scene_id]
|
||
if scene_data.has(touch_name):
|
||
var touch_data=scene_data[touch_name]
|
||
if touch_data.has(index):
|
||
var triger_data=touch_data[index]
|
||
var last_time_triger=triger_data["last_time_triger"]
|
||
if last_time_triger==get_time_unix():
|
||
return triger_data["last_rand_result"]
|
||
else:
|
||
var dic=recreate_rand_dic(condition)
|
||
now_game_data["condition_triger_randi_dic"][scene_id][touch_name][index]=dic
|
||
return dic["last_rand_result"]
|
||
pass
|
||
else:
|
||
var dic=recreate_rand_dic(condition)
|
||
now_game_data["condition_triger_randi_dic"][scene_id][touch_name][index]=dic
|
||
return dic["last_rand_result"]
|
||
else:
|
||
var dic=recreate_rand_dic(condition)
|
||
now_game_data["condition_triger_randi_dic"][scene_id][touch_name]={
|
||
index:dic
|
||
}
|
||
return dic["last_rand_result"]
|
||
pass
|
||
else:
|
||
var dic=recreate_rand_dic(condition)
|
||
now_game_data["condition_triger_randi_dic"][scene_id]={
|
||
touch_name:{
|
||
index:dic
|
||
}
|
||
}
|
||
return dic["last_rand_result"]
|
||
#显示鉴定界面(用于触发器)
|
||
func show_identification(data:Dictionary):
|
||
if now_game_flow!=null:
|
||
var success_triger=[]
|
||
var fail_triger=[]
|
||
if data.has("success_triger"):
|
||
success_triger=data["success_triger"]
|
||
if data.has("fail_triger"):
|
||
fail_triger=data["fail_triger"]
|
||
now_game_flow.show_identification(data["id"],success_triger,fail_triger)
|
||
pass
|
||
#为随机创建一个新的随机字典
|
||
func recreate_rand_dic(condition:float)->Dictionary:
|
||
var new_rand_result:bool=(randf()<condition)
|
||
var dic={
|
||
"last_time_triger":get_time_unix(),
|
||
"last_rand_result":new_rand_result,
|
||
}
|
||
return dic
|
||
func show_auction(data:Dictionary):
|
||
if now_game_flow!=null:
|
||
now_game_flow.show_auction(data["npc"],data["item"])
|
||
|
||
pass
|
||
|
||
#多次鉴定时每回合使用的处理函数(对字典处理),返回bool类型,表示本轮是否成功
|
||
var identfication_round_triger_dic:Dictionary={
|
||
"fish_round": fish_round,
|
||
|
||
"explore_round":explore_round,
|
||
}
|
||
func call_round_triger(triger_type:String,character_data:Dictionary,round_dic:Dictionary,choice:String):
|
||
if identfication_round_triger_dic.has(triger_type):
|
||
return identfication_round_triger_dic[triger_type].call(character_data,round_dic,choice)
|
||
else:
|
||
return null
|
||
func fish_round(character_data:Dictionary,round_dic:Dictionary,choice:String)->bool:
|
||
print(choice)
|
||
var res:bool=randf()>0.5
|
||
if res:
|
||
round_dic["left_cost"]-=1
|
||
round_dic["right_total"]+=1
|
||
round_dic["introduction"]="你钓到了一条鱼"
|
||
else:
|
||
round_dic["left_total"]+=1
|
||
round_dic["introduction"]="你钓到了一条鱼,但是跑了"
|
||
round_dic["right_cost"]-=1
|
||
return res
|
||
|
||
pass
|
||
#用来获取鉴定每轮显示的难易度
|
||
var indetification_difficulty_get_triger:Dictionary={
|
||
"fish":fish_get_difficulty
|
||
}
|
||
func call_difficulty_triger(triger_type:String,character_data:Dictionary,round_dic:Dictionary):
|
||
if indetification_difficulty_get_triger.has(triger_type):
|
||
return indetification_difficulty_get_triger[triger_type].call(character_data,round_dic)
|
||
else:
|
||
return null
|
||
func fish_get_difficulty(character_data:Dictionary,round_dic:Dictionary):
|
||
|
||
|
||
pass
|
||
#用来判断鉴定是否结束的函数
|
||
var identification_is_finish_triger:Dictionary={
|
||
"normal":normal_is_finish,
|
||
"explore_is_finish":explore_is_finish,
|
||
}
|
||
func call_is_finish_triger(triger_type:String,character_data:Dictionary,round_dic:Dictionary):
|
||
if identification_is_finish_triger.has(triger_type):
|
||
return identification_is_finish_triger[triger_type].call(character_data,round_dic)
|
||
else:
|
||
return null
|
||
func normal_is_finish(character_data:Dictionary,round_dic:Dictionary)->bool:
|
||
if round_dic["left_cost"]==0 ||round_dic["left_total"]==round_dic["left_total_max"] || round_dic["right_cost"]==0:
|
||
return true
|
||
else:
|
||
return false
|
||
|
||
#鉴定结束触发的函数(用于获得奖励一类的)
|
||
var identification_finish_triger:Dictionary={
|
||
"fish":fish_finish,
|
||
"explore_finish":explore_finish,
|
||
}
|
||
func call_finish_triger(triger_type:String,character_data:Dictionary,round_dic:Dictionary):
|
||
if identification_finish_triger.has(triger_type):
|
||
return identification_finish_triger[triger_type].call(character_data,round_dic)
|
||
else:
|
||
return null
|
||
func fish_finish(character_data:Dictionary,round_data:Dictionary):
|
||
|
||
|
||
pass
|
||
#移动场景,前者是scene的ID,后者是距离当前场景的距离
|
||
func move_scene(scene_id:String,distance):
|
||
if scene_id==get_now_scene():
|
||
return false
|
||
flow_time({
|
||
"minute":distance/get_move_ability()
|
||
})
|
||
now_game_flow.change_scene(scene_id,distance)
|
||
set_now_scene(scene_id)
|
||
return true
|
||
pass
|
||
#获取当前场景ID
|
||
func get_now_scene():
|
||
return now_game_data["now_scene"]
|
||
#设置当前场景,只用于开局重置位置
|
||
func set_now_scene(scene_id:String):
|
||
now_game_data["now_scene"]=scene_id
|
||
#当前的游戏流程场景
|
||
var now_game_flow:GameFlow
|
||
#获取当前角色数据的拷贝
|
||
func get_now_character_data():
|
||
return now_game_data["character_data"].duplicate()
|
||
#设置当前角色(游戏内)
|
||
func set_now_character(id:String):
|
||
now_game_data["character_data"]=Database.get_character_data(id)
|
||
#设置当前时间和剧本结束时间,用于局内初始化
|
||
func set_now_time(time_dic:Dictionary,finish_time_dic:Dictionary):
|
||
now_game_data["time_unix"]=Time.get_unix_time_from_datetime_dict(time_dic)
|
||
now_game_data["finish_unix"]=Time.get_unix_time_from_datetime_dict(finish_time_dic)
|
||
#当前剧本是否完结
|
||
func is_script_finish()->bool:
|
||
return now_game_data["time_unix"]>=now_game_data["finish_unix"]
|
||
|
||
func _ready() -> void:
|
||
|
||
load_config()
|
||
load_system_game_data()
|
||
load_save_data()
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#探索鉴定
|
||
|
||
|
||
|
||
func explore_round(character_data:Dictionary,round_dic:Dictionary,choice:String)->bool:
|
||
if choice=="退出探索":
|
||
round_dic["is_finish"]=true
|
||
return false
|
||
flow_time({
|
||
"minute":5
|
||
})
|
||
Toast.popup(choice)
|
||
#Toast.popup("角色鉴定属性名:"+single_judge_name)
|
||
#获取感知属性
|
||
var attribute_value=CharacterTool.get_character_attribute(character_data,"WIS")
|
||
#Toast.popup("角色值:"+str(attribute_value))
|
||
if attribute_value is float:
|
||
|
||
var percent=(attribute_value-50)/50
|
||
var rand=randf()
|
||
#Toast.popup("鉴定概率:"+str(percent*100)+"%")
|
||
if rand<percent:
|
||
round_dic["right_total"]+=1
|
||
Toast.popup("鉴定成功!")
|
||
return true
|
||
else:
|
||
round_dic["right_cost"]-=1
|
||
Toast.popup("鉴定失败!")
|
||
return false
|
||
else:
|
||
#Toast.popup("不存在对应的属性!")
|
||
Toast.popup("角色不存在属性,鉴定失败!")
|
||
round_dic["right_cost"]-=1
|
||
return false
|
||
#探索鉴定中判定是否结束的函数
|
||
func explore_is_finish(character_data:Dictionary,round_dic:Dictionary):
|
||
if round_dic["right_cost"]==0 ||round_dic.has("is_finish") && round_dic["is_finish下 "]:
|
||
return true
|
||
else:
|
||
return false
|
||
#探索鉴定结束后的结算
|
||
func explore_finish(character_data:Dictionary,round_data:Dictionary):
|
||
var now_scene=get_now_scene()
|
||
Toast.popup(Database.get_scene_name(now_scene)+"探索度增加"+str(round_data["right_total"])+"!")
|
||
change_scene_explore(now_scene,round_data["right_total"])
|
||
pass
|
||
|
||
|
||
|
||
|
||
|
||
|
||
var now_2d_fight_scene:Fight2D
|