private static void AddSummonableVisitorsToList(BattleInitializationData battleData, StaticDataController idc, List <IAssetVO> assets, SkinController sc) { List <string> list = new List <string>(); List <string> list2 = new List <string>(); List <string> list3 = new List <string>(); if (battleData.AttackerEquipment != null) { list3.AddRange(battleData.AttackerEquipment); } if (battleData.DefenderEquipment != null) { list3.AddRange(battleData.DefenderEquipment); } int count = list3.Count; for (int i = 0; i < count; i++) { EquipmentVO equipmentVO = idc.Get <EquipmentVO>(list3[i]); int num = equipmentVO.EffectUids.Length; for (int j = 0; j < num; j++) { EquipmentEffectVO equipmentEffectVO = idc.Get <EquipmentEffectVO>(equipmentVO.EffectUids[j]); int num2 = equipmentEffectVO.BuffUids.Length; for (int k = 0; k < num2; k++) { BuffTypeVO buffTypeVO = idc.Get <BuffTypeVO>(equipmentEffectVO.BuffUids[k]); if (buffTypeVO.Modify == BuffModify.Summon) { SummonDetailsVO summonDetailsVO = idc.Get <SummonDetailsVO>(buffTypeVO.Details); int num3 = summonDetailsVO.VisitorUids.Length; for (int l = 0; l < num3; l++) { string item = summonDetailsVO.VisitorUids[l]; List <string> list4 = (summonDetailsVO.VisitorType != VisitorType.Troop) ? list2 : list; if (!list4.Contains(item)) { list4.Add(item); } } } } } } int m = 0; int count2 = list.Count; while (m < count2) { MapDataLoaderUtils.AddDeployableToList <TroopTypeVO>(list[m], 1, assets, list3, idc, sc); m++; } int n = 0; int count3 = list2.Count; while (n < count3) { MapDataLoaderUtils.AddDeployableToList <SpecialAttackTypeVO>(list2[n], 1, assets, list3, idc, sc); n++; } }
private void HandleSummon(BuffEventData data) { SummonDetailsVO summonDetailsVO = (SummonDetailsVO)data.BuffObj.Details; if (data.BuffObj.ProcCount > summonDetailsVO.MaxProc) { return; } if (this.numSummons >= GameConstants.MAX_SUMMONS_PER_BATTLE) { return; } List <SmartEntity> list; bool flag = this.visitorExecution.TryGetValue(data.Target, out list); if (list == null) { list = new List <SmartEntity>(); } if (summonDetailsVO.VisitorUids == null || summonDetailsVO.VisitorUids.Length == 0) { Service.Logger.WarnFormat("No visitor uid for buff {0}", new object[] { summonDetailsVO.Uid }); return; } int num = (data.BuffObj.ProcCount - 1) % summonDetailsVO.VisitorUids.Length; string text = summonDetailsVO.VisitorUids[num]; TransformComponent transformComponent = data.Target.Get <TransformComponent>(); TeamType teamType = data.Target.TeamComp.TeamType; if (!summonDetailsVO.SameTeam) { teamType = ((data.Target.TeamComp.TeamType != TeamType.Attacker) ? TeamType.Attacker : TeamType.Defender); } SmartEntity smartEntity = null; if (summonDetailsVO.VisitorType == VisitorType.Troop) { int num2 = (data.BuffObj.ProcCount - 1) % summonDetailsVO.SpawnPoints.Length; Vector3 offset = summonDetailsVO.SpawnPoints[num2]; TroopTypeVO troopTypeVO = Service.StaticDataController.Get <TroopTypeVO>(text); IntPosition boardPosition; bool flag2 = this.VerifyBoardPosition(transformComponent, offset, transformComponent.Rotation, troopTypeVO.SizeX, teamType, out boardPosition); bool forceAllow = !flag2; int randomSpawnRadius = summonDetailsVO.RandomSpawnRadius; if (troopTypeVO.Type == TroopType.Phantom && randomSpawnRadius > 0) { forceAllow = true; BattleController battleController = Service.BattleController; RandSimSeed simSeed = Service.Rand.SimSeed; int num3 = (int)((battleController.Now + simSeed.SimSeedA) % (uint)randomSpawnRadius); int num4 = (int)((battleController.Now + simSeed.SimSeedB) % (uint)randomSpawnRadius); if (num3 % 2 == 0) { num3 *= -1; } if (num4 % 2 == 1) { num4 *= -1; } boardPosition.x = Mathf.Clamp(boardPosition.x + num3, -23, 23); boardPosition.z = Mathf.Clamp(boardPosition.z + num4, -23, 23); } smartEntity = Service.TroopController.SpawnTroop(troopTypeVO, teamType, boardPosition, TroopSpawnMode.Unleashed, true, forceAllow, summonDetailsVO.VisitorType); if (smartEntity == null) { Service.Logger.WarnFormat("could not spawn troop visitor {0} for buff {1}", new object[] { text, summonDetailsVO.Uid }); } else { this.numSummons++; } } else if (summonDetailsVO.VisitorType == VisitorType.SpecialAttack) { Vector3 zero = Vector3.zero; zero.x = Units.BoardToWorldX(transformComponent.X); zero.z = Units.BoardToWorldX(transformComponent.Z); SpecialAttackTypeVO specialAttackType = Service.StaticDataController.Get <SpecialAttackTypeVO>(text); if (Service.SpecialAttackController.DeploySpecialAttack(specialAttackType, teamType, zero) == null) { Service.Logger.WarnFormat("could not spawn special attack {0} for buff {1}", new object[] { text, summonDetailsVO.Uid }); } else { this.AddVisitorToValidate(data.BuffObj.BuffType, text, 1); } } else { Service.Logger.WarnFormat("Unhandled visitor type {0} for {1}", new object[] { summonDetailsVO.VisitorType, summonDetailsVO.Uid }); } if (smartEntity != null) { if (summonDetailsVO.DieWithSummoner) { list.Add(smartEntity); if (!flag) { this.visitorExecution[data.Target] = list; } } if (summonDetailsVO.TargetSummoner && smartEntity.ShooterComp != null) { smartEntity.ShooterComp.Target = data.Target; } this.AddVisitorToValidate(data.BuffObj.BuffType, text, 1); } }