Jump to content

Charon117

Sacred Game Modder
  • Posts

    325
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by Charon117

  1. So I made some weird tests today. Test Subject is Dislodged Spirit on EE 2.2 Challenge mode.

    • One of the first things I wanted to test was whether or not Stimulate ( 5% + 5%*CAL RpH%) was acutally stackable up to a 100%. It was.                                                    This means a level 20 disloged spirit disregards any and all cd it might have, meaning you can eat as many runes with Stimulate as you want, as the cd goes down with level. Did you think that Regen per Hit was OP ? BEHOLD Regen per Hit Percent takes it to a completely different planet.
       
    • The other suprising thing is that the debuff actually stacks. I thought it was a one time only thing. But no, it stacks. As far as I tested it only stacks during its duration, eg. every debuff counter stacks as long as its own duration. Now this makes it sound a lot more useful than it is, because attributes mostly only contribute 40% towards hp and dmg. Weirdly enough, spell damage didnt increase with lowered attributes, which means you cant do more spell damage by lowering atttributes with dislodged soul. Kinda weird. Anyway, if you have 55% lowered attributes after the fith hit you have 98% attribute reduction. Thats not bad.  As far as I have confirmed lowered attributes make you more able to hit a target with combat attacks. Not really useful if you keep stacking with a spell, but you never know when this comes in handy. Maybe for a hybrid.
       
    • If a mob dies with lowered attributes, its final lowered max hp will be displayed in the character panel.
       
    • After a rumor that Wildfire actually simply adds 100% of spell damage as physical damage I checked it out, but denied that claim. Wildifire works as advertised, but the tooltip indeed shows a wrong physical/ice 50/50 parameter. The damage that Wildfire does is neglectable, coming in at less than 10% of the combat arts damage.

    Ok, that was a lot, and I am sure the wiki would have mentioned this as a pro, if people would have actually know this. Stimulate removing cd from the CA, debuffs are stackable, and Wildifre more than neglectable.

    This also has big implications, making disloding soul a single target killer without any drawbacks.

    • Thanks! 1
  2. 1 hour ago, Flix said:

    Should be. Is there anything that looks questionable?

    No, rather the opposite, it looks suspiciously correct. Which would be a first, but you never know. I ll let you know if anything looks out of place and keep you updated with all the new and strange things I might encounter.

  3. So I will switch to 2.2 now. I will unlock the next difficulty for my current inquisitor and hope for the best. Does that work ?

    First I will have to save my own personal changes. Then I need to verify data integrity through steam. Then I need to apply CP, then I need to apply EE 2.2, then I need to apply Superspawn, then Challenge mode, and finally I need to apply my own personal changes MANUALLY all again. Im just trying to point out that switching build in all likelyhood is a very tedious process. The Modmerge System should simplify all of that to Veryify Data integrity > Run Modlauncher > Play. Which is why I think the CP should be in a format that the modmerge system can read. Just putting it out there.

    Thx for 2.2 Flix.

     

    Also, if I need concrete data on EE CA which I dont find on the wiki, where do I find that ?

    Edit: I forgot I also need to apply Flixs music mod part 1, 2, 3 and ice part.

  4. Thx for the music Flix. A point to note here is that you have to have your setttings on stereo, or a setting below 5.1. The music in this mod is below 5.1, and if you set it to something higher, due to not existing 5.1+ files, you wont hear any of it.

    Very good mod, Thank you very much.

    Edit: Thats acutally a problem that even the vanilla files have, some of them dont have 5.1+ equivalents, including the credit song.

    • Like! 1
  5. On 12/1/2019 at 1:26 PM, dimitrius154 said:

    Not yet, being busy with applying Sakkara Demon possession as a replacement for the downright hazardous 6-th divine gift. I'm planning to try the tool on a release ready version of the script.  

    Aye.

     

    Edit: creature_id of mgr.addCreatureBpRelation in creatuers.txt is unique. Is it supposed to be that way, or are people supposed to add mgr.addCreatureBpRelation entries for the same creature ? @Flix

     

    Added tab support for better readability:  [Newer Download in later posts] You dont have to like this, I know you like the tool.

  6. I was thinking about it, and I dont think I can preserve them. For the simple reason that comments for mgr.createCreature usually signal a block of such entries ahead like

    -- new
    or
    -- Elite Mounts Begin

    which groups them together. But another modder might have different blocks, Logically merging such blocks is undoable, as you would exclude/include ... anyway, not doable.

    As long as comments match a single entry its no problem to pull them with the entry, but arbitrary block structure goes against what the modmerging system is supposed to do, merging based on code identifiers.
    Although the modmerging system preserves everything in the base file, including comments, so a base Addendum file keeps all its comments, just code identifier segments get swapped out/added. So

    1. Get a clean Sacred 2 Gold version
    2. Apply the latest CP
    3. Apply the latest EE/Addendum
    4. At this point you can use the modmerging system or the modlauncher one. This should preserve all base comments from the base files.

    For the normal user that might be irrelevant, and he can start the modlauncher right after the CP. For dedicated modders its only 1 additional step to preserve their working environment.

     

    @dimitrius154 did you try the Sacred 2 Defrag Creatures tool ?

  7. Fun fact: creatures.txt has 1940 entries with "\tid =" and 4 with "\s\s\s\sid ="

     

    Improvement: The Sacred 2 Defrag Creatures Tool can now properly read mgr.createCreature Code Segment endings, and is no longer confused by any extraneous characters.

    [Newer download in later posts]

     

    Edit: How important is it for the Modmerge System to preserve comments in creatures.txt ? @Flix @dimitrius154

    • Thanks! 1
  8. YAY, its back.

     

    1 hour ago, gogoblender said:

    We're also looking at getting a more powerful and faster "engine" to run downloads, wiki and forum more efficiently as people of late have mentioned that making posts is taking an inordinately long amount of time..  Maybe a stronger hosting with more resources will help with this or Schot will update the Forum's Dbase as well.

    Once you press "Submit Reply" and wait 2 seconds the post will have been sent. At which point you can simply refresh the page. Its a minor inconvenience but the workaround is pretty easy.

    • Respect! 1
  9. Finished  [Newer Download in later posts].

     

    Things to note

    • Please check id = 750, under mgr.createCreature. The closing } has an extraneous white space right after it. Delete it please, otherwise the next entry will get dublicated. That doesnt break anything but we are trying to avoid dublicates, no ?
    • Also check     id = 1582, it is a dublicate.

    Shoutouts to Martin Pool who coded the natural sorting algorithm 15 years ago.

     

    I would appreciate feedback on the satisfaction quality of the program, and ofcourse whether the file actually works or not.

    • Thanks! 1
  10. 35 minutes ago, Flix said:

    Single line. I'm fine with the rest being like it is.  It's really just the presentation of bonuses I'm interested in seeing improved.  Anything else is just icing on the cake.

    Ill give you more icing on the cake than you can carry.

    28 minutes ago, dimitrius154 said:

    I... assume, they can and it will. Judging by the code in question, the actual stings are being compared vs. a mask, as in  if "string" = "intensity".

    I can make the swapping optional, in case it doesnt.

     

    A few more questions to the 2 of you. Does

    Quote

    if not CodeSegment then
        CodeSegment = function(a) end
    end

    have any meaning beyond being present once, and before CodeSegment ?

    Would inline comments in mgr.createskill

    19 hours ago, Charon117 said:
    Quote

    mgr.createSkill {
    --
    --Advanced:
    --optimale Aspektregeneration
        skill_name = "skill_DR_voodoo_focus",
        advance_level = 75,
        min_level = 1,
        mean_value = 200,
        advance_mean_value = 300,
        skillgroup = "SKG_ASPECTS",
        adv_skill_name = "skill_DR_voodoo_adavanced_focus",
    }

     

    work ?

  11. 1 hour ago, Flix said:

    I didn't really want to answer with a yes or no, rather than just describe how I wish the block of creature bonuses looked.

    Ok, than let me tell you my idea of sorting the file:

    mgr.createCreature block. All together.
    mgr.addCreatureBonus block. Sorted by CREATURE NUMBER. I dont really care about single or multi line. Tell me if you prefer either of them.
    mgr.createSkill block. Hopefully I will be able to preserve  comments above, but I would rather want to add them into the code segment.
    mgr.addCreatureSkill block. Same as mgr.addCreatureBonus.
    mgr.addCreatureBpRelation block. Same as mgr.addCreatureBonus. Dont miss that the question for the format repeats here. Seriously, the more you tell me how you want to have it, the easier of a job I have, because guessing is the hardest thing to do.
    mgr.addMapPos block.

    What do you think ?

     

    Edit:

    1 hour ago, Flix said:

    Which is more proper but takes up too much space and it's harder to compare entries at a glance.  If all entries were on a single line, and bonus and intensity were swapped places, then I could do simple line sorting operations in Notepad++ to get all creature bonuses grouped together, and I could also spot duplicates easily, and even combine the duplicates where appropriate. 

    Dont worry. Once my program runs over it all entries will be cleaned, formatted, and sorted by id in a single block for each category, you will literally be able to look at the structure.

     

    @FlixAlso, can they even be swapped ? I mean would the code still work ?

    • Like! 1
  12. 6 hours ago, Flix said:

    mgr.addCreatureBonus( 1187, { -- determines the creature ID that the bonus is added to
        intensity = 200,
        bonus = 54, -- determines the bonus ID as defined in blueprint.txt
    So it takes two lines to make a creature bonus entry unique.

    That is correct, but I was rather thinking along different lines, namely that if somebody adds lets say creature 1187 to the mgr.addCreatureBonus, than the script will draw all mgr.addCreatureBonus( 1187 lines, deletes them, and then draws all mgr.addCreatureBonus( 1187 lines from the merge file, and inserts them. This way modders can add "dublicates" or whatever they want, as long as they know that all mgr.addCreatureBonus( NUMBER form a set. Most importantly it keeps backwards compability.

    So mgr.addCreatureSkill( NUMBER is the creature id, while skill_id or skill_name might be what it does ? Nevertheles it will get the same treatment as mgr.addCreatureBonus, all creature ids form a set.

    With that, this wont be a problem as well:

    6 hours ago, Flix said:

    There is a kink when it comes to Addendum. You can see that in the skills "skill__enemy_focus" and "skill__enemy_lore" there is an extra _ between skill and enemy.  Dmitriy removed this extra character throughout creatures.txt and also spells.txt.  No one else done this in any mods to my knowledge.

     

    6 hours ago, Flix said:

    It is, but the "name =" is also important and should not be changed as questscripts.txt draws on them at times (and not the ID's at all).

    That will be up to the mod authors to insert the correct value.

     

    6 hours ago, Flix said:

    Yes, and there are mirror versions of each of these relations, where id1 and id2 are swapped.

    No problem, the core id will be id1, and it then checks what id2 is.

     

    6 hours ago, Flix said:

    Duplicates in mgr.addCreatureBonus will have their intensity values added together, this is why some mods have had unintentionally overpowered enemies.  I would love to have all the bonuses sorted by creature ID, then bonus ID, then intensity, but the devs decided to script intensity in the middle so it's hard to sort.

    I think you missed this question:

    15 hours ago, Charon117 said:

    So the file looks very messy, code sections repeat, code blocks are inserted in other code blocks, random stuff is thrown around. Do you want me to make a tool that automatically detangles all of that, and gives you a proper file, with the same code and relative order to each other ?

     

    2 hours ago, dimitrius154 said:

    They couldn't, wthout editing binaries references would break. The extra "_" was an obvious typo the original developers had never deigned to correct.

    Dont worry, the merge system doesnt break on that. As long as mod authors supply the correct values the merge system takes everything.

     

    Missed questions:

    15 hours ago, Charon117 said:

    drop.txt has

    • mgr.createDroplist, unique identifier id = NUMBER
    • mgr.createDroppattern, unique identifier: id = NUMBER
    • local shrinkheadDropMap, is table

    A quick test run shows that all id = are unique, just that be kept ?

    15 hours ago, Charon117 said:

    The dragonmage doesnt have starting equipment ?

     

  13. The next files are

    • creatures.txt
    • drop.txt
    • equipsets.txt
    • faction.txt

    For creatures.txt the plan is to straightforwardly make mgr.createCreature entries mergeable, for which I assume the "id =" is the unique identifier. For mgr.addCreatureBonus I will delete entries based on the first number, and then reinsert them based on the mergable content. mgr.createSkill seems a but more complicated. Can you insert the comments into the code block ?

    Quote

    mgr.createSkill {
    --
    --Advanced:
    --optimale Aspektregeneration
        skill_name = "skill_DR_voodoo_focus",
        advance_level = 75,
        min_level = 1,
        mean_value = 200,
        advance_mean_value = 300,
        skillgroup = "SKG_ASPECTS",
        adv_skill_name = "skill_DR_voodoo_adavanced_focus",
    }

    mgr.addCreatureSkill is a mystery to me, everything is dublicates, no value is different from the other, and skill_name is mostly generic. Enlighten me.
    Is the file getting dublicated starting from line 89247 ?

    Let me wrap my head around this. These are the code blocks:

    • mgr.createCreature, unique identifier: id = NUMBER
    • mgr.addCreatureBonus, unique identifier: mgr.addCreatureBonus( NUMBER
    • mgr.createSkill, unique identifier: skill_name = "STRING
    • mgr.addCreatureSkill, unique identifier: mgr.addCreatureSkill( NUMBER
    • mgr.addCreatureBpRelation, unique identifier: creature_id = NUMBER
    • mgr.addMapPos, doesnt have an unique identifier

    So the file looks very messy, code sections repeat, code blocks are inserted in other code blocks, random stuff is thrown around. Do you want me to make a tool that automatically detangles all of that, and gives you a proper file, with the same code and relative order to each other ? Optionally I could also group things together based on the unique id, but that would mess with the order. Thats your call.

     

    drop.txt has

    • mgr.createDroplist, unique identifier id = NUMBER
    • mgr.createDroppattern, unique identifier: id = NUMBER
    • local shrinkheadDropMap, is table

    A quick test run shows that all id = are unique, just that be kept ?

     

    equipsets.txt has

    • mgr.reserveEquipsets, unique
    • local EQUIPSLOT, unique
    • mgr.createEquipset, unique identifier: id = NUMBER

    The dragonmage doesnt have starting equipment ?

     

    faction.txt has

    • mgr.addFaction, unique identifier: id = NUMBER
    • mgr.addFactionRelation, doesnt have a unique id, or rather, the unique id would be id1 and id2 together.

     

     

    I appreciate every input :).

  14. Here is some feedback after my first silver run. EE2.1.

    Sooooooooo ... Silver felt way too hard. It took me up to level 82 to beat Silver, but the Gold difficulty isnt worth mentioning. The difference is that when you start in Gold, you already have all the sets and legendaries from Silver, but in Silver you start pretty much naked. I suggest lowering the bronze and silver difficulty to make even steps towards the gold difficulty. Always keep in mind that the player either has to start in bronze or silver.

    Personally I think the Shirka ending sucked. I have read that you changed it, but havent seen it yet, so based on 2.1 I am giving feedback on how the quest line should have ended better.

    1. If possible, in the jungle waypoint, make the quest go different ways, depending on who you kill first. If you kill the guy first, make it follow the original path, but if you get Shirka first, make the following.
    2. Given that you get Shirka first in the jungle, make the guy survive his "wounds", start a living as a farmer before the boss golem region, and make Shirka follow you (mortal) until you deliver her to him to live a peaceful live. If Shirka dies during that the quest fails. Also give her proper armour and a proper weapon, she was fighting demons barehanded the last time.

    Just some suggestions, take what you want.

    Overall I like the Enhanced Edition experience very much.

     

    On a different note, and this will most likely flow into ESP at a later point, I am very much dissapointed in the variaty of rings the game drops. The only jewely I use are:

    • COCE
    • OCE
    • All SKills
    • All Dmg%

    and thats pretty meager given how many other modifiers there are. I am especially missing rings that increase cast speed, attack speed and run speed. Most of the time these mods are tied to very special items, which makes substituting them before you get your desired drops pretty bad. Even in low % numbers, such items could balance out missing key items in builds before you have them, and make smoother builds until you get what you need. It would also increase the variety of useful jewely there is.

  15. 19 hours ago, Flix said:

    The duplicate you mention, I did not know about until now. I believe this originated with Silver Fox endeavoring to texture Dmitriy's elite mounts pre-CM 1.60.  Much of the Mobiculum textures drew on TG armors. It seems he accidentally created a duplicate, with textures in different places.  I don't know which one controls, but going by the behavior of other files in the client folder, the latter one would override.

    So this throws up some problems.

    (1) Should we continue under the pretense that every file potentially needs a dublicate cleanup ? This would cost a lot of resources, as the cleanup would happen every time the program is started.

    (2) Continue under the pretense that my CP1.6 EE2.1 build contains all dublicated entries if they exist. And add a cleaning tool for each file which has one.

    (3) There would also be solution number 3. Which is that the program instead of modifying the first entry it finds, modifies the last entry it finds. Even if a file has dublicates the relevant entry will be modified. This will cost the least amount of resources, but also needs the confirmation that later entries ALWAYS overwrite earlier ones, otherwise we are just running in circles.

    @Flix @dimitrius154

  16. 16 hours ago, dimitrius154 said:

    By editing I mean "replacing job1, job2 subentries of the duplicate entries with the presumably correct values". I would not recommend deleting anything for now.

    Yes and no. Theorising which are the correct values is up to you and other interested modders. My job is just to know what to do with them. But if nobody knows what to do with them I will simply mark both files as copyable only, until we know more.

     

    blueprint.txt merge code finished, in 2 versions:

     
    
    int MergeFileBlueprint(std::string InputDirA,std::string InputDirB, std::string FileNameA)
    {
        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();
    
        for(auto itVALDelim = VFileA.begin(), itVAUDelim2 = itVALDelim; itVALDelim != VFileA.end(); itVALDelim++){
    
            if (((*itVALDelim).find("newBlueprint =") != std::string::npos) || ((*itVALDelim).find("newBonus =") != std::string::npos) || ((*itVALDelim).find("newBonusgroup =") != std::string::npos)
                    || ((*itVALDelim).find("newBlueprintSet =") != std::string::npos)){
                itVAUDelim2 = itVALDelim;
            }
    
            if(((*itVALDelim).find("mgr.createBlueprint(") != std::string::npos) || ((*itVALDelim).find("mgr.createBonus(") != std::string::npos) ||
                    ((*itVALDelim).find("mgr.createBonusgroup(") != std::string::npos) || ((*itVALDelim).find("mgr.createBlueprintset(") != std::string::npos)){
    
                std::string SLDelimIdentifier;
                if((*itVALDelim).find("mgr.createBlueprint(") != std::string::npos){
                    SLDelimIdentifier = "mgr.createBlueprint(";
                }
                if((*itVALDelim).find("mgr.createBonus(") != std::string::npos){
                    SLDelimIdentifier = "mgr.createBonus(";
                }
                if((*itVALDelim).find("mgr.createBonusgroup(") != std::string::npos){
                    SLDelimIdentifier = "mgr.createBonusgroup(";
                }
                if((*itVALDelim).find("mgr.createBlueprintset(") != std::string::npos){
                    SLDelimIdentifier = "mgr.createBlueprintset(";
                }
    
                if(std::find_if(VFileB.begin(), VFileB.end(), [&itVALDelim](const std::string str){return str.find(*itVALDelim) != std::string::npos;}) != VFileB.end()){
                    auto itVBLDelim3 = std::find_if(VFileB.begin(), VFileB.end(), [&itVALDelim](const std::string str){return str.find(*itVALDelim) != std::string::npos;});
    
                    auto itVBUDelim4 = itVBLDelim3;
                    for(; itVBUDelim4 != VFileB.begin(); --itVBUDelim4){
                        if (((*itVBUDelim4).find("newBlueprint =") != std::string::npos) || ((*itVBUDelim4).find("newBonus =") != std::string::npos) ||
                                ((*itVBUDelim4).find("newBonusgroup =") != std::string::npos) || ((*itVBUDelim4).find("newBlueprintSet =") != std::string::npos)){
                            break;
                        }
                    }
    
                    itVBUDelim4 = VFileB.erase(itVBUDelim4, itVBLDelim3 + 1);
                    VFileB.insert(itVBUDelim4, itVAUDelim2, itVALDelim + 1);
                }
    
                else{
                    auto itVBLDelim5 = std::find_if(VFileB.rbegin(), VFileB.rend(), [&SLDelimIdentifier](const std::string str){return str.find(SLDelimIdentifier) != std::string::npos;});
                    VFileB.insert(itVBLDelim5.base(), itVBLDelim5.base() - 1, itVBLDelim5.base()); //this is crazy
                    itVBLDelim5 = std::find_if(VFileB.rbegin(), VFileB.rend(), [&SLDelimIdentifier](const std::string str){return str.find(SLDelimIdentifier) != std::string::npos;});
                    *itVBLDelim5 = "";
                    VFileB.insert(itVBLDelim5.base(), itVAUDelim2, itVALDelim + 1);
                }
            }
        }
    
        std::ofstream OStream(InputDirB);
        for (std::vector<std::string>::iterator I = VFileB.begin(); I != VFileB.end(); ++I){
             OStream << *I << std::endl;
            }
        OStream.close();
    
        cout << "\"" << FileNameA << "\" has been scanned and merged for elements found." << endl;
    
        return 0;
    }
    
    int MergeFileBlueprint(std::string InputDirA,std::string InputDirB, std::string FileNameA)
    {
        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::array<std::pair<std::string, std::string>, 4> APairDelim =
        {
            {{"newBlueprint =", "mgr.createBlueprint("}, {"newBonus =", "mgr.createBonus("}, {"newBonusgroup =", "mgr.createBonusgroup("}, {"newBlueprintSet =", "mgr.createBlueprintset("}}
        };
    
        for(auto itAPair = APairDelim.begin(); itAPair != APairDelim.end(); itAPair++){
    
            for(auto itVALDelim = VFileA.begin(), itVAUDelim2 = itVALDelim; itVALDelim != VFileA.end(); itVALDelim++){
    
                if ((*itVALDelim).find((*itAPair).first) != std::string::npos){
                    itVAUDelim2 = itVALDelim;
                }
    
                if((*itVALDelim).find((*itAPair).second) != std::string::npos){
    
                    if(std::find_if(VFileB.begin(), VFileB.end(), [&itVALDelim](const std::string str){return str.find(*itVALDelim) != std::string::npos;}) != VFileB.end()){
                        auto itVBLDelim3 = std::find_if(VFileB.begin(), VFileB.end(), [&itVALDelim](const std::string str){return str.find(*itVALDelim) != std::string::npos;});
    
                        auto itVBUDelim4 = itVBLDelim3;
                        for(; itVBUDelim4 != VFileB.begin(); --itVBUDelim4){
                            if((*itVBUDelim4).find((*itAPair).first) != std::string::npos){
                                break;
                            }
                        }
    
                        itVBUDelim4 = VFileB.erase(itVBUDelim4, itVBLDelim3 + 1);
                        VFileB.insert(itVBUDelim4, itVAUDelim2, itVALDelim + 1);
                    }
    
                    else{
                        VFileB.push_back("");
                        auto itVBLDelim5 = std::find_if(VFileB.rbegin(), VFileB.rend(), [&itAPair](const std::string str){return str.find((*itAPair).second) != std::string::npos;});
                        VFileB.insert(itVBLDelim5.base() + 1, itVAUDelim2, itVALDelim + 1);
                    }
                }
            }
        }
    
        std::ofstream OStream(InputDirB);
        for (std::vector<std::string>::iterator I = VFileB.begin(); I != VFileB.end(); ++I){
             OStream << *I << std::endl;
            }
        OStream.close();
    
        cout << "\"" << FileNameA << "\" has been scanned and merged for elements found." << endl;
    
        return 0;
    }

    [\SPOILER]

     

     

    Going on from this and continuing with the surface.txt, are the unique identifiers for that file the line above "diffusePnt    =", and "name         =" ? Quick test results say they are indeed  unique, but "tempelguardian-battery01-te_t".  EEs enhanced Spells has this file which is why I think @Flix will be able to enlighten us about it.

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