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