Downloads containing saldr-common.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 NPC : CUSTOM::Object {
  2.         NPC(OBJECT::Object object, float xPos, float yPos) {
  3.                 super(object,xPos,yPos);
  4.                 playerHandling = HANDLING::PARTICLE;
  5.         }
  6.          
  7.         void behavior() {
  8.                 draw();
  9.         }
  10. }
  11.  
  12. class DemonNPC : NPC {
  13.         DemonNPC(float xPos, float yPos) {
  14.                 super(OBJECT::DEMON,xPos,yPos);
  15.                 stand();
  16.         }
  17.        
  18.         void charge() {playAnimation(ANIM::DEMON,2,0,8);}
  19.         void stand() {playAnimation(ANIM::DEMON,0,0,15);}
  20. }
  21.  
  22. class BilsyNPC : NPC {
  23.         BilsyNPC(float xPos, float yPos) {
  24.                 super(OBJECT::BILSY,xPos,yPos);
  25.                 stand();
  26.         }
  27.        
  28.         void stand() {playAnimation(ANIM::BILSBOSS,4,0,8);}
  29.         void teleportInAnim() {playAnimation(ANIM::BILSBOSS,1,0,20,7,false);}
  30.         void teleportOutAnim() {playAnimation(ANIM::BILSBOSS,2,0,17,7,false);}
  31.         void fireballAnim() {playAnimation(ANIM::BILSBOSS,3,0,3);}
  32.         void throwFireball() {playAnimation(ANIM::BILSBOSS,0,0,18,7,false);}
  33. }
  34.  
  35. class BollyNPC : NPC {
  36.         BollyNPC(float xPos, float yPos) {
  37.                 super(OBJECT::BOLLY,xPos,yPos);
  38.         }
  39.        
  40.         void missileAnim() {playAnimation(ANIM::SONCSHIP,0,0,8);}
  41.         void baseAnim() {playAnimation(ANIM::SONCSHIP,2,0,8);}
  42.         void eyeAnim() {playAnimation(ANIM::SONCSHIP,3,0,6);}
  43. }
  44.  
  45. class RavenNPC : NPC {
  46.         RavenNPC(float xPos, float yPos) {
  47.                 super(OBJECT::RAVEN,xPos,yPos);
  48.                 fly();
  49.         }
  50.        
  51.         void fly() {playAnimation(ANIM::RAVEN,1,0,6);}
  52.         void pose() {playAnimation(ANIM::RAVEN,0,0,2);}
  53. }
  54.  
  55. class RavenDOA : RavenNPC {
  56.         RavenDOA(float xPos, float yPos) { super(xPos,yPos); }
  57.         void behavior() {RavenNPC::behavior();if(!isMoving()) delete();}
  58. }
  59.  
  60. class DevilDevanNPC : NPC {
  61.         DevilDevanNPC(float xPos, float yPos) {
  62.                 super(OBJECT::DEVILDEVAN,xPos,yPos);
  63.                 fly();
  64.         }
  65.        
  66.         void fly() {playAnimation(ANIM::DEVILDEVAN,5,0,11);}
  67.         void fireBreath() {playAnimation(ANIM::DEVILDEVAN,0,0,11,7,false);}
  68.         void startFireBreath() {playAnimation(ANIM::DEVILDEVAN,0,0,9,7,false);}
  69.         void fireBreathPause() {playAnimation(ANIM::DEVILDEVAN,0,8,1,7,true);}
  70.         void revertUntilFall() {playAnimation(ANIM::DEVILDEVAN,7,0,11,7,false);}
  71.         void aboutToFall()     {playAnimation(ANIM::DEVILDEVAN,7,11,1,7,true);}
  72.         void startFall() {playAnimation(ANIM::DEVILDEVAN,7,11,2,7,false);}
  73.         void fall() {playAnimation(ANIM::DEVILDEVAN,2,0,2);};
  74.         void stand() {playAnimation(ANIM::DEVILDEVAN,8,0,4);}
  75.         void run() {playAnimation(ANIM::DEVILDEVAN,18,0,13);}
  76. }
  77.  
  78. class BirdNPC : NPC {
  79.         BirdNPC(float xPos, float yPos) {
  80.                 super(OBJECT::FISH,xPos,yPos);
  81.                 fly();
  82.         }
  83.        
  84.         void fly3D() {playAnimation(ANIM::BIRD3D,0,0,9);}
  85.         void fly() {playAnimation(ANIM::BIRD,9,0,8);}
  86. }
  87.  
  88. int nextPlayerID = 31;
  89.  
  90. interface IRabbit : CUSTOM::ICustomObject {
  91.         void set_name(string name);
  92.         string get_name();
  93.         void set_nameLen(float nameLen);
  94.         float get_nameLen();
  95.        
  96.         void initRabbit();
  97.        
  98.         void becomeSpaz();
  99.         void becomeJazz();
  100.         void becomeLori();
  101.         void becomeChar(CHAR::Char char);
  102.         void redTeam();
  103.        
  104.         void rabbitBehavior();
  105.        
  106.         void becomeViolet();
  107.         void becomeRagnarok();
  108.         void becomeCooba();
  109.         void becomeBlacky();
  110.         void becomeDizZy();
  111.         void becomeSkull();
  112.         void becomeURJazz();
  113.         void becomeMdnchmr();
  114.         void becomeJJTublear();
  115.         void becomeSxypnksal();
  116.         void becomeFireSword();
  117.         void becomeFireball();
  118.         void becomePurpleKeet();
  119.         void becomeBlur();
  120.         void becomeEnigma();
  121.         void becomeBoarder();
  122.         void becomeTheServer();
  123.         void becomeSciz();
  124.         void becomeSuperjazz();
  125.         void becomeLark();
  126.         void becomeNimrod();
  127.         void becomeDalspots();
  128.         void becomeDerby();
  129.         void becomePlayer1();
  130.         void becomeSpotty();
  131.         void becomeBlackNinja();
  132.         void becomeSasik();
  133.         void becomeBirdie();
  134.         void becomeKJAZZ();
  135.         void becomeBean();
  136.         void becomeKrsplat();
  137.         void becomeOdin();
  138.         void becomeCelL();
  139.         void becomeQuickz();
  140.         void becomeTalec();
  141.         void becomeEvilMonkey();
  142.         void becomeSal();
  143.         void becomeTrafton();
  144.         void becomeVegito();
  145.         void becomeVelkasha();
  146.         void becomeSpazzyman();
  147.         void becomePyro();
  148.         void becomeSnooze();
  149.         void becomeEvilMike();
  150.         void becomeFireRabbit();
  151.         void becomeKrzysie();
  152.         void becomeSirEmentaler();
  153.         void becomeKyro();
  154.         void becomeRadium();
  155.         void becomeZepect();
  156.         void becomeTrey();
  157.         void become555();
  158.         void becomeSkOne();
  159.         void becomeNoob();
  160.         void becomeLotrfan();
  161.         void becomeDog();
  162.         void becomeJazzJackrabbit();
  163.         void becomeSpazJackrabbit();
  164.         void becomeLoriJackrabbit();
  165.         void becomeBossrule();
  166.         void becomeMetalDragon();
  167.         void becomeWicehy();
  168.        
  169.         void blueTeam();
  170.         void drawName();
  171.         void idleAnim();
  172.         void poseAnim();
  173.         void runAnim();
  174.         void hangVineAnim();
  175.         void ledgeAnim();
  176.         void copterAnim();
  177.         void copterShootAnim();
  178.         void jumpShootAnim();
  179.         void hurtAnim();
  180.         void deathAnim();
  181.         void deadAnim();
  182.         void crouchShootAnim();
  183.         void crouchAnim();
  184.         void jumpAnim();
  185. }
  186.  
  187. mixin class Rabbit : IRabbit {
  188.         private string nam;
  189.         private float namLen;
  190.         private int playerNum;
  191.         private CHAR::Char char = CHAR::SPAZ;
  192.        
  193.         void initRabbit() {
  194.                 setStandFrame();
  195.         }
  196.        
  197.         //TODO: This is really bad and might break if plus changes how anims are loaded
  198.         void setStandFrame() {
  199.                 if(jjIsTSF)this.curFrame = 1410; //Hax for proper hit boxes
  200.                 else this.curFrame = 1579;
  201.         }
  202.        
  203.         void setCrouchFrame() {
  204.                 if(jjIsTSF)this.curFrame = 1278;
  205.                 else this.curFrame = 1427;
  206.         }
  207.        
  208.         bool isCrouchFrame() {
  209.                 if(jjIsTSF) return this.curFrame == 1278;
  210.                 else return this.curFrame == 1427;
  211.         }
  212.        
  213.         void fur(int a, int b, int c, int d) {
  214.                 spriteMode = SPRITE::PLAYER;
  215.                 this.playerNum = nextPlayerID;
  216.                 jjPlayers[this.playerNum].furSet(a,b,c,d);
  217.                 spriteParam = nextPlayerID--;
  218.         }
  219.        
  220.         void set_name(string name) {this.nam = "0" + name;}
  221.         string get_name() { return this.nam; }
  222.         void set_nameLen(float nameLen) {this.namLen = nameLen;}
  223.         float get_nameLen() {return namLen;}
  224.        
  225.         void becomeViolet()             {this.name="Violet CLM";                this.nameLen=2.7*32;            fur(88,24,72,32);}
  226.         void becomeRagnarok()           {this.name="Ragnar0k Cx";               this.nameLen=3*32;                      fur(64,64,24,88);}
  227.         void becomeCooba()                      {this.name="cooba||||[si]";             this.nameLen=2.5*32;            fur(0,64,88,176);}
  228.         void becomeBlacky()             {this.name="Blacky||||[si]";    this.nameLen=2.5*32;            fur(1,24,24,1);}
  229.         void becomeDizZy()                      {this.name="DizZy DM";                  this.nameLen=2*32;                      fur(24,24,72,24);}
  230.         void becomeSkull()                      {this.name="SkulL FoR";                 this.nameLen=3*32;                      fur(24,24,64,24);}
  231.         void becomeURJazz()             {this.name="|UR|Ja|zz|CC";              this.nameLen=3*32;                      fur(29,29,29,29);}
  232.         void becomeMdnchmr()            {this.name="mdnchmr";                   this.nameLen=2*32;                      fur(51,22,51,47);}
  233.         void becomeJJTublear()          {this.name="|JJ Tblr";               this.nameLen=3.5*32;            fur(37,37,37,37);}
  234.         void becomeSxypnksal()          {this.name="|||||SxYpNkSaL";    this.nameLen=3*32;                      fur(44,44,44,44);}
  235.         void becomeFireSword()          {this.name="FireSword DM";              this.nameLen=3.5*32;            fur(40,40,64,72);}
  236.         void becomeFireball()           {this.name="Fireball FoR";              this.nameLen=3*32;                      fur(24,24,40,24);}
  237.         void becomePurpleKeet()         {this.name="Purple Keet";               this.nameLen=3.5*32;            fur(88,24,24,88);}
  238.         void becomeBlur()                       {this.name="blur||||[si]";              this.nameLen=2*32;                      fur(40,32,32,32);}
  239.         void becomeEnigma()             {this.name="Enigma TF";                 this.nameLen=2.5*32;            fur(16,32,32,16);}
  240.         void becomeBoarder()            {this.name="Boarder FoR";               this.nameLen=3.2*32;            fur(64,64,64,64);}
  241.         void becomeTheServer()          {this.name="The Server";                this.nameLen=3.5*32;            fur(64,64,64,64);}
  242.         void becomeSciz()                       {this.name="Sciz CT";                   this.nameLen=2*32;                      fur(40,40,32,40);}
  243.         void becomeSuperjazz()          {this.name="Superjazz";                 this.nameLen=3*32;                      fur(80,80,40,64);}
  244.         void becomeLark()                       {this.name="Lark||||[si]";              this.nameLen=2*32;                      fur(64,64,32,24);}
  245.         void becomeNimrod()             {this.name="||[GpW]|Nimrod";    this.nameLen=3*32;                      fur(32,64,88,64);}
  246.         void becomeDalspots()           {this.name="dalspots";                  this.nameLen=2.5*32;            fur(32,40,32,32);}
  247.         void becomeDerby()                      {this.name="Derby";                             this.nameLen=1.5*32;            fur(40,32,24,16);}
  248.         void becomePlayer1()            {this.name="Player 1";                  this.nameLen=2*32;                      fur(40,32,24,16);}
  249.         void becomeSpotty()             {this.name="pttDM";                  this.nameLen=2.5*32;            fur(80,32,72,72);}
  250.         void becomeBlackNinja()         {this.name="|lk ij";              this.nameLen=3*32;                      fur(16,40,88,1);}
  251.         void becomeSasik()                      {this.name="Sasik[VS]";                 this.nameLen=2.5*32;            fur(32,32,1,32);}
  252.         void becomeBirdie()             {this.name="Birdie8D";                  this.nameLen=2.5*32;            fur(0,80,80,0);}
  253.         void becomeKJAZZ()                      {this.name="KJAZZ";                             this.nameLen=2*32;                      fur(32,40,32,24);}
  254.         void becomeBean()                       {this.name="|||Bean";                   this.nameLen=1.5*32;            fur(24,72,24,32);}
  255.         void becomeKrsplat()            {this.name="|0<9/1_\\Spalt";    this.nameLen=3.5*32;            fur(67,3,35,55);}
  256.         void becomeOdin()                       {this.name="||||||||Odin";              this.nameLen=1.2*32;            fur(72,72,80,72);}
  257.         void becomeCelL()                       {this.name="CelL FoR";                  this.nameLen=2.5*32;            fur(1,1,64,1);}
  258.         void becomeQuickz()             {this.name="QuickzCC";                  this.nameLen=2.5*32;            fur(40,24,64,16);}
  259.         void becomeTalec()                      {this.name="Talec LP";                  this.nameLen=2.5*32;            fur(32,32,32,32);}
  260.         void becomeEvilMonkey()         {this.name="||Evil||Monkey";    this.nameLen=3*32;                      fur(24,24,0,72);}
  261.         void becomeSal()                        {this.name="slmnDR DM";             this.nameLen=4.2*32;            fur(32,40,16,69);}
  262.         void becomeTrafton()            {this.name="Trafton AT";                this.nameLen=2.7*32;            fur(32,40,16,24);}
  263.         void becomeVegito()             {this.name="VegitoCC";                  this.nameLen=2.3*32;            fur(32,40,16,24);}
  264.         void becomeVelkasha()           {this.name="Velkasha DM";               this.nameLen=3*32;                      fur(32,40,16,24);}
  265.         void becomeSpazzyman()          {this.name="spazzyman";                 this.nameLen=3*32;                      fur(40,32,24,16);}
  266.         void becomePyro()                       {this.name="Pyromanus[GpW]";    this.nameLen=4*32;                      fur(40,32,24,16);}
  267.         void becomeSnooze()             {this.name="SnoozeCC";                  this.nameLen=2.5*32;            fur(40,32,24,16);}
  268.         void becomeEvilMike()           {this.name="EvilMike DM";               this.nameLen=3*32;                      fur(32,32,32,72);}
  269.         void becomeFireRabbit()         {this.name="FireRabbit";                this.nameLen=3*32;                      fur(32,40,16,24);}
  270.         void becomeKrzysie()            {this.name="KrzysieCx";                 this.nameLen=3*32;                      fur(32,40,16,24);}
  271.         void becomeSirEmentaler()       {this.name="-t3||||||||'";              this.nameLen=1*32;                      fur(80,72,80,40);}
  272.         void becomeKyro()                       {this.name="KyroCC";                    this.nameLen=2*32;                      fur(80,80,64,80);}
  273.         void becomeRadium()             {this.name="|hs||Hyr";             this.nameLen=3*32;                      fur(40,32,24,16);}
  274.         void becomeZepect()             {this.name="zepect";                    this.nameLen=2*32;                      fur(64,64,32,40);}
  275.         void becomeTrey()                       {this.name="|Tr|||eyLi|na";             this.nameLen=2.5*32;            fur(41,65,17,87);}
  276.         void become555()                        {this.name="|||||555";                  this.nameLen=1*32;                      fur(40,48,81,89);}
  277.         void becomeSkOne()                      {this.name="SK one";                    this.nameLen=2*32;                      fur(80,24,40,40);}
  278.         void becomeNoob()                       {this.name="noob";                              this.nameLen=1.5*32;            fur(40,32,24,16);}
  279.         void becomeLotrfan()            {this.name="LOTRFAN";                   this.nameLen=2*32;                      fur(64,40,32,80);}
  280.         void becomeDog()                        {this.name="dog";                               this.nameLen=1*32;                      fur(40,32,40,64);}
  281.         void becomeJazzJackrabbit()     {this.name="Jazz Jackrabbit";   this.nameLen=3.5*32;            fur(40,32,40,64);}
  282.         void becomeSpazJackrabbit() {this.name="Spaz Jackrabbit";       this.nameLen=3.5*32;            fur(40,32,40,64);}
  283.         void becomeLoriJackrabbit() {this.name="Lori Jackrabbit";       this.nameLen=3.5*32;            fur(40,32,40,64);}
  284.         void becomeBossrule()           {this.name="BOSSRULE";                  this.nameLen=3*32;                      fur(40,32,24,16);}
  285.        
  286.         void becomeMetalDragon() {
  287.                 this.name="metaldragon cc";
  288.                 this.nameLen=4*32;
  289.                 fur(40,32,24,16);
  290.                 spriteMode = SPRITE::TINTED;
  291.                 spriteParam = 17;
  292.         }
  293.        
  294.         void becomeWicehy() {
  295.                 this.name="wiCeHY[JeW]";
  296.                 this.nameLen=3*32;
  297.                 fur(40,32,24,16);
  298.                 spriteMode = SPRITE::TINTED;
  299.                 spriteParam = 91;
  300.         }
  301.        
  302.         void becomeSpaz() { this.char = CHAR::SPAZ;}
  303.         void becomeJazz() { this.char = CHAR::JAZZ;}
  304.         void becomeLori() { this.char = CHAR::LORI;}
  305.         void becomeChar(CHAR::Char char) { this.char = char; }
  306.        
  307.         void redTeam() {
  308.                 int a,b,_;
  309.                 jjPlayers[this.playerNum].furGet(a,_,b,_);
  310.                 jjPlayers[this.playerNum].furSet(a,24,b,24);
  311.         }
  312.        
  313.         void blueTeam() {
  314.                 int a,b,_;
  315.                 jjPlayers[this.playerNum].furGet(a,_,b,_);
  316.                 jjPlayers[this.playerNum].furSet(a,32,b,32);
  317.         }
  318.        
  319.         void drawName() {
  320.                 if(nameLen > 0)
  321.                         jjDrawString(xPos-nameLen/2.0,yPos-28,nam,STRING::SMALL,STRING::NORMAL,0,1);
  322.         }
  323.        
  324.         void rabbitBehavior() {drawName();}
  325.        
  326.         void idleAnim() {if(char==CHAR::JAZZ)                   playAnimation(ANIM::JAZZ,61,0,1);
  327.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,61,0,4,11);
  328.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,61,0,8);}
  329.         bool isIdleAnim()                                                               { return animation == 61; }
  330.         void poseAnim() {if(char==CHAR::JAZZ)                   playAnimation(ANIM::JAZZ,12,0,1);
  331.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,12,0,1);
  332.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,12,0,1);}
  333.         bool isPoseAnim()                                                               { return animation == 12 && startFram == 0;} //TODO: other 12
  334.         void runAnim() {if(char==CHAR::JAZZ)                    playAnimation(ANIM::JAZZ,56,0,3);
  335.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,56,0,3);
  336.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,56,0,3);}
  337.         bool isRunAnim()                                                                { return animation == 56; }
  338.         void hangVineAnim() {if(char==CHAR::JAZZ)               playAnimation(ANIM::JAZZ,22,0,5,10);
  339.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,22,0,7,10);
  340.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,22,0,28,10);}
  341.         bool isHangVineAnim()                                                   { return animation == 22; }
  342.         void vineShootAnim() {if(char==CHAR::JAZZ)              playAnimation(ANIM::JAZZ,24,0,2,7,false);
  343.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,24,0,2,7,false);
  344.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,24,0,2,7,false);}
  345.         bool isVineShootAnim()                                                  { return animation == 24; }
  346.         void ledgeAnim() {if(char==CHAR::JAZZ)                  playAnimation(ANIM::JAZZ,40,0,18,10,false);
  347.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,40,0,22,6);
  348.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,40,0,22,12);}
  349.         bool isLedgeAnim()                                                              { return animation == 40; }
  350.         void copterAnim() {if(char==CHAR::JAZZ)                 playAnimation(ANIM::JAZZ,25,0,8);
  351.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,25,0,8);
  352.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,25,0,28);}
  353.         bool isCopterAnim()                                                             { return animation == 25; }
  354.         void copterShootAnim() {if(char==CHAR::JAZZ)    playAnimation(ANIM::JAZZ,27,0,2,7,false);
  355.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,27,0,2,7,false);
  356.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,27,0,2,7,false);}
  357.         bool isCopterShootAnim()                                                { return animation == 27; }
  358.         void jumpShootAnim() {if(char==CHAR::JAZZ)              playAnimation(ANIM::JAZZ,36,0,2,15,false);
  359.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,36,0,2,15,false);
  360.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,36,0,2,15,false);}
  361.         bool isJumpShootAnim()                                                  { return animation == 36; }
  362.         void hurtAnim() {if(char==CHAR::JAZZ)                   playAnimation(ANIM::JAZZ,29,0,9,7,false);
  363.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,29,0,11,7,false);
  364.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,29,0,11,7,false);}
  365.         bool isHurtAnim()                                                               { return animation == 29; }
  366.         void deathAnim() {if(char==CHAR::JAZZ)                  playAnimation(ANIM::JAZZ,4,0,20,7,false);
  367.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,4,0,20,7,false);
  368.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,4,0,24,7,false);}
  369.         bool isDeathAnim()                                                              { return animation == 4; }
  370.         void deadAnim() {if(char==CHAR::JAZZ)                   playAnimation(ANIM::JAZZ,3,0,1);
  371.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,3,0,5);
  372.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,3,0,1);}
  373.         bool isDeadAnim()                                                               { return animation == 3; }
  374.         void crouchShootAnim() {if(char==CHAR::JAZZ)    playAnimation(ANIM::JAZZ,7,0,2,15,false);
  375.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,7,0,2,15,false);
  376.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,7,0,2,15,false);}
  377.         bool isCrouchShootAnim()                                                { return animation == 7; }
  378.         void crouchAnim() {if(char==CHAR::JAZZ)                 playAnimation(ANIM::JAZZ,5,1,1);
  379.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,5,1,1);
  380.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,5,1,1);}
  381.         bool isCrouchAnim()                                                             { return animation == 5 && startFram==1; }
  382.         void startCrouchingAnim() {if(char==CHAR::JAZZ) playAnimation(ANIM::JAZZ,5,0,2,7,false);
  383.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,5,0,2,7,false);
  384.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,5,0,2,7,false);}
  385.         bool isStartCrouchingAnim()                                             { return animation == 5 && startFram==0; }
  386.         void startStandingAnim() {if(char==CHAR::JAZZ)  playAnimation(ANIM::JAZZ,8,0,2,3,false);
  387.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,8,1,2,3,false);
  388.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,8,0,2,3,false);}
  389.         bool isStartStandingAnim()                                              { return animation == 8; }                               
  390.         void jumpAnim() {if(char==CHAR::JAZZ)                   playAnimation(ANIM::JAZZ,39,0,3);
  391.                                          else if(char==CHAR::SPAZ)      playAnimation(ANIM::SPAZ,39,0,3);
  392.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,39,0,3);}
  393.         bool isJumpAnim()                                                               { return animation == 39; }                              
  394.         void fallAnim() {if(char==CHAR::JAZZ)                   playAnimation(ANIM::JAZZ,11,0,3);
  395.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,11,0,3);
  396.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,11,0,3);}
  397.         bool isFallAnim()                                                               { return animation == 11; }                              
  398.         void hitGroundAnim() {if(char==CHAR::JAZZ)              playAnimation(ANIM::JAZZ,13,0,5,2,false);
  399.                                          else if(char==CHAR::SPAZ)              playAnimation(ANIM::SPAZ,13,0,5,2,false);
  400.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,13,0,7,2,false);}
  401.         bool isHitGroundAnim()                                                  { return animation == 13; }                              
  402.         void standShootAnim(){if(char==CHAR::JAZZ)              playAnimation(ANIM::JAZZ,14,0,2,15,false);
  403.                                          else if(char==CHAR::SPAZ)      playAnimation(ANIM::SPAZ,14,0,2,15,false);
  404.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,14,0,2,15,false);}
  405.         bool isStandShootAnim()                                                 { return animation == 14; }                              
  406.         void jumpPutAwayGunAnim(){if(char==CHAR::JAZZ)  playAnimation(ANIM::JAZZ,35,0,2,7,false);
  407.                                          else if(char==CHAR::SPAZ)      playAnimation(ANIM::SPAZ,35,0,2,7,false);
  408.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,35,0,2,7,false);}
  409.         bool isJumpPutAwayGunAnim()                                             { return animation == 35; }
  410.         void standPutAwayGunAnim(){if(char==CHAR::JAZZ) playAnimation(ANIM::JAZZ,47,0,4,5,false);
  411.                                          else if(char==CHAR::SPAZ)      playAnimation(ANIM::SPAZ,47,0,4,5,false);
  412.                                          else if(char==CHAR::LORI)      playAnimation(ANIM::LORI,47,0,4,5,false);}
  413.         bool isStandPutAwayGunAnim()                                    { return animation == 47; }
  414.         /*                               
  415.         {if(char==CHAR::JAZZ)           playAnimation(ANIM::JAZZ,);
  416.                                          else if(char==CHAR::SPAZ)  playAnimation(ANIM::SPAZ,);
  417.                                          else if(char==CHAR::LORI)  playAnimation(ANIM::LORI,);}
  418.         */
  419.                                          
  420. }
  421.  
  422. class RabbitNPC : NPC, Rabbit {
  423.         RabbitNPC(CHAR::Char char,float xPos, float yPos) {
  424.                 super(NIL,xPos,yPos);
  425.                 this.char = char;
  426.                 idleAnim();
  427.         }
  428.        
  429.         void behavior() {
  430.                 rabbitBehavior();
  431.                 NPC::behavior();
  432.         }
  433. }
  434.  
  435. class RabbitDOA : RabbitNPC {
  436.         RabbitDOA(CHAR::Char char,float xPos, float yPos) { super(char,xPos,yPos); }
  437.         void behavior() {RabbitNPC::behavior();if(!isMoving()) delete();}
  438. }
  439.  
  440. class DyingRabbit : NPC, Rabbit {
  441.         DyingRabbit(CHAR::Char char,float xPos,float yPos) {
  442.                 super(NIL,xPos,yPos);
  443.                 this.char = char;
  444.                 deathAnim();
  445.         }
  446.        
  447.         void behavior() {
  448.                 if(!isPlayingAnimation())
  449.                         deadAnim();
  450.                 rabbitBehavior();
  451.                 NPC::behavior();
  452.         }
  453. }
  454.  
  455. interface IRabbitEnemy : IRabbit {
  456.         void initRabbitEnemy();
  457.  
  458.         void jump();
  459.         void crouch();
  460.         void stand();
  461.         void shoot(int weapon,bool powerup);
  462.         void shoot();
  463.        
  464.         void set_deleteOnDeath(bool delete);
  465.         bool get_deleteOnDeath() const;
  466.         void set_touchingHurts(bool hurts);
  467.         bool get_touchingHurts() const;
  468.         int get_fastFire() const;
  469.         void set_fastFire(int fastFire);
  470.         int get_weapon() const;
  471.         void set_weapon(int weapon);
  472.         bool get_powerup() const;
  473.         void set_powerup(bool powerup);
  474.         bool get_isIdle() const;
  475.         void set_isIdle(bool isIdle);
  476.         int  get_hearts() const;
  477.         void set_hearts(int hearts);
  478.         bool get_facePlayer() const;
  479.         void set_facePlayer(bool face);
  480.        
  481.        
  482.         void hurt(int damage,bool showMessage);
  483.        
  484.         void rabbitEnemyBehavior();
  485.         void onRabbitEnemyHit(jjOBJ@ bullet, jjPLAYER@ player, int force);
  486.        
  487.         int distToGround();
  488.         bool onGround(int charHeight=21);
  489.         bool isDrawn();
  490. }
  491.  
  492. mixin class RabbitEnemy : IRabbitEnemy {
  493.         private uint8 blink=0;
  494.         private int heart=5;
  495.         private bool showHearts = true;
  496.        
  497.         private bool jumpAction = false;
  498.         private bool crouchAction = false;
  499.         private bool standAction = false;
  500.         private bool shootAction = false;
  501.         private bool deleteMe = true;
  502.         private bool noTouchy = true;
  503.         private bool facePlay = false;
  504.        
  505.         private int ff = 16;
  506.         private int weaponNumber = 1;
  507.         private bool power = false;
  508.         private bool idle = false;
  509.  
  510.         void initRabbitEnemy() {
  511.                 initRabbit();
  512.                 playerHandling = HANDLING::SPECIAL;
  513.                 scriptedCollisions = true;
  514.         }
  515.        
  516.         void resetActions() {
  517.                 jumpAction = false;
  518.                 crouchAction = false;
  519.                 standAction = false;
  520.                 shootAction = false;
  521.         }
  522.        
  523.         void set_deleteOnDeath(bool delete) {this.deleteMe = delete;}
  524.         bool get_deleteOnDeath() const {return deleteMe;}
  525.         void set_touchingHurts(bool hurts) {this.noTouchy=hurts;}
  526.         bool get_touchingHurts() const {return this.noTouchy;}
  527.         bool get_facePlayer() const {return facePlay;}
  528.         void set_facePlayer(bool face) {this.facePlay = face;}
  529.        
  530.         int get_fastFire() const {return ff;}
  531.         void set_fastFire(int fastFire) {this.ff = fastFire;}
  532.         int get_weapon() const {return weaponNumber;}
  533.         void set_weapon(int weapon) {this.weaponNumber = weapon;}
  534.         bool get_powerup() const {return power;}
  535.         void set_powerup(bool powerup) {this.power = powerup;}
  536.         bool get_isIdle() const {return idle;}
  537.         void set_isIdle(bool isIdle) {this.idle = isIdle;}
  538.         int  get_hearts() const {return heart;}
  539.         void set_hearts(int hearts) { this.heart=hearts;}
  540.  
  541.         void jump() {jumpAction = true;}
  542.         void crouch() {crouchAction=true;}
  543.         void stand() {standAction=true;}
  544.         void shoot(int weapon,bool powerup) {
  545.                 this.weapon=weapon;
  546.                 this.powerup=powerup;
  547.                 shoot();
  548.         }
  549.         void shoot() {
  550.                 this.shootAction = true;
  551.         }
  552.        
  553.         private void fireWeapon() {
  554.                 if(powerup) {
  555.                         switch(weapon) {
  556.                                 case 1:jjAddObject(OBJECT::BLASTERBULLETPU,xPos+direction*15,yPos,objectID);break;
  557.                                 case 2:jjAddObject(OBJECT::BOUNCERBULLETPU,xPos+direction*15,yPos,objectID);break;
  558.                                 case 3:jjAddObject(OBJECT::ICEBULLETPU,xPos+direction*15,yPos,objectID);break;
  559.                                 case 4:jjAddObject(OBJECT::SEEKERBULLETPU,xPos+direction*15,yPos,objectID);break;
  560.                                 case 5:{
  561.                                         jjObjects[jjAddObject(OBJECT::RFBULLETPU,xPos+direction*15,yPos,objectID)].ySpeed=1;
  562.                                         jjObjects[jjAddObject(OBJECT::RFBULLETPU,xPos+direction*15,yPos,objectID)];
  563.                                         jjObjects[jjAddObject(OBJECT::RFBULLETPU,xPos+direction*15,yPos,objectID)].ySpeed=-1;
  564.                                         break;
  565.                                 }
  566.                                 case 6:jjAddObject(OBJECT::TOASTERBULLETPU,xPos+direction*15,yPos,objectID);break;
  567.                                 case 7:jjAddObject(OBJECT::TNT,xPos+direction*15,yPos,objectID);break;
  568.                                 case 8:jjAddObject(OBJECT::FIREBALLBULLETPU,xPos+direction*15,yPos,objectID);break;
  569.                                 case 9:jjAddObject(OBJECT::ELECTROBULLETPU,xPos+direction*15,yPos,objectID);break;
  570.                         }
  571.                 } else {
  572.                         switch(weapon) {
  573.                                 case 1:jjAddObject(OBJECT::BLASTERBULLET,xPos+direction*15,yPos,objectID);break;
  574.                                 case 2:jjAddObject(OBJECT::BOUNCERBULLET,xPos+direction*15,yPos,objectID);break;
  575.                                 case 3:jjAddObject(OBJECT::ICEBULLET,xPos+direction*15,yPos,objectID);break;
  576.                                 case 4:jjAddObject(OBJECT::SEEKERBULLET,xPos+direction*15,yPos,objectID);break;
  577.                                 case 5:{
  578.                                         jjObjects[jjAddObject(OBJECT::RFBULLET,xPos+direction*15,yPos,objectID)].ySpeed=1;
  579.                                         jjObjects[jjAddObject(OBJECT::RFBULLET,xPos+direction*15,yPos,objectID)].ySpeed=-1;
  580.                                         break;
  581.                                 }
  582.                                 case 6:jjAddObject(OBJECT::TOASTERBULLET,xPos+direction*15,yPos,objectID);break;
  583.                                 case 7:jjAddObject(OBJECT::TNT,xPos+direction*15,yPos,objectID);break;
  584.                                 case 8:jjAddObject(OBJECT::FIREBALLBULLET,xPos+direction*15,yPos,objectID);break;
  585.                                 case 9:jjAddObject(OBJECT::ELECTROBULLET,xPos+direction*15,yPos,objectID);break;
  586.                         }
  587.                 }
  588.         }
  589.        
  590.         void onNotIdle() {}
  591.        
  592.         void rabbitEnemyBehavior() {
  593.                 //jjObject Maintenance
  594.                 justHit = 0;
  595.                 if(heart>0) energy=255;
  596.                
  597.                 if(!isIdle) onNotIdle();
  598.                 if(!isActive) return;
  599.                 if(facePlay) direction = p.xPos > xPos ? 1 : -1;
  600.                
  601.                 //Take actions
  602.                 if(!((isHurtAnim()||isDeathAnim()||isDeadAnim())&&isPlayingAnimation())) {
  603.                         if(onGround()) {
  604.                                 if(jumpAction) {ySpeed = -7; setStandFrame();}
  605.                                 else if(crouchAction) {setCrouchFrame();} //Maybe change curFrame?
  606.                         }
  607.                         if(shootAction) {
  608.                                 if(jjGameTicks%fastFire==0) fireWeapon();
  609.                         }
  610.                 }
  611.                
  612.                 if(isDeathAnim()&&!isPlayingAnimation()&&deleteMe) {
  613.                         delete();
  614.                         return;
  615.                 }
  616.                
  617.                 //Determine the animation
  618.                 if(!((isHurtAnim()||isDeathAnim()||isDeadAnim())&&isPlayingAnimation())) { //If already playing the hurt animation, do nothing
  619.                         if(onGround()) {
  620.                                 if(isCrouchFrame()) {
  621.                                         if(shootAction || isCrouchShootAnim()) {
  622.                                                 crouchShootAnim();
  623.                                         } else if(!isCrouchShootAnim() && !isCrouchAnim() && !isStartCrouchingAnim()) {
  624.                                                 startCrouchingAnim();
  625.                                         } else if(isStartCrouchingAnim() && !isPlayingAnimation()) {
  626.                                                 crouchAnim();
  627.                                         }
  628.                                 } else {
  629.                                         if(shootAction || (isStandShootAnim() && isPlayingAnimation())) {
  630.                                                 standShootAnim();
  631.                                         } else if(isStandShootAnim() && !isPlayingAnimation() || (isStandPutAwayGunAnim() && isPlayingAnimation())) {
  632.                                                 standPutAwayGunAnim();
  633.                                         } else if(standAction || isStartStandingAnim()) {
  634.                                                 startStandingAnim();
  635.                                         } else if(ySpeed < 0 || isJumpAnim()) {
  636.                                                 jumpAnim();
  637.                                         } else if(ySpeed > 0 || (isHitGroundAnim() && isPlayingAnimation())) {
  638.                                                 hitGroundAnim();
  639.                                         } else {
  640.                                                 idleAnim();
  641.                                         }
  642.                                 }
  643.                         } else {
  644.                                 if(shootAction || ((isStandShootAnim() || isJumpShootAnim()) && isPlayingAnimation())) {
  645.                                         jumpShootAnim();
  646.                                 } else if((isJumpShootAnim() && !isPlayingAnimation()) || (isJumpPutAwayGunAnim() && isPlayingAnimation())) {
  647.                                         jumpPutAwayGunAnim();
  648.                                 } else if(ySpeed < 0) {
  649.                                         jumpAnim();
  650.                                 } else if(ySpeed >= 0) {
  651.                                         fallAnim();
  652.                                 }
  653.                         }
  654.                 }
  655.                
  656.                 //Gravity
  657.                 int d = distToGround();
  658.                 if(ySpeed > d) ySpeed = d;
  659.                 yPos = yPos + ySpeed;
  660.                 if(ySpeed < 5 && !onGround()) ySpeed = ySpeed + 0.2;
  661.                
  662.                 if(blink > 0) blink--;
  663.                
  664.                 if(showHearts) {
  665.                         int lenHearts = 16*heart;
  666.                         for(int i = 0; i < heart; i++)
  667.                                 jjDrawSprite(xPos+10-lenHearts/2+i*16,yPos-48,ANIM::PICKUPS,41,0,0,SPRITE::NORMAL,0,1);
  668.                 }
  669.                
  670.                 resetActions();
  671.                 rabbitBehavior();
  672.         }
  673.        
  674.         void onRabbitEnemyHit(jjOBJ@ bullet, jjPLAYER@ player, int force) {
  675.                 if(blink == 0) {
  676.                         if(bullet !is null && player !is null) {
  677.                                 hurt(force);
  678.                                 bullet.state = STATE::EXPLODE;
  679.                         } else if(player !is null && heart > 0 && noTouchy) {
  680.                                 player.hurt();
  681.                         }
  682.                 }
  683.         }
  684.        
  685.         void hurt(int damage,bool showMessage=true) {
  686.                 heart = heart - damage < 0 ? 0 : heart - damage;
  687.                 justHit=0;
  688.                 blink = 209;
  689.                 setStandFrame();
  690.                 if(heart>0)hurtAnim();
  691.                 else {
  692.                         deathAnim();
  693.                         if(name != "" && showMessage)
  694.                                 jjAlert("Devan Shell roasted " + stripPipes(name));
  695.                 }
  696.         }
  697.        
  698.         int distToGround() {
  699.                 int len = 32;
  700.                 while(onGround(len--));
  701.                 return len - 17 < 0 ? 0 : len - 17;
  702.         }
  703.        
  704.         bool onGround(int charHeight=21) {
  705.                 return jjMaskedHLine(int(xPos-12),24,int(yPos+charHeight));
  706.         }
  707.        
  708.         bool isDrawn() {
  709.                 return blink/2 % 4 < 2;
  710.         }
  711. }
  712.  
  713. class IdleRabbitEnemy : NPC, RabbitEnemy, Rabbit {
  714.         IdleRabbitEnemy(CHAR::Char char,float xPos, float yPos) {
  715.                 super(OBJECT::FISH,xPos,yPos);
  716.                 this.char = char;
  717.                 initRabbitEnemy();
  718.         }
  719.        
  720.         //Should be called *AFTER* implemented logic
  721.         void behavior() {
  722.                 rabbitEnemyBehavior();
  723.                 NPC::behavior();
  724.         }
  725.        
  726.         void onObjectHit(jjOBJ@ bullet, jjPLAYER@ player, int force) {onRabbitEnemyHit(bullet,player,force);}
  727.         int draw(bool useCustomSpriteProperties) const { if(isDrawn()) return NPC::draw(useCustomSpriteProperties);return -1;}
  728. }
  729.  
  730. class JumpingShootingRabbitEnemy : IdleRabbitEnemy {
  731.         JumpingShootingRabbitEnemy(CHAR::Char char,float xPos, float yPos) {
  732.                 super(char,xPos,yPos);
  733.         }
  734.        
  735.         void onNotIdle() {
  736.                 shoot();
  737.                 if(onGround()) jump();
  738.         }
  739. }
  740.  
  741. class CrouchingShootingRabbitEnemy : IdleRabbitEnemy {
  742.         CrouchingShootingRabbitEnemy(CHAR::Char char,float xPos, float yPos) {
  743.                 super(char,xPos,yPos);
  744.         }
  745.        
  746.         void onNotIdle() {
  747.                 shoot();
  748.                 if(onGround()) crouch();
  749.         }
  750. }
  751.  
  752. class ShootingRabbitEnemy : IdleRabbitEnemy {
  753.         ShootingRabbitEnemy(CHAR::Char char,float xPos, float yPos) {
  754.                 super(char,xPos,yPos);
  755.         }
  756.        
  757.         void onNotIdle() {
  758.                 shoot();
  759.         }
  760. }
  761.  
  762. //Gry
  763. //Foly
  764. //Minmay
  765. //MS
  766. //Robo4900
  767. //Slaz
  768.  
  769. //King
  770. //CJ
  771. //Loon
  772. //DJazz
  773. //PurpleJazz
  774.  
  775. //violet reg: 20 48 18 58 -> 32,72,24,88 -> 88,24,72,32
  776. //ragn0k reg: 58 18 40 40 ("wrong fur")
  777. //cooba: 176 88 64 0
  778. //blacky: reg: 01 18 18 01 (or 24 instead of 18)
  779. //bob and skull:   reg: 18 40 18 18
  780. //fs:    reg 48 40 28 28
  781. //fireball:   reg: 18 28 18 18
  782. //blur:    reg 20 20 20 28
  783. //enigma:       reg 10 20 20 10
  784. //boarder/blacky:  reg: 40 40 40 40, monolith (jazz)
  785. //Sciz jazz reg: 28 20 28 28
  786. //superjazz reg: 40 28 50 50
  787. //lark reg:   18 20 40 40
  788. //nimrod reg: 40 58 40 20
  789. //dalspots reg: 20 20 28 20 (jazz)
  790. //derby player1 reg: 10 18 20 28 (jazz)
  791. //spotty: reg: 48 48 20 25  pttDM
  792. //bn: reg: 01 58 28 10 (jazz) |lk ij
  793. //Sasik[VS] 20 01 20 20
  794. //birdie: 00 50 50 00
  795. //KJAZZ: 18 20 28 20
  796. //|||Bean 20 18 48 18
  797. //Kirby ???
  798. //Krsplat: 37 23 3 43 0<9/1_\Spalt
  799. //||||||||Odin: 48 50 48 48
  800. //CelL FoR: 01 40 01 01
  801. //QuickzCC 10 40 18 28
  802. //Talec LP (blue jazz)
  803. //||Evil||Monkey (black body,red chest, grey gun, red shoes)
  804. //slmnDR DM
  805. //standard spaz: spazzyman, pyromanus(sometimes),
  806. //spaz inverted: trafton, vegito, velk
  807.        
  808.        
  809. //||||| regedit: 20 21 20 21
  810.        
  811. //Mirai.j2t
  812.  
  813. class Fireball : NPC {
  814.         Fireball(float xPos, float yPos) {
  815.                 super(NIL, xPos, yPos);
  816.                 playAnimation(ANIM::DEVILDEVAN,4,0,3);
  817.         }
  818. }
  819.  
  820. class Firebreath : CUSTOM::Object {
  821.         Firebreath(float xPos, float yPos,int angle,int distance=15,int time=140) {
  822.                 super(NIL, xPos, yPos);
  823.                 float angleRadians = (angle/1024.0) * TWO_PI;
  824.                 float xEnd = xPos+distance*32*sin(angleRadians);
  825.                 float yEnd = yPos+distance*32*cos(angleRadians);
  826.                 spriteAngle = angle-128;
  827.                 moveLinear(xEnd,yEnd,time);
  828.                 playAnimation(ANIM::DEVILDEVAN,4,0,3);
  829.         }
  830.        
  831.         void behavior() {
  832.                 CUSTOM::Object::behavior();
  833.                 if(!isMoving()) delete();
  834.         }
  835. }
  836.  
  837. class AnimatingTile : CUSTOM::Object {
  838.         private array<int> tileIds;
  839.         private int animationRate = 7;
  840.  
  841.         AnimatingTile(float xPos, float yPos, array<int> tileIds) {
  842.                 super(NIL, xPos, yPos);
  843.                 this.tileIds = tileIds;
  844.         }
  845.        
  846.         int draw(bool useCustomSpriteProperties=true) const {
  847.                 jjDrawTile(xPos,yPos,tileIds[(jjGameTicks/animationRate)%tileIds.length],TILE::ALLQUADRANTS,spriteLayerZ,spriteLayerXY,spritePlayerID);
  848.                 return -1;
  849.         }
  850. }
  851.  
  852. CHAR::Char getRandomRabbit() {
  853.         int rand = jjRandom() % 3;
  854.         if(rand == 0) return CHAR::JAZZ;
  855.         else if(rand == 1) return CHAR::SPAZ;
  856.         else if(rand == 2) return CHAR::LORI;
  857.         return CHAR::JAZZ;
  858. }