/// <summary> /// StageDatabaseで呼んで、ステージごとのユニット設定を行う /// </summary> /// <param name="Lv"></param> /// <param name="coordinate">ステージで初期配置されている座標</param> /// <param name="weapon">装備武器</param> /// <param name="carryItem">持ち物</param> /// <param name="enemyAIPattern">行動パターン</param> public void StageInit(int lv, Coordinate coordinate, List <Item> carryItem, EnemyAIPattern enemyAIPattern) { this.lv = lv; this.coordinate = coordinate; this.carryItem = carryItem; this.enemyAIPattern = enemyAIPattern; //装備フラグがtrueの武器、アクセサリを装備 foreach (Item item in carryItem) { if (item.ItemType == ItemType.WEAPON && item.isEquip == true) { this.equipWeapon = item.weapon; } else if (item.ItemType == ItemType.ACCESSORY && item.isEquip == true) { this.equipAccessory = item.accessory; } } //敵キャラはレベルを渡すとレベルアップ分のステータスを反映してくれる GrowthDatabase growthDatabase = Resources.Load <GrowthDatabase>("growthDatabase"); //成長率取得 GrowthRate growthRate = growthDatabase.FindByName(name); int lvUp = lv - 1; //小数点以下切り捨て 成長率は整数で入っているので10で割ってやる this.maxhp += Mathf.FloorToInt(lvUp * growthRate.hpRate / 100); this.hp = maxhp; this.latk += Mathf.FloorToInt(lvUp * growthRate.latkRate / 100); this.catk += Mathf.FloorToInt(lvUp * growthRate.catkRate / 100); this.dex += Mathf.FloorToInt(lvUp * growthRate.dexRate / 100); this.agi += Mathf.FloorToInt(lvUp * growthRate.agiRate / 100); this.luk += Mathf.FloorToInt(lvUp * growthRate.lukRate / 100); this.ldef += Mathf.FloorToInt(lvUp * growthRate.ldefRate / 100); this.cdef += Mathf.FloorToInt(lvUp * growthRate.cdefRate / 100); }
//レベルアップするメソッド 直接Static型のUnitController.unitListを変更 public List <StatusType> lvup(string lvUpUnitName, int resultExp) { //上がった要素をstring型リストに詰めて返す var lvUpList = new List <StatusType>(); List <Unit> unitList = UnitController.unitList; List <Unit> newUnitList = new List <Unit>(); foreach (var unit in unitList) { //リストの中でレベルアップしたユニットが居れば if (unit.name == lvUpUnitName) { //データベースを名前で検索して成長率を取得 GrowthRate growthRate = growthDatabase.FindByName(lvUpUnitName); //職業成長率 GrowthRateDto growthRateDto = unit.job.growthRateDto; //ユニット成長率と職業成長率を合算 int hpRate = growthRate.hpRate + growthRateDto.jobHpRate; int latkRate = growthRate.latkRate + growthRateDto.jobLatkRate; int catkRate = growthRate.catkRate + growthRateDto.jobCatkRate; int agiRate = growthRate.agiRate + growthRateDto.jobAgiRate; int dexRate = growthRate.dexRate + growthRateDto.jobDexRate; int lukRate = growthRate.lukRate + growthRateDto.jobLukRate; int ldefRate = growthRate.ldefRate + growthRateDto.jobLdefRate; int cdefRate = growthRate.cdefRate + growthRateDto.jobCdefRate; //200719 同じステが2回上がるのを防止 bool hpUpped = false; bool latkUpped = false; bool catkUpped = false; bool agiUpped = false; bool dexUpped = false; bool lukUpped = false; bool ldefUpped = false; bool cdefUpped = false; //Lv unit.lv++; unit.exp = resultExp; //210225 LVのピンピン処理に追加 lvUpList.Add(StatusType.LV); //2ピン補正したか否か //2ピン補正:上がったステが2個以下ならHPからループしなおし bool isRetry = false; //レベルアップループ 2つ以上パラメータが成長した時点でbreak while (true) { //各成長判定 成長率以下の乱数なら+1 //HP //1~100の値を作成 float ran = Random.Range(1.0f, 100.0f); if (ran <= hpRate && !hpUpped) { unit.maxhp += 1; lvUpList.Add(StatusType.HP); hpUpped = true; //2ピン補正時の時は2つパラメータが成長した時点でループ終了 if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //遠距離攻撃 if (ran <= latkRate && !latkUpped) { unit.latk += 1; lvUpList.Add(StatusType.LATK); latkUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //近距離攻撃 if (ran <= catkRate && !catkUpped) { unit.catk += 1; lvUpList.Add(StatusType.CATK); catkUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //速さ if (ran <= agiRate && !agiUpped) { unit.agi += 1; lvUpList.Add(StatusType.AGI); agiUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //技 if (ran <= dexRate && !dexUpped) { unit.dex += 1; lvUpList.Add(StatusType.DEX); dexUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //運 if (ran <= lukRate && !lukUpped) { unit.luk += 1; lvUpList.Add(StatusType.LUK); lukUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //遠距離防御 if (ran <= ldefRate && !ldefUpped) { unit.ldef += 1; lvUpList.Add(StatusType.LDEF); ldefUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } ran = Random.Range(1.0f, 100.0f); //近距離防御 if (ran <= cdefRate && !cdefUpped) { unit.cdef += 1; lvUpList.Add(StatusType.CDEF); cdefUpped = true; if (lvUpList.Count > 2 && isRetry) { break; } } //2つ以上パラメータが成長していたらループ終了 if (lvUpList.Count > 2) { break; } //下まで来たら2ピン補正に入る isRetry = true; } newUnitList.Add(unit); } else { //レベルアップしたユニット以外はそのまま newUnitList.Add(unit); } } return(lvUpList); }
public void UpdateText(Unit unit) { this.name.text = unit.name; this.race.text = unit.race.GetStringValue(); this.image.sprite = Resources.Load <Sprite>("Image/Charactors/" + unit.pathName + "/status"); //アセットから成長率を取得 GrowthDatabase growthDatabase = Resources.Load <GrowthDatabase>("growthDatabase"); GrowthRate growthRate = growthDatabase.FindByName(unit.name); //HP hp.text = growthRate.hpRate.ToString(); hpGauge.maxValue = StatusConst.GROWTH_MAX; hpGauge.value = growthRate.hpRate; //遠距離攻撃 latk.text = growthRate.latkRate.ToString(); latkGauge.maxValue = StatusConst.GROWTH_MAX; latkGauge.value = growthRate.latkRate; //近距離攻撃 catk.text = growthRate.catkRate.ToString(); catkGauge.maxValue = StatusConst.GROWTH_MAX; catkGauge.value = growthRate.catkRate; //速さ agi.text = growthRate.agiRate.ToString(); agiGauge.maxValue = StatusConst.GROWTH_MAX; agiGauge.value = growthRate.agiRate; //技 dex.text = growthRate.dexRate.ToString(); dexGauge.maxValue = StatusConst.GROWTH_MAX; dexGauge.value = growthRate.dexRate; //幸運 luk.text = growthRate.lukRate.ToString(); lukGauge.maxValue = StatusConst.GROWTH_MAX; lukGauge.value = growthRate.lukRate; //遠距離防御 ldef.text = growthRate.ldefRate.ToString(); ldefGauge.maxValue = StatusConst.GROWTH_MAX; ldefGauge.value = growthRate.ldefRate; //近距離防御 cdef.text = growthRate.cdefRate.ToString(); cdefGauge.maxValue = StatusConst.GROWTH_MAX; cdefGauge.value = growthRate.cdefRate; if (unit.name == "霊夢") { this.detailText.text = "博麗神社の巫女さん。\n\n" + "2種類の武器と遠距離近距離攻撃、仲間の回復が出来、\n" + "多くの状況で有利に戦う事が出来ます。\n\n" + "また、武器や癒符の熟練度が上がりやすくなる\n" + "スキルを持っているので、\n" + "序盤から強力な符を装備する事が出来ます。\n\n" + "中級職で敵の防御スキルを無効化するスキルを習得します。\n\n" + "上級職では遠距離攻撃特化型と、近距離攻撃が得意で移動力が高い\n" + "バランス型を選ぶ事が出来ます。"; } else if (unit.name == "魔理沙") { this.detailText.text = "弾幕はパワー。\n\n" + "遠距離攻撃と素早さが上がりやすく、\n" + "経験値を多く獲得するスキルで成長も早いので、\n" + "攻撃の要となります。\n" + "また、鍵無しで宝箱を開ける事が出来ます。\n" + "防御力は高くないので、孤立させ過ぎないように注意しましょう。\n\n" + "中級職では武器の使用回数消費を抑えるスキルを習得します。\n\n" + "上級職では攻撃特化型と、回避率が高くアイテムの使用後に\n" + "行動が出来る防御型を選ぶ事が出来ます。"; } else if (unit.name == "ルーミア") { this.detailText.text = "遠距離、近距離防御力共に高く、ダメージを受けにくいです。\n" + "反面、素早さは低いので、攻撃力の高い敵から\n" + "追撃を受けないように注意が必要です。\n" + "上級職にクラスチェンジすると・・・"; } else if (unit.name == "大妖精") { this.detailText.text = "仲間の回復とステータスを上げる事が出来ます。\n" + "戦闘能力は低いので、攻撃を受けないように注意しましょう。\n\n" + "中級職になると、ターン開始時に\n" + "周囲の仲間の体力を少し回復する事が出来ます。\n\n" + "上級職になると仲間を再行動させる事が出来るようになり、\n" + "更に仲間のステータスを上げる事が出来るようになります。\n"; } else if (unit.name == "チルノ") { this.detailText.text = "戦闘能力は突出した所が無いですが、\n" + "貴重な遠距離と近距離の両方に\n" + "攻撃出来る武器を使用する事が出来ます。\n\n" + "中級職で隣接する敵の回避率を下げるスキルを習得します。\n\n" + "上級職では仲間のステータスを上げるスキルを習得する職か、\n" + "敵を移動出来なくするスキルを習得する職を選ぶ事が出来るので、\n" + "上手に使う事で戦局を有利に進める事が出来ます。"; } else if (unit.name == "文") { this.detailText.text = "序盤から加入して性能が高いですが、レベルが高い為、\n" + "文ばかり戦わせると他のキャラが成長しません。\n" + "序盤は戦闘させ過ぎないように注意が必要です。\n\n" + "鍵無しで宝箱を開ける事が出来るので宝箱の回収係や、\n" + "武器を外して壁として活躍させるのがお勧めです。\n\n" + "素早さが非常に高いですが、取材が目的で異変の解決には\n" + "関与する気が無い為、攻撃力は低いです。\n\n" + "所謂お助けキャラですが、成長率は高いので、\n" + "最後まで活躍する事が出来ます。\n" + "上級職では攻撃特化型と、回避率の高い\n" + "防御型を選ぶ事が出来ます。"; } else if (unit.name == "美鈴") { this.detailText.text = "近距離攻撃と防御に特化した性能で、\n" + "HPが高く壁として活躍する事が出来ます。\n\n" + "近距離攻撃の手段を持たない敵に対しては\n" + "一方的に高いダメージを与える事が出来ます。\n\n" + "反面、遠距離攻撃への防御力は低く、\n" + "運も低い為必殺を受けやすいので、\n" + "過信していると想像以上にダメージを受ける事が有ります。\n\n" + "中級職から仲間の体力を回復させる事が出来ます。\n\n" + "上級職では高い必殺率を持つ職業と、\n" + "仲間の防御力を上げる事が出来る職業を選ぶ事が出来ます。\n"; } else if (unit.name == "小悪魔") { this.detailText.text = "仲間の回復とステータスを上げる事が出来ます。\n" + "攻撃力もそこそこの性能で、敵にダメージを与えやすいです。\n" + "また、仲間を回復すると自分のHPも回復する事が出来ます。\n\n" + "運が低く、防御力も高くない為、\n" + "攻撃を受けないように注意しましょう。\n\n" + "中級職になると、周囲の仲間の攻撃力を上げる事が出来ます。\n" + "上級職になると仲間を再行動させる事が出来るようになり、\n" + "更に仲間のステータスを上げる事が出来るようになります。"; } else if (unit.name == "鈴仙") { this.detailText.text = "攻撃の命中率が高く、射程距離の長い武器で\n" + "敵を狙撃する事が出来ます。\n\n" + "運が非常に低く必殺を受けやすいので、\n" + "攻撃を受けないように注意が必要です。\n\n" + "上級職では薬で仲間の体力を回復させる事が出来るバランス型と、\n" + "攻撃特化型の傾向が大きく異なる2種類の職業を選ぶ事が出来ます。\n\n" + "趣味で登場させたけど、運用に難が有って可愛い。"; } else if (unit.name == "パチュリー") { this.detailText.text = "遠距離攻撃防御力、技が非常に高く、\n" + "最大8マス先の敵に遠距離攻撃出来る武器を使用する事が出来る為、\n" + "遠距離攻撃では圧倒的な性能を持っています。\n\n" + "反面、HP、近距離防御力は非常に低く、素早さも低めなので、\n" + "近距離攻撃を受けると一撃で倒されてしまう事も有ります。\n\n" + "専用武器は修理出来ますが非常に修理費が高額な為、\n" + "ここぞという時に使用しましょう。\n\n" + "中級職ではより攻撃力が上がり、\n" + "上級職では攻守共に強力なスキルを習得します。\n\n" + "装備出来る符の種類が多く、ショット、レーザーに加えて\n" + "上級職では物理、癒符のどちらかを装備する事が出来ます。\n"; } else if (unit.name == "咲夜") { this.detailText.text = "技、速さ、幸運が上がりやすく、\n" + "また、遠近両方に対して攻撃出来る専用武器を持っている為、\n" + "隙の無い活躍が出来ます。\n\n" + "バランス型の成長をするキャラのお約束で\n" + "運が悪いと器用貧乏になる事も有りますが、\n" + "その場合も仲間のサポートと鍵開けによる宝箱の回収で\n" + "いぶし銀の活躍が出来る、まさにパーフェクトメイド。\n\n" + "中級職では行動せずに待機すると\n" + "回避率が上がるスキルを習得します。\n\n" + "上級職では攻撃特化型の職業と、\n" + "仲間のサポートが出来る職業を選ぶ事が出来ます。\n"; } else if (unit.name == "レミリア") { this.detailText.text = "序盤から加入して性能が高いですが、レベルが高い為、\n" + "レミリアばかり戦わせると他のキャラが成長しません。\n" + "序盤は戦闘させ過ぎないように注意が必要です。\n\n" + "専用武器のグングニルは遠近両用で非常に高性能ですが、\n" + "修理費が高額な為、多用すると紅魔館の財政を圧迫してしまいます。\n\n" + "運命を操る程度の能力の為、非常に幸運の成長率が高く、\n" + "全体的なステータスの成長率も高い為、\n" + "終盤も活躍する事が出来ます。\n\n" + "上級職では戦闘後に敵の能力を下げるスキルを習得する職業と、\n" + "敵から受けるダメージを確率で半減させるスキルを習得する\n" + "職業を選ぶ事が出来ます。\n"; } else if (unit.name == "フランドール") { this.detailText.text = "非常に攻撃寄りのステータスにクリティカル率が高い専用武器、\n" + "必殺率を上げる専用スキルを持っており、\n" + "攻撃が命中すれば多くの敵を一撃で倒す事が出来ます。\n\n" + "反面、技が低い為攻撃の命中が安定しないので、\n" + "運用に運の要素が強いです。\n\n" + "また防御力は低いので、シリーズ恒例の\n" + "「やっつけ負け」に注意する必要が有ります。\n\n" + "ゲーム終盤に上級職で加入する為、\n" + "クラスチェンジ可能な職業は有りません。"; } }