Downloads containing ezwharf.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Yharguul, The Shadowed... PurpleJazz Capture the flag N/A Download file

File preview

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 "ezwharf-MLLE-Data-3.j2l" ///@MLLE-Generated
#pragma require "ezwharf-MLLE-Data-2.j2l" ///@MLLE-Generated
#pragma require "ezwharf-MLLE-Data-1.j2l" ///@MLLE-Generated
#pragma require "Castle1.j2t" ///@MLLE-Generated
#pragma require "ezwharf.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);
}