Downloads containing OneFroggyEvening.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 19 Levels Jazz2Online Multiple N/A Download file
JJ2+ Only: One Froggy Evening Violet CLM Custom / Concept N/A Download file

File preview

  1. #pragma require "SwampsD.j2t"
  2.  
  3. jjLAYER@ SwampTrees1, SwampTrees2;
  4. const uint emptyFoliageHeight = 2;
  5.  
  6. class Vine {
  7.         private uint x, y;
  8.         Vine(){}
  9.         Vine(uint xx, uint yy) { x = xx; y = yy; }
  10.         void setEvent(AREA::Area area) { jjEventSet(x, y, area); }
  11. }
  12. array<Vine> Vines;
  13. void SetVines(bool toVine) {
  14.         for (uint i = 0; i < Vines.length; ++i)
  15.                 Vines[i].setEvent(toVine ? AREA::VINE : AREA::ONEWAY);
  16. }
  17.  
  18. void onLevelLoad() {
  19.         for (int i = 16; i <= 95; ++i) {
  20.                 const jjPALCOLOR color = jjPalette.color[i];
  21.                 uint sat = uint(color.getSat() * 1.4);
  22.                 if (sat > 255) sat = 255;
  23.                 uint light = uint(color.getLight() * 1.33);
  24.                 if (light > 255) light = 255;
  25.                 jjPalette.color[i].setHSL(color.getHue(), sat, light);
  26.         }
  27.  
  28.         jjPalette.gradient(jjPALCOLOR(135, 103, 0), jjPALCOLOR(46, 57, 23), 104, 5); //foliage
  29.         jjPalette.gradient(jjPALCOLOR(46, 57, 23), jjPALCOLOR(38, 39, 10), 108, 4); //foliage2
  30.         //jjPalette.gradient(jjPALCOLOR(30, 93, 65), jjPALCOLOR(12, 42, 66), 144, 11); //rock
  31.         //jjPalette.gradient(jjPALCOLOR(12, 42, 66), jjPALCOLOR(7, 12, 6), 152, 6); //rock2
  32.         for (uint i = 0; i < 32; ++i)
  33.                 jjPalette.color[144 + i].swizzle(COLOR::BLUE, COLOR::GREEN, COLOR::RED);
  34.         jjPalette.gradient(jjPALCOLOR(90, 113, 45), jjPALCOLOR(7, 12, 19), 96, 8); //grass
  35.         jjPalette.gradient(jjPALCOLOR(138, 88, 47), jjPALCOLOR(20, 12, 12), 120, 8); //wood
  36.         jjPalette.gradient(jjPALCOLOR(190,40,70), jjPALCOLOR(20,0,5), 112, 8); //flowers
  37.         jjPalette.gradient(jjPALCOLOR(154,180,96), jjPALCOLOR(46,62,23)); //water
  38.         jjSetWaterGradient(jjPALCOLOR(46,62,23), jjPALCOLOR(0, 0, 0));
  39.         jjSetFadeColors(jjPALCOLOR(0, 0, 0));
  40.         jjPalette.apply();
  41.        
  42.         jjTexturedBGStyle = TEXTURE::WARPHORIZON;
  43.         jjUseLayer8Speeds = true;
  44.        
  45.         jjDelayGeneratedCrateOrigins = true;
  46.         //jjObjectPresets[OBJECT::BLUESPRING].ySpeed -= 19;
  47.        
  48.         {
  49.                 jjMASKMAP unmasked(false);
  50.                 jjMASKMAP floor(60);
  51.                 floor.save(107, true);
  52.                 floor.save(108, true);
  53.                 for (uint y = 18; y <= 19; ++y)
  54.                         for (uint x = 1; x <= 7; ++x)
  55.                                 unmasked.save(x + y*10, true);
  56.         }
  57.         {
  58.                 jjPIXELMAP lockBlock(18);
  59.                 for (uint x = 0; x < 32; ++x)
  60.                         for (uint y = 0; y < 32; ++y)
  61.                                 lockBlock[x,y] += 16;
  62.                 lockBlock.save(19);
  63.         }
  64.         {
  65.                 for (uint x = 0; x < 3; ++x)
  66.                         for (uint y = 0; y < 3; ++y) {
  67.                                 jjPIXELMAP pillar(720 + x + y*10);
  68.                                 for (uint xx = 0; xx < 32; ++xx)
  69.                                         for (uint yy = 0; yy < 32; ++yy)
  70.                                                 if (pillar[xx,yy] != 0)
  71.                                                         pillar[xx,yy] += 16;
  72.                                 pillar.save(720 + x + y*10);
  73.                         }
  74.         }
  75.        
  76.         for (int x = jjLayerWidth[4] - 1; x >= 0; --x)
  77.                 for (int y = jjLayerHeight[4] - 1; y >= 0; --y) {
  78.                         if (jjEventGet(x, y) == AREA::VINE)
  79.                                 Vines.insertLast(Vine(x,y));
  80.                 }
  81.        
  82.         const auto firstSwampTile = jjTileCount;
  83.        
  84.         {
  85.                 jjPAL SwampsPalette;
  86.                 SwampsPalette.load("SwampsD.j2t");
  87.                 array<uint8> SwampColorMapping(256, 0);
  88.                 for (uint i = 1; i < SwampColorMapping.length; ++i) {
  89.                         const jjPALCOLOR color = SwampsPalette.color[i];
  90.                         if (color.blue > color.green && color.blue > color.red)
  91.                                 continue; //blue colors are transparent
  92.                         else if (color.green > color.red)
  93.                                 SwampColorMapping[i] = 111 - (color.green / 29);
  94.                         else
  95.                                 SwampColorMapping[i] = 129 - (color.red / 24);
  96.                 }
  97.                 jjTilesFromTileset(
  98.                         "SwampsD.j2t",
  99.                         64 * 10,
  100.                         23 * 10,
  101.                         SwampColorMapping
  102.                 );
  103.                 jjTilesFromTileset("Psych3N.j2t", 0,0); //bug fix for 5.4
  104.                 for (uint i = firstSwampTile; i < jjTileCount; ++i) {
  105.                         jjPIXELMAP swampTile(i);
  106.                         for (uint x = 0; x < 32; ++x)
  107.                                 for (uint y = 0; y < 32; ++y)
  108.                                         if (SwampColorMapping[swampTile[x,y]] == 0)
  109.                                                 swampTile[x,y] = 0;
  110.                         swampTile.save(i);
  111.                 }
  112.         }
  113.        
  114.         @SwampTrees1 = jjLAYER(20, 12);
  115.         SwampTrees1.generateSettableTileArea();
  116.         for (int x = 0; x < SwampTrees1.width; ++x) {
  117.                 const auto xMod = x % 10;
  118.                 for (int y = 0; y < SwampTrees1.height; ++y)
  119.                         if (!(y >= 5 && y <= 10 && (
  120.                                 (xMod == 0) ||
  121.                                 (xMod == 9) ||
  122.                                 ((xMod == 1 || xMod == 7) && (y == 6 || y == 7)) ||
  123.                                 ((xMod == 2 || xMod == 6) && y == 6) ||
  124.                                 (xMod == 8 && y >= 6 && y <= 8)
  125.                         )))
  126.                                 SwampTrees1.tileSet(x, y, firstSwampTile + 11*10 + xMod + y*10);
  127.         }
  128.         SwampTrees1.tileWidth = true;
  129.         SwampTrees1.xSpeed = 0.17;
  130.         SwampTrees1.ySpeed = 0.07;
  131.         SwampTrees1.yOffset = SwampTrees1.ySpeed * -40;
  132.        
  133.         @SwampTrees2 = jjLAYER(20, (600 + 31) / 32);
  134.         SwampTrees2.generateSettableTileArea();
  135.         for (int x = 0; x < SwampTrees2.width; ++x) {
  136.                 const auto xMod = x % 10;
  137.                 for (int y = 0; y < SwampTrees2.height; ++y) {
  138.                         int ySrc;
  139.                         if (y <= 2)
  140.                                 ySrc = y;
  141.                         else if (y <= (2 + emptyFoliageHeight)) {
  142.                                 SwampTrees2.tileSet(x, y, firstSwampTile + 60);
  143.                                 continue;
  144.                         } else {
  145.                                 ySrc = y - emptyFoliageHeight;
  146.                                 if (ySrc > 10)
  147.                                         continue; //ySrc = 10;
  148.                         }
  149.                                
  150.                         if (!(xMod == 0 && ySrc == 6))
  151.                                 SwampTrees2.tileSet(x, y, firstSwampTile + xMod + ySrc*10);
  152.                 }
  153.         }
  154.         SwampTrees2.tileWidth = true;
  155.         SwampTrees2.xSpeed = 0.09;
  156.         SwampTrees2.ySpeed = 0.02;
  157.         SwampTrees2.yOffset = SwampTrees2.ySpeed * -40;
  158.        
  159.         jjLayers[3].spriteMode = SPRITE::BRIGHTNESS;
  160.         jjLayers[2].spriteMode = SPRITE::BRIGHTNESS;
  161.         jjLayers[1].spriteMode = SPRITE::BRIGHTNESS;
  162.         jjLayers[3].spriteParam = 90;
  163.         jjLayers[2].spriteParam = 55;
  164.         jjLayers[1].spriteParam = 20;
  165.        
  166.         jjWaterLayer = 8;
  167.         jjLayerOrderSet(array<jjLAYER@> = {jjLayers[1], jjLayers[2], jjLayers[3], jjLayers[4], jjLayers[5], SwampTrees1, SwampTrees2, jjLayers[8]});
  168.        
  169.         for (int i = 0; i <= 243; ++i) {
  170.                 jjObjectPresets[i].lightType = LIGHT::BRIGHT;
  171.                 jjObjectPresets[i].light = 9;
  172.         }
  173.        
  174.         jjObjectPresets[OBJECT::FRIES].determineCurAnim(ANIM::DRAGFLY, 0);
  175.         jjObjectPresets[OBJECT::FRIES].playerHandling = HANDLING::PARTICLE;
  176.         for (uint i = 0; i < jjAnimations[jjAnimSets[ANIM::DRAGFLY]].frameCount; ++i)
  177.                 jjAnimFrames[jjAnimations[jjAnimSets[ANIM::DRAGFLY]] + i].transparent = true;
  178.        
  179.         jjObjectPresets[OBJECT::FRIES].lightType = LIGHT::NONE; //noninteractive
  180.         jjObjectPresets[OBJECT::GENERATOR].lightType = LIGHT::NONE;
  181.         jjObjectPresets[OBJECT::TRIGGERSCENERY].lightType = LIGHT::NONE;
  182.        
  183.         jjObjectPresets[OBJECT::SILVERCOIN].ySpeed = 1;
  184.        
  185.         jjObjectPresets[OBJECT::TWEEDLEBOSS].behavior = Firefly;
  186.         jjObjectPresets[OBJECT::TWEEDLEBOSS].lightType = LIGHT::POINT;
  187.         jjObjectPresets[OBJECT::TWEEDLEBOSS].deactivates = false;
  188.         jjObjectPresets[OBJECT::TWEEDLEBOSS].isTarget = false;
  189.         jjObjectPresets[OBJECT::TWEEDLEBOSS].playerHandling = HANDLING::PARTICLE;
  190.         jjObjectPresets[OBJECT::TWEEDLEBOSS].bulletHandling = HANDLING::IGNOREBULLET;
  191.         jjObjectPresets[OBJECT::TWEEDLEBOSS].curFrame = jjAnimations[jjAnimSets[ANIM::AMMO] + 4];
  192.         for (int x = 24; x >= 0; x -= 1)
  193.                 for (int y = 19; y >= 0; y -= 2)
  194.                         jjAddObject(OBJECT::TWEEDLEBOSS, x * 32, y * 32);
  195.        
  196.         jjAnimSets[ANIM::PLUS_SCENERY].load();
  197.         jjAnimSets[ANIM::EVA].load();
  198.         jjAnimSets[ANIM::WITCH].load();
  199.         jjIsSnowing = true;
  200.         jjIsSnowingOutdoorsOnly = true;
  201.         jjSnowingType = SNOWING::LEAF;
  202.        
  203.         const jjANIMATION@ leafAnim = jjAnimations[jjAnimSets[ANIM::PLUS_SCENERY] + 0];
  204.         for (uint i = 0; i < leafAnim.frameCount; ++i) {
  205.                 jjANIMFRAME@ leafFrame = jjAnimFrames[leafAnim + i];
  206.                 jjPIXELMAP leaf(leafFrame);
  207.                 for (uint x = 0; x < leaf.width; ++x)
  208.                         for (uint y = 0; y < leaf.height; ++y)
  209.                                 if (leaf[x,y] != 0)
  210.                                         leaf[x,y] = 103 + (leaf[x,y] & 7);
  211.                 leaf.save(leafFrame);
  212.                 //leafFrame.transparent = true;
  213.         }
  214.         {
  215.                 jjANIMFRAME@ fruitFrame = jjAnimFrames[jjAnimations[jjAnimSets[ANIM::FRUITPLAT]+1]];
  216.                 jjPIXELMAP fruit(fruitFrame);
  217.                 for (uint x = 0; x < fruit.width; ++x)
  218.                         for (uint y = 0; y < fruit.height; ++y)
  219.                                 if (fruit[x,y] != 0)
  220.                                         fruit[x,y] = 96 + (fruit[x,y] & 7);
  221.                 fruit.save(fruitFrame);
  222.         }
  223.        
  224.         for (uint i = 40; i <= 44; ++i)
  225.                 jjAnimations[jjAnimSets[ANIM::AMMO] + i] = jjAnimations[jjAnimSets[ANIM::WITCH] + 3];
  226.         jjAnimations[jjAnimSets[ANIM::AMMO] + 33] = jjAnimations[jjAnimSets[ANIM::WITCH] + 3];
  227.         jjObjectPresets[OBJECT::SEEKERBULLETPU].playerHandling = HANDLING::SPECIAL;
  228.         jjObjectPresets[OBJECT::SEEKERBULLETPU].scriptedCollisions = true;
  229.         jjObjectPresets[OBJECT::SEEKERBULLETPU].behavior = WitchSeeker();
  230.        
  231.         jjObjectPresets[OBJECT::CAKE].behavior = BEHAVIOR::FLICKERGEM; //coins from crates
  232.         jjObjectPresets[OBJECT::CAKE].counter = jjObjectPresets[OBJECT::FLICKERGEM].counter / 2;
  233.         jjObjectPresets[OBJECT::CAKE].curAnim = jjObjectPresets[OBJECT::SILVERCOIN].curAnim;
  234.         jjObjectPresets[OBJECT::CAKE].curFrame = jjObjectPresets[OBJECT::SILVERCOIN].curFrame;
  235.         jjObjectPresets[OBJECT::CAKE].eventID = OBJECT::SILVERCOIN;
  236.        
  237.         jjCharacters[CHAR::FROG].canRun = true;
  238.         jjCharacters[CHAR::FROG].canHurt = true;
  239.         jjWeapons[WEAPON::GUN9].comesFromGunCrates = false; //can't scavenge other people's leftover EB
  240.        
  241.         jjMusicLoad("This Is Gonna Be Good.mp3", true) || jjMusicLoad("megaforests") || jjMusicLoad("dark.s3m") || jjMusicLoad("FUNKYB");
  242. }
  243.  
  244. void onDrawLayer8(jjPLAYER@ play, jjCANVAS@) {
  245.         SwampTrees2.yOffset = -(100 - jjSubscreenHeight / 2) + SwampTrees2.height * 16 - jjSubscreenHeight / 2;
  246.         if (!jjLowDetail)
  247.                 jjSetWaterLevel(0, true);//play.cameraY - SwampTrees2.getYPosition(play) + 230 + emptyFoliageHeight*32, true);
  248. }
  249. void onDrawLayer4(jjPLAYER@ play, jjCANVAS@ screen) {
  250.         jjSetWaterLevel(32 * 100, true);
  251.        
  252.         for (uint i = jjObjectCount - 1; i > 0; --i) {
  253.                 jjOBJ@ obj = jjObjects[i];
  254.                 if (obj.behavior == Firefly) {
  255.                         obj.xPos = obj.xOrg + play.cameraX;
  256.                         obj.yPos = obj.yOrg + play.cameraY;
  257.                         if (!jjLowDetail && ((jjGameTicks + obj.objectID) & 15) == 0)
  258.                                 screen.drawSpriteFromCurFrame(int(obj.xPos), int(obj.yPos), obj.curFrame);
  259.                        
  260.                 }
  261.         }
  262.        
  263.         drawEva(screen, 17 * 32 + 17, 61 * 32 + 20, 1, play.charCurr == CHAR::FROG);
  264.         drawEva(screen, 231 * 32 + 17, 61 * 32 + 20, -1, play.charCurr == CHAR::FROG);
  265. }
  266.  
  267. void drawEva(jjCANVAS@ screen, int x, int y, int d, bool c) {
  268.         screen.drawSprite(x, y, ANIM::EVA, 1, 0, -d);
  269.         if (c && jjRenderFrame & 31 < 16) {
  270.                 screen.drawTile(x - 70, y - 74, 145);
  271.                 screen.drawTile(x - 70 + 32, y - 74, 146);
  272.                 screen.drawTile(x - 70, y - 74 + 32, 154);
  273.                 screen.drawTile(x - 70 + 32, y - 74 + 32, 155);
  274.         }
  275. }
  276.  
  277. const float levelWidth = 25 * 32;
  278. const float levelHeight = 20 * 32;
  279. void Firefly(jjOBJ@ obj) {
  280.         if ((obj.state == STATE::START && ((obj.age = jjRandom() & 1023) >= 0) && ((obj.state = STATE::FLY) != STATE::START)) || ((jjRandom() & 63) == 0))
  281.                 obj.special = jjRandom() & 1023;
  282.         int distance = (obj.age - obj.special) & 1023;
  283.         if (distance < 512)
  284.                 obj.age += 2;
  285.         else
  286.                 obj.age -= 2;
  287.         obj.xOrg += jjSin(obj.age) * 2;
  288.         if (obj.xOrg < 0)
  289.                 obj.xOrg += levelWidth;
  290.         else if (obj.xOrg >= levelWidth)
  291.                 obj.xOrg -= levelWidth;
  292.         obj.yOrg += jjCos(obj.age) * 2;
  293.         if (obj.yOrg < 0)
  294.                 obj.yOrg += levelHeight;
  295.         else if (obj.yOrg >= levelHeight)
  296.                 obj.yOrg -= levelHeight;
  297. }
  298.  
  299. /*bool wasTeamRed = false;
  300. void onPlayer(jjPLAYER@ play) {
  301.         if (play.teamRed != wasTeamRed) {
  302.                 wasTeamRed = play.teamRed;
  303.                 for (uint i = 0; i < 32; ++i)
  304.                         jjPalette.color[144 + i].swizzle(COLOR::BLUE, COLOR::GREEN, COLOR::RED);
  305.                 jjPalette.apply();
  306.         }
  307. }*/
  308. bool seenFrogText = false;
  309. void onFunction0(jjPLAYER@ play) {
  310.         if (!seenFrogText) {
  311.                 seenFrogText = true;
  312.                 play.showText("@@@@@@If you are turned into a frog@Eva Earlong can help!@@                                #||||||~...for a price.", STRING::MEDIUM);
  313.         } else if (int(jjTeamScore[play.team]) > int(jjTeamScore[TEAM::Color(play.team ^ 1)]) - 25) {
  314.                 play.morphTo(CHAR::FROG);
  315.                 SetVines(false);
  316.         } else {
  317.                 play.showText("@@@@@@@@Your team is so far behind@you have been spared from becoming a frog.");
  318.                 SetVines(true);
  319.         }
  320. }
  321. void onFunction1(jjPLAYER@ play) {
  322.         if (play.charCurr == CHAR::FROG && play.testForCoins(10)) {
  323.                 play.morphTo(play.charOrig, true);
  324.                 jjSample(play.xPos, play.yPos, SOUND::EVA_KISS2);
  325.                 SetVines(true);
  326.         }
  327.         if (play.coins >= 500) {
  328.                 if (!play.powerup[WEAPON::SEEKER]) {
  329.                         play.powerup[WEAPON::SEEKER] = true;
  330.                         if (jjAutoWeaponChange)
  331.                                 play.currWeapon = WEAPON::SEEKER;
  332.                         jjAlert("|||||||Seeker Powerup!", false, STRING::MEDIUM);
  333.                 }
  334.                 play.ammo[WEAPON::SEEKER] = jjWeapons[WEAPON::SEEKER].maximum;
  335.                 if (play.ammo[WEAPON::SEEKER] < 0)
  336.                         play.ammo[WEAPON::SEEKER] = 25;
  337.                 jjSamplePriority(SOUND::COMMON_GLASS2);
  338.         }
  339. }
  340.  
  341. void onFunction2(jjPLAYER@ play) {
  342.         if (play.charCurr != CHAR::FROG) {
  343.                 play.showText(2, 0);
  344.         }
  345. }
  346. void onFunction3(jjPLAYER@ play) {
  347.         if (play.charCurr == CHAR::FROG) {
  348.                 jjAlert("|Frogs can't use copters, d00d!");
  349.                 jjEnabledASFunctions[3] = false;
  350.         }
  351. }
  352.  
  353. class WitchSeeker : jjBEHAVIORINTERFACE {
  354.         void onBehave(jjOBJ@ obj) {
  355.                 if (obj.state == STATE::START)
  356.                         jjSample(obj.xPos, obj.yPos, SOUND::WITCH_MAGIC);
  357.                 obj.behave(BEHAVIOR::SEEKERBULLET);
  358.         }
  359.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  360.                 if (bullet is null && (jjPlayers[obj.creator].team != play.team || (jjFriendlyFire && jjPlayers[obj.creator] !is play))) {
  361.                         obj.delete();
  362.                         if (play.isLocal && play.blink == 0) {
  363.                                 if (play.charCurr != CHAR::FROG) {
  364.                                         jjSamplePriority(SOUND::WITCH_LAUGH);
  365.                                         play.morphTo(CHAR::FROG, true);
  366.                                         SetVines(false);
  367.                                 } else
  368.                                         play.hurt(1, false, jjPlayers[obj.creator]);
  369.                         }
  370.                 }
  371.                 return true;
  372.         }
  373. }
  374.