Downloads containing hh17enemies.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Holiday Hare '17Featured Download ShadowGPW Single player 8.8 Download file
TSF with JJ2+ Only: Holiday Hare '18Featured Download SmokeNC Single player 8.9 Download file

File preview

  1. #pragma require "HH17Enemies.asc"
  2. #pragma require "HH17_Crow.wav"
  3. #pragma require "HH17_Balloon.wav"
  4.  
  5. namespace HH17 {
  6.         void setEnemy(OBJECT::Object eventID) {
  7.                 switch (eventID) {
  8.                         case OBJECT::BAT:
  9.                                 jjObjectPresets[OBJECT::BAT].behavior = BlueBat();
  10.                                 jjAnimSets[ANIM::BAT].load();
  11.                         break;
  12.                         case OBJECT::BILSY:
  13.                                 jjAnimSets[ANIM::BILSBOSS].load();
  14.                         break;
  15.                         case OBJECT::CRAB:
  16.                                 jjObjectPresets[OBJECT::CRAB].behavior = YetiCrab();
  17.                                 jjAnimSets[ANIM::UTERUS].load();
  18.                         break;
  19.                         case OBJECT::DEMON:
  20.                                 jjObjectPresets[OBJECT::DEMON].behavior = IceDemon();
  21.                                 jjAnimSets[ANIM::DEMON].load();
  22.                         break;
  23.                         case OBJECT::DOGGYDOGG:
  24.                                 jjObjectPresets[OBJECT::DOGGYDOGG].behavior = BlueDog();
  25.                         break;
  26.                         case OBJECT::DRAGON:
  27.                                 jjObjectPresets[OBJECT::DRAGON].behavior = IceDragon();
  28.                         break;
  29.                         case OBJECT::FENCER:
  30.                                 jjObjectPresets[OBJECT::FENCER].behavior = WhiteFencer();
  31.                         break;
  32.                         case OBJECT::LABRAT:
  33.                                 jjObjectPresets[OBJECT::LABRAT].behavior = CaveRat();
  34.                         break;
  35.                         case OBJECT::MONKEY:
  36.                                 jjObjectPresets[OBJECT::MONKEY].behavior = SnowMonkey();
  37.                         break;
  38.                         case OBJECT::STANDMONKEY:
  39.                                 jjObjectPresets[OBJECT::MONKEY].behavior = SnowMonkey();
  40.                         break;
  41.                         case OBJECT::QUEEN:
  42.                                 jjAnimSets[ANIM::QUEEN].load();
  43.                         break;
  44.                         case OBJECT::RAVEN:
  45.                                 jjObjectPresets[OBJECT::RAVEN].behavior = WhiteRaven();
  46.                                 jjAnimSets[ANIM::RAVEN].load();
  47.                                 jjSampleLoad(SOUND::P2_TONG, "HH17_crow.wav");
  48.                         break;
  49.                         case OBJECT::SKELETON:
  50.                                 jjObjectPresets[OBJECT::SKELETON].behavior = BoneChucker();
  51.                         break;
  52.                         case OBJECT::FLOATSUCKER:
  53.                                 jjObjectPresets[OBJECT::FLOATSUCKER].behavior = WhiteSucker();
  54.                                 jjSampleLoad(SOUND::P2_FART, "HH17_balloon.wav");
  55.                         break;
  56.                         case OBJECT::SUCKER:
  57.                                 jjObjectPresets[OBJECT::FLOATSUCKER].behavior = WhiteSucker();
  58.                         break;
  59.                         case OBJECT::TUFTURT:
  60.                                 jjObjectPresets[OBJECT::TUFTURT].behavior = YetiTurtle();
  61.                         break;
  62.                         default: break;
  63.                                
  64.                 }
  65.                 setEnemyPalettes(eventID);
  66.         }
  67.         void replaceAllEnemies() {
  68.                 HH17::setEnemy(OBJECT::BAT);
  69.                 HH17::setEnemy(OBJECT::BILSY);
  70.                 HH17::setEnemy(OBJECT::BUBBA);
  71.                 HH17::setEnemy(OBJECT::CRAB);
  72.                 HH17::setEnemy(OBJECT::DEMON);
  73.                 HH17::setEnemy(OBJECT::DOGGYDOGG);
  74.                 HH17::setEnemy(OBJECT::DRAGON);
  75.                 HH17::setEnemy(OBJECT::FENCER);
  76.                 HH17::setEnemy(OBJECT::FLOATSUCKER);
  77.                 HH17::setEnemy(OBJECT::LABRAT);
  78.                 HH17::setEnemy(OBJECT::MONKEY);
  79.                 HH17::setEnemy(OBJECT::STANDMONKEY);
  80.                 HH17::setEnemy(OBJECT::QUEEN);
  81.                 HH17::setEnemy(OBJECT::RAVEN);
  82.                 HH17::setEnemy(OBJECT::ROTATINGROCK);
  83.                 HH17::setEnemy(OBJECT::SKELETON);
  84.                 HH17::setEnemy(OBJECT::SUCKER);
  85.                 HH17::setEnemy(OBJECT::TUFBOSS);
  86.                 HH17::setEnemy(OBJECT::TUFTURT);
  87.         }
  88.         void handleEnemyProjectiles() {
  89.                 for (int i = 0; i < jjObjectCount; i++) {
  90.                         jjOBJ@ obj = jjObjects[i];
  91.                         if (obj.behavior == BEHAVIOR::TOASTERBULLET && obj.creatorType != CREATOR::PLAYER && jjGameTicks % 1 == 0) {
  92.                                 IceBullet temp;
  93.                                 jjOBJ@ icebullet = jjObjects[jjAddObject(OBJECT::ICEBULLETPU, int(obj.xPos), int(obj.yPos), obj.objectID, CREATOR::OBJECT, jjVOIDFUNCOBJ(temp.onBehave))];
  94.                                 jjSample(icebullet.xPos, icebullet.yPos, SOUND::AMMO_ICEPU3);
  95.                                 icebullet.xPos = obj.xOrg + (8 * obj.direction);
  96.                                 icebullet.counterEnd = 30;
  97.                                 icebullet.state = STATE::FLY;
  98.                                 icebullet.playerHandling = HANDLING::ENEMYBULLET;
  99.                                 obj.delete();
  100.                         }
  101.                        
  102.                         if (obj.behavior == BEHAVIOR::MONKEYBULLET) {
  103.                                 Snowball temp;
  104.                                 jjOBJ@ snowball = jjObjects[jjAddObject(OBJECT::BOUNCERBULLET, int(obj.xPos), int(obj.yPos), obj.objectID, CREATOR::OBJECT, jjVOIDFUNCOBJ(temp.onBehave))];
  105.                                 snowball.playerHandling = HANDLING::ENEMYBULLET;
  106.                                 jjSample(snowball.xOrg, snowball.yOrg, SOUND::COMMON_FOEW2, 0, 0);
  107.                                 snowball.xAcc = snowball.yAcc = 0;
  108.                                 snowball.xSpeed = 8 * obj.direction;
  109.                                 snowball.yPos = snowball.yOrg;
  110.                                 int playerID = snowball.findNearestPlayer(80000);
  111.                                 if (jjPlayers[playerID].yPos > int(snowball.yPos)) snowball.ySpeed = (jjPlayers[playerID].yPos > int(snowball.yPos) + 64)? 2:0;
  112.                                 else if (jjPlayers[playerID].yPos < int(snowball.yPos)) snowball.ySpeed = (jjPlayers[playerID].yPos < int(snowball.yPos) - 64)? -4:-2;
  113.                                 snowball.direction = obj.direction;
  114.                                 snowball.counterEnd = 140;
  115.                                 snowball.animSpeed = 1;
  116.                                 snowball.light = 8;
  117.                                 snowball.state = STATE::FLY;
  118.                                 snowball.killAnim = jjObjectPresets[OBJECT::ICEBULLET].killAnim;
  119.                                 obj.delete();
  120.                         }
  121.                 }
  122.         }
  123.         void processEnemyColors() {
  124.                 jjPalette.fill(255, 255, 255, 2, 1, 1);
  125.                 jjPalette.fill(217, 241, 255, 3, 1, 1);
  126.                 jjPalette.fill(161, 208, 255, 4, 1, 1);
  127.                 jjPalette.fill(109, 179, 255, 5, 1, 1);
  128.                 jjPalette.fill(52, 146, 255, 6, 1, 1);
  129.                 jjPalette.fill(0, 118, 255, 7, 1, 1);
  130.                 jjPalette.fill(0, 94, 231, 8, 1, 1);
  131.                 jjPalette.fill(0, 71, 189, 9, 1, 1);
  132.                 jjPalette.fill(0, 47, 146, 10, 1, 1);
  133.                 jjPalette.fill(0, 28, 104, 11, 1, 1);
  134.                 jjPalette.fill(0, 10, 61, 12, 1, 1);
  135.                 jjPalette.fill(0, 0, 24, 13, 1, 1);
  136.                 jjPalette.apply();
  137.         }
  138. }
  139.  
  140. void setEnemyPalettes(OBJECT::Object eventID) {
  141.         jjANIMATION@ animRock = jjAnimations[jjAnimSets[ANIM::ROCK] + 0];
  142.         jjANIMATION@ animTurt = jjAnimations[jjAnimSets[ANIM::TUFTUR] + 0];
  143.        
  144.         if (jjGameMode == GAME::COOP || jjGameMode == GAME::SP) {
  145.                 HH17::processEnemyColors();
  146.                 switch (eventID) {
  147.                         case OBJECT::BAT:
  148.                                 for (uint i = 0; i < 4; i++) {
  149.                                         jjANIMATION@ animBat = jjAnimations[jjAnimSets[ANIM::BAT] + i];
  150.                                         for (uint j = 0; j < animBat.frameCount; j++) {
  151.                                                 jjANIMFRAME@ frame = jjAnimFrames[animBat + j];
  152.                                                 jjPIXELMAP sprite(frame);
  153.                                                 for (uint x = 0; x < sprite.width; ++x) {
  154.                                                         for (uint y = 0; y < sprite.height; ++y) {
  155.                                                                 if (sprite[x,y] >= 88 && sprite[x,y] <= 94) sprite[x,y] -= 57;
  156.                                                         }
  157.                                                 }
  158.                                                 sprite.save(frame);
  159.                                         }
  160.                                 }
  161.                         break;
  162.                        
  163.                         case OBJECT::BILSY:
  164.                                 for (uint i = 0; i < 8; i++) {
  165.                                         jjANIMATION@ animBilsy = jjAnimations[jjAnimSets[ANIM::BILSBOSS] + i];
  166.                                         for (uint j = 0; j < animBilsy.frameCount; j++) {
  167.                                                 jjANIMFRAME@ frame = jjAnimFrames[animBilsy + j];
  168.                                                 jjPIXELMAP sprite(frame);
  169.                                                 for (uint x = 0; x < sprite.width; ++x) {
  170.                                                         for (uint y = 0; y < sprite.height; ++y) {
  171.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 22;
  172.                                                                 if (sprite[x,y] >= 59 && sprite[x,y] <= 63) sprite[x,y] += 14;
  173.                                                                 if (sprite[x,y] >= 64 && sprite[x,y] <= 71) sprite[x,y] += 8;
  174.                                                         }
  175.                                                 }
  176.                                                 sprite.save(frame);
  177.                                         }
  178.                                 }
  179.                         break;
  180.                        
  181.                         case OBJECT::BUBBA:
  182.                                 for (uint i = 0; i < 9; i++) {
  183.                                         jjANIMATION@ animBubba = jjAnimations[jjAnimSets[ANIM::BUBBA] + i];
  184.                                         for (uint j = 0; j < animBubba.frameCount; j++) {
  185.                                                 jjANIMFRAME@ frame = jjAnimFrames[animBubba + j];
  186.                                                 jjPIXELMAP sprite(frame);
  187.                                                 for (uint x = 0; x < sprite.width; ++x) {
  188.                                                         for (uint y = 0; y < sprite.height; ++y) {
  189.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 22;
  190.                                                                 if (sprite[x,y] >= 48 && sprite[x,y] <= 55) sprite[x,y] -= 16;
  191.                                                         }
  192.                                                 }
  193.                                                 sprite.save(frame);
  194.                                         }
  195.                                 }
  196.                         break;
  197.                        
  198.                         case OBJECT::CRAB:
  199.                                 for (uint i = 0; i < 8; i++) {
  200.                                         jjANIMATION@ animCrab = jjAnimations[jjAnimSets[ANIM::UTERUS] + i];
  201.                                         for (uint j = 0; j < animCrab.frameCount; j++) {
  202.                                                 jjANIMFRAME@ frame = jjAnimFrames[animCrab + j];
  203.                                                 jjPIXELMAP sprite(frame);
  204.                                                 for (uint x = 0; x < sprite.width; ++x) {
  205.                                                         for (uint y = 0; y < sprite.height; ++y) {
  206.                                                                 if (sprite[x,y] >= 16 && sprite[x,y] <= 23) sprite[x,y] += 16;
  207.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] += 48;
  208.                                                                 if (sprite[x,y] == 48 || sprite[x,y] == 49) sprite[x,y] = 72;
  209.                                                                 if (sprite[x,y] >= 50 && sprite[x,y] <= 55) sprite[x,y] += 23;
  210.                                                                 if (sprite[x,y] >= 80 && sprite[x,y] <= 87) sprite[x,y] -= 75;
  211.                                                                 if (sprite[x,y] >= 88 && sprite[x,y] <= 95) sprite[x,y] -= 56;
  212.                                                         }
  213.                                                 }
  214.                                                         sprite.save(frame);
  215.                                         }
  216.                                 }
  217.                         break;
  218.                        
  219.                         case OBJECT::DEMON:
  220.                                 for (uint i = 0; i < 4; i++) {
  221.                                         jjANIMATION@ animDemon = jjAnimations[jjAnimSets[ANIM::DEMON] + i];
  222.                                         for (uint j = 0; j < animDemon.frameCount; j++) {
  223.                                                 jjANIMFRAME@ frame = jjAnimFrames[animDemon + j];
  224.                                                 jjPIXELMAP sprite(frame);
  225.                                                 for (uint x = 0; x < sprite.width; ++x) {
  226.                                                         for (uint y = 0; y < sprite.height; ++y) {
  227.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 22;
  228.                                                                 if (sprite[x,y] >= 40 && sprite[x,y] <= 47) sprite[x,y] += 32;
  229.                                                                 if (sprite[x,y] >= 48 && sprite[x,y] <= 55) sprite[x,y] -= 16;
  230.                                                                 if (sprite[x,y] >= 64 && sprite[x,y] <= 71) sprite[x,y] += 8;
  231.                                                                 if (sprite[x,y] >= 80 && sprite[x,y] <= 87) sprite[x,y] -= 75;
  232.                                                         }
  233.                                                 }
  234.                                                         sprite.save(frame);
  235.                                         }
  236.                                 }
  237.                         break;
  238.                
  239.                         case OBJECT::DOGGYDOGG:
  240.                                 for (uint i = 0; i < 2; i++) {
  241.                                         jjANIMATION@ animDog = jjAnimations[jjAnimSets[ANIM::DOG] + i];
  242.                                         for (uint j = 0; j < animDog.frameCount; j++) {
  243.                                                 jjANIMFRAME@ frame = jjAnimFrames[animDog + j];
  244.                                                 jjPIXELMAP sprite(frame);
  245.                                                 for (uint x = 0; x < sprite.width; ++x) {
  246.                                                         for (uint y = 0; y < sprite.height; ++y) {
  247.                                                                 if (sprite[x,y] >= 16 && sprite[x,y] <= 23) sprite[x,y] += 8;
  248.                                                                 if (sprite[x,y] >= 40 && sprite[x,y] <= 43) sprite[x,y] -= 36;
  249.                                                                 if (sprite[x,y] >= 44 && sprite[x,y] <= 46) sprite[x,y] -= 35;
  250.                                                                 if (sprite[x,y] == 47) sprite[x,y] = 13;
  251.                  
  252.                                                         }
  253.                                                 }
  254.                                                 sprite.save(frame);
  255.                                         }
  256.                                 }
  257.                         break;
  258.                        
  259.                         case OBJECT::DRAGON:
  260.                                 for (uint i = 0; i < 3; i++) {
  261.                                         jjANIMATION@ animDragon = jjAnimations[jjAnimSets[ANIM::DRAGON] + i];
  262.                                         for (uint j = 0; j < animDragon.frameCount; j++) {
  263.                                                 jjANIMFRAME@ frame = jjAnimFrames[animDragon + j];
  264.                                                 jjPIXELMAP sprite(frame);
  265.                                                 for (uint x = 0; x < sprite.width; ++x) {
  266.                                                         for (uint y = 0; y < sprite.height; ++y) {
  267.                                                                 if (sprite[x,y] >= 59 && sprite[x,y] <= 63) sprite[x,y] -= 26;
  268.                                                                 if (sprite[x,y] >= 80 && sprite[x,y] <= 87) sprite[x,y] -= 8;
  269.                                                         }
  270.                                                 }
  271.                                                 sprite.save(frame);
  272.                                         }
  273.                                 }
  274.                         break;
  275.                
  276.                         case OBJECT::FENCER:
  277.                                 for (uint i = 0; i < 2; i++) {
  278.                                         jjANIMATION@ animFencer = jjAnimations[jjAnimSets[ANIM::FENCER] + i];
  279.                                         for (uint j = 0; j < animFencer.frameCount; j++) {
  280.                                                 jjANIMFRAME@ frame = jjAnimFrames[animFencer + j];
  281.                                                 jjPIXELMAP sprite(frame);
  282.                                                 for (uint x = 0; x < sprite.width; ++x) {
  283.                                                         for (uint y = 0; y < sprite.height; ++y) {
  284.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 21;
  285.                                                                 if (sprite[x,y] >= 48 && sprite[x,y] <= 55) sprite[x,y] -= 16;
  286.                                                                 if (sprite[x,y] == 80) sprite[x,y] = 72;
  287.                                                                 if (sprite[x,y] >= 81 && sprite[x,y] <= 87) sprite[x,y] -= 9;
  288.                                                         }
  289.                                                 }
  290.                                                 sprite.save(frame);
  291.                                         }
  292.                                 }
  293.                         break;
  294.                
  295.                         case OBJECT::LABRAT:
  296.                                 for (uint i = 0; i < 3; i++) {
  297.                                         jjANIMATION@ animRat = jjAnimations[jjAnimSets[ANIM::LABRAT] + i];
  298.                                         for (uint j = 0; j < animRat.frameCount; j++) {
  299.                                                 jjANIMFRAME@ frame = jjAnimFrames[animRat + j];
  300.                                                 jjPIXELMAP sprite(frame);
  301.                                                 for (uint x = 0; x < sprite.width; ++x) {
  302.                                                         for (uint y = 0; y < sprite.height; ++y) {
  303.                                                                 if (sprite[x,y] >= 48 && sprite[x,y] <= 55) sprite[x,y] -= 43;
  304.                                                         }
  305.                                                 }
  306.                                                 sprite.save(frame);
  307.                                         }
  308.                                 }
  309.                         break;
  310.                
  311.                         case OBJECT::MONKEY:
  312.                                 for (uint i = 0; i < 7; i++) {
  313.                                         jjANIMATION@ animMonkey = jjAnimations[jjAnimSets[ANIM::MONKEY] + i];
  314.                                         for (uint j = 0; j < animMonkey.frameCount; j++) {
  315.                                                 jjANIMFRAME@ frame = jjAnimFrames[animMonkey + j];
  316.                                                 jjPIXELMAP sprite(frame);
  317.                                                 for (uint x = 0; x < sprite.width; ++x) {
  318.                                                         for (uint y = 0; y < sprite.height; ++y) {
  319.                                                                 if (sprite[x,y] >= 41 && sprite[x,y] <= 47) sprite[x,y] -= 8;
  320.                                                                 if (sprite[x,y] == 40 || (sprite[x,y] >= 56 && sprite[x,y] <= 63)) sprite[x,y] = 0;
  321.                                                                 if (i > 1) {
  322.                                                                         if (sprite[x,y] >= 65 && sprite[x,y] <= 70) sprite[x,y] += 4;
  323.                                                                 } else {
  324.                                                                         if (sprite[x,y] >= 64 && sprite[x,y] <= 71) sprite[x,y] += 8;
  325.                                                                 }
  326.                                                         }
  327.                                                 }
  328.                                                 sprite.save(frame);
  329.                                         }
  330.                                 }
  331.                         break;
  332.                
  333.                         case OBJECT::RAVEN:
  334.                                 for (uint i = 0; i < 3; i++) {
  335.                                         jjANIMATION@ animRaven = jjAnimations[jjAnimSets[ANIM::RAVEN] + i];
  336.                                         for (uint j = 0; j < animRaven.frameCount; j++) {
  337.                                                 jjANIMFRAME@ frame = jjAnimFrames[animRaven + j];
  338.                                                 jjPIXELMAP sprite(frame);
  339.                                                 for (uint x = 0; x < sprite.width; ++x) {
  340.                                                         for (uint y = 0; y < sprite.height; ++y) {
  341.                                                                 if (sprite[x,y] == 40) sprite[x,y] = 64;
  342.                                                                 if (sprite[x,y] >= 59 && sprite[x,y] <= 62) sprite[x,y] += 8;
  343.                                                                 if (sprite[x,y] == 71 || sprite[x,y] == 76) sprite[x,y] = 35;
  344.                                                                 if (sprite[x,y] == 77) sprite[x,y] = 34;
  345.                                                                 if (sprite[x,y] == 78) sprite[x,y] = 33;
  346.                                                                 if (sprite[x,y] == 79) sprite[x,y] = 15;
  347.                                                         }
  348.                                                 }
  349.                                                 sprite.save(frame);
  350.                                         }
  351.                                 }
  352.                         break;
  353.  
  354.                         case OBJECT::QUEEN:
  355.                                 for (uint i = 0; i < 8; i++) {
  356.                                         jjANIMATION@ animQ = jjAnimations[jjAnimSets[ANIM::QUEEN] + i];
  357.                                         for (uint j = 0; j < animQ.frameCount; j++) {
  358.                                                 jjANIMFRAME@ frame = jjAnimFrames[animQ + j];
  359.                                                 jjPIXELMAP sprite(frame);
  360.                                                 for (uint x = 0; x < sprite.width; ++x) {
  361.                                                         for (uint y = 0; y < sprite.height; ++y) {
  362.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 22;
  363.                                                         }
  364.                                                 }
  365.                                                 sprite.save(frame);
  366.                                         }
  367.                                 }
  368.                         break;
  369.                        
  370.                         case OBJECT::ROTATINGROCK:
  371.                                 for (uint j = 0; j < animRock.frameCount; j++) {
  372.                                         jjANIMFRAME@ frame = jjAnimFrames[animRock + j];
  373.                                         jjPIXELMAP sprite(frame);
  374.                                         for (uint x = 0; x < sprite.width; ++x) {
  375.                                                 for (uint y = 0; y < sprite.height; ++y) {
  376.                                                         if (sprite[x,y] >= 64 && sprite[x,y] <= 71) sprite[x,y] = 17 - (sprite[x,y]&7)*2;
  377.                                                 }
  378.                                                 sprite.save(frame);
  379.                                         }
  380.                                 }
  381.                         break;
  382.                        
  383.                         case OBJECT::SKELETON:
  384.                                 for (uint i = 0; i < 3; i++) {
  385.                                         jjANIMATION@ animBones = jjAnimations[jjAnimSets[ANIM::SKELETON] + i];
  386.                                         for (uint j = 0; j < animBones.frameCount; j++) {
  387.                                                 jjANIMFRAME@ frame = jjAnimFrames[animBones + j];
  388.                                                 jjPIXELMAP sprite(frame);
  389.                                                 for (uint x = 0; x < sprite.width; ++x) {
  390.                                                         for (uint y = 0; y < sprite.height; ++y) {
  391.                                                                 if (sprite[x,y] == 72) sprite[x,y] = 2;
  392.                                                                 if (sprite[x,y] >= 73 && sprite[x,y] <= 79) sprite[x,y] -= 69;
  393.                                                         }
  394.                                                 }
  395.                                                 sprite.save(frame);
  396.                                         }
  397.                                 }
  398.                         break;
  399.                
  400.                         case OBJECT::SUCKER:
  401.                                 for (uint i = 0; i < 7; i++) {
  402.                                         jjANIMATION@ animSucker = jjAnimations[jjAnimSets[ANIM::SUCKER] + i];
  403.                                         for (uint j = 0; j < animSucker.frameCount; j++) {
  404.                                                 jjANIMFRAME@ frame = jjAnimFrames[animSucker + j];
  405.                                                 jjPIXELMAP sprite(frame);
  406.                                                 for (uint x = 0; x < sprite.width; ++x) {
  407.                                                         for (uint y = 0; y < sprite.height; ++y) {
  408.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 22;
  409.                                                                 if (sprite[x,y] >= 48 && sprite[x,y] <= 55) sprite[x,y] -= 16;
  410.                                                                 if (sprite[x,y] == 83) sprite[x,y] = 36;
  411.                                                         }
  412.                                                 }
  413.                                                 sprite.save(frame);
  414.                                         }
  415.                                 }
  416.                         break;
  417.  
  418.                         case OBJECT::FLOATSUCKER:
  419.                                 for (uint i = 0; i < 7; i++) {
  420.                                         jjANIMATION@ animSucker = jjAnimations[jjAnimSets[ANIM::SUCKER] + i];
  421.                                         for (uint j = 0; j < animSucker.frameCount; j++) {
  422.                                                 jjANIMFRAME@ frame = jjAnimFrames[animSucker + j];
  423.                                                 jjPIXELMAP sprite(frame);
  424.                                                 for (uint x = 0; x < sprite.width; ++x) {
  425.                                                         for (uint y = 0; y < sprite.height; ++y) {
  426.                                                                 if (sprite[x,y] >= 24 && sprite[x,y] <= 31) sprite[x,y] -= 22;
  427.                                                                 if (sprite[x,y] >= 48 && sprite[x,y] <= 55) sprite[x,y] -= 16;
  428.                                                                 if (sprite[x,y] == 83) sprite[x,y] = 36;
  429.                                                         }
  430.                                                 }
  431.                                                 sprite.save(frame);
  432.                                         }
  433.                                 }
  434.                         break;
  435.                        
  436.                         case OBJECT::TUFTURT:
  437.                                 for (uint j = 0; j < animTurt.frameCount; j++) {
  438.                                         jjANIMFRAME@ frame = jjAnimFrames[animTurt + j];
  439.                                         jjPIXELMAP sprite(frame);
  440.                                         for (uint x = 0; x < sprite.width; ++x) {
  441.                                                 for (uint y = 0; y < sprite.height; ++y) {
  442.                                                         if (sprite[x,y] == 40) sprite[x,y] = 64;
  443.                                                         if (sprite[x,y] >= 56 && sprite[x,y] <= 63) sprite[x,y] += 8;
  444.                                                         if (sprite[x,y] == 83 || sprite[x,y] == 84) sprite[x,y] = 72;
  445.                                                         if (sprite[x,y] >= 85 && sprite[x,y] <= 86) sprite[x,y] -= 11;
  446.                                                         if (sprite[x,y] >= 88 && sprite[x,y] <= 94) sprite[x,y] -= 58;
  447.                                                 }
  448.                                         }
  449.                                         sprite.save(frame);
  450.                                 }
  451.                         break;
  452.                
  453.                         case OBJECT::TUFBOSS:
  454.                                 for (int i = 0; i < 6; i++) {
  455.                                         jjANIMATION@ animTufBoss = jjAnimations[jjAnimSets[ANIM::TUFBOSS] + i];
  456.                                         for (uint j = 0; j < animTufBoss.frameCount; j++) {
  457.                                                 jjANIMFRAME@ frame = jjAnimFrames[animTufBoss + j];
  458.                                                 jjPIXELMAP sprite(frame);
  459.                                                 for (uint x = 0; x < sprite.width; ++x) {
  460.                                                         for (uint y = 0; y < sprite.height; ++y) {
  461.                                                                 if (sprite[x,y] == 40) sprite[x,y] = 64;
  462.                                                                 if (sprite[x,y] >= 56 && sprite[x,y] <= 63) sprite[x,y] += 8;
  463.                                                                 if (sprite[x,y] == 82 || sprite[x,y] == 83) sprite[x,y] = 72;
  464.                                                                 if (sprite[x,y] >= 84 && sprite[x,y] <= 86) sprite[x,y] -= 11;
  465.                                                                 if (sprite[x,y] >= 73 && sprite[x,y] <= 79) sprite[x,y] -= 40;
  466.                                                         }
  467.                                                 }
  468.                                                 sprite.save(frame);
  469.                                         }
  470.                                 }
  471.                         break;
  472.                        
  473.                         default: break;
  474.                 }
  475.         }
  476. }
  477.  
  478. bool facingPlayer(jjOBJ@ obj, int playerID) {
  479.         if (((obj.xPos < (jjPlayers[playerID].xPos - 32) && obj.direction == 1) || (obj.xPos > (jjPlayers[playerID].xPos + 32) && obj.direction == -1)) && obj.yPos <= int(jjPlayers[playerID].yPos + 208) && obj.yPos >= int(jjPlayers[playerID].yPos - 208)) return true;
  480.         return false;
  481. }
  482.  
  483. bool moving(jjOBJ@ obj) {
  484.         if (obj.xSpeed >= 1 || obj.xSpeed <= -1) return true;
  485.         return false;
  486. }
  487.  
  488. class BlueBat : jjBEHAVIORINTERFACE {
  489.         void onBehave(jjOBJ@ obj) {
  490.                 obj.behave(BEHAVIOR::BAT);
  491.                 obj.determineCurFrame();
  492.                
  493.                 int playerID = obj.findNearestPlayer(20000);
  494.                
  495.                 if (playerID > -1 && obj.freeze == 0) {
  496.                         if (obj.ySpeed != 0) {
  497.                                 if (jjPlayers[playerID].xPos > int(obj.xPos + 20) && obj.xPos < (obj.xOrg + 96)) {
  498.                                         obj.xPos += jjDifficulty > 1? 2:1;
  499.                                         obj.direction = 1;
  500.                                 }
  501.                                 else if (jjPlayers[playerID].xPos < int(obj.xPos - 20) && obj.xPos > (obj.xOrg - 96)) {
  502.                                         obj.xPos -= jjDifficulty > 1? 2:1;
  503.                                         obj.direction = -1;
  504.                                 }
  505.                                 if (jjPlayers[playerID].yPos > obj.yPos && obj.yPos < (obj.yOrg + 96)) obj.yPos += 1;
  506.                         }
  507.                 }
  508.         }
  509. }
  510.  
  511. class YetiCrab : jjBEHAVIORINTERFACE {
  512.         void onBehave(jjOBJ@ obj) {
  513.                 obj.behave(BEHAVIOR::CRAB);
  514.                
  515.                 if (obj.xSpeed > 0 && obj.direction == 1) obj.xPos += 1;
  516.                 else if (obj.xSpeed < 0 && obj.direction == -1) obj.xPos -= 1;
  517.         }
  518. }
  519.  
  520. class IceDemon : jjBEHAVIORINTERFACE {
  521.         void onBehave(jjOBJ@ obj) {
  522.                 obj.behave(BEHAVIOR::DEMON);
  523.                 obj.determineCurFrame();
  524.                
  525.                 int playerID = obj.findNearestPlayer(120000);
  526.                 int fireRate = jjDifficulty >= 3? 6:(15 * (3 / (jjDifficulty + 1)));
  527.                
  528.                 if (playerID > -1 && obj.freeze == 0) {
  529.                         if (facingPlayer(obj, playerID) && jjGameTicks % fireRate == 0 && moving(obj)) {
  530.                                 IceBullet temp;
  531.                                 jjOBJ@ icebullet = jjObjects[jjAddObject(OBJECT::ICEBULLETPU, int(obj.xPos + (8 * obj.direction)), int(obj.yPos + 4), obj.objectID, CREATOR::OBJECT, jjVOIDFUNCOBJ(temp.onBehave))];
  532.                                 icebullet.playerHandling = HANDLING::ENEMYBULLET;
  533.                                 icebullet.animSpeed = 1;
  534.                                 icebullet.direction = obj.direction;
  535.                                 icebullet.xSpeed = 6 * icebullet.direction;
  536.                                
  537.                                 if (jjPlayers[playerID].yPos > int(obj.yPos + 32)) icebullet.ySpeed = 2;
  538.                                 else if (jjPlayers[playerID].yPos < int(obj.yPos - 32)) icebullet.ySpeed = -2;
  539.                                 else icebullet.ySpeed = 0;
  540.                                
  541.                                 icebullet.state = STATE::FLY;
  542.                                 icebullet.lightType = LIGHT::POINT;
  543.                                 icebullet.counterEnd = 90;
  544.                                 if (icebullet.counter == 1) jjSample(icebullet.xPos, icebullet.yPos, SOUND::AMMO_ICEPU2, 48, 0);
  545.                         }
  546.                 }
  547.                 if (obj.state == STATE::KILL) {
  548.                         obj.particlePixelExplosion(1);
  549.                         jjSample(obj.xPos, obj.yPos, SOUND::BILSBOSS_FIRESTART, 0, 0);
  550.                 }
  551.         }
  552. }
  553.  
  554. class BlueDog : jjBEHAVIORINTERFACE {
  555.         void onBehave(jjOBJ@ obj) {
  556.                 obj.behave(BEHAVIOR::DOGGYDOGG);
  557.                
  558.                 int playerID = obj.findNearestPlayer(50000);
  559.                 if (playerID > -1 && obj.freeze == 0) {
  560.                         if (facingPlayer(obj, playerID) && moving(obj)) {
  561.                                 obj.xPos += (2 * obj.direction);
  562.                                 obj.state = STATE::ACTION;
  563.                         }
  564.                         else if (obj.xPos > int(jjPlayers[playerID].xPos + 64) || obj.xPos < int(jjPlayers[playerID].xPos - 64)) obj.direction *= -1;
  565.                 }
  566.         }
  567. }
  568.  
  569. class IceDragon : jjBEHAVIORINTERFACE {
  570.         void onBehave(jjOBJ@ obj) {
  571.                 obj.behave(BEHAVIOR::DRAGON, obj.var[1] == 0? true:false);
  572.                 if (obj.var[1] == 1) jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos + 2, obj.curFrame, obj.direction, SPRITE::NORMAL, 3, 3, 3);
  573.                 obj.freeze = 0;
  574.                 for (int i = 1; i < jjObjectCount; i++) {
  575.                         if (jjObjects[i].behavior == BEHAVIOR::PLATFORM) {
  576.                                 float dx = jjObjects[i].xOrg - obj.xOrg, dy = jjObjects[i].yOrg - obj.yOrg;
  577.                                 if (dx * dx + dy * dy < 128 * 128) {
  578.                                         obj.xPos = jjObjects[i].xPos;
  579.                                         obj.yPos = jjObjects[i].yPos - 10;
  580.                                         obj.var[1] = 1;
  581.                                 }
  582.                         }
  583.                 }
  584.         }
  585. }
  586.  
  587. class WhiteFencer : jjBEHAVIORINTERFACE {
  588.         void onBehave(jjOBJ@ obj) {
  589.                 obj.behave(BEHAVIOR::FENCER);
  590.                 int playerID = obj.findNearestPlayer(150000);
  591.                 if (playerID > -1 && obj.freeze == 0) {
  592.                         if (obj.xSpeed > 0) {
  593.                                 if ((jjPlayers[playerID].xPos - obj.xPos) >= 96 && (jjPlayers[playerID].xPos - obj.xPos) <= 128) obj.xPos += 2;
  594.                                 else if ((jjPlayers[playerID].xPos - obj.xPos) >= 128) obj.xPos += 3;
  595.                         }
  596.                         else if (obj.xSpeed < 0) {
  597.                                 if ((obj.xPos - jjPlayers[playerID].xPos) >= 96 && (obj.xPos - jjPlayers[playerID].xPos) <= 128) obj.xPos -= 2;
  598.                                 else if ((obj.xPos - jjPlayers[playerID].xPos) >= 128) obj.xPos -= 3;
  599.                         }
  600.                        
  601.                         if (obj.ySpeed < 0) {
  602.                                 obj.yPos -= 1;
  603.                         }
  604.                        
  605.                         if (obj.freeze == 0) {
  606.                                 if (obj.xPos > int(jjPlayers[playerID].xPos + 32)) obj.direction = -1;
  607.                                 else if (obj.xPos < int(jjPlayers[playerID].xPos - 32)) obj.direction = 1;
  608.                         }
  609.                 }
  610.         }
  611. }
  612.  
  613. class CaveRat : jjBEHAVIORINTERFACE {
  614.         void onBehave(jjOBJ@ obj) {
  615.                 obj.behave(BEHAVIOR::LABRAT);
  616.                 if (obj.ySpeed != 0 && !jjMaskedPixel(int(obj.xPos + (64*obj.direction)), int(obj.yPos), 4)) {
  617.                         obj.xPos += 2 * obj.direction;
  618.                 }
  619.                 if (jjMaskedPixel(int(obj.xPos + (8*obj.direction)), int(obj.yPos), 4)) {
  620.                         obj.xPos += 2 * obj.direction;
  621.                 }
  622.         }
  623. }
  624.  
  625. class SnowMonkey : jjBEHAVIORINTERFACE {
  626.         void onBehave(jjOBJ@ obj) {
  627.                 obj.behave(BEHAVIOR::MONKEY);
  628.                
  629.                 int playerID = obj.findNearestPlayer(30000);
  630.                 if (playerID > -1 && obj.freeze == 0 && !moving(obj)) {
  631.                         if (obj.xPos > int(jjPlayers[playerID].xPos + 32)) obj.direction = -1;
  632.                         else if (obj.xPos < int(jjPlayers[playerID].xPos - 32)) obj.direction = 1;
  633.                 }
  634.         }
  635. }
  636.  
  637. class WhiteRaven : jjBEHAVIORINTERFACE {
  638.         void onBehave(jjOBJ@ obj) {
  639.                 obj.behave(BEHAVIOR::RAVEN);
  640.                
  641.                 int playerID = obj.findNearestPlayer(50000);
  642.                 if (playerID > -1 && obj.freeze == 0) {
  643.                         if (obj.ySpeed > 0.1 && (obj.xSpeed > 0.5 || obj.xSpeed < -0.5)) {
  644.                                 obj.ySpeed = 4;
  645.                         }
  646.                         if (jjPlayers[playerID].xPos > int(obj.xPos)) obj.xPos += 2;
  647.                         else if (jjPlayers[playerID].xPos < int(obj.xPos)) obj.xPos -= 2;
  648.                 }
  649.                
  650.                 if (obj.state != STATE::KILL && obj.isActive && jjGameTicks % 85 == 0 && obj.freeze == 0)
  651.                         jjSample(obj.xPos, obj.yPos, SOUND::P2_TONG, 32, 35000 + jjRandom()%12000);
  652.         }
  653. }
  654.  
  655. class BoneChucker : jjBEHAVIORINTERFACE {
  656.         void onBehave(jjOBJ@ obj) {
  657.                 obj.behave(BEHAVIOR::SKELETON);
  658.                
  659.                 int playerID = obj.findNearestPlayer(150000);
  660.                 int fireRate = jjDifficulty >= 3? 12:(35 * (3 / (jjDifficulty + 1)));
  661.                
  662.                 if (playerID > -1 && obj.freeze == 0) {
  663.                         if (facingPlayer(obj, playerID) && jjGameTicks % fireRate == 0) {
  664.                                 jjOBJ@ bone = jjObjects[jjAddObject(OBJECT::SHARD, int(obj.xPos - (8 * obj.direction)), int(obj.yPos + 2), obj.objectID, CREATOR::OBJECT)];
  665.                                 bone.behavior = BEHAVIOR::BOUNCERBULLET;
  666.                                 bone.determineCurAnim(ANIM::SKELETON, 0);
  667.                                 bone.playerHandling = HANDLING::ENEMYBULLET;
  668.                                 bone.animSpeed = 1;
  669.                                 bone.direction = obj.direction;
  670.                                 bone.xSpeed = 6 * bone.direction;
  671.                                 bone.ySpeed = -3;
  672.                                 bone.state = STATE::FLY;
  673.                                 bone.lightType = LIGHT::POINT;
  674.                                 bone.counterEnd = 105;
  675.                                 if (bone.counter == 0) randomBoneSample(bone);
  676.                                 bone.killAnim = jjObjectPresets[OBJECT::BOUNCERBULLET].killAnim;
  677.                         }
  678.                 }
  679.         }
  680. }
  681.  
  682. void randomBoneSample(jjOBJ@ obj) {
  683.         switch(jjRandom()%4) {
  684.                 case 0: jjSample(obj.xPos, obj.yPos, SOUND::SKELETON_BONE1, 0, 0); break;
  685.                 case 1: jjSample(obj.xPos, obj.yPos, SOUND::SKELETON_BONE2, 0, 0); break;
  686.                 case 2: jjSample(obj.xPos, obj.yPos, SOUND::SKELETON_BONE3, 0, 0); break;
  687.                 case 3: jjSample(obj.xPos, obj.yPos, SOUND::SKELETON_BONE5, 0, 0); break;
  688.         }
  689. }
  690.  
  691. class WhiteSucker : jjBEHAVIORINTERFACE {
  692.         void onBehave(jjOBJ@ obj) {
  693.                 obj.behave(BEHAVIOR::FLOATSUCKER, obj.state == STATE::KILL? true:false);
  694.                 if (obj.state != STATE::KILL) jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, (1 + (obj.age/20)) * obj.direction, (1 + (obj.age/20)), obj.freeze > 0? SPRITE::FROZEN : SPRITE::NORMAL);
  695.                 int playerID = obj.findNearestPlayer(28000);
  696.                 if (playerID > -1 && obj.state == STATE::FLOAT) {
  697.                         if (obj.age < 100 && obj.freeze == 0) {
  698.                                 obj.age += 5;
  699.                         }
  700.                 } else {
  701.                         if (obj.age > 0) obj.age -= 5;
  702.                 }
  703.                
  704.                 if (obj.age == 5 && obj.var[1] == 1) {
  705.                         obj.var[0] = 1;
  706.                 }
  707.                
  708.                 if (obj.age == 10) {
  709.                         obj.var[1] = 0;
  710.                 }
  711.                
  712.                 if (obj.age == 0) {
  713.                         obj.var[0] = 0;
  714.                         obj.var[1] = 1;
  715.                 }
  716.                
  717.                 float dx = jjPlayers[playerID].xPos - obj.xPos, dy = jjPlayers[playerID].yPos - obj.yPos;
  718.                 if (obj.freeze == 0 && dx * dx + dy * dy < obj.age * obj.age) {
  719.                         jjPlayers[playerID].hurt(1, false);
  720.                         if (jjPlayers[playerID].xPos > int(obj.xPos + 8)) jjPlayers[playerID].xSpeed = 4;
  721.                         else if (jjPlayers[playerID].xPos < int(obj.xPos - 8)) jjPlayers[playerID].xSpeed = -4;
  722.                        
  723.                         if (jjPlayers[playerID].xPos < int(obj.xPos + 8) && jjPlayers[playerID].xPos > int(obj.xPos - 8)) {
  724.                                 jjPlayers[playerID].ySpeed = jjPlayers[playerID].yPos > obj.yPos? 3:-3;
  725.                                 jjPlayers[playerID].xSpeed = 4 * obj.direction;
  726.                         } else jjPlayers[playerID].ySpeed = jjPlayers[playerID].yPos > obj.yPos? 1:-1;
  727.                 }
  728.                
  729.                 if (obj.age == 5 && obj.var[1] == 1 && obj.freeze == 0) jjSample(obj.xPos, obj.yPos, SOUND::P2_FART, 48, 0);
  730.                
  731.                 for (int i = 0; i < jjObjectCount; i++) {
  732.                         jjOBJ@ bull = jjObjects[i];
  733.                         if (bull.playerHandling == HANDLING::PLAYERBULLET && obj.state == STATE::FLOAT) {
  734.                                 float bdx = bull.xPos - obj.xPos, bdy = bull.yPos - obj.yPos;
  735.                                 if (bdx * bdx + bdy * bdy < 200 * 200) {
  736.                                         if (obj.age < 100 && obj.freeze == 0) obj.age += 5;
  737.                                 }
  738.                                 if (bdx * bdx + bdy * bdy < obj.age * obj.age) {
  739.                                         if (bull.var[3] == 3) {
  740.                                                 jjOBJ@ freeze = jjObjects[jjAddObject(OBJECT::ICEBULLET, obj.xPos, obj.yPos, obj.creatorID, CREATOR::PLAYER)];
  741.                                                 freeze.counterEnd = 1;
  742.                                                 freeze.state = STATE::FLY;
  743.                                                 freeze.xSpeed = 1;
  744.                                                 freeze.playerHandling = HANDLING::PLAYERBULLET;
  745.                                                 bull.delete();
  746.                                         } else {
  747.                                                 bull.ricochet();
  748.                                         }
  749.                                 }
  750.                         }
  751.                 }
  752.                
  753.                 if (obj.state == STATE::FREEZE) {
  754.                         obj.special--;
  755.                         if (obj.special == 0) {
  756.                                 obj.unfreeze(1);
  757.                                 obj.state = obj.oldState;
  758.                         }
  759.                 }
  760.         }
  761.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bull, jjPLAYER@ play, int force) {
  762.                 if (bull !is null) {
  763.                         if (bull.playerHandling == HANDLING::PLAYERBULLET) {
  764.                                 obj.energy -= bull.animSpeed;
  765.                                 obj.justHit = 5;
  766.                                 if (bull.var[3] == 3) obj.special = 350;
  767.                         }
  768.                 }
  769.                 return true;
  770.         }
  771. }
  772.  
  773. class YetiTurtle : jjBEHAVIORINTERFACE {
  774.         void onBehave(jjOBJ@ obj) {
  775.                 obj.behave(BEHAVIOR::WALKINGENEMY);
  776.                 int playerID = obj.findNearestPlayer(130000);
  777.                 if (playerID > -1 && obj.freeze == 0) {
  778.                        
  779.                         if (obj.age > 0) obj.age--;
  780.                         jjPLAYER@ play;
  781.                         float dx = jjPlayers[playerID].xPos - obj.xPos, dy = jjLocalPlayers[playerID].yPos - obj.yPos;
  782.                         if (obj.freeze == 0 && facingPlayer(obj, playerID) && obj.age == 0 && dx * dx + dy * dy < 50 * 50) {
  783.                                 obj.age = 35;
  784.                                 jjPlayers[playerID].xSpeed = 16 * obj.direction;
  785.                                 jjPlayers[playerID].ySpeed = -6;
  786.                                 jjPlayers[playerID].hurt(1, false);
  787.                                 jjSample(jjPlayers[playerID].xPos, jjPlayers[playerID].yPos, SOUND::FATCHK_HIT1, 42, 0);
  788.                         }
  789.                
  790.                         for (int i = 0; i < jjObjectCount; i++) {
  791.                                 if (jjObjects[i].eventID == OBJECT::ROTATINGROCK && obj.doesCollide(jjObjects[i], true) && facingPlayer(obj, playerID)) {
  792.                                         if ((obj.xSpeed > 0 && jjPlayers[playerID].xPos > obj.xPos) || (obj.xSpeed < 0 && jjPlayers[playerID].xPos < obj.xPos)) {
  793.                                                 jjObjects[i].xSpeed = 8 * (obj.xSpeed > 0? 1:-1);
  794.                                                 jjObjects[i].ySpeed = -2;
  795.                                                 jjObjects[i].state = STATE::FLY;
  796.                                         }
  797.                                 }
  798.                         }
  799.                 }
  800.         }
  801. }
  802.  
  803. class IceBullet : jjBEHAVIORINTERFACE {
  804.         void onBehave(jjOBJ@ obj) {
  805.                 obj.behave(BEHAVIOR::BULLET, true);
  806.                 obj.direction = obj.xSpeed < 1? -1:1;
  807.                 int playerID = obj.findNearestPlayer(30000);
  808.                 if (obj.state == STATE::FLY && obj.doesCollide(jjPlayers[playerID], true)) {
  809.                         jjPlayers[playerID].freeze(true);
  810.                         jjPlayers[playerID].xSpeed -= (obj.xSpeed / (obj.direction == -1? 8:-8)) * obj.direction;
  811.                 }
  812.         }
  813. }
  814.  
  815. class Snowball : jjBEHAVIORINTERFACE {
  816.         void onBehave(jjOBJ@ obj) {
  817.                 obj.behave(BEHAVIOR::BULLET, obj.state == STATE::EXPLODE? true:false);
  818.                 if (obj.state != STATE::EXPLODE) {
  819.                         obj.direction = obj.xSpeed > 0? 1:-1;
  820.                         obj.var[0] = int(atan2(-obj.ySpeed, obj.xSpeed) * (512.f * 0.318309886142228f));
  821.                         jjDrawRotatedSprite(int((obj.xPos + (8*obj.direction)) - jjCos(obj.var[0])), int((obj.yPos - (16*obj.direction)) - jjSin(obj.var[0])), ANIM::FONT, 0, 14, obj.var[0], 1.5 * obj.direction, 1.5, SPRITE::SINGLEHUE, 2);
  822.                         obj.ySpeed += 0.15;
  823.                 }
  824.         }
  825. }