So I found myself needing to check what spells/discs I need to buy on my crew so I whipped this up. It's slow AF because the TLO's exposed do a lot of unnecessary loops (for this application), but it works in an appropriate amount of time. It will only look at base spells, so if you have any rank at all of a spell, it won't be missing.
Rich (BB code):
Sub Main
/declare i int
/declare CheckName string local
| This is kind of hacky, but as of 06/23/2018 59999 is the highest ID in spell_us.txt
/for i 1 to 60000
| Deity is available in the struct, but not exposed to macros, have to live with it for now
| This works because unknown spells have level of 255
/if (${Spell[${i}].Level} > ${Me.Level} || ${Spell[${i}].Rank} > 1) /next i
| I know here that the spell is real and I should have it.
/varset CheckName ${Spell[${Spell[${i}].ID}].RankName}
/if (!${CheckName.Equal[NULL]}) {
/if (${Me.Book[${CheckName}]} == NULL) {
/echo \arMissing Spell \ax-- \at${CheckName} \ax-- \aoLevel: ${Spell[${i}].Level}
}
/if (${Me.CombatAbility[${CheckName}]} == NULL) {
/echo \arMissing Disc \ax-- \at${CheckName} \ax-- \aoLevel: ${Spell[${i}].Level}
}
}
/next i
/return