Downloads containing tpw.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 17 Levels Jazz2Online Multiple N/A Download file
JJ2+ Only: The Petrified WoodsFeatured Download Superjazz Battle 8.5 Download file

File preview

  1. class pairUintBool {
  2.         uint u;
  3.         bool b;
  4.         pairUintBool() { }
  5.         pairUintBool(uint U, bool B) {
  6.                 u = U;
  7.                 b = B;
  8.         }
  9. }
  10. array<pairUintBool> lastWeapon(jjLocalPlayerCount);
  11. bool isPlayerActive(const jjPLAYER@ play) {
  12.         return play.isActive && play.xPos > 0.f && play.yPos > 0.f;
  13. }
  14. int getTheOnlyNonLocalPlayerID() {
  15.         int result = -1;
  16.         for (int i = 0; i < 32; i++) {
  17.                 const jjPLAYER@ play = jjPlayers[i];
  18.                 if (isPlayerActive(play) && !play.isLocal) {
  19.                         if (result == -1)
  20.                                 result = i;
  21.                         else
  22.                                 return -2;
  23.                 }
  24.         }
  25.         return result;
  26. }
  27. void fixBirdCageOwnershipIssues(jjOBJ@ obj) {
  28.         if (obj.state == STATE::KILL)
  29.                 obj.state = STATE::ACTION;
  30.         if (obj.state == STATE::ACTION && obj.var[0] < 0) {
  31.                 int playerID = getTheOnlyNonLocalPlayerID();
  32.                 if (playerID >= 0)
  33.                         jjAddObject(OBJECT::BLASTERBULLET, obj.xPos, obj.yPos, playerID, CREATOR::PLAYER);
  34.                 obj.state = STATE::SLEEP;
  35.                 obj.counterEnd = 1;
  36.         } else if (obj.counterEnd > 0) {
  37.                 if (++obj.counterEnd > 100) {
  38.                         obj.state = STATE::DONE;
  39.                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  40.                 }
  41.         }
  42. }
  43. void processBrokenCage(jjOBJ@ obj) {
  44.         obj.creator = 0;
  45.         for (int i = 0; i < jjObjectCount; i++) {
  46.                 const jjOBJ@ obj2 = jjObjects[i];
  47.                 if (obj2.isActive && obj2.eventID == OBJECT::BIRDCAGE && obj2 !is obj && abs(obj2.xPos - obj.xPos) < 1.f && abs(obj2.yPos - obj.yPos) < 1.f)
  48.                         obj.state = STATE::KILL;
  49.         }
  50. }
  51. void birdCage(jjOBJ@ obj) {
  52.         fixBirdCageOwnershipIssues(obj);
  53.         if (obj.state == STATE::DONE)
  54.                 processBrokenCage(obj);
  55.         obj.behave(BEHAVIOR::BIRDCAGE);
  56. }
  57. void bird(jjOBJ@ obj) {
  58.         obj.behave(BEHAVIOR::BIRD);
  59.         if (obj.state == STATE::FLY && (jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME)) {
  60.                 const jjPLAYER@ owner = jjPlayers[obj.var[0] - 0x8000];
  61.                 obj.yPos = obj.yPos * 0.96875f + owner.yPos * 0.03125f - 1.71875f - obj.ySpeed;
  62.                 if (obj.counter > 140) {
  63.                         for (int i = 0; i < 32; i++) {
  64.                                 const jjPLAYER@ play = jjPlayers[i];
  65.                                 if (isPlayerActive(play) && i != obj.var[0] - 0x8000) {
  66.                                         float x = play.xPos - obj.xPos;
  67.                                         float y = play.yPos - obj.yPos;
  68.                                         if (y > -64.f && y < 128.f && x * obj.direction > 0 && abs(x) < 480.f) {
  69.                                                 for (int j = 0; j < 2; j++) {
  70.                                                         int currWeapon = owner.isLocal ? lastWeapon[owner.localPlayerID].u : owner.currWeapon;
  71.                                                         if (currWeapon == WEAPON::TNT)
  72.                                                                 currWeapon = WEAPON::BLASTER;
  73.                                                         int type = currWeapon;
  74.                                                         if (currWeapon > WEAPON::TNT)
  75.                                                                 type--;
  76.                                                         if (owner.isLocal ? lastWeapon[owner.localPlayerID].b : owner.powerup[currWeapon])
  77.                                                                 type += OBJECT::BLASTERBULLETPU - OBJECT::BLASTERBULLET;
  78.                                                         int id = jjAddObject(type, obj.xPos + obj.direction * 22.f, obj.yPos - 6.f, obj.var[0] - 0x8000, CREATOR::PLAYER);
  79.                                                         if (id > 0) {
  80.                                                                 jjOBJ@ obj2 = jjObjects[id];
  81.                                                                 obj2.ySpeed = j * 1.5f;
  82.                                                                 obj2.direction = obj.direction;
  83.                                                                 obj2.xSpeed = obj2.xSpeed * obj2.direction;
  84.                                                                 obj2.xAcc = obj2.xAcc * obj2.direction;
  85.                                                         }
  86.                                                 }
  87.                                                 obj.counter = 105;
  88.                                         }
  89.                                 }
  90.                         }
  91.                 }
  92.         }
  93. }
  94. void updateLastWeapons() {
  95.         for (int i = 0; i < jjObjectCount; i++) {
  96.                 const jjOBJ@ obj = jjObjects[i];
  97.                 if (obj.isActive && (obj.eventID <= OBJECT::BULLET || obj.eventID == OBJECT::TNT) && obj.counter == 1 && obj.state != STATE::EXPLODE && obj.creatorType == CREATOR::PLAYER) {
  98.                         const jjPLAYER@ play = jjPlayers[obj.creatorID];
  99.                         if (play.isActive && play.isLocal)
  100.                                 lastWeapon[play.localPlayerID] = pairUintBool(obj.var[3] == 0 ? 9 : obj.var[3], obj.var[6] & 8 != 0);
  101.                 }
  102.         }
  103. }
  104. void removeDoubleBirds() {
  105.         array<bool> playerHasBird(32, false);
  106.         for (int i = 0; i < jjObjectCount; i++) {
  107.                 jjOBJ@ obj = jjObjects[i];
  108.                 if (obj.isActive && obj.eventID == OBJECT::BIRD && obj.state != STATE::HIDE && obj.state != STATE::HIT && obj.state != STATE::KILL) {
  109.                         if (obj.var[0] < 0x8000 || obj.var[0] >= 0x8000 + 32 || playerHasBird[obj.var[0] - 0x8000])
  110.                                 obj.delete();
  111.                         else
  112.                                 playerHasBird[obj.var[0] - 0x8000] = true;
  113.                 }
  114.         }
  115. }
  116. void onLevelLoad() {
  117.         jjObjectPresets[OBJECT::BIRDCAGE].behavior = birdCage;
  118.         jjObjectPresets[OBJECT::BIRD].behavior = bird;
  119. }
  120. void onMain() {
  121.         updateLastWeapons();
  122.         if (jjGameTicks & 63 == 0)
  123.                 removeDoubleBirds();
  124. }
  125.