Example #1
0
        void SetFoeName()
        {
            // Set type name with fallback
            MobileEnemy enemy;

            if (EnemyBasics.GetEnemy(foeType, out enemy))
            {
                typeName = enemy.Name;
            }
            else
            {
                typeName = foeType.ToString();
            }

            // Monster types get a random monster name
            // Always treating monsters as male for now as they don't have any gender in game files
            if ((int)foeType < 128)
            {
                DFRandom.srand(DateTime.Now.Millisecond);
                displayName = DaggerfallUnity.Instance.NameHelper.MonsterName();
                return;
            }

            // Randomly assign a gender for humanoid foes
            humanoidGender = (UnityEngine.Random.Range(0.0f, 1.0f) < 0.5f) ? Genders.Male : Genders.Female;

            // Create a random display name for humanoid foes
            DFRandom.srand(DateTime.Now.Millisecond);
            NameHelper.BankTypes nameBank = GameManager.Instance.PlayerGPS.GetNameBankOfCurrentRegion();
            displayName = DaggerfallUnity.Instance.NameHelper.FullName(nameBank, humanoidGender);
        }
Example #2
0
        void SetFoeName()
        {
            // Set type name with fallback
            MobileEnemy enemy;

            if (EnemyBasics.GetEnemy(foeType, out enemy))
            {
                typeName = enemy.Name;
            }
            else
            {
                typeName = foeType.ToString();
            }

            // Monster types get a random monster name
            // Always treating monsters as male for now as they don't have any gender in game files
            if ((int)foeType < 128)
            {
                DFRandom.srand(DateTime.Now.Millisecond);
                displayName = DaggerfallUnity.Instance.NameHelper.MonsterName();
                return;
            }

            // TODO: Create a random humanoid foe name
            // Will get to this testing quests that assign player to defeat and return a class-based NPC Foe
            // Have more problems to solve before getting to name
        }
    // Düşmanla etkileşime girince yaılacaklar
    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.tag == "Enemy")
        {
            EnemyBasics frog = other.gameObject.GetComponent <EnemyBasics>();

            //Sadece yukardan gelirsek  yok edilecek düşman
            if (state == State.falling)
            {
                frog.JumpedOn();
                Jump();
            }

            else
            {
                state = State.hurt;
                if (other.gameObject.transform.position.x > transform.position.x)
                {
                    // düşman sağda,  hasar alacam ve sola gidecek
                    playerRb.velocity = new Vector2(-hurtDamage, playerRb.velocity.y);
                }

                else
                {
                    //düşmaan solda hasar alacam ve sağa gidecek
                    playerRb.velocity = new Vector2(hurtDamage, playerRb.velocity.y);
                }
            }
        }
    }
Example #4
0
        public void Die()
        {
            if (!mobile)
            {
                return;
            }

            // Get corpse marker texture indices
            int archive, record;

            EnemyBasics.ReverseCorpseTexture(mobile.Summary.Enemy.CorpseTexture, out archive, out record);

            // Leave corpse marker
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (dfUnity)
            {
                // Spawn marker
                GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(archive, record, transform.parent, true);
                go.transform.position = transform.position;

                // Align to ground. Be generous with distance as flying enemies might have a way to drop.
                // This could also be hanlded by adding a Rigidbody and collider then let gravity do the work.
                GameObjectHelper.AlignBillboardToGround(go, go.GetComponent <DaggerfallBillboard>().Summary.Size, 16f);
            }

            // Disable enemy gameobject and schedule for destruction
            gameObject.SetActive(false);
            GameObject.Destroy(gameObject);
        }
            public override string HeldSoul()
            {   // %hs
                if (parent.trappedSoulType == MobileTypes.None)
                {
                    return(HardStrings.Nothing);
                }
                MobileEnemy soul;

                EnemyBasics.GetEnemy(parent.trappedSoulType, out soul);
                return(soul.Name);
            }
            public override string HeldSoul()
            {   // %hs
                if (parent.trappedSoulType == MobileTypes.None)
                {
                    return(TextManager.Instance.GetLocalizedText("Nothing"));
                }
                MobileEnemy soul;

                EnemyBasics.GetEnemy(parent.trappedSoulType, out soul);
                return(TextManager.Instance.GetLocalizedEnemyName(soul.ID));
            }
        /// <summary>
        /// Set special transformation completed, e.g. Daedra Seducer into winged form.
        /// Used internally by mobile unit after playing seducer animations.
        /// Called when restoring save game if unit has raised transformation completed flag.
        /// </summary>
        public void SetSpecialTransformationCompleted()
        {
            switch ((MobileTypes)summary.Enemy.ID)
            {
            case MobileTypes.DaedraSeducer:
                summary.Enemy.Behaviour         = MobileBehaviour.Flying;
                summary.Enemy.CorpseTexture     = EnemyBasics.CorpseTexture(400, 5);
                summary.Enemy.HasIdle           = false;
                summary.Enemy.HasSpellAnimation = true;
                summary.Enemy.SpellAnimFrames   = new int[] { 0, 1, 2, 3 };
                break;
            }

            summary.specialTransformationCompleted = true;
        }
Example #8
0
 void OnTriggerEnter2D(Collider2D col)
 {
     if (!col.gameObject.tag.Equals("EditorOnly") && !col.gameObject.tag.Equals("Player"))
     {
         if (col.gameObject.tag.Equals("Enemy"))
         {
             EnemyBasics enemy = col.gameObject.GetComponent <EnemyBasics>();
             if (enemy != null)
             {
                 enemy.Death();
             }
         }
         print(col.gameObject.tag);
         Destroy(gameObject);
     }
 }
Example #9
0
        public void PlaceCorpseMarker(int corpseTexture)
        {
            // Get corpse marker texture indices
            int archive, record;

            EnemyBasics.ReverseCorpseTexture(corpseTexture, out archive, out record);

            // Spawn corpse marker
            GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(archive, record, transform.parent, true);

            go.transform.position = transform.position;

            // Align to ground. Be generous with distance as flying enemies might have a way to drop.
            // This could also be handled by adding a Rigidbody and collider then let gravity do the work.
            // TODO: Ensure corpse markers never land on top of other monsters
            GameObjectHelper.AlignBillboardToGround(go, go.GetComponent <DaggerfallBillboard>().Summary.Size, 16f);
        }
Example #10
0
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateEnemyItems(ItemCollection collection, int[] traits, EnemyEntity enemyEnt)
        {
            DaggerfallEntity enemy = enemyEnt as DaggerfallEntity;

            int[] enemyPredefLootTableProperties;
            int[] enemyExtraLootProperties;

            enemyPredefLootTableProperties = EnemyBasics.EnemyPredefLootTableCalculator(enemy, traits);
            enemyExtraLootProperties       = EnemyBasics.EnemyExtraLootCalculator(enemy, traits, enemyPredefLootTableProperties);
            EnemyBasics.TraitExtraLootModCalculator(traits, enemyPredefLootTableProperties, enemyExtraLootProperties, out enemyPredefLootTableProperties, out enemyExtraLootProperties);

            DaggerfallUnityItem[] newitems = LootTables.GenerateEnemyLoot(enemy, traits, enemyPredefLootTableProperties, enemyExtraLootProperties);

            FormulaHelper.ModifyFoundLootItems(ref newitems);

            collection.Import(newitems);
        }
Example #11
0
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateBuildingItems(ItemCollection collection, int[] traits, EnemyEntity enemyEnt = null)
        {
            DaggerfallEntity enemy = enemyEnt as DaggerfallEntity; // This may not work as i'm expecting, will have to see.

            int[] enemyPredefLootTableProperties;
            int[] enemyExtraLootProperties;

            enemyPredefLootTableProperties = EnemyBasics.EnemyPredefLootTableCalculator(enemy, traits);
            enemyExtraLootProperties       = EnemyBasics.EnemyExtraLootCalculator(enemy, traits, enemyPredefLootTableProperties);
            EnemyBasics.TraitExtraLootModCalculator(traits, enemyPredefLootTableProperties, enemyExtraLootProperties, out enemyPredefLootTableProperties, out enemyExtraLootProperties);
            // Now will start actually creating the items based on enemyPredefLootTableProperties and enemyExtraLootProperties, after that is done, likely add the "flavor" items from the traits afterward.

            DaggerfallUnityItem[] newitems = LootTables.GenerateEnemyLoot(enemy, traits, enemyPredefLootTableProperties, enemyExtraLootProperties);

            FormulaHelper.ModifyFoundLootItems(ref newitems);

            collection.Import(newitems);
        }
Example #12
0
        public static GameObject CreateDaggerfallEnemyGameObject(MobileTypes type, Transform parent, MobileReactions reaction)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            // Ensure enemy dict is loaded
            if (enemyDict == null)
            {
                enemyDict = EnemyBasics.GetEnemyDict();
            }

            GameObject go = new GameObject(string.Format("DaggerfallEnemy [{0}]", type.ToString()));

            if (parent)
            {
                go.transform.parent = parent;
            }
            go.transform.forward = Vector3.forward;

            // Add custom tag and script
            go.tag = dfUnity.Option_EnemyTag;
#if UNITY_EDITOR
            if (dfUnity.Option_CustomEnemyScript != null)
            {
                go.AddComponent(dfUnity.Option_CustomEnemyScript.GetClass());
            }
#endif

            // Add child object for enemy billboard
            GameObject mobileObject = new GameObject("DaggerfallMobileUnit");
            mobileObject.transform.parent = go.transform;

            // Add mobile enemy
            Vector2 size = Vector2.one;
            DaggerfallMobileUnit dfMobile = mobileObject.AddComponent <DaggerfallMobileUnit>();
            dfMobile.SetEnemy(dfUnity, enemyDict[(int)type], reaction);
            size = dfMobile.Summary.RecordSizes[0];

            // Add character controller
            if (dfUnity.Option_EnemyCharacterController || dfUnity.Option_EnemyExampleAI)
            {
                CharacterController controller = go.AddComponent <CharacterController>();
                controller.radius     = dfUnity.Option_EnemyRadius;
                controller.height     = size.y;
                controller.slopeLimit = dfUnity.Option_EnemySlopeLimit;
                controller.stepOffset = dfUnity.Option_EnemyStepOffset;

                // Reduce height of flying creatures as their wing animation makes them taller than desired
                // This helps them get through doors while aiming for player eye height
                if (dfMobile.Summary.Enemy.Behaviour == MobileBehaviour.Flying)
                {
                    controller.height /= 2f;
                }

                // Limit maximum height to ensure controller can fit through doors
                // For some reason Unity 4.5 doesn't let you set SkinWidth from code >.<
                if (controller.height > 1.9f)
                {
                    controller.height = 1.9f;
                }
            }

            // Add rigidbody
            if (dfUnity.Option_EnemyRigidbody)
            {
                Rigidbody rigidbody = go.AddComponent <Rigidbody>();
                rigidbody.useGravity  = dfUnity.Option_EnemyUseGravity;
                rigidbody.isKinematic = dfUnity.Option_EnemyIsKinematic;
            }

            // Add capsule collider
            if (dfUnity.Option_EnemyCapsuleCollider)
            {
                CapsuleCollider collider = go.AddComponent <CapsuleCollider>();
                collider.radius = dfUnity.Option_EnemyRadius;
                collider.height = size.y;
            }

            // Add navmesh agent
            if (dfUnity.Option_EnemyNavMeshAgent)
            {
                NavMeshAgent agent = go.AddComponent <NavMeshAgent>();
                agent.radius     = dfUnity.Option_EnemyRadius;
                agent.height     = size.y;
                agent.baseOffset = size.y * 0.5f;
            }

            // Add example AI
            if (dfUnity.Option_EnemyExampleAI)
            {
                // EnemyMotor will also add other required components
                go.AddComponent <Demo.EnemyMotor>();

                // Set sounds
                Demo.EnemySounds enemySounds = go.GetComponent <Demo.EnemySounds>();
                if (enemySounds)
                {
                    enemySounds.MoveSound   = (SoundClips)dfMobile.Summary.Enemy.MoveSound;
                    enemySounds.BarkSound   = (SoundClips)dfMobile.Summary.Enemy.BarkSound;
                    enemySounds.AttackSound = (SoundClips)dfMobile.Summary.Enemy.AttackSound;
                }
            }

            return(go);
        }
Example #13
0
 void ShowSecondaryAttributesGUI()
 {
     EditorGUILayout.Space();
     showSecondaryAttributesFoldout = GUILayoutHelper.Foldout(showSecondaryAttributesFoldout, new GUIContent("Secondary Attributes"), () =>
     {
         GUILayoutHelper.Indent(() =>
         {
             EditorGUILayout.Space();
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("Damage Modifier");
                 EditorGUILayout.SelectableLabel(FormulaHelper.DamageModifier(selectedCareer.Strength).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("Max Encumbrance");
                 EditorGUILayout.SelectableLabel(FormulaHelper.MaxEncumbrance(selectedCareer.Strength).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("Spell Points");
                 EditorGUILayout.SelectableLabel(FormulaHelper.SpellPoints(selectedCareer.Intelligence, selectedCareer.SpellPointMultiplierValue).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("Magic Resist");
                 EditorGUILayout.SelectableLabel(FormulaHelper.MagicResist(selectedCareer.Willpower).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("To Hit Modifier");
                 EditorGUILayout.SelectableLabel(FormulaHelper.ToHitModifier(selectedCareer.Agility).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("Hit Points Modifier");
                 EditorGUILayout.SelectableLabel(FormulaHelper.HitPointsModifier(selectedCareer.Endurance).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             GUILayoutHelper.Horizontal(() =>
             {
                 EditorGUILayout.LabelField("Healing Rate Modifier");
                 EditorGUILayout.SelectableLabel(FormulaHelper.HealingRateModifier(selectedCareer.Endurance).ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
             });
             if (careerSource == CareerSource.Monsters)
             {
                 MobileEnemy enemy;
                 if (EnemyBasics.GetEnemy(selectedCareer.Name, out enemy))
                 {
                     GUILayoutHelper.Horizontal(() =>
                     {
                         string monsterHealth = string.Format("{0}-{1}", enemy.MinHealth, enemy.MaxHealth);
                         EditorGUILayout.LabelField("Monster Health");
                         EditorGUILayout.SelectableLabel(monsterHealth, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                     GUILayoutHelper.Horizontal(() =>
                     {
                         string monsterDamage = string.Format("{0}-{1}", enemy.MinDamage, enemy.MaxDamage);
                         EditorGUILayout.LabelField("Monster Damage 1");
                         EditorGUILayout.SelectableLabel(monsterDamage, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                     GUILayoutHelper.Horizontal(() =>
                     {
                         string monsterDamage2 = string.Format("{0}-{1}", enemy.MinDamage2, enemy.MaxDamage2);
                         EditorGUILayout.LabelField("Monster Damage 2");
                         EditorGUILayout.SelectableLabel(monsterDamage2, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                     GUILayoutHelper.Horizontal(() =>
                     {
                         string monsterDamage3 = string.Format("{0}-{1}", enemy.MinDamage3, enemy.MaxDamage3);
                         EditorGUILayout.LabelField("Monster Damage 3");
                         EditorGUILayout.SelectableLabel(monsterDamage3, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                     GUILayoutHelper.Horizontal(() =>
                     {
                         EditorGUILayout.LabelField("Required Metal");
                         EditorGUILayout.SelectableLabel(enemy.MinMetalToHit.ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                     GUILayoutHelper.Horizontal(() =>
                     {
                         string level = string.Format("{0}", enemy.Level);
                         EditorGUILayout.LabelField("Level");
                         EditorGUILayout.SelectableLabel(level, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                     GUILayoutHelper.Horizontal(() =>
                     {
                         string armorValue = string.Format("{0}", enemy.ArmorValue);
                         EditorGUILayout.LabelField("Armor Value");
                         EditorGUILayout.SelectableLabel(armorValue, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                     });
                 }
             }
         });
     });
 }
Example #14
0
        public void setupMobile()
        {
            name = string.Format("DaggerfallEnemy [{0}]", creatureType.ToString());

            // Add child object for enemy billboard
            GameObject mobileObject = new GameObject("DaggerfallMobileUnit");

            mobileObject.transform.parent = this.transform;

            // Add mobile enemy
            Vector2 size = Vector2.one;
            DaggerfallMobileUnit dfMobile = mobileObject.AddComponent <DaggerfallMobileUnit>();

            try {
                Dictionary <int, MobileEnemy> enemyDict = EnemyBasics.GetEnemyDict();
                dfMobile.SetEnemy(dfUnity, enemyDict[(int)creatureType], reaction);
                size = dfMobile.Summary.RecordSizes[0];
            } catch (System.Exception e) {
                string message = string.Format("Failed to set enemy type (int)type={0}. '{1}'", (int)creatureType, e.Message);
                // TODO: Change logging
                DaggerfallUnity.LogMessage(message);
                GameObject.DestroyImmediate(dfMobile);
            }

            // Add character controller
            if (dfUnity.Option_EnemyCharacterController)
            {
                CharacterController controller = gameObject.AddComponent <CharacterController>();
                controller.radius     = dfUnity.Option_EnemyRadius;
                controller.height     = size.y;
                controller.slopeLimit = dfUnity.Option_EnemySlopeLimit;
                controller.stepOffset = dfUnity.Option_EnemyStepOffset;

                // Reduce height of flying creatures as their wing animation makes them taller than desired
                // This helps them get through doors while aiming for player eye height
                if (dfMobile.Summary.Enemy.Behaviour == MobileBehaviour.Flying)
                {
                    controller.height /= 2f;
                }

                // Limit maximum height to ensure controller can fit through doors
                // For some reason Unity 4.5 doesn't let you set SkinWidth from code >.<
                if (controller.height > 1.9f)
                {
                    controller.height = 1.9f;
                }
            }

            // Add rigidbody
            if (dfUnity.Option_EnemyRigidbody)
            {
                Rigidbody rigidbody = gameObject.AddComponent <Rigidbody>();
                rigidbody.useGravity  = dfUnity.Option_EnemyUseGravity;
                rigidbody.isKinematic = dfUnity.Option_EnemyIsKinematic;
            }

            // Add capsule collider
            if (dfUnity.Option_EnemyCapsuleCollider)
            {
                CapsuleCollider collider = gameObject.AddComponent <CapsuleCollider>();
                collider.radius = dfUnity.Option_EnemyRadius;
                collider.height = size.y;
            }

            // Add navmesh agent
            if (dfUnity.Option_EnemyNavMeshAgent)
            {
                NavMeshAgent agent = gameObject.AddComponent <NavMeshAgent>();
                agent.radius     = dfUnity.Option_EnemyRadius;
                agent.height     = size.y;
                agent.baseOffset = size.y * 0.5f;
            }

            // Add example AI
            if (dfUnity.Option_EnemyExampleAI)
            {
                // EnemyMotor will also add other required components
                gameObject.AddComponent <DaggerfallWorkshop.Demo.EnemyMotor>();

                // Set sounds
                DaggerfallWorkshop.Demo.EnemySounds enemySounds = gameObject.GetComponent <DaggerfallWorkshop.Demo.EnemySounds>();
                if (enemySounds)
                {
                    enemySounds.MoveSound   = (SoundClips)dfMobile.Summary.Enemy.MoveSound;
                    enemySounds.BarkSound   = (SoundClips)dfMobile.Summary.Enemy.BarkSound;
                    enemySounds.AttackSound = (SoundClips)dfMobile.Summary.Enemy.AttackSound;
                }
            }
        }
Example #15
0
        /// <summary>
        /// Creates a loot container for enemies slain by the player.
        /// </summary>
        /// <param name="player">Player object, must have PlayerEnterExit attached.</param>
        /// <param name="enemy">Enemy object, must have EnemyMotor attached.</param>
        /// <param name="corpseTexture">Packed corpse texture index from entity summary.</param>
        /// <param name="loadID">Unique LoadID for save system.</param>
        /// <returns>DaggerfallLoot.</returns>
        public static DaggerfallLoot CreateLootableCorpseMarker(GameObject player, GameObject enemy, EnemyEntity enemyEntity, int corpseTexture, ulong loadID)
        {
            // Player must have a PlayerEnterExit component
            PlayerEnterExit playerEnterExit = player.GetComponent <PlayerEnterExit>();

            if (!playerEnterExit)
            {
                throw new Exception("CreateLootableCorpseMarker() player game object must have PlayerEnterExit component.");
            }

            // Enemy must have an EnemyMotor component
            EnemyMotor enemyMotor = enemy.GetComponent <EnemyMotor>();

            if (!enemyMotor)
            {
                throw new Exception("CreateLootableCorpseMarker() enemy game object must have EnemyMotor component.");
            }

            // Get parent by context
            Transform parent = null;

            if (GameManager.Instance.IsPlayerInside)
            {
                if (GameManager.Instance.IsPlayerInsideDungeon)
                {
                    parent = playerEnterExit.Dungeon.transform;
                }
                else
                {
                    parent = playerEnterExit.Interior.transform;
                }
            }
            else
            {
                parent = GameManager.Instance.StreamingTarget.transform;
            }

            // Get corpse marker texture indices
            int archive, record;

            EnemyBasics.ReverseCorpseTexture(corpseTexture, out archive, out record);

            // Find ground position below player
            Vector3 position = enemyMotor.FindGroundPosition();

            // Create loot container
            DaggerfallLoot loot = CreateLootContainer(
                LootContainerTypes.CorpseMarker,
                InventoryContainerImages.Corpse2,
                position,
                parent,
                archive,
                record,
                loadID);

            // Set properties
            loot.LoadID       = loadID;
            loot.LootTableKey = enemyEntity.MobileEnemy.LootTableKey;
            loot.playerOwned  = false;
            loot.customDrop   = true;

            // If dropped outside ask StreamingWorld to track loose object
            if (!GameManager.Instance.IsPlayerInside)
            {
                GameManager.Instance.StreamingWorld.TrackLooseObject(loot.gameObject);
            }

            return(loot);
        }