require utils;
CMissile* MagicMole;
CMissile* WalkingMole;
//CMissile* MagicMoleNM;
CMissile* WalkingMoleNM;
int MagicMolePosX;
int MagicMolePosY;
int MagicMolePosXNM;
int MagicMolePosYNM;
int MagicMoleExplodeTimer;
int CustomRetreatTimer;
int mlastX;
int mlastY;
float molerot;
int avgrot;
CSprite* mdk;
CSprite* mdn;
CSprite* mwk;
CSprite* mwn;
CSprite* transp;
void mole::InitGraphic()
{
local f = GetAttachment("dig.png"); mdk = LoadSprite(f, 3, 1);
local f = GetAttachment("dign.png"); mdn = LoadSprite(f, 3, 1);
local f = GetAttachment("w.png"); mwk = LoadSprite(f, 8, 1);
local f = GetAttachment("wn.png"); mwn = LoadSprite(f, 8, 1);
local f = GetAttachment("trans.png"); transp = LoadSprite(f, 1, 0);
/*
SetSpriteOverride(158 , transp);
SetSpriteOverride(159 , transp);
SetSpriteOverride(160 , transp);
SetSpriteOverride(161 , transp);
SetSpriteOverride(166 , transp);
*/
/*
random notes
CWorm(this);
GG->machColors[GetLocalMachine()]
GetTeamColor(wm->WormTeam)
*/
}
void mole::Init()
{
MagicMole = NullObj;
WalkingMole = NullObj;
MagicMolePosX = 0; //Seems to be the place where mole started jump.
MagicMolePosY = 0;
MagicMoleExplodeTimer = 0;
CustomRetreatTimer = 0;
mlastX = 0;
mlastY = 0;
molerot = 0.0;
avgrot = 0;
}
void mole::FirstFrame()
{
}
override void CMissile::CMissile(CObject* parent,CWeaponLaunch* ldata,CShootDesc* sdata)
{
//MagicMoleInertiaTimer = 60; //So that the mole can't go upward infinitely.
super;
}
override void CMissile::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if(Type == M_FRAME)
{
if(MagicMole == NullObj)
{
if(weap->CheckName("Super Mole Bomb") == true)
{
WalkingMole = this;
}
}
if(MagicMoleNM == NullObj)
{
if(weap->CheckName("Mole Bomb") == true)
{
WalkingMoleNM = this;
}
}
if(MagicMoleExplodeTimer > 0 && MagicMole == NullObj)
{
MagicMoleExplodeTimer = MagicMoleExplodeTimer - 1;
if(PosX <= MagicMolePosX + 10 && PosX >= MagicMolePosX - 10)
{
if(PosY <= MagicMolePosY + 10 && PosY >= MagicMolePosY - 10)
{
MagicMole = this;
MagicMoleExplodeTimer = 0;
//GG->WriteToChat( 1, "MM was set", false);
}
}
}
if(MagicMoleNM == NullObj)
{
if(PosX <= MagicMolePosXNM + 10 && PosX >= MagicMolePosXNM - 10)
{
if(PosY <= MagicMolePosYNM + 10 && PosY >= MagicMolePosYNM - 10)
{
MagicMoleNM = this;
}
}
}
if(MagicMole != NullObj)
{
if(MagicMole == this)
{
if(SpX > 0){Side = 1;}
if(SpX < 0){Side = -1;}
//ActionType=3;
}
}
if(MagicMoleNM != NullObj)
{
if(MagicMoleNM == this)
{
if(SpX > 0){Side = 1;}
if(SpX < 0){Side = -1;}
}
}
}
super;
}
override void CWorm::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
local dx = 0;
local dy = 0;
if(Type == M_PUP)
{
if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 10)
{
//if(MagicMole->MagicMoleInertiaTimer > 0)
//{
if(MagicMole->SpY >= -10){MagicMole->SpY = MagicMole->SpY - 0.5;}
//MagicMole->MagicMoleInertiaTimer = MagicMole->MagicMoleInertiaTimer - 1;
//MD->PosY = MD->PosY - 10;
//GG->WriteToChat( 1, "UP2", false);
//}
return;
}
}
if(Type == M_PDOWN)
{
if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 10)
{
if(MagicMole->SpY <= 10){MagicMole->SpY = MagicMole->SpY + 0.5;}
return;
}
}
if(Type == M_PLEFT)
{
if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 10)
{
if(MagicMole->SpX >= -10){MagicMole->SpX = MagicMole->SpX - 0.5;}
return;
}
}
if(Type == M_PRIGHT)
{
if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 1)
{
if(MagicMole->SpX <= 10){MagicMole->SpX = MagicMole->SpX + 0.5;}
return;
}
}
if (Type == M_DRAWQUEUE && MagicMole != NullObj) { //digging/flying kamikaze mole
avgrot = (avgrot + 1) % 5;
if(avgrot == 4){
if(mlastX != 0 && mlastY != 0){
if(mlastX != MagicMole->PosX && mlastY != MagicMole->PosY){
dx = mlastX - MagicMole->PosX;
dy = mlastY - MagicMole->PosY;
//if(ar>0) {molerot = ar*360;} else {molerot = 2*MATH_PI + ar;}
//molerot = (-atan2(-dx,-dy))/MATH_PI*180 + 180;
molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
//SUPER WEIRD VALUES NEEDED. taken from another source at forums.
//AddSpriteEx should take radians but only works with 1128 +-PI values..?
//And its not perfect.. maybe averaging rotation could help glitchiness.
//also PNG is not rendered nice altough files are good.
}
}
}
if(molerot > 1128.0){
//AddSpriteEx(5,MagicMole->PosX,MagicMole->PosY,mdk->Index,abs(sin((GS->Tick/5))),molerot+1.5,1.0);
}else{
//AddSpriteEx(5,MagicMole->PosX,MagicMole->PosY,(mdk->Index)+262144,abs(sin((GS->Tick/5))),molerot-1.5,1.0);
}
if(GS->Tick % 3 == 0){ //DESYNC ?
PxParticle *p;
p = new PxParticle(130, MagicMole->PosX, MagicMole->PosY);
p->SetBlendMode(0);
p->SetLifeTime(300);
p->SetRandomVelocity(0.05, 0.05);
p->SetAirResistance(0.0);
p->GravityFactor(0.0);
//p->SetAlpha(255);
p->SetColor(
255,
Lerp(sin((GS->Tick/25)), 50, 200),
50
);
p->SetStartSize(0.9, 0.9);
p->SetEndSize(0.5, 0.5);
}
if(avgrot == 0){
mlastX = MagicMole->PosX;
mlastY = MagicMole->PosY;
}
}
if (Type == M_DRAWQUEUE && MagicMoleNM != NullObj) {//digging/flying normal mole
avgrot = (avgrot + 1) % 5;
if(avgrot == 4){
if(mlastX != 0 && mlastY != 0){
if(mlastX != MagicMoleNM->PosX && mlastY != MagicMoleNM->PosY){
dx = mlastX - MagicMoleNM->PosX;
dy = mlastY - MagicMoleNM->PosY;
//if(ar>0) {molerot = ar*360;} else {molerot = 2*MATH_PI + ar;}
//molerot = (-atan2(-dx,-dy))/MATH_PI*180 + 180;
molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
}
}
}
if(molerot > 1128.0){
//AddSpriteEx(5,MagicMoleNM->PosX,MagicMoleNM->PosY,mdn->Index,abs(sin((GS->Tick/5))),molerot+1.5,1.0);
}else{
//AddSpriteEx(5,MagicMoleNM->PosX,MagicMoleNM->PosY,(mdn->Index)+262144,abs(sin((GS->Tick/5))),molerot-1.5,1.0);
}
if(avgrot == 0){
mlastX = MagicMoleNM->PosX;
mlastY = MagicMoleNM->PosY;
}
}
if (Type == M_DRAWQUEUE && WalkingMole != NullObj) {//walking kamikaze mole
avgrot = (avgrot + 1) % 5;
if(avgrot == 4){
if(mlastX != 0 && mlastY != 0){
if(mlastX != WalkingMole->PosX && mlastY != WalkingMole->PosY){
dx = mlastX - WalkingMole->PosX;
dy = mlastY - WalkingMole->PosY;
molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
}
}
}
if(molerot > 1128.0){
// AddSpriteEx(5,WalkingMole->PosX,WalkingMole->PosY,mwk->Index,abs(sin((GS->Tick/15))),0.0,1.0);
}else{
//AddSpriteEx(5,WalkingMole->PosX,WalkingMole->PosY,(mwk->Index)+262144,abs(sin((GS->Tick/15))),0.0,1.0);
}
if(avgrot == 0){
mlastX = WalkingMole->PosX;
mlastY = WalkingMole->PosY;
}
}
if (Type == M_DRAWQUEUE && WalkingMoleNM != NullObj) {//walking nornmal mole
avgrot = (avgrot + 1) % 5;
if(avgrot == 4){
if(mlastX != 0 && mlastY != 0){
if(mlastX != WalkingMoleNM->PosX && mlastY != WalkingMoleNM->PosY){
dx = mlastX - WalkingMoleNM->PosX;
dy = mlastY - WalkingMoleNM->PosY;
molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
}
}
}
if(molerot > 1128.0){
// AddSpriteEx(5,WalkingMoleNM->PosX,WalkingMoleNM->PosY,mwn->Index,abs(sin((GS->Tick/15))),0.0,1.0);
}else{
// AddSpriteEx(5,WalkingMoleNM->PosX,WalkingMoleNM->PosY,(mwn->Index)+262144,abs(sin((GS->Tick/15))),0.0,1.0);
}
if(avgrot == 0){
mlastX = WalkingMoleNM->PosX;
mlastY = WalkingMoleNM->PosY;
}
}
if(Type == M_TURNBEGIN && MagicMole != NullObj)
{
MagicMole = NullObj;
MagicMolePosX = 0;
MagicMolePosY = 0;
MagicMoleExplodeTimer = 0;
WalkingMole = NullObj;
//GG->WriteToChat( 1, "tbegin", false);
}
if(Type == M_TURNBEGIN && MagicMoleNM != NullObj)
{
MagicMoleNM = NullObj;
MagicMolePosXNM = 0;
MagicMolePosYNM = 0;
WalkingMoleNM = NullObj;
}
super;
}
void SpawnMineMole(int x, int y, int teamz) //DESYNC ?
{
CMineParams MParams;
CShootDesc SDesc;
zero(&MParams);
zero(&SDesc);
MParams.Prefuse = 0; //time before ability to activate
MParams.Flags = 60; //flags of objects to react on
MParams.Bias = 0; //Y shift of explosion
MParams.Damage = 29; //damage
MParams.BlastPower = 200;
MParams.Fuse = 3000;
MParams.Radius = 100;
SDesc.Team = teamz;
SDesc.X = x;
SDesc.Y = y;
SDesc.SpX = 0; //speed
SDesc.SpY = 0;
local Mine = new CMine(Root->GetObject(25, 0), &MParams, &SDesc, false, 0);
}
override void CMissile::ExplodeAt(fixed x,fixed y)
{
if(MagicMole != NullObj)
{
if(MagicMole == this)
{
SpawnMineMole(x,y, MagicMole->initdesc.Team); //DESYNC ?
MagicMole = NullObj;
MagicMolePosX = 0;
MagicMolePosX = 0;
MagicMoleExplodeTimer = 0;
//GG->WriteToChat( 1, "mm null", false);
}
}
if(MagicMoleNM != NullObj)
{
if(MagicMoleNM == this)
{
MagicMoleNM = NullObj;
MagicMolePosXNM = 0;
MagicMolePosXNM = 0;
}
}
if(weap->CheckName("Super Mole Bomb") == true && MagicMole == NullObj)
{
MagicMolePosX = x;
MagicMolePosY = y;
MagicMoleExplodeTimer = 10;
WalkingMole = NullObj;
super;
}
if(weap->CheckName("Mole Bomb") == true && MagicMoleNM == NullObj)
{
MagicMolePosXNM = x;
MagicMolePosYNM = y;
WalkingMoleNM = NullObj;
super;
}
super;
}
override void CTurnGame::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if(Type == M_FRAME)
{
if(MagicMole != NullObj || WalkingMole != NullObj)
{
//if(CustomRetreatTimer == 0){CustomRetreatTimer = RetreatTimer;} //freezing Retreat Timer while Moles are active.
RetreatTimer = 30; //seems to prevent antiglitch, a value of 5 breaks mole movement
//GG->WriteToChat( 1, "retreat set", false);
}
}
if(Type == M_TURNBEGIN)
{
if(CustomRetreatTimer != 0){CustomRetreatTimer = 0;}
}
super;
}
/*
override void CWorm::FireFinal(CWeapon* Weap, CShootDesc* Desc)
{
if(Weap->CheckName("Mole Bomb"))
{
SetSpriteOverride(158 , mfn);
SetSpriteOverride(159 , mn1);
SetSpriteOverride(160 , mn2);
SetSpriteOverride(161 , mn3);
SetSpriteOverride(166 , mwn);
}
else if(Weap->CheckName("Super Mole Bomb"))
{
SetSpriteOverride(158 , mfk);
SetSpriteOverride(159 , mk1);
SetSpriteOverride(160 , mk2);
SetSpriteOverride(161 , mk3);
SetSpriteOverride(166 , mwk);
}
super;
}
*/