﻿
--全局变量设置
configEquipSlotCount = 4;
ID_RES_MONEY = "金钱";
ID_RES_WOOD = "木材";
ID_RES_IRON = "铁石";
ID_RES_JADE = "玉石";

--最大编组数量
CONFIG_MAX_GROUP_COUNT = 6;

--主角ID
ID_PLAYER_ID = "主角";
ID_FIGHT_SKILLPAGE = "搏击";

--技能页控件参数
SKILLPAGE_COL_MAX = 4;
SKILLPAGE_ROW_MAX = 7;

SKILLPAGE_SLOT_WIDTH = 73;
SKILLPAGE_SLOT_HEIGHT = 90;

--UI属性面板比例参考值
--最大生命
REF_VAL_MaxHp = 15000;
--最大气力
REF_VAL_MaxMp = 15000;
--力量
REF_VAL_Str = 300;
--敏捷
REF_VAL_Agi = 300;
--精神
REF_VAL_Spr = 300;
--耐力
REF_VAL_Stm = 300;

--物理攻击
REF_VAL_PhyAtk = 900;
--巫术攻击
REF_VAL_MagAtk = 900;
--物理防御
REF_VAL_PhyDef = 75;
--巫术防御
REF_VAL_MagDef = 75;

--生命回复
REF_VAL_HpRes = 150;
--气力回复
REF_VAL_MpRes = 150;

local GameCoreHelper = CS.GameCoreHelper;

local GetGameString = CS.GameTools.getGameString;

function GetLanString(srcInfo)
    return srcInfo;
end

--将字符串拆分成表
function SplitStr(szFullString, szSeparator)
    local nFindStartIndex = 1
    local nSplitIndex = 1
    local nSplitArray = {}
    while true do
       local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
       if not nFindLastIndex then
        nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
        break
       end
       nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
       nFindStartIndex = nFindLastIndex + string.len(szSeparator)
       nSplitIndex = nSplitIndex + 1
    end
    return nSplitArray
end

--从目标List中抽取一个随机元素
function GetRandomListItem(_tagList, _listCount)
	if _listCount > 0 then
		local rndIndex = CS.GameCoreHelper.GetRandomInt(0, _listCount);
		return _tagList[rndIndex];
	else
		return nil;
	end
end

--显示背包界面
function ShowInventoryWindow(_invWindowCallback)
	CS.GUIHelper.ShowInventoryUI(_invWindowCallback);
end

--根据目标控件创建标准资源数量表控件
function CreateStandardResBox(_tagCom, _isPlayer)
	local regInfo = CS.GameTools.getGameString("ResBoxRegInfo_Style1")
	return CS.GUIHelper.CreateResNumsBox(_tagCom, regInfo, _isPlayer)
end

function CreateStandardResBoxByList(_tagList, _isPlayer)
	local regInfo = CS.GameTools.getGameString("ResBoxRegInfo_Style1")
	return CS.GUIHelper.CreateResNumsBoxByList(_tagList, regInfo, _isPlayer)
end

function CreateMerchantResBox(_tagCom)
	local regInfo = CS.GameTools.getGameString("ResBoxRegInfo_Style1")
	return CS.GUIHelper.CreateResNumsBox(_tagCom, regInfo, false)
end

--获取角色当前所有的关系羁绊信息
function GetRoleBindsInfo(_tagRole)
	local bindsInfo = "[+]:";
	local tagRoleID;
	for i=0,_tagRole.FriendsList.Count-1 do
		tagRoleID = _tagRole.FriendsList[i];
		if i > 0 then
			bindsInfo = bindsInfo .. ",";
		end
		bindsInfo = bindsInfo .. tagRoleID .. "(" .. CS.GameCoreHelper.GetRoleRelationVal(_tagRole.roleID, tagRoleID) .. ")";
	end
	bindsInfo = bindsInfo .. "\n[-]:";
	for i=0,_tagRole.EnemiesList.Count-1 do
		tagRoleID = _tagRole.EnemiesList[i];
		if i > 0 then
			bindsInfo = bindsInfo .. ",";
		end
		bindsInfo = bindsInfo .. tagRoleID .. "(" .. CS.GameCoreHelper.GetRoleRelationVal(_tagRole.roleID, tagRoleID) .. ")";
	end
	return bindsInfo;
end

constrSpeedDescVal1 = GetGameString("lua_script_str_atkSpeed1");
constrSpeedDescVal2 = GetGameString("lua_script_str_atkSpeed2");
constrSpeedDescVal3 = GetGameString("lua_script_str_atkSpeed3");
constrSpeedDescVal4 = GetGameString("lua_script_str_atkSpeed4");
constrSpeedDescVal5 = GetGameString("lua_script_str_atkSpeed5");

function GetStatValDescMoveSpeed(_val)
	if _val >= 300 then
		return constrSpeedDescVal1;
	elseif _val >= 200 then
		return constrSpeedDescVal2;
	elseif _val >= 100 then
		return constrSpeedDescVal3;
	elseif _val >= 0 then
		return constrSpeedDescVal4;
	else
		return constrSpeedDescVal5;
	end
end

function GetStatValDescAtkSpeed(_val)
	if _val <= 0.5 then
		return constrSpeedDescVal1;
	elseif _val <= 0.7 then
		return constrSpeedDescVal2;
	elseif _val <= 0.9 then
		return constrSpeedDescVal3;
	elseif _val <= 1.1 then
		return constrSpeedDescVal4;
	else
		return constrSpeedDescVal5;
	end
end

constrAtkRangeDescVal1 = GetGameString("lua_script_str_113");
constrAtkRangeDescVal2 = GetGameString("lua_script_str_114");
constrAtkRangeDescVal3 = GetGameString("lua_script_str_115");
function GetStatValDescAtkRange(_val)
	if _val < 400 then
		return constrAtkRangeDescVal1;
	elseif _val < 800 then
		return constrAtkRangeDescVal2;
	else
		return constrAtkRangeDescVal3;
	end
end

constrMagicTalentDescVal1 = GetGameString("lua_script_str_magicTalent1");
constrMagicTalentDescVal2 = GetGameString("lua_script_str_magicTalent2");
constrMagicTalentDescVal3 = GetGameString("lua_script_str_magicTalent3");
constrMagicTalentDescVal4 = GetGameString("lua_script_str_magicTalent4");

function GetStatValMagicTalentDesc(_val)
	if _val >= 3 then
		return constrMagicTalentDescVal1;
	elseif _val >= 2 then
		return constrMagicTalentDescVal2;
	elseif _val >= 1 then
		return constrMagicTalentDescVal3;
	else
		return constrMagicTalentDescVal4;
	end
end

--------------------------------------------难度控制-----------------------------------------

function AddInitCmdsByHardLevel(curHardlevel)
	if curHardlevel == 2 then
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_ai_level#2");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_roll_limit#3");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_hunger_penalty#1");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_card_consumable_mode#1");
		--AI士兵经验增加倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_ai_soldier_addExp_perPeriod#1.5");
		--NPC每日自动升级概率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*npc_daily_auto_lvup_prop#0.4");
		--AI出征偏好参数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_invade_prob_fix#1");
		--AI收入倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_income_rate#1.5");
		--卡牌损耗概率倍数(低损耗基础概率为0.2)
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_soldier_dead_prob_scale#1.5");
		--玩家卡牌升级资源消耗倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_upgrade_cost_ratio#1.25");
		--AI士兵自动升级系数，值越低实际概率越高
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_soldier_auto_lv_up_propfade#0.03");
		--ai开始资源作弊的起始天
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_cheat_start_time#30");
		--ai开始资源作弊的上限天
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_cheat_max_time#200");
		--AI招募士兵时的资源倍率系数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiRecruitResourceRatio#0.7");
		--AI升级士兵时的资源倍率系数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiUpgradeResourceScaleRatio#0.7");
		--玩家在AI阵营时给予一个轻微作弊收入惩罚
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*player_in_aiCamp_resource_decrease_rate#0.7");
		--AI招募上限系数，驻军+隶属于本城的野外军队总和超过城市容量多少倍就不会再招募
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiRecruitMaxMult#5");
		--AI新兵增加缺省经验的开始天数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_startTime#60");
		--AI新兵增加缺省经验的概率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_prop#0.35");
		--AI新兵增加缺省经验的倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_ratio#0.3");
		--AI势力升级T6单位最小周期天数
		CS.GameTools.AddGameInitCmds("SETINTVAR*ai_t6_upgrade_limit_period#28");
		--AI势力升级T6单位周期内限制数量
		CS.GameTools.AddGameInitCmds("SETINTVAR*ai_t6_upgrade_limit_num#1");
		--玩家持有T6单位的最大数量
		CS.GameTools.AddGameInitCmds("SETINTVAR*player_t6_upgrade_limit_num#2");
		--玩家自身减伤百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_own_avoid_pct#50");
		--玩家军队减伤百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_army_avoid_pct#33");
		--玩家获得资源增加百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_res_add_pct#20");
		--玩家与NPC好感度降低豁免百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_rlchg_exempt_pct#15");
	elseif curHardlevel == 1 then
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_ai_level#1");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_roll_limit#5");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_hunger_penalty#1");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_card_consumable_mode#1");
		--AI士兵经验增加倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_ai_soldier_addExp_perPeriod#0.5");
		--NPC每日自动升级概率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*npc_daily_auto_lvup_prop#0.4");
		--AI出征偏好参数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_invade_prob_fix#0.65");
		--AI收入倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_income_rate#0.5");
		--卡牌损耗概率倍数(高损耗基础概率为0.5，低损耗基础概率为0.2)
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_soldier_dead_prob_scale#1");
		--玩家卡牌升级资源消耗倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_upgrade_cost_ratio#1");
		--AI士兵自动升级系数，值越低实际概率越高
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_soldier_auto_lv_up_propfade#0.04");
		--ai开始资源作弊的起始天
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_cheat_start_time#60");
		--ai开始资源作弊的上限天
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_cheat_max_time#100");
		--AI招募士兵时的资源倍率系数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiRecruitResourceRatio#1");
		--AI升级士兵时的资源倍率系数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiUpgradeResourceScaleRatio#1");
		--玩家在AI阵营时给予一个轻微作弊收入惩罚
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*player_in_aiCamp_resource_decrease_rate#1");
		--AI招募上限系数，驻军+隶属于本城的野外军队总和超过城市容量多少倍就不会再招募
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiRecruitMaxMult#3");
		--AI新兵增加缺省经验的开始天数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_startTime#90");
		--AI新兵增加缺省经验的概率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_prop#0.15");
		--AI新兵增加缺省经验的倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_ratio#0.15");
		--AI势力升级T6单位最小周期天数
		CS.GameTools.AddGameInitCmds("SETINTVAR*ai_t6_upgrade_limit_period#14");
		--AI势力升级T6单位周期内限制数量
		CS.GameTools.AddGameInitCmds("SETINTVAR*ai_t6_upgrade_limit_num#1");
		--玩家持有T6单位的最大数量
		CS.GameTools.AddGameInitCmds("SETINTVAR*player_t6_upgrade_limit_num#2");
		--玩家自身减伤百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_own_avoid_pct#33");
		--玩家军队减伤百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_army_avoid_pct#0");
		--玩家获得资源增加百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_res_add_pct#10");
		--玩家与NPC好感度降低豁免百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_rlchg_exempt_pct#10");
	else
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_ai_level#0");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_roll_limit#0");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_hunger_penalty#0");
		CS.GameTools.AddGameInitCmds("SETINTVAR*config_card_consumable_mode#1");
		--AI士兵经验增加倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_ai_soldier_addExp_perPeriod#0");
		--NPC每日自动升级概率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*npc_daily_auto_lvup_prop#0.2");
		--AI出征偏好参数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_invade_prob_fix#0.3");
		--AI收入倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_income_rate#0");
		--卡牌损耗概率倍数(高损耗基础概率为0.5，低损耗基础概率为0.2)
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_soldier_dead_prob_scale#1");
		--玩家卡牌升级资源消耗倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*cur_upgrade_cost_ratio#1");
		--AI士兵自动升级系数，值越低实际概率越高
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_soldier_auto_lv_up_propfade#0.043");
		--ai开始资源作弊的起始天(普通难度不作弊)
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_cheat_start_time#0");
		--ai开始资源作弊的上限天(普通难度不作弊)
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_cheat_max_time#0");
		--AI招募士兵时的资源倍率系数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiRecruitResourceRatio#1");
		--AI升级士兵时的资源倍率系数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiUpgradeResourceScaleRatio#1");
		--玩家在AI阵营时给予一个轻微作弊收入惩罚
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*player_in_aiCamp_resource_decrease_rate#1");
		--AI招募上限系数，驻军+隶属于本城的野外军队总和超过城市容量多少倍就不会再招募
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*aiRecruitMaxMult#3");
		--AI新兵增加缺省经验的开始天数
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_startTime#0");
		--AI新兵增加缺省经验的概率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_prop#0");
		--AI新兵增加缺省经验的倍率
		CS.GameTools.AddGameInitCmds("SETFLOATVAR*ai_new_recruit_add_exp_ratio#0");
		--AI势力升级T6单位最小周期天数
		CS.GameTools.AddGameInitCmds("SETINTVAR*ai_t6_upgrade_limit_period#14");
		--AI势力升级T6单位周期内限制数量
		CS.GameTools.AddGameInitCmds("SETINTVAR*ai_t6_upgrade_limit_num#2");
		--玩家持有T6单位的最大数量
		CS.GameTools.AddGameInitCmds("SETINTVAR*player_t6_upgrade_limit_num#2");
		--玩家自身减伤百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_own_avoid_pct#0");
		--玩家军队减伤百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_army_avoid_pct#0");
		--玩家获得资源增加百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_res_add_pct#0");
		--玩家与NPC好感度降低豁免百分比
		--CS.GameTools.AddGameInitCmds("SETINTVAR*player_rlchg_exempt_pct#0");
	end
end

function CallAddInitCmdsByCurHardLevel(_rtArgs, _args)
	local curHardlevel = CS.GameConfig.cur_ai_level;
	AddInitCmdsByHardLevel(curHardlevel);
end

--------------------------------------------单位类型相关-----------------------------------------
AllAttackTypesInfo = nil;
AllAttackTypesInfoSorted = nil;

AllArmorTypesInfo = nil;
AllArmorTypesInfoSorted = nil;

AllUnitClassTypesInfo = nil;
AllUnitClassTypesSorted = nil;

function GetAllAttackTypes()
	if AllAttackTypesInfo == nil then
		AllAttackTypesInfo = {};
		AllAttackTypesInfo[0] = {GetGameString("attack_type_0"), "ui://zuvkwb6nhfkdn4"};
		AllAttackTypesInfo[1] = {GetGameString("attack_type_1"), "ui://zuvkwb6nhfkdn5"};
		AllAttackTypesInfo[2] = {GetGameString("attack_type_2"), "ui://zuvkwb6nhfkdn6"};
		AllAttackTypesInfo[3] = {GetGameString("attack_type_3"), "ui://zuvkwb6nhfkdn7"};
		AllAttackTypesInfo[4] = {GetGameString("attack_type_4"), "ui://zuvkwb6nhfkdn8"};
		AllAttackTypesInfo[5] = {GetGameString("attack_type_5"), "ui://zuvkwb6nhfkdn9"};
		AllAttackTypesInfo[900] = {GetGameString("attack_type_900"), "ui://zuvkwb6nhfkdna"};

		AllAttackTypesInfoSorted = {};
		for k, v in pairs(AllAttackTypesInfo) do
			local sortItem = {};
			sortItem.key = k;
			sortItem.val = v;
			sortItem.sortIndex = k;
			table.insert(AllAttackTypesInfoSorted, sortItem);
		end
		table.sort(AllAttackTypesInfoSorted, function(a, b)
			return a.sortIndex < b.sortIndex;
		end);
	end
	return AllAttackTypesInfoSorted;
end

GetAllAttackTypes();

function GetAttackTypeName(_type)
	local tagInfo = AllAttackTypesInfo[_type];
	if tagInfo ~= nil then
		return tagInfo[1];
	end
	return "";
end

function GetAttackTypeIcon(_type)
	local tagInfo = AllAttackTypesInfo[_type];
	if tagInfo ~= nil then
		return tagInfo[2];
	end
	return "";
end



function GetAllArmorTypes()
	if AllArmorTypesInfo == nil then
		AllArmorTypesInfo = {};
		AllArmorTypesInfo[0] = {GetGameString("armor_type_0"), "ui://zuvkwb6nhfkdog"};
		AllArmorTypesInfo[1] = {GetGameString("armor_type_1"), "ui://zuvkwb6nhfkdoh"};
		AllArmorTypesInfo[2] = {GetGameString("armor_type_2"), "ui://zuvkwb6nhfkdoi"};
		AllArmorTypesInfo[3] = {GetGameString("armor_type_3"), "ui://zuvkwb6nhfkdoj"};
		AllArmorTypesInfo[4] = {GetGameString("armor_type_4"), "ui://zuvkwb6nhfkdok"};
		AllArmorTypesInfo[9] = {GetGameString("armor_type_9"), "ui://zuvkwb6nhfkdol"};

		AllArmorTypesInfoSorted = {};
		for k, v in pairs(AllArmorTypesInfo) do
			local sortItem = {};
			sortItem.key = k;
			sortItem.val = v;
			sortItem.sortIndex = k;
			table.insert(AllArmorTypesInfoSorted, sortItem);
		end
		table.sort(AllArmorTypesInfoSorted, function(a, b)
			return a.sortIndex < b.sortIndex;
		end);
	end
	return AllArmorTypesInfoSorted;
end

GetAllArmorTypes();

function GetArmorTypeName(_type)
	local tagInfo = AllArmorTypesInfo[_type];
	if tagInfo ~= nil then
		return tagInfo[1];
	end
	return "";
end

function GetArmorTypeIcon(_type)
	local tagInfo = AllArmorTypesInfo[_type];
	if tagInfo ~= nil then
		return tagInfo[2];
	end
	return "";
end

function GetAllUnitClassTypes()
	if AllUnitClassTypesInfo == nil then
		AllUnitClassTypesInfo = {};
		AllUnitClassTypesInfo["近战"] = {GetGameString("unitclass_type_0"), "ui://zuvkwb6nhfkdnb", 1};
		AllUnitClassTypesInfo["远程"] = {GetGameString("unitclass_type_1"), "ui://zuvkwb6nhfkdnc", 2};
		AllUnitClassTypesInfo["骑乘"] = {GetGameString("unitclass_type_2"), "ui://zuvkwb6nhfkdnd", 3};
		AllUnitClassTypesInfo["特种"] = {GetGameString("unitclass_type_3"), "ui://zuvkwb6nhfkdne", 4};
		AllUnitClassTypesInfo["巫师"] = {GetGameString("unitclass_type_4"), "ui://zuvkwb6nhfkdnf", 5};
		AllUnitClassTypesInfo["野兽"] = {GetGameString("unitclass_type_5"), "ui://zuvkwb6nhfkdng", 6};
		AllUnitClassTypesInfo["怪物"] = {GetGameString("unitclass_type_6"), "ui://zuvkwb6nhfkdnh", 7};
		AllUnitClassTypesInfo["魔法造物"] = {GetGameString("unitclass_type_7"), "ui://zuvkwb6nhfkdni", 8};

		AllUnitClassTypesSorted = {};
		for k, v in pairs(AllUnitClassTypesInfo) do
			local sortItem = {};
			sortItem.key = k;
			sortItem.val = v;
			sortItem.sortIndex = v[3];
			table.insert(AllUnitClassTypesSorted, sortItem);
		end
		table.sort(AllUnitClassTypesSorted, function(a, b)
			return a.sortIndex < b.sortIndex;
		end);
	end
	return AllUnitClassTypesSorted;
end

GetAllUnitClassTypes();

function GetUnitClassName(_type)
	local tagInfo = AllUnitClassTypesInfo[_type];
	if tagInfo ~= nil then
		return tagInfo[1];
	end
	return "";
end

function GetUnitClassIcon(_type)
	local tagInfo = AllUnitClassTypesInfo[_type];
	if tagInfo ~= nil then
		return tagInfo[2];
	end
	return "";
end

function GetSoldierSlotBgImgUrl(tagSoldierCard)
	local typeCode = 0;
	if tagSoldierCard ~= nil then
		typeCode = tagSoldierCard:GetCardQuality();
	end
	if typeCode <= 1 then
		return "ui://zuvkwb6nhfkdnz";
	elseif typeCode == 2 then
		return "ui://zuvkwb6nhfkdo0";
	elseif typeCode == 3 then
		return "ui://zuvkwb6nhfkdo1";
	elseif typeCode == 4 then
		return "ui://zuvkwb6nhfkdo2";
	elseif typeCode == 5 then
		return "ui://zuvkwb6nhfkdo3";
	else
		return "ui://zuvkwb6nhfkdo4";
	end
end

function GetSoldierWideSlotBgImgUrl(tagSoldierCard)
	local typeCode = 0;
	if tagSoldierCard ~= nil then
		typeCode = tagSoldierCard:GetCardQuality();
	end
	if typeCode <= 1 then
		return "ui://zuvkwb6nbqfj9xu";
	elseif typeCode == 2 then
		return "ui://zuvkwb6nbqfj9xv";
	elseif typeCode == 3 then
		return "ui://zuvkwb6nbqfj9xw";
	elseif typeCode == 4 then
		return "ui://zuvkwb6nbqfj9xx";
	elseif typeCode == 5 then
		return "ui://zuvkwb6nbqfj9xy";
	else
		return "ui://zuvkwb6nbqfj9xz";
	end
end

constrArmyTypeName1 = GetGameString("lua_script_str_116");
constrArmyTypeName2 = GetGameString("lua_script_str_117");
constrArmyTypeName3 = GetGameString("lua_script_str_118");
function GetCampArmyTypeName(_armyType)
	if _armyType == 1 then
		return constrArmyTypeName1;
	elseif _armyType == 2 then
		return constrArmyTypeName2;
	elseif _armyType == 3 then
		return constrArmyTypeName3;
	else
		return "";
	end
end

-------------------------------------------兵种宝石相关操作--------------------------------------

constrGemColorTypeName1 = GetGameString("lua_script_str_119");
constrGemColorTypeName2 = GetGameString("lua_script_str_120");
constrGemColorTypeName3 = GetGameString("lua_script_str_121");
constrGemColorTypeNameRnd = GetGameString("lua_script_str_122");
function GetOpColorName(_colorType)
	if _colorType == 1 then
		return constrGemColorTypeName1;
	elseif _colorType == 2 then
		return constrGemColorTypeName2;
	elseif _colorType == 3 then
		return constrGemColorTypeName3;
	else
		return constrGemColorTypeNameRnd;
	end
end

function AddCardGemSlot(tagCard, curOpColorType)
	local oldSlotCount = tagCard:GetGemSlotsCount();
	--执行添加宝石孔操作
	if oldSlotCount >= CONFIG_CARD_SLOTS_COUNT then
		local msgInfo = GetGameString("lua_script_str_123");
		ShowToastInfo(msgInfo, 2.5);
		return false;
	end
	tagCard:ChangeGemSlotCount(1, curOpColorType, true, true);
	local newSlotCount = tagCard:GetGemSlotsCount();
	local deltaCount = newSlotCount - oldSlotCount;
	if deltaCount > 0 then
		--播报消息
		local msgInfo = GameCoreHelper.StringFormat(GetGameString("lua_script_str_124"),
						tagCard:GetDisplayName(), deltaCount, GetOpColorName(curOpColorType));
		ShowToastInfo(msgInfo, 2.5);
	end
	return true;
end

function ChangeCardGemSlotColor(tagCard, curOpColorType)
	local oldSlotCount = tagCard:GetGemSlotsCount();
	--执行改卡色操作
	if oldSlotCount <= 0 then
		local msgInfo = GetGameString("lua_script_str_125");
		ShowToastInfo(msgInfo, 2.5);
		return false;
	end
	local tagSlotColor;
	tagCard:RemoveAllGems(true, true);
	for index=0,oldSlotCount-1 do
		tagSlotColor = curOpColorType;
		if tagSlotColor <= 0 then
			tagSlotColor = tagCard:GetRandomGemSlotColorType();
		end
		tagCard:SetGemSlotColorType(index, tagSlotColor);
	end
	--播报消息
	local msgInfo = GameCoreHelper.StringFormat(GetGameString("lua_script_str_126"),
						tagCard:GetDisplayName(), GetOpColorName(curOpColorType));
	ShowToastInfo(msgInfo, 2.5);
	return true;
end

-------------------------------------------搏击技能相关功能--------------------------------------
--当前技能点数
FightActionBarMaxCount = 5;

function IsTavernFightEnable()
	return GameCoreHelper.GetIntVar("TAVERN_FIGHT_ON") >= 1;
end

function GetCurTavernFightRank()
	local _curExp = GetCurTavernFightExp();
	if _curExp <= GetTavernFightRankExp(2) then
		return 1;
	elseif _curExp <= GetTavernFightRankExp(3) then
		return 2;
	elseif _curExp <= GetTavernFightRankExp(4) then
		return 3;
	elseif _curExp <= GetTavernFightRankExp(5) then
		return 4;
	else
		return 5;
	end
end

function GetCurTavernFightExp()
	return GameCoreHelper.GetIntVar("FIGHT_EXP");
end

function GetTavernFightRankTitle(_rank)
	if _rank == 1 then
		return GetGameString("lua_script_str_270");
	elseif _rank == 2 then
		return GetGameString("lua_script_str_271");
	elseif _rank == 3 then
		return GetGameString("lua_script_str_272");
	elseif _rank == 4 then
		return GetGameString("lua_script_str_273");
	else
		return GetGameString("lua_script_str_274");
	end
end

function GetTavernFightRankExp(_rank)
	if _rank == 1 then
		return 0;
	elseif _rank == 2 then
		return 10;
	elseif _rank == 3 then
		return 30;
	elseif _rank == 4 then
		return 60;
	elseif _rank == 5 then
		return 90;
	else
		return -1;
	end
end

function GetFightSkillType(_typeID)
	if _typeID == "搏击普攻" then
		return 1;
	elseif _typeID == "搏击终结技" then
		return 2;
	else
		return 0;
	end
end

function GetFightSkillTypeName(_typeID)
	if _typeID == "搏击普攻" then
		return GetGameString("lua_script_str_127");
	elseif _typeID == "搏击终结技" then
		return GetGameString("lua_script_str_128");
	else
		return GetGameString("lua_script_str_129");
	end
end

function GetSavedFightSpListStr()
	local _savedFightSp = CS.GameCoreHelper.GetStrVar("all_fight_skill_pts");
	return _savedFightSp;
end

function SetFightSkillsByStr(fightSpList, _skillsInfo, _isLearnNew)
	local fightActionBarList = nil;
	if _isLearnNew then
		fightActionBarList = GetFightActionBarSlots();
	end
	if not IsEmptyOrNil(_skillsInfo) and fightSpList ~= nil then
		local splitSpList = SplitStr(_skillsInfo, "|");
		local nSubIndex = 0;
		local szSeparator = ","
		local keyVal;
		local infoVal;
		local oldLevel;
		local skillLevel = 1;
		for k, strLine in pairs(splitSpList) do
			if not IsEmptyOrNil(strLine) then
				nSubIndex = string.find(strLine, szSeparator, 0);
				skillLevel = 1;
				if nSubIndex > 0 then
					keyVal = string.sub(strLine, 1, nSubIndex - 1);
					infoVal = string.sub(strLine, nSubIndex + 1, -1);
					skillLevel = tonumber(infoVal);
				else
					keyVal = strLine;
				end
				oldLevel = fightSpList[keyVal];
				if oldLevel == nil then
					oldLevel = 0;
				end
				fightSpList[keyVal] = skillLevel;
				if _isLearnNew then
					if skillLevel > 0 and oldLevel <= 0 then
						--学习新技能时
						TrySetQuickSlotForFightSkill(fightActionBarList, keyVal);
					end
				end
			end
		end
	end
end

function GetSavedFightSpList()
	local fightSpList = {};

	local allSpInfo = GetSavedFightSpListStr();
	SetFightSkillsByStr(fightSpList, allSpInfo, false);

	return fightSpList;
end

function SaveFightSpList(fightSpList)
	local saveInfo = "";
	if fightSpList ~= nil then
		local nCount = 0;
		for k, v in pairs(fightSpList) do
			if nCount > 0 then
				saveInfo = saveInfo .. "|";
			end
            saveInfo = saveInfo .. k .. "," .. v;
			nCount = nCount + 1;
        end
	end
	GameCoreHelper.SetStrVar("all_fight_skill_pts", saveInfo);
end

--学习搏击技能指令接口
function LearnFightSkills(contextArgVal, _args)
	local fightSpList = GetSavedFightSpList();
	if not IsEmptyOrNil(_args) then
		SetFightSkillsByStr(fightSpList, _args, true);
		SaveFightSpList(fightSpList);
	end
end

function GetFightActionBarSlots()
	local fightActionBarList = {};

	local allSpInfo = GameCoreHelper.GetStrVar("all_fight_actionbar");
	if not IsEmptyOrNil(allSpInfo) then
		local splitSpList = SplitStr(allSpInfo, "|");
		local nSubIndex = 0;
		local szSeparator = ","
		local keyVal;
		local infoVal;
		local slotIndex = -1;
		for k, strLine in pairs(splitSpList) do
			if not IsEmptyOrNil(strLine) then
				nSubIndex = string.find(strLine, szSeparator, 0);
				slotIndex = -1;
				if nSubIndex > 0 then
					keyVal = string.sub(strLine, 1, nSubIndex - 1);
					infoVal = string.sub(strLine, nSubIndex + 1, -1);
					slotIndex = tonumber(keyVal);
				end
				if slotIndex >= 0 then
					fightActionBarList[slotIndex] = infoVal;
				end
			end
		end
	end

	return fightActionBarList;
end

function SetFightActionBarSlot(fightActionBarList, _slotIndex, _skillID)
	if fightActionBarList == nil then
		fightActionBarList = GetFightActionBarSlots();
	end
	if not IsEmptyOrNil(_skillID) then
		for k, v in pairs(fightActionBarList) do
			if v == _skillID then
				fightActionBarList[k] = nil;
			end
		end
	end
	fightActionBarList[_slotIndex] = _skillID;
	SaveFightActionBarSlots(fightActionBarList);

	GameCoreHelper.SendSceneUIMessage("skills_changed", nil);
end

function SaveFightActionBarSlots(fightActionBarList)
	local saveInfo = "";
	if fightActionBarList ~= nil then
		local nCount = 0;
		for k, v in pairs(fightActionBarList) do
			if nCount > 0 then
				saveInfo = saveInfo .. "|";
			end
            saveInfo = saveInfo .. k .. "," .. v;
			nCount = nCount + 1;
        end
	end
	GameCoreHelper.SetStrVar("all_fight_actionbar", saveInfo);
end

function GetFightActionBarInfoStr()
	local fightActionBarList = GetFightActionBarSlots();
	local saveInfo = "";
	local tagID = nil;
	if fightActionBarList ~= nil then
		local nCount = 0;
		for index=0, FightActionBarMaxCount-1 do
			if nCount > 0 then
				saveInfo = saveInfo .. "|";
			end
			tagID = fightActionBarList[index];
			if not IsEmptyOrNil(tagID) then
				saveInfo = saveInfo .. "skill:" .. tagID;
			end
			nCount = nCount + 1;
        end
	end
	return saveInfo, fightActionBarList;
end

function IsFightSkillClassEnableForSlot(fightSkillType, _slotIndex)
	if fightSkillType == 1 then
		return _slotIndex == 0;
	elseif fightSkillType == 2 then
		return _slotIndex == 4;
	else
		return _slotIndex >= 1 and _slotIndex <= 3;
	end
end

--为搏击技能设置默认快捷键
function TrySetQuickSlotForFightSkill(fightActionBarList, _skillID)
	if fightActionBarList == nil then
		fightActionBarList = GetFightActionBarSlots();
	end
	local tagSkillInfo = GameCoreHelper.GetSkillInfo(_skillID);
	if tagSkillInfo == nil or tagSkillInfo.skill_type ~= 0 then
		return;
	end
	local strFightSkillTag = tagSkillInfo:GetTagValue("fight_skill_class");
	if not IsEmptyOrNil(strFightSkillTag) then
		local fightSkillType = GetFightSkillType(strFightSkillTag);
		local tagSlotID;
		for index=0, FightActionBarMaxCount-1 do
			tagSlotID = fightActionBarList[index];
			if IsFightSkillClassEnableForSlot(fightSkillType, index) and IsEmptyOrNil(tagSlotID) then
				SetFightActionBarSlot(fightActionBarList, index, _skillID);
				return;
			end
        end
	end
end

