void CSObject::clone(CSObject* obj) { if (!obj) return; // let the object serialize itself into our attributes structure IAttributes* attr = getDevice()->getFileSystem()->createEmptyAttributes(getDriver()); SAttributeReadWriteOptions options; serializeAttributes(attr); obj->deserializeAttributes(attr); attr->drop(); }
bool kx::SaveGame() { fileSys->changeWorkingDirectoryTo( kxBaseDir ); // kxBaseDir/saves/saveName.kxSave stringw saveName = saveEditBox->getText(); path filename = "./saves/"; filename += saveName; filename += ".kxs"; IWriteFile* file = fileSys->createAndWriteFile( filename ); if (!file) { std::cout<< "Error: couldn't create save file" << endl; return false; } else { IXMLWriter* writer = fileSys->createXMLWriter( file ); if (!writer) { std::cout<< "Error: couldn't create XML writer" << std::endl; return false; } else { writer->writeXMLHeader(); const wchar_t* saveElement = L"kxSave"; writer->writeElement( saveElement ); writer->writeLineBreak(); IAttributes* attr = fileSys->createEmptyAttributes(); attr->addInt( "activeLevelNum", activeLevel->num ); attr->addInt( "activeLevelProgress", activeLevel->progress ); // add more attrib here... attr->write( writer ); attr->drop(); writer->writeClosingTag( saveElement ); writer->drop(); file->drop(); messages = ""; // reset messages += L"Saved "; messages += saveName; messages += L".kxs"; messagesNumLines= 1; return true; } } return false; }
int CSLevel::loadPrefab(stringc filename) { CS_LOG(CSLOGTYPE::CSL_DEBUG, "Loading prefab %s", filename.c_str()); int id = 0; stringc dir(getApplication()->getDirectory("PrefabDirectory")); dir += filename; IXMLReader* reader = getDevice()->getFileSystem()->createXMLReader(filename); if (!reader) { CS_LOG(CSLOGTYPE::CSL_WARNING, "Warning! unable to open prefab file %s", filename.c_str()); return -1; } // read file while (reader->read()) { switch (reader->getNodeType()) { case io::EXN_ELEMENT: stringw name = reader->getNodeName(); if (stringw("CSOBJECT") == name) { stringw type = reader->getAttributeValueSafe(L"TYPE"); CSObject* obj = getObjectFactory()->createObjectByType(stringc(type)); if (obj) { id = obj->getId(); IAttributes* attr = getDevice()->getFileSystem()->createEmptyAttributes(getDriver()); attr->read(reader, false); obj->deserializeAttributes(attr); obj->setId(id); obj->reCreate(); attr->drop(); } } } } reader->drop(); return id; }
int CSObject::loadFromPreFab(stringc filename) { int id = 0; stringc dir(getLevel()->getApplication()->getDirectory("PrefabDirectory")); dir += filename; CS_LOG(CSLOGTYPE::CSL_DEBUG, "Loading from prefab directory %s", dir.c_str()); IXMLReader* reader = getDevice()->getFileSystem()->createXMLReader(dir); CS_CHECK_BOOL(reader, CSLOGTYPE::CSL_DEBUG, "Warning! unable to open prefab file"); // read file while (reader->read()) { switch (reader->getNodeType()) { case io::EXN_ELEMENT: { stringw name = reader->getNodeName(); if (stringw("CSOBJECT") == name) { stringw type = reader->getAttributeValueSafe(L"TYPE"); IAttributes* attr = getDevice()->getFileSystem()->createEmptyAttributes(getDriver()); attr->read(reader, false); deserializeAttributes(attr); setId(getLevel()->getObjectFactory()->getObjectManager()->getUniqueId()); attr->drop(); } } } } reader->drop(); return id; }
bool CSLevel::savePrefab(CSObject* obj, stringc filename) { CS_LOG(CSLOGTYPE::CSL_DEBUG, "Saving prefab to file %s", filename.c_str()); CS_CHECK_BOOL(obj, CSLOGTYPE::CSL_WARNING, "Warning unable to save prefab. obj is not valid"); _chdir(getApplication()->getDirectory("PrefabDirectory").c_str()); IXMLWriter* writer = getDevice()->getFileSystem()->createXMLWriter(filename); if (!writer) { CS_LOG(CSLOGTYPE::CSL_WARNING, "Warning! unable to create prefab file %s", filename.c_str()); return false; } writer->writeXMLHeader(); stringw name("CSOBJECT"); writer->writeElement(name.c_str(), false, L"TYPE", stringw(obj->getInfo()->getName()).c_str()); writer->writeLineBreak(); IAttributes* attr = getDevice()->getFileSystem()->createEmptyAttributes(getDriver()); SAttributeReadWriteOptions options; obj->serializeAttributes(attr, &options); if (attr->getAttributeCount() != 0) { attr->write(writer); writer->writeLineBreak(); } attr->drop(); writer->writeClosingTag(name.c_str()); writer->writeLineBreak(); writer->writeLineBreak(); writer->drop(); return true; }
// load the level objects from disk file bool CSLevel::loadFromDisk(stringc filename, bool destroyOld) { CS_LOG(CSLOGTYPE::CSL_DEBUG, "*************************** Loading level from file %s ***************************", filename.c_str()); if (destroyOld) clear(); // attempt to open the file IXMLReader* reader = getDevice()->getFileSystem()->createXMLReader(filename); if (!reader) { CS_LOG(CSLOGTYPE::CSL_WARNING, "Warning! unable to open file %s", filename.c_str()); return false; } // read file while (reader->read()) { // based on the node type switch (reader->getNodeType()) { case io::EXN_ELEMENT: { // get the node name stringw name = reader->getNodeName(); // if this is an object definition if (stringw("CAMERA") == name) { stringw pos = reader->getAttributeValueSafe(L"POSITION"); stringw tar = reader->getAttributeValueSafe(L"TARGET"); if (getCamera()) { getCamera()->setPosition(stringcToVector3df(stringc(pos))); getCamera()->setTarget(stringcToVector3df(stringc(tar))); } else CS_LOG(CSLOGTYPE::CSL_WARNING, "no camera in game save file"); } // if this is an object definition if (stringw("CSOBJECT") == name) { // get the object type stringw type = reader->getAttributeValueSafe(L"TYPE"); // attempt to create the object CSObject* obj = getObjectFactory()->createObjectByType(stringc(type)); if (obj) { // load the attributes from the file IAttributes* attr = getDevice()->getFileSystem()->createEmptyAttributes(getDriver()); attr->read(reader, false); // let the object deserialize from the attributes obj->deserializeAttributes(attr); // recreate the object using the new attribtues obj->reCreate(); // drop the pointer attr->drop(); } } } } } // drop the reader reader->drop(); CS_LOG(CSLOGTYPE::CSL_DEBUG, "*************************** finished Loading level from file %s ***************************", filename.c_str()); // everything went fine return true; }
// save the level objects to disk file bool CSLevel::saveToDisk(stringc filename) { // log this event CS_LOG(CSLOGTYPE::CSL_DEBUG, "Saving game data - %s", filename.c_str()); // creat ethe xml writer IXMLWriter* writer = getDevice()->getFileSystem()->createXMLWriter(filename); if (!writer) { CS_LOG(CSLOGTYPE::CSL_WARNING, "Warning! unable to create save file %s", filename.c_str()); return false; } // write the xml header writer->writeXMLHeader(); vector3df pos(0, 0, 0); vector3df tar(0, 0, 0); if (getCamera()) { pos = getCamera()->getPosition(); tar = getCamera()->getTarget(); } // write the camera position and target writer->writeLineBreak(); writer->writeElement(L"CAMERA", false, L"POSITION", stringw(vector3dfToStringc(pos)).c_str(), L"TARGET", stringw(vector3dfToStringc(tar)).c_str() ); writer->writeLineBreak(); writer->writeLineBreak(); // run through thte list of objects CSObject* obj = getObjectFactory()->getObjectManager()->getNextObject(true); while (obj) { // if this is not a debug object, then save it to disk if (!obj->getDebugObject()) { // write the node type stringw name("CSOBJECT"); writer->writeElement(name.c_str(), false, L"TYPE", stringw(obj->getInfo()->getName()).c_str()); writer->writeLineBreak(); // let the object serialize itself into our attributes structure IAttributes* attr = getDevice()->getFileSystem()->createEmptyAttributes(getDriver()); SAttributeReadWriteOptions options; obj->serializeAttributes(attr, &options); // if there are attributes if (attr->getAttributeCount() != 0) { // write the attributes to the xml file attr->write(writer); // make the file pretty writer->writeLineBreak(); } // drop the pointer attr->drop(); // finish writing the xml header / footer writer->writeClosingTag(name.c_str()); writer->writeLineBreak(); writer->writeLineBreak(); } // get the next object obj = getObjectFactory()->getObjectManager()->getNextObject(false); } // drop the pointer writer->drop(); // everything went fine return true; }