Maidens of the Kaleidoscope

~Hakurei Shrine~ => Rika and Nitori's Garage Experiments => Topic started by: Naut on May 07, 2009, 04:05:11 AM

Title: Touhou Spellcard Replica Thread
Post by: Naut on May 07, 2009, 04:05:11 AM
Hey. I'll be posting random remakes of ZUN spellcards here, consider it spell practice mode outside of Imperishable Night. I welcome any and all of your own spellcard remakes, so feel free to post like the fury.

So, I've got a few here, keep in mind that these are best played using a properly installed Shot Replace Script (http://barneyzhenspages.googlepages.com/shot_replace.zip) (lib\SHOT_REPLACE\shot_replace.dnh), and some just aren't possible to play properly without it.

If you guys want, I can compile everybody's spellcard remakes into this one post/file, and properly credit you if you wish. That way we could have a large library of remade spellcards. Tell me what you guys think.



All (of my) spellcards are remakes of Lunatic versions only.



Batch File (Get all three) (http://www.mediafire.com/?sharekey=6edde1c79e89653f0c814df2efeadc50e04e75f6e8ebb871)
Keep in mind that sounds and graphics will not play or be drawn properly if you just copy the scripts, so I recommend downloading the batch file, which includes the scripts as well as the "stuff" folder and sounds/graphics used thus far.

Yamame's Spider "Cave Spider's Nest"
Don't know why I remade this, but I have it lying around so you guys can take a look at it.
Code: [Select]
#TouhouDanmakufu
#Title[Spider "Cave Spider's Nest"]
#Text[Remake of Yamame's first spellcard, lunatic.]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {

let ImgBoss = GetCurrentScriptDirectory~"stuff\ExRumia.png";
let se = GetCurrentScriptDirectory~"stuff\shot.wav";
let frame = 0;
let frame2 = 0;
let radius = 0;
let angle = 0;
let delay = 0;
let r = 0;
let x = 0;
let al = 0;

    @Initialize {

    SetLife(4000);
SetTimer(50);
SetEnemyMarker(true);
    SetDamageRate(100, 30);
    SetInvincibility(150);
SetEnemyMarker(true);
    LoadGraphic(ImgBoss);
CutIn(YOUMU, "Spider "\""Cave Spider's Nest"\", "", 0, 0, 0, 0);
    SetMovePosition02(GetCenterX, GetClipMinY + 120, 120);

    }

    @MainLoop {
    SetCollisionA(GetX, GetY, 32);
    SetCollisionB(GetX, GetY, 16);
SetShotAutoDeleteClip(300, 300, 300, 2); //I made the delete clip larger so that it wouldn't delete our bullets when they are spawned outside of the window.

//Get the angle relative to the player just before spawning the bullets, then set it to be slightly off so the bullets won't spawn on top of the player.
if(frame==118){
x = GetAngleToPlayer + 11.25;
}

//Start spawning bullets. We set six bullets to spawn every frame for 70 frames, because when the counter "frame2" hits 70, we exit out of the loop. We increment "radius"
//every loop so that the bullet will get spawned 6 pixels further from the boss every frame. We give the bullet a slight angular velocity (r, which we randomize) when we want to move it, so that it will curve around the boss
//instead of go right through her. We multiply this angular velocity by 40 later on to compensate for the 40 frame delay, when we start decelerating the bullets.
if(frame==120){
PlaySE(se);
loop(16){
CreateShotA(0, GetX + radius*cos(angle), GetY + radius*sin(angle), 10);
SetShotDataA(0, 0, 0, angle, 0, 0, 0, GREEN12);
SetShotDataA(0, 120 - delay, 0, angle - 190, -r, 0.1, 4, GREEN12);
SetShotDataA(0, 160 - delay, 4, angle - 190 - (r*50), 0, -0.05, 1.5, GREEN12);
FireShot(0);
angle+=360/16;
}
r = rand(-0.05, 0.25);
delay++;
frame2++;
radius+=6;
angle = rand(-5, 5) + x;
frame = 119;
if(frame2==70){ //Exit out of the loop, and set all variables to 0 for when we start the loop again.
radius = 0;
angle = 0;
frame2 = 0;
delay = 0;
frame = 200;
}
}

//Repeat the pattern, but curve towards the other direction (positive angular velocity instead of negative).
if(frame==378){
x = GetAngleToPlayer + 11.25;
}
if(frame==380){
PlaySE(se);
loop(16){
CreateShotA(0, GetX + radius*cos(angle), GetY + radius*sin(angle), 10);
SetShotDataA(0, 0, 0, angle, 0, 0, 0, BLUE12);
SetShotDataA(0, 120 - delay, 0, angle - 170, r, 0.1, 4, BLUE12);
SetShotDataA(0, 160 - delay, 4, angle - 170 + (r*50), 0, -0.05, 1.5, BLUE12);
FireShot(0);
angle+=360/16;
}
r = rand(-0.05, 0.25);
delay++;
frame2++;
radius+=6;
angle = rand(-5, 5) + x;
frame = 379;
if(frame2==70){ //We set everything back to 0 for when we start spawning more bullets.
radius = 0;
angle = 0;
frame2 = 0;
delay = 0;
frame = -60; //Repeat the whole pattern.
}
}
frame++;

    }
    @DrawLoop {
if(al<255){
al++;
}
SetTexture(ImgBoss);
SetAlpha(255);
if(GetSpeedX()==0){SetGraphicRect(64,1,127,64);}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
DrawGraphic(GetX, GetY);


    }

    @Finalize {
DeleteGraphic(ImgBoss);
    }

}


Remilia's Scarlet Sign "Scarlet Meister"
I know a few people have remade this spellcard, so here's my take that I made a few weeks ago. A bit harder than the lunatic version, I think. Not sure.
Code: [Select]
#TouhouDanmakufu
#Title[Scarlet Sign "Scarlet Meister"]
#Text[Remake of Remi's attack "Scarlet Meister" (using tasks).]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {

///////////////////////////
///////////////////////////
/////Remake of Remi's attack, "Scarlet Meister", using a task. A bit harder than the lunatic version, I think. Not by much, anyway.
///////////////////////////
///////////////////////////

let ImgBoss = GetCurrentScriptDirectory~"stuff\ExRumia.png";
let se = GetCurrentScriptDirectory~"stuff\shot.wav";

    @Initialize {

    SetLife(3000);
SetScore(1000000);
SetTimer(30);
SetEnemyMarker(true);
    SetDamageRate(100, 30);
    SetInvincibility(150);
SetEnemyMarker(true);
    LoadGraphic(ImgBoss);
CutIn(YOUMU, "Scarlet Sign "\""Scarlet Meister"\", "", 0, 0, 0, 0);
    SetMovePosition02(GetCenterX, GetClipMinY + 120, 120);
    SetGraphicRect(30, 30, 100, 100);

meister; //attack.

    }

    @MainLoop {
    SetCollisionA(GetX, GetY, 32);
    SetCollisionB(GetX, GetY, 16);

yield;

    }
    @DrawLoop {
SetTexture(ImgBoss);
if(GetSpeedX()==0){SetGraphicRect(64,1,127,64);}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
DrawGraphic(GetX, GetY);
    }

    @Finalize {
DeleteGraphic(ImgBoss);
    }

task meister{
Concentration01(120); //charge
loop(120){yield;} //pause for two seconds.
let gatp = GetAngleToPlayer; //set the angle to player as a variable, so even if you the player moves during the attack it won't aim at another spot.
loop(5){
PlaySE(se);
CreateShot01(GetX, GetY, 7, gatp + rand(-2, 2), RED03, 0); //Five large red shots aimed at the player then with 12 small shots and 4 medium shots as well.
loop(12){
CreateShot01(GetX, GetY, rand(1, 6.8), gatp + rand(-15, 15), RED01, rand_int(0, 6));
}
loop(3){
CreateShot01(GetX, GetY, rand(3, 6.8), gatp + rand(-15, 15), RED02, rand_int(0, 3));
}
loop(4){
yield;
}
}
SetMovePosition03(rand(GetCenterX, GetCenterX + 150), rand(GetClipMinY + 60, GetClipMinY + 100), 10, 2.4); //move around towards the right side.
ascent(i in 1..19){
PlaySE(se);
CreateShot01(GetX, GetY, 7, gatp + (i*20), RED03, 0);
loop(17){
CreateShot01(GetX, GetY, rand(1, 6.8), gatp + rand(-15, 15) + (i*20), RED01, rand_int(0, 6));
}
loop(4){
CreateShot01(GetX, GetY, rand(3, 6.8), gatp + rand(-15, 15) + (i*20), RED02, rand_int(0, 3));
}
loop(2){
yield;
}
}


loop(50){yield;} //Pause for a second.
gatp = GetAngleToPlayer; //Get the angle to the player again.

//repeat for counterclock-wise movement.

loop(5){
PlaySE(se);
CreateShot01(GetX, GetY, 7, gatp + rand(-2, 2), RED03, 0);
loop(12){
CreateShot01(GetX, GetY, rand(1, 6.8), gatp + rand(-15, 15), RED01, rand_int(0, 6));
}
loop(3){
CreateShot01(GetX, GetY, rand(3, 6.8), gatp + rand(-15, 15), RED02, rand_int(0, 3));
}
loop(4){
yield;
}
}
SetMovePosition03(rand(GetCenterX - 150, GetCenterX), rand(GetClipMinY + 60, GetClipMinY + 100), 10, 2.4); //move around again, towards the left side.
ascent(i in 1..19){
PlaySE(se);
CreateShot01(GetX, GetY, 7, gatp - (i*20), RED03, 0);
loop(17){
CreateShot01(GetX, GetY, rand(1, 6.8), gatp + rand(-15, 15) - (i*20), RED01, rand_int(0, 6));
}
loop(4){
CreateShot01(GetX, GetY, rand(3, 6.8), gatp + rand(-15, 15) - (i*20), RED02, rand_int(0, 3));
}
loop(2){
yield;
}
}
meister; //repeat the whole attack, by calling the task again~!
}
}


Kanako's "Virtue of Wind God"
Beastly. Almost identical, save for minute angle variations that I just can't properly mimic. I recommend for you to download from the batch file, includes beastly sounds and whatnot. YOUTUBE VIDEO! (http://www.youtube.com/watch?v=6A6V3H3gq6g&fmt=22)

Code: [Select]
#TouhouDanmakufu
#Title[Virtue of Wind God]
#Text[VIRTUE OF WIND GOD, OH YEAH]
#BackGround[User(.\stuff\black.png, 1, 1)]
#BGM[.\stuff\ForeverEDIT.mp3]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {

///////////////////////////
///////////////////////////
///////////////////////////
///////////////////////////

#include_function "lib\SHOT_REPLACE\shot_replace.dnh";
let ImgBoss = GetCurrentScriptDirectory~"stuff\ExRumia.png";
let angle = 0;
let frame = 0;
let time = 0;
let groupangle = 10; //this helps group them in fours, and not pass through the center of each "circle".
let r = 0; //random number generator. Offsets the pattern randomly everytime it starts drawing.
let v = 3; //velocity, change if you're a wussy (lower) or a juggernaut (higher).
let delay = 30; //delay between the shot waves. This is changed about twenty seconds in to be smaller, as per the original spellcard.

let se = GetCurrentScriptDirectory~"stuff\shot.wav";
let ling = GetCurrentScriptDirectory~"stuff\kira00.wav";

    @Initialize {

shotinit;
    SetLife(10000);
SetScore(5000000);
SetTimer(150);
SetEnemyMarker(true);
    SetDamageRate(100, 10);
    SetInvincibility(150);
SetEnemyMarker(true);
    LoadGraphic(ImgBoss);
LoadSE(se);
LoadSE(ling);
CutIn(YOUMU, "Virute of Wind God", "", 0, 0, 0, 0);
    SetMovePosition02(GetCenterX, GetClipMinY + 160, 1);
    SetGraphicRect(30, 30, 100, 100);

windgod; //attack.

    }

    @MainLoop {
    SetCollisionA(GetX, GetY, 32);
    SetCollisionB(GetX, GetY, 16);
time++;
if(time==1200){
delay = 10;
}

yield;

    }
    @DrawLoop {
SetTexture(ImgBoss);
if(GetSpeedX()==0){SetGraphicRect(64,1,127,64);}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
DrawGraphic(GetX, GetY);
    }

    @Finalize {
DeleteGraphic(ImgBoss);
    }

task windgod{
loop(delay){yield;}
angle = 54;
sound;
loop(15){
loop(4){
CreateShotA(0, GetX + 45*cos(270 + r) + 45*cos(angle + r), GetY + 45*sin(270 + r) + 45*sin(angle + r), 6);
SetShotDataA(0, 0, 0, angle + 10 + r, 0, 0, 0, RED56);
SetShotDataA(0, 160 - frame, 0, angle + groupangle + r, 0, -0.05, -v, RED56);
FireShot(0);
CreateShotA(1, GetX + 45*cos(342 + r) + 45*cos(angle + 72 + r), GetY + 45*sin(342 + r) + 45*sin(angle + 72 + r), 6);
SetShotDataA(1, 0, 0, angle + 82 + r, 0, 0, 0, RED56);
SetShotDataA(1, 160 - frame, 0, angle + 72 + groupangle + r, 0, -0.05, -v, RED56);
FireShot(1);
CreateShotA(2, GetX + 45*cos(54 + r) + 45*cos(angle + 144 + r), GetY + 45*sin(54 + r) + 45*sin(angle + 144 + r), 6);
SetShotDataA(2, 0, 0, angle + 154 + r, 0, 0, 0, RED56);
SetShotDataA(2, 160 - frame, 0, angle + 144 + groupangle + r, 0, -0.05, -v, RED56);
FireShot(2);
CreateShotA(3, GetX + 45*cos(126 + r) + 45*cos(angle + 216 + r), GetY + 45*sin(126 + r) + 45*sin(angle + 216 + r), 6);
SetShotDataA(3, 0, 0, angle + 226 + r, 0, 0, 0, RED56);
SetShotDataA(3, 160 - frame, 0, angle + 216 + groupangle + r, 0, -0.05, -v, RED56);
FireShot(3);
CreateShotA(4, GetX + 45*cos(198 + r) + 45*cos(angle + 288 + r), GetY + 45*sin(198 + r) + 45*sin(angle + 288 + r), 6);
SetShotDataA(4, 0, 0, angle + 298 + r, 0, 0, 0, RED56);
SetShotDataA(4, 160 - frame, 0, angle + 288 + groupangle + r, 0, -0.05, -v, RED56);
FireShot(4);
angle-=5;
groupangle+=2;
yield;
frame++;
PlaySE(se);
}
groupangle = 10;
}
frame = 0; angle-=80;
sound;
loop(9){
loop(4){
CreateShotA(0, GetX + 75*cos(306 + r) + 55*cos(angle + r), GetY + 75*sin(306 + r) + 55*sin(angle + r), 6);
SetShotDataA(0, 0, 0, angle + 10 + r, 0, 0, 0, PURPLE56);
SetShotDataA(0, 160 - frame, 0, angle + groupangle + r, 0, -0.05, -v, PURPLE56);
FireShot(0);
CreateShotA(1, GetX + 75*cos(18 + r) + 55*cos(angle + 72 + r), GetY + 75*sin(18 + r) + 55*sin(angle + 72 + r), 6);
SetShotDataA(1, 0, 0, angle + 82 + r, 0, 0, 0, PURPLE56);
SetShotDataA(1, 160 - frame, 0, angle + 72 + groupangle + r, 0, -0.05, -v, PURPLE56);
FireShot(1);
CreateShotA(2, GetX + 75*cos(90 + r) + 55*cos(angle + 144 + r), GetY + 75*sin(90 + r) + 55*sin(angle + 144 + r), 6);
SetShotDataA(2, 0, 0, angle + 154 + r, 0, 0, 0, PURPLE56);
SetShotDataA(2, 160 - frame, 0, angle + 144 + groupangle + r, 0, -0.05, -v, PURPLE56);
FireShot(2);
CreateShotA(3, GetX + 75*cos(162 + r) + 55*cos(angle + 216 + r), GetY + 75*sin(162 + r) + 55*sin(angle + 216 + r), 6);
SetShotDataA(3, 0, 0, angle + 226 + r, 0, 0, 0, PURPLE56);
SetShotDataA(3, 160 - frame, 0, angle + 216 + groupangle + r, 0, -0.05, -v, PURPLE56);
FireShot(3);
CreateShotA(4, GetX + 75*cos(234 + r) + 55*cos(angle + 288 + r), GetY + 75*sin(234 + r) + 55*sin(angle + 288 + r), 6);
SetShotDataA(4, 0, 0, angle + 298 + r, 0, 0, 0, PURPLE56);
SetShotDataA(4, 160 - frame, 0, angle + 288 + groupangle + r, 0, -0.05, -v, PURPLE56);
FireShot(4);
angle-=5;
groupangle+=2;
yield;
frame++;
PlaySE(se);
}
groupangle = 10;
}
frame = 0; angle-=142;
sound;
loop(10){
loop(4){
CreateShotA(0, GetX + 112*cos(342 + r) + 75*cos(angle + r), GetY + 112*sin(342 + r) + 75*sin(angle + r), 6);
SetShotDataA(0, 0, 0, angle + 10 + r, 0, 0, 0, BLUE56);
SetShotDataA(0, 160 - frame, 0, angle + groupangle + r, 0, -0.05, -v, BLUE56);
FireShot(0);
CreateShotA(1, GetX + 112*cos(54 + r) + 75*cos(angle + 72 + r), GetY + 112*sin(54 + r) + 75*sin(angle + 72 + r), 6);
SetShotDataA(1, 0, 0, angle + 82 + r, 0, 0, 0, BLUE56);
SetShotDataA(1, 160 - frame, 0, angle + 72 + groupangle + r, 0, -0.05, -v, BLUE56);
FireShot(1);
CreateShotA(2, GetX + 112*cos(126 + r) + 75*cos(angle + 144 + r), GetY + 112*sin(126 + r) + 75*sin(angle + 144 + r), 6);
SetShotDataA(2, 0, 0, angle + 154 + r, 0, 0, 0, BLUE56);
SetShotDataA(2, 160 - frame, 0, angle + 144 + groupangle + r, 0, -0.05, -v, BLUE56);
FireShot(2);
CreateShotA(3, GetX + 112*cos(198 + r) + 75*cos(angle + 216 + r), GetY + 112*sin(198 + r) + 75*sin(angle + 216 + r), 6);
SetShotDataA(3, 0, 0, angle + 226 + r, 0, 0, 0, BLUE56);
SetShotDataA(3, 160 - frame, 0, angle + 216 + groupangle + r, 0, -0.05, -v, BLUE56);
FireShot(3);
CreateShotA(4, GetX + 112*cos(270 + r) + 75*cos(angle + 288 + r), GetY + 112*sin(270 + r) + 75*sin(angle + 288 + r), 6);
SetShotDataA(4, 0, 0, angle + 298 + r, 0, 0, 0, BLUE56);
SetShotDataA(4, 160 - frame, 0, angle + 288 + groupangle + r, 0, -0.05, -v, BLUE56);
FireShot(4);
angle-=4.7;
groupangle+=2.1;
yield;
frame++;
PlaySE(se);
}
groupangle = 10;
}
frame = 0;
loop(delay){yield;}
angle = 140;
r = rand(0, 72);
sound;
loop(15){
loop(4){
CreateShotA(0, GetX + 45*cos(270 + r) + 45*cos(angle + r), GetY + 45*sin(270 + r) + 45*sin(angle + r), 6);
SetShotDataA(0, 0, 0, angle + 10 + r, 0, 0, 0, GREEN56);
SetShotDataA(0, 160 - frame, 0, angle + groupangle + r, 0, -0.05, -v, GREEN56);
FireShot(0);
CreateShotA(1, GetX + 45*cos(342 + r) + 45*cos(angle + 72 + r), GetY + 45*sin(342 + r) + 45*sin(angle + 72 + r), 6);
SetShotDataA(1, 0, 0, angle + 82 + r, 0, 0, 0, GREEN56);
SetShotDataA(1, 160 - frame, 0, angle + 72 + groupangle + r, 0, -0.05, -v, GREEN56);
FireShot(1);
CreateShotA(2, GetX + 45*cos(54 + r) + 45*cos(angle + 144 + r), GetY + 45*sin(54 + r) + 45*sin(angle + 144 + r), 6);
SetShotDataA(2, 0, 0, angle + 154 + r, 0, 0, 0, GREEN56);
SetShotDataA(2, 160 - frame, 0, angle + 144 + groupangle + r, 0, -0.05, -v, GREEN56);
FireShot(2);
CreateShotA(3, GetX + 45*cos(126 + r) + 45*cos(angle + 216 + r), GetY + 45*sin(126 + r) + 45*sin(angle + 216 + r), 6);
SetShotDataA(3, 0, 0, angle + 226 + r, 0, 0, 0, GREEN56);
SetShotDataA(3, 160 - frame, 0, angle + 216 + groupangle + r, 0, -0.05, -v, GREEN56);
FireShot(3);
CreateShotA(4, GetX + 45*cos(198 + r) + 45*cos(angle + 288 + r), GetY + 45*sin(198 + r) + 45*sin(angle + 288 + r), 6);
SetShotDataA(4, 0, 0, angle + 298 + r, 0, 0, 0, GREEN56);
SetShotDataA(4, 160 - frame, 0, angle + 288 + groupangle + r, 0, -0.05, -v, GREEN56);
FireShot(4);
angle-=5;
groupangle+=2;
yield;
frame++;
PlaySE(se);
}
groupangle = 10;
}
frame = 0; angle-=165;
sound;
loop(9){
loop(4){
CreateShotA(0, GetX + 75*cos(306 + r) + 55*cos(angle + r), GetY + 75*sin(306 + r) + 55*sin(angle + r), 6);
SetShotDataA(0, 0, 0, angle + 10 + r, 0, 0, 0, YELLOW56);
SetShotDataA(0, 160 - frame, 0, angle + groupangle + r, 0, -0.05, -v, YELLOW56);
FireShot(0);
CreateShotA(1, GetX + 75*cos(18 + r) + 55*cos(angle + 72 + r), GetY + 75*sin(18 + r) + 55*sin(angle + 72 + r), 6);
SetShotDataA(1, 0, 0, angle + 82 + r, 0, 0, 0, YELLOW56);
SetShotDataA(1, 160 - frame, 0, angle + 72 + groupangle + r, 0, -0.05, -v, YELLOW56);
FireShot(1);
CreateShotA(2, GetX + 75*cos(90 + r) + 55*cos(angle + 144 + r), GetY + 75*sin(90 + r) + 55*sin(angle + 144 + r), 6);
SetShotDataA(2, 0, 0, angle + 154 + r, 0, 0, 0, YELLOW56);
SetShotDataA(2, 160 - frame, 0, angle + 144 + groupangle + r, 0, -0.05, -v, YELLOW56);
FireShot(2);
CreateShotA(3, GetX + 75*cos(162 + r) + 55*cos(angle + 216 + r), GetY + 75*sin(162 + r) + 55*sin(angle + 216 + r), 6);
SetShotDataA(3, 0, 0, angle + 226 + r, 0, 0, 0, YELLOW56);
SetShotDataA(3, 160 - frame, 0, angle + 216 + groupangle + r, 0, -0.05, -v, YELLOW56);
FireShot(3);
CreateShotA(4, GetX + 75*cos(234 + r) + 55*cos(angle + 288 + r), GetY + 75*sin(234 + r) + 55*sin(angle + 288 + r), 6);
SetShotDataA(4, 0, 0, angle + 298 + r, 0, 0, 0, YELLOW56);
SetShotDataA(4, 160 - frame, 0, angle + 288 + groupangle + r, 0, -0.05, -v, YELLOW56);
FireShot(4);
angle-=5;
groupangle+=2;
yield;
frame++;
PlaySE(se);
}
groupangle = 10;
}
frame = 0; angle-=144;
sound;
loop(10){
loop(4){
CreateShotA(0, GetX + 112*cos(342 + r) + 75*cos(angle + r), GetY + 112*sin(342 + r) + 75*sin(angle + r), 6);
SetShotDataA(0, 0, 0, angle + 10 + r, 0, 0, 0, ORANGE56);
SetShotDataA(0, 160 - frame, 0, angle + groupangle + r, 0, -0.05, -v, ORANGE56);
FireShot(0);
CreateShotA(1, GetX + 112*cos(54 + r) + 75*cos(angle + 72 + r), GetY + 112*sin(54 + r) + 75*sin(angle + 72 + r), 6);
SetShotDataA(1, 0, 0, angle + 82 + r, 0, 0, 0, ORANGE56);
SetShotDataA(1, 160 - frame, 0, angle + 72 + groupangle + r, 0, -0.05, -v, ORANGE56);
FireShot(1);
CreateShotA(2, GetX + 112*cos(126 + r) + 75*cos(angle + 144 + r), GetY + 112*sin(126 + r) + 75*sin(angle + 144 + r), 6);
SetShotDataA(2, 0, 0, angle + 154 + r, 0, 0, 0, ORANGE56);
SetShotDataA(2, 160 - frame, 0, angle + 144 + groupangle + r, 0, -0.05, -v, ORANGE56);
FireShot(2);
CreateShotA(3, GetX + 112*cos(198 + r) + 75*cos(angle + 216 + r), GetY + 112*sin(198 + r) + 75*sin(angle + 216 + r), 6);
SetShotDataA(3, 0, 0, angle + 226 + r, 0, 0, 0, ORANGE56);
SetShotDataA(3, 160 - frame, 0, angle + 216 + groupangle + r, 0, -0.05, -v, ORANGE56);
FireShot(3);
CreateShotA(4, GetX + 112*cos(270 + r) + 75*cos(angle + 288 + r), GetY + 112*sin(270 + r) + 75*sin(angle + 288 + r), 6);
SetShotDataA(4, 0, 0, angle + 298 + r, 0, 0, 0, ORANGE56);
SetShotDataA(4, 160 - frame, 0, angle + 288 + groupangle + r, 0, -0.05, -v, ORANGE56);
FireShot(4);
angle-=4.7;
groupangle+=2.1;
yield;
frame++;
PlaySE(se);
}
groupangle = 10;
}
frame = 0;
r = rand(0, 72);
windgod;
}

task sound{
loop(160){yield;}
PlaySE(ling);
}
}
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on May 07, 2009, 04:09:41 AM
NGYAHAHAHAHAHAHH 8D

*steals and runs* Time to waste my night hours away trying to beat VoWG XD

Yeah, wow, okay. On Yamame's card, my computer slowed down to 30 fps, and VoWG was going at 45. I hate this thing.
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 07, 2009, 04:26:26 AM
Yamame's slowed to 30!? Good lord I don't do anything particularly computer-hogging in that one (I won't mention VoWG, we can see there are many bullets in that...), so I have no idea what could be causing that slowdown. I'll take another look but I'm going to bed soon so I might not have a reply until tomorrow.

EDIT: You could try taking out all the sound effects in each card, but other than that I cant think of anything. I'll think about this more and try to come up with something for tomorrow.
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on May 07, 2009, 04:30:36 AM
My computer is dumb, final answer. o~o I dunno.
Title: Re: Touhou Spellcard Replica Thread
Post by: stargroup on May 07, 2009, 10:37:51 PM
holy shit why did I not notice this before

I love you for making danmakufu replicas for the card I want the most. I think you can guess which one.

LOOOOOOOVE YOU

Don't think too much of my measly wants, but I would love it if you made one for red magic.

Also, I tried to make eternal meek, but it didn't turn out so well. I'll post it anyways, so you guys can tweak it if you want to. Didn't put the official life or timer values though. I didn't check this out for a long time either so I don't even remember how bad this actually was haha.

Code: [Select]
#TouhouDanmakufu
#Title[Conjuring ?uEternal Meek?v]
#Text[Tutorial]
#Image[.\img.png]
#BackGround[Default]
#BGM[.\bgm.mp3]
#PlayLevel[Lunatic]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
    let BossImage = ".\Enemy.png";
    let BossCutIn = ".\Enemy.png";
    let frame = 0;
    @Initialize {
        LoadGraphic(BossImage);
        SetLife(100);
        SetDamageRate(6, 6);
        SetTimer(50);
        SetInvincibility(30);
        CutIn(YOUMU, "Maid Sign - ?uEternal Meek?v", BossCutIn, 0, 0, 200, 600);
        SetScore(500000);
        SetEnemyMarker(true);
        Concentration01(60);
        Concentration02(60);
        MagicCircle(false);
        SetEffectForZeroLife(50, 50, 0.6);
    }
    @MainLoop {
        SetCollisionA(GetCenterX(), 150, 32);
        SetCollisionB(GetCenterX(), 150, 24);
        if(frame==21){
            let randangle1 = rand(0, 360);
            let randangle2 = rand(0, 360);
            let randangle3 = rand(0, 360);
            let randangle4 = rand(0, 360);
            CreateShot01(GetCenterX(), 150, 4.5, randangle1, BLUE01, 5);
            CreateShot01(GetCenterX(), 150, 4.5, randangle2, BLUE01, 5);
            CreateShot01(GetCenterX(), 150, 4.5, randangle3, BLUE01, 5);
            CreateShot01(GetCenterX(), 150, 4.5, randangle4, BLUE01, 5);
            frame = 20;   
        }
        frame++;         
    }

    @DrawLoop {
    }

    @Finalize {
    }

    @BackGround {
    }
}
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 07, 2009, 10:58:45 PM
I am unfamiliar with "Red Magic...", the spellcard. Care to give a link or something?

I'll check your script in a few.
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on May 07, 2009, 11:25:30 PM
Red Magic's the less-lethal version of Scarlet Gensokyo.
Title: Re: Touhou Spellcard Replica Thread
Post by: stargroup on May 08, 2009, 12:04:36 AM
Oops my bad. Yeah I meant Scarlet Gensokyo

EDIT: yeah ok I'm retarded my bad  :-[
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on May 08, 2009, 12:17:20 AM
you need to download the shot replace script like everyone's only said fifty times
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 08, 2009, 12:37:42 AM
Way to be helpful Drake, GAWD~!

SHOT REPLACE SCRIPT HOLY DICKS ON A STICK (http://barneyzhenspages.googlepages.com/shot_replace.zip)

Read the readme.txt, before anything!

BIG EDIT!

Ohoho I see you're new to Danmakufu, stargroup. Welcome welcome. So let's go over your script (in the middle of a random thread... But hey, I'm happy to help where needed).

Alrighty, first off you'll want to move the boss from that silly position at the top middle of the screen. To do this we'll type, in @Initialize (so she does this at the very start of the script only once):

Code: [Select]
        SetMovePosition02(GetCenterX, GetCenterY, 70);
Which tells the boss to move to the center of the screen, taking 70 frames to get there! I won't fill this post with movement functions, as I have already ruined somebody else's thread with them here (http://www.shrinemaiden.org/forum/index.php?topic=293.msg6654#msg6654)! (Protip: take a look around, a few of us have probably already answered many of the issues you might be experiencing in other threads. It isn't much reading compared to the old forums, plus the areas you'll want to look in have thread titles like "HELP", so do yourself a favour and look around)

Alrighty, next thing you'll want to do is set those coordinates in your SetCollisionA and SetCollisionB to GetX, GetY. This will tell Danmakufu, every frame, to make the boss' collision detection circles on the boss' position! Very useful, methinks.

Something you'll definately want to do is keep this page (http://touhou.wikia.com/wiki/Touhou_Danmakufu:_Bullets) for your records. It contains a mighty overview of the default bullet types, so you can change those bullets from BLUE01's to something prettier (erm, should you feel like it, that is).

And one last thing. It is unecessary to store those random angles in variables, since they're completely random and ever-changing. So, for the angle parameter in CreateShot01, you can just put "rand(0, 360)" instead of "randangle" 1 through 4. Works for all four bullets, which is pretty convienient, eh.


If you feel like you wanna remake this card and fancy it up as you see fit, I'll throw the finished version on the first post, crediting it to you. But for now, work on fixing some of these issues, and practice practice practice! Good luck.
Title: Re: Touhou Spellcard Replica Thread
Post by: stargroup on May 08, 2009, 01:04:39 AM
Aha, thanks.

Just a curious question, how much experience do you have with Actionscript and scripting in general?
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 08, 2009, 01:10:48 AM
Absolutely none, Danmakufu is the only language I know...understand...dabble with... fail at, save for English.
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on May 09, 2009, 05:48:04 PM
I used to use actionscript, but I grew tired of it. Danmakufu is much more comprehensive (i.e. you don't get ERRORS EVERYWHERE OH GOD)
Title: Re: Touhou Spellcard Replica Thread
Post by: Infy♫ on May 12, 2009, 05:28:02 PM
a weird version of "unilateral contact"
for some reason I called unilateral food supply...
anyways, the basics are the ones that count! the bullets do move like they should!
Code: [Select]
#TouhouDanmakufu
#Title[Taboo "Unilateral Food Supply V2"]
#Text[]
#Image[.\ss.jpg]
#BackGround[IceMountain]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
let frame = 0;
let deg = 0;
let rotvar = 0;
let frame2 = 0;
let frame3 = 0;
let frame4 = 0;
let BossImage = GetCurrentScriptDirectory ~ "huhu.gif";
let BossCutIn = GetCurrentScriptDirectory ~ "ss.jpg";
let Back = GetCurrentScriptDirectory ~ "Wormhole.jpg";
LoadSE(GetCurrentScriptDirectory ~ "tan01.wav");
LoadSE(GetCurrentScriptDirectory ~ "kira00.wav");
LoadSE(GetCurrentScriptDirectory ~ "enep01.wav");
    @Initialize {
        LoadGraphic(BossCutIn);
        LoadGraphic(BossImage);
        LoadGraphic(Back);
        SetLife(1500);
        SetDamageRate(10, 10);
        SetTimer(120);
        SetInvincibility(30);
        CutIn(YOUMU, "Taboo "/"A Supermassive Black Hole Named Flandre"/"", BossCutIn, 0, 0, 200, 600);
        SetScore(5000000);
        SetEnemyMarker(true);
        SetDurableSpellCard;
        Concentration01(120);
        Concentration02(60);
        MagicCircle(true);
        SetEffectForZeroLife(30, 100, 1);
        SetX(GetCenterX());
        SetY(100);
    }

    @MainLoop {
        SetCollisionA(GetX, GetY, 32);
        SetCollisionB(GetX, GetY, 24);
frame++;
yield;
frame2++;
if(frame == 150){
loop(200){
CreateShotPlanet(GetX,GetY,rand(1,360),rand(3,8),1);
}
}

if(frame == 300){
frame = 0;
loop(200){
CreateShotPlanet(GetX,GetY,rand(1,360),rand(3,8),-1);
}
}
}
    @DrawLoop {
SetTexture(BossImage);
        DrawGraphic(GetX, GetY);

    }

    @Finalize {
DeleteGraphic(BossImage);
DeleteGraphic(BossCutIn);
DeleteGraphic(Back);
    }

    @BackGround {
rotvar += 1;
SetGraphicAngle (0,0,rotvar);
SetTexture (Back);
SetGraphicRect (0,0,1024,768);
DrawGraphic (GetCenterX(), GetCenterY());
    }
task CreateShotPlanet(x,y,d,vv,i) {
   let  obj = Obj_Create(OBJ_SHOT);
let frame = 0;
let angle = d;
let oldangle = 0;
let jump = 0;
let frame2 = 0;
    Obj_SetPosition   (obj, x, y);
    Obj_SetSpeed      (obj, vv);
    Obj_SetAngle      (obj, d);
    if(i == 1){
ObjShot_SetGraphic(obj, RED32);
}
    if(i == -1){
ObjShot_SetGraphic(obj, BLUE32);
}
    ObjShot_SetDelay  (obj, 0);
    Obj_SetAutoDelete(obj,false);
while(! Obj_BeDeleted(obj)){
frame++;
if(frame < 80){
Obj_SetSpeed(obj,Obj_GetSpeed(obj) - Obj_GetSpeed(obj) /60);
}
if(frame > 79 && frame < 120){
angle+=4.3 * i;
Obj_SetAngle(obj,angle);
Obj_SetSpeed(obj,3);
 //Obj_SetSpeed   (obj, 2* ((GetX - Obj_GetX(obj))^2 + (GetY - Obj_GetY(obj))^2)^0.5* pi /90);
}
if(frame == 120){
Obj_SetSpeed(obj,6);
}
if(frame == 500){
ObjShot_FadeDelete(obj);
}
yield;

}
}
}
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 12, 2009, 08:32:49 PM
I meant this thread was for direct duplicates of the spellcards (or as close as you can get them), not "based on this spellcard", or something like that.

Anyways, be sure to include any files you need to run a spellcard too, some of us don't have "huhu.gif" or "ss.jpg". Your CutIn is incorrect as well, you have:

Code: [Select]
        CutIn(YOUMU, "Taboo "/"A Supermassive Black Hole Named Flandre"/"", BossCutIn, 0, 0, 200, 600);
when it should be

Code: [Select]
        CutIn(YOUMU, "Taboo "\""A Supermassive Black Hole Named Flandre"\", BossCutIn, 0, 0, 200, 600);
Might explain the wierd text that's displayed instead of the text you've specified.
Isn't Unilateral Contact Ran's spellcard, not Flandre's? I can see what you're doing though, but we are looking for copies, right.

Sorry for being nitpicky, but that's really what this thread is about. The card is fun to play, albeit a bit long, but fun nonetheless.
Title: Re: Touhou Spellcard Replica Thread
Post by: RavenEngie on May 13, 2009, 09:39:16 PM
I meant this thread was for direct duplicates of the spellcards (or as close as you can get them), not "based on this spellcard", or something like that.

I wonder if all my Yukari spells would fit into that... Apart from Danmaku Bounded Field and Boundary of Humans and Youkai, since I had to mess about with them due to laziness...

On a side note, HELLO AGAIN, EVERYONE!
Title: Re: Touhou Spellcard Replica Thread
Post by: Darkblizer on May 13, 2009, 09:44:04 PM
Hey, do you think you could replicate Subconscious "Rorschach in Danmaku"?
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on May 13, 2009, 10:01:13 PM
I could, the only thing in the way is that I don't know how everything shoots off in the same direction like it does. Planting the bullets + movement should be easy enough to do.

Oh and I guess laziness.
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 14, 2009, 12:12:51 AM
Easy isn't something I would describe. I've already posted the code (http://www.shrinemaiden.org/forum/index.php?topic=296.msg9257#msg9257) for that bullet pattern that Koishi does, so if somebody wants to throw it into a spellcard you're always welcome to. And no, I didn't make the code, so don't ask me questions!

And....

Welcome back Ravenlock~!
Title: Re: Touhou Spellcard Replica Thread
Post by: stargroup on May 20, 2009, 01:49:29 AM
You know what should be relatively easy to replicate?

Emerald Megalith.

I'm also surprised no one requested QED 495 Ripples of Bullshit
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on May 20, 2009, 03:19:14 AM
Because QED is extremely simple? Frankly, Subterranean Sun would be a much better thing to reproduce.
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 20, 2009, 03:40:32 AM
...Now why would you go and say that.

Subterranean Sun is nearing completion, I'm just testing angular values to properly mimic the card's.
Title: Re: Touhou Spellcard Replica Thread
Post by: stargroup on May 21, 2009, 03:24:09 AM
well, someone either post a QED or make one anyways

I want one ;_;
Title: Re: Touhou Spellcard Replica Thread
Post by: CK Crash on May 21, 2009, 10:12:42 AM
If anything, QED would be a great example to show people how to make bouncing bullets, which would also help me to understand the more complicated bullet commands. I say go for it.
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on May 21, 2009, 05:40:46 PM
Eep, I didn't intend on sounding mean... o.o I'll do it right away, to make up for it, mm? I already have 99% of it written (was reproducing one of EX-Alice's attacks, turned out looking like some kind of spirographic nightmare, eheh)

Ack, I have returned, but with a problem of my own. I can't see a way to normalize the bullet reflection coordinates so that they all reflect at the same time. Some of them pass the clip boundaries earlier than others, so the rings I've made for OTN are kind of busted.

Code: [Select]
#TouhouDanmakufu
#Title[QED for OTN]
#Text[Ka-pow]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {

    let ImgBoss = "script\img\ExRumia.png";
    let timer = 0;
    let timerex = 240;
    let angle = 0;
    let x_feed;
    let y_feed;
    #include_function "lib\SHOT_REPLACE\shot_replace.dnh"

    @Initialize {
        SetLife(6000);
        SetTimer(120);
        SetScore(1000000);

        SetMovePosition02(GetCenterX, GetCenterY - 120, 120);
        CutIn(YOUMU, "QED "\""495 Years of Solitude"\", "", 0, 0, 0, 0);
        SetDamageRate(75, 0);

        LoadGraphic(ImgBoss);
        SetTexture(ImgBoss);
        SetGraphicRect(0, 0, 64, 64);
        shotinit;
    }

    @MainLoop {
        SetCollisionA(GetX, GetY, 32);
        SetCollisionB(GetX, GetY, 16);
        if(GetLife>=4000){timerex=240;}
        if(GetLife<4000 && GetLife>=2000){timerex=120;}
        if(GetLife<2000 && GetLife>=750){timerex=90;}
        if(GetLife<750){
            SetDamageRate(50, 0);
            timerex=60;}
        if(timer>=timerex){
        x_feed = rand(GetCenterX-120, GetCenterX+120);
        y_feed = rand(GetClipMinY + 20, GetClipMinY+150);
        angle = rand(0, 360);
        loop(120){
        Tshot(angle, x_feed, y_feed);
        timer = 0;
        angle+=3;}
        }

        timer++;
        yield;
       
    }

    @DrawLoop {
        DrawGraphic(GetX, GetY);
    }

    @Finalize {
        DeleteGraphic(ImgBoss);
    }
task Tshot(let angletaken, let orix, let oriy){
          loop(120){yield;}
          let getxa;
          let getya;
          let anglereflex;
          let reflectcount = 0;
          let objshot = Obj_Create(OBJ_SHOT);
          reflectcount = 0;
          Obj_SetPosition(objshot, orix, oriy);
          ObjShot_SetGraphic(objshot, BLUE12);
          Obj_SetSpeed(objshot, 1.5);
          Obj_SetAlpha(objshot, 255);
          Obj_SetAngle(objshot, angletaken);
          Obj_SetCollisionToPlayer(objshot, true);
          ObjShot_SetDelay(objshot, 6);
          while(!Obj_BeDeleted(objshot)){
           getxa = Obj_GetX(objshot);
           getya = Obj_GetY(objshot);
           if((getxa < GetClipMinX || getxa>GetClipMaxX) && reflectcount == 0){
            anglereflex = -angletaken+180;
            Obj_SetAngle(objshot, anglereflex);
            reflectcount = 5;}
           if((getya < GetClipMinY) && reflectcount == 0){
            anglereflex = -angletaken;
            Obj_SetAngle(objshot, anglereflex);
            reflectcount = 5;}
           
          yield;
          }
          }
}
I apologize for the exploded script, I modified it heavily at times (this was my first object-bullet adventure), and so it gets kind of garbled in places.
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 21, 2009, 09:54:03 PM
Hmm, I'm assuming you mean "why do my bullet waves look weird when the bullets reflect?"

Like you've said, it's because they all go over the ClipMax/Min at different times. So, to make the waves perfect, we get how far they've moved beyond the ClipMax/Min, then set their position to the other side (to get how far the bullet went outside of the field, we say GetClipMinX - position, then set it's coordinates to GetClipMinX + position), which will restructure the wave back into it's perfect circle form. Here it is in code:

Code: [Select]
#TouhouDanmakufu
#Title[QED for OTN]
#Text[Ka-pow]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {

    let ImgBoss = "script\img\ExRumia.png";
    let timer = 0;
    let timerex = 240;
    let angle = 0;
    let x_feed;
    let y_feed;
    #include_function "lib\SHOT_REPLACE\shot_replace.dnh"

    @Initialize {
        SetLife(6000);
        SetTimer(120);
        SetScore(1000000);

        SetMovePosition02(GetCenterX, GetCenterY - 120, 120);
        CutIn(YOUMU, "QED "\""495 Years of Solitude"\", "", 0, 0, 0, 0);
        SetDamageRate(75, 0);

        LoadGraphic(ImgBoss);
        SetTexture(ImgBoss);
        SetGraphicRect(0, 0, 64, 64);
        shotinit;
    }

    @MainLoop {
        SetCollisionA(GetX, GetY, 32);
        SetCollisionB(GetX, GetY, 16);
        if(GetLife>=4000){timerex=240;}
        if(GetLife<4000 && GetLife>=2000){timerex=120;}
        if(GetLife<2000 && GetLife>=750){timerex=90;}
        if(GetLife<750){
            SetDamageRate(50, 0);
            timerex=60;}
        if(timer>=timerex){
        x_feed = rand(GetCenterX-120, GetCenterX+120);
        y_feed = rand(GetClipMinY + 20, GetClipMinY+150);
        angle = rand(0, 360);
        loop(120){
        Tshot(angle, x_feed, y_feed);
        timer = 0;
        angle+=3;}
        }

        timer++;
        yield;
      
    }

    @DrawLoop {
        DrawGraphic(GetX, GetY);
    }

    @Finalize {
        DeleteGraphic(ImgBoss);
    }
task Tshot(let angletaken, let orix, let oriy){
          loop(120){yield;}
          let getxa;
          let getya;
          let anglereflex;
          let reflectcount = 0;
          let objshot = Obj_Create(OBJ_SHOT);
          reflectcount = 0;
          Obj_SetPosition(objshot, orix, oriy);
          ObjShot_SetGraphic(objshot, BLUE12);
          Obj_SetSpeed(objshot, 1.5);
          Obj_SetAlpha(objshot, 255);
          Obj_SetAngle(objshot, angletaken);
          Obj_SetCollisionToPlayer(objshot, true);
          ObjShot_SetDelay(objshot, 6);
          while(!Obj_BeDeleted(objshot)){
           getxa = Obj_GetX(objshot);
           getya = Obj_GetY(objshot);
           if(getxa < GetClipMinX && reflectcount == 0){
            anglereflex = -angletaken+180;
let position = GetClipMinX - Obj_GetX(objshot);
Obj_SetX(objshot, GetClipMinX + position);
            Obj_SetAngle(objshot, anglereflex);
            reflectcount = 5;}
           if(getxa > GetClipMaxX && reflectcount == 0){
            anglereflex = -angletaken+180;
let position = GetClipMaxX - Obj_GetX(objshot);
Obj_SetX(objshot, GetClipMaxX + position);
            Obj_SetAngle(objshot, anglereflex);
            reflectcount = 5;}
           if((getya < GetClipMinY) && reflectcount == 0){
            anglereflex = -angletaken;
let position = GetClipMinY - Obj_GetY(objshot);
Obj_SetY(objshot, GetClipMinY + position);
            Obj_SetAngle(objshot, anglereflex);
            reflectcount = 5;}
          yield;
          
          }
          }
}


Had to split your Obj_GetX's for the bullet task to set the position correctly for both sides of the playing field. Hopefully that addressed your problem.

Also, remember that Flandre goes into batshit crazy mode for the last twenty seconds of the card!
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on May 22, 2009, 03:39:07 AM
Yeah, I already knew that... I just didn't know HOW to get the distance from the barrier before it hit, so it would reflect all nice and pretty. o-o Well, thanks anyway. I can learn from that too. =D Though, none of my spellcards-to-be use object bullets just yet.
Title: Re: Touhou Spellcard Replica Thread
Post by: Tenbatsu! Myon Rabbie on May 22, 2009, 01:28:45 PM
Hurr.. trying QED one..
EDIT: Anyways, tried.
Its not as hard as in the Official Game.
But I guess if you practice this like hell, you could capture QED in EoSD.
Timed out the card, lost one life and about.. two to three bombs.
Good job, anyways.
Title: Re: Touhou Spellcard Replica Thread
Post by: Darkblizer on May 28, 2009, 02:30:49 AM
for some odd reason, your VoWG card isn't showing up on the select, but all of your other cards do. hmm..

Anyway, can you replicate Yuyuko's final spell?
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 28, 2009, 02:35:07 AM
Whenever I get around to finishing Subterranean Sun, I'll start on her spell I guess. Most of the code is in TalonPain's Satori music synchronized script anyway, so you could probably do it faster than I'll get around to it.

Man I'm lazy, been playing other people's scripts more than actually coding... Eugh.

Can you guys like... Stop making good scripts? Srsly.
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on May 28, 2009, 02:51:04 AM
Speaking of which, he has an interesting movement script.

Code: [Select]
function ExMove(length, height) {
if(GetPlayerX < GetX) {
if(GetX - length <= GetClipMinX) {
SetMovePosition03(GetX + length, rand(height, height + 60), 10, 6);
} else {
SetMovePosition03(GetX - length, rand(height, height + 60), 10, 6);
}
} else {
if(GetX + length >= GetClipMaxX) {
SetMovePosition03(GetX - length, rand(height, height + 60), 10, 6);
} else {
SetMovePosition03(GetX + length, rand(height, height + 60), 10, 6);
}
}
}
Title: Re: Touhou Spellcard Replica Thread
Post by: Naut on May 28, 2009, 03:00:37 AM
That's around about what I'd like to use. Moves the boss above your position (roughly) so that even if you're using a forward shooting type, you can still hit the boss most of the time while still concentrating on dodging. The height parameter seems pretty useless though, I'd be using the same y area for any time I'd use this function, so I'm not entirely sure why he would make it a variable. I mean, anytime I'd want to call this function, I pretty much want the boss to be close to the top of the screen... So why declare "100" every time I want to move her?

Nothing in his script is incredibly complex, it's just a bit of a bitch to find when the tasks aren't really named well. The only thing I had trouble understanding was his Koishi attack, the rest of it is fairly straightforward (albeit needlessly timed in a complex manner, but it doesn't affect the understanding of the script very much).
Title: Re: Touhou Spellcard Replica Thread
Post by: Chronojet ⚙ Dragon on June 07, 2009, 02:42:31 PM
Oooohhh Yayz! I'll be here forever.
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on June 25, 2009, 05:03:25 AM
Y'know... what would be a really cool idea is if we managed to replicate every card from every game. I think that would be awesome. Like... a universal Spellcard Practice. That would be awesome, no?

And by that, I mean I'm just crazy enough to attempt it (with some help, of course, as that would be tantamount to suicide-induction).
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on June 25, 2009, 05:28:21 AM
lol no
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on June 25, 2009, 05:47:58 AM
o.o I agree. In retrospect... that was a brilliantly retarded idea.

This is what I get for staying up late.
Title: Re: Touhou Spellcard Replica Thread
Post by: Stuffman on June 25, 2009, 06:01:44 AM
They wouldn't be perfect reproductions, so its usefulness as a universal spell practice would be questionable...

Anyway, even if it's neat to be able to see how ZUN did some of his more famous patterns, I'd rather see new content!
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on June 25, 2009, 12:34:52 PM
True say. I really need to carry around a journal or something, though, because I always think of good ideas for spellcards, then forget them and end up making replicas anyway. XD

In any case, there is some weird voodoo going on with Double Black Death Butterfly. I think the angular velocity of the butterflies varies with the distance from Yukari... EDIT: No, wait, lies. I just don't know how all the bullets seem to converge to this one distance from her. It's like they all just graze by this invisible circle... but I have no idea how to make that work.
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on June 25, 2009, 05:50:07 PM
Something about having the angle to return at being directed towards Yukari plus a number. That should make all of them return at an angle right beside her and thus make a circle, no?
Title: Re: Touhou Spellcard Replica Thread
Post by: Hat on July 01, 2009, 10:32:51 PM
Yeah, that is what I was trying to emulate, but the problem is that there is angular velocity involved. I'm pretty good at math, but I seriously lack the energy to figure out how to get the angular velocity to give the angle of return plus a number as it varies with distance, in time (that was really convoluted, sorry). That's an algebraic clusterfuck, thank you. XD
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on July 01, 2009, 10:43:20 PM
Make object bullets that start out as an originating angle (which escalates after each bullet) and have an internal variable go up each frame and the bullets decelerate. When it gets past a certain number, have the angles start increasing/decreasing and accelerate until either another frame number is hit or the angle they have is equal to the original angle plus 184 or 176 or something.
Title: Re: Touhou Spellcard Replica Thread
Post by: Chronojet ⚙ Dragon on November 14, 2009, 10:49:55 PM
Please improve:
Code: [Select]
#TouhouDanmakufu
#Title[Improvement Needed]
#Text[Um yeah.]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
let BossImage = "script\img\ExRumia.png";
let frame = -240;
let round = 0;
let a = 0;
let num = 11;
let graphic = [RED23, PURPLE23];
let Spell = true;
let Survival = false;
let Final = false;
let CutInGraphic = GetCurrentScriptDirectory~"Cut.png";
function ExMove(length, height) {
if(GetPlayerX < GetX) {
if(GetX - length <= GetClipMinX) { SetMovePosition03(GetX + length, rand(height - 60, height + 60), 10, 6); } else { SetMovePosition03(GetX - length, rand(height - 60, height + 60), 10, 6); }
} else {
if(GetX + length >= GetClipMaxX) { SetMovePosition03(GetX - length, rand(height - 60, height + 60), 10, 6); } else { SetMovePosition03(GetX + length, rand(height - 60, height + 60), 10, 6); }
}
}
@Initialize {
if(Spell) { SetLife(630); SetDamageRate(15, 5); } else { SetLife(2400); SetDamageRate(50, 20); }
SetTimer(60);
if(Survival) { SetDurableSpellCard; }
if(Spell) { if(Final) { SetScore(1000000); } else { SetScore(1200000); } SetEnemyMarker(true); MagicCircle(true); }
if(Spell) { SetInvincibility(24 0); } Concentration01(90); if(Final) { SetEffectForZeroLife(120, 255, 1); }
if(Spell) { CutIn(KOUMA, ""\""Curse"\", CutInGraphic, 0, 0, 182, 222); }
SetMovePosition03(GetCenterX, GetCenterY-80, 9, 10);
LoadGraphic(BossImage);
//AtMain(); //Expert;
}
@MainLoop {
if(frame >= -60) {
SetCollisionA(GetX, GetY, 32);
}
SetCollisionB(GetX, GetY, 24);
if(frame == -60) {
AddLife(-(GetEnemyLife/2));
Explosion01(GetX, GetY, 5, 1, 255);
}
if(frame < 600 && frame > 0 && frame % 9 == 0) {
loop(num) {
ascent(i in 0..5) {
CreateShot02(GetX, GetY, 7, a, -1/3, 2+i*0.125, graphic[rand_int(0, 1)], 0);
}
a+=360/num;
}
a+=7.25;
}
if(frame >= 600 && frame % 9 == 0) {
loop(num) {
ascent(i in 0..5) {
CreateShot02(GetX, GetY, 7, a+rand(-5, 5), -1/3, 2+i*0.125, graphic[rand_int(0, 1)], 0);
}
a+=360/num;
}
a+=7.25;
}
frame++;
}
let animation = 0;
@DrawLoop {
DrawText("Hina", 40, 36, 12, 255);
SetTexture(BossImage);
animation++;if(animation==600){animation=0;}
if(GetSpeedX()==0){if(animation<=300){SetGraphicRect(64,1,127,64);}else if(animation>300&&animation<=600){SetGraphicRect(0,1,63,64);}}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1, 1);
SetRenderState(ALPHA);
SetAlpha(255);
SetColor(255, 255, 255);
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(BossImage);
}
}
...that thing. It should look like Wound Sign "Pain Flow".
Title: Re: Touhou Spellcard Replica Thread
Post by: Jaimers on November 18, 2009, 01:11:47 AM
So I can request for any of ZUN's patterns to be remade in Danmakufu?
Hmm...

Gengetu Rape Time

Make it happen  :V
Title: Re: Touhou Spellcard Replica Thread
Post by: Suikama on November 18, 2009, 01:22:17 AM
So I can request for any of ZUN's patterns to be remade in Danmakufu?
Hmm...

Gengetu Rape Time

Make it happen  :V
Already been done

Although I don't remember the link, there's a vid on youtube of a hacked EoSD extra with Flandre using GRT as the last attack.
Title: Re: Touhou Spellcard Replica Thread
Post by: Drake on November 18, 2009, 01:33:53 AM
Either way it wouldn't be hard. It's just superfast circles of bullets of different types at kind-of-random positions.
Title: Re: Touhou Spellcard Replica Thread
Post by: PeejsterM on November 18, 2009, 02:40:11 AM
How about we get some Chen here?
Shikigami Sign 「Pentagram Flight」
Heaven Sign 「Immortal Sage's Rumbling」
Title: Re: Touhou Spellcard Replica Thread
Post by: Chronojet ⚙ Dragon on November 19, 2009, 03:42:17 PM
Working on some Chen card replications. But meanwhile, let's have a bit of Koishi. (Please improve.)
Code: [Select]
#TouhouDanmakufu
#Title[Ancestor Test]
#Text[This is a description.]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
let BossImage = "script\img\ExRumia.png";
let frame = -120;
let round = 0;
let x = 10;
let a = 0;
let b = 0;
let c = 0;
let num = 20;
let Spell = true;
let Survival = false;
let Final = false;
let CutInGraphic = GetCurrentScriptDirectory~"Cut.png";
function ExMove(length, height) {
if(GetPlayerX < GetX) {
if(GetX - length <= GetClipMinX) { SetMovePosition03(GetX + length, rand(height - 60, height + 60), 10, 6); } else { SetMovePosition03(GetX - length, rand(height - 60, height + 60), 10, 6); }
} else {
if(GetX + length >= GetClipMaxX) { SetMovePosition03(GetX - length, rand(height - 60, height + 60), 10, 6); } else { SetMovePosition03(GetX + length, rand(height - 60, height + 60), 10, 6); }
}
}
@Initialize {
if(Spell) { SetLife(630); SetDamageRate(20, 5); } else { SetLife(2400); SetDamageRate(100, 40); }
SetTimer(120);
if(Survival) { SetDurableSpellCard; }
if(Spell) { if(Final) { SetScore(1000000); } else { SetScore(1200000); } SetEnemyMarker(true); MagicCircle(true);
SetInvincibility(90); CutIn(KOUMA, "表象「夢枕にご先祖総立ち」", CutInGraphic, 0, 0, 182, 222); }
Concentration01(90); if(Final) { SetEffectForZeroLife(120, 255, 1); }
SetX(GetClipMinX-100); SetY(GetCenterY/2); SetMovePosition03(GetCenterX, GetCenterY-80, 9, 10);
LoadGraphic(BossImage);
//AtMain(); //Expert;
}
@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 24);
if(frame > 0 && frame < 120 && frame % 6 == 0) {
ascent(i in 0..15) {
ReflectBullet(GetClipMinX+x, GetClipMaxY, 8, a-90+5, AQUA02, i*2);
ReflectBullet(GetClipMaxX-x, GetClipMaxY, 8, -a-90-5, AQUA02, i*2);
}
x+=15;
a+=1;
}
if(frame > 120 && frame <= 240 && frame % 6 == 0) {
ascent(i in 0..15) {
ReflectBullet(GetClipMinX+x, GetClipMaxY, 8, a-90, AQUA02, i*2);
ReflectBullet(GetClipMaxX-x, GetClipMaxY, 8, -a-90, AQUA02, i*2);
}
x+=15;
a+=1;
}
if(frame > 300 && frame <= 540) {
if(frame % 20 == 0) {
loop(num) {
CreateShot01(GetX, GetY, 5, b, AQUA04, 30);
b+=360/num;
}
b+=3;
}
if(frame % 10 == 0) {
TurnBullet(GetX, GetY, 3, c, AQUA22, 30);
c+=9.25;
}
}
if(frame == 540) { frame = -60; a = 0; x = 10; }
if(x >= 150) { a = 0; x = 10; }
frame++;
yield;
}
let animation = 0;
@DrawLoop {
DrawText("Yuxii", 40, 36, 15, 255);
SetTexture(BossImage);
animation++;if(animation==600){animation=0;}
if(GetSpeedX()==0){if(animation<=300){SetGraphicRect(64,1,127,64);}else if(animation>300&&animation<=600){SetGraphicRect(0,1,63,64);}}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1, 1);
SetRenderState(ALPHA);
SetAlpha(255);
SetColor(255, 255, 255);
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(BossImage);
}
task ReflectBullet(x, y, v, angle, graphic, delay){
let obj = Obj_Create(OBJ_SHOT);
let counter = 0;
Obj_SetPosition(obj, x, y);
Obj_SetAngle(obj, angle);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, delay);
ObjShot_SetBombResist(obj, true);
Obj_SetSpeed(obj, v);

while( !Obj_BeDeleted (obj) ) {
if(counter<=3){
if(Obj_GetX(obj) <= GetClipMinX || Obj_GetX(obj) >= GetClipMaxX) {
Obj_SetAngle(obj, 180-angle);
counter++;
}
if(Obj_GetY(obj) <= GetClipMinY) {
Obj_SetAngle(obj, -angle);
counter++;
}
}
yield;
}
}
task TurnBullet(x, y, v, angle, graphic, delay){
let obj = Obj_Create(OBJ_SHOT);
let counter = 0;
Obj_SetPosition(obj, x, y);
Obj_SetAngle(obj, angle);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, delay);
ObjShot_SetBombResist(obj, true);
Obj_SetSpeed(obj, v);

while( !Obj_BeDeleted (obj) ) {
counter++;
if(counter == 75) {
Obj_SetAngle(obj, atan2(GetPlayerY-Obj_GetY(obj), GetPlayerX-Obj_GetX(obj)));
}
yield;
}
}
}
Also, please disregard "Yuxii". Whatever that is.
EDIT: Made sort of harder.
Title: Re: Touhou Spellcard Replica Thread
Post by: Henry on November 23, 2009, 03:01:51 PM
Working on some Chen card replications. But meanwhile, let's have a bit of Koishi. (Please improve.)
Code: [Select]
#TouhouDanmakufu
#Title[Ancestor Test]
#Text[This is a description.]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
let BossImage = "script\img\ExRumia.png";
let frame = -120;
let round = 0;
let x = 10;
let a = 0;
let b = 0;
let c = 0;
let num = 20;
let Spell = true;
let Survival = false;
let Final = false;
let CutInGraphic = GetCurrentScriptDirectory~"Cut.png";
function ExMove(length, height) {
if(GetPlayerX < GetX) {
if(GetX - length <= GetClipMinX) { SetMovePosition03(GetX + length, rand(height - 60, height + 60), 10, 6); } else { SetMovePosition03(GetX - length, rand(height - 60, height + 60), 10, 6); }
} else {
if(GetX + length >= GetClipMaxX) { SetMovePosition03(GetX - length, rand(height - 60, height + 60), 10, 6); } else { SetMovePosition03(GetX + length, rand(height - 60, height + 60), 10, 6); }
}
}
@Initialize {
if(Spell) { SetLife(630); SetDamageRate(20, 5); } else { SetLife(2400); SetDamageRate(100, 40); }
SetTimer(120);
if(Survival) { SetDurableSpellCard; }
if(Spell) { if(Final) { SetScore(1000000); } else { SetScore(1200000); } SetEnemyMarker(true); MagicCircle(true);
SetInvincibility(90); CutIn(KOUMA, "表象「夢枕にご先祖総立ち」", CutInGraphic, 0, 0, 182, 222); }
Concentration01(90); if(Final) { SetEffectForZeroLife(120, 255, 1); }
SetX(GetClipMinX-100); SetY(GetCenterY/2); SetMovePosition03(GetCenterX, GetCenterY-80, 9, 10);
LoadGraphic(BossImage);
//AtMain(); //Expert;
}
@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 24);
if(frame > 0 && frame < 120 && frame % 6 == 0) {
ascent(i in 0..15) {
ReflectBullet(GetClipMinX+x, GetClipMaxY, 8, a-90+5, AQUA02, i*2);
ReflectBullet(GetClipMaxX-x, GetClipMaxY, 8, -a-90-5, AQUA02, i*2);
}
x+=15;
a+=1;
}
if(frame > 120 && frame <= 240 && frame % 6 == 0) {
ascent(i in 0..15) {
ReflectBullet(GetClipMinX+x, GetClipMaxY, 8, a-90, AQUA02, i*2);
ReflectBullet(GetClipMaxX-x, GetClipMaxY, 8, -a-90, AQUA02, i*2);
}
x+=15;
a+=1;
}
if(frame > 300 && frame <= 540) {
if(frame % 20 == 0) {
loop(num) {
CreateShot01(GetX, GetY, 5, b, AQUA04, 30);
b+=360/num;
}
b+=3;
}
if(frame % 10 == 0) {
TurnBullet(GetX, GetY, 3, c, AQUA22, 30);
c+=9.25;
}
}
if(frame == 540) { frame = -60; a = 0; x = 10; }
if(x >= 150) { a = 0; x = 10; }
frame++;
yield;
}
let animation = 0;
@DrawLoop {
DrawText("Yuxii", 40, 36, 15, 255);
SetTexture(BossImage);
animation++;if(animation==600){animation=0;}
if(GetSpeedX()==0){if(animation<=300){SetGraphicRect(64,1,127,64);}else if(animation>300&&animation<=600){SetGraphicRect(0,1,63,64);}}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1, 1);
SetRenderState(ALPHA);
SetAlpha(255);
SetColor(255, 255, 255);
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(BossImage);
}
task ReflectBullet(x, y, v, angle, graphic, delay){
let obj = Obj_Create(OBJ_SHOT);
let counter = 0;
Obj_SetPosition(obj, x, y);
Obj_SetAngle(obj, angle);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, delay);
ObjShot_SetBombResist(obj, true);
Obj_SetSpeed(obj, v);

while( !Obj_BeDeleted (obj) ) {
if(counter<=3){
if(Obj_GetX(obj) <= GetClipMinX || Obj_GetX(obj) >= GetClipMaxX) {
Obj_SetAngle(obj, 180-angle);
counter++;
}
if(Obj_GetY(obj) <= GetClipMinY) {
Obj_SetAngle(obj, -angle);
counter++;
}
}
yield;
}
}
task TurnBullet(x, y, v, angle, graphic, delay){
let obj = Obj_Create(OBJ_SHOT);
let counter = 0;
Obj_SetPosition(obj, x, y);
Obj_SetAngle(obj, angle);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, delay);
ObjShot_SetBombResist(obj, true);
Obj_SetSpeed(obj, v);

while( !Obj_BeDeleted (obj) ) {
counter++;
if(counter == 75) {
Obj_SetAngle(obj, atan2(GetPlayerY-Obj_GetY(obj), GetPlayerX-Obj_GetX(obj)));
}
yield;
}
}
}
Also, please disregard "Yuxii". Whatever that is.
EDIT: Made sort of harder.
This is simply too hard  :(, still I prefer laser instead of a stream of bullets
Title: Re: Touhou Spellcard Replica Thread
Post by: Stuffman on December 05, 2009, 05:41:53 PM
Hey Always, those scripts use resources that we wouldn't have just by copying them in notepad :V

Also, this thread should primarily be for trying to create exact replicas of touhou spellcards, rather than ones based on them and such.
Title: Re: Touhou Spellcard Replica Thread
Post by: Chronojet ⚙ Dragon on December 05, 2009, 06:17:17 PM
rather than ones based on them and such.
Er, yeah, I should really take another look at Royal Flare. (And update Missing Purple Power)
EDIT: updated MGP.
EDIT: The guy moved that post over my scripts topic, so if you're wondering where the Always Flare is , go to my scripts thread for it.
Title: Re: Touhou Spellcard Replica Thread
Post by: Demonbman on December 09, 2009, 12:21:07 AM
 Magic "Fragrance of Makai Butterfly" (http://www.mediafire.com/?niiwm1mhnmg) Byakuren's 2nd spell card, Normal
Title: Re: Touhou Spellcard Replica Thread
Post by: puremrz on December 12, 2009, 10:00:53 PM
Oh yeah?
Here's Byakuren's last! http://www.youtube.com/watch?v=Hrh1Pnb2yrY
Title: Re: Touhou Spellcard Replica Thread
Post by: Chronojet ⚙ Dragon on December 13, 2009, 12:17:58 AM
eh, I made something like that once, out of Naut's Aya-Satori card. you know, that?
Title: Re: Touhou Spellcard Replica Thread
Post by: Demonbman on December 15, 2009, 04:03:24 AM
Oh yeah?
Here's Byakuren's last! http://www.youtube.com/watch?v=Hrh1Pnb2yrY

.....show off....
Title: Re: Touhou Spellcard Replica Thread
Post by: DgBarca on December 27, 2009, 09:17:06 PM
A special replica
Because it is based on a spell in SWR.
I made it Danmaku form...(!CAUTION! The card is not regular difficulty, it starts hard, become easier, and hard again, reach the timeout phase at your own risk !CAUTION!)

Download link (http://www.mediafire.com/?1fn3zjmgqdq)

Edit : It have a bit too much life but meh. I and also forgot half of the card...in fact in SWR the red wave have to be "activated" by another blue one...but Blah it is not SWR
Title: Re: Touhou Spellcard Replica Thread
Post by: Chronojet ⚙ Dragon on December 28, 2009, 12:30:12 AM
A special replica
Because it is based on a spell in SWR.
I made it Danmaku form...(!CAUTION! The card is not regular difficulty, it starts hard, become easier, and hard again, reach the timeout phase at your own risk !CAUTION!)

Download link (http://www.mediafire.com/?1fn3zjmgqdq)

Edit : It have a bit too much life but meh. I and also forgot half of the card...in fact in SWR the red wave have to be "activated" by another blue one...but Blah it is not SWR

DOPPLER. ARG HOW I HATED THAT ONE. Then I learned to graze. >_< This may be a hell lot easier than from SWR. :|

EDIT: ARG can't find a "enemyanim.dnh" file.

------------------------------------------------------------------------------------------------

EDIT: Please improve my copy of Gengetsu.
Code: [Select]
#TouhouDanmakufu
#Title[RAPEY TIME]
#Text[!!!!]
#Image[]
#BackGround[IceMountain]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
    let frame = -300;
    let BossImage = "script\img\ExRumia.png";
    let CutInGraphic = GetCurrentScriptDirectory~"img\riorucut.png";
    let bossname = "海龍 爾夜知";
    let Spell = 0;
    let SpellName = "夢想画「画幻」";
@Initialize {
SetLife(630); SetDamageRate(15, 0); SetTimer(96);
SetEnemyMarker(true); MagicCircle(true); SetInvincibility(180);
LoadGraphic(BossImage);
CutIn(YOUMU, SpellName, "", 0, 0, 0, 0); SetScore(12000000);
LoadGraphic(BossImage);
TMain;
SetEffectForZeroLife(60, 55, 3); //LastSpell;
SetShotAutoDeleteClip(200, 200, 200, 200); //Slow(3);
}

@MainLoop {
if(OnBomb || GetTimeOfPlayerInvincibility > 0 || GetTimeOfSuperNaturalBorder > 0) { SetTimer(GetTimer+1); }
if(!OnBomb && GetTimeOfPlayerInvincibility == 0 && GetTimeOfSuperNaturalBorder == 0) {
if(Spell <= 1) {
SetCollisionA(GetX, GetY, 36); SetCollisionB(GetX, GetY, 10);
}
yield;
}
}

let animation = 0;
@DrawLoop {
SetFontColor(255, 255, 255, 255, 128, 0);
DrawText(bossname, 40, 36, 12, 255);
SetTexture(BossImage);
animation++; if(animation==600){animation=0;}
if(GetSpeedX()==0){
if(animation<=300){ SetGraphicRect(64,1,127,64); }
else if(animation>300 && animation<=600){ SetGraphicRect(0,1,63,64); }
}
else if(GetSpeedX()>0){SetGraphicRect(192,1,255,64);}
else if(GetSpeedX()<0){SetGraphicRect(128,1,191,64);}
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1, 1);
SetRenderState(ALPHA);
SetAlpha(255);
SetColor(255, 255, 255);
if(!OnBomb) { DrawGraphic(GetX, GetY); }
}

@Finalize {
DeleteGraphic(BossImage);
}

task TMain {
SetMovePosition02(GetCenterX, GetClipMinY+100, 20);
loop(60){yield;}
Concentration01(120); PlaySE("se\se_ch00.wav");
loop(120){yield;}
attack1; attack2; attack3;
}
let xe = 60; let ye = 15;
task attack1 {
let num = 40; let a = 0;
loop {
PlaySE("se\se_tan01.wav");
let x = GetX+rand(-xe,xe); let y = GetY+rand(-ye,ye);
loop(num) { CreateShot01(x, y, 7, a, WHITE02, 10); a+=360/num; }
a+=14;
loop(5) { yield; }
}
}
task attack2 {
let num = 60; let a = 0;
loop {
PlaySE("se\se_tan00.wav");
let x = GetX+rand(-xe,xe); let y = GetY+rand(-ye,ye);
loop(num) { CreateShot01(x, y, 10, a, WHITE01, 10); a+=360/num; }
a-=17;
loop(6){ yield; }
}
}
task attack3 {
let num = 15; let a = 0;
loop {
PlaySE("se\se_tan02.wav");
let x = GetX+rand(-xe,xe); let y = GetY+rand(-ye,ye);
loop(num) { CreateShot01(x, y, 10, a, ORANGE03, 10); a+=360/num; }
a-=103;
loop(90){ yield; }
}
}
}
'cuz right now it doesn't look so much like Gengetsu.
Title: Re: Touhou Spellcard Replica Thread
Post by: DgBarca on December 28, 2009, 11:28:18 AM

EDIT: ARG can't find a "enemyanim.dnh" file.

Oh I forgot it was random fairy shooting all this... juste copy paste it in a enemyanim.dnh file
Code: [Select]
//#include_function "lib\ExpandedShotData\shot_replace.dnh"
let anim = 0;
let enemy = GetCurrentScriptDirectory~"img\enemy.png";
LoadGraphic(enemy);
let enemangle = 0;

sub bluedoll {

SetTexture(enemy);

enemangle+=5;
SetGraphicRect(96, 224, 128, 256);
SetAlpha(100);
SetGraphicAngle(0, 0, enemangle);
SetGraphicScale(1.25,1.25);
DrawGraphic(GetX, GetY);



SetAlpha(255);
SetGraphicAngle(0, 0, enemangle*4);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 5) * 32, 257, (floor(anim) % 5) * 32 +32, 288);




DrawGraphic(GetX, GetY);

SetGraphicRect(192, 224, 224, 256);
SetRenderState(ADD);
SetAlpha(100);
SetGraphicAngle(0, 0, enemangle/2);
SetGraphicScale(1,1);
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub bluefairyanim {

SetTexture(enemy);

enemangle+=5;
SetGraphicRect(64, 224, 96, 256);
SetAlpha(100);
SetGraphicAngle(0, 0, enemangle);
SetGraphicScale(1.25,1.25);
DrawGraphic(GetX, GetY);


if(GetSpeedX <= 0.1 && GetSpeedX >= -0.1){
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 5) * 32, 257, (floor(anim) % 5) * 32 +32, 288);
}

if(GetSpeedX < -0.2){
SetAlpha(255);
SetGraphicAngle(180, 0, 0);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 4) * 32 + 256, 257, (floor(anim) % 4) * 32 + 288, 288);
}else if(GetSpeedX > 0.2){
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 4) * 32 + 256, 257, (floor(anim) % 4) * 32 + 288, 288);
}
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub redfairyanim {

SetTexture(enemy);

enemangle+=5;
SetGraphicRect(0, 224, 32, 256);
SetAlpha(100);
SetGraphicAngle(0, 0, enemangle);
SetGraphicScale(1.25,1.25);
DrawGraphic(GetX, GetY);


if(GetSpeedX < 0.2 && GetSpeedX > -0.2){
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 5) * 32, 289, (floor(anim) % 5) * 32 +32, 320);
}
else{
if(GetSpeedX <= -0.2){
SetAlpha(255);
SetGraphicAngle(180, 0, 0);
SetGraphicScale(1,1);
} else {
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
}
SetGraphicRect((floor(anim)% 4) * 32 + 256, 289, (floor(anim) % 4) * 32 + 288, 320);
}
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub greenfairyanim {

SetTexture(enemy);

enemangle+=5;
SetGraphicRect(32, 224, 64, 256);
SetAlpha(100);
SetGraphicAngle(0, 0, enemangle);
SetGraphicScale(1.25,1.25);
DrawGraphic(GetX, GetY);



if(GetSpeedX < 0.2 && GetSpeedX > -0.2){
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 5) * 32, 321, (floor(anim) % 5) * 32 +32, 352);
}
else{
if(GetSpeedX <= -0.2){
SetAlpha(255);
SetGraphicAngle(180, 0, 0);
SetGraphicScale(1,1);
} else {
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
}
SetGraphicRect((floor(anim)% 4) * 32 + 256, 321, (floor(anim) % 4) * 32 + 288, 352);
}
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub yellowfairyanim {

SetTexture(enemy);

enemangle+=5;
SetGraphicRect(96, 224, 128, 256);
SetAlpha(100);
SetGraphicAngle(0, 0, enemangle);
SetGraphicScale(1.25,1.25);
DrawGraphic(GetX, GetY);



if(GetSpeedX < 0.2 && GetSpeedX > -0.2){
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
SetGraphicRect((floor(anim)% 5) * 32, 353, (floor(anim) % 5) * 32 + 32, 384);
}
else{
if(GetSpeedX <= -0.2){
SetAlpha(255);
SetGraphicAngle(180, 0, 0);
SetGraphicScale(1,1);
} else {
SetAlpha(255);
SetGraphicAngle(0, 0, 0);
SetGraphicScale(1,1);
}
SetGraphicRect((floor(anim)% 4) * 32 + 256, 353, (floor(anim) % 4) * 32 + 288, 384);
}
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub smallredorb {

SetTexture(enemy);

SetGraphicAngle(0, 0, enemangle);
SetGraphicRect(128, 225, 160, 256);
DrawGraphic(GetX, GetY);
enemangle += 10;

SetGraphicAngle(0, 0, 0);
SetGraphicRect(128, 192, 160, 224);
DrawGraphic(GetX, GetY);
}

sub smallgreenorb {

SetTexture(enemy);

SetGraphicAngle(0, 0, enemangle);
SetGraphicRect(161, 225, 192, 256);
DrawGraphic(GetX, GetY);
enemangle += 10;

SetGraphicAngle(0, 0, 0);
SetGraphicRect(161, 192, 192, 224);
DrawGraphic(GetX, GetY);
}

sub smallblueorb {

SetTexture(enemy);

SetGraphicAngle(0, 0, enemangle);
SetGraphicRect(193, 225, 224, 256);
DrawGraphic(GetX, GetY);
enemangle += 10;

SetGraphicAngle(0, 0, 0);
SetGraphicRect(193, 192, 224, 224);
DrawGraphic(GetX, GetY);
}

sub smallpurpleorb {

SetTexture(enemy);

SetGraphicAngle(0, 0, enemangle);
SetGraphicRect(225, 225, 256, 256);
DrawGraphic(GetX, GetY);
enemangle += 10;

SetGraphicAngle(0, 0, 0);
SetGraphicRect(225, 192, 256, 224);
DrawGraphic(GetX, GetY);
}

sub bigfairy {

SetTexture(enemy);

if(GetSpeedX < 0.2 && GetSpeedX > -0.2){
SetGraphicAngle(0, 0, 0);
SetGraphicRect((floor(anim)% 5) * 64, 385, (floor(anim) % 5) * 64 + 64, 448);
}
else{
if(GetSpeedX <= -0.2){
SetGraphicAngle(180, 0, 0);
} else {
SetGraphicAngle(0, 0, 0);
}
if(anim % 4 < 1){
SetGraphicRect(385, 257, 448, 320);
} else if(anim % 4 < 2){
SetGraphicRect(385, 321, 448, 384);
} else if(anim % 4 < 3){
SetGraphicRect(449, 257, 512, 320);
} else {
SetGraphicRect(449, 321, 512, 384);
}
}
SetGraphicScale(1, 1);
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub bigpurplefairy {

SetTexture(enemy);

if(GetSpeedX < 0.2 && GetSpeedX > -0.2){
SetGraphicAngle(0, 0, 0);
SetGraphicRect((floor(anim)% 5) * 64, 0, (floor(anim) % 5) * 64 + 64, 64);
}
else{
if(GetSpeedX <= -0.2){
SetGraphicAngle(180, 0, 0);
} else {
SetGraphicAngle(0, 0, 0);
}

SetGraphicRect((floor(anim)% 4) * 64, 65, (floor(anim) % 4) * 64 + 64, 128);

}
DrawGraphic(GetX, GetY);
anim += 0.08;
}

sub FamCircle{
SetTexture(enemy);

let scaleM = 0.3;
let scaleB = 0.5;
enemangle += 7;

if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD){
SetGraphicAngle(0, 0, -enemangle/2);
SetGraphicRect(96, 224, 128, 256);
SetRenderState(ADD);
SetAlpha(155);
SetGraphicScale((scaleM*3)*2,(scaleM*3)*2);
SetColor(255,255,0);
DrawGraphic(GetX, GetY);

SetGraphicAngle(0, 0, enemangle/2);
SetGraphicRect(0, 128, 64, 192);
SetRenderState(ALPHA);
SetAlpha(255);
SetGraphicScale(scaleB*2,scaleB*2);
DrawGraphic(GetX, GetY);
}

else{ SetGraphicAngle(0, 0, -enemangle);
SetGraphicRect(96, 224, 128, 256);
SetRenderState(ADD);
SetAlpha(155);
SetGraphicScale(scaleM*3,scaleM*3);
SetColor(255,255,0);
DrawGraphic(GetX, GetY);

SetGraphicAngle(0, 0, enemangle);
SetGraphicRect(0, 128, 64, 192);
SetRenderState(ALPHA);
SetAlpha(255);
SetGraphicScale(scaleB,scaleB);
DrawGraphic(GetX, GetY);}

}