using Cal; using Cal.DataTable; using System; using System.Collections.Generic; using System.Text; namespace ET { public static class MonsterFactoryHelper { //0.50f, 0.46f, 0.41f, 0.35f private static readonly float[] HpDifficultyArr = { 0, 0.50f, 0.96f, 1.37f, 1.72f }; // 0.18f, 0.16f, 0.12f, 0.08f private static readonly float[] AtkDefDifficultyArr = { 0, 0.18f, 0.34f, 0.46f, 0.53f }; public static MonsterBase MainstoryGenerate(CopyBattle self, MainStory mainStory) { Team team = self.team; int len = mainStory.Monster_1Arr.Length; Team targetTeam = EntityFactory.Create(Game.Scene); targetTeam.LeaderId = team.LeaderId; //!+怪物队伍的总怪物数量 MainStory.Monster_1 _monsters = mainStory.Monster_1Arr[0]; MonsterBase _monsterBase = DataTableHelper.Get(_monsters.Monster_1_Id); for (int i = 0; i < len; i++) { //!获取怪物队伍的数量信息 MainStory.Monster_1 monsters = mainStory.Monster_1Arr[i]; MonsterBase monsterBase = DataTableHelper.Get(monsters.Monster_1_Id); int monsterCount = monsters.Monster_1_Count; //monsterCount = 10; for (int j = 0; j < monsterCount; j++) { //!创建怪物,加入队伍 Unit unitMonster = EntityFactory.CreateWithParent(targetTeam, UnitType.Monster); //!设置基础属性 int difficultIndex = team.MemberCount - 1; float hpDifficult = 1 + HpDifficultyArr[difficultIndex]; float atkDefDifficult = 1 + AtkDefDifficultyArr[difficultIndex]; unitMonster.AddComponent().Set(NumericType.Level, monsterBase.Level); Character character = unitMonster.AddComponent(); unitMonster.AddComponent(); character.Set(AttributeType.最大生命, MathHelper.RoundToInt(monsterBase.Hp * hpDifficult)); character.Set(AttributeType.物理攻击, MathHelper.RoundToInt(monsterBase.PhyAtk * atkDefDifficult)); character.Set(AttributeType.精神攻击, MathHelper.RoundToInt(monsterBase.SpiAtk * atkDefDifficult)); character.Set(AttributeType.物理防御, MathHelper.RoundToInt(monsterBase.PhyDef * atkDefDifficult)); character.Set(AttributeType.精神防御, MathHelper.RoundToInt(monsterBase.SpiDef * atkDefDifficult)); MonsterInit(team.GetLeader().GetMap(), unitMonster, team.LeaderId, targetTeam, (int) mainStory.Id, (int) monsterBase.Id, monsterBase.Level, monsterBase.SkillGroupId); } } self.targetTeam = targetTeam; return _monsterBase; } public static MonsterBase TrialCopyGenerate(CopyBattle self, TrialCopy trialCopy) { Team team = self.team; Team targetTeam = EntityFactory.Create(Game.Scene); targetTeam.LeaderId = team.LeaderId; MonsterBase monsterBase = DataTableHelper.Get(trialCopy.MonsterId); for (int i = 0; i < trialCopy.MonsterCount; i++) { Unit unitMonster = EntityFactory.CreateWithParent(targetTeam, UnitType.Monster); //!设置基础属性 unitMonster.AddComponent().Set(NumericType.Level, monsterBase.Level); Character character = unitMonster.AddComponent(); unitMonster.AddComponent(); character.Set(AttributeType.最大生命, MathHelper.RoundToInt(monsterBase.Hp)); character.Set(AttributeType.物理攻击, MathHelper.RoundToInt(monsterBase.PhyAtk)); character.Set(AttributeType.精神攻击, MathHelper.RoundToInt(monsterBase.SpiAtk)); character.Set(AttributeType.物理防御, MathHelper.RoundToInt(monsterBase.PhyDef)); character.Set(AttributeType.精神防御, MathHelper.RoundToInt(monsterBase.SpiDef)); character.Set(AttributeType.力量, MathHelper.RoundToInt(monsterBase.Str)); character.Set(AttributeType.智慧, MathHelper.RoundToInt(monsterBase.Wim)); character.Set(AttributeType.敏捷, MathHelper.RoundToInt(monsterBase.Quk)); character.Set(AttributeType.精神, MathHelper.RoundToInt(monsterBase.Spi)); character.Set(AttributeType.体质, MathHelper.RoundToInt(monsterBase.Phy)); character.Set(AttributeType.耐力, MathHelper.RoundToInt(monsterBase.Sta)); character.Set(AttributeType.物理暴击系数, monsterBase.Pcrir); character.Set(AttributeType.物理暴击效果, monsterBase.Pcri); character.Set(AttributeType.精神暴击系数, monsterBase.Mcrir); character.Set(AttributeType.精神暴击效果, monsterBase.Mcri); character.Set(AttributeType.抗物理暴击系数, monsterBase.Rpcrir); character.Set(AttributeType.抗物理暴击效果, monsterBase.Rpcri); character.Set(AttributeType.抗精神暴击系数, monsterBase.Rmcrir); character.Set(AttributeType.抗精神暴击效果, monsterBase.Rmcri); character.Set(AttributeType.辅助值, monsterBase.Dvo); character.Set(AttributeType.物理免伤, monsterBase.Nphyi); character.Set(AttributeType.精神免伤, monsterBase.Nmeni); MonsterInit(team.GetLeader().GetMap(), unitMonster, team.LeaderId, targetTeam, (int) trialCopy.Id, trialCopy.MonsterId, monsterBase.Level, monsterBase.SkillGroupId); } self.targetTeam = targetTeam; return monsterBase; } public static void ManulEquipGenerate(CopyBattle self, ManulEquipMonsterConfig config) { Team team = self.team; Team targetTeam = EntityFactory.Create(Game.Scene); targetTeam.LeaderId = team.LeaderId; long id = config.Id; for (int i = 0; i < 3; i++) { ManulEquipMonsterConfig monsterConfig = ManulEquipMonsterConfigCategory.Instance.Get(id++); MonsterBase monsterBase = MonsterBaseCategory.Instance.Get(monsterConfig.MonsterId); Unit unitMonster = EntityFactory.CreateWithParent(targetTeam, UnitType.Monster); //!设置基础属性 int difficultIndex = team.MemberCount - 1; float hpDifficult = 1 + ConstDefine.HpDifficultyArr[difficultIndex]; float atkDefDifficult = 1 + ConstDefine.AtkDefDifficultyArr[difficultIndex]; unitMonster.AddComponent().Set(NumericType.Level, monsterBase.Level); Character character = unitMonster.AddComponent(); unitMonster.AddComponent(); character.Set(AttributeType.最大生命, MathHelper.RoundToInt(monsterBase.Hp * hpDifficult)); character.Set(AttributeType.物理攻击, MathHelper.RoundToInt(monsterBase.PhyAtk * atkDefDifficult)); character.Set(AttributeType.精神攻击, MathHelper.RoundToInt(monsterBase.SpiAtk * atkDefDifficult)); character.Set(AttributeType.物理防御, MathHelper.RoundToInt(monsterBase.PhyDef * atkDefDifficult)); character.Set(AttributeType.精神防御, MathHelper.RoundToInt(monsterBase.SpiDef * atkDefDifficult)); character.Set(AttributeType.力量, MathHelper.RoundToInt(monsterBase.Str * atkDefDifficult)); character.Set(AttributeType.智慧, MathHelper.RoundToInt(monsterBase.Wim * atkDefDifficult)); character.Set(AttributeType.敏捷, MathHelper.RoundToInt(monsterBase.Quk * atkDefDifficult)); character.Set(AttributeType.精神, MathHelper.RoundToInt(monsterBase.Spi * atkDefDifficult)); character.Set(AttributeType.体质, MathHelper.RoundToInt(monsterBase.Phy * atkDefDifficult)); character.Set(AttributeType.耐力, MathHelper.RoundToInt(monsterBase.Sta * atkDefDifficult)); character.Set(AttributeType.物理暴击系数, monsterBase.Pcrir * atkDefDifficult); character.Set(AttributeType.物理暴击效果, monsterBase.Pcri * atkDefDifficult); character.Set(AttributeType.精神暴击系数, monsterBase.Mcrir * atkDefDifficult); character.Set(AttributeType.精神暴击效果, monsterBase.Mcri * atkDefDifficult); character.Set(AttributeType.抗物理暴击系数, monsterBase.Rpcrir * atkDefDifficult); character.Set(AttributeType.抗物理暴击效果, monsterBase.Rpcri * atkDefDifficult); character.Set(AttributeType.抗精神暴击系数, monsterBase.Rmcrir * atkDefDifficult); character.Set(AttributeType.抗精神暴击效果, monsterBase.Rmcri * atkDefDifficult); character.Set(AttributeType.辅助值, monsterBase.Dvo * atkDefDifficult); character.Set(AttributeType.物理免伤, monsterBase.Nphyi); character.Set(AttributeType.精神免伤, monsterBase.Nmeni); MonsterInit(team.GetLeader().GetMap(), unitMonster, team.LeaderId, targetTeam, (int) config.Id, (int) monsterBase.Id, monsterBase.Level, monsterBase.SkillGroupId); } self.targetTeam = targetTeam; } public static void SpaceTravelGenerate(CopyBattle self, SpaceTravelConfig config) { Team team = self.team; Team targetTeam = EntityFactory.Create(Game.Scene); targetTeam.LeaderId = team.LeaderId; int difficultIndex = team.MemberCount - 1; float hpDifficult = 1 + ConstDefine.HpDifficultyArr[difficultIndex]; float atkDefDifficult = 1 + ConstDefine.AtkDefDifficultyArr[difficultIndex]; foreach (int monsterId in config.MonsterIdArr) { MonsterBase monsterBase = MonsterBaseCategory.Instance.Get(monsterId); Unit unitMonster = EntityFactory.CreateWithParent(targetTeam, UnitType.Monster); //!设置基础属性 unitMonster.AddComponent().Set(NumericType.Level, monsterBase.Level); Character character = unitMonster.AddComponent(); unitMonster.AddComponent(); character.Set(AttributeType.最大生命, MathHelper.RoundToInt(monsterBase.Hp * hpDifficult)); character.Set(AttributeType.物理攻击, MathHelper.RoundToInt(monsterBase.PhyAtk * atkDefDifficult)); character.Set(AttributeType.精神攻击, MathHelper.RoundToInt(monsterBase.SpiAtk * atkDefDifficult)); character.Set(AttributeType.物理防御, MathHelper.RoundToInt(monsterBase.PhyDef * atkDefDifficult)); character.Set(AttributeType.精神防御, MathHelper.RoundToInt(monsterBase.SpiDef * atkDefDifficult)); character.Set(AttributeType.力量, MathHelper.RoundToInt(monsterBase.Str * atkDefDifficult)); character.Set(AttributeType.智慧, MathHelper.RoundToInt(monsterBase.Wim * atkDefDifficult)); character.Set(AttributeType.敏捷, MathHelper.RoundToInt(monsterBase.Quk * atkDefDifficult)); character.Set(AttributeType.精神, MathHelper.RoundToInt(monsterBase.Spi * atkDefDifficult)); character.Set(AttributeType.体质, MathHelper.RoundToInt(monsterBase.Phy * atkDefDifficult)); character.Set(AttributeType.耐力, MathHelper.RoundToInt(monsterBase.Sta * atkDefDifficult)); character.Set(AttributeType.物理暴击系数, monsterBase.Pcrir * atkDefDifficult); character.Set(AttributeType.物理暴击效果, monsterBase.Pcri * atkDefDifficult); character.Set(AttributeType.精神暴击系数, monsterBase.Mcrir * atkDefDifficult); character.Set(AttributeType.精神暴击效果, monsterBase.Mcri * atkDefDifficult); character.Set(AttributeType.抗物理暴击系数, monsterBase.Rpcrir * atkDefDifficult); character.Set(AttributeType.抗物理暴击效果, monsterBase.Rpcri * atkDefDifficult); character.Set(AttributeType.抗精神暴击系数, monsterBase.Rmcrir * atkDefDifficult); character.Set(AttributeType.抗精神暴击效果, monsterBase.Rmcri * atkDefDifficult); character.Set(AttributeType.辅助值, monsterBase.Dvo * atkDefDifficult); character.Set(AttributeType.物理免伤, monsterBase.Nphyi); character.Set(AttributeType.精神免伤, monsterBase.Nmeni); MonsterInit(team.GetLeader().GetMap(), unitMonster, team.LeaderId, targetTeam, (int) config.Id, (int) monsterBase.Id, monsterBase.Level, monsterBase.SkillGroupId); } self.targetTeam = targetTeam; } public static MonsterBase BossGenerate(CopyBattle self, int mapId, BossBase bossBase) { Team team = self.team; Team targetTeam = EntityFactory.Create(Game.Scene); targetTeam.LeaderId = team.LeaderId; MonsterBase monsterBase = MonsterBaseCategory.Instance.Get(bossBase.MonsterId); Unit unitMonster = EntityFactory.CreateWithParent(targetTeam, UnitType.Monster); //!设置基础属性 int difficultIndex = team.MemberCount - 1; float hpDifficult = 1 + ConstDefine.HpDifficultyArr[difficultIndex]; float atkDefDifficult = 1 + ConstDefine.AtkDefDifficultyArr[difficultIndex]; unitMonster.AddComponent().Set(NumericType.Level, monsterBase.Level); Character character = unitMonster.AddComponent(); unitMonster.AddComponent(); character.Set(AttributeType.最大生命, MathHelper.RoundToInt(monsterBase.Hp * hpDifficult)); character.Set(AttributeType.物理攻击, MathHelper.RoundToInt(monsterBase.PhyAtk * atkDefDifficult)); character.Set(AttributeType.精神攻击, MathHelper.RoundToInt(monsterBase.SpiAtk * atkDefDifficult)); character.Set(AttributeType.物理防御, MathHelper.RoundToInt(monsterBase.PhyDef * atkDefDifficult)); character.Set(AttributeType.精神防御, MathHelper.RoundToInt(monsterBase.SpiDef * atkDefDifficult)); character.Set(AttributeType.力量, MathHelper.RoundToInt(monsterBase.Str * atkDefDifficult)); character.Set(AttributeType.智慧, MathHelper.RoundToInt(monsterBase.Wim * atkDefDifficult)); character.Set(AttributeType.敏捷, MathHelper.RoundToInt(monsterBase.Quk * atkDefDifficult)); character.Set(AttributeType.精神, MathHelper.RoundToInt(monsterBase.Spi * atkDefDifficult)); character.Set(AttributeType.体质, MathHelper.RoundToInt(monsterBase.Phy * atkDefDifficult)); character.Set(AttributeType.耐力, MathHelper.RoundToInt(monsterBase.Sta * atkDefDifficult)); character.Set(AttributeType.物理暴击系数, monsterBase.Pcrir * atkDefDifficult); character.Set(AttributeType.物理暴击效果, monsterBase.Pcri * atkDefDifficult); character.Set(AttributeType.精神暴击系数, monsterBase.Mcrir * atkDefDifficult); character.Set(AttributeType.精神暴击效果, monsterBase.Mcri * atkDefDifficult); character.Set(AttributeType.抗物理暴击系数, monsterBase.Rpcrir * atkDefDifficult); character.Set(AttributeType.抗物理暴击效果, monsterBase.Rpcri * atkDefDifficult); character.Set(AttributeType.抗精神暴击系数, monsterBase.Rmcrir * atkDefDifficult); character.Set(AttributeType.抗精神暴击效果, monsterBase.Rmcri * atkDefDifficult); character.Set(AttributeType.辅助值, monsterBase.Dvo * atkDefDifficult); character.Set(AttributeType.物理免伤, monsterBase.Nphyi); character.Set(AttributeType.精神免伤, monsterBase.Nmeni); //!保存bossUnitId BossComponent.Instance.bossIdDic[mapId % 100] = unitMonster.Id; unitMonster.AddComponent().MapId = mapId; MonsterInit(team.GetLeader().GetMap(), unitMonster, team.LeaderId, targetTeam, (int) bossBase.Id, bossBase.MonsterId, monsterBase.Level, monsterBase.SkillGroupId); self.targetTeam = targetTeam; return monsterBase; } public static FamilyBossConfig FamilyBossGenerate(CopyBattle self, FamilyBossConfig familyBossConfig, FamilyBoss family) { Team team = self.team; Team targetTeam = EntityFactory.Create(Game.Scene); targetTeam.LeaderId = team.LeaderId; MonsterBase monsterBase = MonsterBaseCategory.Instance.Get(familyBossConfig.MonsterId); Unit unitMonster = EntityFactory.CreateWithParent(targetTeam, UnitType.Monster); //!设置基础属性 int difficultIndex = team.MemberCount - 1; float hpDifficult = 1 + ConstDefine.HpDifficultyArr[difficultIndex]; float atkDefDifficult = 1 + ConstDefine.AtkDefDifficultyArr[difficultIndex]; unitMonster.AddComponent().Set(NumericType.Level, monsterBase.Level); Character character = unitMonster.AddComponent(); unitMonster.AddComponent(); int hp = family.GetBossHp((int) familyBossConfig.Id); character.Set(AttributeType.最大生命, hp); character.Set(AttributeType.物理攻击, MathHelper.RoundToInt(monsterBase.PhyAtk * atkDefDifficult)); character.Set(AttributeType.精神攻击, MathHelper.RoundToInt(monsterBase.SpiAtk * atkDefDifficult)); character.Set(AttributeType.物理防御, MathHelper.RoundToInt(monsterBase.PhyDef * atkDefDifficult)); character.Set(AttributeType.精神防御, MathHelper.RoundToInt(monsterBase.SpiDef * atkDefDifficult)); character.Set(AttributeType.物理暴击系数, monsterBase.Pcrir * atkDefDifficult); character.Set(AttributeType.物理暴击效果, monsterBase.Pcri * atkDefDifficult); character.Set(AttributeType.精神暴击系数, monsterBase.Mcrir * atkDefDifficult); character.Set(AttributeType.精神暴击效果, monsterBase.Mcri * atkDefDifficult); character.Set(AttributeType.抗物理暴击系数, monsterBase.Rpcrir * atkDefDifficult); character.Set(AttributeType.抗物理暴击效果, monsterBase.Rpcri * atkDefDifficult); character.Set(AttributeType.抗精神暴击系数, monsterBase.Rmcrir * atkDefDifficult); character.Set(AttributeType.抗精神暴击效果, monsterBase.Rmcri * atkDefDifficult); character.Set(AttributeType.辅助值, monsterBase.Dvo * atkDefDifficult); character.Set(AttributeType.物理免伤, monsterBase.Nphyi); character.Set(AttributeType.精神免伤, monsterBase.Nmeni); MonsterInit(team.GetLeader().GetMap(), unitMonster, team.LeaderId, targetTeam, (int) familyBossConfig.Id, familyBossConfig.MonsterId, monsterBase.Level, monsterBase.SkillGroupId); self.targetTeam = targetTeam; return familyBossConfig; } /// /// 3处需要改动 /// /// /// /// /// /// /// private static void MonsterInit(MapScene mapScene, Unit unitMonster, long learderId, Team targetTeam, int configId, int monsterId, int level, int skillGroupId) { mapScene.Enter(unitMonster).Coroutine(); unitMonster.AddComponent(); unitMonster.AddComponent(); unitMonster.AddComponent(); var monsterInfo = unitMonster.AddComponent(); monsterInfo.configId = configId; monsterInfo.monsterId = monsterId; unitMonster.AddComponent(false); //!用TeamLeaderId保存玩家Id unitMonster.TeamLeaderId = learderId; //!初始化怪物技能 unitMonster.AddComponent(); unitMonster.AddComponent(); UnitSkillComponent skillComponent = unitMonster.AddComponent(); SkillAI ai = unitMonster.AddComponent(); SkillGroupBase skillGroupBase = DataTableHelper.Get(skillGroupId); for (int i = skillGroupBase.SkillsArr.Length - 1; i >= 0; i--) { int skillId = skillGroupBase.SkillsArr[i].Skills_Id; if (skillComponent.InitMonsterSkill(skillId)) skillComponent.LearnMonsterSkill(skillId); ai.AutoSkillList.AddFirst(skillId); } int lv = level; float spd = CharacterHelper.GetSpeed(lv); ai.roundCD = CharacterHelper.GetSkillCD(spd); //!增加记录玩家的组件 unitMonster.AddComponent().MonsterId = monsterId; //!加入怪物队伍 targetTeam.Add(unitMonster); } } }