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