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); }
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); } } } }
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; }
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); } }
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); }
/// <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); }
/// <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); }
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); }
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)); }); } } }); }); }
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; } } }
/// <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); }