コード例 #1
0
Person* DsaDataLoader::processPerson(DOMElement* personXml)
{
    XMLCh* TALENT = XMLString::transcode("Talent");
    XMLCh* ID = XMLString::transcode("ID");
    XMLCh* ABGELEITETER_WERT = XMLString::transcode("AbgeleiteterWert");
    XMLCh* EIGENSCHAFT = XMLString::transcode("Eigenschaft");

    CeGuiString name =
        XmlHelper::getValueAsUtf8(XmlHelper::getChildNamed(personXml, "Name"));
    CeGuiString desc =
        XmlHelper::getValueAsUtf8(XmlHelper::getChildNamed(personXml, "Beschreibung"));

    Person* rval = new Person(name, desc);

    // Eigenschaften laden
    DOMNodeList* eigensch =
        XmlHelper::getChildNamed(personXml, "Eigenschaften")->
        getElementsByTagName(EIGENSCHAFT);
    // Die Eigenschaftsnamen müssen durch ihre Abkürzung ersetzt werden.
    for (unsigned int idx = 0; idx < eigensch->getLength(); idx++)
    {
        DOMElement* eigenschXml = reinterpret_cast<DOMElement*>(eigensch->item(idx));
        CeGuiString eigName = XmlHelper::transcodeToString(eigenschXml->getAttribute(ID));
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_MUT)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_MUT)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_KLUGHEIT)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_KLUGHEIT)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_INTUITION)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_INTUITION)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_CHARISMA)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_CHARISMA)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_FINGERFERTIGKEIT)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_FINGERFERTIGKEIT)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_GEWANDTHEIT)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_GEWANDTHEIT)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_KONSTITUTION)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_KONSTITUTION)->getNameAbbreviation();
        if (eigName == DsaManager::getSingleton().getEigenschaft(E_KOERPERKRAFT)->getName())
            eigName = DsaManager::getSingleton().getEigenschaft(E_KOERPERKRAFT)->getNameAbbreviation();
        int wert = XmlHelper::getValueAsInteger(XmlHelper::getChildNamed(eigenschXml, "Wert"));

        rval->setEigenschaft(eigName, wert);
    }

    // Abgeleitete Werte laden
    DOMNodeList* werte =
        XmlHelper::getChildNamed(personXml, "AbgeleiteteWerte")->
        getElementsByTagName(ABGELEITETER_WERT);
    for (unsigned int idx = 0; idx < werte->getLength(); idx++)
    {
        DOMElement* wertXml = reinterpret_cast<DOMElement*>(werte->item(idx));
        int basis = XmlHelper::getValueAsInteger(XmlHelper::getChildNamed(wertXml, "Basiswert"));
        int wert = XmlHelper::getValueAsInteger(XmlHelper::getChildNamed(wertXml, "Wert"));

        char* wertId = XMLString::transcode(wertXml->getAttribute(ID));
        if (strcmp(wertId, "Lebensenergie") == 0)
            rval->setWert(WERT_MOD_LE, wert - basis);
        else if (strcmp(wertId, "Ausdauer") == 0)
            rval->setWert(WERT_MOD_AU, wert - basis);
        else if (strcmp(wertId, "AttackeBasis") == 0)
            rval->setWert(WERT_MOD_AT, wert - basis);
        else if (strcmp(wertId, "ParadeBasis") == 0)
            rval->setWert(WERT_MOD_PA, wert - basis);
        else if (strcmp(wertId, "FernkampfBasis") == 0)
            rval->setWert(WERT_MOD_FK, wert - basis);
        else if (strcmp(wertId, "InitiativeBasis") == 0)
            rval->setWert(WERT_MOD_INI, wert - basis);
        else if (strcmp(wertId, "Magieresistenz") == 0)
            rval->setWert(WERT_MOD_MR, wert - basis);
        else if (strcmp(wertId, "Astralenergie") == 0)
            rval->setWert(WERT_MOD_AE, wert - basis);
        else if (strcmp(wertId, "Sozialstatus") == 0)
            rval->setWert(WERT_SOZIALSTATUS, wert);

        XMLString::release(&wertId);
    }

    // Talente laden
    // Talente, die direkt unter <Person> angeordnet sind, ergeben bereits die zusammengefassten Werte
    DOMNodeList* talente =
        XmlHelper::getChildNamed(personXml, "Talente")->
        getElementsByTagName(TALENT);
    for (unsigned int idx = 0; idx < talente->getLength(); idx++)
    {
        DOMElement* talentXml = reinterpret_cast<DOMElement*>(talente->item(idx));

        CeGuiString talentName = XmlHelper::transcodeToString(talentXml->getAttribute(ID));

        Talent* tal =
            DsaManager::getSingleton().getTalent(talentName);

        rval->addTalent(talentName);
        rval->setTalent(
            talentName,
            XmlHelper::getValueAsInteger(XmlHelper::getChildNamed(talentXml, "Wert")));
    }

    XMLString::release(&TALENT);
    XMLString::release(&ID);
    XMLString::release(&ABGELEITETER_WERT);
    XMLString::release(&EIGENSCHAFT);

    return rval;
}