Name | Author | Game Mode | Rating | |||||
---|---|---|---|---|---|---|---|---|
![]() |
Anniversary Bash 27 CTF | Jazz2Online | Capture the flag | N/A | ![]() |
const bool MLLESetupSuccessful = MLLE::Setup(array<MLLEWeaponApply@> = {null, null, se::RollerMLLEWrapper(), null, null, SuperToaster::Weapon(), SzmolWeaponPack::PetrolBombEdit::Weapon(), null, null}); ///@MLLE-Generated
#include "MLLE-Include-1.7w.asc" ///@MLLE-Generated
#pragma require "ab27ctf20-MLLE-Data-3.j2l" ///@MLLE-Generated
#pragma require "ab27ctf20-MLLE-Data-2.j2l" ///@MLLE-Generated
#pragma require "ab27ctf20-MLLE-Data-1.j2l" ///@MLLE-Generated
#pragma require "Castle1.j2t" ///@MLLE-Generated
#pragma require "ab27ctf20.j2l" ///@MLLE-Generated
#include "petrolBombEdit.asc" ///@MLLE-Generated
#pragma require "petrolBombEdit.asc" ///@MLLE-Generated
#include "SuperToaster.asc" ///@MLLE-Generated
#pragma require "SuperToaster.asc" ///@MLLE-Generated
#include "SEroller-mlle.asc" ///@MLLE-Generated
#pragma require "SEroller-mlle.asc" ///@MLLE-Generated
///@SaveAndRunArgs -server -capture ///@MLLE-Generated
#pragma require "ezwharf_oceanwaves.ogg"
#pragma require "SSW2_SET2_bigship.png"
#include "MLLE-Weapons.asc"
///@Event 33=Roller Ammo (+3) |+|Ammo |Roller |Am+3
///@Event 38=Petrol Bomb |+|Ammo |Petrol |Bomb
///@Event 80=Tentacle |+|Object |Tenta- |-cle |Angle:3 |Dark:1 |Size:1 |Direction:1 |Layer:3
bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
return MLLE::WeaponHook.drawAmmo(player, canvas);
}
int sample = 0;
array<int> tentacles;
int ticket = 0;
void onLevelLoad() {
jjSetWaterLevel(33.75*32,true);
jjWaterLayer = 999;
jjWaterLighting = WATERLIGHT::GLOBAL;
water::maxOxygen = 800;
jjWeapons[WEAPON::GUN8].gradualAim = true;
jjWeapons[WEAPON::GUN8].spread = SPREAD::NORMAL;
generateCustomSpringSprites(jjAnimSets[ANIM::CUSTOM[50]], array<uint> = {40});
turnIntoCustomSpring(jjObjectPresets[OBJECT::FROZENSPRING], 0, 19.5f, false);
jjAnimSets[ANIM::CUSTOM[69]].load(
jjPIXELMAP("SSW2_SET2_bigship.png"),
frameWidth: 544,
frameHeight: 544
);
jjANIMFRAME@ frame;
@frame = jjAnimFrames[jjAnimations[jjAnimSets[ANIM::PICKUPS].firstAnim].firstFrame];
jjPIXELMAP(0, 37*32, 3*32, 5*32, 7).save(frame);
frame.hotSpotX = -frame.width/2;
frame.hotSpotY = -frame.height;
jjObjectPresets[OBJECT::ONEUP].behavior = Tentacle();
jjObjectPresets[OBJECT::ONEUP].isBlastable = jjObjectPresets[OBJECT::ONEUP].triggersTNT = false;
jjObjectPresets[OBJECT::ONEUP].playerHandling = HANDLING::PARTICLE;
jjObjectPresets[OBJECT::ONEUP].bulletHandling = HANDLING::IGNOREBULLET;
jjObjectPresets[OBJECT::ONEUP].age = 240;
}
bool inView(const jjOBJ@ obj) {
for (int i = 0; i < jjLocalPlayerCount; i++) {
const jjPLAYER@ player = jjLocalPlayers[i];
if (obj.xPos > player.cameraX - 256 && obj.yPos > player.cameraY - 256 && obj.xPos < player.cameraX + jjSubscreenWidth + 256 && obj.yPos < player.cameraY + jjSubscreenHeight + 256)
return true;
}
return false;
}
class Tentacle : jjBEHAVIORINTERFACE {
void onBehave(jjOBJ@ obj) {
int angle = jjParameterGet(int(obj.xPos/32),int(obj.yPos/32),0,3);
int dark = jjParameterGet(int(obj.xPos/32),int(obj.yPos/32),3,1);
int size = jjParameterGet(int(obj.xPos/32),int(obj.yPos/32),4,1);
int direction = jjParameterGet(int(obj.xPos/32),int(obj.yPos/32),5,1);
int layer = jjParameterGet(int(obj.xPos/32),int(obj.yPos/32),6,3);
int palette = dark == 1? 10:9;
int rotationOffset = angle == 0? 80 : angle == 1? 0 : angle >= 2? -80 : 0;
float scale = size == 1? 0.5 : 1;
int layerZ = layer == 0? 2 : layer == 1? 6 : layer >= 2? 14 : 2;
if (obj.var[0] == 1 && obj.age > 0) {
if (jjGameTicks % 2 == 0) obj.age--;
}
if (jjGameTicks >= 60*70 && jjGameTicks % 490 == 0) {
if (obj.eventID == OBJECT::EXTRALIFE && int(obj.xPos/32) == ticket && obj.var[0] == 0) {
obj.var[0] = 1;
//jjDebug("spawn " + int(obj.xPos/32),false);
}
}
if (tentacles.length() == 1 && jjGameTicks > 1) obj.var[0] = 1;
if (inView(obj) && obj.var[0] == 1) jjDrawRotatedSprite(obj.xPos, obj.yPos + obj.age, ANIM::PICKUPS, 0, 0, (int(jjSin((jjGameTicks+int(obj.xPos)) << 2) * 28)+rotationOffset), scale * (direction == 1? -1:1), scale, SPRITE::MAPPING, palette, layerZ);
}
}
jjANIMSET@ customSpringSprite;
array<int> fastCustomSpringSpeeds(jjLocalPlayerCount);
bool generateCustomSpringSprites(jjANIMSET@ anim, const array<uint> &in colors) {
int length = colors.length();
bool success = (@customSpringSprite = anim).allocate(array<uint>(length * 3, 5)) !is null;
if (success) {
uint srcSet = jjAnimSets[ANIM::SPRING];
for (int i = 0; i < length; i++) {
uint color = colors[i];
uint destAnimOffset = anim + i * 3;
for (int j = 0; j < 3; j++) {
uint srcAnim = jjAnimations[srcSet + j];
uint destAnim = jjAnimations[destAnimOffset + j];
for (int k = 0; k < 5; k++) {
jjPIXELMAP image(jjAnimFrames[destAnim + k] = jjAnimFrames[srcAnim + k]);
int width = image.width;
int height = image.height;
for (int l = 0; l < height; l++) {
for (int m = 0; m < width; m++) {
int pixel = image[m, l];
if (pixel >= 32 && pixel < 40)
image[m, l] = color + (pixel & 7);
}
}
if (!image.save(jjAnimFrames[destAnim + k]))
return false;
}
}
}
}
return success;
}
void initializeCustomSpring(jjOBJ@ obj) {
int anim = obj.curAnim;
obj.behave(obj.behavior = BEHAVIOR::SPRING, false);
if (obj.curAnim != anim) {
obj.curAnim = anim + 2;
obj.determineCurFrame();
}
obj.draw();
}
void turnIntoCustomSpring(jjOBJ@ obj, uint color, float power, bool horizontal) {
if (horizontal) {
obj.xSpeed = power;
obj.ySpeed = 0.f;
} else {
obj.xSpeed = 0.f;
obj.ySpeed = -power;
if (obj.state == STATE::START && obj.creatorType == CREATOR::LEVEL) {
int x = int(obj.xPos) >> 5;
int y = int(obj.yPos) >> 5;
if (jjParameterGet(x, y, 0, 1) != 0) {
jjParameterSet(x, y, 0, 1, 0);
obj.yPos -= 4.f;
obj.ySpeed = power;
}
}
}
obj.behavior = initializeCustomSpring;
obj.curAnim = customSpringSprite + color * 3 + (horizontal ? 1 : 0);
obj.energy = obj.frameID = obj.freeze = obj.justHit = obj.light = obj.points = 0;
obj.isBlastable = obj.isTarget = obj.scriptedCollisions = obj.triggersTNT = false;
obj.deactivates = obj.isFreezable = true;
obj.bulletHandling = HANDLING::IGNOREBULLET;
obj.playerHandling = HANDLING::SPECIAL;
obj.lightType = LIGHT::NORMAL;
obj.determineCurFrame();
}
void onLevelBegin() {
MLLE::SpawnOffgrids();
for (int i = 1; i < 255; i++) {
jjOBJ@ preset = jjObjectPresets[i];
if (preset.playerHandling == HANDLING::PICKUP) {
preset.behavior = FloatOnWater(preset.behavior);
}
}
jjSampleLoad(SOUND::WIND_WIND2A, "ezwharf_oceanwaves.ogg");
}
class FloatOnWater : jjBEHAVIORINTERFACE {
FloatOnWater(const jjBEHAVIOR &in behavior) {
originalBehavior = behavior;
}
void onBehave(jjOBJ@ obj) {
obj.behave(originalBehavior);
if (obj.yPos > jjWaterLevel - 4) {
obj.yPos = jjWaterLevel - 4;
obj.ySpeed = 0;
}
if (obj.xPos < 16) obj.xPos = 16;
if (obj.xPos > ((jjLayerWidth[4]*32) - 16)) obj.xPos = (jjLayerWidth[4]*32) - 16;
}
bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
if (bullet is null) {
obj.behavior = originalBehavior;
if (player.objectHit(obj, force, obj.playerHandling))
return true;
obj.behavior = this;
}
return false;
}
private jjBEHAVIOR originalBehavior;
}
void onPlayer(jjPLAYER@ play) {
water::limitedOxygen(play);
if (play.yPos < jjWaterLevel + 14) {
water::oxygen[play.localPlayerID] = 800;
}
if (play.yPos > jjWaterLevel + 12 && !play.keyDown) {
if (play.yPos > jjWaterLevel + 24) {
if (play.keyUp || play.keyJump) {
play.ySpeed = -7;
} else {
if (play.ySpeed > -0.75) play.ySpeed -= 0.1;
}
} else {
if (play.ySpeed < 1) play.ySpeed = -0.368f;
}
}
const int bounds = 16;
if (play.xPos > ((jjLayerWidth[4]*32) - bounds) || play.xPos < bounds) {
play.xPos = play.xPos < (bounds+1)? bounds : (jjLayerWidth[4]*32) - bounds;
play.xSpeed = 0;
play.specialMove = 0;
}
}
void onMain() {
if (!jjLowDetail) sample = jjSampleLooped(jjLocalPlayers[0].xPos, jjLocalPlayers[0].yPos > jjWaterLevel? jjWaterLevel : jjLocalPlayers[0].yPos, SOUND::WIND_WIND2A, sample, 60, 0);
array<uint> seaTiles = {2178,2179,2188,2189,2198,2199,2208,2209,2218,2219,2228,2229,2238,2239,2248,2249,2258,2259,2268,2269,2278,2279,2288,2289,2298,2299,2308,2309,2318,2319,2328,2329,2338,2339,2348,2349,2358,2359,2368,2369,2378,2379,2388,2389,2398,2399,2408,2409};
for (uint i = 0; i < seaTiles.length(); i++) {
jjTileType[seaTiles[i]] = (jjLowDetail || !jjTexturedBGUsed)? 0:1;
}
if (jjGameTicks == 1) {
tentacles.resize(0);
for (int i = 1; i < jjObjectCount; i++) {
jjOBJ@ obj = jjObjects[i];
if (obj.eventID == OBJECT::EXTRALIFE) {
tentacles.insertLast(int(obj.xPos/32));
}
}
}
if (jjGameTicks >= 60*70 && jjGameTicks % 490 == 0) {
int rand = jjRandom()%tentacles.length();
if (jjGameTicks % 70 == 0 && tentacles.length() > 1) {
ticket = tentacles[rand];
tentacles.removeAt(rand);
}
}
}
bool onDrawHealth(jjPLAYER@ play, jjCANVAS@ canvas) {
if (water::oxygen[play.localPlayerID] < 799) {
water::drawOxygenTimer(play, canvas);
}
return false;
}
void onLevelReload() {
MLLE::SpawnOffgridsLocal();
MLLE::ReapplyPalette();
}
void onDrawLayer6(jjPLAYER@ play, jjCANVAS@ canvas) {
canvas.drawSprite(19.5*32, 26.5*32, ANIM::CUSTOM[69], 0, jjGameTicks / 10 % 8, 1, SPRITE::MAPPING, 4);
canvas.drawSprite(230.5*32, 26.5*32, ANIM::CUSTOM[69], 0, -(jjGameTicks / 10 % 8), -1, SPRITE::MAPPING, 5);
}
namespace water {
int maxOxygen;
array<int> oxygen(4), count(4);
bool underwater(jjPLAYER@ play) {
return play.yPos > jjWaterLevel;
}
bool gameIsStarted() {
return jjGameState == GAME::STARTED || jjGameState == GAME::PREGAME || jjGameState == GAME::OVERTIME;
}
void limitedOxygen(jjPLAYER@ play) {
if (underwater(play)) {
if (oxygen[play.localPlayerID] > 0 && gameIsStarted()) oxygen[play.localPlayerID]--;
} else {
oxygen[play.localPlayerID] = maxOxygen;
count[play.localPlayerID] = maxOxygen > 350? 6 : uint(maxOxygen/70);
}
jjPARTICLE@ particle = jjAddParticle(PARTICLE::STRING);
if (particle !is null && oxygen[play.localPlayerID] > 0 && oxygen[play.localPlayerID] < 351 && oxygen[play.localPlayerID] % 70 == 0 && play.health > 0 && underwater(play)) {
if (count[play.localPlayerID] > 0) count[play.localPlayerID]--;
particle.xPos = play.xPos;
particle.yPos = play.yPos;
particle.string.text = "|||" + count[play.localPlayerID];
particle.ySpeed = -0.025;
jjSample(play.xPos, play.yPos - 16, SOUND::AMMO_BLUB1);
}
if (oxygen[play.localPlayerID] == 0) {
if (jjActiveGameTicks % 90 == 0 && play.health > 0 && gameIsStarted()) drown(play);
}
}
void drown(jjPLAYER@ play) {
if (play.health > 1) play.health = play.health - 1;
else play.kill();
play.blink = 45;
randomHurtSample(play);
}
void randomHurtSample(jjPLAYER@ play) {
SOUND::Sample sample = SOUND::JAZZSOUNDS_HEY2;
switch (jjRandom()%4) {
case 0: sample = play.charCurr == CHAR::JAZZ? SOUND::JAZZSOUNDS_HEY2 : play.charCurr == CHAR::SPAZ? SOUND::SPAZSOUNDS_AUTSCH1 : SOUND::LORISOUNDS_HURT0; break;
case 1: sample = play.charCurr == CHAR::JAZZ? SOUND::JAZZSOUNDS_HEY3 : play.charCurr == CHAR::SPAZ? SOUND::SPAZSOUNDS_AUTSCH2 : SOUND::LORISOUNDS_HURT1; break;
case 2: sample = play.charCurr == CHAR::JAZZ? SOUND::JAZZSOUNDS_HEY4 : play.charCurr == CHAR::SPAZ? SOUND::SPAZSOUNDS_BURP : SOUND::LORISOUNDS_HURT2; break;
case 3: sample = play.charCurr == CHAR::JAZZ? SOUND::JAZZSOUNDS_JAZZV4 : play.charCurr == CHAR::SPAZ? SOUND::SPAZSOUNDS_OOOH : SOUND::LORISOUNDS_HURT7; break;
}
jjSample(play.xPos, play.yPos, sample);
}
void drawOxygenTimer(jjPLAYER@ play, jjCANVAS@ canvas) {
int oxygenPercent = int(oxygen[play.localPlayerID]/(maxOxygen/100));
int textColor = oxygenPercent > 50? 224 : oxygenPercent > 20? 232 : 216;
if (underwater(play)) {
canvas.drawSprite(jjSubscreenWidth - 68, 73, ANIM::AMMO, 8, jjGameTicks >> 2, 0, SPRITE::TRANSLUCENT);
canvas.drawString(jjSubscreenWidth - 58, 72, "" + (oxygenPercent > 100? 100 : oxygenPercent) + "%", STRING::MEDIUM, STRING::PALSHIFT, textColor);
}
}
}
void onReceive(jjSTREAM&in packet, int fromClientID) {
MLLE::WeaponHook.processPacket(packet, fromClientID);
}
Jazz2Online © 1999-INFINITY (Site Credits). We have a Privacy Policy. Jazz Jackrabbit, Jazz Jackrabbit 2, Jazz Jackrabbit Advance and all related trademarks and media are ™ and © Epic Games. Lori Jackrabbit is © Dean Dodrill. J2O development powered by Loops of Fury and Chemical Beats.
Eat your lima beans, Johnny.