Name | Author | Game Mode | Rating | |||||
---|---|---|---|---|---|---|---|---|
![]() |
Vector Zenith | ThunDerDraGon | Capture the flag | N/A | ![]() |
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();
}
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.