kimono no problem buddykimono said:Thanks Damon Caskey for moving this topic and Davpreec for this playthrough. I see that you finished the game with 13 lives, so I need to reduce them
. You miss some bonus levels too; here's the SoD general map:
![]()
One tip: there are 4 hidden feathers in the first levels of the game that gives you each +2 to your max health. So you can have a double lifebar collecting all of them 8) .
anim freespecial5 #Charging
loop 0
delay 4
offset 31 80
bbox 20 0 24 80
sound data/voice/kelly_attack.wav
frame data/chars/kelly/charge1.png
frame data/chars/kelly/charge2.png
frame data/chars/kelly/charge3.png
@cmd keyLoop "attack" 1
energycost 50 1 3
@cmd aniChange 2 "ANI_FREESPECIAL6"
frame data/chars/kelly/charge3.png
anim freespecial6 #Charge attack
loop 0
delay 10
offset 31 80
bbox 20 0 24 80
energycost 50 1 3
sound data/voice/kelly_taunt.wav
frame data/chars/kelly/charge1.png
@cmd Rain "Meteor" 200 400 30 -100 1 -5
@cmd Rain "Meteor" 200 400 30 -100 1 -5
frame data/chars/kelly/charge2.png
@cmd Rain "Meteor" 200 400 30 -100 1 -5
@cmd Rain "Meteor" 200 400 30 -100 1 -5
frame data/chars/kelly/charge3.png
@cmd Rain "Meteor" 200 400 30 -100 1 -5
@cmd Rain "Meteor" 200 400 30 -100 1 -5
frame data/chars/kelly/charge2.png
@cmd SmartDrops "Meteo" 400 1 -5
@cmd Rain "Meteor" 200 400 30 -100 1 -5
@cmd Rain "Meteor" 200 400 30 -100 1 -5
frame data/chars/kelly/charge1.png
@cmd Rain "Meteor" 200 400 30 -100 1 -5
@cmd Rain "Meteor" 200 400 30 -100 1 -5
frame data/chars/kelly/charge2.png
@cmd SmartHurt 50 1 1
frame data/chars/kelly/charge3.png
anim chargeattack #Used to disable the default engine charge attack
chargetime 9999
offset 31 80
bbox 20 0 24 80
frame data/chars/kelly/charge1.png
void keyLoop(void key, int frame)
{//Loops defined frame if defined key is held
void self = getlocalvar("self");
int iPIndex = getentityproperty(self,"playerindex");
if(playerkeys(iPIndex, 0, key)){updateframe(self, frame);}
}
void aniChange(int type, void ani)
{//Change animations
//Type 0: Default animation changer
//Type 1: Execute animation changer
//Type 2: Performattack animation changer
void self = getlocalvar("self");
if(type == 0){changeentityproperty(self, "animation", openborconstant(ani));}
if(type == 1){executeanimation(self, openborconstant(ani), 1);}
if(type == 2){performattack(self, openborconstant(ani), 1);}
}
void main()
{//Hold button to make a charged attack
void self = getlocalvar("self");
void vAniID = getentityproperty(self,"animationID");
int iPIndex = getentityproperty(self,"playerindex");
float delay = 1; //This is how much time the key need to be held to activate the "charging" animation
if(vAniID != openborconstant("ANI_FREESPECIAL5")){ //Used to not work while charging
if(playerkeys(iPIndex, 0, "attack")){ //The attack button is held??
if(getglobalvar("chargeStart"+iPIndex) == NULL()){setglobalvar("chargeStart"+iPIndex, openborvariant("elapsed_time"));} //Start the variable if NULL
if(openborvariant("elapsed_time") - getglobalvar("chargeStart"+iPIndex) >= delay){ //The delay is reached??
if(vAniID == openborconstant("ANI_IDLE")){ //The character is in the IDLE animation?? You can add others if want
int chargeCount = getglobalvar("kellyCharge"+iPIndex); //Kelly's charge attack current counter
int limit = 2; //Kelly's charge attack limit
int add = 1;
if(chargeCount < limit){
setidle(self, openborconstant("ANI_IDLE")); //Reset to the IDLE instance
changeentityproperty(self, "velocity", 0, 0, 0); //Reset the current velocity to zero
executeanimation(self, openborconstant("ANI_FREESPECIAL5"), 1); //Perform the desired animation
setglobalvar("kellyCharge"+iPIndex, chargeCount+add); //Update Kelly's charge counter value
setglobalvar("chargeStart"+iPIndex, NULL()); //Erase the variable to be used again
}
}
}
}
}
if(playerkeys(iPIndex, 2, "attack")){ //The attack button is released??
if(getglobalvar("chargeStart"+iPIndex) != NULL()){setglobalvar("chargeStart"+iPIndex, NULL());} //Erase the variable to be used again
}
}
void main()
{
//RESET "PLAYED TIME" VARIABLE TO START A NEW COUNT
setglobalvar("playedCounter", openborvariant("elapsed_time"));
//RESETS KELLY CHARGE ATTACK COUNTER FOR BOTH PLAYERS
setglobalvar("kellyCharge0", 0);
setglobalvar("kellyCharge1", 0);
}