Downloads containing GoldRush.mut

Downloads
Name Author Game Mode Rating
JJ2+ Only: Gold Rush Violet CLM Mutator N/A Download file

File preview

  1. #pragma name "Gold Rush"
  2. #pragma description "Variant on Treasure Hunt using regenerating coins instead of gems. If you roast another player, you gain 25 coins and your victim loses all their coins. The number of coins you must bring to the exit to win constantly decreases. Playable in any level--if there is no exit, players win automatically."
  3. #include "ArtificialArrow.asc"
  4.  
  5. void onLevelLoad() {
  6.         uint numberOfCoins = 0;
  7.         for (int x = jjLayerWidth[4]; --x >= 0;)
  8.         for (int y = jjLayerHeight[4]; --y >= 0;) {
  9.                 OBJECT::Object objectToGenerate;
  10.                 int delay = 0;
  11.                 uint8 event = jjEventGet(x,y);
  12.                 if (event == OBJECT::GENERATOR)
  13.                         event = jjParameterGet(x,y, 0,8);
  14.                 switch (event) {
  15.                         case OBJECT::REDGEM:
  16.                         case OBJECT::FLICKERGEM:
  17.                         case OBJECT::PURPLEGEM:
  18.                         case OBJECT::RECTREDGEM:
  19.                                 objectToGenerate = OBJECT::SILVERCOIN;
  20.                                 numberOfCoins += 1;
  21.                                 delay = 8;
  22.                                 break;
  23.                         case OBJECT::RECTGREENGEM:
  24.                         case OBJECT::GREENGEM:
  25.                         case OBJECT::GEMSTOMP:
  26.                                 objectToGenerate = OBJECT::GOLDCOIN;
  27.                                 numberOfCoins += 5;
  28.                                 delay = 14;
  29.                                 break;
  30.                         case OBJECT::RECTBLUEGEM:
  31.                         case OBJECT::BLUEGEM:
  32.                                 objectToGenerate = OBJECT::GOLDCOIN;
  33.                                 numberOfCoins += 5;
  34.                                 delay = 7;
  35.                                 break;
  36.                         case OBJECT::GEMRING:
  37.                         case OBJECT::SUPERGEM:
  38.                                 objectToGenerate = OBJECT::GOLDCOIN;
  39.                                 numberOfCoins += 5;
  40.                                 delay = 8;
  41.                                 break;
  42.                         case OBJECT::GEMCRATE:
  43.                         case OBJECT::GEMBARREL:
  44.                                 jjEventSet(x,y, 0);
  45.                                 continue;
  46.                         default:
  47.                                 if (event == AREA::WARP && jjParameterGet(x,y, 8,8) != 0)
  48.                                         jjEventSet(x,y, event = AREA::EOL);
  49.                                 if (EndAreas.find(event) >= 0) {
  50.                                         EndLocations.insertLast(x * 32);
  51.                                         EndLocations.insertLast(y * 32);
  52.                                         jjEventSet(x,y, AREA::EOL); //simpler to treat them all the same
  53.                                         jjAddObject(OBJECT::BEES, x*32 + 16, y*32 + 16, 0, CREATOR::LEVEL, CoinWarp);
  54.                                 }
  55.                                 continue;
  56.                 }
  57.                 jjEventSet(x,y, OBJECT::GENERATOR);
  58.                 jjParameterSet(x,y, 0,8, objectToGenerate);
  59.                 jjParameterSet(x,y, 8,8, delay);
  60.         }
  61.         if (numberOfCoins < 60) { //probably not a treasure hunt level... go again, but with laxer standards!
  62.                 for (int x = jjLayerWidth[4]; --x >= 0;)
  63.                 for (int y = jjLayerHeight[4]; --y >= 0;) {
  64.                         uint8 event = jjEventGet(x,y);
  65.                         const uint param = jjParameterGet(x,y, 0,8);
  66.                         if (event == OBJECT::GENERATOR)
  67.                                 event = param;
  68.                         if (event <= OBJECT::GUN9AMMO3 && event >= OBJECT::ICEAMMO3) { //regular ammo pickup
  69.                                 int generatorObjectID;
  70.                                 if (jjIsServer) {
  71.                                         generatorObjectID = jjAddObject(OBJECT::AIRBOARDGENERATOR, x * 32 + 15, y * 32 + 15, 0,CREATOR::LEVEL, function(obj) { //use OBJECT::AIRBOARDGENERATOR to avoid uid conflicts
  72.                                                 if (obj.age == 0) { //initializing
  73.                                                         obj.age = 1;
  74.                                                 } else { //first real tick, we don't want to run BEHAVIOR::GENERATOR until this because it would result in servers and clients having different objectIDs
  75.                                                         obj.age = 0;
  76.                                                         const uint x = uint(obj.xOrg) >> 5, y = uint(obj.yOrg) >> 5, param = jjParameterGet(x,y, 0,8);
  77.                                                         jjParameterSet(x,y, 0,8, OBJECT::SILVERCOIN); //object to be generated
  78.                                                         obj.behavior = BEHAVIOR::GENERATOR;
  79.                                                         obj.behave(); //read bitmap and start generating coins
  80.                                                         jjParameterSet(x,y, 0,8, param); //for anything else on this tile
  81.                                                 }
  82.                                         });
  83.                                 } else {
  84.                                         jjParameterSet(x,y, 0,8, OBJECT::SILVERCOIN); //object to be generated
  85.                                         generatorObjectID = jjAddObject(OBJECT::AIRBOARDGENERATOR, x * 32 + 15, y * 32 + 15, 0,CREATOR::LEVEL, BEHAVIOR::GENERATOR); //use OBJECT::AIRBOARDGENERATOR to avoid uid conflicts
  86.                                         jjParameterSet(x,y, 0,8, param);
  87.                                 }
  88.                         }
  89.                 }
  90.         }
  91. }
  92.  
  93. uint Points = 0;
  94. void onLevelBegin() {
  95.         if (jjIsServer) {
  96.                 for (uint i = 0; i < 32; ++i)
  97.                         if (jjPlayers[i].isActive && !jjPlayers[i].isIdle)
  98.                                 Points += 1;
  99.                 //jjDebug(Points + " points up for grabs...");
  100.                 if (!(jjGameMode == GAME::BATTLE && jjGameCustom == GAME::NOCUSTOM))
  101.                         jjChat("/battle");
  102.                 if (jjPlayers[0].isSpectating && !jjPlayers[0].isIdle)
  103.                         jjChat("/forcespectate 1 off");
  104.                 jjPrint("****     " + jjLevelName + " (" + jjLevelFileName + ") GoldRush.mut");
  105.         } else {       
  106.                 jjSTREAM packet;
  107.                 packet.push(true);
  108.                 for (int i = 0; i < jjLocalPlayerCount; ++i)
  109.                         packet.push(uint8(jjLocalPlayers[i].playerID));
  110.                 jjSendPacket(packet);
  111.         }
  112. }
  113.  
  114. const array<uint8> EndAreas = { AREA::EOL, AREA::WARPEOL, AREA::WARPSECRET, OBJECT::EOLPOST, OBJECT::BONUSPOST, OBJECT::CTFBASE };
  115. const array<string> Places = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth", "twenty-first", "twenty-second", "twenty-third", "twenty-fourth", "twenty-fifth", "twenty-sixth", "twenty-seventh", "twenty-eighth", "twenty-ninth", "thirtieth"};
  116. uint Place = 0;
  117. uint8 MaxScore = jjMaxScore > 50 ? jjMaxScore : 50;
  118.  
  119. void onMain() {
  120.         if (jjIsServer) {
  121.                 if ((jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME)) {
  122.                         if (MaxScore > 15 and jjActiveGameTicks % 140 == 0)
  123.                                 MaxScore -= 1;
  124.                         if (jjActiveGameTicks % 70 == 0) {
  125.                                 jjSTREAM packet;
  126.                                 packet.push(MaxScore);
  127.                                 for (uint8 i = 0; i < 32; ++i)
  128.                                         if (jjPlayers[i].isInGame) {
  129.                                                 packet.push(i);
  130.                                                 packet.push(uint16(jjPlayers[i].coins));
  131.                                         }
  132.                                 jjSendPacket(packet);
  133.                         }
  134.                
  135.                         uint numberOfIngamePlayers = 0;
  136.                         int lastIngamePlayer = -1;
  137.                         for (uint i = 0; i < 32; ++i) {
  138.                                 const jjPLAYER@ player = jjPlayers[i];
  139.                                 if (player.isInGame) {
  140.                                         const int coins = player.coins;
  141.                                         if (coins >= int(MaxScore) && (EndLocations.isEmpty() || jjEventGet(uint(player.xPos) >> 5, uint(player.yPos) >> 5) == AREA::EOL)) {
  142.                                                 jjChat("/forcespectate " + (i+1) + " on");
  143.                                                 jjAlert("|||" + player.nameUnformatted + (Place < 30 ? (" wins " + Places[Place++] + " place!") : " wins!"), true, STRING::MEDIUM);
  144.                                                 jjPrint("**** " + player.nameUnformatted + ": " + coins + " coins (out of " + MaxScore + " coins)");
  145.                                                 /*if (Points > 1) {
  146.                                                         jjPrint("**** " + Points + " points for " + player.name);
  147.                                                         Points -= 1;
  148.                                                 } else {
  149.                                                         jjPrint("**** 1 point for " + player.name);*/
  150.                                                 //}
  151.                                         } else {
  152.                                                 numberOfIngamePlayers += 1;
  153.                                                 lastIngamePlayer = i;
  154.                                         }
  155.                                 } else if (player.isActive && player.isConnecting) {
  156.                                         numberOfIngamePlayers += 1;
  157.                                         lastIngamePlayer = i;
  158.                                 }
  159.                         }
  160.                        
  161.                         if (numberOfIngamePlayers <= 1 && jjGameConnection == GAME::ONLINE) {
  162.                                 if (numberOfIngamePlayers == 1) {
  163.                                         jjAlert(jjPlayers[lastIngamePlayer].nameUnformatted + " places |last", true, STRING::MEDIUM);
  164.                                         jjPrint("**** " + jjPlayers[lastIngamePlayer].nameUnformatted + ": " + jjPlayers[lastIngamePlayer].coins + " coins (out of " + MaxScore + " coins)");
  165.                                         //      jjPrint("**** " + Points + " point for " + jjPlayers[lastIngamePlayer].name);
  166.                                 }
  167.                                 jjChat("/stop");
  168.                         }
  169.                 }
  170.         } else {
  171.                 if (jjActiveGameTicks % 70 == 0) {
  172.                         jjSTREAM packet;
  173.                         packet.push(false);
  174.                         for (int i = 0; i < jjLocalPlayerCount; ++i)
  175.                                 if (jjLocalPlayers[i].isInGame) {
  176.                                         packet.push(uint8(jjLocalPlayers[i].playerID));
  177.                                         packet.push(uint16(jjLocalPlayers[i].coins));
  178.                                 }
  179.                         jjSendPacket(packet);
  180.                 }
  181.         }
  182. }
  183.  
  184. void onPlayerDraw(jjPLAYERDRAW& draw) {
  185.         if (draw.name) {
  186.                 const jjPLAYER@ player = draw.player;
  187.                 const bool enough = player.coins >= int(MaxScore);
  188.                 jjDrawResizedSpriteFromCurFrame(player.xPos - 8, player.yPos - 47, jjObjectPresets[enough ? OBJECT::GOLDCOIN : OBJECT::SILVERCOIN].curFrame, 0.5, 0.5, SPRITE::NORMAL,0, -100);
  189.                 jjDrawString(player.xPos - 3, player.yPos - 45, (enough ? "||||" : "|||||||") + "x" + player.coins, STRING::SMALL, STRING::NORMAL, 0, -100);
  190.         }
  191. }
  192.  
  193. bool onDrawGameModeHUD(jjPLAYER@ player, jjCANVAS@ canvas) {
  194.         if (player !is null) {
  195.                 const bool enough = player.coins >= int(MaxScore);
  196.                
  197.                 //canvas.drawRectangle(0,0, 172, 34, 15);
  198.                 //canvas.drawRectangle(0,0, 170, 32, 0);
  199.                 canvas.drawSprite(12,17, ANIM::PICKUPS, enough ? 37 : 84, jjGameTicks >> 3);
  200.                 canvas.drawString(30, 13, (enough ? "||||" : "|||||||") + player.coins + "/" + MaxScore, STRING::MEDIUM);
  201.                
  202.                
  203.                 if (enough) {
  204.                         if (!EndLocations.isEmpty())
  205.                                 canvas.drawString(0x8000, jjSubscreenHeight - 49, "FIND   EXIT", STRING::MEDIUM, STRING::SPIN);
  206.                 } else
  207.                         canvas.drawString(10, 36, "1||Need " + (MaxScore - player.coins) + " more", STRING::SMALL, STRING::NORMAL,0, SPRITE::TRANSLUCENTPALSHIFT);
  208.         } else
  209.                 canvas.drawString(30, 13, "|||||||" + MaxScore, STRING::MEDIUM);
  210.                
  211.         return true;
  212. }
  213.  
  214. void onReceive(jjSTREAM &in packet, int fromClientID) {
  215.         uint8 playerID;
  216.         uint16 coins;
  217.         if (jjIsServer) {
  218.                 bool gameStart;
  219.                 packet.pop(gameStart);
  220.                 while (!packet.isEmpty()) {
  221.                         packet.pop(playerID);
  222.                         if (jjPlayers[playerID].clientID == fromClientID) {
  223.                                 if (gameStart) {
  224.                                         jjChat("/forcespectate " + (playerID + 1) + " off");
  225.                                 } else {
  226.                                         packet.pop(coins);
  227.                                         jjPlayers[playerID].coins = coins;
  228.                                 }
  229.                         } else { //bad packet
  230.                                 return; //meh, whatever
  231.                         }
  232.                 }
  233.         } else {
  234.                 packet.pop(MaxScore);
  235.                 while (!packet.isEmpty()) {
  236.                         packet.pop(playerID);
  237.                         packet.pop(coins);
  238.                         if (!jjPlayers[playerID].isLocal)
  239.                                 jjPlayers[playerID].coins = coins;
  240.                 }
  241.         }
  242. }
  243.  
  244. array<int> EndLocations;
  245.        
  246. bool onExit = false;
  247. uint TimeTopLeft = 0;
  248. void onPlayer(jjPLAYER@ player) {
  249.         if (!EndLocations.isEmpty()) { //at least one exit
  250.                 const bool enough = player.coins >= int(MaxScore);
  251.                 const bool wasOnExit = onExit;
  252.                 onExit = jjEventGet(uint(player.xPos) >> 5, uint(player.yPos) >> 5) == AREA::EOL;
  253.                 if (!wasOnExit && onExit && !enough)
  254.                         player.testForCoins(MaxScore);
  255.                 else if (!onExit)
  256.                         ArtificialArrow::DrawArrow(EndLocations, player, enough ? SPRITE::SINGLEHUE : SPRITE::TRANSLUCENTSINGLEHUE, 72);
  257.         } //else everywhere is an exit, no need to do HUD stuff pointing at one
  258.        
  259.         if (player.health > 0 && int(player.xPos) / 32 <= 0 && int(player.yPos) / 32 <= 0 && player.warpID == 0) {
  260.                 if (++TimeTopLeft % 280 == 250) {
  261.                         for (int x = jjLayerWidth[4]; --x >= 0;)
  262.                         for (int y = jjLayerHeight[4]; --y >= 0;) {
  263.                                 const uint8 event = jjEventGet(x,y);
  264.                                 if (event == AREA::JAZZSTART || event == AREA::MPSTART) {
  265.                                         player.warpToTile(x,y);
  266.                                         return;
  267.                                 }
  268.                         }
  269.                 }
  270.         } else TimeTopLeft = 0;
  271. }
  272.  
  273. void onRoast(jjPLAYER@ victim, jjPLAYER@ killer) {
  274.         if (victim !is killer && killer.isLocal)
  275.                 killer.coins += 25;
  276. }
  277.  
  278. void CoinWarp(jjOBJ@ obj) {
  279.         if (obj.state == STATE::START) {
  280.                 obj.state = STATE::ROTATE;
  281.                 obj.curFrame = jjObjectPresets[OBJECT::SILVERCOIN].curFrame;
  282.                 obj.playerHandling = HANDLING::PARTICLE;
  283.                 obj.bulletHandling = HANDLING::IGNOREBULLET;
  284.                 //obj.lightType = LIGHT::RING2;
  285.                 //obj.light = 10;
  286.         }
  287.         //if (jjTileGet(3, int(obj.xOrg / 32), int(obj.yOrg / 32)) == 0) //no foreground
  288.                 for (int i = 0; i < 8; ++i) {
  289.                         const int timer = (jjGameTicks<<2) + i*128;
  290.                         const float distance = 32 + jjSin(jjRenderFrame<<3) * 8;
  291.                         jjDrawRotatedSpriteFromCurFrame(obj.xPos + jjSin(timer) * distance, obj.yPos + jjCos(timer) * distance, ((i & 1) == 0) ? obj.curFrame : obj.curFrame + 10, timer + 512,
  292.                         //1.0f, 1.0f, SPRITE::SINGLEHUE, jjLocalPlayers[0].teamRed ? 24 : 32, 3);
  293.                         1.0f, 1.0f, SPRITE::NORMAL, 0, 3);
  294.                 }
  295. }