Downloads containing ArcaneWeapon4.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Lori FortressFeatured Download Primpy Single player 8.9 Download file
TSF with JJ2+ Only: Anniversary Bash 23 levels Jazz2Online Multiple N/A Download file
JJ2+ Only: violetclm DOM Episodes I...Featured Download Violet CLM Custom / Concept 9 Download file
Custom Weapons...Featured Download Violet CLM Other 10 Download file

File preview

  1. #pragma require "ArcaneWeapon4.asc"
  2. #include "MLLE-Weapons.asc"
  3. #pragma require "Mortar.j2a"
  4. #pragma offer "f_gren4.wav"
  5.  
  6. namespace ArcaneWeapons {
  7.         namespace MortarLauncher {
  8.                 SOUND::Sample FireSound = SOUND::COMMON_GUNSM1;
  9.                 class Weapon : MLLEWeapons::WeaponInterface {
  10.                         Weapon() {
  11.                                 super(
  12.                                         regularObjectTemplate: MLLEWeapons::ObjectTemplate(
  13.                                                 xSpeed: 7,
  14.                                                 xAcc: -0.025,
  15.                                                 ySpeed: -9,
  16.                                                 yAcc: 0.225,
  17.                                                 animSpeed: 2,
  18.                                                 killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 5,
  19.                                                 lightType: LIGHT::POINT,
  20.                                                 counterEnd: 90,
  21.                                                 state: STATE::FLY
  22.                                         ),
  23.                                         powerupObjectTemplate: MLLEWeapons::ObjectTemplate(
  24.                                                 xSpeed: 7,
  25.                                                 xAcc: -0.025,
  26.                                                 ySpeed: -10,
  27.                                                 yAcc: 0.225,
  28.                                                 animSpeed: 3,
  29.                                                 killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 5,
  30.                                                 curAnim: 2,
  31.                                                 lightType: LIGHT::POINT,
  32.                                                 counterEnd: 105,
  33.                                                 state: STATE::FLY
  34.                                         ),
  35.                                         animSetFilename: "Mortar.j2a",
  36.                                         pickupAnimation: 1,
  37.                                         poweredUpPickupAnimation: 3,
  38.                                         ammoCrateAnimation: 4,
  39.                                         powerupAnimation: 5,
  40.                                         sampleFilenames: array<string> = {"f_gren4.wav"},
  41.                                         style: WEAPON::MISSILE,
  42.                                         apply: MLLEWeapons::applyFunction(RememberSample),
  43.                                         traits: se::weapon_default_traits | se::weapon_causes_splash_damage | se::weapon_increases_mobility | se::weapon_fails_in_interiors,
  44.                                         behavior: function(obj, powerup) {
  45.                                                 if (obj.creatorType == CREATOR::PLAYER && jjPlayers[obj.creatorID].isLocal)
  46.                                                         jjSample(obj.xPos, obj.yPos, FireSound);
  47.                                                 if (obj.eventID == OBJECT::ICEBULLET) obj.eventID = OBJECT::BLASTERBULLET;
  48.                                                 obj.behavior = Behavior;
  49.                                         }
  50.                                 );
  51.                         }
  52.                         bool RememberSample(uint, se::WeaponHook@, jjSTREAM@) {
  53.                                 if (SamplesLoaded[0]) FireSound = SOUND::COMMON_GUNSM1;
  54.                                 return true;
  55.                         }
  56.                 }
  57.                
  58.                 void Behavior(jjOBJ@ obj) {
  59.                         obj.behave(obj.state == STATE::EXPLODE? BEHAVIOR::RFBULLET : BEHAVIOR::BULLET, false);
  60.                        
  61.                         switch (obj.state) {
  62.                                 case STATE::FLY: {
  63.                                         if (obj.counter % 5 == 0 && !jjLowDetail) {
  64.                                                 jjOBJ@ trail = jjObjects[jjAddObject(OBJECT::EXPLOSION, obj.xPos, obj.yPos)];
  65.                                                 trail.determineCurAnim(ANIM::AMMO, 3);
  66.                                                 trail.lightType = LIGHT::NONE;
  67.                                                 trail.playerHandling = HANDLING::PARTICLE;
  68.                                                 trail.bulletHandling = HANDLING::IGNOREBULLET;
  69.                                                 trail.isBlastable = false;
  70.                                         }
  71.                                        
  72.                                         if (obj.ySpeed > 12) obj.ySpeed = 12;
  73.                                        
  74.                                         jjDrawRotatedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, MLLEWeapons::HelpfulBulletFunctions::GetAngle(obj), MLLEWeapons::HelpfulBulletFunctions::GetDirection(obj) * 0.75, 0.75);
  75.                                         break; }
  76.                                
  77.                                 case STATE::EXPLODE:
  78.                                         if (obj.playerHandling == HANDLING::EXPLOSION)
  79.                                         jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 2, 2);
  80.                                
  81.                                         if (obj.var[2] == 0) {
  82.                                                 obj.var[2] = 1;
  83.                                                 jjOBJ@ blast = jjObjects[jjAddObject(OBJECT::BULLET, obj.xPos, obj.yPos, obj.creatorID, obj.creatorType, Shockwave)];
  84.                                                 blast.var[5] = MLLEWeapons::HelpfulBulletFunctions::IsPowerup(obj) ? 2 : 1;
  85.                                                 blast.playerHandling = HANDLING::PARTICLE;
  86.                                                 blast.bulletHandling = HANDLING::IGNOREBULLET;
  87.                                                 blast.lightType = LIGHT::RING2;
  88.                                                 blast.light = 0;
  89.                                                 blast.animSpeed = 1;
  90.                                                 blast.counter = 0;
  91.                                         }
  92.                                 break;
  93.                         }
  94.                 }
  95.                 void Shockwave(jjOBJ@ obj) {
  96.                         obj.light += 2;
  97.                         const float maxDistance = obj.light * obj.light * 16;
  98.                        
  99.                         if (obj.creatorType == CREATOR::PLAYER)
  100.                                 for (int i = 1; i < jjObjectCount; i++) {
  101.                                         jjOBJ@ target = jjObjects[i];
  102.                                         if (target.state == STATE::KILL || target.state == STATE::DONE || target.state == STATE::EXPLODE)
  103.                                                 continue;
  104.                                         const float dx = target.xPos - obj.xPos, dy = target.yPos - obj.yPos;
  105.                                         if (target.var[4] == 0 && (target.behavior == BEHAVIOR::MONITOR || (target.eventID >= OBJECT::BOMBCRATE && target.eventID <= OBJECT::TOASTERAMMO15) || target.eventID == OBJECT::GUNCRATE || target.eventID == OBJECT::GEMCRATE || target.eventID == OBJECT::CARROTCRATE || target.isTarget || target.eventID == OBJECT::DESTRUCTSCENERY)) {
  106.                                                 if (dx * dx + dy * dy < maxDistance) {
  107.                                                         obj.objectHit(target, target.playerHandling == HANDLING::ENEMY? HANDLING::ENEMY : HANDLING::SPECIAL);
  108.                                                         //if (target.playerHandling != HANDLING::ENEMY) target.state = STATE::KILL;
  109.                                                         target.var[4] = 1;
  110.                                                 }
  111.                                         }
  112.                                         else if (target.playerHandling == HANDLING::PICKUP && target.state == STATE::FLOAT) {
  113.                                                 if (dx * dx + dy * dy < maxDistance)
  114.                                                         target.state = STATE::FLOATFALL;
  115.                                         }
  116.                                 }
  117.                        
  118.                         jjPLAYER@ creator = (obj.creatorType == CREATOR::PLAYER) ? jjPlayers[obj.creatorID] : null;
  119.                         const bool canDamageOtherPlayers = (jjIsServer || jjGameConnection == GAME::LOCAL) && (jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME) && !(creator !is null && creator.blink != 0);
  120.                         for (int i = 0; i < 32; i++) {
  121.                                 jjPLAYER@ victim = jjPlayers[i];
  122.                                 if (victim.isInGame && victim.health > 0) {
  123.                                         const float dx = victim.xPos - obj.xPos, dy = victim.yPos - obj.yPos;
  124.                                         if (dx * dx + dy * dy < maxDistance) {
  125.                                                 victim.xSpeed = dx>0 ? 8 : -8;
  126.                                                 victim.ySpeed = dy>0 ? 8 : -8;
  127.                                                 if (canDamageOtherPlayers && obj.var[8] & 1 << i == 0 && (creator is null || creator.isEnemy(victim))) {
  128.                                                         victim.hurt(obj.var[5], false, creator);
  129.                                                         obj.var[8] = obj.var[8] | 1 << i;
  130.                                                 }
  131.                                         }
  132.                                 }
  133.                         }
  134.                        
  135.                         if (++obj.counter == 14)
  136.                                 obj.delete();
  137.                 }
  138.         }
  139. }