/// <summary> /// 作業領域を確保 /// </summary> /// <param name="field_area_count"></param> private void _allocateWorkArea(int field_area_count) { for (int idx = 0; idx < m_WorkFormedSkills.Length; idx++) { m_ResultFormedSkills[idx] = new BattleSkillReq(); m_WorkFormedSkills[idx] = new BattleSkillReq(); } m_WorkActiveSkillMembers = new CharaOnce[BattleParam.m_PlayerParty.getPartyMemberMaxCount()]; m_WorkIsAliveActiveSkillMembers = new bool[BattleParam.m_PlayerParty.getPartyMemberMaxCount()]; m_WorkHandcardCostPerElement = new bool[(int)MasterDataDefineLabel.ElementType.MAX]; m_WorkGeneralFieldCostInfo = new int[field_area_count, (int)MasterDataDefineLabel.ElementType.MAX]; m_WorkMemberFieldCostInfo = new int[BattleParam.m_PlayerParty.getPartyMemberMaxCount()][, ]; for (int member_idx = 0; member_idx < m_WorkMemberFieldCostInfo.Length; member_idx++) { m_WorkMemberFieldCostInfo[member_idx] = new int[field_area_count, (int)MasterDataDefineLabel.ElementType.MAX]; } m_IsBoosts = new bool[field_area_count]; m_IsFulls = new bool[field_area_count]; m_FilterTypes = new SkillRequestParam.SkillFilterType[BattleParam.m_PlayerParty.getPartyMemberMaxCount()]; }
/// <summary> /// 常駐スキルの成立を判定 /// </summary> private void _checkAlwaysSkill() { //常駐スキル for (int skill_idx = 0; skill_idx < m_OrderedSkillList.Length; skill_idx++) { MasterDataSkillActive current_skill_active = m_OrderedSkillList[skill_idx]; if (current_skill_active.always == MasterDataDefineLabel.BoolType.ENABLE) { //復活スキル以外を判定 if (current_skill_active.getResurrectInfo() == null) { uint current_skill_id = current_skill_active.fix_id; int[] current_skill_cost = current_skill_active.GetCostPerElement(); _checkActiveSkillFormingConditionSub(m_WorkGeneralFieldCostInfo, current_skill_cost, m_WorkHandcardCostPerElement, GlobalDefine.PartyCharaIndex.GENERAL, current_skill_id); } } } // 常駐回復スキルと同条件で成立する常駐復活スキルを追加 int always_recov_skill_count = m_WorkFormedSkillsCount; for (int idx = 0; idx < always_recov_skill_count; idx++) { BattleSkillReq recov_skill_req = m_WorkFormedSkills[idx]; if (m_IsBoosts[recov_skill_req.m_SkillParamFieldNum] != false) { for (int skill_idx = 0; skill_idx < m_OrderedSkillList.Length; skill_idx++) { MasterDataSkillActive current_skill_active = m_OrderedSkillList[skill_idx]; if (current_skill_active.isAlwaysResurrectSkill()) { MasterDataSkillActive recov_skill = BattleParam.m_MasterDataCache.useSkillActive(recov_skill_req.m_SkillParamSkillID); if (current_skill_active.cost1 == recov_skill.cost1 && current_skill_active.cost2 == recov_skill.cost2 && current_skill_active.cost3 == recov_skill.cost3 && current_skill_active.cost4 == recov_skill.cost4 && current_skill_active.cost5 == recov_skill.cost5 ) { if (m_WorkFormedSkillsCount < m_WorkFormedSkills.Length) { BattleSkillReq resurr_skill_req = m_WorkFormedSkills[m_WorkFormedSkillsCount]; resurr_skill_req.m_SkillReqState = BattleSkillReq.State.REQUESTED; resurr_skill_req.m_SkillParamCharaNum = recov_skill_req.m_SkillParamCharaNum; resurr_skill_req.m_SkillParamFieldNum = recov_skill_req.m_SkillParamFieldNum; resurr_skill_req.m_SkillParamSkillID = current_skill_active.fix_id; m_WorkFormedSkillsCount++; } break; } } } } } }
private void _checkActiveSkillFormingConditionSub(int[,] field_cost_per_element, int[] skill_cost_per_element, bool[] handcard_cost_per_element, GlobalDefine.PartyCharaIndex chara_index, uint skill_id) { for (int field_idx = 0; field_idx < m_IsFulls.Length; field_idx++) { while (true) //ひとつのフィールドで同じスキルが複数回成立する可能性があるのでループ { // スキル発動条件成立チェック bool is_success = true; for (int element_idx = (int)MasterDataDefineLabel.ElementType.NONE + 1; element_idx < (int)MasterDataDefineLabel.ElementType.MAX; element_idx++) { if (field_cost_per_element[field_idx, element_idx] < skill_cost_per_element[element_idx]) { is_success = false; break; } } if (is_success) { // 発動条件成立したスキルを登録 if (m_WorkFormedSkillsCount < m_WorkFormedSkills.Length) { BattleSkillReq skill_req = m_WorkFormedSkills[m_WorkFormedSkillsCount]; skill_req.m_SkillReqState = BattleSkillReq.State.REQUESTED; skill_req.m_SkillParamCharaNum = chara_index; skill_req.m_SkillParamFieldNum = field_idx; skill_req.m_SkillParamSkillID = skill_id; m_WorkFormedSkillsCount++; } // 場のカード消費 for (int element_idx = (int)MasterDataDefineLabel.ElementType.NONE + 1; element_idx < (int)MasterDataDefineLabel.ElementType.MAX; element_idx++) { field_cost_per_element[field_idx, element_idx] -= skill_cost_per_element[element_idx]; } } else { // リーチチェック if (m_IsFulls[field_idx] == false) { bool is_reach_success = true; bool is_use_handcard = false; for (int element_idx = (int)MasterDataDefineLabel.ElementType.NONE + 1; element_idx < (int)MasterDataDefineLabel.ElementType.MAX; element_idx++) { if (handcard_cost_per_element[element_idx]) { if (field_cost_per_element[field_idx, element_idx] + 1 < skill_cost_per_element[element_idx]) { is_reach_success = false; break; } if (field_cost_per_element[field_idx, element_idx] + 1 == skill_cost_per_element[element_idx]) { if (is_use_handcard) { // 手札を2枚以上使わないと成立しない場合はリーチではない. is_reach_success = false; break; } is_use_handcard = true; } } else { if (field_cost_per_element[field_idx, element_idx] < skill_cost_per_element[element_idx]) { is_reach_success = false; break; } } } if (is_reach_success) { MasterDataDefineLabel.ElementType reach_element = MasterDataDefineLabel.ElementType.NONE; for (int element_idx = (int)MasterDataDefineLabel.ElementType.NONE + 1; element_idx < (int)MasterDataDefineLabel.ElementType.MAX; element_idx++) { if (field_cost_per_element[field_idx, element_idx] < skill_cost_per_element[element_idx]) { reach_element = (MasterDataDefineLabel.ElementType)element_idx; break; } } //################ addSkillReachInfo(field_idx, reach_element); m_WorkReachInfos[m_WorkReachInfosCount].m_FieldIndex = field_idx; m_WorkReachInfos[m_WorkReachInfosCount].m_Element = reach_element; m_WorkReachInfosCount++; } } break; } } } }
public int setSkillInfos(BattleSkillReq[] skill_infos, int skill_info_count) { int ret_val = -1; if (skill_infos == null || skill_info_count == 0) { for (int field_idx = 0; field_idx < m_FieldAreaCount; field_idx++) { for (int skill_idx = 0; skill_idx < m_SkillCountMax; skill_idx++) { m_SkillIDs[field_idx, skill_idx] = 0; m_SkillCasters[field_idx, skill_idx] = GlobalDefine.PartyCharaIndex.ERROR; } m_SkillCounts[field_idx] = 0; } m_ComboSoundIndex = 0; } else { // スキルの増減を調べる int appear_skill_count = 0; { bool[,] is_cheked = new bool[m_FieldAreaCount, m_SkillCountMax]; for (int req_idx = 0; req_idx < skill_info_count; req_idx++) { BattleSkillReq battle_skill_req = skill_infos[req_idx]; if (battle_skill_req != null && battle_skill_req.m_SkillReqState != BattleSkillReq.State.NONE && battle_skill_req.m_SkillParamSkillID != 0) { uint skill_id = battle_skill_req.m_SkillParamSkillID; int field_idx = battle_skill_req.m_SkillParamFieldNum; GlobalDefine.PartyCharaIndex caster_idx = battle_skill_req.m_SkillParamCharaNum; bool is_exsit = false; for (int idx = 0; idx < m_SkillCounts[field_idx]; idx++) { if (is_cheked[field_idx, idx] == false && m_SkillIDs[field_idx, idx] == skill_id && m_SkillCasters[field_idx, idx] == caster_idx ) { is_cheked[field_idx, idx] = true; is_exsit = true; break; } } if (is_exsit == false) { m_WorkAppearSkillInfos[appear_skill_count].m_SkillID = skill_id; m_WorkAppearSkillInfos[appear_skill_count].m_FieldIndex = field_idx; m_WorkAppearSkillInfos[appear_skill_count].m_Caster = caster_idx; appear_skill_count++; } } } } for (int field_idx = 0; field_idx < m_FieldAreaCount; field_idx++) { m_SkillCounts[field_idx] = 0; } skill_info_count = Mathf.Min(skill_info_count, skill_infos.Length); for (int idx = 0; idx < skill_info_count; idx++) { BattleSkillReq battle_skill_req = skill_infos[idx]; if (battle_skill_req != null && battle_skill_req.m_SkillReqState != BattleSkillReq.State.NONE && battle_skill_req.m_SkillParamSkillID != 0) { int field_idx = battle_skill_req.m_SkillParamFieldNum; int skill_idx = m_SkillCounts[field_idx]; if (skill_idx < m_SkillCountMax) { m_SkillIDs[field_idx, skill_idx] = battle_skill_req.m_SkillParamSkillID; m_SkillCasters[field_idx, skill_idx] = battle_skill_req.m_SkillParamCharaNum; m_SkillCounts[field_idx]++; } } } if (appear_skill_count > 0) { SEID seID; switch (m_ComboSoundIndex) { case 0: seID = SEID.SE_SKILL_COMBO_00; break; case 1: seID = SEID.SE_SKILL_COMBO_01; break; case 2: seID = SEID.SE_SKILL_COMBO_02; break; case 3: seID = SEID.SE_SKILL_COMBO_03; break; case 4: seID = SEID.SE_SKILL_COMBO_04; break; case 5: seID = SEID.SE_SKILL_COMBO_05; break; case 6: seID = SEID.SE_SKILL_COMBO_06; break; case 7: seID = SEID.SE_SKILL_COMBO_07; break; case 8: seID = SEID.SE_SKILL_COMBO_08; break; default: seID = SEID.SE_SKILL_COMBO_MORE_THAN_08; break; } SoundUtil.PlaySE(seID); m_ComboSoundIndex++; } if (appear_skill_count > 0) { clearNewSkillElementInfo(); for (int idx = 0; idx < appear_skill_count; idx++) { int field_idx = m_WorkAppearSkillInfos[idx].m_FieldIndex; GlobalDefine.PartyCharaIndex caster_idx = m_WorkAppearSkillInfos[idx].m_Caster; if (caster_idx == GlobalDefine.PartyCharaIndex.GENERAL) { caster_idx = BattleParam.m_PlayerParty.getGeneralPartyMember(); } if (m_NewSkillElements[field_idx, (int)caster_idx] == MasterDataDefineLabel.ElementType.NONE) { MasterDataSkillActive master_data_skill_active = BattleParam.m_MasterDataCache.useSkillActive(m_WorkAppearSkillInfos[idx].m_SkillID); if (master_data_skill_active != null) { m_NewSkillElements[field_idx, (int)caster_idx] = master_data_skill_active.skill_element; } } } ret_val = m_WorkAppearSkillInfos[0].m_FieldIndex; } } return(ret_val); }