libsplittermond

libsplittermond ist eine Java-Bibliothek, die es erlaubt Charaktere die z.B. mit dem Genesis erstellt wurden einzulesen. Falls ihr also aufbauend auf den in XML vorliegenden Charakteren ein eigenes Projekt starten wollt, spart euch diese Bibliothek die Arbeit das Ladens und Speicherns.

Die zur Zeit einzige Abhängigkeit ist LOG4J (in Version 1.2).

BEISPIEL

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.file.FileSystems;
import java.nio.file.Files;

import org.prelle.splimo.Skill.SkillType;
import org.prelle.splimo.SkillValue;
import org.prelle.splimo.SpliMoCharacter;
import org.prelle.splimo.SplitterMondCore;

public class LoadCharExample {

  public static void main(String[] args) throws IOException {
    SplitterMondCore.initialize(FileSystems.getDefault());

    File path = (new File("myCharacter.xml"));
    SpliMoCharacter character = SplitterMondCore.load(path.toPath());
        
    System.out.println("Geladen: "+character.dump());

    for (SkillValue skillVal : character.getSkills(SkillType.MAGIC)) {        	
      System.out.println(String.format(
      	"In der Fertigkeit %s hat %s den Wert von %d",
        skillVal.getSkill().getName(),
        character.getName(),
        skillVal.getValue()
        ));
    }
  }
}

Nehmen wir das mal kurz auseinander.

SplitterMondCore.initialize(FileSystems.getDefault());

initialisiert die Regelbibliothek, d.h. es werden alle Daten eingeladen.
Die KlasseSplittermondCoreist grundsätzlich die zentrale Anlaufstelle für alles was ihr so anfragen wollt (Daten von Zaubern, Fertigkeiten, Gegenständen, …).

File path = (new File("myCharacter.xml"));
SpliMoCharacter character = SplitterMondCore.load(path.toPath());

Hier passiert das eigentliche Einladen des Charakters und ist soweit unspektakulär.

for (SkillValue skillVal : character.getSkills(SkillType.MAGIC))
  skillVal.getValue()

liefert alle Zauberfertigkeiten des Charakters zurück – in Form einer Klasse, die sowohl auf den Skill verweist, wie auch den Wert speichert.

Obiges Beispiel liefert letztlich nur den reinen Wert in einer Fertigkeit zurück. Wenn man den konkreten Wert für einen Zauber haben möchte, der sowohl berücksichtigt über welche Schule man den Zauber erworben hat und ob es evtl. Schwerpunktsmeisterschaften gibt, nimmt man

for (SpellValue spell : character.getSpells()) 
  int value = character.getSpellValueFor(spell);

ANMERKUNG ZU ANDROID

Zur Zeit ist die Library nicht unter Android lauffähig. Das liegt weniger an LOG4J (dafür gibt es eine Lösung), sondern vielmehr daran daß wir JAXB zum Lesen und Schreiben der XML-Dateien verwendet haben. Zwar hat sich schon mal jemand die Mühe gemacht JAXB irgendwie unter Android zum Laufen zu bringen, aber erstrebenswert scheint mir diese Lösung nicht.

Wir erwägen JAXB mal rauszuwerfen und auf Simple XML umzusteigen, aber da das ein ziemlich großer Aufwand wäre, ist das zumindest nicht für die nahe Zukunft geplant.