All pastes #974336 Raw Edit

Something

public text v1 · immutable
·published 2008-04-06 18:57 UTC
rendered paste body
//include("SpellCast.js");

include("Utils.js");	// We depend on the Utils module.

// Create the global symbol "SpellCast" as our namespace if it doesn't exist.
// Throw an error if it does exist but is not an object.
var SpellCast;
if (!SpellCast) {
	SpellCast = {};
} else if (typeof SpellCast != "object") {
	throw new Error("SpellCast.js:  SpellCast already exists and is not an object.");
}


/**
 * Releases all mana, held mana spells, and preparing spells.
 */
SpellCast.releaseAll = function() {
	SpellCast.release("all");
}

/**
 * Releases a currently prepared/preparing spell.
 */
SpellCast.releasePrep = function() {
	if (spell != "None") {
		SpellCast.release("spell");
	}
}

/**
 * Releases some or all held mana.
 * Param manaNum	Optional.  The amount of mana to release.
 *					If not provided, defaults to all mana.
 */
SpellCast.releaseMana = function(/*optional*/ manaNum) {
	if (!manaNum) {
		SpellCast.release("mana");
	} else if (isNaN(parseInt(manaNum))) {	// Not a number, do nothing.
		return;
	} else {
		SpellCast.release(manaNum + " mana");
	}
}

/**
 * Attempts to release whatever is passed as a parameter.
 * Used as the back end for all the more specific release methods.
 * When releasing mana, if more mana is specified than is currently held
 * It will attempt to release all held mana.
 * Param relString	Optional.  What we should attempt to release.
 *					If not provided, a generic release will be tried.
 */
SpellCast.release = function(/*optional*/ relString) {
	if (!relString) {
		var relString = "";
	}

	// The huge match table is so we can guarantee a successful release
	// Unfortunately, this means we need every possible string.  WIP.
	var matches = new MatchList();
	matches.match("Type RELEASE HELP for more options.",				_end);
	matches.match("Release what?",										_end);
	matches.match("You let your concentration lapse",					_end);
	matches.match("You aren't preparing a spell.",						_end);
	matches.match("You release",										_end);
	matches.match("You aren't holding any mana.",						_end);
	matches.match("You gesture, completing the pattern to unravel",		_end);
	matches.match("That would be a neat trick.  Try finding a",			_end);
	matches.match("Shadow Servant disappears.",							_end);
	matches.match("You don't have a Shadow Servant.",					_end);
	matches.match("You release the Refractive Field spell.",			_end);
	matches.match("That spell isn't in effect on you.",					_end);
	matches.match("You release your Distant Gaze spell.",				_end);
	matches.match("You do not have a Distant Gaze spell in effect.",	_end);
	matches.match("You aren't holding that much mana.",					SpellCast.releaseMana);
	Utils.matchPut("release " + relString, matches);

	function _end() {}
}


/**
 * Prepares a spell.  Releases any currently preparing spell in favor
 * of this one.
 * Param spellName		Name of the spell to prepare.
 * Param manaNum		Optional.  Amount of mana to prepare the spell at.
 * Returns				A string containing the preparing spell or "None" if no
 *						spell was prepped.
 */
SpellCast.prep = function(spellName, /*optional*/ manaNum) {
	if (!spellName) {
		throw new Error("SpellCast.js:  SpellCast.prep requires a spell name.");
	}
	if (!manaNum || isNaN(parseInt(manaNum))) {
		manaNum = 1;
	}

	// Release any currently preparing spell
	SpellCast.releasePrep();

	var matches = new MatchList();
	matches.match("That is not a spell you can cast.");	// Bad spell name
	matches.match("You do not know how to cast that spell.");	// You haven't learned this spell
	matches.match("You stop, convinced that there's no way");	// Too much mana (>499)
	matches.matchRe(
		"You struggle against your bindings to prepare|" +				// Prep while webbed
		"You raise your arms skyward, chanting the words|" +			// Moon Mage - Default			
		"Your eyes and skin darken to black as a starless night|" +		// Moon Mage - Exclusive Library
		"Smiling slyly, you murmur the words|" +						// Moon Mage - Tezirite
		"You trace an arcane sigil in the air|" +						// War Mage - Default
		"Icy blue frost crackles up your arms|" +						// War Mage - Exclusive Library
		"Heatless orange flames blaze between your|" +					// War Mage - Exclusive Library
		"Tiny tendrils of lightning jolt between your|" +				// War Mage - Exclusive Library
		"You close your eyes and breathe deeply, gathering|" +			// Empath/Ranger - Default
		"You begin chanting a prayer to invoke|" +						// Cleric - Default?
		"You bow your head and chant a prayer|" +						// Cleric - Default?
		"The wailing of lost souls accompanies your preparations|" +	// Cleric - Exclusive Library
		"Your skin briefly withers and tightens, becoming gaunt");		// Necromancer - Exclusive Library
	Utils.matchPut("prepare " + spellName + " " + manaNum, matches);
}

/**
 * Casts a pre prepared spell.
 * Param target		Optional.  The target of the spell.
 * Returns			true if the spell was successfully cast, otherwise false
 *					Casting while out of mana still counts as success.
 */
SpellCast.cast = function(/*optional*/ target) {
	matches = new MatchList();
	var success = matches.matchRe(
		"You sweep your right hand across the spell pattern|" +								// energy bolt
		"You gesture\\.|" +																	// regular cast
		"(You steeple your fingers together|Using your (left|right) hand, you channel)");	// whole displacement
	var failure = matches.matchRe(
		"I could not find what you were referring to\\.|" +		// bad target
		"You must cast this spell on a constellation\\.|" +		// bad target - starlight sphere
		"Your secondary spell pattern|" +						// dead target - TM
		"on yourself!|" +										// not a self cast spell
		"You don't have a spell");								// no spell prepped
	if (target) {
		var matched = Utils.matchPut("cast " + target, matches);
	} else {
		var matched = Utils.matchPut("cast", matches);
	}

	if (matched == success) {
		return true;
	} else if (matched == failure) {
		return false;
	}
}

/**
 * Harness some mana
 * Param amount		Amount to harness per try
 * Param times		Optional.  Times to harness amount.  Default is one
 * Returns			Total number of mana sucessfully harnessed.
 */
SpellCast.harness = function(amount, /*optional*/ times) {
	if (!amount || isNaN(parseInt(amount))) {
		throw new Error("SpellCast.js: " +amount +"is not a valid amount for SpellCast.harness");
	}
	if (!times) {
		times = 1;
	}
	if (isNaN(parseInt(times))) {
		throw new Error("SpellCast.js: SpellCast.harness second argument is optional but must be a number");
	}

	for (var i = 0; i < times; i++) {
		matches = new MatchList();
		matches.match("You tap into the mana");
		var failure = matches.match("You strain, but cannot");
		Utils.matchPut("harness " + amount, matches);

		if (failure == matches) {
			break;
		}
	}

	return i * amount;
}

/**
 * Charge a cambrinth item
 * Param item		Cambrinth item to charge
 * Param amount		Amount to charge
 * Returns			true if any mana was successfuly charged.  false otherwise.
 */
SpellCast.charge = function(item, amount) {
	if (!item || !amount || isNaN(parseInt(amount))) {
		throw new Error("SpellCast.js:  Usage:  SpellCast.charge(cambrinth_item, charge_amount);");
	}

	matches = new MatchList();
	var failure = matches.matchRe("Don't be rediculous.|That cannot be charged\\.|You strain, but cannot|I could not find what");
	var success = matches.match("Roundtime:");
	var matched = Utils.matchPut("charge " +item +" " +amount, matches);

	if (matched == failure) {
		return false;
	} else if (matched == success) {
		return true;
	}
}

/**
 * Focus on an item, usually cambrinth
 * Param item		Item to focus on
 * Param amount		Optional.  Amount to focus. (for runestones)
 */
SpellCast.focus = function(item, /*optional*/amount) {
	if (!item) {
		throw new Error("SpellCast.js:  SpellCast.focus requires an item parameter.");
	}

	matches = new MatchList();
	var retry = matches.matchRe("Try though you may,|magical link, but fail\\.");
	var end = matches.matchRe("dim, almost magically|readying it for your|Your link to|Roundtime:|You must have both hands free|I could not find what you");
	if (!amount || isNaN(parseInt(amount))) {
	var matched	= Utils.matchPut("focus my " +item, matches);
	} else {
	var matched = Utils.matchPut("foucs my " +item +" " +amount, matches);
	}

	if (matched == retry) {
		SpellCast.focus(item, amount);
	} else if (matched == end) {
		return;
	}
}






SpellCast.prep("cv");
SpellCast.charge("armband", 11);
SpellCast.focus("armband");
SpellCast.cast();