KirbyDreamLand/Script_Control.cpp

424 lines
12 KiB
C++
Raw Normal View History

2016-04-30 13:46:05 +02:00
#include "Script_Control.hpp"
//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-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");
oldx = GetObject()->GetTransform()->GetX();
oldy = GetObject()->GetTransform()->GetY();
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 ++)
{
ML_line(0,i,i,0,ML_BLACK);
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);
GetObject()->GetTransform()->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()
{
if(GetEngine()->GetIdCurrentLevel() < 3)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-06-16 14:59:44 +02:00
isground = GetObject()->GetRigidBody()->CollisionDecor( GetObject()->GetTransform()->GetX() , GetObject()->GetTransform()->GetY() - 1 );
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(!mod(GetObject()->GetTransform()->GetY() , 16) && GetObject()->GetRigidBody()->GetBody()->velocity.y < 11 )
{
int cas1 = GetEngine()->GetCurrentLevel()->GetIdMap( GetObject()->GetTransform()->GetX() , GetObject()->GetTransform()->GetY() - 1 , true );
int cas2 = GetEngine()->GetCurrentLevel()->GetIdMap( GetObject()->GetTransform()->GetX() + 16 , GetObject()->GetTransform()->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;
if(cas1 == 56 || ( mod(GetObject()->GetTransform()->GetX() , 16) && cas2 == 56) )
{
GetObject()->GetRigidBody()->GetBody()->velocity.y = 10;
isground = true;
if(input_press(K_DOWN))
{
GetObject()->GetRigidBody()->GetBody()->velocity.y = - 11;
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)
{
GetObject()->GetRigidBody()->GetBody()->velocity.x = 40 * ((direction) - (!direction));
GetObject()->GetRigidBody()->GetBody()->velocity.y = 45;
2016-04-30 13:46:05 +02:00
}
else
{
2016-06-16 14:59:44 +02:00
GetObject()->GetRigidBody()->GetBody()->velocity.x = 0;
GetObject()->GetRigidBody()->GetBody()->velocity.y = 0;
}
ishurt --;
}
else //Sinon le joueur peut le controller
{
Object * Ennemi = GetObject()->GetObjectCollisionTag("Ennemis");
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
//Test de sui on touche un ennemi
if(Ennemi)
{
GetEngine()->DelObject(Ennemi);
if(!isaspi)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
isfull = 0;
ishurt = 20;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
Interface->AddScore(400);
Interface->DelVie(1);
2016-04-30 13:46:05 +02:00
}
else
{
2016-06-16 14:59:44 +02:00
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-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-06-16 14:59:44 +02:00
OAspi->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() - 40 , GetObject()->GetTransform()->GetY());
OAspi->GetRender()->ReverseRender(true);
2016-04-30 13:46:05 +02:00
}
else
{
2016-06-16 14:59:44 +02:00
OAspi->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() + 16 , GetObject()->GetTransform()->GetY());
OAspi->GetRender()->ReverseRender(false);
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
GetObject()->GetRender()->SetIt(3);
isdo = true;
}
else
{
OAspi->Disable();
2016-04-30 13:46:05 +02:00
if(input_trigger(K_OPTN))
{
2016-06-16 14:59:44 +02:00
GetObject()->GetRender()->SetIt(8);
Object * Buffer = new Object;
SSoufle * ScriptSouffle = new SSoufle;
SStar * ScriptStar = new SStar;
switch(isfull)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
case 1:
delete ScriptStar;
ScriptSouffle->time = 12;
ScriptSouffle->Interface = Interface;
Buffer->GetRender()->SetRender(RenderSouffle);
Buffer->AffectScript(ScriptSouffle);
if(!direction)ScriptSouffle->direction = false;
else ScriptSouffle->direction = true;
break;
case 2:
delete ScriptSouffle;
ScriptStar->Interface = Interface;
Buffer->GetRender()->SetRender(RenderEtoile);
Buffer->AffectScript(ScriptStar);
Buffer->AddRigidBody();
if(!direction)ScriptStar->direction = false;
else ScriptStar->direction = true;
break;
default:
break;
2016-04-30 13:46:05 +02:00
}
2016-06-16 14:59:44 +02:00
GetEngine()->AddObject(Buffer);
if(!direction)
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
Buffer->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() + 16 , GetObject()->GetTransform()->GetY() + 8 );
Buffer->GetRender()->ReverseRender(false);
}
else
{
Buffer->GetTransform()->SetXY( GetObject()->GetTransform()->GetX(), GetObject()->GetTransform()->GetY() + 8 );
Buffer->GetRender()->ReverseRender(true);
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-06-16 14:59:44 +02:00
//Test des directions
if(input_press(K_RIGHT))
2016-04-30 13:46:05 +02:00
{
2016-06-16 14:59:44 +02:00
GetObject()->GetRigidBody()->Move( 2 , 0 );
direction = false;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(isfull)
{
if(isground)GetObject()->GetRender()->SetIt(5);
}
else
GetObject()->GetRender()->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))
{
GetObject()->GetRigidBody()->Move( -2 , 0 );
direction = true;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(isfull)
{
if(isground)GetObject()->GetRender()->SetIt(5);
}
else
GetObject()->GetRender()->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-06-16 14:59:44 +02:00
GetObject()->GetRigidBody()->GetBody()->velocity.y = 42;
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(isfull)
GetObject()->GetRender()->SetIt(6);
else
GetObject()->GetRender()->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)
{
GetObject()->GetRender()->SetIt(10);
isdo = true;
}
if(isfull)
{
if(!isground)
{
if(GetObject()->GetRender()->GetIt() != 6 )GetObject()->GetRender()->SetIt(7);
}
else if(!isdo)GetObject()->GetRender()->SetIt(4);
2016-04-30 13:46:05 +02:00
}
else
{
2016-06-16 14:59:44 +02:00
if(!isground)GetObject()->GetRender()->SetIt(2);
else if(!isdo)GetObject()->GetRender()->SetIt(0);
}
2016-04-30 13:46:05 +02:00
2016-06-16 14:59:44 +02:00
if(input_trigger(K_UP))
{
if(isfull == 1)
{
GetObject()->GetRigidBody()->GetBody()->velocity.y = 35;
GetObject()->GetRender()->SetIt(7);
}
if(!isfull)
{
isfull = 1;
GetObject()->GetRender()->SetIt(9);
}
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-06-16 14:59:44 +02:00
if( GetObject()->GetTransform()->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-06-16 14:59:44 +02:00
GetEngine()->MiddleScreen( GetObject()->GetTransform()->GetX() + 12, (GetObject()->GetTransform()->GetY() + 16));
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()
{
if(abs(oldx - GetObject()->GetTransform()->GetX()) > 15 || abs(oldy - GetObject()->GetTransform()->GetY()) > 15)
{
if(!rand_int(8))
{
Object * Buffer = new Object;
Buffer->GetTransform()->SetXY(16,32);
Buffer->AddRigidBody();
Buffer->GetRender()->CopieRender(RenderEtoile);
Buffer->AffectTag("Ennemis");
GetEngine()->AddObject(Buffer);
}
oldx = GetObject()->GetTransform()->GetX();
oldy = GetObject()->GetTransform()->GetY();
}
}
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-06-16 14:59:44 +02:00
if(direction == true)GetObject()->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() - 3 , GetObject()->GetTransform()->GetY() );
else GetObject()->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() + 3 , GetObject()->GetTransform()->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)
{
GetEngine()->DelObject(Buffer);
GetEngine()->DelObject(GetObject());
Interface->AddScore(200);
return;
}
if(time < -10)
{
GetEngine()->DelObject(GetObject());return;
}
}
void SStar::Update()
{
if(direction == true)
{
2016-06-16 14:59:44 +02:00
GetObject()->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() - 3 , GetObject()->GetTransform()->GetY() );
if(GetObject()->GetRigidBody()->CollisionDecor(GetObject()->GetTransform()->GetX() - 3 , GetObject()->GetTransform()->GetY()))
2016-04-30 13:46:05 +02:00
{
GetEngine()->DelObject(GetObject());return;
}
}
else
{
2016-06-16 14:59:44 +02:00
GetObject()->GetTransform()->SetXY( GetObject()->GetTransform()->GetX() + 3 , GetObject()->GetTransform()->GetY() );
if(GetObject()->GetRigidBody()->CollisionDecor(GetObject()->GetTransform()->GetX() + 3 , GetObject()->GetTransform()->GetY()))
if(GetObject()->GetRigidBody()->CollisionDecor(GetObject()->GetTransform()->GetX() + 3 , GetObject()->GetTransform()->GetY()))
if(GetObject()->GetRigidBody()->CollisionDecor(GetObject()->GetTransform()->GetX() + 3 , GetObject()->GetTransform()->GetY()))
2016-04-30 13:46:05 +02:00
{
GetEngine()->DelObject(GetObject());return;
}
}
2016-06-16 14:59:44 +02:00
Object * Buffer = GetObject()->GetObjectCollisionTag("Ennemis");
2016-04-30 13:46:05 +02:00
if(Buffer != NULL)
{
GetEngine()->DelObject(Buffer);
GetEngine()->DelObject(GetObject());
Interface->AddScore(400);
return;
}
}