Grappling Beam

Version:

2.0

Added on:

30 Oct 2013 20:02

Tags:

No tags added for this snippet.

Description:
Uses the Fireball Gun as the Grappling beam, so it needs /fireball to be on. It can be used without mouse aiming, but that is not recommended.
You can also hurt enemies with it.
Many thanks to Sir Ementaler for helping me.

Update: - beam has sound
- non-PU and PU now use same sprite
- the beams now look cooler(?)
/*Grappling Beam*/
/*Author: szmol96*/

void GrapplingBeam(jjOBJ@ beam) {
  if (beam.state == STATE::START) {
  beam.state = STATE::FLY;
  jjSample(p.xPos, p.yPos, SOUND::AMMO_ICEPU4, 0, 9000);
  }
  jjPLAYER@ p = jjPlayers[beam.creatorID];
  
  beam.xPos = beam.xPos + beam.xSpeed + (beam.xAcc * 2);
  beam.yPos = beam.yPos + beam.ySpeed + (beam.yAcc * 2);
  
  float dx = beam.xPos - p.xPos;
  float dy = beam.yPos - p.yPos;
  float length = sqrt(dx*dx+dy*dy);
  
  
  if (jjMaskedPixel(beam.xPos, beam.yPos)) {
    beam.xSpeed = 0;
    beam.ySpeed = 0;
    beam.xAcc = 0;
    beam.yAcc = 0;
    p.xSpeed = 30*dx/length;
    p.ySpeed = 30*dy/length;
    if (jjGameTicks% 25 == 0) jjSample(p.xPos, p.yPos, SOUND::COMMON_SHIELD1, 0, 10000);
    if (jjGameTicks% 25 == 0) jjSample(p.xPos, p.yPos, SOUND::COMMON_SHIELD1, 0, 11000);
  }
  
  for(float pos = 0; pos<length; pos += 3){
  jjDrawSpriteFromCurFrame(p.xPos + pos * dx/length, p.yPos + pos * dy/length, beam.curFrame, 0, SPRITE::GEM, 9, 4, 4, -1);
  }
  
  if (p.keyFire == false || length > 400) beam.delete();
  
  beam.frameID = (++beam.counter >> 1) % 9;
  beam.determineCurFrame();
  beam.draw();
}

void GrapplingBeamPU(jjOBJ@ beam) {
  if (beam.state == STATE::START) {
  beam.state = STATE::FLY;
  jjSample(p.xPos, p.yPos, SOUND::AMMO_SPZBL2, 0, 11000);
  jjSample(p.xPos, p.yPos, SOUND::AMMO_ICEPU4, 0, 9000);
  }
  jjPLAYER@ p = jjPlayers[beam.creatorID];
  
  beam.xPos = beam.xPos + beam.xSpeed + (beam.xAcc * 2);
  beam.yPos = beam.yPos + beam.ySpeed + (beam.yAcc * 2);
  
  float dx = beam.xPos - p.xPos;
  float dy = beam.yPos - p.yPos;
  float length = sqrt(dx*dx+dy*dy);
  
  
  if (jjMaskedPixel(beam.xPos, beam.yPos)) {
    beam.xSpeed = 0;
    beam.ySpeed = 0;
    beam.xAcc = 0;
    beam.yAcc = 0;
    p.xSpeed = 30*dx/length;
    p.ySpeed = 30*dy/length;
    if (jjGameTicks% 25 == 0) jjSample(p.xPos, p.yPos, SOUND::COMMON_SHIELD1, 0, 10000);
    if (jjGameTicks% 25 == 0) jjSample(p.xPos, p.yPos, SOUND::COMMON_SHIELD1, 0, 11000);
  }
  
  for(float pos = 0; pos<length; pos += 3){
  jjDrawSpriteFromCurFrame(p.xPos + pos * dx/length, p.yPos + pos * dy/length, beam.curFrame, 0, SPRITE::PALSHIFT, jjRandom() % 5, 4, 4, -1);
  }
  
  if (p.keyFire == false || length > 400) beam.delete();
  
  beam.frameID = (++beam.counter >> 1) % 9;
  beam.determineCurFrame();
  beam.draw();
}

void onLevelLoad() {
  jjWeapons[WEAPON::GUN8].style = WEAPON::MISSILE;
  jjObjectPresets[OBJECT::FIREBALLBULLET].behavior = GrapplingBeam;
  jjObjectPresets[OBJECT::FIREBALLBULLET].special = jjObjectPresets[OBJECT::FIREBALLBULLET].determineCurAnim(ANIM::PICKUPS, 85);
  jjObjectPresets[OBJECT::FIREBALLBULLETPU].behavior = GrapplingBeamPU;
  jjObjectPresets[OBJECT::FIREBALLBULLETPU].special = jjObjectPresets[OBJECT::FIREBALLBULLETPU].determineCurAnim(ANIM::PICKUPS, 85);
}

void onPlayer(jjPLAYER@ p) {
  p.ammo[8] = 3;
}