Downloads containing ezzen.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Vector Zenith ThunDerDraGon Capture the flag N/A Download file

File preview

const bool MLLESetupSuccessful = MLLE::Setup(); ///@MLLE-Generated
#include "MLLE-Include-1.7.asc" ///@MLLE-Generated
#pragma require "ezzen-MLLE-Data-1.j2l" ///@MLLE-Generated
#pragma require "ezzen.j2l" ///@MLLE-Generated
#pragma require "zenith.png"
#pragma require "star.png"
#pragma require "particle.png"
#pragma require "doom_spring.wav"
#pragma require "Starmada.wav"
#pragma require "Starmada.png"

array<Comet@> Comets;
array<Particle@> Particles;

ANIM::Set charSet() {
	switch (p.charCurr) {
		case CHAR::SPAZ:
			return ANIM::SPAZ;
		case CHAR::LORI:
			return ANIM::LORI;
		case CHAR::JAZZ:
			return ANIM::JAZZ;
	}
	return ANIM::SPAZ;
}

jjPIXELMAP idleAnim(jjAnimFrames[jjAnimations[jjAnimSets[charSet()].firstAnim + 30].firstFrame]);

bool mapIntro, inGame;
uint x, y = idleAnim.height-1;
uint counter;
float freezeY;
array<uint8> furIndices(4, 0);
jjPIXELMAP anim(idleAnim.width, idleAnim.height);

void loadAssets(string filename, uint index, uint width, uint height, uint startX = 0, uint startY = 0, const jjPAL &in palette = jjPalette) {
	jjPIXELMAP asset(filename, palette);
	jjAnimSets[ANIM::CUSTOM[index]].load(
			asset,
			width,
			height,
			0,
			0,
			startX,
			startY
	);
}

class Comet {
	float xPos, yPos, xSpeed, ySpeed, sizeX, sizeY;
	uint counter;
	int angle;
	void draw() {
		counter++;
		jjDrawRotatedSprite(p.cameraX + xPos - xSpeed*counter*jjSin(angle), p.cameraY + yPos - ySpeed*counter*jjCos(angle), ANIM::CUSTOM[1],
		0, 0, angle, sizeX, sizeY, SPRITE::BLEND_NORMAL, 40, 10);
	}
}

class Particle {
	float xPos, yPos, xSpeed, ySpeed, sizeX, sizeY;
	uint counter, counterEnd;
	uint8 colour;
	int8 layer;
	int rotationSpeed;
	void draw() {
		counter++;
		jjDrawRotatedSprite(xPos + xSpeed*counter, yPos + ySpeed*counter, ANIM::CUSTOM[0], 0, 0, counter*rotationSpeed,
		sizeX - float(counter/1.5*sizeX/counterEnd), sizeY - float(counter/1.5*sizeY/counterEnd), SPRITE::ALPHAMAP, colour, layer);
	}
}

Particle Star(float xPos, float yPos, float xSpeed, float ySpeed, float sizeX = 0.5, float sizeY = 0.5, uint counterEnd = 140, uint8 colour = 18, int rotationSpeed = 1, int8 layer = 5) {
	Particle particle;
	particle.xPos = xPos;
	particle.yPos = yPos;
	particle.xSpeed = xSpeed;
	particle.ySpeed = ySpeed;
	particle.sizeX = sizeX;
	particle.sizeY = sizeY;
	particle.counterEnd = counterEnd;
	particle.colour = colour;
	particle.rotationSpeed = rotationSpeed;
	particle.layer = layer;
	return particle;
};

class TechSpring : jjBEHAVIORINTERFACE {
	void onBehave(jjOBJ@ obj) {
		if (int(obj.xOrg/32) == 14 || int(obj.xOrg/32) == 180) {
			obj.xPos = obj.xOrg;
			obj.yPos = obj.yOrg;
		}
		obj.behave(BEHAVIOR::SPRING, false);
		if (obj.doesHurt == 0) {
			switch (obj.eventID) {
				case OBJECT::REDSPRING:
					obj.doesHurt = 24;
					break;
				case OBJECT::BLUESPRING:
					obj.doesHurt = 32;
					break;
				case OBJECT::GREENSPRING:
					obj.doesHurt = 80;
					break;
				default:
				obj.doesHurt = 40;
			}
		}
		if (obj.state == STATE::SPRING) {
			jjAddParticlePixelExplosion(obj.xPos, obj.yPos, obj.curFrame, obj.direction, obj.doesHurt);
		}
	}
}

class Starmada : jjBEHAVIORINTERFACE {
	void onBehave(jjOBJ@ obj) {
		if (obj.state == STATE::START) {
			if (jjPlayers[obj.creatorID].isLocal)
				jjSamplePriority(SOUND::ZDOG_WAF3);
			obj.playerHandling = HANDLING::PLAYERBULLET;
			obj.bulletHandling = HANDLING::IGNOREBULLET;
			obj.isBlastable = obj.isFreezable = obj.isTarget = false;
			obj.determineCurAnim(ANIM::AMMO, 0);
			obj.state = STATE::FLY;
			obj.lightType = LIGHT::NONE;
		} else if (obj.state == STATE::FLY) {
			obj.var[0] = int(atan2(-obj.xSpeed, -obj.ySpeed)*512/3.1415926f);
			for (int i = 0; i < 20; i++) {
				float x = -1.5*jjSin(i*1024/20);
				float y = -0.5*jjCos(i*1024/20);
				Particles.insertLast(Star(obj.xPos - 15*jjSin(obj.var[0]), obj.yPos - 15*jjCos(obj.var[0]), x*jjCos(-obj.var[0]) - y*jjSin(-obj.var[0]), y*jjCos(-obj.var[0]) + x*jjSin(-obj.var[0]),
				0.5, 0.5, 40, (obj.var[6] == 24) ? 34 : 59, 2 + jjRandom()%3, 3));
				Particles.insertLast(Star(obj.xPos - 45*jjSin(obj.var[0]), obj.yPos - 45*jjCos(obj.var[0]), (x/2)*jjCos(-obj.var[0]) - (y/2)*jjSin(-obj.var[0]), (y/2)*jjCos(-obj.var[0]) + (x/2)*jjSin(-obj.var[0]),
				0.5, 0.5, 40, (obj.var[6] == 24) ? 34 : 59, 2 + jjRandom()%3, 3));
			}
			for (int i=0; i < 25*32; i++) {
				if (jjIsServer)
					for (int k = 0; k < 32; k++) {
						jjPLAYER@ play = jjPlayers[k];
						if (play.doesCollide(obj, true) && play.isEnemy(jjPlayers[obj.creatorID]))
							play.objectHit(obj, 0, obj.playerHandling);
					}
				if (!jjMaskedPixel(int(obj.xPos-jjSin(obj.var[0])), int(obj.yPos-jjCos(obj.var[0]))) && obj.yPos > -1 && obj.xPos > -1) {
					obj.xPos -= jjSin(obj.var[0]);
					obj.yPos -= jjCos(obj.var[0]);
				} else break;
			}
			obj.var[1] = int(sqrt(pow(obj.xPos - obj.xOrg, 2) + pow(obj.yPos - obj.yOrg, 2)));
			for (int i = 1; i < jjObjectCount; i++) {
				jjOBJ@ o = jjObjects[i];
				if (o.playerHandling == HANDLING::PICKUP || o.bulletHandling == HANDLING::HURTBYBULLET) {
					float angle = atan2(obj.xOrg - o.xPos, obj.yOrg - o.yPos)*512/3.1415926f;
					float distance = sqrt(pow(o.xPos - obj.xOrg, 2) + pow(o.yPos - obj.yOrg, 2));
					if (abs(angle - obj.var[0]) < 20 && distance <= obj.var[1])
						obj.objectHit(o, o.playerHandling);
				}
			}
			obj.state = STATE::EXPLODE;
		} else if (obj.state == STATE::EXPLODE) {
			if (obj.frameID == 9)
				obj.delete();
		} else if (obj.state == STATE::DEACTIVATE)
			obj.delete();
	}
	void onDraw(jjOBJ@ obj) {
		obj.frameID = int((++obj.counter%(10*4))/4);
		for (int i=1; i < obj.var[1]/24; i++) {
			
			jjDrawRotatedSprite((obj.var[0] == 256) ? obj.xOrg - 29*i*jjSin(obj.var[0]) : obj.xOrg - 28*i*jjSin(obj.var[0]), obj.yOrg - 28*i*jjCos(obj.var[0]), ANIM::CUSTOM[15],
			0, obj.frameID, -256 + obj.var[0], 1, 0.4, SPRITE::NORMAL, 0, 4);
			jjDrawRotatedSprite((obj.var[0] == 256) ? obj.xOrg - 29*i*jjSin(obj.var[0]) : obj.xOrg - 28*i*jjSin(obj.var[0]), obj.yOrg - 28*i*jjCos(obj.var[0]), ANIM::CUSTOM[15],
			0, obj.frameID, -256 + obj.var[0], 1, 0.6, SPRITE::NEONGLOW, (obj.var[6] == 24) ? 5 : 4, 4);
			
		}
		obj.determineCurFrame();
	}
}

void IntroProcess() {
	if (jjGameTicks < 160 && jjGameTicks != 0) {
		if (!p.invisibility) p.invisibility = true;
		p.cameraFreeze((p.team == TEAM::BLUE) ? 50*32 : 144*32, freezeY*32, true, true);
		p.yPos = 50*32 + 15;
		p.xPos = (p.team == TEAM::BLUE) ? 50*32 : 144*32;
	} else if (jjGameTicks == 160) {
		p.cameraUnfreeze(true);
	}
	if (jjGameTicks%4 == 1 && jjGameTicks > 160) {
		float xPos = p.xPos - 40 + jjRandom()%80;
		float yPos = p.yPos - 60 + y - jjRandom()%20;
		float a = (jjRandom()%2)/10.f;
		int angle = int(atan2(p.xPos - xPos , p.yPos - yPos)*512/3.1415926f);
		Particles.insertLast(Star(xPos, yPos, 0.8*jjSin(angle), 0.8*jjCos(angle), 0.3 + a, 0.3 + a, 60, furIndices[jjRandom()%4], 2 + jjRandom()%3));
	}
	if (jjGameTicks > 200) {
		anim[x, y] = idleAnim[x ,y];
		y -= (x == idleAnim.width - 1) ? 1 : 0;
		x = (x < idleAnim.width-1) ? x + 1 : 0;
		anim.save(jjAnimFrames[jjAnimations[jjAnimSets[ANIM::CUSTOM[10]].firstAnim].firstFrame]);
		jjDrawSprite(p.xPos, p.yPos, ANIM::CUSTOM[10], 0, 0, 0, SPRITE::PLAYER, p.playerID);
	}
}

void onLevelBegin() {
	jjPAL pal = jjSpriteModeGetColorMapping(0);
	for (uint i = 112; i < 224; i++)
		pal.color[i].setHSL(145, 160, pal.color[i].getLight());
	jjSpriteModeSetMapping(0, jjSpriteModeGetIndexMapping(0), pal);
	pal = jjSpriteModeGetColorMapping(1);
	
	loadAssets("star.png", 1, 18, 42);
	loadAssets("zenith.png", 2, 1024, 1024, 0, 0, pal);
	
	pal = jjSpriteModeGetColorMapping(2);
	loadAssets("particle.png", 0, 46, 46, 0, 0, pal);
	
	p.furGet(furIndices[0], furIndices[1], furIndices[2], furIndices[3]);
}

void onMain() {
	for (uint i = 0; i < Comets.length; i++) {
		Comet@ comet = Comets[i];
		comet.draw();
		if (comet.counter > 210)
			Comets.removeAt(i);
	}
	for (uint i = 0; i < Particles.length; i++) {
		Particle@ particle = Particles[i];
		particle.draw();
		if (particle.counter > particle.counterEnd)
			Particles.removeAt(i);
	}
	for (int i = 1; i < jjObjectCount; i++) {
			jjOBJ@ o = jjObjects[i];
		if (o.isActive && (o.state != STATE::DEACTIVATE || o.state != STATE::KILL) && jjGameTicks%10 == 1) {
			float a = 0;
		switch (o.eventID) {
				case OBJECT::BOUNCERPOWERUP:
					a = (jjRandom()%2)/10.f;
					Particles.insertLast(Star(o.xPos - 10 + jjRandom()%20, o.yPos, 0, -0.8 + -(jjRandom()%5)/10.f, 0.4 + a, 0.4 + a, 100, 91, 2 + jjRandom()%3));
					break;
				case OBJECT::RFPOWERUP:
					a = (jjRandom()%2)/10.f;
					Particles.insertLast(Star(o.xPos - 10 + jjRandom()%20, o.yPos, 0, -0.8 + -(jjRandom()%5)/10.f, 0.4 + a, 0.4 + a, 100, 24, 2 + jjRandom()%3));
					break;
				case OBJECT::FULLENERGY:
					a = (jjRandom()%2)/10.f;
					Particles.insertLast(Star(o.xPos - 10 + jjRandom()%20, o.yPos, 0, -0.8 + -(jjRandom()%5)/10.f, 0.4 + a, 0.4 + a, 100, 44, 2 + jjRandom()%3));
					break;
				case OBJECT::GUN8POWERUP:
					a = (jjRandom()%2)/10.f;
					Particles.insertLast(Star(o.xPos - 10 + jjRandom()%20, o.yPos, 0, -0.8 + -(jjRandom()%5)/10.f, 0.4 + a, 0.4 + a, 100, 82, 2 + jjRandom()%3));
					break;
				case OBJECT::GUN9POWERUP:
					a = (jjRandom()%2)/10.f;
					Particles.insertLast(Star(o.xPos - 10 + jjRandom()%20, o.yPos, 0, -0.8 + -(jjRandom()%5)/10.f, 0.4 + a, 0.4 + a, 100, 35, 2 + jjRandom()%3));
					break;
			}
		}
	}
	if (jjLayers[5].hasTiles) {
		if (jjGameTicks%110 == 1) {
			Comet comet;
			comet.xPos = 200 + jjRandom()%400;
			comet.yPos = -100;
			comet.xSpeed = comet.ySpeed = jjRandom()%4 + 8;
			comet.angle = 420;
			comet.sizeX = 0.3 + (jjRandom()%2)/10.f;
			comet.sizeY = 0.7 + (jjRandom()%5)/10.f;
			Comets.insertLast(comet);
		}
		if (jjGameTicks%170 == 1) {
			Comet comet;
			comet.xPos = 200 + jjRandom()%400;
			comet.yPos = -100;
			comet.xSpeed = comet.ySpeed = jjRandom()%4 + 8;
			comet.angle = 420;
			comet.sizeX = 0.3 + (jjRandom()%2)/10.f;
			comet.sizeY = 0.7 + (jjRandom()%5)/10.f;
			Comets.insertLast(comet);
		}
		jjDrawSprite(p.cameraX + 450, p.cameraY + 350, ANIM::CUSTOM[2], 0, 0, 0, SPRITE::MAPPING, 1, 10);
	}
	if (jjGameTicks == 1)
		inGame = p.isInGame;
	if (inGame)
		mapIntro = (y > 0);
	if (mapIntro) {
		if (freezeY < 51 && jjGameTicks > 40) freezeY += 0.5;
		for (int i=0; i < 6; i++)
			IntroProcess();
	}
}

void VerticalPickup(jjOBJ@ obj) {
    obj.behave(BEHAVIOR::PICKUP);
	obj.xPos = obj.xOrg;
}

class Starmada_Pickup : jjBEHAVIORINTERFACE {
	void onBehave(jjOBJ@ obj) {
		obj.behave(BEHAVIOR::PICKUP, false);
	}
	void onDraw(jjOBJ@ obj) {
		jjDrawSprite(obj.xPos, obj.yPos, ANIM::CUSTOM[16], 0, (jjGameTicks%(4*6))/6, 0, SPRITE::NEONGLOW, 11);
		jjDrawSprite(obj.xPos, obj.yPos, ANIM::CUSTOM[16], 0, (jjGameTicks%(4*6))/6, 0, SPRITE::NEONGLOW, (p.powerup[8]) ? 5 : 4);
	}
}

class Starmada_Powerup : jjBEHAVIORINTERFACE {
	void onBehave(jjOBJ@ obj) {
		obj.behave(BEHAVIOR::MONITOR, true);
	}
	void onDraw(jjOBJ@ obj) {
		obj.determineCurAnim(ANIM::PICKUPS, 61);
		jjDrawResizedSprite(obj.xPos - 7*obj.direction, obj.yPos - 2, ANIM::CUSTOM[16], 0, (jjGameTicks%(4*6))/6, 0.75, 0.75, SPRITE::BRIGHTNESS, 30);
		jjDrawResizedSprite(obj.xPos - 7*obj.direction, obj.yPos - 2, ANIM::CUSTOM[16], 0, (jjGameTicks%(4*6))/6, 0.75, 0.75, SPRITE::NEONGLOW, 5);
	}
}

class CannotBeShotDown : jjBEHAVIORINTERFACE {
	CannotBeShotDown(const jjBEHAVIOR &in behavior) {
		originalBehavior = behavior;
	}
	void onBehave(jjOBJ@ obj) {
		obj.behave(originalBehavior);
		if (obj.state == STATE::FLOATFALL)
			obj.state = STATE::FLOAT;
	}
	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;
}

class GreyBarrel : jjBEHAVIORINTERFACE {
	void onBehave(jjOBJ@ obj) {
		obj.causesRicochet = false;
		obj.bulletHandling = HANDLING::HURTBYBULLET;
		obj.behave(BEHAVIOR::CRATE, false);
	}
	void onDraw(jjOBJ@ obj) {
		jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::SINGLEHUE, 72);
	}
}

void onLevelLoad() {
	jjSampleLoad(SOUND::COMMON_SPRING1, "doom_spring.wav");
	jjSampleLoad(SOUND::ZDOG_WAF3, "Starmada.wav");
	
	jjWeapons[8].defaultSample = false;
	jjWeapons[8].style = WEAPON::CAPPED;
	
	jjWeapons[WEAPON::GUN8].comesFromGunCrates = true;
    jjWeapons[WEAPON::GUN9].comesFromGunCrates = true;
	
	jjObjectPresets[OBJECT::FIREBALLBULLET].behavior = jjObjectPresets[OBJECT::FIREBALLBULLETPU].behavior = Starmada();
	jjObjectPresets[OBJECT::ELECTROBULLETPU].eventID = OBJECT::ELECTROBULLET;
	jjObjectPresets[OBJECT::FULLENERGY].behavior = VerticalPickup;
	jjObjectPresets[OBJECT::GUN8POWERUP].behavior = Starmada_Powerup();
	jjObjectPresets[OBJECT::GUNBARREL].behavior = GreyBarrel();
	jjObjectPresets[OBJECT::GREENSPRING].behavior = TechSpring();
	jjObjectPresets[OBJECT::REDSPRING].behavior = TechSpring();
	jjObjectPresets[OBJECT::BLUESPRING].behavior = TechSpring();
	jjObjectPresets[OBJECT::GUN8AMMO3].behavior = Starmada_Pickup();
	jjObjectPresets[OBJECT::BOUNCERPOWERUP].direction = -1;
	
	loadAssets("Starmada.png", 15, 29, 32, 0, 18);
	loadAssets("Starmada.png", 16, 18, 18);
	
	jjAnimSets[ANIM::CUSTOM[10]].load(
		idleAnim,
		frameWidth: anim.width,
		frameHeight: anim.height
	);
	for (int i = 1; i < 255; i++) {
		jjOBJ@ preset = jjObjectPresets[i];
		if (preset.playerHandling == HANDLING::PICKUP && preset.eventID != OBJECT::FULLENERGY) {
			preset.behavior = CannotBeShotDown(preset.behavior);
		}
	}
	jjPlayersStickToSlopes = false;
}

void onPlayer(jjPLAYER@ play) {
	if (mapIntro)
		play.ballTime = 1;
	else if (play.invisibility)
		play.invisibility = false;
}

void onPlayerDraw(jjPLAYERDRAW& draw) {
	draw.trail = false;
}

void onPlayerInput(jjPLAYER@ play) {
	if (mapIntro)
		play.keyFire = play.keyJump = play.keyLeft = play.keyRight = play.keyDown = play.keyUp = false;
	
}

bool onDrawAmmo(jjPLAYER@ play, jjCANVAS@ canvas) {
	if (play.currWeapon == 8) {
		canvas.drawString(720, 586, "x" + play.ammo[8], STRING::MEDIUM);
		canvas.drawSprite(710, 588, ANIM::CUSTOM[16], 0, (jjGameTicks%(4*6))/6, 0, SPRITE::NEONGLOW, 11);
		canvas.drawSprite(710, 588, ANIM::CUSTOM[16], 0, (jjGameTicks%(4*6))/6, 0, SPRITE::NEONGLOW, (p.powerup[8]) ? 5 : 4);
		return true;
	}
	return false;
}

void onLevelReload() {
	MLLE::ReapplyPalette();
}