Renovated Youmu Opposite sign

added some blasts to youmu haunted, too.
This commit is contained in:
laochailan 2011-11-04 18:54:53 +01:00
parent 9242166daf
commit 3605159528
6 changed files with 346 additions and 97 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
gfx/proj/youhoming.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

224
gfx/proj/youhoming.svg Normal file
View file

@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="youhoming.svg"
inkscape:export-filename="/home/laochailan/src/taisei/gfx/proj/youhoming.png"
inkscape:export-xdpi="140.62"
inkscape:export-ydpi="140.62">
<defs
id="defs4">
<linearGradient
id="linearGradient3876">
<stop
style="stop-color:#212179;stop-opacity:0;"
offset="0"
id="stop3878" />
<stop
style="stop-color:#212179;stop-opacity:1;"
offset="1"
id="stop3880" />
</linearGradient>
<linearGradient
id="linearGradient3868">
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="0"
id="stop3870" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3872" />
</linearGradient>
<linearGradient
id="linearGradient3845">
<stop
style="stop-color:#ff0000;stop-opacity:1;"
offset="0"
id="stop3847" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3849" />
</linearGradient>
<linearGradient
id="linearGradient3815">
<stop
style="stop-color:#212178;stop-opacity:0;"
offset="0"
id="stop3817" />
<stop
id="stop3837"
offset="0.43529412"
style="stop-color:#212178;stop-opacity:0;" />
<stop
style="stop-color:#212178;stop-opacity:0.53947371;"
offset="1"
id="stop3819" />
</linearGradient>
<linearGradient
id="linearGradient3793">
<stop
style="stop-color:#ffffff;stop-opacity:0.19736843;"
offset="0"
id="stop3795" />
<stop
style="stop-color:#ffffff;stop-opacity:0.58333331;"
offset="1"
id="stop3797" />
</linearGradient>
<filter
inkscape:collect="always"
id="filter3781">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.52416725"
id="feGaussianBlur3783" />
</filter>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3815"
id="radialGradient3830"
gradientUnits="userSpaceOnUse"
cx="16"
cy="1036.3622"
fx="16"
fy="1036.3622"
r="14.894653" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3815"
id="radialGradient3832"
gradientUnits="userSpaceOnUse"
cx="16"
cy="1036.3622"
fx="16"
fy="1036.3622"
r="14.894653" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3845"
id="radialGradient3851"
cx="16"
cy="1036.3622"
fx="16"
fy="1036.3622"
r="14.894654"
gradientTransform="translate(0,1.0436959e-6)"
gradientUnits="userSpaceOnUse" />
<filter
inkscape:collect="always"
id="filter3862">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.1490625"
id="feGaussianBlur3864" />
</filter>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3876"
id="radialGradient3882"
cx="18.164211"
cy="17.935711"
fx="18.164211"
fy="17.935711"
r="11.986452"
gradientUnits="userSpaceOnUse" />
<filter
inkscape:collect="always"
id="filter3917">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.2096669"
id="feGaussianBlur3919" />
</filter>
<filter
inkscape:collect="always"
id="filter3923"
x="-0.11474104"
width="1.2294821"
y="-0.11474104"
height="1.2294821">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.0023916"
id="feGaussianBlur3925" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="7.7174076"
inkscape:cx="16"
inkscape:cy="15.39198"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1038"
inkscape:window-x="0"
inkscape:window-y="-1"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1020.3622)"
style="opacity:0.4244898">
<path
style="opacity:0.57894736;fill:#212179;fill-opacity:0.51372758;fill-rule:nonzero;stroke:none;filter:url(#filter3862)"
d="m 16,1.09375 c -1.745056,0 -3.304689,2.2247793 -4.3125,5.65625 C 13.001064,6.1358698 14.454206,5.78125 16,5.78125 c 1.545794,0 2.998936,0.3546198 4.3125,0.96875 C 19.304689,3.3185202 17.745057,1.09375 16,1.09375 z M 6.75,11.6875 C 3.3185322,12.695305 1.09375,14.254891 1.09375,16 c 0,1.744994 2.2247822,3.304716 5.65625,4.3125 C 6.1358698,18.998936 5.78125,17.545794 5.78125,16 c 0,-1.545794 0.3546198,-2.998936 0.96875,-4.3125 z m 18.5,0 c 0.61413,1.313564 0.96875,2.766706 0.96875,4.3125 0,1.545794 -0.35462,2.998936 -0.96875,4.3125 3.431468,-1.007784 5.65625,-2.567506 5.65625,-4.3125 0,-1.745109 -2.224782,-3.304695 -5.65625,-4.3125 z M 11.6875,25.25 c 1.007811,3.43148 2.567444,5.65625 4.3125,5.65625 1.745057,0 3.304689,-2.22477 4.3125,-5.65625 -1.313564,0.61413 -2.766706,0.96875 -4.3125,0.96875 -1.545794,0 -2.998936,-0.35462 -4.3125,-0.96875 z"
id="path3787"
transform="matrix(0.82172949,0,0,0.82172949,2.8523281,1023.2145)"
inkscape:connector-curvature="0" />
<path
transform="matrix(1.1948373,0,0,1.1948373,-5.7032772,1014.9319)"
d="m 28.647556,17.935711 a 10.483345,10.483345 0 1 1 -20.9666898,0 10.483345,10.483345 0 1 1 20.9666898,0 z"
sodipodi:ry="10.483345"
sodipodi:rx="10.483345"
sodipodi:cy="17.935711"
sodipodi:cx="18.164211"
id="path3755"
style="fill:url(#radialGradient3882);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3781);opacity:0.57894736999999996"
sodipodi:type="arc" />
<path
transform="matrix(0.74205398,0,0,0.74205398,2.5211749,1023.0529)"
d="m 28.647556,17.935711 a 10.483345,10.483345 0 1 1 -20.9666898,0 10.483345,10.483345 0 1 1 20.9666898,0 z"
sodipodi:ry="10.483345"
sodipodi:rx="10.483345"
sodipodi:cy="17.935711"
sodipodi:cx="18.164211"
id="path3921"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3923)"
sodipodi:type="arc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View file

@ -65,7 +65,8 @@ void draw_enemies(Enemy *enemies) {
Enemy *e;
for(e = enemies; e; e = e->next)
e->draw_rule(e, global.frames - e->birthtime);
if(e->draw_rule)
e->draw_rule(e, global.frames - e->birthtime);
}
void Fairy(Enemy *e, int t) {

View file

@ -12,33 +12,7 @@
/* Youmu */
void YoumuOppositeMyon(Enemy *e, int t) {
complex pos = e->pos + global.plr.pos;
create_particle2c("flare", pos, NULL, Shrink, timeout, 10, -e->pos+10I);
}
int youmu_opposite_myon(Enemy *e, int t) {
if(t < 0)
return 1;
Player *plr = &global.plr;
if(plr->focus < 15) {
e->args[2] = carg(plr->pos - e->pos0);
e->pos = e->pos0 - plr->pos;
if(cabs(e->pos) > 30)
e->pos -= 5*cexp(I*carg(e->pos));
}
if(plr->fire && !(global.frames % 6))
create_projectile1c("youmu", e->pos + plr->pos, NULL, linear, -21*cexp(I*e->args[2]))->type = PlrProj;
e->pos0 = e->pos + plr->pos;
return 1;
}
// Haunting Sign
int youmu_homing(Projectile *p, int t) { // a[0]: velocity, a[1]: target
if(t == EVENT_DEATH) {
@ -48,7 +22,7 @@ int youmu_homing(Projectile *p, int t) { // a[0]: velocity, a[1]: target
Enemy *target;
if((target = REF(p->args[1]))) {
p->args[0] += 0.15*cexp(I*carg(target->pos - p->pos));
p->args[0] += 0.2*cexp(I*carg(target->pos - p->pos));
} else {
free_ref(p->args[1]);
@ -68,63 +42,11 @@ int youmu_homing(Projectile *p, int t) { // a[0]: velocity, a[1]: target
return 1;
}
void youmu_shot(Player *plr) {
if(plr->fire) {
if(!(global.frames % 6)) {
create_projectile1c("youmu", plr->pos + 10 - I*20, NULL, linear, -20I)->type = PlrProj;
create_projectile1c("youmu", plr->pos - 10 - I*20, NULL, linear, -20I)->type = PlrProj;
}
if(plr->shot == YoumuHoming) {
if(plr->focus && !(global.frames % 12-(int)plr->power)*1.5) {
int ref = -1;
if(global.boss != NULL)
ref = add_ref(global.boss);
else if(global.enemies != NULL)
ref = add_ref(global.enemies);
if(ref == -1)
ref = add_ref(NULL);
create_projectile2c("hghost", plr->pos, NULL, youmu_homing, 5*cexp(I*sin(global.frames/10.0))/I, ref)->type = PlrProj;
create_projectile2c("hghost", plr->pos, NULL, youmu_homing, 5*cexp(I*-sin(global.frames/10.0))/I, ref)->type = PlrProj;
}
if(!plr->focus && !(global.frames % 8-(int)plr->power)) {
float arg = -M_PI/2;
if(global.enemies)
arg = carg(global.enemies->pos - plr->pos);
if(global.boss)
arg = carg(global.boss->pos - plr->pos);
create_projectile2c("hghost", plr->pos, NULL, accelerated, 10*cexp((arg-0.2)*I), 0.4*cexp((arg-0.2)*I))->type = PlrProj;
create_projectile2c("hghost", plr->pos, NULL, accelerated, 10*cexp(arg*I), 0.4*cexp(arg*I))->type = PlrProj;
create_projectile2c("hghost", plr->pos, NULL, accelerated, 10*cexp((arg+0.2)*I), 0.4*cexp((arg+0.2)*I))->type = PlrProj;
}
}
}
if(plr->shot == YoumuOpposite && plr->slaves == NULL)
create_enemy_p(&plr->slaves, plr->pos, ENEMY_IMMUNE, YoumuOppositeMyon, youmu_opposite_myon, 0, 0, 0, 0);
}
int petal_gravity(Projectile *p, int t) {
if(t < 0)
return 1;
complex d = VIEWPORT_W/2.0 + VIEWPORT_H/2.0*I - p->pos;
if(t < 230)
p->args[0] += 5000/pow(cabs(d),2)*cexp(I*carg(d));
p->pos += p->args[0];
return 1;
}
void Slice(Projectile *p, int t) {
if(t < creal(p->args[0])/20.0)
p->args[1] += 1;
if(t > creal(p->args[0])/20.0*19) {
if(t > creal(p->args[0])-10) {
p->args[1] += 3;
p->args[2] += 1;
}
@ -160,9 +82,12 @@ void YoumuSlash(Enemy *e, int t) {
int spin(Projectile *p, int t) {
int i = timeout_linear(p, t);
p->args[2] += 0.06;
p->angle = p->args[2];
if(t < 0)
return 1;
p->args[3] += 0.06;
p->angle = p->args[3];
return i;
}
@ -174,27 +99,125 @@ int youmu_slash(Enemy *e, int t) {
TIMER(&t);
FROM_TO(0, 30, 10) {
AT(0)
global.plr.pos = VIEWPORT_W/5.0 + (VIEWPORT_H - 100)*I;
FROM_TO(8,20,1)
global.plr.pos = VIEWPORT_W + (VIEWPORT_H - 100)*I - exp(-_i/8.0+log(4*VIEWPORT_W/5.0));
FROM_TO(30, 60, 10) {
create_particle1c("youmu_slice", VIEWPORT_W/2.0 - 150 + 100*_i + VIEWPORT_H/2.0*I - 10-10I + 20*frand()+20I*frand(), NULL, Slice, timeout, 200)->angle = -10.0+20.0*frand();
}
if(t < creal(e->args[0])-50 && frand() > 0.2)
create_particle3c("smoke", VIEWPORT_W*frand() + (VIEWPORT_H+100)*I, rgba(0.4,0.4,0.4,0.4+frand()*0.2), PartDraw, spin, 300, -6I+frand()*1I, frand());
FROM_TO(40,200,1)
if(frand() > 0.7)
create_particle2c("blast", VIEWPORT_W*frand() + (VIEWPORT_H+50)*I, rgb(frand(),frand(),frand()), Shrink, timeout_linear, 80, 3*(1-2.0*frand())-14I+frand()*2I);
int tpar = 30;
if(t < 30)
tpar = t;
if(t < creal(e->args[0])-60 && frand() > 0.2) {
create_particle2c("smoke", VIEWPORT_W*frand() + (VIEWPORT_H+100)*I, rgba(0.4,0.4,0.4,frand()*0.2 - 0.2 + 0.6*(tpar/30.0)), PartDraw, spin, 300, -7I+frand()*1I);
}
return 1;
}
void youmu_bomb(Player *plr) {
int i;
switch(plr->shot) {
case YoumuOpposite:
for(i = 0; i < 40; i++) {
complex pos = VIEWPORT_W*frand() + VIEWPORT_H*frand()*I;
complex d = VIEWPORT_W/2.0+VIEWPORT_H/2.0*I - pos;
create_particle4c("petal", pos, rgba(1,1,1,0.5) , Petal, petal_gravity, 5*I*cexp(I*carg(d)), 0, frand() + frand()*I, frand() + 360I*frand());
// Opposite Sign
void YoumuOppositeMyon(Enemy *e, int t) {
complex pos = e->pos;
create_particle2c("flare", pos, NULL, Shrink, timeout, 10, -e->pos+10I);
}
int youmu_opposite_myon(Enemy *e, int t) {
if(t == EVENT_BIRTH)
e->pos = e->pos0 + global.plr.pos;
if(t < 0)
return 1;
Player *plr = &global.plr;
float arg = carg(e->pos0);
float rad = cabs(e->pos0);
if(plr->focus < 15)
arg -= (carg(e->pos0)-carg(e->pos-plr->pos))*2;
e->pos0 = rad*cexp(I*arg);
e->pos = e->pos0 + plr->pos;
if(plr->fire && !(global.frames % 6))
create_projectile1c("hghost", e->pos, NULL, linear, -21*cexp(I*carg(-e->pos0)))->type = PlrProj;
return 1;
}
int youmu_split(Enemy *e, int t) {
if(t < 0)
return 1;
if(t > creal(e->args[0]))
return ACTION_DESTROY;
TIMER(&t);
FROM_TO(30,260,1) {
create_particle2c("smoke", VIEWPORT_W/2 + VIEWPORT_H/2*I, rgba(0.4,0.4,0.4,frand()*0.2+0.4), PartDraw, spin, 300, 6*cexp(I*frand()*2*M_PI));
}
FROM_TO(100,220,10) {
create_particle1c("youmu_slice", VIEWPORT_W/2.0 + VIEWPORT_H/2.0*I - 200-200I + 400*frand()+400I*frand(), NULL, Slice, timeout, 100-_i)->angle = 360.0*frand();
}
float talt = atan((t-e->args[0]/2)/30.0)*10+atan(-e->args[0]/2);
global.plr.pos = VIEWPORT_W/2.0 + (VIEWPORT_H-80)*I + VIEWPORT_W/3.0*sin(talt);
return 1;
}
// Youmu Generic
void youmu_shot(Player *plr) {
if(plr->fire) {
if(!(global.frames % 6)) {
create_projectile1c("youmu", plr->pos + 10 - I*20, NULL, linear, -20I)->type = PlrProj;
create_projectile1c("youmu", plr->pos - 10 - I*20, NULL, linear, -20I)->type = PlrProj;
}
if(plr->shot == YoumuHoming) {
if(plr->focus && !(global.frames % 45)) {
int ref = -1;
if(global.boss != NULL)
ref = add_ref(global.boss);
else if(global.enemies != NULL)
ref = add_ref(global.enemies);
if(ref == -1)
ref = add_ref(NULL);
create_projectile2c("youhoming", plr->pos, NULL, youmu_homing, -3I, ref)->type = PlrProj;
}
if(!plr->focus && !(global.frames % 8-(int)plr->power)) {
create_projectile2c("hghost", plr->pos, NULL, accelerated, 2-10I, -0.4I)->type = PlrProj;
create_projectile2c("hghost", plr->pos, NULL, accelerated, -10I, -0.4I)->type = PlrProj;
create_projectile2c("hghost", plr->pos, NULL, accelerated, -2-10I, -0.4I)->type = PlrProj;
}
}
}
if(plr->shot == YoumuOpposite && plr->slaves == NULL)
create_enemy_p(&plr->slaves, 40I, ENEMY_IMMUNE, YoumuOppositeMyon, youmu_opposite_myon, 0, 0, 0, 0);
}
void youmu_bomb(Player *plr) {
switch(plr->shot) {
case YoumuOpposite:
create_enemy_p(&plr->slaves, 40I, ENEMY_BOMB, NULL, youmu_split, 280,0,0,0);
break;
case YoumuHoming:
plr->pos = VIEWPORT_W/2.0 + (VIEWPORT_H - 80)*I;
create_enemy_p(&plr->slaves, 40I, ENEMY_BOMB, YoumuSlash, youmu_slash, 280,0,0,0);
break;
}

View file

@ -28,4 +28,5 @@ void youmu_power(Player *plr, float npow);
void marisa_shot(Player *plr);
void marisa_bomb(Player *plr);
void marisa_power(Player *plr, float npow);
#endif