예제 #1
0
 public override void OnHit(HitInfo info, HitResult hitResult)
 {
     if (hitResult != HitResult.Invalid)
     {
         FSMUtility.SendEventToGameObject(info.Attacker, "DEALT DAMAGE", false);
     }
 }
        private void Start()
        {
            gameObject.transform.position = new Vector3(0f, 2.77f, -20f); // Dunno why, but it's in the FSM and seems to work. May work without but w/e.
            PlayMakerFSM.BroadcastEvent("CHARM MSG");
            FSMUtility.SendEventToGameObject(gameObject, "UP", true);

            StartCoroutine(WaitForTimeout());
        }
        private void Close()
        {
            if (_ableToClose)
            {
                _ableToClose = false;
                PlayMakerFSM.BroadcastEvent("CHARM MSG DOWN");
                FSMUtility.SendEventToGameObject(gameObject, "DOWN", true);

                Destroy(gameObject, 0.25f);
            }
        }
예제 #4
0
        // Taken and modified from https://github.com/5FiftySix6/HollowKnight.Lost-Lord/blob/master/LostLord/Kin.cs
        private void ReceiveHit(On.InfectedEnemyEffects.orig_RecieveHitEffect orig, InfectedEnemyEffects self, float attack_direction)
        {
            if (self.GetAttr <bool>("didFireThisFrame"))
            {
                return;
            }

            if (self.GetAttr <SpriteFlash>("spriteFlash") != null)
            {
                self.GetAttr <SpriteFlash>("spriteFlash").flashFocusHeal();
            }

            FSMUtility.SendEventToGameObject(gameObject, "DAMAGE FLASH", true);
            self.GetAttr <AudioEvent>("impactAudio").SpawnAndPlayOneShot(self.GetAttr <AudioSource>("audioSourcePrefab"), self.transform.position);
            self.SetAttr("didFireThisFrame", true);
        }
예제 #5
0
        public static GameObject ShowAdditive(BigItemDef[] items, GameObject fsmObj = null, string eventName = null)
        {
            int count = items.Count(item => RandomizerMod.Instance.Settings.GetBool(false, item.Name));

            if (count < items.Length)
            {
                return(Show(items[count], fsmObj, eventName));
            }

            // In case of failure to give item, prevent soft lock
            if (fsmObj != null && eventName != null)
            {
                FSMUtility.SendEventToGameObject(fsmObj, eventName);
            }

            return(null);
        }
예제 #6
0
        public static GameObject ShowAdditive(BigItemDef[] items, GameObject fsmObj = null, string eventName = null)
        {
            for (int i = 0; i < items.Length; i++)
            {
                if (!Ref.PD.GetBool(items[i].BoolName))
                {
                    return(Show(items[i], fsmObj, eventName));
                }
            }

            // In case of failure to give item, prevent soft lock
            if (fsmObj != null && eventName != null)
            {
                FSMUtility.SendEventToGameObject(fsmObj, eventName);
            }

            return(null);
        }
예제 #7
0
        // This function does damage to the enemy using the damage numbers given by the weapon type
        public static void HitEnemy(HealthManager targetHP, int expectedDamage, HitInstance hitInstance, int soulGain)
        {
            int realDamage = expectedDamage;

            //TODO: this specifics might add up later, Moss Charger is just one of the few except and there maybe many more
            int        cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform));
            GameObject blockHitPrefab    = targetHP.GetAttr <GameObject>("blockHitPrefab");

            bool specialEnemy = (targetHP.name.Contains("Charger"));

            if (targetHP.IsBlockingByDirection(cardinalDirection, AttackTypes.Nail) && !specialEnemy || realDamage <= 0)
            {
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false);
                GameObject blockHit = blockHitPrefab.Spawn();
                blockHit.transform.position = targetHP.transform.position;
                blockHit.transform.Rotate(new Vector3(0, 0, 90 * cardinalDirection));
                return;
            }



            //bool specialEnemy = (targetHP.name.Contains("Moss Charger") || targetHP.name.Contains("Mushroom Brawler"));

            //if (targetHP.IsInvincible && !specialEnemy && !PlayerData.instance.equippedCharm_25)
            //{
            //    GameObject blockHit = blockHitPrefab.Spawn();
            //    blockHit.transform.position = targetHP.transform.position;
            //   return;
            //}

            if (targetHP.gameObject.name.Contains("Blocker"))
            {
                realDamage = realDamage * 4;
            }

            Recoil recoil = targetHP.gameObject.GetComponent <Recoil>();

            if (recoil != null && PlayerData.instance.equippedCharm_15)
            {
                recoil.RecoilByDirection(cardinalDirection, 0.8f);
            }

            if (realDamage <= 0)
            {
                return;
            }

            if (targetHP == null)
            {
                return;
            }

            /*
             * Play animations and such...
             * Mostly code copied from the healthmanager class itself.
             */

            //Modding.Logger.Log("Cardinal is " + cardinalDirection);
            FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO");

            if (sendHitGO != null)
            {
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            }

            GameObject HitPrefab    = targetHP.GetAttr <GameObject>("strikeNailPrefab");
            GameObject ImpactPrefab = targetHP.GetAttr <GameObject>("slashImpactPrefab");
            Vector3?   effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin");

            if (HitPrefab != null && effectOrigin != null)
            {
                HitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }
            if (ImpactPrefab != null && effectOrigin != null)
            {
                ImpactPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false);
            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TAKE DAMAGE", false);

            FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false);
            FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false);


            // Actually do damage to target.
            try
            {
                //TODO: change this audio source
                //HeroController.instance.spellControl.gameObject.GetComponent<AudioSource>().PlayOneShot(LoadAssets.enemyHurtSFX[soundRandom.Next(0, 2)]);
                LoadAssets.sfxDictionary.TryGetValue("enemyhurt" + soundRandom.Next(1, 4) + ".wav", out AudioClip ac);
                HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(ac);
            }
            catch (Exception e)
            {
                Modding.Logger.Log("Enemy Hurt Exception Thrown " + e);
            }

            if (targetHP.damageOverride)
            {
                targetHP.hp -= 1;
            }
            else
            {
                targetHP.hp -= realDamage; // the actual damage
                HeroController.instance.AddMPCharge(soulGain);
            }

            // Trigger Kill animation
            if (targetHP.hp <= 0f)
            {
                LoadAssets.sfxDictionary.TryGetValue("enemydead" + soundRandom.Next(1, 4) + ".wav", out AudioClip ac);
                HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(ac);
                targetHP.Die(cardinalDirection * 90, AttackTypes.Spell, true);
                HeroController.instance.AddMPCharge(3);
                return;
            }


            bool?  hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation");
            string alternateHitAnimation    = targetHP.GetAttr <string>("alternateHitAnimation");

            if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null)
            {
                targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation);
            }


            PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component =>
                                                                                                            component.FsmName == "Stun Control" || component.FsmName == "Stun");

            if (stunControlFSM != null)
            {
                //stunControlFSM.SendEvent("STUN DAMAGE");
            }

            /*
             * Uncomment below for a sick looking enter the gungeon style freeze frame or for camera shake.
             */
            //GameManager.instance.FreezeMoment(1);
            //GameCameras.instance.cameraShakeFSM.SendEvent("EnemyKillShake");
            SpriteFlash f = targetHP.gameObject.GetComponent <SpriteFlash>();

            if (f != null)
            {
                f.flashInfected();
            }
        }
예제 #8
0
        private IEnumerator ShowPopup()
        {
            // Check for skipping popup
            Coroutine skipCoroutine = StartCoroutine(LookForShowInstantly());

            // Begin dimming the scene
            GameObject dimmer = CanvasUtil.CreateImagePanel(gameObject, BlackPixel,
                                                            new CanvasUtil.RectData(Vector2.zero, Vector2.zero, Vector2.zero, Vector2.one));

            dimmer.GetComponent <Image>().preserveAspect = false;
            CanvasGroup dimmerCG = dimmer.AddComponent <CanvasGroup>();

            dimmerCG.blocksRaycasts = false;
            dimmerCG.interactable   = false;
            dimmerCG.alpha          = 0;

            StartCoroutine(FadeInCanvasGroup(dimmerCG));

            yield return(WaitForSeconds(0.1f));

            // Aim for 400 high prompt image
            float   scaler = _imagePrompt.texture.height / 400f;
            Vector2 size   = new Vector2(_imagePrompt.texture.width / scaler, _imagePrompt.texture.height / scaler);

            // Begin fading in the top bits of the popup
            GameObject topImage = CanvasUtil.CreateImagePanel(gameObject, _imagePrompt,
                                                              new CanvasUtil.RectData(size, Vector2.zero, new Vector2(0.5f, 0.75f), new Vector2(0.5f, 0.8f)));
            GameObject topTextOne = CanvasUtil.CreateTextPanel(gameObject, _takeText, 34, TextAnchor.MiddleCenter,
                                                               new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.55f),
                                                                                       new Vector2(0.5f, 0.55f)), Fonts.Get("Perpetua"));
            GameObject topTextTwo = CanvasUtil.CreateTextPanel(gameObject, _nameText, 76, TextAnchor.MiddleCenter,
                                                               new CanvasUtil.RectData(new Vector2(1920, 300), Vector2.zero, new Vector2(0.5f, 0.49f),
                                                                                       new Vector2(0.5f, 0.49f)));

            CanvasGroup topImageCG   = topImage.AddComponent <CanvasGroup>();
            CanvasGroup topTextOneCG = topTextOne.AddComponent <CanvasGroup>();
            CanvasGroup topTextTwoCG = topTextTwo.AddComponent <CanvasGroup>();

            topImageCG.blocksRaycasts = false;
            topImageCG.interactable   = false;
            topImageCG.alpha          = 0;

            topTextOneCG.blocksRaycasts = false;
            topTextOneCG.interactable   = false;
            topTextOneCG.alpha          = 0;

            topTextTwoCG.blocksRaycasts = false;
            topTextTwoCG.interactable   = false;
            topTextTwoCG.alpha          = 0;

            StartCoroutine(FadeInCanvasGroup(topImageCG));
            StartCoroutine(FadeInCanvasGroup(topTextOneCG));
            yield return(StartCoroutine(FadeInCanvasGroup(topTextTwoCG)));

            // Animate the middle fleur
            GameObject fleur = CanvasUtil.CreateImagePanel(gameObject, Frames[0],
                                                           new CanvasUtil.RectData(new Vector2(Frames[0].texture.width / 1.6f, Frames[0].texture.height / 1.6f),
                                                                                   Vector2.zero, new Vector2(0.5f, 0.4125f), new Vector2(0.5f, 0.4125f)));

            yield return(StartCoroutine(AnimateFleur(fleur, 12)));

            yield return(WaitForSeconds(0.25f));

            // Fade in the remaining text
            GameObject botTextOne = CanvasUtil.CreateTextPanel(gameObject, _buttonText, 34, TextAnchor.MiddleCenter,
                                                               new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.335f),
                                                                                       new Vector2(0.5f, 0.335f)), Fonts.Get("Perpetua"));
            GameObject botTextTwo = CanvasUtil.CreateTextPanel(gameObject, _descOneText, 34, TextAnchor.MiddleCenter,
                                                               new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.26f),
                                                                                       new Vector2(0.5f, 0.26f)), Fonts.Get("Perpetua"));
            GameObject botTextThree = CanvasUtil.CreateTextPanel(gameObject, _descTwoText, 34, TextAnchor.MiddleCenter,
                                                                 new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.205f),
                                                                                         new Vector2(0.5f, 0.205f)), Fonts.Get("Perpetua"));

            CanvasGroup botTextOneCG   = botTextOne.AddComponent <CanvasGroup>();
            CanvasGroup botTextTwoCG   = botTextTwo.AddComponent <CanvasGroup>();
            CanvasGroup botTextThreeCG = botTextThree.AddComponent <CanvasGroup>();

            botTextOneCG.blocksRaycasts = false;
            botTextOneCG.interactable   = false;
            botTextOneCG.alpha          = 0;

            botTextTwoCG.blocksRaycasts = false;
            botTextTwoCG.interactable   = false;
            botTextTwoCG.alpha          = 0;

            botTextThreeCG.blocksRaycasts = false;
            botTextThreeCG.interactable   = false;
            botTextThreeCG.alpha          = 0;

            yield return(StartCoroutine(FadeInCanvasGroup(botTextOneCG)));

            StartCoroutine(FadeInCanvasGroup(botTextTwoCG));
            yield return(StartCoroutine(FadeInCanvasGroup(botTextThreeCG)));

            yield return(WaitForSeconds(1.5f));

            // Can I offer you an egg in this trying time?
            GameObject egg = CanvasUtil.CreateImagePanel(gameObject, AreaRando.GetSprite("UI.egg"),
                                                         new CanvasUtil.RectData(
                                                             new Vector2(AreaRando.GetSprite("UI.egg").texture.width / 1.65f,
                                                                         AreaRando.GetSprite("UI.egg").texture.height / 1.65f), Vector2.zero,
                                                             new Vector2(0.5f, 0.1075f), new Vector2(0.5f, 0.1075f)));
            CanvasGroup eggCG = egg.AddComponent <CanvasGroup>();

            eggCG.blocksRaycasts = false;
            eggCG.interactable   = false;
            eggCG.alpha          = 0;

            // Should wait for one fade in, don't want to poll input immediately
            yield return(FadeInCanvasGroup(eggCG));

            // Stop doing things instantly before polling input
            if (!_showInstantly)
            {
                StopCoroutine(skipCoroutine);
            }

            _showInstantly = false;

            // Save the coroutine to stop it later
            Coroutine coroutine = StartCoroutine(BlinkCanvasGroup(eggCG));

            // Wait for the user to cancel the menu
            while (true)
            {
                HeroActions actions = Ref.Input.inputActions;
                if (actions.jump.WasPressed || actions.attack.WasPressed || actions.menuCancel.WasPressed)
                {
                    break;
                }

                yield return(new WaitForEndOfFrame());
            }

            // Fade out the full popup
            yield return(FadeOutCanvasGroup(gameObject.GetComponent <CanvasGroup>()));

            // Small delay before hero control
            yield return(WaitForSeconds(0.75f));

            // Optionally send FSM event after finishing
            if (_fsmObj != null && _fsmEvent != null)
            {
                FSMUtility.SendEventToGameObject(_fsmObj, _fsmEvent);
            }

            // Stop the egg routine and destroy everything
            StopCoroutine(coroutine);
            Destroy(gameObject);
        }
예제 #9
0
        // This function does damage to the enemy using the damage numbers given by the weapon type
        public static void HitEnemy(HealthManager targetHP, int damageDealt, HitInstance hitInstance, int soulGain, BulletBehaviour hpbb)
        {
            //TODO: this specifics might add up later, Moss Charger is just one of the few except and there maybe many more
            if (targetHP == null)
            {
                return;
            }

            int        cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform));
            GameObject blockHitPrefab    = targetHP.GetAttr <GameObject>("blockHitPrefab");

            bool specialEnemy = (targetHP.name.Contains("Charger"));

            if (targetHP.IsBlockingByDirection(cardinalDirection, AttackTypes.Nail) && !specialEnemy || damageDealt <= 0)
            {
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false);
                GameObject blockHit = blockHitPrefab.Spawn();
                blockHit.transform.position = targetHP.transform.position;
                blockHit.transform.Rotate(new Vector3(0, 0, 90 * cardinalDirection));
                return;
            }

            if (damageDealt <= 0)
            {
                return;
            }
            //bool specialEnemy = (targetHP.name.Contains("Moss Charger") || targetHP.name.Contains("Mushroom Brawler"));

            /*
             * if (targetHP.IsInvincible && !specialEnemy && !PlayerData.instance.equippedCharm_25)
             * {
             *  GameObject blockHit = blockHitPrefab.Spawn();
             *  blockHit.transform.position = targetHP.transform.position;
             * return;
             * }
             */

            if (targetHP.gameObject.name.Contains("Blocker")) //double damage baldurs
            {
                damageDealt = damageDealt * 4;
            }

            Recoil recoil = targetHP.gameObject.GetComponent <Recoil>();

            //if (recoil != null && PlayerData.instance.equippedCharm_15)
            if (recoil != null)
            {
                recoil.RecoilByDirection(cardinalDirection, 0.25f);
            }

            /*
             * Mostly code copied from the healthmanager class itself.
             */

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO");

            if (sendHitGO != null)
            {
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            }

            GameObject HitPrefab    = targetHP.GetAttr <GameObject>("strikeNailPrefab");
            GameObject ImpactPrefab = targetHP.GetAttr <GameObject>("slashImpactPrefab");
            Vector3?   effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin");

            if (HitPrefab != null && effectOrigin != null)
            {
                HitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }
            if (ImpactPrefab != null && effectOrigin != null)
            {
                ImpactPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }

            SpriteFlash f = targetHP.gameObject.GetComponent <SpriteFlash>();

            if (f != null)
            {
                f.flashWhiteQuick();
            }

            //Log("SEVERITY: " + ds + " DAMAGE: " + damageDealt);

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false);
            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TAKE DAMAGE", false);

            FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false);
            FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false);

            // Actually do damage to target.

            LoadAssets.sfxDictionary.TryGetValue("enemyhurt" + soundRandom.Next(1, 4) + ".wav", out AudioClip hurtSound);
            HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(hurtSound);

            if (targetHP.damageOverride)
            {
                targetHP.hp -= 1;
            }
            else
            {
                targetHP.hp -= damageDealt; // the actual damage

                //int sg = (ds.Equals(DamageSeverity.Minor)) ? 0 : soulGain;
                HeroController.instance.AddMPCharge(6);
                Stats.IncreaseAdrenalinePoints(damageDealt);
            }

            // Trigger Kill animation
            if (targetHP.hp <= 0f)
            {
                LoadAssets.sfxDictionary.TryGetValue("enemydead" + soundRandom.Next(1, 4) + ".wav", out AudioClip deadSound);
                HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(deadSound);
                targetHP.Die(cardinalDirection * 90, AttackTypes.Spell, true);
                HeroController.instance.AddMPCharge(4);
                GameManager.instance.FreezeMoment(1);
                return;
            }

            bool?  hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation");
            string alternateHitAnimation    = targetHP.GetAttr <string>("alternateHitAnimation");

            if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null)
            {
                targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation);
            }


            PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component =>
                                                                                                            component.FsmName == "Stun Control" || component.FsmName == "Stun");

            if (stunControlFSM != null)
            {
                //stunControlFSM.SendEvent("STUN DAMAGE");
            }

            /*
             * Uncomment below for a sick looking enter the gungeon style freeze frame or for camera shake.
             */
        }
예제 #10
0
        public static void SetShopItems(GameObject shopObj, string[] items)
        {
            ShopMenuStock shop       = shopObj.GetComponent <ShopMenuStock>();
            GameObject    itemPrefab = UObject.Instantiate(shop.stock[0]);

            itemPrefab.transform.SetPosition2D(-1000, -1000);

            // Remove all charm type items from the store
            List <GameObject> newStock = new List <GameObject>();

            foreach (string itemId in items)
            {
                Item item = RandoResources.Items.First(i => i.Id == itemId.Substring(0, itemId.IndexOf('.')));
                if (!item.TryGetNextStage(out ItemStage stage))
                {
                    continue;
                }

                // Create a new shop item for this item def
                GameObject newItemObj = UObject.Instantiate(itemPrefab);

                // Apply all the stored values
                ShopItemStats stats = newItemObj.GetComponent <ShopItemStats>();
                stats.playerDataBoolName     = RandomizerMod.Instance.ItemPlacements[itemId] + "." + itemId;
                stats.nameConvo              = stage.Shop.Name;
                stats.descConvo              = stage.Shop.Description;
                stats.requiredPlayerDataBool = "CheckHasRequired." + RandomizerMod.Instance.ItemPlacements[itemId];
                stats.notchCostBool          = string.Empty;
                stats.cost = RandomizerMod.Instance.ItemCosts[itemId];

                // Need to set all these to make sure the item doesn't break in one of various ways
                stats.priceConvo     = "";
                stats.specialType    = 2;
                stats.charmsRequired = 0;
                stats.relicNumber    = 0;

                // Apply the sprite for the UI
                stats.transform.Find("Item Sprite").gameObject.GetComponent <SpriteRenderer>().sprite =
                    Sprites.Get(stage.Shop.Sprite);

                UObject.Destroy(stats.transform.Find("Item Sprite").gameObject.LocateMyFSM("get_charm_sprite"));

                newStock.Add(newItemObj);
            }

            UObject.Destroy(itemPrefab);

            foreach (GameObject item in shop.stock)
            {
                // Update normal stock (specialType: 0 = lantern, elegant key, quill; 1 = mask, 2 = charm, 3 = vessel, 4-7 = relics, 8 = notch, 9 = map, 10 = simple key, 11 = egg, 12-14 = repair fragile, 15 = salubra blessing, 16 = map pin, 17 = map marker)
                if (item.GetComponent <ShopItemStats>().specialType == 9 || item.GetComponent <ShopItemStats>().playerDataBoolName == "hasQuill")
                {
                    continue;
                }

                string shopBool = item.GetComponent <ShopItemStats>().playerDataBoolName;
                if (!RandoResources.Items.Any(i => i.Stages.Any(s => s.BoolActions.Any(b => b.FieldName == shopBool))) && !shopBool.StartsWith("salubraNotch"))
                {
                    // LogicManager doesn't know about this shop item, which means it's never potentially randomized. Put it back!
                    newStock.Add(item);
                }
            }

            shop.stock = newStock.ToArray();

            // Update alt stock; Sly only
            if (shop.stockAlt != null)
            {
                // Save unchanged list for potential alt stock
                List <GameObject> altStock = new List <GameObject>();
                altStock.AddRange(newStock);

                foreach (GameObject item in shop.stockAlt)
                {
                    string shopBool = item.GetComponent <ShopItemStats>().playerDataBoolName;
                    if (!RandoResources.Items.Any(i => i.Stages.Any(s => s.BoolActions.Any(b => b.FieldName == shopBool))) && !newStock.Contains(item))
                    {
                        altStock.Add(item);
                    }
                }

                shop.stockAlt = altStock.ToArray();
            }

            FSMUtility.SendEventToGameObject(GameObject.Find("Item List"), "RESET");
        }
예제 #11
0
        public static void applyHitInstance(GameObject target, int expectedDamage, GameObject source, float flameGain)
        {
            int realDamage = expectedDamage;

            double multiplier = 1;

            if (PlayerData.instance.GetBool("equippedCharm_25"))
            {
                multiplier *= 1.5;
            }
            if (PlayerData.instance.GetBool("equippedCharm_6") && PlayerData.instance.GetInt("health") == 1)
            {
                multiplier *= 1.75f;
            }

            if (gng_bindings.hasNailBinding())
            {
                multiplier *= 0.3;
            }

            realDamage = (int)Math.Round(realDamage * multiplier);

            if (realDamage <= 0)
            {
                return;
            }

            HealthManager targetHP = getHealthManagerRecursive(target);

            if (targetHP == null)
            {
                return;
            }

            if (GameManager.instance.GetComponent <rebalanced_hooks>() != null)
            {
                GameManager.instance.GetComponent <rebalanced_hooks>().flamePower += flameGain;
            }

            //Modding.Logger.Log("[Redwing] Doing " + realDamage + " damage with attack name " + source.name);

            targetHP.hp -= realDamage;

            if (targetHP.hp <= 0f)
            {
                targetHP.Die(0f, AttackTypes.Nail, true);
                return;
            }

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false);

            FSMUtility.SendEventToGameObject(source, "HIT LANDED", false);
            if ((Object)targetHP.gameObject.GetComponent <DontClinkGates>() != (Object)null)
            {
                return;
            }

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            GameManager.instance.FreezeMoment(1);
            GameCameras.instance.cameraShakeFSM.SendEvent("EnemyKillShake");

            napalm memes = targetHP.gameObject.GetOrAddComponent <napalm>();

            memes.addNapalm(realDamage * (0.10), Color.green);

            /*
             * targetHP.Hit(new HitInstance
             * {
             *  Source = source,
             *  AttackType = damageType,
             *  CircleDirection = false,
             *  DamageDealt = realDamage,
             *  Direction = 0f,
             *  IgnoreInvulnerable = true,
             *  MagnitudeMultiplier = 1f,
             *  MoveAngle = 0f,
             *  MoveDirection = false,
             *  Multiplier = 1f,
             *  SpecialType = SpecialTypes.None,
             *  IsExtraDamage = false
             * });*/
        }
예제 #12
0
        private void DoDamage(ColliderInfo target)
        {
            if (Damage <= 0)
            {
                return;
            }

            Component c = target.Responder as Component;

            if (c == null)
            {
                return;
            }

            FSMUtility.SendEventToGameObject(c.gameObject, "TAKE DAMAGE");

            HitInstance hit = new HitInstance
            {
                Source              = gameObject,
                AttackType          = Type,
                CircleDirection     = false,
                DamageDealt         = Damage,
                IgnoreInvulnerable  = false,
                MagnitudeMultiplier = 0,
                MoveAngle           = 0,
                MoveDirection       = false,
                Multiplier          = 1,
                SpecialType         = SpecialTypes.None,
                IsExtraDamage       = false
            };

            if (target.Responder is HealthManager hm)
            {
                float oldIframes = 0f;
                if (BypassIframes)
                {
                    oldIframes = ReflectionHelper.GetAttr <HealthManager, float>(hm, "evasionByHitRemaining");
                    ReflectionHelper.SetAttr(hm, "evasionByHitRemaining", 0f);
                }

                PlayMakerFSM stunFSM = null;
                if (BypassStun)
                {
                    stunFSM = ReflectionHelper.GetAttr <HealthManager, PlayMakerFSM>(hm, "stunControlFSM");
                    ReflectionHelper.SetAttr(hm, "stunControlFSM", (PlayMakerFSM)null);
                }

                hm.Hit(hit);

                if (BypassIframes)
                {
                    ReflectionHelper.SetAttr(hm, "evasionByHitRemaining", oldIframes);
                }

                if (BypassStun)
                {
                    ReflectionHelper.SetAttr(hm, "stunControlFSM", stunFSM);
                }
            }
            else
            {
                target.Responder.Hit(hit);
            }

            if (GainSoul)
            {
                Ref.Hero.SoulGain();
            }
        }
예제 #13
0
        // This function does damage to the enemy using the damage numbers given by the weapon type
        public static void hitEnemy(HealthManager targetHP, int expectedDamage, HitInstance hitInstance, int soulGain)
        {
            int realDamage = expectedDamage;

            // TODO: Add possible optional damage multiplier information below.

            /*
             * double multiplier = 1;
             * if (PlayerData.instance.GetBool("equippedCharm_25"))
             * {
             *  multiplier *= 1.5;
             * }
             * if (PlayerData.instance.GetBool("equippedCharm_6") && PlayerData.instance.GetInt("health") == 1)
             * {
             *  multiplier *= 1.75f;
             * }
             *
             * if (gng_bindings.hasNailBinding())
             * {
             *  multiplier *= 0.3;
             * }
             * realDamage = (int) Math.Round(realDamage * multiplier);
             *
             */

            if (realDamage <= 0)
            {
                return;
            }

            if (targetHP == null)
            {
                return;
            }


            /*
             * Play animations and such...
             * Mostly code copied from the healthmanager class itself.
             */

            int cardinalDirection =
                DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform));

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);


            GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO");

            if (sendHitGO != null)
            {
                Log("Wow I did reflection correctly");
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            }

            GameObject fireballHitPrefab = targetHP.GetAttr <GameObject>("fireballHitPrefab");
            Vector3?   effectOrigin      = targetHP.GetAttr <Vector3?>("effectOrigin");

            if (fireballHitPrefab != null && effectOrigin != null)
            {
                Log("Wow I did reflection correctly x2");
                fireballHitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }


            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false);

            if ((UnityEngine.Object)targetHP.GetComponent <Recoil>() != (UnityEngine.Object)null)
            {
                targetHP.GetComponent <Recoil>().RecoilByDirection(cardinalDirection, hitInstance.MagnitudeMultiplier);
            }

            FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false);
            FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false);



            // Actually do damage to target.
            if (targetHP.damageOverride)
            {
                targetHP.hp -= 1;
            }
            else
            {
                targetHP.hp -= realDamage;
                HeroController.instance.AddMPCharge(soulGain);
            }

            // Trigger Kill animation
            if (targetHP.hp <= 0f)
            {
                targetHP.Die(0f, AttackTypes.Nail, true);
                return;
            }

            bool?  hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation");
            string alternateHitAnimation    = targetHP.GetAttr <string>("alternateHitAnimation");

            if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null)
            {
                Log("Wow I did reflection correctly x3");
                targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation);
            }

            PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component =>
                                                                                                            component.FsmName == "Stun Control" || component.FsmName == "Stun");

            if (stunControlFSM != null)
            {
                stunControlFSM.SendEvent("STUN DAMAGE");
            }

            /*
             * Uncomment below for a sick looking enter the gungeon style freeze frame or for camera shake.
             */

            //GameManager.instance.FreezeMoment(1);
            //GameCameras.instance.cameraShakeFSM.SendEvent("EnemyKillShake");
        }
예제 #14
0
 public override void OnSuccessfulHit(HitInfo info)
 {
     FSMUtility.SendEventToGameObject(info.Attacker, "HIT LANDED", false);
 }
예제 #15
0
        //+++DAMAGE OVERRIDE+++
        public static void DamageEnemyOverride(HealthManager targetHP, int damageDealt, HitInstance hitInstance, int soulGain, BulletBehaviour hpbb)
        {
            //TODO: this specifics might add up later, Moss Charger is just one of the few except and there maybe many more
            if (targetHP == null)
            {
                return;
            }

            int        cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform));
            GameObject blockHitPrefab    = targetHP.GetAttr <GameObject>("blockHitPrefab");

            bool specialEnemy = (targetHP.name.Contains("Charger"));

            if (targetHP.IsBlockingByDirection(cardinalDirection, AttackTypes.Nail) && !specialEnemy)
            {
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false);
                GameObject blockHit = blockHitPrefab.Spawn();
                blockHit.transform.position = targetHP.transform.position;
                blockHit.transform.Rotate(new Vector3(0, 0, 90 * cardinalDirection));
                return;
            }

            if (false && !targetHP.IsInvincible) //enable disable damage overtime
            {
                EnemyDamageOvertime dm = targetHP.gameObject.GetComponent <EnemyDamageOvertime>();
                if (dm == null)
                {
                    targetHP.gameObject.AddComponent <EnemyDamageOvertime>();
                }
                else
                {
                    dm.IncreaseStack();
                }
            }

            //bool specialEnemy = (targetHP.name.Contains("Moss Charger") || targetHP.name.Contains("Mushroom Brawler"));

            /*
             * if (targetHP.IsInvincible && !specialEnemy && !PlayerData.instance.equippedCharm_25)
             * {
             *  GameObject blockHit = blockHitPrefab.Spawn();
             *  blockHit.transform.position = targetHP.transform.position;
             * return;
             * }
             */
            if (targetHP.gameObject.name.Contains("Blocker")) //double damage baldurs
            {
                damageDealt = damageDealt * 4;
            }

            Recoil recoil = targetHP.gameObject.GetComponent <Recoil>();

            //if (recoil != null && PlayerData.instance.equippedCharm_15)
            if (recoil != null)
            {
                recoil.RecoilByDirection(cardinalDirection, 0.25f);
            }

            /*
             * Mostly code copied from the healthmanager class itself.
             */

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO");

            if (sendHitGO != null)
            {
                FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false);
            }

            GameObject HitPrefab    = targetHP.GetAttr <GameObject>("strikeNailPrefab");
            GameObject ImpactPrefab = targetHP.GetAttr <GameObject>("slashImpactPrefab");
            Vector3?   effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin");

            if (HitPrefab != null && effectOrigin != null)
            {
                HitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }
            if (ImpactPrefab != null && effectOrigin != null)
            {
                ImpactPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f);
            }
            SpriteFlash f = targetHP.gameObject.GetComponent <SpriteFlash>();

            if (f != null)
            {
                f.flashWhiteQuick();
            }

            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false);
            FSMUtility.SendEventToGameObject(targetHP.gameObject, "TAKE DAMAGE", false);
            FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false);
            FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false);

            // Actually do damage to target.
            LoadAssets.sfxDictionary.TryGetValue("enemyhurt" + rand.Next(1, 4) + ".wav", out AudioClip hurtSound);
            HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(hurtSound);

            if (targetHP.damageOverride)
            {
                targetHP.hp -= 1;
            }
            else
            {
                targetHP.hp -= damageDealt; // the actual damage
                if (hpbb.canGainEnergyCharges)
                {
                    HeroController.instance.AddMPCharge(Stats.instance.current_soulGainedPerHit);
                }
                Stats.instance.IncreaseAdrenalineChargeEnergy();
                //TODO: change this audio source location to the sound handler
                AudioHandler.instance.PlayMiscSoundEffect(AudioHandler.HollowPointSoundType.EnemyHitSFXGO);
            }
            // Trigger Enemy Kill
            if (targetHP.hp <= 0f)
            {
                EnemyDeathEvent(targetHP, cardinalDirection, true);
                return;
            }

            bool?  hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation");
            string alternateHitAnimation    = targetHP.GetAttr <string>("alternateHitAnimation");

            if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null)
            {
                targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation);
            }

            PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component => component.FsmName == "Stun Control" || component.FsmName == "Stun");
            //if (stunControlFSM != null) stunControlFSM.SendEvent("STUN DAMAGE");
        }