protected void FillData(Icons.ID starticon, Kernel_bin.Stat statatk, Kernel_bin.Stat statdef) { byte pos = 0; Contents[0] = statatk; getColor(pos, out byte palette, out Font.ColorID _colorid, out bool unlocked); FF8String name = Kernel_bin.MagicData[Memory.State.Characters[Character].Stat_J[statatk]].Name; if (name.Length == 0) { name = Misc[Items._]; } ITEM[pos, 0] = new IGMDataItem_Icon(starticon, new Rectangle(SIZE[pos].X, SIZE[pos].Y, 0, 0), palette); ITEM[pos, 1] = new IGMDataItem_String(name, new Rectangle(SIZE[pos].X + 60, SIZE[pos].Y, 0, 0), color: _colorid); BLANKS[pos] = !unlocked; for (pos = 1; pos < Count; pos++) { Contents[pos] = statdef + pos - 1; getColor(pos, out palette, out _colorid, out unlocked); name = Kernel_bin.MagicData[Memory.State.Characters[Character].Stat_J[statdef + pos - 1]].Name; if (name.Length == 0) { name = Misc[Items._]; } ITEM[pos, 0] = new IGMDataItem_Icon(starticon + 1, new Rectangle(SIZE[pos].X, SIZE[pos].Y, 0, 0), palette); ITEM[pos, 1] = new IGMDataItem_String(name, new Rectangle(SIZE[pos].X + 60, SIZE[pos].Y, 0, 0), color: _colorid); BLANKS[pos] = !unlocked; } }
protected void FillData(Icons.ID starticon, Kernel_bin.Stat statatk, Kernel_bin.Stat statdef) { if (Damageable.GetCharacterData(out Saves.CharacterData c)) { for (byte pos = 0; pos < Count; pos++) { Kernel_bin.Stat stat = pos != 0 ? statdef + pos - 1 : statatk; Contents[pos] = stat; getColor(pos, out byte palette, out Font.ColorID _colorid, out bool unlocked); FF8String name = GetName(stat); UpdateItems(); FF8String GetName(Kernel_bin.Stat key) { FF8String _name = Kernel_bin.MagicData[c.Stat_J[key]].Name; if (_name == null || _name.Length == 0) { _name = Strings.Name._; } return(_name); } void UpdateItems() { ((IGMDataItem.Icon)ITEM[pos, 0]).Data = starticon + 1; ((IGMDataItem.Icon)ITEM[pos, 0]).Palette = palette; ((IGMDataItem.Text)ITEM[pos, 1]).Data = name; ((IGMDataItem.Text)ITEM[pos, 1]).FontColor = _colorid; BLANKS[pos] = !unlocked; } } } }
private void Get_Sort_Stat() { SortMode = (Mode)InGameMenu_Junction.GetMode(); switch (SortMode) { default: case Mode.Mag_Stat: case Mode.Mag_Pool_Stat: SortMode = Mode.Mag_Pool_Stat; break; case Mode.Mag_ST_D: case Mode.Mag_Pool_ST_D: SortMode = Mode.Mag_Pool_ST_D; break; case Mode.Mag_ST_A: case Mode.Mag_Pool_ST_A: SortMode = Mode.Mag_Pool_ST_A; Stat = Kernel_bin.Stat.ST_Atk; break; case Mode.Mag_EL_D: case Mode.Mag_Pool_EL_D: SortMode = Mode.Mag_Pool_EL_D; break; case Mode.Mag_EL_A: case Mode.Mag_Pool_EL_A: SortMode = Mode.Mag_Pool_EL_A; Stat = Kernel_bin.Stat.EL_Atk; break; } }
public void JunctionSpell(Kernel_bin.Stat stat, byte spell) { //see if magic is in use, if so remove it if (Stat_J.ContainsValue(spell)) { Kernel_bin.Stat key = Stat_J.FirstOrDefault(x => x.Value == spell).Key; Stat_J[key] = 0; } //junction magic Stat_J[stat] = spell; }
private void UpdateOnEvent(object sender, IGM_Junction.Mode?mode = null, Kernel_bin.Stat?stat = null) { mode = mode ?? (IGM_Junction.Mode)Menu.IGM_Junction.GetMode(); if (( mode == IGM_Junction.Mode.Mag_Pool_ST_A || mode == IGM_Junction.Mode.Mag_Pool_ST_D || mode == IGM_Junction.Mode.Mag_Pool_EL_A || mode == IGM_Junction.Mode.Mag_Pool_EL_D || mode == IGM_Junction.Mode.Mag_Pool_Stat) || Battle && Enabled) { Cursor_Status |= Cursor_Status.Enabled; } else { Cursor_Status &= ~Cursor_Status.Enabled; } if (Memory.State.Characters != null && Damageable != null) { Get_Sort_Stat(); Stat = stat ?? Stat; Get_Slots_Values(); if (SortMode != LastMode || this.Stat != LastStat || Damageable != LastCharacter) { Get_Sort(); } bool skipundo = false; if (Battle || !(SortMode == LastMode && Damageable == LastCharacter && this.Stat == LastStat && Page == LastPage)) { // goal of these checks were to avoid updating the whole list if we don't need to. LastCharacter = Damageable; LastStat = this.Stat; LastPage = Page; LastMode = SortMode; skipundo = Undo(); FillMagic(); UpdateTitle(); } if (!Battle && ( mode == IGM_Junction.Mode.Mag_Pool_ST_A || mode == IGM_Junction.Mode.Mag_Pool_ST_D || mode == IGM_Junction.Mode.Mag_Pool_EL_A || mode == IGM_Junction.Mode.Mag_Pool_EL_D || mode == IGM_Junction.Mode.Mag_Pool_Stat)) { Generate_Preview(skipundo); } } }
private void UpdateOnEvent(object sender, Mode?mode = null, Kernel_bin.Stat?stat = null) { mode = mode ?? (Mode)InGameMenu_Junction.GetMode(); if ( mode != Mode.Mag_Pool_ST_A && mode != Mode.Mag_Pool_ST_D && mode != Mode.Mag_Pool_EL_A && mode != Mode.Mag_Pool_EL_D && mode != Mode.Mag_Pool_Stat) { Cursor_Status &= ~Cursor_Status.Enabled; } else { Cursor_Status |= Cursor_Status.Enabled; } if (Memory.State.Characters != null) { Get_Sort_Stat(); Stat = stat ?? Stat; Get_Slots_Values(); if (SortMode != LastMode || this.Stat != LastStat || Character != LastCharacter) { Get_Sort(); } bool skipundo = false; if (!(SortMode == LastMode && Character == LastCharacter && this.Stat == LastStat && Page == LastPage)) { LastCharacter = Character; LastStat = this.Stat; LastPage = Page; LastMode = SortMode; skipundo = Undo(); FillMagic(); UpdateTitle(); } if ( mode == Mode.Mag_Pool_ST_A || mode == Mode.Mag_Pool_ST_D || mode == Mode.Mag_Pool_EL_A || mode == Mode.Mag_Pool_EL_D || mode == Mode.Mag_Pool_Stat) { Generate_Preview(skipundo); } } }
public ushort TotalStat(Kernel_bin.Stat s, Characters c = Characters.Blank) { if (c == Characters.Blank) { c = ID; } int total = 0; foreach (Kernel_bin.Abilities i in Abilities) { if (Kernel_bin.Statpercentabilities.ContainsKey(i) && Kernel_bin.Statpercentabilities[i].Stat == s) { total += Kernel_bin.Statpercentabilities[i].Value; } } switch (s) { case Kernel_bin.Stat.HP: return(Kernel_bin.CharacterStats[c].HP((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], _HP, total)); case Kernel_bin.Stat.EVA: //TODO confirm if there is no flat stat buff for eva. If there isn't then remove from function. return(Kernel_bin.CharacterStats[c].EVA((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], 0, TotalStat(Kernel_bin.Stat.SPD, c), total)); case Kernel_bin.Stat.SPD: return(Kernel_bin.CharacterStats[c].SPD((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], RawStats[s], total)); case Kernel_bin.Stat.HIT: return(Kernel_bin.CharacterStats[c].HIT(Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], WeaponID)); case Kernel_bin.Stat.LUCK: return(Kernel_bin.CharacterStats[c].LUCK((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], RawStats[s], total)); case Kernel_bin.Stat.MAG: return(Kernel_bin.CharacterStats[c].MAG((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], RawStats[s], total)); case Kernel_bin.Stat.SPR: return(Kernel_bin.CharacterStats[c].SPR((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], RawStats[s], total)); case Kernel_bin.Stat.STR: return(Kernel_bin.CharacterStats[c].STR((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], RawStats[s], total, WeaponID)); case Kernel_bin.Stat.VIT: return(Kernel_bin.CharacterStats[c].VIT((sbyte)Level, Stat_J[s], Stat_J[s] == 0 ? 0 : Magics[Stat_J[s]], RawStats[s], total)); } return(0); }
/// <summary> /// Things fixed at startup. /// </summary> protected override void Init() { Contents = new Kernel_bin.Stat[Count]; base.Init(); ITEM[5, 0] = new IGMDataItem.Icon { Data = Icons.ID.Icon_Status_Attack, Pos = new Rectangle(SIZE[5].X + 200, SIZE[5].Y, 0, 0) }; ITEM[5, 1] = new IGMDataItem.Icon { Data = Icons.ID.Icon_Status_Defense, Pos = new Rectangle(SIZE[5].X + 240, SIZE[5].Y, 0, 0) }; ITEM[5, 2] = new IGMDataItem.Icon { Data = Icons.ID.Icon_Elemental_Attack, Pos = new Rectangle(SIZE[5].X + 280, SIZE[5].Y, 0, 0) }; ITEM[5, 3] = new IGMDataItem.Icon { Data = Icons.ID.Icon_Elemental_Defense, Pos = new Rectangle(SIZE[5].X + 320, SIZE[5].Y, 0, 0) }; foreach (Kernel_bin.Stat stat in Stat2Icon.Keys.OrderBy(o => (byte)o)) { int pos = (int)stat; if (pos >= 5) { pos++; } ITEM[pos, 0] = new IGMDataItem.Icon { Data = Stat2Icon[stat], Pos = new Rectangle(SIZE[pos].X, SIZE[pos].Y, 0, 0) }; ITEM[pos, 1] = new IGMDataItem.Text { Pos = new Rectangle(SIZE[pos].X + 80, SIZE[pos].Y, 0, 0) }; ITEM[pos, 2] = new IGMDataItem.Integer { Pos = new Rectangle(SIZE[pos].X + 152, SIZE[pos].Y, 0, 0), NumType = Icons.NumType.SysFntBig, Spaces = 10 }; ITEM[pos, 3] = stat == Kernel_bin.Stat.HIT || stat == Kernel_bin.Stat.EVA ? new IGMDataItem.Text { Data = Strings.Name.Percent, Pos = new Rectangle(SIZE[pos].X + 350, SIZE[pos].Y, 0, 0) } : null; ITEM[pos, 4] = new IGMDataItem.Icon { Pos = new Rectangle(SIZE[pos].X + 250, SIZE[pos].Y, 0, 0), Palette = 16 }; } }
private void Get_Sort_Stat() { if (Battle) { //SortMode = IGM_Junction.Mode.Mag_Pool_Stat; } else { SortMode = (IGM_Junction.Mode)Menu.IGM_Junction.GetMode(); switch (SortMode) { default: case IGM_Junction.Mode.Mag_Stat: case IGM_Junction.Mode.Mag_Pool_Stat: SortMode = IGM_Junction.Mode.Mag_Pool_Stat; break; case IGM_Junction.Mode.Mag_ST_D: case IGM_Junction.Mode.Mag_Pool_ST_D: SortMode = IGM_Junction.Mode.Mag_Pool_ST_D; break; case IGM_Junction.Mode.Mag_ST_A: case IGM_Junction.Mode.Mag_Pool_ST_A: SortMode = IGM_Junction.Mode.Mag_Pool_ST_A; Stat = Kernel_bin.Stat.ST_Atk; break; case IGM_Junction.Mode.Mag_EL_D: case IGM_Junction.Mode.Mag_Pool_EL_D: SortMode = IGM_Junction.Mode.Mag_Pool_EL_D; break; case IGM_Junction.Mode.Mag_EL_A: case IGM_Junction.Mode.Mag_Pool_EL_A: SortMode = IGM_Junction.Mode.Mag_Pool_EL_A; Stat = Kernel_bin.Stat.EL_Atk; break; } } }
public bool Unlocked(List <Kernel_bin.Abilities> unlocked, Kernel_bin.Stat stat) { switch (stat) { default: return(unlocked.Contains(Kernel_bin.Stat2Ability[stat])); case Kernel_bin.Stat.EL_Atk: return(unlocked.Contains(Kernel_bin.Abilities.EL_Atk_J)); case Kernel_bin.Stat.EL_Def_1: return(unlocked.Contains(Kernel_bin.Abilities.EL_Def_Jx1) || unlocked.Contains(Kernel_bin.Abilities.EL_Def_Jx2) || unlocked.Contains(Kernel_bin.Abilities.EL_Def_Jx4)); case Kernel_bin.Stat.EL_Def_2: return(unlocked.Contains(Kernel_bin.Abilities.EL_Def_Jx2) || unlocked.Contains(Kernel_bin.Abilities.EL_Def_Jx4)); case Kernel_bin.Stat.EL_Def_3: case Kernel_bin.Stat.EL_Def_4: return(unlocked.Contains(Kernel_bin.Abilities.EL_Def_Jx4)); case Kernel_bin.Stat.ST_Atk: return(unlocked.Contains(Kernel_bin.Abilities.ST_Atk_J)); case Kernel_bin.Stat.ST_Def_1: return(unlocked.Contains(Kernel_bin.Abilities.ST_Def_Jx1) || unlocked.Contains(Kernel_bin.Abilities.ST_Def_Jx2) || unlocked.Contains(Kernel_bin.Abilities.ST_Def_Jx4)); case Kernel_bin.Stat.ST_Def_2: return(unlocked.Contains(Kernel_bin.Abilities.ST_Def_Jx2) || unlocked.Contains(Kernel_bin.Abilities.ST_Def_Jx4)); case Kernel_bin.Stat.ST_Def_3: case Kernel_bin.Stat.ST_Def_4: return(unlocked.Contains(Kernel_bin.Abilities.ST_Def_Jx4)); } }
public bool Unlocked(Kernel_bin.Stat stat) => Unlocked(UnlockedGFAbilities, stat);
public void Read(BinaryReader br, Characters c) { ID = c; _CurrentHP = br.ReadUInt16(); //0x00 _HP = br.ReadUInt16(); //0x02 Experience = br.ReadUInt32(); //0x04 ModelID = br.ReadByte(); //0x08 WeaponID = br.ReadByte(); //0x09 RawStats = new Dictionary <Kernel_bin.Stat, byte>(6) { [Kernel_bin.Stat.STR] = br.ReadByte(), //0x0A [Kernel_bin.Stat.VIT] = br.ReadByte(), //0x0B [Kernel_bin.Stat.MAG] = br.ReadByte(), //0x0C [Kernel_bin.Stat.SPR] = br.ReadByte(), //0x0D [Kernel_bin.Stat.SPD] = br.ReadByte(), //0x0E [Kernel_bin.Stat.LUCK] = br.ReadByte() //0x0F }; Magics = new Dictionary <byte, byte>(33); for (int i = 0; i < 32; i++) { byte key = br.ReadByte(); byte val = br.ReadByte(); if (key >= 0 && !Magics.ContainsKey(key)) { Magics.Add(key, val);//0x10 } } Commands = Array.ConvertAll(br.ReadBytes(3), Item => (Kernel_bin.Abilities)Item).ToList(); //0x50 Paddingorunusedcommand = br.ReadByte(); //0x53 Abilities = Array.ConvertAll(br.ReadBytes(4), Item => (Kernel_bin.Abilities)Item).ToList(); //0x54 JunctionnedGFs = (GFflags)br.ReadUInt16(); //0x58 Unknown1 = br.ReadByte(); //0x5A Alternativemodel = br.ReadByte(); //0x5B (Normal, SeeD, Soldier...) Stat_J = new Dictionary <Kernel_bin.Stat, byte>(9); for (int i = 0; i < 19; i++) { Kernel_bin.Stat key = (Kernel_bin.Stat)i; byte val = br.ReadByte(); if (!Stat_J.ContainsKey(key)) { Stat_J.Add(key, val); } } //JunctionHP = br.ReadByte();//0x5C //JunctionSTR = br.ReadByte();//0x5D //JunctionVIT = br.ReadByte();//0x5E //JunctionMAG = br.ReadByte();//0x5F //JunctionSPR = br.ReadByte();//0x60 //JunctionSPD = br.ReadByte();//0x61 //JunctionEVA = br.ReadByte();//0x62 //JunctionHIT = br.ReadByte();//0x63 //JunctionLCK = br.ReadByte();//0x64 //Elem_Atk_J = br.ReadByte();//0x65 //ST_Atk_J = br.ReadByte();//0x66 //Elem_Def_J = br.ReadBytes(4).ToList() ;//0x67 //ST_Def_J = br.ReadBytes(4).ToList();//0x6B Unknown2 = br.ReadByte();//0x6F (padding?) CompatibilitywithGFs = new Dictionary <GFs, ushort>(16); for (int i = 0; i < 16; i++) { CompatibilitywithGFs.Add((GFs)i, br.ReadUInt16()); //0x70 } Numberofkills = br.ReadUInt16(); //0x90 NumberofKOs = br.ReadUInt16(); //0x92 Exists = br.ReadByte(); //0x94 Unknown3 = br.ReadByte(); //0x95 MentalStatus = br.ReadByte(); //0x96 Unknown4 = br.ReadByte(); //0x97 }
/// <summary> /// Sorted Enumerable based on best to worst for Stat. Uses character's total magic and /// kernel bin's stat value. /// </summary> /// <param name="Stat">Stat sorting by.</param> /// <returns>Ordered Enumberable</returns> public IOrderedEnumerable <Kernel_bin.Magic_Data> SortedMagic(Kernel_bin.Stat Stat) => Kernel_bin.MagicData.OrderBy(x => (-x.totalStatVal(Stat) * (Magics.ContainsKey(x.ID) ? Magics[x.ID] : 0)) / 100);
/// <summary> /// Things fixed at startup. /// </summary> protected override void Init() { Contents = new Kernel_bin.Stat[Count]; base.Init(); }
protected Dictionary <T, byte> getTotal <T>(out Enum[] availableFlagsarray, byte max, Kernel_bin.Stat stat, params byte[] spells) where T : Enum { const int maxspellcount = 100; Dictionary <T, byte> total = new Dictionary <T, byte>(8); IEnumerable <Enum> availableFlags = Enum.GetValues(typeof(T)).Cast <Enum>(); foreach (Enum flag in availableFlags.Where(d => !total.ContainsKey((T)d))) { total.Add((T)flag, 0); } for (int i = 0; i < spells.Length; i++) { Enum flags = null; byte spell = spells[i]; Kernel_bin.Magic_Data magic_Data = Kernel_bin.MagicData[spell]; switch (stat) { case Kernel_bin.Stat.EL_Atk: flags = magic_Data.EL_Atk; break; case Kernel_bin.Stat.EL_Def_1: case Kernel_bin.Stat.EL_Def_2: case Kernel_bin.Stat.EL_Def_3: case Kernel_bin.Stat.EL_Def_4: flags = magic_Data.EL_Def; break; case Kernel_bin.Stat.ST_Atk: flags = magic_Data.ST_Atk; break; case Kernel_bin.Stat.ST_Def_1: case Kernel_bin.Stat.ST_Def_2: case Kernel_bin.Stat.ST_Def_3: case Kernel_bin.Stat.ST_Def_4: flags = magic_Data.ST_Def; break; } if (flags != null && Damageable.GetCharacterData(out Saves.CharacterData c)) { foreach (Enum flag in availableFlags.Where(flags.HasFlag)) { if (c.Magics.TryGetByKey(spell, out byte count) && magic_Data.J_Val.TryGetValue(stat, out byte value)) { int t = total[(T)flag] + (value * count / maxspellcount); total[(T)flag] = (byte)MathHelper.Clamp(t, 0, max); } } } else { throw new Exception($"Unknown stat, {stat}"); } } availableFlagsarray = availableFlags.ToArray(); return(total); }
protected Dictionary <T, byte> getTotal <T>(out Enum[] availableFlagsarray, byte max, Kernel_bin.Stat stat, params byte[] spell) where T : Enum { Dictionary <T, byte> total = new Dictionary <T, byte>(8); IEnumerable <Enum> availableFlags = Enum.GetValues(typeof(T)).Cast <Enum>(); foreach (Enum flag in availableFlags.Where(d => !total.ContainsKey((T)d))) { total.Add((T)flag, 0); } for (int i = 0; i < spell.Length; i++) { Enum flags = null; switch (stat) { case Kernel_bin.Stat.EL_Atk: flags = Kernel_bin.MagicData[spell[i]].EL_Atk; break; case Kernel_bin.Stat.EL_Def_1: case Kernel_bin.Stat.EL_Def_2: case Kernel_bin.Stat.EL_Def_3: case Kernel_bin.Stat.EL_Def_4: flags = Kernel_bin.MagicData[spell[i]].EL_Def; break; case Kernel_bin.Stat.ST_Atk: flags = Kernel_bin.MagicData[spell[i]].ST_Atk; break; case Kernel_bin.Stat.ST_Def_1: case Kernel_bin.Stat.ST_Def_2: case Kernel_bin.Stat.ST_Def_3: case Kernel_bin.Stat.ST_Def_4: flags = Kernel_bin.MagicData[spell[i]].ST_Def; break; } if (flags != null) { foreach (Enum flag in availableFlags.Where(flags.HasFlag)) { int t = total[(T)flag] + ((Kernel_bin.MagicData[spell[i]].J_Val[stat] * Memory.State.Characters[Character].Magics[spell[i]]) / 100); total[(T)flag] = (byte)(t > max ? max : t); } } else { throw new Exception($"Unknown stat, {stat}"); } } availableFlagsarray = availableFlags.ToArray(); return(total); }
private void StatChangeEvent(object sender, Kernel_bin.Stat e) => UpdateOnEvent(sender, null, e);
public override ushort TotalStat(Kernel_bin.Stat s) => 0;
public static void ChangeStat(Kernel_bin.Stat stat) => StatEventListener?.Invoke(null, stat);
public abstract ushort TotalStat(Kernel_bin.Stat s);