Downloads containing SEfirework.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 22 levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: Time's up Rysice Capture the flag 7.3 Download file
JJ2+ Only: Tech Tree Violet CLM Capture the flag 7.8 Download file
TSF with JJ2+ Only: Isla de MuertaFeatured Download Loon Battle 9.5 Download file
TSF with JJ2+ Only: Anniversary Bash 21 Levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: Anniversary Bash 20 Levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: Press GardenFeatured Download SmokeNC Battle 9.2 Download file
TSF with JJ2+ Only: Fishing VillageFeatured Download PurpleJazz Capture the flag 9 Download file
TSF with JJ2+ Only: Orbital BarrageFeatured Download TreyLina Battle 9.1 Download file
JJ2+ Only: RovaniemiFeatured Download Loon Battle 9.1 Download file
TSF with JJ2+ Only: Complete Pipe DreamFeatured Download FireSworD Capture the flag 9.1 Download file
Standard Weapon InterfaceFeatured Download Seren Other 10 Download file

File preview

  1. #pragma require "SEweapon.asc"
  2. #pragma require "SEfirework.j2a"
  3. #pragma offer "SEfirework1.wav"
  4. #pragma offer "SEfirework2.wav"
  5. #include "SEweapon.asc"
  6. namespace se {
  7. shared class FireworkWeapon : WeaponInterface {
  8.         private ::jjANIMSET@ m_animSet;
  9.         private ::array<SOUND::Sample> m_samples = {SOUND::AMMO_GUNVELOCITY, SOUND::COMMON_BASE1};
  10.         protected ::jjANIMSET@ getAnimSet() const {
  11.                 return @m_animSet;
  12.         }
  13.         protected const array<SOUND::Sample>& getSamples() const {
  14.                 return m_samples;
  15.         }
  16.         protected bool loadAnimSet(::jjANIMSET@ animSet, const ::string &in filename, uint setID) {
  17.                 if (animSet !is null && !::jjSTREAM(filename).isEmpty()) {
  18.                         @m_animSet = @animSet.load(setID, filename);
  19.                         return true;
  20.                 }
  21.                 return false;
  22.         }
  23.         protected bool loadSample(SOUND::Sample sample, const ::string &in filename, int index) {
  24.                 if (::jjSampleLoad(sample, filename)) {
  25.                         m_samples[index] = sample;
  26.                         return true;
  27.                 }
  28.                 return false;
  29.         }
  30.         protected void behaveParticle(::jjOBJ@ obj) const {
  31.                 switch (obj.state) {
  32.                         case STATE::START:
  33.                                 obj.state = STATE::FALL;
  34.                                 break;
  35.                         case STATE::FALL:
  36.                                 if (obj.xAcc * obj.xSpeed >= 0.f)
  37.                                         obj.xSpeed = obj.xAcc = 0.f;
  38.                                 else
  39.                                         obj.xPos += obj.xSpeed += obj.xAcc;
  40.                                 if (obj.yAcc * obj.ySpeed >= 0.f)
  41.                                         obj.yAcc = 0.f;
  42.                                 obj.yPos += obj.ySpeed += obj.yAcc + 0.0625f;
  43.                                 if (::jjMaskedPixel(int(obj.xPos), int(obj.yPos)) || obj.counter++ > int(obj.counterEnd)) {
  44.                                         obj.counter = obj.counterEnd;
  45.                                         obj.state = STATE::EXPLODE;
  46.                                 } else if (obj.playerHandling == HANDLING::PARTICLE && obj.counter << 2 > int(obj.counterEnd)) {
  47.                                         obj.playerHandling = HANDLING::PLAYERBULLET;
  48.                                 }
  49.                                 ::jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::ALPHAMAP, obj.var[1]);
  50.                                 break;
  51.                         case STATE::EXPLODE:
  52.                                 obj.counter -= obj.counterEnd >> 3;
  53.                                 if (obj.counter > 0) {
  54.                                         float scale = float(obj.counter) / float(obj.counterEnd);
  55.                                         ::jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, scale, scale, SPRITE::ALPHAMAP, obj.var[1]);
  56.                                 } else {
  57.                                         obj.delete();
  58.                                 }
  59.                                 break;
  60.                         case STATE::KILL:
  61.                         case STATE::DEACTIVATE:
  62.                                 obj.delete();
  63.                                 break;
  64.                 }
  65.         }
  66.         protected void behave(::jjOBJ@ obj) const {
  67.                 switch (obj.state) {
  68.                         case STATE::START:
  69.                                 if (obj.creatorType == CREATOR::PLAYER && ::jjPlayers[obj.creatorID].isLocal)
  70.                                         ::jjSample(obj.xPos, obj.yPos, m_samples[0]);
  71.                                 obj.counterEnd = ::jjObjectPresets[obj.eventID].counterEnd;
  72.                                 obj.yAcc = -0.25f;
  73.                                 obj.xSpeed += obj.var[7] / 2e5f;
  74.                                 obj.state = STATE::ROCKETFLY;
  75.                         case STATE::ROCKETFLY:
  76.                                 if (obj.xAcc * obj.xSpeed >= 0.f)
  77.                                         obj.xSpeed = obj.xAcc = 0.f;
  78.                                 else
  79.                                         obj.xPos += obj.xSpeed += obj.xAcc;
  80.                                 if (obj.ySpeed < -9.f) {
  81.                                         obj.yAcc = 0.f;
  82.                                         obj.ySpeed = -9.f;
  83.                                 }
  84.                                 obj.yPos += obj.ySpeed += obj.yAcc;
  85.                                 if (::jjMaskedPixel(int(obj.xPos), int(obj.yPos)) && ::jjEventAtLastMaskedPixel != AREA::ONEWAY) {
  86.                                         obj.xPos -= obj.xSpeed;
  87.                                         obj.yPos -= obj.ySpeed;
  88.                                         obj.state = STATE::EXTRA;
  89.                                 } else if (obj.counter++ > int(obj.counterEnd)) {
  90.                                         obj.state = STATE::EXTRA;
  91.                                 }
  92.                                 obj.draw();
  93.                                 break;
  94.                         case STATE::EXTRA:
  95.                         case STATE::EXPLODE:
  96.                                 ::jjSample(obj.xPos, obj.yPos, m_samples[1]);
  97.                                 for (int i = 0; i < 6; i++) {
  98.                                         ::jjSample(obj.xPos + ::jjSin((i << 10) / 6) * 320.f, obj.yPos + ::jjCos((i << 10) / 6) * 320.f, m_samples[1]);
  99.                                 }
  100.                                 {
  101.                                         array<int> colors = {34, 81, 24, 50};
  102.                                         int particles = 12 + (obj.var[6] >> 1 & 4);
  103.                                         for (int i = 0; i < particles; i++) {
  104.                                                 int id = ::jjAddObject(obj.eventID, obj.xPos, obj.yPos, obj.creatorID, obj.creatorType, @::jjVOIDFUNCOBJ(behaveParticle));
  105.                                                 if (id > 0) {
  106.                                                         ::jjOBJ@ other = @::jjObjects[id];
  107.                                                         other.animSpeed >>= 1;
  108.                                                         other.counterEnd -= 10;
  109.                                                         other.curAnim = obj.killAnim;
  110.                                                         other.determineCurFrame();
  111.                                                         other.var[1] = colors[obj.var[6] >> 2 & 2 | i & 1];
  112.                                                         other.xSpeed = ::jjSin((i << 10) / particles) * 6.f;
  113.                                                         other.ySpeed = ::jjCos((i << 10) / particles) * 6.f;
  114.                                                         other.xAcc = other.xSpeed / -64.f;
  115.                                                         other.yAcc = other.ySpeed / -64.f;
  116.                                                         if (obj.state == STATE::EXPLODE)
  117.                                                                 other.playerHandling = HANDLING::PARTICLE;
  118.                                                 }
  119.                                         }
  120.                                 }
  121.                                 obj.draw();
  122.                         case STATE::KILL:
  123.                         case STATE::DEACTIVATE:
  124.                                 obj.delete();
  125.                                 break;
  126.                 }
  127.         }
  128.         protected void behaveTNT(::jjOBJ@ obj) const {
  129.                 if (obj.creatorType == CREATOR::PLAYER && ::jjPlayers[obj.creatorID].powerup[WEAPON::TNT]) {
  130.                         obj.animSpeed = 4;
  131.                         obj.curFrame = ::jjAnimations[obj.curAnim = obj.special = m_animSet + 4];
  132.                         obj.var[6] = 0;
  133.                 } else {
  134.                         obj.animSpeed = 2;
  135.                         obj.curFrame = ::jjAnimations[obj.curAnim = obj.special = m_animSet + 5];
  136.                         obj.var[6] = 8;
  137.                 }
  138.                 obj.behavior = @::jjVOIDFUNCOBJ(behave);
  139.                 obj.behave();
  140.         }
  141.         protected void prepareWeaponProfile(::jjWEAPON@ weapon) const {
  142.                 weapon.defaultSample = false;
  143.                 weapon.gradualAim = false;
  144.                 weapon.multiplier = 1;
  145.                 weapon.replacedByBubbles = false;
  146.                 weapon.spread = SPREAD::NORMAL;
  147.                 weapon.style = WEAPON::MISSILE;
  148.         }
  149.         protected void prepareBulletPresets(::jjOBJ@ basic, ::jjOBJ@ powerup, uint number) const {
  150.                 if (basic is powerup)
  151.                         basic.behavior = @::jjVOIDFUNCOBJ(behaveTNT);
  152.                 else
  153.                         basic.behavior = powerup.behavior = @::jjVOIDFUNCOBJ(behave);
  154.                 basic.animSpeed = 2;
  155.                 powerup.animSpeed = 4;
  156.                 basic.counterEnd = powerup.counterEnd = 70;
  157.                 basic.curFrame = ::jjAnimations[basic.curAnim = basic.special = m_animSet + 4];
  158.                 powerup.curFrame = ::jjAnimations[powerup.curAnim = powerup.special = m_animSet + 5];
  159.                 basic.direction = powerup.direction = 0;
  160.                 basic.energy = powerup.energy = basic.freeze = powerup.freeze = 0;
  161.                 basic.frameID = powerup.frameID = 0;
  162.                 basic.killAnim = powerup.killAnim = m_animSet + 6;
  163.                 basic.lightType = powerup.lightType = LIGHT::POINT;
  164.                 basic.playerHandling = powerup.playerHandling = HANDLING::PLAYERBULLET;
  165.                 basic.var[3] = powerup.var[3] = number;
  166.                 basic.var[6] = 0;
  167.                 powerup.var[6] = 8;
  168.                 basic.xAcc = powerup.xAcc = -0.125f;
  169.                 basic.yAcc = powerup.yAcc = 0.f;
  170.                 basic.xSpeed = powerup.xSpeed = 3.f;
  171.                 basic.ySpeed = powerup.ySpeed = 0.f;
  172.         }
  173.         protected void preparePickupPresets(::jjOBJ@ ammo3, ::jjOBJ@ ammo15, ::jjOBJ@ powerup) const {
  174.                 if (ammo3 !is null) {
  175.                         ammo3.behavior = @AmmoPickup(::jjAnimations[m_animSet], ::jjAnimations[m_animSet + 1]);
  176.                         ammo3.curAnim = m_animSet;
  177.                         ammo3.frameID = 0;
  178.                         ammo3.determineCurFrame();
  179.                 }
  180.                 if (ammo15 !is null) {
  181.                         ammo15.curAnim = m_animSet + 2;
  182.                         ammo15.frameID = 0;
  183.                         ammo15.determineCurFrame();
  184.                 }
  185.                 if (powerup !is null) {
  186.                         powerup.curAnim = m_animSet + 3;
  187.                         powerup.frameID = 0;
  188.                         powerup.determineCurFrame();
  189.                 }
  190.         }
  191.         ::jjANIMSET@ loadAnims(::jjANIMSET@ animSet) override {
  192.                 loadAnimSet(animSet, "SEfirework.j2a", 0);
  193.                 return @animSet;
  194.         }
  195.         ::array<bool>@ loadSamples(const ::array<SOUND::Sample>& samples) override {
  196.                 if (samples.length() != 2)
  197.                         return @::array<bool>(2, false);
  198.                 ::array<bool> result = {loadSample(samples[0], "SEfirework1.wav", 0), loadSample(samples[1], "SEfirework2.wav", 1)};
  199.                 return @result;
  200.         }
  201.         uint getSampleCount() const override {
  202.                 return 2;
  203.         }
  204.         uint getTraits(bool) const override {
  205.                 return weapon_default_traits;
  206.         }
  207.         uint getMaxDamage(bool powerup) const override {
  208.                 return powerup ? 2 : 1;
  209.         }
  210.         bool setAsWeapon(uint number, WeaponHook@ weaponHook = null) override {
  211.                 if (m_animSet !is null && isValidWeapon(number)) {
  212.                         uint basic = getBasicBulletOfWeapon(number);
  213.                         uint powered = getPoweredBulletOfWeapon(number);
  214.                         uint ammo3 = getAmmoPickupOfWeapon(number);
  215.                         uint ammo15 = getAmmoCrateOfWeapon(number);
  216.                         uint powerup = getPowerupMonitorOfWeapon(number);
  217.                         if (weaponHook !is null) {
  218.                                 weaponHook.resetCallbacks(number);
  219.                                 weaponHook.setWeaponSprite(number, false, ::jjAnimations[m_animSet]);
  220.                                 weaponHook.setWeaponSprite(number, true, ::jjAnimations[m_animSet + 1]);
  221.                         }
  222.                         prepareWeaponProfile(@::jjWeapons[number]);
  223.                         prepareBulletPresets(@::jjObjectPresets[basic], @::jjObjectPresets[powered], number);
  224.                         preparePickupPresets(ammo3 != 0 ? @::jjObjectPresets[ammo3] : null, ammo15 != 0 ? @::jjObjectPresets[ammo15] : null, @::jjObjectPresets[powerup]);
  225.                         return true;
  226.                 }
  227.                 return false;
  228.         }
  229. }
  230. FireworkWeapon firework;
  231. }
  232.