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 indbool: 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 =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"], "is_flag_less_than":func(data:Dictionary):return get_flag(data["flag_name"])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()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