Downloads containing saldr-devan.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Devan's Revenge (Intro)Featured Download sAlAmAnDeR Single player 9.6 Download file

File preview

  1. class Timer {
  2.         private int inter;
  3.         private int endTime;
  4.         private bool running;
  5.         private int startTime;
  6.        
  7.         Timer() {
  8.                 this.running = false;
  9.         }
  10.        
  11.         void start(int interval) {
  12.                 if(interval < 0) {
  13.                         start();
  14.                         return;
  15.                 }
  16.                 this.inter = interval;
  17.                 this.startTime = jjGameTicks;
  18.                 this.endTime = this.startTime + this.inter;
  19.                 this.running = true;
  20.         }
  21.        
  22.         void start() {
  23.                 this.startTime = jjGameTicks;
  24.                 this.running = true;
  25.                 this.endTime = -1;
  26.                 this.inter = -1;
  27.         }
  28.        
  29.         void stop() {
  30.                 this.running = false;
  31.         }
  32.        
  33.         bool finished() {
  34.                 if(!this.running) return false;
  35.                 if(this.endTime == -1) return false;
  36.                 return jjGameTicks >= this.endTime;
  37.         }
  38.        
  39.         int elapsedTime() {
  40.                 return jjGameTicks-this.startTime;
  41.         }
  42.        
  43.         int getEndTime() {
  44.                 return endTime;
  45.         }
  46.        
  47.         int remainingTime() {
  48.                 if(this.interval() == -1) return -1;
  49.                 return this.interval() - this.elapsedTime();
  50.         }
  51.        
  52.         int interval() {
  53.                 return this.inter;
  54.         }
  55.        
  56.         void reset() {
  57.                 start(this.inter);
  58.         }
  59.        
  60.         bool isRunning() {
  61.                 return this.running;
  62.         }
  63. }
  64.  
  65. enum DevanAnim {
  66.         DEVIL_FIRE_BREATH = 0,
  67.         STARS = 1,
  68.         FALLING = 2,
  69.         STARS_SQUISH = 3,
  70.         FIREBALL = 4,
  71.         DEVIL_FLY = 5,
  72.         DEVIL_TRANSFORM = 6,
  73.         DEVIL_REVERT = 7,
  74.         IDLE = 8,
  75.         DEVIL_TURN = 9,
  76.         WARP_IN = 10,
  77.         WARP_OUT = 11,
  78.         BLASTER_DISSAPEAR = 12,
  79.         DUCK = 13,
  80.         FIRE = 14,
  81.         BLASTER = 15,
  82.         RUN_JUMP = 16,
  83.         BLASTERBULLET = 17,
  84.         RUN = 18,
  85.         RAISE_GUN = 19,
  86.         FALL = 20,
  87.         IDLE_GUN = 21,
  88.         WARP_IN_GUN = 22,
  89.         WARP_OUT_GUN = 23
  90. }
  91.  
  92. uint numFrames(DevanAnim anim) {
  93.         switch(anim) {
  94.                 case DEVIL_FIRE_BREATH: return 11;
  95.                 case STARS: return 6;
  96.                 case FALLING: return 2;
  97.                 case STARS_SQUISH: return 1;
  98.                 case FIREBALL: return 3;
  99.                 case DEVIL_FLY: return 11;
  100.                 case DEVIL_TRANSFORM: return 38;
  101.                 case DEVIL_REVERT: return 14;
  102.                 case IDLE: return 4;
  103.                 case DEVIL_TURN: return 11;
  104.                 case WARP_IN: return 8;
  105.                 case WARP_OUT: return 8;
  106.                 case BLASTER_DISSAPEAR: return 7;
  107.                 case DUCK: return 9;
  108.                 case FIRE: return 10;
  109.                 case BLASTER: return 8;
  110.                 case RUN_JUMP: return 26;
  111.                 case BLASTERBULLET: return 8;
  112.                 case RUN: return 13;
  113.                 case RAISE_GUN: return 3;
  114.                 case FALL: return 2;
  115.                 case IDLE_GUN: return 4;
  116.                 case WARP_IN_GUN: return 8;
  117.                 case WARP_OUT_GUN: return 8;
  118.         }
  119.         return 0;
  120. }
  121.  
  122. class Position {
  123.         float xPos;
  124.         float yPos;
  125.        
  126.         void get(jjPLAYER@ player) {
  127.                 xPos = player.xPos;
  128.                 yPos = player.yPos;
  129.         }
  130.        
  131.         void set(jjPLAYER@ player) {
  132.                 player.xPos = xPos;
  133.                 player.yPos = yPos;
  134.         }
  135. }
  136.  
  137. DevanShell@ devanPlayer;
  138. class DevanShell : COMMON::IFocalPoint {
  139.         private jjPLAYER@ play;
  140.         private bool shooting = false;
  141.         bool canFire = true;
  142.         private bool ducking = false;
  143.         private bool jumping = true;
  144.         private bool falling = false;
  145.         private bool special = false;
  146.         private bool devilMode = false;
  147.         private bool reverting = false;
  148.         private bool warpingOut = false;
  149.         private bool warpingIn = false;
  150.         private bool stars = false;
  151.         private bool growArms = false;
  152.         private bool gunMagic = false;
  153.         private bool raiseGun = false;
  154.         private Timer animTimer();
  155.         private Timer idleTimer();
  156.         private Timer devilTimer();
  157.         private Position oldPos();
  158.        
  159.         private DevanAnim anim;
  160.         private uint frame;
  161.        
  162.         bool allowInput = true;
  163.        
  164.         DevanShell(jjPLAYER@ play) {
  165.                 @this.play = @play;
  166.                 play.fastfire = 6;
  167.                 jjOBJ@ obj = jjObjects[jjAddObject(OBJECT::CARROT, 0,0)];
  168.                 obj.determineCurAnim(ANIM::DEVILDEVAN,0,false);
  169.                 obj.determineCurAnim(ANIM::DEVAN,0,false);
  170.                 jjWeapons[1].defaultSample = false;
  171.                 jjObjectPresets[OBJECT::BLASTERBULLET].var[6] = jjObjectPresets[OBJECT::BLASTER].var[6] | 2 | 8;
  172.         }
  173.        
  174.         float get_xPos() const { return play.xPos; }
  175.         float get_yPos() const { return play.yPos; }
  176.         bool  get_isActive() const { return true; }
  177.        
  178.         float get_xSpeed() { return play.xSpeed; }
  179.         float get_ySpeed() { return play.ySpeed; }
  180.         void set_xSpeed(float xSpeed) { play.xSpeed = xSpeed; }
  181.         void set_ySpeed(float ySpeed) { play.ySpeed = ySpeed; }
  182.  
  183.         void update() {
  184.                 play.spriteMode = SPRITE::Mode::INVISIBLE; //Make player invisible
  185.                 if(!idleTimer.isRunning() && jjGameTicks > 1) idleTimer.start(1200);
  186.                
  187.                 if(warpingOut) { warpingOut = playAnim(DevanAnim::WARP_OUT);}
  188.                 else if(warpingIn) { warpingIn = playAnim(DevanAnim::WARP_IN);}
  189.                 else if(!devilMode) {
  190.                         if(idleTimer.finished()) {
  191.                                 randomIdleAnimation();
  192.                                 idleTimer.reset();
  193.                         }
  194.                        
  195.                         //Idle animations
  196.                         if(growArms) { handleGrowArms(); }
  197.                         else if(gunMagic) { handleGunMagic(); }
  198.                        
  199.                         //Actions
  200.                         else if(raiseGun)               {handleRaiseGun();}
  201.                         else if(reverting)              {handleRevert();  }
  202.                         else if(shooting)       {handleShooting();}
  203.                         else if(jumping)                {handleJumping(); }
  204.                         else if(ducking)                {handleDucking(); }
  205.                         else if(special)                {handleSpecial(); }
  206.                         else if(stars)                  {handleStars();   }
  207.                         else if(play.xSpeed == 0) {
  208.                                 anim = DevanAnim::IDLE;
  209.                                 frame = (jjGameTicks/9)%7;
  210.                         } else {
  211.                                 int speed;
  212.                                 if(play.running)
  213.                                         if(abs(play.xSpeed) <= 16) speed = 4;
  214.                                         else speed = 2;
  215.                                 else
  216.                                         speed = 8;
  217.  
  218.                                 anim = DevanAnim::RUN;
  219.                                 frame = (jjGameTicks/speed)%13;
  220.                         }
  221.                        
  222.                 } else {
  223.                         if(shooting) {handleShootingDevil();}
  224.                         else {
  225.                                 anim = DevanAnim::DEVIL_FLY;
  226.                                 frame = animTimer.elapsedTime()/7;
  227.                                 play.fly = FLIGHT::FLYCARROT;
  228.                         }
  229.                        
  230.                         if(devilTimer.isRunning())
  231.                                 jjDrawString(int(p.xPos-16), int(p.yPos-64), devilTimer.remainingTime() + "");
  232.                         if(devilTimer.finished()) {
  233.                                 jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_VANISH1);
  234.                                 devilTimer.stop();
  235.                                 animTimer.start();
  236.                                 play.fly = FLIGHT::NONE;
  237.                                 oldPos.get(play);
  238.                                 reverting = true;
  239.                                 devilMode = false;
  240.                         }
  241.                 }
  242.                 drawSprite(anim, frame);
  243.                 /*if(!warpingOut && jjEventGet(play.xPos/32,play.yPos/32) == AREA::WARP) {jjDebug("WARP");warpingOut = true; animTimer.start();}
  244.                 if(jjEventGet(play.xPos/32,play.yPos/32) == AREA::WARPTARGET) {jjDebug("WARPTARGET");warpingIn = true;warpingOut=false; animTimer.start();}
  245.                 if(jjEventGet(play.xPos/32,play.yPos/32) == AREA::VINE) jjDebug("VINE");
  246.                 if(jjEventGet(play.xPos/32,play.yPos/32) == AREA::HPOLE) jjDebug("HPOLE");
  247.                 if(jjEventGet(play.xPos/32,play.yPos/32) == AREA::VPOLE) jjDebug("VPOLE");
  248.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::REDSPRING) jjDebug("REDSPRING");
  249.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::GREENSPRING) jjDebug("GREENSPRING");
  250.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::BLUESPRING) jjDebug("BLUESPRING");
  251.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::HORREDSPRING) jjDebug("HORREDSPRING");
  252.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::HORGREENSPRING) jjDebug("HORGREENSPRING");
  253.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::HORBLUESPRING) jjDebug("HORBLUESPRING");
  254.                 if(jjEventGet(play.xPos/32,play.yPos/32) == OBJECT::COPTER) jjDebug("COPTER");*/
  255.         }
  256.        
  257.         bool playAnim(DevanAnim devanAnim) {
  258.                 anim = devanAnim;
  259.                 frame = animTimer.elapsedTime()/7;
  260.                 return frame < numFrames(anim);
  261.         }
  262.        
  263.         bool onGround() {
  264.                 return jjMaskedHLine(int(player.xPos-12),24,int(player.yPos+21)) || player.platform > 0;
  265.         }
  266.        
  267.         /*bool onGround() {
  268.                 return play.ySpeed == 0;
  269.         }*/
  270.        
  271.         void randomIdleAnimation() {
  272.                 idleTimer.stop();
  273.                 stars = false;
  274.                 int rand = jjRandom() % 3;
  275.                 animTimer.start();
  276.                 if(rand == 0) {
  277.                         growArms = true;
  278.                 } else if(rand == 1) {
  279.                         gunMagic = true;
  280.                 } else if(rand == 2) {
  281.                         jjSample(play.xPos, play.yPos, SOUND::P2_POEP);
  282.                         stars = true;
  283.                 }
  284.         }
  285.        
  286.         void handleShooting() {
  287.                 anim = DevanAnim::FIRE;
  288.                 if((animTimer.elapsedTime()/8) < 4) {
  289.                         frame = (animTimer.elapsedTime()/8);
  290.                 } else {
  291.                         int bigBlast = (((animTimer.elapsedTime()/(play.fastfire-3))-4)%2);
  292.                         frame = max(0,bigBlast+5);
  293.                        
  294.                         if(bigBlast == 0) {
  295.                                 if(canFire) {
  296.                                         play.fireBullet(WEAPON::CURRENT,true,true,p.direction == -1 ? DIRECTION::LEFT : DIRECTION::RIGHT);
  297.                                         canFire = false;
  298.                                 }
  299.                         } else {
  300.                                 canFire = true;
  301.                         }
  302.                 }
  303.         }
  304.        
  305.         void handleDucking() {
  306.                 anim = DevanAnim::DUCK;
  307.                 if((animTimer.elapsedTime()/7) < 5) {
  308.                         frame = (animTimer.elapsedTime()/7);
  309.                 } else {
  310.                         frame = 5;
  311.                 }
  312.         }
  313.        
  314.         void handleJumping() {
  315.                 if(onGround()) jumping = false;
  316.                 anim = DevanAnim::RUN_JUMP;
  317.                 if(!falling) {
  318.                         frame = 18;
  319.                         if(play.ySpeed > 0) {
  320.                                 animTimer.start();
  321.                                 falling = true;
  322.                         }
  323.                 } else {
  324.                         frame = min(22,(animTimer.elapsedTime()/7)+18);
  325.                 }
  326.         }
  327.        
  328.         void handleSpecial() {
  329.                 anim = DevanAnim::DEVIL_TRANSFORM;
  330.                 frame = animTimer.elapsedTime()/7;
  331.                 if(frame < numFrames(DevanAnim::DEVIL_TRANSFORM)) {
  332.                         if(frame == 0)
  333.                                 jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_STRETCH1);
  334.                         else if(frame == 7)
  335.                                 jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_STRECH2);
  336.                         else if(frame == 12)
  337.                                 jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_STRETCH3);
  338.                         else if(frame == 22)
  339.                                 jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_STRECHTAIL);
  340.                         else if(frame == 28)
  341.                                 jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_WINGSOUT);
  342.                 } else {
  343.                         jjDebug("S=F1");
  344.                         devilMode = true;
  345.                         special = false;
  346.                         devilTimer.start(700);
  347.                 }
  348.         }
  349.        
  350.         void handleShootingDevil() {
  351.                 anim = DevanAnim::DEVIL_FIRE_BREATH;
  352.                 frame = (animTimer.elapsedTime()/7);
  353.                 if(frame > numFrames(DevanAnim::DEVIL_FIRE_BREATH)) {
  354.                         animTimer.reset();
  355.                 }
  356.                 if(frame == 8) {
  357.                         if(canFire) {
  358.                                 float direction = play.direction == 1 ? .75 * pi : 1.25 * pi;
  359.                                
  360.                                 play.fireBullet(WEAPON::TOASTER,false,false,direction);
  361.                                 canFire = false;
  362.                         }
  363.                 } else canFire = true;
  364.         }
  365.        
  366.         void handleRevert() {
  367.                 frame = animTimer.elapsedTime()/7;
  368.                 special = true;
  369.                 if(onGround()) {
  370.                         jjDebug("S=F2");
  371.                         special = false;
  372.                         stars = true;
  373.                         reverting = false;
  374.                         devilMode = false;
  375.                         idleTimer.reset();
  376.                         return;
  377.                 }
  378.                 if(frame < numFrames(DevanAnim::DEVIL_REVERT)) {
  379.                         oldPos.set(play);
  380.                         play.xSpeed = play.ySpeed = play.xAcc = play.yAcc = 0;
  381.                         anim = DevanAnim::DEVIL_REVERT;
  382.                 } else {
  383.                         anim = DevanAnim::FALLING;
  384.                 }
  385.         }
  386.        
  387.         void handleStars() {
  388.                 anim = DevanAnim::STARS;
  389.                 frame = animTimer.elapsedTime()/7;
  390.         }
  391.        
  392.         void handleGrowArms() {
  393.                 int tick = animTimer.elapsedTime()/7;
  394.                 anim = DevanAnim::DEVIL_TRANSFORM;
  395.                
  396.                 int animLen = 10;//or 14 maybe
  397.                 int shakeLen = 16;
  398.                
  399.                 if(tick < animLen) {
  400.                         frame = tick;
  401.                 } else if(tick < animLen + shakeLen) {
  402.                         frame = tick % 2 + animLen;
  403.                 } else if(tick < 2*animLen+shakeLen+1) {
  404.                         frame = 2*animLen+shakeLen-tick;
  405.                 } else
  406.                         growArms = false;
  407.                
  408.                 if(frame == 0)
  409.                         jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_STRETCH1);
  410.                 else if(frame == 7)
  411.                         jjSample(play.xPos, play.yPos, SOUND::DEVILDEVAN_STRECH2);
  412.                 else if(tick == 14 && animTimer.elapsedTime()%7 == 0)
  413.                         jjSample(p.xPos,p.yPos,SOUND::DEVILDEVAN_LAUGH);
  414.         }
  415.        
  416.         void handleGunMagic() {
  417.                 uint tick = animTimer.elapsedTime()/10;
  418.                 anim = DevanAnim::BLASTER_DISSAPEAR;
  419.                
  420.                 if(tick < numFrames(DevanAnim::BLASTER_DISSAPEAR)) {
  421.                         frame = tick;
  422.                 }  else {
  423.                         gunMagic = false;
  424.                 }
  425.                 if(tick == 4 && animTimer.elapsedTime() % 10 == 0)
  426.                         jjSample(p.xPos,p.yPos,SOUND::COMMON_ITEMTRE);
  427.         }
  428.        
  429.         void handleRaiseGun() {
  430.                 int startFrame = 6;
  431.                 uint tick = animTimer.elapsedTime()/8 + startFrame;
  432.                 anim = DevanAnim::FIRE;
  433.                
  434.                 if(tick < numFrames(DevanAnim::FIRE)) {
  435.                         frame = tick;
  436.                 }  else {
  437.                         raiseGun = false;
  438.                 }
  439.         }
  440.        
  441.         void drawSprite(uint anim, uint frame) {
  442.                 if((play.blink/2) % 4 == 0 || (play.blink/2) % 4 == 1)
  443.                         if(play.direction > 0)
  444.                                 jjDrawSprite(int(play.xPos+10),int(play.yPos-16),ANIM::DEVILDEVAN,anim,frame,play.direction);
  445.                         else
  446.                                 jjDrawSprite(int(play.xPos-10),int(play.yPos-16),ANIM::DEVILDEVAN,anim,frame,play.direction);
  447.         }
  448.        
  449.         void handleInput() {
  450.                 if(special || !allowInput) {
  451.                         play.keyFire = play.keyDown = play.keyJump = play.keyLeft =
  452.                         play.keyRight = play.keyRun = play.keySelect = play.keyUp = false;
  453.                 }
  454.                 if(!devilMode) {
  455.                         if(play.keyDown && onGround()) {
  456.                                 if(ducking == false) animTimer.start();
  457.                                 ducking = true;
  458.                         } else {
  459.                                 ducking = false;
  460.                                 play.keyDown = false;
  461.                         }
  462.                         if(play.keyJump && !play.keyFire && !jumping) {
  463.                                 jumping = true;
  464.                                 falling = false;
  465.                         }
  466.                         if(play.keyDown && onGround() && play.keyJump) {
  467.                                 play.keyJump = false;
  468.                                 play.keyDown = false;
  469.                                 if(special == false) animTimer.start();
  470.                                 special = true;
  471.                                 jumping = false;
  472.                                 shooting = false;
  473.                                 ducking = false;
  474.                         } //else {special = false;} //TODO: Why was this here?
  475.  
  476.                         if(play.keyFire || play.keyDown || play.keyJump || play.keyLeft ||
  477.                            play.keyRight || play.keyRun || play.keySelect || play.keyUp) {
  478.                             stars = false;
  479.                                 growArms = false;
  480.                                 gunMagic = false;
  481.                                 raiseGun = false;
  482.                                 idleTimer.reset();
  483.                         }
  484.                 }
  485.                 if(!play.keyFire && shooting) {
  486.                         animTimer.reset();
  487.                         raiseGun = true;
  488.                 }
  489.                 if(play.keyFire) {
  490.                         play.keyFire = false;
  491.                         if(shooting == false) animTimer.start();
  492.                         shooting = true;
  493.                         return;
  494.                 } else shooting = false;
  495.         }
  496.        
  497.         bool get_isDevil() {
  498.                 return this.devilMode;
  499.         }
  500.        
  501.         jjPLAYER@ get_player() {
  502.                 return this.play;
  503.         }
  504. }
  505.  
  506. class DevanBlasterBullet : CUSTOM::Object {
  507.         DevanBlasterBullet(jjOBJ@ object) {
  508.                 super(object);
  509.                 yPos = yPos -16;
  510.                 xPos = direction*15 + xPos;
  511.                 xSpeed = xSpeed * .9;
  512.                 ySpeed = ySpeed * .9;
  513.                 jjSample(xPos, yPos, SOUND::DEVILDEVAN_PHASER2);
  514.         }
  515.        
  516.         void behavior() {
  517.                 if(state != STATE::EXPLODE) {
  518.                         jjDrawSprite(int(xPos),int(yPos),ANIM::DEVILDEVAN,DevanAnim::BLASTERBULLET,(jjGameTicks/9)%9,direction);
  519.                         behave(BEHAVIOR::BULLET,false);
  520.                 } else
  521.                         behave(BEHAVIOR::BULLET,true);
  522.         }
  523. }
  524. CUSTOM::Object@ devanBlaster(jjOBJ@ object) {return DevanBlasterBullet(object);}
  525.  
  526. class DevanFireBreath : CUSTOM::Object {
  527.         DevanFireBreath(jjOBJ@ object) {
  528.                 super(object);
  529.                 yPos = yPos - 12;
  530.                 xPos = direction*32+ xPos;
  531.                 jjSample(xPos, yPos,SOUND::DEVILDEVAN_DRAGONFIRE);
  532.         }
  533.        
  534.         void behavior() {
  535.                 if(state != STATE::EXPLODE) {
  536.                         jjDrawSprite(int(xPos),int(yPos),ANIM::DEVILDEVAN,DevanAnim::FIREBALL,(jjGameTicks/9)%3,direction);
  537.                         behave(BEHAVIOR::BULLET,false);
  538.                 } else
  539.                         behave(BEHAVIOR::BULLET,true);
  540.         }
  541. }
  542. CUSTOM::Object@ devanFireBreath(jjOBJ@ object) {return DevanFireBreath(object);}
  543.  
  544. void onPlayerInput(jjPLAYER@ play) {
  545.         if(jjGameTicks < 70) {
  546.                 play.keyFire = play.keyDown = play.keyJump = play.keyLeft =
  547.                         play.keyRight = play.keyRun = play.keySelect = play.keyUp = false;
  548.         }
  549.         if(devanPlayer !is null && play is devanPlayer.player) devanPlayer.handleInput();
  550. }
  551.  
  552. class DevanLivesUI : CUSTOM::IInterfaceElement {
  553.         private DevanShell@ devanPlayer;
  554.        
  555.         DevanLivesUI(DevanShell@ shell) {
  556.                 @this.devanPlayer = shell;
  557.         }
  558.        
  559.         void draw(jjPLAYER@ player, jjCANVAS@ canvas) {
  560.                 if(devanPlayer !is null && player is devanPlayer.player) {
  561.                         if(devanPlayer.isDevil) {
  562.                                 canvas.drawSprite(int(24),int(.95 * jjSubscreenHeight), ANIM::DEVILDEVAN,DevanAnim::DEVIL_FLY,jjRenderFrame/7,0,SPRITE::RESIZED, 16);
  563.                                 canvas.drawString(int(32),int(.972 * jjSubscreenHeight),"x666", STRING::MEDIUM, STRING::NORMAL);
  564.                         } else {
  565.                                 canvas.drawSprite(int(16),int(.95 * jjSubscreenHeight), ANIM::DEVAN,1,0,0,SPRITE::RESIZED, 26);
  566.                                 canvas.drawString(int(32),int(.972 * jjSubscreenHeight),"x^", STRING::MEDIUM, STRING::NORMAL);
  567.                         }
  568.                 }
  569.         }
  570. }
  571.  
  572. class DevanBlasterUI : CUSTOM::IInterfaceElement {
  573.         private DevanShell@ devanPlayer;
  574.        
  575.         DevanBlasterUI(DevanShell@ shell) {
  576.                 @this.devanPlayer = shell;
  577.         }
  578.        
  579.         void draw(jjPLAYER@ player, jjCANVAS@ canvas) {
  580.                 if(player.currWeapon == WEAPON::BLASTER) {
  581.                                 canvas.drawSprite(int(.865 * jjSubscreenWidth),  int(.97 * jjSubscreenHeight + jjSin(jjRenderFrame << 5)*2),ANIM::DEVILDEVAN,DevanAnim::BLASTER,7,0);
  582.                                 //canvas.drawSprite(int(.86 * jjSubscreenWidth), int(.97 * jjSubscreenHeight + jjSin(jjRenderFrame << 5)*2),ANIM::DEVILDEVAN,DevanAnim::BLASTER,0-jjRenderFrame/7);
  583.                                 canvas.drawString(int(.875 * jjSubscreenWidth),  int(.972 * jjSubscreenHeight),"x^", STRING::MEDIUM, STRING::NORMAL);
  584.                         }
  585.         }
  586. }
  587.  
  588. class DevanFireBreathUI : CUSTOM::IInterfaceElement {
  589.         private DevanShell@ devanPlayer;
  590.        
  591.         DevanFireBreathUI(DevanShell@ shell) {
  592.                 @this.devanPlayer = shell;
  593.         }
  594.        
  595.         void draw(jjPLAYER@ player, jjCANVAS@ canvas) {
  596.                 if(devanPlayer !is null && player is devanPlayer.player) {
  597.                         if(devanPlayer.isDevil) {
  598.                                 canvas.drawSprite(int(.865 * jjSubscreenWidth),  int(.97 * jjSubscreenHeight + jjSin(jjRenderFrame << 5)*2),ANIM::DEVILDEVAN,DevanAnim::FIREBALL,jjRenderFrame/7,0);
  599.                                 canvas.drawString(int(.875 * jjSubscreenWidth),  int(.972 * jjSubscreenHeight),"x^", STRING::MEDIUM, STRING::NORMAL);
  600.                         }
  601.                 }
  602.         }
  603. }