示例#1
0
        /// <summary>
        /// Calculate base stats for a unit.
        /// </summary>
        /// <param name="character"></param>
        /// <returns></returns>
        public static Model.Stat CalculateBaseStats(Model.Character character)
        {
            Model.Stat baseStats = new Model.Stat();
            if (!Enum.IsDefined(typeof(Enums.Character), character.CharacterID) ||
                !Enum.IsDefined(typeof(Enums.Class), character.ClassID))
            {
                return(null);
            }

            var characterData = Data.Database.Characters.GetByID(character.CharacterID);
            var classData     = Data.Database.Classes.GetByID(character.ClassID);

            // Corrin and Bond units
            if (character.CorrinName != null)
            {
                if (Enum.IsDefined(typeof(Enums.Stat), character.Boon) &&
                    Enum.IsDefined(typeof(Enums.Stat), character.Bane))
                {
                    return(characterData.BaseStats +
                           Data.Database.Stats.GetByID(character.Boon).BaseBoonModifiers +
                           Data.Database.Stats.GetByID(character.Bane).BaseBaneModifiers +
                           classData.BaseStats);
                }
                else
                {
                    return(null);
                }
            }
            else // All other units
            {
                return(characterData.BaseStats + classData.BaseStats);
            }
        }
示例#2
0
            public Vitals(Model.Character c)
            {
                character = c;

                LastChildFill = false;
                Children.Add(new Label {
                    Content = "Body"
                });
                Children.Add(body_box);
                Children.Add(body_max);
                Children.Add(mind_max);
                Children.Add(mind_box);
                Children.Add(new Label {
                    Content = "Mind"
                });
                for (int i = 0; i < 3; i++)
                {
                    DockPanel.SetDock(Children[i], Dock.Left);
                }
                for (int i = 3; i < 6; i++)
                {
                    DockPanel.SetDock(Children[i], Dock.Right);
                }

                body_box.Change += v => character.body = v;
                mind_box.Change += v => character.mind = v;

                Update();
            }
示例#3
0
        // TODO: Revert Corrin
        // Remove marriage byte (otherwise paralogue 2 stays available)

        /// <summary>
        /// Level a unit, giving them the average gains that their growth rates would dictate
        /// </summary>
        public void LevelUp(Model.Character unit, int levels)
        {
            var characterGrowthRates = Data.Database.Characters.GetByID(unit.CharacterID).GrowthRates;
            var classGrowthRates     = Data.Database.Classes.GetByID(unit.ClassID).GrowthRates;
            var combinedGrowthRates  = characterGrowthRates + classGrowthRates;

            int hp; int str; int mag; int skl; int spd; int lck; int def; int res;

            hp = str = mag = skl = spd = lck = def = res = 0;
            for (var i = 0; i < levels; i++)
            {
                hp  += combinedGrowthRates.HP;
                str += combinedGrowthRates.Str;
                mag += combinedGrowthRates.Mag;
                skl += combinedGrowthRates.Skl;
                spd += combinedGrowthRates.Spd;
                lck += combinedGrowthRates.Lck;
                def += combinedGrowthRates.Def;
                res += combinedGrowthRates.Res;
            }

            unit.Level           += (byte)levels;
            unit.GainedStats.HP  += (sbyte)(hp / 100);
            unit.GainedStats.Str += (sbyte)(str / 100);
            unit.GainedStats.Mag += (sbyte)(mag / 100);
            unit.GainedStats.Skl += (sbyte)(skl / 100);
            unit.GainedStats.Spd += (sbyte)(spd / 100);
            unit.GainedStats.Lck += (sbyte)(lck / 100);
            unit.GainedStats.Def += (sbyte)(def / 100);
            unit.GainedStats.Res += (sbyte)(res / 100);
        }
示例#4
0
 public void LoadCharacter(Model.Character character)
 {
     if (character == null)
     {
         return;
     }
     _character = character;
     PopulateControls();
 }
示例#5
0
 public void SelectUnit(Model.Character unit)
 {
     if (lstLiving.Items.IndexOf(unit) > -1)
     {
         lstLiving.SelectedItem = unit;
     }
     else if (lstDead.Items.IndexOf(unit) > -1)
     {
         lstDead.SelectedItem = unit;
     }
 }
示例#6
0
 /// <summary>
 /// Calculate the true stats for a character
 /// </summary>
 /// <returns>A character's true stats</returns>
 public static Model.Stat CalculateTrueStats(Model.Character character)
 {
     Model.Stat baseStats = CalculateBaseStats(character);
     if (baseStats != null)
     {
         return(baseStats + character.GainedStats);
     }
     else
     {
         return(null);
     }
 }
示例#7
0
        private void SelectDeadCharacter(object sender, EventArgs e)
        {
            var character = (Model.Character)lstDead.SelectedItem;

            if (character == null)
            {
                return;
            }
            _selectedCharacter = character;
            LoadCharacter(character);
            lstLiving.ClearSelected();
        }
示例#8
0
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if ((null == value) || (false == (value is Model.Character)))
            {
                return(string.Empty);
            }

            Model.Character c = value as Model.Character;

            string s = string.Format("{0}:{1}", c.Id, c.Name);

            return(s);
        }
示例#9
0
        public static void OnOpenChest(Packet packet)
        {
            CmdOpenChest cmd = new CmdOpenChest(packet);

            if (packet.Sender.Character.Token != cmd.Token)
            {
                packet.SendBackError(12);
                return;
            }

            Model.Character character = packet.Sender.Character;

            if (character.CharacterDb.ChestCount > 0)
            {
                Random rnd                = new Random();
                int    attributeNumber    = rnd.Next(0, 4);
                int    unlockedItemNumber = rnd.Next(0, 8);
                var    entry              = packet.Sender.Character.CharacterDb.Account.Inventory;
                switch (attributeNumber)
                {
                case 0:
                    entry.Head = Utilities.AddAttributeItem(entry.Head, unlockedItemNumber);
                    break;

                case 1:
                    entry.Shirt = Utilities.AddAttributeItem(entry.Shirt, unlockedItemNumber);
                    break;

                case 2:
                    entry.Pant = Utilities.AddAttributeItem(entry.Pant, unlockedItemNumber);
                    break;

                case 3:
                    entry.Shoe = Utilities.AddAttributeItem(entry.Shoe, unlockedItemNumber);
                    break;
                }
                character.CharacterDb.ChestCount--;
                var ack = new GetChestRewardAck
                {
                    AttributeNumber = attributeNumber,
                    ItemNumber      = unlockedItemNumber
                };
                packet.SendBack(ack.CreatePacket());
            }
            else
            {
                packet.SendBackError(22);
            }
        }
示例#10
0
        public static void HandleAuth(Packet packet)
        {
            if (packet.Sender.Character != null)
            {
                packet.Sender.Character.CharacterDb.Account.IsLoggedIn = 0;
                ServerMain.Instance.Database.Save();
                // Save data
            }
            // Read the packet into readable format
            UserAuthPacket authPkt = new UserAuthPacket(packet);

            // Login and Retrieve the User
            Controller.Database.Tables.Character character = ServerMain.Instance.Database.GetCharacter(authPkt.Username);
            if (character == null || Password.GenerateSaltedHash(authPkt.Password, character.Account.Salt) != character.Account.Password)
            {
                packet.SendBackError(5);
                return;
            }
            if (character.Account.IsLoggedIn == 1)
            {
                packet.SendBackError(6);
                return;
            }
            if (character.Account.Permission == 0 && packet.Sender.IsTeacherClient())
            {
                packet.SendBackError(4);
                return;
            }
            // Prepare the Acknowledgment packet indicating success and token
            character.Account.IsLoggedIn   = 1;
            character.Account.LastLoggedIn = DateTime.Now;
            ServerMain.Instance.Database.Save();
            Model.Character model = new Model.Character();
            model.FromEntity(character);
            packet.Sender.Character = model;
            var ack = new UserAuthAck()
            {
                Token = model.Token
            };

            packet.Sender.Send(ack.CreatePacket());
            if (ServerMain.Instance.Server.LoggedInClient.ContainsKey(model.Token))
            {
                ServerMain.Instance.Server.LoggedInClient.Remove(model.Token);
            }
            ServerMain.Instance.Server.LoggedInClient.Add(model.Token, packet.Sender);
            return;
        }
示例#11
0
        /// <summary>
        /// Calculate stat caps for a character
        /// </summary>
        /// <returns>Character's stat caps</returns>
        public static Model.Stat CalculateStatCaps(Model.Character character)
        {
            if (!Enum.IsDefined(typeof(Enums.Character), character.CharacterID) ||
                !Enum.IsDefined(typeof(Enums.Class), character.ClassID))
            {
                return(null);
            }

            var characterData = Data.Database.Characters.GetByID(character.CharacterID);
            var classData     = Data.Database.Classes.GetByID(character.ClassID);

            if (character.CorrinName != null) // Corrin and bond units
            {
                if (Enum.IsDefined(typeof(Enums.Stat), character.Boon) &&
                    Enum.IsDefined(typeof(Enums.Stat), character.Bane))
                {
                    return(classData.MaximumStats +
                           Data.Database.Stats.GetByID(character.Boon).MaxBoonModifiers +
                           Data.Database.Stats.GetByID(character.Bane).MaxBaneModifiers +
                           character.StatueBonusStats);
                }
                else
                {
                    return(null);
                }
            }
            else if (characterData.IsChild) // Children
            {
                var childBonusStats = new Model.Stat {
                    HP = 0, Str = 1, Mag = 1, Skl = 1, Spd = 1, Lck = 1, Def = 1, Res = 1
                };
                return(classData.MaximumStats +
                       Data.Database.Characters.GetByID(character.FatherID).Modifiers +
                       Data.Database.Stats.GetByID(character.FatherBoon).MaxBoonModifiers +
                       Data.Database.Stats.GetByID(character.FatherBane).MaxBaneModifiers +
                       Data.Database.Characters.GetByID(character.MotherID).Modifiers +
                       Data.Database.Stats.GetByID(character.MotherBoon).MaxBoonModifiers +
                       Data.Database.Stats.GetByID(character.MotherBane).MaxBaneModifiers +
                       childBonusStats + character.StatueBonusStats);
            }
            else // All other units
            {
                return(classData.MaximumStats + characterData.Modifiers + character.StatueBonusStats);
            }
        }
示例#12
0
        public static void HandleRegistration(Packet packet)
        {
            if (packet.Sender.Character != null)
            {
                packet.Sender.Character.CharacterDb.Account.IsLoggedIn = 0;
                ServerMain.Instance.Database.Save();
            }
            CmdUserReg registrationPkt = new CmdUserReg(packet);

            Log.Debug("{0}", registrationPkt.ToString());
            var ack  = new UserRegAck();
            int code = ServerMain.Instance.Database.CheckIfAccountExist(registrationPkt.Username, registrationPkt.Email);

            if (code == 1)
            {
                packet.SendBackError(7, registrationPkt.Username);
                return;
            }
            else if (code == 2)
            {
                packet.SendBackError(8, registrationPkt.Email);
                return;
            }
            else if (registrationPkt.Username.Trim() == "" || registrationPkt.Password == "da39a3ee5e6b4b0d3255bfef95601890afd80709")
            {
                packet.SendBackError(9);
                return;
            }
            else if (!registrationPkt.Email.Contains(".edu."))
            {
                packet.SendBackError(10);
                return;
            }
            var salt = Password.CreateSalt(Password.SaltSize);

            ServerMain.Instance.Database.CreateAccount(registrationPkt.Username, registrationPkt.Email, registrationPkt.Password, registrationPkt.StudentName, registrationPkt.Class, registrationPkt.Year, registrationPkt.Semester, salt);
            Controller.Database.Tables.Character character = ServerMain.Instance.Database.GetCharacter(registrationPkt.Username);
            Model.Character model = new Model.Character();
            model.FromEntity(character);
            ack.Token = model.Token;
            packet.Sender.Character = model;
            packet.Sender.Send(ack.CreatePacket());
            ServerMain.Instance.Server.LoggedInClient.Add(model.Token, packet.Sender);
            return;
        }
示例#13
0
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if ((null == value) || (false == (value is Model.Target)))
            {
                return(string.Empty);
            }

            Model.Target t = value as Model.Target;

            if (false == ViewModel.Common.Instance.IsValidCharacter(t.CharacterId))
            {
                return(t.Id);
            }

            Model.Character c = ViewModel.Common.Instance.CharacterList[t.CharacterId];

            string s = string.Format("{0}:{1}", t.Id, c.Name);

            return(s);
        }
示例#14
0
        public Character(Model.Character c)
        {
            ModelObject = c;
            Codepoint   = "U+" + c.CodepointHex;
            Name        = c.Name;

            if (c.Codepoint <= 32)
            {
                Value           = char.ConvertFromUtf32(0x2400 + c.Codepoint);
                HasSpecialValue = true;
            }
            else if (c.Codepoint == 127)
            {
                Value           = "\u2421";
                HasSpecialValue = true;
            }
            else
            {
                Value           = c.Value;
                HasSpecialValue = false;
            }
        }
示例#15
0
 private bool IsDead(Model.Character unit)
 {
     return(unit.UnitBlock == Enums.UnitBlock.DeadByGameplay || unit.UnitBlock == Enums.UnitBlock.DeadByPlot);
 }
示例#16
0
 /// <summary>
 /// Load the unit viewer, then jump to a particular unit
 /// </summary>
 public void LoadUnitViewer(Model.Character unit)
 {
     LoadUnitViewer();
     SelectUnit(unit);
 }
示例#17
0
 public void LoadCharacter(Model.ChapterSave chapterSave, Model.Character unit)
 {
     _chapterSave = chapterSave;
     _unit        = unit;
     PopulateControls();
 }
示例#18
0
文件: TurnPanel.cs 项目: eivinsam/RPG
 public Turn(Model.Character c)
 {
     value     = delay(c.stats["NTU"]);
     character = c;
 }
示例#19
0
        // Get character

        protected void GetCharacter(bool ownCharacter)
        {
            try
            {
                Model.Character character = new Model.Character();
                if (!ownCharacter)
                {
                    int charID;
                    if (int.TryParse(Page.RouteData.Values["charID"].ToString(), out charID))
                    {
                        character = Service.GetCharacter(charID);
                    }
                    else
                    {
                        throw new ArgumentException("Felaktigt karaktärsID!");
                    }
                } 
                else 
                {
                    character = Service.GetCharacter(null, int.Parse(Context.User.Identity.Name));
                    CheckIfLevelUp(character);
                }
                if (character.Health > 0)
                {
                    CharacterPanel.Visible = true;
                    CharacterName.Text = character.Name;
                    CharacterRace.Text = String.Format("Ras: {0}", character.Race);
                    CharacterLevel.Text = String.Format("Level: {0}", character.Level);
                    CharacterExperience.Text = String.Format("Erfarenhetspoäng: {0}/{1}", character.Experience, GetNextLevelXP(character));
                    CharacterHealth.Text = String.Format("Livspoäng: {0}/{1}", character.Health, character.MaxHealth);
                    CharacterStanima.Text = String.Format("Uthållighetspoäng: {0}/{1}", character.Stanima, character.MaxStanima);
                    CharacterStrength.Text = String.Format("Styrka: {0}", character.Strength);
                    CharacterSpeed.Text = String.Format("Snabbhet: {0}", character.Speed);
                    CharacterAgility.Text = String.Format("Undvika: {0}", character.Agility);
                    CharacterDexterity.Text = String.Format("Träffsäkerhet: {0}", character.Dexterity);
                    if (character.Biografy != null)
                    {
                        CharacterBiografyLiteral.Text = character.Biografy;
                    }
                    else
                    {
                        if (ownCharacter)
                        {
                            CharacterBiografyLiteral.Text = "Du har inte skrivt någon biografi till din karaktär ännu!";
                        }
                        else
                        {
                            CharacterBiografyLiteral.Text = "Karaktären har ingen biografi ännu!";
                        }
                    }
                }
                else
                {
                    CharacterDeadPanel.Visible = true;
                }
            }
            catch (SqlException ex)
            {
                Page.ModelState.AddModelError(String.Empty, ex.Message);
            }
            catch (ValidationException ex)
            {
                Page.ModelState.AddModelError(String.Empty, ex.Message);
            }
            catch (ArgumentException ex)
            {
                Page.ModelState.AddModelError(String.Empty, ex.Message);
            }
            catch (ApplicationException ex)
            {
                Page.ModelState.AddModelError(String.Empty, ex.Message);
            }
            catch
            {
                Page.ModelState.AddModelError(String.Empty, "Ett oväntat fel inträffade.");
            }
        }
示例#20
0
        protected void CreateCharacter_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                if (CheckNewCharacterPoints())
                {
                    try
                    {
                        Model.Character newCharacter = new Model.Character
                        {
                            CharID = 0,
                            UserID = int.Parse(Context.User.Identity.Name),
                            Race = RaceList.SelectedItem.Text,
                            Name = Name.Text,
                            Level = 1,
                            Experience = 0,
                            Health = int.Parse(Session["Health"].ToString()),
                            MaxHealth = int.Parse(Session["Health"].ToString()),
                            Stanima = int.Parse(Session["Stanima"].ToString()),
                            MaxStanima = int.Parse(Session["Stanima"].ToString()),
                            Strength = int.Parse(Session["Strength"].ToString()),
                            Speed = int.Parse(Session["Speed"].ToString()),
                            Agility = int.Parse(Session["Agility"].ToString()),
                            Dexterity = int.Parse(Session["Dexterity"].ToString()),
                            WeaponID = null,
                            ShieldID = null,
                            ArmorID = null,
                            Biografy = null,
                            CreatedOn = new DateTime()
                        };

                        Service.CreateCharacter(newCharacter, int.Parse(RaceList.SelectedValue));

                        // Reset all sessions
                        Session["Health"] = Session["Stanima"] = Session["Strength"] = Session["Speed"] =
                            Session["Agility"] = Session["Dexterity"] = Session["RaceHealth"] =
                            Session["RaceStanima"] = Session["RaceStrength"] = Session["RaceSpeed"] =
                            Session["RaceAgility"] = Session["RaceDexterity"] = Session["Races"] =
                            Session["NewRace"] = Session["PointsLeft"] = null;

                        Session["SiteMsg"] = String.Format("Grattis! Du skapade karaktären {0}!", Name.Text);
                        Response.RedirectToRoute("Character");
                    }
                    catch (SqlException ex)
                    {
                        Page.ModelState.AddModelError(String.Empty, ex.Message);
                    }
                    catch (ValidationException ex)
                    {
                        Page.ModelState.AddModelError(String.Empty, ex.Message);
                    }
                    catch (ApplicationException ex)
                    {
                        Page.ModelState.AddModelError(String.Empty, ex.Message);
                    }
                    catch
                    {
                        Page.ModelState.AddModelError(String.Empty, "Ett oväntat fel inträffade.");
                    }
                }
                else
                {
                    Page.ModelState.AddModelError(String.Empty, "Du har inte satt ut alla poäng!");
                }
            }
        }
 public LearnedSkillsViewer(Model.Character character)
 {
     _character         = character;
     _tempLearnedSkills = new Model.LearnedSkills(_character.LearnedSkills.Raw.ToArray());
     InitializeComponent();
 }
示例#22
0
        private void LoadCharacter(Model.Character character)
        {
            if (character == null)
            {
                return;
            }

            var message = "";

            if (Enum.IsDefined(typeof(Enums.Character), character.CharacterID))
            {
                if (character.CorrinName != null)
                {
                    lblName.Text = character.CorrinName;
                }
                else if (Data.Database.Characters.GetByID(character.CharacterID).IsPrisoner)
                {
                    lblName.Text = Data.Database.Prisoners.GetByID(character.PrisonerID).DisplayName;
                }
                else
                {
                    lblName.Text = Data.Database.Characters.GetByID(character.CharacterID).DisplayName;
                }
            }
            else
            {
                lblName.Text = character.CharacterID.ToString();
            }

            try { classAndLevel1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Class and Level data"; }

            try { stats1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Stats data"; }

            try { unitBlockInfo1.LoadCharacter(_chapterSave, _selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Unit Block Info data"; }

            try { flags1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Flags data"; }

            try { battleData1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Battle data"; }

            try { skills1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Skills data"; }

            try { inventory1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Inventory data"; }

            try { accessories1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Accessories data"; }

            try { hairColor1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Hair Color data"; }

            try { weaponExperience1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Weapon Experience data"; }

            try { dragonVein1.LoadCharacter(_selectedCharacter); }
            catch (Exception) { message += Environment.NewLine + "Error loading Dragon Vein data"; }

            if (message.Length > 0)
            {
                message = "One or more values is invalid for this character. You can still use the hex editor, though." + Environment.NewLine + Environment.NewLine + message;
                _unitViewerBlanket.SetMessage(message);
                _unitViewerBlanket.Cover();

                btnOpenHexEditor.BringToFront();
            }
            else
            {
                _unitViewerBlanket.Uncover();
            }
        }
 bool CanSelectCharacter(Model.Character character)
 {
     return(character != null);
 }
 void SelectCharacter(Model.Character character)
 {
     _notification.SelectedCharacter = character;
     FinishInteraction?.Invoke();
 }
示例#25
0
        /// <summary>
        /// Calculate stats for a character
        /// </summary>
        /// <returns>Character's stats</returns>
        public static Model.Stat CalculateStats(Model.Character character)
        {
            Model.Stat stats     = new Model.Stat();
            Model.Stat trueStats = CalculateTrueStats(character);
            Model.Stat caps      = CalculateStatCaps(character);

            if (trueStats != null && caps != null)
            {
                if (trueStats.HP < 0)
                {
                    stats.HP = 0;
                }
                else if (trueStats.HP < caps.HP)
                {
                    stats.HP = trueStats.HP;
                }
                else
                {
                    stats.HP = caps.HP;
                }
                if (trueStats.Str < 0)
                {
                    stats.Str = 0;
                }
                else if (trueStats.Str < caps.Str)
                {
                    stats.Str = trueStats.Str;
                }
                else
                {
                    stats.Str = caps.Str;
                }
                if (trueStats.Mag < 0)
                {
                    stats.Mag = 0;
                }
                else if (trueStats.Mag < caps.Mag)
                {
                    stats.Mag = trueStats.Mag;
                }
                else
                {
                    stats.Mag = caps.Mag;
                }
                if (trueStats.Skl < 0)
                {
                    stats.Skl = 0;
                }
                else if (trueStats.Skl < caps.Skl)
                {
                    stats.Skl = trueStats.Skl;
                }
                else
                {
                    stats.Skl = caps.Skl;
                }
                if (trueStats.Spd < 0)
                {
                    stats.Spd = 0;
                }
                else if (trueStats.Spd < caps.Spd)
                {
                    stats.Spd = trueStats.Spd;
                }
                else
                {
                    stats.Spd = caps.Spd;
                }
                if (trueStats.Lck < 0)
                {
                    stats.Lck = 0;
                }
                else if (trueStats.Lck < caps.Lck)
                {
                    stats.Lck = trueStats.Lck;
                }
                else
                {
                    stats.Lck = caps.Lck;
                }
                if (trueStats.Def < 0)
                {
                    stats.Def = 0;
                }
                else if (trueStats.Def < caps.Def)
                {
                    stats.Def = trueStats.Def;
                }
                else
                {
                    stats.Def = caps.Def;
                }
                if (trueStats.Res < 0)
                {
                    stats.Res = 0;
                }
                else if (trueStats.Res < caps.Res)
                {
                    stats.Res = trueStats.Res;
                }
                else
                {
                    stats.Res = caps.Res;
                }
            }
            else
            {
                stats = null;
            }
            return(stats);
        }
示例#26
0
 public HexEditor(Model.Character character)
 {
     _character = character;
     InitializeComponent();
     SetTitle();
 }
示例#27
0
 public void LoadCharacter(Model.Character character)
 {
     _character = character;
     PopulateControls();
 }
示例#28
0
        private void WriteCurrentCharacter(BinaryWriter bw, Model.Character character)
        {
            byte[] chunk;

            bw.BaseStream.Seek(character.BinaryPosition, SeekOrigin.Begin);

            // TODO
            bw.BaseStream.Seek(1, SeekOrigin.Current);

            // Flags
            chunk = new byte[8];
            bw.BaseStream.Read(chunk, 0, 8);
            if (character.IsManakete && !Model.Character.IsCorrin(character.CharacterID))
            {
                chunk[2] |= 0x80;
            }
            else
            {
                chunk[2] &= 0x7F;
            }
            if (character.IsBeast && !Model.Character.IsBeastCharacter(character.CharacterID))
            {
                chunk[3] |= 0x01;
            }
            else
            {
                chunk[3] &= 0xFE;
            }
            if (character.CanUseDragonVein && !Model.Character.IsRoyal(character.CharacterID))
            {
                chunk[4] |= 0x08;
            }
            else
            {
                chunk[4] &= 0xF7;
            }
            bw.BaseStream.Seek(-8, SeekOrigin.Current);
            bw.BaseStream.Write(chunk, 0, 8);

            // Character main data
            chunk = new byte[] {
                character.Level,
                character.Experience,
                character.InternalLevel,
                character.EternalSealsUsed,
                (byte)((ushort)character.CharacterID & 0xFF),
                (byte)(((ushort)character.CharacterID >> 8) & 0xFF),
                (byte)character.ClassID,
                character.Unknown011
            };
            bw.Write(chunk);

            // TODO
            bw.BaseStream.Seek(46, SeekOrigin.Current);

            // Weapon exp
            chunk = new byte[] {
                character.WeaponExperience_Sword,
                character.WeaponExperience_Lance,
                character.WeaponExperience_Axe,
                character.WeaponExperience_Shuriken,
                character.WeaponExperience_Bow,
                character.WeaponExperience_Tome,
                character.WeaponExperience_Staff,
                character.WeaponExperience_Stone
            };
            bw.Write(chunk);

            // Max HP
            bw.BaseStream.Seek(1, SeekOrigin.Current);

            // Filler - FF FF FF FF
            bw.BaseStream.Seek(4, SeekOrigin.Current);

            // Flags block (shield, dead, etc)
            bw.BaseStream.Seek(5, SeekOrigin.Current);

            // Filler - 00 00 00 FF FF 00
            bw.BaseStream.Seek(6, SeekOrigin.Current);

            // TODO
            bw.BaseStream.Seek(2, SeekOrigin.Current);

            // Skills
            bw.BaseStream.Seek(10, SeekOrigin.Current);

            // Inventory
            bw.BaseStream.Seek(25, SeekOrigin.Current);

            // Supports
            int supportCount = bw.BaseStream.ReadByte();

            if (supportCount > 0)
            {
                bw.BaseStream.Seek(supportCount, SeekOrigin.Current);
            }

            // TODO
            bw.BaseStream.Seek(7, SeekOrigin.Current);

            // Boots
            bw.Write(character.Boots);

            // TODO
            bw.BaseStream.Seek(9, SeekOrigin.Current);

            // DLC class flags
            bw.Write(character.DLCClassFlags);

            // Hair color
            bw.Write(character.HairColor);

            // TODO
            bw.BaseStream.Seek(47, SeekOrigin.Current);

            // Learned skills
            bw.Write(character.LearnedSkills);

            // Stuff only on deployed characters
            if (character.IsDeployed)
            {
                bw.BaseStream.Seek(54, SeekOrigin.Current);
            }

            // TODO
            bw.BaseStream.Seek(5, SeekOrigin.Current);

            // Accessories
            chunk = new byte[] {
                (byte)character.Headwear,
                (byte)character.Facewear,
                (byte)character.Armwear,
                (byte)character.Underwear
            };
            bw.Write(chunk);

            // TODO
            bw.BaseStream.Seek(1, SeekOrigin.Current);

            // Battles and Victories
            bw.Write(BitConverter.GetBytes(character.BattleCount));
            bw.Write(BitConverter.GetBytes(character.VictoryCount));

            // TODO
            bw.BaseStream.Seek(5, SeekOrigin.Current);

            // Determine end block size
            int endBlockSize;
            int endByte = bw.BaseStream.ReadByte();

            switch (endByte)
            {
            case 0x04:
                endBlockSize = 44;
                break;

            case 0x01:
                endBlockSize = 42;
                break;

            default:
                endBlockSize = 0;
                break;
            }

            // TODO
            bw.BaseStream.Seek(endBlockSize, SeekOrigin.Current);
        }