const int NUMBEROFPLATFORMS = 24;
const int LENGTH = 22;
const int MORPHBEAMHEIGHT = 51;
int GameTimer = 0;
int RedScore = 0;
int BlueScore = 0;
array<jjOBJ@> SmokeTunnel(MORPHBEAMHEIGHT);
array<int> TimeTillNextAbleToMorph(4, 0);
bool MorphBeam = false;
bool SpikePlatforms = false;
int DevilDevan = 0;
array<int> Prices =
{100, 90, 80, 75, 70, 65, 60, 55, 50, 50, 50, 50, 50, 50, 50, 50,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25};
bool AdjustedSuckerTubes = false;
void onLevelLoad() {
for (int i = 1; i < 2560; ++i) {
if (i >= 510 && jjGameConnection == GAME::LOCAL) break;
jjDeleteObject(i);
}
for (int i = 0; i < NUMBEROFPLATFORMS; ++i) { //this loop is kind of ugly, alas.
jjOBJ@ o = jjObjects[jjAddObject(OBJECT::GRASSPLATFORM, 40*32,27*32)];
o.state = STATE::ACTION;
o.var[1] = -1;
o.var[2] = LENGTH;
o.frameID = 0;
o.determineCurFrame();
o.var[0] = i * (1024/NUMBEROFPLATFORMS);
o.var[5] = o.var[1];
o.counter = jjGameTicks;
o.var[4] = jjGameTicks*o.var[1]+o.var[0];
o.noHit = 1;
if ((i & 1) == 0) {
@o = jjObjects[jjAddObject(OBJECT::GRASSPLATFORM, 40*32,27*32)];
o.state = STATE::ACTION;
o.var[1] = 2;
o.var[2] = LENGTH / 2;
o.frameID = 0;
o.determineCurFrame();
o.var[0] = i * (1024/NUMBEROFPLATFORMS);
o.var[5] = o.var[1];
o.counter = jjGameTicks;
o.var[4] = jjGameTicks*o.var[1]+o.var[0];
o.noHit = 1;
}
}
jjObjectPresets[OBJECT::APPLE].lightType = LIGHT::BRIGHT; //the morph beam
jjObjectPresets[OBJECT::APPLE].light = 18;
jjObjectPresets[OBJECT::APPLE].objType = 8;
jjObjectPresets[OBJECT::APPLE].eventID = OBJECT::COPTER; //use copters and .fly as signal to morph, since
jjObjectPresets[OBJECT::APPLE].var[4] = 1; //copters aren't destroyed when used, and change
jjObjectPresets[OBJECT::APPLE].noHit = 1 | 8; //the jjPLAYER in a way AngelScript can detect
jjObjectPresets[OBJECT::APPLE].state = STATE::IDLE; //doesn't display a sprite
jjObjectPresets[OBJECT::ELECTROBULLET].objType = 9; //not treated as a bullet
jjObjectPresets[OBJECT::ELECTROBULLETPU].objType = 9; //not treated as a bullet
jjObjectPresets[OBJECT::DEVILDEVAN].var[7] = 1; //devil form boolean
jjObjectPresets[OBJECT::DEVILDEVAN].state = STATE::FLY;
jjObjectPresets[OBJECT::DEVILDEVAN].energy = 0; //unkillable
jjObjectPresets[OBJECT::DEVILDEVAN].noHit = 1 + 4 + 8; //unhurtable -- ricochet -- unfreezable
jjObjectPresets[OBJECT::DEVILDEVAN].determineCurAnim(ANIM::DEVILDEVAN, 8); //flying
}
void onMain() {
if (!AdjustedSuckerTubes) {
if (jjGameState == GAME::STARTED && jjGameTicks > 10) { //some initial time for setup, just in case
AdjustedSuckerTubes = true;
if (jjGameMode != GAME::CTF) { //remove all the Bank Robbery tiles/events
jjEventSet(3,23, 0);
jjEventSet(76,23, 0);
jjTileSet(3, 38,4, 0);
jjTileSet(3, 41,4, 0);
for (int y = 0; y < 6; ++y)
for (int x = 24; x < 50; ++x) {
jjEventSet(x,y, 0);
jjTileSet(4, x,y, 0);
}
for (int i = 1; i < jjObjectCount; ++i) {
jjOBJ@ o = jjObjects[i];
if (o.isActive && (o.eventID == OBJECT::PULSELIGHT)) {
jjDeleteObject(i);
o.eventID = 0; //just to be safe
}
}
}
if (!jjIsServer) {
jjParameterSet(2,23, 15, 1, 1);
jjParameterSet(77,23, 15, 1, 1);
}
else if (jjGameMode == GAME::CTF)
jjChat("/maxscore 255");
} else if ((jjIsServer || jjIsAdmin) && (jjGameTicks & 511) == 2) {
p.showText("@@@@@@Turn on Trigger 0 to enable the morph beam!@@Turn on Trigger 1 to enable spike platforms,@or Trigger 2 to enable Devan Shell!@@@@In Bank Robbery, turn on Trigger 3 to@limit the coin intake to STANDING players.");
}
} else {
if (jjIsServer) {
if (jjGameMode == GAME::CTF) {
int newRedScore = RedScore;
int newBlueScore = BlueScore;
for (int i = 1; i < jjObjectCount; ++i) {
jjOBJ@ o = jjObjects[i];
if (o.isActive && o.eventID == OBJECT::ELECTROBULLET) {
jjDeleteObject(i);
o.eventID = 0; //since I'm not checking isActive
++newBlueScore;
} else if (o.isActive && o.eventID == OBJECT::ELECTROBULLETPU) {
jjDeleteObject(i);
o.eventID = 0; //just to be safe
++newRedScore;
}
}
if (newRedScore > 254) { newRedScore = 254; jjChat("/redscore 254"); jjChat("/stop"); }
else if (newRedScore > RedScore) {
RedScore = newRedScore;
jjChat("/redscore " + RedScore);
}
if (newBlueScore > 254) { newBlueScore = 254; jjChat("/bluescore 254"); jjChat("/stop"); }
else if (newBlueScore > BlueScore) {
BlueScore = newBlueScore;
jjChat("/bluescore " + BlueScore);
}
}
} else {
++GameTimer;
if (jjTriggers[0]) {
if (!MorphBeam) {
MorphBeam = true;
for (int i = 0; i < MORPHBEAMHEIGHT; ++i)
@SmokeTunnel[i] = jjObjects[jjAddObject(OBJECT::APPLE, 40*32,i*32)];
}
else for (int i = 0; i < MORPHBEAMHEIGHT; ++i) {
SmokeTunnel[i].xPos = SmokeTunnel[i].xOrg + jjSin(GameTimer/2) * 1024 + jjSin(GameTimer*5) * i * 8;
SmokeTunnel[i].var[4] = 1;
}
}
if (jjTriggers[1] != SpikePlatforms) {
if (SpikePlatforms = jjTriggers[1]) {
for (int i = 1; i < jjObjectCount; ++i) {
jjOBJ@ o = jjObjects[i];
if (o.eventID == OBJECT::GRASSPLATFORM) {
o.eventID = OBJECT::SPIKEPLATFORM;
o.curAnim = jjObjectPresets[OBJECT::SPIKEPLATFORM].curAnim;
o.determineCurFrame();
}
}
} else {
for (int i = 1; i < jjObjectCount; ++i) {
jjOBJ@ o = jjObjects[i];
if (o.eventID == OBJECT::SPIKEPLATFORM) {
o.eventID = OBJECT::GRASSPLATFORM;
o.curAnim = jjObjectPresets[OBJECT::GRASSPLATFORM].curAnim;
o.determineCurFrame();
}
}
}
}
if (jjTriggers[2] == (DevilDevan == 0 || jjObjects[DevilDevan].eventID != OBJECT::DEVILDEVAN)) {
if (jjTriggers[2]) {
DevilDevan = jjAddObject(OBJECT::DEVILDEVAN, 40*32, -64);
} else {
if (jjObjects[DevilDevan].eventID == OBJECT::DEVILDEVAN) //just to be sure
jjDeleteObject(DevilDevan);
DevilDevan = 0;
}
} else if (DevilDevan != 0) {
if (jjObjects[DevilDevan].counter == 0) { //in a mood to target someone
++jjObjects[DevilDevan].counter;
jjObjects[DevilDevan].var[5] = jjLocalPlayers[0].playerID; //new target, same as the old target
}
if (GameTimer & 7 == 0) { //don't need to check this one very often
for (int i = 1; i < jjObjectCount; ++i) {
jjOBJ@ o = jjObjects[i];
if (o.eventID == 20 && o.animSpeed == 1) {
o.animSpeed = 2;
o.counterEnd += 200;
o.ySpeed = 5;
o.xSpeed = o.direction * 5;
}
}
}
}
if (jjGameMode == GAME::CTF) for (int i = 1; i < jjObjectCount; ++i) {
jjOBJ@ o = jjObjects[i];
if (o.isActive && (o.eventID == OBJECT::ELECTROBULLET || o.eventID == OBJECT::ELECTROBULLETPU)) {
jjDeleteObject(i);
o.eventID = 0; //just to be safe
}
}
}
}
}
void onFunction0() {
if (jjGameState == GAME::STARTED && p.testForCoins(Prices[0])) {
string result = "@@@§1You paid "+ formatInt(Prices[0], "1") + " coins!";
int timesScored = 1;
p.powerup[9] = p.teamRed;
p.fireBullet(9, false, false, DIRECTION::UP); //simplest way of communicating to the server
while (p.testForCoins(Prices[timesScored])) {
if (timesScored < 22) result += "@You paid "+ formatInt(Prices[timesScored], "1") + " coins!";
p.fireBullet(9, false, false, DIRECTION::UP);
++timesScored;
}
if (p.teamRed)
jjChat("/me scored |||" + formatInt(timesScored, "1") + " |||||point" + ( (timesScored == 1) ? "!" : "s!"));
else
jjChat("/me scored ||||" + formatInt(timesScored, "1") + " ||||point" + ( (timesScored == 1) ? "!" : "s!"));
p.showText(result);
p.health = 1;//jjMaxHealth;
}
}
void onPlayer() {
if (p.fly > 0) {
p.fly = FLIGHT::NONE;
if (TimeTillNextAbleToMorph[p.localPlayerID] == 0) {
p.morph(true, true);
jjSample(p.xPos, p.yPos, SOUND::COMMON_HOLYFLUT);
jjSample(p.xPos, p.yPos, SOUND::COMMON_BUBBLGN1);
TimeTillNextAbleToMorph[p.localPlayerID] = 70; //one second
}
}
if (TimeTillNextAbleToMorph[p.localPlayerID] > 0)
--TimeTillNextAbleToMorph[p.localPlayerID];
if (!jjIsServer && jjGameState == GAME::STARTED && jjGameMode == GAME::CTF && (GameTimer & 7) == 1 && p.xPos >= 4*32 && p.xPos <= 76*32 && (!jjTriggers[3] || p.platform > 0)) {
jjAddObject(OBJECT::SILVERCOIN, p.xPos, p.yPos);
}
}