I played through this script three times, as Ultima's Reimu.
General Thoughts:
-Backgrounds are OK, although the non-spell background could stand to move more slowly
-Please stop including multiple only slightly different players. This script had a whopping FIVE Reimus attached to it, when it could have had only one Reimu and played almost exactly the same. Balancing scripts around multiple players is a big problem in general, which is best avoided by not having too in the first place. For example, there are spells that are hell for a non-homing Reimu, but are well-balanced with a homing Reimu. You should use either one player[Like Ultima's Reimu/Mr. Blue's Reimu], players designed for use in a set[Like the plasmaflame Reimus] or, preferably, make your own player(s). Making your own player is kind of difficult, but it allows you to do some interesting and unique stuff.
-The fullscreen HUD isn't implemented very well. The biggest flaw is that if you're against the bottom of the screen, the score display and such will hide where you and any nearby bullets are.
-Mamizou doesn't disguise herself at all, despite clearly switching between imitating different people. Maybe its actually Satori dressed up as Mamizou?
-Mamizou moves SUPER slowly during the last couple attacks[The Patchouli ones] and you can take out a good third of her health bar before she actually starts shooting bullets
-While you start with 9 bombs, you only get three back when you die, incentivizing you to bombspam the early spells. IMO, you could probably just give out 2-3 bombs at the start and the script would still be fine. Its not that hard a script and bombspamming can take care of the hard spells even disregarding the extra 6-7 you start with.
-The script folder displays all the individual Single scripts, but only has default players defined for the plural itself. If you don't want people to play the patterns on their own, then you can make them not appear in Danmakufu[But still able to be played as part of a plural!] by commenting out the very first line of the header. If you want them to be kind of like spell practice mode, then putting the same player selection as the plural makes it more convenient for people who don't have the standard Reimus in their player folder.
Non Spell 1[Reimu]:
-This is the spell that makes me hate the HUD the most, since it hides the bullets coming from the orb behind you.
-Its actually a pretty good non-spell otherwise, though.
Spell 1[Reimu]:
-Its First and Last Nameless Danmaku, but longer, less fair, less dangerous, and less interesting. This is a bad spell.
-It can also be timed out super easily, if you really want to waste a minute of your life doing that.
Non Spell 2[Marisa]:
-This seems almost exactly like the Marisa non-spell from your last script.
-It also seems more dense, presumably to compensate for the wider playing field, which IMO makes it too hard.
Spell 2[Marisa]:
-This spell is a much better Master Spark then your last attempt.
-This attack is absolutely miserable without homing, but its just fine with a homing Reimu
Non Spell 3[Remilia]:
-The bullets go way way way too fast, making this probably the hardest pattern in the script.
-I might even compare the difficulty here to truly unfair attacks like, fittingly enough, Scarlet Meister.
Spell 3[Remilia]:
-This spell is basically the same attack as the Master Spark earlier, so the same comments apply.
Non Spell 4[Yukari]:
-This non spell isn't hard, but also isn't that interesting.
Spell 4[Yukari]:
-This is generally a cool, but flawed, spell.
-Flaw #1: The blue lasers are so thin you can barely see them, leading to death out of nowhere.
-Flaw #2: The pattern is good, but too short, so you have to dodge basically the same bullets several times.
Non Spell 5[Suika]:
-Pretty easy, but nice concept.
Spell 5[Suika]:
-This seems very similar to one of Doremy's spells in one of your earlier scripts.
-Its generally OK, but is dull and easy.
Non Spell 6[Patchouli]:
-The maze pattern here is neat, but really easy. Some kind of surprise near the end of the maze would make this non-spell pretty good.
Spell 6[Patchouli]:
-The idea is cool and the pattern is interesting, but the red fire bullets go a tad too fast for my taste.
-I found some (0,0) spawning at the end, which looks kind of ugly
There's also the matter of the lifebar not reaching all the way across the top of the screen. I seem to remember you asking about this in the Q & A thread earlier. I looked into it and managed to adjust it to stretch across the top of the screen in an acceptable manner. I have very little idea of how vertexes work, but this was simple enough since the lifebar is just a textureless gray line. The main difficulty is that the lifebar uses arbitrary numbers instead of helpfully named variables to decide where the healthbar starts and stops, which makes it hard to tell what exactly said numbers mean.
Here's the relevant code, taken from Default_System in the middle of the TBossLife task. You should just be able to replace the RenderLife function there with this.
function RenderLife(){
let countRemStep = ObjEnemyBossScene_GetInfo(objScene, INFO_REMAIN_STEP_COUNT);
if(lastRemStep != countRemStep){
lifeRateRender = 0;
}
let lifeTotalMax = ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_TOTAL_MAX_LIFE);
let lifeTotal = ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_TOTAL_LIFE);
let lifeRate = min(lifeTotal / lifeTotalMax, lifeRateRender);
let arcvastisArbitraryAdjustmentFactor = 1.9;
ObjSpriteList2D_SetSourceRect(obj, 1, 1, 127, 11);
ObjSpriteList2D_SetDestRect(obj, 72, 8, 72 + 270*arcvastisArbitraryAdjustmentFactor * lifeRate, 12);
ObjSpriteList2D_AddVertex(obj);
ObjSpriteList2D_SetSourceRect(obj, 132, 1, 137, 11);
let listLifeDiv = [0] ~ ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_LIFE_RATE_LIST);
ascent(iDiv in 0 .. length(listLifeDiv)){
let rate = listLifeDiv[iDiv];
let x = 72 + 270 * arcvastisArbitraryAdjustmentFactor * (1-rate);
ObjSpriteList2D_SetDestRect(obj, x-1, 4, x + 1, 14);
ObjSpriteList2D_AddVertex(obj);
}
ObjSpriteList2D_SetSourceRect(obj, 1, 1, 127, 11);
ascent(iStep in 0 .. countRemStep){
let remStepRate = 58 / countRemStep;
ObjSpriteList2D_SetDestRect(obj, 4 + iStep * remStepRate + 2, 8,
4 + (iStep + 1) * remStepRate, 12);
ObjSpriteList2D_AddVertex(obj);
}
lifeRateRender += 0.01;
lifeRateRender = min(lifeRateRender, 1);
lastRemStep = countRemStep;
}