예제 #1
0
 private string GetRecruiterDescription(PlayerSoldier soldier)
 {
     if (soldier.RangedRating > 105)
     {
         if (soldier.MeleeRating > 90)
         {
             if (soldier.MeleeRating > 100 && soldier.RangedRating > 105)
             {
                 return(soldier.Name + " is ready to accept the Black Carapace and join a Devastator Squad; I think he will rise through the ranks quickly.\n");
             }
             else
             {
                 return(soldier.Name + " is ready to be promoted to a Devastator Squad, but I would prefer he earn more seasoning first.\n");
             }
         }
         else
         {
             return(soldier.Name + " could be promoted in an emergency, but is not ready to face hand-to-hand combat.\n");
         }
     }
     else if (soldier.MeleeRating > 90)
     {
         return(soldier.Name + " has a good grasp of the sword, but his mastery of the bolter leaves something to be desired.\n");
     }
     else
     {
         return(soldier.Name + " is not ready to become a Battle Brother, and should acquire more seasoning before taking the Black Carapace.\n");
     }
 }
예제 #2
0
        private void ApplyBionics(HitLocation hitLocation, PlayerSoldier soldier)
        {
            // NOTE: We don't heal the wound here.
            // The wound will heal automatically in the next turn.
            // This represents the marine learning how to use the new body part.
            hitLocation.IsCybernetic = true;
            soldier.AddEntryToHistory($"Received bioic {hitLocation.Template.Name} replacement");

            if (hitLocation.Template.Name.Contains("Arm"))
            {
                hitLocation.Armor = 2;
                string otherName        = hitLocation.Template.Name.Replace("Arm", "Hand");
                var    otherHitLocation = soldier.Body.HitLocations
                                          .First(hl => hl.Template.Name == otherName);
                otherHitLocation.Armor        = 2;
                otherHitLocation.IsCybernetic = true;
            }
            else if (hitLocation.Template.Name.Contains("Leg"))
            {
                hitLocation.Armor = 3;
                string otherName        = hitLocation.Template.Name.Replace("Leg", "Foot");
                var    otherHitLocation = soldier.Body.HitLocations
                                          .First(hl => hl.Template.Name == otherName);
                otherHitLocation.Armor        = 3;
                otherHitLocation.IsCybernetic = true;
            }
        }
예제 #3
0
 private static void ApplySoldierTypeTraining(PlayerSoldier soldier)
 {
     foreach (Tuple <BaseSkill, float> tuple in soldier.Template.MosTraining)
     {
         soldier.AddSkillPoints(tuple.Item1, tuple.Item2);
     }
 }
예제 #4
0
    public void GetCloser(PlayerSoldier enemy)
    {
        UnMarkAvailableTilesToStep();
        CoverSoldier();
        enemy.CoverSoldier();

        if (CurrentSide == GameSide.LeftSide && enemy.CurrentTile.Column < CurrentTile.Column ||
            CurrentSide == GameSide.RightSide && enemy.CurrentTile.Column > CurrentTile.Column)
        {
            isFlipped = true;
            if (enemy is Zombie)
            {
                (enemy as Zombie).isFlipped = true;
                enemy.FlipSide(false);
                enemy.transform.position = new Vector2(enemy.CurrentTile.transform.position.x + OffsetX, enemy.CurrentTile.transform.position.y + OffsetY);
            }
            FlipSide(false);
            transform.position = new Vector2(CurrentTile.transform.position.x + OffsetX, CurrentTile.transform.position.y + OffsetY);
        }

        anim.Play("Walk");
        SoundManager.Instance.SFX.PlayOneShot(SoundManager.Instance.ZombieWalkShort);
        playerCollider.isTrigger = enemy.PlayerCollider.isTrigger = true;
        enemy.SetWarTag();

        CurrentTile.Soldier = null;
        CurrentTile         = enemy.CurrentTile;
        //CurrentTile.Soldier = this;
        destination = new Vector2(CurrentTile.transform.position.x + OffsetX, CurrentTile.transform.position.y + OffsetY);
        isWalking   = isInWar = true;
    }
    public bool ChangeSoldierPosition(PlayerSoldier soldier)
    {
        soldier.gameObject.SetActive(false);
        Vector2      worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        RaycastHit2D hit        = Physics2D.Raycast(worldPoint, Vector2.zero);

        soldier.gameObject.SetActive(true);
        if (hit.collider != null && hit.collider.tag == "BuildTile")     //Check if user clicked on build site
        {
            Tile tile = hit.transform.gameObject.GetComponent <Tile>();
            soldier.GetComponent <SpriteRenderer>().sortingOrder = tile.Row + 1;
            soldier.CurrentTile.UnmarkTileInUse();
            soldier.CurrentTile.Soldier = null;
            soldier.CurrentTile         = tile;
            soldier.CurrentTile.Soldier = soldier;
            soldier.transform.position  = new Vector2(tile.transform.position.x + soldier.OffsetX, tile.transform.position.y + soldier.OffsetY);
            tile.MarkTileInUse();
            return(true);
        }
        else if (hit.collider != null && (hit.collider.tag == "Zombie" || hit.collider.tag == "Bomb" || hit.collider.tag == "Flag"))
        {
            PlayerSoldier otherSoldier = hit.transform.gameObject.GetComponent <PlayerSoldier>();
            soldier.GetComponent <SpriteRenderer>().sortingOrder      = otherSoldier.CurrentTile.Row + 1;
            otherSoldier.GetComponent <SpriteRenderer>().sortingOrder = soldier.CurrentTile.Row + 1;


            soldier.CurrentTile.Soldier      = otherSoldier;
            otherSoldier.CurrentTile.Soldier = soldier;

            var tmpTile = soldier.CurrentTile;
            soldier.CurrentTile      = otherSoldier.CurrentTile;
            otherSoldier.CurrentTile = tmpTile;

            var tmpPos = soldier.OriginPosition;
            soldier.transform.position      = new Vector2(soldier.CurrentTile.transform.position.x + soldier.OffsetX, soldier.CurrentTile.transform.position.y + soldier.OffsetY);
            otherSoldier.transform.position = new Vector2(otherSoldier.CurrentTile.transform.position.x + otherSoldier.OffsetX, otherSoldier.CurrentTile.transform.position.y + otherSoldier.OffsetY);;
            return(true);
        }
        else if (hit.collider != null && hit.collider.tag == "Trash" && !(soldier is Flag))
        {
            soldier.CurrentTile.UnmarkTileInUse();
            SoldierManager.Instance.LocalPlayerList.Remove(soldier);
            MenuLogic.Instance.SellSoldier(soldier.Price);

            if (soldier is Bomb)
            {
                NumOfBombs--;
                GameView.EnableButton("Btn_Bomb");
            }
            else if (soldier.Rank == Globals.RANK_OF_SAPPER)
            {
                NumOfSappers--;
                GameView.EnableButton("Btn_Zombie9");
            }
            SoundManager.Instance.SFX.PlayOneShot(SoundManager.Instance.SoldierSold);
            Destroy(soldier.gameObject);
        }
        return(false);
    }
 public void RemoveSoldierFromList(PlayerSoldier soldier)
 {
     if (Globals.IS_SINGLE_PLAYER && soldier.CurrentSide == GameManager.Instance.PcSide || !Globals.IS_SINGLE_PLAYER && MultiPlayerManager.Instance.PlayerSide != soldier.CurrentSide)
     {
         EnemyList.Remove(soldier);
     }
     else
     {
         LocalPlayerList.Remove(soldier);
     }
 }
예제 #7
0
 public void UnReadyToStep(PlayerSoldier zombie, bool isPc = false)
 {
     isReadyToStep = false;
     if (!isPc)
     {
         UnColorTile();
     }
     if (soldier != null && zombie == soldier)
     {
         soldier = null;
     }
     attackingZombie = null;
 }
예제 #8
0
        protected Color DetermineDisplayColor(ISoldier soldier)
        {
            PlayerSoldier playerSoldier = GameSettings.Chapter.PlayerSoldierMap[soldier.Id];

            if (!playerSoldier.IsDeployable)
            {
                return(Color.red);
            }
            if (playerSoldier.IsWounded)
            {
                return(Color.yellow);
            }
            return(Color.white);
        }
예제 #9
0
    public IEnumerator DisplayInfo(PlayerSoldier soldier)
    {
        GameView.SetImage("SoldierImg", soldier.Sprite);
        GameView.SetText("RankInfoTxt", soldier.Rank.ToString());
        GameView.SetText("InfoTitleTxt", soldier.SoldierName);
        GameView.SetText("DescriptionInfoTxt", soldier.Description);
        GameView.SetText("SpecialAbilityTxt", soldier.SpecialAbilityDescription);
        //cloudInfo.transform.position = soldier.transform.position;
        cloudInfo.transform.position = new Vector2(Input.mousePosition.x + (soldier.CurrentSide == GameSide.LeftSide ? 70 : -70), Input.mousePosition.y);
        SoundManager.Instance.SFX.PlayOneShot(SoundManager.Instance.Description);
        isDescriptionOpen = true;
        cloudInfo.SetActive(true);

        yield return(new WaitForSeconds(3f));

        CloseInfo();
    }
예제 #10
0
 public void ResetTile()
 {
     if (Column < 4)
     {
         tag = "BuildTile";
     }
     else if (Column > 7)
     {
         tag = "EnemyTile";
     }
     else
     {
         tag = "Tile";
     }
     isReadyToStep = false;
     Soldier       = attackingZombie = null;
     UnColorTile();
 }
예제 #11
0
 private string GetGeneseedStatusDescription(PlayerSoldier soldier)
 {
     if (soldier.Body.HitLocations.First(hl => hl.Template.Name == "Face").IsSevered)
     {
         return("Destroyed");
     }
     else if (soldier.Body.HitLocations.First(hl => hl.Template.Name == "Torso").IsSevered)
     {
         return("Destroyed");
     }
     else if (GameSettings.Date.GetWeeksDifference(soldier.ProgenoidImplantDate) < 260)
     {
         return("Immature, Unrecoverable");
     }
     else
     {
         GameSettings.Chapter.GeneseedStockpile++;
         return("Recovered");
     }
 }
    public void PlaceSoldier(Tile tile, PlayerSoldier soldier, bool isEnemy = false)
    {
        PlayerSoldier newSoldier = Instantiate(soldier, transform);

        if (isEnemy)
        {
            newSoldier.FlipSide();
            EnemyList.Add(newSoldier);
        }
        else
        {
            LocalPlayerList.Add(newSoldier);
        }
        newSoldier.transform.position = new Vector3(tile.transform.position.x + newSoldier.OffsetX,
                                                    tile.transform.position.y + newSoldier.OffsetY);
        newSoldier.GetComponent <SpriteRenderer>().sortingOrder = tile.Row + 1;
        newSoldier.CurrentTile         = tile;
        newSoldier.CurrentTile.Soldier = newSoldier;
        tile.MarkTileInUse();
    }
예제 #13
0
        public void SquadMemberView_OnSoldierSelected(int soldierId)
        {
            string newText = "";

            _selectedSoldier = GameSettings.Chapter.PlayerSoldierMap[soldierId];
            foreach (string historyLine in _selectedSoldier.SoldierHistory)
            {
                newText += historyLine + "\n";
            }
            SquadMemberView.ReplaceSelectedUnitText(newText);
            var openings = GetOpeningsInUnit(GameSettings.Chapter.OrderOfBattle,
                                             _selectedSoldier.AssignedSquad,
                                             _selectedSoldier.Template);

            // insert current assignment at top
            openings.Insert(0, new Tuple <int, SoldierTemplate, string>(
                                _selectedSoldier.AssignedSquad.Id,
                                _selectedSoldier.Template,
                                $"{_selectedSoldier.Template.Name}, {_selectedSoldier.AssignedSquad.Name}, {_selectedSoldier.AssignedSquad.ParentUnit.Name}"));
            SquadMemberView.PopulateTransferDropdown(openings);
        }
예제 #14
0
        public void UpdateRatings(PlayerSoldier soldier)
        {
            // Melee score = (Speed * STR * Melee)
            // Expected score = 16 * 16 * 15.5/8 = 1000
            // low-end = 15 * 15 * 14/8 = 850
            // high-end = 17 * 17 * 16/8 = 578
            soldier.MeleeRating =
                soldier.Strength * soldier.GetTotalSkillValue(_skillsByName["Sword"])
                / (UnityEngine.Random.Range(1.44f, 1.76f) * UnityEngine.Random.Range(1.44f, 1.76f));
            // marksman, sharpshooter, sniper
            // Ranged Score = PER * Ranged
            Skill bestRanged = soldier.GetBestSkillInCategory(SkillCategory.Ranged);

            soldier.RangedRating =
                (soldier.Dexterity + bestRanged.SkillBonus)
                / UnityEngine.Random.Range(0.144f, 0.176f);
            // Leadership Score = CHA * Leadership * Tactics
            soldier.LeadershipRating = soldier.Ego
                                       * soldier.GetTotalSkillValue(_skillsByName["Leadership"])
                                       * soldier.GetTotalSkillValue(_skillsByName["Tactics"])
                                       / (UnityEngine.Random.Range(12.6f, 15.4f) * UnityEngine.Random.Range(1.26f, 1.54f) * UnityEngine.Random.Range(1.26f, 1.54f));
            // Ancient Score = EGO * BOD
            soldier.AncientRating = soldier.Ego * soldier.Constitution
                                    / (UnityEngine.Random.Range(1.26f, 1.54f) * UnityEngine.Random.Range(2.88f, 3.52f));
            // Medical Score = INT * Medicine
            soldier.MedicalRating =
                soldier.GetTotalSkillValue(_skillsByName["Diagnosis"])
                * soldier.GetTotalSkillValue(_skillsByName["First Aid"])
                / (UnityEngine.Random.Range(0.99f, 1.21f) * UnityEngine.Random.Range(1.17f, 1.43f));
            // Tech Score =  INT * TechRapair
            soldier.TechRating =
                soldier.GetTotalSkillValue(_skillsByName["Armory (Small Arms)"])
                * soldier.GetTotalSkillValue(_skillsByName["Armory (Vehicle)"])
                / (UnityEngine.Random.Range(1.17f, 1.43f) * UnityEngine.Random.Range(1.17f, 1.43f));
            // Piety Score = Piety * Ritual * Persuade
            soldier.PietyRating =
                soldier.GetTotalSkillValue(_skillsByName["Theology (Emperor of Man)"])
                / UnityEngine.Random.Range(0.108f, 0.132f);
        }
예제 #15
0
 public void ReadyToStep(PlayerSoldier zombie, bool isPc = false)
 {
     isReadyToStep = true;
     if (!isPc)
     {
         ColorTile();
     }
     //if(soldier == null || !soldier.IsEnemy(zombie)) {
     //    soldier = zombie;
     //}
     //else {
     //    attackingZombie = zombie as Zombie;
     //}
     if (soldier != null && soldier.IsEnemy(zombie))
     {
         attackingZombie = zombie as Zombie;
     }
     else if (soldier == null)
     {
         soldier = zombie;
     }
 }
        public void SavePlayerSoldier(IDbTransaction transaction, PlayerSoldier playerSoldier)
        {
            string     insert  = $@"INSERT INTO PlayerSoldier VALUES ({playerSoldier.Id}, 
                {playerSoldier.MeleeRating}, {playerSoldier.RangedRating}, {playerSoldier.LeadershipRating},
                {playerSoldier.MedicalRating}, {playerSoldier.TechRating}, {playerSoldier.PietyRating},
                {playerSoldier.AncientRating},{playerSoldier.ProgenoidImplantDate.Millenium},
                {playerSoldier.ProgenoidImplantDate.Year},{playerSoldier.ProgenoidImplantDate.Week});";
            IDbCommand command = transaction.Connection.CreateCommand();

            command.CommandText = insert;
            command.ExecuteNonQuery();

            foreach (KeyValuePair <int, ushort> weaponCasualtyCount in playerSoldier.WeaponCasualtyCountMap)
            {
                insert              = $@"INSERT INTO PlayerSoldierWeaponCasualtyCount VALUES ({playerSoldier.Id}, 
                    {weaponCasualtyCount.Key}, {weaponCasualtyCount.Value});";
                command             = transaction.Connection.CreateCommand();
                command.CommandText = insert;
                command.ExecuteNonQuery();
            }

            foreach (KeyValuePair <int, ushort> factionCasualtyCount in playerSoldier.FactionCasualtyCountMap)
            {
                insert              = $@"INSERT INTO PlayerSoldierFactionCasualtyCount VALUES ({playerSoldier.Id}, 
                    {factionCasualtyCount.Key}, {factionCasualtyCount.Value});";
                command             = transaction.Connection.CreateCommand();
                command.CommandText = insert;
                command.ExecuteNonQuery();
            }

            foreach (string entry in playerSoldier.SoldierHistory)
            {
                string safeEntry = entry.Replace("\'", "\'\'");
                insert              = $@"INSERT INTO PlayerSoldierHistory VALUES ({playerSoldier.Id}, '{safeEntry}');";
                command             = transaction.Connection.CreateCommand();
                command.CommandText = insert;
                command.ExecuteNonQuery();
            }
        }
예제 #17
0
    public void MakeStep()
    {
        if (isReadyToStep)
        {
            isReadyToStep = false;

            if (attackingZombie != null && attackingZombie is Zombie)
            {
                (attackingZombie as Zombie).GetCloser(soldier);
                attackingZombie = null;
            }

            else if (soldier is Zombie)
            {
                (soldier as Zombie).Walk(this);
            }
            if (Globals.IS_SINGLE_PLAYER && !(soldier is Flag))
            {
                GameManager.Instance.PassTurn();
            }
        }
    }
예제 #18
0
        private List <PlayerSoldier> RemoveSoldiersKilledInBattle()
        {
            List <PlayerSoldier> dead = new List <PlayerSoldier>();

            foreach (BattleSoldier soldier in _startingPlayerBattleSoldiers)
            {
                foreach (HitLocation hl in soldier.Soldier.Body.HitLocations)
                {
                    if (hl.Template.IsVital && hl.IsSevered)
                    {
                        // if a vital part is severed, they're dead
                        PlayerSoldier playerSoldier =
                            GameSettings.Chapter.PlayerSoldierMap[soldier.Soldier.Id];
                        dead.Add(playerSoldier);
                        Squad squad = playerSoldier.AssignedSquad;
                        playerSoldier.AssignedSquad = null;
                        squad.RemoveSquadMember(playerSoldier);
                        GameSettings.Chapter.PlayerSoldierMap.Remove(soldier.Soldier.Id);
                        break;
                    }
                }
            }
            return(dead);
        }
        private Dictionary <int, PlayerSoldier> GetPlayerSoldiers(IDbConnection connection,
                                                                  IReadOnlyDictionary <int, Soldier> baseSoldierMap,
                                                                  IReadOnlyDictionary <int, Dictionary <int, ushort> > factionCasualtyMap,
                                                                  IReadOnlyDictionary <int, Dictionary <int, ushort> > weaponCasualtyMap,
                                                                  IReadOnlyDictionary <int, List <string> > historyMap)
        {
            Dictionary <int, PlayerSoldier> playerSoldierMap = new Dictionary <int, PlayerSoldier>();
            IDbCommand command = connection.CreateCommand();

            command.CommandText = "SELECT * FROM PlayerSoldier";
            var reader = command.ExecuteReader();

            while (reader.Read())
            {
                int   soldierId        = reader.GetInt32(0);
                float melee            = (float)reader[1];
                float ranged           = (float)reader[2];
                float leadership       = (float)reader[3];
                float medical          = (float)reader[4];
                float tech             = (float)reader[5];
                float piety            = (float)reader[6];
                float ancient          = (float)reader[7];
                int   implantMillenium = reader.GetInt32(8);
                int   implantYear      = reader.GetInt32(9);
                int   implantWeek      = reader.GetInt32(10);

                Date implantDate = new Date(implantMillenium, implantYear, implantWeek);

                List <string> history;
                if (historyMap.ContainsKey(soldierId))
                {
                    history = historyMap[soldierId];
                }
                else
                {
                    history = new List <string>();
                }

                Dictionary <int, ushort> weaponCasualties;
                if (weaponCasualtyMap.ContainsKey(soldierId))
                {
                    weaponCasualties = weaponCasualtyMap[soldierId];
                }
                else
                {
                    weaponCasualties = new Dictionary <int, ushort>();
                }

                Dictionary <int, ushort> factionCasualties;
                if (factionCasualtyMap.ContainsKey(soldierId))
                {
                    factionCasualties = factionCasualtyMap[soldierId];
                }
                else
                {
                    factionCasualties = new Dictionary <int, ushort>();
                }

                PlayerSoldier playerSoldier = new PlayerSoldier(baseSoldierMap[soldierId], melee, ranged,
                                                                leadership, medical, tech, piety, ancient,
                                                                implantDate, history, weaponCasualties,
                                                                factionCasualties);

                playerSoldierMap[soldierId] = playerSoldier;
            }
            return(playerSoldierMap);
        }
예제 #20
0
 public bool IsEnemy(PlayerSoldier enemy)
 {
     return(CurrentSide != enemy.CurrentSide);
 }
 public void PlaceSoldier(Tile tile, PlayerSoldier soldier, bool isSoundActivated = true)
 {
     soldier.SoldierPlacedInEditMode(isSoundActivated);
     SoldierManager.Instance.PlaceSoldier(tile, soldier);
     MenuLogic.Instance.BuySoldier(soldier.Price);
 }
예제 #22
0
 private void Awake()
 {
     PlayerPlane = new Plane(Vector3.up, transform.position);
     current = this;
 }
예제 #23
0
        public void EvaluateSoldier(PlayerSoldier soldier, Date trainingFinishedYear)
        {
            UpdateRatings(soldier);

            //if (soldier.MeleeRating > 115) soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Adamantium Sword of the Emperor badge during training");
            if (soldier.MeleeRating > 100)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Gold Sword of the Emperor badge during training");
            }
            else if (soldier.MeleeRating > 95)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Silver Sword of the Emperor badge during training");
            }
            else if (soldier.MeleeRating > 86)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Bronze Sword of the Emperor badge during training");
            }

            if (soldier.RangedRating > 110)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Gold Marksman badge during training with " + soldier.GetBestSkillInCategory(SkillCategory.Ranged).BaseSkill.Name);
            }
            else if (soldier.RangedRating > 105)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Silver Marksman badge during training with " + soldier.GetBestSkillInCategory(SkillCategory.Ranged).BaseSkill.Name);
            }
            else if (soldier.RangedRating > 98)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Bronze Marksman badge during training with " + soldier.GetBestSkillInCategory(SkillCategory.Ranged).BaseSkill.Name);
            }

            if (soldier.LeadershipRating > 100)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Gold Voice of the Emperor badge during training");
            }
            else if (soldier.LeadershipRating > 70)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Silver Voice of the Emperor badge during training");
            }
            else if (soldier.LeadershipRating > 50)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Bronze Voice of the Emperor badge during training");
            }

            if (soldier.AncientRating > 125)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Gold Banner of the Emperor badge during training");
            }
            else if (soldier.AncientRating > 110)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Silver Banner of the Emperor badge during training");
            }
            else if (soldier.AncientRating > 95)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Bronze Banner of the Emperor badge during training");
            }

            if (soldier.MedicalRating > 75)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Flagged for potential training as Apothecary");
            }

            if (soldier.TechRating > 50)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Flagged for potential training as Techmarine");
            }

            if (soldier.PietyRating > 90)
            {
                soldier.AddEntryToHistory(trainingFinishedYear.ToString() + ": Awarded Devout badge and declared a Novice");
            }
        }