Tool: make WEU maps openable WE

Level 16
Joined
Jul 26, 2008
Messages
1,184
Hi Ghostwolf! I forgot to mention that I fully translated that campaign without problems, thanks to your tool! I added you to the special thanks section (it is temporarily removed because I uploaded the wrong version).
Anyway, I used your tool to convert another campaign, and it came across the following issue: ( the first picture is the error that popped up directly after saving, and the second picture was a consequent one I took)



upload_2018-7-6_23-28-0.png




upload_2018-7-6_23-29-39.png







Based on the fact that it had YDWE in it, I'm guessing its jass YDWE thing that I need to fix myself, but I am posting it just in case it is not. Anyway, that was the only issue for the entire campaign, which is a super compliment to your tool!

Edit1: Interesting Fact. One of the maps constantly gave me memory crash errors on the version it was made (I might have been given a test version of the campaign, not sure), but after using your tool, I could open it and play it on 1.29. Hilarious.
 
Last edited:
Level 16
Joined
Jul 26, 2008
Messages
1,184
Hihi ghostwolf!
Sorry to bother you again. I was just wondering if you had altered the code recently that would affect the map saving.

I used your tool, and everything works fine. I saved every map and it was all fine. But when i was going back to correct a small error today, I saved a map (01), but then it gave me an error, and started listing everything single imported resource in use in the campaign as being unable to be added to the archive:


upload_2018-7-11_0-22-27.png




I am not sure how many it could not archive, since I had to alt +f4 to exit. I will keep looking into it. Its just that I have never seen this error before.


Edit1: I have noticed the campaign is now saving at 1/5 of the time that it normally would.

Edit2: I have tried to recreate the issue multiple times. The long saving time persists, but for one time, it did not error, even though I did nothing different. I first thought it was me copy pasting things with spaces at the end that was causing it, but it seems random.
 
Last edited:
Level 28
Joined
Jul 29, 2007
Messages
5,115
I have stopped developing the viewer, which this is a part of, so I am probably not going to work on this more. That being said, I don't mind checking if I messed something up, however I deleted lots and lots of models, maps, and other mess I had, and the campaign was one of the files, so you'll have to upload it again, sorry.
 
Level 16
Joined
Jul 26, 2008
Messages
1,184
That is the most terrible news I could hear. Well, I still appreciate what you have done, and you are in the special thanks section for the current translated campaign and all other ones that I use your converter for. Just out of curiosity, by discontinuing your tool, will it still be available for just but just not developed, or will it be taken down completely.

As for the file, let me quickly see how many times I can recreate the error first so if I can narrow the possibilities down, since right now it's very random.

Edit1: Just incase the error persists, would you need the pre-converted file or post-converted file
 
Last edited:
Level 28
Joined
Jul 29, 2007
Messages
5,115
Nothing will be taken down, it's all open source in the first place.

If the issue is really with the converter and not something else, I would need the pre-converted file.

/Edit

Added conversions from 1.29 PTR functions to their equivalent non-PTR functions.
E.g. SetHeroProperName -> BlzSetHeroProperName.

PlaySpecialEffect and PlaySpecialEffectWithTimeScale are defined in 1.29 PTR, but not in 1.29, and thus require the 1.30 PTR, if they were used.
 
Last edited:
Level 28
Joined
Jul 29, 2007
Messages
5,115
Added string table inlining, to avoid losing the strings.
Due to silly limits on the amount of text that can be put in a custom script (259 characters?), and due to not knowing the final size of a custom script when converting strings that are a part of it, a function in the map header will be added for each inlined string, which simply returns it.
 
  • Like
Reactions: pyf
Level 16
Joined
Jul 26, 2008
Messages
1,184
Nothing will be taken down, it's all open source in the first place.

If the issue is really with the converter and not something else, I would need the pre-converted file.

/Edit

Added conversions from 1.29 PTR functions to their equivalent non-PTR functions.
E.g. SetHeroProperName -> BlzSetHeroProperName.

PlaySpecialEffect and PlaySpecialEffectWithTimeScale are defined in 1.29 PTR, but not in 1.29, and thus require the 1.30 PTR, if they were used.
Hi ghostwolf, I thought I had replied to you earlier. That issue I encountered seemed to be a one time thing. Everything else is working fine. Your tool is a really amazing bridge to allow us to convert non standard GUI back to the normal editor. Thank you! If you do ever decide to pick this up again (I know you dropped it), feel free to drop a line. It is a really fantastic tool.
 
Level 16
Joined
Jul 26, 2008
Messages
1,184
What do you mean by pick up? I am not aware of anything blatantly missing. If you have an example of something that it can't handle, don't hesitate to upload it.
Sorry for the late reply. What I meant by my statement was I assumed you were dropping it in the sense that if I ever encountered any triggers that were foreign to your tool, I should not bother posting them.
I would be happy to post anything that it cannot convert (of course it will only be GUI, I won't mention the jass functions).
 

Attachments

  • upload_2018-9-17_0-30-46.png
    upload_2018-9-17_0-30-46.png
    621.3 KB · Views: 298
Last edited:
I tired this tool and it is awesome. There was some issues with converting (gui action from WEU have been failing during converting - and I replaced them with custom script, which call WEU functions for actions).
But. Still when I load map in editor of WE 1.29 - I got compile error for maps which have WEU additional functions

for example

Line 9104 :function TributeGold takes player Commander, player Comp, integer res_amount returns nothing

Line 9277 :function Commander takes nothing returns nothing

Is there any idea how to solve this? I tried to use WEX of the sharpcraft - but failed to open it. It cannot find war3.mpq
WEXCrash.jpg
 
Level 4
Joined
Jul 18, 2007
Messages
106
Very strange, my map isn't opening and the error being given is "trigger data missing or invalid". The odd thing is, it's almost identical to my other maps as in it was created around the same time and those were opened fine here: Opening a Map that was used with UMSWE

I attached the map below, both the normal and ones ran through the tool. I also provided the exact information given when using the tool. Does anyone have any idea why it wouldn't be opening this particular one correctly? Thanks.

Loading Flamehowl.w3x...
Checking
inlinecustomscript: Trigger Multiboard Initialization
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Minimap
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Short Mode > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Shuffle Players > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinegui: Trigger Determining Player > OperatorComparePlayer
inlinegui: Trigger Determining Player Copy > OperatorComparePlayer
inlinegui: Trigger Determining Player Pirates > OperatorComparePlayer
inlinegui: Trigger Determining Player Pirates Copy > OperatorComparePlayer
inlinecustomscript: Trigger Humans Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Elves Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murlocs Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Pirates Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Open
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Humans Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Elves Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murloc Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Corsairs Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Leave
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Defeat Evil
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Defeat Good
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Quests
call DestroyTrigger(GetTriggeringTrigger())inlinegui: Trigger Ambush > SetVariable > GetUnitsInRangeOfLocMatching > GetUnitsInRangeOfLocMatching > > OperatorComparePlayer
inlinegui: Trigger Hunters Strike Loop > IfThenElseMultiple > OperatorCompareReal
inlinecustomscript: Trigger Last Stand On
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Lightning Bolt
set udg_LightningGroup = CreateGroup()inlinecustomscript: Trigger Unholy Grasp
call UnitApplyTimedLifeBJ(2.00, 'BFig', GetLastCreatedUnit())inlinecustomscript: Trigger Unholy Grasp > ForGroupMultiple
call UnitApplyTimedLifeBJ(2.00, 'BFig', GetLastCreatedUnit())inlinecustomscript: Trigger Humans Kills > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Humans Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Humans Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Humans Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Humans Army Levels IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Humans Army Levels IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Humans_Kills)inlinecustomscript: Trigger Humans Army Levels IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Dwarves Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Dwarves_Kills)inlinecustomscript: Trigger Dwarves Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger High Elves Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger High Elves Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger High Elves Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger High Elves Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger High Elves Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_High_Elves_Kills)inlinecustomscript: Trigger High Elves Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Army Levels > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kobolds Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Kobolds_Kills)inlinecustomscript: Trigger Kobolds Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Army Level I > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Gnolls Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Gnolls_Kills)inlinecustomscript: Trigger Gnolls Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murlocs Army Levels > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murlocs Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murlocs Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murlocs Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Murlocs Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Murlocs_Kills)inlinecustomscript: Trigger Murlocs Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Orcs Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Orcs_Kills)inlinecustomscript: Trigger Orcs Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Army Levels > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Ice Trolls Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Ice_Trolls_Kills)inlinecustomscript: Trigger Ice Trolls Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Kurken Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Kurken_Kills)inlinecustomscript: Trigger Kurken Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Undead Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Undead_Kills)inlinecustomscript: Trigger Undead Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Corsairs Army Level > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Corsairs Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Corsairs Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Corsairs Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Corsairs Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_Corsairs_Kills)inlinecustomscript: Trigger Corsairs Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Army Levels > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Army Level II > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Army Level III > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Army Level IIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger The Cult Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(gg_trg_The_Cult_Kills)inlinecustomscript: Trigger The Cult Army Level IIIII > IfThenElseMultiple
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Spawn Upgrades
call DestroyTrigger(GetTriggeringTrigger())inlinecustomscript: Trigger Shortmode Spawn Upgrades
call DestroyTrigger(GetTriggeringTrigger())Converted with 116 changes!
Saving as Flamehowl_no_weu.w3x
 

Attachments

  • Flamehowl.w3x
    2.2 MB · Views: 127
  • Flamehowl_no_weu.w3x
    2.2 MB · Views: 156
Level 1
Joined
Feb 27, 2007
Messages
8
Hey, I get the message:

Loading Element TD 4.3b_UnlockedWithJassNewGenPack5d.w3x...
Checking
Failed to read the triggers file: Error: Tried to get signature for unknown function " "
Did nothing due to errors

Element TD broke with 1.31, and I'm trying to update it. This version should be an unlocked version, it's normally opened with NewGen editor but I can't open newGen editor either.
Any help would be helpfull!
// Twilice
 

Attachments

  • Element TD 4.3b_UnlockedWithJassNewGenPack5d.w3x
    1.8 MB · Views: 118
Level 1
Joined
Feb 27, 2007
Messages
8
So I managed to open everything, including the map with 1.26. There was a small compile error that needed to be fixed before I could play it in 1.26 after a save.

I suspect there are some UMSWE functions need to be removed/rewritten to make it work for 1.31, but I have no clue where to even begin, since I can't really tell the extensions apart and I don't really know what is UMSWE only and not. And then finally the issue of what actually are the functions that are not working.
 
Level 16
Joined
Jul 26, 2008
Messages
1,184
So I managed to open everything, including the map with 1.26. There was a small compile error that needed to be fixed before I could play it in 1.26 after a save.

I suspect there are some UMSWE functions need to be removed/rewritten to make it work for 1.31, but I have no clue where to even begin, since I can't really tell the extensions apart and I don't really know what is UMSWE only and not. And then finally the issue of what actually are the functions that are not working.
If you are not familiar with what trigger data is non-standard WE trigger data, then maybe the only way to convert your map is to start by deleting half the triggers, then putting it back through ghost wolf's tool. If it works, it means the troublesome trigger data is in the other half of the triggers. If not, it means the remaining triggers contain the troublesome trigger data. Just rinse and repeat multiple times until you can identify which triggers are causing the tool to not work, then you can narrow down the problem easier.
 
Level 1
Joined
Feb 27, 2007
Messages
8
It seems that the preview image and the loadingscreen is causing the instant crashes. And the triggers are making it not openable in the editor. I'll probably try your suggestion if I ever want to be able to open it with worldedit 1.31

It's weird with the images though, they exported just fine. But it's instantly crashing in worldedit 1.26, 1.31 and wc3.exe 1.31. I can't see anything wrong with them. And they look normal in wc3.exe 1.26
 
Level 16
Joined
Jul 26, 2008
Messages
1,184
I'll probably try your suggestion if I ever want to be able to open it with worldedit 1.31
Even though your map may currently be playable now despite using a third party editor, it is likely that with later patches issues might pop up. If you can open it on the normal editor and save it without it crashing, then it is likely it will always be compatible with future versions (at least, blizzard is trying to commit to that).
 
Level 16
Joined
Jul 26, 2008
Messages
1,184
Well, with Wc3 Reforged coming out, I guess more people will be interested in using this tool to convert their maps from third party world editor to the standard world editor (once it is converted to the standard world editor, the map/campaign will automatically become compatible with the Version of Wc3 that you save it on and all future versions). So I will write down some tips to using it. Note: the specific third party editor I mention is YDWE, but you can still apply these tips if your original map was saved on WEU or another third party editor by swapping the YDWE part I mention for the third party W.E you are using.

A)- Courtesy of Ghostwolf

First, visit the first page of this thread: Tool: make WEU maps openable WE and click on the green link at the top (the viewer one).
When first loading, it will take 5-6 seconds to become accessible. Once it says it is ready, drop your map/campaign anywhere on the white page. It will then automatically convert your map and ask you to save it (the name of the map will be something like XXXno_WEU.w3x/w3n.

Do not exit the page that shows all the conversions. First you want to use the search function (Control + F) to search for this term: "YDWE" (not including the quotation marks).

Write down in a notepad/word document the names of all the trigger actions that have the term "YDWE" (and just to be sure, you can write down what the action does). If the map/campaign does not use any YDWE functions, it is entirely possible there will be no search results for "YDWE" (which is great, it means you do not need to do anything).

Then, rinse and repeat the steps above for the term "error". Instead of being a specific trigger action, this will normally affect an entire trigger it is in as a top-down condition error.

Once you have done that, you can delete the map Ghostwolf's program saved, and go open your original map/campaign (you should not be using the current Wc3 patch yet, since to open the map/campaign, it is likely the third party editor requires an older patch to open). Go find the actions with the "YDWE" terms and the full triggers with the "error" terms (if there are any). Delete all the actions/full triggers, then open Wc3 with newest Wc3 patch available (just a quick note: when I have used YDWE in the past, I have found it actually affects the newest Wc3 editor in some ways even if you have 2 separate wc3 versions, so you might want to consider deleting the old version of Wc3 before you do this next step, but this could just be my ignorance ha-ha).

Save the map, or if it is a campaign file, open up each map and save them. This step not only will 100% guarantee that you successfully deleted the third party editor functions (if you did not delete all of them, it will error, and you should start again), but it is a necessary step to complete the conversion to the standard world editor, since you will not be able to see your map/campaign in the Wc3 folders if you do not save the w3x map/every map in the w3n file.

Then, once this is done, go back to the places where you deleted the YDWE stuff/error stuff and add the actions/full triggers back in (this time though with the standard world editor actions).

Congratulations, your map is now openable in GUI in the standard world editor, and can now be played on that current patch + all future Wc3 patches (as long as Blizzard keeps its promise of forward compatibility).


Of course, if the map/campaign uses advanced third party W.E terms, Ghostwolf's tool will not be able to convert them. Instead, his tool will just show 1 line saying whatever it detected and not convert the other things. In this case, you can try to search for those trigger actions / full triggers through process of elimination (delete half your triggers in your map, then put it through his tool and see if it converts, then slowly narrow down the culprit action/GUI trigger).

Alternatively, if you cannot find it/them or there are just too many, you can abandon hope of converting the map/campaign into GUI, and just convert it to JASS. (Read B and C below).

It should be mentioned that if the map/campaign size is too big, Ghost wolf's tool will not work (normally only a campaign will reach this size limit). In that case, make 2 versions of the map, one with the top half of the maps replaced with blank maps, and one with the bottom half of the maps replaced with blank maps. Put both versions through the conversion tool, then just replace one version with the other version's maps.


His tool does not work with ROC maps. You must convert them to TFT. Easiest/laziest way is to just export the map, then rename the extension to .w3x and import it back.



Quick note: Remember that the version you should be saving it the campaign on (the one you will open the map/campaign up and save the map/all the maps inside) should be 1.29 and above.


B) Courtesy of Guhan

You will need w3x2Ini: W3x2Lni v2.5.2

First, convert all triggers to jass (slowest way is to click a trigger, then go to "edit" and "convert to custom script") in your map/all the maps in your campaign. This is the only step where you use the old Wc3 patch that is compatible with the third party editor.


Then (using the latest Wc3 patch) open the war3map.j from the original map/maps (not the one you converted to Jass, but the normal one(s) by converting the map/all the maps with w3x2lni, grabbing all the YDWE library code, and pasting it in the map header of the map/maps of the version you converted to Jass. Some function definitions might be missing, and you will need to guess what they originally did by looking at how they are inlined in war3map.j.

Once done, save all map/maps to check if everything was done correctly.







C) Courtesy of Fukuro

First, convert all triggers to jass (slowest way is to click a trigger, then go to "edit" and "convert to custom script") in your map/all the maps in your campaign. This is the only step where you use the old Wc3 patch that is compatible with the third party editor.

1. Extract all campaign maps. For example: "Chapter2.w3x"
2. w3x2lni: convert "Chapter2.w3x" to SLK "Chapter2_slk.w3x" (options: +Optimize JASS +Confuse scripts)
3. w3x2lni: convert "Chapter2_slk.w3x" to LNI (options don't matter)
4. Open "Chapter2_slk\map\war3map.j" in Notepad++
5. Replace all "constant " to "" and save the file
6. MPQ Master: open "Chapter2.w3x" and replace "war3map.j" file with the one from step 5
7. xdep: use edited "Chapter2.w3x" file and rebuild "deprotected.w3x", rename to "Chapter2.w3x"
8. Open this file in WE, select all text from "init/triggers" and paste it into an empty file in Notepad++ (Encoding UTF-8)

9. Replace all:

"|udg_r" --> "|r"
"if$" --> "if $"
and any other conficting names (can happen with local variables), for example, "local weatheffect we" and some "function we"

10. Paste it back into WE "init/triggers" and save the map. The map should save without errors.

11. Check for duplicates in functions:
- CreateAllDestructables
- CreateAllItems
if found some duplicates, find and remove it manually in the editor (but not from the code!!).

12. Delete all Sounds, Upgrades, Cameras, Regions (because they're duplicates of those that already in the code)
 
Last edited:
Level 1
Joined
Dec 11, 2019
Messages
1
Trigger Level needs to be converted due to top-level event/condition, but full trigger conversion is not implemented yet
Did nothing due to errors

What does this mean, and how do I fix it? @GhostWolf
 
Level 16
Joined
Jul 26, 2008
Messages
1,184
Trigger Level needs to be converted due to top-level event/condition, but full trigger conversion is not implemented yet
Did nothing due to errors

What does this mean, and how do I fix it? @GhostWolf

You just need to delete the trigger it is affecting from the original, and then after you put the map through ghostwolf's tool you can re-add it back in in terms of normal World editor features.

I strongly suggest reading what I wrote above in terms of section A (relevant to some tips when using his tool), since in paragraph 5 I also discussed this issue.


Quote:

upload_2020-1-15_18-31-32.png
 
Level 3
Joined
Jul 7, 2007
Messages
22
You're an absolute lifesaver! I can finally open my maps from 2005-2008! WEU hasn't worked for me in nearly 9 years so I appreciate this so much.
 
Level 28
Joined
Jul 29, 2007
Messages
5,115
A couple of you approached me over time with maps the converter failed to convert, and so, I updated it.
The updates amount to something like this:
  • Updated to the TriggerData.txt of version 1.29.2
  • Updated to a newer YDWE TriggerData.txt
  • Full trigger conversion is now supported as a last resort.
  • Jass generation is complete as far as I can tell. It lacked support for loops and other things before.
  • Significantly(!) more possible GUI replacements.
  • String-table entries no longer require a callback function in the map's header, but are instead inlined directly again.
  • Custom script actions in GUI have a limit to how long their text can be. If the text is longer than WE supports, it will generally either crash, or load the map but miss any triggers/actions following the long custom script. Therefore, whenever conversion to custom scripts is done, if they are deemed too long (currently 239 characters long, but in reality this depends on encodings etc.), they will be split to multiple custom scripts, with multiline /* */ comments between them. When WE compiles the Jass, they will be merged as if they were one custom script.
  • MPQ file writing had a major bug that was fixed, which caused the code to crash when saving files under specific conditions.
  • Many more bug fixes and improvements that are long and boring to list.

I also slightly improved the HTML side of things, but not by much. I am no designer.

So far I haven't seen a map that breaks the new code, or is not openable in WE after conversion.
If you get such a map, I'll like having it.

If you have any RoC map with custom GUI, I'll like having that too.

Jass generation should be fine, but if you do happen to get syntax errors, please tell me about it.
 
Last edited:
Level 16
Joined
Jul 26, 2008
Messages
1,184
I had the pleasure of trying out your tool again yesterday ghostwolf and got a chance to see the newer version in action.

1) I was able to open up maps in a campaign that were previously un-openable because of a few triggers that could not convert. Now, instead of needing to go back to earlier versions to remove those trouble triggers, I can just remove them in w/e version I am using. Fantastic!

2) The trigger conversions are now hidden in tabs which is great since previously with large conversions (such as in campaigns), there would be the equivalent of pages and pages of conversions. Now it is easier to isolate what I want without combing through everything else.

Thanks a ton for the work you put into it.
 
Level 28
Joined
Jul 29, 2007
Messages
5,115
@tulee I was wondering, since in the end I think this is perhaps used more for YDWE than it is for WEU, would it be helpful to distinguish between conversions to game natives and conversions to custom functions?
E.g. RemoveLocation is a native and thus a conversion of it should require no further input from you, however if YDWENewItemsFormula is converted then it will inherently not work without further work.
They could have different colors for example, like the previous version had.

Another thing I wasn't sure whether its worth the bother or not, is to write the number of trigger/condition/action in the stack.
E.g. instead of qishi > SetPlayerAllianceBJ it could be something like qishi (0) > SetPlayerAllianceBJ (10) or whatever notation.

Also just as a note to myself, coloring the stack with e.g. events being red, conditions being green, and actions being blue could make it perhaps easier to read, and also full trigger conversions should be shown with proper newlines rather than a mess.
 
Last edited:
Level 16
Joined
Jul 26, 2008
Messages
1,184
I was wondering, since in the end I think this is perhaps used more for YDWE than it is for WEU
I wouldn't be surprised if it is used for WEU a lot too, just maybe people do not comment as much.

would it be helpful to distinguish between conversions to game natives and conversions to custom functions?
E.g.
RemoveLocation
is a native and thus a conversion of it should require no further input from you, however if
YDWENewItemsFormula
is converted then it will inherently not work without further work.
They could have different colors for example, like the previous version had.
For me personally, I use the search function since all the things that do not work will have the words "YDWE" in them. But sure, having colour coded stuff would be welcome.

Another thing I wasn't sure whether its worth the bother or not, is to write the number of trigger/condition/action in the stack.
E.g. instead of
qishi > SetPlayerAllianceBJ
it could be something like
qishi (0) > SetPlayerAllianceBJ (10)
or whatever notation
It would be a neat feature to have. It is probably less important for people who are going to end up opening the WE after to investigate the converted map afterwards since they will see the stuff, but I can imagine it will help people who want to have an understanding of the conversions just from reading the text your tool shows on the page right after conversion.

Also just as a note to myself, coloring the stack with e.g. events being red, conditions being green, and actions being blue could make it perhaps easier to read, and also full trigger conversions should be shown with proper newlines rather than a mess.
Colour coding would be neat. I am not sure though to what extent people will want to look at the conversions for the things that convert properly. It is the stuff that is non-convertable that people will spend more time examining.
 
Level 28
Joined
Jul 29, 2007
Messages
5,115
Update:
  • Custom script splitting now handles unicode, and the multiline comments are injected correctly.
  • The converter now attempts to fill in unknown function signatures. This allows to convert maps that used custom TriggerData that isn't used by the converter. It won't work for all maps, but it already worked for some relevant test maps. If the converter managed to figure unknown signatures, it will list them at the beginning of the conversions list, even though they are not really conversions.
 
Level 28
Joined
Jul 29, 2007
Messages
5,115
  • Function signatures are now added also directly from common.j, and war3map.j if it exists. There isn't a way to know in what context they could be defined in TriggerData (i.e. is this function used as an event? condition? action? function call?), but the way it's handled seems to work fine for the maps I checked. This will allow to open maps that used custom GUI with an injected Jass library, mostly seen in YDWE maps.
 
Top