package ring.magic.vancian;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ring.magic.AbstractMagicSystem;
import ring.magic.Spell;
import ring.magic.SpellCaster;
import ring.mobiles.Mobile;
public class VancianSystem extends AbstractMagicSystem<VancianMetadata> {
private List<Spell> spellList = new ArrayList<Spell>();
private Map<Spell, VancianMetadata> metadata = new HashMap<Spell, VancianMetadata>();
private List<Spell> memorizedSpells = new ArrayList<Spell>();
private Mobile caster;
@Override
public void setSpellCaster(SpellCaster caster) {
if (isCompatibleWith(caster)) {
this.caster = (Mobile)caster;
}
}
@Override
public boolean isCompatibleWith(SpellCaster caster) {
if (caster instanceof Mobile) {
return true;
}
else {
return false;
}
}
@Override
public void addSpell(Spell spell) {
spellList.add(spell);
VancianMetadata md = new VancianMetadata();
md.transform(spell.getMetadata());
metadata.put(spell, md);
}
@Override
public boolean canCast(Spell spell) {
//Check if spell is on list
if (!spellList.contains(spell)) {
return false;
}
//Check if the spell is memorized
if (!memorizedSpells.contains(spell)) {
return false;
}
//Make sure that the caster has 10 + the level of the spell
//as the key ability score.
int score = 0;
if (spell.getSource().equalsIgnoreCase("arcane")) {
score = caster.getBaseModel().getIntelligence();
}
else if (spell.getSource().equalsIgnoreCase("divine")) {
score = caster.getBaseModel().getWisdom();
}
VancianMetadata md = getMetadata(spell);
if (score < md.getSpellLevel()) {
return false;
}
//Get level of spell from metadata
return true;
}
@Override
public List<Spell> getCastableSpells() {
return memorizedSpells;
}
@Override
public VancianMetadata getMetadata(Spell spell) {
return metadata.get(spell);
}
@Override
public List<Spell> getSpells() {
return spellList;
}
@Override
public void refreshSpells() {
// TODO Auto-generated method stub
}
@Override
public void refreshSpells(int amount) {
// TODO Auto-generated method stub
}
@Override
public void removeSpell(Spell spell) {
//remove all memorized versions first.
while (memorizedSpells.contains(spell)) {
memorizedSpells.remove(spell);
}
//now remove from spell list
spellList.remove(spell);
}
@Override
public void setSpells(List<Spell> spells) {
spellList = spells;
}
@Override
public void spellCast(Spell spell) {
//Remove from memorized list.
}
@Override
public void spellFizzled(Spell spell) {
//Maybe remove from memorized list?
}
}