public override bool Prepare(Monster m)
		{
			parent = m;
			InputOtherAction dialog = new InputOtherAction();
			dialog.ActivateKeywords();
			if (dialog.ShowDialog() == DialogResult.OK)
			{
				keywords = dialog.Keywords;
				abilityType = dialog.AbilityType;

				name = "[" + dialog.AbilityName + "]";
				slotCost = dialog.SlotCost;
				notes = dialog.Notes;

				//if it's an action
				if (abilityType == AbilityType.Action)
				{
					if (keywords.Contains(Keyword.Weapon))
					{
						//handle this shit differently!!!
						weaponDelayMod = dialog.DelayMod;
						weaponFloorMod = dialog.FloorMod;
						weaponCoSMod = dialog.CoSMod;
						weaponPowMod = dialog.PowerMod;
						weaponPowModPerTier = dialog.PowerModPerTier;
						weaponDice = dialog.DieMod;
						weaponDicePerTier = dialog.DieModPerTier;
						weaponPowerMult = dialog.PowerMultiplier;
						weaponTargetType = dialog.TargetType;
						weaponMPCost = dialog.MP;
						weaponMPCostPerTier = dialog.MPPerTier;
						weaponCTCost = dialog.CT;
						if (weaponTargetType == TargetType.Null)
						{
							weaponTargetType = TargetType.Single;
						}
						type = AttackType.Physical;
					}
					else
					{
						type = dialog.AttackType;
						//it's a Aimed or Magic or some shit
						baseDelay = dialog.Delay;
						target = dialog.TargetType;
						baseCos = dialog.CoS;
						baseFloor = dialog.Floor;
						mp = dialog.MP;
						mpPerTierAfterOne = dialog.MPPerTier;
						chargeTime = dialog.CT;
						if (type == AttackType.Physical || type == AttackType.Magical )
						{
							basePower = dialog.BasePower;
							powerPerTierAfterOne = dialog.PowerPerTier;
							dice = dialog.Dice;
							diePerTierAfterOne = dialog.DicePerTier;
							dieType = dialog.DieType;
							baseElement = dialog.Element;
						}
					}
				}
				else if (abilityType == AbilityType.Support)
				{
					type = AttackType.Null;
					target = TargetType.Null;
					//don't need to do anything else here!
				}
				else if (abilityType == AbilityType.Reaction)
				{
					type = AttackType.Null;
					target = TargetType.Null;
				}
				else
				{
					//wtf?
				}
				return true;
			}
			else
			{
				return false;
			}
		}
		public override void Edit(Monster monster)
		{
			InputOtherAction dialog = new InputOtherAction();
			dialog.SlotsRemaining = parent.SlotsRemaining;
			dialog.AbilityName = name;
			dialog.SlotCost = slotCost;
			dialog.Notes = notes;
			//populate dialog keywords, make sure if weapon keyword it shows correct boxes!
			dialog.Keywords = keywords;
			dialog.ActivateKeywords();
			dialog.AbilityType = abilityType;
			dialog.Element = baseElement;
			if (abilityType == AbilityType.Action)
			{
				if (this.keywords.Contains(Keyword.Weapon))
				{
					dialog.DelayMod = weaponDelayMod;
					dialog.FloorMod = weaponFloorMod;
					dialog.MP = weaponMPCost;
					dialog.MPPerTier = weaponMPCostPerTier;
					dialog.CT = weaponCTCost;
					dialog.CoSMod = weaponCoSMod;
					dialog.TargetType = weaponTargetType;
					dialog.DieMod = weaponDice;
					dialog.DieModPerTier = weaponDicePerTier;
					dialog.PowerMod = weaponPowMod;
					dialog.PowerModPerTier = weaponPowModPerTier;
					dialog.PowerMultiplier = weaponPowerMult;
				}
				else
				{
					dialog.Delay = baseDelay;
					dialog.Floor = baseFloor;
					dialog.MP = mp;
					dialog.MPPerTier = mpPerTierAfterOne;
					dialog.CT = chargeTime;
					dialog.CoS = baseCos;
					dialog.TargetType = target;
					dialog.DieType = dieType;
					dialog.AttackType = type;
					dialog.Dice = dice;
					dialog.DicePerTier = diePerTierAfterOne;
					dialog.BasePower = basePower;
					dialog.PowerPerTier = powerPerTierAfterOne;
				}
			}
			if (dialog.ShowDialog() == DialogResult.OK)
			{
				int slotCostDifference = dialog.SlotCost - slotCost;
				if (slotCostDifference <= parent.SlotsRemaining)
				{
					//update keywords list based on dialog results
					slotCost = dialog.SlotCost;
					name = "[" + dialog.AbilityName + "]";
					notes = dialog.Notes;
					abilityType = dialog.AbilityType;
					baseElement = dialog.Element;
					if (abilityType == AbilityType.Action)
					{
						if (this.keywords.Contains(Keyword.Weapon))
						{
							weaponTargetType = dialog.TargetType;
							weaponDelayMod = dialog.Delay;
							weaponCoSMod = dialog.CoS;
							weaponFloorMod = dialog.Floor;
							weaponCTCost = dialog.CT;
							weaponDice = dialog.DieMod;
							weaponDicePerTier = dialog.DieModPerTier;
							weaponMPCost = dialog.MP;
							weaponMPCostPerTier = dialog.MPPerTier;
							weaponPowerMult = dialog.PowerMultiplier;
							weaponPowMod = dialog.PowerMod;
							weaponPowModPerTier = dialog.PowerModPerTier;
						}
						else
						{
							baseDelay = dialog.Delay;
							baseFloor = dialog.Floor;
							mp = dialog.MP;
							mpPerTierAfterOne = dialog.MPPerTier;
							chargeTime = dialog.CT;
							baseCos = dialog.CoS;
							basePower = dialog.BasePower;
							powerPerTierAfterOne = dialog.PowerPerTier;
							dice = dialog.Dice;
							diePerTierAfterOne = dialog.DicePerTier;
							dieType = dialog.DieType;
							target = dialog.TargetType;
							type = dialog.AttackType;
						}
					}
					else
					{
						//reaction or support are treated identically at this point
						target = TargetType.Null;
						type = AttackType.Null;
					}
				}
				else
				{
					Complain(5);
				}
			}
		}