Name | Author | Game Mode | Rating | |||||
---|---|---|---|---|---|---|---|---|
Mystery of the Four... | chandie | Single player | 6.6 |
void onPlayer(jjPLAYER@ p) {
p.idle = 100;
p.keyRun = false;
p.keyLeft = false;
p.lightType = LIGHT::NONE;
p.keyUp = false;
p.keyDown = false;
p.keyRight = false;
p.cameraFreeze(0*32, 0*32, true, false);
if(p.keyFire)
jjNxt(false, true);
if(p.keyJump)
jjNxt(false, true);
if(p.keySelect)
jjNxt(false, true);
}
bool onDrawHealth(jjPLAYER@ p, jjCANVAS@ canvas) {return true;}
bool onDrawLives(jjPLAYER@ p, jjCANVAS@ canvas) {return true;}
bool onDrawScore(jjPLAYER@ p, jjCANVAS@ canvas) {return true;}
bool onDrawAmmo(jjPLAYER@ p, jjCANVAS@ canvas) {return true;}
jjTEXTAPPEARANCE SignTextAppearance = STRING::NORMAL;
class Sign {
private int xPos, yPos; //These pixel-based positions will be generated from tile-based positions in the constructor by multiplying by 32
private string text;
private uint widthOfText;
Sign(){} //AngelScript requires any class that appears in any array to have an explicit default constructor, even if it's never called
Sign(int xTile, int yTile, const string &in t) {
xPos = xTile * 32; //Since this is a constant operation, it could strictly be performed in the draw method instead of the constructor, but this way involves fewer multiplication instructions
yPos = yTile * 32; //
text = t;
SignTextAppearance.newline = STRING::SPECIALSIGN; //Causes the drawString method to interpret instances of the \n character as signals to drop down to a new line, similar to the special effect of the @ character in the STRING::SPIN appearance.
SignTextAppearance.spacing = -2; //int jjTEXTAPPEARANCE::spacing is new in 5.2, and this particular value is equivalent to prefixing the string with "ยง2". Make sure to check out bool jjTEXTAPPEARANCE::monospace too, though it didn't end up getting used in this level.
widthOfText = jjGetStringWidth(text, STRING::SMALL, SignTextAppearance); //Used for determining how large of a dark rectangle should be drawn behind the text. A matching heightOfText value could of course be generated by counting the number of newline characters--for example, "heightOfText = text.split("\n").length * 20;"--but here the rectangles are constant height instead to limit the temptation to ramble on and on.
}
void draw(jjCANVAS@ layer, uint8 textIntensity) const { //Because this method will be called from an onDraw method, it's important to have a jjCANVAS@ passed among the arguments.
layer.drawRectangle(xPos, yPos - 16, widthOfText + 8, 55, 0, SPRITE::TRANSLUCENT);
layer.drawString(xPos, yPos, text, STRING::SMALL, SignTextAppearance, 0, SPRITE::BLEND_HARDLIGHT, textIntensity);
}
}
const array<Sign> Signs = {
Sign(3, 13, "EVASMINE: Hey! What's the meaning of this disturbance?\nTHIEF: We, the 40 Thieves have conquered the city. You're under our custody!\nEVASMINE: That can't be! Where's my father?\nTHIEF: The Sultan's dead.\nEVASMINE: Oh no!\n\nHit ||||||||SPACE |or ||||||||JUMP |to visit ||||||||ARABIUS."),
};
void onDrawLayer2(jjPLAYER@, jjCANVAS@ layer) {
const uint8 textIntensity = 200 + int(jjSin(jjGameTicks * 16) * 50);
for (uint signID = 0; signID < Signs.length; ++signID)
Signs[signID].draw(layer, textIntensity);
}
void onLevelLoad() {
jjLevelName = ("");
jjObjectPresets[OBJECT::FENCER].behavior = Thief;
jjObjectPresets[OBJECT::FENCER].scriptedCollisions = true;
}
void Thief(jjOBJ@ obj) {
obj.behave(BEHAVIOR::FENCER, false);
obj.determineCurAnim(ANIM::FENCER, 0);
obj.determineCurFrame();
jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 48);
}
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.