ALERROR CLevelTableOfDeviceGenerators::LoadFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // LoadFromXML // // Loads from XML { int i; ALERROR error; m_Count.LoadFromXML(pDesc->GetAttribute(COUNT_ATTRIB)); if (m_Count.IsEmpty()) m_Count.SetConstant(1); for (i = 0; i < pDesc->GetContentElementCount(); i++) { CXMLElement *pEntry = pDesc->GetContentElement(i); SEntry *pNewEntry = m_Table.Insert(); pNewEntry->sLevelFrequency = pEntry->GetAttribute(LEVEL_FREQUENCY_ATTRIB); if (error = IDeviceGenerator::CreateFromXML(Ctx, pEntry, &pNewEntry->pDevice)) { pNewEntry->pDevice = NULL; return error; } } m_iComputedLevel = -1; return NOERROR; }
ALERROR CGroupOfDeviceGenerators::LoadFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // LoadFromXML // // Load from XML { int i; ALERROR error; m_Count.LoadFromXML(pDesc->GetAttribute(COUNT_ATTRIB)); if (m_Count.IsEmpty()) m_Count.SetConstant(1); // Load either a <DeviceSlot> element or another device generator. for (i = 0; i < pDesc->GetContentElementCount(); i++) { CXMLElement *pEntry = pDesc->GetContentElement(i); if (strEquals(pEntry->GetTag(), DEVICE_SLOT_TAG)) { SSlotDesc *pSlotDesc = m_SlotDesc.Insert(); CItem::ParseCriteria(pEntry->GetAttribute(CRITERIA_ATTRIB), &pSlotDesc->Criteria); if (error = IDeviceGenerator::InitDeviceDescFromXML(Ctx, pEntry, &pSlotDesc->DefaultDesc)) return error; pSlotDesc->iMaxCount = pEntry->GetAttributeIntegerBounded(MAX_COUNT_ATTRIB, 0, -1, -1); } else { SEntry *pTableEntry = m_Table.Insert(); pTableEntry->iChance = pEntry->GetAttributeIntegerBounded(CHANCE_ATTRIB, 0, -1, 100); if (error = IDeviceGenerator::CreateFromXML(Ctx, pEntry, &pTableEntry->pDevice)) { pTableEntry->pDevice = NULL; return error; } } } return NOERROR; }
ALERROR CTableOfDeviceGenerators::LoadFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // LoadFromXML // // Load from XML { int i; ALERROR error; m_Count.LoadFromXML(pDesc->GetAttribute(COUNT_ATTRIB)); if (m_Count.IsEmpty()) m_Count.SetConstant(1); m_iTotalChance = 0; int iCount = pDesc->GetContentElementCount(); if (iCount > 0) { m_Table.InsertEmpty(iCount); for (i = 0; i < iCount; i++) { CXMLElement *pEntry = pDesc->GetContentElement(i); m_Table[i].iChance = pEntry->GetAttributeInteger(CHANCE_ATTRIB); m_iTotalChance += m_Table[i].iChance; if (error = IDeviceGenerator::CreateFromXML(Ctx, pEntry, &m_Table[i].pDevice)) { m_Table[i].pDevice = NULL; return error; } } } return NOERROR; }
ALERROR CSingleDevice::LoadFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // LoadFromXML // // Load from XML { ALERROR error; // Load the item type CString sUNID = pDesc->GetAttribute(DEVICE_ID_ATTRIB); if (sUNID.IsBlank()) sUNID = pDesc->GetAttribute(ITEM_ATTRIB); if (error = m_pItemType.LoadUNID(Ctx, sUNID)) return error; if (m_pItemType.GetUNID() == 0) { Ctx.sError = strPatternSubst(CONSTLIT("<%s> element missing item attribute."), pDesc->GetTag()); return ERR_FAIL; } // Load the count m_Count.LoadFromXML(pDesc->GetAttribute(COUNT_ATTRIB)); if (m_Count.IsEmpty()) m_Count.SetConstant(1); // Load damage chance m_iDamaged = pDesc->GetAttributeInteger(DAMAGED_ATTRIB); // Load enhancement chance if (error = m_Enhanced.InitFromXML(Ctx, pDesc)) return error; // Load device position attributes if (pDesc->FindAttributeInteger(POS_Z_ATTRIB, &m_iPosZ)) { m_iPosAngle = pDesc->GetAttributeInteger(POS_ANGLE_ATTRIB); m_iPosRadius = pDesc->GetAttributeInteger(POS_RADIUS_ATTRIB); m_b3DPosition = true; m_bDefaultPos = false; } else if (pDesc->FindAttributeInteger(POS_ANGLE_ATTRIB, &m_iPosAngle)) { m_iPosRadius = pDesc->GetAttributeInteger(POS_RADIUS_ATTRIB); m_iPosZ = 0; m_b3DPosition = false; m_bDefaultPos = false; } else { m_iPosAngle = 0; m_iPosRadius = 0; m_iPosZ = 0; m_b3DPosition = false; m_bDefaultPos = true; } // Load fire arc attributes if (pDesc->FindAttributeInteger(MIN_FIRE_ARC_ATTRIB, &m_iMinFireArc)) { m_bOmnidirectional = false; m_iMaxFireArc = pDesc->GetAttributeInteger(MAX_FIRE_ARC_ATTRIB); m_bDefaultFireArc = false; } else if (pDesc->FindAttributeBool(OMNIDIRECTIONAL_ATTRIB, &m_bOmnidirectional)) { m_iMinFireArc = 0; m_iMaxFireArc = 0; m_bDefaultFireArc = false; } else { m_bOmnidirectional = false; m_iMinFireArc = 0; m_iMaxFireArc = 0; m_bDefaultFireArc = true; } // Linked fire options CString sLinkedFire; if (pDesc->FindAttribute(LINKED_FIRE_ATTRIB, &sLinkedFire)) { if (error = CDeviceClass::ParseLinkedFireOptions(Ctx, sLinkedFire, &m_dwLinkedFireOptions)) return error; m_bDefaultLinkedFire = false; } else { m_dwLinkedFireOptions = 0; m_bDefaultLinkedFire = true; } m_bSecondary = pDesc->GetAttributeBool(SECONDARY_WEAPON_ATTRIB); // Slot bonus if (pDesc->FindAttributeInteger(HP_BONUS_ATTRIB, &m_iSlotBonus)) m_bDefaultSlotBonus = false; else { m_iSlotBonus = 0; m_bDefaultSlotBonus = true; } // Load extra items CXMLElement *pItems = pDesc->GetContentElementByTag(ITEMS_TAG); if (pItems) { if (error = IItemGenerator::CreateFromXML(Ctx, pItems, &m_pExtraItems)) return error; } return NOERROR; }