private void EnemyEntity_OnDeath(DaggerfallEntity entity) { // Disable enemy gameobject // Do not destroy as we must still save enemy state when dead gameObject.SetActive(false); // Show death message string deathMessage = HardStrings.thingJustDied; deathMessage = deathMessage.Replace("%s", mobile.Summary.Enemy.Name); DaggerfallUI.Instance.PopupMessage(deathMessage); // Generate lootable corpse marker DaggerfallLoot loot = GameObjectHelper.CreateLootableCorpseMarker( GameManager.Instance.PlayerObject, entityBehaviour.gameObject, enemyEntity, mobile.Summary.Enemy.CorpseTexture, DaggerfallUnity.NextUID); // Generate items loot.GenerateItems(); // Raise static event if (OnEnemyDeath != null) { OnEnemyDeath(this, null); } }
void CompleteDeath() { if (!entityBehaviour) { return; } // If enemy associated with quest system, make sure quest system is done with it first QuestResourceBehaviour questResourceBehaviour = GetComponent <QuestResourceBehaviour>(); if (questResourceBehaviour) { if (!questResourceBehaviour.IsFoeDead) { return; } } // Play body collapse sound if (DaggerfallUI.Instance.DaggerfallAudioSource) { AudioClip collapseSound = DaggerfallUI.Instance.DaggerfallAudioSource.GetAudioClip((int)SoundClips.BodyFall); AudioSource.PlayClipAtPoint(collapseSound, entityBehaviour.transform.position); } // Disable enemy gameobject // Do not destroy as we must still save enemy state when dead gameObject.SetActive(false); // Show death message string deathMessage = HardStrings.thingJustDied; deathMessage = deathMessage.Replace("%s", mobile.Summary.Enemy.Name); DaggerfallUI.Instance.PopupMessage(deathMessage); // Generate lootable corpse marker DaggerfallLoot loot = GameObjectHelper.CreateLootableCorpseMarker( GameManager.Instance.PlayerObject, entityBehaviour.gameObject, enemyEntity, mobile.Summary.Enemy.CorpseTexture, DaggerfallUnity.NextUID); // Generate items loot.GenerateItems(); entityBehaviour.CorpseLootContainer = loot; // Transfer any items owned by entity to loot container // Many quests will stash a reward in enemy inventory for player to find // This will be in addition to normal random loot table generation loot.Items.TransferAll(entityBehaviour.Entity.Items); // Raise static event if (OnEnemyDeath != null) { OnEnemyDeath(this, null); } }
public static bool GenerateLoot(DaggerfallLoot loot, int locationIndex) { string[] lootTableKeys = { "K", // Crypt "N", // Orc Stronghold "N", // Human Stronghold "N", // Prison "K", // Desecrated Temple "M", // Mine "M", // Natural Cave "Q", // Coven "K", // Vampire Haunt "U", // Laboratory "D", // Harpy Nest "N", // Ruined Castle "L", // Spider Nest "F", // Giant Stronghold "S", // Dragon's Den "N", // Barbarian Stronghold "M", // Volcanic Caves "L", // Scorpion Nest "N", // Cemetery }; // Get loot table key if (locationIndex < lootTableKeys.Length) { DaggerfallLoot.GenerateItems(lootTableKeys[locationIndex], loot.Items); // Randomly add map char key = lootTableKeys[locationIndex][0]; int alphabetIndex = key - 64; if (alphabetIndex >= 10 && alphabetIndex <= 15) // between keys J and O { int[] mapChances = { 2, 1, 1, 2, 2, 15 }; int mapChance = mapChances[alphabetIndex - 10]; DaggerfallLoot.RandomlyAddMap(mapChance, loot.Items); DaggerfallLoot.RandomlyAddPotion(4, loot.Items); DaggerfallLoot.RandomlyAddPotionRecipe(2, loot.Items); } OnLootSpawned?.Invoke(null, new TabledLootSpawnedEventArgs { LocationIndex = locationIndex, Key = lootTableKeys[locationIndex], Items = loot.Items }); return(true); } return(false); }
/// <summary> /// Sets enemy career and prepares entity settings. /// </summary> public void SetEnemyCareer(MobileEnemy mobileEnemy, EntityTypes entityType) { // Try custom career first career = GetCustomCareerTemplate(mobileEnemy.ID); if (career != null) { // Custom enemy careerIndex = mobileEnemy.ID; stats.SetPermanentFromCareer(career); if (entityType == EntityTypes.EnemyMonster) { // Default like a monster level = mobileEnemy.Level; maxHealth = Random.Range(mobileEnemy.MinHealth, mobileEnemy.MaxHealth + 1); for (int i = 0; i < ArmorValues.Length; i++) { ArmorValues[i] = (sbyte)(mobileEnemy.ArmorValue * 5); } } else { // Default like a class enemy level = GameManager.Instance.PlayerEntity.Level; maxHealth = FormulaHelper.RollEnemyClassMaxHealth(level, career.HitPointsPerLevel); } } else if (entityType == EntityTypes.EnemyMonster) { careerIndex = mobileEnemy.ID; career = GetMonsterCareerTemplate((MonsterCareers)careerIndex); stats.SetPermanentFromCareer(career); // Enemy monster has predefined level, health and armor values. // Armor values can be modified below by equipment. level = mobileEnemy.Level; maxHealth = UnityEngine.Random.Range(mobileEnemy.MinHealth, mobileEnemy.MaxHealth + 1); for (int i = 0; i < ArmorValues.Length; i++) { ArmorValues[i] = (sbyte)(mobileEnemy.ArmorValue * 5); } } else if (entityType == EntityTypes.EnemyClass) { careerIndex = mobileEnemy.ID - 128; career = GetClassCareerTemplate((ClassCareers)careerIndex); stats.SetPermanentFromCareer(career); // Enemy class is levelled to player and uses similar health rules // City guards are 3 to 6 levels above the player level = GameManager.Instance.PlayerEntity.Level; if (careerIndex == (int)MobileTypes.Knight_CityWatch - 128) { level += UnityEngine.Random.Range(3, 7); } maxHealth = FormulaHelper.RollEnemyClassMaxHealth(level, career.HitPointsPerLevel); } else { career = new DFCareer(); careerIndex = -1; return; } this.mobileEnemy = mobileEnemy; this.entityType = entityType; name = career.Name; minMetalToHit = mobileEnemy.MinMetalToHit; team = mobileEnemy.Team; short skillsLevel = (short)((level * 5) + 30); if (skillsLevel > 100) { skillsLevel = 100; } for (int i = 0; i <= DaggerfallSkills.Count; i++) { skills.SetPermanentSkillValue(i, skillsLevel); } // Generate loot table items DaggerfallLoot.GenerateItems(mobileEnemy.LootTableKey, items); // Enemy classes and some monsters use equipment if (careerIndex == (int)MonsterCareers.Orc || careerIndex == (int)MonsterCareers.OrcShaman) { SetEnemyEquipment(0); } else if (careerIndex == (int)MonsterCareers.Centaur || careerIndex == (int)MonsterCareers.OrcSergeant) { SetEnemyEquipment(1); } else if (careerIndex == (int)MonsterCareers.OrcWarlord) { SetEnemyEquipment(2); } else if (entityType == EntityTypes.EnemyClass) { SetEnemyEquipment(UnityEngine.Random.Range(0, 2)); // 0 or 1 } // Assign spell lists if (entityType == EntityTypes.EnemyMonster) { if (careerIndex == (int)MonsterCareers.Imp) { SetEnemySpells(ImpSpells); } else if (careerIndex == (int)MonsterCareers.Ghost) { SetEnemySpells(GhostSpells); } else if (careerIndex == (int)MonsterCareers.OrcShaman) { SetEnemySpells(OrcShamanSpells); } else if (careerIndex == (int)MonsterCareers.Wraith) { SetEnemySpells(WraithSpells); } else if (careerIndex == (int)MonsterCareers.FrostDaedra) { SetEnemySpells(FrostDaedraSpells); } else if (careerIndex == (int)MonsterCareers.FireDaedra) { SetEnemySpells(FireDaedraSpells); } else if (careerIndex == (int)MonsterCareers.Daedroth) { SetEnemySpells(DaedrothSpells); } else if (careerIndex == (int)MonsterCareers.Vampire) { SetEnemySpells(VampireSpells); } else if (careerIndex == (int)MonsterCareers.DaedraSeducer) { SetEnemySpells(SeducerSpells); } else if (careerIndex == (int)MonsterCareers.VampireAncient) { SetEnemySpells(VampireAncientSpells); } else if (careerIndex == (int)MonsterCareers.DaedraLord) { SetEnemySpells(DaedraLordSpells); } else if (careerIndex == (int)MonsterCareers.Lich) { SetEnemySpells(LichSpells); } else if (careerIndex == (int)MonsterCareers.AncientLich) { SetEnemySpells(AncientLichSpells); } } else if (entityType == EntityTypes.EnemyClass && (mobileEnemy.CastsMagic)) { int spellListLevel = level / 3; if (spellListLevel > 6) { spellListLevel = 6; } SetEnemySpells(EnemyClassSpells[spellListLevel]); } // Chance of adding map DaggerfallLoot.RandomlyAddMap(mobileEnemy.MapChance, items); if (!string.IsNullOrEmpty(mobileEnemy.LootTableKey)) { // Chance of adding potion DaggerfallLoot.RandomlyAddPotion(3, items); // Chance of adding potion recipe DaggerfallLoot.RandomlyAddPotionRecipe(2, items); } OnLootSpawned?.Invoke(this, new EnemyLootSpawnedEventArgs { MobileEnemy = mobileEnemy, EnemyCareer = career, Items = items }); FillVitalSigns(); }
/// <summary> /// Sets enemy career and prepares entity settings. /// </summary> public void SetEnemyCareer(MobileEnemy mobileEnemy, EntityTypes entityType) { if (entityType == EntityTypes.EnemyMonster) { careerIndex = (int)mobileEnemy.ID; career = GetMonsterCareerTemplate((MonsterCareers)careerIndex); stats.SetPermanentFromCareer(career); // Enemy monster has predefined level, health and armor values. // Armor values can be modified below by equipment. level = mobileEnemy.Level; maxHealth = UnityEngine.Random.Range(mobileEnemy.MinHealth, mobileEnemy.MaxHealth + 1); for (int i = 0; i < ArmorValues.Length; i++) { ArmorValues[i] = (sbyte)(mobileEnemy.ArmorValue * 5); } } else if (entityType == EntityTypes.EnemyClass) { careerIndex = (int)mobileEnemy.ID - 128; career = GetClassCareerTemplate((ClassCareers)careerIndex); stats.SetPermanentFromCareer(career); // Enemy class is levelled to player and uses similar health rules level = GameManager.Instance.PlayerEntity.Level; maxHealth = FormulaHelper.RollEnemyClassMaxHealth(level, career.HitPointsPerLevel); } else { career = new DFCareer(); careerIndex = -1; return; } this.mobileEnemy = mobileEnemy; this.entityType = entityType; name = career.Name; minMetalToHit = mobileEnemy.MinMetalToHit; short skillsLevel = (short)((level * 5) + 30); if (skillsLevel > 100) { skillsLevel = 100; } for (int i = 0; i <= DaggerfallSkills.Count; i++) { skills.SetPermanentSkillValue(i, skillsLevel); } // Generate loot table items DaggerfallLoot.GenerateItems(mobileEnemy.LootTableKey, items); // Enemy classes and some monsters use equipment if (careerIndex == (int)MonsterCareers.Orc || careerIndex == (int)MonsterCareers.OrcShaman) { SetEnemyEquipment(0); } else if (careerIndex == (int)MonsterCareers.Centaur || careerIndex == (int)MonsterCareers.OrcSergeant) { SetEnemyEquipment(1); } else if (careerIndex == (int)MonsterCareers.OrcWarlord) { SetEnemyEquipment(2); } else if (entityType == EntityTypes.EnemyClass) { SetEnemyEquipment(UnityEngine.Random.Range(0, 2)); // 0 or 1 } // Chance of adding map DaggerfallLoot.RandomlyAddMap(mobileEnemy.MapChance, items); if (!string.IsNullOrEmpty(mobileEnemy.LootTableKey)) { // Chance of adding potion DaggerfallLoot.RandomlyAddPotion(3, items); // Chance of adding potion recipe DaggerfallLoot.RandomlyAddPotionRecipe(2, items); } FillVitalSigns(); }
void CompleteDeath() { if (!entityBehaviour) { return; } // If enemy associated with quest system, make sure quest system is done with it first QuestResourceBehaviour questResourceBehaviour = GetComponent <QuestResourceBehaviour>(); if (questResourceBehaviour) { if (!questResourceBehaviour.IsFoeDead) { return; } } // Play body collapse sound if (DaggerfallUI.Instance.DaggerfallAudioSource) { AudioClip collapseSound = DaggerfallUI.Instance.DaggerfallAudioSource.GetAudioClip((int)SoundClips.BodyFall); AudioSource.PlayClipAtPoint(collapseSound, entityBehaviour.transform.position, 1.05f); } // Disable enemy gameobject // Do not destroy as we must still save enemy state when dead gameObject.SetActive(false); // Show death message string deathMessage = HardStrings.thingJustDied; deathMessage = deathMessage.Replace("%s", mobile.Summary.Enemy.Name); DaggerfallUI.Instance.PopupMessage(deathMessage); // Generate lootable corpse marker DaggerfallLoot loot = GameObjectHelper.CreateLootableCorpseMarker( GameManager.Instance.PlayerObject, entityBehaviour.gameObject, enemyEntity, mobile.Summary.Enemy.CorpseTexture, DaggerfallUnity.NextUID); // Generate items loot.GenerateItems(); // This is still required so enemy equipment is not marked as equipped // This item collection is transferred to loot container below for (int i = (int)Items.EquipSlots.Head; i <= (int)Items.EquipSlots.Feet; i++) { Items.DaggerfallUnityItem item = enemyEntity.ItemEquipTable.GetItem((Items.EquipSlots)i); if (item != null) { enemyEntity.ItemEquipTable.UnequipItem((Items.EquipSlots)i); } } // Chance of adding map loot.RandomlyAddMap(mobile.Summary.Enemy.MapChance); if (!string.IsNullOrEmpty(mobile.Summary.Enemy.LootTableKey)) { // Chance of adding potion loot.RandomlyAddPotion(3); // Chance of adding potion recipe loot.RandomlyAddPotionRecipe(2); } entityBehaviour.CorpseLootContainer = loot; // Transfer any items owned by entity to loot container // Many quests will stash a reward in enemy inventory for player to find // This will be in addition to normal random loot table generation loot.Items.TransferAll(entityBehaviour.Entity.Items); // Raise static event if (OnEnemyDeath != null) { OnEnemyDeath(this, null); } }