Downloads containing SEroller.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Time's upFeatured Download Rysice Capture the flag 10 Download file
TSF with JJ2+ Only: Relic ValleyFeatured Download FireSworD Battle 8.9 Download file
TSF with JJ2+ Only: Anniversary Bash 21 Levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: Carrot FarmFeatured Download Loon Capture the flag 9.3 Download file
TSF with JJ2+ Only: Painted GardenFeatured Download PurpleJazz Capture the flag 8.2 Download file
TSF with JJ2+ Only: Battle of Waterloo 1835Featured Download Seren Capture the flag 8.5 Download file
TSF with JJ2+ Only: Anniversary Bash 20 Levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: Fishing VillageFeatured Download PurpleJazz Capture the flag 9 Download file
Standard Weapon Interface Seren Other N/A Download file

File preview

  1. #pragma require "SEweapon.asc"
  2. #pragma require "SEroller.j2a"
  3. #pragma offer "SEroller.wav"
  4. #include "SEweapon.asc"
  5. namespace se {
  6. shared class RollerWeapon : WeaponInterface {
  7.         private ::jjANIMSET@ m_animSet;
  8.         private SOUND::Sample m_sample = SOUND::COMMON_FLAP;
  9.         protected ::jjANIMSET@ getAnimSet() const {
  10.                 return @m_animSet;
  11.         }
  12.         protected SOUND::Sample getSample() const {
  13.                 return m_sample;
  14.         }
  15.         protected bool loadAnimSet(::jjANIMSET@ animSet, const ::string &in filename, uint setID) {
  16.                 if (animSet !is null && !::jjSTREAM(filename).isEmpty()) {
  17.                         @m_animSet = @animSet.load(setID, filename);
  18.                         return true;
  19.                 }
  20.                 return false;
  21.         }
  22.         protected bool loadSample(SOUND::Sample sample, const ::string &in filename) {
  23.                 if (::jjSampleLoad(sample, filename)) {
  24.                         m_sample = sample;
  25.                         return true;
  26.                 }
  27.                 return false;
  28.         }
  29.         protected bool move(::jjOBJ@ obj, int mask, float verticalTolerance, float maxSpeed) const {
  30.                 ::jjANIMFRAME@ maskFrame = @::jjAnimFrames[::jjAnimations[m_animSet + mask]];
  31.                 float xRadius = maskFrame.width / 2.f, yRadius = maskFrame.height / 2.f;
  32.                 float xCenter = obj.xPos + maskFrame.hotSpotX + xRadius, yCenter = obj.yPos + maskFrame.hotSpotY + yRadius;
  33.                 float xAvg = 0.f, yAvg = 0.f;
  34.                 bool noRoom = true;
  35.                 bool overWater = obj.yPos < ::jjWaterLevel;
  36.                 bool canSkipOverWater = overWater && obj.ySpeed > 1.5f && ::abs(obj.xSpeed) > obj.ySpeed;
  37.                 bool skippingOverWater = false;
  38.                 for (int i = 0; i < 1024; i += 16) {
  39.                         float cosine = ::jjCos(i);
  40.                         float sine = ::jjSin(i);
  41.                         float x = xCenter + cosine * xRadius;
  42.                         float y = yCenter + sine * yRadius;
  43.                         if (::jjMaskedPixel(int(x + 0.5f), int(y + 0.5f))) {
  44.                                 xAvg += cosine;
  45.                                 yAvg += sine;
  46.                         } else if (canSkipOverWater && y >= ::jjWaterLevel) {
  47.                                 skippingOverWater = true;
  48.                                 xAvg += cosine;
  49.                                 yAvg += sine;
  50.                         } else {
  51.                                 noRoom = false;
  52.                         }
  53.                 }
  54.                 float avg = sqrt(xAvg * xAvg + yAvg * yAvg);
  55.                 float xSpeed = obj.xSpeed, ySpeed = obj.ySpeed + obj.yAcc;
  56.                 if (avg != 0.f) {
  57.                         xAvg /= avg;
  58.                         yAvg /= avg;
  59.                         if (::abs(xAvg) <= verticalTolerance) {
  60.                                 xSpeed += yAvg * obj.xAcc;
  61.                                 ySpeed -= xAvg * obj.xAcc;
  62.                         }
  63.                         float projection = xSpeed * xAvg + ySpeed * yAvg;
  64.                         if (projection > 0.f) {
  65.                                 if (skippingOverWater)
  66.                                         projection *= 1.8f;
  67.                                 xSpeed -= projection * xAvg;
  68.                                 ySpeed -= projection * yAvg;
  69.                         }
  70.                 }
  71.                 float speed = sqrt(xSpeed * xSpeed + ySpeed * ySpeed);
  72.                 if (speed > maxSpeed) {
  73.                         float factor = maxSpeed / speed;
  74.                         xSpeed *= factor;
  75.                         ySpeed *= factor;
  76.                 }
  77.                 obj.xSpeed = xSpeed;
  78.                 obj.ySpeed = ySpeed;
  79.                 obj.xPos += xSpeed;
  80.                 obj.yPos += ySpeed;
  81.                 if (skippingOverWater || overWater && obj.yPos >= ::jjWaterLevel) {
  82.                         int id = ::jjAddObject(OBJECT::EXPLOSION, obj.xPos, ::jjWaterLevel, obj.objectID);
  83.                         if (id != 0) {
  84.                                 ::jjOBJ@ splash = @::jjObjects[id];
  85.                                 splash.determineCurAnim(ANIM::COMMON, 3);
  86.                                 ::jjSample(obj.xPos, ::jjWaterLevel, SOUND::COMMON_WATER, 32);
  87.                         }
  88.                 }
  89.                 return noRoom;
  90.         }
  91.         protected void behaveCommon(::jjOBJ@ obj, int mask, float verticalTolerance, float maxSpeed) const {
  92.                 switch (obj.state) {
  93.                         case STATE::START:
  94.                                 if (obj.creatorType == CREATOR::PLAYER && ::jjPlayers[obj.creatorID].isLocal)
  95.                                         ::jjSample(obj.xPos, obj.yPos, m_sample);
  96.                                 if (obj.xSpeed == 0.f) {
  97.                                         if (obj.var[7] != 0)
  98.                                                 obj.direction = obj.var[7] < 0 ? -1 : 1;
  99.                                         else if (::jjGameConnection != GAME::LOCAL)
  100.                                                 obj.direction = 1;
  101.                                         else if (obj.creatorType == CREATOR::PLAYER)
  102.                                                 obj.direction = ::jjPlayers[obj.creatorID].direction;
  103.                                         else if (obj.creatorType == CREATOR::OBJECT)
  104.                                                 obj.direction = ::jjObjects[obj.creatorID].direction;
  105.                                 }
  106.                                 obj.xAcc = ::jjObjectPresets[obj.eventID].xAcc;
  107.                                 if (obj.direction < 0)
  108.                                         obj.xAcc = -obj.xAcc;
  109.                                 obj.yAcc = ::jjObjectPresets[obj.eventID].yAcc;
  110.                                 obj.xSpeed += obj.var[7] / 1e5f;
  111.                                 obj.state = STATE::ROTATE;
  112.                         case STATE::ROTATE:
  113.                                 if (move(obj, mask, verticalTolerance, maxSpeed) || obj.counter++ > int(obj.counterEnd))
  114.                                         obj.state = STATE::EXPLODE;
  115.                                 if (::jjGameTicks % 3 == 0) {
  116.                                         obj.frameID++;
  117.                                         if (obj.frameID >= int(::jjAnimations[obj.curAnim].frameCount))
  118.                                                 obj.frameID = 0;
  119.                                 }
  120.                                 obj.determineCurFrame();
  121.                                 obj.draw();
  122.                                 break;
  123.                         case STATE::EXPLODE:
  124.                                 obj.curAnim = obj.killAnim;
  125.                                 if (obj.curAnim == 0) {
  126.                                         obj.delete();
  127.                                 } else {
  128.                                         if (obj.playerHandling != HANDLING::EXPLOSION) {
  129.                                                 obj.frameID = obj.freeze = 0;
  130.                                                 obj.isTarget = obj.triggersTNT = false;
  131.                                                 obj.playerHandling = HANDLING::EXPLOSION;
  132.                                         }
  133.                                         if (::jjGameTicks & 3 == 0)
  134.                                                 obj.frameID++;
  135.                                         if (obj.frameID < int(::jjAnimations[obj.curAnim].frameCount)) {
  136.                                                 obj.determineCurFrame();
  137.                                                 obj.draw();
  138.                                         } else {
  139.                                                 obj.delete();
  140.                                         }
  141.                                 }
  142.                                 break;
  143.                         case STATE::KILL:
  144.                         case STATE::DEACTIVATE:
  145.                                 obj.delete();
  146.                                 break;
  147.                 }
  148.         }
  149.         protected void behaveBasic(::jjOBJ@ obj) const {
  150.                 behaveCommon(obj, 8, 0.9f, obj.yPos < ::jjWaterLevel ? 14.f : 8.f);
  151.         }
  152.         protected void behavePowered(::jjOBJ@ obj) const {
  153.                 if (obj.yPos >= ::jjWaterLevel) {
  154.                         obj.behavior = @::jjVOIDFUNCOBJ(behaveBasic);
  155.                         obj.counterEnd = 90;
  156.                         obj.curFrame = ::jjAnimations[obj.curAnim = obj.special = m_animSet + 4];
  157.                         obj.killAnim = m_animSet + 6;
  158.                         obj.var[6] = 0;
  159.                         obj.behave();
  160.                         ::jjANIMFRAME@ maskFrame = @::jjAnimFrames[::jjAnimations[m_animSet + 9]];
  161.                         float xRadius = maskFrame.width / 2.f, yRadius = maskFrame.height / 2.f;
  162.                         for (int i = 0; i < 1024; i += 64) {
  163.                                 ::jjAddObject(OBJECT::BUBBLE, obj.xPos + ::jjSin(i) * xRadius, obj.yPos + ::jjCos(i) * yRadius, obj.objectID);
  164.                         }
  165.                 } else {
  166.                         behaveCommon(obj, 9, 2.f, 14.f);
  167.                 }
  168.         }
  169.         protected void behaveTNT(::jjOBJ@ obj) const {
  170.                 if (obj.creatorType == CREATOR::PLAYER && ::jjPlayers[obj.creatorID].powerup[WEAPON::TNT]) {
  171.                         obj.behavior = @::jjVOIDFUNCOBJ(behavePowered);
  172.                         obj.counterEnd = 120;
  173.                         obj.curFrame = ::jjAnimations[obj.curAnim = obj.special = m_animSet + 5];
  174.                         obj.killAnim = m_animSet + 7;
  175.                         obj.var[6] = 26;
  176.                 } else {
  177.                         obj.behavior = @::jjVOIDFUNCOBJ(behaveBasic);
  178.                         obj.counterEnd = 90;
  179.                         obj.curFrame = ::jjAnimations[obj.curAnim = obj.special = m_animSet + 4];
  180.                         obj.killAnim = m_animSet + 6;
  181.                         obj.var[6] = 0;
  182.                 }
  183.                 obj.behave();
  184.         }
  185.         protected void prepareWeaponProfile(::jjWEAPON@ weapon) const {
  186.                 weapon.defaultSample = false;
  187.                 weapon.gradualAim = false;
  188.                 weapon.multiplier = 1;
  189.                 weapon.replacedByBubbles = false;
  190.                 weapon.spread = SPREAD::NORMAL;
  191.                 weapon.style = WEAPON::NORMAL;
  192.         }
  193.         protected void prepareBulletPresets(::jjOBJ@ basic, ::jjOBJ@ powerup, uint number) const {
  194.                 if (basic is powerup) {
  195.                         basic.behavior = @::jjVOIDFUNCOBJ(behaveTNT);
  196.                 } else {
  197.                         basic.behavior = @::jjVOIDFUNCOBJ(behaveBasic);
  198.                         powerup.behavior = @::jjVOIDFUNCOBJ(behavePowered);
  199.                 }
  200.                 basic.animSpeed = powerup.animSpeed = 2;
  201.                 basic.counterEnd = 90;
  202.                 powerup.counterEnd = 120;
  203.                 basic.curFrame = ::jjAnimations[basic.curAnim = basic.special = m_animSet + 4];
  204.                 powerup.curFrame = ::jjAnimations[powerup.curAnim = powerup.special = m_animSet + 5];
  205.                 basic.direction = powerup.direction = 1;
  206.                 basic.energy = powerup.energy = basic.freeze = powerup.freeze = 0;
  207.                 basic.frameID = powerup.frameID = 0;
  208.                 basic.killAnim = m_animSet + 6;
  209.                 powerup.killAnim = m_animSet + 7;
  210.                 basic.lightType = powerup.lightType = LIGHT::POINT;
  211.                 basic.playerHandling = powerup.playerHandling = HANDLING::PLAYERBULLET;
  212.                 basic.var[3] = powerup.var[3] = number;
  213.                 basic.var[6] = 0;
  214.                 powerup.var[6] = 26;
  215.                 basic.xAcc = powerup.xAcc = 0.5f;
  216.                 basic.yAcc = powerup.yAcc = 0.25f;
  217.                 basic.xSpeed = powerup.xSpeed = 5.f;
  218.                 basic.ySpeed = powerup.ySpeed = 0.f;
  219.         }
  220.         protected void preparePickupPresets(::jjOBJ@ ammo3, ::jjOBJ@ ammo15, ::jjOBJ@ powerup) const {
  221.                 if (ammo3 !is null) {
  222.                         ammo3.behavior = @AmmoPickup(::jjAnimations[m_animSet], ::jjAnimations[m_animSet + 1]);
  223.                         ammo3.curAnim = m_animSet;
  224.                         ammo3.frameID = 0;
  225.                         ammo3.determineCurFrame();
  226.                 }
  227.                 if (ammo15 !is null) {
  228.                         ammo15.curAnim = m_animSet + 2;
  229.                         ammo15.frameID = 0;
  230.                         ammo15.determineCurFrame();
  231.                 }
  232.                 if (powerup !is null) {
  233.                         powerup.curAnim = m_animSet + 3;
  234.                         powerup.frameID = 0;
  235.                         powerup.determineCurFrame();
  236.                 }
  237.         }
  238.         ::jjANIMSET@ loadAnims(::jjANIMSET@ animSet) override {
  239.                 loadAnimSet(animSet, "SEroller.j2a", 0);
  240.                 return @animSet;
  241.         }
  242.         ::array<bool>@ loadSamples(const ::array<SOUND::Sample>& samples) override {
  243.                 return @::array<bool>(1, samples.length() == 1 && loadSample(samples[0], "SEroller.wav"));
  244.         }
  245.         uint getSampleCount() const override {
  246.                 return 1;
  247.         }
  248.         uint getTraits(bool powerup) const override {
  249.                 uint result = weapon_default_traits;
  250.                 if (powerup)
  251.                         result |= weapon_melts_ice;
  252.                 return result;
  253.         }
  254.         uint getMaxDamage(bool powerup) const override {
  255.                 return powerup ? 2 : 1;
  256.         }
  257.         bool setAsWeapon(uint number, WeaponHook@ weaponHook = null) override {
  258.                 if (m_animSet !is null && isValidWeapon(number)) {
  259.                         uint basic = getBasicBulletOfWeapon(number);
  260.                         uint powered = getPoweredBulletOfWeapon(number);
  261.                         uint ammo3 = getAmmoPickupOfWeapon(number);
  262.                         uint ammo15 = getAmmoCrateOfWeapon(number);
  263.                         uint powerup = getPowerupMonitorOfWeapon(number);
  264.                         if (weaponHook !is null) {
  265.                                 weaponHook.resetCallbacks(number);
  266.                                 weaponHook.setWeaponSprite(number, false, ::jjAnimations[m_animSet]);
  267.                                 weaponHook.setWeaponSprite(number, true, ::jjAnimations[m_animSet + 1]);
  268.                         }
  269.                         prepareWeaponProfile(@::jjWeapons[number]);
  270.                         prepareBulletPresets(@::jjObjectPresets[basic], @::jjObjectPresets[powered], number);
  271.                         preparePickupPresets(ammo3 != 0 ? @::jjObjectPresets[ammo3] : null, ammo15 != 0 ? @::jjObjectPresets[ammo15] : null, @::jjObjectPresets[powerup]);
  272.                         return true;
  273.                 }
  274.                 return false;
  275.         }
  276. }
  277. RollerWeapon roller;
  278. }
  279.