Sme's ASM and Miscellany

Starting to collect a few creations I’d like to make easily accessible and thought to make individual threads for all of them might get a little bit ludicrous so this thread is for whatever I cook up. For now, starting off with this:

[ASM] Escape / Arrive (FE8)

Escape/Arrive

https://i.imgur.com/jaszLuH.mp4

This hack offers two new map objectives, Escape and Arrive, modeled after their Tellius implementation. With Arrive, when any unit reaches the point and uses the command the chapter will end. With Escape, when any non-lord unit reaches the point and uses the command they will leave the map (this uses REMU, you’ll have to use standard event implementations to reveal them again for later chapters). When the lord unit reaches the point and uses the command the chapter will end.

Creating Arrive and Escape points is simple; they use Seize points, but when event ID flag 0x21 is set Seize becomes Arrive and when event ID flag 0x22 is set Seize becomes Escape. NOTE: Event ID flag 0x23 is also used in the process of escaping units, if you set this the next time a unit ends its turn it will vanish. Avoid using these three IDs (there are 24 before this point that you can use + 5 after, there should be plenty still).

Know that this hack is highly integrated with the Skill System and will not work without it. No longer requires Skill System, works standalone, Skill System portion still present if you wish to use it.

Download

Installation

Everything in the Post Combat Skills folder needs to go in Skill System/Post Combat Skills; this piggybacks off of existing post combat things from the skill system to properly let units escape (+ this edits skill system’s canto routines so you can’t canto after escaping)

Everything in the Escape/Arrive folder should probably go in its own folder in Engine Hacks; you’ll want to #include the Escape Installer.event, probably in your Master Hack Installer, which will handle installing everything. Additionally, at the bottom of the skill system’s Master Hack Installer is the unit menu command list; you’ll want to replace the line UM_Seize with the following four lines:

  MenuCommand(0x67A, 0x6CC, BlueText, NewSeizeCheck|IsPointer, $8023021)
  MenuCommand(ArriveName, ArriveDesc, BlueText, ArriveCheck|IsPointer, $8023021)
  MenuCommand(EscapeName, EscapeDesc, BlueText, EscapeLordUsability|IsPointer, $8023021)
  MenuCommand(EscapeName, EscapeDesc, BlueText, EscapeGeneralUsability|IsPointer, EscapeGeneralEffect|IsPointer)

These will make Escape and Arrive show up in the menu and make Seize play nice with them; you can change the menu command colors here if you so desire (the color defines are in _UnitMenuDefs).

[ASM] Magic Sword Rework (FE8)

Magic Sword Rework

Lets you define as many weapons as you’d like as magic swords, so they’ll use Str/2 and hit Res when attacking at 2+ range but act as normal swords in melee. You can set the weapon type the sword uses at 2+ range (Anima/Light/Dark, or something else if you’re feeling crazy) as well as whether or not to use magic damage in melee, like with the Runesword (won’t use magic animations in melee though, but @circleseverywhere did a hack a while ago that takes care of that part: [FE8] Always display ranged animation for some weapons ).

Download

To install, just put MagicSwordRework.event and MagicSwordRework.dmp in the same directory and #include the event file. Within the event file, you can define what items are magic swords. Each entry in the magic sword list is 3 bytes long; first is item ID, the second is weapon type (there are definitions for it as well), and third is whether or not to use magic damage in melee (True to use, False to not). Make sure you set bit 0x40 in the item ability 1 byte for your new magic swords as well, that’s what lets it hit res at range.

https://i.imgur.com/aJRawf2.gif

[ASM] Super Arena (FE8)

Super Arena

Unused in all 3 GBA Fire Emblem games is a setting for the arena that makes the enemies more difficult across the board. With this hack, after winning 2 arena fights Super Arena is turned on for that unit.

Download

The vanilla text will not properly display due to going 3 lines before clearing the text and text scrolling doesn’t work properly in the arena. Here’s a fixed version:

Welcome to the arena.[A][NL]
Oh! It's you again.[A][2NL]
I've lost a lot of gold[NL]
thanks to you...[A][2NL]
If you want to continue,[A][2NL]
we're going to have to[NL]
do things differently.[A][2NL]
I'm going to prepare some[NL]
more challenging foes.[A][X]

Install to text ID 0x8D1 to replace the existing broken version.

[ASM] Save Globals Through Suspend (FE8)

Globals Through Suspend

This hack will write global event flags to the save file whenever the game writes suspend data, which it does after every action a unit takes, as well as when you select Suspend from the menu. It lets you do cool things like this:

https://cdn.discordapp.com/attachments/144670830150811649/609960505758711809/2019-04-20_14-50-41.gif

Note that you’ll need to unset the flag set that tells the game to go to the world map, or you’ll just immediately go to the world map upon reloading:
ENUF $89

Download

Once again to install just #include the .event file.

[ASM] Change Weapon Ranks ASMC (FE8)

Weapon Ranks ASMC

A way to change any unit’s weapon ranks through events, intended to allow giving characters access to weapon types they normally wouldn’t get through story events or likewise, as well as removing weapon ranks so a character can have their access to a weapon type their class would normally get revoked without affecting all units with that class.

Install it to anywhere in free space then call it with ASMC. It takes 3 arguments; character ID in memory slot 1, weapon type in memory slot 2, and weapon rank in slot 3.
A few examples of how it could be used:

Revoke Moulder’s Staff rank:

SVAL 1 Moulder
SVAL 2 4
SVAL 3 0
ASMC ChangeWeaponRankASMC|1

Give Eirika a D lance rank:

SVAL 1 Eirika
SVAL 2 1
SVAL 3 31
ASMC ChangeWeaponRankASMC|1

https://i.imgur.com/rOkhxIG.gif

Download

[ASM] ASMC Check Suite (FE8)

Check Suite

A set of 23 ASMC checks to supplement the existing event commands. The following checks are made available through these macros (thanks to @P33RL355 for writing the macros):

CheckLevel(Character)
CheckExperience(Character)
CheckMaxHP(Character)
CheckCurrentHP(Character)
CheckStrength(Character)
CheckSkill(Character)
CheckSpeed(Character)
CheckDefense(Character)
CheckResistance(Character)
CheckConstitution(Character)
CheckMovement(Character)
CheckInventory(Character,Item)
CheckSwordRank(Character)
CheckLanceRank(Character)
CheckAxeRank(Character)
CheckBowRank(Character)
CheckStaffRank(Character)
CheckAnimaRank(Character)
CheckLightRank(Character)
CheckDarkRank(Character)
CheckStatusEffect(Character)
CheckStatusDuration(Character)
CheckMagic(Character) //needs strmag split

No check for luck, since CHECK_LUCK is a vanilla event command. Note that CheckMagic is commented out by default, you’ll have to uncomment it if you want to use it. All of these can take either a direct character ID or 0xFFFF to use the active character; vanilla commands can also be told to use the character ID in memory slot 0xB, however these checks cannot.

Download

To install just #include the .event file, then you can use the macros in your events.

[ASM] Modular Changing Battle BGM (FE8)

Changing Battle BGM

This hack will let you specify an arbitrary number of character ID + song ID pairs for music to change after fighting the unit once, like the Demon King does in vanilla. Note the song ID you’re specifying is the version without an intro, you should set the version with an intro on the Boss Music List. Additionally, every one of these uses the same global event flag and as such using multiple in the same chapter may be difficult.

https://youtu.be/jt_SIk960ho

Download

[ASM] Arbitrary List of Classes With Dancer Music (FE8)

Dancer Music

This hack allows you to define an arbitrary list of classes for whom the dancer music will play when dancing.

https://youtu.be/ttZT4VlFVM8

Here you can see the various scenarios without this hack vs with this hack.

Download

[ASM] Biorhythm (FE8)

Biorhythm

This hack puts the Biorhythm mechanic from FE9/FE10 into FE8.

https://cdn.discordapp.com/attachments/144670830150811649/631599651849764917/9bLXb4tJVJ.gif

There are 7 biorhythm effect states: Worst, Bad, Poor, Neutral, Good, Great, and Best. All of these save for Worst and Best can be approached from either direction, making a total of 12 actual states. States begin from Worst, ascending at 0 and progress through to Bad, descending at 11 before looping back to 0. This makes Neutral, ascending be 3 and Neutral, descending be 9. The Hit/Avo bonus/buff you get from each can be defined in Biorhythm.event, as can the text ID of the name for each state. Note that whether the effect is positive, negative, or neutral cannot be edited from the .event file and are hardcoded to each state.

The Biorhythm Table is where you set each character’s biorhythm initial position and rate of progression. This table is indexed by character ID and has two values per entry: initial position and amplitude. The initial position uses the values as laid out above and the rate of progression, or “amplitude” of their biorhythm wave, is number of states to advance per turn / 4. This means an amplitude of 4 will advance 1 state per turn, an amplitude of 1 will advance 1 state every 4 turns, and an amplitude of 12 will advance one full cycle forward to the current position every turn. Using an amplitude of 12 and a neutral starting position will effectively act as if there is no biorhythm for the character you set it on.

Download

This does require Skill System by virtue of using its pre-battle calc loop to apply Biorhythm effects, as well as needing Modular Stat Screen to be on the menu. Included in the download is a readme with install instructions, the above usage explanation, and everything you’ll need to implement biorhythm yourself.

[ASM] Character-Based Animation Forcer (FE8)

Animation Forcer

This uses the vanilla check for the Demon King class to force animations on against the final boss and expands it to an arbitrary user-defined list and also to characters instead of classes, as I figured having to make a unique class for everyone you want to force animations on for would get annoying and space-consuming very quickly.

https://cdn.discordapp.com/attachments/535891396033249330/633539410868043778/LyBUubxBi7.gif

Download

[ASM] Deny Stat Screen Access (FE8)

Deny Stat Screen

In vanilla, you cannot view the stat screen of gorgon eggs with the R button, nor can you scroll to them from another stat screen of the same allegiance. This hack takes that functionality and expands it to an arbitrary list of classes. Unlike the hack below, this one is harder to change the requirements off of anything class-based, as various functions here are only passed the class data and not the character struct.

https://cdn.discordapp.com/attachments/144670830150811649/636048976206102528/Vg75QPICN8.gif

Download

[ASM] Deny Counterattacks (FE8)

Deny Counterattacks

The way gorgon eggs work is they always have the weapon they’ll have once hatched in their inventory. To prevent them from counterattacking when you attack them as an egg, there is a hardcoded check that disables their ability to counterattack. This hack extends that to an arbitrary list of classes. Additionally, this hack may be used as a jumping off point for applying this status in other circumstances.

https://cdn.discordapp.com/attachments/144670830150811649/636038848962625548/EAeLcLannn.gif

Download

[ASM] Dancer Ring Refresh (FE8)

Dancer Ring Refresh

Fairly self-explanatory, lets dancer rings refresh like Dance in addition to applying their effect.

rKgZip0fTc

Download

[ASM] Refuge (FE8U)

Refuge

Something I saw done in the FE8J hack “The Nameless Heroes”, and here it is functionally recreated in FE8U. Refuge allows you to “rescue” yourself into another unit that is capable of rescuing you (if your con is less than their aid, you can Refuge into them).

https://cdn.discordapp.com/attachments/144670830150811649/642835623958282243/KlGVTcqlQ3.gif

Big thanks to @StanH, whose Heroes Movement Skills and general doc were an invaluable resource for seeing how target selection and unit actions work.
This hack requires Skill System for its post-action loop and Stan’s Unit Action Rework for implementing the refuge action itself (Unit Action Rework is included with Skill System).

Download

Installation instructions are included in the download package.

[ASM] Holy Blood (FE8)

Holy Blood

Akin to FE4/FE5 and FE16’s systems comes holy blood. For each blood type, you can define:

  • Name
  • Description
  • Growth boosts for each stat
  • Whether or not it allows access to dragon veins
  • Holy Blood locks per weapon

You can give units major or minor blood, major blood causing an icon to appear on their status screen, doubling growth bonuses, and granting access to weapons locked to that blood type.

https://cdn.discordapp.com/attachments/535891396033249330/644439871540428819/pSQ9arv6vR.gif

As an example, Iron Sword is set to be locked to Donate blood.

Download

Requires skill system’s weapon usability calc loop (this hack is the reason I made that calc loop in the first place), MSS, and dragon veins (which all come with skill system) to be fully featured.

[ASM] Status-Inflicting Weapons (FE8U)

Status Weapons

Hacks for these have existed for a long time, but there is currently no version compatible with the skill system. This uses the proc skills loop to integrate with the skill system, so it is fully compatible.

https://cdn.discordapp.com/attachments/535891396033249330/656418515322142720/VBl5ka21sf.gif

Download

To install, just #include StatusWeapons.event and add Proc_StatusWeapons to the proc skills loop.
To make a weapon a status weapon, just give it weapon effect 0xD and put the ID of the status you wish to inflict at item data +0x22 (the second unused byte at the end of each table entry, the same one used by Item Effect Revamp). Statuses applied during battles are hardcoded to always last 5 turns; if you want to change this amount, the byte at 0x178EA is the duration shifted 4 bits left (the default value is 0x50 which equates to 5 turns, 0x30 would equate to 3 turns, etc).

[ASM] Item-Specific WTA (FE8)

Item-Specific WTA

Off the Community ASM Bounty List. It allows you to set WTA effects on specific weapons vs. specific other weapons.

9mkYx2N0d6

Download

#include ItemSpecificWTA.event and add ItemSpecificWTA to the skill system WTA calc loop to install.

[ASM] Fatigue (FE8)

Fatigue

Per request of a few, an FE5-style fatigue system in FE8.

Fatigue will increment by 1 after every Combat, Staff, Dance, Steal, or Summon action you take, and for staves will increase by an additional 1 per weapon level above E the used staff requires (D gives 2, C gives 3, etc.). If your fatigue exceeds your maximum HP, you will be unable to be deployed at the next preparations screen. Sitting out for a chapter, no matter your fatigue level, will reset it to 0 at the next prep screen. Optionally, you can set stat debuffs to occur if a unit becomes fatigued mid-chapter. S Drinks can be used to restore your fatigue to 0 no matter where it’s at, and you can also create items that restore an amount of fatigue equal to their might value.

https://cdn.discordapp.com/attachments/235253973588639747/666861396272742433/HaJOtZA6J7.gif

Download

Fatigue changes a few things with how much the game saves by slightly extending the amount of data it saves per unit, so it may cut the total number of player units that can be saved ever so slightly. To do this, it requires Expanded Modular Save. To actually increment fatigue, it requires the skill system post-battle calc loop. For items to be usable on the prep screen, it requires Teraspark’s Item Effect Revamp. It also integrates with Modular Stat Screen for displaying fatigue.

Installation Instructions
  • #include “Fatigue/Fatigue.event” to install the meat of the system. This will also install Teraspark’s Item Effect Revamp v0.8 by default as it is necessary to make items usable at the prep screen properly; make sure to manually uninclude this if you are already using it. If you have custom item use routines and are not using Item Effect Revamp, you may need to move the pointers to their routines to the IE Revamp table, as it moves four separate vanilla item use routine pointer tables to its own singular table. See the IE Revamp thread for more information on the function of Item Effect Revamp.

  • Item Effect Revamp requires a set of tables, some of which replace vanilla tables. These are in the Tables subfolder and should be placed with the rest of your CSV tables. By default, S Drinks are set to effect ID 0x38 and general fatigue restore items to 0x39.

  • Fatigue stat screen layout is in the ModularStatScreen subfolder. Note that this is a strmag split layout, although the Fatigue section of it may be relocated to any MSS file you desire.

  • The ExpandedModularSave module for saving fatigue is in the EMS subfolder. Note that as this is built with compatibility in mind, it saves Snakey’s Stairs byte through suspend as well as str/mag split Magic stat through suspend and saving in addition to fatigue. If you are not using one or both of these it will still function, but it is compatible with them. Further note that as this extends the length of the saved unit data very slightly, it may reduce the maximum number of player units that can be saved by a small amount.

  • Necessary text is in the Text subfolder.

  • In the Skill System Post-Battle Calc Loop (SkillSystem/Internals/CalcLoops/PostBattleCalcLoop), add POIN PostCombatIncrementFatigue PostCombatStaffIncrementFatigue. This is the part that actually gives you fatigue after taking actions.

  • To create S Drinks, give the item you want to be an S Drink the use effect of 0x38. To create any other fatigue-restoring item, set the might of the item to the amount of fatigue you want it to restore and give it use effect 0x39. The effect IDs can be changed if necessary by fiddling with IE Revamp tables.

  • You can cause stat debuffs for becoming fatigued mid-chapter by adding FatiguedStatPenalty to the stat getter loops for the stats you wish to debuff (halves stats by default).

[ASM] Split Promotion Items (FE8)

Split Promo Items

Allows the usage of different promo items to result in different classes when used, similar to the Elysian Whip in DSFE.

https://cdn.discordapp.com/attachments/535891396033249330/669328151066968084/7CnSQ0bFXQ.gif

It also retains the function of vanilla FE8 split promotions, so you can have items like the Master Seal give a choice and separate promotion items to force one or the other pick.

https://cdn.discordapp.com/attachments/535891396033249330/669328169173516308/RBBrvYL5Lj.gif

Download

This hack is completely standalone and does not require or integrate with anything else. Afaik it doesn’t conflict with anything else either. To install, just #include “SplitPromoItems.event”. The lists for associating used promo item with list to reference, list of master seal items, and lists of class-promotion pairs for each class are included in that installer.
The default class settings are only present so things don’t get funky when a class can use a promo item and there is no associated promotion option on the table, it’s in no way balanced or even thoroughly thought through and you are free to change it as you see fit.

[ASM] Fixed Damage Weapons (FE8)

Crossbows?

A la crossbows. Configurable list of weapons that ignore user’s atk in mt calc and just use the weapon’s mt directly.
HwCdbWSoP4

Download

To install, just #include "FixedDamageWeapons.event" and add POIN FixedDamageWeapons to the end of the skill system pre-battle calc loop.

[ASM] Conditional Nos/Resire Palette (FE8)

Fancy Life Steal Colors

Some time ago, someone wanted to recolor Nosferatu to be a light spell. And so, Tequila produced a way to replace the Nosferatu palette with a new, light-themed palette. However, there have since been fairly regular questions as to using both palettes at once. And thus, this came to be.

saW77n414k

If a weapon has the Nosferatu spell anim and has Light or Staff as its weapon type, it will use the lighter palette. Otherwise, it will use the standard Nosferatu palette.

Download

Just #include NosResire.event to install. Shouldn’t conflict with anything other than repointing/replacing the Nosferatu palette.

[ASM] More Shop Types (FE8)

More Shops

Normally, there are only 3 kinds of shops: armories, vendors, and secret shops. The way each works behind the scenes is a table for which portrait to use based on the shop type ID and a table containing the number to add to the armory text ID for each case that it needs to get the text ID to display. This is horribly inconvenient when wanting to make more shop types, and as such, this rewrites this system into 20(!) text ID tables indexed by shop type. It also repoints the portrait table for you, into its installer.

Download

#include MoreShops.event and you should be good to go. This shouldn’t conflict with anything that I’m aware of.

As-is, it’s set up to mimic vanilla behavior for the first 3 shop types (0-2), and as an example sets shop type 3 to use armory text in every case and use the arena man portrait. Note this does not touch music, as not to conflict with other hacks that touch shop music. However, without rewriting a shop music hack to account for more than 3 shop types you’ll find vendor music on every new shop type.

Calling a new type of shop isn’t the easiest thing to do without assembly, so you’ll likely need to use this in conjunction with other hacks for implementations of new shops. However, setting this up really isn’t that difficult:

How to call a shop

Calling a shop is very simple, as all you need to do is call the function MakeShop 0x80b4240. This takes 4 arguments:

  • r0 is the char struct of the unit visiting the shop
  • r1 is a pointer to the shop list for the shop
  • r2 is the shop type
  • r3 is an unknown value; the function saves the value passed in r3, but I can’t find a time it ever uses it and giving it various values appears to have no effect. I’d recommend keeping this as 0, just to be safe.

Call the function with this information, and it’ll handle the rest. Very simple!

[ASM] Shop Unit (FE8)

Buy Somethin' Will Ya!

By utilizing the above shop type expansion, this turns a unit into a shop that can be visited by any other unit adjacent to them. This uses shop type 3, as you can see by the default case for this shop type described above.

hk93VuOqUv

Download

#include ShopUnit.event, and add a menu command for accessing the shop with functions ShopUnitCommandUsability and ShopUnitCommandEffect. As it does not hook into anything, it cannot conflict with anything.

Note this does not check allegiance, so you can make enemy/NPC units be shops as well. For the specific use case that this was made for, any unit on a list brings up the same shop. However, rewriting the command effect piece slightly would allow for unit-specific shops.

[ASM] Aum/Valkyrie/Bifröst (FE8)

The staff that revives an ally that doesn't have a consistent name

https://cdn.discordapp.com/attachments/144670830150811649/707398919448952914/Av524ElZBM.gif

Download

Comes with staff usability & effect functions, AumUsability and AumEffect; set them to the appropriate tables for the item you want to be Aum and you’re good to go.

Note that this won’t let you pick which unit you want to revive. When you use this staff, it looks for the first dead unit in recruitment order and revives them. If no units are dead, it cannot be used. It does not track the order units die in.

[ASM] More Shop Music (FE8)

More music

An extension of my previous Unique Shop Music hack to coincide with shop type expansion. This allows you to set shop music per-shop type, per-chapter. Using this, you can have individual songs for 256 shop types for 256 chapters.

https://youtu.be/f1WBRS2MzNc

Download

To use, #include "MoreShopMusic.event". Within this file are the chapter pointer table and an example shop song table, as well as macros to write to each. Use the macro SetSongChapterPointer(chapterID,songTable) with the desired chapter and label for shop song table to set a table to a chapter. To make a new shop song table, make a label and follow it with InitializeShopSongTable. Then, use the SetShopSong(songTable,shopType,songID) macro to set the song to the given shop type (definitions are included for the 3 vanilla types).

Old, deprecated version for no shop type expansion:

Summary

[ASM] Separate Shop Music (FE8)

Ever wanted your secret shops to have unique music? Well, now they can! This hack changes the vanilla check of if armory play armory, else play vendor with a case for all 3 shop types. The song each has is changable from the EA installer as well.
https://youtu.be/7jRlFHf1mrc

Download

[ASM] Laguz Bars (FE8)

The Tellius mechanic, though it works slightly differently than it does in either FE9 or FE10

The transformation bar runs from 0-30, like in FE10. Unlike in FE10 and like in FE9, you can set a starting position for the bar per-unit on a table. The bar will be initialized to this value at the start of each chapter.
A unit’s bar fills by a set amount every turn and a separate set amount every battle the unit participates in. This amount can be set on a table per-class for increase in either scenario, as well as decrease in the same scenarios when transformed. Note that the transformed class’s decrease values and the untransformed class’s increase values will be used in their respective scenarios; this is set up such that you can have a class that is the transformed version of another, but itself an untransformed class in another class pair.
When the bar is full, you gain the option to Transform; doing so does not consume your action, but you cannot untransform manually. While you are transformed, you get stat boosts; these are configurable per-class, per-stat, based on the transformed class.

https://cdn.discordapp.com/attachments/649389893742493752/710554803817807892/XWYP84x3UJ.gif

Your bar depletes in the same scenarios as it increased in when untransformed. Once the bar hits 0, you automatically untransform back into your previous class.

https://cdn.discordapp.com/attachments/649389893742493752/710554757839978607/hPcE6D2WMg.gif

But, this is not just limited to player units. Enemy and NPC units that are laguz classes will gain bar at the start of their phases, and if this is enough to transform them (or if they already have enough to transform) they will automatically do so. Their bar mechanics are otherwise identical to player units, including automatically untransforming when the bar reaches 0.

https://cdn.discordapp.com/attachments/535891396033249330/710577518523973722/P9qV8cVAy5.gif

Download

Included is a file containing the MSS code for getting the bar to display as seen in the above gifs, as well as installation instructions.

To designate a laguz untransformed/transformed class pair, in LaguzBars.event there is a list for this purpose. Each entry is BYTE UntransformedClassID TransformedClassID, and the end of the list is designated with BYTE 0 0.

There is nothing included with this hack for laguz weapons, as they can be accomplished by disallowing trading/removal of the weapon and giving it a class lock to the transformed class (as was done in the above gifs).

you can also use it to do things like this

IJOZSJ2wE9
vOQsvQlnVE

ADDON - Laguz Skills

Halfshifting and More

This is a bit different from the way I normally do things, but this is an addon to Laguz Bars that implements the skills Wildheart and Formshift from Radiant Dawn. Wildheart has a laguz unit halfshifted; they are always transformed, but only gain half the stat boosts. Formshift has a laguz unit always transformed with full stat boosts.

y2U26VugD9

Download

To install, overwrite the files in the base package with the respective files in this package. You’ll also need to define Wildheart and Formshift as skills.

[ASM] Trap Rework & Tellius Torches (FE8)

insert trap joke here

Trap Rework makes a modular system for adding new traps and letting them display map sprites. The intention is to be user-friendly without needing to touch assembly to define new traps, and as such comes shipped with a number of general-use functions that themselves can be used as a basis for more complex trap cases.

Shipped alongside Trap Rework are conversions of Dragon Veins by Crazycolorz5 and circleseverywhere and Heal Tiles by Snakey1 to use this system, as it is otherwise incompatible with previous versions of these. This also separates the two from one another, as so they don’t have to both be present. It also ships with a new hack, Tellius Torches, for which this system was created. Note that with default settings you will create errors by removing Heal Tiles or Tellius Torches due to the presence of more complex map sprite display checks for each, but Dragon Veins should be entirely removable.

qi5logvbVU

Download

Tellius Torches provide a configurable amount of fog vision and can be toggled on or off by an adjacent unit. They display a map sprite depending on their state (IDs are configurable) and cannot be stood upon. To designate a torch in events, use TelliusTorchOff(x,y,visionRange) for a torch that starts in the off position or TelliusTorchOn(x,y,visionRange) for a torch that starts in the on position. The vision range is retained per-torch when toggled on and off. You can canto out of using a torch, but you cannot use a torch while cantoing. Note that placing torches horizontally, vertically, or diagonally adjacent or along the outside edge of the map is liable to issues. Included torch graphics were made by L95.

Using just EA, you can set up new map sprite traps for purposes such as map indicators, or anything else you so desire. To do so, you just need to use these 3 macros:

SetTrapEventInit(trapID,TrapRework_GenericInitializer) will set a generic function for initialization of the trap from events to memory, allowing you to define your new traps in your events.
SetTrapMapSprite(trapID,mapSpriteID) will set the map sprite to display for your trap at its position on the map. Note that 32x32 map sprites tend not to work well with traps.
SetTrapMapSpritePalette(trapID,paletteWord) will set the palette for the map sprite to use. Don’t worry about the palette word, as you also have the following definitions for each palette:

  • LightRuneTrapPaletteWord will use the Light Rune palette.
  • PlayerTrapPaletteWord will use the player unit palette.
  • EnemyTrapPaletteWord will use the enemy unit palette.
  • NPCTrapPaletteWord will use the NPC unit palette.
  • GreyTrapPaletteWord or GrayTrapPaletteWord will use the greyed out unit palette.

To place a trap on your map, you can use the macro MapSpriteTrap(trapID,x,y) in event trap data to define a trap of the given ID at the given coordinates. Note that trap IDs in use in vanilla run through 0xD, and with default settings here through 0xF

Trap Rework also contains a small library of ASMCs that may be used to manipulate traps mid-chapter. Note that when adding traps through this method, the total limit is 64 at a time, including map changes & breakable walls/snags towards this total. Exceeding this amount is a bad idea, so be wary with how many traps you create. In all cases these macros use memory slot 1 for trap ID, memory slot B for coordinates, and memory slot C for returning values. If you use a macro with these parameters, the previous value in the relevant memory slots WILL be overwritten.

AddTrap(trapID,x,y) will create a new trap of the given ID at the given coordinates.
RemoveTrapAtCoords(x,y) will remove the first trap found at the given coordinates.
GetTrapIDAt(x,y) will return the ID of the trap at the given coordinates.
GetTrapExt1At(x,y) will return the first value of the trap at the given coordinates. What this value is depends on the type of trap, and map sprite traps do not use it at all.

[ASM] Breakable Doors (FE8)

continuing my tellius bs

https://cdn.discordapp.com/attachments/144670830150811649/716005495168827442/hiVBjGqJIj.gif

Download

Currently, this is entirely standalone and should not conflict with anything, though I do have plans to integrate it into Trap Rework to allow for easy, modular additions of breakable terrain at a later date.

[ASM] Status Expansion (FE8)

More Statuses

Status ID and Status Duration values are both stored in the same byte. Normally, these are given equal space for storage; 4 bits for ID, and 4 bits for duration. Both can therefore store a value from 0-15. Status durations never exceed 5, but status IDs use 13 of the 15 available values and prevent using any higher status IDs, which is inconvenient for adding new statuses. There is exactly 1 unused status ID which is historically what has been replaced when new status effects are implemented. This then means you cannot have more than 1 of these non-vanilla statuses at once.
By changing how the game reads and writes status IDs and durations, this hack makes it so there are twice as many status IDs available to work with without needing to save any more data. Given the vanilla statuses, this leaves room for 18 new status effects. By default, this doubles the number of available statues from 15 to 31 by cutting the maximum status duration from 15 to 7, as it never goes above 5 anyhow.
If you wanted to, you could very easily make this cut it further to a maximum of 3 turns and have 63 total valid status IDs; this is not done by default to preserve vanilla status effect lengths.

This adds the ability to define new status effects by setting their name, their description, and what icon to show on the unit’s map sprite when the status is applied. The best part is, this system is entirely modular! You can add and remove statuses at will, and set their status IDs to whatever you want (though note redefining vanilla status IDs will not change their effects, only their display).

Additionally, this comes with integrations of the Freeze status by Colorz and the Hexing Rod status by Datagne integrated with this new system, as well as a handful of brand-new status effects:

Enfeeble

gZhcBKeI3h

When a unit is Feeble, their (non-HP) stats are all cut in half.

Regen

dHRMybm1dM

When a unit has the Regen effect, they will recover 25% of their max HP each turn that the status lasts.

Haste

ttcXGb7mqx

When a unit has the Haste effect, they can take 2 actions per turn.

Slow

pgDTAMOAed

When a unit has the Slow effect, enemies will always double attack them.

Download

Nothing within this system inherently gives you a way to apply status effects, but there’s a few ways with other hacks you can apply statuses. You can use Status-Inflicting Weapons to inflict upon a weapon you set landing a hit, or you can use Item Effect Revamp to very easily create brand-new status staves and dancer rings.

Due to the wide breadth of the status system, it’s entirely possible I missed something somewhere. Please let me know if you run into status-related issues when using this.

[ASM] Status Immunities (FE8)

Status Immunities

In vanilla, the Demon King is immune to status effects inflicted via a weapon by just not getting statused if hit and via status staves by just setting their hitrate to 0. This takes both of these immunity cases and applies them to a list of classes instead of just the one. This way, you can set as many classes as you’d like that are immune to status effects applied in each of these ways.

KnL6wtbkjk

Download

Just #include StatusImmunities.event, this file contains the class list as well.

[ASM] Free Movement (FE8)

because so many people asked for its release lol

This allows you to freely control a character on a map in lieu of traditional cursor-based gameplay.

https://cdn.discordapp.com/attachments/535891396033249330/764965230429470751/xnSVPkiaxc.gif

Of course, if the only thing you could do is move around it would be pretty useless. You can also interact with the map using the A button.

https://cdn.discordapp.com/attachments/535891396033249330/764965808765534218/uo5jejz1EG.gif

This means you can do shops as well.

https://cdn.discordapp.com/attachments/725478895226191892/763971424041304084/Q5ZaAiVz7t.gif

Shops aren’t the only thing you can interact with. Interacting with a door or chest will open it.

https://cdn.discordapp.com/attachments/535891396033249330/764965244693905458/4JX0JIQ9Jz.gif

You can also have events that run when you enter a certain area or every time you take a step.

https://cdn.discordapp.com/attachments/535891396033249330/764993984132022282/Pzp4nAN7pI.gif

You can also interact with other units on the map.

https://cdn.discordapp.com/attachments/725478895226191892/763971983883894834/n6E2anxgyX.gif

Lastly, you have a menu, which you can do anything you want with content-wise. By default, it contains some map menu commands specifically the ones that I tested and didn’t crash the game.

https://cdn.discordapp.com/attachments/725478895226191892/763981385852911626/FC9QzVMv8M.gif

Movement collision is based upon whether or not the tile is passable by the unit you’re controlling, or if there is a unit in the space you’re attempting to move onto. You are always in control of the first player unit (to let the player choose who this is, make a prep screen with 1 deploy slot; otherwise, this will usually be your lord if they are force-deployed on every map). Move around with the D-pad as you would expect, and press A to interact with the tile you’re standing on. If you hold a direction and press A, you interact with the tile next to you in that direction; standing next to a unit, holding towards them, and pressing A will interact with them. The L button opens the menu.

Events for this are set up largely the same way that you would normally do events for a chapter. AFEVs and AREAs will run the step after the condition to run them is met, largely analogous to them running after each unit’s action in normal gameplay. Chests and doors are defined the same way as they are normally, but you don’t need a key/lockpick/etc to open them in free movement mode. You can place chest events anywhere, but note that if there is not a tile change at that position the chest won’t work properly (the tile change can be a single tile of the tile that denotes “don’t change this tile”). Talk events are defined in the same place as normal, but note that the only thing read is the second character and the event pointer, so you can’t have multiple talk events with one unit from different initiators set up in the normal way. You can do checks within the event called by talking to determine character-specific interactions, however. There’s an input for char ID that lets you use the first player unit, but the unit you’re controlling is set to the active unit as well for ease of use. Shops do not work as normal, but instead require the use of an ASMC to call the shop, included with Free Movement (but not installed in its installer). To use it, put a pointer to the shop list in s2 and the shop type ID in s3, then ASMC MakeShopASMC.

To enable Free Movement mode, call the EnableFreeMovementASMC. This comes with the definition EnableFreeMovement for ease of use. As this works by hijacking the phase controller, this will only go into effect at the next phase change. As such, the ideal place for this is in a chapter start event. There’s no way to normally end phase while already in Free Movement mode, and enabling it mid-chapter can lead to some weirdness. There’s also a DisableFreeMovementASMC, but as before there’s no way to normally end phase while in free movement mode and disabling it mid-chapter will break things, so I would not recommend using this. Note that the game does not suspend automatically while in Free Movement mode. You can call the make suspend save ASMC ASMC 0xB5D5D to make one at points within your events that you want to save the player’s progress. Of course, manual suspend saves from the menu do function as well.

Download

Installing is just #includeing FreeMovement.event. To save the state of being in Free Movement mode through suspend, you’ll need Expanded Modular Save (its default configuration should be fine). The command list for the menu is near the bottom of FreeMovement.event. This will conflict with anything that affects the phase controller function, as it rewrites it. For the shop ASMC, #include "MakeShopASMC.lyn.event".

Map used for demonstration here was made by @ZoramineFae with minor edits for the purpose of showing off doors and chests.

[ASM] Character-Based Promotions (FE8)

Character-Based Promotions

Makes the class a character promotes to be based on their current class and set per-character, rather than per-class. With this, you can make individual units of the same class more interesting by controlling what class they can each promote to.

M06Gf8mK8Y

Download

To install, just #include CharBasedPromos.event. Uses a list in the installer for character, base class, and promoted class combinations, if one isn’t found it will attempt to show the split promo screen instead. Note that this specific behavior adds the caveat that any class that would normally only promote to a single class needs to have an entry on the character-based promo list or the game will hang (in vanilla, this is just the two lord classes and the default settings give the needed entries to make them work). This is built from split promo items, and as such is not compatible with that hack.

[EA] Debug String Setters (FE8U)

finally circling back to the "miscellany" part of the thread title

This is a pair of EA tools for setting the debug date/time string and the debug project name string automatically to data relevant to a buildfile (separated into two different programs because date/time is potentially useful outside of a buildfile and project name has very specific buildfile use cases). These serve no non-cosmetic purposes but are neat.

In vanilla, the debug menu looks something like this:
SkillsTest_001
In the top left, you can see the project name _2003 and the date & time at which the game was built.

Date Time Setter will update the date & time information to the system date & time when it was invoked:
SkillsTest_003

Project Name Setter will update the project name information:

SkillsTest_004

The project name is changed to the first 7 letters of the name of the directory that the file passed into EA is located in. This is generally the root folder of a buildfile, but not particularly useful in any other environment.

And of course, you can use both at once:

SkillsTest_005

This information is only displayed on this one screen, so again, a largely pointless thing to change.

Download: Date Time Setter

Download: Project Name Setter

[NMM] FE6/7/8 Sound Room Nightmare Modules

Sound Room Modules

Saw this didn’t exist and needed to edit Sound Room for a project, so I wrote nightmare modules for FE7 and FE8’s sound rooms.

FE8 Module
FE7 Module
FE6 Module

[NMM] FE8 Boss Music Editor

Boss Music Editor

Couldn’t find this one anywhere so I did it myself

Download

36 Likes

One word.

AWE-SOME.

1 Like

Fixed an issue with Escape where any unit that ends their turn is set to undeployed; if you notice in the gif in OP Eirika is absent from the Unit list, due to having moved the previous turn.

Praise Teq

1 Like

Added Separate Shop Music hack to OP (editing OP doesn’t bump post so I have to oof)

4 Likes

Discourse rework when

Separate shop music. Jaw drops. Epic QoL ASM Sme, hat’s off to you!

1 Like

[NMM] Boss Music Editor

Couldn’t find this one anywhere so I did it myself

Download

Wait discourse update broke my OP reeeeee

3 Likes

add to OP please

1 Like

Well I’m fucked

1 Like

[ASM] Change Weapon Ranks ASMC (FE8)

A way to change any unit’s weapon ranks through events, intended to allow giving characters access to weapon types they normally wouldn’t get through story events or likewise, as well as removing weapon ranks so a character can have their access to a weapon type their class would normally get revoked without affecting all units with that class.

Install it to anywhere in free space then call it with ASMC. It takes 3 arguments; character ID in memory slot 1, weapon type in memory slot 2, and weapon rank in slot 3.
A few examples of how it could be used:

Revoke Moulder’s Staff rank:

SVAL 1 Moulder
SVAL 2 4
SVAL 3 0
ASMC ChangeWeaponRankASMC|1

Give Eirika a D lance rank:

SVAL 1 Eirika
SVAL 2 1
SVAL 3 31
ASMC ChangeWeaponRankASMC|1

Download

12 Likes

Super Arena Is it always open? I installed it and tested it. It started with that conversation.

dude this is amazing i will definatly use it in my PoR hack i already planed to give you the credid for that Soren portrait but this is even beter

[ASM] Magic Sword Rework (FE8)

Lets you define as many weapons as you’d like as magic swords, so they’ll use Str/2 and hit Res when attacking at 2+ range but act as normal swords in melee. You can set the weapon type the sword uses at 2+ range (Anima/Light/Dark, or something else if you’re feeling crazy) as well as whether or not to use magic damage in melee, like with the Runesword (won’t use magic animations in melee though).

Download

To install, just put MagicSwordRework.event and MagicSwordRework.dmp in the same directory and #include the event file. Within the event file, you can define what items are magic swords. Each entry in the magic sword list is 3 bytes long; first is item ID, the second is weapon type (there are definitions for it as well), and third is whether or not to use magic damage in melee (True to use, False to not). Make sure you set bit 0x40 in the item ability 1 byte for your new magic swords as well, that’s what lets it hit res at range.

2019-03-05_21-17-55

9 Likes

I’ve been waiting about a decade for someone to tackle this, but I am super happy that it is finally a thing.

Edit - Also, not sure that math is working correctly? If Eirika has 8 Str, then she should have 16 Attack with the Steel Sword with vanilla values. Taking off the 5 Defense would make it 11 damage, +1 to 12 via Weapon Triangle at Range 1. As a Magic Sword, it’d be 4+8 = 12 Attack - 2 Res for 10, non-WTA damage. (GIF shows 14 at range, 15 with WTA at melee.)

Similarly, Slim Sword is 3 Mt at vanilla, which would make it 7 damage at melee with WTA and 5 at range (no WTA), but the GIF is showing 9 at range and 10 at melee with it…

1 Like

I did actually forget to migrate to my new function the part that halves str, so the only difference is the +1 from WTA in the above gif.

2019-03-05_21-17-55

As you see here now, damage at range is less but still not correct (8/2 Str + 8 Mt - 2 Res should be 10 damage, not 8). However, nothing I touched gets run unless the weapon has the hit res ability bit set due to where it’s hooked and every weapon seems to be slightly off what you would expect; Ephraim with 23 Atk Iron Lance is hitting for 22. Therefore, I’m fairly confident the part messing up the numbers is something to do with the skill system and not my fault (or if my fault, not within anything to do with magic swords).

I’ve updated the download link for the version that remembers to halve strength.

3 Likes

When the magic sword is in range 1, the enemy always uses magic defense. Can’t he use physical defense?

If this is the case, that’s probably why Eirika’s attack is showing up as a higher-than-it-should be 15 in that second GIF above. 8 Str + 8 Mt + 1 bonus for WTA - 2 Res = 15. Sme did note that you can set whether it targets Resistance at melee range via the 3rd byte of the “struct”, which must have been the case in the GIF for the Steel Sword.

(Still doesn’t solve why the Range 2 one is hitting for 8 instead of 10… unless something is backwards on the Steel Sword and it’s hitting Defense at Range 2 and also factoring in the Weapon Triangle Advantage at the same time, even though it doesn’t display it? (4+8+1-5 would be 8…))


That last question of yours does bring up a thought or two that I have for Sme, though - I feel like, to fully empower creators, the system should account for the following if it doesn’t already (and can be done):

  1. Exportable to non-Sword physical weapons (though Axes would potentially be a problem, unless it defaults to the Hand Axe “spell” at range - I know you can assign magic animations to Bows and Lances by default, but they wouldn’t have the actual magic properties like the OG Light Brand, etc. have and that this replicates)
  2. Ability to customize which stat an individual weapon hits at a given range, including an option for targeting the lower of the two Defenses (i.e. you could set a Bow weapon to hit the lower of Def or Res when attacking or could make something like the Bolt Axe where it hits Def at Range 1 and Range 2, but still counts as Thunder magic when in combat with magic (see #3))
  3. Weapons that always have the property of their assigned Magic type - if you attack a Light Mage (if Anima/Dark/Light) or a Fire Mage (if Fire/Wind/Thunder) with a Levin Sword at Range 1, would it count as a Sword or does it count as Thunder magic in terms of Weapon Triangle interaction? Similarly, what if it was a Bolt Axe instead and you were attacking a tome-user at Range 2 - would it count as a Hand Axe or Thunder magic (discounting the aforementioned animation problem with ranged Magic Axes)?
2 Likes

Since magic swords are now just an arbitrary list of item IDs you can already make any weapon act like a magic sword, and because of how all ranged weapons work you just need to give them an actual spell animation instead of the arrow/javelin/hand axe spell animation (though it may look a bit weird if the ranged animation is made expecting the javelin/hand axe/arrow spell).

There is a bit in item data that if set makes the weapon hit Res instead of Def, for magic swords in vanilla there’s a check to see the current range and if it’s not 2 it unsets that bit where it’s stored in the attacker struct; I changed that to if it’s less than 2 to unset it and also skip the entire check if you specify to hit Res at both range and melee.

If you’re working with Snakey’s anima triangle and you specify a magic sword as a specific anima type, it will be considered so at any range; if you wanted to make a Bolt Axe, put it on the thunder magic list there and keep it a normal 2-range axe and it will be considered thunder magic at both melee and range while being an axe, completely doable outside of magic sword rework.

That being said, the ability to instead of just 0=1-range Def, 2+range Res; 0=1+range Res to have the ability to set what it targets at melee and at range with options like higher of Def and Res, lower of Def and Res is an interesting idea and doesn’t sound that hard to do, so I may add it would probably push each entry to 4 bytes which would sit nicer with me anyhow. Giving the magic at any range behaviour to anima, light, and dark magic also seems pretty doable and if I stopped being lazy and stored information more efficiently I could probably keep it in 4 bytes still.

2 Likes

Alright, after a lot of tweaking and testing I’ve changed how entries in the magic sword list are laid out, as well as added a macro to the event file for an entry, and updated everything in the download. Now instead of specifying whether or not it hits for res at 1-range, you specify what it hits in melee and what it hits at range. Additionally, you can choose whether or not it stays as the weapon type you assign to it in melee.

Entries are now laid out like this:

MagicSwordEntry(itemID,weaponType,alwaysMagic,meleeBehavior,rangeBehavior)

There are examples in the updated event file for the vanilla magic swords and how their behaviour looks in this format.

For melee and range behaviour, you have 4 options; hit defence, hit resistance, hit the lower of the two stats, or hit the higher of the two stats. Melee behaviour covers 1 range and range behaviour covers 2+ range.

A very big caveat at the moment is that no matter what you set, no magic swords that are in item slots besides the vanilla magic swords can hit defence ever; this is due to, when getting enemy’s defence for the battle and deciding if you’re going to hit defence or resistance, it checks the item table for the magic damage flag on the item and not the location in memory that is edited to remove that flag. Since somehow vanilla magic swords do work, there’s something somewhere that determines otherwise on just those weapons that I’ve yet to find. Once I do I will update again to add a fix for this. I shouldn’t need to update the rework code again, just add a fix for this when I find where it needs to go. I’m starting to see why nobody had attempted this for a decade.

1 Like

Entirely unrelated to magic swords, but I’ve also updated Escape/Arrive. Now a non-lord unit cannot escape when rescuing another unit. Additionally, the vanilla lord check was exchanged for a lord bit in character data check.

However, the big thing I’ve done with it is divorce it from the skill system; as long as you repoint the unit menu (example included in download) then skill system should not be required. It’s also possible it’s not required already as-is but haven’t looked enough into it and it’s been long enough that I’m not 100% on how it all works anymore.

Ah, since you listed it as “Magic Sword Rework” and specifically said “act as normal swords at melee”, I didn’t even process that you could just use any item ID and it wouldn’t matter.

Just to make sure I’m understanding, let me make sure my question came across correctly - my point was, let’s say you had a Bolt Axe and there were two enemies with a tile open in between them, both in your unit’s range. One enemy has a Steel Sword and the other has a Shine tome.

If it fought the sword user at Range 1, you’d expect WTD (Axe). If it fought the sword user at Range 2, you’d expect no WT effect (Thunder magic). (Though a case could be made for some weapons to need to be thrown and hit for their magic to activate, not like most Swords do it, so you could also reasonably expect WTD as well.) If it fought the unit with Shine you’d either expect WTA at Range 1 (Thunder-enchanted) or no WT effect (Axe), and at Range 2, you’d expect WTA (Thunder) or no WT effect (Throwing Axe, like the alternate take for Swords). Basically, it would count simultaneously as both an Axe AND Thunder magic.

(Maybe this is what you’re meaning by “Additionally, you can choose whether or not it stays as the weapon type you assign to it in melee.” ?)

I wish I could help on the memory location aspect - I do have some notes on Magic Sword stuff from Hextator/whatever he’s going by these days (the file is dated 2007, oh lord), but they’re from FE7 so the locations in the assembly likely don’t match up to FE8. (There was one function that he documented that “seems to do nothing”, but who knows what it actually does.)

1 Like