Downloads containing weaponVMega4.asc

Downloads
Name Author Game Mode Rating
JJ2+ Only: violetclm DOM Episodes I... Violet CLM Custom / Concept N/A Download file
Custom Weapons...Featured Download Violet CLM Other 10 Download file

File preview

  1. #pragma require "weaponVMega4.asc"
  2. #include "MLLE-Weapons.asc"
  3. #pragma require "weaponVMega.j2a"
  4.  
  5. namespace WeaponVMega {
  6.         namespace Pathfinder {
  7.                 class Weapon : MLLEWeapons::WeaponInterface {
  8.                         uint node1 = 1, node2 = 4, node3 = 2, node4 = 6;
  9.                         Weapon() {
  10.                                 super(
  11.                                         regularObjectTemplate: MLLEWeapons::ObjectTemplate(
  12.                                                 xSpeed: 2,
  13.                                                 xAcc: 0.125,
  14.                                                 killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 80,
  15.                                                 counterEnd: 46,
  16.                                                 lightType: LIGHT::POINT2,
  17.                                                 isBlastable: false,
  18.                                                 playerHandling: HANDLING::PARTICLE
  19.                                         ),
  20.                                         powerupObjectTemplate: MLLEWeapons::ObjectTemplate(
  21.                                                 xSpeed: 1.5,
  22.                                                 xAcc: 0.1875,
  23.                                                 killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 80,
  24.                                                 counterEnd: 32,
  25.                                                 lightType: LIGHT::POINT2,
  26.                                                 curAnim: 1,
  27.                                                 isBlastable: false,
  28.                                                 playerHandling: HANDLING::PARTICLE
  29.                                         ),
  30.                                         animSetFilename: "weaponVMega.j2a",
  31.                                         animSetID: 3,
  32.                                         pickupAnimation: 4,
  33.                                         poweredUpPickupAnimation: 5,
  34.                                         style: WEAPON::MISSILE,
  35.                                         replacedByBubbles: true,
  36.                                         traits: se::weapon_default_traits | se::weapon_melts_ice | se::weapon_fails_underwater,
  37.                                         behavior: MLLEWeapons::behaviorFunction(DetermineBehavior),
  38.                                         apply: MLLEWeapons::applyFunction(DetermineNodeCount)
  39.                                 );
  40.                         }
  41.                         void DetermineBehavior(jjOBJ@ obj, bool powerup) const {
  42.                                 obj.behavior = Behavior(
  43.                                         obj,
  44.                                         !powerup ?
  45.                                                 array<uint>={node1,node2} :
  46.                                                 array<uint>={node3,node4}
  47.                                 );
  48.                         }
  49.                         bool DetermineNodeCount(uint, se::WeaponHook@, jjSTREAM@ parameter) {
  50.                                 if (parameter !is null && parameter.getSize() >= 16) {
  51.                                         int p;
  52.                                         parameter.pop(p); node1 = p;
  53.                                         parameter.pop(p); node2 = p;
  54.                                         parameter.pop(p); node3 = p;
  55.                                         parameter.pop(p); node4 = p;
  56.                                 }
  57.                                 return true;
  58.                         }
  59.                 }
  60.        
  61.                 class Behavior : jjBEHAVIORINTERFACE {
  62.                         jjOBJ@ obj;
  63.                         array<jjOBJ@> nodes;
  64.                         bool waiting = false;
  65.                         bool foundAtLeastOneTarget = false;
  66.                         uint counter = 0;
  67.                         bool powerup;
  68.                         array<uint> nodeLimits;
  69.                         Behavior(jjOBJ@ objectOfAttachment, array<uint> nl) {
  70.                                 @obj = @objectOfAttachment;
  71.                                 obj.state = STATE::FLY;
  72.                                 powerup = MLLEWeapons::HelpfulBulletFunctions::IsPowerup(obj);
  73.                                 jjSample(obj.xPos, obj.yPos, powerup ? SOUND::AMMO_LASER3 : SOUND::AMMO_LASER2);
  74.                                 nodeLimits = nl;
  75.                         }
  76.                         void destroy() {
  77.                                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_ELECTRIC2);
  78.                                 for (uint i = 0; i < nodes.length; ++i)
  79.                                         nodes[i].delete();
  80.                                 obj.delete();
  81.                         }
  82.                         void onBehave(jjOBJ@) {
  83.                                 if (obj.state == STATE::EXPLODE) {
  84.                                         destroy();
  85.                                         return;
  86.                                 }
  87.                                 obj.frameID = (obj.objectID + jjGameTicks / 3) % 3;
  88.                                 if (++counter >= obj.counterEnd) {
  89.                                         if (waiting = !waiting) { //stop moving
  90.                                                 addNode();
  91.                                                 counter = obj.counterEnd / 2;
  92.                                         } else { //start moving
  93.                                                 if (nodes.length > (nodeLimits[foundAtLeastOneTarget ? 1 : 0]) || obj.state == STATE::DONE) {
  94.                                                         destroy();
  95.                                                         return;
  96.                                                 }
  97.                                                 const array<float>@ target = MLLEWeapons::HelpfulBulletFunctions::GetNearestEnemyPosition(obj, 200);
  98.                                                 if (target !is null) {
  99.                                                         obj.var[7] = 0;
  100.                                                         const float standardSpeed = (powerup ? 3.f : 2.5f);
  101.                                                         const float dx = target[0] - obj.xPos, dy = target[1] - obj.yPos;
  102.                                                         foundAtLeastOneTarget = true;
  103.                                                         if (abs(dx) > abs(dy)) {
  104.                                                                 obj.xSpeed = (dx > 0) ? standardSpeed : -standardSpeed;
  105.                                                                 obj.ySpeed = 0;
  106.                                                         } else {
  107.                                                                 obj.xSpeed = 0;
  108.                                                                 obj.ySpeed = (dy > 0) ? standardSpeed : -standardSpeed;
  109.                                                         }
  110.                                                 }
  111.                                                 counter = 0;
  112.                                         }
  113.                                 }
  114.                                 if (!waiting) {
  115.                                         obj.xPos += obj.xSpeed + obj.var[7] / 65536.f;
  116.                                         obj.yPos += obj.ySpeed;
  117.                                         if (obj.var[7] > 0x100000)
  118.                                                 obj.var[7] = obj.var[7] - 0x80000;
  119.                                         else if (obj.var[7] < -0x100000)
  120.                                                 obj.var[7] = obj.var[7] + 0x80000;
  121.                                         if (MLLEWeapons::HelpfulBulletFunctions::MaskedPixel(obj) && jjEventAtLastMaskedPixel != AREA::ONEWAY && jjEventAtLastMaskedPixel != AREA::HOOK && jjEventAtLastMaskedPixel != AREA::VINE) {
  122.                                                 counter = obj.counterEnd / 2;
  123.                                                 waiting = true;
  124.                                                 addNode();
  125.                                                 obj.state = STATE::DONE;
  126.                                         }
  127.                                 }
  128.                         }
  129.                         void addNode() {
  130.                                 jjOBJ@ node = jjObjects[jjAddObject(OBJECT::BEES, obj.xPos, obj.yPos, obj.creatorID, obj.creatorType, BEHAVIOR::BEES)];
  131.                                 node.playerHandling = HANDLING::PLAYERBULLET;
  132.                                 node.var[6] = 2 | (powerup ? 8 : 0) | 16; //fireball
  133.                                 node.animSpeed = powerup ? 2 : 1;
  134.                                 node.curFrame = jjAnimations[obj.curAnim + 2];
  135.                                 node.state = STATE::FLY;
  136.                                 node.lightType = LIGHT::BRIGHT;
  137.                                 node.light = powerup ? 10 : 8;
  138.                                 node.isTarget = false;
  139.                                 nodes.insertLast(node);
  140.                                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_ELECTRIC1);
  141.                         }
  142.                         void onDraw(jjOBJ@) {
  143.                                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame + obj.frameID);
  144.                                 for (uint i = 0; i < nodes.length; ++i) {
  145.                                         const jjOBJ@ node = nodes[i];
  146.                                         const jjOBJ@ node2 = (i < nodes.length - 1) ? nodes[i + 1] : obj;
  147.                                         if (node.xPos == node2.xPos || node.yPos == node2.yPos) //non-diagonal
  148.                                                 jjDrawRectangle(node.xPos, node.yPos, int(node2.xPos - node.xPos) + 1, int(node2.yPos - node.yPos) + 1, 15);
  149.                                         jjDrawSpriteFromCurFrame(node.xPos, node.yPos, node.curFrame + obj.frameID);
  150.                                 }
  151.                         }
  152.                 }
  153.         }
  154. }