public async Task <FightMonster> GenerateFightMonster(Monster databaseMonster) { FightMonster fightMonster = new FightMonster(); Hero hero = await this.heroService.GetHero(); fightMonster.Name = databaseMonster.Name; fightMonster.AvatarUrl = databaseMonster.AvatarUrl; fightMonster.Level = databaseMonster.Level; fightMonster.Characteristics = this.GenerateFightMonsterCharacteristics(databaseMonster.Level, databaseMonster.StatPercentage, hero.Characteristics); fightMonster.Health = hero.Health.Maximum; return(fightMonster); }
public async Task <int> InitiateMonsterFight(int monsterLevel = 0) { Random random = new Random(); Fight fight = new Fight(); Hero attacker = await this.heroService.GetHero(); this.CheckIfHeroIsWorking(attacker); this.CheckIfHeroCanAttackMonster(attacker); await this.amuletBagService.EquipAmulet("MonsterAttack"); if (monsterLevel == 0) { monsterLevel = random.Next(RandomMonsterMinimumLevel, RandomMonsterMaximumLevel); await this.resourcePouchService.DecreaseResource(ResourceNames.Gold, RandomMonsterGoldCost); } else { await this.resourcePouchService.DecreaseResource(ResourceNames.Crystals, MonsterCrystalCost); } Monster databaseMonster = await this.monsterService.GetMonsterByLevel(monsterLevel); FightMonster monster = await this.monsterService.GenerateFightMonster(databaseMonster); EquippedSet attackerSet = await this.equipmentService.GetEquippedSet(); int attackerAttack = FightFormulas.CalculateAttack(attacker); int attackerDefense = FightFormulas.CalculateDefense(attacker); int attackerMastery = FightFormulas.CalculateMastery(attacker); int attackerDexterity = FightFormulas.CalculateDexterity(attacker); int attackerMass = attacker.Characteristics.Mass; HeroAmulet heroAmulet = attacker.EquippedSet.Amulet; if (heroAmulet?.Name == AmuletNames.Undergrounder) { attackerAttack = (int)(attackerAttack * (1 + (heroAmulet.Bonus / 100))); attackerDefense = (int)(attackerDefense * (1 + (heroAmulet.Bonus / 100))); attackerMastery = (int)(attackerMastery * (1 + (heroAmulet.Bonus / 100))); attackerDexterity = (int)(attackerDexterity * (1 + (heroAmulet.Bonus / 100))); } int?[] attackerHits = new int?[Rounds]; int?[] defenderHits = new int?[Rounds]; HitType[] attackerHitTypes = new HitType[Rounds]; HitType[] defenderHitTypes = new HitType[Rounds]; string winnerName = string.Empty; int goldStolen = 0; for (int i = 0; i < Rounds; i++) { bool isCrit = FightFormulas.IsCrit( attackerMastery, monster.Characteristics.Dexterity, attackerSet.Amulet?.Name == AmuletNames.Criticum ? attackerSet.Amulet.Bonus : 0); bool isDodged = FightFormulas.IsDodged(attackerAttack, monster.Characteristics.Dexterity, 0); int attackerDamage = FightFormulas.CalculateHitDamage( attackerAttack, monster.Characteristics.Defense, isCrit, isDodged, attackerSet.Amulet?.Name == AmuletNames.Fatty ? attackerSet.Amulet.Bonus : 0); monster.Health -= attackerDamage; if (monster.Health < 1) { monster.Health = 1; } attackerHits[i] = attackerDamage; attackerHitTypes[i] = isDodged ? HitType.Dodged : isCrit ? HitType.Critical : HitType.Normal; if (monster.Health == 1) { winnerName = attacker.Name; break; } isCrit = FightFormulas.IsCrit(monster.Characteristics.Attack, attackerDexterity, 0); isDodged = FightFormulas.IsDodged(monster.Characteristics.Attack, attackerDexterity, 0); int defenderDamage = FightFormulas.CalculateHitDamage( monster.Characteristics.Attack, attackerDefense, isCrit, isDodged, 0); await this.healthService.ReduceHealth(defenderDamage, attacker.HealthId); defenderHits[i] = defenderDamage; defenderHitTypes[i] = isDodged ? HitType.Dodged : isCrit ? HitType.Critical : HitType.Normal; if (await this.healthService.CheckIfDead(attacker.HealthId)) { winnerName = monster.Name; break; } } if (string.IsNullOrEmpty(winnerName)) { winnerName = attackerHits.Sum() > defenderHits.Sum() ? attacker.Name : monster.Name; } if (winnerName == attacker.Name) { goldStolen = MonsterFormulas.CalculateReward(databaseMonster, attacker.Level.CurrentLevel); await this.resourcePouchService.IncreaseResource(ResourceNames.Gold, goldStolen, attacker.ResourcePouchId); await this.levelService.GiveHeroExperience(monster.Level, attacker.LevelId); attacker.Statistics.EarnedFromMonsters += goldStolen; attacker.Statistics.MonstersDefeated++; } else if (winnerName == monster.Name) { goldStolen = ResourceFormulas.CalculateStolenGold( attacker.ResourcePouch.Gold, this.GetGoldSafeBonus(attacker)); await this.resourcePouchService.DecreaseResource(ResourceNames.Gold, goldStolen, attacker.ResourcePouchId); } await this.statisticsService.UpdateStatistics(attacker.Statistics); await this.chronometerService.SetCannotAttackMonsterUntil(SecondsUntilNextMonsterAttack, attacker.ChronometerId); #region Map Fight entity fight.WinnerName = winnerName; fight.GoldStolen = goldStolen; fight.ExperienceGained = monster.Level; fight.AttackerDamageDealt = (int)attackerHits.Sum(); fight.DefenderDamageDealt = (int)defenderHits.Sum(); fight.AttackerHealthLeft = attacker.Health.Current; fight.DefenderHealthLeft = monster.Health; fight.AttackerId = attacker.Id; fight.AttackerName = attacker.Name; fight.DefenderName = monster.Name; fight.AttackerLevel = attacker.Level.CurrentLevel; fight.DefenderLevel = monster.Level; fight.AttackerAvatarUrl = attacker.AvatarUrl; fight.DefenderAvatarUrl = monster.AvatarUrl; fight.AttackerAttack = attackerAttack; fight.AttackerDefense = attackerDefense; fight.AttackerMastery = attackerMastery; fight.AttackerMass = attackerMass; fight.AttackerDexterity = attackerDexterity; fight.DefenderAttack = monster.Characteristics.Attack; fight.DefenderDefense = monster.Characteristics.Defense; fight.DefenderMastery = monster.Characteristics.Mastery; fight.DefenderMass = monster.Characteristics.Mass; fight.DefenderDexterity = monster.Characteristics.Dexterity; fight.AttackerHitOne = attackerHits[0]; fight.AttackerHitTwo = attackerHits[1]; fight.AttackerHitThree = attackerHits[2]; fight.AttackerHitFour = attackerHits[3]; fight.AttackerHitFive = attackerHits[4]; fight.DefenderHitOne = defenderHits[0]; fight.DefenderHitTwo = defenderHits[1]; fight.DefenderHitThree = defenderHits[2]; fight.DefenderHitFour = defenderHits[3]; fight.DefenderHitFive = defenderHits[4]; fight.AttackerHitOneType = attackerHitTypes[0]; fight.AttackerHitTwoType = attackerHitTypes[1]; fight.AttackerHitThreeType = attackerHitTypes[2]; fight.AttackerHitFourType = attackerHitTypes[3]; fight.AttackerHitFiveType = attackerHitTypes[4]; fight.DefenderHitOneType = defenderHitTypes[0]; fight.DefenderHitTwoType = defenderHitTypes[1]; fight.DefenderHitThreeType = defenderHitTypes[2]; fight.DefenderHitFourType = defenderHitTypes[3]; fight.DefenderHitFiveType = defenderHitTypes[4]; #endregion Fight fightEntity = this.context.Fights.AddAsync(fight).Result.Entity; attacker.HeroFights.Add(new HeroFight { Fight = fightEntity, Hero = attacker }); await this.context.SaveChangesAsync(); Notification notification = new Notification() { ImageUrl = MonsterFightNotificationImageUrl, Title = FightNotificationTitle, Link = string.Format(FightNotificationLink, fightEntity.Id), Content = string.Format(FightNotificationAttacker, monster.Name), Gold = winnerName == attacker.Name ? goldStolen : goldStolen * -1, Experience = winnerName == attacker.Name ? monster.Level : default(int?), Type = NotificationType.MonsterFight, Hero = attacker, }; await this.notificationService.AddNotification(notification); await this.amuletBagService.EquipAmulet("Idle"); return(fightEntity.Id); }
public GameScene(int fightNumber) { this.fightMonster = new FightMonster(); Init(fightNumber); }
private void Start() { canvas = FindObjectOfType <Canvas>(); EngagedMonsterObj = Instantiate(Resources.Load("Fight/EngagedMonster", typeof(GameObject)), canvas.transform) as GameObject; EngagedMonster = EngagedMonsterObj.GetComponent <FightMonster>(); //if (GameController.EngagedMonster == null) //for quick testing //{ // EngagedMonster.LoadMonsterBySpecies(MonsterList.Redmon); // GameController.EngagedMonster = EngagedMonster; //} EngagedMonster.Initialize(GameController.EngagedMonster); PlayerMonsterObj = Instantiate(Resources.Load("Fight/PlayerMonster", typeof(GameObject)), canvas.transform) as GameObject; PlayerMonster = PlayerMonsterObj.GetComponent <FightMonster>(); PlayerMonster.IsPlayer = true; if (GameController.Team.Count == 0) //for quick testing { PlayerMonster.LoadMonsterBySpecies(MonsterList.Greenmon); GameController.Team.Add(PlayerMonster); } PlayerMonster.Initialize(GameController.Team[0]); var tray = GameObject.Find("MonTray"); for (var i = 0; i < GameController.Team.Count; i++) { var mon = GameController.Team[i]; var entryButton = Instantiate(Resources.Load("Fight/MonButton", typeof(GameObject)), tray.transform) as GameObject; var loc = new Vector3(); if (i == 0) { loc = new Vector3(-224, 132, -1); } else if (i == 1) { loc = new Vector3(224, 132, -1); } else if (i == 2) { loc = new Vector3(-224, 0, -1); } else if (i == 3) { loc = new Vector3(224, 0, -1); } else if (i == 4) { loc = new Vector3(-224, -132, -1); } else if (i == 5) { loc = new Vector3(224, -132, -1); } entryButton.transform.localPosition = loc; var entry = entryButton.transform.Find("FightTeamMonster"); entry.GetComponent <SpriteRenderer>().sprite = mon.Sprite; var text = entry.Find("TeamText").GetComponent <TextMeshProUGUI>(); text.text = System.String.Format(text.text, mon.Species, mon.Level, mon.CurrentHp, mon.MaxHp); var healthBar = entry.Find("HealthBar").gameObject; var hpFillAmount = (float)mon.CurrentHp / (float)mon.MaxHp; healthBar.GetComponent <Image>().fillAmount = hpFillAmount; } }