Jump to content

Charon117

Sacred Game Modder
  • Posts

    325
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by Charon117

  1. 42 minutes ago, Flix said:

    So, Dmitriy changed the way soundresources.txt works in CM 1.60.  The original "main" soundresources.txt resides within each language's "locale" folder.  Dmitriy made some coding changes to allow a second soundresources.txt to sit in the game's "client" folder. The extra file can be used to add new custom resources to the game, without having to edit 8 different text files within each locale folder.

    Which means its a code segment style file ála soundprofile.txt, where code segments get added or changed, I assume ?

     

    What about my other questions ?

    18 hours ago, Charon117 said:

    Edit: The next files are:

    • relations.txt
    • soundcluster.txt
    • soundprofile.txt
    • soundresources.txt

    If there is anything I need to know about these files please inform me about it.

     

    Right at the beginning of relations.txt we have some double entries.

    Quote

    -- to Thief (thief/poacher)
    relation = {
        job1 = "JOB_BARD",
        job2 = "JOB_THIEF",
        relation = "I"
    }
    mgr.addrelation(relation);

    relation = {
        job1 = "JOB_BARD",
        job2 = "JOB_THIEF",
        relation = "S"
    }
    mgr.addrelation(relation);

    Can anyone shed light on this ?

    Edit 2: Same goes for the soundcluster.txt, there is one dublicate.

    Quote

    newClusterDesc = {
          clusterId    = CT_TENERGY,
          range        = 1000,
          namePattern  = "W14"
    }
    mgr.editorAddClusterDesc(newClusterDesc);

    newClusterDesc = {
          clusterId    = CT_TENERGY,
          range        = 1000,
          namePattern  = "*T-Energie/*"
    }
    mgr.editorAddClusterDesc(newClusterDesc);

    Edit 3: soundprofiles.txt looks standard, preceed as usual.

     

  2. man Shirkas ending sucks.

     

     

    Edit: The next files are:

    • relations.txt
    • soundcluster.txt
    • soundprofile.txt
    • soundresources.txt

    If there is anything I need to know about these files please inform me about it.

     

    Right at the beginning of relations.txt we have some double entries.

    Quote

    -- to Thief (thief/poacher)
    relation = {
        job1 = "JOB_BARD",
        job2 = "JOB_THIEF",
        relation = "I"
    }
    mgr.addrelation(relation);

    relation = {
        job1 = "JOB_BARD",
        job2 = "JOB_THIEF",
        relation = "S"
    }
    mgr.addrelation(relation);

    Can anyone shed light on this ?

    Edit 2: Same goes for the soundcluster.txt, there is one dublicate.

    Quote

    newClusterDesc = {
          clusterId    = CT_TENERGY,
          range        = 1000,
          namePattern  = "W14"
    }
    mgr.editorAddClusterDesc(newClusterDesc);

    newClusterDesc = {
          clusterId    = CT_TENERGY,
          range        = 1000,
          namePattern  = "*T-Energie/*"
    }
    mgr.editorAddClusterDesc(newClusterDesc);

    Edit 3: soundprofiles.txt looks standard, preceed as usual.

    Edit 4: soundresources.txt has only a single code segment entry. Is this a file ála soundprofile.txt or poidata.txt ?

    push @Flix @dimitrius154

  3. @Flix Does it work ?

     

    Someone somewhere wrote that there might be an AI limitation, and that not more than 5 units can attack the player at teh same time. All units which are not allowed to attack the player would then stand and look around for the hanging gardens of babylon. I, however, didnt find this to be true. I can confirm that at least 40 elite stone throwing monsters can attack the player at the same time. However, melee units indeed show this kind of behaviour as soon as all attacking spots around the characaters model are filled up. Then they dont attack for a substantial amount of time, or until they get attacked.

    On a side note this might be interesting for dimitrius to look into, as ranged AI indeed shows signs of stopping to attack the player if they attacked for a certain period of time. Examples of this would be the stone throwing monsters, which stop shooting after a certain amount of time to leave the player alone for some time, then reengage. Melee units show this behaviour when their pathfinding doesnt find a spot big enough for the unit to attack the player.

    Im bringing this up because model size directly impacts how dangerous a unit can be. The bigger the model, the more difficulties an enemy melee unit has to find a valid spot to attack. The bigger the ranged model the fewer ranged units can stack up and attack the player. Etc ... . Making units bigger can and will make the game easier, while making models smaller will make every situation more dangerous because more units can potentially attack the player.

    Apart from that the movement speed could also need some revamping, making less dangerous enemies faster than they currently are, while making other dangerous ranged enemies like the DOT poison spiting spider slower.

    I will work on a "model size" and "movement speed" overhaul of the units in the game, and proper tools to port such changes across builds.

    Questions for Flix:

    1. Where do I find the speed of units ?
    2. Is there any connection between what I read an enemys name as ingame, and game files, or do I need to search in good faith ?

     

    What do you think ?

  4. 1 hour ago, Isaakk said:

    Np, and a way to nerf it? Seems bugged right now cause it should hit 74-95 but hits like 500-600

     

    offtopic: strange thing it's on old days I could have all maxed out and never crashed to me. Nowadays with 2019 computer it crashes like every 30 min, readed the forum but couldn't find a confirmed solution just workarounds that may or not work, like deleting two dlls, alt + tab etc

    http://darkmatters.org/forums/index.php?/topic/23820-s2gcp16ee21ssc-sacred-2-memory-leaks-and-crashes-the-workaround/

  5. Update:

    I finished working on the Eliza.txt and will start working on the environment.txt. Since the collision.txt does not have any unique identifier to merge or overwrite I made the whole file copyable only.

    Code:

     
    
    int MergeFileEliza(std::string InputDirA,std::string InputDirB, std::string FileNameA)
    
    {
    
    std::cout << "\"" << FileNameA << "\" is being scanned right now. ";
    
    
    
    std::ifstream IStreamA (InputDirA);
    
    std::vector <std::string> VFileA;
    
    std::string SFileA;
    
    while (std::getline(IStreamA, SFileA)){
    
    VFileA.push_back(SFileA);
    
    }
    
    IStreamA.close();
    
    
    
    std::ifstream IStreamB (InputDirB);
    
    std::vector <std::string> VFileB;
    
    std::string SFileB;
    
    while (std::getline(IStreamB, SFileB)){
    
    VFileB.push_back(SFileB);
    
    }
    
    IStreamB.close();
    
    
    
    std::vector<std::string>::iterator iVA = VFileA.begin();
    
    unsigned long long iVA2 = 0;
    
    std::vector<std::string> VKeywords; //since the container wont change I will use array[] next time, I swear.
    
    VKeywords.push_back("mgr.addDlgGroupDlg"); VKeywords.push_back("mgr.addDlgVoices"); VKeywords.push_back("mgr.addDlgAdvanceVoices"); VKeywords.push_back("mgr.addDlgFactionVoices"); VKeywords.push_back("mgr.addDlgCombatVoices");
    
    std::vector<std::string> VKeywords2;
    
    VKeywords2.push_back("group ="); VKeywords2.push_back("race =");
    
    std::string SCurrentLine;
    
    std::string SUniqueIdentifier;
    
    std::vector<std::string>::iterator iVA3; // I will also improve my iterator naming for the next batch of code. Promise.
    
    std::vector<std::string>::iterator iVA4;
    
    std::vector<std::string>::iterator iVA5;
    
    std::vector<std::string>::reverse_iterator iVA6;
    
    std::vector<std::string>::iterator iVA7;
    
    std::vector<std::string>::iterator iVA8;
    
    std::vector<std::string>::iterator iVA9;
    
    
    
    while(iVA != VFileA.end()){
    
    iVA3 = VKeywords.begin();
    
    
    
    while(iVA3 != VKeywords.end()){
    
    
    
    if(VFileA[iVA2].find(VKeywords[std::distance(VKeywords.begin(), iVA3)]) != std::string::npos){
    
    
    
    if(VFileA[iVA2].find(VKeywords[0]) != std::string::npos){
    
    iVA7 = iVA;
    
    
    
    while(iVA7 != VFileA.end()){
    
    if(VFileA[std::distance(VFileA.begin(), iVA7)].find(";") != std::string::npos){
    
    break;
    
    }
    
    
    
    ++iVA7;
    
    }
    
    
    
    if(std::find(VFileB.begin(), VFileB.end(), VFileA[std::distance(VFileA.begin(), iVA)]) != VFileB.end()){
    
    iVA8 = std::find(VFileB.begin(), VFileB.end(), VFileA[std::distance(VFileA.begin(), iVA)]);
    
    iVA9 = iVA8;
    
    
    
    while(iVA9 != VFileB.end()){
    
    if(VFileB[std::distance(VFileB.begin(), iVA9)].find(";") != std::string::npos){
    
    break;
    
    }
    
    
    
    ++iVA9;
    
    }
    
    
    
    iVA8 = VFileB.erase(iVA8, iVA9 + 1);
    
    VFileB.insert(iVA8, iVA, iVA7 + 1);
    
    
    
    }
    
    else{
    
    iVA6 = std::find_if(VFileB.rbegin(), VFileB.rend(), [](const std::string str){return str.find(";") != std::string::npos;});
    
    VFileB.insert(iVA6.base(), iVA, iVA7 + 1);
    
    }
    
    
    
    break;
    
    }
    
    
    
    iVA4 = VKeywords2.begin();
    
    
    
    while(iVA4 != VKeywords2.end()){
    
    if(VFileA[iVA2].find(VKeywords2[std::distance(VKeywords2.begin(), iVA4)]) != std::string::npos){
    
    SCurrentLine = VFileA[iVA2];
    
    std::istringstream SSCurrentLine2(SCurrentLine);
    
    SSCurrentLine2.seekg(VFileA[iVA2].find(VKeywords2[std::distance(VKeywords2.begin(), iVA4)]));
    
    SSCurrentLine2.ignore(100, '"');
    
    std::getline(SSCurrentLine2, SUniqueIdentifier, '"');
    
    SUniqueIdentifier.insert(0, " \"");
    
    SUniqueIdentifier.insert(0, VKeywords2[std::distance(VKeywords2.begin(), iVA4)]);
    
    SUniqueIdentifier.append("\"");
    
    
    
    if(std::find_if(VFileB.begin(), VFileB.end(),
    
    [&VKeywords, &SUniqueIdentifier, &iVA3](const std::string str) {return bool(bool(str.find(VKeywords[std::distance(VKeywords.begin(), iVA3)]) != std::string::npos))
    
    && bool(str.find(SUniqueIdentifier) != std::string::npos);}) != VFileB.end()){
    
    iVA5 = std::find_if(VFileB.begin(), VFileB.end(),
    
    [&VKeywords, &SUniqueIdentifier, &iVA3](const std::string str) {return bool(bool(str.find(VKeywords[std::distance(VKeywords.begin(), iVA3)]) != std::string::npos))
    
    && bool(str.find(SUniqueIdentifier) != std::string::npos);});
    
    std::swap(VFileA[std::distance(VFileA.begin(), iVA)], VFileB[std::distance(VFileB.begin(), iVA5)]);
    
    }
    
    else{
    
    iVA6 = std::find_if(VFileB.rbegin(), VFileB.rend(), [&VKeywords, &iVA3](const std::string str){return str.find(VKeywords[std::distance(VKeywords.begin(), iVA3)]) != std::string::npos;});
    
    VFileB.insert(iVA6.base(), iVA, iVA + 1);
    
    }
    
    }
    
    
    
    ++iVA4;
    
    }
    
    }
    
    
    
    ++iVA3;
    
    }
    
    
    
    ++iVA;
    
    ++iVA2;
    
    }
    
    
    
    //std::cout << "exited the loop" << std::endl;
    
    
    
    std::ofstream OStream(InputDirB);
    
    for (std::vector<std::string>::iterator I = VFileB.begin(); I != VFileB.end(); ++I){
    
    //std::cout << *I << std::endl;
    
    OStream << *I << std::endl;
    
    }
    
    OStream.close();
    
    std::cout << "\"" << FileNameA << "\" has been scanned and merged for elements found." << std::endl;
    
    
    
    return 0;
    
    }

     

     

    Edit: environment.txt has a working modmerge code now.

    Code:

     
    
    int MergeFileEnvironment(std::string InputDirA,std::string InputDirB, std::string FileNameA)
    
    {
    
    std::cout << "\"" << FileNameA << "\" is being scanned right now. ";
    
    
    
    std::ifstream IStreamA (InputDirA);
    
    std::vector <std::string> VFileA;
    
    std::string SFileA;
    
    while (std::getline(IStreamA, SFileA)){
    
    VFileA.push_back(SFileA);
    
    }
    
    IStreamA.close();
    
    
    
    std::ifstream IStreamB (InputDirB);
    
    std::vector <std::string> VFileB;
    
    std::string SFileB;
    
    while (std::getline(IStreamB, SFileB)){
    
    VFileB.push_back(SFileB);
    
    }
    
    IStreamB.close();
    
    
    
    std::vector<std::string> VKeywords = {"local TYPE_WATER", "local TYPE_LAVA", "local TYPE_PLASMA", "local TYPE_TENERGY"};
    
    
    
    for(auto itVK = VKeywords.begin(); itVK != VKeywords.end(); itVK++){
    
    auto itVA2 = std::find_if(VFileA.begin(), VFileA.end(), [&VKeywords, &itVK](const std::string str){return str.find(VKeywords[std::distance(VKeywords.begin(), itVK)]) != std::string::npos;});
    
    
    
    if(itVA2 != VFileA.end()){
    
    auto itVB3 = std::find_if(VFileB.begin(), VFileB.end(), [&VKeywords, &itVK](const std::string str){return str.find(VKeywords[std::distance(VKeywords.begin(), itVK)]) != std::string::npos;});
    
    if(itVB3 != VFileB.end()){
    
    std::swap(VFileA[std::distance(VFileA.begin(), itVA2)], VFileB[std::distance(VFileB.begin(), itVB3)]);
    
    }
    
    }
    
    }
    
    
    
    for(auto itVA = VFileA.begin(); itVA != VFileA.end(); itVA++){
    
    
    
    if(VFileA[std::distance(VFileA.begin(), itVA)].find("mgr.waterTypeCreate") != std::string::npos){
    
    
    
    for(auto itVA2 = itVA; itVA2 != VFileA.begin(); --itVA2){
    
    
    
    if(VFileA[std::distance(VFileA.begin(), itVA2)].find("newWaterType =") != std::string::npos){
    
    
    
    if(std::find_if(VFileB.begin(), VFileB.end(), [&VFileA, &itVA](const std::string str){return str.find(VFileA[std::distance(VFileA.begin(), itVA)]) != std::string::npos;}) != VFileB.end()){
    
    auto itVB3 = std::find_if(VFileB.begin(), VFileB.end(), [&VFileA, &itVA](const std::string str){return str.find(VFileA[std::distance(VFileA.begin(), itVA)]) != std::string::npos;});
    
    
    
    auto itVB4 = itVB3;
    
    for(; itVB4 != VFileB.begin(); --itVB4){
    
    if(VFileB[std::distance(VFileB.begin(), itVB4)].find("newWaterType =") != std::string::npos){
    
    
    
    break;
    
    }
    
    }
    
    itVB4 = VFileB.erase(itVB4, itVB3 + 1);
    
    VFileB.insert(itVB4, itVA2, itVA + 1);
    
    }
    
    
    
    else{
    
    auto itVB5 = std::find_if(VFileB.rbegin(), VFileB.rend(), [](const std::string str){return str.find("mgr.waterTypeCreate") != std::string::npos;});
    
    VFileB.insert(itVB5.base() + 1, itVA2, itVA + 1);
    
    }
    
    
    
    break;
    
    }
    
    }
    
    }
    
    }
    
    
    
    std::ofstream OStream(InputDirB);
    
    for (std::vector<std::string>::iterator I = VFileB.begin(); I != VFileB.end(); ++I){
    
    //std::cout << *I << std::endl;
    
    OStream << *I << std::endl;
    
    }
    
    OStream.close();
    
    
    
    std::cout << "\"" << FileNameA << "\" has been scanned and merged for elements found." << std::endl;
    
    
    
    return 0;
    
    }
    

     

     

    The next files are

    • keycodes.txt
    • minitype.txt
    • patches.txt
    • poidata.txt

    If there is anything I need to know about these files than please inform me about it.

    Edit 2: Keycodes Code has been written.

    Code:

     
    
    int MergeFileKeycodes(std::string InputDirA,std::string InputDirB, std::string FileNameA)
    
    {
    
    cout << "\"" << FileNameA << "\" is being scanned right now. ";
    
    
    
    std::ifstream IStreamA(InputDirA); //This method is x7 times slower than a reasonable fast solution.
    
    std::string SFileA((std::istreambuf_iterator<char>(IStreamA)),
    
    std::istreambuf_iterator<char>());
    
    IStreamA.close();
    
    
    
    std::ifstream IStreamB(InputDirB);
    
    std::string SFileB((std::istreambuf_iterator<char>(IStreamB)),
    
    std::istreambuf_iterator<char>());
    
    IStreamB.close();
    
    
    
    std::istringstream SStreamFileA(SFileA); //naming them so SSFileA and SFileA so similar is a potential source for bugs ?
    
    SStreamFileA.ignore(10000, '{');
    
    
    
    for(std::string SFileASubstring = ""; SFileASubstring.find("}") == std::string::npos;){
    
    SFileASubstring = "";
    
    std::getline(SStreamFileA, SFileASubstring, ',');
    
    
    
    if(SFileASubstring.find('}') != std::string::npos){
    
    break;
    
    }
    
    
    
    if(SFileASubstring.find("=") != std::string::npos){
    
    
    
    SFileASubstring.erase(std::remove_if(SFileASubstring.begin(), SFileASubstring.end(), isspace),SFileASubstring.end()); // dont understand why removing whitespaces is so difficult. Isnt std::replace() easier to use ?
    
    std::istringstream SStreamFileASub(SFileASubstring);
    
    std::string SFileAKeyword;
    
    std::getline(SStreamFileASub, SFileAKeyword, '=');
    
    std::string SFileAKeycode;
    
    SStreamFileASub >> SFileAKeycode;
    
    
    
    SFileAKeyword = ' ' + SFileAKeyword + ' ';
    
    if(unsigned int ICounter = SFileB.find(SFileAKeyword) != std::string::npos){ //initiating ICounter in a for() statement doesnt work, it will always return 1. Propably because it thinks its a bool. Right ?
    
    ICounter = SFileB.find(SFileAKeyword);
    
    
    
    unsigned int ICounter2 = ICounter;
    
    for(; SFileB[ICounter2] != ','; ++ICounter2){}
    
    
    
    SFileB.replace(ICounter, ICounter2 - ICounter, SFileAKeyword + "= " + SFileAKeycode);
    
    
    
    }
    
    else{ //still better than regex
    
    SFileAKeyword.erase(0,1);
    
    SFileAKeyword = '\t' + SFileAKeyword;
    
    if(unsigned int ICounter = SFileB.find(SFileAKeyword) != std::string::npos){
    
    ICounter = SFileB.find(SFileAKeyword);
    
    
    
    unsigned int ICounter2 = ICounter;
    
    for(; SFileB[ICounter2] != ','; ++ICounter2){}
    
    
    
    SFileB.replace(ICounter, ICounter2 - ICounter, SFileAKeyword + "= " + SFileAKeycode);
    
    }
    
    else{
    
    ICounter = SFileB.find('}');
    
    SFileB.insert(ICounter - 1, "\n" + SFileAKeyword + "= " + SFileAKeycode + ',' );
    
    }
    
    }
    
    }
    
    }
    
    
    
    std::ofstream OStream(InputDirB);
    
    OStream << SFileB;
    
    OStream.close();
    
    
    
    std::cout << "\"" << FileNameA << "\" has been scanned and merged for elements found." << std::endl;
    
    
    
    return 0;
    
    }

     

     

    Edit 3: minitype.txt code has been finished.

    Edit 4: patches.txt code has been finished.

  6. I quickly threw together a tool for scaling models in the creatures.txt: Sacred 2 Modelscale.zip

    Normal mobs scaling are defined by not being "monstertype = 1" || "monstertype = 2" || or have behaviour strings like "JOB" and "quest". Its hard to make a good barrier around normal mobs, as this also seems to affect player summons. So tell me if there are identifiable models which should be excluded.

    Elites are defined as "monstertype = 1". Again, if you think something should be included or excluded give me a call.

    Bosses are defined as "monstertype = 2". Same song here.

    You use the tool by copying over the creatuers.txt you want to change into the exe folder, example file is provided, and then run the exe.

    Dont know if the program works on other pcs.

    Source Code is included.

    Unbenannt2.thumb.png.c70654f632276b5b8473af90ec2f4f13.png

    • Like! 1
  7. 12 minutes ago, Flix said:

    The "hacky" way I can think of doing what you're actually asking would be to give every single elite enemy the AI to cast a buff on itself, and then assign it a specially created buff in creatures.txt. Said buff would be created in spells.txt to have no actual properties on it, it would just serve to provide a visual aura.

    The buff would only get cast once the AI notices the player, at which point its prolly too late anyway.

    12 minutes ago, Flix said:

    In D2F I tried to signify elites through model changes, model scaling (bigger = stronger), or texture changes.  What I wanted to do is revamp the spawn.txt pattern of having an elite enemy lead a mob, and instead have champions spawn in their own separate packs like in D2.  The sheer work behind that would be insane though. Literally every spawn entry would have to be edited.

    I like the "bigger" idea. If a champion is only slightly bigger than its normal counteraprt than that would be immediatelly recogniseable. We are humans after all, and size matters to us, which is why even small differences would be quite noticeable. I hope the insane amount of work only concerns the rework of the spawn.txt.

    Also, dont do anything I could do. My bots and programs can usually run through such things effortlessly, as soon as I understand the structure. I cant change models, but text files are no problem to me. Even with half a million code lines its easy once you get a repeatable pattern.

  8. 4 minutes ago, dimitrius154 said:

    Like they do in the Elder Scrolss series, eh?

    Havent played too much of it to answer that. What I have in mind are visual cues for the player to take notice of. An example for the glow on attack would be the heavy attack of the Kraken, where the arms start to glow before he smashes down.

    The aura or miasma for creatures can look like this:

     

    For the other questions I dont have an answer. I will leave that in more capable hands than mine.

  9. @FlixI would like to talk about something I have been noticing for a while and which bothers me a bit about the game.

    CP is nice. EE is nice. Challenge mode is nice. But there was something in vanilla which I thought was quite a bit better. And that is the visual representation of danger and strenght of mobs in comparasion to each other. Here are a few points.

    • Removing the yellow glow was propably necessary to display the unique elite textures, but it also removed the danger signal from those enemies. Running around in vanilla made you instantly realise how many elites were charging at you, making you able to reliably and consistently judge in how much danger you were at any given moment. I already wrote about how I have immense difficulties to differentiate between champions and mobs, and looking at 20 units charging at you gives me zero information about the composition of the mob. While the yellow glow wasnt the prettiest, it got its job done to create danger signals way better than elite textures which players can hardly differentiate, and definitely not at a glance.
    • I heard that in I&B the champions got buffed, to be more differentiated than normal mobs. While this might mostly be a good change, the visual representation of the gained strenght is lacking. Melee attacks, ranged projectiles and model textures pretty much stayed the same to normal ones.
    • Spells visuals are indifferentiated and dont tell you something about their strenght. For instance a normal ogers ice field is exactly the same as a champions one. All young dragonlings fireballs look the same. There is no visual telling between each dragon bosses fire attacks. They all look pretty, but the most important component in an ARPG, the visual danger element, is sorely lacking.
    • The same applies to ranged attacks from normal mobs to champions. Zero difference.

     

    So my wishlist for the shared effort between EE, Addendum, D2F and CP is that the signalling of "danger" is visually improved. Small attacks should look and feel like small attacks, while a big firebal should be a dangerous one. Im not asking for things to be made flashier, I asking for flashier visuals for stronger attacks. Here are a few of my suggestions:

    • Add an aura to champions, which lets you immediatelly tell whether that particularly enemy is stronger than a normal one.
    • Differentiate spells and make the player see the difference between a strong, and a weak spell. Make the projectiles bigger, or flashier or implement a signal that differentiates it from normal mob ones.
    • If a mob uses a CA make the weapon glow differently, to signal a stronger attack. Same for projectiles which are cast by CA.
    • Maybe something can be done for melee attacks ?
    • Rework bosses danger visuals, to be comparable to each other.

     

    All of that is ofcourse a long shot, but I wish that modding effort would go into the direction of a better distinguishable danger map of the game.

    Since I have a lot of other things to do, and lack the experience of modding the game these things will never be done by me, as I lack the time and skill to do it. But I would still appreciate such things done to the game.

  10. Update: I fixed the animation.txt code, as it was completely broken. As a side effect the modmerge system doesnt have a problem with dublicated [base] entries in the modmerge file anymore.

     

    Again, I scanned the collision.txt and found a huge number of dublicates. List is down below. Can someone confirm what happens with the dublicates, and whether its (1) safe to delete them ? Does the last entry get used like in the animation.txt ? And most importantly should modmerge system (2) overwrite unique entries or (3) simply append all entries at the bottom ?

    collision dublicates:

     

    mgr.colvolCreate("models/questitems/t_scifi-switch",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-1",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-a",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-b",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-c",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-d",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-e",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-f",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-g",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-1",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-a",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-b",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-c",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-d",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-e",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-f",colvol)
    mgr.colvolCreate("models/objects/stones/d_fels-wand_02-g",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver01",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver02",colvol)
    mgr.colvolCreate("models/dungeon/d_stdungeon_stoneheap01",colvol)
    mgr.colvolCreate("models/dungeon/d_stdungeon_stoneheap02",colvol)
    mgr.colvolCreate("models/dungeon/d_stdungeon_stoneheap03",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/stationery/h_map",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver01",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver02",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver01",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver02",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver01",colvol)
    mgr.colvolCreate("models/objects/mines/h_orepile-silver02",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot1",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot3",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot7",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot20",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot1",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot3",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot7",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot20",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot1",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot1",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot1",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot3",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot3",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot3",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot7",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot7",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot7",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot20",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot20",colvol)
    mgr.colvolCreate("models/objects/jeweler/t_ingot20",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothheap02-messed",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothheap03-messed",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothheap02-messed",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothheap03-messed",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothbale01",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothbale01",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothbale01",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothbale01",colvol)
    mgr.colvolCreate("models/objects/misc/t_clothbale01",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01a",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01b",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01c",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01d",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01e",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01a",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01b",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01c",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01d",colvol)
    mgr.colvolCreate("models/objects/signs/d_wegweiser-01e",colvol)
    mgr.colvolCreate("models/dungeon/d_stdungeon_stoneheap01",colvol)
    mgr.colvolCreate("models/dungeon/d_stdungeon_stoneheap02",colvol)
    mgr.colvolCreate("models/dungeon/d_stdungeon_stoneheap03",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-a1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-c1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-d1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-e1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-g1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-i1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-j1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-k1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-a1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-c1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-d1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-e1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-g1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-i1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-j1",colvol)
    mgr.colvolCreate("models/objects/stones/lizards/l_lizsteingross-k1",colvol)
    mgr.colvolCreate("models/objects/stationery/d_book01",colvol)
    mgr.colvolCreate("models/objects/stationery/d_book01",colvol)
    mgr.colvolCreate("models/objects/stationery/d_book01",colvol)
    mgr.colvolCreate("models/objects/stationery/d_book01",colvol)
    mgr.colvolCreate("models/questitems/t_scifi-switch",colvol)
    mgr.colvolCreate("models/objects/misc/mg_tft01",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver4",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver4",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_viking-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_viking-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_viking-kadaver3",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign1",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign2",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign3",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign4",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign1",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign1",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign1",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign1",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign2",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign2",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign2",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign3",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign3",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign3",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign4",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign4",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign4",colvol)
    mgr.colvolCreate("models/objects/signs/housesigns/z_housesign4",colvol)
    mgr.colvolCreate("models/objects/misc/mg_tft01",colvol)
    mgr.colvolCreate("models/objects/misc/mg_tft01",colvol)
    mgr.colvolCreate("models/objects/misc/mg_tft01",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver4",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-citizen-kadaver4",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-w-citizen-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver3",colvol)
    mgr.colvolCreate("models/objects/corpses/j_hu-m-soldier-kadaver4",colvol)
    mgr.colvolCreate("models/objects/corpses/j_viking-kadaver1",colvol)
    mgr.colvolCreate("models/objects/corpses/j_viking-kadaver2",colvol)
    mgr.colvolCreate("models/objects/corpses/j_viking-kadaver3",colvol)

    Edit: Eliza.txt doesnt have any dublicates.

    Edit2: Environment.txt doesnt have dublicates either. I will start to work on Eliza.txt and Environment.txt until somebody can tell me what to do with the dublicated entries in collision.txt.

  11. 2 hours ago, Flix said:

    where the author had accidentally added the extra stats twice to the same creature, particularly Undead, making them insanely dangerous.

    Welcome to Challenge mode, where you will spend the first 10 hours in Ancaria from running away from Undead champions, because their triple hit one shots you, no matter what you wear. Also, evade chances means nothing to them. Normal mobs can have a 98% miss chance, but elite undead will hit 100% of their attacks. BEWARE. Dodging not possible.

    Thumbs up, would die again.

    • Haha 1
  12. 3 minutes ago, Flix said:

    How does it decide which ones to delete? What if one entry has more animations defined than another?

     

    Load animation.txt into vector line by line
    Check every line ( vector element ) for element [\"base\"]
    if element has [/"base/"] then
       Load element vector into variable ( eg. "    ["base"] = "models/heroes/seraphim/c_sera_skin//sfafsdfdsfsfsdssd","
       Check Vector again line by line if [base] variable matches any line excluding the the original one
       if it finds one then
          Find Upper Delimeter AnimInfo = { for the original entry
          Find Lower Delimeter mgr.addAnimInfo(AnimInfo) for the original entry
          delete Vector elements by iterator between upper and lower delimeter
       else do nothing

    Lastly trim away multi-new lines to single ones.

    Lets say if you have 6 orc banner dublicates. It first finds the first one, and then checks if it finds a dublicate and finds number 2. Then it deletes entry 1. >> Finds 3 deletes 2, Finds 4 deletes 3. Finds 5, deletes 4. Finds 6 and deletes 5. The endresult is number 6.

     

    Code

    if(SAniDelDub2 == "Yes"){
    
    std::cout << "\n\tDublicated [base] entries are getting removed.\n" << std::endl;
    
    
    
    std::vector<std::string>::iterator itDB = VFileB.begin();
    
    unsigned long long itDB2 = 0;
    
    unsigned long long itDB3 = 0;
    
    std::vector<std::string>::iterator itDB4;
    
    std::vector<std::string>::iterator itDB5;
    
    std::vector<std::string>::iterator itDB6;
    
    std::vector<std::string>::iterator itDB7;
    
    bool NoDublicate;
    
    
    
    while(itDB != VFileB.end()){
    
    itDB3 = VFileB[itDB2].find("[\"base\"]");
    
    
    
    if(itDB3 < 1000000){
    
    for(NoDublicate = false; NoDublicate == false;){
    
    itDB4 = std::find(VFileB.begin(), VFileB.end(), VFileB[itDB2]);
    
    itDB5 = std::find(itDB4 +1, VFileB.end(), VFileB[itDB2]);
    
    
    
    if(itDB5 != VFileB.end()){
    
    for(FoundDelimeter = false, itDB3 = itDB2; FoundDelimeter == false; --itDB3){
    
    if(VFileB[itDB3].find(KUDelimeter) < 100000000){ // allows for a 100kk lines of code, currently animation.txt has 130k lines of code
    
    itDB6 = VFileB.begin() + itDB3;
    
    FoundDelimeter = true;
    
    }
    
    }
    
    
    
    for(FoundDelimeter = false, itDB3 = itDB2; FoundDelimeter == false; ++itDB3){
    
    if(VFileB[itDB3].find(KLDelimeter) < 100000000){ // allows for a 100kk lines of code, currently animation.txt has 130k lines of code
    
    itDB7 = VFileB.begin() + itDB3;
    
    FoundDelimeter = true;
    
    }
    
    }
    
    
    
    std::cout << VFileB[itDB2] << " dublicate has been removed." << std::endl;
    
    VFileB.erase(itDB6, itDB7 + 1);
    
    
    
    //getchar();
    
    }
    
    
    
    if(itDB5 == VFileB.end()){
    
    NoDublicate = true;
    
    }
    
    }
    
    }
    
    
    
    ++itDB;
    
    ++itDB2;
    
    }
    
    }
    

     

  13. I actually wanted to include the fixed EE and Addendum animation.txt but then I realised that you propably have later versions of those. So if you @Flix @dimitrius154 want to send in your animation.txt, than the bot can automatically clean them.

     

    On to the actual news.

    The modmerge system now takes the animation.txt and

    • Removes dublicates in the target file, and trims multi-new-lines to single new lines.
    • Modmerges content based on the unique identifier [base].
    • And as a bonus it makes sure that the modmerged [base] entries have unique [itemType] IDs in the target file.

    A word of advice though, as I found out the modmerge file doesnt take dublicated [base] entries in succession, and it crashes the modmerge system. Now that isnt a problem because the modmerge file shouldnt contain dublicated [base] entries anyway, but on paper the modmerge system also shouldnt have a problem with them. I couldnt find and fix this issue.

  14. So ... ... .... Soooooooooooo ... ... Soooooooooooooooooooooo ...

    I have a lot of undefined behaviour in my program. And as I was saying the modmerge system preserves the build underneath as much as it can. Turns out that the modmerge system assumes that the animation.txt is a "clean" build, that is it doesnt contain dublicates of [base].

    To put it simply, the CP has a dirty animation.txt.

    I would like to discuss with everybody how to solve this problem. I won´t make a modmerge system ontop of broken stuff.

    (1) The best solution ofcourse would be a recompilation of the CP installer. The double hit spell damage for the boss golem needs to be fixed anyway. This is the best solution because people who dont know a lot about modding will not be bothered with a 1000 steps guide.

    (2) The second best solution. Actually release a good, fixed CP patch for CP 1.6. Put it directly beside the download, with RED BIG letters saying its NECESSARY.

    (3) I am most in favour of this suggestion. Since (1) is mostly not to be expected, and (2) is susceptible to inattentive users, I would simply suggest that the Modmerge System automatically removes dublicated [base] entries. This kind of goes against the philosophy of "preserving the build underneath it as much as possible" but I dont think most people will be bothered by the fact that their animation.txt gets cleaned up, if it is true that only the last [base] entry gets taken. I will however softcode that function for users to choose from, to not deviate from the iron principle of preserving the build underneath.

     

    Although, that will be for another day.

  15. 2 minutes ago, dimitrius154 said:

    Creating animation sets while using duplicate [itemtype] entries won't pose a problem. Using duplicate [base] entries would result in the newer animation set overriding the previous for any creature, weapon, or armor that fist the [base] entry mask. 

    Here is an example. The setup file gets checked for each [base], then overwrites exisiting [base] entries in the target file, or appends them if they dont exist. Should the program additionally check whether [itemtype] of the setup file has a unique id in the target file ?

  16. So going back to the topic, what happens if the animation.txt has dublicated [base] entries, and should I use [itemtype] or [base] as the unique identifier for the modmerge system ?

    Edit: Push @dimitrius154 @Flix.

    If we use [itemtype] than people can push dublicated [base]s, and if we take [base] than people can push dublicated [itemtype]s.
    The questions are:

    • Should people be prevented from pushing dublicted [base]s ?
    • Should people be prevented from pushing dublicated [itemtype]s ?
    • What unique identifier should be used ?
  17. The dublicates for the addendum seem pretty identical, but I didnt check it.

    Quote

        ["base"] = "models/objects/animated/d_fish01",
        ["base"] = "models/objects/animated/d_fish02",
        ["base"] = "models/objects/animated/d_fish01",
        ["base"] = "models/objects/animated/d_fish02",
        ["base"] = "models/objects/traps/b_bear-trap-v1",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-a1",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-e1",
        ["base"] = "models/objects/jobitems/v_job-huhn-v1",
        ["base"] = "models/heroes/dryadin/sets/leafs/n_dryade-epic-boots",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/jobitems/t_job-writer-sitwrite-book",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/objects/storage/openable/m_desTruhe01b-op",
        ["base"] = "models/objects/storage/openable/m_drykiste-op-d1",
        ["base"] = "models/questitems/t_artefact",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant01",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant02",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/objects/jobitems/v_job-huhn-v1",
        ["base"] = "models/architecture/hochelfen/pyramidhouse/i_wohnpyramide01-door",
        ["base"] = "models/architecture/hochelfen/pyramidhouse/i_wohnpyramide01-door",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel03_op-b",
        ["base"] = "models/objects/jobitems/t_job-writer-sitwrite-book",
        ["base"] = "models/npc/monsters/mastermonster/v_mastermonster",
        ["base"] = "models/spells/feuerdaemon/h_firemonkey",
        ["base"] = "models/objects/storage/openable/i_box01_op-a",
        ["base"] = "models/objects/storage/openable/i_box01_op-b",
        ["base"] = "models/objects/storage/openable/i_box03_op",
        ["base"] = "models/objects/storage/openable/i_box04_op",
        ["base"] = "models/objects/storage/openable/u_hu-truhe2_op",
        ["base"] = "models/objects/storage/openable/u_hu-truhe3_op",
        ["base"] = "models/questitems/t_scifi-switch",
        ["base"] = "models/architecture/human/cottage/i_hucottage01-door1",
        ["base"] = "models/architecture/human/cottage/i_hucottage02-01-door",
        ["base"] = "models/architecture/misc/jagdhuette/i_jagdhuette01_door",
        ["base"] = "models/architecture/human/cottage/i_hucottage01-door1",
        ["base"] = "models/architecture/human/cottage/i_hucottage02-01-door",
        ["base"] = "models/objects/stones/humans/u_hu-steingross04-te",
        ["base"] = "models/objects/animated/j_fish-mak-dead",
        ["base"] = "models/objects/storage/openable/t_crystal-chest_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-1_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-2_op",
        ["base"] = "models/objects/stones/humans/u_hu-steingross04-te",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant01",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant01",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant02",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant02",
        ["base"] = "models/objects/animated/j_fish-mak-dead",
        ["base"] = "models/objects/traps/b_bear-trap-v1",
        ["base"] = "models/objects/statues/lizards/mg_lizstatue-a1",
        ["base"] = "models/heroes/dryadin/sets/leafs/n_dryade-epic-boots",
        ["base"] = "models/heroes/dryadin/sets/leafs/n_dryade-epic-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/npc/monsters/mastermonster/v_mastermonster",
        ["base"] = "models/questitems/t_ballthrower",
        ["base"] = "models/objects/statues/lizards/mg_lizstatue-a1",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/questitems/t_scifi-switch",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/questitems/t_artefact",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-b",
        ["base"] = "models/objects/storage/openable/i_box01_op-a",
        ["base"] = "models/objects/storage/openable/i_box01_op-b",
        ["base"] = "models/objects/storage/openable/i_box03_op",
        ["base"] = "models/objects/storage/openable/i_box04_op",
        ["base"] = "models/architecture/misc/jagdhuette/i_jagdhuette01_door",
        ["base"] = "models/questitems/t_ballthrower",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-a1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-b1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-c1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-d1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-a1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-b1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-c1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-d1-dest",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-a1",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-e1",
        ["base"] = "models/npc/monsters/dragonfly/h_dragonfly",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine01-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine01-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine02-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine02-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine03-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine03-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine04-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine04-v1",
        ["base"] = "models/objects/storage/openable/t_crystal-chest_op",
        ["base"] = "models/architecture/misc/jagdhuette/i_jagdhuette01_door",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel03_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-a",
        ["base"] = "models/objects/storage/openable/u_hu-truhe2_op",
        ["base"] = "models/objects/storage/openable/m_drykiste-op-d1",
        ["base"] = "models/objects/storage/openable/m_desTruhe01b-op",
        ["base"] = "models/objects/storage/openable/u_hu-truhe3_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-1_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-2_op",
        ["base"] = "models/npc/monsters/dragonfly/h_dragonfly",
        ["base"] = "models/npc/monsters/dragonfly/h_dragonfly",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/spells/feuerdaemon/h_firemonkey",
        ["base"] = "models/spells/feuerdaemon/h_firemonkey",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone01",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone02",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-1_op",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone01",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone02",
        ["base"] = "models/addon/bloodregion/misc/t_teleporter-balloon",
        ["base"] = "models/addon/bloodregion/misc/t_teleporter-balloon",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms2",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms2",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-medium1-dest",

     

    • Thanks! 1
  18. 4 hours ago, Flix said:

    He's wanting to know which [base] entries you are seeing defined more than once, so he can check for duplicates.

    I found one which was used three times by accident.

    I have a little program I use to check for dublicates, I can use it to give feedback.

     

    >> Every entry which is in here occurs multiple times. The list lists multiple occurences multiple times. The file taken is the animation.txt of EE. But I can also run a test on the Addendum one.

    Quote

        ["base"] = "models/objects/animated/d_fish01",
        ["base"] = "models/objects/animated/d_fish02",
        ["base"] = "models/objects/animated/d_fish01",
        ["base"] = "models/objects/animated/d_fish02",
        ["base"] = "models/objects/traps/b_bear-trap-v1",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-a1",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-e1",
        ["base"] = "models/objects/jobitems/v_job-huhn-v1",
        ["base"] = "models/heroes/dryadin/sets/leafs/n_dryade-epic-boots",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/jobitems/t_job-writer-sitwrite-book",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/objects/storage/openable/m_desTruhe01b-op",
        ["base"] = "models/objects/storage/openable/m_drykiste-op-d1",
        ["base"] = "models/questitems/t_artefact",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant01",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant02",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/objects/jobitems/v_job-huhn-v1",
        ["base"] = "models/architecture/hochelfen/pyramidhouse/i_wohnpyramide01-door",
        ["base"] = "models/architecture/hochelfen/pyramidhouse/i_wohnpyramide01-door",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel03_op-b",
        ["base"] = "models/objects/jobitems/t_job-writer-sitwrite-book",
        ["base"] = "models/npc/monsters/mastermonster/v_mastermonster",
        ["base"] = "models/spells/feuerdaemon/h_firemonkey",
        ["base"] = "models/objects/storage/openable/i_box01_op-a",
        ["base"] = "models/objects/storage/openable/i_box01_op-b",
        ["base"] = "models/objects/storage/openable/i_box03_op",
        ["base"] = "models/objects/storage/openable/i_box04_op",
        ["base"] = "models/objects/storage/openable/u_hu-truhe2_op",
        ["base"] = "models/objects/storage/openable/u_hu-truhe3_op",
        ["base"] = "models/questitems/t_scifi-switch",
        ["base"] = "models/architecture/human/cottage/i_hucottage01-door1",
        ["base"] = "models/architecture/human/cottage/i_hucottage02-01-door",
        ["base"] = "models/architecture/misc/jagdhuette/i_jagdhuette01_door",
        ["base"] = "models/architecture/human/cottage/i_hucottage01-door1",
        ["base"] = "models/architecture/human/cottage/i_hucottage02-01-door",
        ["base"] = "models/objects/stones/humans/u_hu-steingross04-te",
        ["base"] = "models/objects/animated/j_fish-mak-dead",
        ["base"] = "models/objects/storage/openable/t_crystal-chest_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-1_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-2_op",
        ["base"] = "models/objects/stones/humans/u_hu-steingross04-te",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner01fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/banner/u_hu-banner02fahne",
        ["base"] = "models/objects/banner/u_hu-banner03fahne",
        ["base"] = "models/objects/banner/u_hu-banner04fahne",
        ["base"] = "models/objects/banner/u_hu-banner05fahne",
        ["base"] = "models/objects/banner/u_hu-banner06fahne",
        ["base"] = "models/objects/banner/u_hu-banner07fahne",
        ["base"] = "models/objects/banner/u_hu-banner08fahne",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/signs/lizards/l_lizzeichen-c1",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner01",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcbanner02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant01",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/misc/orcs/i_orcpennant02",
        ["base"] = "models/objects/misc/orcs/i_orcpennant03",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant01",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant01",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant02",
        ["base"] = "models/objects/misc/goblins/b_goblin-pennant02",
        ["base"] = "models/objects/animated/j_fish-mak-dead",
        ["base"] = "models/objects/traps/b_bear-trap-v1",
        ["base"] = "models/objects/statues/lizards/mg_lizstatue-a1",
        ["base"] = "models/heroes/dryadin/sets/leafs/n_dryade-epic-boots",
        ["base"] = "models/heroes/dryadin/sets/leafs/n_dryade-epic-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-arms",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/heroes/dryadin/sets/ivy/h_dryade-armor03-boots",
        ["base"] = "models/npc/monsters/mastermonster/v_mastermonster",
        ["base"] = "models/questitems/t_ballthrower",
        ["base"] = "models/objects/statues/lizards/mg_lizstatue-a1",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-arms",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-boots",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/heroes/seraphim/sets/std-iron/n_sera-iron-gloves",
        ["base"] = "models/questitems/t_scifi-switch",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/questitems/t_artefact",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-b",
        ["base"] = "models/objects/storage/openable/i_box01_op-a",
        ["base"] = "models/objects/storage/openable/i_box01_op-b",
        ["base"] = "models/objects/storage/openable/i_box03_op",
        ["base"] = "models/objects/storage/openable/i_box04_op",
        ["base"] = "models/architecture/misc/jagdhuette/i_jagdhuette01_door",
        ["base"] = "models/questitems/t_ballthrower",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/standard-dest/t_crystal-standard-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-a1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-b1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-c1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-d1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state2-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state3-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-medium1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state5-small1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-a1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-b1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-c1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystaltrees/levitate-dest/t_crystaltree-levitate-d1-dest",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-a1",
        ["base"] = "models/objects/nature/dryads/l_drypflanze-e1",
        ["base"] = "models/npc/monsters/dragonfly/h_dragonfly",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine01-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine01-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine02-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine02-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine03-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine03-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine04-v1",
        ["base"] = "models/addon/bloodregion/vegetation/t_blood-twine04-v1",
        ["base"] = "models/objects/storage/openable/t_crystal-chest_op",
        ["base"] = "models/architecture/misc/jagdhuette/i_jagdhuette01_door",
        ["base"] = "models/objects/storage/openable/i_barrel02_op-a",
        ["base"] = "models/objects/storage/openable/i_barrel03_op-b",
        ["base"] = "models/objects/storage/openable/i_barrel01_op-a",
        ["base"] = "models/objects/storage/openable/u_hu-truhe2_op",
        ["base"] = "models/objects/storage/openable/m_drykiste-op-d1",
        ["base"] = "models/objects/storage/openable/m_desTruhe01b-op",
        ["base"] = "models/objects/storage/openable/u_hu-truhe3_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-1_op",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-2_op",
        ["base"] = "models/npc/monsters/dragonfly/h_dragonfly",
        ["base"] = "models/npc/monsters/dragonfly/h_dragonfly",
        ["base"] = "models/npc/monsters/chestcreature/h_chestcreature",
        ["base"] = "models/spells/feuerdaemon/h_firemonkey",
        ["base"] = "models/spells/feuerdaemon/h_firemonkey",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone01",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone02",
        ["base"] = "models/objects/storage/openable/mg_SH-stone-with-inscription-1_op",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone01",
        ["base"] = "models/objects/storage/openable/t_blood-chest-stone02",
        ["base"] = "models/addon/bloodregion/misc/t_teleporter-balloon",
        ["base"] = "models/addon/bloodregion/misc/t_teleporter-balloon",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms2",
        ["base"] = "models/heroes/dragonmage/std-generic/t_dmage-generic-arms2",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-big1-dest",
        ["base"] = "models/addon/crystalregion/crystal/crystals/levitate-dest/t_crystal-levitate-state4-medium1-dest",


     

  19. 9 hours ago, dimitrius154 said:

    It doesn't. Which ones are met repeatedly? 

    ?

    There are only 2 possible identifiers in the code segment, [itemtype] and [base]. One is unique, the other one isnt. Its not hard to figure out which one the game uses. Despite your claim that [itemtype] is useless, the game cant look at something which doesnt exist in the file, unless it takes entries by index ( eg. the order in which the segments are written in).

  20. 11 minutes ago, Flix said:

    It used to be that there were separate entries for each individual itemtype, even ones that shared the same base model.  It was discovered these additional entries did nothing, and itemtype did not function to differentiate between entries using the same base models.  The game simply looked at the latter-most entry using the model in question and used that. 

    So the true identifier is ["base"] than ? Can I take that "models/spells/morph/h_draconian-statue" as the unique identifier ?

    >CM Patch 1.60 massively changed animation.txt compared to true vanilla.  Compare Addendum to Sacred 2 Gold base script.  New one is a fraction of the size.

    Size is irrelevant to code, as long as it follows the same structure.

    Edit2: I found some [base] entries were not unqiue, so how does the game differenciate between them than ? Double check with [itemtype] ?

    Edit3: I think all of this gets past the point. Every [itemtype] is unique, even if they use the same texture. So there is nothing speaking against using it as the unique identifer.

×
×
  • Create New...
Please Sign In or Sign Up