public static void assignXP(float xp, int level, HitMe hitme, Firearm firearm, Vector3 pos, EffectType type) { if (xp <= 0) { // Debug.LogError("WTF " + xp + " " + hitme.gameObject.name + "\n"); return; } if (firearm == null) { return; } float return_xp = firearm.addXp(xp, true);//if tower is at max xp, return the xp, // if xp is from damage done, it is tied to health. Otherwise, //if xp is from Speed/Teleport/Weaken etc, just assign the XP. this is handled by HitMe.stats.getXp though if (return_xp > 0) { hitme.stats.returnXp(return_xp); } float added = xp - return_xp; onXpAdded?.Invoke(added, pos); firearm.toy.my_tower_stats.addXp(type, level, xp); }
public HitMe makeMonster(string name, int path, Vector3 posv, float point_factor, float xp_factor) { EnemyType enemy_type = EnumUtil.EnumFromString <EnemyType>(name, EnemyType.Null); if (enemy_type == EnemyType.Null) { Debug.LogError("Cannot make monster of type Null from " + name + "\n"); return(null); } GameObject toy = zoo.getObject("Monsters/" + name, true); toy.tag = "Enemy"; toy.transform.GetChild(0).tag = "Enemy"; // Debug.Log("LAYER " + toy.layer + "\n"); //toy.layer = 12;//Unit toy.name = name + monster_count; monster_count++; toy.transform.SetParent(monsters_transform); toy.transform.position = posv; toy.transform.localScale = Vector3.one;// = Vector3.one; HitMe hitme = toy.GetComponent <HitMe>(); hitme.initStats(Central.Instance.getEnemy(enemy_type)); // Debug.Log(hitme.gameObject.name + " " + hitme.GetInstanceID() + " " + Duration.time + " SPAWNED!\n"); hitme.stats.point_factor = point_factor; // Debug.Log("xp_factor " + xp_factor + "\n"); if (xp_factor >= 0) { hitme.stats.SetXp(xp_factor); } targets.addByID(hitme); hitme.my_ai.my_dogtag.my_name = name + " " + Moon.Instance.getEnemyID(); hitme.my_ai.my_dogtag.wave = Moon.Instance.current_wave; AI ai = hitme.my_ai; ai.path = path; ai.player = WaypointMultiPathfinder.Instance.paths[path].finish.transform; ai.seewhen = diagonal; ai.keepwalking = diagonal; ai.notsure = diagonal; ai.Init(); enemy_list.addMonster(toy.transform.GetInstanceID(), ai.my_dogtag); if (onPlacedToy != null) { onPlacedToy(toy.name, RuneType.Null, ToyType.Null); } //toy.transform.localRotation = ai.GetForwardDirection(); return(hitme); }
void OnTriggerEnter2D(Collider2D c) { Debug.Log($"END REACHED by {c.gameObject.name} tag {c.tag}\n"); Collider2D other = c; if (other.tag.Equals("Enemy")) { //other.tag.Equals("EnemyWon"); HitMe my_hitme = other.attachedRigidbody.gameObject.GetComponent <HitMe>(); string label = my_hitme.my_ai.my_dogtag.getLabel(); // Debug.Log(my_hitme.gameObject.name + " " + my_hitme.GetInstanceID() + " " + Duration.time + " DIED!\n"); my_hitme.DieSpecial(); if (!LevelBalancer.Instance.am_enabled) { Peripheral.Instance.AdjustHealth(-1); Tracker.Log(PlayerEvent.CastleReached, true, customAttributes: new Dictionary <string, string>() { { "attribute_1", label } }, customMetrics: new Dictionary <string, double>() { { "metric_2", Peripheral.Instance.my_inventory.GetWishCount(WishType.Sensible) } }); } Debug.Log("** Castle reached " + label + "\n"); GameStatCollector.Instance.CastleInvaded(my_hitme.gameObject.name); } else { } }
//CALAMITY public void Init(StatBit bit, HitMe target, Firearm firearm, EffectType type) { Prepare(bit, firearm, type); if (type == EffectType.Calamity) { my_lava = Peripheral.Instance.zoo.getObject("Wishes/calamity_lava", true).GetComponent <Lava>(); } else { my_lava = Peripheral.Instance.zoo.getObject("Wishes/foil_lava", true).GetComponent <Lava>(); } my_lava.auto_return = true; my_lava.my_firearm = firearm; my_lava.Init(type, bit.level, lava_stats, lava_timer, true, firearm); my_lava.SetLocation(target.transform, target.transform.position, lava_size, Quaternion.identity); my_lava.SetFactor(1); my_lava.transform.localPosition = Vector3.zero; Vector3 pos = my_lava.transform.position; pos.z = 3.75f; my_lava.transform.position = pos; my_lava.updateMyPosition = true; target.lavas.Add(my_lava); }
public HitMeResponse Put(HitMe request) { var game = Cache.Get <CardGame>(request.GameId); if (game == null) { throw HttpError.NotFound("Game not found"); } if (game.PlayerOneId != request.PlayerId && game.PlayerTwoId != request.PlayerId) { throw HttpError.NotFound("Player not found"); } var player = game.PlayerOneId == request.PlayerId ? game.PlayerOne : game.PlayerTwo; player.HitMe(game.Deck); game.Events.Add(new CardGameEvent { ClientId = request.PlayerId, GameId = request.GameId, Message = "Player {0} hit".Fmt(player.DisplayName), Type = "HIT" }); Cache.Set(request.GameId, game, TimeSpan.FromHours(1)); var result = new HitMeResponse(); return(result); }
IEnumerator MakeSparkes(HitMe hitme) { Vector3 from = hitme.gameObject.transform.position; float walk_angle = hitme.my_ai.forward_direction_angle / (2 * Mathf.PI) - Mathf.PI; float collider_size = Get.getColliderSize(hitme.my_collider); for (int i = 0; i < bullets; i++) { //float angle = UnityEngine.Random.Range(walk_angle - Mathf.PI*.3f, walk_angle + Mathf.PI*.3f); float angle = Get.RandomNormal() * (Mathf.PI * .75f) + walk_angle; Vector3 target = from; Vector2 dir = Get.GetDirection(angle, 2f); Vector3 mod_from = from + (new Vector3(dir.x, dir.y, 0f)) * collider_size * 1.1f; target += new Vector3(2f * dir.x, 2f * dir.y, 0f); Arrow arrow = Get.MakeArrow(arrow_name, mod_from, target, my_statsum, -1, null, false); arrow.myFirearm = my_firearm; int c = Mathf.FloorToInt(Random.Range(0, colors.Length)); if (c >= colors.Length) { Debug.Log("Color too big"); c = colors.Length - 1; } arrow.sprite_renderer.color = colors[c]; //arrow.transform.rotation = turn; arrow.gameObject.SetActive(true); arrow.sourceID = hitme.gameObject.GetInstanceID(); } yield return(null); }
//Instantiate objects void Start() { controller = transform.GetComponent <CharacterController>(); childObject = controller.transform.GetChild(0).gameObject; actor = transform.GetComponent <Actor>(); meleeRange = transform.GetChild(2).gameObject; hit = meleeRange.GetComponent <HitMe>(); anim = childObject.GetComponent <Animation>(); }
public void AskSparkles(HitMe hitme) { if (lets_make_sparkles) { StartCoroutine(MakeSparkes(hitme)); lets_make_sparkles = false; TIME_TO_FIRE = fire_time; } }
void EnableVisuals(HitMe me, float timer) { if (rate > 0) { me.EnableVisuals(MonsterType.Regeneration, timer); } else { me.EnableVisuals(MonsterType.DOT, timer); } }
void GetVictims() { // Debug.Log("Getting victims\n"); if (monsters == null) { monsters = Peripheral.Instance.targets; } List <HitMe> targets = new List <HitMe>(); for (int i = 0; i < monsters.max_count; i++) { HitMe enemy = monsters.array[i]; if (enemy == null || enemy.amDying() || !enemy.gameObject.activeSelf) { continue; } if (Vector2.Distance(enemy.transform.position, this.transform.position) < radius) { targets.Add(enemy); } } if (targets.Count == 0) { return; } StatSum type = null; type = arrow.myFirearm.toy.rune.GetStats(false); type.factor = 0.9f; StatSum explode_statsum = type.getSubStatSum(EffectType.Explode_Force); for (int i = 0; i < targets.Count; i++) { arrow.myFirearm.addXp(targets[i].HurtMe(explode_statsum, null, EffectType.Null), true); float mass = targets[i].my_rigidbody.mass; //Vector3 dir3 = targets[i].transform.position - from; Vector3 dir3 = this.transform.position - from; Vector2 dir = Vector3.Normalize(new Vector2(dir3.x, dir3.y)); //float dist = Vector2.Distance(targets[i].transform.position, from); float adjust = targets[i].my_ai.speed; targets[i].my_rigidbody.AddForce(adjust * strength * dir * mass, ForceMode2D.Impulse); } }
//DOT //regenerator doing damage => has negative stats[0] public float Init(HitMe _hitme, float[] stats, RegeneratorType _type, Firearm firearm, int level) { repeat_rate = Get.regenerator_repeat_rate; heal_duration = -1; type = _type; my_hitme = _hitme; effect_type = EffectType.DOT; //if (_towerID != 0 && towerID != _towerID) //{ // towerID = _towerID; //my_firearm = getFirearm(towerID); // } my_firearm = firearm; monsters = null; this.level = level; duration = stats[1]; EnableVisuals(_hitme, duration); TIME = 0f; if (is_active) { if (my_lava != null) { my_lava.lifespan = duration; } return(0f); } float finisher_percent = (stats.Length == StaticStat.StatLength(EffectType.DOT, true)) ? stats[3] : 0; if (finisher_percent > 0 && UnityEngine.Random.RandomRange(0, 1) < finisher_percent) { // SetEverythingOnFire(stats); // Debug.Log("Fin\n"); } total_time = duration + .1f; // this isn only intended for 1 time use, not repeating period = -1; rate = Get.getRegeneratorModRate(repeat_rate, stats[0], duration); type = _type; done_for_good = false; is_active = true; am_doing_stuff = false; first_invoke = true; // Debug.Log("initializing regenerator total time " + total_time + " duration " + duration + " rate " + rate // + " repeat_rate " + repeat_rate + " stat " + stats[0] + "\n"); return(0); }
void Start() { is_active = true; if (my_hitme == null) { my_hitme = hitme.GetComponent <HitMe> (); } if (defaultLayer < 0) { defaultLayer = gameObject.layer; } else { gameObject.layer = defaultLayer; } am_hidden = false; }
void Start() { //Instantiate objects allActors = GameObject.FindObjectsOfType <Actor>(); actor = transform.GetComponent <Actor>(); meleeRange = transform.GetChild(1).gameObject; hit = meleeRange.GetComponent <HitMe>(); seeker = GetComponent <Seeker>(); controller = GetComponent <CharacterController>(); anim = controller.transform.GetChild(0).gameObject.GetComponent <Animation>(); //Make attacks only fire only anim["Mine1/Attack1"].wrapMode = WrapMode.Once; anim["Mine2/Attack2"].wrapMode = WrapMode.Once; //Find random Waypoint pathWaypoint = GameObject.Find("Waypoint"); //Start a new path to the targetPosition, return the result to the OnPathComplete function GoPath(); }
public void Init(HitMe hitme) { my_ai = hitme.my_ai; foreach (WaypointNode p in WaypointMultiPathfinder.Instance.paths[my_ai.path].Map) { path.Add(p.order, p.transform.position); if (smallest > p.order) { smallest = p.order; } if (biggest < p.order) { biggest = p.order; } } hitme.EnableVisuals(MonsterType.Teleport, 1f); }
void GetFriends() { friends = new List <HitMe>(); if (monsters == null) { monsters = Peripheral.Instance.targets; } for (int i = 0; i < monsters.max_count; i++) { HitMe friend = monsters.array[i]; if (friend == null || friend.amDying() || !friend.gameObject.activeSelf) { continue; } if (Vector2.Distance(friend.transform.position, this.transform.position) < range) { friends.Add(friend); } } }
public float Init(HitMe _hitme, float[] stats) { float _lifetime = stats[0]; float little_more = 0.1f;//otherwise it looks like it ends too soon because some of them take time to turn around if (is_active) { lifetime = _lifetime; my_time = 0f; _hitme.EnableVisuals(MonsterType.Fear, lifetime + little_more); if (my_lava != null) { my_lava.lifespan = lifetime; } return(0.15f); } my_ai = _hitme.my_ai; finish = my_ai.player.transform; start = WaypointMultiPathfinder.Instance.paths[my_ai.path].start.transform; my_time = 0; is_active = true; lifetime = _lifetime; my_ai.player = start; my_ai.getNewPath(); my_ai.forward_only = false; _hitme.EnableVisuals(MonsterType.Fear, lifetime + lifetime); float finisher_percent = (stats.Length == StaticStat.StatLength(EffectType.Fear, true)) ? stats[3] : 0; if (finisher_percent > 0 && UnityEngine.Random.RandomRange(0, 1) < finisher_percent) { CauseMassPanic(stats); // Debug.Log("Fin\n"); } return(0.15f); }
//weaken applies to defenses that are both in hitme.defenses and in hitme.init_defenses, won't apply to secondary defenses that may be added later on, like Fear. public float Init(HitMe _hitme, float[] stats) //, float aff, float _lifetime){ { my_hitme = _hitme; my_time = 0; is_active = true; float by = Get.getPercent(stats[0]); lifetime = stats[1]; _hitme.EnableVisuals(MonsterType.Weaken, lifetime); original_defenses = new List <Defense>(); // Debug.Log("WEAKEN by " + by + " for " + lifetime + "\n"); finisher_percent = (stats.Length == StaticStat.StatLength(EffectType.Weaken, true)) ? stats[1] : 0; if (finisher_percent > 0 && UnityEngine.Random.RandomRange(0, 1) < finisher_percent) { by = 0.05f; } foreach (Defense def in my_hitme.defenses) { Defense init = null; foreach (Defense init_def in my_hitme.init_defenses) { if (def.type == init_def.type) { original_defenses.Add(new Defense(init_def.type, init_def.strength)); init = init_def; } } if (init != null) { def.strength = init.strength * by; } } return(by / 40f); }
public List <HitMe> GetVictims() { if (!am_enabled) { return(null); } if (monsters == null) { monsters = Peripheral.Instance.targets; } if (updateMyPosition) { position = this.transform.position; } List <HitMe> targets = new List <HitMe>(); // Debug.Log("Get New " + GetInstanceID() + " " + Duration.realtimeSinceStartup + "\n"); for (int i = 0; i < monsters.max_count; i++) { HitMe enemy = monsters.array[i]; if (enemy == null) { continue; } if (enemy.amDying() || !enemy.gameObject.activeSelf) { continue; } if (inRange(enemy.transform)) { targets.Add(enemy); } } return(targets); }
public bool Init(HitMe _hitme, float[] stats, float factor) { if (_hitme == null) { Debug.Log("WTF hitme is null\n"); } after = TransformType.Null; float roll = UnityEngine.Random.Range(0, 1f); float current = 0; // Debug.Log("roll is " + roll + " stats: " + stats[0] + " % " + " timer " + stats[1] + "\n"); timer = stats[1] / factor; if (am_transformed) { return(true); } /* * float finisher_percent = (stats.Length == StaticStat.StatLength(EffectType.Transform, true)) ? stats[2]/100f : 0; * if (finisher_percent > 0 && UnityEngine.Random.RandomRange(0, 1) < finisher_percent) * { * after = TransformType.Whale; * timer = 99f; * } * * else * {*/ bool flying = (_hitme.gameObject.layer == Get.flyingProjectileLayer); if (roll < stats[0]) { after = (flying)? TransformType.FruitFly : TransformType.StickFigure; } //} if (!ValidateMe(after)) { // Debug.Log("Cancelling converter\n"); return(false); } if (my_hitme == null) { my_hitme = _hitme; before.sprite = my_hitme.sprite_renderer.sprite; before.sprite_size = my_hitme.sprite_renderer.gameObject.transform.localScale; getCollider(before); before.physics_material = my_hitme.getCollider().sharedMaterial.name; before.rotation_interval = my_hitme.my_ai.rotation_interval; before.rotation_inverse_speed_factor = my_hitme.my_ai.rotation_inverse_speed_factor; before.rotation_lerp_amount = my_hitme.my_ai.rotation_lerp_amount; before.speed = my_hitme.my_ai.speed; before.defenses = CloneUtil.copyList <Defense>(my_hitme.stats.defenses); before.linear_drag = my_hitme.my_rigidbody.drag; before.angular_drag = my_hitme.my_rigidbody.angularDrag; } ChangeMe(false); return(true); }
bool Fire() { MyArray <HitMe> enemies = Peripheral.Instance.targets; int how_many = Mathf.Min(Mathf.FloorToInt(stats[0]), enemies.max_count); Debug.Log("PlagueSummoner how many? " + how_many + "\n"); if (how_many < 1) { return(false); } int[] selected_ids = new int[how_many]; int current = 0; int max_tries = 100; while (current < how_many && max_tries > 0) { int id = Mathf.FloorToInt(UnityEngine.Random.RandomRange(0, enemies.max_count)); while (max_tries > 0 && (enemies.array[id] == null || enemies.array[id].amDying() || !enemies.array[id].gameObject.activeSelf || already_selected(selected_ids, id))) { id = Mathf.FloorToInt(UnityEngine.Random.RandomRange(0, enemies.max_count)); max_tries--; } selected_ids[current] = id; current++; } // Debug.Log("plague selected " + selected_ids.Length + " victims\n"); foreach (int i in selected_ids) { //1 how many; 2 min % damage; 3 max % damage; 4 % speed and defense decrease HitMe victim = enemies.array[i]; if (victim == null) { continue; } StatSum sum = new StatSum(); sum.runetype = RuneType.Airy; sum.level = -1; StatBit[] sb = new StatBit[3]; sum.stats = sb; float percent = getDamage(); float damage = Get.bullshit_damage_factor * percent * victim.GetInitMass() / 2f; Debug.Log("Plague hurting victim " + victim.gameObject.name + " with " + victim.GetInitMass() + " init mass for " + percent + " healthl, damage: " + damage + "\n"); sb[0] = new StatBit(); sb[0].effect_type = EffectType.DirectDamage; //% time sb[0].very_dumb = true; sb[0].dumb = true; sb[0].updateStat(damage); sb[1] = new StatBit(); sb[1].effect_type = EffectType.Speed;//%, time to normal, lifetime sb[1].Level = -1; sb[1].very_dumb = true; sb[1].dumb = true; sb[1].updateStat(stats[3]); sb[2] = new StatBit(); sb[2].effect_type = EffectType.Weaken;//%, time sb[2].Level = -1; sb[2].very_dumb = true; sb[2].dumb = true; sb[2].updateStat(stats[3]); victim.EnableVisuals(MonsterType.Plague, 2f); victim.HurtMe(sum, my_firearm, EffectType.Plague, level); } Tracker.Log(PlayerEvent.SpecialSkillUsed, true, customAttributes: new Dictionary <string, string>() { { "attribute_1", EffectType.Plague.ToString() } }, customMetrics: new Dictionary <string, double>() { { "metric_1", level } }); // Central.Instance.my_spyglass.DisableByDragButton(true); return(true); }
void RandomLaunchDecoy() { float angle = UnityEngine.Random.Range(0, 1f); float rad = angle * 2 * Mathf.PI; Vector3 direction = Get.GetDirection(rad, how_far); Vector3 pos = this.transform.position + direction; my_hitme.setVisuals(MonsterType.SummonDecoy, 0.5f, true); GameObject obj; switch (type) { case DistractorType.Decoy: pos.z++; obj = Peripheral.Instance.zoo.getObject(decoy, false); float degrees = angle * 360f; obj.transform.localEulerAngles = new Vector3(0, 0, degrees); obj.transform.position = this.transform.position; obj.name = obj.name + Peripheral.Instance.IncrementMonsterCount(); obj.transform.SetParent(transform.parent); obj.SetActive(true); obj.GetComponent <Rigidbody2D>().velocity = direction * init_velocity * 2f; if (max_number > 0) { decoys.addByID(obj.GetComponent <Decoy>()); } break; case DistractorType.Monster: Moon.Instance.enemySpawned(my_hitme.my_ai.my_dogtag.wave); HitMe hey = Peripheral.Instance.makeMonster(decoy, my_hitme.my_ai.path, pos, 0f, 0f); if (one_level) { foreach (Modifier tech in hey.enemy_tech) { if (tech.GetType() == typeof(Distractor)) { tech.setActive(false); } } } hey.my_ai.my_dogtag.wave = my_hitme.my_ai.my_dogtag.wave; if (max_number > 0) { decoys.addByID(hey); } break; case DistractorType.Shield: decoy_position.z = 1f; if (my_shield == null) { my_shield = Peripheral.Instance.zoo.getObject(decoy, false).GetComponent <Decoy>(); my_shield.transform.SetParent(transform); my_shield.transform.localPosition = decoy_position; my_shield.transform.localRotation = Quaternion.identity; } my_shield.Init(DistractorType.Shield, my_hitme.my_body); my_shield.gameObject.SetActive(true); break; } }
public HitMeResponse Put(HitMe request) { var game = Cache.Get<CardGame>(request.GameId); if (game == null) throw HttpError.NotFound("Game not found"); if (game.PlayerOneId != request.PlayerId && game.PlayerTwoId != request.PlayerId) throw HttpError.NotFound("Player not found"); var player = game.PlayerOneId == request.PlayerId ? game.PlayerOne : game.PlayerTwo; player.HitMe(game.Deck); game.Events.Add(new CardGameEvent { ClientId = request.PlayerId, GameId = request.GameId, Message = "Player {0} hit".Fmt(player.DisplayName), Type = "HIT" }); Cache.Set(request.GameId, game, TimeSpan.FromHours(1)); var result = new HitMeResponse(); return result; }
public float Init(HitMe _hitme, float[] stats, EffectType type, EffectSubType sub_type) { if (_hitme.my_body.amHidden()) { return(0); } my_ai = _hitme.my_ai; // Debug.Log("Stats " + stats[0] + " " + stats[1] + " " + stats[2] + "\n"); my_time = 0; start = false; bool was_already_active = is_active; is_active = true; float xp = 0f; if (orig_rotation_inverse_speed_factor == -1) { orig_rotation_inverse_speed_factor = my_ai.rotation_inverse_speed_factor; } float aff = Get.getPercent(stats[0]); // Debug.Log("SPEED AFF " + stats[0] + " -> " + aff + "\n"); float original_aff = aff; if (aff < 0) { aff = 0; } if (aff > 0.99f) { aff = 0.99f; } bool froze = false; if (sub_type == EffectSubType.Freeze) { float pct_freeze = stats[3]; float roll = UnityEngine.Random.Range(0f, 100f); if (roll < pct_freeze) { Debug.Log("FREEZING " + my_ai.gameObject.name + " for " + stats[5] + "\n"); aff = 0f; froze = true; StatBit[] sb = new StatBit[1]; lifetime = stats[5]; time_to_normal = stats[5]; sb[0] = new StatBit(EffectType.Weaken, stats[4], 1, false); sb[0].effect_sub_type = EffectSubType.Freeze; sb[0].very_dumb = true; sb[0].dumb = true; StatSum weaken = new StatSum(3, 0, sb, RuneType.Airy); _hitme.HurtMe(weaken, null, EffectType.Null); } } if (froze) { _hitme.EnableVisuals(MonsterType.Freeze, lifetime); } else { _hitme.EnableVisuals(MonsterType.Speed, lifetime); } //Speed lifetime = stats[2]; time_to_normal = stats[1]; float final = my_ai.speed * aff; /* this makes speed lavas ineffective * if (was_already_active) * { * float current_speed_factor = my_ai.current_speed / my_ai.speed; * float new_factor = (2 * aff + current_speed_factor) / 3f; * final = new_factor * my_ai.speed; * Debug.Log("Speed acting again, current speed factor " + current_speed_factor + " new_factor " + new_factor + " instead of " + aff + "\n"); * }*/ // Debug.Log(my_ai.gameObject.name + " SETTING SPEED FROM (" + original_aff + ") " + my_ai.speed + " TO " + final + " AFF " + aff + " FOR " + lifetime + "\n"); my_ai.Stunned = true; my_ai.current_speed = final; xp = lifetime * (my_ai.speed - my_ai.current_speed) / my_ai.speed; // Debug.Log(stats[0] + " " + aff + " time to normal " + time_to_normal + "\n"); //Debug.Log("stat " + stats[0] + " aff " + aff + " xp " + xp + " lifetime " + lifetime + " speed " + my_ai.speed + " current_speed " + my_ai.current_speed + "\n"); return(xp / 5f); //return 0; }
public float Init(HitMe _hitme, float[] stats) { percent_increase = Get.getPercent(stats[0]); lifetime = stats[1]; my_time = 0; _hitme.EnableVisuals(MonsterType.Wishful, lifetime); if (is_active) { return(percent_increase); } my_hitme = _hitme; is_active = true; // Debug.Log("initializing wish catcher: percent increase " + percent_increase + " for " + lifetime + "\n"); original_wish_list = new List <Wish>(); finisher_percent = (stats.Length == StaticStat.StatLength(EffectType.WishCatcher, true)) ? stats[2] : 0; bool finisher = (finisher_percent > 0 && UnityEngine.Random.RandomRange(0, 1) < finisher_percent); if (finisher) { lifetime = stats[1] * 2f; //some other stuff as well like add health and other nice wishes } original_wish_list = CloneUtil.copyList(_hitme.stats.inventory); bool have_health = false; bool have_damage = false; bool have_dreams = false; Debug.Log("Wishcatcher " + stats[0] + " -> " + percent_increase + "\n"); foreach (Wish w in _hitme.stats.inventory) { w.percent *= (1 + percent_increase); // Debug.Log("Setting " + _hitme.gameObject.name + " " + w.type + " to " + w.strength + "\n"); if (finisher) { w.percent *= (1 + finisher_percent); if (w.type == WishType.MoreHealth) { have_health = true; } if (w.type == WishType.MoreDreams) { have_dreams = true; } if (w.type == WishType.MoreDamage) { have_damage = true; } } } if (finisher && !have_health) { _hitme.stats.inventory.Add(new Wish(WishType.MoreHealth, 1, finisher_percent)); } if (finisher && !have_dreams) { _hitme.stats.inventory.Add(new Wish(WishType.MoreDreams, 0.25f, finisher_percent)); } if (finisher && !have_damage) { _hitme.stats.inventory.Add(new Wish(WishType.MoreDamage, 0.25f, finisher_percent)); } return(percent_increase); }
void GetVictims() { if (monsters == null) { monsters = Peripheral.Instance.targets; } HitMe closest_target = null; float closest_distance = 999f; bool previous_status = halo_active; List <HitMe> targets = new List <HitMe>(); // Debug.Log("Potential targets " + monsters.Count + " range is " + range + " tilesize " + tileSize + "\n"); for (int i = 0; i < monsters.max_count; i++) { HitMe enemy = monsters.array[i]; if (enemy == null || enemy.amDying() || !enemy.gameObject.activeSelf) { continue; } float distance = Vector2.Distance(enemy.transform.position, transform.position); if (distance < closest_distance) { closest_target = enemy; closest_distance = distance; } if (distance < my_firearm.getCurrentRange() * tileSize) { targets.Add(enemy); halo_active = true; } } // Debug.Log("Got " + targets.Count + " victims, previous status is " + previous_status + "\n"); if (targets.Count > 0) { type = my_firearm.toy.rune.GetStats(false); if (previous_status == false) { if (my_calamity != null) { StatBit bit = type.GetStatBit(EffectType.Calamity); if (bit != null) { my_calamity.Init(bit, closest_target, my_firearm, EffectType.Calamity); } } if (my_foil != null) { StatBit bit = type.GetStatBit(EffectType.Foil); if (bit != null) { my_foil.Init(bit, closest_target, my_firearm, EffectType.Foil); } } if (my_swarm != null) { StatBit bit = type.GetStatBit(EffectType.Swarm); if (bit != null) { my_swarm.Init(bit, transform, my_firearm, EffectType.Swarm); } } } } // Debug.Log("Gonna hurt " + targets.Count + " victims\n"); for (int i = 0; i < targets.Count; i++) { targets[i].HurtMe(type, my_firearm, EffectType.Null); if (my_wish_catcher != null) { StatBit bit = type.GetStatBit(EffectType.WishCatcher); if (bit != null) { my_wish_catcher.Init(targets[i], bit.getStats()); } } } if (!previous_status && halo_active) { ShowHalo(true); if (!previous_status) { my_firearm.UseAmmo(); } if (previous_status == false) { } } }