Beispiel #1
0
        protected Character SpawnBase(Team team, IMobSpawnMap map)
        {
            MonsterID   formData = BaseForm;
            MonsterData dex      = DataManager.Instance.GetMonster(formData.Species);

            if (formData.Form == -1)
            {
                int form = map.Rand.Next(dex.Forms.Count);
                formData.Form = form;
            }

            BaseMonsterForm formEntry = dex.Forms[formData.Form];

            if (formData.Gender == Gender.Unknown)
            {
                formData.Gender = formEntry.RollGender(map.Rand);
            }

            if (formData.Skin == -1)
            {
                formData.Skin = formEntry.RollSkin(map.Rand);
            }

            CharData character = new CharData();

            character.BaseForm = formData;
            character.Level    = Level.Pick(map.Rand);

            List <int> final_skills = formEntry.RollLatestSkills(character.Level, SpecifiedSkills);

            for (int ii = 0; ii < final_skills.Count; ii++)
            {
                character.BaseSkills[ii] = new SlotSkill(final_skills[ii]);
            }

            if (Intrinsic == -1)
            {
                character.BaseIntrinsics[0] = formEntry.RollIntrinsic(map.Rand, 2);
            }
            else
            {
                character.BaseIntrinsics[0] = Intrinsic;
            }

            character.Discriminator = map.Rand.Next();

            Character new_mob = new Character(character, team);

            team.Players.Add(new_mob);

            return(new_mob);
        }
Beispiel #2
0
        private int calcLength(Stat stat, BaseMonsterForm form, int statVal, int level)
        {
            int avgLevel = 0;

            for (int ii = 0; ii < DataManager.Instance.Save.ActiveTeam.Players.Count; ii++)
            {
                avgLevel += DataManager.Instance.Save.ActiveTeam.Players[ii].Level;
            }
            avgLevel /= DataManager.Instance.Save.ActiveTeam.Players.Count;
            int baseStat = form.ReverseGetStat(stat, statVal, level);

            baseStat = baseStat * level / avgLevel;
            return(Math.Min(Math.Max(1, baseStat * 140 / 120), 168));
        }
Beispiel #3
0
        public Character CreatePlayer(ReRandom rand, MonsterID form, int level, int intrinsic, int personality)
        {
            MonsterID   formData = form;
            MonsterData dex      = DataManager.Instance.GetMonster(formData.Species);

            CharData character = new CharData();

            character.BaseForm = formData;
            character.Level    = level;

            BaseMonsterForm formEntry = dex.Forms[formData.Form];

            List <int> final_skills = formEntry.RollLatestSkills(character.Level, new List <int>());

            for (int ii = 0; ii < final_skills.Count; ii++)
            {
                character.BaseSkills[ii] = new SlotSkill(final_skills[ii]);
            }

            if (form.Gender == Gender.Unknown)
            {
                character.BaseForm.Gender = dex.Forms[formData.Form].RollGender(rand);
            }

            if (intrinsic == -1)
            {
                character.BaseIntrinsics[0] = formEntry.RollIntrinsic(rand, 2);
            }
            else
            {
                character.BaseIntrinsics[0] = intrinsic;
            }

            if (personality == -1)
            {
                character.Discriminator = rand.Next();
            }
            else
            {
                character.Discriminator = personality;
            }


            character.OriginalUUID = DataManager.Instance.Save.UUID;
            character.OriginalTeam = DataManager.Instance.Save.ActiveTeam.Name;
            character.MetAt        = Text.FormatKey("MET_AT_START");

            return(CreatePlayer(character));
        }
        public override string GetString(MonsterID obj, Type type, object[] attributes)
        {
            string name = "???";

            if (obj.Species > -1)
            {
                MonsterData data = DataManager.Instance.GetMonster(obj.Species);
                if (obj.Form > -1)
                {
                    BaseMonsterForm form = data.Forms[obj.Form];
                    name = form.FormName.ToLocal();
                }
                else
                {
                    name = data.Name.ToLocal();
                }
            }
            if (obj.Skin > -1)
            {
                SkinData data = DataManager.Instance.GetSkin(obj.Skin);
                name = String.Format("[{0}] ", data.Name.ToLocal()) + name;
            }

            if (obj.Gender != Gender.Unknown)
            {
                char genderChar = '\0';
                switch (obj.Gender)
                {
                case Gender.Male:
                    genderChar = '\u2642';
                    break;

                case Gender.Female:
                    genderChar = '\u2640';
                    break;

                case Gender.Genderless:
                    genderChar = '-';
                    break;
                }

                if (genderChar != '\0' && name[name.Length - 1] != genderChar)
                {
                    name += genderChar;
                }
            }
            return(name);
        }
Beispiel #5
0
        public virtual void Promote(MonsterID data)
        {
            MonsterData     dex  = DataManager.Instance.GetMonster(BaseForm.Species);
            BaseMonsterForm form = dex.Forms[BaseForm.Form];

            BaseForm = data;

            int prevIndex = 0;

            if (form.Intrinsic2 == BaseIntrinsics[0])
            {
                prevIndex = 1;
            }
            else if (form.Intrinsic3 == BaseIntrinsics[0])
            {
                prevIndex = 2;
            }

            BaseIntrinsics.Clear();

            MonsterData     newDex  = DataManager.Instance.GetMonster(BaseForm.Species);
            BaseMonsterForm newForm = newDex.Forms[BaseForm.Form];

            if (prevIndex == 2 && newForm.Intrinsic3 == 0)
            {
                prevIndex = 0;
            }
            if (prevIndex == 1 && newForm.Intrinsic2 == 0)
            {
                prevIndex = 0;
            }

            if (prevIndex == 0)
            {
                BaseIntrinsics.Add(newForm.Intrinsic1);
            }
            else if (prevIndex == 1)
            {
                BaseIntrinsics.Add(newForm.Intrinsic2);
            }
            else if (prevIndex == 2)
            {
                BaseIntrinsics.Add(newForm.Intrinsic3);
            }
        }
Beispiel #6
0
        public static bool CanLearnSkill(Character character, Character user, int slot, bool held)
        {
            BaseMonsterForm entry   = DataManager.Instance.GetMonster(character.BaseForm.Species).Forms[character.BaseForm.Form];
            int             itemNum = -1;

            if (slot == BattleContext.FLOOR_ITEM_SLOT)
            {
                //item on the ground
                int     mapSlot = ZoneManager.Instance.CurrentMap.GetItem(user.CharLoc);
                MapItem mapItem = ZoneManager.Instance.CurrentMap.Items[mapSlot];
                itemNum = mapItem.Value;
            }
            else
            {
                if (held)
                {
                    itemNum = DataManager.Instance.Save.ActiveTeam.Players[slot].EquippedItem.ID;
                }
                else
                {
                    itemNum = DataManager.Instance.Save.ActiveTeam.GetInv(slot).ID;
                }
            }

            ItemData       itemData = DataManager.Instance.GetItem(itemNum);
            ItemIndexState effect   = itemData.ItemStates.GetWithDefault <ItemIndexState>();

            //check for already knowing the skill
            for (int ii = 0; ii < character.BaseSkills.Count; ii++)
            {
                if (character.BaseSkills[ii].SkillNum == effect.Index)
                {
                    return(false);
                }
            }

            if (!DataManager.Instance.DataIndices[DataManager.DataType.Skill].Entries[effect.Index].Released)
            {
                return(false);
            }

            return(entry.CanLearnSkill(effect.Index));
        }
        public void SetCurrentChar(CharData chara)
        {
            CurrentChar = chara;
            if (CurrentChar == null)
            {
                return;
            }

            Portrait.Speaker = CurrentChar.BaseForm;
            Nickname.Text    = CurrentChar.BaseName;
            Name.Text        = CurrentChar.FullFormName;

            BaseMonsterForm formData = DataManager.Instance.GetMonster(CurrentChar.BaseForm.Species).Forms[CurrentChar.BaseForm.Form];

            Level.Text = Text.FormatKey("MENU_TEAM_LEVEL_SHORT", CurrentChar.Level);
            ElementData element1   = DataManager.Instance.GetElement(formData.Element1);
            ElementData element2   = DataManager.Instance.GetElement(formData.Element2);
            string      typeString = String.Format("{0}\u2060{1}", element1.Symbol, element1.Name.ToLocal());

            if (formData.Element2 != 00)
            {
                typeString += "/" + String.Format("{0}\u2060{1}", element2.Symbol, element1.Name.ToLocal());
            }

            Elements.Text = typeString;

            for (int ii = 0; ii < CharData.MAX_SKILL_SLOTS; ii++)
            {
                SlotSkill   skill       = CurrentChar.BaseSkills[ii];
                SkillData   data        = DataManager.Instance.GetSkill(skill.SkillNum);
                ElementData element     = DataManager.Instance.GetElement(data.Data.Element);
                string      skillString = "-----";
                if (skill.SkillNum > -1)
                {
                    skillString = String.Format("{0}\u2060{1}", element.Symbol, data.Name.ToLocal());
                }
                Skills[ii].Text = skillString;
            }

            IntrinsicData entry = DataManager.Instance.GetIntrinsic(CurrentChar.BaseIntrinsics[0]);

            Intrinsic.Text = entry.Name.ToLocal();
        }
        public void SetCurrentChar(CharData chara)
        {
            CurrentChar = chara;
            if (CurrentChar == null)
            {
                return;
            }

            Portrait.Speaker = CurrentChar.BaseForm;
            Nickname.SetText(CurrentChar.BaseName);
            Name.SetText(CharData.GetFullFormName(CurrentChar.BaseForm));

            BaseMonsterForm formData = DataManager.Instance.GetMonster(CurrentChar.BaseForm.Species).Forms[CurrentChar.BaseForm.Form];

            Level.SetText(Text.FormatKey("MENU_TEAM_LEVEL_SHORT", CurrentChar.Level));
            ElementData element1   = DataManager.Instance.GetElement(formData.Element1);
            ElementData element2   = DataManager.Instance.GetElement(formData.Element2);
            string      typeString = element1.GetIconName();

            if (formData.Element2 != 00)
            {
                typeString += "/" + element2.GetIconName();
            }

            Elements.SetText(typeString);

            for (int ii = 0; ii < CharData.MAX_SKILL_SLOTS; ii++)
            {
                SlotSkill skill       = CurrentChar.BaseSkills[ii];
                SkillData data        = DataManager.Instance.GetSkill(skill.SkillNum);
                string    skillString = "-----";
                if (skill.SkillNum > -1)
                {
                    skillString = data.GetIconName();
                }
                Skills[ii].SetText(skillString);
            }

            IntrinsicData entry = DataManager.Instance.GetIntrinsic(CurrentChar.BaseIntrinsics[0]);

            Intrinsic.SetText(entry.GetColoredName());
        }
        public void Initialize(GameProgress ending)
        {
            Bounds = Rect.FromPoints(new Loc(GraphicsManager.ScreenWidth / 2 - 140, 16), new Loc(GraphicsManager.ScreenWidth / 2 + 140, 224));
            Ending = ending;

            Title = new MenuText(GetTitle(),
                                 new Loc(GraphicsManager.ScreenWidth / 2, Bounds.Y + GraphicsManager.MenuBG.TileHeight), DirH.None);

            Div = new MenuDivider(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth, GraphicsManager.MenuBG.TileHeight + LINE_SPACE), Bounds.End.X - Bounds.X - GraphicsManager.MenuBG.TileWidth * 2);

            List <Character> charList = GetChars();

            Stats     = new MenuText[charList.Count * 4];
            Portraits = new SpeakerPortrait[charList.Count];
            for (int ii = 0; ii < charList.Count; ii++)
            {
                CharData        character = charList[ii];
                MonsterData     dexEntry  = DataManager.Instance.GetMonster(character.BaseForm.Species);
                BaseMonsterForm formEntry = dexEntry.Forms[character.BaseForm.Form];
                Portraits[ii] = new SpeakerPortrait(character.BaseForm, new EmoteStyle(0),
                                                    Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + 44 * ii + TitledStripMenu.TITLE_OFFSET), false);
                string speciesText = character.BaseName + " / " + CharData.GetFullFormName(character.BaseForm);
                Stats[ii * 4] = new MenuText(speciesText,
                                             Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + 44 * ii + TitledStripMenu.TITLE_OFFSET));
                Stats[ii * 4 + 1] = new MenuText(Text.FormatKey("MENU_TEAM_LEVEL_SHORT", character.Level),
                                                 new Loc(Bounds.End.X - GraphicsManager.MenuBG.TileWidth * 2 - 24, Bounds.Y + GraphicsManager.MenuBG.TileHeight + 44 * ii + TitledStripMenu.TITLE_OFFSET));
                if (Ending.UUID == character.OriginalUUID)
                {
                    Stats[ii * 4 + 2] = new MenuText(Text.FormatKey("MENU_TEAM_MET_AT", character.MetAt),
                                                     Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE + 44 * ii + TitledStripMenu.TITLE_OFFSET));
                }
                else
                {
                    Stats[ii * 4 + 2] = new MenuText(Text.FormatKey("MENU_TEAM_TRADED_FROM", character.OriginalTeam),
                                                     Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE + 44 * ii + TitledStripMenu.TITLE_OFFSET));
                }
                Stats[ii * 4 + 3] = new MenuText((String.IsNullOrEmpty(character.DefeatAt) ? "" : Text.FormatKey("MENU_TEAM_FELL_AT", character.DefeatAt)),
                                                 Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 2 + 44 * ii + TitledStripMenu.TITLE_OFFSET));

                base.Initialize();
            }
        }
Beispiel #10
0
        private void btnRollSkill_Click(object sender, EventArgs e)
        {
            if (DungeonScene.Instance.ActiveTeam.Players.Count > 0 && Dungeon.DungeonScene.Instance.FocusedCharacter != null)
            {
                Character       character = DungeonScene.Instance.FocusedCharacter;
                BaseMonsterForm form      = DataManager.Instance.GetMonster(character.BaseForm.Species).Forms[character.BaseForm.Form];

                while (character.BaseSkills[0].SkillNum > -1)
                {
                    character.DeleteSkill(0);
                }
                List <int> final_skills = form.RollLatestSkills(character.Level, new List <int>());
                foreach (int skill in final_skills)
                {
                    character.LearnSkill(skill, true);
                }

                DungeonScene.Instance.LogMsg(String.Format("Skills reloaded"), false, true);
            }
        }
        public MemberInfoMenu(int teamSlot, bool assembly, bool allowAssembly)
        {
            Bounds = Rect.FromPoints(new Loc(24, 16), new Loc(296, 224));

            this.teamSlot      = teamSlot;
            this.assembly      = assembly;
            this.allowAssembly = allowAssembly;

            Character player = assembly ? DataManager.Instance.Save.ActiveTeam.Assembly[teamSlot] : DataManager.Instance.Save.ActiveTeam.Players[teamSlot];

            //TODO: align the page text properly
            Title = new MenuText(Text.FormatKey("MENU_TEAM_INFO") + " (3/3)", Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth + 8, GraphicsManager.MenuBG.TileHeight));
            Div   = new MenuDivider(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth, GraphicsManager.MenuBG.TileHeight + LINE_SPACE), Bounds.End.X - Bounds.X - GraphicsManager.MenuBG.TileWidth * 2);


            MonsterData     dexEntry  = DataManager.Instance.GetMonster(player.BaseForm.Species);
            BaseMonsterForm formEntry = dexEntry.Forms[player.BaseForm.Form];

            Portrait = new SpeakerPortrait(player.BaseForm, new EmoteStyle(0),
                                           Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + TitledStripMenu.TITLE_OFFSET), false);

            string speciesName = dexEntry.GetColoredName();

            if (player.BaseForm.Skin > 0)
            {
                speciesName += " (" + DataManager.Instance.GetSkin(player.BaseForm.Skin).GetColoredName() + ")";
            }
            if (player.BaseForm.Gender != Gender.Genderless)
            {
                speciesName += (player.BaseForm.Gender == Gender.Male) ? " (\u2642)" : " (\u2640)";
            }
            else
            {
                speciesName += " (-)";
            }
            Species  = new MenuText(Text.FormatKey("MENU_TEAM_SPECIES", speciesName), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 0 + TitledStripMenu.TITLE_OFFSET));
            Category = new MenuText(dexEntry.Title.ToLocal(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 1 + TitledStripMenu.TITLE_OFFSET));
            if (DataManager.Instance.Save.UUID == player.OriginalUUID)
            {
                MetAt = new MenuText(Text.FormatKey("MENU_TEAM_MET_AT", player.MetAt), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 2 + TitledStripMenu.TITLE_OFFSET));
            }
            else
            {
                MetAt = new MenuText(Text.FormatKey("MENU_TEAM_TRADED_FROM", player.OriginalTeam), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 2 + TitledStripMenu.TITLE_OFFSET));
            }
            MainDiv = new MenuDivider(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 5), Bounds.End.X - Bounds.X - GraphicsManager.MenuBG.TileWidth * 2);

            Promotions = new MenuText(Text.FormatKey("MENU_TEAM_PROMOTION"), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 4 + TitledStripMenu.TITLE_OFFSET));
            List <MenuText> validPromotions = new List <MenuText>();

            bool inDungeon = (GameManager.Instance.CurrentScene == DungeonScene.Instance);

            for (int ii = 0; ii < dexEntry.Promotions.Count; ii++)
            {
                if (!DataManager.Instance.DataIndices[DataManager.DataType.Monster].Entries[dexEntry.Promotions[ii].Result].Released)
                {
                    continue;
                }
                if (dexEntry.Promotions[ii].IsQualified(player, inDungeon))
                {
                    validPromotions.Add(new MenuText(DataManager.Instance.GetMonster(dexEntry.Promotions[ii].Result).GetColoredName() + ": " + dexEntry.Promotions[ii].GetReqString(),
                                                     Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * (validPromotions.Count + 5) + TitledStripMenu.TITLE_OFFSET)));
                }
                else
                {
                    bool hardReq = false;
                    foreach (PromoteDetail detail in dexEntry.Promotions[ii].Details)
                    {
                        if (detail.IsHardReq() && !detail.GetReq(player))
                        {
                            hardReq = true;
                            break;
                        }
                    }
                    if (!hardReq)
                    {
                        validPromotions.Add(new MenuText(DataManager.Instance.GetMonster(dexEntry.Promotions[ii].Result).GetColoredName() + ": " + dexEntry.Promotions[ii].GetReqString(),
                                                         Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * (validPromotions.Count + 5) + TitledStripMenu.TITLE_OFFSET), Color.Red));
                    }
                }
            }
            if (validPromotions.Count > 0)
            {
                PromoteMethods = validPromotions.ToArray();
            }
            else
            {
                PromoteMethods    = new MenuText[1];
                PromoteMethods[0] = new MenuText(Text.FormatKey("MENU_TEAM_PROMOTE_NONE"), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 5 + TitledStripMenu.TITLE_OFFSET));
            }
        }
Beispiel #12
0
        //allow moving up and down (but don't alter the team choice selection because it's hard)

        public MemberStatsMenu(int teamSlot, bool assembly, bool allowAssembly)
        {
            Bounds = Rect.FromPoints(new Loc(24, 16), new Loc(296, 224));

            this.teamSlot      = teamSlot;
            this.assembly      = assembly;
            this.allowAssembly = allowAssembly;

            Character player = assembly ? DataManager.Instance.Save.ActiveTeam.Assembly[teamSlot] : DataManager.Instance.Save.ActiveTeam.Players[teamSlot];

            //TODO: align the page text properly
            Title = new MenuText(Text.FormatKey("MENU_STATS_TITLE") + " (2/3)", Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth + 8, GraphicsManager.MenuBG.TileHeight));
            Div   = new MenuDivider(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth, GraphicsManager.MenuBG.TileHeight + LINE_SPACE), Bounds.End.X - Bounds.X - GraphicsManager.MenuBG.TileWidth * 2);


            Portrait = new SpeakerPortrait(player.BaseForm, new EmoteStyle(0),
                                           Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + TitledStripMenu.TITLE_OFFSET), false);
            string speciesText = player.BaseName + " / " + player.FullFormName;

            Name = new MenuText(speciesText, Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + TitledStripMenu.TITLE_OFFSET));

            ElementData element1 = DataManager.Instance.GetElement(player.Element1);
            ElementData element2 = DataManager.Instance.GetElement(player.Element2);

            string typeString = String.Format("{0}\u2060{1}", element1.Symbol, element1.Name.ToLocal());

            if (player.Element2 != 00)
            {
                typeString += "/" + String.Format("{0}\u2060{1}", element2.Symbol, element2.Name.ToLocal());
            }
            BaseMonsterForm monsterForm  = DataManager.Instance.GetMonster(player.BaseForm.Species).Forms[player.BaseForm.Form];
            bool            origElements = (player.Element1 == monsterForm.Element1);

            origElements &= (player.Element2 == monsterForm.Element2);
            Elements      = new MenuText(Text.FormatKey("MENU_TEAM_ELEMENT", typeString), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 1 + TitledStripMenu.TITLE_OFFSET), origElements ? Color.White : Color.Yellow);

            Level = new MenuText(Text.FormatKey("MENU_TEAM_LEVEL_SHORT", player.Level), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 48, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 2 + TitledStripMenu.TITLE_OFFSET));

            int expToNext = 0;

            if (player.Level < DataManager.Instance.MaxLevel)
            {
                int        growth     = DataManager.Instance.GetMonster(player.BaseForm.Species).EXPTable;
                GrowthData growthData = DataManager.Instance.GetGrowth(growth);
                expToNext = growthData.GetExpToNext(player.Level);
            }
            EXP = new MenuText(Text.FormatKey("MENU_TEAM_EXP", player.EXP, expToNext),
                               Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 3 + TitledStripMenu.TITLE_OFFSET));

            MainDiv = new MenuDivider(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 5), Bounds.End.X - Bounds.X - GraphicsManager.MenuBG.TileWidth * 2);

            StatsTitle = new MenuText(Text.FormatKey("MENU_TEAM_STATS"), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 4 + TitledStripMenu.TITLE_OFFSET));

            HPLabel      = new MenuText(Text.FormatKey("MENU_LABEL", Data.Stat.HP.ToLocal("tiny")), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 5 + TitledStripMenu.TITLE_OFFSET));
            AttackLabel  = new MenuText(Text.FormatKey("MENU_LABEL", Data.Stat.Attack.ToLocal("tiny")), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 6 + TitledStripMenu.TITLE_OFFSET), player.ProxyAtk > -1 ? Color.Yellow : Color.White);
            DefenseLabel = new MenuText(Text.FormatKey("MENU_LABEL", Data.Stat.Defense.ToLocal("tiny")), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 7 + TitledStripMenu.TITLE_OFFSET), player.ProxyDef > -1 ? Color.Yellow : Color.White);
            MAtkLabel    = new MenuText(Text.FormatKey("MENU_LABEL", Data.Stat.MAtk.ToLocal("tiny")), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 8 + TitledStripMenu.TITLE_OFFSET), player.ProxyMAtk > -1 ? Color.Yellow : Color.White);
            MDefLabel    = new MenuText(Text.FormatKey("MENU_LABEL", Data.Stat.MDef.ToLocal("tiny")), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 9 + TitledStripMenu.TITLE_OFFSET), player.ProxyMDef > -1 ? Color.Yellow : Color.White);
            SpeedLabel   = new MenuText(Text.FormatKey("MENU_LABEL", Data.Stat.Speed.ToLocal("tiny")), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 8, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 10 + TitledStripMenu.TITLE_OFFSET), player.ProxySpeed > -1 ? Color.Yellow : Color.White);

            HP      = new MenuText(player.MaxHP.ToString(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 72, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 5 + TitledStripMenu.TITLE_OFFSET), DirH.Right);
            Attack  = new MenuText(player.Atk.ToString(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 72, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 6 + TitledStripMenu.TITLE_OFFSET), DirV.Up, DirH.Right, player.ProxyAtk > -1 ? Color.Yellow : Color.White);
            Defense = new MenuText(player.Def.ToString(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 72, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 7 + TitledStripMenu.TITLE_OFFSET), DirV.Up, DirH.Right, player.ProxyDef > -1 ? Color.Yellow : Color.White);
            MAtk    = new MenuText(player.MAtk.ToString(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 72, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 8 + TitledStripMenu.TITLE_OFFSET), DirV.Up, DirH.Right, player.ProxyMAtk > -1 ? Color.Yellow : Color.White);
            MDef    = new MenuText(player.MDef.ToString(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 72, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 9 + TitledStripMenu.TITLE_OFFSET), DirV.Up, DirH.Right, player.ProxyMDef > -1 ? Color.Yellow : Color.White);
            Speed   = new MenuText(player.Speed.ToString(), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 72, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 10 + TitledStripMenu.TITLE_OFFSET), DirV.Up, DirH.Right, player.ProxySpeed > -1 ? Color.Yellow : Color.White);

            int hpLength = calcLength(Stat.HP, monsterForm, player.MaxHP, player.Level);

            HPBar = new MenuStatBar(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 76, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 5 + TitledStripMenu.TITLE_OFFSET), hpLength, calcColor(hpLength));
            int atkLength = calcLength(Stat.Attack, monsterForm, player.Atk, player.Level);

            AttackBar = new MenuStatBar(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 76, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 6 + TitledStripMenu.TITLE_OFFSET), atkLength, calcColor(atkLength));
            int defLength = calcLength(Stat.Defense, monsterForm, player.Def, player.Level);

            DefenseBar = new MenuStatBar(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 76, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 7 + TitledStripMenu.TITLE_OFFSET), defLength, calcColor(defLength));
            int mAtkLength = calcLength(Stat.MAtk, monsterForm, player.MAtk, player.Level);

            MAtkBar = new MenuStatBar(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 76, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 8 + TitledStripMenu.TITLE_OFFSET), mAtkLength, calcColor(mAtkLength));
            int mDefLength = calcLength(Stat.MDef, monsterForm, player.MDef, player.Level);

            MDefBar = new MenuStatBar(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 76, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 9 + TitledStripMenu.TITLE_OFFSET), mDefLength, calcColor(mDefLength));
            int speedLength = calcLength(Stat.Speed, monsterForm, player.Speed, player.Level);

            SpeedBar = new MenuStatBar(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2 + 76, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 10 + TitledStripMenu.TITLE_OFFSET), speedLength, calcColor(speedLength));

            ItemDiv = new MenuDivider(Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 12), Bounds.End.X - Bounds.X - GraphicsManager.MenuBG.TileWidth * 2);

            Item = new MenuText(player.EquippedItem.ID > -1 ? Text.FormatKey("MENU_HELD_ITEM", player.EquippedItem.GetName()) : Text.FormatKey("MENU_HELD_NO_ITEM"), Bounds.Start + new Loc(GraphicsManager.MenuBG.TileWidth * 2, GraphicsManager.MenuBG.TileHeight + VERT_SPACE * 11 + TitledStripMenu.TITLE_OFFSET));
        }
Beispiel #13
0
        public override void OnPromote(Character character)
        {
            ExplorerTeam team = character.MemberTeam as ExplorerTeam;

            if (team == null)
            {
                return;
            }
            if (character.MemberTeam.Players.Count == team.GetMaxTeam(ZoneManager.Instance.CurrentZone))
            {
                return;
            }

            //if character has an open team slot, spawn the new character based on the stats of the current one

            MonsterID   formData = new MonsterID(ShedSpecies, 0, character.BaseForm.Skin, Gender.Genderless);
            MonsterData dex      = DataManager.Instance.GetMonster(formData.Species);

            CharData newChar = new CharData();

            newChar.BaseForm = formData;
            newChar.Level    = character.Level;

            newChar.MaxHPBonus = character.MaxHPBonus;
            newChar.AtkBonus   = character.AtkBonus;
            newChar.DefBonus   = character.DefBonus;
            newChar.MAtkBonus  = character.MAtkBonus;
            newChar.MDefBonus  = character.MDefBonus;
            newChar.SpeedBonus = character.SpeedBonus;

            BaseMonsterForm forme = dex.Forms[formData.Form];

            for (int ii = 0; ii < character.BaseSkills.Count; ii++)
            {
                newChar.BaseSkills[ii] = new SlotSkill(character.BaseSkills[ii]);
            }

            newChar.BaseIntrinsics[0] = forme.RollIntrinsic(DataManager.Instance.Save.Rand, 2);

            newChar.Discriminator = character.Discriminator;
            newChar.MetAt         = character.MetAt;
            newChar.MetLoc        = character.MetLoc;
            foreach (BattleEvent effect in character.ActionEvents)
            {
                newChar.ActionEvents.Add((BattleEvent)effect.Clone());
            }

            Character player = new Character(newChar, character.MemberTeam);

            foreach (BackReference <Skill> move in player.Skills)
            {
                if (move.Element.SkillNum > -1)
                {
                    SkillData entry = DataManager.Instance.GetSkill(move.Element.SkillNum);
                    move.Element.Enabled = (entry.Data.Category == BattleData.SkillCategory.Physical || entry.Data.Category == BattleData.SkillCategory.Magical);
                }
            }
            player.Tactic = new AITactic(character.Tactic);
            character.MemberTeam.Players.Add(player);

            Loc?endLoc = ZoneManager.Instance.CurrentMap.GetClosestTileForChar(player, character.CharLoc);

            if (endLoc == null)
            {
                endLoc = character.CharLoc;
            }

            player.CharLoc = endLoc.Value;

            ZoneManager.Instance.CurrentMap.UpdateExploration(player);

            player.RefreshTraits();

            DataManager.Instance.Save.RegisterMonster(newChar.BaseForm.Species);
            DataManager.Instance.Save.RogueUnlockMonster(newChar.BaseForm.Species);
        }
        public static void StartFlow(MonsterID monId, string name, int backPhase)
        {
            if (monId.Species == -1 || backPhase == 0)
            {
                if (DataManager.Instance.StartChars.Count > 1)
                {
                    int startIndex = 0;
                    if (backPhase == 0)
                    {
                        startIndex = DataManager.Instance.StartChars.FindIndex(start => start.mon == monId);
                    }
                    MenuManager.Instance.AddMenu(new MainStartingMenu(startIndex, (int index) =>
                    {
                        string newName = null;
                        if (DataManager.Instance.StartChars[index].name != "")
                        {
                            newName = DataManager.Instance.StartChars[index].name;
                        }
                        StartFlow(DataManager.Instance.StartChars[index].mon, newName, -1);
                    }, () => { }), false);
                    return;
                }
                else if (backPhase == 0)
                {
                    return;
                }
                else if (DataManager.Instance.StartChars.Count == 1)
                {
                    monId = DataManager.Instance.StartChars[0].mon;
                    if (DataManager.Instance.StartChars[0].name != "")
                    {
                        name = DataManager.Instance.StartChars[0].name;
                    }
                }
                else
                {
                    MenuManager.Instance.ClearMenus();
                    GameManager.Instance.SceneOutcome = DefaultBegin();
                    return;
                }
            }

            if (monId.Gender == Gender.Unknown || backPhase == 1)
            {
                MonsterData     monEntry = DataManager.Instance.GetMonster(monId.Species);
                BaseMonsterForm form     = monEntry.Forms[monId.Form];
                List <Gender>   genders  = form.GetPossibleGenders();
                if (genders.Count > 1)
                {
                    int startIndex = 0;
                    if (backPhase == 1)
                    {
                        startIndex = monId.Gender == Gender.Female ? 1 : 0;
                    }
                    List <DialogueChoice> choices = new List <DialogueChoice>();
                    choices.Add(new DialogueChoice(Text.FormatKey("MENU_BOY"), () =>
                    {
                        StartFlow(new MonsterID(monId.Species, monId.Form, monId.Skin, Gender.Male), name, -1);
                    }));
                    choices.Add(new DialogueChoice(Text.FormatKey("MENU_GIRL"), () =>
                    {
                        StartFlow(new MonsterID(monId.Species, monId.Form, monId.Skin, Gender.Female), name, -1);
                    }));
                    choices.Add(new DialogueChoice(Text.FormatKey("MENU_CANCEL"), () =>
                                                   { }));
                    MenuManager.Instance.AddMenu(MenuManager.Instance.CreateMultiQuestion(Text.FormatKey("DLG_ASK_GENDER"), false, choices, startIndex, choices.Count - 1), false);
                    return;
                }
                else if (backPhase == 1)
                {
                    StartFlow(new MonsterID(monId.Species, monId.Form, monId.Skin, Gender.Unknown), name, 0);
                    return;
                }
                else
                {
                    monId.Gender = genders[0];
                }
            }

            if (name == null)
            {
                MenuManager.Instance.AddMenu(new NicknameMenu((string name) =>
                {
                    StartFlow(monId, name, -1);
                }, () =>
                {
                    StartFlow(monId, null, 1);
                }), false);
                return;
            }

            //begin

            MenuManager.Instance.ClearMenus();
            GameManager.Instance.SceneOutcome = Begin(monId, name);
        }