Downloads containing Wagnus.asc

Downloads
Name Author Game Mode Rating
Mover Weapons Violet CLM Other 6.5 Download file

File preview

  1. #pragma require "Wagnus.asc"
  2. #include "MLLE-Weapons.asc"
  3. #pragma require "Wagnus.j2a"
  4.  
  5. namespace WAGNUS {
  6.         array<int> TargetX(jjLocalPlayerCount), TargetY(jjLocalPlayerCount);
  7.        
  8.         class Weapon : MLLEWeapons::WeaponInterface {
  9.                 bool Forwards = true, Upwards = false, ForwardsPU = true, UpwardsPU = true;
  10.                 uint Range = 160, RangePU = 280;
  11.                 Weapon() {
  12.                         super(
  13.                                 regularObjectTemplate: MLLEWeapons::ObjectTemplate(
  14.                                         xSpeed: 10,
  15.                                         curAnim: jjAnimSets[ANIM::AMMO] + 12
  16.                                 ),
  17.                                 powerupObjectTemplate: MLLEWeapons::ObjectTemplate(
  18.                                         xSpeed: 10,
  19.                                         curAnim: jjAnimSets[ANIM::AMMO] + 12
  20.                                 ),
  21.                                 animSetFilename: "Wagnus.j2a",
  22.                                 pickupAnimation: 0,
  23.                                 poweredUpPickupAnimation: 1,
  24.                                 traits: se::weapon_default_traits | se::weapon_increases_mobility | se::weapon_causes_splash_damage,
  25.                                 onPlayer: se::PlayerCallback(FindTarget),
  26.                                 behavior: MLLEWeapons::behaviorFunction(Fire),
  27.                                 apply: MLLEWeapons::applyFunction(GetParameters)
  28.                         );
  29.                 }
  30.                 bool GetParameters(uint, se::WeaponHook@, jjSTREAM@ parameters) {
  31.                         if (parameters !is null && parameters.getSize() >= 12) {
  32.                                 parameters.pop(Forwards);
  33.                                 parameters.pop(Upwards);
  34.                                 parameters.pop(Range);
  35.                                 parameters.pop(ForwardsPU);
  36.                                 parameters.pop(UpwardsPU);
  37.                                 parameters.pop(RangePU);
  38.                         }
  39.                         return true;
  40.                 }
  41.                 void FindTarget(jjPLAYER@ p, int number) {
  42.                         if (int(p.currWeapon) == number && p.frozen == 0 && !p.noFire) {
  43.                                 const bool powerup = p.powerup[number];
  44.                                
  45.                                 float stepX, stepY;
  46.                                 int angle;
  47.                                 if (jjAllowsMouseAim && jjMouseAim && jjLocalPlayerCount==1) {
  48.                                         angle = int(atan2(
  49.                                                 (jjMouseX + p.cameraX - p.xPos),
  50.                                                 (jjMouseY + p.cameraY - p.yPos)
  51.                                         ) * 512.0 * 0.318309886142228);
  52.                                         stepX = jjSin(angle) * 16;
  53.                                         stepY = jjCos(angle) * 16;
  54.                                         angle -= 256;
  55.                                 } else {
  56.                                         uint rabbitAnim;
  57.                                         if (
  58.                                                 ((powerup ? UpwardsPU : Upwards) || (p.keyUp = false)) && (
  59.                                                         (rabbitAnim = p.curAnim - jjAnimSets[p.setID].firstAnim) == RABBIT::LOOKUP ||
  60.                                                         rabbitAnim == RABBIT::FIREUP ||
  61.                                                         rabbitAnim == RABBIT::HANGFIREUP ||
  62.                                                         rabbitAnim == RABBIT::FIREUPQUIT ||
  63.                                                         ((rabbitAnim == RABBIT::HANGFIREUP || rabbitAnim == RABBIT::HANGIDLE1 || rabbitAnim == RABBIT::HANGIDLE2) && p.keyUp)
  64.                                                 )
  65.                                         ) {
  66.                                                 stepX = 0;
  67.                                                 stepY = -16;
  68.                                                 angle = 256;
  69.                                         } else {
  70.                                                 stepX = (p.direction >= 0) == (powerup ? ForwardsPU : Forwards) ? 16 : -16;
  71.                                                 stepY = 0;
  72.                                                 angle = 256 - int(stepX) * 16;
  73.                                         }
  74.                                 }
  75.                                
  76.                                 float currentX = p.xPos;
  77.                                 float currentY = p.yPos;
  78.                                 int scale = 0;
  79.                                 int distance = powerup ? RangePU : Range;
  80.                                 uint stepSize = 16;
  81.                                 while (distance > 0) {
  82.                                         const auto proposedX = currentX + stepX;
  83.                                         const auto proposedY = currentY + stepY;
  84.                                         bool masked = false;
  85.                                         for (int y = -10; y < 22; y += 4)
  86.                                                 if (jjMaskedHLine(int(proposedX) - 12, 24, int(proposedY) + y)) {
  87.                                                         masked = true;
  88.                                                         break;
  89.                                                 }
  90.                                         if (masked) {
  91.                                                 if ((stepSize >>= 1) == 2) {
  92.                                                         break;
  93.                                                 } else {
  94.                                                         stepX /= 2;
  95.                                                         stepY /= 2;
  96.                                                         continue;
  97.                                                 }
  98.                                         }
  99.                                         distance -= stepSize;
  100.                                         scale += stepSize;
  101.                                         currentX = proposedX;
  102.                                         currentY = proposedY;
  103.                                 }
  104.                                 TargetX[p.localPlayerID] = int(currentX);
  105.                                 TargetY[p.localPlayerID] = int(currentY);
  106.                                
  107.                                 if (scale != 0)
  108.                                         jjDrawRotatedSpriteFromCurFrame(p.xPos, p.yPos, jjAnimations[PickupAnimation + 2], angle, (scale + 12) / 128.f, 1, p.powerup[number] ? SPRITE::TRANSLUCENTPALSHIFT : SPRITE::TRANSLUCENT, 40, -99);
  109.                                 jjObjectPresets[(p.powerup[number] ? se::getPoweredBulletOfWeapon : se::getBasicBulletOfWeapon)(number)].counterEnd = scale / 16;
  110.                         }
  111.                 }
  112.                 void Fire(jjOBJ@ obj, bool powerup) {
  113.                         if (obj.creatorType == CREATOR::PLAYER) {
  114.                                 jjPLAYER@ p = jjPlayers[obj.creatorID];
  115.                                 if (p.isLocal) {
  116.                                         p.xPos = TargetX[p.localPlayerID];
  117.                                         p.yPos = TargetY[p.localPlayerID];
  118.                                         p.offsetPosition(0,0);
  119.                                 }
  120.                                 jjSample(p.xPos, p.yPos, SOUND::AMMO_LASER3, 29);
  121.                                 jjSample(p.xPos, p.yPos, SOUND::COMMON_TELPORT1, 56);
  122.                                 uint angle = uint(atan2(obj.xSpeed, obj.ySpeed) * 512.0 * 0.318309886142228);
  123.                                 const bool backwards = obj.ySpeed == 0 && !(powerup ? ForwardsPU : Forwards);
  124.                                 if (backwards)
  125.                                         angle += 512;
  126.                                 const auto stepX = jjSin(angle) * 16, stepY = jjCos(angle) * 16;
  127.                                 uint count = obj.counterEnd;
  128.                                 if (obj.xSpeed == 0 && !jjAllowsMouseAim)
  129.                                         count = count * 3 / 2;
  130.                                 while (count != 0) {
  131.                                         jjOBJ@ spark = jjObjects[jjAddObject(obj.eventID, obj.xPos + stepX * count, obj.yPos + stepY * count, obj.creatorID, obj.creatorType, Spark)];
  132.                                         spark.xSpeed = backwards ? -obj.xSpeed : obj.xSpeed; //just for knocking down pickups
  133.                                         spark.ySpeed = obj.ySpeed;
  134.                                         --count;
  135.                                 }
  136.                         }
  137.                         obj.delete();
  138.                 }
  139.         }
  140.        
  141.         void Spark(jjOBJ@ obj) {
  142.                 if (obj.state == STATE::START) {
  143.                         obj.state = STATE::DELAYEDSTART;
  144.                         obj.playerHandling = HANDLING::PLAYERBULLET;
  145.                 } else {
  146.                         obj.behave(BEHAVIOR::EXPLOSION, false);
  147.                 }
  148.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, MLLEWeapons::HelpfulBulletFunctions::IsPowerup(obj) ? 8 : 224);
  149.         }
  150. }