As of right now, they only way to use it in FEBuilder is to build Skill Systems use the buildfile first.
If there was a list of patch conflicts that prevent str/mag split from being installed with skill system in FEBuilder, that would be very useful in resolving them so an FEBuilder patch form would be viable.
Or just patch conflicts in general, having everything work nicely together is always a goal.
Ok guys, just one question, it looks like we are not going to be able to “toggle” the ST/MG split with Febuilder for a while, how can I add that feature to my obviously not clean ROM that has the current Febuilder skill system?
Getting into the edited ROM requires a fairly complex procedure.
It’s a lot of work, so you should stop doing it yourself.
I will briefly explain the work I am doing.
Build SkillSystems using vanilla ROM.
However, if you use it as it is, it will be in the SkillTest stage, so remove unnecessary things.
Enable other options you want to, remove unneeded patches , and enable patch and options.
Although now improved, old SkillSystems created strings on top of prologues and ch1 lines, so they are remapped.
Current SkillSystems are mapped to 0xD4C or later.
FEBuilderGBA reserves 0xE00-0xFFF and maps to this range.
If you want to meet the specifications of FEBuilderGBA, you need to remap.
I make the list by hand.
Build SkillSystems.
At this point, check the operation.
Now you need to merge.
This is also a very troublesome task.
Load the FE8 vanilla ROM at FEBuilderGBA.
MENU->Tool->Diff
Make a difference with the ROM that contains the SkillSystems you built earlier.
The difference is saved as a FEBuilderGBA bin patch.
Apply this bin patch to get the latest SkillSystems.
Just before that, you need to erase the old SKillSystems from your ROM.
Look at the old skillsystems patch in FEBuilderGBA.
Various things are written, but simply explaining, uninstalling existing SkillSystems and installing new SkillSystems.
Apply the bin patch created earlier to this format.
Finally, ready.
Let’s update the skill system from the patch of FEBuilderGBA.
If it is updated correctly, it is a success.
If it doesn’t work, it’s a failure.
It is necessary to proceed while checking the procedure from the beginning.
Even if i omit the detailed work and write it, there is this amount.
There are traps everywhere.
If one fails, it will not work.
I am using an old vision quest to test for updates.
I have saved a copy of 2018 version and have confirmed that this version can be updated properly.
Even with so much care and testing, SkillSystems updates often have unexpected events.
SkillSystems has a bug that allows re-move when the 0x03 flag is enabled.
Please read the suspended file.
The unit starts moving indefinitely.
sample ups
https://cdn.discordapp.com/attachments/235253973588639747/644844482084208641/test_ups.7z
I found the problematic code.
\Engine Hacks\SkillSystem\Post Combat Skills\Post Combat Skills Installer.event
ORG $1D26C //this used to be part of the "check for this turn's action"
SHORT 0x2110
If comment out this code, the bug doesn’t occur.
So this code is causing the bug.
We need to find out more about what this is doing.
If you are worried about this problem, you can fix it with hexeditor as follows.
However, there may be side effects.
Replacing with vanilla code will fix the bug.
1D26C: 41 7C
SkillSystems
0801D266 2800 cmp r0, #0x0
0801D268 D116 bne #0x801d298
0801D26A 480E ldr r0, [pc, #0x38] # pointer:0801D2A4 -> 0203A958 (ActionData@gActionData._u00 )
0801D26C 2110 MOV r1, #0x10 <<<<
0801D26E 1C02 mov r2 ,r0
0801D270 2903 cmp r1, #0x3
0801D272 DC01 bgt #0x801d278
Vanilla
0801D266 2800 cmp r0, #0x0
0801D268 D116 bne #0x801d298
0801D26A 480E ldr r0, [pc, #0x38] # pointer:0801D2A4 -> 0203A958 (ActionData@gActionData._u00 )
0801D26C 7C41 ldrb r1, [r0, #0x11] # pointer:0203A969 (ActionData@gActionData.unitActionType )
0801D26E 1C02 mov r2 ,r0
0801D270 2903 cmp r1, #0x3
0801D272 DC01 bgt #0x801d278
I’m not sure what this code wants to do.
It seems that 0x10 is forcibly assigned to r1 and the branch is ignored.
Does anyone know what this code wants to do?
I understand the cause of the bug that the enemy AI ignores Silence.
It is caused by the hook of WeaponLockCalcLoop.event.
Disabling this routine will solve the problem.
WeaponLockCalcLoop.event
PUSH
ORG 0x16574
#incbin "CanUnitWieldWeapon.dmp"
POIN ItemTable
POIN WLockLookupList
POIN WeaponLockLoop
POP
FEBuilderGBA has a patch that disables this hook.
“Uninstall SkillSystems ShadowGift 20191108”
This is a feature for installing WeaponLockEx, but it can also be used as a workaround for this bug.
Like I said yesterday, this is part of Canto and Galeforce, all of these checks were moved to the PostCombatLoop, if there’s something the loop is missing just add it in.
I see.
I think we just moved forward just by knowing where the problem was.
I understand that the side effects are too strong.
I hope it will be modified in a coordinated manner with other skills.
how do I apply the bin file to my current ROM?
edit: I found out, save it in the patches area of febuilder.
Ok Guys, how do I unlock the weapons with the new array? this way every weapon is locked by default…
Based on the documentation in Teq’s “better notes” dropbox file, in the battle struct, normally the following indexes are unused:
0x59, 0x7A, 0x7F
With 0x6C, 0x6D unused for all intents and purposes if GBA lethality isn’t in place (not sure about the skill system’s implementation), 0x58 for tile resistance (which I don’t think is ever used in vanilla FE8?) and 0x7E being occasionally set to 0 by two routines I’m not sure when are called.
However, the Str/Mag split now makes use of 0x7A for allowing the stat to grow. Are any of the other entries in the battle struct safe to manipulate? They would be as follows:
0x58 (If no resistance tiles are used)
0x59
0x6C (with no GBA lethality)
0x6D (with no GBA lethality)
0x7E (?)
0x7F
I’m trying to add in con and movement growth and deciding where to store the level up value is the only thing I’m having trouble with at this point.
EDIT: Oh, and figuring out where to manipulate the animation off extended level up screen. Where is this routine stored? I was able to figure out the one for when animations are on.
Strength/Magic split does a lot to the level up screen. You can look in Strmag/Strength Magic Split/Level Up
.
That’s where I’ve been looking, but unlike for when animations are on, there isn’t just one file that manages how the animation off level up screen works, so it seems to be a bit more complex.
Using IDs 0x59 and 0x7F seem to be working for my other question.
I think I found a different glitch though, however it may only be in appearance. It seems that on the unit stat screen, for players and enemies, all units get a bonus of +10 hit and avoid. This happens with a vanilla install of the latest available version of the skill system even when the leadership hack is turned off. When a unit enters battle, calculations occur normally and as they should be, even with leadership stars on.
Can the skill system change the Miracle formula so it targets the Luck Stat? A character of mine has around 56 HP, high defense and 50 Luck but can’t effectively use Miracle because of the current formula.
You can always edit the source to change the effect
The issue with that is others might prefer the actual formula no ?
I don’t know ASM well. Don’t have time to learn right now either.
Guess you’ll have to stick with the most commonly preferred formula until then. It’s unlikely there’s going to be enough demand for someone else to create another version of Miracle for a public release.
I didn’t test this and essentially just combined pavise and miracle to make this. Someone else can check to see if it works, but I think this will do it.
.thumb
.macro blh to, reg=r3
ldr \reg, =\to
mov lr, \reg
.short 0xf800
.endm
.equ MiracleID, SkillTester+4
.equ d100Result, 0x802a52c
@ r0 is attacker, r1 is defender, r2 is current buffer, r3 is battle data
push {r4-r7,lr}
mov r4, r0 @attacker
mov r5, r1 @defender
mov r6, r2 @battle buffer
mov r7, r3 @battle data
ldr r0,[r2] @r0 = battle buffer @ 0802B40A 6800
lsl r0,r0,#0xD @ 0802B40C 0340
lsr r0,r0,#0xD @Without damage data @ 0802B40E 0B40
mov r1, #0xC0 @skill flag @it's a passive, regardless of skills
lsl r1, #8 @0xC000
add r1, #2 @miss - why was this originally mov...?
tst r0, r1
bne End
@get max HP
ldrb r1, [r5,#0x13] @current hp
@check damage >= currhp
mov r0, #4
ldrsh r0, [r7, r0]
cmp r0, r1
blt End @not gonna die
@check for Miracle
ldr r0, SkillTester
mov lr, r0
mov r0, r5 @defender data
ldr r1, MiracleID
.short 0xf800
cmp r0, #0
beq End
@if skill found, check proc
ldrb r0, [r5, #0x19] @luck stat as activation rate
mov r1, r5 @skill user
blh d100Result
cmp r0, #1
bne End
@if we proc, set the defensive skill flag
ldr r2,[r6]
lsl r1,r2,#0xD @ 0802B42C 0351
lsr r1,r1,#0xD @ 0802B42E 0B49
mov r0, #0x80
lsl r0, #8 @0x8000, defender skill activated
orr r1, r0
@and unset the crit flag
mov r0, #1
mvn r0, r0
and r1,r0 @unset it
ldr r0,=#0xFFF80000 @ 0802B434 4804
and r0,r2 @ 0802B436 4010
orr r0,r1 @ 0802B438 4308
str r0,[r6] @ 0802B43A 6018
ldrb r0, MiracleID
strb r0, [r6,#4]
@and set damage to currhp-1
ldrb r0, [r5, #0x13] @currhp
sub r0, #1
strh r0, [r7, #4] @final damage
End:
pop {r4-r7}
pop {r15}
.align
.ltorg
SkillTester:
@POIN SkillTester
@WORD MiracleID
There seems to be a bug with the Watchful skill that allows you to capture units with it. A ups file of this bug can be found here: https://www.dropbox.com/s/1otgal35yladjnt/WatchfulBug.ups?dl=0
The bug occurs during certain unit formations when you can attack one unit that you can capture when another unit is in range that you cannot.
In the above example, while the game thinks I am targeting O’Neill, you can see that the armor knight is highlighted. If I try and switch to attack Bone and then back, it will target Breguet instead. If I attack the highlighted O’Neill, I will attack Breguet.
The event file used to create the formation can be found below:
////////////////////////////////////////////////////
// //
// Disassembled with Nintenlord's Event Assembler //
// Version: 11.0.0.0 //
// Game: FE8 //
// File: FE8_clean.gba //
// Offset: $9EC66C //
// //
////////////////////////////////////////////////////
EventPointerTable(0x7, PointerList)
VeinEffect(0, FreezeAllEnemies)
PointerList:
POIN TurnBasedEvents
POIN CharacterBasedEvents
POIN LocationBasedEvents
POIN MiscBasedEvents
POIN Dunno1 Dunno2 Dunno3 Tutorial
POIN Traps1 Traps2
POIN Units1 Units1 //This unit group determines the number and position of deployment slots when there is a prep screen
POIN $0 $0 $0
POIN $0 $0 $0
POIN BeginningScene EndingScene
TurnBasedEvents:
END_MAIN
CharacterBasedEvents:
CharacterEventBothWays(0x10,TalkEvent, Eirika, Ephraim)
END_MAIN
LocationBasedEvents:
Vendor(ShopItems,2,7)
Armory(ArmoryItems,10,26)
Village(0x8,VillageEvent,18,27)
House(0,HouseEvent,6,24)
Seize(10,2)
END_MAIN
MiscBasedEvents:
CauseGameOverIfLordDies
END_MAIN
Dunno1:
END_MAIN
Dunno2:
END_MAIN
Dunno3:
END_MAIN
Tutorial:
END_MAIN
Units1:
UNIT Eirika 0x4 0x1 0xA1 [9,24] 0b 0x0 0x0 0x0 [0x1,0x98,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Ephraim 0x1 0x1 0xA1 [7,24] 0b 0x0 0x0 0x0 [0x14,0x99,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Seth 0x7 0x1 0xA1 [11,24] 0b 0x0 0x0 0x0 [0x1,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Gilliam 0x9 0x1 0xA1 [8,25] 0b 0x0 0x0 0x0 [0x14,0x65,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Franz 0x5 0x1 0xA1 [10,25] 0b 0x0 0x0 0x0 [0x1,0x65,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Moulder Bishop 0x1 0xA1 [12,25] 0b 0x0 0x0 0x0 [Heal,Lightning,Flux,0x0] [0x0,0x0,0x0,0x0]
UNIT Vanessa 0x48 0x1 0xA1 [11,26] 0b 0x0 0x0 0x0 [0x14,0x67,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Ross Pirate 0x1 0xA1 [7,26] 0b 0x0 0x0 0x0 [0x1F,0x64,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Neimi Ranger_F 0x1 0xA1 [9,26] 0b 0x0 0x0 0x0 [0x2D,0x66,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Colm Rogue 0x1 0xA1 [10,27] 0b 0x0 0x0 0x0 [0x1,0,0,0x0] [0x0,0x0,0x0,0x0]
UNIT Garcia Fighter 0x1 0xA1 [12,27] 0b 0x0 0x0 0x0 [0x1F,0x64,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Innes 0x1B 0x1 0xA1 [13,26] 0b 0x0 0x0 0x0 [0x2D,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Lute Sage_F 0x1 0xA1 [6,27] 0b 0x0 0x0 0x0 [0x38,0,0,0x0] [0x0,0x0,0x0,0x0]
UNIT Natasha 0x4A 0x1 0xA1 [14,27] 0b 0x0 0x0 0x0 [Heal,Lightning,0,0x0] [0x0,0x0,0x0,0x0]
UNIT Cormag 0x1F 0x1 0xA1 [14,25] 0b 0x0 0x0 0x0 [0x14,0x67,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Forde 0x5 0x1 0xA1 [6,25] 0b 0x0 0x0 0x0 [0x14,0x65,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Kyle 0x5 0x1 0xA1 [5,26] 0b 0x0 0x0 0x0 [0x14,0x65,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT
Units2:
UNIT Amelia Cavalier_F 0x1 0xA1 [11,26] 0b 0x0 0x0 0x0 [0x14,0x65,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Artur Monk 0x1 0xA1 [12,26] 0b 0x0 0x0 0x0 [0x3F,0x68,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Gerik Hero 0x1 0xA1 [13,26] 0b 0x0 0x0 0x0 [0x1,0x64,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Tethys 0x4D 0x1 0xA1 [14,26] 0b 0x0 0x0 0x0 [0x0,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Marisa Swordmaster_F 0x1 0xA1 [15,27] 0b 0x0 0x0 0x0 [0x1,0,0,0x0] [0x0,0x0,0x0,0x0]
UNIT Saleh 0x27 0x1 0xA1 [14,27] 0b 0x0 0x0 0x0 [0x38,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Ewan Mage 0x1 0xA1 [13,27] 0b 0x0 0x0 0x0 [0x38,0x68,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT LArachel 0x4B 0x1 0xA1 [12,27] 0b 0x0 0x0 0x0 [0x68,0x88,Mend,0x0] [0x0,0x0,0x0,0x0]
UNIT Dozla 0x43 0x1 0xA1 [11,27] 0b 0x0 0x0 0x0 [0x1F,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Rennac 0x33 0x1 0xA1 [10,27] 0b 0x0 0x0 0x0 [0x1,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Duessel 0x35 0x1 0xA1 [9,27] 0b 0x0 0x0 0x0 [0x1,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Myrrh 0x3C 0x1 0xA1 [7,27] 0b 0x0 0x0 0x0 [0xAA,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Knoll 0x2D 0x1 0xA1 [6,27] 0b 0x0 0x0 0x0 [0x45,0x68,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Joshua 0x13 0x1 0xA1 [9,28] 0b 0x0 0x0 0x0 [0x1,0x64,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT Syrene 0x49 0x1 0xA1 [13,28] 0b 0x0 0x0 0x0 [0x14,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT Tana 0x48 0x1 0xA1 [14,28] 0b 0x0 0x0 0x0 [0x14,0x67,0x88,0x0] [0x0,0x0,0x0,0x0]
// UNIT Orson_Ch5x 0x7 0x1 0xA1 [9,5] 0b 0x0 0x0 0x0 [0x14,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT
MoreUnits:
UNIT CaellachCC 0x11 0x1 0xA1 [18,28] 0b 0x0 0x0 0x0 [0x21,0x29,0x7C,0x0] [0x0,0x0,0x0,0x0]
UNIT GlenCC 0x21 0x1 0xA1 [17,29] 0b 0x0 0x0 0x0 [0x17,0x4,0x75,0x0] [0x0,0x0,0x0,0x0]
UNIT OrsonCC 0x07 0x1 0xA1 [19,29] 0b 0x0 0x0 0x0 [0x11,0x17,0x76,0x0] [0x0,0x0,0x0,0x0]
UNIT ValterCC 0x23 0x1 0xA1 [16,30] 0b 0x0 0x0 0x0 [0x17,0x1D,0x71,0x0] [0x0,0x0,0x0,0x0]
UNIT RievCC 0x2B 0x1 0xA1 [18,30] 0b 0x0 0x0 0x0 [0x43,0x42,0x75,0x0] [0x0,0x0,0x0,0x0]
UNIT HaydenCC 0x1D 0x1 0xA1 [15,31] 0b 0x0 0x0 0x0 [0x4,0x2F,0x74,0x0] [0x0,0x0,0x0,0x0]
UNIT FadoCC 0x0B 0x1 0xA1 [17,31] 0b 0x0 0x0 0x0 [0x4,0x17,0x21,0x88] [0x0,0x0,0x0,0x0]
UNIT IsmaireCC 0x16 0x1 0xA1 [19,31] 0b 0x0 0x0 0x0 [0xC,0xA1,0x88,0x0] [0x0,0x0,0x0,0x0]
UNIT SelenaCC 0x2A 0x1 0xA1 [16,28] 0b 0x0 0x0 0x0 [0x3B,0x3A,0x4D,0x0] [0x0,0x0,0x0,0x0]
UNIT LyonCC 0x4F 0x1 0xA1 [18,32] 0b 0x0 0x0 0x0 [0x8F,0x4E,0x57,0x0] [0x0,0x0,0x0,0x0]
UNIT
EnemyUnits:
UNIT Morva_Ch20 0x3B 0x40 0xA5 [15,2] 0b 0x0 0x0 0x0 [WretchedAir,0x0,0x0,0x0] AttackInRangeAI
UNIT ONeill Fighter 0x40 0xA5 [8,19] 0b 0x0 0x0 0x0 [SteelAxe, HandAxe] AttackInRangeAI
UNIT Breguet Knight 0x40 0xA5 [7,20] 0 0 0 0 [SteelLance, Javelin] AttackInRangeAI
UNIT Bone Brigand 0x40 0xA5 [9,20] 0 0 0 0 [SteelAxe, HandAxe] AttackInRangeAI
UNIT Bazba Brigand 0x40 0xA5 [16,18] 0 0 0 0 [SteelAxe, HandAxe] AttackInRangeAI
UNIT Saar Knight 0x40 0xA5 [8,15] 0 0 0 0 [SteelLance, Javelin] AttackInRangeAI
UNIT Novala Shaman 0x40 0xA5 [12,13] 0 0 0 0 [Nosferatu] AttackInRangeAI
UNIT Murray Cavalier 0x40 0xA5 [3,13] 0 0 0 0 [SteelSword, Javelin] AttackInRangeAI
UNIT Tirado General 0x40 0xA5 [16,9] 0 0 0 0 [SilverLance, Javelin] AttackInRangeAI
UNIT Binks Warrior 0x40 0xA5 [1,10] 0 0 0 0 [SteelAxe, SteelBow] AttackInRangeAI
UNIT Pablo Sage 0x40 0xA5 [5,11] 0 0 0 0 [Elfire, Purge] AttackInRangeAI
UNIT
EnemyUnits2:
UNIT Vigarde General 0x40 0xA5 [10,2] 0 0 0 0 [Spear, SilverBlade, Tomahawk] NeverMoveAI
UNIT Cyclops_boss Cyclops 0x40 0xA5 [9,4] 0 0 0 0 [BattleAxe, Tomahawk] AttackInRangeAI
UNIT Cyclops_boss Cyclops 0x40 0xA5 [11,4] 0 0 0 0 [BattleAxe, Tomahawk] AttackInRangeAI
UNIT Aias GreatKnight 0x40 0xA5 [7,11] 0 0 0 0 [ShortSpear, SilverBlade, SilverAxe] AttackInRangeAI
UNIT Carlyle Swordmaster 0x40 0xA5 [10,9] 0 0 0 0 [WindSword] AttackInRangeAI
UNIT Gheb Warrior 0x40 0xA5 [2,4] 0 0 0 0 [KillerAxe, KillerBow] NeverMoveAI
UNIT Beran Ranger 0x40 0xA5 [17,14] 0 0 0 0 [Lancereaver, KillerBow, Longbow] AttackInRangeAI
UNIT
Traps1:
Vein(9,23,0x0,DV1Desc) //freeze enemies
ENDTRAP
ALIGN 4
Traps2:
ENDTRAP
ALIGN 4
BeginningScene:
ENUT 0x1 //no more boss quotes
ENUT 0x2 //no more death quotes
LOAD1 0x1 EnemyUnits
ENUN
LOAD1 0x1 EnemyUnits2
ENUN
LOAD1 0x0 Units1 //0x0 instead of 0x1 seems to be for allies on maps with prep screens
ENUN
LOAD1 0x0 Units2
ENUN
LOAD1 0x0 MoreUnits
ENUN
// FADI 10
// MOVE 0 Carlyle [7,10]
// ENUN
// StartBattle //scripted fight setup
// MissedAttack(0,0) //Seth misses
// NormalDamage(1,0) //Valter hits
// EndAttack
// FIG1 Carlyle Aias 0
// STAL 60
// FADU 10
GotoPrepScreen
EndingScene:
ASMC 0x85C71 0x381F5 0x37CF9 //show records screen
STAL 120
EVBIT_F 0x2
MNTS 0x1 //return to title screen
NoFade
ENDA
VillageEvent:
VillageEventItem(VillageText, Village, Boots)
HouseEvent:
// Set parameters
SVAL r1 NiceThighsID
SVAL r2 (-1) // (-1) is active unit
// Check if unit has skill
// If they have, goto label #0 (end)
ASMC (ASMC_HasSkill+1)
BNE 0 rC r0
// Learn skill to unit
ASMC (ASMC_LearnNewSkill+1)
LABEL 0
// end
Text(HouseText)
NoFade
ENDA
// HouseEvent(HouseText, HouseBG)
FreezeAllEnemies:
VeinActivation
ASMC FreezeAllASMC|1
NoFade
ENDA
TalkEvent:
Text(0xc0a)
NoFade
ENDA
ShopItems:
SHLI Thunder Elfire Nosferatu Divine Mend Physic PureWater Elixir
ALIGN 4
ArmoryItems:
SHLI SteelAxe SteelLance SteelBow SteelSword HandAxe Javelin
ALIGN 4