What causes the Spawned NPC Ally to stick to the Player at ALL TIME !!!!!?

Bruce

Active member
Hello everyone,
I've been having so much problem with spawning an NPC Ally.
I have so spent so much time with trials and errors and still don't understand why it is not working :-(
So far the only thing that works for me is
Code:
Summonframe / Spawnframe
subentity
but I can not bind it to the player.

Lately I have found Bloodbane's Spawn and Bind script which makes easier for me to use the bind number to send the commands to the NPC Ally.
There is a spawn01 function within Bloodbane's Spawn and Bind script. I believe the others have been using this spawn01 function too.
I've been using this script for non-NPC Allies and they are working fine, but somehow I've been having so much trouble spawning an NPC Ally with it.
The spawn01/02 functions are the issues that I am having with because I had this kind of problems with it before whenever spawning an NPC Ally, so I ended up using the Summonframe instead.

Now I need to use this spawn01/02 functions for binding. I need to understand more about these functions, not just copy and paste.
Therefore I hope you guys can help me clear out some of my questions and I would be greatly appreciated for your time and help.
Anyway, can you guys take a look at the code and see what I am doing wrong?
Thank you so much.


NPC Ally:
Code:
name                SummonHelper
type                npc
subtype             follow
lifespan            90
nolife              1
hostile             enemy
candamage           enemy obstacle
speed               10
running             25 1 1 5 1
turndelay           0  3   
bounce              1
noquake             1
#shadow 3
gfxshadow 1 3
flash               flash
bflash              guard
dust                dust01
nodieblink          1
falldie             2

animationscript        data/scripts/drago.c
        
anim    idle
    range 60 800
    loop    1           
    offset    184 271
    bbox 0 0 0 0
    delay    5
    frame    data/chars/players/Summons/SummonHelper/idle01.gif
    frame   data/chars/players/Summons/SummonHelper/idle02.gif
    frame   data/chars/players/Summons/SummonHelper/idle01.gif

anim    walk
    loop   1
    offset    184 271
    bbox    0 0 0 0
    delay   8
    frame   data/chars/players/Summons/SummonHelper/Walk01.gif
    frame   data/chars/players/Summons/SummonHelper/Walk02.gif
    frame   data/chars/players/Summons/SummonHelper/Walk03.gif
    frame   data/chars/players/Summons/SummonHelper/Walk04.gif
    frame   data/chars/players/Summons/SummonHelper/Walk05.gif
    frame   data/chars/players/Summons/SummonHelper/Walk06.gif
    frame   data/chars/players/Summons/SummonHelper/Walk07.gif

anim    run
    range 0 700
    loop   1
    offset    184 271
    bbox    0 0 0 0
    delay   6
    frame   data/chars/players/Summons/SummonHelper/Walk01.gif
    frame   data/chars/players/Summons/SummonHelper/Walk02.gif
    frame   data/chars/players/Summons/SummonHelper/Walk03.gif
    frame   data/chars/players/Summons/SummonHelper/Walk04.gif
    frame   data/chars/players/Summons/SummonHelper/Walk05.gif
    frame   data/chars/players/Summons/SummonHelper/Walk06.gif
    frame   data/chars/players/Summons/SummonHelper/Walk07.gif
    
anim    attack1
    range 0 70
    fastattack  1
    loop    0
    offset    184 271
    bbox 0 0 0 0
    delay   5       
    frame   data/chars/players/Summons/SummonHelper/SKill1_01.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_02.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_03.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_04.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_05.gif
    attack1 187 166 113 84 3 0 0 0 20 15
    delay    5
    frame   data/chars/players/Summons/SummonHelper/SKill1_05.gif
    delay    5
    frame   data/chars/players/Summons/SummonHelper/SKill1_06.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_07.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_08.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_09.gif
    frame   data/chars/players/Summons/SummonHelper/SKill1_10.gif
    
# Skill 1
anim    freespecial1
    fastattack  1
    loop    0
    offset    184 271
    bbox 0 0 0 0
    delay   8
    frame   data/chars/players/Summons/SummonHelper/SKill2_01.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_02.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_03.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_04.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_05.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_06.gif
    @cmd    projectile 1 "AcidSpits" 30 0 60  # X Z Y
    frame   data/chars/players/Summons/SummonHelper/SKill2_07.gif

# Skill 2   
anim    freespecial2
    fastattack  1
    loop    0
    offset    184 271
    bbox 0 0 0 0
    delay   10
    frame   data/chars/players/Summons/SummonHelper/SKill2_01.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_02.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_03.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_04.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_05.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_06.gif
    @cmd    projectile 1 "AcidSpits" 30 0 60  # X Z Y
    frame   data/chars/players/Summons/SummonHelper/SKill2_07.gif
    delay   5
    frame   data/chars/players/Summons/SummonHelper/SKill2_01.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_02.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_03.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_04.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_05.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_06.gif
    @cmd    projectile 1 "AcidSpits" 30 0 60  # X Z Y
    frame   data/chars/players/Summons/SummonHelper/SKill2_07.gif
    delay   5
    frame   data/chars/players/Summons/SummonHelper/SKill2_01.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_02.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_03.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_04.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_05.gif
    frame   data/chars/players/Summons/SummonHelper/SKill2_06.gif
    @cmd    projectile 1 "AcidSpits" 30 0 60  # X Z Y
    frame   data/chars/players/Summons/SummonHelper/SKill2_07.gif
    delay    10
    frame   data/chars/players/Summons/SummonHelper/SKill2_07.gif
    delay    5
    frame   data/chars/players/Summons/SummonHelper/SKill2_08.gif

# Teleport to the player   
anim    freespecial3
    fastattack  1
    loop    0
    offset    184 271
    bbox 0 0 0 0
    @cmd    projectile 1 "Teleport" 0 0 100  # X Z Y
    delay   5
    frame    data/chars/players/Summons/SummonHelper/idle01.gif
    
anim    turn
    loop   0
    offset    184 271
    bbox    0 0 0 0
    delay   5
    frame   data/chars/players/Summons/SummonHelper/Walk01.gif
    frame   data/chars/players/Summons/SummonHelper/Walk02.gif
    frame   data/chars/players/Summons/SummonHelper/Walk03.gif
    frame   data/chars/players/Summons/SummonHelper/Walk04.gif
    frame   data/chars/players/Summons/SummonHelper/Walk05.gif
    frame   data/chars/players/Summons/SummonHelper/Walk06.gif
    frame   data/chars/players/Summons/SummonHelper/Walk07.gif

anim    death
    loop    0
    offset    480 954
    delay    5
    sound   data/chars/players/Summons/SummonHelper/die1.wav
    frame    data/chars/players/Summons/Appear01.gif
    frame    data/chars/players/Summons/Appear02.gif
    frame    data/chars/players/Summons/Appear03.gif
    frame    data/chars/players/Summons/Appear04.gif
    frame    data/chars/players/Summons/Appear05.gif

    @cmd    killentity getlocalvar("self")
    delay    5
    frame    data/chars/misc/empty.gif
    frame    data/chars/misc/empty.gif
    
anim    fall
    loop    0
    offset    184 271
    landframe    2
    delay    2
    bbox    0 0 0 0
    frame    data/chars/players/Summons/SummonHelper/fall01.gif
    delay    999
    frame    data/chars/players/Summons/SummonHelper/fall01.gif
    delay    1
    frame    data/chars/players/Summons/SummonHelper/fall02.gif   
    
anim    rise
    loop    0
    offset    184 271
    delay    55
    frame    data/chars/players/Summons/SummonHelper/fall02.gif
    delay    20
    frame    data/chars/players/Summons/SummonHelper/rise01.gif
    delay    14
    frame    data/chars/players/Summons/SummonHelper/fall02.gif
    delay    10
    frame    data/chars/players/Summons/SummonHelper/rise01.gif
    frame    data/chars/players/Summons/SummonHelper/rise02.gif

Player:
Code:
# Summon "SummonHelper"
anim    freespecial11
    fastattack    1
    hitfx    data/sounds/beat3.wav
    loop    0
    offset    303 400
    bbox    0 0 0 0     
    @script
        if(frame == 4){     
            SummonAndBind3("SummonHelper", 20, 20, 20, 10); // "Entity" X Y Z Bind#       
         }
    @end_script       
    sound    data/chars/players/auron/summoning01s.wav
    delay 4         
    frame    data/chars/players/auron/summon01.gif
    frame    data/chars/players/auron/summon02.gif
    frame    data/chars/players/auron/summon03.gif
    frame    data/chars/players/auron/summon04.gif
    delay 3
    @cmd    projectile 1 "dust03" 0 0 0
    frame    data/chars/players/auron/land01.gif   
    
# SummonHelper Skill 1 (2 Acid Spits)
anim    freespecial12
    fastattack    1
    hitfx    data/sounds/beat3.wav
    loop    0
    offset    303 400
    bbox     252 219 89 181
    sound    data/chars/players/auron/summon02.wav
    delay     2
    frame    data/chars/players/auron/Provoke01.gif
    frame    data/chars/players/auron/Provoke02.gif
    frame    data/chars/players/auron/Provoke03.gif
    @cmd    CastSummonSkill 10 "ANI_freespecial1"  # BindNumber "Summon_Skill"
    delay     2
    frame    data/chars/players/auron/land01.gif   
    
# SummonHelper Skill 2 (3 Acid Spits)
anim    freespecial13
    fastattack    1
    hitfx    data/sounds/beat3.wav
    loop    0
    offset    303 400
    bbox     252 219 89 181
    sound    data/chars/players/auron/summon02.wav
    delay     2
    frame    data/chars/players/auron/Provoke01.gif
    frame    data/chars/players/auron/Provoke02.gif
    frame    data/chars/players/auron/Provoke03.gif
    @cmd    CastSummonSkill 10 "ANI_freespecial2"
    delay     2
    frame    data/chars/players/auron/land01.gif   
    
# SummonHelper Skill 3 (teleports to player)
anim    freespecial14
    fastattack    1
    hitfx    data/sounds/beat3.wav
    loop    0
    offset    303 400
    bbox     252 219 89 181
    sound    data/chars/players/auron/summon02.wav
    delay     2
    frame    data/chars/players/auron/Provoke01.gif
    frame    data/chars/players/auron/Provoke02.gif
    frame    data/chars/players/auron/Provoke03.gif
    @cmd    CastSummonSkill 10 "ANI_freespecial3"
    delay    2
    frame    data/chars/players/auron/land01.gif


scripts:
I thought I understood what's written in the scripts, but then they don't work like I expected :-(

Code:
//By Bloodbane
void SummonAndBind(void EntityName, float dx, float dy, float dz, int EntityBindNum)
{ // Spawn entity, store it and bind it
    void self = getlocalvar("self");
    void Spawn;
    Spawn = spawn01(EntityName, dx, dy, 0);
    setentityvar(self, EntityBindNum, Spawn); // Store spawned entity to be killed later
    bindentity(Spawn, self, dx, dz, dy, 0, 0, 1); // Bind spawned entity
}
Code:
void spawn01(void EntityName, float fX, float fY, float fZ)
{
    //spawn01 (Generic spawner)
    //Damon Vaughn Caskey
    //07/06/2007
    //
    //Spawns entity next to caller.
    //
    //EntityName: Model name of entity to be spawned in.
    //fX: X location adjustment.
    //fY: Z location adjustment.
    //fZ: Y location adjustment.

    void self = getlocalvar("self"); //Get calling entity.
    void vSpawn; //Spawn object.
    int  iDirection = getentityproperty(self, "direction");

    clearspawnentry(); //Clear current spawn entry.
      setspawnentry("name", EntityName); //Acquire spawn entity by name.

    if (iDirection == 0){ //Is entity facing left?                 
          fX = -fX; //Reverse X direction to match facing.
    }

      fX = fX + getentityproperty(self, "x"); //Get X location and add adjustment.
      fY = fY + getentityproperty(self, "a"); //Get Y location and add adjustment.
      fZ = fZ + getentityproperty(self, "z"); //Get Z location and add adjustment.
    
    vSpawn = spawn(); //Spawn in entity.

    changeentityproperty(vSpawn, "position", fX, fZ, fY); //Set spawn location.
    changeentityproperty(vSpawn, "direction", iDirection); //Set direction.
    
    return vSpawn; //Return spawn.
}

void spawn02(void EntityName, float fX, float fY, float fZ)
{
    //spawn02 (Generic spawner)
    //
    //Spawns entity in a position not relative to caller.
    //
    //EntityName: Model name of entity to be spawned in.
    //fX: X location adjustment.
    //fY: Z location adjustment.
    //fZ: Y location adjustment.
    void vSpawn; //Spawn object.

    clearspawnentry(); //Clear current spawn entry.
    setspawnentry("name", EntityName); //Acquire spawn entity by name.

    
    vSpawn = spawn(); //Spawn in entity.
    changeentityproperty(vSpawn, "position", fX, fZ, fY); //Set spawn location.
    
    return vSpawn; //Return spawn.
}
 
Solution
If you only need to link spawned NPC and set it as child, you don't need to bind it. You can use this modified function:
C:
//By Bloodbane
void SummonAndLink(void EntityName, float dx, float dy, float dz, int EntityNum)
{ // Spawn entity, store it and set it as child
    void self = getlocalvar("self");
    void Spawn;

    Spawn = spawn01(EntityName, dx, dy, dz);
    setentityvar(self, EntityNum, Spawn); // Store spawned entity to be killed later
   changeentityproperty(Spawn, "parent", self);
}
I can send the commands to the NPC Ally no problem, but the NPC Ally always sticks to the player at all time meaning
it never leaves the player at anytime (the NPC ally and player move, jump together) whether there are enemies are or not.
 
If you only need to link spawned NPC and set it as child, you don't need to bind it. You can use this modified function:
C:
//By Bloodbane
void SummonAndLink(void EntityName, float dx, float dy, float dz, int EntityNum)
{ // Spawn entity, store it and set it as child
    void self = getlocalvar("self");
    void Spawn;

    Spawn = spawn01(EntityName, dx, dy, dz);
    setentityvar(self, EntityNum, Spawn); // Store spawned entity to be killed later
   changeentityproperty(Spawn, "parent", self);
}
 
Solution
If you only need to link spawned NPC and set it as child, you don't need to bind it. You can use this modified function:
C:
//By Bloodbane
void SummonAndLink(void EntityName, float dx, float dy, float dz, int EntityNum)
{ // Spawn entity, store it and set it as child
    void self = getlocalvar("self");
    void Spawn;

    Spawn = spawn01(EntityName, dx, dy, dz);
    setentityvar(self, EntityNum, Spawn); // Store spawned entity to be killed later
   changeentityproperty(Spawn, "parent", self);
}
Look like you are the only one who can help me.....and I really appreciate for your time and help!
I read more about SpawnAndBind script on this forum, now I understand it better.
This script is used to bind something such as weapons to the player's animation/frame.
I am learning something new everyday!

Now the NPC Ally is running around and attacking the enemies as expected.
However, now it does not listen to my commands unless when it gets closer to the enemies and attacking.
Even then, it only listens to my commands sometimes and it always executes the skill (freespecial_) 2 times for each command.
Somehow it is busy doing something and tends to ignore my commands. It is like whatever it is doing overrides my commands....
This is so strange! I even changed all the freespecial_ to follow_, same results.
 
I changed the castskill script from
Code:
from

changeentityproperty(SpawnedEntity, "animation", openborconstant(Ani));

to this

performattack(SpawnedEntity, openborconstant(Ani));

The NPC Ally listens to my commands now, but somehow it is still executing the skill (freespecial_) 2-3 times for each command.
No clue why it is doing this...

Edit:
Sorry actually what I meant was the player triggers the skill 2 times before the NPC Ally listens to the command, then it executes the command 1 time.
Basically, I press the button 1 time, the player triggers it 2 times, then the NPC Ally executes it 1 time.

Edit2:
I got it working now.
Code:
    delay     2
    frame    data/chars/players/auron/Provoke01.gif
    frame    data/chars/players/auron/Provoke02.gif
    frame    data/chars/players/auron/Provoke03.gif
    @cmd    CastSummonSkill 10 "ANI_freespecial2"
    delay     2
    frame    data/chars/players/auron/land01.gif
As you can see that the delays are too short. I changed them from delay 2 to 5 and it is working well now.
Thank you so much for your help!
 
Last edited:
If you only need to link spawned NPC and set it as child, you don't need to bind it. You can use this modified function:
C:
//By Bloodbane
void SummonAndLink(void EntityName, float dx, float dy, float dz, int EntityNum)
{ // Spawn entity, store it and set it as child
    void self = getlocalvar("self");
    void Spawn;

    Spawn = spawn01(EntityName, dx, dy, dz);
    setentityvar(self, EntityNum, Spawn); // Store spawned entity to be killed later
   changeentityproperty(Spawn, "parent", self);
}
Sorry for more questions,
do you know if I can use this script to spawn different entities with different Entity numbers one after another on the screen
or spawn it in 1 freespecial then terminate in another freespecial in the stage?
I seem to have a problem with spawning a raging demon background entity with this.
What I have done so far:
I spawn the raging demon background entity (high setlayer value) in freespecial1, then use the
performattack function to move on to freespecial2, and so on.
After that, in freespecial4 I use killboundentity function to terminate the raging demon background entity.
It is working fine in the training stage.
However, it gets terminated right after freespecial2 in other stages such Arcade.
I've looked and looked but could not figure out what causes this problem. It does not make any sense at all
Any ideas? Thank you very much
 
You can spawn multiple entities with this function by declaring it multiple times like this:
Code:
 @cmd    SummonAndLink "Ent1" 0 0 0 1
 @cmd    SummonAndLink "Ent2" 0 0 0 2
 @cmd    SummonAndLink "Ent3" 0 0 0 3

So no need to change animations just to spawn an entity per animation.

However, it gets terminated right after freespecial2 in other stages such Arcade.

What makes you think it gets terminated right away? maybe it was spawned offscreen and you can't see it.
 
You can spawn multiple entities with this function by declaring it multiple times like this:
Code:
 @cmd    SummonAndLink "Ent1" 0 0 0 1
 @cmd    SummonAndLink "Ent2" 0 0 0 2
 @cmd    SummonAndLink "Ent3" 0 0 0 3

So no need to change animations just to spawn an entity per animation.



What makes you think it gets terminated right away? maybe it was spawned offscreen and you can't see it.
oh I already knew how to do that. I was wondering if it would affect anything.

What makes you think it gets terminated right away? maybe it was spawned offscreen and you can't see it.
I can see it during the freespecial1 animation, but after the next animation which is freespecial2,
this is when I can not see it anymore in the Arcade mode.

If I am in the training mode, it is working fine.

Code:
Code:
anim    freespecial1
....
....
    @cmd    SpawnByScreenResAndLink "RagingDemonBackground" 480 0 272 5
    ....
    @cmd     NextSkill "ANI_freespecial2"
    delay 5
    frame    data/chars/players/auron/land01.gif       
    
anim    freespecial2    <---- this is when I can't see it anymore
....
....
....

Like you said, it is probably under another panel layer, but then it doesn't make sense that why would it even show up in freepecial1 animation?

Thank you
 
I'm not sure why this could happen. Have you tried any of these:
1. Running these in different levels other than training and arcade. Just to see if this happens elsewhere.
2. Merging FREESPECIALs into one. No need to change animation.
 
I'm not sure why this could happen. Have you tried any of these:
1. Running these in different levels other than training and arcade. Just to see if this happens elsewhere.
2. Merging FREESPECIALs into one. No need to change animation.
I moved the @cmd SpawnByScreenResAndLink "RagingDemonBackground" 480 0 272 5 function to the freespecial2 and it is working fine now.
I had the
summonframe
subentity Super
in the freespecial1
maybe this is causing the conflict with the SpawnByScreenResAndLink function, but it does not make sense why.
I remember I had this same problem before - that after I spawned the ally summon with SummonAndLink function,
this
summonframe
subentity Super

did not show up. This "Super" entity is the type text with noskip subtype
Somehow it is related with this summonframe function, it is so weird....


I am almost done with Raging Demon skill. I was trying to make it look like Street Fighter V, but it did not even come close lol because it's involved in
modifying the frames and I don't have too much time for that, but it is not so bad. I will post here when I am done.
I am still trying to figure out how to spawn the background entity with type text and noskip subtype
along with other entities such as texts (raging demon) on the screen at the same time.
However, when I spawned this background entity, it froze everything including the raging demon texts.
Well, it did what it was supposed to do.
I just can't figure out a way to
freeze everything while spawning this background entity and the raging demon texts at the same time.

Thank you
 
Last edited:
I just can't figure out a way to
freeze everything while spawning this background entity and the raging demon texts at the same time.

Well, the solution is just as what you've typed there, which is freeze everything except background entity and the texts.
This is how I made upgrade screen for Fruits Survivors. When it appears, everything else including player character are frozen except upgrade screen entities.
This is the script for that:
C:
    void self = getlocalvar("self");
    void vEntity; //Target entity placeholder.
    int iEntity; //Entity enumeration holder.
    int iName; //Entity name.
    int iMax = openborvariant("count_entities"); //Entity count.
    int eTime = openborvariant("elapsed_time");

    //Enumerate and loop through entity collection.
    for(iEntity=0; iEntity<iMax; iEntity++){ 
      vEntity = getentity(iEntity); //Get target entity from current loop.
      iName = getentityproperty(vEntity, "defaultname"); //Get target name

      if(iName != "PauserC" && iName != "PausC" && iName != "Card" && iName != "Cursor"){
        changeentityproperty(vEntity, "frozen", 1);
        changeentityproperty(vEntity, "freezetime", eTime + 800800);
      }
    }

PauserC, PausC, Card and Cursor are entities excluded from freezing. This script is run by PausC BTW so that's why it shouldn't be frozen. PausC is also the one who will unfreeze everything after upgrade screen is done.

Back to your case, you should use above script with different exclusions.
 
Well, the solution is just as what you've typed there, which is freeze everything except background entity and the texts.
This is how I made upgrade screen for Fruits Survivors. When it appears, everything else including player character are frozen except upgrade screen entities.
This is the script for that:
C:
    void self = getlocalvar("self");
    void vEntity; //Target entity placeholder.
    int iEntity; //Entity enumeration holder.
    int iName; //Entity name.
    int iMax = openborvariant("count_entities"); //Entity count.
    int eTime = openborvariant("elapsed_time");

    //Enumerate and loop through entity collection.
    for(iEntity=0; iEntity<iMax; iEntity++){
      vEntity = getentity(iEntity); //Get target entity from current loop.
      iName = getentityproperty(vEntity, "defaultname"); //Get target name

      if(iName != "PauserC" && iName != "PausC" && iName != "Card" && iName != "Cursor"){
        changeentityproperty(vEntity, "frozen", 1);
        changeentityproperty(vEntity, "freezetime", eTime + 800800);
      }
    }

PauserC, PausC, Card and Cursor are entities excluded from freezing. This script is run by PausC BTW so that's why it shouldn't be frozen. PausC is also the one who will unfreeze everything after upgrade screen is done.

Back to your case, you should use above script with different exclusions.
Thank you so much. I have too many entities, so I just only freeze the enemies and this is good enough for me :)
I am finishing up my raging demon skill. Still need to add the intro and the ending similar to Street Figher 5 to it.
It has turned out very cool so far- all these good results because of your help!
 
Back
Top Bottom