I could not even tell myself which one of the spellcards I have made so far are the best, but I have a few favorites.
Trickster Sign "Indecisive Guide"
Difficulty: Normal
#TouhouDanmakufu
#Title[Trickster Sign "Indecisive Guide ~ Normal"]
#Text[Not even the guide knows what to do when lost. It is most likely to stray from the true path.]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let ImgBoss = "script\img\ExRumia.png";
let count = -60;
let a = 0;
let b = 0;
let c = 0;
let d = 0;
@Initialize {
SetLife(4000);
SetTimer(60);
SetScore(10000000);
SetInvincibility(120);
SetMovePosition01(GetCenterX, GetClipMinY + 120, 5);
CutIn(YOUMU, "Trickster Sign"\""Indecisive Guide"\", "", 0, 0, 0, 0);
LoadGraphic(ImgBoss);
SetTexture(ImgBoss);
SetGraphicRect(0, 0, 64, 64);
}
@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);
SetShotAutoDeleteClip(500, 500, 500, 500);
if(count == 1) {
ascent( i in 1..34)
{
CreateShotA(i, GetX, GetY, 10);
SetShotDataA(i, 0, 3, i+a, 0, -0.05, 0, GREEN12);
SetShotDataA(i, 60, 3, i+a-80, 0, -0.01, 0, GREEN12);
SetShotDataA(i, 280, 2, i+a+100, -0.25, 0, 2, GREEN12);
SetShotDirectionType(ABSOLUTE);
FireShot(i);
a += 10;
}
ascent( j in 1..34)
{
CreateShotA(j, GetX, GetY, 10);
SetShotDataA(j, 0, 3, j+a, 0, -0.05, 0, GREEN12);
SetShotDataA(j, 60, 3, j+a+80, 0, -0.01, 0, GREEN12);
SetShotDataA(j, 280, 2, j+a-100, 0.25, 0, 2, GREEN12);
SetShotDirectionType(ABSOLUTE);
FireShot(j);
a += 10;
}
ascent( k in 1..98)
{
CreateShotA(k, GetX, GetY, 10);
SetShotDataA(k, 0, 3, k+c, 0, -0.05, 0, BLUE12);
SetShotDataA(k, 60, 4.5, NULL, 0, -0.05, 0, BLUE12);
SetShotDataA(k, 150+k, 3, NULL, 0, -0.05, 1, BLUE12);
SetShotDirectionType(ABSOLUTE);
FireShot(k);
c += 187;
}
}
if(count >= 90 && count <= 220){
loop(2){
CreateShot01(GetX, GetY, 3, b, PURPLE12, 10);
b += 360/2;
b += 13.2;
}
}
if(count == 220){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 230){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 240){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 250){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 260){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 270){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 280){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 290){
SetMovePosition02(rand(50, 350), rand(50, 200), 10);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 300){
SetMovePosition03(GetCenterX, GetClipMinY + 120, 10, 5);
loop(4){
CreateLaser01(GetX, GetY, 5, d, 1500, 10, RED11, 0);
d += 360/3.57443
}
}
if(count == 360){
count=0;
}
count++;
}
@DrawLoop {
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(ImgBoss);
}
}
Basic Pattern: The boss will originally spawn two waves of decelerating bullets simultaneously: a ring of blue needles, and a ring of green needles. Shortly after being fired, the blue bullets will jet forward, while the green bullets will begin to move as well, but in intersecting ways, however they gradually decelerate and barely leave the screen. Right after both rings of bullets begin moving, the boss begins to throw out violet needles in a spiral shape. About 2 seconds later, the boss will randomly move about the field and fire multiple lasers that linger around the screen for the next wave.
Strategy: There is not much here besides luck from the way the lasers are fired. Try to stay in a wide open spot so that you can more easily dodge the bullets from the first wave.
Frostbite "Ribbon of a Wondrous Child"
Difficulty: Normal
#TouhouDanmakufu
#Title[Frostbite "Ribbon of a Wondrous Child"]
#Text[Test script]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let ImgBoss = "script\img\ExRumia.png";
let count = 300;
let a=0;
let color=BLUE03;
let color2=BLUE04;
@Initialize {
SetLife(4000);
SetTimer(60);
SetScore(10000000);
SetInvincibility(120);
SetEnemyMarker(true);
SetMovePosition01(GetCenterX, GetClipMinY + 120, 5);
CutIn(YOUMU, "Frostbite"\""Ribbon of a Wondrous Child"\", "", 0, 0, 0, 0);
LoadGraphic(ImgBoss);
SetTexture(ImgBoss);
SetGraphicRect(0, 0, 64, 64);
}
@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);
SetShotAutoDeleteClip(200, 200, 200, 200);
if(count == 360) {
CreateShotA(1, GetClipMinX-50, rand(GetClipMinY, GetClipMaxY - 50), 0);
SetShotDataA(1, 0, 3, 0, 0.5, 0, 3, color);
ascent(i in 1..75){
CreateShotA(2, 0, 0, 0);
SetShotDataA(2, 0, 2, a, 0, -0.01, 0, color2);
SetShotDataA(2, 300, NULL, a, 0, -0.03, -3, color2);
a += 11;
AddShot(i*5, 1, 2, 0);
}
FireShot(1);
}
if(count == 420) {
CreateShotA(1, GetClipMaxX+50, rand(GetClipMinY + 50, GetClipMaxY), 0);
SetShotDataA(1, 0, 3, 180, 0.5, 0, 3, color);
ascent(i in 1..75){
CreateShotA(2, 0, 0, 0);
SetShotDataA(2, 0, 2, a, 0, -0.01, 0, color2);
SetShotDataA(2, 300, NULL, a, 0, -0.03, -3, color2);
a += 11;
AddShot(i*5, 1, 2, 0);
}
FireShot(1);
}
if(count == 480) {
CreateShotA(1, rand(GetClipMinX + 50, GetClipMaxX), GetClipMinY-50, 0);
SetShotDataA(1, 0, 3, 90, 0.5, 0, 3, color);
ascent(i in 1..75){
CreateShotA(2, 0, 0, 0);
SetShotDataA(2, 0, 2, a, 0, -0.01, 0, color2);
SetShotDataA(2, 300, NULL, a, 0, -0.03, -3, color2);
a += 11;
AddShot(i*5, 1, 2, 0);
}
FireShot(1);
}
if(count == 540) {
CreateShotA(1, rand(GetClipMinX, GetClipMaxX - 50), GetClipMaxY+50, 0);
SetShotDataA(1, 0, 3, 270, 0.5, 0, 3, color);
ascent(i in 1..75){
CreateShotA(2, 0, 0, 0);
SetShotDataA(2, 0, 2, a, 0, -0.01, 0, color2);
SetShotDataA(2, 300, NULL, a, 0, -0.03, -3, color2);
a += 11;
AddShot(i*5, 1, 2, 0);
}
FireShot(1);
count=0
}
count++;
}
@DrawLoop {
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(ImgBoss);
}
}
Basic Pattern: Four blue bubbles will appear, one from each edge of the screen, and gradually curve, leaving behind smaller blue bullets and eventually leaving the screen. These smaller bullets will gradually decelerate, then a few seconds later, one by one move in the reverse direction from which they were fired. The pattern then repeats. The name comes from the way the smaller bullets move when traveling in reverse.
Strategy: Try to stay out of the center of each circle of bullets, because they move quickly when going in reverse, and you will not have much other room to squeeze through if you do.
Dreadnought "The Faring Assault"
Difficulty: Unknown
#TouhouDanmakufu
#Title[Dreadnought "The Faring Assault"]
#Text[Test script]
#Image[.\img\Dreadnought.bmp]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let ImgBoss = "script\img\ExRumia.png";
let count = 0;
let time = 0;
let a = 135;
@Initialize {
SetLife(1);
SetTimer(50);
SetScore(1000000);
SetDamageRate(0, 0);
SetDurableSpellCard;
SetMovePosition02(225, 200, 60);
CutIn(YOUMU, "Dreadnought "\""The Faring Assault"\", "", 0, 0, 0, 0);
LoadGraphic(ImgBoss);
SetTexture(ImgBoss);
SetGraphicRect(0, 0, 128, 128);
}
@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);
if(count == 120){
PlaySE("lib\THCCL\SE\lazer01.wav");
CreateLaserB(1, 1, 20, RED02, 0);
SetLaserDataB(1, 0, 6, 0, 0, 0, 0, 45, 0);
SetLaserDataB(1, 60, 0, 0, 0, 0, 0, 45, 0);
SetLaserDataB(1, 120, 0, NULL, 0, NULL, 0, NULL, -2);
SetLaserDataB(1, 180, 0, NULL, 0, NULL, 0, NULL, 4);
SetLaserDataB(1, 210, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 400, 0, NULL, 0, NULL, 0, NULL, 0.7);
SetLaserDataB(1, 915, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 960, 0, NULL, 0, NULL, 0, NULL, -2);
SetLaserDataB(1, 1020, 0, NULL, 0, NULL, 0, NULL, 4);
SetLaserDataB(1, 1060, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 1100, 0, NULL, 0, NULL, 0, NULL, -0.5);
SetLaserDataB(1, 1130, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 1330, 0, NULL, 0, NULL, 0, NULL, -0.5);
SetLaserDataB(1, 1380, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 1600, 0, NULL, 0, NULL, 0, NULL, -0.7);
SetLaserDataB(1, 2115, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 2180, 0, NULL, 0, NULL, 0, NULL, -3);
SetLaserDataB(1, 2240, 0, NULL, 0, NULL, 0, NULL, 4);
SetLaserDataB(1, 2285, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(1, 2315, 0, NULL, 0, NULL, 0, NULL, -0.5);
CreateLaserB(3, 1, 20, RED02, 0);
SetLaserDataB(3, 0, 6, 0, 0, 0, 0, 135, 0);
SetLaserDataB(3, 60, 0, 0, 0, 0, 0, 135, 0);
SetLaserDataB(3, 270, 0, NULL, 0, NULL, 0, NULL, 2);
SetLaserDataB(3, 330, 0, NULL, 0, NULL, 0, NULL, -4);
SetLaserDataB(3, 360, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 400, 0, NULL, 0, NULL, 0, NULL, 0.7);
SetLaserDataB(3, 915, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 960, 0, NULL, 0, NULL, 0, NULL, 2);
SetLaserDataB(3, 1020, 0, NULL, 0, NULL, 0, NULL, -4);
SetLaserDataB(3, 1060, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 1100, 0, NULL, 0, NULL, 0, NULL, 0.5);
SetLaserDataB(3, 1130, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 1330, 0, NULL, 0, NULL, 0, NULL, 0.5);
SetLaserDataB(3, 1380, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 1600, 0, NULL, 0, NULL, 0, NULL, -0.7);
SetLaserDataB(3, 2115, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 2180, 0, NULL, 0, NULL, 0, NULL, 3);
SetLaserDataB(3, 2240, 0, NULL, 0, NULL, 0, NULL, -4);
SetLaserDataB(3, 2285, 0, NULL, 0, NULL, 0, NULL, 0);
SetLaserDataB(3, 2315, 0, NULL, 0, NULL, 0, NULL, 0.5);
ascent(i in 1..10){
CreateShotA(2, 0, 0, 10);
SetShotDataA(2, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(4, 0, 0, 10);
SetShotDataA(4, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(5, 0, 0, 10);
SetShotDataA(5, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(9, 0, 0, 10);
SetShotDataA(9, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(10, 0, 0, 10);
SetShotDataA(10, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(11, 0, 0, 10);
SetShotDataA(11, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(15, 0, 0, 10);
SetShotDataA(15, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(16, 0, 0, 10);
SetShotDataA(16, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(17, 0, 0, 10);
SetShotDataA(17, 0, 3, 90, 0, 0, 3, RED11);
CreateShotA(6, 0, 0, 10);
SetShotDataA(6, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(7, 0, 0, 10);
SetShotDataA(7, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(8, 0, 0, 10);
SetShotDataA(8, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(12, 0, 0, 10);
SetShotDataA(12, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(13, 0, 0, 10);
SetShotDataA(13, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(14, 0, 0, 10);
SetShotDataA(14, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(18, 0, 0, 10);
SetShotDataA(18, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(19, 0, 0, 10);
SetShotDataA(19, 0, 3, -90, 0, 0, 3, RED11);
CreateShotA(20, 0, 0, 10);
SetShotDataA(20, 0, 3, -90, 0, 0, 3, RED11);
AddShot(i*3+180, 1, 2, 20);
AddShot(i*3+180, 1, 4, 100);
AddShot(i*3+180, 1, 5, 180);
AddShot(i*3+1020, 1, 9, 20);
AddShot(i*3+1020, 1, 10, 100);
AddShot(i*3+1020, 1, 11, 180);
AddShot(i*3+330, 3, 6, 20);
AddShot(i*3+330, 3, 7, 100);
AddShot(i*3+330, 3, 8, 180);
AddShot(i*3+1020, 3, 12, 20);
AddShot(i*3+1020, 3, 13, 100);
AddShot(i*3+1020, 3, 14, 180);
}
ascent(i in 1..100){
CreateShotA(15, 0, 0, 10);
SetShotDataA(15, 0, 3, 90, 0, 0, 3, RED12);
CreateShotA(16, 0, 0, 10);
SetShotDataA(16, 0, 3, 90, 0, 0, 3, RED12);
CreateShotA(17, 0, 0, 10);
SetShotDataA(17, 0, 3, 90, 0, 0, 3, RED12);
CreateShotA(18, 0, 0, 10);
SetShotDataA(18, 0, 3, 270, 0, 0, 3, RED12);
CreateShotA(19, 0, 0, 10);
SetShotDataA(19, 0, 3, 270, 0, 0, 3, RED12);
CreateShotA(20, 0, 0, 10);
SetShotDataA(20, 0, 3, 270, 0, 0, 3, RED12);
CreateShotA(21, 0, 0, 10);
SetShotDataA(21, 0, 3, -90, 0, 0, 3, RED12);
CreateShotA(22, 0, 0, 10);
SetShotDataA(22, 0, 3, -90, 0, 0, 3, RED12);
CreateShotA(23, 0, 0, 10);
SetShotDataA(23, 0, 3, -90, 0, 0, 3, RED12);
CreateShotA(24, 0, 0, 10);
SetShotDataA(24, 0, 3, -270, 0, 0, 3, RED12);
CreateShotA(25, 0, 0, 10);
SetShotDataA(25, 0, 3, -270, 0, 0, 3, RED12);
CreateShotA(26, 0, 0, 10);
SetShotDataA(26, 0, 3, -270, 0, 0, 3, RED12);
AddShot(i*7+2240, 1, 15, 20);
AddShot(i*7+2240, 1, 16, 100);
AddShot(i*7+2240, 1, 17, 180);
AddShot(i*7+2240, 1, 18, 20);
AddShot(i*7+2240, 1, 19, 140);
AddShot(i*7+2240, 1, 20, 280);
AddShot(i*7+2240, 3, 21, 20);
AddShot(i*7+2240, 3, 22, 100);
AddShot(i*7+2240, 3, 23, 180);
AddShot(i*7+2240, 3, 24, 20);
AddShot(i*7+2240, 3, 25, 140);
AddShot(i*7+2240, 3, 26, 280);
}
FireShot(1);
FireShot(3);
}
if(count == 180 || count == 340 || count == 960){
loop(90){
CreateShot01(GetX, GetY, 6, a, RED02, 10);
a += 3;
}
a = 135;
}
if(count == 1220){
SetShotDirectionType(PLAYER);
CreateShot01(GetX, GetY, 8, 0, RED02, 0);
count=1215;
}
if(time==1290){
count=1221;
}
if(count == 1250){
SetShotDirectionType(PLAYER);
CreateShot01(GetX, GetY, 8, 0, RED02, 0);
count=1245;
}
if(time==1380){
count=1251;
}
if(count == 1280){
SetShotDirectionType(PLAYER);
CreateShot01(GetX, GetY, 8, 10, RED02, 0);
CreateShot01(GetX, GetY, 8, -10, RED02, 0);
CreateShot01(GetX, GetY, 8, 0, RED01, 0);
count=1275;
}
if(time==1501){
count=1281;
}
if(count==1380){
SetShotDirectionType(PLAYER);
CreateShot01(GetX, GetY, 8, 30, RED02, 0);
CreateShot01(GetX, GetY, 8, -30, RED02, 0);
CreateShot01(GetX, GetY, 8, 0, RED01, 0);
count=1375;
}
if(time==2181){
count=1381;
}
count++;
time++;
}
@DrawLoop {
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(ImgBoss);
}
}
Basic Pattern: The boss moves to the center of the screen for the rest of the attack, and uses two sword-like lasers. Initially, the boss swings twice, bullets released from each sword, then they move clockwise until back to the original position. The boss then swings both swords downward in a very close position, then open up slightly while shooting bullets in your direction, and finally opening up completely. The boss pauses, then fires more bullets in your direction while the swords are moving counterclockwise, back to original position. One final swing with both swords, and bullets will continuously leak from each sword for the last few seconds.
Strategy: The halfway point and final swings are the most difficult to avoid. On the halfway point, stay in the center until the boss moves the swords apart, then position yourself a little bit away from where you were to get between the needles that linger. On the final wave, stay on one of the sides, then squeeze between the bullets as they come.