Downloads containing bossmrt.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Boss Test ShaddowBlack0 Test N/A Download file

File preview

  1. float queen_x, queen_y, devan_x, devan_y;
  2. int queen_id = -1;
  3. int devan_id = -1;
  4. void onLevelLoad(){
  5.         if(jjObjectPresets[OBJECT::DEVILDEVAN].behavior == BEHAVIOR::DEVILDEVAN){
  6.                 jjObjectPresets[OBJECT::DEVILDEVAN].behavior = function(obj) { obj.behavior = DevanRewrite(); };
  7.         }
  8.         jjObjectPresets[OBJECT::ROBOT].behavior = function(obj) { obj.behavior = RobotRewrite(); };
  9.         jjObjectPresets[OBJECT::BILSY].behavior = function(obj) { obj.behavior = BilsyRewrite(); };
  10.        
  11.         jjObjectPresets[OBJECT::BLASTERBULLET].behavior = function(obj) { obj.behavior = BulletRewrite(); };
  12.         jjObjectPresets[OBJECT::SEEKERBULLET].behavior = function(obj) { obj.behavior = SeekerRewrite(); };
  13.         jjObjectPresets[OBJECT::SEEKERBULLETPU].behavior = function(obj) { obj.behavior = SeekerRewrite(); };
  14.        
  15.         jjObjectPresets[OBJECT::BAT].behavior = function(obj) { obj.behavior = BatRewrite(); };
  16.         jjObjectPresets[OBJECT::BAT].scriptedCollisions = true;
  17.         jjObjectPresets[OBJECT::BAT].playerHandling = HANDLING::SPECIAL;
  18. }
  19. const array<SOUND::Sample> ButtstompSounds = {SOUND::COMMON_SPLAT1, SOUND::COMMON_SPLAT2, SOUND::COMMON_SPLAT3, SOUND::COMMON_SPLAT4};
  20. class BatRewrite : jjBEHAVIORINTERFACE {
  21.         bool deleted = false;
  22.         int delay = -1;
  23.         int count = 0;
  24.         void onBehave(jjOBJ@ obj) {
  25.                 if(!deleted){
  26.                         obj.behave(BEHAVIOR::BAT, true);
  27.                         obj.scriptedCollisions = true;
  28.                         obj.playerHandling = HANDLING::SPECIAL;
  29.                         if(delay == -1){
  30.                                 if(jjEventGet(int(obj.xOrg/32), int(obj.yOrg/32)) == OBJECT::GENERATOR){
  31.                                         delay = jjParameterGet(int(obj.xPos/32), int(obj.yPos/32), 8, 8);
  32.                                         //jjAlert("delay: "+delay);
  33.                                         if(delay == 0) delay = 5;
  34.                                 }
  35.                         }
  36.                 }else{
  37.                         if(jjGameTicks%70 == 0){
  38.                                 count++;
  39.                                 if(count >= delay){
  40.                                         //jjAlert("recreate bat", false);
  41.                                         obj.xPos = obj.xOrg;
  42.                                         obj.yPos = obj.yOrg;
  43.                                         obj.state = STATE::START;
  44.                                         deleted = false;
  45.                                         count = 0;
  46.                                 }
  47.                         }
  48.                 }
  49.         }
  50.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) { //As described in the signs in-level, this is a nearly 100% faithful recreation of standard enemy collision code.
  51.                 if(!deleted){
  52.                         if (bullet !is null) {
  53.                                 //recreation of HANDLING::HURTBYBULLET with HANDLING::ENEMY
  54.                                 if (obj.causesRicochet) {
  55.                                         if ((bullet.var[6] & 6) == 0) //not fire-based, not a laser beam
  56.                                                 bullet.ricochet();
  57.                                         else if ((bullet.var[6] & 4) == 0) //not a laser beam
  58.                                                 bullet.delete();
  59.                                 } else if ((bullet.var[6] & 16) == 0) //not a fireball
  60.                                         bullet.state = STATE::EXPLODE;
  61.                                 if (obj.freeze > 0 && force < 3)
  62.                                         force = 3;
  63.                                 obj.energy -= force;
  64.                                 obj.justHit = 5; //flash white for 5 ticks--jjOBJ::justHit is automatically deincremented by the JJ2 engine, so individual behavior functions don't need to worry about doing that.
  65.                                 if (obj.energy <= 0) { //killed
  66.                                         obj.energy = 0;
  67.                                         obj.state = STATE::FADEOUT;
  68.                                         deleted = true;
  69.                                         if (obj.freeze > 0)
  70.                                                 obj.unfreeze(0);
  71.                                         else if ((bullet.var[6] & 2) == 0) //not fire-based
  72.                                                 obj.particlePixelExplosion(0);
  73.                                         else {
  74.                                                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_BURN);
  75.                                                 if ((bullet.var[6] & 4) != 0) //laser beam
  76.                                                         obj.particlePixelExplosion(72); //gray
  77.                                                 else
  78.                                                         obj.particlePixelExplosion(((bullet.var[6] & 8) != 0) ? 32 : 40); //powered-up (blue) or not (orange)
  79.                                         }
  80.                                         if (player !is null) {
  81.                                                 obj.grantPickup(player, (uint(bullet.curAnim) == jjAnimSets[ANIM::AMMO].firstAnim + 17) ? 5 : 10);
  82.                                                 //givePlayerPointsForObject(player, obj);
  83.                                         }
  84.                                 } else
  85.                                         obj.freeze = 0;
  86.                         } else { //recreation of HANDLING::ENEMY; player guaranteed to be non-null
  87.                                 if (force != 0) { //attacking via special attack, e.g. buttstomp
  88.                                         obj.energy -= 4; //constant amount of damage for special attacks
  89.                                         if (obj.energy <= 0) { //killed
  90.                                                 obj.energy = 0;
  91.                                                 //givePlayerPointsForObject(player, obj);
  92.                                                 obj.state = STATE::FADEOUT;
  93.                                                 deleted = true;
  94.                                         } else { //only wounded
  95.                                                 obj.justHit = 5;
  96.                                         }
  97.                                        
  98.                                         if (obj.freeze > 0) {
  99.                                                 obj.unfreeze(1);
  100.                                         } else {
  101.                                                 if (obj.energy == 0)
  102.                                                         obj.particlePixelExplosion(2);
  103.                                                 jjSample(obj.xPos, obj.yPos, ButtstompSounds[jjRandom() % ButtstompSounds.length]);
  104.                                         }
  105.                                        
  106.                                         if (force > 0) { //buttstomp or sugar rush
  107.                                                 player.buttstomp = 50; //landing
  108.                                                 player.ySpeed = player.ySpeed / -2 - 8;
  109.                                                 player.yAcc = 0;
  110.                                                 player.extendInvincibility(-70);
  111.                                         } else if (force == -101) { //running into frozen enemy
  112.                                                 player.xAcc = 0;
  113.                                                 player.xSpeed /= -2;
  114.                                                 player.ySpeed = -6;
  115.                                                 player.extendInvincibility(-10);
  116.                                         }
  117.                                 } else { //not attacking
  118.                                         player.hurt();
  119.                                 }
  120.                         }
  121.                 }
  122.                 return true;
  123.         }
  124. }
  125. array<int> kill(4,0);
  126. void onMain(){
  127.         for(int i=0; i<jjLocalPlayerCount; i++){
  128.                 //if(jjIsServer) jjAlert(jjLocalPlayers[i].xPos/32+" "+jjLocalPlayers[i].yPos/32);
  129.                 if(jjLocalPlayers[i].isInGame){
  130.                         if(jjLocalPlayers[i].xPos <= 17*32 && jjLocalPlayers[i].yPos <= 8*32){
  131.                                 if(kill[i] == 0){
  132.                                         jjAlert("You have been roasted automatically by the level's script in order to reset bosses!");
  133.                                         if(jjIsServer){
  134.                                                 jjChat("/k "+(jjLocalPlayers[i].playerID+1));
  135.                                         }else{
  136.                                                 jjSTREAM newStream;
  137.                                                 newStream.push(1);
  138.                                                 newStream.push(jjLocalPlayers[i].playerID+1);
  139.                                                 jjSendPacket(newStream);
  140.                                         }
  141.                                         jjLocalPlayers[i].activateBoss(true);
  142.                                         jjObjects[queen_id].xPos = queen_x;
  143.                                         jjObjects[queen_id].yPos = queen_y;
  144.                                         kill[i] = 1;
  145.                                 }
  146.                                
  147.                                 if(devan_id!=-1){
  148.                                         jjObjects[devan_id].delete();
  149.                                         jjObjects[jjAddObject(OBJECT::DEVILDEVAN, devan_x, devan_y)].behavior = DevanRewrite();
  150.                                         devan_id = -1;
  151.                                         //jjAlert("here");
  152.                                 }
  153.                         }else{
  154.                                 jjLocalPlayers[i].activateBoss(true);
  155.                                 if(queen_id == -1){
  156.                                         for(int j=0; j<jjObjectCount; j++){
  157.                                                 jjOBJ@ obj = jjObjects[j];
  158.                                                 if(obj.eventID == OBJECT::QUEEN){
  159.                                                         queen_id = obj.objectID;
  160.                                                         queen_x = obj.xOrg;
  161.                                                         queen_y = obj.yOrg;
  162.                                                         break;
  163.                                                 }
  164.                                         }
  165.                                 }
  166.                                 if(devan_id == -1){
  167.                                         for(int j=0; j<jjObjectCount; j++){
  168.                                                 jjOBJ@ obj = jjObjects[j];
  169.                                                 if(obj.eventID == OBJECT::DEVILDEVAN){
  170.                                                         devan_x = obj.xOrg;
  171.                                                         devan_y = obj.yOrg;
  172.                                                         devan_id = obj.objectID;
  173.                                                         //jjAlert("found "+devan_id);
  174.                                                         break;
  175.                                                 }
  176.                                         }
  177.                                         if(devan_id == -1){
  178.                                                 devan_id = -2;
  179.                                                 jjObjects[jjAddObject(OBJECT::DEVILDEVAN, devan_x, devan_y)].behavior = DevanRewrite();
  180.                                         }
  181.                                         for(int j=0; j<jjObjectCount; j++){
  182.                                                 jjOBJ@ obj = jjObjects[j];
  183.                                                 if(obj.eventID == OBJECT::DEVILDEVAN){
  184.                                                         devan_x = obj.xOrg;
  185.                                                         devan_y = obj.yOrg;
  186.                                                         devan_id = obj.objectID;
  187.                                                         //jjAlert("found "+devan_id);
  188.                                                         break;
  189.                                                 }
  190.                                         }
  191.                                 }
  192.                                 kill[i] = 0;
  193.                         }
  194.                 }
  195.         }
  196. }
  197. void onReceive(jjSTREAM &in packet, int ClientID){
  198.         int id;
  199.         packet.pop(id);
  200.         if(id == 1){
  201.                 int pID;
  202.                 packet.pop(pID);
  203.                 jjChat("/k "+pID);
  204.         }
  205. }
  206. class DevanRewrite : jjBEHAVIORINTERFACE {
  207.         bool dragon = false;
  208.         void onBehave(jjOBJ@ obj) {
  209.                 if(!dragon){
  210.                         obj.behave(BEHAVIOR::DEVILDEVAN, true);
  211.                         if(obj.state == STATE::FLY){ //state 8
  212.                                 dragon = true;
  213.                                 obj.playerHandling = HANDLING::ENEMY;
  214.                                 obj.energy = 100;
  215.                         }
  216.                 }else{
  217.                         obj.playerHandling = HANDLING::ENEMY;
  218.                         obj.energy = 100;
  219.                         if(obj.state == STATE::FLY){
  220.                                 cDEVILDEVAN(obj);
  221.                         }else{
  222.                                 obj.behave(BEHAVIOR::DEVILDEVAN, true);
  223.                         }
  224.                 }
  225.         }
  226. }
  227. class RobotRewrite : jjBEHAVIORINTERFACE {
  228.         void onBehave(jjOBJ@ obj) {
  229.                 obj.behave(BEHAVIOR::ROBOT, true);
  230.                 obj.energy = 100;
  231.         }
  232. }
  233. class BilsyRewrite : jjBEHAVIORINTERFACE {
  234.         void onBehave(jjOBJ@ obj) {
  235.                 obj.behave(BEHAVIOR::BILSY, true);
  236.                 obj.energy = 100;
  237.         }
  238. }
  239.  
  240. class BulletRewrite : jjBEHAVIORINTERFACE {
  241.         void onBehave(jjOBJ@ obj) {
  242.                 obj.behave(BEHAVIOR::BULLET, true);
  243.                 if(!jjPlayers[obj.creatorID].isLocal){
  244.                         obj.delete();
  245.                 }
  246.         }
  247. }
  248. class SeekerRewrite : jjBEHAVIORINTERFACE {
  249.         void onBehave(jjOBJ@ obj) {
  250.                 obj.behave(BEHAVIOR::SEEKERBULLET, true);
  251.                 if(!jjPlayers[obj.creatorID].isLocal){
  252.                         obj.delete();
  253.                 }
  254.         }
  255. }
  256.  
  257. int findNearestLocalPlayer(){
  258.         float min = 99999999.9;
  259.         int poz = -1;
  260.         for(int i=0; i<4; i++){
  261.                 jjPLAYER@ p = jjLocalPlayers[i];
  262.                 if(min > (p.xPos*p.xPos + p.yPos*p.yPos)){
  263.                         min = p.xPos*p.xPos + p.yPos*p.yPos;
  264.                         poz = p.playerID;
  265.                 }
  266.         }
  267.         return poz;
  268. }
  269. void cDEVILDEVAN(jjOBJ@ obj) {
  270.         switch (obj.state) {
  271.                 case STATE::FLY:
  272.                         if (obj.counter == 0) {
  273.                                 obj.curAnim = jjAnimSets[ANIM::DEVILDEVAN].firstAnim + 5;
  274.                                 obj.frameID = 0;
  275.                                 obj.var[5] = findNearestLocalPlayer();
  276.                                 if (obj.var[5] < 0)
  277.                                         obj.var[5] = 0;
  278.                                 if (obj.xPos >= jjPlayers[obj.var[5]].xPos) {
  279.                                         obj.var[4] = 40;
  280.                                         obj.direction = -1;
  281.                                 } else {
  282.                                         obj.var[4] = -40;
  283.                                         obj.direction = 1;
  284.                                 }
  285.                                 obj.var[3] = -4 * int(jjRandom()&15);//RandFac(15);
  286.                         }
  287.                         obj.counter++;
  288.                         if (obj.counter % 5 == 0) {
  289.                                 obj.frameID++;
  290.                                 if (obj.frameID == 1){
  291.                                         //PlaySample(obj.xPos, obj.yPos, sDEVILDEVAN_FLAP, 200, 0);
  292.                                 }
  293.                                 if (uint(obj.frameID) >= jjAnimations[obj.curAnim].frameCount){
  294.                                         obj.frameID = 0;
  295.                                 }
  296.                         }
  297.                         if (obj.counter >= 128) {
  298.                                 obj.state = STATE::ATTACK;
  299.                                 obj.curAnim = jjAnimSets[ANIM::DEVILDEVAN].firstAnim;
  300.                                 obj.frameID = 0;
  301.                                 obj.counter = 0;
  302.                         } else {
  303.                                 int xDist = int((jjPlayers[obj.var[5]].xPos + obj.var[4] - obj.xPos) / (129 - obj.counter));
  304.                                 if (xDist < -3)
  305.                                         xDist = -3;
  306.                                 else if (xDist > 3)
  307.                                         xDist = 3;
  308.                                 int yDist = int((obj.var[3] + jjPlayers[obj.var[5]].yPos - obj.yPos) / (129 - obj.counter));
  309.                                 if (yDist < -2)
  310.                                         yDist = -2;
  311.                                 else if (yDist > 2)
  312.                                         yDist = 2;
  313.                                 obj.xSpeed = (obj.xSpeed + 3 * xDist) / 4;
  314.                                 obj.ySpeed = (obj.ySpeed + 3 * yDist) / 4;
  315.                                 obj.xPos += obj.xSpeed;
  316.                                 obj.yPos += obj.ySpeed;
  317.                                 if (obj.xPos < jjPlayers[obj.var[5]].xPos - 20)
  318.                                         obj.direction = 1;
  319.                                 else if (obj.xPos > jjPlayers[obj.var[5]].xPos + 20)
  320.                                         obj.direction = -1;
  321.                         }
  322.                         obj.curFrame = jjAnimations[obj.curAnim].firstFrame + obj.frameID;
  323.                         break;
  324.         }
  325.         SPRITE::Mode sprite_mode = obj.freeze == 0 ? SPRITE::NORMAL : SPRITE::FROZEN;
  326.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, sprite_mode);
  327. }