KirbyDreamLand/Script_Control.cpp

651 lines
16 KiB
C++
Raw Permalink Normal View History

2016-04-30 13:46:05 +02:00
#include "Script_Control.hpp"
2016-07-12 19:10:22 +02:00
#include "IA_Monstre.hpp"
2016-04-30 13:46:05 +02:00
//Kirby script
void Control::Start()
{
2016-06-16 14:59:44 +02:00
isground = false;
isdo = false; // Si r<>alise une action True
2016-04-30 13:46:05 +02:00
isaspi = false;
2016-06-16 14:59:44 +02:00
isfull = 0;
2016-04-30 13:46:05 +02:00
ishurt = 0;
2016-07-19 15:40:58 +02:00
couldown = 0;
2016-07-12 19:10:22 +02:00
2016-06-16 14:59:44 +02:00
direction = 0;
2016-04-30 13:46:05 +02:00
GetEngine()->AddObject(OAspi);
2016-06-16 14:59:44 +02:00
GetObject()->AddRigidBody();
GetObject()->GetRigidBody()->SetMass(2);
GetObject()->GetRigidBody()->UseFixeBody(16,16);
GetObject()->AffectTag("Kirby");
2016-07-12 19:10:22 +02:00
oldx = GetX();
oldy = GetY();
boss = false;
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
void Control::Teleport( int x , int y , int level )
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
if(input_trigger(K_UP))
{
GetEngine()->GetCurrentLevel()->DrawLevel();
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
for(int i = 0 ; i < 190 ; i ++)
{
2016-07-19 15:40:58 +02:00
ML_line(-1,i,i,-1,ML_BLACK);
2016-06-16 14:59:44 +02:00
ML_display_vram();
Sleep(3);
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
GetEngine()->MoveObject(GetObject(),level);
GetEngine()->MoveObject(OAspi,level);
GetEngine()->SetCurrentLevel(level);
2016-07-12 19:10:22 +02:00
SetXY(x,y);
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
input_update();
}
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
void Control::Update()
{
2016-07-19 15:40:58 +02:00
if(couldown)couldown--;
2016-07-12 19:10:22 +02:00
boss = false;
for(int i = 0 ; i < GetEngine()->GetCurrentLevel()->GetNbObject() ; i++ )
{
if(!strcmp(GetEngine()->GetCurrentLevel()->GetListeObject()[i]->GetTag(), "Boss")) boss = true;
}
if(GetEngine()->GetIdCurrentLevel() < 3 && !boss)GenerateMonster();
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
//Check si on touche le sol ou une plateforme
2016-04-30 13:46:05 +02:00
2016-07-12 19:10:22 +02:00
isground = CollisionDecor( GetX() , GetY() - 1 );
2016-04-30 13:46:05 +02:00
2016-07-12 19:10:22 +02:00
if(!mod(GetY() , 16) && GetBody()->velocity.y < 11 )
2016-06-16 14:59:44 +02:00
{
2016-07-12 19:10:22 +02:00
int cas1 = GetEngine()->GetCurrentLevel()->GetIdMap( GetX() , GetY() - 1 , true );
int cas2 = GetEngine()->GetCurrentLevel()->GetIdMap( GetX() + 16 , GetY() - 1 , true );
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(cas1 == 58)cas1 = 56;
if(cas2 == 58)cas2 = 56;
2016-07-12 19:10:22 +02:00
if(cas1 == 56 || ( mod(GetX() , 16) && cas2 == 56) )
2016-06-16 14:59:44 +02:00
{
2016-07-12 19:10:22 +02:00
GetBody()->velocity.y = 10;
2016-06-16 14:59:44 +02:00
isground = true;
if(input_press(K_DOWN))
{
2016-07-12 19:10:22 +02:00
GetBody()->velocity.y = - 11;
2016-06-16 14:59:44 +02:00
isground = false;
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
}
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
//Initialise <20> 0 l'action du joueur
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
isdo = false;
//On v<>rifie si le joueur n'a pas pris un d<>gat
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(ishurt)//Si oui allors on le recule
{
GetObject()->GetRender()->ForceSetIt(2);
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(ishurt > 15)
{
2016-07-12 19:10:22 +02:00
GetBody()->velocity.x = 40 * ((direction) - (!direction));
GetBody()->velocity.y = 45;
2016-04-30 13:46:05 +02:00
}
else
{
2016-07-12 19:10:22 +02:00
GetBody()->velocity.x = 0;
GetBody()->velocity.y = 0;
2016-06-16 14:59:44 +02:00
}
2016-07-19 15:40:58 +02:00
if(!mod(isnhit,3))
{
if(GetObject()->GetRender()->GetActivate())
GetObject()->GetRender()->DeActivateRender();
else
GetObject()->GetRender()->ActivateRender();
}
2016-06-16 14:59:44 +02:00
ishurt --;
2016-07-19 15:40:58 +02:00
isnhit --;
2016-06-16 14:59:44 +02:00
}
else //Sinon le joueur peut le controller
{
Object * Ennemi = GetObject()->GetObjectCollisionTag("Ennemis");
2016-07-12 19:10:22 +02:00
Object * Boss = GetObject()->GetObjectCollisionTag("Boss");
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
//Test de sui on touche un ennemi
2016-07-19 15:40:58 +02:00
if(isnhit > 0)
{
isnhit --;
if(!mod(isnhit,3))
{
if(GetObject()->GetRender()->GetActivate())
GetObject()->GetRender()->DeActivateRender();
else
GetObject()->GetRender()->ActivateRender();
}
if(!isnhit)GetObject()->GetRender()->ActivateRender();
}
2016-06-16 14:59:44 +02:00
if(Ennemi)
{
2016-07-12 19:10:22 +02:00
GetEngine()->DelObject(Ennemi,true);
2016-06-16 14:59:44 +02:00
2016-07-19 15:40:58 +02:00
if(!isaspi && !isnhit)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
Interface->AddScore(400);
2016-07-12 19:10:22 +02:00
2016-07-19 15:40:58 +02:00
if(GetIt() != 12)
{
isfull = 0;
ishurt = 20;
isnhit = 80;
Interface->DelVie(1);
if(Interface->GetVie() == 6 )ishurt = 0;
}
2016-04-30 13:46:05 +02:00
}
else
{
2016-07-19 15:40:58 +02:00
if(isaspi)
{
isfull = 2;
Interface->AddScore(200);
}
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
}
2016-04-30 13:46:05 +02:00
2016-07-19 15:40:58 +02:00
if(Boss && !isnhit)
2016-07-12 19:10:22 +02:00
{
isfull = 0;
ishurt = 20;
2016-07-19 15:40:58 +02:00
isnhit = 80;
2016-07-12 19:10:22 +02:00
Interface->DelVie(1);
if(Interface->GetVie() == 6 )ishurt = 0;
}
2016-06-16 14:59:44 +02:00
//Test de si kirby aspire
if(input_press(K_OPTN) && !isfull)isaspi = true;
if(input_release(K_OPTN) && !isfull || isfull)isaspi = false;
if(isaspi)
{
OAspi->Enable();
if(direction)
2016-04-30 13:46:05 +02:00
{
2016-07-12 19:10:22 +02:00
OAspi->GetTransform()->SetXY( GetX() - 40 , GetY());
2016-06-16 14:59:44 +02:00
OAspi->GetRender()->ReverseRender(true);
2016-04-30 13:46:05 +02:00
}
else
{
2016-07-12 19:10:22 +02:00
OAspi->GetTransform()->SetXY( GetX() + 16 , GetY());
2016-06-16 14:59:44 +02:00
OAspi->GetRender()->ReverseRender(false);
2016-04-30 13:46:05 +02:00
}
2016-07-12 19:10:22 +02:00
SetIt(3);
2016-06-16 14:59:44 +02:00
isdo = true;
}
else
{
OAspi->Disable();
2016-04-30 13:46:05 +02:00
if(input_trigger(K_OPTN))
{
2016-07-12 19:10:22 +02:00
SetIt(8);
2016-06-16 14:59:44 +02:00
Object * Buffer = new Object;
SSoufle * ScriptSouffle = new SSoufle;
SStar * ScriptStar = new SStar;
2016-07-19 15:40:58 +02:00
GetEngine()->AddObject(Buffer);
if(!direction)
{
Buffer->GetTransform()->SetXY( GetX() + 16 , GetY() + 8 );
Buffer->GetRender()->ReverseRender(false);
}
else
{
Buffer->GetTransform()->SetXY( GetX(), GetY() + 8 );
Buffer->GetRender()->ReverseRender(true);
}
2016-06-16 14:59:44 +02:00
switch(isfull)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
case 1:
delete ScriptStar;
2016-07-19 15:40:58 +02:00
if(!couldown)
{
ScriptSouffle->time = 12;
ScriptSouffle->Interface = Interface;
Buffer->GetRender()->SetRender(RenderSouffle);
Buffer->AffectScript(ScriptSouffle);
ScriptSouffle->direction = direction;
couldown = 25;
}
else
{
delete ScriptSouffle;
GetEngine()->DelObject(Buffer);
}
2016-06-16 14:59:44 +02:00
break;
case 2:
delete ScriptSouffle;
ScriptStar->Interface = Interface;
Buffer->GetRender()->SetRender(RenderEtoile);
Buffer->AffectScript(ScriptStar);
Buffer->AddRigidBody();
2016-07-12 19:10:22 +02:00
Buffer->AffectTag("Star");
2016-06-16 14:59:44 +02:00
2016-07-19 15:40:58 +02:00
ScriptStar->direction = direction;
2016-06-16 14:59:44 +02:00
break;
default:
2016-07-19 15:40:58 +02:00
delete ScriptStar;
delete ScriptSouffle;
GetEngine()->DelObject(Buffer);
2016-06-16 14:59:44 +02:00
break;
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
isfull = 0;
2016-04-30 13:46:05 +02:00
isdo = true;
2016-07-12 19:10:22 +02:00
Buffer = NULL;
ScriptSouffle = NULL;
ScriptStar = NULL;
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
//Test des directions
if(input_press(K_RIGHT))
2016-04-30 13:46:05 +02:00
{
2016-07-12 19:10:22 +02:00
Move( 1 + (isfull != 1) , 0 );
2016-06-16 14:59:44 +02:00
direction = false;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(isfull)
{
2016-07-12 19:10:22 +02:00
if(isground)SetIt(5);
2016-06-16 14:59:44 +02:00
}
else
2016-07-12 19:10:22 +02:00
SetIt(1);
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
isdo = true;
}
else if(input_press(K_LEFT))
{
2016-07-12 19:10:22 +02:00
Move( - 1 - (isfull != 1) , 0 );
2016-06-16 14:59:44 +02:00
direction = true;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(isfull)
{
2016-07-12 19:10:22 +02:00
if(isground)SetIt(5);
2016-06-16 14:59:44 +02:00
}
else
2016-07-12 19:10:22 +02:00
SetIt(1);
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
isdo = true;
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
//Test du saut
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(input_trigger(K_SHIFT) && isground)
2016-04-30 13:46:05 +02:00
{
2016-07-12 19:10:22 +02:00
GetBody()->velocity.y = 42;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(isfull)
2016-07-12 19:10:22 +02:00
SetIt(6);
2016-06-16 14:59:44 +02:00
else
2016-07-12 19:10:22 +02:00
SetIt(2);
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
isdo = true;
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
//Test de l'accroupisement
if(input_press(K_DOWN) && !isdo && !isfull)
{
2016-07-12 19:10:22 +02:00
SetIt(10);
GetObject()->GetRigidBody()->UseFixeBody(16,8);
2016-06-16 14:59:44 +02:00
isdo = true;
}
2016-07-12 19:10:22 +02:00
else
{
GetObject()->GetRigidBody()->UseFixeBody(16,16);
}
2016-06-16 14:59:44 +02:00
if(isfull)
{
if(!isground)
{
2016-07-12 19:10:22 +02:00
if(GetObject()->GetRender()->GetIt() != 6 )SetIt(7);
2016-06-16 14:59:44 +02:00
}
2016-07-12 19:10:22 +02:00
else if(!isdo)SetIt(4);
2016-04-30 13:46:05 +02:00
}
else
{
2016-07-12 19:10:22 +02:00
if(!isground)SetIt(2);
else if(!isdo)SetIt(0);
2016-06-16 14:59:44 +02:00
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(input_trigger(K_UP))
{
if(isfull == 1)
{
2016-07-12 19:10:22 +02:00
GetBody()->velocity.y = 35;
SetIt(7);
2016-06-16 14:59:44 +02:00
}
if(!isfull)
{
isfull = 1;
2016-07-12 19:10:22 +02:00
SetIt(9);
2016-06-16 14:59:44 +02:00
}
isdo = true;
2016-04-30 13:46:05 +02:00
}
}
}
2016-06-16 14:59:44 +02:00
GetObject()->GetRender()->ReverseRender(direction);
2016-04-30 13:46:05 +02:00
2016-07-12 19:10:22 +02:00
if( GetY() < 3)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
isfull = 0;
2016-04-30 13:46:05 +02:00
Interface->DelVie(6);
direction = false;
}
2016-07-12 19:10:22 +02:00
if(boss && GetX() > 160)
{
SetX(160);
}
2016-07-19 15:40:58 +02:00
if(GetObject()->GetCollisionTag("FS"))
{
Interface->AddScore(1000);
Interface->EndStage();
}
if(!isfull && GetBody()->velocity.y < -40)SetIt(12);
2016-07-12 19:10:22 +02:00
GetEngine()->MiddleScreen( GetX() + 8 , GetY() + 10 );
2016-04-30 13:46:05 +02:00
}
void Control::Initialisation(Animation E, Animation S , Object * A , Script_GUI * G)
{
RenderEtoile = E;
RenderSouffle = S;
OAspi = A;
Interface = G;
}
2016-06-16 14:59:44 +02:00
void Control::GenerateMonster()
{
2016-07-12 19:10:22 +02:00
if(abs(oldx - GetX()) > 15 || abs(oldy - GetY()) > 15)
2016-06-16 14:59:44 +02:00
{
2016-07-12 19:10:22 +02:00
int sgnx = sgn(oldx - GetX());// Si 1 alors le perso se d<>place vers la gauche Si -1 alors le perso se d<>place vers la droite
int sgny = sgn(oldy - GetY());// Si 1 alors le perso se d<>place vers le bas Si -1 alors le perso se d<>place vers le ha
2016-06-16 14:59:44 +02:00
2016-07-12 19:10:22 +02:00
if(abs(oldx - GetX()) < 15)sgnx = 0;
if(abs(oldx - GetY()) < 15)sgny = 0;
int needground = true;
oldx = GetX();
oldy = GetY();
if(!rand_int(4))// On d<>termine si il faut ou non faire poper un monstre. Le nombre diminue en fonction de la difficult<6C>.
2016-06-16 14:59:44 +02:00
{
Object * Buffer = new Object;
Buffer->AddRigidBody();
2016-07-12 19:10:22 +02:00
Buffer->GetRigidBody()->SetMass(1);
Mob_InLine * Buffer_Script1 = new Mob_InLine;
Mob_Piaf * Buffer_Script2 = new Mob_Piaf;
Mob_Champ * Buffer_Script3 = new Mob_Champ;
Mob_InLine_Fly * Buffer_Script4 = new Mob_InLine_Fly;
Mob_InLine * Buffer_Script5 = new Mob_InLine;
Mob_InLine_Jump * Buffer_Script6 = new Mob_InLine_Jump;
switch(rand_int(6))
{
case 0:
Buffer->GetRender()->CopieRender(AOurs);
if(sgnx == -1)
Buffer_Script1->SetDirection(true);
else
Buffer_Script1->SetDirection(false);
Buffer->AffectScript(Buffer_Script1);
break;
case 1:
Buffer->GetRender()->SetRender(APiaf,2);
needground = false;
if(sgnx == -1)
Buffer_Script2->SetDirection(true);
else
Buffer_Script2->SetDirection(false);
Buffer->AffectScript(Buffer_Script2);
break;
case 2:
Buffer->GetRender()->SetRender(AChamp,2);
Buffer->AffectScript(Buffer_Script3);
break;
case 3:
Buffer->GetRender()->CopieRender(AOupa);
needground = false;
if(sgnx == -1)
Buffer_Script4->SetDirection(true);
else
Buffer_Script4->SetDirection(false);
Buffer->AffectScript(Buffer_Script4);
break;
case 4:
Buffer->GetRender()->CopieRender(ABaby);
if(sgnx == -1)
Buffer_Script5->SetDirection(true);
else
Buffer_Script5->SetDirection(false);
Buffer->AffectScript(Buffer_Script5);
break;
case 5:
Buffer->GetRender()->CopieRender(AGhost);
if(sgnx == -1)
Buffer_Script6->SetDirection(true);
else
Buffer_Script6->SetDirection(false);
Buffer->AffectScript(Buffer_Script6);
break;
default:
break;
}
if( Buffer_Script1 != Buffer->GetScript())delete Buffer_Script1;
if( Buffer_Script2 != Buffer->GetScript())delete Buffer_Script2;
if( Buffer_Script3 != Buffer->GetScript())delete Buffer_Script3;
if( Buffer_Script4 != Buffer->GetScript())delete Buffer_Script4;
if( Buffer_Script5 != Buffer->GetScript())delete Buffer_Script5;
if( Buffer_Script6 != Buffer->GetScript())delete Buffer_Script6;
2016-06-16 14:59:44 +02:00
GetEngine()->AddObject(Buffer);
2016-07-12 19:10:22 +02:00
int end = 0;
do
{
do
{
do
{
Buffer->GetTransform()->SetXY( ((oldx - mod(oldx , 16))/16 + rand_int_ab( 8 , 12) * - sgnx ) * 16 , ((oldy - mod(oldy , 16))/16 + rand_int_ab( -2 , 6 ) * - sgny ) * 16 );
end ++;
if(end > 50)
{
GetEngine()->DelObject(Buffer);
return;
}
}
while( Buffer->IsOnScreen());
}
while( needground && ! Buffer->GetRigidBody()->CollisionDecor( Buffer->GetTransform()->GetX() , Buffer->GetTransform()->GetY() - 1) );
}while( Buffer->GetRigidBody()->CollisionDecor( Buffer->GetTransform()->GetX() , Buffer->GetTransform()->GetY()) );
Buffer->AffectTag("Ennemis");
Buffer = NULL;
}
2016-06-16 14:59:44 +02:00
}
}
2016-04-30 13:46:05 +02:00
void SAspi::Update()
{
Object * Buffer = NULL;
2016-06-16 14:59:44 +02:00
Buffer = GetObject()->GetObjectCollisionTag("Ennemis");
2016-04-30 13:46:05 +02:00
if( Buffer != NULL)
{
2016-06-16 14:59:44 +02:00
if(GetObject()->GetRender()->GetReverse()== false)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
Buffer->GetRigidBody()->Move(-2,0);
2016-04-30 13:46:05 +02:00
}
else
{
2016-06-16 14:59:44 +02:00
Buffer->GetRigidBody()->Move(2,0);
2016-04-30 13:46:05 +02:00
}
}
}
void SSoufle::Update()
{
if(time > 0)
{
2016-07-12 19:10:22 +02:00
if(direction)SetXY( GetX() - 3 , GetY() );
else SetXY( GetX() + 3 , GetY() );
2016-04-30 13:46:05 +02:00
}
time--;
2016-06-16 14:59:44 +02:00
Object * Buffer = GetObject()->GetObjectCollisionTag("Ennemis");
2016-04-30 13:46:05 +02:00
if(Buffer != NULL)
{
2016-07-12 19:10:22 +02:00
GetEngine()->DelObject(Buffer,true);
time = -11;
2016-04-30 13:46:05 +02:00
Interface->AddScore(200);
return;
}
if(time < -10)
{
GetEngine()->DelObject(GetObject());return;
}
}
void SStar::Update()
{
2016-07-12 19:10:22 +02:00
Object * Buffer = GetObject()->GetObjectCollisionTag("Ennemis");
if(Buffer != NULL)
{
GetEngine()->DelObject(Buffer);
SetXY(-50,-50);
Interface->AddScore(400);
return;
}
2016-04-30 13:46:05 +02:00
2016-07-12 19:10:22 +02:00
if(direction)
2016-04-30 13:46:05 +02:00
{
2016-07-12 19:10:22 +02:00
SetXY( GetX() - 3 , GetY() );
if(CollisionDecor(GetX() - 3 , GetY()))
2016-04-30 13:46:05 +02:00
{
GetEngine()->DelObject(GetObject());return;
}
}
else
{
2016-07-12 19:10:22 +02:00
SetXY( GetX() + 3 , GetY() );
if(CollisionDecor(GetX() + 3 , GetY()))
if(CollisionDecor(GetX() + 3 , GetY()))
if(CollisionDecor(GetX() + 3 , GetY()))
2016-04-30 13:46:05 +02:00
{
GetEngine()->DelObject(GetObject());return;
}
}
}