//---------------------------------------------------------------------------- /*! * @brief リンクシステム:リンクユニットの+値ボーナス * @param[in] int (nPlusValue) プラス値 * @param[in] int (nBonusType) ボーナスタイプ * @return int (nResult) [+加算値] * @note HPとATKの+値ボーナス ※引数でまとめて受け取った方がいいかも */ //---------------------------------------------------------------------------- static public int GetLinkUnitBonusPlus(int nPlusValue, CharaUtil.VALUE nBonusType) { int nResult = 0; //-------------------------------- // ボーナス値の種類による分岐 //-------------------------------- switch (nBonusType) { case CharaUtil.VALUE.POW: nResult = nPlusValue * GlobalDefine.PLUS_LINK_RATE_POW; break; case CharaUtil.VALUE.HP: nResult = nPlusValue * GlobalDefine.PLUS_LINK_RATE_HP; break; } return(nResult); }
// public const int VALUE_POW = 0; //!< キャラステータス値:攻撃 // public const int VALUE_DEF = 1; //!< キャラステータス値:防御 // public const int VALUE_HP = 2; //!< キャラステータス値:体力 // public const int VALUE_EXP = 3; //!< キャラステータス値:レベルアップに必要な経験値 // public const int VALUE_EXP_PARTS = 4; //!< キャラステータス値:素材になる時の経験値 // public const int VALUE_SALE = 5; //!< キャラステータス値:売却価格 // public const int VALUE_CRT = 6; //!< キャラステータス値:クリティカル威力 // public const int VALUE_BST_PANEL = 7; //!< キャラステータス値:ブーストパネル威力 /*==========================================================================*/ /* var */ /*==========================================================================*/ /*==========================================================================*/ /* func */ /*==========================================================================*/ //---------------------------------------------------------------------------- /*! * @brief ステータス値取得 */ //---------------------------------------------------------------------------- static public int GetStatusValue(MasterDataParamChara cMaster, int nLevel, CharaUtil.VALUE nValueType) { //-------------------------------- // 要素のmax,minを求める //-------------------------------- int nValueMin = 0; int nValueMax = 0; MasterDataDefineLabel.CurveType nCurveType = MasterDataDefineLabel.CurveType.BALANCE_A; bool bServerCal = false; switch (nValueType) { case CharaUtil.VALUE.POW: nValueMin = cMaster.base_attack_min; nValueMax = cMaster.base_attack_max; nCurveType = cMaster.base_attack_curve; bServerCal = false; break; case CharaUtil.VALUE.DEF: nValueMin = cMaster.base_defense_min; nValueMax = cMaster.base_defense_max; nCurveType = cMaster.base_defense_curve; bServerCal = false; break; case CharaUtil.VALUE.HP: nValueMin = cMaster.base_hp_min; nValueMax = cMaster.base_hp_max; nCurveType = cMaster.base_hp_curve; bServerCal = false; break; case CharaUtil.VALUE.EXP: nValueMin = 0; nValueMax = cMaster.exp_total; nCurveType = cMaster.exp_total_curve; bServerCal = true; break; case CharaUtil.VALUE.EXP_PARTS: nValueMin = cMaster.blend_exp_min; nValueMax = cMaster.blend_exp_max; nCurveType = cMaster.blend_exp_curve; bServerCal = true; break; case CharaUtil.VALUE.SALE: nValueMin = cMaster.sales_min; nValueMax = cMaster.sales_max; nCurveType = cMaster.sales_curve; bServerCal = true; break; default: Debug.LogError("Status Type NG!!"); return(1); } //-------------------------------- // レベルの最低最大が一致する場合は // 補間計算をせずに最低値を返す //-------------------------------- if (nValueMin == nValueMax) { return(nValueMin); } //-------------------------------- // 既に最大レベルなら最大値を返す //-------------------------------- if (nLevel >= cMaster.level_max) { return(nValueMax); } //-------------------------------- // 要素のレベル達成割合を求める //-------------------------------- /* * float fLevelRate = 1.0f; * if( nLevel < cMaster.level_min ) * { * Debug.LogError( "Level Range NG!!" ); * fLevelRate = 0.0f; * } * else * if( cMaster.level_max > cMaster.level_min ) * { * fLevelRate = 1.0f - ( (float)( cMaster.level_max - nLevel ) / (float)( cMaster.level_max - cMaster.level_min ) ); * } */ //-------------------------------- // 成長曲線タイプでべき乗係数を変化 //-------------------------------- //float fPowerRate = 1.0f; //switch( nCurveType ) //{ // case MasterDataDefineLabel.CURVE_NONE: fPowerRate = 1.0f; break; // 補間タイプ: - // case MasterDataDefineLabel.CURVE_1_A: fPowerRate = 1.0f; break; // 補間タイプ:バランス:A // case MasterDataDefineLabel.CURVE_1_B: fPowerRate = 1.0f; break; // 補間タイプ:バランス:B // case MasterDataDefineLabel.CURVE_1_C: fPowerRate = 2.5f; break; // 補間タイプ:バランス:C // case MasterDataDefineLabel.CURVE_2_A: fPowerRate = 0.7f; break; // 補間タイプ:早熟:A // case MasterDataDefineLabel.CURVE_2_B: fPowerRate = 0.7f; break; // 補間タイプ:早熟:B // case MasterDataDefineLabel.CURVE_2_C: fPowerRate = 0.7f; break; // 補間タイプ:早熟:C // case MasterDataDefineLabel.CURVE_3_A: fPowerRate = 1.5f; break; // 補間タイプ:大器晩成:A // case MasterDataDefineLabel.CURVE_3_B: fPowerRate = 1.5f; break; // 補間タイプ:大器晩成:B // case MasterDataDefineLabel.CURVE_3_C: fPowerRate = 1.5f; break; // 補間タイプ:大器晩成:C // default: Debug.LogError( "CurveType Error! - " + nCurveType ); break; // 補間タイプ:__ //} //-------------------------------- // 補間で数値算出 //-------------------------------- int nTotalLevelMax = cMaster.level_max - cMaster.level_min; int nTotalLevelNow = nLevel - cMaster.level_min; int nResult = 0; //-------------------------------- // サーバでも計算している項目は、 // サーバ数値を正として同じになるように計算する // @change Developer 2016/06/15 v342:計算誤差修正 //-------------------------------- if (bServerCal == true) { #region ==== サーバでも計算する項目 ==== //-------------------------------- // double用の成長曲線タイプを取得 // 上記で成長曲線タイプを取得した変数を(double)キャストしても計算が狂う //-------------------------------- double dPowerRate = 1.0; switch (nCurveType) { case MasterDataDefineLabel.CurveType.NONE: dPowerRate = 1.0; break; // 補間タイプ: - case MasterDataDefineLabel.CurveType.BALANCE_A: dPowerRate = 1.0; break; // 補間タイプ:バランス:A case MasterDataDefineLabel.CurveType.BALANCE_B: dPowerRate = 1.0; break; // 補間タイプ:バランス:B case MasterDataDefineLabel.CurveType.BALANCE_C: dPowerRate = 2.5; break; // 補間タイプ:バランス:C case MasterDataDefineLabel.CurveType.PRECOCITY_A: dPowerRate = 0.7; break; // 補間タイプ:早熟:A case MasterDataDefineLabel.CurveType.PRECOCITY_B: dPowerRate = 0.7; break; // 補間タイプ:早熟:B case MasterDataDefineLabel.CurveType.PRECOCITY_C: dPowerRate = 0.7; break; // 補間タイプ:早熟:C case MasterDataDefineLabel.CurveType.LATE_DEVELOPMENT_A: dPowerRate = 1.5; break; // 補間タイプ:大器晩成:A case MasterDataDefineLabel.CurveType.LATE_DEVELOPMENT_B: dPowerRate = 1.5; break; // 補間タイプ:大器晩成:B case MasterDataDefineLabel.CurveType.LATE_DEVELOPMENT_C: dPowerRate = 1.5; break; // 補間タイプ:大器晩成:C default: Debug.LogError("CurveType Error! - " + nCurveType); break; // 補間タイプ:__ } nResult = (int)(nValueMin + (nValueMax - nValueMin) * Math.Exp(Math.Log((double)nTotalLevelNow / (double)nTotalLevelMax) * dPowerRate)); #endregion } else { #region ==== クライアントのみ計算する項目 ==== //-------------------------------- // 成長曲線タイプでべき乗係数を変化 //-------------------------------- float fPowerRate = 1.0f; switch (nCurveType) { case MasterDataDefineLabel.CurveType.NONE: fPowerRate = 1.0f; break; // 補間タイプ: - case MasterDataDefineLabel.CurveType.BALANCE_A: fPowerRate = 1.0f; break; // 補間タイプ:バランス:A case MasterDataDefineLabel.CurveType.BALANCE_B: fPowerRate = 1.0f; break; // 補間タイプ:バランス:B case MasterDataDefineLabel.CurveType.BALANCE_C: fPowerRate = 2.5f; break; // 補間タイプ:バランス:C case MasterDataDefineLabel.CurveType.PRECOCITY_A: fPowerRate = 0.7f; break; // 補間タイプ:早熟:A case MasterDataDefineLabel.CurveType.PRECOCITY_B: fPowerRate = 0.7f; break; // 補間タイプ:早熟:B case MasterDataDefineLabel.CurveType.PRECOCITY_C: fPowerRate = 0.7f; break; // 補間タイプ:早熟:C case MasterDataDefineLabel.CurveType.LATE_DEVELOPMENT_A: fPowerRate = 1.5f; break; // 補間タイプ:大器晩成:A case MasterDataDefineLabel.CurveType.LATE_DEVELOPMENT_B: fPowerRate = 1.5f; break; // 補間タイプ:大器晩成:B case MasterDataDefineLabel.CurveType.LATE_DEVELOPMENT_C: fPowerRate = 1.5f; break; // 補間タイプ:大器晩成:C default: Debug.LogError("CurveType Error! - " + nCurveType); break; // 補間タイプ:__ } nResult = (int)(nValueMin + (nValueMax - nValueMin) * Mathf.Pow((float)nTotalLevelNow / (float)nTotalLevelMax, fPowerRate)); #endregion } return(nResult); // return (int)(nValueMin + ( nValueMax - nValueMin ) * Mathf.Pow( (float)nTotalLevelNow / (float)nTotalLevelMax , fPowerRate )); // return (int)(nValueMin + ( nValueMax - nValueMin ) * Mathf.Pow( (float)( nLevel - 1 ) / (float)( cMaster.level_max - 1 ) , fPowerRate )); }
//---------------------------------------------------------------------------- /*! * @brief リンクシステム:種族ボーナス:キャラマスター指定 * @param[in] MasterDataParamChara (cCharaMaster) リンクユニット:キャラマスター * @param[in] int (nBonusRace) ボーナス種族 * @param[in] int (nBonusType) ボーナスタイプ * @return float (fResult) [+%値] * @note 種族・レア度毎のボーナス値を取得 ※引数でまとめて受け取った方がいいかも */ //---------------------------------------------------------------------------- static public float GetLinkUnitBonusRace(MasterDataParamChara cCharaMaster, MasterDataDefineLabel.KindType nBonusRace, CharaUtil.VALUE nBonusType) { MasterDataLinkSystem[] acLinkMaster = MasterFinder <MasterDataLinkSystem> .Instance.GetAll(); float fResult = 0.0f; //-------------------------------- // エラーチェック //-------------------------------- if (acLinkMaster == null || cCharaMaster == null) { Debug.LogError("MasterDataLinkSystem or MasterDataParamChara Is None!"); return(fResult); } // ボーナス種族が設定されていない場合 if (nBonusRace <= MasterDataDefineLabel.KindType.NONE || nBonusRace >= MasterDataDefineLabel.KindType.MAX) { return(fResult); } //-------------------------------- // 副種族持ちかチェック //-------------------------------- MasterDataDefineLabel.KindType[] anCharaKind = new MasterDataDefineLabel.KindType[2] { cCharaMaster.kind, cCharaMaster.sub_kind }; int nStartNum = 0; int nEndNum = 0; // 副種族が設定されていない場合 if (anCharaKind[1] <= MasterDataDefineLabel.KindType.NONE || anCharaKind[1] >= MasterDataDefineLabel.KindType.MAX) { nStartNum = LINK_BONUS_KIND; nEndNum = LINK_BONUS_KIND_SUB; } else { nStartNum = LINK_BONUS_KIND_SUB; nEndNum = acLinkMaster.Length; } //-------------------------------- // ボーナス定義の確定 //-------------------------------- int nLinkIdx = 0; for (int num = nStartNum; num < nEndNum; ++num) { // ボーナス定義の種族とレア度が、リンクユニットと等しい場合 if (acLinkMaster[num].kind == nBonusRace && acLinkMaster[num].rare == cCharaMaster.rare) { nLinkIdx = num; break; } } //-------------------------------- // ボーナス値の種類による分岐 // ※HPは実値のため、そのまま取得する //-------------------------------- switch (nBonusType) { case CharaUtil.VALUE.POW: fResult = InGameUtilBattle.GetDBRevisionValue((float)acLinkMaster[nLinkIdx].atk); break; case CharaUtil.VALUE.HP: fResult = (float)acLinkMaster[nLinkIdx].hp; break; case CharaUtil.VALUE.CRT: fResult = InGameUtilBattle.GetDBRevisionValue((float)acLinkMaster[nLinkIdx].crt); break; case CharaUtil.VALUE.BST_PANEL: fResult = InGameUtilBattle.GetDBRevisionValue((float)acLinkMaster[nLinkIdx].bst); break; } return(fResult); }
//---------------------------------------------------------------------------- /*! * @brief リンクシステム:種族ボーナス:キャラID指定 * @param[in] uint (unLinkUnitID) リンクユニット:キャラID * @param[in] int (nBonusRace) ボーナス種族 * @param[in] int (nBonusType) ボーナスタイプ * @return float (fResult) [+%値] * @note 種族・レア度毎のボーナス値を取得 ※引数でまとめて受け取った方がいいかも * この関数自体使わないかも(現在未使用) 2015/09/14 ver300 */ //---------------------------------------------------------------------------- static public float GetLinkUnitBonusRace(uint unLinkUnitID, MasterDataDefineLabel.KindType nBonusRace, CharaUtil.VALUE nBonusType) { float fResult = 0.0f; // キャラマスターを取得 MasterDataParamChara cCharaMaster = BattleParam.m_MasterDataCache.useCharaParam(unLinkUnitID); if (cCharaMaster == null) { return(fResult); } // 種族ボーナス fResult = GetLinkUnitBonusRace(cCharaMaster, nBonusRace, nBonusType); return(fResult); }
//---------------------------------------------------------------------------- /*! * @brief リンクシステム:属性ボーナス:キャラマスター指定 * @param[in] MasterDataParamChara (cCharaMaster) キャラマスター * @param[in] int (nLevel) ユニットレベル * @param[in] int (nLoLevel) 限界突破レベル * @param[in] int (nBonusType) ボーナスタイプ * @return int (nResult) [+加算値] * @note HPとATKのボーナス値 ※引数でまとめて受け取った方がいいかも */ //---------------------------------------------------------------------------- static public int GetLinkUnitBonusElement(MasterDataParamChara cCharaMaster, int nLevel, uint nLoLevel, CharaUtil.VALUE nBonusType) { MasterDataLinkSystem[] acLinkMaster = MasterFinder <MasterDataLinkSystem> .Instance.GetAll(); int nResult = 0; //-------------------------------- // エラーチェック //-------------------------------- if (acLinkMaster == null || cCharaMaster == null) { Debug.LogError("MasterDataLinkSystem or MasterDataParamChara Is None!"); return(nResult); } int nLimitOverCost = (int)CharaLimitOver.GetParam(nLoLevel, cCharaMaster.limit_over_type, (int)CharaLimitOver.EGET.ePARAM_COST); //-------------------------------- // 基礎値 //-------------------------------- float fBaseValue = 1.0f; float fCostValue = InGameUtilBattle.AvoidErrorMultiple((float)cCharaMaster.party_cost + nLimitOverCost, RATE_COST); float fRareValue = ((int)cCharaMaster.rare + 1) * ((int)cCharaMaster.rare + 1); fBaseValue += fCostValue + fRareValue; //-------------------------------- // 属性値 //-------------------------------- int nLinkNum = 0; float fElemValue = 0.0f; // ボーナス定義の確定 for (int num = 0; num < LINK_BONUS_KIND; ++num) { // ボーナス定義の属性と、リンクユニットの属性が等しい場合 if (acLinkMaster[num].elem == cCharaMaster.element) { nLinkNum = num; break; } } // ボーナス値の種類による分岐 switch (nBonusType) { case CharaUtil.VALUE.POW: fElemValue = InGameUtilBattle.GetDBRevisionValue((float)acLinkMaster[nLinkNum].atk); break; case CharaUtil.VALUE.HP: fElemValue = InGameUtilBattle.GetDBRevisionValue((float)acLinkMaster[nLinkNum].hp); break; } //-------------------------------- // レベル補正 //-------------------------------- float fLevelCorrection = 1.0f; float fLevelValue = InGameUtilBattle.AvoidErrorMultiple((float)nLevel, RATE_LEVEL); fLevelCorrection += fLevelValue; //-------------------------------- // 最終結果:属性ボーナス値(基礎値 × 属性値 × Lv補正)※端数切捨て //-------------------------------- float fWork = 0.0f; fWork = InGameUtilBattle.AvoidErrorMultiple(fBaseValue, fElemValue); fWork = InGameUtilBattle.AvoidErrorMultiple(fWork, fLevelCorrection); nResult = (int)fWork; return(nResult); }
//---------------------------------------------------------------------------- /*! * @brief リンクシステム:属性ボーナス:キャラID指定 * @param[in] uint (unLinkUnitID) リンクユニット:キャラID * @param[in] int (nLevel) ユニットレベル * @param[in] int (nLoLevel) 限界突破レベル * @param[in] int (nBonusType) ボーナスタイプ * @return int (nResult) [+加算値] * @note HPとATKのボーナス値 ※引数でまとめて受け取った方がいいかも */ //---------------------------------------------------------------------------- static public int GetLinkUnitBonusElement(uint unLinkUnitID, int nLevel, uint nLoLevel, CharaUtil.VALUE nBonusType) { int nResult = 0; // キャラマスターを取得 MasterDataParamChara cCharaMaster = BattleParam.m_MasterDataCache.useCharaParam(unLinkUnitID); if (cCharaMaster == null) { return(nResult); } // 属性ボーナス nResult = GetLinkUnitBonusElement(cCharaMaster, nLevel, nLoLevel, nBonusType); return(nResult); }