public static void SpawnOrb(Boss b, AttackGroup a, BossOrb.Data d, string positionName, RuntimeAnimatorController animator) { Transform spawnLocation, center, bottom; b.transforms.TryGetValue(positionName, out spawnLocation); b.transforms.TryGetValue("CenterTop", out center); b.transforms.TryGetValue("CenterBottom", out bottom); GameObject obj = Instantiate(b.prefabOrb, spawnLocation); obj.transform.localPosition = Vector3.zero; BossOrb orb = obj.GetComponent <BossOrb>(); orb.SetData(d); orb.SetCenterAndBottom(center.position, bottom.position); orb.SetAnimatorController(animator); orb.IdleFinished += a.StartCooldown; orb.SetTarget(b.player ? b.player.transform : b.transform); }
private void Awake() { JSONNodeReader jsonReader = new JSONNodeReader(fileBosses); JSONArrayReader bossesReader = jsonReader.Get <JSONArrayReader>("bosses"); JSONNodeReader bossNodeReader; while (bossesReader.GetNextNode(out bossNodeReader)) { List <Boss.AttackGroup> attackGroups = new List <Boss.AttackGroup>(); JSONArrayReader attackGroupsReader = bossNodeReader.Get <JSONArrayReader>("attack groups"); JSONNodeReader attackGroupNodeReader; while (attackGroupsReader.GetNextNode(out attackGroupNodeReader)) { Boss.AttackGroup attackGroup = new Boss.AttackGroup( attackGroupNodeReader.Get("seconds of cooldown", 2.0f), attackGroupNodeReader.Get("seconds of cooldown variance", 0.5f)); float secondsOfCooldownBonusPerArena = attackGroupNodeReader.Get("seconds of cooldown bonus per arena", 0.0f); float secondsOfCooldownMin = attackGroupNodeReader.Get("seconds of cooldown min", 0.1f); DifficultyIncreased += () => attackGroup.SetSecondsOfCooldown( UtilApproach.Float(attackGroup.GetSecondsOfCooldown(), secondsOfCooldownMin, -secondsOfCooldownBonusPerArena) ); JSONArrayReader attacksReader = attackGroupNodeReader.Get <JSONArrayReader>("attacks"); JSONNodeReader attackNodeReader; while (attacksReader.GetNextNode(out attackNodeReader)) { string identifier = attackNodeReader.Get("identifier", "ERROR"); string appearance = attackNodeReader.Get("appearance", "ERROR"); if (identifier == "FloorSpikes") { float count = attackNodeReader.Get("count", 3); RuntimeAnimatorController rac; spikeAnimators.TryGetValue(appearance, out rac); FloorSpike.Data d = ReadFloorSpike(attackNodeReader, appearance); attackGroup.AddAttack(x => Boss.FloorSpikes(x, attackGroup, d, rac, count)); float countBonusPerArena = attackNodeReader.Get("count bonus per arena", 0.0f); float countMax = attackNodeReader.Get("count max", 6); DifficultyIncreased += () => count = UtilApproach.Float(count, countMax, countBonusPerArena); } else if (identifier == "FloorSpikeTargetPlayer") { RuntimeAnimatorController rac; spikeAnimators.TryGetValue(appearance, out rac); FloorSpike.Data d = ReadFloorSpike(attackNodeReader, appearance); attackGroup.AddAttack(x => Boss.FloorSpikeTargetPlayer(x, attackGroup, d, rac)); } else if (identifier == "Orb") { RuntimeAnimatorController rac; orbAnimators.TryGetValue(appearance, out rac); BossOrb.Data d = new BossOrb.Data( attackNodeReader.Get("damage", 20), attackNodeReader.Get("seconds to idle", 3.0f), attackNodeReader.Get("seconds to idle variance", 2.0f), attackNodeReader.Get("seconds to move to center", 0.2f), attackNodeReader.Get("seconds to move to bottom", 0.8f), attackNodeReader.Get("horizontal speed", 8.0f)); string positionName = attackNodeReader.Get("position", "ERROR"); attackGroup.AddAttack(x => Boss.SpawnOrb(x, attackGroup, d, positionName, rac)); int damageBonusPerArena = attackNodeReader.Get("damage bonus per arena", 0); int damageMax = attackNodeReader.Get("damage max", 10000); DifficultyIncreased += () => d.damage = UtilApproach.Int(d.damage, damageMax, damageBonusPerArena); } /* * else if (identifier == "HorizontalProjectile") * { * int damage = attackNodeReader.Get("damage", 20); * float speed = attackNodeReader.Get("speed", 8.0f); * float spawnHeight = attackNodeReader.Get("spawn height", 1.0f); * float seconds = attackNodeReader.Get("seconds to wait after attack", * 1.0f); * Velocity2D.Data d = new Velocity2D.Data(new Vector2(-speed, 0.0f)); * attacks.Add(x => Boss.FireProjectile(x, d, damage, spawnHeight, * seconds)); * } */ } attackGroups.Add(attackGroup); } Boss.Data boss = new Boss.Data( bossNodeReader.Get("identifier", "ERROR"), bossNodeReader.Get("base health", 1), attackGroups); int healthBonusPerArena = bossNodeReader.Get("health bonus per arena", 0); DifficultyIncreased += () => boss.baseHealth += healthBonusPerArena; pool.Add(boss); } }