challenge-editor/autoload/global/script/global.gd
2024-12-12 19:09:32 +08:00

1041 lines
31 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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