Downloads containing SpikeBomb.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Blood LibelFeatured Download Violet CLM Battle 8.8 Download file

File preview

#pragma require "SpikeBomb.asc"
#pragma require "SpikeBomb.j2a"
#include "MLLE-Weapons.asc"

namespace SpikeBomb {
	const float BottomOfLevel = jjLayerHeight[4] * 32;
	class Weapon : MLLEWeapons::WeaponInterface {
		Weapon() {
			super(
				regularObjectTemplate: MLLEWeapons::ObjectTemplate(
					var: array<int> = {5, 1},
					killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 80,
					counterEnd: 255, //default
					playerHandling: HANDLING::PARTICLE
				),
				powerupObjectTemplate: MLLEWeapons::ObjectTemplate(
					var: array<int> = {7, 1},
					curAnim: 1,
					animSpeed: 2,
					killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 80,
					counterEnd: 255,
					playerHandling: HANDLING::PARTICLE
				),
				animSetFilename: "SpikeBomb.j2a",
				pickupAnimation: 0,
				poweredUpPickupAnimation: 1,
				//powerupAnimation: 6,
				//ammoCrateAnimation: 7,
				style: WEAPON::MISSILE,
				behavior: MLLEWeapons::behaviorFunction(DetermineBehavior),
				apply: MLLEWeapons::applyFunction(CheckOptions)
			);
		}
		void DetermineBehavior(jjOBJ@ obj, bool powerup) {
			if (obj.creatorType != CREATOR::PLAYER || jjPlayers[obj.creatorID].isLocal)
				jjSample(obj.xPos, obj.yPos, SOUND::COMMON_FOEW2, 0, 0);
			if (obj.creatorType == CREATOR::PLAYER && jjPlayers[obj.creatorID].isLocal)
				obj.var[2] = 0; //no shadow for local spikes
			obj.eventID = OBJECT::TNT;
			obj.behavior = Behavior;
		}
		bool CheckOptions(uint, se::WeaponHook@, jjSTREAM@ parameter) {
			PowerupObjectTemplate.CurAnim = PoweredUpPickupAnimation;
			if (parameter !is null && parameter.getSize() >= 11) {
				int pi; bool pb;
				
				parameter.pop(pb); RegularObjectTemplate.Var[1] = pb ? 1 : 0; //diagonal
				parameter.pop(pb); PowerupObjectTemplate.Var[1] = pb ? 1 : 0;
				parameter.pop(pi); RegularObjectTemplate.CounterEnd = pi; //lifetime
				parameter.pop(pi); PowerupObjectTemplate.CounterEnd = pi;
				parameter.pop(pb); RegularObjectTemplate.Var[2] = PowerupObjectTemplate.Var[2] = pb ? 1 : 0; //shadow
			}
			return true;
		}
	}
	void Behavior(jjOBJ@ obj) {
		obj.behave(BEHAVIOR::TNT);
		
		if (obj.yPos < BottomOfLevel && !jjMaskedHLine(int(obj.xPos - 12), 24, int(obj.yPos + 8))) { //falling
			obj.yPos += obj.var[0];
			if (obj.var[2] != 0) { //shadow
				const int floor = jjMaskedTopVLine(int(obj.xPos), int(obj.yPos), 9000);
				if (floor <= 9000)
					jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos + floor, obj.curFrame, 1.8, 0.7, SPRITE::SINGLECOLOR, 24 | (jjGameTicks & 7));
			}
			if (obj.counter > int(obj.counterEnd - 2))
				obj.counter = obj.counterEnd - 2; //don't explode yet
		}
		
		if (obj.state == STATE::EXPLODE) {
			if (obj.counter == 24) {
				jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PISTOL1, 0, 0);
				for (int i = -8; i <= 8; i += 8) {
					for (int j = -8; j <= 8; j += 8) {
						if (obj.var[1] == 1) { //allow diagonals
							if (i == 0 && j == 0)
								continue;
						} else { //only orthogonals
							if ((i == 0) == (j == 0))
								continue;
						}
						int id = jjAddObject(OBJECT::BULLET, obj.xPos, obj.yPos, obj.creatorID, CREATOR::PLAYER, BEHAVIOR::PEPPERBULLET);
						if (id != 0) {
							jjOBJ@ burst = jjObjects[id];
							burst.animSpeed = obj.animSpeed;
							burst.direction = 1;
							burst.determineCurAnim(ANIM::AMMO, 16);
							burst.determineCurFrame();
							burst.behavior = Spike;
							burst.playerHandling = HANDLING::PLAYERBULLET;
							burst.var[3] = 8;
							burst.xSpeed = j;
							burst.ySpeed = i;
							burst.var[0] = int(atan2(-burst.ySpeed, burst.xSpeed) * (512.f * 0.318309886142228f));
							burst.var[6] = obj.var[6];
							burst.xAcc = burst.yAcc = 0;
							burst.lightType = LIGHT::POINT2;
							burst.light = 1;
							burst.isBlastable = false;
						}
					}
				}
			}
		}
	}
	void Spike(jjOBJ@ obj) {
		obj.behave(BEHAVIOR::PEPPERBULLET, obj.state == STATE::EXPLODE);
		if (obj.state != STATE::EXPLODE)
			jjDrawRotatedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.var[0], 0.75, 0.75);
	}
}