The Skill System and You: Maximizing Your Usage of FE8's Most Prolific Bundle of Wizardry

The skill system has grown a lot over time, and there’s a large amount of content included with it, most of which are not well-explained. This guide aims to rectify this by explaining as much as possible the content that is controllable from the EA level, without needing to use assembly; it will also briefly touch on adding new skills, which will require assembly.

Please reply to this thread with any errors you notice, so that they may be corrected.

57 Likes

Chapter 1: Configuration

The simplest way to change the Skill System to fit your needs is through the configuration definitions. These can be found in Engine Hacks/Config.event (save for one, but we’ll touch on that later). This file is split into 2 sections; Hack Installation and Skill Behaviour.

Hack Installation

Hack installation definitions will control, as the name suggests, the installation of different hacks. Every hack that is not required for the Skill System to function properly is configurable from here. These can generally be subdivided into 2 categories, Quality of Life hacks and External hacks. External hacks interface with some part of the Skill System and its necessary hacks in order to function, and are generally just included for compatibility (there are a few exceptions, which will be covered when we come to them). Quality of Life hacks do not conflict or interface with any piece of the Skill System, but are general small improvements.

External Hacks are as follows:

  • Dragon Veins by Colorz and Circles; also installs Heal Tiles by Snakey

  • Freeze by Colorz

  • Character/Chapter Specific Battle Themes by Camdar and Circles

  • Stat Screen Palette by Allegiance by Circles

  • Strength/Magic Split by Tequila, Kirb, RobertFPY, Pikmin1211, and Snakey

  • Anima Triangle by Snakey

  • Modular EXP by Snakey

  • Portrait Selection by Snakey

  • Stairs by Snakey

  • Raid by Snakey

  • Escape-Arrive by Sme

  • Leadership Stars by Zeta

  • Biorhythm by Sme

  • Reaver Split by Sme

  • Cannot Crit by Sme

  • AdvWeaponLocks by Venno, ported by Sme

  • Status Weapons by Sme

  • Narrow Font by Scraiza

  • Personal Info by Runa

Quality of Life hacks are as follows:

  • Battle Stats with Animations Off by Tequila
  • Casual Mode by Circles
  • Contemporary Talk & Support by Circles
  • Danger Zone by Circles
  • Display Weapon Rank on Level Up by Tequila, rewritten by Stan
  • Add Traps ASMC by Circles
  • Rescue Unit ASMC by Circles
  • Send to Convoy ASMC by Circles
  • Event Writer by Circles
  • HP Bars by Circles, additions by Tequila
  • Improved Sound Mixer by ipatix, ported by Circles
  • L-Toggle Animations by Circles
  • Menu Semi-Transparency by Circles
  • Prologue Supply by Circles
  • Movement Arrow Hack by Circles
  • Negative Weapon Wt/Crit Display by Circles, rewritten by Stan
  • Chapter Names as Text by Circles

Dragon Veins and Biorhythm have skills directly related to them, and without installing them these skills will have no function. However, they are not necessary for functions otherwise. You can also toggle Effectiveness Rework, which will cause skill system internals to change their function to compensate. Similarly, you can toggle Expanded Modular Save, which will instead use an old suspend expansion to save skills through suspend. This one will break old saves if toggled.

Skill Behaviour

This section is dedicated to definitions that control, as the name suggests, the behaviour of different skills. These do not install anything extra, but at most install something in place of something else.

Skill Behaviour toggles are as follows:

  • Whether Galeforce should autoselect the unit after it triggers.
  • Whether Lethality should work like it does in vanilla GBAFE.
  • Whether the Canto ability flag should work as well as the skill.
  • Whether enemies should take advantage of Steal+ or always act like just Steal.
  • Whether debuffs should be allowed to take stats negative.
    • Note that negative stats do not play well in most scenarios, so it is recommended you keep this set.
  • Whether Shadowgift should check Staff ranks when looking for highest magic rank.
  • Whether Lumina should check Staff ranks when looking for highest magic rank.
  • Whether Poison Strike and Grisly Wound will deal damage if none was dealt during battle.
  • Whether Capture should be a skill or a global command.
  • Whether Dragon Veins should be a skill or a global command.
  • Whether the Charge mechanic should be enabled.
    • The only skill that currently uses Charge is Moonbow, and this makes it instead use a Skill% proc.
  • Whether the Triangle Attack skill should be enabled.
    • This skill is currently non-functional, so it is recommended to keep it disabled.
  • Whether Bargain stacks with Silver Cards.
  • Whether the Dance check should use the vanilla check in addition to the skill check.
  • Whether the Supply check should use the vanilla check in addition to the skill check.
  • Whether the Summon check should use the vanilla check in addition to the skill check.

There are smaller, more technical configurations you can perform with various skills elsewhere, but we will touch on those when we reach that area.

Finally, the last config option is located in Custom Definitions.event, __DEBUG__. If this is enabled, you will get the Debug startup menu and the ability to Edit Skills on units via the unit menu. This is useful for, as the name suggests, debugging, but generally is not something you want to keep on long-term.

11 Likes

Chapter 1x: Utilizing Engine Hacks

Just knowing that something exists doesn’t tell you how to use it. This section is dedicated to tutorials on each hack, where its use is more than just installing.

Anima Triangle

Anima Triangle will create a weapon triangle between Fire, Thunder, and Wind magic. To designate an item as one of these types, there are 3 lists in Engine Hacks/ExternalHacks/AnimaTriangle/AnimaTriangle.event under FireList, ThunderList, and WindList respectively. Add the IDs of the weapons you want to add to each list in the respective place, and make sure it ends with a 0 byte.

Biorhythm

Biorhythm implements the Tellius mechanic of the same name. To designate a unit’s Biorhythm, you use the table at Tables/FE8 Nightmare modules/Biorhythm/Biorhythm Editor.csv. Here, you get 2 values to set per-character; Starting Position and Amplitude. Starting Position is the biorhythm stage to initialize to at the start of a chapter. Amplitude is the number of stages to advance per-turn multiplied by 4. There are 12 stages, indexed 0-11. In Engine Hacks/ExternalHacks/Biorhythm/Biorhythm.event, you can see the order visually near the top of the file or at the end of the file via text definitions. These two areas can also be used to alter the modifier at each stage and the text shown at each stage, respectively.

Cannot Crit

Cannot Crit makes it so setting a weapon’s crit value to 0xFF will make it unable to crit.

Dragon Veins

Dragon Veins are map objects that, when used, will run an event. The structure of this event is anything you can imagine, and this comes with a definition VeinActivation, which plays a standardized dragon vein activation effect when placed at the start of your dragon vein event. To set a dragon vein event to an ID, use VeinEffect(id, event) with the ID you want and the label of the event. To place a vein on a map, use Vein(x, y, id) or Vein(x, y, id, textID) in trap data.

Heal Tiles

Heal Tiles are also installed with Dragon Veins, as they are mechanically intertwined. Heal Tiles are map objects that, when waited upon, will heal the unit on the same tile at the start of their phase. To set a heal tile, use HealTile(x, y, HealPercent) or HealTile(x, y, HealPercent, flagID) in trap data.

Escape-Arrive

Escape-Arrive adds the mechanisms for 2 new map objectives, namely Escape and Arrive. To designate an Arrive point, put Arrive(x, y) in location-based events. When any unit reaches the set tile, they will be able to Arrive and end the chapter. To designate an Escape point, put Escape(x, y) in location-based events. When any unit reaches the set tile, they will play an escape quote and leave the map. You can set escape quotes in Tables/FE8 Nightmare modules/Misc/Escape Quote Editor.csv. By default, if they are a lord and use Escape, they will also end the chapter. You can further customize the behavior of these by using flags defined as LordMustEscapeLastFlag and AllUnitsMustEscapeFlag. Setting one of these will give you one of two effects; the lord unit will not be allowed to escape until they are the only unit on the map, or the lord unit escaping does not end the map and it only does so when all units have escaped, respectively. You can change which flag IDs these definitions are tied to in Engine Hacks/ExternalHacks/EscapeArrive/EscapeArrive.event. You can also use Thracia-style escape, assuming neither of these flags are set; in your chapter end event, put an instance of EscapeCapturedCheck(charID,flagID) for each unit who you want to be able to be captured if they have not escaped at the end of the map. If they are still on the map, they will be hidden and the given flag will be set. Otherwise, they are left as-is and the flag is not set. You can then later use this flag to check whether or not they have been captured.

Freeze

Freeze adds a status effect of the same name that makes a unit unable to move. It includes an ASMC to freeze all enemy units on the map, which can be called with ASMC FreezeAllASMC. The unused Sick status effect is overwritten and replaced with Freeze.

Leadership Stars

Leadership Stars mimic the Jugdral mechanic of the same name. The number of leadership stars a faction shares collectively will give every unit of that faction a boost multiplied by the number of stars. By default, opposing factions’ stars will cancel one another out. You can change the value of stars on each unit, as well as the hit and avoid bonuses for each faction, in Engine Hacks/ExternalHacks/LeadershipStars/LeadershipStars.event. The Status menu will also show the total number of stars each faction has in place of the total number of units.

Modular EXP

Modular EXP allows you to set modifiers on experience gain for specific characters based on chapter and/or flag, or classes based on weapon type used. You can edit its effects on classes in Tables/FE8 Nightmare modules/Misc/Modular EXP Class Table.csv and its effects on characters in Engine Hacks/ExternalHacks/ModularEXP/ModularEXP.event. You can set a multiplier and divisor for each case.

Narrow Font

Narrow Font adds additional characters to the font that are thinner than the standard ones. See here for which bytes correspond to which characters.

Portrait Selection

Portrait Selection allows for setting text commands that conditionally load mugs based on flags. For each entry, set a True and False Portrait ID for if the flag is set to True or False, set the flag to use, and set the control code to use to reference the entry. Set entries on the portrait selection table in Engine Hacks/ExternalHacks/PortraitSelectASM/PortraitSelectionASM.event.

Raid

Raid adds a menu command that triggers an event. Note that it does not also trigger a tile change. To set a raid point, use Raid(flagID, event, x, y) under location-based events. This also comes with definitions TileChange(x, y), which triggers a tile change at the given coordinates, and Coords(x, y), which formats the given coordinates for how the game expects them when reading from sB and is used by the previous macro.

Reaver Split

Reaver Split separates Reverse Weapon Triangle and Double Weapon Triangle Effects into separate item bitflags. The Reverse effect is kept to bit 0x00000100, while the double effect flag is moved to bit 0x00400000.

Stairs

Stairs will create a pair of points on the map that can be travelled between using the unit menu. To designate a pair of stairs, use Stairs(stairID, x1, y1, x2, y2) under location-based events, where stairID is the identifier of the stair pairing, (x1, y1) is the coordinates of the first stair, and (x2, y2) is the coordinates of the second stair. Note that using this hack will force the usage of EMS regardless of your settings, as to save remaining movement through suspend.

Stat Screen Palette by Allegiance

Stat Screen Palette by Allegiance allows for the status screen background for each allegiance to be a different color. However, most stat screen backgrounds won’t work like this by default; the image needs 1 palette per allegiance.

Status Weapons

Status Weapons will inflict a status on the opponent if they land a hit in battle. They are designated using weapon effect 0xD and apply the status whose ID is in (item data + 0x22).

Weapon Lock Array

Weapon Lock Array allows for an extension of weapon locks. In the 4th byte of the item ability bitfield, set an ID for a weapon lock; this should be anything other than 0. Then, in Tables/FE8 Nightmare modules/AdvWeaponLocks/WeaponLockArray.csv, set a pointer to a weapon lock array for the ID you’ve chosen. Next, in Engine Hacks/ExternalHacks/WeaponLockArray/AdvWeaponLocks.event, make a label of the name you set to the ID prior; there is an example array in this file as well. The first byte at this label should be one of SoftCharLock, HardCharLock, SoftClassLock, or HardClassLock. Soft locks mean if the requirements are met the weapon can be used as if weapon rank requirements are E; otherwise, it can be used if the weapon rank requirements are met. Hard locks mean if the requirements are met the weapon can be wielded, but if not it cannot be. Following one of these, put a string of bytes for character or class IDs, based on which you designated prior. At the end, put EndLockArray to denote the end of the list.

Casual Mode

Casual Mode will be enabled if flag 0xB0 is set. To set it only in easy mode, at the start of your first chapter you can do:

CHECK_TUTORIAL

BEQ 0 0 0xC

ENUT 0xB0

LABEL 0

Add Traps, Rescue, and Send to Convoy ASMCs

These 3 hacks add ASMCs for you to utilize in your events. AddTraps(pointer) will add a trap to memory mirroring the contents of the location pointed to in this macro. Rescue(frontx,fronty,backx,backy) will make the unit at (frontx, fronty) rescue the unit at (backx, backy). ASMC SendToConvoy|1 will send the item in s1 to the convoy.

Strength/Magic Split

Strength/Magic Split separates the singular stat used by GBAFE to represent strength and magic based on the class into 2 separate stats, allowing for them both to be set on the same unit. To set a character or class’s bases and growths for magic, use Tables/FE8 Nightmare modules/Magic which contains 2 tables, Mag Char Editor.csv for characters and Mag Class Editor.csv for classes. These function the same as the values on the character and class tables respectively for other stats. As it changes a lot with the fundamentals of various game systems to implement the split, there are many incidental changes and opportunities to implement other features. A stat booster for Magic is set up automatically, as well as an icon installed for it. As a result of its nature, it also uses a separate instance of the Modular Stat Screen, which we’ll touch on in a bit; just know that if you’re using this, it uses the version in Engine Hacks/ExternalHacks/StrMagSplit/ModularStatScreen instead. One feature added by this is Magic Sword Rework, incidental to making magic swords use magic in their calculations. Using this, you can designate new weapons as magic swords. The list of these is in Engine Hacks/ExternalHacks/StrMagSplit/StrMagSplit/MagicSwordRework/MagicSwordRework.event. Here, you can set whether a weapon hits on defense, resistance, the lower defensive value, or the higher defensive value separately for in melee and at range. You can also set the weapon type to use when it is attacking using magic, as well as if it should use magic in melee or not. Note that using this hack will force the usage of EMS regardless of your settings, as to save the magic stat.

Additionally, separate from any individual engine hack, setting weapon effect to 0xC will make that weapon unable to double.

14 Likes

Chapter 2: Entering the Matrix

We’ve covered all the bits around the skill system, but now we’ll enter into the pieces it uses directly; not too deep just yet, we’re just wading into external, but necessary hacks for now.

The first set of necessary hacks we’ll be looking at are as follows:

  • Expanded Modular Save by Stan
  • Icon Rework by Stan
  • Item Range Fix by Tequila, Lord Reyson, & Teraspark
  • Modular Stat Screen by Circles & Tequila
  • Negative Stat Boosts by Circles
  • Popup Rework by Stan
  • Suspend Expansion by Colorz
  • Unit Action Rework by Stan
  • Weapon Rank Fix by Stan

These are all used by some aspect of the Skill System, but outside of that are very useful in their own right. The following all have some feature that’s easily configurable:

Icon Rework

Icon Rework is set up to separate affinity, mount type, and weapon type icons onto their own sheets. The immediately useful implementations of this are the ability to add icons for more affinities without using up item icon slots, as well as clearing up item icon slots previously used for these 3 types of icons. You can find the sheets used for each of these in Engine Hacks/Necessary/IconRework/bin.

Modular Stat Screen

Modular Stat Screen is a very big, very useful hack. This allows for easy (well, easier) editing of the stat screen layout, although most of this requires at least a cursory glance at assembly. The main piece here that you’ll likely be interested in messing with is Display Growths Options, in Engine Hacks/Necessary/MSS/DisplayGrowthsOptions. Here, there are 3 files you can use to configure growths and how they are displayed on the status screen. Using GrowthsColorsTable.event and NewPalette.event, you can change the colors of stat names used to determine growth ranges, as well as what those ranges are; there is further information on this within each of these files. DisplayGrowthsOptions.event is chock-full of settings and toggles for you to mess with:

  • Whether or not pressing Select should display growths on the stat screen
  • Whether fixed growths mode should exist or not
  • Whether passive growth boosters should stack
  • Whether non-player units should be affected by fixed growths mode
  • Whether stat colors should reflect growth ranges
  • Amount the Metis Tome boosts growths by
  • ID of the flag used to toggle fixed growths mode, if enabled

…Oh yeah, passive growth boosters! Let’s move on to the rest of this section, where we’ll touch more on the fun things you can play with:

  • Passive Boosts via Modular Stat Getters
  • Passive Growth Boosts via Growth Getters

To designate an item as a passive booster for stats or growths, simply set bitflag 0x00800000 on the item in the item table. When this is set, no matter where the item is in your inventory, it will give you boosts. If you prefer only the first passive boost item in your inventory to give boosts, you can configure this behavior for stats and growths separately via config options. Stat boosts are each 1 byte, and laid out like so:

  • HP stat boost
  • Str stat boost (Str & Mag if no split)
  • Skl stat boost
  • Spd stat boost
  • Def stat boost
  • Res stat boost
  • Luck stat boost
  • Con stat boost
  • Mov stat boost
  • Mag stat boost (if split)
  • HP growth boost
  • Str growth boost (Str & Mag if no split)
  • Skl growth boost
  • Spd growth boost
  • Def growth boost
  • Res growth boost
  • Luck growth boost
  • Mag growth boost (if split)

This data is then pointed to from the item table. Stat boosts will be applied from the given indexes if the flag is not set and the item is an equipped weapon, but growth boosts will only be applied if the flag is set. You can configure growth options as described in the Modular Stat Screen section to determine if growth boosters should stack or not.

11 Likes

Chapter 3: Skill System

We’ve finally covered everything else, so we’ll get into what you can do with the skill system itself.

Setting Skills

There are 3 ways to set skills on units (technically more, but we’ll touch on that in a bit); personal skills, class skills, and level up skills.

Personal & Class Skills

Personal skills and class skills work the same way; these are set per-character and per-class respectively and cannot be changed during the game, only externally. These skills cannot be overwritten or forgotten. The tables for these are in Tables/FE8 Nightmare modules/Skills, FE8 Personal Skill Editor.csv and FE8 Class Skill Editor.csv. You just set the ID of the skill you want on the character or class you want to have it.

Level Up Skills

Level up skills come in 2 forms: Class Level Up Skills and Character Level Up Skills. Unlike personal and class skills, these are not limited to 1 per character or class, but instead are lists of skills and the levels to learn them at. Their tables, FE8 Character Level Up Skill Editor.csv and FE8 Class Level Up Skill Editor.csv, contain a pointer to the skill list as each entry. You can see default class skill lists in Engine Hacks/SkillSystem/skill_lists.event.
Entries on skill lists are 2 bytes. The first byte is the level to learn the skill at, and the second byte is the ID of the skill to learn. To denote the end of a skill list, just put 0 as both the level and skill ID. Note that for class level up skills the level is the current level, so a promoted class with a skill set to learn at level, say, 5, will cause any unit to learn the skill when they are in the class and reach level 5. A unit loaded in a class will know the 4 most recent level up skills comparative to their current level; units can only know a maximum of 4 level up skills at a time. If a skill is set to be learned at level 255, then it will be known by a unit of that class only if they are loaded as that class. This is a way to allow promoted units to know skills their unpromoted class learned that they may not. With character level up skills, the level is not the current level but the overall level; in an unpromoted class, a unit will learn skills set from level 1-20. In a promoted class, a unit will learn skills set from level 21-40. The two locations level up skills can come from both count towards the 4-skill cap. When a unit tries to learn a 5th non-character or class skill, you will be prompted to choose a skill to forget. The forgotten skill cannot be relearned. A unit cannot learn a skill they already know.

You can configure level up skills to only be learned by certain allegiances or only on certain difficulties using the highest 3 bits of the learned level. Currently available options are as follows:

  • 1: Player Only
  • 2: Enemy Only
  • 3: Normal & Hard Mode Only
  • 4: Hard Mode Only

Learning Skills via Events

In addition to the above methods, you can also teach units skills via events. Using ASMC_LearnNewSkill|1, the unit whose ID is in slot 2 will learn the skill whose ID is in slot 1. This isn’t the only skill-related ASMC; ASMC_HasSkill|1 checks if the unit in slot 2 has the skill in slot 1 and returns the result in slot C, and ASMC_ForgetSkill|1 will cause the unit in slot 2 to (silently) forget the skill in slot 1 and returns whether this operation was successful in slot C.

Configuring Available Skills

Valid skill IDs only run from 1-254, but there are nearly 300 skills for you to play with. In Engine Hacks/SkillSystem/skill_definitions.event, you can configure the IDs of each skill. Skills defined as ID 255 are disabled, so any excess skills should be set as such. 254 skills is an obnoxiously large amount, and you likely won’t need to enable anywhere close to the cap. The default enabled skills are just the first 254 skills that were created, in chronological order. To quickly disable all skills as a starting point for picking which skills you would like to use, find/replace ID with ID 255 //. This will define every skill as 255 and comment out its prior ID. You can then go through and enable just the ones you wish to use, and shouldn’t need to worry about finding IDs and swapping out skills each time you want to enable a new skill.

10 Likes

Chapter 3x: EA-Configurable Skills

This list contains skills with some easily configurable or non-skill effect, usually configurable from EA.

Armor March

Armor March: At start of turn, if unit is adjacent to an armor ally, unit and adjacent armor allies gain +2 Mov.

You can configure the list of classes that are considered to be armored in Engine Hacks/SkillSystem/Skills/AuraSkils/ArmorMarch/ArmorMarch.event.

Effectiveness Skills: Nullify, Slayer, Skybreaker, Resourceful

Nullify: Unit is protected from all effective attacks.

Slayer: Deal effective damage to monster units.

Skybreaker: Deal effective damage to flying units.

Resourceful: Double effectiveness multiplier.

Effectiveness skills coincide with a rework of the effectiveness system. You can configure what weapons have what effectiveness in Engine Hacks/SkillSystem/Skills/EffectivenessSkills/EffectivenessRework.event, or manually in the item table; note if you do the latter the former will overwrite your changes, so you should remove the ItemEffectivenessPtr macros to prevent this.

Forager

Forager: Recover 20% HP each turn if on a Plain, Forest or Mountain.

You can configure which terrain is valid for Forager in Engine Hacks/SkillSystem/Skills/HPRestorationSkills/HPRestorationSkills.event.

Mug Loading Skills: Identity Problems, Quantum Visage

Quantum Visage: Face changes every time it’s looked at.

Identity Problems: This unit can’t decide on a name or face.

You can configure which 100 mug IDs Quantum Visage can choose from, as well as both the mug IDs and corresponding text IDs are used by Identity Problems, in Engine Hacks/SkillSystem/Skills/MugLoadingSkills/MugLoadingSkills.event.

Indoor & Outdoor Fighter

Indoor Fighter: +10 Hit and Avo when fighting indoors.

Outdoor Fighter: +10 Hit and Avo when fighting outdoors.

You can configure which terrain IDs are considered indoors and which are considered outdoors in Engine Hacks/SkillSystem/Skills/PreBattleSkills/DoorFighter/DoorFighter.event.

Black Magic

Black Magic: Skill% chance to inflict a random status.

You can configure the list of statuses that can be applied and the chance of each in Engine Hacks/SkillSystem/Skills/ProcSkills/ProcSkills.event.

Wary Fighter

Wary Fighter: Unit cannot double or be doubled.

The implementation of this skill has the additional effect of making the weapon effect 0xC make a weapon unable to double under any circumstances.

Bargain

Bargain: Halves prices in shops.

The implementation of this skill has the additional effect of allowing multiple items to be considered as Silver Cards. You can configure the list of Silver Cards in Engine Hacks/SkillSystem/Skills/StandaloneSkills/Bargain/Bargain.event.

Heroes Movement Skills: Pivot, Reposition, Swap, Shove, Smite

Pivot: Allows unit to move to the opposite side of an adjacent ally.

Reposition: Allows unit to pull an adjacent ally to its opposite side.

Swap: Allows unit to swap positions with an adjacent ally.

Shove: Allows unit to push other units one tile away.

Smite: Allows unit to push other units two tiles away.

By default, these skills do not have help text along the bottom of the screen when selecting a target. In Engine Hacks/SkillSystem/Skills/UnitMenuSkills/HeroesMovement/HeroesMovement.event, you can set the text IDs for the help text to display for each of these skills.

Amische

Amische: This unit’s religion disallows them from using non-Iron weaponry.

You can configure which weapons are considered usable when this skill is applied in Engine Hacks/SkillSystem/Skills/WeaponUsabilitySkills/WeaponUsabilitySkills.event.

11 Likes

Chapter 4: Adding New Skills

Defining a new skill is a fairly simple process. First, in Engine Hacks/SkillSystem/skill_definitions.event, define your new skill’s ID as something like #define MySkillID 69 //nice. This ID should be a unique value between 1 and 254; skill ID 0 is always treated as true and skill ID 255 is always treated as false, so defining a skill as 0 applies its effect globally and defining a skill as 255 effectively disables it. Next, in Text/skilldesc_text.txt, add an entry for your new skill. It should look something like:

## SD_MySkill
My Skill: Has an effect.[X]

Then, in Engine Hacks/SkillSystem/skill_descriptions.event, add SkillDescription(MySkillID,SD_MySkill) to the end of the list. This will set the description text to the given skill’s ID on the skill description table. The last step is giving your skill an icon. In Engine Hacks/SkillSystem/SkillIcons, place your skill icon image. You then want to open Event Assembler/Tools, and drag & drop the skill icon image onto Png2Dmp.exe. This will generate a .dmp version of the image. Lastly, Engine Hacks/SkillSystem/skill_icons.event before the final ORG, add for your skill its icon. This should look something like:

ORG SkillIcon(MySkillID)
#incbin "SkillIcons/MySkill.dmp"

You now have a skill that will show up properly in-game and have the correct description; however, just doing this does not give the skill any actual effect. To give your skill an effect, you’ll need to write a function that checks if a unit has the skill and applies the effect if so. The easiest way to do this is find a skill that applies a similar effect to what you want your skill to do, copy its source, edit the copy to fit your needs, assemble it, and install it to the same place. Note that to assemble anything, you will need to install devkitPro; widely used assemble scripts included with the skill system expect this to be installed to the default directory, C:/devkitPro. Some skills may require that you copy lyn.exe from Event Assembler/Tools to C:/devkitPro as well. For more information on writing assembly, see Teq’s assembly guide.
The majority of skills apply their effects during pre-battle calculations, and there is a calculation loop specifically for this . You can find it in Engine Hacks/Necessary/CalcLoops/PreBattleCalcLoop/PreBattleCalcLoop.event. This file contains the list of pointers to functions that get run every time battle stats are calculated. There is a high likelihood any skill that affects battle stats is installed to this area. To install a new skill to this area, just add the label at which the function exists to the POINs as directed by in-file comments.
If the skill you are mimicking does not install to a loop of some kind, you likely will need to edit the source of the skill directly to add your new skill to it. A number of skills are already implemented this way; all HP restoration skills, as an example. If the skill you want to make does not affect anything already touched by a skill, you will need to find the location it should hook to and hook it there. Examples of skills that do this largely live in Engine Hacks/SkillSystem/Skills/StandaloneSkills.

14 Likes

Chapter 5: Appendix

This section contains anything that wasn’t present at the inception of this topic but should be covered by it.

Combat Arts

Combat Arts can be enabled by uncommenting #define COMBAT_ARTS in Config.event. Doing so will move all command skills to a Combat Arts submenu, as well as turn a number of proc skills into command-activation skills. Whether any of these are able to double can be controlled by the ARTS_HIT_ONCE true/false definition just below the above one.
Combat Arts have their own IDs separate from skill IDs. These are written to 0x0203F101 in memory and referenced for purposes of stat changes and durability costs when using specific arts. These art IDs are built off of the preexisting attack type system used by Lunge, Mercy, and Gamble, which is in turn built off of a system designed for Pair Up. As such, IDs 0-2 are reserved for normal attack, rescue, and pair up respectively.
Combat Arts come with framework usability & effect functions for menu commands for new arts, utilized by the 9 proc skills already converted to combat arts. To add a new combat art, in Skills/UnitMenuSkills/CombatArts/CombatArts/event you add an entry to the combat arts menu for your skill, then make a version of the following two sections with your relevant values:

ALIGN 4
CombatArtUsability:
#incbin "CombatArtUsability.dmp"
POIN SkillTester
WORD SkillID
WORD 0 // art ID
POIN CombatArtCostTable
ALIGN 4
CombatArtEffect:
#incbin "CombatArtEffect.dmp"
WORD 0 // art ID

These will then handle the unit menu entry for you, making it so that Combat Arts can only be used when you have the proper skill and when you have enough durability left to use them.
Speaking of, you can also set the durability cost of a Combat Art modularly. The macro SetCombatArtCost(attackTypeID,durabilityCost) sets the additional durability cost of the given combat art ID. There is one function that references this data and properly decrements weapon uses as a result, so you don’t have to do it manually.
The proc skills converted to combat arts have functions in the same loop as they normally do, replacing their % chance requirements with a 100% activation rate if the attack type ID matches the one dedicated to that skill. As such, skill activation animations and the like are all still used and all work as if the skill were to proc by chance.

Skill Scrolls

Skill Scrolls are items that can be used to teach a skill to a unit. More specifically, they are a single item that teaches the skill with an ID equal to their durability. This means you can have 255 unique skill scrolls while only using 1 entry in the item table.
Though initially it was locked to just skill scrolls, various pieces have been rewritten to allow you to modularly define durability-based items. The data for doing so is located in Necessary/DurabilityBasedItems/DurabilityBasedItems.event. There are 4 lists here, each contributing to a different aspect of durability-based items. DurabilityBasedItemNameList maps item name values to tables indexed by the item’s durability to get the text ID to use for the item’s name. Entries on this list use the macro DurabilityTextEntry(textID,useColonTerminator,tablePointer). textID is the value that denotes using the given table, tablePointer is the pointer to said table, and useColonTerminator is a boolean value for whether or not to terminate the text at the first colon, rather than the end of the text entry. This option exists due to how getting skill name strings from skill descriptions works, but could be useful otherwise if you so desire. Skill Scrolls, by default, use the item name 0xFFFF to denote using a durability-based skill name instead.
DurabilityBasedItemDescList is the same concept as above, but for item descriptions. Note this does not apply to use descriptions, only R text descriptions. Entries use the same macro as above with the same options available. Skill Scrolls once again use 0xFFFF to denote using a skill description.
DurabilityItemList is a list of item IDs that are durability-based. This is used when displaying the remaining durability of the item in order to make it always display as 1. Entries can be done using the macro DurabilityItem(itemID).
DurabilityBasedItemIconList maps item IDs to icon sheet IDs indexed by durability. This list is only used when the icon ID of an item is set to 0xFF; items need both their ID set to 0xFF and an entry on this list to properly use durability-based icons. The icon sheet used by skill scrolls is ID 5. By default, this is mapped to the same graphics as the skill icon sheet, but you can change it to a unique icon sheet by changing the pointer in Necessary/IconRework/IconRework.event underneath prGetSkillBookIconGfx.
Giving a unit an item with specific durability isn’t normally possible, so this also adds ways in which to do this:

  • GiveItemWithDurability(Item,Durability,Character) will give the given unit the given item with the given durability. This allows you to give a scroll for a specific skill via events.
  • DurabilityChest(item,durability,chestX,chestY) will define a chest map object that, when opened, will give you the given item with the given durability.

Additionally, shops are reworked to allow for selling of items with specific durability. Each entry in a standard shop list is 2 bytes, but 1 of these is always 0. Now, by making each 2-byte entry in a shop list the full item + durability halfword the shop will stock the item with that specific amount of durability. Additionally, as not to cause crazy price swings based on the durability of the item, there is a list in DurabilityBasedItems/DurabilityShop/ShopDurability.event, FixedPriceItemList, that acts as a list of items whose price is always equal to their cost per use value regardless of their current durability.
The Skill Scroll item itself is set up through Item Effect Revamp, to allow it to be used at the prep screen. During a map, you can use a skill scroll at any time and it will bring up the forget skill menu if necessary, but at the prep screen, you can only use a skill scroll if you don’t already have four learned skills. If you don’t want to use Item Effect Revamp, making skill scrolls unusable at the prep screen is the only step necessary to remove IER as a dependency.

Gaiden Magic

Brought to us by @HyperGammaSpaces and @Snakey1, Gaiden Magic gives units the ability to learn spells that can be cast at any time at the cost of HP.
Setting learnable spells is done per character from Engine Hacks/ExternalHacks/GaidenMagic/GaidenSpellLists.event. Here, you define a spell list for each unit that has one. These lists have 2-byte entries: the first is the level at which the spell is learned, and the second is the item ID of the spell learned. The end of the list is denoted with both values of an entry being 0. You then set the spell list to a character using the GaidenList(charID,spellListPointer) macro. Learned spells can be seen by default on page 4 of the stat screen, complete with R text, and can be relocated wherever is necessary.
Once a unit knows a spell, the Black Magic and White Magic unit menu options will become available. Here known spells are found and can be cast, separated by weapon type into the two menus: anima and dark in black magic, and light and staves in white magic. Note that even if a spell is known, you still require the weapon rank specified by the item in order to cast it. Spells cost HP to cast, and the amount they cost can be set from Tables/FE8 nightmare modules/Item editors/Gaiden Spell Cost Table.csv. The HP cost of a spell is shown in place of the durability of an item. If you do not have enough HP, you cannot cast a spell. If the HP cost of an attack during a battle would kill you, your attack will be skipped. Missed attacks do not appear to cost HP during battle, but do cost HP and will show up as such after battle. When defending, if you cannot counter with the first equippable item in your inventory, you will use your first learned spell instead. Note that this system does not change the functionality of standard spells in inventory as they would work in vanilla, so you can intermingle spell items and learned spells without issue.

Promote on Level Up

Enabling @Vesly’s Promote on Level Up hack will allow you to configure a level at which player units of a given class will automatically promote upon completing an action. The level for each class is set in Tables/NightmareModules/Misc/PromotionLevelList.csv; by default, every class’s promotion level is set to 255. Note that because of the restriction to the promoting unit completing an action, you can only promote on player phase. This means if you level up on enemy phase, you will level up after completing an action on the next player phase. On player phase, you will promote at the end of the battle where you level up.

AoE Attacks

This will allow you to give Area of Effect behavior to weapons and staves. Using the list in EngineHacks/ExternalHacks/AoE/Installer.event, you can set the parameters of AoE attacks and the requirements to obtain the ability to use them. The format of each list entry is as follows:

+0x0    Byte    UnitID    // ID of character allowed to use; 0 for everyone
+0x1    Byte    ClassID   // ID of class allowed to use; 0 for everyone
+0x2    Byte    Level     // Level requirement to use; 0 for any level
+0x3    Byte    ItemID    // ID of item required to use; 0 for no restriction
+0x4    Short   FlagID    // ID of flag controlling usability; 0 for none
+0x6    Byte    SkillID   // ID of skill required to use; 0 for none
+0x7    Byte    None
+0x8    Byte    HPCost    // HP cost for using attack
+0x9    Byte    Config    // Bitfield for various config options; see below
+0xA    Byte    PowLowBound    // low bound for base damage dealt/healed
+0xB    Byte    PowHighBound   // high bound for base damage dealt/healed
+0xC    Byte    MinRange  
+0xD    Byte    MaxRange 
+0xE    Byte    RangeMaskID    // ID of range mask to use; see below
+0xF    Byte    AnimationID    // ID of AoE animation to use; see below

Most of these are self-explanatory, but 3 of them warrant further explanation.
The Config byte is a bitfield whose available settings are as follows:

  • HealBool - 1 for healing, 0 for damage
  • FriendlyFireBool - 1 for hitting allies, 0 for not
  • FixedDamageBool - 1 for using only base damage range, 0 for also using unit’s str/mag
  • MagBasedBool - 1 for using mag, 0 for using str; no effect without Str/Mag Split
  • HitResBool - 1 for hitting target’s resistance, 0 for hitting target’s defense
  • DepleteItemBool - 1 for decreasing item of set ID’s uses, 0 for not
  • UsableOnlyIfStationaryBool - 1 for only allowing use when you haven’t moved, 0 for allowing use whether or not you have moved

These are all definitions, and setting some combination of them for the Config byte will control their respective behavior toggles.

The Range Mask byte indexes a table RangeTemplateIndexList in a separate file in the same directory, AoE_RangeTemplates.event. Each entry on this table is 4 pointers to differently rotated versions of the range mask at that ID; these are what control the shape of the Area of Effect. The format of range mask data begins as follows:

+0x0    Byte    SizeX    // size of the AoE, 1-indexed
+0x1    Byte    SizeY
+0x2    Byte    OriginX    // location the cursor is placed at, 0-indexed
+0x3    Byte    OriginY

After this comes SizeX * SizeY bytes, each representing whether or not the tile at that position is within the affected area with 1 as included and 0 as not included. Each 90-degree rotation of the base AoE mask gets its own instance of this data pointed to from the initial table. There are a number of preexisting range masks, indexed as follows:

  • 0 - Triangle - 3x5 triangular area of effect centered on its point.
  • 1 - Small Curve - 3x2 slight curve.
  • 2 - Line 1 - 3-tile line from the cursor.
  • 3 - Double Line - 5x2 line centered on the cursor.
  • 4 - Small Triangle - 3x2 triangle centered on its point.
  • 5 - Giant Cross - 2 perpendicular 9-tile lines intersecting the cursor.
  • 6 - Square - 3x3 square.
  • 7 - Cross - 2 perpendicular 5-tile lines intersecting the cursor.
  • 8 - Line 2 - 5-tile line centered on the cursor.
  • 9 - Small Cross - 2 perpendicular 3-tile lines intersecting the cursor.
  • 10 - Cross - Same as 7.
  • 11 - Small X - 3x3 ‘X’ shape.
  • 12 - X - 5x5 ‘X’ shape.
  • 13 - Diamond - 5x5 diamond shape.
  • 14 - Small Line - 3-tile line centered on the cursor.
  • 15 - Smile - 5x4 smiley face.
  • 16 - Expressionless Face - 5x5 serious face.
  • 17 - Medium Cone - 3x5 cone centered on its point.
  • 18 - Large Cone - 6x5 cone centered on its point.
16 Likes

Nice guide! :+1: I’m always a fan of verbose documentation and such like this.

Very small thing, but I think it’s worth noting with the str/mag split and stairs that EMS is forced regardless of what option you choose for your save expansion in config.

6 Likes

this is an extremely good guide, excellent work my friend

2 Likes

In the last weeks I went trough all of it myself - THANK YOU for making it available here for all in such a good way! :slight_smile:

2 Likes

Can’t wait for combat arts. Great guide, this will be very helpful to me.

1 Like

added sections on combat arts & skill scrolls

5 Likes

This update seems to bring a lot of new and interesting things! is it already available to use?

Yes

2 Likes

As it’s now been merged in to the skill system, added a section on Gaiden Magic 2.0

5 Likes

is it possible to have both combat arts and proc skills or are they mutually exclusive?

You can, not every proc skill even becomes a combat art when they are enabled; if you want to pick and choose between the ones that are, you’ll need to manually configure it to use the desired versions of each

Maybe I missed this, but in Ch3 under subsection “Level Up Skills” you don’t mention how the top three bits of the level byte can actually be used for options. Maybe you could add this info?

On a different note, are these bits checked in other routines besides GetUnitLevelSkills? I’m trying to remove their functionality in my buildfile.

Very sorry if this question’s answer is obvious, unfortunately my brain is small and smooth, and I lack whatever the basic knowledge you all share is. I’m using the skillsystems 20201108 patch on FEBuilderGBA and wanted to configure which skills are active and which aren’t. Where would I look to find Engine Hacks so I could mess with Config.event? Many thanks.