Example #1
0
        public SkillCustomTable(string nameTableLocation)
        {
            var customTableData = File.ReadAllBytes(nameTableLocation);

            numberOfEntries = MergeBytesIntoInt(customTableData, 0);
            offsets         = new int[numberOfEntries];

            offsets[0] = 0;

            for (int i = 1; i < numberOfEntries; i++)
            {
                offsets[i] = MergeBytesIntoInt(customTableData, i * 4);

                // malformed tables?
                if (offsets[i] >= customTableData.Length)
                {
                    offsets[i] = offsets[1];
                }
            }

            var sjisDataLoc = 4 * (numberOfEntries + 1); // accounts for starting count of entries

            sjisStrings = new SJISString[numberOfEntries];

            for (int i = 0; i < numberOfEntries; i++)
            {
                var lastByte        = 0x1;
                var stringPos       = 0;
                var constructedData = new ushort[NAME_MAX];

                while (lastByte != 0x0)
                {
                    var currentPos = sjisDataLoc + offsets[i] + (stringPos * 2);

                    constructedData[stringPos] = MergeCharBytesIntoShort(customTableData, currentPos);
                    stringPos += 1;

                    if (currentPos < customTableData.Length)
                    {
                        lastByte = customTableData[currentPos];
                    }

                    else
                    {
                        lastByte = 0x0;
                    }
                }

                sjisStrings[i] = new SJISString(constructedData);
            }
        }
Example #2
0
        public void ReplaceString(int skillId, SJISString newString)
        {
            var lenDiff = newString.ByteLength() - sjisStrings[skillId].ByteLength();

            for (int i = skillId + 1; i < numberOfEntries; i++)
            {
                if (i != 0) // don't touch offset 0, that's hardcoded into the game...
                {
                    offsets[i] += (ushort)lenDiff;
                }
            }

            sjisStrings[skillId] = newString;
        }
Example #3
0
        public SkillNameTable(string nameTableLocation)
        {
            var nameTableData = File.ReadAllBytes(nameTableLocation);

            numberOfEntries = (short)MergeBytesIntoShort(nameTableData, 0);
            offsets         = new ushort[numberOfEntries];

            offsets[0] = 0;

            for (int i = 1; i < numberOfEntries; i++)
            {
                offsets[i] = MergeBytesIntoShort(nameTableData, i * 2);
            }

            var sjisDataLoc = 2 * (numberOfEntries + 1); // accounts for starting count of entries

            sjisStrings = new SJISString[numberOfEntries];

            for (int i = 0; i < numberOfEntries; i++)
            {
                var lastByte        = 0x1;
                var stringPos       = 0;
                var constructedData = new ushort[NAME_MAX];

                while (lastByte != 0x0)
                {
                    constructedData[stringPos] = MergeCharBytesIntoShort(nameTableData, sjisDataLoc + offsets[i] + (stringPos * 2));
                    stringPos += 1;
                    var currentPos = sjisDataLoc + offsets[i] + (stringPos * 2);

                    if (currentPos < nameTableData.Length)
                    {
                        lastByte = nameTableData[currentPos];
                    }

                    else
                    {
                        lastByte = 0x0;
                    }
                }

                sjisStrings[i] = new SJISString(constructedData);
            }
        }
Example #4
0
        private void applyChangesButton_Click(object sender, EventArgs e)
        {
            var skillId = skillList.SelectedIndex;

            // update name in memory, and reset the skill list
            var oldIndex    = skillList.SelectedIndex;
            var newSjisName = new SJISString(skillNameTextBox.Text);

            snt.ReplaceString(skillList.SelectedIndex, newSjisName);

            skillList.Items.Clear();

            for (int i = 0; i < snt.sjisStrings.Length; i++)
            {
                skillList.Items.Add(
                    "0x" + i.ToString("X3") + ": " +
                    snt.sjisStrings[i].GetAscii()
                    );
            }

            // time to write the important stuff
            selectedSkill.SkillLevel = byte.Parse(maxLevelBox.Controls.OfType <RadioButton>().FirstOrDefault(x => x.Checked == true).Tag.ToString().Replace("0x", ""),
                                                  System.Globalization.NumberStyles.HexNumber);
            selectedSkill.SkillType = byte.Parse(skillTypeTextBox.Text, System.Globalization.NumberStyles.HexNumber);

            ushort bodyPartsWeaponsShort = 0;

            foreach (CheckBox entry in bodyPartsWeaponsBox.Controls)
            {
                if (entry.Checked == true)
                {
                    bodyPartsWeaponsShort += ushort.Parse(entry.Tag.ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
                }
            }

            selectedSkill.BodyParts      = bodyPartsWeaponsShort;
            selectedSkill.StatusRequired = ushort.Parse(statusRequiredTextBox.Text, System.Globalization.NumberStyles.HexNumber);
            selectedSkill.TargetTeam     = byte.Parse(targetTeamBox.Controls.OfType <RadioButton>().FirstOrDefault(x => x.Checked == true).Tag.ToString().Replace("0x", ""),
                                                      System.Globalization.NumberStyles.HexNumber);
            selectedSkill.TargetType = byte.Parse(targetTypeBox.Controls.OfType <RadioButton>().FirstOrDefault(x => x.Checked == true).Tag.ToString().Replace("0x", ""),
                                                  System.Globalization.NumberStyles.HexNumber);
            selectedSkill.ModifierStatus = byte.Parse(modifierStatusBox.Controls.OfType <RadioButton>().FirstOrDefault(x => x.Checked == true).Tag.ToString().Replace("0x", ""),
                                                      System.Globalization.NumberStyles.HexNumber);

            try
            {
                selectedSkill.ModifierType = byte.Parse(modifierTypeBox.Controls.OfType <RadioButton>().FirstOrDefault(x => x.Checked == true).Tag.ToString().Replace("0x", ""),
                                                        System.Globalization.NumberStyles.HexNumber);
            }

            // null reference exception means nothing was set
            // yeah yeah using exceptions as program flow but
            // who really cares
            catch (NullReferenceException)
            {
                selectedSkill.ModifierType = 0x0;
            }

            ushort modifierElemShort = 0;

            foreach (CheckBox entry in modifierElementBox.Controls)
            {
                if (entry.Checked == true)
                {
                    modifierElemShort += ushort.Parse(entry.Tag.ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
                }
            }

            selectedSkill.ModifierElement = modifierElemShort;

            ushort damageTypeShort = 0;

            foreach (CheckBox entry in damageTypeBox.Controls)
            {
                if (entry.Checked == true)
                {
                    damageTypeShort += ushort.Parse(entry.Tag.ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
                }
            }

            selectedSkill.DamageType = damageTypeShort;

            selectedSkill.InflictionFlag = ushort.Parse(inflictPanel.Controls.OfType <RadioButton>().FirstOrDefault(x => x.Checked == true).Tag.ToString().Replace("0x", ""),
                                                        System.Globalization.NumberStyles.HexNumber);

            ushort disableShort = 0;

            foreach (CheckBox entry in disableBox.Controls)
            {
                if (entry.Checked == true)
                {
                    disableShort += ushort.Parse(entry.Tag.ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
                }
            }

            selectedSkill.DisablesInflicted = disableShort;
            selectedSkill.SkillFlags        = ushort.Parse(skillFlagsTextBox.Text, System.Globalization.NumberStyles.HexNumber);
            selectedSkill.Repurposed        = ushort.Parse(repurposedTextBox.Text, System.Globalization.NumberStyles.HexNumber);

            var subheaderId = int.Parse(subheaderSelector.Text);

            selectedSkill.SubheaderData[subheaderId].subheader = int.Parse(subheaderIdTextBox.Text, System.Globalization.NumberStyles.HexNumber);

            for (int i = 0; i < EO3Skill.NUMBER_OF_LEVELS; i++)
            {
                var textBoxContents = subheaderGroupBox.Controls.OfType <TextBox>().FirstOrDefault(x => x.Name == "level" + (i + 1).ToString()).Text;
                selectedSkill.SubheaderData[subheaderId].levelValues[i] = int.Parse(textBoxContents);
            }

            for (int i = 0; i < SkillRequirements.NUMBER_OF_REQUIREMENTS; i++)
            {
                var relevantList     = requirementsEditorBox.Controls.OfType <ComboBox>().FirstOrDefault(x => x.Name == "skill" + (i + 1).ToString() + "List");
                var relevantSelector = requirementsEditorBox.Controls.OfType <NumericUpDown>().FirstOrDefault(x => x.Name == "skill" + (i + 1).ToString() + "Level");
                var reqSkillId       = (byte)relevantList.SelectedIndex;
                var reqSkillLevel    = byte.Parse(relevantSelector.Text);

                rt.Skills[skillId].requiredSkills[i] = new Tuple <byte, byte>(reqSkillId, reqSkillLevel);

                if (orCheckBox.Checked == true)
                {
                    rt.Skills[skillId].orRequirements = 1;
                }

                else
                {
                    rt.Skills[skillId].orRequirements = 0;
                }
            }

            // skill custom text updating
            for (int i = 0; i < 11; i++)
            {
                var skillStringsStart = skillId * 11;

                var textBoxToRead = customBox.Controls
                                    .OfType <TextBox>()
                                    .FirstOrDefault(x => x.Name == "customText" + (i + 1).ToString());

                ct.ReplaceString(skillStringsStart + i, new SJISString(textBoxToRead.Text));
            }

            // do this at the end, or else things get updated prematurely!
            // except for the thing below!
            skillList.SelectedIndex = oldIndex;
        }