Code:
require utils, respawn;
#TRAPS
$editor
$object Trap
$origin -15 -15
$image "edtrap.png"
$func SpawnTrap
$radius 17
$param Type enum 4 Bazooka Grenades Mortar HomingMissile
$param Angle angle 180
$param Force int 8
$param Spread int 15
$param Delay int 4
$param ShootDelay int 8
$param GrenadeTimer int 1000
$param ProximityZone objectt Zone
$param IsBadSphere bool false
$param EndAngle angle 180
$param nAngles int 10
$object_end
$object Zone
$origin -15 -15
$image "edzone.png"
$radius 17
$autoname Zone
$func SpawnZone
$param Size area 50 50
$param ActiveWormOnly bool true
$object_end
$object GameControl
$origin -15 -15
$image "edgcontrol.png"
$radius 17
$func SpawnGControl
$param NoWind bool false
$param NoWaiting bool false
$param ForceHealth int 0
$param EnableRespawn bool false
$param RespawnDelay int 0
$param Lifes int 1
$param MaxHealth int 0
$object_end
$object WormSupply
$origin -13 -15
$image "edworm.png"
$radius 17
$func SpawnWormSupply
$param ProximityZone objectt Zone
$param OffsetXPerWorm int 16;
$object_end
$object WormCheckpoint
$origin -13 -15
$image "edworm.png"
$radius 17
$func SpawnWormCheckpoint
$param ProximityZone objectt Zone
$param Order int 1
$object_end
$object Teleport
$origin -15 -15
$image "edcross.png"
$radius 17
$func SpawnTeleport
$autoname Tport
$param LinkedTo objectt Teleport
$param IsToRightSide bool true
$param ExitOnly bool false
$param TeleportMissiles bool true
$param TrapTeleport bool false
$param Size area 50 50
$param Color color 0 0 0
$param HighlightSize int 20
$object_end
$end
CFilter* gTrapParent;
bool gNoWaiting;
void trapsobjs::InitSMap()
{ //50 is a random number. Don't look for meaning of life here.
filter = new CFilter(Root, 50);
filter->ForbidAll();
filter->Allow(M_FRAME);
filter->Allow(M_DRAWQUEUE);
gTrapParent = filter;
gControl = CEGameControl(NullObj);
};
CTrap : CObject;
CZone : CObject;
CEGameControl : CObject;
CWormSupply : CObject;
CWormCheckpoint : CObject;
CMapTeleport : CObject;
CWormCheckpoint* gCheckpoints[48];
fixed gStartPosX[48];
fixed gStartPosY[48];
string gWormNames[48];
int gAliveWorms[9];
CEGameControl* gControl;
CSoundFile* checkpointPassSound;
void trapsobjs::InitGraphic()
{
local f = GetAttachment("checkpass1.wav");
checkpointPassSound = new CSoundFile(f);
}
CZone* SearchForZone(string ZName)
{
for (local i = 0; i < gTrapParent->Childs.Count; i += 1)
{
local obj = CZone(gTrapParent->Childs.Objs[i]);
if (obj is CZone)
{
if (StrCmp(obj->zone_name, ZName))
{
return obj;
};
};
};
return NullObj;
};
CZone::CZone(CEditorObject* aobj)
{
super(gTrapParent, GS);
pr_x1 = aobj->PosX;
pr_x2 = aobj->PosX + aobj->GetInt("Size");
pr_y1 = aobj->PosY;
pr_y2 = aobj->PosY + aobj->GetInt2("Size");
AcitveWormOnly = aobj->GetBool("ActiveWormOnly");
active = false;
activator = CGObject(NullObj);
timer = 0;
zone_name = StrSave(aobj->GetName());
};
void CZone::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type != M_FRAME) return;
timer += 1;
if (timer % 5) return; //performance
active = false;
if (AcitveWormOnly)
{
local obj = GetCurrentWorm();
if (obj == NullObj) return;
if (pr_x1 < obj->PosX && pr_x2 > obj->PosX)
{
if (pr_y1 < obj->PosY && pr_y2 > obj->PosY)
{
active = true;
activator = obj;
};
};
return;
};
for (local i = 1; i < Env->Objs.Count; i += 1)
{
local obj = CWorm(Env->Objs.Objs[i]);
if (obj == NullObj) continue;
if (obj->ClType != OC_Worm) continue;
if (pr_x1 < obj->PosX && pr_x2 > obj->PosX)
{
if (pr_y1 < obj->PosY && pr_y2 > obj->PosY)
{
active = true;
activator = obj;
break;
};
};
};
};
CTrap::CTrap(CEditorObject* aobj)
{
super(gTrapParent, GS);
zone = CZone(NullObj);
PosX = aobj->PosX;
PosY = aobj->PosY;
Angle = aobj->GetAngle("Angle");
EndAngle = aobj->GetAngle("EndAngle");
Force = aobj->GetInt("Force");
Spread = aobj->GetInt("Spread");
Delay = aobj->GetInt("Delay");
ShootDelay = aobj->GetInt("ShootDelay");
ZoneName = StrSave(aobj->GetString("ProximityZone"));
gTimer = aobj->GetInt("GrenadeTimer");
isBadSphere = aobj->GetBool("IsBadSphere");
nAngles = aobj->GetInt("nAngles");
curAngle = 0;
if (StrCmp(aobj->GetString("Type"), "Bazooka"))
{
Type = 1;
};
if (StrCmp(aobj->GetString("Type"), "Grenades"))
{
Type = 2;
};
if (StrCmp(aobj->GetString("Type"), "Mortar"))
{
Type = 3;
};
if (StrCmp(aobj->GetString("Type"), "HomingMissile"))
{
Type = 4;
};
timer = 0;
timer2 = 0;
timerToDisable = 60;
active = false;
};
CMissile* Missile_HTarget;
override CMissile::CMissile(CObject* parent,CWeaponLaunch* ldata,CShootDesc* sdata)
{
alwaysHomeTarget = Missile_HTarget;
Missile_HTarget = CGObject(NullObj);
super;
}
override void CMissile::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type == M_FRAME)
{
if (alwaysHomeTarget != NullObj)
{
if (GS->GetRandom() % 5 == 2)
{
initdesc.AddX = alwaysHomeTarget->PosX;
initdesc.AddY = alwaysHomeTarget->PosY;
}
}
}
super;
}
void CTrap::Shoot()
{
CShootDesc sdesc;
zero(&sdesc);
sdesc.X = PosX;
sdesc.Y = PosY;
local fSpread = (Spread / 180.0) * 3.141;
local da = Angle + srandom_b() * fSpread;
if (isBadSphere)
{
local daa = (EndAngle - Angle) / nAngles;
da = daa * curAngle + Angle;
sdesc.X += Spread * sin(da);
sdesc.Y -= Spread * cos(da);
curAngle += 1;
if (curAngle > nAngles) curAngle = 0;
};
local dx = sin(da) * (Force + srandom_b() * Force * 0.1);
local dy = -cos(da) * (Force + srandom_b() * Force * 0.1);
sdesc.SpX = dx;
sdesc.SpY = dy;
sdesc.Delay = gTimer;
local ldata;
if (Type == 1)
ldata = GetWeaponByName("Bazooka");
if (Type == 2)
ldata = GetWeaponByName("Grenade");
if (Type == 3)
ldata = GetWeaponByName("Mortar");
if (Type == 4)
{
ldata = GetWeaponByName("Homing Missile");
sdesc.AddX = zone->activator->PosX;
sdesc.AddY = zone->activator->PosY;
};
if (ldata == NullObj) return;
if (Type == 4) Missile_HTarget = zone->activator;
local missile = new CMissile(Root->GetObject(25, 0), &ldata->launch, &sdesc);
};
void CTrap::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type != M_FRAME) return;
if (Root->IsTimerActive() == false)
{
if (timerToDisable <= 0)
{
return;
} else {
timerToDisable -= 1;
};
} else {
timerToDisable = 60;
};
if (zone == NullObj)
{
zone = SearchForZone(ZoneName);
return;
};
if (active == false) //the following code is complex
{ //because it supports pre-delay,
if (zone->active) //shooting delay, and post-delay
{ //lol.
timer += 1;
if (timer >= ShootDelay)
{
active = true;
curAngle = 0;
// ShowMessage("I M ACTIVATED ASDASDASD!");
timer2 = 0;
};
} else {
timer = 0;
};
} else {
if (timer2 > Delay)
{
timer2 = 0;
Shoot();
} else {
timer2 += 1;
};
if (zone->active == false)
{
timer -= 1;
if (timer <= 0)
{
active = false;
timer = 0;
timer2 = 0;
};
};
};
};
CEGameControl::CEGameControl(CEditorObject* aobj)
{
gControl = this;
super(gTrapParent, GS);
noWind = aobj->GetBool("NoWind");
gNoWaiting = aobj->GetBool("NoWaiting");
Health = aobj->GetInt("ForceHealth");
MaxHealth = aobj->GetInt("MaxHealth");
if (Health > 0)
{
for (local i = 1; i <= 6; i+=1)
{
for (local j = 1; j <= 8; j+=1)
{
if (Root->GetObject(2, j + i * 16))
{
GS->Info.SetWormHealth(i, j, Health);
};
};
};
};
if (Root->GetObject(2, 1 + 16))
{
WormsHealth = GS->Info.GetWormHealth(1, 1);
};
for (local i = 0; i < 48; i += 1) gCheckpoints[i] = NullObj;
respawn = aobj->GetBool("EnableRespawn");
nlifes = aobj->GetInt("Lifes");
rDelay = aobj->GetInt("RespawnDelay");
if (respawn)
{
rControl->Enable(rDelay);
}
cInitialized = false;
};
void CEGameControl::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type != M_FRAME) return;
if (noWind)
{
Env->Wind = 0;
};
if (cInitialized == false)
{
for (local j = 1; j <= 6; j += 1)
{
gAliveWorms[j] = 0;
for (local i = 1; i <= 8; i += 1)
{
local objWorm = CWorm(Root->GetObject(2, i + j * 16));
if (objWorm)
{
local wIndex = i + j * 8 - 9;
gStartPosX[wIndex] = objWorm->PosX;
gStartPosY[wIndex] = objWorm->PosY;
rControl->SetRespawnPosition(i, j, objWorm->PosX, objWorm->PosY);
gWormNames[wIndex] = objWorm->GetName();
gAliveWorms[j] += 1;
};
};
};
cInitialized = true;
};
};
override void CWorm::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (gControl== NullObj) return super;
if(gControl->MaxHealth == 0) return super;
if(Type == M_FRAME)
{
local HP = GS->Info.GetWormHealth(WormTeam, WormNumber);
if (HP > gControl->MaxHealth)
GS->Info.SetWormHealth(WormTeam, WormNumber, gControl->MaxHealth);
}
super;
}
CWormSupply::CWormSupply(CEditorObject* obj)
{
super(gTrapParent, GS);
ZoneName = StrSave(obj->GetString("ProximityZone"));
zone = CZone(NullObj);
PosX = obj->PosX;
PosY = obj->PosY;
offX = obj->GetInt("OffsetXPerWorm");
TeamsDone = new bool[6]; //it's only working way..
for (local i = 0; i < 6; i+=1) TeamsDone[i] = false;
};
void CWormSupply::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type != M_FRAME) return;
if (zone == NullObj)
{
zone = SearchForZone(ZoneName);
return;
};
if (zone->active == false) return;
local worm = CWorm(zone->activator);
if (worm is CWorm)
{
local tindex = worm->WormTeam;
if (TeamsDone[tindex]) return;
local windex = GetFreeWormIndex(tindex);
if (windex <= 0) return;
ShowMessage("You've got new worm!");
local newWorm = RessurectWorm(windex, tindex, PosX, PosY);
TeamsDone[tindex] = true;
PosX += offX;
};
};
CWormCheckpoint::CWormCheckpoint(CEditorObject* obj)
{
super(gTrapParent, GS);
ZoneName = StrSave(obj->GetString("ProximityZone"));
zone = CZone(NullObj);
PosX = obj->PosX;
PosY = obj->PosY;
order = obj->GetInt("Order");
};
void CWormCheckpoint::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type != M_FRAME) return;
if (zone == NullObj)
{
zone = SearchForZone(ZoneName);
return;
};
if (zone->active == false) return;
local wormObj = CWorm(zone->activator);
if (wormObj is CWorm)
{
local wIndex = wormObj->WormTeam * 8 + wormObj->WormNumber;
if (wIndex > 48) return;
if (wIndex < 0) return;
if (gCheckpoints[wIndex] == NullObj || gCheckpoints[wIndex]->order < order)
{
if (gCheckpoints[wIndex] != NullObj)
{
checkpointPassSound->Play(1, 0, false);
ShowMessage("Checkpoint!");
}
gCheckpoints[wIndex] = this;
rControl->SetRespawnPosition(wormObj->WormNumber, wormObj->WormTeam, PosX - 5, PosY - 15);
}
}
}
CMapTeleport::CMapTeleport(CEditorObject* aobj)
{
super(gTrapParent, GS);
pr_x1 = aobj->PosX;
pr_x2 = aobj->PosX + aobj->GetInt("Size");
pr_y1 = aobj->PosY;
pr_y2 = aobj->PosY + aobj->GetInt2("Size");
isRight = aobj->GetBool("IsToRightSide");
isExit = aobj->GetBool("ExitOnly");
tpMissiles = aobj->GetBool("TeleportMissiles");
trapTeleport = aobj->GetBool("TrapTeleport");
hSize = aobj->GetInt("HighlightSize") / 2;
hColor = aobj->GetInt("Color");
hX = 0; hY = 0; hTraced = false;
hSize = (pr_x2 - pr_x1) / 2;
if (isRight)
{
tp_x = int(pr_x1 + ((pr_x2 - pr_x1) / 3) * 2);
} else {
tp_x = int(pr_x1 + (pr_x2 - pr_x1) / 3);
};
tp_y = int((pr_y1 + pr_y2) / 2);
timer = 0;
waiting = false;
LinkedTo = StrSave(aobj->GetString("LinkedTo"));
t_name = StrSave(aobj->GetName());
linked = CMapTeleport(NullObj);
};
void CMapTeleport::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
if (Type == M_DRAWQUEUE)
{
if (hTraced && hSize > 0 && hColor != 0)
{
CQuad q;
q.blend = 0; q.tex = 0;
q.v[0].x = hX - hSize;
q.v[0].y = hY;
q.v[1].x = hX - hSize;
q.v[1].y = hY - 20;
q.v[2].x = hX + hSize;
q.v[2].y = hY - 20;
q.v[3].x = hX + hSize;
q.v[3].y = hY;
cAdd = int( float(random() * 25) ) << 24;
q.v[0].color = hColor | $A0000000 + cAdd;
q.v[1].color = hColor & $00FFFFFF;
q.v[2].color = hColor & $00FFFFFF; //hColor & $00FFFFFF
q.v[3].color = hColor | $A0000000 + cAdd;
AddSpriteQ(26, &q, 0, 0, 0);
}
}
if (Type != M_FRAME) return;
if (linked == NullObj)
{
if (StrCmp(LinkedTo, "")) return;
for (local i = 0; i < gTrapParent->Childs.Count; i += 1)
{
local obj = CMapTeleport(gTrapParent->Childs.Objs[i]);
if (obj is CMapTeleport)
{
if (StrCmp(obj->t_name, LinkedTo))
{
linked = obj;
linked->linked = this;
if (hColor != 0)
{
linked->hColor = hColor;
} else if (linked->hColor != 0)
{
hColor = linked->hColor;
}
break;
}
}
}
return;
}
if (!hTraced)
{
if (hColor != 0 && hSize != 0)
{
local fx = (pr_x1 + pr_x2) / 2;
local fy = (pr_y1 + pr_y2) / 2;
local obj = TraceLine(NullObj, fx, fy, fx, fy + 40, -1, &hX, &hY);
hTraced = true;
hY += 2;
if (obj == NullObj) hSize = 0;
}
}
if (isExit)
{
waiting = false;
return;
}
if (trapTeleport)
{
for (local i = 1; i < Env->Objs.Count; i++)
{
local w = CWorm(Env->Objs.Objs[i]);
if (w == NullObj) continue;
if (w->ClType != OC_Worm) continue; //faster than IS operator, btw.
if (pr_x1 < w->PosX && pr_x2 > w->PosX && pr_y1 < w->PosY && pr_y2 > w->PosY)
{
w->PosX = linked->tp_x;
w->PosY = linked->tp_y;
if (isRight == linked->isRight) w->SpX = -w->SpX;
}
}
return;
}
if (tpMissiles)
{
for (local i = 1; i < Env->Objs.Count; i++)
{
local m = CMissile(Env->Objs.Objs[i]);
if (m == NullObj) continue;
if (m->ClType != OC_Missile) continue; //faster than IS operator, btw.
if (pr_x1 < m->PosX && pr_x2 > m->PosX && pr_y1 < m->PosY && pr_y2 > m->PosY)
{
if (m->tLastTeleport != this)
{
m->tLastTeleport = linked;
m->PosX = linked->tp_x;
m->PosY = linked->tp_y;
if (isRight == linked->isRight) m->SpX = -m->SpX;
}
} else {
if (m->tLastTeleport == this) m->tLastTeleport = NullObj;
}
}
}
local worm = GetCurrentWorm();
if (worm == NullObj)
{
waiting = true;
return;
}
if (pr_x1 < worm->PosX && pr_x2 > worm->PosX)
{
if (pr_y1 < worm->PosY && pr_y2 > worm->PosY)
{
if (waiting == false && linked->waiting == false)
{
waiting = true;
linked->waiting = true;
if (worm->ColMask->Check(linked->tp_x, linked->tp_y, CGObject(Env->Objs.Objs[0])->ColMask, 0, 0))
{
GG->land->MakeHole( 15, linked->tp_x, linked->tp_y);
}
if (worm->ObjState == WS_WALKING) worm->SetState(WS_IDLE);
worm->PosX = linked->tp_x;
worm->PosY = linked->tp_y;
if (isRight == linked->isRight)
{
worm->SpX = -worm->SpX;
worm->TurnSide = -worm->TurnSide;
};
};
return;
};
};
waiting = false;
};
void SpawnTrap(CEditorObject* obj)
{
trap = new CTrap(obj);
};
void SpawnZone(CEditorObject* obj)
{
zone = new CZone(obj);
};
void SpawnGControl(CEditorObject* obj)
{
gc = new CEGameControl(obj);
};
void SpawnWormSupply(CEditorObject* obj)
{
gc = new CWormSupply(obj);
};
void SpawnWormCheckpoint(CEditorObject* obj)
{
gc = new CWormCheckpoint(obj);
};
void SpawnTeleport(CEditorObject* obj)
{
gc = new CMapTeleport(obj);
};
So I'm need to add a function that allow you to set up a mines in the map like others - grenade , zooka etc.. but for my map need a mines trap . I tried to add it here
Code:
$param Type enum 5 Bazooka Grenades Mortar Mine HomingMissile
and here
Code:
if (StrCmp(aobj->GetString("Type"), "Bazooka"))
{
Type = 1;
};
if (StrCmp(aobj->GetString("Type"), "Grenades"))
{
Type = 2;
};
if (StrCmp(aobj->GetString("Type"), "Mortar"))
{
Type = 3;
};
if (StrCmp(aobj->GetString("Type"), "Mines"))
{
Type = 4;
};
if (StrCmp(aobj->GetString("Type"), "HomingMissile"))
{
Type = 5;
};
But nothing happens , only crashes... So as i understood , need to add a script of the mine ?
Somebody can help me pls :c