// Assigne une nouvelle MP à une creature void AssignerMP( const CSString& creatureName, const CSString& materialName ) { // on regarde si la créature est dégénérée ou non if ( ( creatureName.c_str()[3] != 'c' ) && ( creatureName.c_str()[3] != 'd' ) && ( creatureName.c_str()[3] != 'f' ) && ( creatureName.c_str()[3] != 'j' ) && ( creatureName.c_str()[3] != 'l' ) && ( creatureName.c_str()[3] != 'p' ) ) { } else { // lecture du fichier d'assignement CSString fileName = toString( "%s//_%s_mp.creature", RAW_MATERIAL_ASSIGN.c_str(), creatureName.c_str() ); CSString data; // création si le fichier n'existe pas if(!CFile::fileExists(fileName)) { CSString str; str = "<?xml version=\"1.0\"?>\r\n"; str+= "<FORM Version=\"0.0\" State=\"modified\">\r\n"; str+= " <STRUCT>\r\n"; str+= " <STRUCT Name=\"Harvest\">\r\n"; str+= " </STRUCT>\r\n"; str+= " </STRUCT>\r\n"; str+= " <STRUCT/>\r\n"; str+= " <STRUCT/>\r\n"; str+= " <STRUCT/>\r\n"; str+= " <STRUCT/>\r\n"; str+= "</FORM>\r\n"; str.writeToFile( fileName ); } // lecture data.readFromFile( fileName ); if ( !data.contains( materialName.c_str() ) ) { // on recherche le premier numéro de MP non utilisé CSString str = data; int nb= 0; while ( str.contains( "Name=\"MP" ) ) { str = str.splitFrom( "Name=\"MP" ); nb = str.firstWord().atoi(); } // on insère la nouvelle MP str = " <STRUCT Name=\"MP"; str += toString( "%d\">\r\n <ATOM Name=\"AssociatedItem\"", nb+1 ); str += toString( " Value=\"%s\"/>\r\n </STRUCT>\r\n </STRUCT>\r\n </STRUCT>\r\n", materialName.c_str() ); data = data.replace( " </STRUCT>\r\n </STRUCT>\r\n", str.c_str() ); data.writeToFile( fileName ); } } }
// Retourne le numéro du groupe passé en paramètre int GetNumeroGroupe( const CSString& groupe ) { CSString result; char buffer[100]; char buffer2[100]; int res; // *** Get the group number, and add it to group.typ if not already done // on recherche si le groupe est présent // dans le fichier item_mp_group.typ sprintf( buffer, "%s\" Value=\"", groupe.c_str() ); result = GroupTypContent.splitFrom( buffer ); // si oui, on retourne son numéro de groupe if ( result != "" ) res = result.splitTo( "\"" ).atoi(); else { // sinon, on génère un nouveau numéro : // on recupère le dernier numéro de groupe (le max) result = GroupTypContent.splitTo( "<LOG>" ).right(10); result.splitTo( "\"", true ); result = result.splitTo( "\"" ); // on ajoute 1 pour avoir un numéro non utilisé res = result.atoi() + 1; // on ajoute la nouvelle MP : // dans le fichier item_mp_group.typ sprintf( buffer, "<DEFINITION Label=\"%s\" Value=\"%d\"/>\n<LOG>", groupe.c_str(), res ); GroupTypContent= GroupTypContent.replace( "<LOG>", buffer ); GroupTypContent.writeToFile( ITEM_MP_GROUPE_TYP ); } // *** Add the text in wk.uxt (if not done) // Exist in wk.uxt ??? sprintf( buffer, "mpgroup%d\t", res ); sprintf( buffer2, "mpgroup%d ", res ); // if not found if ( !WKContent.contains(buffer) && !WKContent.contains(buffer2) ) { // add it at end sprintf( buffer, "mpgroup%d\t\t\t[%s]\n\r\nmpSource", res, groupe.c_str() ); WKContent= WKContent.replace( "\r\nmpSource", buffer ); WKContent.writeToFile( WK_UXT ); } return res; }
// Generate _ic_families.forage_source() void SaveFamiliesForageSource() { CSString output; printf( "-- GROUP ICONS FOR _ic_groups.forage_source --\n"); output = "<?xml version=\"1.0\"?>\n"; output+= "<FORM Revision=\"$Revision: 1.9 $\" State=\"modified\">\n"; output+= " <STRUCT>\n"; output+= " <ARRAY Name=\"Icons\">\n"; for ( uint i=0; i!=MPFamilies.size(); ++i ) { output+= toString(" <ATOM Value=\"%s\"/>\n", MPFamilies[i].Icon.c_str()); } output+= " </ARRAY>\n"; output+= " </STRUCT>\n"; output+= " <STRUCT/>\n"; output+= " <STRUCT/>\n"; output+= " <STRUCT/>\n"; output+= " <STRUCT/>\n"; output+= " <LOG></LOG>\n"; output+= "</FORM>\n"; output.writeToFile( IC_FAMILIES_FORAGE_SOURCE.c_str() ); }
// Génération du Primitive Necklace (objet particulier) void CreatePrimitiveNecklace() { CSString output; output = "<?xml version=\"1.0\"?>\n"; output += "<FORM Version=\"0.0\" State=\"modified\">\n"; output += " <PARENT Filename=\"_mc.sitem\"/>\n"; output += " <PARENT Filename=\"_m0696.sitem\"/>\n"; output += " <STRUCT>\n <STRUCT Name=\"mp\">\n"; output += " <ATOM Name=\"MpColor\" Value=\"Beige\"/>\n"; output += " <ATOM Name=\"MaxQuality\" Value=\"250\"/>\n"; output += " <ATOM Name=\"StatEnergy\" Value=\"0\"/>\n"; output += " </STRUCT>\n </STRUCT>\n <STRUCT/>\n <STRUCT/>\n"; output += " <STRUCT/>\n <STRUCT/>\n</FORM>\n"; output.writeToFile( toString( "%scommon\\m0696ixxcc01.sitem", MP_DIRECTORY.c_str() ) ); itemNames.insert( "m0696ixxcc01 Primitive Necklace a the Primitive Necklaces the" ); }
// update all items with new values int updateItems(const char *filename) { // verify file verifItemsFile(filename); CSString data; data.readFromFile(filename); CVectorSString lines; data.splitLines(lines); for (uint itemIndex=0 ; itemIndex<items.size() ; itemIndex++) { nlassert(fields.size() >= items[itemIndex].size()); cout << "Updating item " << itemIndex << endl; uint a, b; getItemBounds(lines, itemIndex, a, b); // no bound found, it's a new item if (b == 0) { addNewItem(lines, itemIndex); getItemBounds(lines, itemIndex, a, b); } for (uint fieldIndex=0 ; fieldIndex<items[itemIndex].size() ; fieldIndex++) updateItemField(lines, itemIndex, fieldIndex, a, b); } // rewrite file data.clear(); for (uint i=0 ; i<lines.size() ; i++) data += lines[i] + "\n"; data.writeToFile(filename); return 0; }
// Génère l'item parent pour une MP void CreateParentSItem( int numMP, const CSString& nomMP, const CSString& groupe, bool dropOrSell, const CSString& icon, const CSString& overlay ) { CSString output; CSString outputFileName; // nom du fichier de sortie outputFileName = toString( "%s_parent\\_m%04d.sitem", MP_DIRECTORY.c_str(), numMP ); // entete xml output = "<?xml version=\"1.0\"?>\n<FORM Version=\"0.0\" State=\"modified\">\n"; // basics output += " <STRUCT>\n <STRUCT Name=\"basics\">\n"; output += " <ATOM Name=\"Drop or Sell\" Value=\""; if ( !dropOrSell ) // il s'agit d'un item de mission, non vendable output += "false\"/>\n"; else // sinon, on peut le vendre output += "true\"/>\n"; output += " <ATOM Name=\"Bulk\" Value=\"0.5\"/>\n </STRUCT>\n"; // mp output += " <STRUCT Name=\"mp\">\n"; output += " <ATOM Name=\"Family\" Value=\""; output += nomMP; output += "\"/>\n <ATOM Name=\"Group\" Value=\""; output += groupe; output += "\"/>\n </STRUCT>\n"; // 3d output += " <STRUCT Name=\"3d\">\n"; if ( icon != "" ) { output += " <ATOM Name=\"icon\" Value=\""; output += icon; output += "\"/>\n"; } if ( overlay != "" ) { output += " <ATOM Name=\"text overlay\" Value=\""; output += overlay; output += "\"/>\n"; } output += " </STRUCT>\n </STRUCT>\n"; // fin du fichier output += " <STRUCT/>\n <STRUCT/>\n <STRUCT/>\n <STRUCT/>\n</FORM>\n"; // écriture finale output.writeToFile( outputFileName ); }
// Nouvelle MP à traiter void NewMP( CSString& ligne ) { CSString nomMP, groupe, loc, icon, overlay, special, stat, specialAttributes; MPCraftStats craftStats; CExtraInfo extraInfo; int numMP; bool specialOnly = false; CSortedStringSet specialNames; // nouveau nom de famille nomMP = ligne.splitTo( ";", true ); if ( nomMP == "" ) { // cette ligne ne contient pas d'info return; } // récupération des infos groupe = ligne.splitTo( ";", true ); craftStats.Craft = ligne.splitTo( ";", true ); specialAttributes= ligne.splitTo( ";" , true ); parseSpecialAttributes(specialAttributes, craftStats, extraInfo); ligne.splitTo( ";" , true ); loc = ligne.splitTo( ";" , true ); icon = ligne.splitTo( ";", true ); ligne.splitTo( ";", true ); ligne.splitTo( ";", true ); ligne.splitTo( ";", true ); stat = ligne.splitTo( ";", true ); if ( stat.firstWord() != "" ) craftStats.bestStatA = stat.atoi(); else craftStats.bestStatA = -1; stat = ligne.splitTo( ";", true ); if ( stat.firstWord() != "" ) craftStats.worstStatA1 = stat.atoi(); else craftStats.worstStatA1 = -1; stat = ligne.splitTo( ";", true ); if ( stat.firstWord() != "" ) craftStats.worstStatA2 = stat.atoi(); else craftStats.worstStatA2 = -1; stat = ligne.splitTo( ";", true ); if ( stat.firstWord() != "" ) craftStats.bestStatB = stat.atoi(); else craftStats.bestStatB = -1; stat = ligne.splitTo( ";", true ); if ( stat.firstWord() != "" ) craftStats.worstStatB1 = stat.atoi(); else craftStats.worstStatB1 = -1; stat = ligne.splitTo( ";", true ); if ( stat.firstWord() != "" ) craftStats.worstStatB2 = stat.atoi(); else craftStats.worstStatB2 = -1; stat = ligne.splitTo( ";", true ); craftStats.color = stat.firstWord().atoi(); stat = ligne.splitTo( ";", true ); specialOnly = stat.firstWord().contains( "x" ); // cas particuliers while ( ligne != "" ) { if ( !ligne.contains( ";" ) ) { special = ligne; if ( special.firstWord() != "" ) specialNames.insert( special ); ligne = ""; } else { special = ligne.splitTo( ";", true ); if ( special != "" ) specialNames.insert( special ); } } currentDocItem.push( DtRMFamily, nomMP ); currentDocItem.push( DtGroup, groupe ); // récupréation du numéro de MP numMP = GetNumeroMP( nomMP ); printf( " Processing Family %d : %s\n", numMP, nomMP.c_str() ); GetNumeroGroupe( groupe ); // Add the MPFamily into the list if(numMP>=(sint)MPFamilies.size()) MPFamilies.resize(numMP+1); MPFamilies[numMP].Name= nomMP; MPFamilies[numMP].Icon= icon; // MP trouvées dans les déposits ou dans la goo if ( loc.left(1) != "C" ) { if ( !specialOnly ) { // Génération des items GenerateDepositItems( numMP, nomMP, craftStats, loc ); } // on enregistre les items se trouvant dans les deposits if ( loc.left(1) == "D" ) { CSString output; output.writeToFile( toString( "%s%s_%d.mp", DEPOSIT_MPS.c_str(), nomMP.toLower().replace( " ", "_" ).c_str(), numMP ) ); } overlay = nomMP.firstWord().toUpper().left(6); } // MP trouvées sur les creature else { GenerateCreatureItems( numMP, nomMP, craftStats ); } // items spéciaux CSString codeSpecial, nouveauCode; int variation = 1; CSortedStringSet::const_iterator it = specialNames.begin(); while ( it != specialNames.end() ) { CSString name = (*it); nouveauCode = name.left(2).toLower(); if ( nouveauCode == codeSpecial ) variation++; else variation = 1; GenerateSpecialItem( numMP, nomMP, craftStats, loc, name, variation ); codeSpecial = nouveauCode; it++; } // Création de la fiche parente pour la MP CreateParentSItem( numMP, nomMP, groupe, extraInfo.DropOrSell, icon, overlay ); currentDocItem.reset( DtRMFamily ); currentDocItem.reset( DtGroup ); currentDocItem.reset( DtProp ); currentDocItem.reset( DtCreature ); }