Aller au contenu

Photo

Mana System


  • Veuillez vous connecter pour répondre
23 réponses à ce sujet

#1
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

Following all the help I received in this topic I decided to share all the code involved in a mana system I've been working on in the past few days. The goal is to replace Vancian Magic, of course.

 

Some forewarning:

 

1) You need to mofidy the ingameui.ini (I modified all 3 of them, x1 and x2 too) to add the GUI to the mandatory ones.

2) Some resources shown here like the mana bar .tga icon is custom made. (I just took the default health bar, rotated it 90 degrees and colored it blue). You need to have that file or replace it with something else.

3) The system itself is designed to fit a very customized setting. Lots of changes have been made in my override folder (mostly .2das and scripts) and as it's presented here it's designed to fit my setting, to fit other settings you may have to change the rules a bit. (Some could consider this overpowered or underpowered depending on the module or personal preferences)

4) All spellcasters in your classes.2da must have -Has infinite spells- set to 1. (like Warlocks)

 

Known Issues:
 

1) Haven't thought yet of a way to show/hide the GUI. (But I'm sure this can be done easily by someone more expert than me, and eventually I'll modify it as well)

2) Resting when you are not controlling your main PC does not restore mana. (Probably there's a workaround for this too, but that's not really high priority imho).

3) Whenever you are not controlling the main PC the "insufficient mana" message is displayed twice. (so minor it could be ignored) ---SOLVED BY TCHOS--- (See post #10)

4) Extra-slot features for spontaneous spellcasters become totally useless.

 

Overall explanation of the system:

 

All creatures have mana. The maximum amount of mana is defined by your class levels and your Wisdom (affects Mana just like Constitution affects Health). 

 

I decided to make the amount of maximum granted by a class level equal to 18-HD-SP. For consistency and easiness of coding. (HD is Hit Dice Size, and SP is Skill Points per Level). For example wizards gain 12 MP per level, Bards 6 MP and Clerics 8 MP. Even non-casters give mana this way, I thought that it could come in handy later for new prestige classes or new feats that are not spells and consume mana in other manners.

 

Every arcane or divine spell you cast costs MP.

The formula for deciding the MP cost is the following: (Innate Spell Level+ Meta Modifier + 1)^2

The following list gives the values per level

 

Level 0: 1 MP

Level 1: 4 MP

Level 2: 9 MP

Level 3: 16 MP

Level 4: 25 MP

Level 5: 36 MP

Level 6: 49 MP

Level 7: 64 MP

Level 8: 81 MP

Level 9: 100 MP

 

NOTE: In my settings I have changed the class spell levels to make them fit with Innate or viceversa. This rules is a bit different if you don't modify your Class Spell levels in your spells.2da.

 

 

 

This can be modified  / expanded. (for example you could add potions that restore mana or modify the rules that decide max MP and MP cost if you don't like them).


  • rjshae aime ceci

#2
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

This is the first script. I call it script_maxmana.

It defines the amount of maximum mana possessed by a creature and also fires off the GUI to display mana.

You need to make a custom passive and persistent feat that fires off the custom spells that runs this script.

Then you need to change all subrace.2das to make sure every creature has this feat. (if you want to, you could decide to not give it to constructs, but that would make them unable to cast spells unless you design spells specifically for constructs and I would avoid that)

// This scripts defines the maximum mana of a creature


void main()

{	

	object oPC = OBJECT_SELF;
	
	int Levels = GetTotalLevels(oPC, 0);

	int Class_1 = GetClassByPosition(1, oPC);
	int Class_2 = GetClassByPosition(2, oPC);
	int Class_3 = GetClassByPosition(3, oPC);
	int Class_4 = GetClassByPosition(4, oPC);
	
	int CLVL_1 = GetLevelByClass(Class_1, oPC);
	int CLVL_2 = GetLevelByClass(Class_2, oPC);
	int CLVL_3 = GetLevelByClass(Class_3, oPC);
	int CLVL_4 = GetLevelByClass(Class_4, oPC);
	
	int C_HP_1 = StringToInt(Get2DAString("classes", "HitDie", Class_1));
	int C_HP_2 = StringToInt(Get2DAString("classes", "HitDie", Class_2));
	int C_HP_3 = StringToInt(Get2DAString("classes", "HitDie", Class_3));
	int C_HP_4 = StringToInt(Get2DAString("classes", "HitDie", Class_4));
	
	int C_SK_1 = StringToInt(Get2DAString("classes", "SkillPointBase", Class_1));
	int C_SK_2 = StringToInt(Get2DAString("classes", "SkillPointBase", Class_2));
	int C_SK_3 = StringToInt(Get2DAString("classes", "SkillPointBase", Class_3));
	int C_SK_4 = StringToInt(Get2DAString("classes", "SkillPointBase", Class_4));
	
	int C_MP_1 = 18 - C_HP_1 - C_SK_1;
	int C_MP_2 = 18 - C_HP_2 - C_SK_2;
	int C_MP_3 = 18 - C_HP_3 - C_SK_3;
	int C_MP_4 = 18 - C_HP_4 - C_SK_4;
	
	int MaxCls = CLVL_1 * C_MP_1 + CLVL_2 * C_MP_2 + CLVL_3 * C_MP_3 + CLVL_4 * C_MP_4;
	int MaxWis = Levels * GetAbilityModifier(4, oPC);
	int MaxTot = MaxCls + MaxWis;
	if (MaxTot < Levels)
	{
		MaxTot = Levels;
	}
	string MaxTot_String = IntToString(MaxTot);
	SetLocalInt(oPC, "Clangeddin_Maximum_Mana", MaxTot);
	
	//Current Mana
	
	
	
	int FirstCheck = GetLocalInt(oPC, "Clangeddin_Mana_First_Time");
	
	if (FirstCheck == 0)
	{
		SetLocalInt(oPC, "Clangeddin_Current_Mana", MaxTot);
		SetLocalInt(oPC, "Clangeddin_Mana_First_Time", 1);
	}
	
	object oRester = GetLastPCRested();
	if (oRester==oPC)
	{
		SetLocalInt(oPC, "Clangeddin_Current_Mana", MaxTot);
	}
	
	DisplayGuiScreen(oPC, "SCREEN_PARTY_MP", FALSE, "partymp.xml");
	
	int I;
	for (I=1; I<=100;)
	{
		string I_string = IntToString(I);
		SetGUIObjectHidden(oPC, "SCREEN_PARTY_MP", "MEMBER_" + I_string, TRUE);
		I = I + 1;
	} 	
	
	int N;
	object party_member = GetFirstFactionMember(oPC, FALSE);
	while (party_member!=OBJECT_INVALID)
	{
		N = N + 1;
		int Member_Min = GetLocalInt(party_member, "Clangeddin_Current_Mana");
		int Member_Max = GetLocalInt(party_member, "Clangeddin_Maximum_Mana");
		float mp_ratio_p = IntToFloat(Member_Min) / IntToFloat(Member_Max);
		string Member_Name = GetFirstName(party_member);
		string N_string = IntToString(N);
		string Display_Message_p = IntToString(Member_Min) + "/" + IntToString(Member_Max);
		SetGUIObjectHidden(oPC, "SCREEN_PARTY_MP", "MEMBER_" + N_string, FALSE);
		SetGUIObjectText(oPC, "SCREEN_PARTY_MP", "NAME_TEXT_" + N_string, -1, Member_Name);
		SetGUIObjectText(oPC, "SCREEN_PARTY_MP", "MP_BAR_TEXT_" + N_string, -1, Display_Message_p);
		SetGUIProgressBarPosition(oPC, "SCREEN_PARTY_MP", "MP_BAR_" + N_string, mp_ratio_p);
		party_member = GetNextFactionMember(oPC, FALSE);
	}
}


#3
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

This is the script that defines the actual spellcasting. I have called it script_spells_mana.

Every time you cast a spell this will recalculate your mana (and check if you have enough mana to cast the spell) and update the GUI accordingly.

The script does nothing by itself, it needs to be called from the spell scripts. Yes, that means you will have to modify all spells one by one and that's tedious beyond belief. The lines of code to be added are presented below.

Do not forget to add #include "script_spells_mana" when you will modify the spell scripts.

// This scripts is used to modify spells to make them suit the Mana System (Clangeddin 2014)


int CanCast(object oCaster, int nSpell, int nMeta)

{
	int Metamagic = 0;
		if (nMeta==METAMAGIC_EMPOWER)
		{
			Metamagic = 2;
			int Imp_Meta = GetHasFeat(1892, oCaster);
			if (Imp_Meta==TRUE)
			{
				Metamagic = Metamagic - 1;
			}
		}
		else if (nMeta==METAMAGIC_MAXIMIZE)
		{
			Metamagic = 3;
			int Imp_Meta = GetHasFeat(1893, oCaster);
			if (Imp_Meta==TRUE)
			{
				Metamagic = Metamagic - 1;
			}
		}
		else if (nMeta==METAMAGIC_QUICKEN)
		{
			Metamagic = 4;
			int Imp_Meta = GetHasFeat(1894, oCaster);
			if (Imp_Meta==TRUE)
			{
				Metamagic = Metamagic - 1;
			}
		}
		else if (nMeta==METAMAGIC_SILENT)
		{
			Metamagic = 1;			
		}
		else if (nMeta==METAMAGIC_STILL)
		{
			Metamagic = 1;			
		}
		else if (nMeta==METAMAGIC_EXTEND)
		{
			Metamagic = 1;
		}
		else if (nMeta==METAMAGIC_PERSISTENT)
		{
			Metamagic = 6;
		}
	int Innate = 1 + StringToInt(Get2DAString("spells", "Innate", nSpell)) + Metamagic;
	int Sorcer = GetLevelByClass(CLASS_TYPE_SORCERER, oCaster);
	int MP_Cost = Innate * Innate * (20 - Sorcer / 5) / 20;
	int Current_MP = GetLocalInt(oCaster, "Clangeddin_Current_Mana");
	if (Current_MP < MP_Cost)
	{
		FloatingTextStringOnCreature("Insufficient Mana.", oCaster, FALSE, 2.0);
		return FALSE;
	}
	Current_MP = Current_MP - MP_Cost;
  	SetLocalInt(oCaster, "Clangeddin_Current_Mana", Current_MP);
	
	DisplayGuiScreen(oCaster, "SCREEN_PARTY_MP", FALSE, "partymp.xml");
	
	int I;
	for (I=1; I<=100;)
	{
		string I_string = IntToString(I);
		SetGUIObjectHidden(oCaster, "SCREEN_PARTY_MP", "MEMBER_" + I_string, TRUE);
		I = I + 1;
	} 	
	
	int N;
	object party_member = GetFirstFactionMember(oCaster, FALSE);
	while (party_member!=OBJECT_INVALID)
	{
		N = N + 1;
		int Member_Min = GetLocalInt(party_member, "Clangeddin_Current_Mana");
		int Member_Max = GetLocalInt(party_member, "Clangeddin_Maximum_Mana");
		float mp_ratio_p = IntToFloat(Member_Min) / IntToFloat(Member_Max);
		string Member_Name = GetFirstName(party_member);
		string N_string = IntToString(N);
		string Display_Message_p = IntToString(Member_Min) + "/" + IntToString(Member_Max);
		SetGUIObjectHidden(oCaster, "SCREEN_PARTY_MP", "MEMBER_" + N_string, FALSE);
		SetGUIObjectText(oCaster, "SCREEN_PARTY_MP", "NAME_TEXT_" + N_string, -1, Member_Name);
		SetGUIObjectText(oCaster, "SCREEN_PARTY_MP", "MP_BAR_TEXT_" + N_string, -1, Display_Message_p);
		SetGUIProgressBarPosition(oCaster, "SCREEN_PARTY_MP", "MP_BAR_" + N_string, mp_ratio_p);
		party_member = GetNextFactionMember(oCaster, FALSE);
	}
	
	return TRUE;
}

Here's the code you need to add to the spells one by one. You should add these lines after an "early return" and before any "spell fire". Usually the correct place is right after the spellhook code. If there's nothing of the sort, add it right after the void (main).

	
int Spell_ID = GetSpellId();
int Meta_ID	= GetMetaMagicFeat();
if (!CanCast(OBJECT_SELF, Spell_ID, Meta_ID))
{
	return;
}


#4
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

And finally, the XML code to display the GUI. I called it partymp.xml

 

As you can see I have partially cut the code after the UIPane "MEMBER_1" and replaced it with suspension marks. You just need to keep adding MEMBER_X with increasing natural numbers to make it fit more possible party members. In my current version I have gone up to MEMBER_20, but possibly for MP, should you ever decide to add this to a PW, it should go up to MEMBER_100 at least.

<?xml version="1.0" encoding="utf-8">

<UIScene name="SCREEN_PARTY_MP" x=ALIGN_RIGHT y=ALIGN_MIDDLE width=215 height=210 draggable="true" scriptloadable="true" priority="SCENE_INGAME"/>

<!-- PARTY -->
<UIText name="PARTY_TEXT" x=0 y=0 width=200 height=30 text="MANA POINTS" align="center" valign="middle" fontfamily="Special_Font" style="2"/>
<UIIcon name="LINEH1_1"	x=0 y=0 	width=200 	height=1 	img="fx_white.tga" />
<UIIcon name="LINEH2_1"	x=0 y=29 	width=200 	height=1 	img="fx_white.tga" />
<UIIcon name="LINEV1_1"	x=0 y=0 	width=1 	height=30 	img="fx_white.tga" />
<UIIcon name="LINEV2_1"	x=199	y=0 	width=1 	height=30 	img="fx_white.tga" />
<UIIcon name="PARTY_BG"	x=0 y=0 width=200 height=30 img="fx_white.tga" color="purple"/>

<!-- MP BARS -->
<UIListBox name="PARTY_LIST_MP" x=0 y=30 width=215 height=180 xPadding=0 yPadding=0 showpartialchild=true scrollbaronright=true unequalcontrols=true scrollsegmentsize=60 hidescrollbarwhennotneeded=true capturemouseclicks=false >
		
<!-- bar 1 -->
<UIPane name="MEMBER_1" width=200 height=20 >
<UIIcon name="LINEH1_1"	x=0 y=0 width=200 height=1 img="fx_white.tga" />
<UIIcon name="LINEH2_1"	x=0 y=19 width=200 height=1 img="fx_white.tga" />
<UIIcon name="LINEV1_1"	x=0 y=0 width=1 height=20 img="fx_white.tga" />
<UIIcon name="LINEV2_1"	x=136 y=0 width=1 height=20 img="fx_white.tga" />
<UIIcon name="LINEV3_1"	x=199	y=0 	width=1 	height=20 	img="fx_white.tga" />
<UIText name="NAME_TEXT_1" x=0 	y=0 	width=136 	height=20	align="center" valign="middle" />
<UIText name="MP_BAR_TEXT_1" x=137 	y=0 	width=64 	height=20 	color="black" align="center" valign="middle" /> 
<UIProgressBar 	name="MP_BAR_1"	x=137 y=0 width=64 height=20 vertical=false img="p_m_mana_fill.tga" > </UIProgressBar>
<UIIcon name="MP_BAR_BG_1" x=137 y=0 width=64 height=20 img="fx_white.tga" color="red" />
<UIIcon name="MEMBER_BG_1" x=0 	y=0 width=200 height=20 img="fx_white.tga" color="purple"/>
</UIPane>
			
 .....................................
		
<UIScrollBar name="SB_MP" style="STYLE_SB_THIN"></UIScrollBar> 
</UIListBox>


#5
PJ156

PJ156
  • Members
  • 2 982 messages

I love mana based systems or power as it was in RuneQuest. Is your system based on personally mana only of could a player access and top up a mana source?

 

PJ



#6
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

I love mana based systems or power as it was in RuneQuest. Is your system based on personally mana only of could a player access and top up a mana source?

 

PJ

 

I'm not sure what you mean, could you explain better please?



#7
PJ156

PJ156
  • Members
  • 2 982 messages

The system I used to play in RQ gave a finite amount of mana (power). It went up with stats but not with level (experience). the play could put mana into a crystal or item and then rest to gain back mana that way they could extend their pool beyond their own personal limit by tapping into the item. When that was used up they used their own until they were all out and had to rest.

 

We applied it to DnD once where each level of spell cost one mana point per level. You gained spell level usage with exp as normal but you have an amount of mana equal to your int plus anything you could store, if you have items.

 

We dropped it as it made low level MU's very powerful as they started with the ability to cast 16 first level spells :)

 

It was a good laugh though.

 

PJ



#8
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

Yes of course it's possible to add something similar, but keep in mind you have to make a new feat, a new item a new spell that fires off the script for whatever new feature you need to add.

In the code I posted nothing of the sort is mentioned, but with new code it should be possible to add.

 

From what I understand, though, as a mechanic it doesn't sound that much different than quaffing a rechargable mana potion.



#9
Lance Botelle

Lance Botelle
  • Members
  • 1 480 messages

Hi,

Thanks for posting ... :)

I like messing around with this sort of thing myself. Although, I adopted a variation on the Vancian System: A spellcaster can use the normal power they have stored to power an Arcaene Lore page. Some info here: ... http://worldofalthea...2/law-lore.html

Flexibility and balance is a key point to any magic system I believe.

Cheers,
Lance.



#10
Tchos

Tchos
  • Members
  • 5 042 messages

Change

FloatingTextStringOnCreature("Insufficient Mana.", oCaster, TRUE, 2.0);

to

FloatingTextStringOnCreature("Insufficient Mana.", oCaster, FALSE, 2.0);

if you don't want the text to display twice.  It displays twice because it's broadcasting it to the faction in addition to displaying it to you.


  • Clangeddin86 aime ceci

#11
Clangeddin86

Clangeddin86
  • Members
  • 220 messages

Change

FloatingTextStringOnCreature("Insufficient Mana.", oCaster, TRUE, 2.0);

to

FloatingTextStringOnCreature("Insufficient Mana.", oCaster, FALSE, 2.0);

if you don't want the text to display twice.  It displays twice because it's broadcasting it to the faction in addition to displaying it to you.

 

Well, you solved one of the known issues then. Thanks. =D



#12
Lance Botelle

Lance Botelle
  • Members
  • 1 480 messages

Known Issues:
 
1) Haven't thought yet of a way to show/hide the GUI. (But I'm sure this can be done easily by someone more expert than me, and eventually I'll modify it as well)


Yes, this can be done, but you would also need to add something like a feat button that called the HIDE GUI code. If you check out the screenshot in my latest blog post you can see where I have "hidden" the chat window and "quickslots" via this method:

http://worldofalthea...8/treasure.html

2) Resting when you are not controlling your main PC does not restore mana. (Probably there's a workaround for this too, but that's not really high priority imho).


Yes, this is fixable by scripting. You have to intercept the REST button script and make sure you loop trough all your PCs.

3) Whenever you are not controlling the main PC the "insufficient mana" message is displayed twice. (so minor it could be ignored) ---SOLVED BY TCHOS--- (See post #10)


Actually, I have also found that changing the parameter on this function can fix one problem (the one you mention), but (if I recall correctly) it can stop the message being displayed if you are controlling a companion ... I think. For this reason, I switched to using "Notice Texts" for the player, rather than floating texts on PCs.

4) Extra-slot features for spontaneous spellcasters become totally useless.


Not looked into.

Cheers,
Lance.

#13
Tchos

Tchos
  • Members
  • 5 042 messages

Actually, I have also found that changing the parameter on this function can fix one problem (the one you mention), but (if I recall correctly) it can stop the message being displayed if you are controlling a companion ... I think. For this reason, I switched to using "Notice Texts" for the player, rather than floating texts on PCs.

 

I could be wrong, but I think it should work on both.



#14
Dann-J

Dann-J
  • Members
  • 3 161 messages

I could be wrong, but I think it should work on both.

 

It will work if you're controlling the first PC, and the text target is the PC or a companion.

It will work if you're controlling a companion, and either that companion or the first PC is the text target.

It will fail if you're controlling a companion, and another companion is the text target.

 

I prefer to use SpeakString().



#15
rjshae

rjshae
  • Members
  • 4 485 messages

I like what you're doing thus far, with the exception of the following:

 

The following list gives the values per level

 

Level 0: 1 MP

Level 1: 4 MP

Level 2: 9 MP

Level 3: 16 MP

Level 4: 25 MP

Level 5: 36 MP

Level 6: 49 MP

Level 7: 64 MP

Level 8: 81 MP

Level 9: 100 MP

 

 

I don't think that will scale well during game play. It translates to 25 Magic Missile spells for every one 9th level spell. (Or 6 10d6 fireballs.) Even a Sorcerer doesn't get that much low-level firepower.

 

(Yes I know the geometric approach is how magic item costs are determined in D&D 3.5e. But that's built to scale with the gp acquisition rate.)

 

You could make it a little more linear by adding a constant amount to all of them (and 1/2 that for the 0 level). If you add, say, +40 MP, then a 1st level would cost 44 and a 9th level 140: you could get off 3 magic missiles per 9th level spell.



#16
Eguintir Eligard

Eguintir Eligard
  • Members
  • 1 832 messages
mana is a biblical food made from bug feces. I am guessing zero people know that or they wouldn't be so eager to call everything mana all the time.

#17
Lance Botelle

Lance Botelle
  • Members
  • 1 480 messages

mana is a biblical food made from bug feces. I am guessing zero people know that or they wouldn't be so eager to call everything mana all the time.


Actually, "mana" is correct here, as it is "manna" from heaven in the true sense.

Being a Christian, I did know that. ;) And ... manna is something akin to Coriander seed (iirc) and not bug faeces/feces. :)

EXODUS 16 Verse 31: "And the house of Israel called the name of it Manna, and it was like to coriander seed, but white: and the taste of it was like unto wafers made with honey." (Geneva Bible)
 
FROM OED (11th Edition):
 
mana n noun (especially in Polynesian, Melanesian, and Maori belief) pervasive supernatural or magical power. ORIGIN from Maori.

manna n noun 1 (in the Bible) the substance miraculously supplied as food to the Israelites in the wilderness (Exod. 16).

 

It is good to see you are aware of "manna" in the sense from the bible ... :)

Cheers,
Lance.



#18
4760

4760
  • Members
  • 1 204 messages

Not sure if it's still called "manna" in English, but in French the word "manne" has the same meaning as "manna (in the Bible)", and is also the name given to sweet exudation from certain plants (which according to some historians is the origin of the biblical term), as well as the name for the gathering of small insects at the beginning of summer (maybe because fish and birds have a lot of food there?)

 

Off-topic off  ;)



#19
Lance Botelle

Lance Botelle
  • Members
  • 1 480 messages

Not sure if it's still called "manna" in English, but in French the word "manne" has the same meaning as "manna (in the Bible)", and is also the name given to sweet exudation from certain plants (which according to some historians is the origin of the biblical term), as well as the name for the gathering of small insects at the beginning of summer (maybe because fish and birds have a lot of food there?)
 
Off-topic off  ;)


Off-topic... ON.

I just did a Google English to French on both words, and it seems the following:-

Manna = Manne.
Mana = Mana.

So, I'm guessing the distinction remains even in French ... if we take the interpretation as accurate.

Cheers, Lance.

Off-topic... OFF.

#20
Tchos

Tchos
  • Members
  • 5 042 messages

The Polynesian explanation is the one I've always heard for the magical "mana" power, and never that it's supposed to be the biblical food "manna".


  • rjshae aime ceci

#21
Eguintir Eligard

Eguintir Eligard
  • Members
  • 1 832 messages

look up guano



#22
Tchos

Tchos
  • Members
  • 5 042 messages

gua·no  noun \ˈgwä-(ˌ)nō\
: waste material from birds and bats that is used to help plants grow

Full Definition of GUANO
:  a fertilizer containing the accumulated excrement of seabirds or bats; broadly :  excrement especially of seabirds or bats
 
Origin of GUANO
Spanish, from Quechua wanu fertilizer, dung
First Known Use: 1604

 
Granted, Merriam-Webster has been getting more "streamlined" lately, with less useful features such as etymology, though it seems to include it here.  I'm not sure what we should be seeing here.
 
More apropos:
 

ma·na  noun \ˈmä-nə\

Definition of MANA
1:  the power of the elemental forces of nature embodied in an object or person
2:  moral authority :  prestige

Origin of MANA
of Polynesian origin; akin to Hawaiian & Maori mana mana
First Known Use: circa 1843



#23
Lance Botelle

Lance Botelle
  • Members
  • 1 480 messages

look up guano


:D Unless I am mistaken, I believe this could be Eguintir's humorous way of "exclaiming" an admission of a mistake. At least, that would make sense and be rather funny to me. :)

Cheers,
Lance.

#24
rjshae

rjshae
  • Members
  • 4 485 messages

Also, guano serves as the material component of the AD&D Fireball spell... to bring this bunny trail full circle.  :whistle:  ;)